hpp-constraints 6.0.0
Definition of basic geometric constraints for motion planning
Loading...
Searching...
No Matches
hierarchical-iterative.hh
Go to the documentation of this file.
1// Copyright (c) 2017, 2018
2// Authors: Joseph Mirabel (joseph.mirabel@laas.fr)
3//
4
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9// 1. Redistributions of source code must retain the above copyright
10// notice, this list of conditions and the following disclaimer.
11//
12// 2. Redistributions in binary form must reproduce the above copyright
13// notice, this list of conditions and the following disclaimer in the
14// documentation and/or other materials provided with the distribution.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
27// DAMAGE.
28
29#ifndef HPP_CONSTRAINTS_SOLVER_HIERARCHICAL_ITERATIVE_HH
30#define HPP_CONSTRAINTS_SOLVER_HIERARCHICAL_ITERATIVE_HH
31
32#include <functional>
37#include <hpp/util/serialization-fwd.hh>
38#include <map>
39
40namespace hpp {
41namespace constraints {
42namespace solver {
45namespace lineSearch {
47struct Constant {
48 template <typename SolverType>
49 bool operator()(const SolverType& solver, vectorOut_t arg, vectorOut_t darg);
50};
51
56
57 template <typename SolverType>
58 bool operator()(const SolverType& solver, vectorOut_t arg, vectorOut_t darg);
59
60 template <typename SolverType>
61 inline value_type computeLocalSlope(const SolverType& solver) const;
62
63 value_type c, tau, smallAlpha; // 0.8 ^ 7 = 0.209, 0.8 ^ 8 = 0.1677
65};
66
72
73 template <typename SolverType>
74 bool operator()(const SolverType& solver, vectorOut_t arg, vectorOut_t darg);
75
78};
79
87 ErrorNormBased(value_type alphaMin = 0.2);
88
89 template <typename SolverType>
90 bool operator()(const SolverType& solver, vectorOut_t arg, vectorOut_t darg);
91
93};
94} // namespace lineSearch
95
96namespace saturation {
104struct Base {
116 virtual bool saturate(vectorIn_t q, vectorOut_t qSat,
117 Eigen::VectorXi& saturation);
118 virtual ~Base() {}
119};
121struct Function : Base {
122 typedef std::function<bool(vectorIn_t, vectorOut_t, Eigen::VectorXi&)>
124 bool saturate(vectorIn_t q, vectorOut_t qSat, Eigen::VectorXi& saturation) {
125 return function(q, qSat, saturation);
126 }
130};
132struct Bounds : Base {
133 bool saturate(vectorIn_t q, vectorOut_t qSat, Eigen::VectorXi& saturation);
135 Bounds(const vector_t& lb, const vector_t& ub) : lb(lb), ub(ub), iq2iv_() {
136 iq2iv_.resize(ub.size());
137 for (size_type i = 0; i < ub.size(); ++i) {
138 iq2iv_[i] = (Eigen::VectorXi::Scalar)i;
139 }
140 }
141 Bounds(const vector_t& lb, const vector_t& ub, const Eigen::VectorXi& iq2iv)
142 : lb(lb), ub(ub), iq2iv_(iq2iv) {}
144 Eigen::VectorXi iq2iv_;
145};
147struct Device : Base {
149 bool saturate(vectorIn_t q, vectorOut_t qSat, Eigen::VectorXi& saturation);
153};
154} // namespace saturation
155
241 public:
244
245 enum Status { ERROR_INCREASED, MAX_ITERATION_REACHED, INFEASIBLE, SUCCESS };
246 typedef shared_ptr<saturation::Base> Saturation_t;
247
249
251
253
256
258 const LiegroupSpacePtr_t& configSpace() const { return configSpace_; }
262 virtual bool contains(const ImplicitPtr_t& numericalConstraint) const;
263
269 virtual bool add(const ImplicitPtr_t& constraint,
270 const std::size_t& priority);
271
277 virtual void merge(const HierarchicalIterative& other);
278
280 void saturation(const Saturation_t& saturate) { saturate_ = saturate; }
281
283 const Saturation_t& saturation() const { return saturate_; }
284
286
289
304 template <typename LineSearchType>
305 Status solve(vectorOut_t arg, LineSearchType ls = LineSearchType()) const;
306
321 inline Status solve(vectorOut_t arg) const {
322 return solve(arg, DefaultLineSearch());
323 }
324
328 bool isSatisfied(vectorIn_t arg) const {
329 computeValue<false>(arg);
330 computeError();
331 return squaredNorm_ < squaredErrorThreshold_;
332 }
333
338 bool isSatisfied(vectorIn_t arg, value_type errorThreshold) const {
339 computeValue<false>(arg);
340 computeError();
341 return squaredNorm_ < errorThreshold * errorThreshold;
342 }
343
353 bool isConstraintSatisfied(const ImplicitPtr_t& constraint, vectorIn_t arg,
354 vectorOut_t error, bool& constraintFound) const;
355
360 const value_type& sigma() const { return sigma_; }
361
363
366
373 void freeVariables(const segments_t intervals) {
374 freeVariables_ = Indices_t();
375 for (std::size_t i = 0; i < intervals.size(); ++i)
376 freeVariables_.addRow(intervals[i].first, intervals[i].second);
377 freeVariables_.updateIndices<true, true, true>();
378 update();
379 }
380
385 void freeVariables(const Indices_t& indices) {
386 freeVariables_ = indices;
387 update();
388 }
389
391 const Indices_t& freeVariables() const { return freeVariables_; }
392
394 void maxIterations(size_type iterations) { maxIterations_ = iterations; }
396 size_type maxIterations() const { return maxIterations_; }
397
399 void errorThreshold(const value_type& threshold) {
400 squaredErrorThreshold_ = threshold * threshold;
401 }
403 value_type errorThreshold() const { return sqrt(squaredErrorThreshold_); }
405 value_type squaredErrorThreshold() const { return squaredErrorThreshold_; }
406
408 value_type inequalityThreshold() const { return inequalityThreshold_; }
410 void inequalityThreshold(const value_type& it) { inequalityThreshold_ = it; }
411
412 void lastIsOptional(bool optional) { lastIsOptional_ = optional; }
413
414 bool lastIsOptional() const { return lastIsOptional_; }
415
416 // Set whether the constraints are solved level by level
417 //
418 // If true, the solver will consider only the higher level of
419 // priority that is not satisfied when computing the direction
420 // of descent.
421 void solveLevelByLevel(bool solveLevelByLevel) {
422 solveLevelByLevel_ = solveLevelByLevel;
423 }
424
425 // Get whether the constraints are solved level by level
426 bool solveLevelByLevel() const { return solveLevelByLevel_; }
428
431
433 const ImplicitConstraintSet& constraints(const std::size_t priority) {
434 assert(priority < stacks_.size());
435 return stacks_[priority];
436 }
437
439 const NumericalConstraints_t& constraints() const { return constraints_; }
440
441 std::size_t numberStacks() const { return stacks_.size(); }
442
443 const size_type& dimension() const { return dimension_; }
444
447 const size_type& reducedDimension() const { return reducedDimension_; }
448
451
454
456
458 value_type residualError() const { return squaredNorm_; }
459
461 void residualError(vectorOut_t error) const;
462
472
475
483
490 virtual bool rightHandSideFromConfig(const ImplicitPtr_t& constraint,
491 ConfigurationIn_t config);
497 virtual bool rightHandSide(const ImplicitPtr_t& constraint, vectorIn_t rhs);
498
500 virtual bool getRightHandSide(const ImplicitPtr_t& constraint,
501 vectorOut_t rhs) const;
502
507 virtual void rightHandSide(vectorIn_t rhs);
508
512
518
523
525
529
531 template <bool ComputeJac>
532 void computeValue(vectorIn_t arg) const;
534 void getValue(vectorOut_t v) const;
538 void computeError() const;
539
541 const vector_t& lastStep() const { return dq_; }
542
543 virtual bool integrate(vectorIn_t from, vectorIn_t velocity,
544 vectorOut_t result) const;
546
547 virtual std::ostream& print(std::ostream& os) const;
548
549 protected:
550 typedef Eigen::JacobiSVD<matrix_t> SVD_t;
551
570
573 void update();
574
578 virtual void computeActiveRowsOfJ(std::size_t iStack);
579
588 void expandDqSmall() const;
589 void saturate(vectorOut_t arg) const;
590
591 value_type squaredErrorThreshold_, inequalityThreshold_;
593
594 std::vector<ImplicitConstraintSet> stacks_;
596 size_type dimension_, reducedDimension_;
605 std::map<DifferentiableFunctionPtr_t, size_type> iq_;
607 std::map<DifferentiableFunctionPtr_t, size_type> iv_;
609 std::map<DifferentiableFunctionPtr_t, std::size_t> priority_;
610
613
614 mutable vector_t dq_, dqSmall_;
616 mutable Eigen::VectorXi saturation_, reducedSaturation_;
620 mutable std::vector<Data> datas_;
621 mutable SVD_t svd_;
622 mutable vector_t OM_;
623 mutable vector_t OP_;
624
626
627 protected:
629
630 private:
631 HPP_SERIALIZABLE_SPLIT();
632}; // class HierarchicalIterative
634inline std::ostream& operator<<(std::ostream& os,
635 const HierarchicalIterative& hs) {
636 return hs.print(os);
637}
638} // namespace solver
639} // namespace constraints
640} // namespace hpp
641
642#endif // HPP_CONSTRAINTS_SOLVER_HIERARCHICAL_ITERATIVE_HH
Definition implicit-constraint-set.hh:45
Definition hierarchical-iterative.hh:240
const vector_t & lastStep() const
Accessor to the last step done.
Definition hierarchical-iterative.hh:541
Configuration_t qSat_
Definition hierarchical-iterative.hh:617
virtual ~HierarchicalIterative()
Definition hierarchical-iterative.hh:252
virtual bool integrate(vectorIn_t from, vectorIn_t velocity, vectorOut_t result) const
virtual bool rightHandSideFromConfig(const ImplicitPtr_t &constraint, ConfigurationIn_t config)
std::vector< ImplicitConstraintSet > stacks_
Definition hierarchical-iterative.hh:594
lineSearch::FixedSequence DefaultLineSearch
Definition hierarchical-iterative.hh:243
Status solve(vectorOut_t arg) const
Definition hierarchical-iterative.hh:321
Saturation_t saturate_
Definition hierarchical-iterative.hh:601
virtual bool getRightHandSide(const ImplicitPtr_t &constraint, vectorOut_t rhs) const
Get right hand side of a constraints.
bool solveLevelByLevel() const
Definition hierarchical-iterative.hh:426
virtual void computeActiveRowsOfJ(std::size_t iStack)
size_type maxIterations_
Definition hierarchical-iterative.hh:592
void saturation(const Saturation_t &saturate)
Set the saturation function.
Definition hierarchical-iterative.hh:280
vector_t rightHandSideFromConfig(ConfigurationIn_t config)
bool solveLevelByLevel_
Definition hierarchical-iterative.hh:598
Eigen::VectorXi reducedSaturation_
Definition hierarchical-iterative.hh:616
virtual std::ostream & print(std::ostream &os) const
const ImplicitConstraintSet & constraints(const std::size_t priority)
Get set of constraints for a give priority level.
Definition hierarchical-iterative.hh:433
void freeVariables(const Indices_t &indices)
Definition hierarchical-iterative.hh:385
bool isConstraintSatisfied(const ImplicitPtr_t &constraint, vectorIn_t arg, vectorOut_t error, bool &constraintFound) const
vector_t OM_
Definition hierarchical-iterative.hh:622
HierarchicalIterative(const LiegroupSpacePtr_t &configSpace)
value_type residualError() const
Returns the squared norm of the error vector.
Definition hierarchical-iterative.hh:458
void errorThreshold(const value_type &threshold)
Set error threshold.
Definition hierarchical-iterative.hh:399
HierarchicalIterative(const HierarchicalIterative &other)
value_type squaredNorm_
Definition hierarchical-iterative.hh:619
void computeValue(vectorIn_t arg) const
Compute the value of each level, and the jacobian if ComputeJac is true.
std::size_t numberStacks() const
Definition hierarchical-iterative.hh:441
value_type inequalityThreshold_
Definition hierarchical-iterative.hh:591
virtual bool add(const ImplicitPtr_t &constraint, const std::size_t &priority)
std::map< DifferentiableFunctionPtr_t, std::size_t > priority_
Priority level of constraint.
Definition hierarchical-iterative.hh:609
LiegroupSpacePtr_t configSpace_
Definition hierarchical-iterative.hh:595
const value_type & sigma() const
Definition hierarchical-iterative.hh:360
Status solve(vectorOut_t arg, LineSearchType ls=LineSearchType()) const
void computeSaturation(vectorIn_t arg) const
vector_t dq_
Definition hierarchical-iterative.hh:614
virtual void rightHandSide(vectorIn_t rhs)
Eigen::JacobiSVD< matrix_t > SVD_t
Definition hierarchical-iterative.hh:550
HierarchicalIterative()
Definition hierarchical-iterative.hh:628
const Saturation_t & saturation() const
Get the saturation function.
Definition hierarchical-iterative.hh:283
Status
Definition hierarchical-iterative.hh:245
@ ERROR_INCREASED
Definition hierarchical-iterative.hh:245
ArrayXb activeDerivativeParameters() const
Velocity parameters involved in the constraint resolution.
void freeVariables(const segments_t intervals)
Definition hierarchical-iterative.hh:373
const size_type & reducedDimension() const
Definition hierarchical-iterative.hh:447
vector_t OP_
Definition hierarchical-iterative.hh:623
std::map< DifferentiableFunctionPtr_t, size_type > iq_
Value rank of constraint in its priority level.
Definition hierarchical-iterative.hh:605
void lastIsOptional(bool optional)
Definition hierarchical-iterative.hh:412
value_type sigma_
The smallest non-zero singular value.
Definition hierarchical-iterative.hh:612
std::vector< Data > datas_
Definition hierarchical-iterative.hh:620
void inequalityThreshold(const value_type &it)
set the inequality threshold
Definition hierarchical-iterative.hh:410
ArrayXb tmpSat_
Definition hierarchical-iterative.hh:618
NumericalConstraints_t constraints_
Members moved from core::ConfigProjector.
Definition hierarchical-iterative.hh:603
void residualError(vectorOut_t error) const
Returns the error vector.
const Indices_t & freeVariables() const
Get free velocity variables.
Definition hierarchical-iterative.hh:391
bool lastIsOptional() const
Definition hierarchical-iterative.hh:414
bool isSatisfied(vectorIn_t arg) const
Definition hierarchical-iterative.hh:328
virtual void merge(const HierarchicalIterative &other)
const NumericalConstraints_t & constraints() const
Get constraints (implicit and explicit)
Definition hierarchical-iterative.hh:439
virtual bool contains(const ImplicitPtr_t &numericalConstraint) const
ArrayXb activeParameters() const
Configuration parameters involved in the constraint resolution.
bool definesSubmanifoldOf(const HierarchicalIterative &solver) const
void solveLevelByLevel(bool solveLevelByLevel)
Definition hierarchical-iterative.hh:421
Eigen::RowBlockIndices Indices_t
Definition hierarchical-iterative.hh:242
size_type dimension_
Definition hierarchical-iterative.hh:596
shared_ptr< saturation::Base > Saturation_t
Definition hierarchical-iterative.hh:246
std::map< DifferentiableFunctionPtr_t, size_type > iv_
Derivative rank of constraint in its priority level.
Definition hierarchical-iterative.hh:607
size_type maxIterations() const
Get maximal number of iterations in config projector.
Definition hierarchical-iterative.hh:396
void maxIterations(size_type iterations)
Set maximal number of iterations.
Definition hierarchical-iterative.hh:394
bool isSatisfied(vectorIn_t arg, value_type errorThreshold) const
Definition hierarchical-iterative.hh:338
SVD_t svd_
Definition hierarchical-iterative.hh:621
value_type inequalityThreshold() const
Get the inequality threshold.
Definition hierarchical-iterative.hh:408
value_type errorThreshold() const
Get error threshold.
Definition hierarchical-iterative.hh:403
Indices_t freeVariables_
Unknown of the set of implicit constraints.
Definition hierarchical-iterative.hh:600
const LiegroupSpacePtr_t & configSpace() const
Get configuration space on which constraints are defined.
Definition hierarchical-iterative.hh:258
matrix_t reducedJ_
Definition hierarchical-iterative.hh:615
bool lastIsOptional_
Definition hierarchical-iterative.hh:597
value_type squaredErrorThreshold() const
Get error threshold.
Definition hierarchical-iterative.hh:405
virtual bool rightHandSide(const ImplicitPtr_t &constraint, vectorIn_t rhs)
const size_type & dimension() const
Definition hierarchical-iterative.hh:443
#define HPP_CONSTRAINTS_DLLAPI
Definition config.hh:88
std::ostream & operator<<(std::ostream &os, const HierarchicalIterative &hs)
Definition hierarchical-iterative.hh:634
pinocchio::LiegroupElement LiegroupElement
Definition fwd.hh:65
pinocchio::Configuration_t Configuration_t
Definition fwd.hh:105
std::vector< ComparisonType > ComparisonTypes_t
Definition fwd.hh:180
pinocchio::DevicePtr_t DevicePtr_t
Definition fwd.hh:109
pinocchio::LiegroupSpacePtr_t LiegroupSpacePtr_t
Definition fwd.hh:69
shared_ptr< Implicit > ImplicitPtr_t
Definition fwd.hh:173
pinocchio::size_type size_type
Definition fwd.hh:47
pinocchio::ArrayXb ArrayXb
Definition fwd.hh:80
pinocchio::value_type value_type
Definition fwd.hh:48
pinocchio::vectorIn_t vectorIn_t
Definition fwd.hh:60
pinocchio::ConfigurationIn_t ConfigurationIn_t
Definition fwd.hh:106
pinocchio::matrix_t matrix_t
Definition fwd.hh:56
Eigen::Ref< matrix_t > matrixOut_t
Definition fwd.hh:58
std::vector< segment_t > segments_t
Definition fwd.hh:84
pinocchio::vectorOut_t vectorOut_t
Definition fwd.hh:61
std::vector< constraints::ImplicitPtr_t > NumericalConstraints_t
Definition fwd.hh:175
pinocchio::vector_t vector_t
Definition fwd.hh:59
Definition active-set-differentiable-function.hh:36
Definition hierarchical-iterative.hh:552
std::vector< std::size_t > inequalityIndices
Definition hierarchical-iterative.hh:566
LiegroupElement output
Definition hierarchical-iterative.hh:556
size_type maxRank
Definition hierarchical-iterative.hh:563
ComparisonTypes_t comparison
Definition hierarchical-iterative.hh:565
Eigen::RowBlockIndices equalityIndices
Definition hierarchical-iterative.hh:567
matrix_t jacobian
Definition hierarchical-iterative.hh:558
SVD_t svd
Definition hierarchical-iterative.hh:560
vector_t error
Definition hierarchical-iterative.hh:557
matrix_t PK
Definition hierarchical-iterative.hh:561
Eigen::MatrixBlocks< false, false > activeRowsOfJ
Definition hierarchical-iterative.hh:568
Definition hierarchical-iterative.hh:54
vector_t df
Definition hierarchical-iterative.hh:64
vector_t arg_darg
Definition hierarchical-iterative.hh:64
value_type smallAlpha
Definition hierarchical-iterative.hh:63
value_type tau
Definition hierarchical-iterative.hh:63
bool operator()(const SolverType &solver, vectorOut_t arg, vectorOut_t darg)
Definition hierarchical-iterative.hh:48
value_type computeLocalSlope(const SolverType &solver) const
Definition hierarchical-iterative.hh:94
value_type c
Definition hierarchical-iterative.hh:63
vector_t darg
Definition hierarchical-iterative.hh:64
No line search. Use .
Definition hierarchical-iterative.hh:47
bool operator()(const SolverType &solver, vectorOut_t arg, vectorOut_t darg)
Definition hierarchical-iterative.hh:41
Definition hierarchical-iterative.hh:85
bool operator()(const SolverType &solver, vectorOut_t arg, vectorOut_t darg)
Definition hierarchical-iterative.hh:118
value_type b
Definition hierarchical-iterative.hh:92
value_type K
Definition hierarchical-iterative.hh:92
ErrorNormBased(value_type alphaMin, value_type _a, value_type _b)
value_type a
Definition hierarchical-iterative.hh:92
value_type C
Definition hierarchical-iterative.hh:92
Definition hierarchical-iterative.hh:70
value_type alphaMax
Definition hierarchical-iterative.hh:77
bool operator()(const SolverType &solver, vectorOut_t arg, vectorOut_t darg)
Definition hierarchical-iterative.hh:109
value_type K
Definition hierarchical-iterative.hh:77
value_type alpha
Definition hierarchical-iterative.hh:76
Base class for box constraints. To prevent configuration variables to get out of joint limits during ...
Definition hierarchical-iterative.hh:104
virtual ~Base()
Definition hierarchical-iterative.hh:118
virtual bool saturate(vectorIn_t q, vectorOut_t qSat, Eigen::VectorXi &saturation)
simple box constraints
Definition hierarchical-iterative.hh:132
Bounds(const vector_t &lb, const vector_t &ub)
Definition hierarchical-iterative.hh:135
vector_t ub
Definition hierarchical-iterative.hh:143
Bounds(const vector_t &lb, const vector_t &ub, const Eigen::VectorXi &iq2iv)
Definition hierarchical-iterative.hh:141
Eigen::VectorXi iq2iv_
Definition hierarchical-iterative.hh:144
bool saturate(vectorIn_t q, vectorOut_t qSat, Eigen::VectorXi &saturation)
vector_t lb
Definition hierarchical-iterative.hh:143
Bounds()
Definition hierarchical-iterative.hh:134
Box constraints use a Device joint limits.
Definition hierarchical-iterative.hh:147
DevicePtr_t device
Definition hierarchical-iterative.hh:152
Device()
Definition hierarchical-iterative.hh:150
bool saturate(vectorIn_t q, vectorOut_t qSat, Eigen::VectorXi &saturation)
Device(const DevicePtr_t &device)
Definition hierarchical-iterative.hh:151
saturation from a std::function.
Definition hierarchical-iterative.hh:121
bool saturate(vectorIn_t q, vectorOut_t qSat, Eigen::VectorXi &saturation)
Definition hierarchical-iterative.hh:124
function_t function
Definition hierarchical-iterative.hh:129
Function()
Definition hierarchical-iterative.hh:127
Function(const function_t &function)
Definition hierarchical-iterative.hh:128
std::function< bool(vectorIn_t, vectorOut_t, Eigen::VectorXi &)> function_t
Definition hierarchical-iterative.hh:123