Lodestar
An integrated real-time control package in C++
MinMaxIdxBlock.hpp
1 //
2 // Created by Hamza El-Kebir on 2/19/22.
3 //
4 
5 #ifndef LODESTAR_MINMAXIDXBLOCK_HPP
6 #define LODESTAR_MINMAXIDXBLOCK_HPP
7 
8 #include <Lodestar/blocks/Block.hpp>
9 #include <Lodestar/aux/TemplateTools.hpp>
10 
11 #include <Eigen/Dense>
12 
13 namespace ls {
14  namespace blocks {
15  namespace std {
22  Min,
24  Max
25  };
26 
27 #define OUTPUT_MINMAXIDXBLOCK() \
28  typename ::std::conditional<ls::aux::TemplateTraits::BinaryOperators::parseMatrixLike<TInput>::value, typename ls::aux::TemplateTraits::BinaryOperators::parseMatrixLike<TInput>::scalar, TInput>::type
29 
30  template<typename TInput, MinMaxIdxBlockOperator TOps>
32  : public Block<
33  ::std::tuple<TInput>,
34  ::std::tuple<int, int, OUTPUT_MINMAXIDXBLOCK()>,
35  BlockProto::empty
36  > {
37  public:
38  using Base =
39  Block<
40  ::std::tuple<TInput>,
41  ::std::tuple<int, int, OUTPUT_MINMAXIDXBLOCK()>,
42  BlockProto::empty
43  >;
44 
46  static_assert(InputTrait::value, "Input must be matrix-like; otherwise same value would be returned.");
47 
50 
52  static constexpr Ops Min = Ops::Min;
53 
55  static constexpr Ops Max = Ops::Max;
56 
57  using OutputType = OUTPUT_MINMAXIDXBLOCK();
58 
60  {
61  bindFunction();
62  }
63 
64 
65  protected:
66  template<MinMaxIdxBlockOperator TTOps = TOps,
67  typename ::std::enable_if<TTOps == Min>::type * = nullptr>
68  void bindFunction()
69  {
70  this->equation = [](Base &b) -> void {
71  static Eigen::Index minRow, minCol;
72 
73  b.template o<2>() = b.template i<0>().object.minCoeff(&minRow, &minCol);
74  b.template o<0>() = minRow;
75  b.template o<1>() = minCol;
76  };
77  }
78 
79  template<MinMaxIdxBlockOperator TTOps = TOps,
80  typename ::std::enable_if<TTOps == Max>::type * = nullptr>
81  void bindFunction()
82  {
83  this->equation = [](Base &b) -> void {
84  static Eigen::Index maxRow, maxCol;
85 
86  b.template o<2>() = b.template i<0>().object.maxCoeff(&maxRow, &maxCol);
87  b.template o<0>() = maxRow;
88  b.template o<1>() = maxCol;
89  };
90  }
91  };
92  }
93 
94  template<typename TInput, std::MinMaxIdxBlockOperator TOps>
95  class BlockTraits<std::MinMaxIdxBlock<TInput, TOps>> {
96  public:
97  static constexpr const BlockType blockType = BlockType::MinMaxIdxBlock;
98  enum {
99  directFeedthrough = true
100  };
101 
103  using Base = typename type::Base;
104 
105  enum {
106  kIns = Base::kIns,
107  kOuts = Base::kOuts,
108  kPars = Base::kPars
109  };
110 
111  static const ::std::array<::std::string, kIns> inTypes;
112  static const ::std::array<::std::string, kOuts> outTypes;
113  static const ::std::array<::std::string, kPars> parTypes;
114 
115  static const ::std::array<::std::string, 2> templateTypes;
116  };
117 
118  template<typename TInput, std::MinMaxIdxBlockOperator TOps>
119  const ::std::array<::std::string, BlockTraits<std::MinMaxIdxBlock<TInput, TOps>>::kIns> BlockTraits<std::MinMaxIdxBlock<TInput, TOps>>::inTypes =
120  {demangle(typeid(TInput).name())};
121 
122  template<typename TInput, std::MinMaxIdxBlockOperator TOps>
123  const ::std::array<::std::string, BlockTraits<std::MinMaxIdxBlock<TInput, TOps>>::kOuts> BlockTraits<std::MinMaxIdxBlock<TInput, TOps>>::outTypes =
124  {"int", "int", demangle(typeid(typename std::MinMaxIdxBlock<TInput, TOps>::OutputType).name())};
125 
126  template<typename TInput, std::MinMaxIdxBlockOperator TOps>
127  const ::std::array<::std::string, BlockTraits<std::MinMaxIdxBlock<TInput, TOps>>::kPars> BlockTraits<std::MinMaxIdxBlock<TInput, TOps>>::parTypes =
128  {};
129 
130  template<typename TInput, std::MinMaxIdxBlockOperator TOps>
131  const ::std::array<::std::string, 2> BlockTraits<std::MinMaxIdxBlock<TInput, TOps>>::templateTypes =
132  {demangle(typeid(TInput).name()), demangle(typeid(TOps).name())};
133  }
134 }
135 
136 
137 #endif //LODESTAR_MINMAXIDXBLOCK_HPP
ls::blocks::std::MinMaxIdxBlock
Definition: MinMaxIdxBlock.hpp:31
ls::blocks::BlockTraits::directFeedthrough
static constexpr const bool directFeedthrough
Whether or not the block has direct feedthrough.
Definition: BlockTraits.hpp:44
ls::blocks::std::MinMaxIdxBlockOperator::Max
@ Max
Maximum.
ls::blocks::std::MinMaxIdxBlockOperator::Min
@ Min
Minimum.
ls::blocks::BlockTraits
A traits object that exposes information about TBlock.
Definition: BlockTraits.hpp:37
ls::blocks::BlockTraits::inTypes
static const ::std::array<::std::string, kIns > inTypes
Input types (as strings).
Definition: BlockTraits.hpp:59
ls::blocks::BlockType::MinMaxIdxBlock
@ MinMaxIdxBlock
Min/max index block.
ls::blocks::BlockType
BlockType
Block type information.
Definition: BlockType.hpp:25
ls::aux::TemplateTraits::BinaryOperators::parseMatrixLike
Extracts data from matrix-like types.
Definition: TemplateTraits.hpp:114
ls
Main Lodestar code.
Definition: BilinearTransformation.hpp:12
ls::blocks::std::MinMaxIdxBlockOperator
MinMaxIdxBlockOperator
Operation types for MinMaxIdxBlock.
Definition: MinMaxIdxBlock.hpp:20
ls::blocks::std::MinMaxIdxBlock::Max
static constexpr Ops Max
Utility alias for maximum.
Definition: MinMaxIdxBlock.hpp:55
ls::blocks::BlockTraits::outTypes
static const ::std::array<::std::string, kOuts > outTypes
Output types (as strings).
Definition: BlockTraits.hpp:61
ls::blocks::BlockTraits::blockType
static constexpr const BlockType blockType
Block type.
Definition: BlockTraits.hpp:42
ls::blocks::BlockTraits::templateTypes
static const ::std::array<::std::string, 1 > templateTypes
Template parameter types (as strings).
Definition: BlockTraits.hpp:66
ls::blocks::Block
Generic base template class for all tuple-based Block instances.
Definition: Block.hpp:45
ls::blocks::BlockTraits::kIns
static const constexpr int kIns
Number of input slots.
Definition: BlockTraits.hpp:52
ls::blocks::BlockTraits::parTypes
static const ::std::array<::std::string, kPars > parTypes
Parameter types (as strings).
Definition: BlockTraits.hpp:63
ls::blocks::std::MinMaxIdxBlock::Min
static constexpr Ops Min
Utility alias for minimum.
Definition: MinMaxIdxBlock.hpp:52
ls::blocks::BlockTraits::kPars
static const constexpr int kPars
Number of parameters.
Definition: BlockTraits.hpp:56
ls::blocks::BlockTraits::kOuts
static const constexpr int kOuts
Number of output slots.
Definition: BlockTraits.hpp:54