---
title: 如何通过FlowOperator构建FlowGraph
description: "用户使用创建好的FlowOperator节点，创建一个FlowGraph实例，并在FlowGraph中设置输入、输出，从而完成Graph构建。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/others/dataflowdevg/dfdevc_23_0007.html
sourcePath: /source/zh/canncommercial/900/others/dataflowdevg/dfdevc_23_0007.html
indexId: 74232741eca690147156ef36edd63f6cacbf749dc6c630e318739a8345891e9469
---
# 如何通过FlowOperator构建FlowGraph

#### 功能介绍

用户使用创建好的FlowOperator节点，创建一个FlowGraph实例，并在FlowGraph中设置输入、输出，从而完成Graph构建。


#### 使用FlowOperator衍生接口定义节点

1. 包含的头文件。
  1 #include "flow_graph/data_flow.h"

2. 创建FlowOperator实例。
支持如下两种类型

  - FlowData
    1 2 auto data0 = dflow::FlowData("Data0", 0); auto data1 = dflow::FlowData("Data1", 1);

  - FlowNode
    1 auto node0 = dflow::FlowNode("node0", 2, 1);

注意：图中的data名称和node名称必须唯一。
3. 设置FlowOperator输入。
  只有FlowNode类型的FlowOperator才需要设置输入。

  设置FlowOperator输入：通过“SetInput”设置，例如： 1 2 3 auto node0 = dflow::FlowNode("node0", 2, 1) // 创建FlowNode的FlowOperator实例 .SetInput(0, data0) // 设置FlowNode第一个输入为data0 .SetInput(1, data1); // 设置FlowNode第二个输入为data1


#### FlowOperator连接边表达

FlowOperator之间的连边为数据边。数据边用于指定FlowOperator的输入。数据边表达如下。


上图的示例代码和注释如下。

```
auto data0 = dflow::FlowData("Data0", 0);
auto data1 = dflow::FlowData("Data1", 1);
auto node0 = dflow::FlowNode("flow_node0", 2, 2).SetInput(0, data0).SetInput(1, data1); // FlowData只有一个输出，因此在作为FlowNode的输入时，SetInput时不需要传FlowData的输出index。
auto node1 = dflow::FlowNode("flow_node1", 1, 1).SetInput(0, flow_node0, 0); // node0有两个输出，第一个输出作为node1的第一输入，SetInput时需要传node0的输出index=0。
auto node2 = dflow::FlowNode("flow_node2", 1, 1).SetInput(0, flow_node0, 1); // node0有两个输出，第二个输出作为node2的第一个输入，SetInput时需要传node0的输出index=1。
```

#### 创建FlowGraph实例

完成FlowOperator后，需要创建FlowGraph实例，并在FlowGraph中设置输入FlowOperator、输出FlowOperator，主要过程为：

1. 包含所需的头文件。
  1 #include "flow_graph/data_flow.h"

2. 创建FlowGraph对象。
  1 dflow::FlowGraph flow_graph("flow_graph");

  相关接口请参考FlowGraph类。

3. 设置FlowGraph输入和输出节点，使用到的主要接口为：

  - 设置FlowGraph内的输入节点：    SetInputs
。
  - 设置FlowGraph内的输出节点：    SetOutputs
。
  - 如果作为输出节点的FlowNode存在多个输出，也可以指定该FlowNode的某个输出为模型输出    SetOutputs（index）
。
如下例子是将整个node2的所有输出作为模型输出场景，如果需要设置部分节点部分输出为模型输出请参考SetOutputs（index）：
```
std::vector<FlowOperator> inputs{data0, data1};
std::vector<FlowOperator> outputs{node2};
flow_graph.SetInputs(inputs).SetOutputs(outputs);
```

如果输入为多个FlowData节点，需要保证inputs入参顺序和FlowData节点index属性指定的顺序保持一致，否则后面生成模型时会报错。例如：
```
// 准备第一个输入数据
auto data0 = dflow::FlowData("Data0", 0);   // 创建data0节点，index属性为0
// 准备第二个输入数据
auto data1 = dflow::FlowData("Data1", 1);   // 创建data1节点，index属性为1
// 设置FlowGraph输入节点
std::vector<FlowOperator> inputs{data0, data1};
```
