37 if (S.size() == 0)
return false;
41 if (S.isDiagonal(1e-10))
return setWeightS(S.diagonal().asDiagonal());
51 if (S.
size() == 0)
return false;
69 cost[0] = x_k.transpose() *
_S * x_k -
_gamma;
77 cost[0] = xd.transpose() *
_S * xd -
_gamma;
87 if (
_S.diagonal().size() != state_dim)
90 *issues <<
"TerminalBall: Diagonal matrix dimension of S (" <<
_S_diag.
diagonal().size()
91 <<
") does not match state vector dimension (" << state_dim <<
"); Please specify diagonal elements only." << std::endl;
97 if (
_S.rows() != state_dim ||
_S.cols() != state_dim)
100 *issues <<
"TerminalBall: Matrix dimension of S (" <<
_S.rows() <<
"x" <<
_S.cols() <<
") does not match state vector dimension (" 101 << state_dim <<
"); Please specify " << (state_dim * state_dim) <<
" elements (Row-Major)." << std::endl;
109 #ifdef MESSAGE_SUPPORT 110 bool TerminalBall::fromMessage(
const messages::FinalStageConstraints& message, std::stringstream* issues)
112 const messages::TerminalBall& msg = message.terminal_ball();
120 *issues <<
"TerminalBall: cannot set diagonal weight matrix S.\n";
128 *issues <<
"TerminalBall: weight matrix S is not square.\n";
135 *issues <<
"TerminalBall: cannot set weight matrix S.\n";
145 void TerminalBall::toMessage(messages::FinalStageConstraints& message)
const 147 messages::TerminalBall* msg = message.mutable_terminal_ball();
153 msg->mutable_s()->Resize(Sdiag.size(), 0);
156 msg->set_s_diagonal_only(
true);
160 msg->mutable_s()->Resize(
_S.rows() *
_S.cols(), 0);
163 msg->set_s_diagonal_only(
false);
177 bool dimension_modified =
TerminalBall::update(n, t, xref, uref, sref, single_dt, x0, final_state_cost, stage_preprocessor, dts, grid);
182 if (quadratic_cost->getWeightQf().rows() == 0)
184 PRINT_ERROR(
"TerminalBallInheritFromCost::update(): weight matrix obtained from terminal cost function has zero size!");
191 PRINT_ERROR(
"TerminalBallInheritFromCost::update(): this constraint requires quadratic final cost! Setting final weight matrix to zero!");
194 return dimension_modified;
202 assert(
_S.rows() == x_k.size());
209 cost[0] = x_k.transpose() *
_S * x_k -
_gamma;
217 cost[0] = xd.transpose() *
_S * xd -
_gamma;
222 std::stringstream* issues)
const 230 *issues <<
"TerminalBallInheritFromCost: This final cost requires a complementary quadratic final/terminal cost function." << std::endl;
239 #ifdef MESSAGE_SUPPORT 240 bool TerminalBallInheritFromCost::fromMessage(
const messages::FinalStageConstraints& message, std::stringstream* issues)
242 const messages::TerminalBallInheritFromCost& msg = message.terminal_ball_from_cost();
248 void TerminalBallInheritFromCost::toMessage(messages::FinalStageConstraints& message)
const 250 messages::TerminalBallInheritFromCost* msg = message.mutable_terminal_ball_from_cost();
251 msg->set_gamma(msg->gamma());
const ReferenceTrajectoryInterface * _x_ref
bool update(int n, double t, ReferenceTrajectoryInterface &xref, ReferenceTrajectoryInterface &uref, ReferenceTrajectoryInterface *sref, bool single_dt, const Eigen::VectorXd &x0, FinalStageCost::ConstPtr final_stage_cost, StagePreprocessor::Ptr stage_preprocessor, const std::vector< double > &dts, const DiscretizationGridInterface *) override
EIGEN_DEVICE_FUNC const DiagonalVectorType & diagonal() const
A matrix or vector expression mapping an existing array of data.
bool checkParameters(int state_dim, int control_dim, FinalStageCost::ConstPtr final_stage_cost, std::stringstream *issues) const override
Generic interface class for discretization grids.
std::shared_ptr< const FinalStageCost > ConstPtr
EIGEN_DEVICE_FUNC const SqrtReturnType sqrt() const
virtual int getDimension() const =0
bool checkParameters(int state_dim, int control_dim, FinalStageCost::ConstPtr final_stage_cost, std::stringstream *issues) const override
bool is_square(const Eigen::MatrixBase< Derived > &matrix)
Determine if a given matrix is square.
bool _diagonal_mode_intentionally
virtual const OutputVector & getReferenceCached(int k) const =0
std::shared_ptr< const BaseQuadraticFinalStateCost > ConstPtr
int getNonIntegralStateTermDimension(int k) const override
bool update(int n, double t, ReferenceTrajectoryInterface &xref, ReferenceTrajectoryInterface &uref, ReferenceTrajectoryInterface *sref, bool single_dt, const Eigen::VectorXd &x0, FinalStageCost::ConstPtr final_stage_cost, StagePreprocessor::Ptr stage_preprocessor, const std::vector< double > &dts, const DiscretizationGridInterface *) override
A matrix or vector expression mapping an existing expression.
Interface class for reference trajectories.
void computeNonIntegralStateTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &x_k, Eigen::Ref< Eigen::VectorXd > cost) const override
std::shared_ptr< StagePreprocessor > Ptr
bool setWeightS(const Eigen::Ref< const Eigen::MatrixXd > &S)
EIGEN_DEVICE_FUNC DenseMatrixType toDenseMatrix() const
The matrix class, also used for vectors and row-vectors.
Eigen::DiagonalMatrix< double, -1 > _S_diag
EIGEN_DEVICE_FUNC Index size() const
void computeNonIntegralStateTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &x_k, Eigen::Ref< Eigen::VectorXd > cost) const override
#define PRINT_ERROR(msg)
Print msg-stream as error msg.