5 #ifndef LODESTAR_SATURATIONBLOCK_HPP
6 #define LODESTAR_SATURATIONBLOCK_HPP
8 #include "Lodestar/blocks/Block.hpp"
9 #include "Lodestar/aux/CompileTimeQualifiers.hpp"
10 #include "Eigen/Dense"
15 enum class SaturationBlockOperator {
20 enum class SaturationBlockParameter {
25 template<
typename TType,
26 SaturationBlockOperator TOps = SaturationBlockOperator::Scalar,
27 SaturationBlockParameter TPar = SaturationBlockParameter::Parametric>
29 static_assert(!::std::is_same<TType, TType>::value,
30 "SaturationBlock not defined for this type.");
33 template<
typename TType, SaturationBlockOperator TOps>
37 SaturationBlockParameter::Parametric
42 ::std::tuple<TType, TType>
49 SaturationBlockParameter::Parametric
56 ::std::tuple<TType, TType>
66 return this->
template p<0>();
69 TType &lower(
const TType lo)
71 this->
template p<0>() = lo;
72 return this->
template p<0>();
77 return this->
template p<0>();
82 return this->
template p<1>();
85 TType &upper(
const TType up)
87 this->
template p<1>() = up;
88 return this->
template p<1>();
93 return this->
template p<1>();
99 this->equation = ::std::bind(
100 &type::triggerFunction,
102 ::std::placeholders::_1
106 TType saturate(
const TType x)
const
108 return (x < lower() ? lower() :
109 (x > upper() ? upper() : x));
112 void triggerFunction(
Base &b)
114 b.template o<0>() = saturate(b.template i<0>().object);
118 template<
typename TType, SaturationBlockOperator TOps>
122 SaturationBlockParameter::AdditionalInput
125 ::std::tuple<TType, TType, TType>,
134 SaturationBlockParameter::AdditionalInput
139 ::std::tuple<TType, TType, TType>,
151 return this->
template i<1>();
156 this->
template i<1>() = lo;
157 return this->
template i<1>();
162 this->
template i<1>() = lo;
163 return this->
template i<1>();
168 return this->
template i<1>();
173 return this->
template i<2>();
178 this->
template i<2>() = up;
179 return this->
template i<2>();
184 this->
template i<2>() = up;
185 return this->
template i<2>();
190 return this->
template i<2>();
196 this->equation = ::std::bind(
197 &type::triggerFunction,
199 ::std::placeholders::_1
203 TType saturate(
const TType x)
const
205 return (x < lower().
object ? lower().
object :
206 (x > upper().
object ? upper().
object : x));
209 void triggerFunction(
Base &b)
211 b.template o<0>() = saturate(b.template i<0>().object);
215 template<
typename TScalar,
int TRows,
int TCols>
217 Eigen::Matrix<TScalar, TRows, TCols>,
218 SaturationBlockOperator::Scalar,
219 SaturationBlockParameter::Parametric
222 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>>,
223 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>>,
224 ::std::tuple<TScalar, TScalar>
229 Eigen::Matrix<TScalar, TRows, TCols>,
230 SaturationBlockOperator::Scalar,
231 SaturationBlockParameter::Parametric
236 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>>,
237 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>>,
238 ::std::tuple<TScalar, TScalar>
248 return this->
template p<0>();
251 TScalar &lower(
const TScalar lo)
253 this->
template p<0>() = lo;
254 return this->
template p<0>();
257 TScalar lower()
const
259 return this->
template p<0>();
264 return this->
template p<1>();
267 TScalar &upper(
const TScalar up)
269 this->
template p<1>() = up;
270 return this->
template p<1>();
273 TScalar upper()
const
275 return this->
template p<1>();
281 this->equation = ::std::bind(
282 &type::triggerFunction,
284 ::std::placeholders::_1
288 TScalar saturate(
const TScalar x)
const
290 return (x < lower() ? lower() :
291 (x > upper() ? upper() : x));
294 void triggerFunction(
Base &b)
296 b.template o<0>() = b.template i<0>().object.unaryExpr(
300 ::std::placeholders::_1
306 template<
typename TScalar,
int TRows,
int TCols>
308 Eigen::Matrix<TScalar, TRows, TCols>,
309 SaturationBlockOperator::Scalar,
310 SaturationBlockParameter::AdditionalInput
313 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>, TScalar, TScalar>,
314 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>>,
320 Eigen::Matrix<TScalar, TRows, TCols>,
321 SaturationBlockOperator::Scalar,
322 SaturationBlockParameter::AdditionalInput
327 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>, TScalar, TScalar>,
328 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>>,
339 return this->
template i<1>();
344 this->
template i<1>() = lo;
345 return this->
template i<1>();
350 this->
template i<1>() = lo;
351 return this->
template i<1>();
356 return this->
template i<1>();
361 return this->
template i<2>();
366 this->
template i<2>() = up;
367 return this->
template i<2>();
372 this->
template i<2>() = up;
373 return this->
template i<2>();
378 return this->
template i<2>();
384 this->equation = ::std::bind(
385 &type::triggerFunction,
387 ::std::placeholders::_1
391 TScalar saturate(
const TScalar x)
const
393 return (x < lower().
object ? lower().
object :
394 (x > upper().
object ? upper().
object : x));
397 void triggerFunction(
Base &b)
399 b.template o<0>() = b.template i<0>().object.unaryExpr(
403 ::std::placeholders::_1
409 template<
typename TScalar,
int TRows,
int TCols>
411 Eigen::Matrix<TScalar, TRows, TCols>,
412 SaturationBlockOperator::Elementwise,
413 SaturationBlockParameter::Parametric
416 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>>,
417 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>>,
418 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>, Eigen::Matrix<TScalar, TRows, TCols>>
423 Eigen::Matrix<TScalar, TRows, TCols>,
424 SaturationBlockOperator::Elementwise,
425 SaturationBlockParameter::Parametric
430 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>>,
431 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>>,
432 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>, Eigen::Matrix<TScalar, TRows, TCols>>
435 using BoundMatrix = Eigen::Matrix<TScalar, TRows, TCols>;
444 return this->
template p<0>();
447 BoundMatrix &lower(
const BoundMatrix &lo)
449 this->
template p<0>() = lo;
450 return this->
template p<0>();
453 BoundMatrix lower()
const
455 return this->
template p<0>();
460 return this->
template p<1>();
463 BoundMatrix &upper(
const BoundMatrix &up)
465 this->
template p<1>() = up;
466 return this->
template p<1>();
469 BoundMatrix upper()
const
471 return this->
template p<1>();
477 this->equation = ::std::bind(
478 &type::triggerFunction,
480 ::std::placeholders::_1
484 TScalar saturate(
const TScalar x,
int i = 0,
int j = 0)
const
486 return (x < lower()(i, j) ? lower()(i, j) :
487 (x > upper()(i, j) ? upper()(i, j) : x));
490 int row(
int idx)
const
492 return floor<int, double>(idx / TCols);
495 int col(
int idx)
const
497 return idx - floor<int, double>(idx / TCols) * TCols;
500 void triggerFunction(
Base &b)
506 for (
auto x: b.template i<0>().object.reshaped()) {
510 b.template o<0>().object(i, j) = saturate(x, i, j);
514 b.template o<0>().propagate();
518 template<
typename TScalar,
int TRows,
int TCols>
520 Eigen::Matrix<TScalar, TRows, TCols>,
521 SaturationBlockOperator::Elementwise,
522 SaturationBlockParameter::AdditionalInput
525 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>, Eigen::Matrix<TScalar, TRows, TCols>, Eigen::Matrix<TScalar, TRows, TCols>>,
526 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>>,
532 Eigen::Matrix<TScalar, TRows, TCols>,
533 SaturationBlockOperator::Elementwise,
534 SaturationBlockParameter::AdditionalInput
539 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>, Eigen::Matrix<TScalar, TRows, TCols>, Eigen::Matrix<TScalar, TRows, TCols>>,
540 ::std::tuple<Eigen::Matrix<TScalar, TRows, TCols>>,
544 using BoundMatrix = Eigen::Matrix<TScalar, TRows, TCols>;
553 return this->
template i<1>();
558 this->
template i<1>() = lo;
559 return this->
template i<1>();
564 this->
template i<1>() = lo;
565 return this->
template i<1>();
570 return this->
template i<1>();
575 return this->
template i<2>();
580 this->
template i<2>() = up;
581 return this->
template i<2>();
586 this->
template i<2>() = up;
587 return this->
template i<2>();
592 return this->
template i<2>();
598 this->equation = ::std::bind(
599 &type::triggerFunction,
601 ::std::placeholders::_1
605 TScalar saturate(
const TScalar x,
int i = 0,
int j = 0)
const
607 return (x < lower().
object(i, j) ? lower().
object(i, j) :
608 (x > upper().
object(i, j) ? upper().
object(i, j)
612 int row(
int idx)
const
614 return floor<int, double>(idx / TCols);
617 int col(
int idx)
const
619 return idx - floor<int, double>(idx / TCols) * TCols;
622 void triggerFunction(
Base &b)
628 for (
auto x: b.template i<0>().object.reshaped()) {
632 b.template o<0>().object(i, j) = saturate(x, i, j);
636 b.template o<0>().propagate();
640 template<
typename TType, SaturationBlockOperator TOps>
644 template<
typename TType, std::SaturationBlockOperator TOps>
649 directFeedthrough =
true
653 using Base =
typename type::Base;
661 static const ::std::array<::std::string, kIns> inTypes;
662 static const ::std::array<::std::string, kOuts> outTypes;
663 static const ::std::array<::std::string, kPars> parTypes;
665 static const ::std::array<::std::string, 3> templateTypes;
668 template<
typename TType, std::SaturationBlockOperator TOps>
669 const ::std::array<::std::string, BlockTraits<std::SaturationBlock<TType, TOps, std::SaturationBlockParameter::Parametric>>::kIns>
671 {demangle(
typeid(TType).name())};
673 template<
typename TType, std::SaturationBlockOperator TOps>
674 const ::std::array<::std::string, BlockTraits<std::SaturationBlock<TType, TOps, std::SaturationBlockParameter::Parametric>>::kOuts>
675 BlockTraits<std::SaturationBlock<TType, TOps, std::SaturationBlockParameter::Parametric>>::outTypes =
676 {demangle(
typeid(TType).name())};
678 template<
typename TType, std::SaturationBlockOperator TOps>
679 const ::std::array<::std::string, BlockTraits<std::SaturationBlock<TType, TOps, std::SaturationBlockParameter::Parametric>>::kPars>
680 BlockTraits<std::SaturationBlock<TType, TOps, std::SaturationBlockParameter::Parametric>>::parTypes =
681 {demangle(
typeid(TType).name()), demangle(
typeid(TType).name())};
683 template<
typename TType, std::SaturationBlockOperator TOps>
684 const ::std::array<::std::string, 3>
685 BlockTraits<std::SaturationBlock<TType, TOps, std::SaturationBlockParameter::Parametric>>::templateTypes =
686 {demangle(
typeid(TType).name()), demangle(
typeid(std::SaturationBlockOperator).name()), demangle(
typeid(std::SaturationBlockParameter).name())};
691 #endif //LODESTAR_SATURATIONBLOCK_HPP