Lodestar
An integrated real-time control package in C++
BlockPack.hpp
1 //
2 // Created by Hamza El-Kebir on 12/25/21.
3 //
4 
5 #ifndef LODESTAR_BLOCKPACK_HPP
6 #define LODESTAR_BLOCKPACK_HPP
7 
8 #include "Lodestar/blocks/Block.hpp"
9 #include "Lodestar/blocks/aux/DirectedGraph.hpp"
10 #include <type_traits>
11 #include <vector>
12 #include <unordered_map>
13 #include <memory>
14 
15 namespace ls {
16  namespace blocks {
17  struct BlockPack {
18  public:
19  struct BlockTraits {
20  ls::blocks::BlockType blockType;
21  bool directFeedthrough;
22  int ins;
23  int outs;
24  int pars;
25  ::std::vector<::std::string> inTypes;
26  ::std::vector<::std::string> outTypes;
27  ::std::vector<::std::string> parTypes;
28  ::std::vector<::std::string> templateTypes;
29  };
30 
31  template<typename... TTypes>
32  explicit BlockPack(TTypes &...blocks)
33  {
34  append(blocks...);
35  }
36 
37  template<typename TType, typename... TTypes>
38  void append(TType &block, TTypes &...blocks)
39  {
40  append(block);
41  append(blocks...);
42  }
43 
44  template<typename TType>
45  void append(TType &block)
46  {
47  static_assert(
48  ::std::is_base_of<BlockProto, typename ::std::decay<TType>::type>::value,
49  "All elements in BlockPack must be derived from BlockProto."
50  );
51 
52  blocks.push_back(&block);
53  using blockType = typename ::std::decay<TType>::type;
54 // typedef ls::blocks::BlockTraits<typename ::std::decay<TType>::type> TDBlockTraits;
55  auto bt = ::std::make_shared<BlockTraits>(BlockTraits{
61  ::std::vector<::std::string>{ls::blocks::BlockTraits<blockType>::inTypes.begin(),
63  ::std::vector<::std::string>{ls::blocks::BlockTraits<blockType>::outTypes.begin(),
65  ::std::vector<::std::string>{ls::blocks::BlockTraits<blockType>::parTypes.begin(),
67  ::std::vector<::std::string>{ls::blocks::BlockTraits<blockType>::templateTypes.begin(),
69  });
70  blockTraits.push_back(bt);
71 
72 #ifdef LS_USE_GINAC
73  auto iSymbs = ::std::make_shared<::std::vector<GiNaC::ex>>(block.inputSymbols().begin(),
74  block.inputSymbols().end());
75  auto oSymbs = ::std::make_shared<::std::vector<GiNaC::ex>>(block.outputSymbols().begin(),
76  block.outputSymbols().end());
77  auto pSymbs = ::std::make_shared<::std::vector<GiNaC::ex>>(block.parameterSymbols().begin(),
78  block.parameterSymbols().end());
79 
80  inputSymbols.push_back(iSymbs);
81  outputSymbols.push_back(iSymbs);
82  parameterSymbols.push_back(iSymbs);
83 
84  inputSymbolsByPtr[&block] = iSymbs;
85  outputSymbolsByPtr[&block] = oSymbs;
86  parameterSymbolsByPtr[&block] = pSymbs;
87 
88  auto f = ::std::make_shared<::std::function<const GiNaC::function(const ::std::vector<GiNaC::ex> &exvec)>>(::std::bind(
89  &BlockProto::blkf, &block, ::std::placeholders::_1, true));
90 
91  symbolicFunctions.push_back(f);
92  symbolicFunctionByPtr[&block] = f;
93 #endif
94 
95  traitsByPtr[&block] = bt;
96  blockById[static_cast<BlockProto *>(&block)->id] = &block;
97  }
98 
99  void append()
100  {
101  return;
102  }
103 
104  void makeGraph();
105 
106  bool contains(BlockProto *blk) const;
107 
108  bool contains(unsigned int idx) const;
109 
110  bool hasDirectFeedthrough(BlockProto *blk) const;
111 
112  bool hasDirectFeedthrough(BlockProto &blk) const;
113 
114  bool isDriving(BlockProto *blk1, BlockProto *blk2) const;
115 
116  bool isDriving(BlockProto &blk1, BlockProto &blk2) const;
117 
118  ::std::shared_ptr<BlockTraits> getTraitsByPtr(const BlockProto *ptr) const;
119 
120  ::std::shared_ptr<BlockTraits> getTraitsById(unsigned int id) const;
121 
122  BlockProto *getBlockById(unsigned int id);
123 
124  const BlockProto *getBlockById(unsigned int id) const;
125 
126  ::std::vector<BlockProto *> blocks;
127  ::std::vector<::std::shared_ptr<BlockTraits>> blockTraits;
128  ::std::unordered_map<const BlockProto *, ::std::shared_ptr<BlockTraits>> traitsByPtr;
129  ::std::unordered_map<unsigned int, BlockProto *> blockById;
131 
132 #ifdef LS_USE_GINAC
133 
134  ::std::shared_ptr<::std::vector<GiNaC::ex>> getInputSymbolsByPtr(const BlockProto *ptr) const;
135 
136  ::std::shared_ptr<::std::vector<GiNaC::ex>> getOutputSymbolsByPtr(const BlockProto *ptr) const;
137 
138  ::std::shared_ptr<::std::vector<GiNaC::ex>> getParameterSymbolsByPtr(const BlockProto *ptr) const;
139 
140  ::std::shared_ptr<::std::vector<GiNaC::ex>> getInputSymbolsById(unsigned int id) const;
141 
142  ::std::shared_ptr<::std::vector<GiNaC::ex>> getOutputSymbolsById(unsigned int id) const;
143 
144  ::std::shared_ptr<::std::vector<GiNaC::ex>> getParameterSymbolsById(unsigned int id) const;
145 
146  ::std::shared_ptr<::std::function<const GiNaC::function(const ::std::vector<GiNaC::ex> &exvec)>> getSymbolicFunctionByPtr(const BlockProto *ptr) const;
147 
148  ::std::shared_ptr<::std::function<const GiNaC::function(const ::std::vector<GiNaC::ex> &exvec)>> getSymbolicFunctionById(unsigned int id) const;
149 
150  ::std::vector<::std::shared_ptr<::std::vector<GiNaC::ex>>> inputSymbols, outputSymbols, parameterSymbols;
151  ::std::unordered_map<const BlockProto *, ::std::shared_ptr<::std::vector<GiNaC::ex>>> inputSymbolsByPtr, outputSymbolsByPtr, parameterSymbolsByPtr;
152 
153  ::std::vector<::std::shared_ptr<::std::function<const GiNaC::function(const ::std::vector<GiNaC::ex> &exvec)>>> symbolicFunctions;
154 
155  ::std::unordered_map<const BlockProto *, ::std::shared_ptr<::std::function<const GiNaC::function(const ::std::vector<GiNaC::ex> &exvec)>>> symbolicFunctionByPtr;
156 #endif
157  };
158  }
159 }
160 
161 
162 #endif //LODESTAR_BLOCKPACK_HPP
ls::blocks::aux::DirectedGraph
Definition: DirectedGraph.hpp:17
ls::blocks::BlockTraits
A traits object that exposes information about TBlock.
Definition: BlockTraits.hpp:37
ls::blocks::BlockType
BlockType
Block type information.
Definition: BlockType.hpp:25
ls
Main Lodestar code.
Definition: BilinearTransformation.hpp:12
ls::blocks::BlockPack
Definition: BlockPack.hpp:17
ls::blocks::BlockPack::BlockTraits
Definition: BlockPack.hpp:19