1 |
|
|
/////////////////////////////////////////////////////////////////////////////// |
2 |
|
|
// BSD 3-Clause License |
3 |
|
|
// |
4 |
|
|
// Copyright (C) 2019-2020, LAAS-CNRS, New York University, Max Planck |
5 |
|
|
// Gesellschaft, |
6 |
|
|
// University of Edinburgh |
7 |
|
|
// Copyright note valid unless otherwise stated in individual files. |
8 |
|
|
// All rights reserved. |
9 |
|
|
/////////////////////////////////////////////////////////////////////////////// |
10 |
|
|
|
11 |
|
|
#ifndef CROCODDYL_CORE_SOLVERS_KKT_HPP_ |
12 |
|
|
#define CROCODDYL_CORE_SOLVERS_KKT_HPP_ |
13 |
|
|
|
14 |
|
|
#include <Eigen/Cholesky> |
15 |
|
|
#include <Eigen/Dense> |
16 |
|
|
|
17 |
|
|
#include "crocoddyl/core/solver-base.hpp" |
18 |
|
|
|
19 |
|
|
namespace crocoddyl { |
20 |
|
|
|
21 |
|
|
class SolverKKT : public SolverAbstract { |
22 |
|
|
public: |
23 |
|
|
EIGEN_MAKE_ALIGNED_OPERATOR_NEW |
24 |
|
|
|
25 |
|
|
explicit SolverKKT(boost::shared_ptr<ShootingProblem> problem); |
26 |
|
|
virtual ~SolverKKT(); |
27 |
|
|
|
28 |
|
|
virtual bool solve( |
29 |
|
|
const std::vector<Eigen::VectorXd>& init_xs = DEFAULT_VECTOR, |
30 |
|
|
const std::vector<Eigen::VectorXd>& init_us = DEFAULT_VECTOR, |
31 |
|
|
const std::size_t maxiter = 100, const bool is_feasible = false, |
32 |
|
|
const double regInit = 1e-9); |
33 |
|
|
virtual void computeDirection(const bool recalc = true); |
34 |
|
|
virtual double tryStep(const double steplength = 1); |
35 |
|
|
virtual double stoppingCriteria(); |
36 |
|
|
virtual const Eigen::Vector2d& expectedImprovement(); |
37 |
|
|
|
38 |
|
|
const Eigen::MatrixXd& get_kkt() const; |
39 |
|
|
const Eigen::VectorXd& get_kktref() const; |
40 |
|
|
const Eigen::VectorXd& get_primaldual() const; |
41 |
|
|
const std::vector<Eigen::VectorXd>& get_dxs() const; |
42 |
|
|
const std::vector<Eigen::VectorXd>& get_dus() const; |
43 |
|
|
const std::vector<Eigen::VectorXd>& get_lambdas() const; |
44 |
|
|
std::size_t get_nx() const; |
45 |
|
|
std::size_t get_ndx() const; |
46 |
|
|
std::size_t get_nu() const; |
47 |
|
|
|
48 |
|
|
protected: |
49 |
|
|
double reg_incfactor_; |
50 |
|
|
double reg_decfactor_; |
51 |
|
|
double reg_min_; |
52 |
|
|
double reg_max_; |
53 |
|
|
double cost_try_; |
54 |
|
|
std::vector<Eigen::VectorXd> xs_try_; |
55 |
|
|
std::vector<Eigen::VectorXd> us_try_; |
56 |
|
|
|
57 |
|
|
private: |
58 |
|
|
double calcDiff(); |
59 |
|
|
void computePrimalDual(); |
60 |
|
|
void increaseRegularization(); |
61 |
|
|
void decreaseRegularization(); |
62 |
|
|
void allocateData(); |
63 |
|
|
|
64 |
|
|
std::size_t nx_; |
65 |
|
|
std::size_t ndx_; |
66 |
|
|
std::size_t nu_; |
67 |
|
|
std::vector<Eigen::VectorXd> dxs_; |
68 |
|
|
std::vector<Eigen::VectorXd> dus_; |
69 |
|
|
std::vector<Eigen::VectorXd> lambdas_; |
70 |
|
|
|
71 |
|
|
// allocate data |
72 |
|
|
Eigen::MatrixXd kkt_; |
73 |
|
|
Eigen::VectorXd kktref_; |
74 |
|
|
Eigen::VectorXd primaldual_; |
75 |
|
|
Eigen::VectorXd primal_; |
76 |
|
|
Eigen::VectorXd dual_; |
77 |
|
|
std::vector<double> alphas_; |
78 |
|
|
double th_grad_; |
79 |
|
|
bool was_feasible_; |
80 |
|
|
Eigen::VectorXd kkt_primal_; |
81 |
|
|
Eigen::VectorXd dF; |
82 |
|
|
}; |
83 |
|
|
|
84 |
|
|
} // namespace crocoddyl |
85 |
|
|
|
86 |
|
|
#endif // CROCODDYL_CORE_SOLVERS_KKT_HPP_ |