当前位置: 首页 > news >正文

内置函数和消息传递API

消息传递范式

消息函数、聚合函数与更新函数

消息函数接受一个参数 edges,这是一个 EdgeBatch 的实例, 在消息传递时,它被DGL在内部生成以表示一批边。edgessrcdstdata 共3个成员属性, 分别用于访问源节点、目标节点和边的特征。

聚合函数 接受一个参数 nodes,这是一个 NodeBatch 的实例, 在消息传递时,它被DGL在内部生成以表示一批节点。nodes 的成员属性 mailbox 可以用来访问节点收到的消息。 一些最常见的聚合操作包括 sum、max、min 等。

更新函数 接受一个如上所述的参数 nodes。此函数对 聚合函数 的聚合结果进行操作, 通常在消息传递的最后一步将其与节点的特征相结合,并将输出作为节点的新特征。

DGL在命名空间 dgl.function 中实现了常用的消息函数和聚合函数作为 内置函数
一般来说,DGL建议 尽可能 使用内置函数,因为它们经过了大量优化,并且可以自动处理维度广播。

内置消息函数可以是一元函数或二元函数。

  • 对于一元函数,DGL支持 copy 函数。
  • 对于二元函数, DGL现在支持 add、 sub、 mul、 div、 dot 函数。

消息的内置函数的命名约定是 u 表示 源 节点v 表示 目标 节点e 表示
这些函数的参数是字符串,指示相应节点和边的输入和输出特征字段名。

关于内置函数的列表,请参见: DGL-Built-in Function
下面表中标识了其中给出的各种消息传递函数以及常见的聚合函数:
在这里插入图片描述

例如,要对源节点的 hu 特征和目标节点的 hv 特征求和, 然后将结果保存在边的 he 特征上,用户可以使用内置函数 dgl.function.u_add_v('hu', 'hv', 'he')。而以下用户定义消息函数与此内置函数等价:

def message_func(edges):return {'he': edges.src['hu'] + edges.dst['hv']}

DGL支持内置的聚合函数 summaxminmean 操作。 聚合函数通常有两个参数,它们的类型都是字符串。一个用于指定 mailbox 中的字段名,一个用于指示目标节点特征的字段名。例如, dgl.function.sum(‘m’, ‘h’) 等价于如下所示的对接收到消息求和的用户定义函数:

import torch as th
import dgl
import dgl.function as fn
def reduce_func(nodes):return {'h': torch.sum(nodes.mailbox['m'], dim=1)}

单独调用逐边计算

在DGL中,也可以在不涉及消息传递的情况下,通过 apply_edges() 单独调用逐边计算。 apply_edges() 的参数是一个消息函数。并且在默认情况下,这个接口将更新所有的边。例如:

 import dgl.function as fngraph.apply_edges(fn.u_add_v('el', 'er', 'e'))

消息传递高级API

对于消息传递, update_all() 是一个高级API。它在单个API调用里合并了消息生成、 消息聚合和节点特征更新,这为从整体上进行系统优化提供了空间。
update_all() 的参数是一个消息函数、一个聚合函数和一个更新函数。
更新函数是一个可选择的参数,用户也可以不使用它,而是在 update_all 执行完后直接对节点特征进行操作。 由于更新函数通常可以用纯张量操作实现,所以DGL不推荐在 update_all 中指定更新函数。例如:

def update_all_example(graph):# 在graph.ndata['ft']中存储结果graph.update_all(fn.u_mul_e('ft', 'a', 'm'),# 消息函数fn.sum('m', 'ft'))# 聚合函数# 在update_all外调用更新函数final_ft = graph.ndata['ft'] * 2return final_ft

update_all函数对应的数学公式为:
在这里插入图片描述

此调用通过将源节点特征 ft 与边特征 a 相乘生成消息 m, 然后对所有消息求和来更新节点特征 ft,再将 ft 乘以2得到最终结果 final_ft。

简单应用

