Page 147 - 《软件学报》2025年第5期
P. 147
邓文涛 等: 基于图神经网络的多粒度软件系统交互关系预测 2047
在 Graph Transformer 模型中, L 表示模型的层数, H 表示注意力数量, k 表示从 1 到 h 注意力的数量, Q、K、
V 分别表示查询向量、键向量和值向量, Product 表示向量间的点积, Scaling 的作用是将向量数据缩放为单位向
量, Softmax 作为激活函数, 用于将缩放后的向量转换成概率分布, Sum 得到的是 Softmax 概率值和值向量 V 的乘
积值在不同注意力数量下的累加和, Concat 为注意力特征融合, O 是一个多维 n 阶方阵, Add & Norm 和 FNN 分别
为归一化和前馈神经网络, 详细描述见第 2.3 节.
2.1 软件网络建模
利用 Dependency Finder (https://sourceforge.net/projects/depfind/) 工具逆向解析项目源码, 得到包、类和函数
粒度分别的依赖关系, 以粒度元素为节点, 元素间的依赖关系为边, 构建相应的软件网络模型 [25] . 本文软件建模只
考虑元素间是否存在交互关系, 不考虑具体的调用方向和次数, 原因有如下 3 点: (1) 研究目的. 我们的研究目标是
在此领域的研究初期设计一个通用的、可扩展的多粒度软件系统交互关系预测框架, 以便更好地适应不同项目和
场景, 因此不希望使模型复杂化, 增加相关研究人员对本文方法的理解难度. (2) 复杂性和可解释性的平衡. 引入依
赖类型、权重和方向等因素会增加模型的复杂性, 并导致更难以解释的结果. 我们的方法旨在保持一定的简单性,
以确保其可解释性和适用性. (3) 因素的经验性选择. 目前在实证研究中, 涉及依赖类型、权重和方向等因素的具
体设定通常是基于经验和启发式的 [26] . 由于这些因素的选择缺乏通用性和标准化, 因此我们决定在当前研究中将
注意力放在更通用的预测框架上, 以便在未来的工作中更深入地研究这些细节. 因此本文构建的是无向无权网络.
对于各粒度软件网络建模的具体定义如下.
包粒度软件网络 (package granularity software network, PGN). 定义一个包粒度软件网络 G p =(V p , E p ), 其中节
点 v p (v p ∈V p ) 表示软件系统中的包, 若两个包 v p 与 i v p 间有依赖关系, 则二者间存在一条连边 e ij (e ij ∈E p ). 需要说明
j
的是, 包间依赖关系源于所含类间依赖关系, 即包 v p 中的某个类调用了包 v p 中的某个类, 则定义包间存在一条连
i
j
边 e ij (e ij ∈E p ).
类粒度软件网络 (class granularity software network, CGN). 定义一个类粒度软件网络 G c =(V c , E c ), 其中节点 v c
(v c ∈V c ) 表示软件系统中的类, 若两个类 v c 与 i v c 存在调用关系, 则二者间存在一条连边 e ij (e ij ∈E c ).
j
函数粒度软件网络 (function granularity software network, FGN). 定义一个函数粒度软件网络 G f =(V f , E f ), 节点
v f (v f ∈V f ) 表示软件系统中的函数方法, 若两个函数 v f 与 i v f 存在调用关系, 则二者间存在一条连边 e ij (e ij ∈E f ).
j
图 2 给出了从项目源码到软件网络建模的一个简单示例. 其中, 图 2(a) 展示了项目的 3 个源码片段, 图 2(b)
为解析的元素依赖关系, 图 2(c) 是最终构建的软件网络模型. 示例中, 类 W 的两个方法 e 和 f 均调用了类 V 的 d
方法, 则在 CGN 中存在一条交互关系边 e wv ; 而在 FGN 中则存在两条交互关系边 e e 和 d e fd , 依此类推, 构建出完整
的软件网络模型.
PGN
package P2
public class class W{ P2
class V v = new class V();
P1 P2
public void e(){
package P1 return v.d(); P1
public class class U{ }
int m; public void f(){ CGN
public void a() return v.d();
{ m−−; } } U
public void b() } P1.classU P2.classV P2.classW
{ a(); } V
public void c()
{ m++; } package P2 W
} public class class V{
public void d(){ FGN
class U u = new P1.classU.a() P2.classV.d() a
class U(); P1.classU.b() P2.classW.e() b
return u.a();
} P1.classU.c() P2.classW.f() d
}
e f
(a) 源码片段 (b) 元素依赖关系解析 (c) 软件网络建模
图 2 软件网络建模示例