From fec57f7bd5d50d29a1dcf4b78948f55d35c18635 Mon Sep 17 00:00:00 2001
From: Joseph Mirabel <jmirabel@laas.fr>
Date: Tue, 29 Jul 2014 10:17:37 +0200
Subject: [PATCH] Update Graph and Edge interface

---
 include/hpp/manipulation/graph/edge.hh  | 12 +++++
 include/hpp/manipulation/graph/graph.hh | 17 ++++++++
 src/graph/graph.cc                      | 58 +++++++++++++++++++++++++
 3 files changed, 87 insertions(+)

diff --git a/include/hpp/manipulation/graph/edge.hh b/include/hpp/manipulation/graph/edge.hh
index 54955b5a..35e48215 100644
--- a/include/hpp/manipulation/graph/edge.hh
+++ b/include/hpp/manipulation/graph/edge.hh
@@ -49,6 +49,18 @@ namespace hpp {
           /// Print the object in a stream.
           std::ostream& print (std::ostream& os) const;
 
+          /// Get the destination
+          NodePtr_t to () const
+          {
+            return to_.lock();
+          }
+
+          /// Get the origin
+          NodePtr_t from () const
+          {
+            return from_.lock();
+          }
+
         protected:
           /// Initialization of the object.
           void init (const EdgeWkPtr_t& weak, const NodeWkPtr_t& from,
diff --git a/include/hpp/manipulation/graph/graph.hh b/include/hpp/manipulation/graph/graph.hh
index 304d8a53..80dede06 100644
--- a/include/hpp/manipulation/graph/graph.hh
+++ b/include/hpp/manipulation/graph/graph.hh
@@ -161,6 +161,23 @@ namespace hpp {
           /// Select randomly outgoing edges of the given nodes.
           virtual Edges_t chooseEdge(const Nodes_t& node);
 
+          /// Constraint to project onto the Nodes_t.
+          /// \param the Nodes_t on which to project.
+          /// \return The initialized projector.
+          virtual ConstraintPtr_t configConstraint (const Nodes_t& nodes);
+
+          /// Constraint to project onto the same leaf as config.
+          /// \param edges a list of edges defining the foliation.
+          /// \param config Configuration that will initialize the projector.
+          /// \return The initialized projector.
+          virtual ConstraintPtr_t configConstraint (const Edges_t& edges, ConfigurationIn_t config);
+
+          /// Constraint to project a path.
+          /// \param edges a list of edges defining the foliation.
+          /// \param config Configuration that will initialize the constraint.
+          /// \return The initialized constraint.
+          virtual ConstraintPtr_t pathConstraint (const Edges_t& edges, ConfigurationIn_t config);
+
           /// Return the NodeSelector with the given name if any,
           /// NULL pointer if not found.
           NodeSelectorPtr_t getNodeSelectorByName (const std::string& name);
diff --git a/src/graph/graph.cc b/src/graph/graph.cc
index 17b2b28d..a15450ac 100644
--- a/src/graph/graph.cc
+++ b/src/graph/graph.cc
@@ -17,6 +17,7 @@
 #include <hpp/util/assertion.hh>
 
 #include "hpp/manipulation/graph/node-selector.hh"
+#include "hpp/manipulation/graph/node.hh"
 #include "hpp/manipulation/graph/graph.hh"
 
 namespace hpp {
@@ -75,6 +76,63 @@ namespace hpp {
         return NodeSelectorPtr_t();
       }
 
+      ConstraintPtr_t Graph::configConstraint (const Nodes_t& nodes)
+      {
+        ConstraintSetPtr_t constraint = ConstraintSet::create (robot (), name ());
+        insertListIn <LockedDofs_t> (lockedDofConstraints (), constraint);
+        for (Nodes_t::const_iterator it = nodes.begin();
+            it != nodes.end(); it++)
+          insertListIn <LockedDofs_t> ((*it)->lockedDofConstraints (), constraint);
+
+        ConfigProjectorPtr_t proj = ConfigProjector::create(robot(), name (), errorThreshold(), maxIterations());
+        for (Nodes_t::const_iterator it = nodes.begin();
+            it != nodes.end(); it++)
+          insertListIn <DifferentiableFunctions_t> ((*it)->numericalConstraints (), proj);
+
+        constraint->addConstraint (HPP_DYNAMIC_PTR_CAST(Constraint, proj));
+        return constraint;
+      }
+
+      ConstraintPtr_t Graph::configConstraint (const Edges_t& edges, ConfigurationIn_t config)
+      {
+        ConstraintSetPtr_t constraint = ConstraintSet::create (robot (), name ());
+        insertListIn <LockedDofs_t> (lockedDofConstraints (), constraint);
+        for (Edges_t::const_iterator it = edges.begin();
+            it != edges.end(); it++) {
+          insertListIn <LockedDofs_t> ((*it)->lockedDofConstraints (), constraint);
+          insertListIn <LockedDofs_t> ((*it)->to()->lockedDofConstraints(), constraint);
+        }
+
+        ConfigProjectorPtr_t proj = ConfigProjector::create(robot(), name (), errorThreshold(), maxIterations());
+        for (Edges_t::const_iterator it = edges.begin();
+            it != edges.end(); it++) {
+          insertListIn <DifferentiableFunctions_t> ((*it)->numericalConstraints (), proj);
+          insertListIn <DifferentiableFunctions_t> ((*it)->to()->numericalConstraints (), proj);
+        }
+
+        constraint->addConstraint (HPP_DYNAMIC_PTR_CAST(Constraint, proj));
+        constraint->offsetFromConfig (config);
+        return constraint;
+      }
+
+      ConstraintPtr_t Graph::pathConstraint (const Edges_t& edges, ConfigurationIn_t config)
+      {
+        ConstraintSetPtr_t constraint = ConstraintSet::create (robot (), name ());
+        insertListIn <LockedDofs_t> (lockedDofConstraints (), constraint);
+        for (Edges_t::const_iterator it = edges.begin();
+            it != edges.end(); it++)
+          insertListIn <LockedDofs_t> ((*it)->lockedDofConstraints (), constraint);
+
+        ConfigProjectorPtr_t proj = ConfigProjector::create(robot(), name (), errorThreshold(), maxIterations());
+        for (Edges_t::const_iterator it = edges.begin();
+            it != edges.end(); it++)
+          insertListIn <DifferentiableFunctions_t> ((*it)->numericalConstraints (), proj);
+
+        constraint->addConstraint (HPP_DYNAMIC_PTR_CAST(Constraint, proj));
+        constraint->offsetFromConfig (config);
+        return constraint;
+      }
+
       std::ostream& Graph::print (std::ostream& os) const
       {
         GraphComponent::print (os) << std::endl;
-- 
GitLab