# 边 0->1, 0->2, 0->3, 1->3
u, v = th.tensor([0,1,2,3,3,4,4]), th.tensor([2,0,1,2,5,1,3])
g = dgl.graph((u, v))
# bg = dgl.to_bidirected(g)#无向图g.ndata['x'] = th.ones(g.num_nodes(),3,dtype=th.float32)               # 长度为3的节点特征
g.ndata['ft'] = th.ones(g.num_nodes(),3,dtype=th.float32)               # 长度为3的节点特征g.edata['a'] = th.ones(g.num_edges(),3,dtype=th.float32)  # 标量整型特征
print(g.ndata)
temp = update_all_example(g)
print('temp:',temp)

执行结果:
在这里插入图片描述
执行结果分析:
在这里插入图片描述

本小节全部代码

"""消息传递范式消息函数 接受一个参数 edges,这是一个 EdgeBatch 的实例, 在消息传递时,它被DGL在内部生成以表示一批边。
edges 有 src、 dst 和 data 共3个成员属性, 分别用于访问源节点、目标节点和边的特征。聚合函数 接受一个参数 nodes,这是一个 NodeBatch 的实例, 在消息传递时,它被DGL在内部生成以表示一批节点。
nodes 的成员属性 mailbox 可以用来访问节点收到的消息。 一些最常见的聚合操作包括 sum、max、min 等。更新函数 接受一个如上所述的参数 nodes。此函数对 聚合函数 的聚合结果进行操作, 通常在消息传递的最后一步将
其与节点的特征相结合,并将输出作为节点的新特征。DGL在命名空间 dgl.function 中实现了常用的消息函数和聚合函数作为 内置函数。
一般来说,DGL建议 尽可能 使用内置函数,因为它们经过了大量优化,并且可以自动处理维度广播。
""""""
内置消息函数可以是一元函数或二元函数。对于一元函数,DGL支持 copy 函数。
对于二元函数, DGL现在支持 add、 sub、 mul、 div、 dot 函数。
消息的内置函数的命名约定是 u 表示 源 节点, v 表示 目标 节点,e 表示 边。
这些函数的参数是字符串,指示相应节点和边的输入和输出特征字段名。关于内置函数的列表,请参见: DGL-Built-in Function: https://docs.dgl.ai/api/python/dgl.function.html#api-built-in例如,要对源节点的 hu 特征和目标节点的 hv 特征求和, 然后将结果保存在边的 he 特征上,用户可以使用内置函数 dgl.function.u_add_v('hu', 'hv', 'he')。
而以下用户定义消息函数与此内置函数等价。
def message_func(edges):return {'he': edges.src['hu'] + edges.dst['hv']}
""""""
例如,要对源节点的 hu 特征和目标节点的 hv 特征求和, 然后将结果保存在边的 he 特征上,
用户可以使用内置函数 dgl.function.u_add_v('hu', 'hv', 'he')。 而以下用户定义消
息函数与此内置函数等价。
"""
def message_func(edges):return {'he': edges.src['hu'] + edges.dst['hv']}"""
DGL支持内置的聚合函数 sum、 max、 min 和 mean 操作。 聚合函数通常有两个参数,它们的类型都是字符串。
一个用于指定 mailbox 中的字段名,一个用于指示目标节点特征的字段名,
例如, dgl.function.sum('m', 'h') 等价于如下所示的对接收到消息求和的用户定义函数:
"""
import torch as th
import dgl
import dgl.function as fn
def reduce_func(nodes):return {'h': torch.sum(nodes.mailbox['m'], dim=1)}"""单独调用逐边计算
在DGL中,也可以在不涉及消息传递的情况下,通过 apply_edges() 单独调用逐边计算。 
apply_edges() 的参数是一个消息函数。并且在默认情况下,这个接口将更新所有的边。例如:
"""
# import dgl.function as fn
# graph.apply_edges(fn.u_add_v('el', 'er', 'e'))"""消息传递高级API
对于消息传递, update_all() 是一个高级API。它在单个API调用里合并了消息生成、 消息聚合和节点特征更新,
这为从整体上进行系统优化提供了空间。update_all() 的参数是一个消息函数、一个聚合函数和一个更新函数。 
更新函数是一个可选择的参数,用户也可以不使用它,而是在 update_all 执行完后直接对节点特征进行操作。 
由于更新函数通常可以用纯张量操作实现,所以DGL不推荐在 update_all 中指定更新函数。例如:
"""
def update_all_example(graph):# 在graph.ndata['ft']中存储结果graph.update_all(fn.u_mul_e('ft', 'a', 'm'),# 消息函数fn.sum('m', 'ft'))# 聚合函数# 在update_all外调用更新函数final_ft = graph.ndata['ft'] * 2return final_ft"""
此调用通过将源节点特征 ft 与边特征 a 相乘生成消息 m, 然后对所有消息求和来更新节点特征 ft,再将 ft 乘以2得到最终结果 final_ft。
"""
# 边 0->1, 0->2, 0->3, 1->3
u, v = th.tensor([0,1,2,3,3,4,4]), th.tensor([2,0,1,2,5,1,3])
g = dgl.graph((u, v))
# bg = dgl.to_bidirected(g)#无向图g.ndata['x'] = th.ones(g.num_nodes(),3,dtype=th.float32)               # 长度为3的节点特征
g.ndata['ft'] = th.ones(g.num_nodes(),3,dtype=th.float32)               # 长度为3的节点特征g.edata['a'] = th.ones(g.num_edges(),3,dtype=th.float32)  # 标量整型特征
print(g.ndata)
temp = update_all_example(g)
print('temp:',temp)

相关文章:

内置函数和消息传递API

消息传递范式 消息函数、聚合函数与更新函数 消息函数接受一个参数 edges,这是一个 EdgeBatch 的实例, 在消息传递时,它被DGL在内部生成以表示一批边。edges 有 src、 dst 和 data 共3个成员属性, 分别用于访问源节点、目标节点…...

不标年份的葡萄酒质量好吗?

我们在葡萄酒标上经常看到生产年份,也就是指全部葡萄采摘的年份。旧世界葡萄酒产国认为葡萄酒年份对他们的影响较大,而新世界葡萄酒,年份的意义就稍微小些。甚至有一部分葡萄酒酒标上没有年份。在酒标上没有标注年份的葡萄酒,被称…...

2023年【高处安装、维护、拆除】模拟考试题及高处安装、维护、拆除模拟考试题库

题库来源:安全生产模拟考试一点通公众号小程序 2023年【高处安装、维护、拆除】模拟考试题及高处安装、维护、拆除模拟考试题库,包含高处安装、维护、拆除模拟考试题答案和解析及高处安装、维护、拆除模拟考试题库练习。安全生产模拟考试一点通结合国家…...

简单模拟 Spring 创建的动态代理类(解释一种@Transactional事务失效的场景)

模拟 Spring 创建的动态代理类 本文主要目的是从父类和子类继承的角度去分析为什么在 Service 标注的业务类中使用 this 调用方法会造成事务失效。解释在这种情况下 this 为什么是原始类对象而不是代理类对象。 问题描述 在 Service 标注的业务类中,如果调用本类…...

万户OA upload任意文件上传漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息…...

如何写好一篇软文?怎样写软文比较有吸引力?

软文,即柔性广告,是一种通过文字、图片等形式,将广告信息融入到内容中,以达到宣传、推广、营销目的的文章。企业和品牌每天都会在互联网上投放大量软文,软文起到润物细无声的作用,可以在无形中影响用户心智…...

从0开始学习JavaScript--JavaScript中的对象

JavaScript中的对象是一种重要的数据结构,它不仅是语言的基石,还提供了丰富的功能和灵活性。本文将深入研究JavaScript对象的创建、属性访问、方法定义,以及实际应用中的技巧,通过丰富的示例代码,帮助读者更全面地了解…...

【LeetCode刷题】--7.整数反转

7.整数反转 注意&#xff1a;在推入数字之前&#xff0c;需要判断MIN_VALUE< res*10digit<MAX_VALUE&#xff0c;不满足就返回0 class Solution {public int reverse(int x) {int res 0;while(x!0){//需要判断MIN_VALUE< res*10digit<MAX_VALUEif(res < Integ…...

Genio 500_MT8385安卓核心板:功能强大且高效

Genio 500(MT8385)安卓核心板是一款功能强大且高效的AIoT平台&#xff0c;内置的AI处理器(APU)工作频率可达500MHz&#xff0c;支持深度学习、神经网络加速和计算机视觉应用。配合高达2500万像素的摄像头&#xff0c;可以为AI相机应用提供清晰、精确的图像&#xff0c;如人脸识…...

idea导入javaweb变成灰色

解决办法&#xff1a; 如果这时候src是蓝色&#xff0c;其余都是灰色文件夹&#xff0c;这时候要先把src文件夹变成灰色&#xff0c;否则之后会报错 src文件变成灰色方法&#xff0c;右键src,选择make direcory as 选择unmark 如果src不是蓝色&#xff0c;就是灰色&#xff0…...

SpringBoot集成Memcached

SpringBoot集成Memcached 1、Memcached 介绍 Memcached 是一个高性能的分布式内存对象缓存系统&#xff0c;用于动态Web应用以减轻数据库负载。它通过在内存中 缓存数据和对象来减少读取数据库的次数&#xff0c;从而提高动态、数据库驱动网站的速度。Memcached基于一个存储…...

git基本操作(配图超详细讲解)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 创建git本地仓库 配置仓库 认识工作区&#xff0c;暂存区&#xff0c;版本库 修改文件 版本回退 撤销修改 删除文件 创建git本地仓库 要提前说的是&#xff0c;仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂…...

【网络通信】浅析UDP与TCP协议的奥秘

在现代互联网中&#xff0c;UDP&#xff08;用户数据报协议&#xff09;和TCP&#xff08;传输控制协议&#xff09;是两种最常用的传输协议&#xff0c;它们被广泛应用于网络数据传输。尽管这两种协议都可以用来在网络上传输数据&#xff0c;但它们在设计目标、特点和适用场景…...

C#核心笔记——(二)C#语言基础

一、C#程序 1.1 基础程序 using System; //引入命名空间namespace CsharpTest //将以下类定义在CsharpTest命名空间中 {internal class TestProgram //定义TestProgram类{public void Test() { }//定义Test方法} }方法是C#中的诸多种类的函数之一。另一种函数*&#xff0c;还…...

C++ 删除无头链上所有指定值为x的节点。

C 删除无头链上所有指定值为x的节点。 #include<stdio.h> #include<ctype.h> #include<stdlib.h> typedef struct app {int data;struct app* next; }APP; int main() {int n;int node;int x;while (scanf("%d", &n) ! EOF){APP* head NULL, …...

linux基本指令以及热键

基本指令 ♥clear ♥whoami ♥who ♥pwd ♥ls指令&#xff08;重点&#xff09; ls -a&#xff1a; ls -l ♥mkdir ♥cd指令 ♥touch指令 ♥stat指令 ♥rmdir指令 && rm 指令 ♥man指令 ♥nano指令 ♥cp指令 ♥mv指令 ♥cat指令 &#x1f5e1;输出/输出重定向 &#x1…...

Rocketmq消费消息时不丢失不重复

消息消费不丢失 手动ACK 在消费者端&#xff0c;需要确保在消息拉取并消费成功之后再给Broker返回ACK&#xff0c;就可以保证消息不丢失了&#xff0c;如果这个过程中Broker一直没收到ACK&#xff0c;那么就可以重试。所以&#xff0c;在消费者的代码中&#xff0c;一定要在业…...

RedisInsight——redis的桌面UI工具使用实践

下载 官网下载安装。下载地址在这里 填个邮箱地址就可以下载了。 安装使用。 安装成功后开始使用。 1. 你可以add一个地址。或者登录redis cloud 去auto-discover 2 . 新增你的redis库地址。注意index的取值 3。现在可以登录到redis了。看看结果 这是现在 在服务器上执行…...

JVM对象创建与内存分配

对象的创建 对象创建的主要流程&#xff1a; 类加载推荐博客&#xff1a;JVM类加载机制详解 类加载检查 虚拟机遇到一条new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析…...

央国企数字化转型难在哪?为什么要数字化转型?

科技在发展&#xff0c;技术在升级&#xff0c;全球信息化、数字化的步伐在加快&#xff0c;企业想要在未来的发展中抓住机会&#xff0c;更好地发展壮大&#xff0c;就需要加快企业数字化转型的速度&#xff0c;才能立足于信息化、数字化时代&#xff0c;央国企作为企业中的一…...

MySQL体系架构解析(二):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录&#xff0c;这个目录下存放着许多可执行文件。与其他系统的可执行文件类似&#xff0c;这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中&#xff0c;用…...

Qt客户端技巧 -- 窗口美化 -- 圆角窗口

不解析&#xff0c;直接给代码例子 利用窗口重绘事件处理函数paintEvent main.cpp #include <QtCore/qglobal.h> #if QT_VERSION > 0x050000 #include <QtWidgets/QApplication> #else #include <QtGui/QApplication> #endif#include "roundedwin…...

ES6——对象扩展之Set对象

在ES6&#xff08;ECMAScript 2015&#xff09;中&#xff0c;Set 对象允许存储任何类型的唯一值&#xff0c;无论是原始值还是对象引用。Set 对象有一些有用的方法&#xff0c;可以操作集合中的数据。以下是一些常用的 Set 对象方法&#xff1a; 方法描述 add 向 Set 对象添加…...

MiniExcel模板填充Excel导出

目录 1.官方文档 2. 把要导出的数据new一个匿名对象 3.导出 4.注意事项 5.模板制作 6.结果 1.官方文档 https://gitee.com/dotnetchina/MiniExcel/#%E6%A8%A1%E6%9D%BF%E5%A1%AB%E5%85%85-excel // 1. By POCO var value new {Name "Jack",CreateDate n…...

CentOS8.3+Kubernetes1.32.5+Docker28.2.2高可用集群二进制部署

一、准备工作 1.1 主机列表 HostnameHost IPDocker IPRolek8s31.vm.com192.168.26.3110.26.31.1/24master&worker、etcd、dockerk8s32.vm.com192.168.26.3210.26.32.1/24master&worker、etcd、dockerk8s33.vm.com192.168.26.3310.26.33.1/24master&worker、etcd、…...

IDEA 中 Maven Dependencies 出现红色波浪线的原因及解决方法

在使用 IntelliJ IDEA 开发 Java 项目时&#xff0c;尤其是基于 Maven 的项目&#xff0c;开发者可能会遇到 Maven Dependencies 中出现红色波浪线的问题。这种现象通常表示项目依赖未能正确解析或下载&#xff0c;导致代码提示错误、编译失败等问题。本文将详细分析该问题的常…...

如何给windos11 扩大C盘容量

动不动C盘就慢了&#xff0c;苹果逼着用户换手机&#xff0c;三天两头更新系统&#xff0c;微软也是毫不手软。c盘 从10个G就够用&#xff0c;到100G 也不够&#xff0c;看来通货膨胀是部分行业的。 在 Windows 11 中扩大 C 盘容量&#xff0c;主要取决于磁盘分区布局和可用空…...

MySQL 索引:为使用 B+树作为索引数据结构,而非 B树、哈希表或二叉树?

在数据库的世界里&#xff0c;性能是永恒的追求。而索引&#xff0c;作为提升查询速度的利器&#xff0c;其底层数据结构的选择至关重要。如果你深入了解过 MySQL&#xff08;尤其是其主流存储引擎 InnoDB&#xff09;&#xff0c;你会发现它不约而同地选择了 B树 作为索引的主…...

行列式的性质

1 行列式使用如下性质定义 1&#xff09;单位矩阵行列式值为 1&#xff0c; &#xff0c;对于任意单位矩阵均成立&#xff1b; 2&#xff09;当矩阵交换一行后&#xff0c;行列式值改变符号&#xff0c;如置换矩阵的行列式值为 &#xff08;根据行交换次数决定&#xff09;&…...

《前端面试题:CSS预处理器(Sass、Less等)》

CSS预处理器深度解析&#xff1a;Sass与Less的全面指南 掌握CSS预处理器是现代前端开发的必备技能&#xff0c;也是提升开发效率的关键工具 一、为什么需要CSS预处理器&#xff1f; 在现代前端开发中&#xff0c;原生CSS的局限性日益明显&#xff1a; 缺乏编程特性&#xff0…...