hpp-constraints 6.0.0
Definition of basic geometric constraints for motion planning
Loading...
Searching...
No Matches
by-substitution.hh
Go to the documentation of this file.
1// Copyright (c) 2017, 2018 CNRS
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_BY_SUBSTITUTION_HH
30#define HPP_CONSTRAINTS_SOLVER_BY_SUBSTITUTION_HH
31
37#include <vector>
38
39namespace hpp {
40namespace constraints {
41namespace solver {
44
74 public:
77
78 virtual ~BySubstitution() {}
79
85 bool add(const ImplicitPtr_t& numericalConstraint,
86 const std::size_t& priority = 0);
87
90 return constraints_;
91 }
92
95
98 return explicit_;
99 }
100
103 return explicitConstraintSet().notOutDers().nbIndices();
104 }
105
108
109 template <typename LineSearchType>
110 Status solve(vectorOut_t arg, LineSearchType ls = LineSearchType()) const {
111 return solve<LineSearchType>(arg, false, ls);
112 }
113
114 template <typename LineSearchType>
115 Status solve(vectorOut_t arg, bool optimize,
116 LineSearchType ls = LineSearchType()) const {
117 // TODO when there are only locked joint explicit constraints,
118 // there is no need for this intricated loop.
119 // if (explicit_.isConstant()) {
120 // explicit_.solve(arg);
121 // iterative_.solve(arg, ls);
122 // } else {
123 return impl_solve(arg, optimize, ls);
124 // }
125 }
126
137 vectorOut_t result) const;
138
150 ConfigurationOut_t result);
151
152 inline Status solve(vectorOut_t arg) const {
153 return solve(arg, DefaultLineSearch());
154 }
155
158
161
165 ConfigurationIn_t config);
166
169 bool rightHandSide(const ImplicitPtr_t& constraint, vectorIn_t rhs);
170
173 bool getRightHandSide(const ImplicitPtr_t& constraint, vectorOut_t rhs) const;
174
177
183
186
188
195 return dimension() + explicit_.outDers().nbIndices();
196 }
197
201 bool isSatisfied(vectorIn_t arg) const {
202 return solver::HierarchicalIterative::isSatisfied(arg) &&
203 explicit_.isSatisfied(arg);
204 }
205
210 bool isSatisfied(vectorIn_t arg, value_type errorThreshold) const {
211 return solver::HierarchicalIterative::isSatisfied(arg, errorThreshold) &&
212 explicit_.isSatisfied(arg, errorThreshold);
213 }
219 bool isSatisfied(vectorIn_t arg, vectorOut_t error) const {
220 assert(error.size() == dimension() + explicit_.errorSize());
221 bool iterative = solver::HierarchicalIterative::isSatisfied(arg);
222 residualError(error.head(dimension()));
223 bool _explicit =
224 explicit_.isSatisfied(arg, error.tail(explicit_.errorSize()));
225 return iterative && _explicit;
226 }
227
237 bool isConstraintSatisfied(const ImplicitPtr_t& constraint, vectorIn_t arg,
238 vectorOut_t error, bool& constraintFound) const;
239
240 template <typename LineSearchType>
241 bool oneStep(vectorOut_t arg, LineSearchType& lineSearch) const {
242 computeValue<true>(arg);
243 updateJacobian(arg);
244 computeDescentDirection();
245 lineSearch(*this, arg, dq_);
246 explicit_.solve(arg);
247 return solver::HierarchicalIterative::isSatisfied(arg);
248 }
249
252 void updateJacobian(vectorIn_t arg) const;
253
255 void errorThreshold(const value_type& threshold) {
256 solver::HierarchicalIterative::errorThreshold(threshold);
257 explicit_.errorThreshold(threshold);
258 }
261 return solver::HierarchicalIterative::errorThreshold();
262 }
263
268
269 virtual std::ostream& print(std::ostream& os) const;
270
271 bool integrate(vectorIn_t from, vectorIn_t velocity,
272 vectorOut_t result) const {
273 bool res = solver::HierarchicalIterative::integrate(from, velocity, result);
274 explicit_.solve(result);
275 return res;
276 }
277
278 protected:
279 void computeActiveRowsOfJ(std::size_t iStack);
280
281 private:
283
284 template <typename LineSearchType>
285 Status impl_solve(vectorOut_t arg, bool optimize, LineSearchType ls) const;
286
287 ExplicitConstraintSet explicit_;
288 mutable matrix_t Je_, JeExpanded_;
289
290 BySubstitution() {}
291 HPP_SERIALIZABLE_SPLIT();
292}; // class BySubstitution
294
295} // namespace solver
296} // namespace constraints
297} // namespace hpp
298
299#endif // HPP_CONSTRAINTS_SOLVER_BY_SUBSTITUTION_HH
Definition explicit-constraint-set.hh:99
Definition by-substitution.hh:73
void computeActiveRowsOfJ(std::size_t iStack)
BySubstitution(const LiegroupSpacePtr_t &configSpace)
virtual ~BySubstitution()
Definition by-substitution.hh:78
void explicitConstraintSetHasChanged()
Should be called whenever explicit solver is modified.
Status solve(vectorOut_t arg, bool optimize, LineSearchType ls=LineSearchType()) const
Definition by-substitution.hh:115
Status solve(vectorOut_t arg) const
Definition by-substitution.hh:152
bool oneStep(vectorOut_t arg, LineSearchType &lineSearch) const
Definition by-substitution.hh:241
Status solve(vectorOut_t arg, LineSearchType ls=LineSearchType()) const
Definition by-substitution.hh:110
value_type errorThreshold() const
Get error threshold.
Definition by-substitution.hh:260
bool isSatisfied(vectorIn_t arg, vectorOut_t error) const
Definition by-substitution.hh:219
size_type errorSize() const
Definition by-substitution.hh:194
bool getRightHandSide(const ImplicitPtr_t &constraint, vectorOut_t rhs) const
virtual std::ostream & print(std::ostream &os) const
void projectVectorOnKernel(ConfigurationIn_t from, vectorIn_t velocity, vectorOut_t result) const
bool rightHandSideFromConfig(const ImplicitPtr_t &constraint, ConfigurationIn_t config)
const NumericalConstraints_t & numericalConstraints() const
Get the numerical constraints implicit and explicit.
Definition by-substitution.hh:89
ExplicitConstraintSet & explicitConstraintSet()
Get explicit constraint set.
Definition by-substitution.hh:94
bool isSatisfied(vectorIn_t arg, value_type errorThreshold) const
Definition by-substitution.hh:210
const ExplicitConstraintSet & explicitConstraintSet() const
Set explicit constraint set.
Definition by-substitution.hh:97
size_type numberFreeVariables() const
Return the number of free variables.
Definition by-substitution.hh:102
bool add(const ImplicitPtr_t &numericalConstraint, const std::size_t &priority=0)
virtual void projectOnKernel(ConfigurationIn_t from, ConfigurationIn_t to, ConfigurationOut_t result)
bool integrate(vectorIn_t from, vectorIn_t velocity, vectorOut_t result) const
Definition by-substitution.hh:271
vector_t rightHandSideFromConfig(ConfigurationIn_t config)
bool isConstraintSatisfied(const ImplicitPtr_t &constraint, vectorIn_t arg, vectorOut_t error, bool &constraintFound) const
bool rightHandSide(const ImplicitPtr_t &constraint, vectorIn_t rhs)
BySubstitution(const BySubstitution &other)
void updateJacobian(vectorIn_t arg) const
bool isSatisfied(vectorIn_t arg) const
Definition by-substitution.hh:201
void errorThreshold(const value_type &threshold)
Set error threshold.
Definition by-substitution.hh:255
Definition hierarchical-iterative.hh:240
Status
Definition hierarchical-iterative.hh:245
#define HPP_CONSTRAINTS_DLLAPI
Definition config.hh:88
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::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
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
pinocchio::ConfigurationOut_t ConfigurationOut_t
Definition fwd.hh:107
Definition active-set-differentiable-function.hh:36
Definition hierarchical-iterative.hh:70