# HG changeset patch
# User Dmitriy Morozov <morozov@cs.duke.edu>
# Date 1203722983 18000
# Node ID 6021ec481b1f76627ca5d604187ec483dfe195b7
# Parent  d979e09ac6b41d335a549bd89aee30d5be7e6b99
Fixed Simulator not processing events correctly
Event that is being processed needed to be removed from the queue while its own
process() method ran.

diff -r d979e09ac6b4 -r 6021ec481b1f include/geometry/kinetic-sort.hpp
--- a/include/geometry/kinetic-sort.hpp	Fri Feb 22 13:06:40 2008 -0500
+++ b/include/geometry/kinetic-sort.hpp	Fri Feb 22 18:29:43 2008 -0500
@@ -247,6 +247,6 @@
 KineticSort<ElementIterator_, TrajectoryExtractor_, Simulator_, Swap_>::SwapEvent::
 operator<<(std::ostream& out) const
 {
-	Parent::operator<<(out) << ", SwapEvent at " << TrajectoryExtractor_()(position()->element);
+	Parent::operator<<(out) << "SwapEvent at " << TrajectoryExtractor_()(position()->element);
 	return out;
 }
diff -r d979e09ac6b4 -r 6021ec481b1f include/geometry/simulator.h
--- a/include/geometry/simulator.h	Fri Feb 22 13:06:40 2008 -0500
+++ b/include/geometry/simulator.h	Fri Feb 22 18:29:43 2008 -0500
@@ -95,9 +95,13 @@
 				return root_stack().top() < e.root_stack().top();
 		}
 
-		virtual std::ostream&		operator<<(std::ostream& out) const			{ return out << "Event with " 
-                                                                                             << root_stack_.size() 
-                                                                                             << " roots"; }
+		virtual std::ostream&		operator<<(std::ostream& out) const			
+        { 
+            out << "Event with " << root_stack_.size() << " roots"; 
+            if (!root_stack_.empty()) out << "; top root: " << root_stack_.top();
+            out << ", ";
+            return out;
+        }
 
 	private:
 		RootStack					root_stack_;
diff -r d979e09ac6b4 -r 6021ec481b1f include/geometry/simulator.hpp
--- a/include/geometry/simulator.hpp	Fri Feb 22 13:06:40 2008 -0500
+++ b/include/geometry/simulator.hpp	Fri Feb 22 18:29:43 2008 -0500
@@ -70,8 +70,11 @@
 	if (e->root_stack().empty()) 		{ reached_infinity_ = true; return; }
 	else 								{ current_ = e->root_stack().top(); e->root_stack().pop();  }
 	
-	if (e->process(this))				update(top);
-	else								{ queue_.pop(); delete e; }
+    // Get the top element out of the queue, put it back depending on what process() says
+    EventQueue tmp; tmp.prepend(top, queue_);
+
+	if (e->process(this))				{ queue_.prepend(top, tmp); update(top); }
+	else								{ delete e; }
 }
 
 template<class FuncKernel_, template<class Event> class EventComparison_>
diff -r d979e09ac6b4 -r 6021ec481b1f include/utilities/eventqueue.h
--- a/include/utilities/eventqueue.h	Fri Feb 22 13:06:40 2008 -0500
+++ b/include/utilities/eventqueue.h	Fri Feb 22 18:29:43 2008 -0500
@@ -34,6 +34,9 @@
 		void 					pop()						{ assert(!empty()); queue_.erase(queue_.begin()); }
 		void					remove(iterator i)			{ queue_.erase(i); }
 		void					update(iterator i);
+        void                    prepend(iterator i, 
+                                        EventQueue& other)  { queue_.splice(queue_.begin(), other.queue_, i); }
+        ///< intended for temporary storage of elements from other queues
 
 		iterator 				end()						{ return queue_.end(); }
 		const_iterator 			end() const					{ return queue_.end(); }
diff -r d979e09ac6b4 -r 6021ec481b1f tests/geometry/test-kinetic-sort.cpp
--- a/tests/geometry/test-kinetic-sort.cpp	Fri Feb 22 13:06:40 2008 -0500
+++ b/tests/geometry/test-kinetic-sort.cpp	Fri Feb 22 18:29:43 2008 -0500
@@ -44,7 +44,8 @@
 #ifdef LOGGING
     rlog::RLogInit(argc, argv);
 
-    //stdoutLog.subscribeTo( RLOG_CHANNEL("geometry/simulator") );
+    stderrLog.subscribeTo( RLOG_CHANNEL("error") );
+    stdoutLog.subscribeTo( RLOG_CHANNEL("geometry/simulator") );
     stdoutLog.subscribeTo( RLOG_CHANNEL("geometry/kinetic-sort") );
 #endif
 
@@ -68,12 +69,21 @@
 	// Setup kinetic sort
 	KineticSortDS	ks(list.begin(), list.end(), boost::bind(swap, &list, _1, _2), &simulator);
 
-	while(!simulator.reached_infinity() && simulator.current_time() < 4)
+    std::cout << "Examining " << simulator;
+
+	while(!simulator.reached_infinity() && simulator.current_time() < 5)
 	{
 		std::cout << "Current time before: " << simulator.current_time() << std::endl;
-		if (!ks.audit(&simulator)) return 1;
+		//if (!ks.audit(&simulator)) return 1;
+		ks.audit(&simulator);
         std::cout << "Examining " << simulator;
 		simulator.process();
 		std::cout << "Current time after: " << simulator.current_time() << std::endl;
 	}
+	ks.audit(&simulator);
+    std::cout << "Examining " << simulator;
+
+    std::cout << "Done at " << simulator.current_time() << std::endl;
+    for (SortDS::const_iterator cur = list.begin(); cur != list.end(); ++cur)
+        std::cout << "  " << *cur << std::endl;    
 }