Crocoddyl
constraint-base.hpp
1 // BSD 3-Clause License
3 //
4 // Copyright (C) 2020-2023, University of Edinburgh, Heriot-Watt University
5 // Copyright note valid unless otherwise stated in individual files.
6 // All rights reserved.
8 
9 #ifndef CROCODDYL_CORE_CONSTRAINT_BASE_HPP_
10 #define CROCODDYL_CORE_CONSTRAINT_BASE_HPP_
11 
12 #include <boost/make_shared.hpp>
13 #include <boost/shared_ptr.hpp>
14 
15 #include "crocoddyl/core/fwd.hpp"
16 //
17 #include "crocoddyl/core/data-collector-base.hpp"
18 #include "crocoddyl/core/residual-base.hpp"
19 #include "crocoddyl/core/state-base.hpp"
20 
21 namespace crocoddyl {
22 
23 enum ConstraintType { Inequality = 0, Equality, Both };
24 
49 template <typename _Scalar>
51  public:
52  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
53 
54  typedef _Scalar Scalar;
60  typedef typename MathBase::VectorXs VectorXs;
61 
70  ConstraintModelAbstractTpl(boost::shared_ptr<StateAbstract> state,
71  boost::shared_ptr<ResidualModelAbstract> residual,
72  const std::size_t ng, const std::size_t nh);
73 
82  ConstraintModelAbstractTpl(boost::shared_ptr<StateAbstract> state,
83  const std::size_t nu, const std::size_t ng,
84  const std::size_t nh);
85 
95  ConstraintModelAbstractTpl(boost::shared_ptr<StateAbstract> state,
96  const std::size_t ng, const std::size_t nh);
97  virtual ~ConstraintModelAbstractTpl();
98 
106  virtual void calc(const boost::shared_ptr<ConstraintDataAbstract>& data,
107  const Eigen::Ref<const VectorXs>& x,
108  const Eigen::Ref<const VectorXs>& u) = 0;
109 
120  virtual void calc(const boost::shared_ptr<ConstraintDataAbstract>& data,
121  const Eigen::Ref<const VectorXs>& x);
122 
133  virtual void calcDiff(const boost::shared_ptr<ConstraintDataAbstract>& data,
134  const Eigen::Ref<const VectorXs>& x,
135  const Eigen::Ref<const VectorXs>& u) = 0;
136 
148  virtual void calcDiff(const boost::shared_ptr<ConstraintDataAbstract>& data,
149  const Eigen::Ref<const VectorXs>& x);
150 
162  virtual boost::shared_ptr<ConstraintDataAbstract> createData(
163  DataCollectorAbstract* const data);
164 
168  void update_bounds(const VectorXs& lower, const VectorXs& upper);
169 
174 
178  const boost::shared_ptr<StateAbstract>& get_state() const;
179 
183  const boost::shared_ptr<ResidualModelAbstract>& get_residual() const;
184 
188  ConstraintType get_type() const;
189 
193  const VectorXs& get_lb() const;
194 
198  const VectorXs& get_ub() const;
199 
203  std::size_t get_nu() const;
204 
208  std::size_t get_ng() const;
209 
213  std::size_t get_nh() const;
214 
218  template <class Scalar>
219  friend std::ostream& operator<<(std::ostream& os,
220  const CostModelAbstractTpl<Scalar>& model);
221 
227  virtual void print(std::ostream& os) const;
228 
229  private:
230  std::size_t ng_internal_;
232  std::size_t nh_internal_;
234 
235  protected:
236  boost::shared_ptr<StateAbstract> state_;
237  boost::shared_ptr<ResidualModelAbstract> residual_;
238  ConstraintType
240  VectorXs lb_;
241  VectorXs ub_;
242  std::size_t nu_;
243  std::size_t ng_;
244  std::size_t nh_;
245  VectorXs unone_;
246 };
247 
248 template <typename _Scalar>
250  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
251 
252  typedef _Scalar Scalar;
256  typedef typename MathBase::VectorXs VectorXs;
257  typedef typename MathBase::MatrixXs MatrixXs;
258 
259  template <template <typename Scalar> class Model>
260  ConstraintDataAbstractTpl(Model<Scalar>* const model,
261  DataCollectorAbstract* const data)
262  : shared(data),
263  residual(model->get_residual()->createData(data)),
264  g(model->get_ng()),
265  Gx(model->get_ng(), model->get_state()->get_ndx()),
266  Gu(model->get_ng(), model->get_nu()),
267  h(model->get_nh()),
268  Hx(model->get_nh(), model->get_state()->get_ndx()),
269  Hu(model->get_nh(), model->get_nu()) {
270  if (model->get_ng() == 0 && model->get_nh() == 0) {
271  throw_pretty("Invalid argument: "
272  << "ng and nh cannot be equals to 0");
273  }
274  g.setZero();
275  Gx.setZero();
276  Gu.setZero();
277  h.setZero();
278  Hx.setZero();
279  Hu.setZero();
280  }
281  virtual ~ConstraintDataAbstractTpl() {}
282 
284  boost::shared_ptr<ResidualDataAbstract> residual;
285  VectorXs g;
286  MatrixXs Gx;
287  MatrixXs Gu;
288  VectorXs h;
289  MatrixXs Hx;
290  MatrixXs Hu;
291 };
292 
293 } // namespace crocoddyl
294 
295 /* --- Details -------------------------------------------------------------- */
296 /* --- Details -------------------------------------------------------------- */
297 /* --- Details -------------------------------------------------------------- */
298 #include "crocoddyl/core/constraint-base.hxx"
299 
300 #endif // CROCODDYL_CORE_CONSTRAINT_BASE_HPP_
Abstract class for constraint models.
void remove_bounds()
Remove the bounds of the constraint.
virtual boost::shared_ptr< ConstraintDataAbstract > createData(DataCollectorAbstract *const data)
Create the constraint data.
ConstraintModelAbstractTpl(boost::shared_ptr< StateAbstract > state, const std::size_t nu, const std::size_t ng, const std::size_t nh)
the constraint model
std::size_t get_ng() const
Return the number of inequality constraints.
const boost::shared_ptr< StateAbstract > & get_state() const
Return the state.
virtual void calcDiff(const boost::shared_ptr< ConstraintDataAbstract > &data, const Eigen::Ref< const VectorXs > &x)
Compute the Jacobian of the constraint with respect to the state only.
virtual void print(std::ostream &os) const
Print relevant information of the constraint model.
friend std::ostream & operator<<(std::ostream &os, const CostModelAbstractTpl< Scalar > &model)
Print information on the constraint model.
const VectorXs & get_lb() const
Return the lower bound of the constraint.
virtual void calc(const boost::shared_ptr< ConstraintDataAbstract > &data, const Eigen::Ref< const VectorXs > &x)
Compute the constraint value for nodes that depends only on the state.
const VectorXs & get_ub() const
Return the upper bound of the constraint.
std::size_t get_nh() const
Return the number of equality constraints.
ConstraintType get_type() const
Return the type of constraint.
ConstraintModelAbstractTpl(boost::shared_ptr< StateAbstract > state, const std::size_t ng, const std::size_t nh)
Initialize the constraint model.
virtual void calcDiff(const boost::shared_ptr< ConstraintDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u)=0
Compute the Jacobian of the constraint.
boost::shared_ptr< StateAbstract > state_
State description.
std::size_t nu_
Control dimension.
std::size_t nh_
Number of equality constraints.
boost::shared_ptr< ResidualModelAbstract > residual_
Residual model.
VectorXs lb_
Lower bound of the constraint.
ConstraintType type_
Type of constraint: inequality=0, equality=1, both=2.
void update_bounds(const VectorXs &lower, const VectorXs &upper)
Update the lower and upper bounds the upper bound of constraint.
VectorXs ub_
Upper bound of the constraint.
std::size_t ng_
Number of inequality constraints.
std::size_t get_nu() const
Return the dimension of the control input.
ConstraintModelAbstractTpl(boost::shared_ptr< StateAbstract > state, boost::shared_ptr< ResidualModelAbstract > residual, const std::size_t ng, const std::size_t nh)
Initialize the constraint model.
virtual void calc(const boost::shared_ptr< ConstraintDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u)=0
Compute the constraint value.
const boost::shared_ptr< ResidualModelAbstract > & get_residual() const
Return the residual model.
Abstract class for cost models.
Definition: cost-base.hpp:59
Abstract class for residual models.
Abstract class for the state representation.
Definition: state-base.hpp:46
MatrixXs Gx
Jacobian of the inequality constraint.
VectorXs h
Equality constraint values.
boost::shared_ptr< ResidualDataAbstract > residual
Residual data.
VectorXs g
Inequality constraint values.
MatrixXs Hx
Jacobian of the equality constraint.
MatrixXs Hu
Jacobian of the equality constraint.
DataCollectorAbstract * shared
Shared data.
MatrixXs Gu
Jacobian of the inequality constraint.