full_discretization_grid_base.h
Go to the documentation of this file.
1 /*********************************************************************
2  *
3  * Software License Agreement
4  *
5  * Copyright (c) 2020,
6  * TU Dortmund - Institute of Control Theory and Systems Engineering.
7  * All rights reserved.
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program. If not, see <https://www.gnu.org/licenses/>.
21  *
22  * Authors: Christoph Rösmann
23  *********************************************************************/
24 
25 #ifndef SRC_OPTIMAL_CONTROL_INCLUDE_CORBO_OPTIMAL_CONTROL_STRUCTURED_OCP_DISCRETIZATION_GRIDS_FULL_DISCRETIZATION_GRID_BASE_H_
26 #define SRC_OPTIMAL_CONTROL_INCLUDE_CORBO_OPTIMAL_CONTROL_STRUCTURED_OCP_DISCRETIZATION_GRIDS_FULL_DISCRETIZATION_GRID_BASE_H_
27 
29 
32 
34 
35 #include <memory>
36 
37 namespace corbo {
38 
39 class FullDiscretizationGridBase : public DiscretizationGridInterface
40 {
41  public:
42  using Ptr = std::shared_ptr<FullDiscretizationGridBase>;
43  using UPtr = std::unique_ptr<FullDiscretizationGridBase>;
44 
46 
47  FullDiscretizationGridBase() = default;
48  virtual ~FullDiscretizationGridBase() = default;
49 
51  DiscretizationGridInterface::Ptr getInstance() const override = 0;
52 
53  GridUpdateResult update(const Eigen::VectorXd& x0, ReferenceTrajectoryInterface& xref, ReferenceTrajectoryInterface& uref, NlpFunctions& nlp_fun,
54  OptimizationEdgeSet& edges, SystemDynamicsInterface::Ptr dynamics, bool new_run, const Time& t,
55  ReferenceTrajectoryInterface* sref = nullptr, const Eigen::VectorXd* prev_u = nullptr, double prev_u_dt = 0,
56  ReferenceTrajectoryInterface* xinit = nullptr, ReferenceTrajectoryInterface* uinit = nullptr) override;
57 
58  double getFirstDt() const override { return getDt(); }
59  double getFinalTime() const override { return double(getN() - 1) * getDt(); }
60 
61  bool hasConstantControls() const override { return true; }
62  bool hasSingleDt() const override { return true; }
63  bool isTimeVariableGrid() const override { return !isDtFixedIntended(); }
64  bool isUniformGrid() const override { return true; }
65  bool providesStateTrajectory() const override { return true; }
66 
67  bool getFirstControlInput(Eigen::VectorXd& u0) override;
68 
69  void getStateAndControlTimeSeries(TimeSeries::Ptr x_sequence, TimeSeries::Ptr u_sequence, double t_max = CORBO_INF_DBL) const override;
70 
71  void clear() override;
72 
73  bool isEmpty() const override { return _x_seq.empty() || _u_seq.empty(); }
74  virtual bool isValid() const { return (_x_seq.size() == _u_seq.size()); }
75 
76  void setN(int n, bool try_resample = true) override;
77  void setInitialDt(double dt) override { setDtRef(dt); }
78  double getInitialDt() const override { return getDtRef(); }
79  int getInitialN() const override { return _n_ref; }
80 
81  int getNRef() const { return _n_ref; }
82  int getN() const override { return _x_seq.size() + 1; }
83  void setNRef(int n);
84  void setDtRef(double dt) { _dt_ref = dt; }
85  double getDtRef() const { return _dt_ref; }
86  double getDt() const { return _dt.value(); }
87  void setWarmStart(bool active) { _warm_start = active; }
88 
89  void setXfFixed(const Eigen::Matrix<bool, -1, 1>& xf_fixed)
90  {
91  _xf_fixed = xf_fixed;
92  setModified(true);
93  }
94 
96  void setCostIntegrationRule(CostIntegrationRule integration) { _cost_integration = integration; }
97 
98  const Eigen::VectorXd& getState(int k) const
99  {
100  assert(k <= getN());
101  if (k == _x_seq.size()) return _xf.values();
102  return _x_seq[k].values();
103  }
104 
105  // VertexSet methods
106  std::vector<VertexInterface*>& getActiveVertices() override { return _active_vertices; }
107  void getVertices(std::vector<VertexInterface*>& vertices) override; // TODO(roesmann) add dt, just in case
108 
109 #ifdef MESSAGE_SUPPORT
110  void fromMessage(const messages::DiscretizationGrid& message, std::stringstream* issues) override {}
111  void toMessage(messages::DiscretizationGrid& message) const override {}
112 #endif
113 
114  protected:
115  virtual void initializeSequences(const Eigen::VectorXd& x0, const Eigen::VectorXd& xf, ReferenceTrajectoryInterface& uref, NlpFunctions& nlp_fun);
116  virtual void initializeSequences(const Eigen::VectorXd& x0, const Eigen::VectorXd& xf, ReferenceTrajectoryInterface& xref,
118  virtual void warmStartShifting(const Eigen::VectorXd& x0);
119 
120  virtual bool adaptGrid(bool new_run, NlpFunctions& nlp_fun) { return false; } // A subclass might add a grid adaptation, returns true if adapted
121 
122  int findNearestState(const Eigen::VectorXd& x0);
123 
124  void updateBounds(const NlpFunctions& nlp_fun);
125 
126  virtual void resampleTrajectory(int n_new);
127 
129 
130  virtual void createEdges(NlpFunctions& nlp_fun, OptimizationEdgeSet& edges, SystemDynamicsInterface::Ptr dynamics) = 0;
131 
132  virtual bool isDtFixedIntended() const { return true; }
133  virtual bool isMovingHorizonWarmStartActive() const { return _warm_start; }
134  virtual bool isGridAdaptActive() const { return false; }
135 
136  void computeActiveVertices() override;
137 
138  FiniteDifferencesCollocationInterface::Ptr _fd_eval = std::make_shared<CrankNicolsonDiffCollocation>();
139 
140  std::vector<VectorVertex> _x_seq;
141  std::vector<VectorVertex> _u_seq;
143  std::vector<VertexInterface*> _active_vertices;
144 
145  const NlpFunctions* _nlp_fun = nullptr; // cache -> for bounds
146 
147  int _n_ref = 11;
148  int _n_adapt = 0; // if adaption is on and warmstart off, we might use this n instead of n_ref (only if n_adapt > 0)
149  double _dt_ref = 0.1;
150  ScalarVertex _dt; // we need a ScalarVertex to use the helper methods in stage_functions.cpp
151  bool _warm_start = false;
152  bool _first_run = true;
153 
154  // might be required if the last dt should be fixed or if dt is not fixed
155  Eigen::Matrix<bool, -1, 1> _xf_fixed;
156  double _dt_lb = 0;
157  double _dt_ub = CORBO_INF_DBL;
158 
160 };
161 
162 } // namespace corbo
163 
164 #endif // SRC_OPTIMAL_CONTROL_INCLUDE_CORBO_OPTIMAL_CONTROL_STRUCTURED_OCP_DISCRETIZATION_GRIDS_FULL_DISCRETIZATION_GRID_BASE_H_
corbo::FullDiscretizationGridBase::getInstance
DiscretizationGridInterface::Ptr getInstance() const override=0
Return a newly created shared instance of the implemented class.
corbo::FullDiscretizationGridBase::_n_ref
int _n_ref
Definition: full_discretization_grid_base.h:191
corbo::FullDiscretizationGridBase::isValid
virtual bool isValid() const
Definition: full_discretization_grid_base.h:118
corbo::FullDiscretizationGridBase::_u_seq
std::vector< VectorVertex > _u_seq
Definition: full_discretization_grid_base.h:185
corbo::FullDiscretizationGridBase::getFirstDt
double getFirstDt() const override
Definition: full_discretization_grid_base.h:102
finite_differences_collocation.h
corbo::ReferenceTrajectoryInterface
Interface class for reference trajectories.
Definition: reference_trajectory.h:82
corbo::FullDiscretizationGridBase::_first_run
bool _first_run
Definition: full_discretization_grid_base.h:196
corbo::FullDiscretizationGridBase::UPtr
std::unique_ptr< FullDiscretizationGridBase > UPtr
Definition: full_discretization_grid_base.h:87
corbo::FullDiscretizationGridBase::isTimeVariableGrid
bool isTimeVariableGrid() const override
Definition: full_discretization_grid_base.h:107
corbo::FullDiscretizationGridBase::_x_seq
std::vector< VectorVertex > _x_seq
Definition: full_discretization_grid_base.h:184
corbo
Definition: communication/include/corbo-communication/utilities.h:37
corbo::FullDiscretizationGridBase::setInitialDt
void setInitialDt(double dt) override
Definition: full_discretization_grid_base.h:121
corbo::FullDiscretizationGridBase::setFiniteDifferencesCollocationMethod
void setFiniteDifferencesCollocationMethod(FiniteDifferencesCollocationInterface::Ptr fd_eval)
Definition: full_discretization_grid_base.h:139
corbo::FullDiscretizationGridBase::getDtRef
double getDtRef() const
Definition: full_discretization_grid_base.h:129
corbo::FullDiscretizationGridBase::clear
void clear() override
Definition: full_discretization_grid_base.cpp:498
corbo::NlpFunctions
Definition: nlp_functions.h:58
corbo::FullDiscretizationGridBase::_xf_fixed
Eigen::Matrix< bool, -1, 1 > _xf_fixed
Definition: full_discretization_grid_base.h:199
corbo::FullDiscretizationGridBase::getStateAndControlTimeSeries
void getStateAndControlTimeSeries(TimeSeries::Ptr x_sequence, TimeSeries::Ptr u_sequence, double t_max=CORBO_INF_DBL) const override
Return state and control trajectory as time series object (shared instance)
Definition: full_discretization_grid_base.cpp:551
corbo::FullDiscretizationGridBase::isUniformGrid
bool isUniformGrid() const override
Definition: full_discretization_grid_base.h:108
corbo::FullDiscretizationGridBase::_warm_start
bool _warm_start
Definition: full_discretization_grid_base.h:195
scalar_vertex.h
corbo::FullDiscretizationGridBase::getDt
double getDt() const
Definition: full_discretization_grid_base.h:130
corbo::FullDiscretizationGridBase::hasSingleDt
bool hasSingleDt() const override
Definition: full_discretization_grid_base.h:106
corbo::FullDiscretizationGridBase::update
GridUpdateResult update(const Eigen::VectorXd &x0, ReferenceTrajectoryInterface &xref, ReferenceTrajectoryInterface &uref, NlpFunctions &nlp_fun, OptimizationEdgeSet &edges, SystemDynamicsInterface::Ptr dynamics, bool new_run, const Time &t, ReferenceTrajectoryInterface *sref=nullptr, const Eigen::VectorXd *prev_u=nullptr, double prev_u_dt=0, ReferenceTrajectoryInterface *xinit=nullptr, ReferenceTrajectoryInterface *uinit=nullptr) override
Definition: full_discretization_grid_base.cpp:60
discretization_grid_interface.h
corbo::FullDiscretizationGridBase::_cost_integration
CostIntegrationRule _cost_integration
Definition: full_discretization_grid_base.h:203
corbo::CORBO_INF_DBL
constexpr const double CORBO_INF_DBL
Representation for infinity (double version)
Definition: core/include/corbo-core/types.h:75
vector_vertex.h
corbo::FullDiscretizationGridBase::setDtRef
void setDtRef(double dt)
Definition: full_discretization_grid_base.h:128
corbo::FullDiscretizationGridBase::checkAndInitializeXfFixedFlags
bool checkAndInitializeXfFixedFlags(int dim_x)
Definition: full_discretization_grid_base.cpp:369
corbo::FullDiscretizationGridBase::CostIntegrationRule::TrapezoidalRule
@ TrapezoidalRule
corbo::FullDiscretizationGridBase::_dt_ref
double _dt_ref
Definition: full_discretization_grid_base.h:193
corbo::FullDiscretizationGridBase::getInitialDt
double getInitialDt() const override
Definition: full_discretization_grid_base.h:122
corbo::FullDiscretizationGridBase::getVertices
void getVertices(std::vector< VertexInterface * > &vertices) override
Definition: full_discretization_grid_base.cpp:523
corbo::VectorVertex::values
const Eigen::VectorXd & values() const
Read-access to the underlying value vector.
Definition: vector_vertex.h:284
corbo::FullDiscretizationGridBase::~FullDiscretizationGridBase
virtual ~FullDiscretizationGridBase()=default
corbo::FullDiscretizationGridBase::_dt_ub
double _dt_ub
Definition: full_discretization_grid_base.h:201
corbo::FullDiscretizationGridBase::isDtFixedIntended
virtual bool isDtFixedIntended() const
Definition: full_discretization_grid_base.h:176
corbo::FullDiscretizationGridBase::_active_vertices
std::vector< VertexInterface * > _active_vertices
Definition: full_discretization_grid_base.h:187
corbo::DiscretizationGridInterface::Ptr
std::shared_ptr< DiscretizationGridInterface > Ptr
Definition: discretization_grid_interface.h:107
corbo::FullDiscretizationGridBase::warmStartShifting
virtual void warmStartShifting(const Eigen::VectorXd &x0)
Definition: full_discretization_grid_base.cpp:252
corbo::FullDiscretizationGridBase::_nlp_fun
const NlpFunctions * _nlp_fun
Definition: full_discretization_grid_base.h:189
corbo::FullDiscretizationGridBase::getFinalTime
double getFinalTime() const override
Definition: full_discretization_grid_base.h:103
corbo::FullDiscretizationGridBase::findNearestState
int findNearestState(const Eigen::VectorXd &x0)
Definition: full_discretization_grid_base.cpp:309
corbo::FullDiscretizationGridBase::adaptGrid
virtual bool adaptGrid(bool new_run, NlpFunctions &nlp_fun)
Definition: full_discretization_grid_base.h:164
corbo::FullDiscretizationGridBase::getState
const Eigen::VectorXd & getState(int k) const
Definition: full_discretization_grid_base.h:142
corbo::FullDiscretizationGridBase::hasConstantControls
bool hasConstantControls() const override
Definition: full_discretization_grid_base.h:105
corbo::FullDiscretizationGridBase::getNRef
int getNRef() const
Definition: full_discretization_grid_base.h:125
corbo::FullDiscretizationGridBase::_n_adapt
int _n_adapt
Definition: full_discretization_grid_base.h:192
corbo::FullDiscretizationGridBase::setWarmStart
void setWarmStart(bool active)
Definition: full_discretization_grid_base.h:131
corbo::FullDiscretizationGridBase::_xf
PartiallyFixedVectorVertex _xf
Definition: full_discretization_grid_base.h:186
corbo::FullDiscretizationGridBase::setCostIntegrationRule
void setCostIntegrationRule(CostIntegrationRule integration)
Definition: full_discretization_grid_base.h:140
corbo::FullDiscretizationGridBase::providesStateTrajectory
bool providesStateTrajectory() const override
Definition: full_discretization_grid_base.h:109
corbo::FullDiscretizationGridBase::isGridAdaptActive
virtual bool isGridAdaptActive() const
Definition: full_discretization_grid_base.h:178
corbo::FullDiscretizationGridBase::createEdges
virtual void createEdges(NlpFunctions &nlp_fun, OptimizationEdgeSet &edges, SystemDynamicsInterface::Ptr dynamics)=0
corbo::FullDiscretizationGridBase::isEmpty
bool isEmpty() const override
Definition: full_discretization_grid_base.h:117
corbo::OptimizationEdgeSet
Definition: edge_set.h:96
corbo::SystemDynamicsInterface::Ptr
std::shared_ptr< SystemDynamicsInterface > Ptr
Definition: system_dynamics_interface.h:91
corbo::FullDiscretizationGridBase::getActiveVertices
std::vector< VertexInterface * > & getActiveVertices() override
Definition: full_discretization_grid_base.h:150
corbo::FullDiscretizationGridBase::setXfFixed
void setXfFixed(const Eigen::Matrix< bool, -1, 1 > &xf_fixed)
Definition: full_discretization_grid_base.h:133
corbo::FullDiscretizationGridBase::initializeSequences
virtual void initializeSequences(const Eigen::VectorXd &x0, const Eigen::VectorXd &xf, ReferenceTrajectoryInterface &uref, NlpFunctions &nlp_fun)
Definition: full_discretization_grid_base.cpp:156
corbo::FullDiscretizationGridBase::CostIntegrationRule::LeftSum
@ LeftSum
corbo::FullDiscretizationGridBase::isMovingHorizonWarmStartActive
virtual bool isMovingHorizonWarmStartActive() const
Definition: full_discretization_grid_base.h:177
corbo::FiniteDifferencesCollocationInterface::Ptr
std::shared_ptr< FiniteDifferencesCollocationInterface > Ptr
Definition: finite_differences_collocation.h:107
corbo::FullDiscretizationGridBase::setN
void setN(int n, bool try_resample=true) override
Return dimension of the control input dimension in the grid.
Definition: full_discretization_grid_base.cpp:510
corbo::ScalarVertex::value
const double & value() const
Get underlying value.
Definition: scalar_vertex.h:225
corbo::FullDiscretizationGridBase::_dt_lb
double _dt_lb
Definition: full_discretization_grid_base.h:200
corbo::FullDiscretizationGridBase::CostIntegrationRule
CostIntegrationRule
Definition: full_discretization_grid_base.h:89
corbo::FullDiscretizationGridBase::getN
int getN() const override
Definition: full_discretization_grid_base.h:126
corbo::FullDiscretizationGridBase::setNRef
void setNRef(int n)
Definition: full_discretization_grid_base.cpp:355
corbo::FullDiscretizationGridBase::getInitialN
int getInitialN() const override
Definition: full_discretization_grid_base.h:123
corbo::ScalarVertex
Vertex implementation for scalar values.
Definition: scalar_vertex.h:72
corbo::FullDiscretizationGridBase::_fd_eval
FiniteDifferencesCollocationInterface::Ptr _fd_eval
Definition: full_discretization_grid_base.h:182
Eigen::Matrix< bool, -1, 1 >
corbo::FullDiscretizationGridBase::computeActiveVertices
void computeActiveVertices() override
Definition: full_discretization_grid_base.cpp:536
corbo::FullDiscretizationGridBase::FullDiscretizationGridBase
FullDiscretizationGridBase()=default
n
PlainMatrixType mat * n
Definition: eigenvalues.cpp:41
corbo::FullDiscretizationGridBase::Ptr
std::shared_ptr< FullDiscretizationGridBase > Ptr
Definition: full_discretization_grid_base.h:86
corbo::TimeSeries::Ptr
std::shared_ptr< TimeSeries > Ptr
Definition: time_series.h:108
corbo::FullDiscretizationGridBase::resampleTrajectory
virtual void resampleTrajectory(int n_new)
Definition: full_discretization_grid_base.cpp:419
corbo::FullDiscretizationGridBase::_dt
ScalarVertex _dt
Definition: full_discretization_grid_base.h:194
corbo::VertexSetInterface::setModified
void setModified(bool modified)
Definition: vertex_set.h:126
corbo::FullDiscretizationGridBase::getFirstControlInput
bool getFirstControlInput(Eigen::VectorXd &u0) override
Definition: full_discretization_grid_base.cpp:346
corbo::PartiallyFixedVectorVertex
Vector based vertex with support for partially fixed components.
Definition: vector_vertex.h:298
corbo::FullDiscretizationGridBase::updateBounds
void updateBounds(const NlpFunctions &nlp_fun)
Definition: full_discretization_grid_base.cpp:384


control_box_rst
Author(s): Christoph Rösmann
autogenerated on Wed Mar 2 2022 00:05:45