计算图(graph)的遍历

很久没有写博客了,忙并不是借口,懒才是理由。
一直想重构CupCnn,写成一个通用的计算图,能随意搭建各种神经网络(CupCnn只能搭建有一个链路的有序的神经网络),然后把名字也改了,叫CupDnn好了。所以,今天先写着试下遍历一个计算图吧。
先随便构造一个简单的计算图,如下:
在这里插入图片描述
关于这个图的说明:
假设每一个Unit都执行一些计算,把计算结果推送给与他相连接的Unit,下一个Unit对输入再做计算。也就是说,如果有一个Unit,有三个输入,那么为了完成计算,它必须等待三个输入都将结果输出给它,它才可以执行它的计算。比如说,fifth需要second,third,forth三个图元的输出结果,它必须等这三个图源都完成计算,并将结果递送给它,它才可以进行计算。这里的计算就是打印图元的名字。

遍历分为深度优先和广度优先,深度优先用递归实现,广度优先用任务队列实现。
代码如下:

//define graph unit
typedef struct graph_unit{
    string name;
    bool visit;
    int inputSize;
    int outputSize;
    vector<struct graph_unit *> *outputs;
    vector<struct graph_unit *> *inputs;
}Unit,*PUnit;

PUnit createGraph()
{
    PUnit input = new Unit;
    input->name = "intput";
    input->inputSize = 0;
    input->outputSize = 3;
    input->visit = false;
    input->inputs = nullptr;
    input->outputs = new vector<PUnit>;
    
    PUnit first = new Unit;
    first->name = "first";
    first->inputSize = 1;
    first->outputSize = 1;
    first->visit = false;
    first->inputs = new vector<PUnit>;
    first->outputs = new vector<PUnit>;
    
    PUnit second = new Unit;
    second->name = "second";
    second->inputSize = 1;
    second->outputSize = 1;
    second->visit = false;
    second->inputs = new vector<PUnit>;
    second->outputs = new vector<PUnit>;
    
    PUnit third = new Unit;
    third->name = "third";
    third->inputSize = 1;
    third->o
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值