Tenncor
seqmodel.hpp
Go to the documentation of this file.
1 
9 #include "layr/dense.hpp"
10 
11 #ifndef LAYR_SEQMODEL_HPP
12 #define LAYR_SEQMODEL_HPP
13 
14 namespace layr
15 {
16 
18 struct SeqModelBuilder final : public iLayerBuilder
19 {
20  SeqModelBuilder (std::string label) : label_(label) {}
21 
23  void set_tensor (teq::TensptrT tens, std::string target) override {} // seqmodel has no tensor
24 
26  void set_sublayer (LayerptrT layer) override
27  {
28  layers_.push_back(layer);
29  }
30 
32  LayerptrT build (void) const override;
33 
34 private:
35  std::string label_;
36 
37  std::vector<LayerptrT> layers_;
38 };
39 
41 const std::string seq_model_key =
43 [](std::string label) -> LBuilderptrT
44 {
45  return std::make_shared<SeqModelBuilder>(label);
46 });
47 
49 struct SequentialModel final : public iLayer
50 {
51  SequentialModel (const std::string& label) :
52  label_(label) {}
53 
55  std::string label_prefix = "")
56  {
57  copy_helper(other, label_prefix);
58  }
59 
61  {
62  if (this != &other)
63  {
64  copy_helper(other);
65  }
66  return *this;
67  }
68 
69  SequentialModel (SequentialModel&& other) = default;
70 
71  SequentialModel& operator = (SequentialModel&& other) = default;
72 
74  SequentialModel* clone (std::string label_prefix = "") const
75  {
76  return static_cast<SequentialModel*>(this->clone_impl(label_prefix));
77  }
78 
80  size_t get_ninput (void) const override
81  {
82  size_t input = 0;
83  for (auto it = layers_.begin(), et = layers_.end();
84  it != et && 0 == input; ++it)
85  {
86  input = (*it)->get_ninput();
87  }
88  return input;
89  }
90 
92  size_t get_noutput (void) const override
93  {
94  size_t output = 0;
95  for (auto it = layers_.rbegin(), et = layers_.rend();
96  it != et && 0 == output; ++it)
97  {
98  output = (*it)->get_noutput();
99  }
100  return output;
101  }
102 
104  std::string get_ltype (void) const override
105  {
106  return seq_model_key;
107  }
108 
110  std::string get_label (void) const override
111  {
112  return label_;
113  }
114 
116  teq::TensptrsT get_contents (void) const override
117  {
118  teq::TensptrsT out;
119  out.reserve(layers_.size());
120  for (auto& layer : layers_)
121  {
122  auto tmp = layer->get_contents();
123  out.insert(out.end(), tmp.begin(), tmp.end());
124  }
125  return out;
126  }
127 
129  NodeptrT connect (NodeptrT input) const override
130  {
131  NodeptrT out;
132  for (size_t i = 0, n = layers_.size(); i < n; ++i)
133  {
134  auto& layer = layers_[i];
135  out = layer->connect(input);
136  input = out;
137  recursive_tag(out->get_tensor(), {
138  input->get_tensor().get(),
139  }, LayerId(layer->get_ltype(), layer->get_label(), i));
140  }
141  return out;
142  }
143 
145  std::vector<LayerptrT> get_layers (void) const
146  {
147  return layers_;
148  }
149 
151  void push_back (LayerptrT layer)
152  {
153  // label layer content
154  auto subs = layer->get_contents();
155  for (auto& sub : subs)
156  {
157  tag(sub, LayerId(layer->get_ltype(),
158  layer->get_label(), layers_.size()));
159  }
160 
161  layers_.push_back(layer);
162  }
163 
164 private:
165  iLayer* clone_impl (const std::string& label_prefix) const override
166  {
167  return new SequentialModel(*this, label_prefix);
168  }
169 
170  void copy_helper (const SequentialModel& other, std::string label_prefix = "")
171  {
172  label_ = label_prefix + other.label_;
173  layers_.clear();
174  layers_.reserve(other.layers_.size());
175  for (LayerptrT olayer : other.layers_)
176  {
177  push_back(LayerptrT(olayer->clone(label_prefix)));
178  }
179  }
180 
181  std::string label_;
182 
183  std::vector<LayerptrT> layers_;
184 };
185 
187 using SeqModelptrT = std::shared_ptr<SequentialModel>;
188 
189 }
190 
191 #endif // LAYR_SEQMODEL_HPP
std::vector< LayerptrT > layers_
Definition: seqmodel.hpp:37
std::vector< LayerptrT > get_layers(void) const
Return stored sublayers.
Definition: seqmodel.hpp:145
LayerRegistry & get_layer_reg(void)
Return global layer registry reference.
std::string label_
Definition: seqmodel.hpp:181
void push_back(LayerptrT layer)
Append layer to stored sublayers.
Definition: seqmodel.hpp:151
size_t get_ninput(void) const override
Implementation of iLayer.
Definition: seqmodel.hpp:80
Builder implementation for sequentially connected models.
Definition: seqmodel.hpp:18
std::string register_tagr(std::string key, LayerBuildF builder)
Definition: layer.hpp:198
NodeptrT connect(NodeptrT input) const override
Implementation of iLayer.
Definition: seqmodel.hpp:129
void recursive_tag(teq::TensptrT root, teq::TensSetT ignores, LayerId subs) const
const std::string seq_model_key
Identifier for sequentially connected models.
Definition: seqmodel.hpp:41
Definition: conv.hpp:16
teq::TensptrsT get_contents(void) const override
Implementation of iLayer.
Definition: seqmodel.hpp:116
std::shared_ptr< iLayerBuilder > LBuilderptrT
Layer builder smart pointer.
Definition: layer.hpp:179
void copy_helper(const SequentialModel &other, std::string label_prefix="")
Definition: seqmodel.hpp:170
std::string label_
Definition: seqmodel.hpp:35
Layer implementation that sequentially applies sublayers.
Definition: seqmodel.hpp:49
const std::string layers_key_prefix
String prefixed to every layer key.
Definition: layer.hpp:25
Definition: layer.hpp:164
std::string get_label(void) const override
Implementation of iLayer.
Definition: seqmodel.hpp:110
std::vector< LayerptrT > layers_
Definition: seqmodel.hpp:183
EigenptrT< T > sub(teq::Shape &outshape, const OpArg< T > &a, const OpArg< T > &b)
Definition: operator.hpp:679
void tag(teq::TensptrT tensor, LayerId subs) const
std::string get_ltype(void) const override
Implementation of iLayer.
Definition: seqmodel.hpp:104
std::shared_ptr< iTensor > TensptrT
Tensor smart pointer.
Definition: itensor.hpp:51
std::shared_ptr< SequentialModel > SeqModelptrT
Smart pointer of sequentially connected model.
Definition: seqmodel.hpp:187
std::vector< TensptrT > TensptrsT
Vector of tensor smart pointers.
Definition: itensor.hpp:60
Sublayer type, label, and index encapsulation.
Definition: layer.hpp:35
iLayer * clone_impl(const std::string &label_prefix) const override
Definition: seqmodel.hpp:165
SequentialModel(const SequentialModel &other, std::string label_prefix="")
Definition: seqmodel.hpp:54
LayerptrT build(void) const override
Implementation of iLayerBuilder.
Definition: seqmodel.cpp:8
void set_sublayer(LayerptrT layer) override
Implementation of iLayerBuilder.
Definition: seqmodel.hpp:26
SequentialModel & operator=(const SequentialModel &other)
Definition: seqmodel.hpp:60
std::shared_ptr< iNode< T > > NodeptrT
Smart pointer of node.
Definition: inode.hpp:63
SequentialModel(const std::string &label)
Definition: seqmodel.hpp:51
SequentialModel * clone(std::string label_prefix="") const
Return deep copy of this model with prefixed label.
Definition: seqmodel.hpp:74
std::shared_ptr< iLayer > LayerptrT
Smart pointer of layer.
Definition: layer.hpp:159
size_t get_noutput(void) const override
Implementation of iLayer.
Definition: seqmodel.hpp:92
void set_tensor(teq::TensptrT tens, std::string target) override
Implementation of iLayerBuilder.
Definition: seqmodel.hpp:23
Definition: layer.hpp:121
SeqModelBuilder(std::string label)
Definition: seqmodel.hpp:20