Skip to content

Commit 9ca1486

Browse files
committed
fix mcmgraph
1 parent 5828c95 commit 9ca1486

File tree

2 files changed

+30
-58
lines changed

2 files changed

+30
-58
lines changed

include/maxplus/base/analysis/mcm/mcmgraph.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,9 @@ class MCMgraph {
193193
// Remove an edge from the MCMgraph.
194194
// Note: containers of edges are lists, so remove is expensive!
195195
void removeEdge(MCMedge &e) {
196-
this->edges.remove(e);
197196
e.src->out.remove(&e);
198197
e.dst->in.remove(&e);
199-
}
198+
this->edges.remove(e); }
200199

201200
void relabelNodeIds(std::map<CId, CId> *nodeIdMap = nullptr);
202201

src/base/analysis/mcm/mcmgraph.cc

Lines changed: 29 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -599,79 +599,52 @@ void stronglyConnectedMCMgraph(MCMgraph &g,
599599
* edges are assigned a new id starting in the range [0,nrNodes()).
600600
*/
601601
void relabelMCMgraph(MCMgraph &g) {
602-
uint nodeId = 0;
603-
uint edgeId = 0;
604602

605-
// Relabel nodes
603+
std::set<MCMedge*> edgesToRemove;
604+
std::set<MCMnode*> nodesToRemove;
605+
606+
// find nodes to remove
606607
for (auto &n : g.getNodes()) {
607-
if (n.visible) {
608-
n.id = nodeId;
609-
nodeId++;
608+
if (! n.visible) {
609+
nodesToRemove.insert(&n);
610610
}
611611
}
612612

613-
// Relabel edges
613+
// find edges to remove
614614
for (auto &e : g.getEdges()) {
615-
if (e.visible) {
616-
e.id = edgeId;
617-
edgeId++;
615+
if (! e.visible) {
616+
edgesToRemove.insert(&e);
618617
}
619618
}
620619

621-
// Remove edges from nodes
622-
for (auto &n : g.getNodes()) {
623-
if (!n.visible) {
624-
continue;
625-
}
626-
627-
for (auto iterE = n.in.begin(); iterE != n.in.end();) {
628-
auto iterEN = iterE;
629-
630-
// Next iterator
631-
iterE++;
632-
633-
// Erase current iterator?
634-
if (!(*iterEN)->visible) {
635-
n.in.erase(iterEN);
636-
}
637-
}
638-
639-
for (auto iterE = n.out.begin(); iterE != n.out.end();) {
640-
auto iterEN = iterE;
641-
642-
// Next iterator
643-
iterE++;
644-
645-
// Erase current iterator?
646-
if (!(*iterEN)->visible) {
647-
n.out.erase(iterEN);
648-
}
649-
}
620+
// remove edges
621+
for (auto *e : edgesToRemove) {
622+
g.removeEdge(*e);
650623
}
651624

652-
// Remove nodes from graph
653-
for (auto iter = g.getNodes().begin(); iter != g.getNodes().end();) {
654-
auto iterN = iter;
655-
656-
// Next iterator
657-
iter++;
625+
// remove nodes
626+
for (auto *n : nodesToRemove) {
627+
g.removeNode(*n);
628+
}
658629

659-
if (!(*iterN).visible) {
660-
g.removeNode(*iterN);
630+
// Relabel nodes
631+
uint nodeId = 0;
632+
for (auto &n : g.getNodes()) {
633+
if (n.visible) {
634+
n.id = nodeId;
635+
nodeId++;
661636
}
662637
}
663638

664-
// Remove edges from graph
665-
for (auto iter = g.getEdges().begin(); iter != g.getEdges().end();) {
666-
auto iterE = iter;
667-
668-
// Next iterator
669-
iter++;
670-
671-
if (!(*iterE).visible) {
672-
g.removeEdge(*iterE);
639+
// Relabel edges
640+
uint edgeId = 0;
641+
for (auto &e : g.getEdges()) {
642+
if (e.visible) {
643+
e.id = edgeId;
644+
edgeId++;
673645
}
674646
}
647+
675648
}
676649

677650
// Prune the edges in the MCMgraph to maintain only Pareto maximal combinations

0 commit comments

Comments
 (0)