Caffe2 - C++ API
A deep learning, cross platform ML framework
test_util.cc
1 #include "test_util.h"
2 
3 #include <string>
4 #include <sstream>
5 
6 namespace {
7 
8 template <typename T>
9 std::string to_string(T value) {
10  std::ostringstream os;
11  os << value;
12  return os.str();
13 }
14 
15 }
16 
17 nom::Graph<std::string> createGraph() {
19  auto entry = graph.createNode(std::string("entry"));
20  auto n1 = graph.createNode(std::string("1"));
21  auto n2 = graph.createNode(std::string("2"));
22  auto n3 = graph.createNode(std::string("3"));
23  auto n4 = graph.createNode(std::string("4"));
24  auto n5 = graph.createNode(std::string("5"));
25  auto n6 = graph.createNode(std::string("6"));
26  auto n7 = graph.createNode(std::string("7"));
27  auto exit = graph.createNode(std::string("exit"));
28  graph.createEdge(entry, n1);
29  graph.createEdge(n1, n2);
30  graph.createEdge(n2, n3);
31  graph.createEdge(n2, n4);
32  graph.createEdge(n3, n6);
33  graph.createEdge(n4, n6);
34  graph.createEdge(n6, n7);
35  graph.createEdge(n5, n7);
36  graph.createEdge(n7, exit);
37  return graph;
38 }
39 
40 nom::Graph<std::string> createGraphWithCycle() {
42  auto entry = graph.createNode(std::string("entry"));
43  auto n1 = graph.createNode(std::string("1"));
44  auto n2 = graph.createNode(std::string("2"));
45  auto n3 = graph.createNode(std::string("3"));
46  auto n4 = graph.createNode(std::string("4"));
47  auto n5 = graph.createNode(std::string("5"));
48  auto n6 = graph.createNode(std::string("6"));
49  auto n7 = graph.createNode(std::string("7"));
50  auto exit = graph.createNode(std::string("exit"));
51  graph.createEdge(entry, n1);
52  graph.createEdge(n1, n2);
53  graph.createEdge(n2, n3);
54  graph.createEdge(n2, n4);
55  graph.createEdge(n3, n6);
56  graph.createEdge(n6, n3); // Cycle
57  graph.createEdge(n4, n6);
58  graph.createEdge(n6, n7);
59  graph.createEdge(n5, n7);
60  graph.createEdge(n7, exit);
61  return graph;
62 }
63 
64 std::map<std::string, std::string> BBPrinter(typename nom::repr::NNCFGraph::NodeRef node) {
65  std::map<std::string, std::string> labelMap;
66  auto& bb = node->data();
67  labelMap["label"] = to_string((unsigned long long)node) + "\\n";
68  for (const auto& instr : bb.getInstructions()) {
69  assert(isa<nom::repr::NeuralNetOperator>(instr->data()) &&
70  "Invalid instruction.");
71  auto *op = dyn_cast<nom::repr::NeuralNetOperator>(instr->data().get());
72  bool hasOutput = false;
73  for (const auto &outEdge : instr->getOutEdges()) {
74  auto *output =
75  dyn_cast<nom::repr::NeuralNetData>(outEdge->head()->data().get());
76  labelMap["label"] += " " + output->getName();
77  hasOutput = true;
78  }
79  if (hasOutput) {
80  labelMap["label"] += " = ";
81  }
82  labelMap["label"] += op->getName();
83  for (const auto &inEdge : instr->getInEdges()) {
84  auto *arg =
85  dyn_cast<nom::repr::NeuralNetData>(inEdge->tail()->data().get());
86  labelMap["label"] += " " + arg->getName();
87  }
88  labelMap["label"] += "\\l";
89  }
90  labelMap["shape"] = "box";
91  return labelMap;
92 };
93 
94 std::map<std::string, std::string> cfgEdgePrinter(typename nom::repr::NNCFGraph::EdgeRef edge) {
95  std::map<std::string, std::string> labelMap;
96  if (edge->data() == -1) {
97  labelMap["label"] = "F";
98  } else if (edge->data() == 1) {
99  labelMap["label"] = "T";
100  }
101  return labelMap;
102 };
103 
104 std::map<std::string, std::string> NNPrinter(typename nom::repr::NNGraph::NodeRef node) {
105  std::map<std::string, std::string> labelMap;
106  assert(node->data() && "Node doesn't have data, can't render it");
107  if (isa<nom::repr::NeuralNetOperator>(node->data())) {
108  auto *op = dyn_cast<nom::repr::NeuralNetOperator>(node->data().get());
109  labelMap["label"] =
110  op->getName() + " (" + to_string((unsigned long long)node) + ")";
111  labelMap["shape"] = "box";
112  } else if (isa<nom::repr::Data>(node->data())) {
113  auto tensor = dyn_cast<nom::repr::NeuralNetData>(node->data().get());
114  labelMap["label"] = tensor->getName();
115  labelMap["label"] += "_" + to_string(tensor->getVersion()) + " " + to_string((unsigned long long)node);
116  }
117  return labelMap;
118 };
119 
121  return g.createNode(TestClass());
122 }
123 
124 std::map<std::string, std::string> TestNodePrinter(
125  nom::Graph<TestClass>::NodeRef /* unused */) {
126  std::map<std::string, std::string> labelMap;
127  labelMap["label"] = "Node";
128  return labelMap;
129 }
NodeRef createNode(T &&data)
Creates a node and retains ownership of it.
Definition: Graph.h:240
A simple graph implementation.
Definition: Graph.h:29
EdgeRef createEdge(NodeRef tail, NodeRef head, U...data)
Creates a directed edge and retains ownership of it.
Definition: Graph.h:415