From 21407521e93228c97ae28d7342b9ebb03be0cdaa Mon Sep 17 00:00:00 2001
From: "f.mack" <mack.fabi@t-online.de>
Date: Tue, 23 Aug 2016 11:25:59 +0200
Subject: [PATCH] Added method PrepareForSimulation() to all routers

---
 Simulation.cpp                 | 1 +
 routing/CognitiveMapRouter.cpp | 1 +
 routing/CognitiveMapRouter.h   | 1 +
 routing/DummyRouter.cpp        | 2 +-
 routing/DummyRouter.h          | 1 +
 routing/GlobalRouter.cpp       | 2 ++
 routing/GlobalRouter.h         | 2 ++
 routing/MeshRouter.cpp         | 2 ++
 routing/MeshRouter.h           | 1 +
 routing/Router.h               | 7 +++++++
 routing/RoutingEngine.cpp      | 6 ++++++
 routing/RoutingEngine.h        | 6 ++++++
 routing/ffRouter.cpp           | 5 +++++
 routing/ffRouter.h             | 8 ++++++++
 14 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/Simulation.cpp b/Simulation.cpp
index fe6d6fd2..f4979881 100644
--- a/Simulation.cpp
+++ b/Simulation.cpp
@@ -420,6 +420,7 @@ void Simulation::RunHeader(long nPed)
 
     //first initialisation needed by the linked-cells
     UpdateRoutesAndLocations();
+    _routingEngine.get()->PrepareForSimulation(_building.get());
     ProcessAgentsQueue();
 }
 
diff --git a/routing/CognitiveMapRouter.cpp b/routing/CognitiveMapRouter.cpp
index 3c187876..de68b0c0 100644
--- a/routing/CognitiveMapRouter.cpp
+++ b/routing/CognitiveMapRouter.cpp
@@ -165,6 +165,7 @@ bool CognitiveMapRouter::Init(Building * b)
      return true;
 }
 
+virtual void CognitiveMapRouter::PrepareForSimulation(Building *b) {}
 
 const optStorage &CognitiveMapRouter::getOptions() const
 {
diff --git a/routing/CognitiveMapRouter.h b/routing/CognitiveMapRouter.h
index dc4a0294..942f28cf 100644
--- a/routing/CognitiveMapRouter.h
+++ b/routing/CognitiveMapRouter.h
@@ -60,6 +60,7 @@ public:
 
      virtual int FindExit(Pedestrian* p);
      virtual bool Init(Building* b);
+     virtual void PrepareForSimulation(Building* b);
 
      /**
       * @return options involved in the routing algorithm
diff --git a/routing/DummyRouter.cpp b/routing/DummyRouter.cpp
index 183136c7..fa37059e 100644
--- a/routing/DummyRouter.cpp
+++ b/routing/DummyRouter.cpp
@@ -75,4 +75,4 @@ bool DummyRouter::Init(Building* b)
      return true;
 }
 
-
+virtual void DummyRouter::PrepareForSimulation(Building* b) {}
diff --git a/routing/DummyRouter.h b/routing/DummyRouter.h
index 407d5496..1e5767af 100644
--- a/routing/DummyRouter.h
+++ b/routing/DummyRouter.h
@@ -44,6 +44,7 @@ public:
 
      virtual int FindExit(Pedestrian* p);
      virtual bool Init(Building* b);
+     virtual void PrepareForSimulation(Building* b);
 
 };
 
diff --git a/routing/GlobalRouter.cpp b/routing/GlobalRouter.cpp
index 9f23e047..ebdd53de 100644
--- a/routing/GlobalRouter.cpp
+++ b/routing/GlobalRouter.cpp
@@ -547,6 +547,8 @@ void GlobalRouter::Reset(){
      _mapIdToFinalDestination.clear();
 }
 
+virtual void GlobalRouter::PrepareForSimulation(Building* b) {}
+
 void GlobalRouter::SetEdgeCost(double cost)
 {
      _edgeCost=cost;
diff --git a/routing/GlobalRouter.h b/routing/GlobalRouter.h
index f2c9f9f6..0109283a 100644
--- a/routing/GlobalRouter.h
+++ b/routing/GlobalRouter.h
@@ -65,6 +65,8 @@ public:
 
      virtual bool Init(Building* building);
 
+     virtual void PrepareForSimulation(Building* b);
+
      virtual int FindExit(Pedestrian* p);
 
      /**
diff --git a/routing/MeshRouter.cpp b/routing/MeshRouter.cpp
index ac6efd9b..fcb31cb9 100644
--- a/routing/MeshRouter.cpp
+++ b/routing/MeshRouter.cpp
@@ -968,6 +968,8 @@ bool MeshRouter::Init(Building* b)
      return true;
 }
 
+virtual void MeshRouter::PrepareForSimulation(Building* b) {}
+
 void MeshRouter::WriteMeshToFile(const string& filename)
 {
     // in the case the navigation mesh should be written to a file
diff --git a/routing/MeshRouter.h b/routing/MeshRouter.h
index 18ff19c1..c83f3e08 100644
--- a/routing/MeshRouter.h
+++ b/routing/MeshRouter.h
@@ -53,6 +53,7 @@ public:
 
      virtual int FindExit(Pedestrian* p);
      virtual bool Init(Building* b);
+     virtual void PrepareForSimulation(Building* b);
 
 };
 
diff --git a/routing/Router.h b/routing/Router.h
index 23667eec..53a2c26d 100644
--- a/routing/Router.h
+++ b/routing/Router.h
@@ -133,6 +133,13 @@ public:
       */
      virtual bool ParseAdditionalParameters(){return true;};
 
+     /**
+      * Each implementation can do some pre-simulation calculation. When calling this
+      * function, the exit route for each pedestrian (present at the beginning of the
+      * simulation) is already known.
+      */
+     virtual void PrepareForSimulation(Building* b) = 0;
+
 };
 
 #endif  /* _ROUTING_H */
