10 #include <unordered_set> 13 #include "teq/functor.hpp" 24 template <
typename SAVER,
25 typename std::enable_if<
26 std::is_base_of<iSaver,SAVER>::value>::type* =
nullptr>
35 if (
false == estd::has(
visited_, leaf))
46 if (
false == estd::has(
visited_, func))
53 for (
auto& child : children)
55 child.get_tensor()->accept(*
this);
61 void save (cortenn::Graph& out)
72 std::vector<teq::iFunctor*> funcs(
funcs_.begin(),
funcs_.end());
76 std::unordered_map<teq::iTensor*,size_t> ordermap;
77 size_t nleaves = leaves.size();
78 for (
size_t i = 0; i < nleaves; ++i)
83 cortenn::Node* pb_node = out.add_nodes();
86 save_data(*pb_node->mutable_source(), tens);
88 for (
size_t i = 0, n = funcs.size(); i < n; ++i)
91 ordermap[f] = nleaves + i;
93 cortenn::Node* pb_node = out.add_nodes();
96 cortenn::Functor* func = pb_node->mutable_functor();
98 func->set_opname(opcode.
name_);
100 for (
auto& child : children)
102 cortenn::NodeArg* arg = func->add_args();
104 arg->set_idx(ordermap[tens]);
105 std::vector<double> shaper =
106 saver_.save_shaper(child.get_shaper());
107 std::vector<double> coorder =
108 saver_.save_coorder(child.get_coorder());
109 google::protobuf::RepeatedField<double> shaper_vec(
110 shaper.begin(), shaper.end());
111 google::protobuf::RepeatedField<double> coorder_vec(
112 coorder.begin(), coorder.end());
113 arg->mutable_shaper()->Swap(&shaper_vec);
114 arg->mutable_coord()->Swap(&coorder_vec);
115 arg->set_fwd(child.map_io());
136 google::protobuf::RepeatedField<google::protobuf::uint64> slist(
138 out.mutable_shape()->Swap(&slist);
139 out.set_data(
saver_.save_leaf(in));
147 google::protobuf::Map<std::string,cortenn::Tag>* tags =
148 node->mutable_tags();
150 for (
auto reppair : reps)
152 google::protobuf::RepeatedPtrField<std::string> labels(
153 reppair.second.begin(), reppair.second.end());
154 google::protobuf::MapPair<std::string,cortenn::Tag> tagpair(
156 tagpair.second.mutable_labels()->Swap(&labels);
157 tags->insert(tagpair);
168 #endif // PBM_SAVE_HPP std::list< teq::iFunctor * > funcs_
List of functions visited (by depth-first)
Definition: save.hpp:124
SAVER saver_
Definition: save.hpp:161
std::unordered_set< teq::iTensor * > TensSetT
Hash set of raw tensor pointers.
Definition: itensor.hpp:63
GraphSaver(tag::TagRegistry ®istry=tag::get_reg())
Definition: save.hpp:29
std::unordered_map< iTensor *, estd::NumRange< size_t > > graphsize_
Definition: traveler.hpp:105
virtual const ArgsT & get_children(void) const =0
Return children nodes as a vector of raw pointers.
Encoding of operation.
Definition: ifunctor.hpp:18
std::list< teq::iLeaf * > leaves_
List of leaves visited (left to right)
Definition: save.hpp:121
void accept(iTraveler &visiter) override
Implementation of iTensor.
Definition: ifunctor.hpp:33
Interface of iOperation-defined operation node.
Definition: ifunctor.hpp:28
Registry for associating tensors to tag collectives.
Definition: tag.hpp:165
std::vector< FuncArg > ArgsT
Type of functor arguments.
Definition: funcarg.hpp:101
std::string name_
String representation of operation.
Definition: ifunctor.hpp:21
void visit(teq::iLeaf *leaf) override
Implementation of iTraveler.
Definition: save.hpp:33
std::map< std::string, std::vector< std::string > > TagRepsT
Map tag key to a series of labels.
Definition: tag.hpp:21
virtual bool is_const(void) const =0
Return true if leaf is immutable, otherwise false.
void save_data(cortenn::Source &out, teq::iLeaf *in)
Definition: save.hpp:133
Traveler that maps each tensor to its subtree's maximum depth.
Definition: traveler.hpp:57
virtual std::string type_label(void) const =0
Return data type label (for better readability)
virtual Opcode get_opcode(void) const =0
Return operation encoding.
Interface to travel through graph, treating iLeaf and iFunctor differently.
Definition: itensor.hpp:24
void tag_node(cortenn::Node *node, teq::iTensor *tens, tag::TagRegistry ®istry)
Definition: save.hpp:144
TagRegistry & get_reg(void)
Return reference to global tag registry.
TagRepsT get_tags(const teq::iTensor *tens)
Return all key-labels under the collective associated with tens.
Definition: tag.hpp:184
void save(cortenn::Graph &out)
Marshal all equation graphs in roots vector to protobuf object.
Definition: save.hpp:61
tag::TagRegistry & registry_
Definition: save.hpp:163
virtual std::string to_string(void) const =0
Return the string representation of the tensor.
Interface of traversible and differentiable nodes with shape information.
Definition: itensor.hpp:36
void visit(teq::iFunctor *func) override
Implementation of iTraveler.
Definition: save.hpp:44
iterator end(void)
Return end iterator of internal array.
Definition: shape.hpp:162
iterator begin(void)
Return begin iterator of internal array.
Definition: shape.hpp:156
teq::GraphStat stat
Internal traveler.
Definition: save.hpp:130
Graph serialization traveler.
Definition: save.hpp:27
teq::TensSetT visited_
Visited nodes.
Definition: save.hpp:127
Leaf of the graph commonly representing the variable in an equation.
Definition: ileaf.hpp:19
void accept(iTraveler &visiter) override
Implementation of iTensor.
Definition: ileaf.hpp:24
virtual const Shape & shape(void) const =0
Return the shape held by this tensor.