(二)Graph类的实现

基本介绍

位置: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 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/bytedance/p/8184363.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: 中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:名、方法名、包名、型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值