103 for (OptimizableGraph::VertexSet::iterator vit = vset.begin();
104 vit != vset.end(); ++vit) {
108 it->second._distance = 0.;
109 it->second._parent.clear();
110 it->second._frontierLevel = 0;
111 frontier.
push(&it->second);
114 while (!frontier.empty()) {
117 double uDistance = entry->
distance();
126 OptimizableGraph::EdgeSet::iterator et = u->
edges().begin();
127 while (et != u->
edges().end()) {
131 int maxFrontier = -1;
133 for (
size_t i = 0; i < edge->
vertices().size(); ++i) {
138 if (ot->second._distance != numeric_limits<double>::max()) {
139 initializedVertices.insert(z);
140 maxFrontier = (max)(maxFrontier, ot->second._frontierLevel);
143 assert(maxFrontier >= 0);
145 for (
size_t i = 0; i < edge->
vertices().size(); ++i) {
149 if (z == u)
continue;
150 size_t wasInitialized = initializedVertices.erase(z);
152 double edgeDistance = cost(edge, initializedVertices, z);
153 if (edgeDistance > 0. &&
154 edgeDistance != std::numeric_limits<double>::max() &&
155 edgeDistance < maxEdgeCost) {
156 double zDistance = uDistance + edgeDistance;
161 if (zDistance < ot->second.distance() && zDistance < maxDistance) {
162 ot->second._distance = zDistance;
163 ot->second._parent = initializedVertices;
164 ot->second._edge = edge;
165 ot->second._frontierLevel = maxFrontier + 1;
166 frontier.
push(&ot->second);
170 if (wasInitialized > 0) initializedVertices.insert(z);
177#ifdef DEBUG_ESTIMATE_PROPAGATOR
179 ofstream costStream(
"cost.dat");
180 for (AdjacencyMap::const_iterator it =
_adjacencyMap.begin();
183 costStream <<
"vertex " << u->
id() <<
" cost " << it->second._distance
187 ofstream initStream(
"init.dat");
188 vector<AdjacencyMapEntry*> frontierLevels;
191 if (it->second._frontierLevel > 0) frontierLevels.push_back(&it->second);
193 sort(frontierLevels.begin(), frontierLevels.end(), FrontierLevelCmp());
194 for (vector<AdjacencyMapEntry*>::const_iterator it = frontierLevels.begin();
195 it != frontierLevels.end(); ++it) {
199 initStream <<
"calling init level = " << entry->
_frontierLevel <<
"\t (";
200 for (OptimizableGraph::VertexSet::iterator pit = entry->
parent().begin();
201 pit != entry->
parent().end(); ++pit) {
202 initStream <<
" " << (*pit)->id();
204 initStream <<
" ) -> " << to->
id() << endl;
data structure for loopuk during Dijkstra
PriorityQueue::iterator queueIt
const OptimizableGraph::VertexSet & parent() const
OptimizableGraph::Vertex * _child
OptimizableGraph::Edge * edge() const
OptimizableGraph::Vertex * child() const
void propagate(OptimizableGraph::Vertex *v, const EstimatePropagator::PropagateCost &cost, const EstimatePropagator::PropagateAction &action=PropagateAction(), double maxDistance=std::numeric_limits< double >::max(), double maxEdgeCost=std::numeric_limits< double >::max())