21 #ifndef CONSTRAINTSBUILDER_BUILDER_GRID_H
22 #define CONSTRAINTSBUILDER_BUILDER_GRID_H
26 #include <yuni/yuni.h>
27 #include <yuni/core/string.h>
29 #include <antares/study/study.h>
31 namespace Antares::Graph
39 nodeProperties = data;
42 virtual ~
Node() =
default;
44 virtual std::string getName()
49 virtual void setName(std::string newName)
56 NodeT* nodeProperties;
69 long getWeight()
const
74 void setWeight(
long w)
86 return destinationNode;
107 long operator()(
long i,
const Edge<NodeT>* o)
const
109 return (o->getWeight() + i);
117 return lhs->getWeight() < rhs->getWeight();
125 template<
class NodeT>
131 typedef std::vector<NodeP> VectorNodeP;
132 typedef std::vector<EdgeP> VectorEdgeP;
133 typedef std::map<NodeP, NodeP> MapNodes;
134 typedef std::vector<bool> EdgeIncidence;
151 uint getNumberOfConnectedComponents();
158 auto edgeIT = std::find_if(pEdgesList.begin(),
160 [&u, &v](
const EdgeP& edgeP) ->
bool
162 if (edgeP->getOrigin()->getName() == u
163 && edgeP->getDestination()->getName() == v)
167 if (edgeP->getDestination()->getName() == u
168 && edgeP->getOrigin()->getName() == v)
177 if (edgeIT != pEdgesList.end())
185 EdgeP findDrivingEdgeFromNodeNames(std::string u, std::string v)
187 auto edgeIT = std::find_if(pMinSpanningTree.begin(),
188 pMinSpanningTree.end(),
189 [&u, &v](
const EdgeP& edgeP) ->
bool
191 if (edgeP->getOrigin()->getName() == u
192 && edgeP->getDestination()->getName() == v)
196 if (edgeP->getDestination()->getName() == u
197 && edgeP->getOrigin()->getName() == v)
206 if (edgeIT != pMinSpanningTree.end())
215 void removeEdge(EdgeP e)
217 auto edgeIT = std::find(pEdgesList.begin(), pEdgesList.end(), e);
219 if (edgeIT != pEdgesList.end())
221 pEdgesList.erase(edgeIT);
223 adjency[e->getOrigin()].erase(e->getDestination());
224 adjency[e->getDestination()].erase(e->getOrigin());
233 auto nodeIT = std::find_if(pNodesList.begin(),
235 [&name](
NodeP& n) ->
bool { return n->getName() == name; });
236 if (nodeIT != pNodesList.end())
283 return meshIndexMatrix;
286 VectorEdgeP twoLevelPath(VectorNodeP vN);
292 bool getDuplicatedGrid(
Grid&);
298 bool cloneGrid(
Grid&);
300 const VectorEdgeP& getEdges()
306 EdgeIncidence getIncidenceVector(VectorEdgeP vE)
308 EdgeIncidence Ei(pEdgesList.size(),
false);
309 for (uint i = 0; i < pEdgesList.size(); i++)
311 if (std::find(vE.begin(), vE.end(), pEdgesList[i]) != vE.end())
319 EdgeIncidence getIncidenceVector(EdgeP vE)
321 EdgeIncidence Ei(pEdgesList.size(),
false);
322 for (uint i = 0; i < pEdgesList.size(); i++)
324 if (vE == pEdgesList[i])
333 VectorEdgeP getEdgeVectorFromIncidence(EdgeIncidence vI)
336 for (uint i = 0; i < pEdgesList.size(); i++)
340 vE.push_back(pEdgesList[i]);
346 EdgeIncidence incidenceXOR(EdgeIncidence& e1, EdgeIncidence& e2)
348 EdgeIncidence Ei(e1.size(),
false);
349 std::transform(e1.begin(), e1.end(), e2.begin(), Ei.begin(), std::bit_xor<bool>());
354 int incidenceInnerProduct(EdgeIncidence& e1, EdgeIncidence& e2)
356 int r1 = std::inner_product(e1.begin(), e1.end(), e2.begin(), 0);
362 for (
auto it = pNodesList.begin(); it != pNodesList.end(); it++)
368 for (
auto it = pEdgesList.begin(); it != pEdgesList.end(); it++)
374 pMinSpanningTree.clear();
376 meshIndexMatrix.clear();
383 VectorNodeP pNodesList;
386 VectorEdgeP pEdgesList;
390 VectorEdgeP pMinSpanningTree;
392 std::vector<VectorEdgeP> pMesh;
394 std::vector<std::vector<int>> meshIndexMatrix;
399 std::map<NodeP, std::map<NodeP, EdgeP>> adjency;
Antares Grid (graph)
Definition: grid.h:127
EdgeP addEdge(NodeP, NodeP, long weight=0)
Add one edge to the graph.
Definition: grid.hxx:75
const std::vector< std::vector< int > > & getMeshIndexMatrix()
Get the min cycle basis mesh.
Definition: grid.h:281
VectorEdgeP findShortestPath(NodeP node1, NodeP node2) const
Find shortest path between the two nodes (Djikstra)
Definition: grid.hxx:423
NodeP addNode(NodeT &, std::string)
Add one node to the graph.
Definition: grid.hxx:54
~Grid()
Destructor.
Definition: grid.hxx:41
NodeP findNodeFromName(std::string name)
find a node from it's name
Definition: grid.h:231
EdgeP findEdgeFromNodeNames(std::string u, std::string v)
find an edge from node names
Definition: grid.h:156
Grid()
Constructor.
Definition: grid.hxx:35