diff --git a/routing/RoutingEngine.cpp b/routing/RoutingEngine.cpp
index 43059e14..38768f57 100644
--- a/routing/RoutingEngine.cpp
+++ b/routing/RoutingEngine.cpp
@@ -124,3 +124,9 @@ bool RoutingEngine::Init(Building* building)
      }
      return status;
 }
+
+void RoutingEngine::PrepareForSimulation(Building *building) {
+     for (auto router: _routersCollection) {
+          router->PrepareForSimulation(building);
+     }
+}
diff --git a/routing/RoutingEngine.h b/routing/RoutingEngine.h
index 64760f3d..bf81f74b 100644
--- a/routing/RoutingEngine.h
+++ b/routing/RoutingEngine.h
@@ -106,6 +106,12 @@ public:
       */
      bool Init(Building* building);
 
+     /**
+      * Allow the routers to do some preparation
+      * @param building
+      */
+     void PrepareForSimulation(Building* building);
+
 private:
      /// collections of all routers used
      std::vector<Router*> _routersCollection;
diff --git a/routing/ffRouter.cpp b/routing/ffRouter.cpp
index 624f4533..f7bba3e3 100644
--- a/routing/ffRouter.cpp
+++ b/routing/ffRouter.cpp
@@ -338,6 +338,7 @@ bool FFRouter::Init(Building* building)
           matrixfile << _CroTrByUID.at(_pathsMatrix[mapItem.first])->GetID() << std::endl;
      }
      matrixfile.close();
+
      Log->Write("INFO: \tFF Router Init done.");
      return true;
 }
@@ -561,6 +562,10 @@ bool FFRouter::ReInit()
      return true;
 }
 
+virtual void FFRouter::PrepareForSimulation(Building* building) {
+     // collect all <room, door> pairs needed
+     // calculate the ff in a parallelized way
+}
 
 int FFRouter::FindExit(Pedestrian* p)
 {
diff --git a/routing/ffRouter.h b/routing/ffRouter.h
index 33d37d43..e7d70bdf 100644
--- a/routing/ffRouter.h
+++ b/routing/ffRouter.h
@@ -153,6 +153,14 @@ public:
       */
      virtual bool ReInit();
 
+     /*!
+      * \brief Calculates some needed floorfields
+      *
+      * PrepareForSimulation() will look up the exit route of each pedestrian (which is not yet
+      * known in Init()) and calculate the floorfields needed for these routes.
+      */
+     virtual void PrepareForSimulation(Building* building);
+
      /*!
       * \brief interface used by __Pedestrian__, sets (*p).exitline/.exitindex
       *
-- 
GitLab