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