hyper_graph_optimization_problem_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_OPTIMIZATION_INCLUDE_CORBO_OPTIMIZATION_HYPER_GRAPH_HYPER_GRAPH_OPTIMIZATION_PROBLEM_BASE_H_
26 #define SRC_OPTIMIZATION_INCLUDE_CORBO_OPTIMIZATION_HYPER_GRAPH_HYPER_GRAPH_OPTIMIZATION_PROBLEM_BASE_H_
27 
29 
31 
32 #include <corbo-core/factory.h>
33 
34 #include <functional>
35 #include <memory>
36 
37 #if MESSAGE_SUPPORT
38 #include <corbo-communication/messages/optimization/hyper_graph_optimization_problem.pb.h>
39 #endif
40 
41 namespace corbo {
42 
70 class BaseHyperGraphOptimizationProblem : public OptimizationProblemInterface
71 {
72  public:
73  using Ptr = std::shared_ptr<BaseHyperGraphOptimizationProblem>;
74 
77 
78  virtual Ptr getInstance() const { return std::make_shared<BaseHyperGraphOptimizationProblem>(); }
79 
81  static Factory<BaseHyperGraphOptimizationProblem>& getFactory() { return Factory<BaseHyperGraphOptimizationProblem>::instance(); }
82 
84  {
85  _graph.setEdgeSet(edges);
86  _graph.setVertexSet(vertices);
87  }
88 
89  const HyperGraph& getGraph() const { return _graph; }
90  HyperGraph& getGraph() { return _graph; }
91 
92  virtual void precomputeGraphQuantities();
93  virtual void precomputeVertexQuantities();
94  virtual void precomputeEdgeQuantities();
95 
98 
100  int getNonLsqObjectiveDimension() override
101  {
103  return _dim_non_lsq_obj;
104  }
105  int getLsqObjectiveDimension() override
106  {
108  return _dim_lsq_obj;
109  }
110  int getObjectiveDimension() override
111  {
113  return (int)(_dim_lsq_obj > 0 || _dim_non_lsq_obj > 0);
114  }
116  int getEqualityDimension() override
117  {
119  return _dim_eq;
120  }
122  int getInequalityDimension() override
123  {
125  return _dim_ineq;
126  }
127 
129 
132 
133  // implmements interface method
134  double computeValueNonLsqObjective() override;
135 
136  // implements interface method
138 
139  // implements interface method
140  double computeValueObjective() override;
141 
142  // implements interface method
144 
145  // implements interface method
147 
148  // implements interface method
149  void computeValues(double& non_lsq_obj_value, Eigen::Ref<Eigen::VectorXd> lsq_obj_values, Eigen::Ref<Eigen::VectorXd> eq_values,
150  Eigen::Ref<Eigen::VectorXd> ineq_values) override;
151 
153 
156 
157  // implements interface method
158  double getParameterValue(int idx) override { return _graph.getVertexSetRaw()->getParameterValue(idx); }
159  // implements interface method
160  void setParameterValue(int idx, double x) override { _graph.getVertexSetRaw()->setParameterValue(idx, x); }
161  // implements interface method
163  // implements interface method
165 
166  // implements interface method
168  // implements interface method
170  {
171  _graph.getVertexSetRaw()->setBounds(lb, ub);
172  }
173  // implements interface method
174  double getLowerBound(int idx) override { return _graph.getVertexSetRaw()->getLowerBound(idx); }
175  // implements interface method
176  double getUpperBound(int idx) override { return _graph.getVertexSetRaw()->getUpperBound(idx); }
177  // implements interface method
178  void setLowerBound(int idx, double lb) override { _graph.getVertexSetRaw()->setLowerBound(idx, lb); }
179  // implements interface method
180  void setUpperBound(int idx, double ub) override { _graph.getVertexSetRaw()->setUpperBound(idx, ub); }
181 
183 
186 
187  // implements interface method
188  int getParameterDimension() override
189  {
191  return _dim_param;
192  }
193 
194  // implements interface method
195  void applyIncrement(const Eigen::Ref<const Eigen::VectorXd>& increment) override { _graph.getVertexSetRaw()->applyIncrementNonFixed(increment); }
196  // implements interface method
197  void applyIncrement(int idx, double increment) override { _graph.getVertexSetRaw()->applyIncrementNonFixed(idx, increment); }
198 
199  // implements interface method
201  // implements interface method
202  void restoreBackupParameters(bool keep_backup) override { _graph.getVertexSetRaw()->restoreBackupParametersActiveVertices(keep_backup); }
203  // implements interface method
205 
207 
210 
211  // implements interface method
212  bool isLeastSquaresProblem() const override { return _graph.getEdgeSetRaw()->hasOnlyLeastSquaresObjectives(); }
213 
215 
218 
219  // implements interface method
221  // implements interface method
222  int finiteBoundsDimension() override;
223  // implements interface method
224  void computeValuesActiveInequality(Eigen::Ref<Eigen::VectorXd> values, double weight = 1.0) override;
225  // implements interface method
227  // implements interface method
229  // implements interface method
231  Eigen::Ref<Eigen::VectorXd> x_finite_bounds) override;
232 
233  void computeDenseJacobianFiniteCombinedBounds(Eigen::Ref<Eigen::MatrixXd> jacobian, double weight = 1.0) override;
236  void computeSparseJacobianFiniteCombinedBoundsValues(Eigen::Ref<Eigen::VectorXd> values, double weight = 1.0) override;
237 
239 
241 
243  bool checkIfAllUnfixedParam(std::function<bool(double, int)> fun);
244 
245  void clear() override;
246 
247 #ifdef MESSAGE_SUPPORT
248  // implements interface method
249  virtual void toMessage(corbo::messages::HyperGraphOptimizationProblem& message) const {}
250  // implements interface method
251  virtual void fromMessage(const corbo::messages::HyperGraphOptimizationProblem& message, std::stringstream* issues = nullptr) {}
252 #endif
253 
254  protected:
255  HyperGraph _graph;
256  bool _graph_precomputed = false;
257 
258  int _dim_param = 0;
259  int _dim_non_lsq_obj = 0;
260  int _dim_lsq_obj = 0;
261  int _dim_eq = 0;
262  int _dim_ineq = 0;
263 };
264 
266 #define FACTORY_REGISTER_HYPER_GRAPH_OPTIMIZATION_PROBLEM(type) FACTORY_REGISTER_OBJECT_ID(type, BaseHyperGraphOptimizationProblem, 100)
267 
268 } // namespace corbo
269 
270 #endif // SRC_OPTIMIZATION_INCLUDE_CORBO_OPTIMIZATION_HYPER_GRAPH_HYPER_GRAPH_OPTIMIZATION_PROBLEM_BASE_H_
corbo::BaseHyperGraphOptimizationProblem::computeSparseJacobianFiniteCombinedBoundsStructure
void computeSparseJacobianFiniteCombinedBoundsStructure(Eigen::Ref< Eigen::VectorXi > i_row, Eigen::Ref< Eigen::VectorXi > j_col) override
Definition: hyper_graph_optimization_problem_base.cpp:423
corbo::BaseHyperGraphOptimizationProblem::computeDenseJacobianFiniteCombinedBounds
void computeDenseJacobianFiniteCombinedBounds(Eigen::Ref< Eigen::MatrixXd > jacobian, double weight=1.0) override
Compute the Jacobian for finite combined bounds.
Definition: hyper_graph_optimization_problem_base.cpp:386
corbo::VertexSetInterface::getLowerBound
double getLowerBound(int idx)
Definition: vertex_set.cpp:241
corbo::BaseHyperGraphOptimizationProblem::getUpperBound
double getUpperBound(int idx) override
Return specific upper bound of a parameter.
Definition: hyper_graph_optimization_problem_base.h:220
corbo::BaseHyperGraphOptimizationProblem::computeValueNonLsqObjective
double computeValueNonLsqObjective() override
Definition: hyper_graph_optimization_problem_base.cpp:103
corbo::BaseHyperGraphOptimizationProblem::computeSparseJacobianFiniteCombinedBoundsValues
void computeSparseJacobianFiniteCombinedBoundsValues(Eigen::Ref< Eigen::VectorXd > values, double weight=1.0) override
Definition: hyper_graph_optimization_problem_base.cpp:449
corbo::OptimizationEdgeSet::Ptr
std::shared_ptr< OptimizationEdgeSet > Ptr
Definition: edge_set.h:99
corbo::BaseHyperGraphOptimizationProblem::getGraph
const HyperGraph & getGraph() const
Definition: hyper_graph_optimization_problem_base.h:133
corbo::BaseHyperGraphOptimizationProblem::_dim_param
int _dim_param
Definition: hyper_graph_optimization_problem_base.h:302
corbo::BaseHyperGraphOptimizationProblem::applyIncrement
void applyIncrement(const Eigen::Ref< const Eigen::VectorXd > &increment) override
Apply increment to the current parameter set.
Definition: hyper_graph_optimization_problem_base.h:239
factory.h
corbo::BaseHyperGraphOptimizationProblem::precomputeEdgeQuantities
virtual void precomputeEdgeQuantities()
Definition: hyper_graph_optimization_problem_base.cpp:66
corbo::VertexSetInterface::setBounds
void setBounds(const Eigen::Ref< const Eigen::VectorXd > &lb, const Eigen::Ref< const Eigen::VectorXd > &ub)
Definition: vertex_set.cpp:211
corbo::BaseHyperGraphOptimizationProblem::getObjectiveDimension
int getObjectiveDimension() override
Get dimension of the objective (should be zero or one, includes Lsq objectives if present)
Definition: hyper_graph_optimization_problem_base.h:154
corbo::BaseHyperGraphOptimizationProblem::checkIfAllUnfixedParam
bool checkIfAllUnfixedParam(std::function< bool(double, int)> fun)
Check if a function taking the parameter value and unfixed-idx is true for all unfixed parameter valu...
Definition: hyper_graph_optimization_problem_base.cpp:508
corbo
Definition: communication/include/corbo-communication/utilities.h:37
corbo::VertexSetInterface::setLowerBound
void setLowerBound(int idx, double lb)
Definition: vertex_set.cpp:307
corbo::VertexSetInterface::Ptr
std::shared_ptr< VertexSetInterface > Ptr
Definition: vertex_set.h:92
corbo::Factory
Generic factory object.
Definition: factory.h:90
corbo::BaseHyperGraphOptimizationProblem::_graph
HyperGraph _graph
Definition: hyper_graph_optimization_problem_base.h:299
corbo::VertexSetInterface::restoreBackupParametersActiveVertices
void restoreBackupParametersActiveVertices(bool keep_backup)
Definition: vertex_set.cpp:458
corbo::BaseHyperGraphOptimizationProblem::getEqualityDimension
int getEqualityDimension() override
Total dimension of equality constraints.
Definition: hyper_graph_optimization_problem_base.h:160
corbo::VertexSetInterface::discardBackupParametersActiveVertices
void discardBackupParametersActiveVertices(bool all=false)
Definition: vertex_set.cpp:470
corbo::BaseHyperGraphOptimizationProblem::setUpperBound
void setUpperBound(int idx, double ub) override
Set specific upper bound of a parameter.
Definition: hyper_graph_optimization_problem_base.h:224
corbo::BaseHyperGraphOptimizationProblem::getBounds
void getBounds(Eigen::Ref< Eigen::VectorXd > lb, Eigen::Ref< Eigen::VectorXd > ub) override
Get lower and upper bound vector.
Definition: hyper_graph_optimization_problem_base.h:211
corbo::BaseHyperGraphOptimizationProblem::getParameterDimension
int getParameterDimension() override
Effictive dimension of the optimization parameter set (changeable, non-fixed part)
Definition: hyper_graph_optimization_problem_base.h:232
corbo::BaseHyperGraphOptimizationProblem::clear
void clear() override
Definition: hyper_graph_optimization_problem_base.cpp:90
corbo::BaseHyperGraphOptimizationProblem::finiteCombinedBoundsDimension
int finiteCombinedBoundsDimension() override
Dimension of the set of finite bounds (combined such that each ub and lb component define a single di...
Definition: hyper_graph_optimization_problem_base.cpp:271
corbo::BaseHyperGraphOptimizationProblem::precomputeGraphQuantities
virtual void precomputeGraphQuantities()
Definition: hyper_graph_optimization_problem_base.cpp:79
corbo::VertexSetInterface::getParameterVector
void getParameterVector(Eigen::Ref< Eigen::VectorXd > x)
Definition: vertex_set.cpp:129
corbo::BaseHyperGraphOptimizationProblem::restoreBackupParameters
void restoreBackupParameters(bool keep_backup) override
Discard last backup (or all)
Definition: hyper_graph_optimization_problem_base.h:246
corbo::BaseHyperGraphOptimizationProblem::computeDistanceFiniteCombinedBounds
void computeDistanceFiniteCombinedBounds(Eigen::Ref< Eigen::VectorXd > values) override
Compute the distance to finite bound values (combined lower and upper)
Definition: hyper_graph_optimization_problem_base.cpp:313
corbo::BaseHyperGraphOptimizationProblem::computeSparseJacobianFiniteCombinedBoundsNNZ
int computeSparseJacobianFiniteCombinedBoundsNNZ() override
Definition: hyper_graph_optimization_problem_base.cpp:421
corbo::BaseHyperGraphOptimizationProblem::getFactory
static Factory< BaseHyperGraphOptimizationProblem > & getFactory()
Get access to the accociated factory.
Definition: hyper_graph_optimization_problem_base.h:125
corbo::BaseHyperGraphOptimizationProblem::getParameterVector
void getParameterVector(Eigen::Ref< Eigen::VectorXd > x) override
Return deep copy of the complete parameter vector.
Definition: hyper_graph_optimization_problem_base.h:206
corbo::VertexSetInterface::setUpperBound
void setUpperBound(int idx, double ub)
Definition: vertex_set.cpp:343
corbo::HyperGraph::setEdgeSet
void setEdgeSet(OptimizationEdgeSet::Ptr edges)
Definition: hyper_graph.h:111
corbo::BaseHyperGraphOptimizationProblem::getParametersAndBoundsFinite
void getParametersAndBoundsFinite(Eigen::Ref< Eigen::VectorXd > lb_finite_bounds, Eigen::Ref< Eigen::VectorXd > ub_finite_bounds, Eigen::Ref< Eigen::VectorXd > x_finite_bounds) override
Return bound and parameter vectors only for finite boudns.
Definition: hyper_graph_optimization_problem_base.cpp:361
corbo::Factory::instance
static Factory & instance()
< Retrieve static instance of the factory
Definition: factory.h:116
corbo::BaseHyperGraphOptimizationProblem::getInequalityDimension
int getInequalityDimension() override
Total dimension of general inequality constraints.
Definition: hyper_graph_optimization_problem_base.h:166
corbo::BaseHyperGraphOptimizationProblem::backupParameters
void backupParameters() override
Restore parameter set from the last backup and keep backup if desired.
Definition: hyper_graph_optimization_problem_base.h:244
corbo::BaseHyperGraphOptimizationProblem::BaseHyperGraphOptimizationProblem
BaseHyperGraphOptimizationProblem()=default
corbo::BaseHyperGraphOptimizationProblem::_dim_eq
int _dim_eq
Definition: hyper_graph_optimization_problem_base.h:305
corbo::BaseHyperGraphOptimizationProblem::finiteBoundsDimension
int finiteBoundsDimension() override
Dimension of the set of finite bounds (individual bounds ub and lb)
Definition: hyper_graph_optimization_problem_base.cpp:285
corbo::BaseHyperGraphOptimizationProblem::setLowerBound
void setLowerBound(int idx, double lb) override
Set specific lower bound of a parameter.
Definition: hyper_graph_optimization_problem_base.h:222
corbo::BaseHyperGraphOptimizationProblem::getLsqObjectiveDimension
int getLsqObjectiveDimension() override
Total dimension of least-squares objective function terms.
Definition: hyper_graph_optimization_problem_base.h:149
corbo::BaseHyperGraphOptimizationProblem::computeValuesLsqObjective
void computeValuesLsqObjective(Eigen::Ref< Eigen::VectorXd > values) override
Compute the objective function values f(x) for the current parameter set.
Definition: hyper_graph_optimization_problem_base.cpp:128
hyper_graph.h
x
Scalar * x
Definition: level1_cplx_impl.h:89
corbo::BaseHyperGraphOptimizationProblem::computeValuesEquality
void computeValuesEquality(Eigen::Ref< Eigen::VectorXd > values) override
Compute the equality constraint values ceq(x) for the current parameter set.
Definition: hyper_graph_optimization_problem_base.cpp:184
corbo::OptimizationEdgeSet::hasOnlyLeastSquaresObjectives
bool hasOnlyLeastSquaresObjectives() const
Definition: edge_set.h:195
corbo::BaseHyperGraphOptimizationProblem::computeDenseJacobianFiniteCombinedBoundsIdentity
void computeDenseJacobianFiniteCombinedBoundsIdentity(Eigen::Ref< Eigen::MatrixXd > jacobian) override
Compute the Jacobian for finite combined bounds.
Definition: hyper_graph_optimization_problem_base.cpp:480
corbo::VertexSetInterface::setParameterVector
void setParameterVector(const Eigen::Ref< const Eigen::VectorXd > &x)
Definition: vertex_set.cpp:155
corbo::BaseHyperGraphOptimizationProblem::discardBackupParameters
void discardBackupParameters(bool all=false) override
Definition: hyper_graph_optimization_problem_base.h:248
corbo::BaseHyperGraphOptimizationProblem::getLowerBound
double getLowerBound(int idx) override
Return specific lower bound value of a parameter.
Definition: hyper_graph_optimization_problem_base.h:218
corbo::VertexSetInterface::setParameterValue
void setParameterValue(int idx, double x)
Definition: vertex_set.cpp:93
corbo::BaseHyperGraphOptimizationProblem::getParameterValue
double getParameterValue(int idx) override
Return specific value of the parameter vector.
Definition: hyper_graph_optimization_problem_base.h:202
corbo::BaseHyperGraphOptimizationProblem::computeValueObjective
double computeValueObjective() override
Definition: hyper_graph_optimization_problem_base.cpp:149
corbo::BaseHyperGraphOptimizationProblem::_dim_lsq_obj
int _dim_lsq_obj
Definition: hyper_graph_optimization_problem_base.h:304
corbo::BaseHyperGraphOptimizationProblem::Ptr
std::shared_ptr< BaseHyperGraphOptimizationProblem > Ptr
Definition: hyper_graph_optimization_problem_base.h:117
corbo::HyperGraph::getVertexSetRaw
VertexSetInterface * getVertexSetRaw() const
Definition: hyper_graph.h:121
corbo::BaseHyperGraphOptimizationProblem::isLeastSquaresProblem
bool isLeastSquaresProblem() const override
Check if the underlying problem is defined in the least squares form.
Definition: hyper_graph_optimization_problem_base.h:256
corbo::HyperGraph::getEdgeSetRaw
OptimizationEdgeSet * getEdgeSetRaw() const
Definition: hyper_graph.h:120
Eigen::Ref
A matrix or vector expression mapping an existing expression.
Definition: Ref.h:192
corbo::BaseHyperGraphOptimizationProblem::setParameterVector
void setParameterVector(const Eigen::Ref< const Eigen::VectorXd > &x) override
Set complete parameter vector.
Definition: hyper_graph_optimization_problem_base.h:208
corbo::BaseHyperGraphOptimizationProblem::setGraph
void setGraph(OptimizationEdgeSet::Ptr edges, VertexSetInterface::Ptr vertices)
Definition: hyper_graph_optimization_problem_base.h:127
corbo::BaseHyperGraphOptimizationProblem::_dim_non_lsq_obj
int _dim_non_lsq_obj
Definition: hyper_graph_optimization_problem_base.h:303
corbo::BaseHyperGraphOptimizationProblem::computeLowerAndUpperBoundDiff
void computeLowerAndUpperBoundDiff(Eigen::Ref< Eigen::VectorXd > lb_minus_x, Eigen::Ref< Eigen::VectorXd > ub_minus_x) override
Compute the distance between parameters and bounds.
Definition: hyper_graph_optimization_problem_base.cpp:339
corbo::VertexSetInterface::getBounds
void getBounds(Eigen::Ref< Eigen::VectorXd > lb, Eigen::Ref< Eigen::VectorXd > ub)
Definition: vertex_set.cpp:181
corbo::VertexSetInterface::getParameterValue
double getParameterValue(int idx)
Definition: vertex_set.cpp:60
corbo::BaseHyperGraphOptimizationProblem::_dim_ineq
int _dim_ineq
Definition: hyper_graph_optimization_problem_base.h:306
corbo::BaseHyperGraphOptimizationProblem::computeValuesInequality
void computeValuesInequality(Eigen::Ref< Eigen::VectorXd > values) override
Compute the inequality constraint values c(x) for the current parameter set.
Definition: hyper_graph_optimization_problem_base.cpp:204
corbo::BaseHyperGraphOptimizationProblem::getInstance
virtual Ptr getInstance() const
Definition: hyper_graph_optimization_problem_base.h:122
corbo::VertexSetInterface::getUpperBound
double getUpperBound(int idx)
Definition: vertex_set.cpp:274
corbo::BaseHyperGraphOptimizationProblem::getNonLsqObjectiveDimension
int getNonLsqObjectiveDimension() override
Total dimension of objective function terms.
Definition: hyper_graph_optimization_problem_base.h:144
corbo::HyperGraph::setVertexSet
void setVertexSet(VertexSetInterface::Ptr vertices)
Definition: hyper_graph.h:112
corbo::BaseHyperGraphOptimizationProblem::computeValuesActiveInequality
void computeValuesActiveInequality(Eigen::Ref< Eigen::VectorXd > values, double weight=1.0) override
Compute the values of the active inequality constraints (elementwise max(0, c(x)))
Definition: hyper_graph_optimization_problem_base.cpp:300
corbo::VertexSetInterface::applyIncrementNonFixed
void applyIncrementNonFixed(const Eigen::Ref< const Eigen::VectorXd > &increment)
Active vertices related methods.
Definition: vertex_set.cpp:379
corbo::BaseHyperGraphOptimizationProblem::computeValues
void computeValues(double &non_lsq_obj_value, Eigen::Ref< Eigen::VectorXd > lsq_obj_values, Eigen::Ref< Eigen::VectorXd > eq_values, Eigen::Ref< Eigen::VectorXd > ineq_values) override
Definition: hyper_graph_optimization_problem_base.cpp:224
HyperGraphOptimizationProblem
corbo::HyperGraphOptimizationProblemEdgeBased HyperGraphOptimizationProblem
Definition: test_hyper_graph_optimization_problem_edge_based.cpp:46
corbo::BaseHyperGraphOptimizationProblem::setBounds
void setBounds(const Eigen::Ref< const Eigen::VectorXd > &lb, const Eigen::Ref< const Eigen::VectorXd > &ub) override
Set lower and upper bound vector.
Definition: hyper_graph_optimization_problem_base.h:213
corbo::BaseHyperGraphOptimizationProblem::_graph_precomputed
bool _graph_precomputed
Definition: hyper_graph_optimization_problem_base.h:300
corbo::BaseHyperGraphOptimizationProblem::setParameterValue
void setParameterValue(int idx, double x) override
Set specific value of the parameter vector.
Definition: hyper_graph_optimization_problem_base.h:204
corbo::BaseHyperGraphOptimizationProblem::precomputeVertexQuantities
virtual void precomputeVertexQuantities()
Definition: hyper_graph_optimization_problem_base.cpp:51
corbo::VertexSetInterface::backupParametersActiveVertices
void backupParametersActiveVertices()
Definition: vertex_set.cpp:453
optimization_problem_interface.h


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