edge_set.cpp
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 
26 
28 
29 namespace corbo {
30 
32 {
33  int idx_non_lsq_obj = 0;
34  int idx_lsq_obj = 0;
35  int idx_eq = 0;
36  int idx_ineq = 0;
37  computeObjectiveEdgeIndices(_objectives, idx_non_lsq_obj, false);
38  computeObjectiveEdgeIndices(_lsq_objectives, idx_lsq_obj, true);
41  computeEdgeIndices(_mixed, idx_non_lsq_obj, idx_lsq_obj, idx_eq, idx_ineq);
42 }
43 
44 void OptimizationEdgeSet::reserveEdgeCacheMemory(int est_value_cache_size, int est_jacobians_cache_size)
45 {
46  for (BaseEdge::Ptr& edge : _objectives) edge->reserveCacheMemory(est_value_cache_size, est_jacobians_cache_size);
47  for (BaseEdge::Ptr& edge : _lsq_objectives) edge->reserveCacheMemory(est_value_cache_size, est_jacobians_cache_size);
48  for (BaseEdge::Ptr& edge : _equalities) edge->reserveCacheMemory(est_value_cache_size, est_jacobians_cache_size);
49  for (BaseEdge::Ptr& edge : _inequalities) edge->reserveCacheMemory(est_value_cache_size, est_jacobians_cache_size);
50  for (BaseMixedEdge::Ptr& edge : _mixed) edge->reserveCacheMemory(est_value_cache_size, est_jacobians_cache_size);
51 }
52 
54 {
55  for (BaseEdge::Ptr& edge : _objectives)
56  {
57  if (edge->getCache().sizeValues() > 0) return false;
58  if (edge->getCache().sizeJacobians() > 0) return false;
59  }
60  for (BaseEdge::Ptr& edge : _lsq_objectives)
61  {
62  if (edge->getCache().sizeValues() > 0) return false;
63  if (edge->getCache().sizeJacobians() > 0) return false;
64  }
65  for (BaseEdge::Ptr& edge : _equalities)
66  {
67  if (edge->getCache().sizeValues() > 0) return false;
68  if (edge->getCache().sizeJacobians() > 0) return false;
69  }
70  for (BaseEdge::Ptr& edge : _inequalities)
71  {
72  if (edge->getCache().sizeValues() > 0) return false;
73  if (edge->getCache().sizeJacobians() > 0) return false;
74  }
75  for (BaseMixedEdge::Ptr& edge : _mixed)
76  {
77  if (edge->getObjectiveCache().sizeValues() > 0) return false;
78  if (edge->getObjectiveCache().sizeJacobians() > 0) return false;
79  if (edge->getEqualityCache().sizeValues() > 0) return false;
80  if (edge->getEqualityCache().sizeJacobians() > 0) return false;
81  if (edge->getInequalityCache().sizeValues() > 0) return false;
82  if (edge->getInequalityCache().sizeJacobians() > 0) return false;
83  }
84  return true;
85 }
86 
88 {
89  for (BaseEdge::Ptr& edge : _objectives) edge->getCache().clear();
90  for (BaseEdge::Ptr& edge : _lsq_objectives) edge->getCache().clear();
91  for (BaseEdge::Ptr& edge : _equalities) edge->getCache().clear();
92  for (BaseEdge::Ptr& edge : _inequalities) edge->getCache().clear();
93  for (BaseMixedEdge::Ptr& edge : _mixed)
94  {
95  edge->getObjectiveCache().clear();
96  edge->getEqualityCache().clear();
97  edge->getInequalityCache().clear();
98  }
99 }
100 
101 void OptimizationEdgeSet::computeObjectiveEdgeIndices(std::vector<BaseEdge::Ptr>& edges, int& idx, bool lsq_edges)
102 {
103  if (edges.empty()) return;
104 
105  setEdgeIdx(*edges[0], idx);
106  int n = edges.size();
107  for (int i = 0; i < n; ++i) // we include the last edge to return the correct idx
108  {
109  if (lsq_edges) // (edges[i]->isLeastSquaresForm())
110  {
111  idx = edges[i]->getEdgeIdx() + edges[i]->getDimension();
112  }
113  else // non-lsq objectives can only have a single dimension
114  {
115  idx = edges[i]->getEdgeIdx() + 1;
116  }
117  if (i < n - 1) setEdgeIdx(*edges[i + 1], idx);
118  }
119 }
120 
121 void OptimizationEdgeSet::computeEdgeIndices(std::vector<BaseEdge::Ptr>& edges, int& idx)
122 {
123  if (edges.empty()) return;
124 
125  setEdgeIdx(*edges[0], idx);
126  int n = edges.size();
127  for (int i = 0; i < n; ++i) // we include the last edge to return the correct idx
128  {
129  idx = edges[i]->getEdgeIdx() + edges[i]->getDimension();
130  if (i < n - 1) setEdgeIdx(*edges[i + 1], idx);
131  }
132 }
133 
134 void OptimizationEdgeSet::computeEdgeIndices(std::vector<BaseMixedEdge::Ptr>& edges, int& idx_obj, int& idx_lsq_obj, int& idx_eq, int& idx_ineq)
135 {
136  if (edges.empty()) return;
137 
138  if (edges[0]->isObjectiveLeastSquaresForm())
139  {
140  setEdgeIdx(*edges[0], idx_lsq_obj, idx_eq, idx_ineq);
141  }
142  else
143  {
144  setEdgeIdx(*edges[0], idx_obj, idx_eq, idx_ineq);
145  }
146 
147  int n = edges.size();
148  for (int i = 0; i < n; ++i) // we include the last edge to return the correct idx
149  {
150  if (edges[i]->isObjectiveLeastSquaresForm())
151  {
152  idx_obj = edges[i]->getEdgeObjectiveIdx() + edges[i]->getObjectiveDimension(); // resulting dimension is always 1 -> f(x)^T * f(x)
153  }
154  else
155  {
156  idx_obj = edges[i]->getEdgeObjectiveIdx() + 1;
157  }
158  idx_eq = edges[i]->getEdgeEqualityIdx() + edges[i]->getEqualityDimension();
159  idx_ineq = edges[i]->getEdgeInequalityIdx() + edges[i]->getInequalityDimension();
160 
161  if (i < n - 1)
162  {
163  setEdgeIdx(*edges[i + 1], edges[i]->isObjectiveLeastSquaresForm() ? idx_lsq_obj : idx_obj, idx_eq, idx_ineq);
164  }
165  }
166 }
167 
169 {
170  vertices.clearConnectedEdges();
172 }
173 
175 {
176  for (BaseEdge::Ptr& edge : _objectives)
177  {
178  for (int i = 0; i < edge->getNumVertices(); ++i) edge->getVertexRaw(i)->registerObjectiveEdge(edge.get());
179  }
180  for (BaseEdge::Ptr& edge : _lsq_objectives)
181  {
182  for (int i = 0; i < edge->getNumVertices(); ++i) edge->getVertexRaw(i)->registerLsqObjectiveEdge(edge.get());
183  }
184  for (BaseEdge::Ptr& edge : _equalities)
185  {
186  for (int i = 0; i < edge->getNumVertices(); ++i) edge->getVertexRaw(i)->registerEqualityEdge(edge.get());
187  }
188  for (BaseEdge::Ptr& edge : _inequalities)
189  {
190  for (int i = 0; i < edge->getNumVertices(); ++i) edge->getVertexRaw(i)->registerInequalityEdge(edge.get());
191  }
192  for (BaseMixedEdge::Ptr& edge : _mixed)
193  {
194  for (int i = 0; i < edge->getNumVertices(); ++i) edge->getVertexRaw(i)->registerMixedEdge(edge.get());
195  }
196 }
197 
198 void OptimizationEdgeSet::getDimensions(int& non_lsq_obj_dim, int& lsq_obj_dim, int& eq_dim, int& ineq_dim)
199 {
200  non_lsq_obj_dim = 0;
201  lsq_obj_dim = 0;
202  eq_dim = 0;
203  ineq_dim = 0;
204 
205  // plain objectives
206  for (BaseEdge::Ptr& edge : _objectives)
207  {
208  if (edge->getDimension() > 0)
209  {
210  non_lsq_obj_dim = 1;
211  break;
212  }
213  }
214  for (BaseEdge::Ptr& edge : _lsq_objectives)
215  {
216  lsq_obj_dim += edge->getDimension();
217  }
218  for (BaseEdge::Ptr& edge : _equalities)
219  {
220  eq_dim += edge->getDimension();
221  }
222  for (BaseEdge::Ptr& edge : _inequalities)
223  {
224  ineq_dim += edge->getDimension();
225  }
226  for (BaseMixedEdge::Ptr& edge : _mixed)
227  {
228  if (edge->isObjectiveLeastSquaresForm())
229  lsq_obj_dim += edge->getObjectiveDimension();
230  else
231  non_lsq_obj_dim = 1;
232 
233  eq_dim += edge->getEqualityDimension();
234  ineq_dim += edge->getInequalityDimension();
235  }
236 }
237 
239 {
240  setModified(true);
241  _objectives.clear();
242  _lsq_objectives.clear();
243  _equalities.clear();
244  _inequalities.clear();
245  _mixed.clear();
246 }
247 
248 } // namespace corbo
void setModified(bool modified)
Definition: edge_set.h:60
Abstract class representing a set of vertices.
Definition: vertex_set.h:45
void reserveEdgeCacheMemory(int est_value_cache_size, int est_jacobians_cache_size) override
Definition: edge_set.cpp:44
void setEdgeIdx(BaseEdge &edge, int idx)
Definition: edge_set.h:64
void computeEdgeIndices() override
Precompute edge indices in the hyper-graph (e.g. for the Jacobian structure)
Definition: edge_set.cpp:31
void clear() override
Definition: edge_set.cpp:238
std::shared_ptr< BaseMixedEdge > Ptr
void getDimensions(int &non_lsq_obj_dim, int &lsq_obj_dim, int &eq_dim, int &ineq_dim)
Definition: edge_set.cpp:198
std::shared_ptr< BaseEdge > Ptr
std::vector< BaseEdge::Ptr > _objectives
Definition: edge_set.h:187
std::vector< BaseEdge::Ptr > _lsq_objectives
Definition: edge_set.h:188
std::vector< BaseEdge::Ptr > _inequalities
Definition: edge_set.h:190
PlainMatrixType mat * n
Definition: eigenvalues.cpp:41
std::vector< BaseMixedEdge::Ptr > _mixed
Definition: edge_set.h:191
void computeObjectiveEdgeIndices(std::vector< BaseEdge::Ptr > &edges, int &idx, bool lsq_edges)
Precompute overall edge indices in the hyper-graph (e.g. for the Jacobian structure) ...
Definition: edge_set.cpp:101
std::vector< BaseEdge::Ptr > _equalities
Definition: edge_set.h:189


control_box_rst
Author(s): Christoph Rösmann
autogenerated on Mon Feb 28 2022 22:06:51