graphlite 同步图计算框架kcore的实现

对于一个图的kcore来说:

一个顶点可以有活跃和不活跃的两种状态。
注意:超步内部并行执行,多个超步串行执行,下一个超步需要接受上一个超步发送的消息。

顶点状态的变化情况:
第0个超步:对于不活跃的顶点,需要挑选出度小于K的节点并且使其变成不活跃的顶点,发送消息。之后这个顶点不能在变成活跃的顶点!!!对于活跃的顶点暂时不操作。

第1个超步:挑选接受消息的顶点,计算度数的减少值,看这个顶点是否满足Kcore的定义。不满足Kcore,使其不活跃(则一直让其不活跃),发送消息告诉neighbor,如果满足,则不发送消息。

如果满足Kcore,但是这个顶点的度数已经不再变化,则也让其变成不活跃。

核心思想:只要不满足kcore就让该顶点不活跃、对越接受消息后减去损失度数的顶点满足Kcore的,我们需要观察其不同超步中的顶点变化,若无变化,则让其不活跃,迭代到最后他一定是inactive的。
………………
…………………
…………………
第n个超步:和第一个超步执行过程类似。

所有顶点不活跃:程序终止!!!!
c++代码实现:

class VERTEX_CLASS_NAME(): public Vertex <Vertex_extra, double, Vertex_extra> {
public:
    void compute(MessageIterator* pmsgs) {
        Vertex_extra val;
		val = getValue();
        if (getSuperstep() == 0) {//init sendmessage votetohalt
         printf("K=%d ",K);
            if(getValue().current_degree<K)
                {
                    val.is_deleted = 1;
                    sendMessageToAllNeighbors(val);
                    voteToHalt();
                    mutableValue()->is_deleted=val.is_deleted;
                }
        //val= 1.0;
        } else {
            if (getSuperstep() >=2 &&getValue().is_deleted==0)  {//3,no same compute!
                double global_val = * (double *)getAggrGlobal(0);//digeree is same!
                if (global_val < EPS) {
                    voteToHalt(); return;
                }
            }
            double sum = 0;
            if((getValue().is_deleted)==0 ){
            for ( ; ! pmsgs->done(); pmsgs->next() ) 
                sum=sum+1; 
            val.current_degree = getValue().current_degree-sum; //update degrees

            if(val.current_degree < K){//inactive,sendmessage
                val.is_deleted = 1;
                sendMessageToAllNeighbors(val);
				voteToHalt();
            } 
            * mutableValue() = val;
            double acc = fabs(sum);
            accumulateAggr(0, &acc);//local,aggregator
        }else{
            voteToHalt();
        }
    }
    }
			
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值