From 18ecc541f9a3373d93d3586570d83d22bc1b0100 Mon Sep 17 00:00:00 2001
From: Florent Lamiraux <florent@laas.fr>
Date: Fri, 30 Apr 2021 09:39:43 +0000
Subject: [PATCH] [graph::Graph] Fix registration of constraints and
 complements

  Do not clear constraintsAndComplements_ after graph initialization,
  Add method clearConstraintsAndComplement(),
  call this method in ProblemSolver::initConstraintGraph().
---
 include/hpp/manipulation/graph/graph.hh | 4 ++++
 src/graph/graph.cc                      | 6 +++++-
 src/problem-solver.cc                   | 1 +
 3 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/include/hpp/manipulation/graph/graph.hh b/include/hpp/manipulation/graph/graph.hh
index 8bd7099..730b654 100644
--- a/include/hpp/manipulation/graph/graph.hh
+++ b/include/hpp/manipulation/graph/graph.hh
@@ -81,6 +81,10 @@ namespace hpp {
           /// Select randomly outgoing edge of the given node.
           EdgePtr_t chooseEdge(RoadmapNodePtr_t node) const;
 
+          /// Clear the vector of constraints and complements
+          /// \sa registerConstraints
+          void clearConstraintsAndComplement();
+
           /// Register a triple of constraints to be inserted in nodes and edges
           /// \param constraint a constraint (grasp of placement)
           /// \param complement the complement constraint
diff --git a/src/graph/graph.cc b/src/graph/graph.cc
index e98c0a6..8500e9a 100644
--- a/src/graph/graph.cc
+++ b/src/graph/graph.cc
@@ -56,7 +56,6 @@ namespace hpp {
         assert(components_.size() >= 1 && components_[0].lock() == wkPtr_.lock());
         for (std::size_t i = 1; i < components_.size(); ++i)
           components_[i].lock()->initialize();
-        constraintsAndComplements_.clear ();
         isInit_ = true;
       }
 
@@ -153,6 +152,11 @@ namespace hpp {
         return stateSelector_->chooseEdge (from);
       }
 
+      void Graph::clearConstraintsAndComplement()
+      {
+        constraintsAndComplements_.clear();
+      }
+
       void Graph::registerConstraints
       (const ImplicitPtr_t& constraint,
        const ImplicitPtr_t& complement,
diff --git a/src/problem-solver.cc b/src/problem-solver.cc
index 5007cad..3f0ebbe 100644
--- a/src/problem-solver.cc
+++ b/src/problem-solver.cc
@@ -221,6 +221,7 @@ namespace hpp {
       if (!constraintGraph_)
         throw std::runtime_error ("The graph is not defined.");
       initSteeringMethod();
+      constraintGraph_->clearConstraintsAndComplement();
       for (std::size_t i = 0; i < constraintsAndComplements.size(); ++i) {
         const ConstraintAndComplement_t& c = constraintsAndComplements[i];
         constraintGraph ()->registerConstraints (c.constraint, c.complement, c.both);
-- 
GitLab