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 软件网络建模示例
   142   143   144   145   146   147   148   149   150   151   152