diff --git a/include/hpp/manipulation/graph/edge.hh b/include/hpp/manipulation/graph/edge.hh index 4b5f32867a8e20d01064887f135d3ba5e49ead3f..135edea083e4df0e9b9bc7cfdf59297fbb1c9282 100644 --- a/include/hpp/manipulation/graph/edge.hh +++ b/include/hpp/manipulation/graph/edge.hh @@ -297,6 +297,9 @@ namespace hpp { virtual void populateTooltip (dot::Tooltip& tp) const; private: + bool applyConstraintsWithOffset (ConfigurationIn_t qoffset, + ConfigurationIn_t qlevelset, ConfigurationOut_t q) const; + typedef Cache < ConstraintSetPtr_t > Constraint_t; /// See pathConstraint member function. diff --git a/include/hpp/manipulation/graph/statistics.hh b/include/hpp/manipulation/graph/statistics.hh index fea288a333138a09be36675fd480ba92b0ea7c35..ed93750ade2b7c119ecf70ccf039c922a4b98792 100644 --- a/include/hpp/manipulation/graph/statistics.hh +++ b/include/hpp/manipulation/graph/statistics.hh @@ -122,6 +122,8 @@ namespace hpp { statistics::DiscreteDistribution < RoadmapNodePtr_t > getDistribOutOfConnectedComponent ( const core::ConnectedComponentPtr_t& cc) const; + statistics::DiscreteDistribution < RoadmapNodePtr_t > getDistrib () const; + private: /// The constraint that creates the foliation. ConstraintSetPtr_t constraint_; diff --git a/src/graph/edge.cc b/src/graph/edge.cc index 1c2089f94d6c27c18424205f52b4539407ee7a15..6cc0705f2ed361779f2e382ceddacede824bd837 100644 --- a/src/graph/edge.cc +++ b/src/graph/edge.cc @@ -469,35 +469,46 @@ namespace hpp { } } - bool LevelSetEdge::applyConstraints (ConfigurationIn_t, ConfigurationOut_t) const + bool LevelSetEdge::applyConstraints (ConfigurationIn_t qoffset, ConfigurationOut_t q) const { - throw std::logic_error ("I need to know which connected component we wish to use."); + // First, get an offset from the histogram + statistics::DiscreteDistribution < RoadmapNodePtr_t > distrib = hist_->getDistrib (); + const Configuration_t& qlevelset = *(distrib ()->configuration ()); + + return applyConstraintsWithOffset (qoffset, qlevelset, q); } bool LevelSetEdge::applyConstraints (core::NodePtr_t n_offset, ConfigurationOut_t q) const { // First, get an offset from the histogram that is not in the same connected component. statistics::DiscreteDistribution < RoadmapNodePtr_t > distrib = hist_->getDistribOutOfConnectedComponent (n_offset->connectedComponent ()); - const Configuration_t& levelsetTarget = *(distrib ()->configuration ()), - q_offset = *(n_offset->configuration ()); - // Then, set the offset. + const Configuration_t& qlevelset = *(distrib ()->configuration ()), + qoffset = *(n_offset->configuration ()); + + return applyConstraintsWithOffset (qoffset, qlevelset, q); + } + + bool LevelSetEdge::applyConstraintsWithOffset (ConfigurationIn_t qoffset, + ConfigurationIn_t qlevelset, ConfigurationOut_t q) const + { + // First, set the offset. ConstraintSetPtr_t cs = extraConfigConstraint (); const ConfigProjectorPtr_t cp = cs->configProjector (); assert (cp); - cp->rightHandSideFromConfig (q_offset); + cp->rightHandSideFromConfig (qoffset); for (NumericalConstraints_t::const_iterator it = extraNumericalConstraints_.begin (); it != extraNumericalConstraints_.end (); ++it) { - (*it)->rightHandSideFromConfig (levelsetTarget); + (*it)->rightHandSideFromConfig (qlevelset); } for (LockedJoints_t::const_iterator it = extraLockedJoints_.begin (); it != extraLockedJoints_.end (); ++it) { - (*it)->rightHandSideFromConfig (levelsetTarget); + (*it)->rightHandSideFromConfig (qlevelset); } cp->updateRightHandSide (); // Eventually, do the projection. - if (isShort_) q = q_offset; + if (isShort_) q = qoffset; if (cs->apply (q)) return true; ::hpp::statistics::SuccessStatistics& ss = cp->statistics (); if (ss.nbFailure () > ss.nbSuccess ()) { diff --git a/src/graph/statistics.cc b/src/graph/statistics.cc index 3bdde7c1621a54e0fbb516507685d75801c788e0..e50c43210f830cf845b90b8bb8f21101c26520e0 100644 --- a/src/graph/statistics.cc +++ b/src/graph/statistics.cc @@ -250,6 +250,18 @@ namespace hpp { return distrib; } + statistics::DiscreteDistribution < RoadmapNodePtr_t > LeafHistogram::getDistrib () const + { + statistics::DiscreteDistribution < RoadmapNodePtr_t > distrib; + for (const_iterator bin = begin(); bin != end (); ++bin) { + unsigned int w = bin->freq (); + if (w == 0) + continue; + distrib.insert (bin->nodes ().front (), w); + } + return distrib; + } + const LeafBin::RoadmapNodes_t& LeafBin::nodes () const { return nodes_;