vertex_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 
27 namespace corbo {
28 
30 {
31  int param_dim = 0;
32 
33  for (VertexInterface* vertex : getActiveVertices()) param_dim += vertex->getDimensionUnfixed();
34 
35  return param_dim;
36 }
37 
39 {
41 
42  assert(idx < getParameterDimension());
43 
44  // TODO(roesmann) replace linear search strategy by a more efficient one
45  for (VertexInterface* vertex : getActiveVertices())
46  {
47  int vtx_idx = vertex->getVertexIdx();
48  if (vertex->getDimensionUnfixed() == vertex->getDimension())
49  {
50  if (vtx_idx + vertex->getDimension() > idx)
51  {
52  return vertex->getData()[idx - vtx_idx];
53  }
54  }
55  else
56  {
57  int param_idx = 0;
58  for (int i = 0; i < vertex->getDimension(); ++i)
59  {
60  if (!vertex->isFixedComponent(i))
61  {
62  if (vtx_idx + param_idx == idx) return vertex->getData()[i];
63  ++param_idx;
64  }
65  }
66  }
67  }
68  return CORBO_MAX_DBL;
69 }
70 
71 void VertexSetInterface::setParameterValue(int idx, double x)
72 {
74 
75  assert(idx < getParameterDimension());
76 
77  for (VertexInterface* vertex : getActiveVertices())
78  {
79  int vtx_idx = vertex->getVertexIdx();
80  if (vertex->getDimensionUnfixed() == vertex->getDimension())
81  {
82  if (vtx_idx + vertex->getDimension() > idx)
83  {
84  vertex->setData(idx - vtx_idx, x);
85  return;
86  }
87  }
88  else
89  {
90  int param_idx = 0;
91  for (int i = 0; i < vertex->getDimension(); ++i)
92  {
93  if (!vertex->isFixedComponent(i))
94  {
95  if (vtx_idx + param_idx == idx)
96  {
97  vertex->setData(i, x);
98  return;
99  }
100  ++param_idx;
101  }
102  }
103  }
104  }
105 }
106 
108 {
110 
111  assert(x.size() == getParameterDimension());
112 
113  for (VertexInterface* vertex : getActiveVertices())
114  {
115  int x_idx = vertex->getVertexIdx();
116  if (vertex->hasFixedComponents())
117  {
118  for (int i = 0; i < vertex->getDimension(); ++i)
119  {
120  if (vertex->isFixedComponent(i)) continue;
121 
122  x[x_idx] = vertex->getData()[i];
123  ++x_idx;
124  }
125  }
126  else
127  {
128  x.segment(x_idx, vertex->getDimension()) = vertex->getDataMap();
129  }
130  }
131 }
132 
134 {
136 
137  assert(x.size() == getParameterDimension());
138 
139  for (VertexInterface* vertex : getActiveVertices())
140  {
141  int x_idx = vertex->getVertexIdx();
142  if (vertex->hasFixedComponents())
143  {
144  for (int i = 0; i < vertex->getDimension(); ++i)
145  {
146  if (vertex->isFixedComponent(i)) continue;
147 
148  vertex->setData(i, x[x_idx]);
149  ++x_idx;
150  }
151  }
152  else
153  {
154  vertex->getDataRawMap() = x.segment(x_idx, vertex->getDimension());
155  }
156  }
157 }
158 
160 {
162 
163  assert(lb.size() == getParameterDimension());
164  assert(ub.size() == getParameterDimension());
165 
166  for (const VertexInterface* vertex : getActiveVertices())
167  {
168  if (vertex->getDimensionUnfixed() == vertex->getDimension())
169  {
170  lb.segment(vertex->getVertexIdx(), vertex->getDimension()) = vertex->getLowerBoundsMap();
171  ub.segment(vertex->getVertexIdx(), vertex->getDimension()) = vertex->getUpperBoundsMap();
172  }
173  else
174  {
175  int param_idx = 0;
176  for (int i = 0; i < vertex->getDimension(); ++i)
177  {
178  if (!vertex->isFixedComponent(i))
179  {
180  lb(vertex->getVertexIdx() + param_idx) = vertex->getLowerBounds()[i];
181  ub(vertex->getVertexIdx() + param_idx) = vertex->getUpperBounds()[i];
182  ++param_idx;
183  }
184  }
185  }
186  }
187 }
188 
190 {
192 
193  assert(lb.size() == getParameterDimension());
194  assert(ub.size() == getParameterDimension());
195 
196  for (VertexInterface* vertex : getActiveVertices())
197  {
198  if (vertex->getDimensionUnfixed() == vertex->getDimension())
199  {
200  vertex->setLowerBounds(lb.segment(vertex->getVertexIdx(), vertex->getDimension()));
201  vertex->setUpperBounds(ub.segment(vertex->getVertexIdx(), vertex->getDimension()));
202  }
203  else
204  {
205  int param_idx = 0;
206  for (int i = 0; i < vertex->getDimension(); ++i)
207  {
208  if (!vertex->isFixedComponent(i))
209  {
210  vertex->setLowerBound(i, lb(vertex->getVertexIdx() + param_idx));
211  vertex->setUpperBound(i, ub(vertex->getVertexIdx() + param_idx));
212  ++param_idx;
213  }
214  }
215  }
216  }
217 }
218 
219 double VertexSetInterface::getLowerBound(int idx)
220 {
222 
223  assert(idx < getParameterDimension());
224 
225  // TODO(roesmann) replace linear search strategy by a more efficient one
226  for (VertexInterface* vertex : getActiveVertices())
227  {
228  int vtx_idx = vertex->getVertexIdx();
229  if (vertex->getDimensionUnfixed() == vertex->getDimension())
230  {
231  if (vtx_idx + vertex->getDimension() > idx)
232  {
233  return vertex->getLowerBounds()[idx - vtx_idx];
234  }
235  }
236  else
237  {
238  int param_idx = 0;
239  for (int i = 0; i < vertex->getDimension(); ++i)
240  {
241  if (!vertex->isFixedComponent(i))
242  {
243  if (vtx_idx + param_idx == idx) return vertex->getLowerBounds()[i];
244  ++param_idx;
245  }
246  }
247  }
248  }
249  return CORBO_MAX_DBL;
250 }
251 
252 double VertexSetInterface::getUpperBound(int idx)
253 {
255 
256  assert(idx < getParameterDimension());
257 
258  // TODO(roesmann) replace linear search strategy by a more efficient one
259  for (VertexInterface* vertex : getActiveVertices())
260  {
261  int vtx_idx = vertex->getVertexIdx();
262  if (vertex->getDimensionUnfixed() == vertex->getDimension())
263  {
264  if (vtx_idx + vertex->getDimension() > idx)
265  {
266  return vertex->getUpperBounds()[idx - vtx_idx];
267  }
268  }
269  else
270  {
271  int param_idx = 0;
272  for (int i = 0; i < vertex->getDimension(); ++i)
273  {
274  if (!vertex->isFixedComponent(i))
275  {
276  if (vtx_idx + param_idx == idx) return vertex->getUpperBounds()[i];
277  ++param_idx;
278  }
279  }
280  }
281  }
282  return CORBO_MAX_DBL;
283 }
284 
285 void VertexSetInterface::setLowerBound(int idx, double lb)
286 {
288 
289  assert(idx < getParameterDimension());
290 
291  for (VertexInterface* vertex : getActiveVertices())
292  {
293  int vtx_idx = vertex->getVertexIdx();
294  if (vertex->getDimensionUnfixed() == vertex->getDimension())
295  {
296  if (vtx_idx + vertex->getDimension() > idx)
297  {
298  vertex->setLowerBound(idx - vtx_idx, lb);
299  return;
300  }
301  }
302  else
303  {
304  int param_idx = 0;
305  for (int i = 0; i < vertex->getDimension(); ++i)
306  {
307  if (!vertex->isFixedComponent(i))
308  {
309  if (vtx_idx + param_idx == idx)
310  {
311  vertex->setLowerBound(i, lb);
312  return;
313  }
314  ++param_idx;
315  }
316  }
317  }
318  }
319 }
320 
321 void VertexSetInterface::setUpperBound(int idx, double ub)
322 {
324 
325  assert(idx < getParameterDimension());
326 
327  for (VertexInterface* vertex : getActiveVertices())
328  {
329  int vtx_idx = vertex->getVertexIdx();
330  if (vertex->getDimensionUnfixed() == vertex->getDimension())
331  {
332  if (vtx_idx + vertex->getDimension() > idx)
333  {
334  vertex->setUpperBound(idx - vtx_idx, ub);
335  return;
336  }
337  }
338  else
339  {
340  int param_idx = 0;
341  for (int i = 0; i < vertex->getDimension(); ++i)
342  {
343  if (!vertex->isFixedComponent(i))
344  {
345  if (vtx_idx + param_idx == idx)
346  {
347  vertex->setUpperBound(i, ub);
348  return;
349  }
350  ++param_idx;
351  }
352  }
353  }
354  }
355 }
356 
358 {
360 
361  assert((int)increment.size() == getParameterDimension());
362 
363  for (VertexInterface* vertex : getActiveVertices())
364  {
365  if (vertex->getDimensionUnfixed() != 0) vertex->plusUnfixed(increment.segment(vertex->getVertexIdx(), vertex->getDimensionUnfixed()).data());
366  }
367 }
368 
369 void VertexSetInterface::applyIncrementNonFixed(int idx, double increment)
370 {
372 
373  assert(idx < getParameterDimension());
374 
375  for (VertexInterface* vertex : getActiveVertices())
376  {
377  int vtx_idx = vertex->getVertexIdx();
378  if (vertex->getDimensionUnfixed() == vertex->getDimension())
379  {
380  if (vtx_idx + vertex->getDimension() > idx)
381  {
382  vertex->plus(idx - vtx_idx, increment);
383  return;
384  }
385  }
386  else
387  {
388  int param_idx = 0;
389  for (int i = 0; i < vertex->getDimension(); ++i)
390  {
391  if (!vertex->isFixedComponent(i))
392  {
393  if (vtx_idx + param_idx == idx)
394  {
395  vertex->plus(i, increment);
396  return;
397  }
398  ++param_idx;
399  }
400  }
401  }
402  }
403 }
404 
406 {
408 
409  std::vector<VertexInterface*>& vertices = getActiveVertices();
410 
411  if (vertices.empty()) return;
412 
413  setVertexIdx(*vertices.front(), 0);
414  for (int i = 1; i < (int)vertices.size(); ++i)
415  {
416  setVertexIdx(*vertices[i], vertices[i - 1]->getVertexIdx() + vertices[i - 1]->getDimensionUnfixed());
417  }
418 }
419 
421 {
423 
424  std::vector<VertexInterface*>& vertices = getActiveVertices();
425 
426  if (vertices.empty()) return;
427 
428  for (VertexInterface* vtx : getActiveVertices()) vtx->clearConnectedEdges();
429 }
430 
432 {
433  for (VertexInterface* vertex : getActiveVertices()) vertex->push();
434 }
435 
437 {
438  if (keep_backup)
439  {
440  for (VertexInterface* vertex : getActiveVertices()) vertex->top();
441  }
442  else
443  {
444  for (VertexInterface* vertex : getActiveVertices()) vertex->pop();
445  }
446 }
447 
449 {
450  if (all)
451  {
452  for (VertexInterface* vertex : getActiveVertices())
453  {
454  vertex->clearBackups();
455  }
456  }
457  else
458  {
459  for (VertexInterface* vertex : getActiveVertices())
460  {
461  vertex->discardTop();
462  }
463  }
464 }
465 
466 // ############# VertexSet ##############
467 
468 std::vector<VertexInterface*>& VertexSet::getActiveVertices()
469 {
471  return _active_vertices;
472 }
473 
474 void VertexSet::getVertices(std::vector<VertexInterface*>& vertices)
475 {
476  vertices.clear();
477  for (const VertexInterface::Ptr& vertex : _vertices) vertices.push_back(vertex.get());
478 }
479 
480 VertexSet::VertexSet(std::initializer_list<VertexInterface::Ptr> vertices) { _vertices.insert(_vertices.end(), vertices.begin(), vertices.end()); }
481 
483 {
484  _active_vertices.clear();
485  _active_vertices.reserve(_vertices.size());
486 
487  for (VertexInterface::Ptr& vertex : _vertices)
488  {
489  if (!vertex->isFixed()) _active_vertices.push_back(vertex.get());
490  }
491 }
492 
493 void VertexSet::clear()
494 {
495  _vertices.clear();
496  setModified(true);
497 }
498 
499 } // namespace corbo
corbo::VertexSetInterface::getLowerBound
double getLowerBound(int idx)
Definition: vertex_set.cpp:241
corbo::VertexSet::getActiveVertices
std::vector< VertexInterface * > & getActiveVertices() override
Definition: vertex_set.cpp:490
corbo::VertexSet::clear
void clear() override
Definition: vertex_set.cpp:515
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::VertexSet::_vertices
std::vector< VertexInterface::Ptr > _vertices
Definition: vertex_set.h:153
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::restoreBackupParametersActiveVertices
void restoreBackupParametersActiveVertices(bool keep_backup)
Definition: vertex_set.cpp:458
corbo::VertexSetInterface::computeActiveVertices
virtual void computeActiveVertices()=0
corbo::VertexSetInterface::discardBackupParametersActiveVertices
void discardBackupParametersActiveVertices(bool all=false)
Definition: vertex_set.cpp:470
corbo::VertexSetInterface::getParameterVector
void getParameterVector(Eigen::Ref< Eigen::VectorXd > x)
Definition: vertex_set.cpp:129
corbo::VertexInterface
Generic interface class for vertices.
Definition: vertex_interface.h:75
corbo::VertexSet::_active_vertices
std::vector< VertexInterface * > _active_vertices
Definition: vertex_set.h:154
corbo::VertexSetInterface::setUpperBound
void setUpperBound(int idx, double ub)
Definition: vertex_set.cpp:343
corbo::VertexSet::computeActiveVertices
void computeActiveVertices() override
Definition: vertex_set.cpp:504
corbo::VertexInterface::Ptr
std::shared_ptr< VertexInterface > Ptr
Definition: vertex_interface.h:80
corbo::VertexSetInterface::getActiveVertices
virtual std::vector< VertexInterface * > & getActiveVertices()=0
x
Scalar * x
Definition: level1_cplx_impl.h:89
corbo::VertexSetInterface::computeVertexIndices
void computeVertexIndices()
Precompute vertex indices in the hyper-graph (e.g. for the Jacobian or Hessian structure)
Definition: vertex_set.cpp:427
corbo::VertexSetInterface::setParameterVector
void setParameterVector(const Eigen::Ref< const Eigen::VectorXd > &x)
Definition: vertex_set.cpp:155
corbo::VertexSetInterface::setParameterValue
void setParameterValue(int idx, double x)
Definition: vertex_set.cpp:93
int
return int(ret)+1
corbo::VertexSetInterface::setVertexIdx
void setVertexIdx(VertexInterface &vertex, int idx)
Definition: vertex_set.h:132
corbo::VertexSetInterface::clearConnectedEdges
void clearConnectedEdges()
Definition: vertex_set.cpp:442
Eigen::Ref
A matrix or vector expression mapping an existing expression.
Definition: Ref.h:192
corbo::VertexSetInterface::isModified
bool isModified() const
Definition: vertex_set.h:127
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::VertexSetInterface::getUpperBound
double getUpperBound(int idx)
Definition: vertex_set.cpp:274
corbo::VertexSetInterface::getParameterDimension
int getParameterDimension()
Definition: vertex_set.cpp:51
corbo::CORBO_MAX_DBL
constexpr const double CORBO_MAX_DBL
Maximum double value.
Definition: core/include/corbo-core/types.h:66
corbo::VertexSetInterface::applyIncrementNonFixed
void applyIncrementNonFixed(const Eigen::Ref< const Eigen::VectorXd > &increment)
Active vertices related methods.
Definition: vertex_set.cpp:379
corbo::VertexSet::getVertices
const std::vector< VertexInterface::Ptr > & getVertices()
Definition: vertex_set.h:145
corbo::VertexSet::VertexSet
VertexSet()=default
vertex_set.h
corbo::VertexSetInterface::setModified
void setModified(bool modified)
Definition: vertex_set.h:126
corbo::VertexSetInterface::backupParametersActiveVertices
void backupParametersActiveVertices()
Definition: vertex_set.cpp:453


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