From e7fb0cd7a3692ffad05fc63bac0528be5bd59dd8 Mon Sep 17 00:00:00 2001 From: Bernhard Bliem Date: Wed, 11 Oct 2017 17:40:17 +0200 Subject: [PATCH 1/3] Decomposition nodes now have reference to parent. Gringo/Clasp now also gets parent bag as input. --- src/Decomposition.cpp | 23 ++++++++++++++--------- src/Decomposition.h | 11 +++++------ src/asp_utils.cpp | 7 +++++++ src/decomposer/Dummy.cpp | 1 - src/decomposer/GraphMl.cpp | 4 +++- src/decomposer/TreeDecomposer.cpp | 2 +- test/Decomposition.cpp | 10 ++++++---- 7 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/Decomposition.cpp b/src/Decomposition.cpp index 81ec34f..523a132 100644 --- a/src/Decomposition.cpp +++ b/src/Decomposition.cpp @@ -21,10 +21,10 @@ along with D-FLAT. If not, see . #include "Decomposition.h" #include "SolverFactory.h" -Decomposition::Decomposition(Node&& leaf, const SolverFactory& solverFactory) - : DirectedAcyclicGraph(std::move(leaf)) +Decomposition::Decomposition(Node&& node, const SolverFactory& solverFactory) + : DirectedAcyclicGraph(std::move(node)) , solverFactory(solverFactory) - , root(false) + , parent(nullptr) , postJoinNode(false) { } @@ -44,14 +44,9 @@ bool Decomposition::isJoinNode() const }); } -void Decomposition::setRoot(bool root) -{ - this->root = root; -} - bool Decomposition::isRoot() const { - return root; + return parent == nullptr; } void Decomposition::setPostJoinNode(bool postJoinNode) @@ -64,6 +59,16 @@ bool Decomposition::isPostJoinNode() const return postJoinNode; } +const Decomposition* Decomposition::getParent() const +{ + return parent; +} + +void Decomposition::setParent(const Decomposition* parent) +{ + this->parent = parent; +} + int Decomposition::getWidth() const { int width = node.getBag().size() - 1; diff --git a/src/Decomposition.h b/src/Decomposition.h index e7488dd..1183e64 100644 --- a/src/Decomposition.h +++ b/src/Decomposition.h @@ -43,11 +43,7 @@ class Decomposition : public DirectedAcyclicGraph solver; - bool root; + const Decomposition* parent; bool postJoinNode; }; diff --git a/src/asp_utils.cpp b/src/asp_utils.cpp index 09bf07b..d82bbd9 100644 --- a/src/asp_utils.cpp +++ b/src/asp_utils.cpp @@ -46,6 +46,13 @@ void declareDecomposition(const Decomposition& decomposition, std::ostream& out) if(decomposition.isRoot()) out << "final." << std::endl; + else { + assert(decomposition.getParent() != nullptr); + const Decomposition& parent = *decomposition.getParent(); + out << "parentNode(" << parent.getNode().getGlobalId() << ")." << std::endl; + for(const auto& v : parent.getNode().getBag()) + out << "bag(" << parent.getNode().getGlobalId() << ',' << v << ")." << std::endl; + } if(decomposition.isPostJoinNode()) out << "postJoin." << std::endl; diff --git a/src/decomposer/Dummy.cpp b/src/decomposer/Dummy.cpp index 545eebf..8a87460 100644 --- a/src/decomposer/Dummy.cpp +++ b/src/decomposer/Dummy.cpp @@ -39,7 +39,6 @@ DecompositionPtr Dummy::decompose(const Instance& instance) const vertices.insert(arguments.begin(), arguments.end()); DecompositionPtr result(new Decomposition(vertices, app.getSolverFactory())); - result->setRoot(); return result; } diff --git a/src/decomposer/GraphMl.cpp b/src/decomposer/GraphMl.cpp index 66a9595..600b500 100644 --- a/src/decomposer/GraphMl.cpp +++ b/src/decomposer/GraphMl.cpp @@ -61,6 +61,7 @@ namespace { DecompositionNode::Bag bag = decomposition.getNode().getBag(); bag.erase(bag.begin()); DecompositionPtr child(new Decomposition(bag, app.getSolverFactory())); + child->setParent(&decomposition); decomposition.addChild(std::move(child)); } @@ -74,6 +75,7 @@ namespace { DecompositionNode::Bag bag = oldRoot->getNode().getBag(); bag.erase(bag.begin()); DecompositionPtr newNode(new Decomposition(bag, app.getSolverFactory())); + oldRoot->setParent(newNode.get()); newNode->addChild(std::move(oldRoot)); return addEmptyRoot(std::move(newNode), app); } @@ -140,6 +142,7 @@ DecompositionPtr GraphMl::decompose(const Instance& instance) const const DecompositionPtr to = nodes.top(); nodes.pop(); const DecompositionPtr& from = nodes.top(); + to->setParent(from.get()); from->addChild(std::move(to)); } else @@ -155,7 +158,6 @@ DecompositionPtr GraphMl::decompose(const Instance& instance) const if(optAddEmptyRoot.isUsed()) root = addEmptyRoot(std::move(root), app); - root->setRoot(); return root; } diff --git a/src/decomposer/TreeDecomposer.cpp b/src/decomposer/TreeDecomposer.cpp index ee02dc4..11e96c4 100644 --- a/src/decomposer/TreeDecomposer.cpp +++ b/src/decomposer/TreeDecomposer.cpp @@ -147,6 +147,7 @@ namespace { Decomposition* parentOrPostJoinNode = parent.get(); DecompositionPtr child{new Decomposition{childBag, app.getSolverFactory()}}; + child->setParent(parentOrPostJoinNode); parentOrPostJoinNode->addChild(child); stack.push({htdChild, child}); } @@ -275,7 +276,6 @@ DecompositionPtr TreeDecomposer::decompose(const Instance& instance) const // Transform htd's tree decomposition into our format DecompositionPtr result = transformTd(*decomposition, graph, app); - result->setRoot(); return result; } diff --git a/test/Decomposition.cpp b/test/Decomposition.cpp index 711bdc0..e0964b0 100644 --- a/test/Decomposition.cpp +++ b/test/Decomposition.cpp @@ -72,10 +72,12 @@ TEST_F(DecompositionTest, IdentifiesJoinNodes) EXPECT_FALSE(child->isJoinNode()); } -TEST_F(DecompositionTest, IsNotRootByDefault) +TEST_F(DecompositionTest, SetsParent) { Decomposition d = {DecompositionNode{{}}, solverFactory}; - EXPECT_FALSE(d.isRoot()); - d.setRoot(); - EXPECT_TRUE(d.isRoot()); + EXPECT_EQ(nullptr, d.getParent()); + DecompositionPtr c{new Decomposition{DecompositionNode{{}}, solverFactory}}; + c->setParent(&d); + d.addChild(std::move(c)); + EXPECT_EQ(&d, (*d.getChildren().begin())->getParent()); } From beedd900f9c688a0cb362e697df31e0c3e1a5b78 Mon Sep 17 00:00:00 2001 From: Bernhard Bliem Date: Mon, 26 Mar 2018 18:47:45 +0300 Subject: [PATCH 2/3] ldd output was parsed wrong, at least on my current system --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 0be1cea..9f35b07 100644 --- a/Makefile +++ b/Makefile @@ -182,7 +182,7 @@ dist: release cp build/release/dflat $(DIST_DIR)/dflat.bin strip $(DIST_DIR)/dflat.bin cp run-dflat.sh $(DIST_DIR)/dflat - cp -L $(shell ldd build/release/dflat | awk '/=>/ { printf("%s ",$$3) } /ld-linux/ { printf("%s ",$$1) }') $(DIST_DIR)/lib + cp -L $(shell ldd build/release/dflat | awk '/=> .*\.so/ { printf("%s ",$$3) } /ld-linux/ { printf("%s ",$$1) }') $(DIST_DIR)/lib cp -R applications $(DIST_DIR) cd build/dist && tar czf $(RELEASE).tar.gz $(RELEASE) mv build/dist/$(RELEASE).tar.gz build @@ -196,7 +196,7 @@ dist32: release32 cp build/release32/dflat $(DIST_DIR)/dflat.bin strip $(DIST_DIR)/dflat.bin cp run-dflat.sh $(DIST_DIR)/dflat - cp -L $(shell ldd build/release32/dflat | awk '/=>/ { printf("%s ",$$3) } /ld-linux/ { printf("%s ",$$1) }') $(DIST_DIR)/lib + cp -L $(shell ldd build/release32/dflat | awk '/=> .*\.so/ { printf("%s ",$$3) } /ld-linux/ { printf("%s ",$$1) }') $(DIST_DIR)/lib cp -R applications $(DIST_DIR) cd build/dist32 && tar czf $(RELEASE).tar.gz $(RELEASE) mv build/dist32/$(RELEASE).tar.gz build From 37eff45f999c39c942e5c5792e2d75ed728df42f Mon Sep 17 00:00:00 2001 From: Bernhard Bliem Date: Thu, 27 Jun 2019 10:37:17 +0300 Subject: [PATCH 3/3] GraphML output: Added attributes for NetworkX --- src/Decomposition.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Decomposition.cpp b/src/Decomposition.cpp index 523a132..86db43b 100644 --- a/src/Decomposition.cpp +++ b/src/Decomposition.cpp @@ -84,7 +84,7 @@ void Decomposition::printGraphMl(std::ostream& out) const << " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" << std::endl << " xsi:schemaLocation=\"http://graphml.graphdrawing.org/xmlns " "http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd\">" << std::endl - << " " << std::endl + << " " << std::endl << " " << std::endl; printGraphMlElements(out);