(57)【特許請求の範囲】
【請求項１】
呼出し関係にある複数のメソッドのうち経路探索の起点となる複数のメソッドを結ぶ経路を前記起点となるメソッド毎に並行して経路探索を行う処理をコンピュータが実行する探索方法であって、
前記起点となる前記複数のメソッドからｎホップ目の経路探索対象となる経路が複数ある場合、メソッドに対応するクラスを記憶する記憶部を参照して、前記経路で接続された２つのメソッドに対応する経路優先度を算出し、
前記経路優先度に基づき、前記経路探索対象となる複数の経路のうちから経路探索を行う経路を特定し、
特定した前記経路に基づき前記経路探索の起点となる複数のメソッドの経路探索を行う、
探索方法。
【請求項２】
経路探索の起点となる中間地点のメソッドを特定し、前記複数のメソッド及び前記中間地点のメソッドを結ぶ経路を、前記中間地点のメソッドを含む前記経路探索の起点となる複数のメソッドのそれぞれから並行して経路探索を行う、
請求項１に記載の探索方法。
【請求項３】
前記複数のメソッド及び前記中間地点のメソッドに対応するクラス類似度に基づき、経路探索の起点となる前記中間地点のメソッドを増やす、
請求項２に記載の探索方法。
【請求項４】
複数の前記中間地点のメソッドが特定される場合、前記クラス類似度に基づき、前記複数の中間地点のメソッドの優先度を特定し、
特定した前記複数の中間地点のメソッドの優先度に従い、特定した前記複数の中間地点のメソッドのうちから前記経路探索の起点となる中間地点のメソッドを特定し、
特定した前記中間地点のメソッドを含む前記経路探索の起点となる複数のメソッドのそれぞれから並行して経路探索を行う、
請求項３に記載の探索方法。
【請求項５】
呼出し関係にある複数のメソッドのうち経路探索の起点となる複数のメソッドを結ぶ経路を前記起点のメソッド毎に並行して経路探索を行う処理をコンピュータに実行させる探索プログラムであって、
前記起点となる前記複数のメソッドからｎホップ目の経路探索対象となる経路が複数ある場合、メソッドに対応するクラスを記憶する記憶部を参照して、前記経路で接続された２つのメソッドに対応する経路優先度を算出し、
前記経路優先度に基づき、前記経路探索対象となる複数の経路のうちから経路探索を行う経路を特定し、
特定した前記経路に基づき前記経路探索の起点となる複数のメソッドの経路探索を行う、
探索プログラム。
【請求項６】
呼出し関係にある複数のメソッドのうち経路探索の起点となる複数のメソッドを結ぶ経路を前記起点のメソッド毎に並行して経路探索を行う探索装置であって、
前記起点となる前記複数のメソッドからｎホップ目の経路探索対象となる経路が複数ある場合、メソッドに対応するクラスを記憶する記憶部を参照して、前記経路で接続された２つのメソッドに対応する経路優先度を算出する優先探索節点選出部と、
前記経路優先度に基づき、前記経路探索対象となる複数の経路のうちから経路探索を行う経路を特定し、特定した前記経路に基づき前記経路探索の起点となる複数のメソッドの経路探索を行う探索部と、
を有する探索装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、探索方法、探索プログラム及び探索装置に関する。
【背景技術】
【０００２】
プログラムソースコードの解析において、プログラムソースコードに含まれる複数のメソッド間における呼出し関係の経路を抽出する方法が知られている（例えば、特許文献１参照）。これによれば、ソースコードを解析するとグラフ構造の形でメソッドの呼出し関係を抽出することができる。
【０００３】
メソッド間における呼出し関係の経路の抽出は、例えば、オープンソースソフトウェア（ＯＳＳ）に独自の機能を追加し顧客に提供する開発者が利用することが考えられる。開発者は、ＯＳＳのバージョンアップ時に変更内容の把握や必要なテスト範囲の特定などのために、抽出したグラフ構造の経路上のメソッドを調査起点にする。特に、ＯＳＳのバージョンアップの対応等で、複数のメソッド間に呼出し関係の経路があることは確実であるが、その経路が以前と変わっていないかを精査する際に上記呼出し関係の経路の抽出方法が重要になる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１２−３７５２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、ソースコードの規模が大きくなると、経路抽出対象の２メソッド間の呼出し関係の経路抽出のための探索範囲が指数関数的に増加してしまい、上記の方法では、実用的な時間で経路の抽出が完了しないという課題がある。
【０００６】
そこで、一側面では、本発明は、呼出し関係にある複数のメソッドのうち経路探索の起点となるメソッドを結ぶ経路の抽出時間を短縮することを目的とする。
【課題を解決するための手段】
【０００７】
一つの案では、呼出し関係にある複数のメソッドのうち経路探索の起点となる複数のメソッドを結ぶ経路を前記起点のメソッド毎に並行して経路探索を行う処理をコンピュータが実行する探索方法であって、前記起点となる前記複数のメソッドからｎホップ目の経路探索対象となる経路が複数ある場合、メソッドに対応するクラスを記憶する記憶部を参照して、前記経路で接続された２つのメソッドに対応する経路優先度を算出し、前記経路優先度に基づき、前記経路探索対象となる複数の経路のうちから経路探索を行う経路を特定し、特定した前記経路に基づき前記経路探索の起点となる複数のメソッドの経路探索を行う、探索方法が提供される。
【発明の効果】
【０００８】
一側面によれば、呼出し関係にある複数のメソッドのうち経路探索の起点となるメソッドを結ぶ経路の抽出時間を短縮することができる。
【図面の簡単な説明】
【０００９】
【図１】ソースコードと呼出し関係のグラフ構造との一例を示す図。
【図２】ソースコードとメソッド保持関係のグラフ構造との一例を示す図。
【図３】呼出し関係経路の抽出のための探索範囲が指数関数的に増加する一例を示す図。
【図４】一実施形態にかかる探索装置の機能構成の一例を示す図。
【図５】一実施形態にかかる呼出し関係グラフデータ格納部の一例を示す図。
【図６】一実施形態にかかるメソッド保持関係グラフデータ格納部の一例を示す図。
【図７】呼出し関係及びメソッド保持関係のグラフ構造の一例を示す図。
【図８】一実施形態にかかる経路抽出処理の一例を示すフローチャート。
【図９】一実施形態にかかる辺探索指示処理の一例を示すフローチャート。
【図１０】一実施形態にかかる経路探索進行の一例を示す図。
【図１１】一実施形態にかかるグラフ辺探索処理の一例を示すフローチャート。
【図１２】一実施形態にかかる経路出力処理の一例を示すフローチャート。
【図１３】一実施形態にかかる中間地点選出処理の一例を示すフローチャート。
【図１４】一実施形態にかかるクラス類似度の算出処理の一例を示すフローチャート。
【図１５】一実施形態にかかる経路探索進行の一例を示す図。
【図１６】一実施形態にかかる優先探索節点選出処理の一例を示すフローチャート。
【図１７】一実施形態にかかる経路探索の結果の一例を示す図。
【図１８】一実施形態にかかる経路探索の効果の一例を示す図。
【図１９】一実施形態にかかる探索装置のハードウェア構成例を示す図。
【発明を実施するための形態】
【００１０】
以下、本発明の実施形態について添付の図面を参照しながら説明する。なお、本明細書及び図面において、実質的に同一の機能構成を有する構成要素については、同一の符号を付することにより重複した説明を省く。
（はじめに）
はじめに、呼出し関係のグラフ構造のデータ化の一例について、図１を参照して説明する。図１に示すソースコードを解析すると、TranceiverのクラスのTranceiver.transmit()のメソッドが、Transformer.encode()のメソッド、Protocol.makeHeader()のメソッド、Tranceiver.send()のメソッドの３つのメソッドを呼び出している。そのうちTranceiver.send()のメソッドは、Tranceiver.transmit()と同じクラス（Tranceiver）のメソッドである。Transformer.encode()のメソッド及びProtocol.makeHeader()のメソッドは、Tranceiver.transmit()と異なるクラスのメソッドである。
【００１１】
このようにしてソースコードを解析すると、メソッドの呼出し関係を示すグラフ構造を作成できる。ここで、グラフの「節点」はメソッドを表し、グラフの「辺」はメソッドからメソッドへの呼出し関係を表す。これによれば、どのクラスがどのメソッドを保持しているかの関係も、グラフ構造でデータ化できる。
【００１２】
図２は、ソースコードとメソッド保持関係のグラフ構造との一例を示す。図２で示すソースコードは、図１で示したソースコードと同じである。ソースコードを解析すると、どのクラスがどのメソッドを保持するかのメソッド保持関係を示すグラフ構造を作成できる。例えば、図２では、グラフの節点はクラスまたはメソッドを表し、グラフの辺はクラスがメソッドを保持する関係（アノテーションが＜has＞の場合）、または実装の関係（アノテーションが＜impl＞の場合）を表す。つまり、図２では、アノテーション＜has＞はTranceiverのクラスがsendのメソッド及びtransmit()のメソッドを持っていることを示す。＜impl＞はクラス間の関係を示す。
【００１３】
図３は、メソッドｂ(節点ｂ)を経路探索の起点となる節点（以下、「起点節点」ともいう。）を中心に外側に出る辺を探索する範囲を示す。各円は、内側から順に１ホップ（１回目の辺探索）、２ホップ（２回目の辺探索）、３ホップ（３回目の辺探索）を示す。１ホップの時刻では節点ｂからの距離≦１となり、２ホップの時刻では節点ｂからの距離≦２となり、３ホップの時刻では節点ｂからの距離≦３となる。
【００１４】
１ホップ目にはｄ１個のメソッドがあり、２ホップ目にはｄ２個のメソッドがあり、３ホップ目にはｄ３個のメソッドがある。よって、距離ｒまでを探索した時点での探索済み節点の総数はおおよそｄｒ個のメソッドがある。
【００１５】
上記の探索は、メソッドｂを起点節点に外側に出る辺を探索したが、探索方向は逆方向（つまり、節点から内側に入る辺）もあるのでおおよそ２ｄｒ個のメソッドがある。ホップ数が多くなればメソッド数が指数関数的に増加する。つまり、ソースコードの規模が大きくなると、離れた経路抽出対象の２つのメソッド（以下では、「起点節点ｓ」ともいう。）間の呼出し関係経路の抽出のための探索範囲が指数関数的に増加してしまい、実用的な時間でメソッド間の呼出し関係の経路を抽出を完了することは困難になる。
【００１６】
これに対して、Dijkstra法では、辺の重みによって優先度付けを行い、経路抽出対象の２つのメソッド間の経路を探索する。しかしながら、呼出し関係のグラフ構造では辺重みがすべて同一のため、Dijkstra法での優先度付けが機能しない。よって、Dijkstra法では、ソースコードの規模が大きくなると実用的な時間で経路の抽出を完了することは困難になる。
【００１７】
また、Ａスター法は、ゴール設定までの距離が小さい経路を探索する。呼出し関係のグラフ構造では、Ａスター法が求める予測値の算出方法を新たに追加しない限り、予測値を求められない。このため、呼出し関係のグラフ構造では、Ａスター法での優先度付けが機能しない。よって、Ａスター法によっても、ソースコードの規模が大きくなると実用的な時間で経路の抽出を完了することは困難になる。
【００１８】
さらに、呼出し関係のグラフ構造では、グラフ構造上の一般の経路探索と異なり、経路抽出対象の２つの起点節点のうち、どちらが始点（呼出し元）であるか一般に判別できない。そのため両方の起点を起点に経路探索する必要がある。
【００１９】
そこで、以下に説明する本実施形態では、呼出し関係にある複数のメソッドのうち起点となるメソッドを結ぶ経路の抽出時間を短縮する探索方法を提案する。
【００２０】
［探索装置の機能構成］
まず、本実施形態に係る探索方法を実行する探索装置１の構成の一例について、図４を参照しながら説明する。図４は、一実施形態にかかる探索装置１の機能構成の一例を示す。本実施形態に係る探索装置１は、呼出し関係にある複数の節点のうち経路探索の複数の起点節点を結ぶ経路を節点毎に並行して経路探索を行う。探索装置１は、記録装置とＣＰＵ（プロセッサ）を含むコンピュータや他のデジタル処理装置であり得る。ただし、探索装置１の構成は、これに限らず、例えば、ＣＰＵを含み、インターネットやＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）等を介して記録装置へのアクセスが可能な装置であってもよい。
【００２１】
探索装置１は、探索指示部１０、グラフ探索部１１、起点集合（Ｚ）格納部１２、記憶部１３、クラス類似度計算部１４、中間地点節点選出部１５及び優先探索節点選出部１６を有する。探索指示部１０は、呼出し関係にある複数の節点のうち経路探索の複数の起点節点を結ぶ経路の探索を指示する。
【００２２】
グラフ探索部１１は、グラフ辺探索部１１１、要訪問節点集合（ｏｐｅｎ）格納部１１２、訪問済節点集合（ｃｌｏｓｅ）格納部１１３及び先行及び後続節点（ｐｒｅｖ・ｎｅｘｔ）格納部１１４を有する。
【００２３】
グラフ探索部１１は、呼出し関係のグラフ構造において、２つ以上の起点節点の探索経路を探索する。グラフ探索部１１は、各起点節点から前方方向（以下、「ｆｗｄ」ともいう。）への探索及び各起点節点から後方方向（以下、「ｂｗｄ」ともいう。）への探索を並列して別々に行う。例えば、起点節点が３つ存在する場合、グラフ探索部１１は、３つの起点節点からそれぞれｆｗｄ及びｂｗｄ方向に６つの探索を並行して行う。このとき、グラフ探索部１１は、並行して行う複数の探索（前記例では６つの探索）をbulk synchronous parallel方式等により１ホップずつ同期させる。ただし、グラフ探索部１１は、非同期で複数の探索を行うこともできる。
【００２４】
要訪問節点集合（ｏｐｅｎ）格納部１１２は、これから訪問（探索）する必要がある節点を格納する。訪問済節点集合（ｃｌｏｓｅ）格納部１１３は、訪問済（探索済）の節点を格納する。先行及び後続節点（ｐｒｅｖ・ｎｅｘｔ）格納部１１４は、先行メソッド（先行節点）との関係情報を先行節点辞書ｐｒｅｖに格納し、後続メソッド（後続節点）の関係情報を後続節点辞書ｎｅｘｔに格納する。グラフ辺探索部は、要訪問節点集合格納部１１２、訪問済節点集合格納部１１３及び先行及び後続節点格納部１１４に格納された各情報に基づき経路を探索する。
【００２５】
起点集合格納部１２は、起点節点を格納する。起点集合格納部１２の起点集合Ｚには、経路抽出対象の２つ起点節点と、中間地点節点が選択されている場合には特定の中間地点の節点とが格納される。
【００２６】
記憶部１３は、呼出し関係グラフデータ格納部１３１及びメソッド保持関係グラフデータ格納部１３２を有する。ソースコードを解析した結果、呼出し関係グラフデータ格納部１３１及びメソッド保持関係グラフデータ格納部１３２に以下の各データが保存される。
【００２７】
呼出し関係グラフデータ格納部１３１は、メソッドの呼出し関係情報を格納する。図５は、一実施形態にかかる呼出し関係グラフデータ格納部１３１の一例を示す。ソースコード解析結果求められる呼出し関係のグラフ構造のうち、リレーションタイプが「ｃａｌｌ」の情報を有する。呼出し関係グラフデータ格納部１３１は、ソース名（呼出し元メソッド）１３１ａ、ソースタイプ１３１ｂ、ディスティネーション名（呼び出し先メソッド）１３１ｃ、ディスティネーションタイプ１３１ｄ及びリレーションタイプ１３１ｅの各データ項目を有する。
【００２８】
メソッド保持関係グラフデータ格納部１３２は、クラスとメソッドとの関係及びクラスとクラスとの関係情報を格納する。ソースコード解析結果求められる呼出し関係のグラフ構造を格納するテーブルのうち、リレーションタイプが「ｈａｓ」と「ｉｍｐｌ」との情報を有する。図６は、一実施形態にかかるメソッド保持関係グラフデータ格納部１３２の一例を示す。ソースコード解析結果求められる呼出し関係のグラフ構造を格納するテーブルのうち、リレーションタイプが「ｈａｓ」と「ｉｍｐｌ」との情報を有する。メソッド保持関係グラフデータ格納部１３２は、ソース名１３２ａ、ソースタイプ１３２ｂ、ディスティネーション名１３２ｃ、ディスティネーションタイプ１３２ｄ及びリレーションタイプ１３２ｅの各データ項目を有する。
【００２９】
クラス類似度計算部は、複数の起点節点からｎホップ目の経路探索対象となる経路が複数ある場合、複数に対応するクラスを記憶する記憶部１３を参照して、前記経路で接続された２つの複数に対応するクラス類似度を算出する。
【００３０】
中間地点節点選出部１５は、路探索の起点となる中間地点のメソッド（以下、中間地点節点）ともいう。）を特定する。中間地点節点選出部１５は、複数の中間地点の節点されている場合、クラス類似度に基づき、複数の中間地点のうちから経路探索を行う中間地点の優先度を特定する。
【００３１】
優先探索節点選出部１６は、起点節点からｎホップ目の経路探索対象となる経路が複数ある場合、メソッドに対応するクラスを記憶する記憶部を参照して、前記経路で接続された２つの節点（メソッド）に対応する経路優先度を算出する。
【００３２】
グラフ探索部１１は、経路優先度に基づき、経路探索対象となる複数の経路のうちから経路探索を行う経路を特定し、特定した前記経路に基づき複数の起点節点の経路探索を行う。
【００３３】
例えば、図７に一例を示すように、ソースコード群に基づき呼出し関係グラフデータ格納部１３１が保持するメソッドの呼出し関係のグラフ構造が作成される。また、ソースコード群に基づきメソッド保持関係グラフデータ格納部１３２が保持するメソッド保持関係のグラフ構造が作成される。
【００３４】
本実施形態にかかる探索装置１は、図７のメソッドの呼出し関係のグラフ構造において特定した経路抽出対象の２つの起点節点（図７ではメソッドＱ．ｂとメソッドＶ．ｉ）とをつなぐ最短の探索経路を抽出する。
【００３５】
［経路抽出処理］
以下では、本実施形態にかかる探索装置１が実行する探索処理のうちの経路抽出処理について図８を参照して説明する。その後、探索装置１が実行する探索処理のうちの辺探索指示処理（図９）、グラフ辺探索処理（図１１）、経路出力処理（図１２）、中間地点選出処理（図１３）、クラス類似度の算出処理（図１４）、優先探索節点選出処理（図１６）の各処理が説明される。
【００３６】
図８の経路抽出処理が開始されると、探索指示部１０は、カウンタ(count)に０を設定する。カウンタには、探索のホップ数がカウントされる。探索指示部１０は、経路ａ→ｂの探索を指示する。経路ａ→ｂにて示される「ａ」及び「ｂ」は経路抽出対象の起点節点を含む。「ａ」及び「ｂ」は中間地点節点であってもよい。
【００３７】
次に、探索指示部１０は、各経路ａ→ｂに対して｛“ｆｗｄ”，”ｂｗｄ”｝の冪集合の要素を返すように設定する（ステップＳ１０１）。また、探索指示部１０は、検知結果辞書ｐを、全経路に対して空集合｛｝を返すように設定する（ステップＳ１０１）。検知結果辞書ｐは、求めている経路があったか否かの結果を保持する辞書であり、求めている経路が見つかっていない初期状態では、検知結果辞書pは空集合{}になっている。
【００３８】
検知結果辞書ｐは、求めている経路が見つかった時点で、前に進んだ方向(以下、「ｆｗｄ」ともいう。)に経路が見つかったとき（例えば、起点節点から他の起点節点又は中間地点節点に辿りついたとき）、探索指示部１０は、該当経路（例えば経路ａ→ｂ）に“ｆｗｄ”の要素を記憶する。検知結果辞書pには、後ろに進んだ方向(以下、「ｂｗｄ」ともいう。)に経路が見つかったとき、該当経路（例えば経路ａ→ｂ）に“ｂｗｄ”の要素を記憶する。
【００３９】
次に、探索指示部１０は、起点節点ｓ１を指定して図９の辺探索指示処理の実行をグラフ探索部１１に指示する（ステップＳ１０２）。また、探索指示部１０は、起点節点ｓ２を指定して辺探索指示処理の実行をグラフ探索部１１に指示する（ステップＳ１０２）。
【００４０】
（辺探索処理）
図９の辺探索指示処理が開始され、グラフ辺探索部１１１は、指定された起点節点ｓを起点集合Ｚに要素として追加する（ステップＳ２０１）。起点集合Ｚには、その時点で起点となっている節点が格納される。この時点では、起点集合Ｚには起点節点ｓ１，ｓ２が格納されていてもよい。例えば、図１０に示す呼出し関係のグラフ構造の経路抽出対象Ｑ．ｂ及びＶ．ｉのメソッドが起点節点ｓ１，ｓ２の一例である。後述する中間地点の節点（例えば、図１０のＶ．ｉ、Ｕ．ｆのメソッド）が選定された場合、起点集合Ｚには起点節点ｓ１，ｓ２とともに、これらの中間地点の節点が格納される。起点集合Ｚに格納された中間地点は起点節点の一つとして経路探索の起点となる。
【００４１】
次に、グラフ探索部１１は、インスタンスプロセスｉ１を作成し、インスタンスプロセスｉ１に、入力としてグラフ＝Ｇ、起点節点＝ｓ、方向指示＝“ｆｗｄ”を与えて、後述される図１１のグラフ辺探索処理の非同期実行を指示する（ステップＳ２０２）。また、グラフ探索部のインスタンスプロセスｉ１を作成し，インスタンスプロセスｉ１に、グラフ＝Ｇ，起点節点＝Ｓ、方向指示＝“ｂｗｄ”を与えて、グラフ辺探索の非同期実行を指示する（ステップＳ２０３）。これにより本処理を終了する。
【００４２】
なお、ステップＳ２０２の探索方向がｆｗｄ方向の場合の辺探索と、ステップＳ２０３の探索方向がｂｗｄ方向の場合の辺探索とは、別プロセスのインスタンスプロセスｉｌ毎に並行して行われる。
【００４３】
図９の辺探索指示処理が終了すると、図８のステップ１０３に戻り、探索指示部１０は、カウンタを一加算する（ステップＳ１０３）。ステップＳ１０４〜Ｓ１１０では、インスタンスプロセスｉ１のそれぞれの経路探索状況が確認される。グラフ探索部１１は、図９の辺探索指示処理において各起点節点及び中間地点節点のそれぞれに対応した探索を並列して行い、その探索報告を通知する。探索指示部１０は、グラフ探索部１１からの探索報告を受け付ける。
【００４４】
具体的には、探索指示部１０は、起点集合Ｚの全節点から“ｆｗｄ”、“ｂｗｄ”の両方の完了報告を受けたかを判定する（ステップＳ１０４）。探索指示部１０は、起点節点から進める方向がない場合にグラフ探索部１１から完了報告を受ける。探索指示部１０は、完了報告を受けたと判定した場合、ステップＳ１１８に進み、「経路なし」の通知を出力し、本処理を終了する（ステップＳ１１９）。
【００４５】
他方、探索指示部１０は、起点集合Ｚの全節点のうち完了報告を受けていない節点があると判定した場合、起点集合Ｚの各要素ｓ（各s∈Ｚ）のすべてから方向指示“ｆｗｄ”及び“ｂｗｄ”両方の「指示待ち」が通知されたかを判定する（ステップＳ１０５）。グラフ探索部１１は、例えば図３の各円で示す１ホップの“ｆｗｄ”及び“ｂｗｄ”のそれぞれの探索が終了したら「指示待ち」を通知する。グラフ探索部１１は、探索指示部１０から探索再開の指示を受けるまで、次ホップの経路探索に進まずに待ちの状態になる。
【００４６】
探索指示部１０は、起点集合Ｚの各要素ｓの少なくともいずれかから“ｆｗｄ”又は“ｂｗｄ”の「指示待ち」が通知されていないと判定した場合、前進経路ａ→ｂの検知の報告を受けたかを判定する（ステップＳ１０６）。起点節点から例えば図１０のグラフの矢印で示す経路（辺）が見つかった場合、探索指示部１０は、前進経路ａ→ｂ（ｆｗｄ）の報告を受ける。この場合、検知結果辞書ｐのａ→ｂの経路にｆｗｄの要素を加え（ステップＳ１０７）、ステップＳ１０８に進む。これにより、検知結果辞書ｐはａの節点からｂの節点までを繋ぐ辺がｆｗｄ方向にあったという検知結果を記憶する。一方、起点節点から前進経路の辺が見つからなかった場合、探索指示部１０は、後進経路ａ→ｂの検知の報告を受けたかを判定する（ステップＳ１０８）。
【００４７】
ステップＳ１０８において探索指示部１０は、後進経路ａ→ｂ（ｂｗｄ）の報告を受けた場合、検知結果辞書ｐのａ→ｂの経路にｂｗｄの要素を加え（ステップＳ１０９）、ステップＳ１０４に戻る。これにより、検知結果辞書ｐはａの節点からｂの節点までを繋ぐ辺がｂｗｄ方向にあったという検知結果を記憶する。
【００４８】
ステップＳ１０８において探索指示部１０は、後進経路ａ→ｂ（ｂｗｄ）の報告を受けなかった場合、直ちにステップＳ１０４に戻る。
【００４９】
ステップＳ１０４〜Ｓ１０９を繰り返し、探索指示部１０は、起点集合Ｚの各要素ｓのすべてから“ｆｗｄ”及び“ｂｗｄ”両方の「指示待ち」が通知されたと判定した場合、ステップＳ１１０に進む。
【００５０】
ステップＳ１１０では、グラフ探索部１１は、検知結果辞書ｐに記憶された検知結果を組み合わせることで、起点節点ｓ１、ｓ２間が到達可能かを判定する。また、グラフ探索部１１は、到達経路を構成する経路群の集合Ｔを作成する。
【００５１】
起点節点ｓ１、ｓ２間が到達可能でない判定された場合（ステップＳ１１１）、探索指示部１０は、カウンタが既定値以上であるかを判定する（ステップＳ１２０）。また、Ｓ１０５にてＹｅｓと判定されステップＳ１１０に続くステップＳ１１１にてＮｏと判定された場合、探索指示部１０は、ステップＳ１１２にてカウンタが既定値以上であるかを判定する（ステップＳ１２０）。カウンタが既定値よりも小さいと判定された場合、ステップＳ１０３に戻り、カウンタの値に１を加算し、ステップＳ１０４〜Ｓ１０９を繰り返す。
【００５２】
カウンタが既定値以上であると判定された場合、探索指示部１０は、ステップＳ１２１にて、中間地点節点選出部１５に図１３に示す中間地点選出処理の実行を指示し、グラフ辺探索部１１１に起点節点にｉを指定して図９に示す辺探索指示処理の非同期実行を指示する。図１３に示す中間地点選出処理については後述する。例えば、図１０の呼出し関係のグラフ構造には、図１３の中間地点選出処理にてＶ．ｇのメソッドが中間地点節点に選出された一例が示されている。
【００５３】
図８に戻り、ステップＳ１２２にてカウンタに０を設定し、ステップＳ１０３にてカウンタに１を加算し、ステップＳ１０４〜Ｓ１０９を繰り返し、ステップＳ１１０に進む。ここでは、起点集合Ｚには、中間地点が含まれるとする。図１０の例では、メソッドＱ．ｂ、メソッドＶ．ｉ、メソッドＶ．ｇのすべてが起点節点となる。メソッドＱ．ｂ、メソッドＶ．ｉ、メソッドＶ．ｇの起点節点に対してステップＳ１０４〜Ｓ１０９の処理が行われる。その結果、図１０の例では、検知結果辞書ｐに、Ｐ（Ｑ．ｂ→Ｖ．ｇ）＝｛“ｆｗｄ”｝が保存される。しかしながら、この時点では、起点節点メソッドＱ．ｂ、メソッドＶ．ｉ間が到達可能でない。よって、ステップＳ１１１にてＮｏと判定され、ステップＳ１２０にてＮｏと判定されて、再びステップＳ１０４〜Ｓ１０９を繰り返し、ステップＳ１１０に進む。この時点で、図１０の例では、検知結果辞書ｐに、Ｐ（Ｑ．ｂ→Ｖ．ｇ）＝｛“ｆｗｄ”｝に加えて、Ｐ（Ｖ．ｇ→Ｖ．ｉ）＝｛“ｂｗｄ”｝が追加して保存されている。よって、集合Ｔには、｛Ｑ．ｂ→Ｖ．ｇ，Ｖ．ｇ→Ｖ．ｉ｝が記憶される。この時点では、図１０に示すように、起点節点メソッドＱ．ｂ、メソッドＶ．ｉ間が到達可能である。よって、探索指示部１０は、ステップＳ１１１にてＹｅｓと判定し、集合Ｔが空集合かを判定する（ステップＳ１１２）。
【００５４】
ステップＳ１１２において集合Ｔが空集合でないと判定された場合、探索指示部１０は、集合Ｔの１要素ｔを取り出し、集合Ｔからｔを削除し、ｔをａ→ｂの辺と定義する（ステップＳ１１３）。次に、探索指示部１０は、検知結果辞書ｐのａ→ｂの経路にｆｗｄの要素があるかを判定する（ステップＳ１１４）。
【００５５】
検知結果辞書ｐのａ→ｂの経路にｆｗｄの要素があると判定された場合、探索指示部１０は、グラフ探索部１１が作成する起点節点aを担当するインスタンスプロセスに到着節点ｂ、探索方向“ｆｗｄ”を入力して図１２の経路出力処理の実行を指示する（ステップＳ１１５）。
【００５６】
検知結果辞書ｐのａ→ｂの経路にｆｗｄの要素がないと判定された場合、探索指示部１０は、グラフ探索部１１が作成する起点節点aを担当するインスタンスプロセスに到着節点ｂ、探索方向“ｂｗｄ”を入力して図１２の経路出力処理の実行を指示する（ステップＳ１１６）。
【００５７】
（経路出力処理）
ステップＳ１１５、Ｓ１１６にて実行される経路出力処理について図１２を参照して説明する。本出力処理の開始に当たって経路出力したい到着節点（ゴールとする節点）をｇとし、方向“ｆｗｄ”、“ｂｗｄ”の一要素に探索方向ｄがあるとする。ここで、ゴールの節点ｇからの最良の戻り道は先行及び後続節点（ｐｒｅｖ・ｎｅｘｔ）格納部１１４に格納されている。
【００５８】
本処理が開始されると、グラフ辺探索部１１１は、ゴールの節点ｇをｔに設定し、空のリストを辺のリストＰに設定する（ステップＳ４０１）。リストＰは、起点節点から到着節点に至るまでの辺のリストである。
【００５９】
次に、グラフ辺探索部１１１は、この時点で探索のターゲットとしているｔのｐｒｅｖ（ｔ）がｎｕｌｌでないかを判定する（ステップＳ４０２）。
【００６０】
グラフ辺探索部１１１は、ｐｒｅｖ（ｔ）がｎｕｌｌでないと判定した場合、ｐｒｅｖ（ｔ）→ｔの辺をリストＰに追加し（ステップＳ４０３）、ｐｒｅｖ（ｔ）をＴに設定する（ステップＳ４０４）。例えば、図１０の呼出し関係のグラフ構造の場合、ゴールｇをメソッドＶ．ｇとしたとき、一つ前の節点はメソッドＳ．ｅである。この場合、リストＰにはメソッドＳ．ｅ→メソッドＶ．ｇの辺が要素として加えられ、ｔにメソッドＳ．ｅが設定される。
【００６１】
ステップＳ４０２に戻り、ステップＳ４０２〜Ｓ４０４を繰り返すと、図１０の例では、メソッドＮ．ｂ、メソッドＱ．ｂと辿ることができる。ｔがＮ．ｂのときリストＰにはＳ．ｅ→Ｖ．ｇ，Ｎ．ｂ→Ｓ．ｅの辺が要素として加えられた状態となる。更にステップＳ４０２〜Ｓ４０４が繰り返され、ｔがＱ．ｂのときリストＰにはＳ．ｅ→Ｖ．ｇ，Ｎ．ｂ→Ｓ．ｅ，Ｑ．ｂ→Ｎ．ｂの辺が要素として加えられた状態となる。
【００６２】
次に実行されるステップＳ４０２において、グラフ辺探索部１１１は、ｐｒｅｖ（ｔ）がｎｕｌｌであると判定し、リストＰを探索指示部１０に報告し（ステップＳ４０５）、本処理を終了する。
【００６３】
なお、上記説明では、方向ｄが“ｆｗｄ”の場合においてステップＳ４０２にてｐｒｅｖ（ｔ）がｎｕｌｌでないかが判定され、探索結果の経路を後方に向かって辿った。方向ｄが“ｂｗｄ”の場合においても同様の処理を行うが、ステップＳ４０２ではｎｅｘｔ（ｔ）がｎｕｌｌか否かが判定され、先行及び後続節点（ｐｒｅｖ・ｎｅｘｔ）格納部１１４に基づき、探索結果の経路を前方に向かって辿る。
【００６４】
図８に戻り、ステップＳ１１２〜Ｓ１１６の処理が繰り返され、集合Ｔから要素ｔが一つずつ削除され、最終的に集合Ｔからすべての要素が取り出されると、ステップＳ１１２において探索指示部１０は、集合Ｔが空集合であると判定し、ステップＳ１１７に進む。探索指示部１０は、出力された経路群を接続してa→b（起点節点ｓ１→ｓ２、図１０では、メソッドＱ．ｂ→Ｖ．ｉ）の経路として出力し（ステップＳ１１７）、本処理を終了する。
【００６５】
なお、ステップＳ１０４において、探索指示部１０は、起点集合Ｚの全節点から“ｆｗｄ”、“ｂｗｄ”の両方の完了報告を受けた場合、「経路なし」の通知を出力し（ステップＳ１１８）、本処理を終了する。
【００６６】
［中間地点選出処理／クラス類似度の算出処理］
（中間地点選出処理）
次に、中間地点選出処理について図１３を参照して説明する。図１３の中間地点選出処理では、中間地点節点選出部１５が、呼出し関係のグラフ構造に含まれる起点節点間の中間地点の節点となるメソッドを選出する。
【００６７】
本処理は、図８のステップＳ１２１にて実行される。中間地点節点選出部１５は、メソッド保持関係グラフデータ格納部１３２を参照して、リレーションタイプ１３２ｅが“impl”、かつディスティネーションタイプ１３２ｄが“interface”、かつソースタイプ１３２ｂが“class”のソース名１３２ａを集合Ｃに格納する（ステップＳ５０１）。これにより、集合Ｃには、ｉｍｐｌという関係でインタフェースとつながっているメソッドが格納される。例えば、図６の例では、集合ＣにはクラスＵ，Ｖ，Ｗが格納される。
【００６８】
次に、中間地点節点選出部１５は、Ｋ−Ｍｅａｎｓ法を用い集合Ｃの要素をクラスタリングする（ステップＳ５０２）。このとき、中間地点節点選出部１５は、距離の近い要素を同一グループに分ける。要素間の距離は図１４に示すクラス類似度の算出処理において算出可能である。よって、中間地点節点選出部１５は、クラス類似度計算部１４にクラス類似度の算出処理の実行を指示し、その結果得られたクラス類似度に基づき、集合Ｃの要素をクラスタリングする（ステップＳ５０２）。
【００６９】
次に、中間地点節点選出部１５は、より多くの要素を持つクラスタＬを選ぶ。中間地点節点選出部１５は、選んだクラスタＬからメソッド数の多いクラスＤを選び、そのクラスＤのメソッドのうちクラスタＬ内の他のクラスに最も少なく現れるメソッドＭを選び（ステップＳ５０３）、本処理を終了する。ただし、ステップＳ５０３では、中間地点節点選出部１５は、選んだクラスタＬからメソッド数の少ないクラスＤを選んでもよい。また、中間地点節点選出部１５は、そのクラスＤのメソッドのうちクラスタＬ内の他のクラスに最も多く現れるメソッドＭを選んでもよい。
【００７０】
これによれば、中間地点節点は、ディスティネーションタイプがインタフェースのクラスに応じたメソッドであって、起点節点からなるべく遠いメソッドが決定される。
【００７１】
（クラス類似度の算出処理）
ステップＳ５０２にて実行されるクラス類似度の算出処理について図１４を参照して説明する。まず、クラス類似度計算部１４は、メソッド保持関係グラフデータ格納部１３２を参照して、リレーションタイプ１３２ｅが“has”、かつソースタイプ１３２ｂが“class”、かつソース名１３２ａが“Ｃ”である行のディスティネーション名１３２ｃを集合Ｍに格納する（ステップＳ７０１）。本処理の入力値として集合ＣにクラスＶが設定されている場合、図６に示すメソッド保持関係グラフデータ格納部１３２を参照すると、集合Ｍにはメソッドｇ、ｈ、ｉ、ｊ、ｋ、ｌが格納される。
【００７２】
クラス類似度計算部１４は、メソッド保持関係グラフデータ格納部１３２からリレーションタイプ１３２ｅが“has”、かつソースタイプ１３２ｂが“class”、かつソース名１３２ａが“Ｄ”のディスティネーション名１３２ｃを集合Ｎに格納する（ステップＳ７０２）。
【００７３】
図６では、クラスＵのメソッド数は１、クラスＶのメソッド数は６、クラスＷのメソッド数は５である。よって、本処理の入力値として集合ＤにクラスＷが設定されている場合、図６に示すメソッド保持関係グラフデータ格納部１３２を参照すると、集合Ｎにはメソッドｈ、ｉ、ｊ、ｋ、ｌが格納される。
【００７４】
次に、クラス類似度計算部１４は、集合Ｍのみに現れる名前の個数と集合Ｎのみに現れる名前の個数とを出力する。集合Ｍ＝｛ｇ、ｈ、ｉ、ｊ、ｋ、ｌ｝、集合Ｎ＝｛ｈ、ｉ、ｊ、ｋ、ｌ｝の場合、集合Ｍのみに現れる名前は「ｇ」であり、その個数は１である。集合Ｎのみに現れる名前の個数は０である。この場合、クラス類似度計算部１４は、Ｃ（クラスＶ）とＤ（クラスＷ）とのクラス類似度に「１」を出力する。クラス類似度が示す数値は、クラスが持つメソッドがどれだけ類似しているかを示す。換言すれば、クラス類似度が示す数値は、クラス同士の距離を示す。
【００７５】
なお、クラス類似度の算出処理における名前の同一性の判定方法は、完全一致したら同一と判定する、全て小文字化して完全一致したら同一と判定する、文字列同士の編集距離が規定値以内なら同一と判定する等の方法を用いることができる。
【００７６】
図１４のステップ７０３にて、クラス類似度（Ｕ，Ｖ）が７、クラス類似度（Ｕ，Ｗ）が６、クラス類似度（Ｖ，Ｗ）が１と算出されたとする。このとき、図１３のステップ５０２で２つのクラスタに分類する場合、各クラス類似度に基づき、集合Ｃ＝｛Ｕ，Ｖ，Ｗ｝の要素は、｛Ｕ｝、｛Ｖ，Ｗ｝に分類される。図１３のステップ５０３では、より多くの要素を持つクラスタＬ＝｛Ｖ，Ｗ｝が選ばれる。そして、クラスＤには、クラスタＬのクラスＶ及びクラスＷからメソッド数が多いクラスＶが選ばれる。そして、メソッドＭには、クラスＤに選ばれたクラスＶのメソッドのうちクラスタ内の他のクラスＷに最も少なく現れるメソッドＶ．ｇが選ばれる。
【００７７】
これによれば、クラスタ毎に一つ中間地点のメソッドを選ぶことで、クラス類似度の低いメソッドが中間地点の節点に選ばれることになる。これにより、図１０に示すように、クラス類似度が低いメソッドＶ．ｇを選ぶことで既に起点節点となっているメソッドから経路探索上離れたメソッドを中間地点節点に選定することができる。これにより、起点節点との距離が近すぎない位置に中間地点節点を設定することができ、経路探索の効率を向上させることができる。
【００７８】
なお、中間地点節点は、Ｊａｖａ(登録商標)のソースコードの場合、インタフェースを実装したクラスのメソッドから選出され、Ｃ＋＋のソースコードの場合、純粋仮想クラスを実装したクラスとｉｍｐｌで繋がっているメソッドから選ばれる。
【００７９】
図８の経路抽出処理のステップＳ１２１において、中間地点設定が選出された後、図１０に示すように、起点節点のメソッドＱ．ｂと起点節点のメソッドＶ．ｉと中間地点節点Ｖ．ｇを起点として経路探索が行われる。
【００８０】
本実施形態では、各起点が１ホップ目の探索を終了してから，各起点が次の２ホップ目の探索を開始するように、各起点同士の経路探索を同期させる。これにより、中間地点を選出するタイミングを適正にとることができる。ただし、各起点の経路探索を同期させずに進行させてもよい。
【００８１】
［グラフ辺探索処理／優先探索節点選出処理］
（グラフ辺探索処理）
次に、グラフ辺探索処理について図１１を参照して説明する。本処理は、図９の辺探索指示処理のステップＳ２０２、Ｓ２０３にて実行される。なお、“ｆｗｄ”又は“ｂｗｄ”のいずれかの方向が方向指示変数ｄｉｒに予め保存されている。また、以下では呼出し関係のグラフ構造の節点の集合を節点集合Ｖとする。
【００８２】
グラフ辺探索部１１１は、呼出し関係のグラフ構造の各節点に対して、起点節点ｓ（例えばｓ１，ｓ２、中間地点節点等）からの距離を返す辞書ｄを、全節点に対して∞を返すよう設定する（ステップＳ３０１）。起点節点ｓからの距離は、起点節点と探索する節点との間の辺の数である。辞書ｄは、起点節点ｓから中間地点の節点又は他の起点節点ｓに辿りつくことができるのかできないのか、辿りつくことができるとしたら距離（辺の数）はいくつかの情報を示す。辞書ｄは、辿りつくことができない又は不明な場合、∞を返すよう設定される。
【００８３】
次に、グラフ辺探索部１１１は、節点集合Ｖの各節点ｖに対してｖが起点節点（中間地点節点を含む）に対する経路上の節点なら入力辺ｕ→ｖの端点ｕを返し、そうでなければｎｕｌｌを返す。グラフ辺探索部１１１は、先行節点辞書ｐｒｅｖを、全節点に対してｎｕｌｌを返すように設定する。先行節点辞書ｐｒｅｖは、現在の探索位置の一つ前の節点の情報を保持する辞書である。この時点では、先行節点辞書ｐｒｅｖには、現在の探索位置の一つ前の節点が見つかっていないことを示すｎｕｌｌが設定される。
【００８４】
なお、上記は、方向指示変数ｄｉｒが“ｆｗｄ”の場合の説明である。方向指示変数ｄｉｒが“ｂｗｄ”の場合、ステップＳ３０２において、グラフ辺探索部１１１は、出力辺ｖ→ｕの端点ｖを返し、そうでなければｎｕｌｌを返す。グラフ辺探索部１１１は、後続節点辞書ｎｅｘｔを、全節点に対してｎｕｌｌを返すように設定する。
【００８５】
次に、グラフ辺探索部１１１は、要訪問節点集合ｏｐｅｎに起点節点ｓ（例えば、図１５の経路抽出対象のメソッドＱ．ｂ及びメソッドＶ．ｉ、中間地点節点等）を設定する（ステップＳ３０３）。以下では、起点節点のうち、経路抽出対象の２点のメソッドを起点節点ｓ１、Ｓ２ともいう。
【００８６】
また、グラフ辺探索部１１１は、距離を返す辞書ｄ（ｓ）に０(つまり、自分自身からの距離が０である)を設定する（ステップＳ３０３）。例えば、起点節点がＳ１，Ｓ２のみの場合（つまり、起点節点に中間地点を含まない場合）、起点節点ｓ１の“ｆｗｄ”及び“ｂｗｄ”、起点節点ｓ２の“ｆｗｄ”及び“ｂｗｄ”の４つの経路探索が並列的に処理されていることになる。例えば、ｎ個の中間地点節点が選択されている場合、２（２＋ｎ）の経路探索が並列的に処理されていることになる。
【００８７】
次に、グラフ辺探索部１１１は、訪問済節点集合ｃｌｏｓｅを空集合にする（ステップＳ３０４）。次に、グラフ辺探索部１１１は、次の訪問先の節点集合ｎｅｗｏｐｅｎを空集合にする（ステップＳ３０５）。次の訪問先の節点集合ｎｅｗｏｐｅｎは次の訪問先の節点が記憶される。また、グラフ辺探索部１１１は、起点集合格納部１２に格納された起点節点をＺＬに転記する（ステップＳ３０５）。一例として、起点節点ｓがメソッドＱ．ｂであり、方向指示変数ｄｉｒが“ｆｗｄ”である場合、ステップＳ３０５において要訪問節点集合ｏｐｅｎに｛Ｑ．ｂ｝が設定され、距離を返す辞書ｄ（ｓ）にｄ（Ｑ．ｂ）＝０が追加される。また、訪問済節点集合ｃｌｏｓｅ及び次の訪問先の節点集合ｎｅｗｏｐｅｎは空集合の状態となる。
【００８８】
次に、グラフ辺探索部１１１は、要訪問節点集合ｏｐｅｎが空集合でないかを判定する（ステップＳ３０６）。ここでは、要訪問節点集合ｏｐｅｎには起点節点ｓ１、Ｓ２が格納されている。この時点では、グラフ辺探索部１１１は、要訪問節点集合ｏｐｅｎが空集合でない（Ｙｅｓ）と判定し、要訪問節点集合ｏｐｅｎに含まれる要素ｃのうち距離ｄ（ｃ）が最小であるｃを１つ選び、その節点（メソッド）ｃを訪問するｔとする（ステップＳ３０７）。また、グラフ辺探索部１１１は、除外節点集合Ｘ（優先度が高い節点Ｓ３０９にて選出済みの節点の集合）を空集合にする。除外節点集合Ｘには、優先度が高い節点を選出する際の除外節点が保持される。
【００８９】
次に、グラフ辺探索部１１１は、探索のターゲットt（現在訪問しているメソッドｍ）を要訪問節点集合ｏｐｅｎから除き、訪問済節点集合ｃｌｏｓｅに加える（ステップＳ３０８）。この時点で、要訪問節点集合ｏｐｅｎの要素はない（以下、集合名＝｛｝とも表記する）。また、訪問済節点集合ｃｌｏｓｅ＝｛Ｑ．ｂ｝、次の訪問先の節点集合ｎｅｗｏｐｅｎ＝｛｝、除外節点集合Ｘ＝｛｝、ｔ＝Ｑ．ｂ、ｐｒｅｖ（Ｎ．ｂ）＝Ｑ．ｂとなる。
【００９０】
次に、探索のターゲットt＝メソッドｍ、方向指示変数ｄｉｒ∈｛“ｆｗｄ”、“ｂｗｄ”｝、除外節点集合Ｘ＝｛｝を入力して、優先探索節点選出処理の実行を指示する（ステップＳ３０９）。
【００９１】
（優先探索節点選出処理）
優先探索節点選出処理について、図１６を参照しながら説明する。優先探索節点選出部１６は、図５に一例を示す呼出し関係グラフデータ格納部１３１を参照する。優先探索節点選出部１６は、呼出し関係グラフデータ格納部１３１からリレーションタイプ１３１ｅ＝“call”、かつソースタイプ１３１ｂ＝“method”、かつディスティネーションタイプ＝“method”、かつソース名１３１ａ＝ｍである行のディスティネーション名１３１ｃを集合Ｎに格納する（ステップＳ６０１）。
【００９２】
なお、上記は方向指示変数ｄｉｒが“ｆｗｄ”の場合について示した。方向指示変数ｄｉｒが“ｂｗｄ”の場合、呼出し関係グラフデータ格納部１３１からリレーションタイプ１３１ｅ＝“call”、かつソースタイプ１３１ｂ＝“method”、かつディスティネーションタイプ＝“method”、かつディスティネーション名１３１ｃ＝ｍである行のソース名１３１ａを集合Ｎに格納する。
【００９３】
次に、優先探索節点選出部１６は、除外節点集合Ｘの要素を集合Ｎから除く（ステップＳ６０２）。次に、優先探索節点選出部１６は、図６に一例を示すメソッド保持関係グラフデータ格納部１３２を参照して、リレーションタイプ１３２ｅ＝“has”、かつディスティネーション名１３２ｃ＝ｍである行のソース名１３２ａをｃに格納する（ステップＳ６０３）。
【００９４】
次に、優先探索節点選出部１６は、集合Ｎ内の各要素ｎに対し，メソッド保持関係グラフデータ格納部１３２からリレーションタイプ１３２ｅ＝“has”、かつディスティネーション名１３２ｃ＝ｎである行のソース名１３２ａをｄに代入する（ステップＳ６０４）。
【００９５】
次に、クラス類似度計算部１４は、図１４のクラス類似度の算出処理を実行し、ｄとｃの類似度を算出する。優先探索節点選出部１６は、この結果、最も類似度が高い（つまり、最も類似度の数値の低い）クラスｄ’のメソッドｍ’を探索対象節点に選出し（ステップＳ６０４）、本処理を終了する。
【００９６】
これにより、メソッドに対応するクラスを記憶する記憶部１３を参照して、前記経路で接続された２つのメソッドに対応する経路優先度が算出される。
【００９７】
例えば、本処理の入力値として、メソッドｍがＶ．ｉ、方向指示変数ｄｉｒが“ｂｗｄ”の場合、ステップＳ６０１において図５に一例を示す呼出し関係グラフデータ格納部１３１を参照して、集合Ｎ＝｛Ｘ．ｉ、Ｗｄ．ｉ｝となる。次のステップＳ６０２においても集合Ｎ＝｛Ｘ．ｉ、Ｗｄ．ｉ｝の状態は変わらない。次のステップＳ６０３においてｃ＝Ｖ（クラス）となる。次のステップＳ６０４において集合Ｎ内の各要素ｎ（＝Ｘ．ｉ，Ｗｄ．ｉ）に対してｄ＝Ｘ，Ｗｄとなる。そして、ｃ（＝Ｖ）とｄ（＝Ｘ，Ｗｄ）との類似度は、類似度（Ｘ，Ｖ）＝５、類似度（Ｗｄ，Ｖ）＝１となる。これにより、最も類似度が高い（つまり、最も類似度の数値の低い）クラスｄ’は「Ｗｄ」となり、そのメソッドｍ’は「Ｗｄ．ｉ」となる。これにより、例えば、図１５では、メソッドＷｄ．ｉが、メソッドＸ．ｉよりも優先して経路探索されることになる。なお、優先探索節点選出処理において算出された類似度は、経路優先度の一例である。
【００９８】
図１１に戻り、グラフ辺探索部１１１は、ステップＳ３１０において探索対象節点が選出されたかを判定する。グラフ辺探索部１１１は、探索対象節点が選出されなかったと判定した場合、ステップＳ３０６に戻り、ステップＳ３０６〜Ｓ３１０を繰り返す。グラフ辺探索部１１１は、探索対象節点が選出されたと判定した場合、ステップＳ３１１に進み、優先探索節点選出部１６が選出した優先度が最も高い節点ｎをＸに要素として追加する（ステップＳ３１１）。
【００９９】
次に、グラフ辺探索部１１１は、節点ｎが訪問済節点集合ｃｌｏｓｅの要素に含まれない、かつｄ（ｎ）＞ｄ（ｔ）＋１を満たすかを判定する（ステップＳ３１２）。グラフ辺探索部１１１は、節点ｎが訪問済節点集合ｃｌｏｓｅの要素に含まれると判定した場合、ステップＳ３１４に進む。また、グラフ辺探索部１１１は、ｄ（ｎ）≦ｄ（ｔ）＋１であると判定した場合、つまり、節点ｎの距離ｄ（ｎ）が、起点から最も短い距離であると判定した場合、ステップＳ３１４に進む。これに対して、グラフ辺探索部１１１は、節点ｎが訪問済節点でなく、かつ距離ｄ（ｎ）が起点から最も短い距離でないと判定した場合、ステップＳ３１３にてｄ（ｔ）＋１を距離ｄ（ｎ）に代入することで距離ｄ（ｎ）を書き替える。これにより、より短い経路で起点節点間を辿りつけるようにする。
【０１００】
また、グラフ辺探索部１１１は、先行及び後続節点（ｐｒｅｖ・ｎｅｘｔ）格納部１１４の先行節点ｐｒｅｖ（ｎ）にｔの値を設定することで、節点ｎの一つ前が節点ｔであると書き替える。更に、グラフ辺探索部１１１は、次の訪問先の節点集合ｎｅｗｏｐｅｎに次の訪問先の節点ｎを追加する。この時点では、例えば図１５のグラフの例ではｐｒｅｖ（Ｎ．ｂ）＝Ｑ．ｂが追加され、次の訪問先の節点集合ｎｅｗｏｐｅｎにはＮ．ｂが設定される。
【０１０１】
ステップＳ３１４にて、グラフ辺探索部１１１は、ｎがＺＬ（ＺＬ：起点又は中間地点の節点）であるかを判定する。Ｓ３０５において起点集合格納部Ｚの内容をＺＬに転記している。よって、グラフ探索部１１は、ｎがＺＬであると判定した場合、探索指示部１０にs→nの前進経路を検知したことを報告し（ステップＳ３１５）、ステップＳ３０９に戻る。これにより、ある起点又は中間地点から他の起点又は中間地点に辿りついたということが探索指示部１０に報告される。
【０１０２】
他方、グラフ辺探索部１１１は、ｎがＺＬでないと判定した場合、直ちにステップＳ３０９に戻る。なお、ステップＳ３１５において、方向指示変数ｄｉｒが“ｂｗｄ”の場合、探索指示部１０にｎ→ｓの前進経路を検知したことが報告される。
【０１０３】
Ｓ３０９に戻ると、除外節点集合Ｘに要素が蓄積されて、Ｓ３１０にて節点が選出できないと判定されると、グラフ辺探索部１１１は、要訪問先集合ｏｐｅｎに要素があるかを判定する（ステップＳ３０６）。要訪問先集合ｏｐｅｎに要素があると判定された場合、グラフ辺探索部１１１は、ステップＳ３０７以降の処理を行う。要訪問先集合ｏｐｅｎに要素がないと判定された場合、グラフ辺探索部１１１は、ステップＳ３１６へ進み、探索指示部１０に「実行再開の指示待ち」の通知を行う。グラフ辺探索部１１１は、探索指示部１０から実行再開の指示を待つ（ステップＳ３１７）。
【０１０４】
グラフ辺探索部１１１は、探索指示部１０から実行再開の指示を受けたかを判定し（ステップＳ３１８）、実行再開の指示を受けるまで待つ。グラフ辺探索部１１１は、実行再開の指示を受けたと判定した場合、次の訪問先の節点集合ｎｅｗｏｐｅｎに要素がないかを判定する（ステップＳ３１９）。次の訪問先の節点集合ｎｅｗｏｐｅｎに要素がないと判定された場合、グラフ辺探索部１１１は、次の訪問先の節点集合ｎｅｗｏｐｅｎに次の訪問先の節点ｎがないため、ステップＳ３２１へ進み、探索指示部１０に完了を報告する。次の訪問先の節点集合ｎｅｗｏｐｅｎに要素があると判定された場合、グラフ辺探索部１１１は、次の訪問先の節点集合ｎｅｗｏｐｅｎの値をｏｐｅｎに設定し（ステップＳ３２０）、ステップＳ３０５に戻る。
【０１０５】
これにより、グラフ辺探索部１１１は、すべて起点節点の１ホップ目が終了し、次の２ホップ目の探索を開始することになる。要訪問先集合ｏｐｅｎには、２ホップ目の探索では、前回の経路探索で見つかった節点が入っている。図１５の例では、１ホップ目ではｏｐｅｎ＝{Ｑ．ｂ}、２ホップ目ではｏｐｅｎ＝{Ｎ．ｂ、Ｙ．ｍ}となる。
【０１０６】
この状態で、グラフ辺探索部１１１は、ステップＳ３０５〜Ｓ３１６の処理を実行する。この時点では、図１５のグラフの例ではｐｒｅｖ（Ｓ．ｅ）＝Ｎ．ｂが追加され、次の訪問先の節点集合ｎｅｗｏｐｅｎにはＳ．ｅが追加される。
【０１０７】
グラフ辺探索部１１１は、ステップＳ３１７にて探索指示部１０から「実行再開」の指示を待ち、ステップＳ３１８にて指示を受けたと判定した場合、ステップＳ３１９にて次の訪問先の節点集合ｎｅｗｏｐｅｎが空でないかを判定する。この時点では、次の訪問先の節点集合ｎｅｗｏｐｅｎにＳ．ｅの要素がある。このため、グラフ辺探索部１１１は、ｎｅｗｏｐｅｎの値を訪問節点集合ｏｐｅｎに代入し、ステップＳ３０５〜Ｓ３１６の処理を繰り返す。この繰り返し処理により、図１５のグラフの例ではｐｒｅｖ（Ｕ．ｆ）＝Ｓ．ｅが追加され、次の訪問先の節点集合ｎｅｗｏｐｅｎにはＵ．ｆが追加される。次の繰り返しにおいてｐｒｅｖ（Ｖ．ｇ）＝Ｓ．ｅが追加され、次の訪問先の節点集合ｎｅｗｏｐｅｎにはＵ．ｆ、Ｖ．ｇが追加された状態となる。
【０１０８】
ここで、図１５のグラフの例では、次の訪問先の節点集合ｎｅｗｏｐｅｎのメソッドＶ．ｇは、中間地点節点であるため、前進経路Ｑ．ｂ→Ｖ．ｇの前進経路が見つかった状態となる。よって、グラフ辺探索部１１１は、ステップＳ３１５において探索指示部１０にこの前進経路を検知したことを報告する。この結果、先行及び後続節点（ｐｒｅｖ・ｎｅｘｔ）格納部１１４に、辺探索で得られた前進経路及び更新経路が蓄積される。これにより、例えば、図１７の太線にて示す経路抽出対象である起点節点のメソッドＱ．ｂ及びメソッドＶ．ｉ間の経路が抽出される。
【０１０９】
以上に説明したように、一実施形態に係る探索方法によれば、以下の１〜４を行う。
１．経路抽出対象の起点節点となる２つのメソッドのほかに中間地点節点のメソッドを複数個（Ｐ個）用意し、Ｐ＋２個のメソッド（に対応するグラフの節点）を起点に経路探索を並列に行う。有向辺を順方向（呼出し先に向かう方向ｆｗｄ）に経路探索するだけでなく、逆方向（呼出し元に向かう方向ｂｗｄ）にも経路探索する。起点以外の節点にたどり着くまで探索し、最後に経路探索の結果を結合する。
２．１において小さな数のＰ個の中間地点節点に絞って探索を始め、数ステップ実行後も対象２メソッド（節点）が経路でつながらなければ徐々に中間地点節点を増やして経路探索を行う。
３．２において探索を始める中間地点節点の優先順位付けに、節点に対応する（メソッドを保持する）クラスの（メソッド名リストに関する）類似度が低いことを用いる。
４．１において経路探索を進める辺が複数ある場合に先に調査する辺を決める優先順位付けとして、経路優先度を算出する。経路優先度の算出は、節点に対応するクラス類似度が高いことを用いる。経路優先度に基づき先に調査する辺を決めることで、呼出し関係にある複数のメソッドのうち経路探索の起点となる離れた２メソッド間の呼出し関係の経路抽出に要する時間を削減できる。
【０１１０】
更に、（ａ）１．において中間地点メソッドは、経路上のメソッドである可能性の高いメソッドを次のように選ぶ。ソースコードを解析したメソッド保持関係を有する格納部に基づき、プログラム言語仕様で関心の分離・疎結合化に使われているクラスを選ぶ。例えばＪａｖａならインタフェースを実装したクラス、Ｃ＋＋なら純粋仮想クラスを実装したクラスを選ぶ。別法として、dependency injectionで指定されたクラスを選んでもよい。
【０１１１】
（ｂ）１．において並列に行う経路探索は、例えば１ホップ毎に各起点地点からの経路探索を同期させるbulk synchronous parallel方式で行うことが好ましい。
【０１１２】
（ｃ）２．において絞り込みは次のように行う。１．で選んだ中間地点メソッドを保持するクラスを、類似度でクラスタリングする。その際、Ｋ−Ｍｅａｎｓ法などを用いることができる。できたクラスタから１つクラスを選び、そのクラスの保持するメソッド群を中間地点節点に選ぶ。
【０１１３】
（ｄ）３．において優先順位付けは次のように行う。２．で絞り込んだ各クラスと経路抽出対象２メソッドがそれぞれ属するクラス類似度を比較し、いずれの経路抽出対象とも似ていない（つまり類似度が低い）クラスを順次選択する。そのクラスの保持するメソッド群を中間地点節点に選ぶ。
【０１１４】
（ｅ）４．において調査する辺の優先順位付けは次のように行う。現在訪問している節点をｖ、経路探索を進める辺をｖ→ｗ、ｖとｗをそれぞれ保持するクラスをｃとｄとする。ｃとｄの類似度が高い順に、辺ｖ→ｗを選ぶ。
【０１１５】
３．、４．及び上記（ｃ）、（ｄ）、（ｅ）でのクラス類似度は次のように計算する。クラス毎にクラスが持つメソッドの名前（文字列）のソート済みリストを作る。このリストの編集距離（Levenshtein 距離）をクラス類似度とする（小さい値ほど類似度が高いとする）。
【０１１６】
以上、本実施形態にかかる探索装置１によれば、呼出し関係にある複数のメソッドのうち起点となるメソッドを結ぶ経路の抽出時間を短縮することができる。
【０１１７】
図１８に示すように、経路探索対象メソッド間の距離をｒとし、経路上に中間地点メソッドがＰ個あるとする。各起点メソッドから隣の起点メソッドまでの距離ｆはｒ／（１＋１Ｐ）となる。
【０１１８】
各起点メソッドから隣の起点メソッドに至るまでに訪れる呼出し先（または元）側のメソッドの総数ｎ（Ｐ）は最良で式（１）で算出される。
【０１１９】
【数１】
0006512050.tif 000002
【０１２０】
全体で訪れるメソッドの総数Ｎ（Ｐ）は最良で式（２）で算出される。
【０１２１】
【数２】
0006512050.tif 000003
【０１２２】
例えば以下の公知の手法であるDijkstra法[1]、およびA*法[2]で訪れるメソッドの総数ＮＯＭは、式（３）で算出される。
Dijkstra法[1]  Dijkstra, E.W.(1959).A  note on two problems in connexion with graphs. In Numerische  Mathematik, 1 (1959), S. 269 〜 271.
A*法[2]  Peter E. Hart; Nils J. Nilsson; Bertram  Raphael(July 1968). "A Formal Basis for the Heuristic  Determination  of  Minimal  Cost Paths".  IEEE  Transactions  on  Systems  Science  and  Cybernetics  4  (2):  100‐107.  doi:10.1109/TSSC.1968.300136.  ISSN0536-1567.
【０１２３】
【数３】
0006512050.tif 000004
【０１２４】
よって、訪れるメソッドの総数比Ｎ（Ｐ）／ＮＯＭは、式（４）を用いて近似値１／ｄｒで算出される。つまり、本実施形態にかかる探索方法によれば、呼出し関係にある複数のメソッドのうち経路探索の起点となるメソッドを結ぶ経路の抽出時間を短縮できる。
【０１２５】
【数４】
0006512050.tif 000005
【０１２６】
（ハードウェア構成例）
最後に、本実施形態に係る探索装置１のハードウェア構成について、図１９を参照して説明する。図１９は、本実施形態に係る探索装置１のハードウェア構成の一例を示す。探索装置１は、入力装置１０１、表示装置１０２、外部Ｉ／Ｆ１０３、ＲＡＭ（Random Access Memory）１０４、ＲＯＭ（Read Only
Memory）１０５、ＣＰＵ（Central Processing Unit）１０６、通信Ｉ／Ｆ１０７、及びＨＤＤ（Hard Disk Drive）１０８などを備え、それぞれがバスＢで相互に接続されている。
【０１２７】
入力装置１０１は、キーボードやマウスなどを含み、探索装置１に各操作信号を入力するために用いられる。表示装置１０２は、ディスプレイなどを含み、各種の処理結果を表示する。通信Ｉ／Ｆ１０７は、探索装置１をネットワークに接続するインタフェースである。これにより、探索装置１は、通信Ｉ／Ｆ１０７を介して、他の機器とデータ通信を行うことができる。
【０１２８】
ＨＤＤ１０８は、プログラムやデータを格納している不揮発性の記録装置である。格納されるプログラムやデータには、探索装置１の全体を制御する基本ソフトウェア及びアプリケーションソフトウェアがある。例えば、ＨＤＤ１０８には、各種のデータベースやプログラム等が格納されてもよい。
【０１２９】
外部Ｉ／Ｆ１０３は、外部装置とのインタフェースである。外部装置には、記憶媒体１０３ａなどがある。これにより、探索装置１は、外部Ｉ／Ｆ１０３を介して記憶媒体１０３ａの読み取り及び／又は書き込みを行うことができる。記憶媒体１０３ａには、ＣＤ（Compact Disk）、及びＤＶＤ（Digital Versatile Disk）、ならびに、ＳＤメモリカード（SD Memory card）やＵＳＢメモリ（Universal Serial Bus
memory）等がある。
【０１３０】
ＲＯＭ１０５は、電源を切っても内部データを保持することができる不揮発性の半導体メモリ（記録装置）である。ＲＯＭ１０５には、ネットワーク設定等のプログラム及びデータが格納されている。ＲＡＭ１０４は、プログラムやデータを一時保持する揮発性の半導体メモリ（記録装置）である。ＣＰＵ１０６は、上記記録装置（例えば「ＨＤＤ１０８」や「ＲＯＭ１０５」など）から、プログラムやデータをＲＡＭ１０４上に読み出し、処理を実行することで、装置全体の制御や搭載機能を実現する演算装置である。
【０１３１】
かかる構成により、本実施形態に係る探索装置１では、ＣＰＵ１０６が、ＲＯＭ１０５やＨＤＤ１０８内に格納されたデータ及びプログラムを用いてグラフ辺探索処理、経路出力処理、中間地点選出処理、クラス類似度の算出処理及優先探索節点選出処理を実行する。なお、メソッド保持関係グラフデータ格納部のに記憶された情報は、ＲＡＭ１０４、ＨＤＤ１０８、又はネットワークを介して探索装置１に接続されるクラウド上のサーバ等に格納され得る。
【０１３２】
以上、探索方法、探索プログラム及び探索装置を上記実施形態により説明したが、本発明にかかる探索方法、探索プログラム及び探索装置は上記実施形態に限定されるものではなく、本発明の範囲内で種々の変形及び改良が可能である。また、上記実施形態及び変形例が複数存在する場合、矛盾しない範囲で組み合わせることができる。
【０１３３】
以上の説明に関し、更に以下の項を開示する。
（付記１）
呼出し関係にある複数のメソッドのうち経路探索の起点となる複数のメソッドを結ぶ経路を前記起点となるメソッド毎に並行して経路探索を行う処理をコンピュータが実行する探索方法であって、
前記起点となる前記複数のメソッドからｎホップ目の経路探索対象となる経路が複数ある場合、メソッドに対応するクラスを記憶する記憶部を参照して、前記経路で接続された２つのメソッドに対応する経路優先度を算出し、
前記経路優先度に基づき、前記経路探索対象となる複数の経路のうちから経路探索を行う経路を特定し、
特定した前記経路に基づき前記経路探索の起点となる複数のメソッドの経路探索を行う、
探索方法。
（付記２）
経路探索の起点となる中間地点のメソッドを特定し、前記複数のメソッド及び前記中間地点のメソッドを結ぶ経路を、前記中間地点のメソッドを含む前記経路探索の起点となる複数のメソッドのそれぞれから並行して経路探索を行う、
付記１に記載の探索方法。
（付記３）
前記複数のメソッド及び前記中間地点のメソッドに対応するクラス類似度に基づき、経路探索の起点となる前記中間地点のメソッドを増やす、
付記２に記載の探索方法。
（付記４）
複数の前記中間地点のメソッドが特定される場合、前記クラス類似度に基づき、前記複数の中間地点のメソッドの優先度を特定し、
特定した前記複数の中間地点のメソッドの優先度に従い、特定した前記複数の中間地点のメソッドのうちから前記経路探索の起点となる中間地点のメソッドを特定し、
特定した前記中間地点のメソッドを含む前記経路探索の起点となる複数のメソッドのそれぞれから並行して経路探索を行う、
付記３に記載の探索方法。
（付記５）
呼出し関係にある複数のメソッドのうち経路探索の起点となる複数のメソッドを結ぶ経路を前記起点のメソッド毎に並行して経路探索を行う処理をコンピュータに実行させる探索プログラムであって、
前記起点となる前記複数のメソッドからｎホップ目の経路探索対象となる経路が複数ある場合、メソッドに対応するクラスを記憶する記憶部を参照して、前記経路で接続された２つのメソッドに対応する経路優先度を算出し、
前記経路優先度に基づき、前記経路探索対象となる複数の経路のうちから経路探索を行う経路を特定し、
特定した前記経路に基づき前記経路探索の起点となる複数のメソッドの経路探索を行う、
探索プログラム。
（付記６）
経路探索の起点となる中間地点のメソッドを特定し、前記複数のメソッド及び前記中間地点のメソッドを結ぶ経路を、前記中間地点のメソッドを含む前記経路探索の起点となる複数のメソッドのそれぞれから並行して経路探索を行う、
付記５に記載の探索プログラム。
（付記７）
前記複数のメソッド及び前記中間地点のメソッドに対応するクラス類似度に基づき、経路探索の起点となる前記中間地点のメソッドを増やす、
付記６に記載の探索プログラム。
（付記８）
複数の前記中間地点のメソッドが特定される場合、前記クラス類似度に基づき、前記複数の中間地点のメソッドの優先度を特定し、
特定した前記複数の中間地点のメソッドの優先度に従い、特定した前記複数の中間地点のメソッドのうちから前記経路探索の起点となる中間地点のメソッドを特定し、
特定した前記中間地点のメソッドを含む前記経路探索の起点となる複数のメソッドのそれぞれから並行して経路探索を行う、
付記７に記載の探索プログラム。
（付記９）
呼出し関係にある複数のメソッドのうち経路探索の起点となる複数のメソッドを結ぶ経路を前記起点のメソッド毎に並行して経路探索を行う探索装置であって、
前記起点となる前記複数のメソッドからｎホップ目の経路探索対象となる経路が複数ある場合、メソッドに対応するクラスを記憶する記憶部を参照して、前記経路で接続された２つのメソッドに対応する経路優先度を算出する優先探索節点選出部と、
前記経路優先度に基づき、前記経路探索対象となる複数の経路のうちから経路探索を行う経路を特定し、特定した前記経路に基づき前記経路探索の起点となる複数のメソッドの経路探索を行う探索部と、
を有する探索装置。
（付記１０）
経路探索の起点となる中間地点のメソッドを特定する中間地点節点選出部を有し、
前記探索部は、前記複数のメソッド及び前記中間地点のメソッドを結ぶ経路を、前記中間地点のメソッドを含む前記経路探索の起点となる複数のメソッドのそれぞれから並行して経路探索を行う、
付記９に記載の探索装置。
（付記１１）
前記中間地点節点選出部は、前記複数のメソッド及び前記中間地点のメソッドに対応するクラス類似度に基づき、経路探索の起点となる前記中間地点のメソッドを増やす、
付記１０に記載の探索装置。
（付記１２）
前記中間地点節点選出部は、複数の前記中間地点のメソッドが特定される場合、前記クラス類似度に基づき、前記複数の中間地点のメソッドの優先度を特定し、特定した前記複数の中間地点のメソッドの優先度に従い、特定した前記複数の中間地点のメソッドのうちから前記経路探索の起点となる中間地点のメソッドを特定し、
前記探索部は、特定した前記中間地点のメソッドを含む前記経路探索の起点となる複数のメソッドのそれぞれから並行して経路探索を行う、
付記１１に記載の探索装置。
【符号の説明】
【０１３４】
１：探索装置
１０：探索指示部
１１：グラフ探索部
１２：起点集合格納部
１３：記憶部
１４：クラス類似度計算部
１５：中間地点節点選出部
１６：優先探索節点選出部
１１１：グラフ辺探索部
１１２：要訪問節点集合格納部
１１３：訪問済節点集合格納部
１１４：先行及び後続節点格納部
１３１：呼出し関係グラフデータ格納部
１３２：メソッド保持関係グラフデータ格納部
【図１】
0006512050.tif 000006
【図２】
0006512050.tif 000007
【図３】
0006512050.tif 000008
【図４】
0006512050.tif 000009
【図５】
0006512050.tif 000010
【図６】
0006512050.tif 000011
【図７】
0006512050.tif 000012
【図８】
0006512050.tif 000013
【図９】
0006512050.tif 000014
【図１０】
0006512050.tif 000015
【図１１】
0006512050.tif 000016
【図１２】
0006512050.tif 000017
【図１３】
0006512050.tif 000018
【図１４】
0006512050.tif 000019
【図１５】
0006512050.tif 000020
【図１６】
0006512050.tif 000021
【図１７】
0006512050.tif 000022
【図１８】
0006512050.tif 000023
【図１９】
0006512050.tif 000024