17 #ifndef GZ_MATH_GRAPH_GRAPH_HH_
18 #define GZ_MATH_GRAPH_GRAPH_HH_
29 #include <gz/math/config.hh>
36 inline namespace GZ_MATH_VERSION_NAMESPACE {
106 template<
typename V,
typename E,
typename EdgeType>
119 for (
auto const &v : _vertices)
121 if (!this->AddVertex(v.Name(), v.Data(), v.Id()).Valid())
123 std::cerr <<
"Invalid vertex with Id [" << v.Id() <<
"]. Ignoring."
129 for (
auto const &e : _edges)
131 if (!this->AddEdge(e.vertices, e.data, e.weight).Valid())
151 id = this->NextVertexId();
156 std::cerr <<
"[Graph::AddVertex()] The limit of vertices has been "
157 <<
"reached. Ignoring vertex." <<
std::endl;
163 auto ret = this->vertices.insert(
169 std::cerr <<
"[Graph::AddVertex()] Repeated vertex [" <<
id <<
"]"
177 return ret.first->second;
186 for (
auto const &v : this->vertices)
198 for (
auto const &vertex : this->vertices)
200 if (vertex.second.Name() == _name)
215 const double _weight = 1.0)
217 auto id = this->NextEdgeId();
222 std::cerr <<
"[Graph::AddEdge()] The limit of edges has been reached. "
224 return EdgeType::NullEdge;
227 EdgeType newEdge(_vertices, _data, _weight,
id);
228 return this->LinkEdge(
std::move(newEdge));
239 auto edgeVertices = _edge.Vertices();
242 for (
auto const &v : {edgeVertices.first, edgeVertices.second})
244 if (this->vertices.find(v) == this->vertices.end())
245 return EdgeType::NullEdge;
249 for (
auto const &v : {edgeVertices.first, edgeVertices.second})
253 auto vertexIt = this->adjList.find(v);
254 assert(vertexIt != this->adjList.end());
255 vertexIt->second.insert(_edge.Id());
262 return ret.first->second;
271 for (
auto const &edge : this->edges)
299 auto vertexIt = this->adjList.
find(_vertex);
300 if (vertexIt == this->adjList.end())
303 for (
auto const &edgeId : vertexIt->second)
305 const auto &edge = this->EdgeFromId(edgeId);
306 auto neighborVertexId = edge.From(_vertex);
307 if (neighborVertexId !=
kNullId)
309 const auto &neighborVertex = this->VertexFromId(neighborVertexId);
335 return this->AdjacentsFrom(_vertex.
Id());
355 auto incidentEdges = this->IncidentsTo(_vertex);
358 for (
auto const &incidentEdgeRef : incidentEdges)
360 const auto &incidentEdgeId = incidentEdgeRef.first;
361 const auto &incidentEdge = this->EdgeFromId(incidentEdgeId);
362 const auto &neighborVertexId = incidentEdge.To(_vertex);
363 const auto &neighborVertex = this->VertexFromId(neighborVertexId);
388 return this->AdjacentsTo(_vertex.
Id());
396 return this->IncidentsTo(_vertex).size();
404 return this->IncidentsTo(this->VertexFromId(_vertex.
Id())).size();
412 return this->IncidentsFrom(_vertex).size();
420 return this->IncidentsFrom(this->VertexFromId(_vertex.
Id())).size();
433 const auto &adjIt = this->adjList.
find(_vertex);
434 if (adjIt == this->adjList.end())
437 const auto &edgeIds = adjIt->second;
438 for (
auto const &edgeId : edgeIds)
440 const auto &edge = this->EdgeFromId(edgeId);
441 if (edge.From(_vertex) !=
kNullId)
456 return this->IncidentsFrom(_vertex.
Id());
469 const auto &adjIt = this->adjList.
find(_vertex);
470 if (adjIt == this->adjList.end())
473 const auto &edgeIds = adjIt->second;
474 for (
auto const &edgeId : edgeIds)
476 const auto &edge = this->EdgeFromId(edgeId);
477 if (edge.To(_vertex) !=
kNullId)
492 return this->IncidentsTo(_vertex.
Id());
500 return this->vertices.empty();
508 auto vIt = this->vertices.find(_vertex);
509 if (vIt == this->vertices.end())
513 auto incidents = this->IncidentsTo(_vertex);
514 for (
auto edgePair : incidents)
515 this->RemoveEdge(edgePair.first);
518 incidents = this->IncidentsFrom(_vertex);
519 for (
auto edgePair : incidents)
520 this->RemoveEdge(edgePair.first);
523 this->adjList.erase(_vertex);
526 this->vertices.erase(_vertex);
536 return this->RemoveVertex(_vertex.
Id());
545 for (
auto const &[
id, vertex] : this->vertices)
547 if (vertex.Name() == _name)
552 for (
auto const &
id : toRemove)
554 if (this->RemoveVertex(
id))
567 auto edgeIt = this->edges.find(_edge);
568 if (edgeIt == this->edges.end())
571 auto edgeVertices = edgeIt->second.Vertices();
574 for (
auto const &v : {edgeVertices.first, edgeVertices.second})
576 if (edgeIt->second.From(v) !=
kNullId)
578 auto vertex = this->adjList.find(v);
579 assert(vertex != this->adjList.end());
580 vertex->second.erase(_edge);
584 this->edges.erase(_edge);
596 return this->RemoveEdge(_edge.Id());
605 auto iter = this->vertices.find(_id);
606 if (iter == this->vertices.end())
618 auto iter = this->vertices.find(_id);
619 if (iter == this->vertices.end())
638 this->adjList.
find(_sourceId);
641 if (adjIt == this->adjList.
end())
642 return EdgeType::NullEdge;
646 edgIt != adjIt->second.
end(); ++edgIt)
650 this->edges.
find(*edgIt);
653 if (edgeIter != this->edges.
end() &&
654 edgeIter->second.From(_sourceId) == _destId)
656 assert(edgeIter->second.To(_destId) == _sourceId);
657 return edgeIter->second;
661 return EdgeType::NullEdge;
670 auto iter = this->edges.find(_id);
671 if (iter == this->edges.end())
672 return EdgeType::NullEdge;
683 auto iter = this->edges.find(_id);
684 if (iter == this->edges.end())
685 return EdgeType::NullEdge;
695 public:
template<
typename VV,
typename EE,
typename EEdgeType>
703 while (this->vertices.find(this->nextVertexId) != this->vertices.end()
706 ++this->nextVertexId;
709 return this->nextVertexId;
716 while (this->edges.find(this->nextEdgeId) != this->edges.end() &&
722 return this->nextEdgeId;
752 template<
typename VV,
typename EE>
759 for (
auto const &vertexMap : _g.Vertices())
761 auto vertex = vertexMap.second.get();
766 for (
auto const &edgeMap : _g.Edges())
768 auto edge = edgeMap.second.get();
779 template<
typename VV,
typename EE>
786 for (
auto const &vertexMap : _g.Vertices())
788 auto vertex = vertexMap.second.get();
793 for (
auto const &edgeMap : _g.Edges())
795 auto edge = edgeMap.second.get();
806 template<
typename V,
typename E>
811 template<
typename V,
typename E>