Transcript PowerPoint

S8.
コルモゴロフ複雑性に基づく
プロダクト派生木復元の試み
早瀬 康裕
神田 哲也,石尾 隆
筑波大学
大阪大学
背景
• ソフトウェアプロダクトの派生開発
• 新たなプロダクトを作成する際に,既存の似たプロダクトを
改変して実現
• 0から開発するより,低コストで高信頼
• 派生関係を記録しておくことは大切
• 派生プロダクトへの修正の伝搬 → 修正全体の 40% に及
ぶことも [野中2009]
• 利用実績の評価
• 次に開発する製品に役立つ,あるいは近い機能を持つ製品
を探す
[野中2009] 野中ら, “組込みソフトウェア製品ファミリにおける是正保守の予備的分
析“,情報処理学会研究報告, SE-166-13
3
突然ですが,企業の人に質問してみました
質問1. バージョン管理はされていないのですか?
私たちのシステムはバージョン管理システムの
出現よりも前から開発されています.
個別の製品単位ではバージョン管理されていますが,
複数のプロジェクトの関係はわかりません.
4
質問2. リリース日付は分かりますか?
もちろん記録してあります
確認してみないと分かりませんが,
たぶん記録されていると思います
すみません
先行研究 PRET [4]
• ソースコードの内容のみから,バージョン
グラフを復元する手法
ソフトウェア
プロダクト集合
派生関係木
PRET の処理 (1/4)
手順1. プロダクトの類似性を,類似したソースファイル
の組の数と定義し,全てのプロダクトの類似性を求め
る
:類似度の高いソースファイル
ソフトウェアA
ソフトウェアA
ソフトウェアB
ソフトウェアC
類似度の高いソースファイル:4組
類似度の高いソースファイル:2組
[4] Kanda et al., “Extraction of Product Evolution Tree from Source Code of Product Variants”, SPLC ’13
PRET の処理 (2/4)
手順2. 頂点をプロダクト,「-類似性」を辺の重
みとした完全グラフを作り,最小全域木を構築
する
-7
-4
-7
-5
-5
-2
-3
-4
-5
-4
-3
-6
距離の合計:-43
-5
比較の始点
-6
距離の合計:-23
PRET の処理 (3/4)
手順3. Diffの追加行数が多くなる方向に,辺の
方向を推定
+80行
+20行
+420行
+50行
PRET の処理 (4/4)
ファイルの類似を判定する方法
• 2つのソースファイルの内容をトークン列に変換 (コメ
ントを捨てる)
• トークン列の LCS を計算 (diffコマンドを使用)
• LCSに含まれるトークン数が閾値以上ならば,ファイ
ルが類似していると判定
• 実験では,閾値を9割にした場合が,推定結果が最良に
なった
モチベーション
PRETの特徴
• ファイルが似ているかどうかに捨象
• 類似の閾値を事前に決定する必要がある
• 決定した閾値よりも大きな変更,もしくは小さな変更が多くを占めている
と,プロダクトの類似性を上手く判定できない
• ソースコードのトークンのみを利用
• コメントや,ソースツリー内のテキストファイルを利用して結果
を改善できないか?
• 正味の変更量を計りたい
キーアイデア
• ソースコードのコルモゴロフ複雑性[5] を,ソースコー
ドの情報量と仮定
• コルモゴロフ複雑性とは,文字列の複雑さの一つの定義
• 文字列を出力する最短のプログラムの長さを,その文字列
の複雑さと考える
• 一般には,コルモゴロフ複雑性の値は計算不能
• 可逆圧縮後のサイズを近似値として採用することが多い
• コルモゴロフ複雑性の増分が小さいプロダクトの間に
派生関係があると考える
提案手法のアルゴリズム (1/4)
• 入力
• プ
ロダクト集合 P = {p1, p2, …, pn}
• 出力
• プロダクトの派生関係を表す有向グラフ G = {P, E}
• 手順1 各 pi から,画像などのバイナリファイルを取り除く
プロダクトp2
プロダクトp1
README
mp3
c
cpp
c
txt
jpg
.h
提案手法のアルゴリズム (2/4)
• 手順2 各 pi について, pi を tar でアーカイブし,可逆圧縮した
ときのサイズ C(pi) を求める
プロダクトp2
プロダクトp1
README
c
cpp
C(p1) = 300
c
txt
.h
C(p2) = 500
提案手法のアルゴリズム (3/4)
• 手順3 プロダクトの全ての二個組 (pi, pj) について,pi と pj を
結合した仮想的なプロダクト pi・pj を構成し,それを可逆圧縮
したサイズ C(pi・pj) を求める
プロダクトp2
プロダクトp1
c
README
cpp
c
txt
.h
仮想プロダクト p1・p2
README
c
cpp
c
txt
.h
C(p1・p2) = 600
提案手法のアルゴリズム (4/4)
• 手順4 プロダクトpi に対してプロダクトpj を追加したときの増
加情報量 I(pi, pj) = C(pi · pj) − C(pi) を求める
• 手順5 増加情報量に基づいてグラフを構築する
• 仮定1 派生プロダクトの情報量は,派生元プロダクトの情報量より多い
• 仮定2 派生元プロダクトに派生プロダクトを結合したときの増加情報量
は少ない
• 仮定3 1つのプロダクトの派生元プロダクトは,たかだか1つである
プ
ロダクト q について, q よりも圧縮後のデータ量が小さいプロダクトのう
ち,q を結合したときの増加情報量が最も小さいプロダ
クト p から q に辺
-7
を引く
C=90
C=80
I=30
I=40
C=100
C=120
評価実験
• 目的: 提案手法とPRETの推定結果を比較する
• データセット: PRETの評価実験と同じ
• DS1 開発が分岐していないプ
ロダクト集合 (PostgreSQL 7.x, 8.x.0,
9.x.0)
• DS2 組織内で開発が分岐したプ
ロダクト集合 (PostgreSQL 8.x.y)
• DS3 プロダクトファミリのうち新しいいくつかの製品しか残っていない場
合 (PostgreSQL 8.x.y, ただし y は各ブランチの最終7つ)
• DS4 プロダクトファミリのうち過去の製品の一部が欠落している場合
(PostgreSQL のリリースを1年毎にサンプル)
• DS5 プロジ
ェクトが 2 つに分岐した場合 (FFmpeg, libav)
• DS6 プ
ロジェクトが 3 つ以上に分岐し,複数回の併合が起こった場合
(*-BSD)
評価方法
• 評価基準
• 再現率と適合率
• 誤りの評価
• 辺の向きが逆
• nバージョンスキップ
• 正しい派生関係が A → B → C → D であるときに, A → D という辺が出力される
と,2バージョンスキップの辺が1つあるとみなす.
• 実行の方法
• 提案手法の可逆圧縮には, gzip, bzip2, xz を使用 (全て -9 オプション
を付与)
• PRET でファイル類似を判定する閾値は,結果が最良となる 0.9 を採
用
実験結果
データ
• 3件 PRETの勝利
DS1
• 2件 提案手法の勝利
• 1件 引き分け
DS2
DS3
DS4
DS5
DS6
正解
手法
辺数
gz
bz2
12
xz
PRET
gz
bz2
143
xz
PRET
gz
bz2
37
xz
PRET
gz
bz2
24
xz
PRET
gz
bz2
15
xz
PRET
gz
bz2
17
xz
PRET
出
誤り
力
skip
適合数 適合率 再現率
辺
逆
1
2
>3
数
12
12
1.00
1.00 0
0
0
0
12
12
1.00
1.00 0
0
0
0
12
12
1.00
1.00 0
0
0
0
12
11 0.917 0.917 1
0 N/A N/A
143
105 0.734 0.734 3 22
5
3
143
58 0.406 0.406 11 22
8 33
143
122 0.853 0.853 4
9
2
0
143
128 0.895 0.895 8
1 N/A N/A
37
24 0.649 0.649 0
6
1
0
37
21 0.568 0.568 0
4
4
1
37
29 0.784 0.784 0
1
1
0
37
30 0.811 0.811 0
0 N/A N/A
24
20 0.833 0.833 0
0
0
0
24
14 0.583 0.583 0
2
3
1
24
20 0.833 0.833 0
0
0
0
24
20 0.833 0.833 0
0 N/A N/A
15
14 0.933 0.933 0
0
0
0
15
1 0.0667 0.0667 2
4
1
1
15
7 0.467 0.467 3
4
0
0
15
11 0.733 0.733 2
1 N/A N/A
15
10 0.667 0.588 0
0
0
0
15
10 0.667 0.588 0
0
0
0
15
8 0.533 0.471 1
1
0
0
15
12 0.800 0.706 3
0 N/A N/A
適合率の概観
1
0.8
0.6
0.4
0.2
0
DS1
提案手法 (gzip -9)
DS2
DS3
提案手法 (bzip2 -9)
DS4
DS5
提案手法 (xz -9)
DS6
PRET (閾値=0.9)
考察
• DS1とDS4の結果から,提案手法はプロダクトの大きな変化に強い
可能性がある
• 圧縮アルゴリズムによる精度の違いは, gzip > xz > bzip2
• gzip は圧縮率が安定している
• bzip2 は,圧縮率は gzip より優れているものの,圧縮率が非常に不安定
• xz は圧縮率が高く,圧縮率も安定しているが,推定結果はあまり良くない
表2 PostgreSQL 8.0.x のソースコードに対する圧縮率
圧縮率
圧縮手法
標準偏差/平均
(平均 ± 標準偏差)
gzip -9
0.231 ± 0.000384
0.00166
bzip2 -9
0.182 ± 0.000368
0.00202
xz -9
0.163 ± 0.000233
0.00143
まとめ
• コルモゴロフ複雑度を用いた,プロダクト派生グラフの推定手
法を提案
今後の課題
• PRET と組み合わせることで,精度を高める方法を検討
• 他の圧縮アルゴリズムの採用を検討
• 高圧縮であることより,人間の編集操作を反映した圧縮であることが精
度を高める可能性あり
• グラフ構築方法の改善
• 提案手法およびPRETは木構造を前提としているが,マージが起こると
木構造ではなくなる
• 計算速度の向上 (現在は O(n^2))