48 return std::numeric_limits<double>::max();
55 if (distance == -1)
return perform(v, vParent, e);
56 return std::numeric_limits<double>::max();
63 : _child(child_), _parent(parent_), _edge(edge_), _distance(distance_) {}
66 for (HyperGraph::VertexIDMap::const_iterator it =
_graph->
vertices().begin();
69 std::numeric_limits<double>::max());
75 for (HyperGraph::VertexSet::iterator it =
_visited.begin();
93 double comparisonConditioner,
bool directed,
96 std::priority_queue<AdjacencyMapEntry> frontier;
97 for (HyperGraph::VertexSet::iterator vit = vset.begin(); vit != vset.end();
107 it->second._distance = 0.;
108 it->second._parent = 0;
109 frontier.push(it->second);
112 while (!frontier.empty()) {
122 double uDistance = ut->second.distance();
124 std::pair<HyperGraph::VertexSet::iterator, bool> insertResult =
127 HyperGraph::EdgeSet::iterator et = u->
edges().begin();
128 while (et != u->
edges().end()) {
132 if (directed && edge->
vertex(0) != u)
continue;
134 for (
size_t i = 0; i < edge->
vertices().size(); ++i) {
136 if (z == u)
continue;
138 double edgeDistance = (*cost)(edge, u, z);
139 if (edgeDistance == std::numeric_limits<double>::max() ||
140 edgeDistance > maxEdgeCost)
142 double zDistance = uDistance + edgeDistance;
147 if (zDistance + comparisonConditioner < ot->second.distance() &&
148 zDistance < maxDistance) {
149 ot->second._distance = zDistance;
150 ot->second._parent = u;
151 ot->second._edge = edge;
152 frontier.push(ot->second);
162 double comparisonConditioner,
bool directed,
163 double maxEdgeCost) {
166 shortestPaths(vset, cost, maxDistance, comparisonConditioner, directed,
171 for (AdjacencyMap::iterator it = amap.begin(); it != amap.end(); ++it) {
175 for (AdjacencyMap::iterator it = amap.begin(); it != amap.end(); ++it) {
182 assert(v == it->first);
184 AdjacencyMap::iterator pt = amap.find(parent);
185 assert(pt != amap.end());
186 pt->second._children.insert(v);
192 typedef std::deque<HyperGraph::Vertex*> Deque;
196 for (AdjacencyMap::iterator it = amap.begin(); it != amap.end(); ++it) {
199 action->
perform(it->first, 0, 0);
200 q.push_back(it->first);
207 AdjacencyMap::iterator parentIt = amap.find(parent);
208 if (parentIt == amap.end()) {
212 for (HyperGraph::VertexSet::iterator childsIt = childs.begin();
213 childsIt != childs.end(); ++childsIt) {
215 AdjacencyMap::iterator adjacencyIt = amap.find(child);
216 assert(adjacencyIt != amap.end());
219 assert(adjacencyIt->first == child);
220 assert(adjacencyIt->second.child() == child);
221 assert(adjacencyIt->second.parent() == parent);
223 action->
perform(child, parent, edge);
225 action->
perform(child, parent, edge, adjacencyIt->second.distance());
const VertexContainer & vertices() const
const Vertex * vertex(size_t i) const
abstract Vertex, your types must derive from that one
int id() const
returns the id
const EdgeSet & edges() const
returns the set of hyper-edges that are leaving/entering in this vertex
std::set< Vertex * > VertexSet
const VertexIDMap & vertices() const
#define __PRETTY_FUNCTION__
bool operator<(const HyperDijkstra::AdjacencyMapEntry &a, const HyperDijkstra::AdjacencyMapEntry &b)
AdjacencyMapEntry(HyperGraph::Vertex *_child=0, HyperGraph::Vertex *_parent=0, HyperGraph::Edge *_edge=0, double _distance=std::numeric_limits< double >::max())
HyperGraph::VertexSet _children
HyperGraph::Vertex * child() const
HyperGraph::Vertex * parent() const
virtual double perform(HyperGraph::Vertex *v, HyperGraph::Vertex *vParent, HyperGraph::Edge *e)
HyperDijkstra(HyperGraph *g)
static void computeTree(AdjacencyMap &amap)
static void visitAdjacencyMap(AdjacencyMap &amap, TreeAction *action, bool useDistance=false)
HyperGraph::VertexSet _visited
void shortestPaths(HyperGraph::Vertex *v, HyperDijkstra::CostFunction *cost, double maxDistance=std::numeric_limits< double >::max(), double comparisonConditioner=1e-3, bool directed=false, double maxEdgeCost=std::numeric_limits< double >::max())
AdjacencyMap _adjacencyMap
std::map< HyperGraph::Vertex *, AdjacencyMapEntry > AdjacencyMap