KineticSort can deal with equal trajectories:
  UPolynomial::sign_at_negative_infinity() can handle 0 and so can Simulator::add()
/*
 * Author: Dmitriy Morozov
 * Department of Computer Science, Duke University, 2007
 */
#ifndef __AR_VINEYARD_H__
#define __AR_VINEYARD_H__
#include <boost/signals.hpp>
#include <boost/bind.hpp>
#include <list>
#include <vector>
#include "topology/conesimplex.h"
#include "topology/filtration.h"
#include "geometry/kinetic-sort.h"
#include "geometry/simulator.h"
#include "ar-simplex3d.h"
#include "ar-function-kernel.h"
template <class Simulator_>
class ARConeSimplex3D: public ConeSimplex<ARSimplex3D>
{
	public:
		typedef						ConeSimplex<ARSimplex3D>									Parent;
		typedef						ARSimplex3D													ARSimplex3D;
		
		/// \name Simulator types
		/// @{
        typedef                     Simulator_                                                  Simulator;
        typedef                     typename Simulator::FunctionKernel                          FunctionKernel;
        typedef                     typename FunctionKernel::Function                           Function;
        /// @}
		
		/// \name ThresholdSort types
		/// @{
		typedef 					std::list<Function>										    ThresholdList;
        typedef                     typename ThresholdList::iterator                            ThresholdListIterator;
		struct 						ThresholdTrajectoryExtractor
		{	Function                operator()(ThresholdListIterator i) const		            { return *i; } };
		typedef						KineticSort<ThresholdListIterator, 
                                                ThresholdTrajectoryExtractor, Simulator>		ThresholdSort;
		/// @}
        typedef                     boost::signal<void (Simulator*)>                            NewFrontSignal;
    
    public:
									ARConeSimplex3D(const ARSimplex3D& s, bool coned = false);
									ARConeSimplex3D(const ARConeSimplex3D& other):              // need explicit copy-constructor because of the signal
                                        Parent(other, other.coned()), 
                                        thresholds_(other.thresholds_)                          {}
		const ThresholdList&        thresholds() const											{ return thresholds_; }
        NewFrontSignal&             new_front_signal()                                          { return new_front_signal_; }
		void						schedule_thresholds(Simulator* simulator);
        // need explicit operator= because of the signal
        ARConeSimplex3D&            operator=(const ARConeSimplex3D& other)                     { Parent::operator=(other); thresholds_ = other.thresholds_; return *this; }
								
	private:
		ThresholdList				thresholds_;
		ThresholdSort				thresholds_sort_;
        NewFrontSignal              new_front_signal_;
		void						swap_thresholds(ThresholdListIterator i, Simulator* simulator);
};
/**
 * Encapsulated filtration, and provides compute_vineyard() functionality.
 */
class ARVineyard
{
	public:
		typedef						ARVineyard													Self;
	
        /// \name FunctionKernel and Simulator types
        /// @{
        typedef                     ARFunctionKernel                                            FunctionKernel;
        typedef                     FunctionKernel::Function                                    Function;
        typedef                     Simulator<FunctionKernel>                                   Simulator;
        /// @}
        /// \name Filtration types
        /// @{    
        typedef                     ARConeSimplex3D<Simulator>                                  ARConeSimplex3D;
		typedef						Filtration<ARConeSimplex3D>									Filtration;
		typedef						Filtration::Simplex										    Simplex;
		typedef						Filtration::Index											Index;
		typedef						Filtration::Vineyard										Vineyard;
		typedef						Vineyard::Evaluator											Evaluator;
        /// @}
		
        /// \name SimplexSort types
        /// @{
        struct 						SimplexTrajectoryExtractor
		{	Function				operator()(Index i) const									{ return i->thresholds().front(); }};
		typedef						KineticSort<Index, SimplexTrajectoryExtractor, Simulator>   SimplexSort;
		typedef						SimplexSort::iterator										SimplexSortIterator;
		
        class                       ThresholdChangeSlot;              // used to notify of change in front threshold
		/// @}
		typedef						std::list<Point>											PointList;
		class						StaticEvaluator;
		class						KineticEvaluator;
	public:
									ARVineyard(const PointList& points, const Point& z);
									~ARVineyard();
		void						compute_pairing();
		void						compute_vineyard();
		
		const Filtration*			filtration() const											{ return filtration_; }
		const Vineyard*				vineyard() const											{ return vineyard_; }
	public:
		void 						swap(Index i, Simulator* simulator);						///< For kinetic sort
	
	private:
		void 						add_simplices();
		void						change_evaluator(Evaluator* eval);
	private:
		Filtration*				    filtration_;
		Vineyard*					vineyard_;
		Evaluator*					evaluator_;
		Point						z_;
		Delaunay					dt_;
				
#if 0
	private:
		// Serialization
		friend class boost::serialization::access;
		
		ARVineyard() 																	{}
		template<class Archive> 
		void serialize(Archive& ar, version_type )
		{ 
			// FIXME
		};
#endif
};
//BOOST_CLASS_EXPORT(ARVineyard)
class ARVineyard::ThresholdChangeSlot
{   
    public:
                                ThresholdChangeSlot(SimplexSortIterator iter, SimplexSort* sort):
                                    iter_(iter), sort_(sort)                                    { iter_->element->new_front_signal().connect(*this); }
        void                    operator()(Simulator* simulator)                                { sort_->update_trajectory(iter_, simulator); }
    
    private:
        SimplexSortIterator     iter_;
        SimplexSort*            sort_;
};
class ARVineyard::StaticEvaluator: public Evaluator
{
	public:
									StaticEvaluator()                   						{}
		virtual RealType			time() const												{ return 0; }
		virtual RealType			value(const Simplex& s) const								{ return s.value(); }
};
class ARVineyard::KineticEvaluator: public Evaluator
{
	public:
									KineticEvaluator(Simulator* simulator): 
                                        simulator_(simulator)                                   {}
		virtual RealType			time() const												{ return simulator_->current_time(); }
		virtual RealType			value(const Simplex& s)	const								{ return FunctionKernel::value_at(s.thresholds().front(), time()); }
	private:
		Simulator*                  simulator_;
};
#include "ar-vineyard.hpp"
#endif // __AR_VINEYARD_H__