1 #ifndef PMPL_GROUP_ROADMAP_H_
2 #define PMPL_GROUP_ROADMAP_H_
8 #include <containers/sequential/graph/algorithms/graph_input_output.h>
11 #define INVALID_ED ED{std::numeric_limits<size_t>::max(), std::numeric_limits<size_t>::max()}
24 template <
typename Vertex,
typename Edge>
56 template <
typename MPSolution>
80 virtual VID AddVertex(
const Vertex& _v) noexcept
override;
86 virtual ED AddEdge(
const VID _source,
const VID _target,
const Edge& _w)
98 template <
typename Vertex,
typename Edge>
99 template <
typename MPSolution>
104 std::vector<IndividualRoadmap*> roadmaps;
105 for(
Robot*
const robot : *_g)
106 roadmaps.push_back(_solution->GetRoadmap(robot));
113 template <
typename Vertex,
typename Edge>
116 AddEdge(
const VID _source,
const VID _target,
const Edge& _lp) noexcept {
117 if(_source == _target)
121 if(_lp.GetWeight() == 0 or _lp.GetWeight() == 0)
129 std::vector<IndividualEdge>& localEdges = edge.GetLocalEdges();
132 std::vector<ED>& edgeDescriptors = edge.GetEdgeDescriptors();
134 const Vertex& sourceCfg = this->GetVertex(_source),
135 & targetCfg = this->GetVertex(_target);
137 size_t numInactiveRobots = 0;
140 for(
size_t i = 0; i < edgeDescriptors.size(); ++i) {
141 auto roadmap = this->m_graphs[i];
143 const VID individualSourceVID = sourceCfg.GetVID(i),
144 individualTargetVID = targetCfg.GetVID(i);
148 if(individualSourceVID == individualTargetVID) {
154 const bool verticesExist =
155 roadmap->find_vertex(individualSourceVID) != roadmap->end() and
156 roadmap->find_vertex(individualTargetVID) != roadmap->end();
162 const bool edgeExists = roadmap->IsEdge(individualSourceVID,
163 individualTargetVID);
167 <<
", " << individualTargetVID <<
") does "
168 <<
"not exist for robot "
169 << roadmap->GetRobot()->GetLabel() <<
".";
171 const bool consistent = edgeDescriptors[i].source() == individualSourceVID
172 and edgeDescriptors[i].target() == individualTargetVID;
175 <<
"Fetched from group cfg: ("
176 << individualSourceVID <<
", "
177 << individualTargetVID <<
"), fetched from "
179 << edgeDescriptors[i].source() <<
", "
180 << edgeDescriptors[i].target() <<
").";
195 roadmap->AddEdge(individualSourceVID, individualTargetVID, localEdges[i]);
196 edgeDescriptors[i] =
ED(individualSourceVID, individualTargetVID);
200 if(numInactiveRobots >= this->GetNumRobots())
205 edge.ClearLocalEdges();
206 const auto edgeDescriptor = this->add_edge(_source, _target, edge);
207 const bool notNew = edgeDescriptor.id() ==
INVALID_EID;
221 this->find_edge(edgeDescriptor, vi, ei);
224 this->ExecuteAddEdgeHooks(ei);
226 this->m_predecessors[_target].insert(_source);
229 return edgeDescriptor;
234 template <
typename Vertex,
typename Edge>
241 std::cerr <<
"GroupRoadmap::AddVertex: Warning! Group roadmap "
242 <<
"doesn't match this, attempting to exchange the roadmap..."
244 cfg.SetGroupRoadmap(
this);
249 if(this->IsVertex(cfg, vi)) {
250 std::cerr <<
"\nGroupRoadmap::AddVertex: vertex " << vi->descriptor()
251 <<
" already in graph"
253 return vi->descriptor();
257 for(
size_t i = 0; i < this->m_group->Size(); ++i) {
258 auto roadmap = this->GetIndividualGraph(i);
259 auto robot = roadmap->GetRobot();
260 VID individualVID = cfg.GetVID(i);
264 individualVID =roadmap->AddVertex(cfg.GetRobotCfg(i));
265 cfg.SetRobotCfg(robot, individualVID);
268 else if(roadmap->find_vertex(individualVID) == roadmap->end())
270 <<
" does not exist!";
274 const VID vid = this->add_vertex(cfg);
275 this->m_predecessors[vid];
276 this->m_allVIDs.insert(vid);
280 this->ExecuteAddVertexHooks(this->find_vertex(vid));
#define INVALID_VID
Definition: GenericStateGraph.h:23
#define INVALID_EID
Definition: GenericStateGraph.h:27
#define INVALID_ED
Definition: GroupRoadmap.h:11
#define WHERE
Macro for retrieving info about file, function, and line number.
Definition: RuntimeUtils.h:32
Definition: CompositeGraph.h:27
virtual EID AddEdge(const VID _source, const VID _target, const Edge &_w) noexcept
Definition: GenericStateGraph.h:698
BaseType::vertex_descriptor vertex_descriptor
Definition: CompositeGraph.h:44
BaseType::EID ED
Definition: CompositeGraph.h:38
STAPLGraph::vertex_descriptor VID
Definition: GenericStateGraph.h:83
STAPLGraph::const_vertex_iterator CVI
Definition: GenericStateGraph.h:91
STAPLGraph::vertex_iterator VI
Definition: GenericStateGraph.h:89
STAPLGraph::adj_edge_iterator EI
Definition: GenericStateGraph.h:90
stapl::sequential::graph< stapl::DIRECTED, stapl::NONMULTIEDGES, Vertex, Edge > STAPLGraph
Definition: GenericStateGraph.h:80
std::vector< IndividualGraph * > m_graphs
The individual graphs.
Definition: CompositeGraph.h:165
BaseType::edge_descriptor edge_descriptor
Definition: CompositeGraph.h:42
BaseType::vertex_iterator vertex_iterator
Definition: CompositeGraph.h:43
BaseType::adj_edge_iterator adj_edge_iterator
Definition: CompositeGraph.h:41
STAPLGraph::vertex_descriptor VID
Definition: GenericStateGraph.h:83
STAPLGraph::const_vertex_iterator CVI
Definition: GenericStateGraph.h:91
STAPLGraph::vertex_iterator VI
Definition: GenericStateGraph.h:89
STAPLGraph::edge_descriptor EID
Definition: GenericStateGraph.h:84
STAPLGraph::adj_edge_iterator EI
Definition: GenericStateGraph.h:90
Definition: GroupRoadmap.h:25
virtual EID AddEdge(const VID _source, const VID _target, const Edge &_w) noexcept
Definition: GenericStateGraph.h:698
STAPLGraph::vertex_descriptor VID
Definition: GenericStateGraph.h:83
Vertex::IndividualGraph IndividualRoadmap
Definition: GroupRoadmap.h:35
GroupRoadmap(RobotGroup *const _g, MPSolution *const _solution)
Construct a group roadmap.
Definition: GroupRoadmap.h:101
CompositeGraph< Vertex, Edge > BaseType
Definition: GroupRoadmap.h:32
GroupRoadmap< Vertex, Edge > GroupRoadmapType
Definition: GroupRoadmap.h:33
virtual VID AddVertex(const Vertex &_v) noexcept override
Definition: GroupRoadmap.h:237
BaseType::vertex_descriptor vertex_descriptor
Definition: GroupRoadmap.h:43
BaseType::vertex_iterator vertex_iterator
Definition: GroupRoadmap.h:42
BaseType::adj_edge_iterator adj_edge_iterator
Definition: GroupRoadmap.h:40
GroupRoadmap(const GroupRoadmap &)=delete
IndividualRoadmap::EdgeType IndividualEdge
Definition: GroupRoadmap.h:37
IndividualRoadmap::CfgType IndividualCfg
Definition: GroupRoadmap.h:36
BaseType::edge_descriptor edge_descriptor
Definition: GroupRoadmap.h:41
GroupRoadmap(GroupRoadmap &&)=delete
GroupRoadmap & operator=(const GroupRoadmap &)=delete
GroupRoadmap & operator=(GroupRoadmap &&)=delete
BaseType::EID ED
Definition: GroupRoadmap.h:38
A group of one or more robots.
Definition: RobotGroup.h:17
Definition: PMPLExceptions.h:62