bytedance

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

基本介绍

位置:tensorflow/core/graph/graph.h

 1 class Edge;
 2 class EdgeSetTest;
 3 class Graph;
 4 class GraphDef;
 5 class Node;
 6 class VersionDef;
 7 class WhileContext;
 8 
 9 class NeighborIter;  // Declared below
10 class NodeIter;      // Declared below
11 class NodeProperties;  // Defined in .cc

此部分主要涉及图结构里的节点、边、图等类的声明与定义。下面主要对class Node, class Edge, class Graph展开分析。

  

解析

(一)class Node:

其成员函数提供了一系列对节点进行操作的接口,如节点的邻节点检索、入/出节点检索、节点属性查询等。需要主要的一些细节是,class Graph是节点类的友元所以可以访问其内部的所有成员变量,而节点的属性由std::shared_ptr<NodeProperties> props_描述。

不同种类的类节点:

 1   // A set of mutually exclusive classes for different kinds of nodes,
 2   // class_ is initialized in the Node::Initialize routine based on the
 3   // node's type_string().
 4   enum NodeClass {
 5     NC_UNINITIALIZED,
 6     NC_SWITCH,
 7     NC_MERGE,
 8     NC_ENTER,
 9     NC_EXIT,
10     NC_NEXT_ITERATION,
11     NC_LOOP_COND,
12     NC_CONTROL_TRIGGER,
13     NC_SEND,
14     NC_HOST_SEND,
15     NC_RECV,
16     NC_HOST_RECV,
17     NC_CONSTANT,
18     NC_VARIABLE,
19     NC_IDENTITY,
20     NC_GET_SESSION_HANDLE,
21     NC_GET_SESSION_TENSOR,
22     NC_DELETE_SESSION_TENSOR,
23     NC_METADATA,
24     NC_OTHER  // Not a special kind of node
25   };

 

(二)class Edge:

其程成员函数提供了对边源节点与目标节点访问的借口,同时class EdgeSetTest和class Graph是其友元类,并且当前class Edge用户自己不能实例化。

除此之外,需要额外补充的是关于类class GraphEdgesIterable,该类实现对图对象中的边进行迭代器遍历,并保证跳过null的项。同时,其内部class const_iterator类的构造揭示了迭代器类的实现细节。

(三)class Graph:

 图结构包含很多不同的ops,其最主要的成员变量为std::vector<Node*> nodes_std::vector<Edge*> edges_,其成员函数包含了对这些节点与边的添加、复制、删除、更新、查找、校验等操作。

Graph对象可使用以下两种方式构造,二者构造的图包含单源节点和单汇节点:

 //可容纳registry中的ops
1
Graph::Graph(const OpRegistryInterface* ops) 2 : ops_(ops, FunctionDefLibrary()), 3 versions_(new VersionDef), 4 arena_(8 << 10 /* 8kB */) { 5 versions_->set_producer(TF_GRAPH_DEF_VERSION); 6 versions_->set_min_consumer(TF_GRAPH_DEF_VERSION_MIN_CONSUMER); 7 8 // Initialize the name interning table for assigned_device_name. 9 device_names_.push_back(""); 10 DCHECK_EQ(0, InternDeviceName(""));
11 12 // Source and sink have no endpoints, just control edges. 13 NodeDef def; 14 def.set_name("_SOURCE"); 15 def.set_op("NoOp"); 16 Status status; 17 Node* source = AddNode(def, &status); 18 TF_CHECK_OK(status); 19 CHECK_EQ(source->id(), kSourceId); 20 21 def.set_name("_SINK"); 22 Node* sink = AddNode(def, &status); 23 TF_CHECK_OK(status); 24 CHECK_EQ(sink->id(), kSinkId); 25 26 AddControlEdge(source, sink); 27 } 28
// 可容纳flib_def中的ops
29 Graph::Graph(const FunctionLibraryDefinition& flib_def) 30 : Graph(flib_def.default_registry()) { 31 // Need a new-enough consumer to support the functions we add to the graph. 32 if (flib_def.ToProto().function_size() > 0 && 33 versions_->min_consumer() < 12) { 34 versions_->set_min_consumer(12); 35 } 36 Status s = ops_.AddLibrary(flib_def); 37 CHECK(s.ok()) << s.error_message(); 38 }

 

 

当前文件里,也包含节点、邻节点的类迭代器,用于方便对其进行操作。

 

posted on 2018-01-04 14:29  bytedance  阅读(774)  评论(0编辑  收藏  举报