SUMO - Simulation of Urban MObility
|
00001 /****************************************************************************/ 00008 // The dijkstra-router 00009 /****************************************************************************/ 00010 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/ 00011 // Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors 00012 /****************************************************************************/ 00013 // 00014 // This file is part of SUMO. 00015 // SUMO is free software: you can redistribute it and/or modify 00016 // it under the terms of the GNU General Public License as published by 00017 // the Free Software Foundation, either version 3 of the License, or 00018 // (at your option) any later version. 00019 // 00020 /****************************************************************************/ 00021 #ifndef SUMOAbstractRouter_h 00022 #define SUMOAbstractRouter_h 00023 00024 00025 // =========================================================================== 00026 // included modules 00027 // =========================================================================== 00028 #ifdef _MSC_VER 00029 #include <windows_config.h> 00030 #else 00031 #include <config.h> 00032 #endif 00033 00034 #include <string> 00035 #include <vector> 00036 #include <algorithm> 00037 #include <assert.h> 00038 #include <utils/common/SysUtils.h> 00039 #include <utils/common/MsgHandler.h> 00040 #include <utils/common/SUMOTime.h> 00041 #include <utils/common/ToString.h> 00042 00043 00044 // =========================================================================== 00045 // class definitions 00046 // =========================================================================== 00051 template<class E, class V> 00052 class SUMOAbstractRouter { 00053 public: 00055 SUMOAbstractRouter(const std::string& type): 00056 myType(type), 00057 myQueryVisits(0), 00058 myNumQueries(0), 00059 myQueryStartTime(0), 00060 myQueryTimeSum(0) 00061 { } 00062 00064 virtual ~SUMOAbstractRouter() { 00065 if (myNumQueries > 0) { 00066 WRITE_MESSAGE(myType + " answered " + toString(myNumQueries) + " queries and explored " + toString(double(myQueryVisits) / myNumQueries) + " edges on average."); 00067 WRITE_MESSAGE(myType + " spent " + toString(myQueryTimeSum) + " ms answering queries (" + toString(double(myQueryTimeSum) / myNumQueries) + " ms on average)."); 00068 } 00069 } 00070 00073 virtual void compute(const E* from, const E* to, const V* const vehicle, 00074 SUMOTime msTime, std::vector<const E*> &into) = 0; 00075 00076 virtual SUMOReal recomputeCosts(const std::vector<const E*> &edges, 00077 const V* const v, SUMOTime msTime) const = 0; 00078 00079 // interface extension for BulkStarRouter 00080 virtual void prepare(const E*, const V*, bool) { 00081 assert(false); 00082 } 00083 00084 inline void startQuery() { 00085 myNumQueries++; 00086 myQueryStartTime = SysUtils::getCurrentMillis(); 00087 } 00088 00089 inline void endQuery(int visits) { 00090 myQueryVisits += visits; 00091 myQueryTimeSum += (SysUtils::getCurrentMillis() - myQueryStartTime); 00092 } 00093 00094 private: 00096 const std::string myType; 00098 int myQueryVisits; 00099 int myNumQueries; 00101 long myQueryStartTime; 00102 long myQueryTimeSum; 00103 }; 00104 00105 00106 template<class E, class V> 00107 struct prohibited_withRestrictions { 00108 public: 00109 inline bool operator()(const E* edge, const V* vehicle) const { 00110 if (std::find(myProhibited.begin(), myProhibited.end(), edge) != myProhibited.end()) { 00111 return true; 00112 } 00113 return edge->prohibits(vehicle); 00114 } 00115 00116 void prohibit(const std::vector<E*> &toProhibit) { 00117 myProhibited = toProhibit; 00118 } 00119 00120 protected: 00121 std::vector<E*> myProhibited; 00122 00123 }; 00124 00125 template<class E, class V> 00126 struct prohibited_noRestrictions { 00127 public: 00128 inline bool operator()(const E*, const V*) const { 00129 return false; 00130 } 00131 }; 00132 00133 00134 00135 00136 #endif 00137 00138 /****************************************************************************/ 00139