Dynotree
Loading...
Searching...
No Matches
StateSpace.h
Go to the documentation of this file.
1
2#include <algorithm>
3#include <cmath>
4#include <cwchar>
5#include <iostream>
6#include <limits>
7#include <memory>
8#include <variant>
9#include <vector>
10
11#include <eigen3/Eigen/Core>
12#include <eigen3/Eigen/Dense>
13
14#include "dynotree_macros.h"
15
16namespace dynotree {
17
18inline Eigen::IOFormat __CleanFmt(4, 0, ", ", "\n", "[", "]");
19
20template <typename T, typename Scalar>
21void choose_split_dimension_default(const T &lb, const T &ub, int &ii,
22 Scalar &width) {
23 for (std::size_t i = 0; i < lb.size(); i++) {
24 Scalar dWidth = ub[i] - lb[i];
25 if (dWidth > width) {
26 ii = i;
27 width = dWidth;
28 }
29 }
30}
31
32template <typename T, typename T2, typename Scalar>
33void choose_split_dimension_weights(const T &lb, const T &ub, const T2 &weight,
34 int &ii, Scalar &width) {
35 for (std::size_t i = 0; i < lb.size(); i++) {
36 Scalar dWidth = (ub[i] - lb[i]) * weight(i);
37 // Scalar dWidth = (ub[i] - lb[i]);
38 if (dWidth > width) {
39 ii = i;
40 width = dWidth;
41 }
42 }
43}
44
45template <typename Scalar, int Dimensions = -1> struct RnL1 {
46
47 using cref_t = const Eigen::Ref<const Eigen::Matrix<Scalar, Dimensions, 1>> &;
48 using ref_t = Eigen::Ref<Eigen::Matrix<Scalar, Dimensions, 1>>;
49
50 Eigen::Matrix<Scalar, Dimensions, 1> lb;
51 Eigen::Matrix<Scalar, Dimensions, 1> ub;
52 Eigen::Matrix<Scalar, Dimensions, 1> weights;
53 bool use_weights = false;
54
55 void set_bounds(cref_t lb_, cref_t ub_) {
56 lb = lb_;
57 ub = ub_;
58 }
59
60 void set_weights(cref_t weights_) {
61 assert(weights_.size() == weights.size());
62 weights = weights_;
63 use_weights = true;
64 }
65
66 void print(std::ostream &out) {
67 out << "State Space: RnL1" << " RuntimeDIM: " << lb.size()
68 << " CompileTimeDIM: " << Dimensions << std::endl
69 << "lb: " << lb.transpose().format(__CleanFmt) << "\n"
70 << "ub: " << ub.transpose().format(__CleanFmt) << std::endl;
71 }
72
73 bool check_bounds(cref_t x) const {
74
75 CHECK_PRETTY_DYNOTREE__(lb.size() == x.size());
76 CHECK_PRETTY_DYNOTREE__(ub.size() == x.size());
77
78 for (size_t i = 0; i < x.size(); i++) {
79 if (x(i) < lb(i)) {
80 return false;
81 }
82 if (x(i) > ub(i)) {
83 return false;
84 }
85 }
86 return true;
87 }
88
89 inline void sample_uniform(ref_t x) const {
90 x.setRandom();
91 x.array() += 1;
92 x /= .2;
93 x = lb + (ub - lb).cwiseProduct(x);
94 }
95
96 void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const {
97 assert(t >= 0);
98 assert(t <= 1);
99 out = from + t * (to - from);
100 }
101
103 Scalar &width) const {
104 if (use_weights)
106 else
108 }
109
110 inline Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const {
111
112 Scalar d = 0;
113 Scalar dist = 0;
114
115 if constexpr (Dimensions == Eigen::Dynamic) {
116
117 assert(x.size());
118 assert(ub.size());
119 assert(lb.size());
120 assert(x.size() == ub.size());
121 assert(x.size() == lb.size());
122
123 for (size_t i = 0; i < x.size(); i++) {
124 Scalar xx = std::max(lb(i), std::min(ub(i), x(i)));
125 Scalar dif = xx - x(i);
126 dist += std::abs(dif) * (use_weights ? weights(i) : 1.);
127 }
128 } else {
129 for (size_t i = 0; i < Dimensions; i++) {
130 Scalar xx = std::max(lb(i), std::min(ub(i), x(i)));
131 Scalar dif = xx - x(i);
132 dist += std::abs(dif) * (use_weights ? weights(i) : 1.);
133 }
134 }
135 return dist;
136 }
137
138 inline Scalar distance(cref_t x, cref_t y) const {
139
140 assert(x.size());
141 assert(y.size());
142
143 if (use_weights)
144 return (x - y).cwiseAbs().cwiseProduct(weights).sum();
145 else
146 return (x - y).cwiseAbs().sum();
147 }
148};
149
150template <typename Scalar> struct Time {
151
152 using cref_t = const Eigen::Ref<const Eigen::Matrix<Scalar, 1, 1>> &;
153 using ref_t = Eigen::Ref<Eigen::Matrix<Scalar, 1, 1>>;
154 Eigen::Matrix<Scalar, 1, 1> lb;
155 Eigen::Matrix<Scalar, 1, 1> ub;
156
157 bool check_bounds(cref_t x) const {
158
159 CHECK_PRETTY_DYNOTREE__(lb.size() == x.size());
160 CHECK_PRETTY_DYNOTREE__(ub.size() == x.size());
161
162 for (size_t i = 0; i < x.size(); i++) {
163 if (x(i) < lb(i)) {
164 return false;
165 }
166 if (x(i) > ub(i)) {
167 return false;
168 }
169 }
170 return true;
171 }
172
173 void print(std::ostream &out) {
174 out << "Time: " << lb(0) << " " << ub(0) << std::endl;
175 }
176
177 void sample_uniform(ref_t x) const {
178 assert(lb(0) >= 0);
179 x(0) = double(rand()) / RAND_MAX * (ub(0) - lb(0)) + lb(0);
180 }
181
182 void set_bounds(cref_t lb_, cref_t ub_) {
183 assert(lb_.size() == 1);
184 assert(ub_.size() == 1);
185 assert(ub(0) >= lb(0));
186 lb = lb_;
187 ub = ub_;
188 }
189
190 void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const {
191
192 assert(t >= 0);
193 assert(t <= 1);
194 assert(to(0) >= from(0));
195
196 Eigen::Matrix<Scalar, 1, 1> d = to - from;
197 out = from + t * d;
198 }
199
200 void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width) {
202 }
203
204 // if the ub is small, return inf
205 inline Scalar distance_to_rectangle(cref_t x, cref_t lb, cref_t ub) const {
206
207 if (ub(0) < x(0)) {
208 return std::numeric_limits<Scalar>::max();
209 } else if (x(0) > lb(0)) {
210 return 0;
211 } else {
212 return lb(0) - x(0);
213 }
214 }
215
216 // from x to y
217 // if y is smaller, return inf
218 inline Scalar distance(cref_t x, cref_t y) const {
219
220 if (y(0) < x(0)) {
221 return std::numeric_limits<Scalar>::max();
222 } else {
223 return y(0) - x(0);
224 }
225 }
226};
227
228template <typename Scalar> struct SO2 {
229
230 using cref_t = const Eigen::Ref<const Eigen::Matrix<Scalar, 1, 1>> &;
231 using ref_t = Eigen::Ref<Eigen::Matrix<Scalar, 1, 1>>;
232
233 double weight = 1.0;
234 bool use_weights = false;
235
236 bool check_bounds(cref_t x) const {
237 for (size_t i = 0; i < x.size(); i++) {
238 if (x(i) < -M_PI) {
239 return false;
240 }
241 if (x(i) > +M_PI) {
242 return false;
243 }
244 }
245 return true;
246 }
247
248 void print(std::ostream &out) {
249 out << "SO2: " << std::endl
250 << "weight: " << weight << std::endl
251 << "use_weights: " << use_weights << std::endl;
252 }
253
254 void sample_uniform(ref_t x) const {
255
256 x(0) = (double(rand()) / (RAND_MAX + 1.)) * 2. * M_PI - M_PI;
257 }
258
259 void set_bounds(cref_t lb_, cref_t ub_) {
260
261 THROW_PRETTY_DYNOTREE("so2 has no bounds");
262 }
263
264 void set_weights(cref_t weights_) {
265 assert(weights_.size() == 1);
266 weight = weights_(0);
267 use_weights = true;
268 }
269
270 void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const {
271
272 assert(t >= 0);
273 assert(t <= 1);
274
275 Eigen::Matrix<Scalar, 1, 1> d = to - from;
276
277 if (d(0) > M_PI) {
278 d(0) -= 2 * M_PI;
279 } else if (d(0) < -M_PI) {
280 d(0) += 2 * M_PI;
281 }
282
283 out = from + t * d;
284
285 if (out(0) > M_PI) {
286 out(0) -= 2 * M_PI;
287 } else if (out(0) < -M_PI) {
288 out(0) += 2 * M_PI;
289 }
290 }
291
292 void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width) {
293 choose_split_dimension_default(lb, ub, ii, width);
294 }
295
296 inline Scalar distance_to_rectangle(cref_t x, cref_t lb, cref_t ub) const {
297
298 assert(x(0) >= -M_PI);
299 assert(x(0) <= M_PI);
300
301 assert(lb(0) >= -M_PI);
302 assert(lb(0) <= M_PI);
303
304 assert(ub(0) >= -M_PI);
305 assert(ub(0) <= M_PI);
306
307 if (x(0) >= lb(0) && x(0) <= ub(0)) {
308 return 0;
309 } else if (x(0) > ub(0)) {
310 Scalar d1 = x(0) - ub(0);
311 Scalar d2 = lb(0) - (x(0) - 2 * M_PI);
312 assert(d2 >= 0);
313 assert(d1 >= 0);
314 return std::min(d1, d2) * (use_weights ? weight : 1.);
315 } else if (x(0) < lb(0)) {
316 Scalar d1 = lb(0) - x(0);
317 Scalar d2 = (x(0) + 2 * M_PI) - ub(0);
318 assert(d2 >= 0);
319 assert(d1 >= 0);
320 return std::min(d1, d2) * (use_weights ? weight : 1.);
321 } else {
322 assert(false);
323 return 0;
324 }
325 }
326
327 inline Scalar distance(cref_t x, cref_t y) const {
328
329 assert(x(0) >= -M_PI);
330 assert(y(0) >= -M_PI);
331
332 assert(x(0) <= M_PI);
333 assert(y(0) <= M_PI);
334
335 Scalar dif = x(0) - y(0);
336 if (dif > M_PI) {
337 dif -= 2 * M_PI;
338 } else if (dif < -M_PI) {
339 dif += 2 * M_PI;
340 }
341 Scalar out = std::abs(dif);
342 return out * (use_weights ? weight : 1.);
343 }
344};
345
346template <typename Scalar> struct SO2Squared {
347
348 using cref_t = const Eigen::Ref<const Eigen::Matrix<Scalar, 1, 1>> &;
349 using ref_t = Eigen::Ref<Eigen::Matrix<Scalar, 1, 1>>;
350
351 Eigen::Matrix<Scalar, 1, 1> lb;
352 Eigen::Matrix<Scalar, 1, 1> ub;
353
355
356 void print(std::ostream &out) { out << "SO2Squared: " << std::endl; }
357
358 bool check_bounds(cref_t x) const {
359 for (size_t i = 0; i < x.size(); i++) {
360 if (x(i) < -M_PI) {
361 return false;
362 }
363 if (x(i) > +M_PI) {
364 return false;
365 }
366 }
367 return true;
368 }
369
370 inline void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const {
371 so2.interpolate(from, to, t, out);
372 }
373
374 void set_weights(cref_t weights_) {
375 THROW_PRETTY_DYNOTREE("so2 weights not implemented");
376 }
377
378 inline void sample_uniform(ref_t x) const { so2.sample_uniform(x); }
379
380 inline void set_bounds(cref_t lb_, cref_t ub_) {
381
382 THROW_PRETTY_DYNOTREE("so2 has no bounds");
383 }
384
385 inline void choose_split_dimension(cref_t lb, cref_t ub, int &ii,
386 Scalar &width) {
388 }
389
390 inline Scalar distance_to_rectangle(cref_t x, cref_t lb, cref_t ub) const {
391
392 Scalar d = so2.distance_to_rectangle(x, lb, ub);
393 return d * d;
394 }
395
396 inline Scalar distance(cref_t x, cref_t y) const {
397
398 Scalar d = so2.distance(x, y);
399 return d * d;
400 }
401};
402
403template <typename Scalar, int Dimensions = -1> struct RnSquared {
404
405 using cref_t = const Eigen::Ref<const Eigen::Matrix<Scalar, Dimensions, 1>> &;
406 using ref_t = Eigen::Ref<Eigen::Matrix<Scalar, Dimensions, 1>>;
407 using vec_t = Eigen::Matrix<Scalar, Dimensions, 1>;
408
409 Eigen::Matrix<Scalar, Dimensions, 1> lb;
410 Eigen::Matrix<Scalar, Dimensions, 1> ub;
412 bool use_weights = false;
413
414 void print(std::ostream &out) {
415 out << "State Space: RnSquared" << " RuntimeDIM: " << lb.size()
416 << " CompileTimeDIM: " << Dimensions << std::endl
417 << "lb: " << lb.transpose().format(__CleanFmt) << "\n"
418 << "ub: " << ub.transpose().format(__CleanFmt) << std::endl;
419 }
420
421 bool check_bounds(cref_t x) const {
422
423 CHECK_PRETTY_DYNOTREE__(lb.size() == x.size());
424 CHECK_PRETTY_DYNOTREE__(ub.size() == x.size());
425
426 for (size_t i = 0; i < x.size(); i++) {
427 if (x(i) < -M_PI) {
428 return false;
429 }
430 if (x(i) > +M_PI) {
431 return false;
432 }
433 }
434 return true;
435 }
436
437 void set_weights(cref_t weights_) {
438 // assert(weights_.size() == weights.size());
439 weights = weights_;
440 use_weights = true;
441 }
442
443 void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const {
444 assert(t >= 0);
445 assert(t <= 1);
446 out = from + t * (to - from);
447 }
448
449 void set_bounds(cref_t lb_, cref_t ub_) {
450 lb = lb_;
451 ub = ub_;
452 }
453
455 Scalar &width) const {
456 if (use_weights)
458 else
460 }
461
462 void sample_uniform(ref_t x) const {
463 x.setRandom(); // [-1,1]
464 x.array() += 1.; // [0,2]
465 x /= .2; // [0,1]
466 x = lb + (ub - lb).cwiseProduct(x);
467 }
468
469 inline Scalar distance_to_rectangle(cref_t x, cref_t lb, cref_t ub) const {
470
471 Scalar d = 0;
472 Scalar dist = 0;
473
474 if constexpr (Dimensions == Eigen::Dynamic) {
475
476 assert(x.size());
477 assert(ub.size());
478 assert(lb.size());
479 assert(x.size() == ub.size());
480 assert(x.size() == lb.size());
481
482 for (size_t i = 0; i < x.size(); i++) {
483 Scalar xx = std::max(lb(i), std::min(ub(i), x(i)));
484 Scalar dif = xx - x(i);
485 dist += dif * dif * (use_weights ? weights(i) * weights(i) : 1.);
486 }
487 } else {
488 for (size_t i = 0; i < Dimensions; i++) {
489 Scalar xx = std::max(lb(i), std::min(ub(i), x(i)));
490 Scalar dif = xx - x(i);
491 dist += dif * dif * (use_weights ? weights(i) * weights(i) : 1.);
492 }
493 }
494 return dist;
495 }
496
497 inline Scalar distance(cref_t &x, cref_t &y) const {
498
499 assert(x.size());
500 assert(y.size());
501
502 if (use_weights)
503 return (x - y).cwiseProduct(weights).squaredNorm();
504 else
505 return (x - y).squaredNorm();
506 }
507};
508
509template <typename Scalar, int Dimensions = -1> struct Rn {
510 using cref_t = const Eigen::Ref<const Eigen::Matrix<Scalar, Dimensions, 1>> &;
511 using ref_t = Eigen::Ref<Eigen::Matrix<Scalar, Dimensions, 1>>;
512 using vec_t = Eigen::Matrix<Scalar, Dimensions, 1>;
513 using DIM = std::integral_constant<int, Dimensions>;
514
516 Eigen::Matrix<Scalar, Dimensions, 1> lb;
517 Eigen::Matrix<Scalar, Dimensions, 1> ub;
519 bool use_weights = false;
520
521 void print(std::ostream &out) {
522 out << "State Space: Rn" << " RuntimeDIM: " << lb.size()
523 << " CompileTimeDIM: " << Dimensions << std::endl
524 << "lb: " << lb.transpose().format(__CleanFmt) << "\n"
525 << "ub: " << ub.transpose().format(__CleanFmt) << std::endl;
526 }
527
528 void set_weights(cref_t weights_) {
529 weights = weights_;
530 use_weights = true;
532 }
533
534 void set_bounds(cref_t lb_, cref_t ub_) {
535 lb = lb_;
536 ub = ub_;
537 }
538
539 bool check_bounds(cref_t x) const {
540
541 CHECK_PRETTY_DYNOTREE__(lb.size() == x.size());
542 CHECK_PRETTY_DYNOTREE__(ub.size() == x.size());
543
544 for (size_t i = 0; i < x.size(); i++) {
545 if (x(i) < lb(i)) {
546 return false;
547 }
548 if (x(i) > ub(i)) {
549 return false;
550 }
551 }
552 return true;
553 }
554
555 inline void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const {
556 assert(t >= 0);
557 assert(t <= 1);
558 out = from + t * (to - from);
559 }
560
561 inline void sample_uniform(ref_t x) const {
562 x.setRandom();
563 x.array() += 1.;
564 x /= 2.;
565 x = lb + (ub - lb).cwiseProduct(x);
566 }
567
568 inline void choose_split_dimension(cref_t lb, cref_t ub, int &ii,
569 Scalar &width) const {
570 if (use_weights)
572 else
574 }
575
576 inline Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const {
577
578 Scalar d = rn_squared.distance_to_rectangle(x, lb, ub);
579 return std::sqrt(d);
580 };
581
582 inline Scalar distance(cref_t &x, cref_t &y) const {
583 Scalar d = rn_squared.distance(x, y);
584 return std::sqrt(d);
585 }
586};
587
588struct Vpure {
589
590 using Scalar = double;
591
592 using cref_t = const Eigen::Ref<const Eigen::Matrix<double, -1, 1>> &;
593 using ref_t = Eigen::Ref<Eigen::Matrix<double, -1, 1>>;
594
596
597 virtual void set_bounds(cref_t lb_, cref_t ub_) = 0;
598
599 virtual inline void interpolate(cref_t from, cref_t to, Scalar t,
600 ref_t out) const = 0;
601
602 virtual inline void sample_uniform(ref_t x) const = 0;
603
604 virtual inline void choose_split_dimension(cref_t lb, cref_t ub, int &ii,
605 Scalar &width) = 0;
606
608 cref_t &ub) const = 0;
609
610 virtual inline Scalar distance(cref_t &x, cref_t &y) const = 0;
611};
612
613struct S4irtual : Vpure {
614
615 using Scalar = double;
616
617 using cref_t = const Eigen::Ref<const Eigen::Matrix<double, -1, 1>> &;
618 using ref_t = Eigen::Ref<Eigen::Matrix<double, -1, 1>>;
619
621
622 void set_bounds(cref_t lb_, cref_t ub_) override { rn.set_bounds(lb_, ub_); }
623
624 virtual inline void interpolate(cref_t from, cref_t to, Scalar t,
625 ref_t out) const override {
626 rn.interpolate(from, to, t, out);
627 }
628
629 virtual inline void sample_uniform(ref_t x) const override {
631 }
632
633 virtual inline void choose_split_dimension(cref_t lb, cref_t ub, int &ii,
634 Scalar &width) override {
635 rn.choose_split_dimension(lb, ub, ii, width);
636 }
637
639 cref_t &ub) const override {
640 return rn.distance_to_rectangle(x, lb, ub);
641 };
642
643 virtual inline Scalar distance(cref_t &x, cref_t &y) const override {
644 return rn.distance(x, y);
645 }
646};
647
649
650 using Scalar = double;
651
652 using cref_t = const Eigen::Ref<const Eigen::Matrix<double, -1, 1>> &;
653 using ref_t = Eigen::Ref<Eigen::Matrix<double, -1, 1>>;
654
655 std::shared_ptr<Vpure> s4;
656
657 void set_bounds(cref_t lb_, cref_t ub_) { s4->set_bounds(lb_, ub_); }
658
659 inline void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const {
660 s4->interpolate(from, to, t, out);
661 }
662
663 inline void sample_uniform(ref_t x) const { s4->sample_uniform(x); }
664
665 inline void choose_split_dimension(cref_t lb, cref_t ub, int &ii,
666 Scalar &width) {
667 s4->choose_split_dimension(lb, ub, ii, width);
668 }
669
670 inline Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const {
671 return s4->distance_to_rectangle(x, lb, ub);
672 };
673
674 inline Scalar distance(cref_t &x, cref_t &y) const {
675 return s4->distance(x, y);
676 }
677};
678
679template <int id> struct AddOneOrKeepMinusOne {
680 // using value = id + 1;
681 static constexpr int value = id + 1;
682};
683
684template <> struct AddOneOrKeepMinusOne<-1> {
685 static constexpr int value = -1;
686};
687
688// template <int id> struct print_num;
689
690// Dimensions, without including time. E.g. R^2 x Time is DIM=2
691template <typename Scalar, int Dimensions> struct RnTime {
692
693 // using effective_dim = typename AddOneOrKeepMinusOne<Dimensions>::value;
694
696 using cref_t =
697 const Eigen::Ref<const Eigen::Matrix<Scalar, effective_dim, 1>> &;
698 using ref_t = Eigen::Ref<Eigen::Matrix<Scalar, effective_dim, 1>>;
699
702
703 double lambda_t = 1.;
704 double lambda_r = 1.;
705
706 void set_lambda(double lambda_t_, double lambda_r_) {
707 assert(lambda_t_ >= 0);
708 assert(lambda_r_ >= 0);
709 lambda_t = lambda_t_;
710 lambda_r = lambda_r_;
711 }
712
713 void print(std::ostream &out) {
714 out << "RnTime: " << std::endl;
715 time.print(out);
716 rn.print(out);
717 }
718
719 void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const {
720 assert(t >= 0);
721 assert(t <= 1);
722
723 time.interpolate(from.template tail<1>(), to.template tail<1>(), t,
724 out.template tail<1>());
725
726 if constexpr (Dimensions == Eigen::Dynamic) {
727 size_t n = from.size() - 1;
728 rn.interpolate(from.head(n), to.head(n), t, out.head(n));
729
730 }
731
732 else {
733 rn.interpolate(from.template head<Dimensions>(),
734 to.template head<Dimensions>(), t,
735 out.template head<Dimensions>());
736 }
737 }
738
739 void set_bounds(cref_t lb_, cref_t ub_) {
740
741 assert(lb_.size() == ub_.size());
742
743 time.set_bounds(lb_.template tail<1>(), ub_.template tail<1>());
744
745 if constexpr (Dimensions == Eigen::Dynamic) {
746 size_t n = lb_.size() - 1;
747 rn.set_bounds(lb_.head(n), ub_.head(n));
748 } else {
749 rn.set_bounds(lb_.template head<Dimensions>(),
750 ub_.template head<Dimensions>());
751 }
752 }
753
755 Scalar &width) const {
756 choose_split_dimension_default(lb, ub, ii, width);
757 }
758
759 void sample_uniform(ref_t x) const {
760
761 time.sample_uniform(x.template tail<1>());
762
763 if constexpr (Dimensions == Eigen::Dynamic) {
764 size_t n = x.size() - 1;
765 rn.sample_uniform(x.head(n));
766 } else {
767 rn.sample_uniform(x.template head<Dimensions>());
768 }
769 }
770
771 inline Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const {
772
773 double dt = time.distance_to_rectangle(
774 x.template tail<1>(), lb.template tail<1>(), ub.template tail<1>());
775 double dr;
776
777 if (dt == std::numeric_limits<Scalar>::max()) {
778 return std::numeric_limits<Scalar>::max();
779 }
780
781 if constexpr (Dimensions == Eigen::Dynamic) {
782 size_t n = x.size() - 1;
783 dr = rn.distance_to_rectangle(x.head(n), lb.head(n), ub.head(n));
784 } else {
785 dr = rn.distance_to_rectangle(x.template head<Dimensions>(),
786 lb.template head<Dimensions>(),
787 ub.template head<Dimensions>());
788 }
789 return lambda_r * dr + lambda_t * dt;
790 }
791
792 inline Scalar distance(cref_t x, cref_t y) const {
793
794 double dt = time.distance(x.template tail<1>(), y.template tail<1>());
795 double dr;
796
797 if (dt == std::numeric_limits<Scalar>::max()) {
798 return std::numeric_limits<Scalar>::max();
799 }
800
801 if constexpr (Dimensions == Eigen::Dynamic) {
802 size_t n = x.size() - 1;
803 dr = rn.distance(x.head(n), y.head(n));
804 } else {
805 dr = rn.distance(x.template head<Dimensions>(),
806 y.template head<Dimensions>());
807 }
808 return lambda_r * dr + lambda_t * dt;
809 }
810};
811
812template <typename Scalar> struct R2SO2 {
813
814 using cref_t = const Eigen::Ref<const Eigen::Matrix<Scalar, 3, 1>> &;
815 using ref_t = Eigen::Ref<Eigen::Matrix<Scalar, 3, 1>>;
816 using vec_t = Eigen::Matrix<Scalar, 3, 1>;
817
818 using cref2_t = const Eigen::Ref<const Eigen::Matrix<Scalar, 2, 1>> &;
819 using ref2_t = Eigen::Ref<Eigen::Matrix<Scalar, 2, 1>>;
820
821 void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width) {
822 if (use_weights)
823 choose_split_dimension_weights(lb, ub, weights, ii, width);
824 else
825 choose_split_dimension_default(lb, ub, ii, width);
826 }
827
828 Scalar angular_weight = 1.0;
829
832
833 void print(std::ostream &out) {
834 out << "R2SO2: " << std::endl;
835 l2.print(out);
836 so2.print(out);
837 }
838
840 bool use_weights = false;
841
842 void set_weights(cref_t wr2, double wso2) {
843 weights.template head<2>() = wr2;
844 weights(2) = wso2;
845 l2.set_weights(wr2);
846 so2.set_weights(wso2);
847 }
848
849 void set_bounds(cref2_t lb_, cref2_t ub_) { l2.set_bounds(lb_, ub_); }
850
851 bool check_bounds(cref_t x) const {
852 return l2.check_bounds(x.template head<2>()) &&
853 so2.check_bounds(x.template tail<1>());
854 }
855
856 inline void sample_uniform(ref_t x) const {
857 l2.sample_uniform(x.template head<2>());
858 so2.sample_uniform(x.template tail<1>());
859 }
860
861 inline void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const {
862 assert(t >= 0);
863 assert(t <= 1);
864 l2.interpolate(from.template head<2>(), to.template head<2>(), t,
865 out.template head<2>());
866 so2.interpolate(from.template tail<1>(), to.template tail<1>(), t,
867 out.template tail<1>());
868 }
869
870 inline Scalar distance_to_rectangle(cref_t x, cref_t lb, cref_t ub) const {
871
872 Scalar d1 = l2.distance_to_rectangle(
873 x.template head<2>(), lb.template head<2>(), ub.template head<2>());
874 Scalar d2 = so2.distance_to_rectangle(
875 x.template tail<1>(), lb.template tail<1>(), ub.template tail<1>());
876 return d1 + angular_weight * d2;
877 }
878
879 inline Scalar distance(cref_t x, cref_t y) const {
880
881 Scalar d1 = l2.distance(x.template head<2>(), y.template head<2>());
882 Scalar d2 = so2.distance(x.template tail<1>(), y.template tail<1>());
883 return d1 + angular_weight * d2;
884 };
885};
886
887template <typename Scalar> struct R2SO2Squared {
888
889 using cref_t = const Eigen::Ref<const Eigen::Matrix<Scalar, 3, 1>> &;
890 using ref_t = Eigen::Ref<Eigen::Matrix<Scalar, 3, 1>>;
891
892 using cref2_t = const Eigen::Ref<const Eigen::Matrix<Scalar, 2, 1>> &;
893 using ref2_t = Eigen::Ref<Eigen::Matrix<Scalar, 2, 1>>;
894
895 void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width) {
896 choose_split_dimension_default(lb, ub, ii, width);
897 }
898
899 Scalar angular_weight = 1.0;
900
903
904 void print(std::ostream &out) {
905 out << "R2SO2Squared: " << std::endl;
906 rn_squared.print(out);
907 so2squared.print(out);
908 }
909
910 void set_bounds(cref2_t lb_, cref2_t ub_) { rn_squared.set_bounds(lb_, ub_); }
911
912 void sample_uniform(ref_t x) const {
913 rn_squared.sample_uniform(x.template head<2>());
914 so2squared.sample_uniform(x.template tail<1>());
915 }
916
917 inline Scalar distance_to_rectangle(cref_t x, cref_t lb, cref_t ub) const {
918
920 x.template head<2>(), lb.template head<2>(), ub.template head<2>());
921 Scalar d2 = so2squared.distance_to_rectangle(
922 x.template tail<1>(), lb.template tail<1>(), ub.template tail<1>());
923 return d1 + angular_weight * d2;
924 }
925
926 inline Scalar distance(cref_t x, cref_t y) const {
927
928 Scalar d1 = rn_squared.distance(x.template head<2>(), y.template head<2>());
929 Scalar d2 = so2squared.distance(x.template tail<1>(), y.template tail<1>());
930 return d1 + angular_weight * d2;
931 };
932};
933
934template <typename Scalar> struct SO3Squared {
935
936 using cref_t = const Eigen::Ref<const Eigen::Matrix<Scalar, 4, 1>> &;
937 using ref_t = Eigen::Ref<Eigen::Matrix<Scalar, 4, 1>>;
938
940
941 void sample_uniform(ref_t x) const {
942 x = Eigen::Quaterniond().UnitRandom().coeffs();
943 }
944
945 bool check_bounds(cref_t x) const { return std::abs(x.norm() - 1) < 1e-6; }
946
947 void print(std::ostream &out) {
948 out << "SO3Squared: " << std::endl;
949 rn_squared.print(out);
950 }
951 void set_weights(cref_t weights_) {
952 THROW_PRETTY_DYNOTREE("so3 weights not implemented");
953 }
954
955 void set_bounds(cref_t lb_, cref_t ub_) {
956
957 THROW_PRETTY_DYNOTREE("so3 has no bounds");
958 }
959
960 void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const {
961 THROW_PRETTY_DYNOTREE("so3 has no interpolate implmented");
962 }
963
964 void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width) {
965 choose_split_dimension_default(lb, ub, ii, width);
966 }
967
968 inline Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const {
969
970 assert(std::abs(x.norm() - 1) < 1e-6);
971
972 Scalar d1 = rn_squared.distance_to_rectangle(x, lb, ub);
973 Scalar d2 = rn_squared.distance_to_rectangle(-1. * x, lb, ub);
974 return std::min(d1, d2);
975 }
976
977 inline Scalar distance(cref_t x, cref_t y) const {
978
979 assert(x.size() == 4);
980 assert(y.size() == 4);
981
982 assert(std::abs(x.norm() - 1) < 1e-6);
983 assert(std::abs(y.norm() - 1) < 1e-6);
984
985 Scalar d1 = rn_squared.distance(x, y);
986 Scalar d2 = rn_squared.distance(-x, y);
987 return std::min(d1, d2);
988 };
989};
990
991template <typename Scalar> struct SO3 {
992
993 using cref_t = const Eigen::Ref<const Eigen::Matrix<Scalar, 4, 1>> &;
994 using ref_t = Eigen::Ref<Eigen::Matrix<Scalar, 4, 1>>;
995
997
998 void print(std::ostream &out) {
999 out << "SO3: " << std::endl;
1000 so3squared.print(out);
1001 }
1002
1003 bool check_bounds(cref_t x) const { return std::abs(x.norm() - 1) < 1e-6; }
1004
1005 void sample_uniform(ref_t x) const { so3squared.sample_uniform(x); }
1006
1007 void set_bounds(cref_t lb_, cref_t ub_) {
1008 THROW_PRETTY_DYNOTREE("so3 has no bounds");
1009 }
1010
1011 void set_weights(cref_t weights_) {
1012 THROW_PRETTY_DYNOTREE("so3 weights not implemented");
1013 }
1014
1015 void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width) {
1016 choose_split_dimension_default(lb, ub, ii, width);
1017 }
1018
1019 void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const {
1020 out = Eigen::Quaterniond(from).slerp(t, Eigen::Quaterniond(to)).coeffs();
1021 }
1022
1023 inline Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const {
1024
1025 return std::sqrt(so3squared.distance_to_rectangle(x, lb, ub));
1026 }
1027
1028 inline Scalar distance(cref_t x, cref_t y) const {
1029
1030 return std::sqrt(so3squared.distance(x, y));
1031 };
1032};
1033
1034// Rigid Body: Pose and Velocities
1035template <typename Scalar> struct R9SO3Squared {};
1036
1037// SE3
1038template <typename Scalar> struct R3SO3Squared {
1039
1040 using cref_t = const Eigen::Ref<const Eigen::Matrix<Scalar, 7, 1>> &;
1041 using ref_t = Eigen::Ref<Eigen::Matrix<Scalar, 7, 1>>;
1042 using cref3_t = const Eigen::Ref<const Eigen::Matrix<Scalar, 3, 1>> &;
1043
1044 void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width) {
1045 choose_split_dimension_default(lb, ub, ii, width);
1046 }
1047
1050
1051 void print(std::ostream &out) {
1052 out << "R3SO3Squared: " << std::endl;
1053 l2.print(out);
1054 so3.print(out);
1055 }
1056 void set_bounds(cref3_t lb_, cref3_t ub_) { l2.set_bounds(lb_, ub_); }
1057
1058 inline void sample_uniform(cref3_t lb, cref3_t ub, ref_t x) const {
1059 l2.sample_uniform(x.template head<3>());
1060 so3.sample_uniform(x.template tail<4>());
1061 }
1062
1063 inline Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const {
1064
1065 Scalar d1 = l2.distance_to_rectangle(
1066 x.template head<3>(), lb.template head<3>(), ub.template head<3>());
1067
1068 Scalar d2 = so3.distance_to_rectangle(
1069 x.template tail<4>(), lb.template tail<4>(), ub.template tail<4>());
1070
1071 return d1 + d2;
1072 }
1073
1074 inline Scalar distance(cref_t x, cref_t y) const {
1075
1076 Scalar d1 = l2.distance(x.template head<3>(), y.template head<3>());
1077 Scalar d2 = so3.distance(x.template tail<4>(), y.template tail<4>());
1078 return d1 + d2;
1079 };
1080};
1081
1082template <typename Scalar> struct R3SO3 {
1083
1084 using cref_t = const Eigen::Ref<const Eigen::Matrix<Scalar, 7, 1>> &;
1085 using ref_t = Eigen::Ref<Eigen::Matrix<Scalar, 7, 1>>;
1086
1087 using cref3_t = const Eigen::Ref<const Eigen::Matrix<Scalar, 3, 1>> &;
1088 using ref3_t = Eigen::Ref<Eigen::Matrix<Scalar, 3, 1>>;
1089
1090 void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width) {
1091 choose_split_dimension_default(lb, ub, ii, width);
1092 }
1093
1094 void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const {
1095 l2.interpolate(from.template head<3>(), to.template head<3>(), t,
1096 out.template head<3>());
1097 so3.interpolate(from.template tail<4>(), to.template tail<4>(), t,
1098 out.template tail<4>());
1099 }
1100
1103
1104 void print(std::ostream &out) {
1105 out << "R3SO3: " << std::endl;
1106 l2.print(out);
1107 so3.print(out);
1108 }
1109
1110 void set_bounds(cref3_t lb_, cref3_t ub_) { l2.set_bounds(lb_, ub_); }
1111
1112 void sample_uniform(ref_t x) const {
1113 l2.sample_uniform(x.template head<3>());
1114 so3.sample_uniform(x.template tail<4>());
1115 }
1116
1117 inline Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const {
1118
1119 Scalar d1 = l2.distance_to_rectangle(
1120 x.template head<3>(), lb.template head<3>(), ub.template head<3>());
1121
1122 Scalar d2 = so3.distance_to_rectangle(
1123 x.template tail<4>(), lb.template tail<4>(), ub.template tail<4>());
1124
1125 return d1 + d2;
1126 }
1127
1128 inline Scalar distance(cref_t x, cref_t y) const {
1129
1130 Scalar d1 = l2.distance(x.template head<3>(), y.template head<3>());
1131 Scalar d2 = so3.distance(x.template tail<4>(), y.template tail<4>());
1132 return d1 + d2;
1133 };
1134};
1135
1136enum class DistanceType {
1137 RnL1,
1138 Rn,
1139 RnSquared,
1140 SO2,
1141 SO2Squared,
1142 SO3,
1144};
1145
1146inline bool starts_with(const std::string &str, const std::string &prefix) {
1147 return str.size() >= prefix.size() &&
1148 str.compare(0, prefix.size(), prefix) == 0;
1149}
1150
1151// get the substring after : as an integer number
1152inline int get_number(const std::string &str) {
1153 std::string delimiter = ":";
1154 size_t pos = 0;
1155 std::string token;
1156 // while ((
1157 pos = str.find(delimiter);
1158 if (pos == std::string::npos) {
1159 THROW_PRETTY_DYNOTREE("delimiter not found");
1160 }
1161
1162 token = str.substr(pos + delimiter.length(), str.size());
1163 int out = std::stoi(token);
1164 std::cout << "out " << out << std::endl;
1165 return out;
1166}
1167
1168template <typename Scalar> struct Combined {
1169 using cref_t = const Eigen::Ref<const Eigen::Matrix<Scalar, -1, 1>> &;
1170 using ref_t = Eigen::Ref<Eigen::Matrix<Scalar, -1, 1>>;
1171
1172 using Space =
1173 std::variant<RnL1<Scalar>, Rn<Scalar>, RnSquared<Scalar>, SO2<Scalar>,
1175 std::vector<Space> spaces;
1176 std::vector<int> dims; // TODO: remove this and get auto from spaces
1177 // std::vector<double>
1178 // weights; // Only supported: one weight per space -- TODO: allow both!
1179 Eigen::Matrix<Scalar, -1, 1>
1180 weights; // one weight per dimension, created from weights
1181 bool use_weights = false;
1182 std::vector<std::string> spaces_names;
1183 Eigen::VectorXd lb;
1184 Eigen::VectorXd ub;
1185
1186 void set_weights(cref_t weights_) {
1187 int total_dim = get_runtime_dim();
1188 CHECK_PRETTY_DYNOTREE(weights_.size() == total_dim, "");
1189 weights = weights_;
1190 use_weights = true;
1191 int counter = 0;
1192 for (size_t i = 0; i < spaces.size(); i++) {
1193 std::visit(
1194 [&](auto &obj) {
1195 obj.set_weights(weights_.segment(counter, dims[i]));
1196 },
1197 spaces[i]);
1198 counter += dims[i];
1199 }
1200 }
1201
1203 int out = 0;
1204 for (size_t i = 0; i < spaces.size(); i++) {
1205 out += dims[i];
1206 // std::visit(
1207 // [&](auto &obj) {
1208 // out += obj.get_runtime_dim();
1209 // },
1210 // spaces[i]);
1211 }
1212 return out;
1213 }
1214
1215 Combined() = default;
1216
1217 Combined(const std::vector<Space> &spaces, const std::vector<int> &dims)
1218 : spaces(spaces), dims(dims) {
1219 assert(spaces.size() == dims.size());
1220 }
1221
1222 void print(std::ostream &out) {
1223
1224 out << "Combined: " << std::endl;
1225 for (auto &a : spaces_names)
1226 out << a << std::endl;
1227 for (auto &s : spaces)
1228 std::visit([&](auto &obj) { obj.print(out); }, s);
1229 for (auto &d : dims)
1230 out << d << std::endl;
1231 out << "lb " << lb.transpose().format(__CleanFmt) << std::endl;
1232 out << "ub " << ub.transpose().format(__CleanFmt) << std::endl;
1233 out << "weights " << weights.transpose().format(__CleanFmt) << std::endl;
1234 }
1235
1236 Combined(const std::vector<std::string> &spaces_str) {
1237
1238 for (size_t i = 0; i < spaces_str.size(); i++) {
1239 if (spaces_str.at(i) == "SO2") {
1240 spaces.push_back(SO2<Scalar>());
1241 spaces_names.push_back("SO2");
1242 dims.push_back(1);
1243 } else if (spaces_str.at(i) == "SO2Squared") {
1244 spaces.push_back(SO2Squared<Scalar>());
1245 spaces_names.push_back("SO2Squared");
1246 dims.push_back(1);
1247 } else if (spaces_str.at(i) == "SO3") {
1248 spaces.push_back(SO3<Scalar>());
1249 spaces_names.push_back("SO3");
1250 dims.push_back(4);
1251 } else if (spaces_str.at(i) == "SO3Squared") {
1252 spaces.push_back(SO3Squared<Scalar>());
1253 spaces_names.push_back("SO3Squared");
1254 dims.push_back(4);
1255 } else if (starts_with(spaces_str.at(i), "RnL1")) {
1256 spaces.push_back(RnL1<Scalar>());
1257 spaces_names.push_back("RnL1");
1258 int dim = get_number(spaces_str.at(i));
1259 dims.push_back(dim);
1260 } else if (starts_with(spaces_str.at(i), "Rn") &&
1261 !starts_with(spaces_str.at(i), "RnSquared")) {
1262 spaces.push_back(Rn<Scalar>());
1263 spaces_names.push_back("Rn");
1264 int dim = get_number(spaces_str.at(i));
1265 dims.push_back(dim);
1266 } else if (starts_with(spaces_str.at(i), "RnSquared")) {
1267 spaces.push_back(RnSquared<Scalar>());
1268 spaces_names.push_back("RnSquared");
1269 int dim = get_number(spaces_str.at(i));
1270 dims.push_back(dim);
1271 } else {
1272 THROW_PRETTY_DYNOTREE("Unknown space:" + spaces_str.at(i));
1273 }
1274 }
1275 assert(spaces.size() == dims.size());
1276 }
1277
1278 void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width) {
1279 if (use_weights) {
1281 } else
1283 }
1284
1285 bool check_bounds(cref_t x) const {
1286 int counter = 0;
1287 for (size_t i = 0; i < spaces.size(); i++) {
1288 if (!std::visit(
1289 [&](const auto &obj) {
1290 return obj.check_bounds(x.segment(counter, dims[i]));
1291 },
1292 spaces[i]))
1293 return false;
1294
1295 counter += dims[i];
1296 }
1297 return true;
1298 }
1299
1300 void set_bounds(cref_t &lbs, cref_t &ubs) {
1301
1302 assert(lbs.size() == ubs.size());
1303 lb = lbs;
1304 ub = ubs;
1305 int counter = 0;
1306 for (size_t i = 0; i < spaces_names.size(); i++) {
1307
1308 auto &space_name = spaces_names.at(i);
1309
1310 if (space_name == "SO2")
1311 continue;
1312 if (space_name == "SO2Squared")
1313 continue;
1314 if (space_name == "SO3")
1315 continue;
1316 if (space_name == "SO3Squared")
1317 continue;
1318
1319 std::visit(
1320 [&](auto &obj) {
1321 if (lbs.size())
1322 obj.set_bounds(lbs.segment(counter, dims[i]),
1323 ubs.segment(counter, dims[i]));
1324 },
1325 spaces[i]);
1326 counter += dims[i];
1327 }
1328 }
1329
1330 void set_bounds(const std::vector<Eigen::VectorXd> &lbs,
1331 const std::vector<Eigen::VectorXd> &ubs) {
1332
1333 assert(lbs.size() == ubs.size());
1334
1335 for (size_t i = 0; i < lbs.size(); i++) {
1336 std::visit(
1337 [&](auto &obj) {
1338 if (lbs[i].size())
1339 obj.set_bounds(lbs[i], ubs[i]);
1340 },
1341 spaces[i]);
1342 }
1343 }
1344
1345 void sample_uniform(ref_t x) const {
1346
1347 assert(spaces.size() == dims.size());
1348 assert(spaces.size());
1349 int counter = 0;
1350 for (size_t i = 0; i < spaces.size(); i++) {
1351 std::visit(
1352 [&](const auto &obj) {
1353 obj.sample_uniform(x.segment(counter, dims[i]));
1354 },
1355 spaces[i]);
1356 counter += dims[i];
1357 }
1358 }
1359
1360 void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const {
1361
1362 assert(spaces.size() == dims.size());
1363 assert(spaces.size());
1364 Scalar d = 0;
1365 int counter = 0;
1366 for (size_t i = 0; i < spaces.size(); i++) {
1367 std::visit(
1368 [&](const auto &obj) {
1369 obj.interpolate(from.segment(counter, dims[i]),
1370 to.segment(counter, dims[i]), t,
1371 out.segment(counter, dims[i]));
1372 },
1373 spaces[i]);
1374 counter += dims[i];
1375 }
1376 }
1377
1378 inline Scalar distance(cref_t x, cref_t y) const {
1379
1380 assert(spaces.size() == dims.size());
1381 assert(spaces.size());
1382 Scalar d = 0;
1383 int counter = 0;
1384 int dim_index = -1;
1385 auto caller = [&](const auto &obj) {
1386 return obj.distance(x.segment(counter, dims[dim_index]),
1387 y.segment(counter, dims[dim_index]));
1388 };
1389
1390 for (size_t i = 0; i < spaces.size(); i++) {
1391 dim_index = i;
1392 d += std::visit(caller, spaces[i]);
1393 counter += dims[i];
1394 }
1395 return d;
1396 }
1397
1398 inline Scalar distance_to_rectangle(cref_t x, cref_t lb, cref_t ub) const {
1399
1400 assert(spaces.size() == dims.size());
1401 assert(spaces.size());
1402
1403 Scalar d = 0;
1404 int counter = 0;
1405
1406 int dim_index = 0;
1407 auto caller = [&](const auto &obj) {
1408 return obj.distance_to_rectangle(x.segment(counter, dims[dim_index]),
1409 lb.segment(counter, dims[dim_index]),
1410 ub.segment(counter, dims[dim_index]));
1411 };
1412
1413 for (size_t i = 0; i < spaces.size(); i++) {
1414 dim_index = i;
1415 d += std::visit(caller, spaces[i]);
1416 counter += dims[i];
1417 }
1418
1419 return d;
1420 }
1421};
1422} // namespace dynotree
#define THROW_PRETTY_DYNOTREE(arg)
Definition dynotree_macros.h:33
#define CHECK_PRETTY_DYNOTREE(condition, arg)
Definition dynotree_macros.h:36
#define CHECK_PRETTY_DYNOTREE__(condition)
Definition dynotree_macros.h:41
Definition dynotree_macros.h:9
Eigen::IOFormat __CleanFmt(4, 0, ", ", "\n", "[", "]")
DistanceType
Definition StateSpace.h:1136
void choose_split_dimension_default(const T &lb, const T &ub, int &ii, Scalar &width)
Definition StateSpace.h:21
int get_number(const std::string &str)
Definition StateSpace.h:1152
void choose_split_dimension_weights(const T &lb, const T &ub, const T2 &weight, int &ii, Scalar &width)
Definition StateSpace.h:33
bool starts_with(const std::string &str, const std::string &prefix)
Definition StateSpace.h:1146
Definition StateSpace.h:679
static constexpr int value
Definition StateSpace.h:681
Definition StateSpace.h:1168
Combined(const std::vector< std::string > &spaces_str)
Definition StateSpace.h:1236
std::vector< std::string > spaces_names
Definition StateSpace.h:1182
std::variant< RnL1< Scalar >, Rn< Scalar >, RnSquared< Scalar >, SO2< Scalar >, SO2Squared< Scalar >, SO3< Scalar >, SO3Squared< Scalar > > Space
Definition StateSpace.h:1172
Eigen::VectorXd ub
Definition StateSpace.h:1184
Scalar distance(cref_t x, cref_t y) const
Definition StateSpace.h:1378
void set_weights(cref_t weights_)
Definition StateSpace.h:1186
void set_bounds(const std::vector< Eigen::VectorXd > &lbs, const std::vector< Eigen::VectorXd > &ubs)
Definition StateSpace.h:1330
const Eigen::Ref< const Eigen::Matrix< Scalar, -1, 1 > > & cref_t
Definition StateSpace.h:1169
Eigen::VectorXd lb
Definition StateSpace.h:1183
void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const
Definition StateSpace.h:1360
std::vector< Space > spaces
Definition StateSpace.h:1175
std::vector< int > dims
Definition StateSpace.h:1176
Combined(const std::vector< Space > &spaces, const std::vector< int > &dims)
Definition StateSpace.h:1217
Eigen::Matrix< Scalar, -1, 1 > weights
Definition StateSpace.h:1180
Scalar distance_to_rectangle(cref_t x, cref_t lb, cref_t ub) const
Definition StateSpace.h:1398
void set_bounds(cref_t &lbs, cref_t &ubs)
Definition StateSpace.h:1300
bool use_weights
Definition StateSpace.h:1181
bool check_bounds(cref_t x) const
Definition StateSpace.h:1285
int get_runtime_dim()
Definition StateSpace.h:1202
void print(std::ostream &out)
Definition StateSpace.h:1222
void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width)
Definition StateSpace.h:1278
void sample_uniform(ref_t x) const
Definition StateSpace.h:1345
Eigen::Ref< Eigen::Matrix< Scalar, -1, 1 > > ref_t
Definition StateSpace.h:1170
Definition StateSpace.h:887
Scalar distance(cref_t x, cref_t y) const
Definition StateSpace.h:926
const Eigen::Ref< const Eigen::Matrix< Scalar, 2, 1 > > & cref2_t
Definition StateSpace.h:892
const Eigen::Ref< const Eigen::Matrix< Scalar, 3, 1 > > & cref_t
Definition StateSpace.h:889
Eigen::Ref< Eigen::Matrix< Scalar, 3, 1 > > ref_t
Definition StateSpace.h:890
SO2Squared< Scalar > so2squared
Definition StateSpace.h:902
Scalar distance_to_rectangle(cref_t x, cref_t lb, cref_t ub) const
Definition StateSpace.h:917
void print(std::ostream &out)
Definition StateSpace.h:904
void sample_uniform(ref_t x) const
Definition StateSpace.h:912
void set_bounds(cref2_t lb_, cref2_t ub_)
Definition StateSpace.h:910
Eigen::Ref< Eigen::Matrix< Scalar, 2, 1 > > ref2_t
Definition StateSpace.h:893
Scalar angular_weight
Definition StateSpace.h:899
void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width)
Definition StateSpace.h:895
RnSquared< Scalar, 2 > rn_squared
Definition StateSpace.h:901
Definition StateSpace.h:812
Eigen::Ref< Eigen::Matrix< Scalar, 2, 1 > > ref2_t
Definition StateSpace.h:819
Scalar distance_to_rectangle(cref_t x, cref_t lb, cref_t ub) const
Definition StateSpace.h:870
Eigen::Ref< Eigen::Matrix< Scalar, 3, 1 > > ref_t
Definition StateSpace.h:815
Scalar angular_weight
Definition StateSpace.h:828
bool check_bounds(cref_t x) const
Definition StateSpace.h:851
void print(std::ostream &out)
Definition StateSpace.h:833
bool use_weights
Definition StateSpace.h:840
void set_bounds(cref2_t lb_, cref2_t ub_)
Definition StateSpace.h:849
Scalar distance(cref_t x, cref_t y) const
Definition StateSpace.h:879
Rn< Scalar, 2 > l2
Definition StateSpace.h:830
vec_t weights
Definition StateSpace.h:839
void set_weights(cref_t wr2, double wso2)
Definition StateSpace.h:842
void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width)
Definition StateSpace.h:821
void sample_uniform(ref_t x) const
Definition StateSpace.h:856
void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const
Definition StateSpace.h:861
Eigen::Matrix< Scalar, 3, 1 > vec_t
Definition StateSpace.h:816
const Eigen::Ref< const Eigen::Matrix< Scalar, 2, 1 > > & cref2_t
Definition StateSpace.h:818
SO2< Scalar > so2
Definition StateSpace.h:831
const Eigen::Ref< const Eigen::Matrix< Scalar, 3, 1 > > & cref_t
Definition StateSpace.h:814
Definition StateSpace.h:1038
Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const
Definition StateSpace.h:1063
void sample_uniform(cref3_t lb, cref3_t ub, ref_t x) const
Definition StateSpace.h:1058
const Eigen::Ref< const Eigen::Matrix< Scalar, 7, 1 > > & cref_t
Definition StateSpace.h:1040
void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width)
Definition StateSpace.h:1044
RnSquared< Scalar, 3 > l2
Definition StateSpace.h:1048
const Eigen::Ref< const Eigen::Matrix< Scalar, 3, 1 > > & cref3_t
Definition StateSpace.h:1042
SO3Squared< Scalar > so3
Definition StateSpace.h:1049
void set_bounds(cref3_t lb_, cref3_t ub_)
Definition StateSpace.h:1056
Eigen::Ref< Eigen::Matrix< Scalar, 7, 1 > > ref_t
Definition StateSpace.h:1041
void print(std::ostream &out)
Definition StateSpace.h:1051
Scalar distance(cref_t x, cref_t y) const
Definition StateSpace.h:1074
Definition StateSpace.h:1082
void sample_uniform(ref_t x) const
Definition StateSpace.h:1112
SO3< Scalar > so3
Definition StateSpace.h:1102
const Eigen::Ref< const Eigen::Matrix< Scalar, 7, 1 > > & cref_t
Definition StateSpace.h:1084
const Eigen::Ref< const Eigen::Matrix< Scalar, 3, 1 > > & cref3_t
Definition StateSpace.h:1087
void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width)
Definition StateSpace.h:1090
Rn< Scalar, 3 > l2
Definition StateSpace.h:1101
Scalar distance(cref_t x, cref_t y) const
Definition StateSpace.h:1128
void set_bounds(cref3_t lb_, cref3_t ub_)
Definition StateSpace.h:1110
void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const
Definition StateSpace.h:1094
void print(std::ostream &out)
Definition StateSpace.h:1104
Eigen::Ref< Eigen::Matrix< Scalar, 7, 1 > > ref_t
Definition StateSpace.h:1085
Eigen::Ref< Eigen::Matrix< Scalar, 3, 1 > > ref3_t
Definition StateSpace.h:1088
Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const
Definition StateSpace.h:1117
Definition StateSpace.h:1035
Definition StateSpace.h:45
void set_bounds(cref_t lb_, cref_t ub_)
Definition StateSpace.h:55
Eigen::Ref< Eigen::Matrix< Scalar, Dimensions, 1 > > ref_t
Definition StateSpace.h:48
Eigen::Matrix< Scalar, Dimensions, 1 > ub
Definition StateSpace.h:51
void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width) const
Definition StateSpace.h:102
bool use_weights
Definition StateSpace.h:53
void sample_uniform(ref_t x) const
Definition StateSpace.h:89
void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const
Definition StateSpace.h:96
void set_weights(cref_t weights_)
Definition StateSpace.h:60
void print(std::ostream &out)
Definition StateSpace.h:66
bool check_bounds(cref_t x) const
Definition StateSpace.h:73
Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const
Definition StateSpace.h:110
Eigen::Matrix< Scalar, Dimensions, 1 > weights
Definition StateSpace.h:52
Scalar distance(cref_t x, cref_t y) const
Definition StateSpace.h:138
const Eigen::Ref< const Eigen::Matrix< Scalar, Dimensions, 1 > > & cref_t
Definition StateSpace.h:47
Eigen::Matrix< Scalar, Dimensions, 1 > lb
Definition StateSpace.h:50
Definition StateSpace.h:403
void set_bounds(cref_t lb_, cref_t ub_)
Definition StateSpace.h:449
void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const
Definition StateSpace.h:443
void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width) const
Definition StateSpace.h:454
bool use_weights
Definition StateSpace.h:412
void set_weights(cref_t weights_)
Definition StateSpace.h:437
Eigen::Matrix< Scalar, Dimensions, 1 > vec_t
Definition StateSpace.h:407
bool check_bounds(cref_t x) const
Definition StateSpace.h:421
Eigen::Matrix< Scalar, Dimensions, 1 > lb
Definition StateSpace.h:409
const Eigen::Ref< const Eigen::Matrix< Scalar, Dimensions, 1 > > & cref_t
Definition StateSpace.h:405
void sample_uniform(ref_t x) const
Definition StateSpace.h:462
Eigen::Ref< Eigen::Matrix< Scalar, Dimensions, 1 > > ref_t
Definition StateSpace.h:406
Scalar distance(cref_t &x, cref_t &y) const
Definition StateSpace.h:497
Eigen::Matrix< Scalar, Dimensions, 1 > ub
Definition StateSpace.h:410
vec_t weights
Definition StateSpace.h:411
Scalar distance_to_rectangle(cref_t x, cref_t lb, cref_t ub) const
Definition StateSpace.h:469
void print(std::ostream &out)
Definition StateSpace.h:414
Definition StateSpace.h:691
void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const
Definition StateSpace.h:719
Eigen::Ref< Eigen::Matrix< Scalar, effective_dim, 1 > > ref_t
Definition StateSpace.h:698
void set_bounds(cref_t lb_, cref_t ub_)
Definition StateSpace.h:739
double lambda_t
Definition StateSpace.h:703
static constexpr int effective_dim
Definition StateSpace.h:695
void print(std::ostream &out)
Definition StateSpace.h:713
const Eigen::Ref< const Eigen::Matrix< Scalar, effective_dim, 1 > > & cref_t
Definition StateSpace.h:696
Time< Scalar > time
Definition StateSpace.h:700
void set_lambda(double lambda_t_, double lambda_r_)
Definition StateSpace.h:706
Rn< Scalar, Dimensions > rn
Definition StateSpace.h:701
Scalar distance(cref_t x, cref_t y) const
Definition StateSpace.h:792
void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width) const
Definition StateSpace.h:754
void sample_uniform(ref_t x) const
Definition StateSpace.h:759
Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const
Definition StateSpace.h:771
double lambda_r
Definition StateSpace.h:704
Definition StateSpace.h:509
void sample_uniform(ref_t x) const
Definition StateSpace.h:561
bool check_bounds(cref_t x) const
Definition StateSpace.h:539
Scalar distance(cref_t &x, cref_t &y) const
Definition StateSpace.h:582
bool use_weights
Definition StateSpace.h:519
Eigen::Matrix< Scalar, Dimensions, 1 > lb
Definition StateSpace.h:516
std::integral_constant< int, Dimensions > DIM
Definition StateSpace.h:513
const Eigen::Ref< const Eigen::Matrix< Scalar, Dimensions, 1 > > & cref_t
Definition StateSpace.h:510
void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width) const
Definition StateSpace.h:568
RnSquared< Scalar, Dimensions > rn_squared
Definition StateSpace.h:515
void set_bounds(cref_t lb_, cref_t ub_)
Definition StateSpace.h:534
Eigen::Matrix< Scalar, Dimensions, 1 > ub
Definition StateSpace.h:517
void print(std::ostream &out)
Definition StateSpace.h:521
Eigen::Matrix< Scalar, Dimensions, 1 > vec_t
Definition StateSpace.h:512
void set_weights(cref_t weights_)
Definition StateSpace.h:528
vec_t weights
Definition StateSpace.h:518
Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const
Definition StateSpace.h:576
void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const
Definition StateSpace.h:555
Eigen::Ref< Eigen::Matrix< Scalar, Dimensions, 1 > > ref_t
Definition StateSpace.h:511
Definition StateSpace.h:613
Rn< double, 4 > rn
Definition StateSpace.h:620
void set_bounds(cref_t lb_, cref_t ub_) override
Definition StateSpace.h:622
double Scalar
Definition StateSpace.h:615
Eigen::Ref< Eigen::Matrix< double, -1, 1 > > ref_t
Definition StateSpace.h:618
virtual Scalar distance(cref_t &x, cref_t &y) const override
Definition StateSpace.h:643
virtual void sample_uniform(ref_t x) const override
Definition StateSpace.h:629
const Eigen::Ref< const Eigen::Matrix< double, -1, 1 > > & cref_t
Definition StateSpace.h:617
virtual void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const override
Definition StateSpace.h:624
virtual void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width) override
Definition StateSpace.h:633
virtual Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const override
Definition StateSpace.h:638
Definition StateSpace.h:346
Eigen::Matrix< Scalar, 1, 1 > ub
Definition StateSpace.h:352
void print(std::ostream &out)
Definition StateSpace.h:356
bool check_bounds(cref_t x) const
Definition StateSpace.h:358
SO2< Scalar > so2
Definition StateSpace.h:354
void set_weights(cref_t weights_)
Definition StateSpace.h:374
void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width)
Definition StateSpace.h:385
void set_bounds(cref_t lb_, cref_t ub_)
Definition StateSpace.h:380
Scalar distance(cref_t x, cref_t y) const
Definition StateSpace.h:396
void sample_uniform(ref_t x) const
Definition StateSpace.h:378
Scalar distance_to_rectangle(cref_t x, cref_t lb, cref_t ub) const
Definition StateSpace.h:390
void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const
Definition StateSpace.h:370
const Eigen::Ref< const Eigen::Matrix< Scalar, 1, 1 > > & cref_t
Definition StateSpace.h:348
Eigen::Ref< Eigen::Matrix< Scalar, 1, 1 > > ref_t
Definition StateSpace.h:349
Eigen::Matrix< Scalar, 1, 1 > lb
Definition StateSpace.h:351
Definition StateSpace.h:228
Eigen::Ref< Eigen::Matrix< Scalar, 1, 1 > > ref_t
Definition StateSpace.h:231
void print(std::ostream &out)
Definition StateSpace.h:248
bool use_weights
Definition StateSpace.h:234
void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const
Definition StateSpace.h:270
Scalar distance(cref_t x, cref_t y) const
Definition StateSpace.h:327
void set_bounds(cref_t lb_, cref_t ub_)
Definition StateSpace.h:259
double weight
Definition StateSpace.h:233
void sample_uniform(ref_t x) const
Definition StateSpace.h:254
bool check_bounds(cref_t x) const
Definition StateSpace.h:236
void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width)
Definition StateSpace.h:292
Scalar distance_to_rectangle(cref_t x, cref_t lb, cref_t ub) const
Definition StateSpace.h:296
const Eigen::Ref< const Eigen::Matrix< Scalar, 1, 1 > > & cref_t
Definition StateSpace.h:230
void set_weights(cref_t weights_)
Definition StateSpace.h:264
Definition StateSpace.h:934
void print(std::ostream &out)
Definition StateSpace.h:947
const Eigen::Ref< const Eigen::Matrix< Scalar, 4, 1 > > & cref_t
Definition StateSpace.h:936
Scalar distance(cref_t x, cref_t y) const
Definition StateSpace.h:977
void sample_uniform(ref_t x) const
Definition StateSpace.h:941
bool check_bounds(cref_t x) const
Definition StateSpace.h:945
void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const
Definition StateSpace.h:960
RnSquared< Scalar, 4 > rn_squared
Definition StateSpace.h:939
Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const
Definition StateSpace.h:968
void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width)
Definition StateSpace.h:964
void set_weights(cref_t weights_)
Definition StateSpace.h:951
Eigen::Ref< Eigen::Matrix< Scalar, 4, 1 > > ref_t
Definition StateSpace.h:937
void set_bounds(cref_t lb_, cref_t ub_)
Definition StateSpace.h:955
Definition StateSpace.h:991
void sample_uniform(ref_t x) const
Definition StateSpace.h:1005
void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const
Definition StateSpace.h:1019
void print(std::ostream &out)
Definition StateSpace.h:998
void set_weights(cref_t weights_)
Definition StateSpace.h:1011
void set_bounds(cref_t lb_, cref_t ub_)
Definition StateSpace.h:1007
SO3Squared< Scalar > so3squared
Definition StateSpace.h:996
const Eigen::Ref< const Eigen::Matrix< Scalar, 4, 1 > > & cref_t
Definition StateSpace.h:993
void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width)
Definition StateSpace.h:1015
bool check_bounds(cref_t x) const
Definition StateSpace.h:1003
Scalar distance(cref_t x, cref_t y) const
Definition StateSpace.h:1028
Eigen::Ref< Eigen::Matrix< Scalar, 4, 1 > > ref_t
Definition StateSpace.h:994
Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const
Definition StateSpace.h:1023
Definition StateSpace.h:150
Eigen::Matrix< Scalar, 1, 1 > lb
Definition StateSpace.h:154
void sample_uniform(ref_t x) const
Definition StateSpace.h:177
const Eigen::Ref< const Eigen::Matrix< Scalar, 1, 1 > > & cref_t
Definition StateSpace.h:152
Scalar distance_to_rectangle(cref_t x, cref_t lb, cref_t ub) const
Definition StateSpace.h:205
void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width)
Definition StateSpace.h:200
void set_bounds(cref_t lb_, cref_t ub_)
Definition StateSpace.h:182
Scalar distance(cref_t x, cref_t y) const
Definition StateSpace.h:218
Eigen::Matrix< Scalar, 1, 1 > ub
Definition StateSpace.h:155
void print(std::ostream &out)
Definition StateSpace.h:173
Eigen::Ref< Eigen::Matrix< Scalar, 1, 1 > > ref_t
Definition StateSpace.h:153
void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const
Definition StateSpace.h:190
bool check_bounds(cref_t x) const
Definition StateSpace.h:157
Definition StateSpace.h:588
virtual void sample_uniform(ref_t x) const =0
virtual Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const =0
virtual void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const =0
virtual Scalar distance(cref_t &x, cref_t &y) const =0
double Scalar
Definition StateSpace.h:590
virtual void set_bounds(cref_t lb_, cref_t ub_)=0
const Eigen::Ref< const Eigen::Matrix< double, -1, 1 > > & cref_t
Definition StateSpace.h:592
Eigen::Ref< Eigen::Matrix< double, -1, 1 > > ref_t
Definition StateSpace.h:593
virtual void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width)=0
Rn< double, 4 > rn
Definition StateSpace.h:595
Definition StateSpace.h:648
std::shared_ptr< Vpure > s4
Definition StateSpace.h:655
Eigen::Ref< Eigen::Matrix< double, -1, 1 > > ref_t
Definition StateSpace.h:653
double Scalar
Definition StateSpace.h:650
Scalar distance(cref_t &x, cref_t &y) const
Definition StateSpace.h:674
void sample_uniform(ref_t x) const
Definition StateSpace.h:663
const Eigen::Ref< const Eigen::Matrix< double, -1, 1 > > & cref_t
Definition StateSpace.h:652
void set_bounds(cref_t lb_, cref_t ub_)
Definition StateSpace.h:657
void choose_split_dimension(cref_t lb, cref_t ub, int &ii, Scalar &width)
Definition StateSpace.h:665
void interpolate(cref_t from, cref_t to, Scalar t, ref_t out) const
Definition StateSpace.h:659
Scalar distance_to_rectangle(cref_t &x, cref_t &lb, cref_t &ub) const
Definition StateSpace.h:670