00001
00026 #ifndef _DES_UNORDERED_SERIAL_H_
00027 #define _DES_UNORDERED_SERIAL_H_
00028
00029 #include <deque>
00030 #include <functional>
00031
00032 #include <cassert>
00033
00034 #include "DESabstractMain.h"
00035
00036 class DESunorderedSerial: public DESabstractMain {
00037
00038 virtual bool isSerial () const { return true; }
00039
00052 virtual void runLoop (const SimInit& simInit) {
00053 std::deque<GNode> worklist (simInit.getInputNodes ().begin (), simInit.getInputNodes ().end ());
00054
00055 std::vector<bool> onWlFlags (simInit.getNumNodes (), false);
00056
00057
00058 for (std::vector<GNode>::const_iterator i = simInit.getInputNodes ().begin (), ei = simInit.getInputNodes ().end ();
00059 i != ei; ++i) {
00060 SimObject* srcObj = graph.getData (*i, Galois::NONE);
00061 onWlFlags[srcObj->getId ()] = true;
00062 }
00063
00064 size_t maxPending = 0;
00065
00066 size_t numEvents = 0;
00067 size_t numIter = 0;
00068
00069 while (!worklist.empty ()) {
00070
00071 GNode activeNode = worklist.front ();
00072 worklist.pop_front ();
00073
00074 SimObject* srcObj = graph.getData (activeNode, Galois::NONE);
00075
00076 maxPending = std::max (maxPending, srcObj->numPendingEvents ());
00077
00078 numEvents += srcObj->simulate(graph, activeNode);
00079
00080
00081 for (Graph::neighbor_iterator i = graph.neighbor_begin (activeNode, Galois::NONE), ei =
00082 graph.neighbor_end (activeNode, Galois::NONE); i != ei; ++i) {
00083 const GNode& dst = *i;
00084
00085 SimObject* dstObj = graph.getData (dst, Galois::NONE);
00086
00087 dstObj->updateActive ();
00088
00089 if (dstObj->isActive ()) {
00090 if (!onWlFlags[dstObj->getId ()]) {
00091
00092 onWlFlags[dstObj->getId ()] = true;
00093 worklist.push_back (dst);
00094 }
00095 }
00096 }
00097
00098 srcObj->updateActive();
00099 if (srcObj->isActive()) {
00100 worklist.push_back (activeNode);
00101
00102 } else {
00103
00104 onWlFlags[srcObj->getId ()] = false;
00105 }
00106
00107 ++numIter;
00108
00109 }
00110
00111
00112 std::cout << "Simulation ended" << std::endl;
00113 std::cout << "Number of events processed = " << numEvents << " Iterations = " << numIter << std::endl;
00114 std::cout << "Max size of pending events = " << maxPending << std::endl;
00115
00116 }
00117
00118 };
00119
00120 #endif // _DES_UNORDERED_SERIAL_H_