Cortenn
save.hpp
Go to the documentation of this file.
1 
9 #include <list>
10 #include <unordered_set>
11 
12 #include "pbm/data.hpp"
13 
14 #ifndef PBM_SAVE_HPP
15 #define PBM_SAVE_HPP
16 
17 namespace pbm
18 {
19 
21 using PathedMapT = std::unordered_map<ade::TensptrT,StringsT>;
22 
24 struct GraphSaver final : public ade::iTraveler
25 {
26  GraphSaver (DataSaverT saver) : saver_(saver) {}
27 
29  void visit (ade::iLeaf* leaf) override
30  {
31  if (visited_.end() == visited_.find(leaf))
32  {
33  leaf->accept(stat);
34  leaves_.push_back(leaf);
35  visited_.emplace(leaf);
36  }
37  }
38 
40  void visit (ade::iFunctor* func) override
41  {
42  if (visited_.end() == visited_.find(func))
43  {
44  func->accept(stat);
45  funcs_.push_back(func);
46  visited_.emplace(func);
47 
48  ade::ArgsT children = func->get_children();
49  for (auto& child : children)
50  {
51  child.get_tensor()->accept(*this);
52  }
53  }
54  }
55 
57  void save (cortenn::Graph& out, PathedMapT labels = PathedMapT());
58 
60  std::list<ade::iLeaf*> leaves_;
61 
63  std::list<ade::iFunctor*> funcs_;
64 
66  std::unordered_set<ade::iTensor*> visited_;
67 
69  ade::GraphStat stat;
70 
71 private:
72  void save_coord (
73  google::protobuf::RepeatedField<double>* coord,
74  const ade::CoordptrT& mapper);
75 
76  void save_data (cortenn::Source& out, ade::iLeaf* in)
77  {
78  const ade::Shape& shape = in->shape();
79  char* data = (char*) in->data();
80  size_t nelems = shape.n_elems();
81  size_t tcode = in->type_code();
82  out.set_shape(std::string(shape.begin(), shape.end()));
83  out.set_data(saver_(data, nelems, tcode));
84  out.set_typecode(tcode);
85  }
86 
89 };
90 
91 }
92 
93 #endif // PBM_SAVE_HPP
void visit(ade::iLeaf *leaf) override
Implementation of iTraveler.
Definition: save.hpp:29
void save_coord(google::protobuf::RepeatedField< double > *coord, const ade::CoordptrT &mapper)
Definition: save.cpp:84
std::unordered_set< ade::iTensor * > visited_
Visited nodes.
Definition: save.hpp:66
void save(cortenn::Graph &out, PathedMapT labels=PathedMapT())
Marshal all equation graphs in roots vector to protobuf object.
Definition: save.cpp:13
ade::GraphStat stat
Internal traveler.
Definition: save.hpp:69
void save_data(cortenn::Source &out, ade::iLeaf *in)
Definition: save.hpp:76
std::list< ade::iLeaf * > leaves_
List of leaves visited (left to right)
Definition: save.hpp:60
std::unordered_map< ade::TensptrT, StringsT > PathedMapT
Map Tensptrs to a string path type.
Definition: save.hpp:21
std::function< std::string(const char *, size_t, size_t)> DataSaverT
Data serialization functor.
Definition: data.hpp:25
GraphSaver(DataSaverT saver)
Definition: save.hpp:26
std::list< ade::iFunctor * > funcs_
List of functions visited (by depth-first)
Definition: save.hpp:63
Graph serialization traveler.
Definition: save.hpp:24
DataSaverT saver_
Data serialization functor.
Definition: save.hpp:88
void visit(ade::iFunctor *func) override
Implementation of iTraveler.
Definition: save.hpp:40
Definition: data.hpp:18