(57)【要約】【課題】ブロック線図を対象にした保守性及び効率性が高いクローン検出を行うクローン検出装置、クローン検出プログラム、及びクローン検出プログラムを記録した記録媒体を提供すること。【解決手段】ブロック線図をツリー構造として正規化し、信号線の下流（出力側）ブロックから上流（入力側）ブロックへ向かって、ブロック線図を表現するツリーのノードに相当するブロック同士を深さ優先で（有向線で繋がったブロックを優先的に比較対象にして）比較し、一致したブロックを登録し、登録したブロックのリストを統合して出力する。【選択図】図１５
2012038022.tif 000002
【特許請求の範囲】
【請求項１】
所定の機能を表す要素の接続関係が、前記要素への入力信号又は前記要素からの出力信号のうち少なくとも何れか１つの信号の向きを示す有向線で表されたモデルファイルを取得する取得手段と、
前記モデルファイルが有する、任意の前記要素の接続関係が前記有向線で表された所定サイズの要素群と、同一又は類似する所定サイズの要素群を、前記要素及び前記有向線で示された接続関係に基づいて前記取得した同一モデルファイル又は前記取得した異なるモデルファイルから検出するクローン検出手段と、
前記クローン検出手段が検出した前記所定サイズの要素群を出力する出力手段と、
を備えたことを特徴とするクローン検出装置。
【請求項２】
前記クローン検出手段は、前記所定サイズの要素群が含む前記要素の最小数又は所定の含有数を設定し、前記設定を満たす要素群を前記所定サイズの要素群として検出することを特徴とする請求項１に記載のクローン検出装置。
【請求項３】
前記クローン検出手段は、前記要素及び前記有向線で示された要素の接続関係において、前記出力信号を示す有向線の終端に位置する要素から、前記入力信号を出力する要素の方向へ向かって、前記所定サイズの要素群の検出を行うことを特徴とする請求項１又は請求項２に記載のクローン検出装置。
【請求項４】
前記クローン検出手段は、前記取得したモデルファイルと、前記取得した同一モデルファイル又は前記取得した異なるモデルファイルと、が有する各々の前記要素を、前記有向線で接続された要素を優先して前記所定サイズの要素群の検出を行うことを特徴とする請求項１、請求項２、又は請求項３に記載のクローン検出装置。
【請求項５】
前記要素は、前記機能ごとに複数種の形状を有し、且つ、前記機能を表す演算の値を有し、また、前記要素１つが前記有向線を複数有する場合と、当該場合に更に前記有向線に前記入力信号の入力順序が定められている場合とがあり、
前記クローン検出手段は、前記要素が有する形状、前記演算の値、前記有向線に定められた順序、又は前記入力信号を示す有向線の数のうち少なくともいずれか１つに基づいて前記所定サイズの要素群を検出することを特徴とする請求項１から請求項４のうちいずれか１項に記載のクローン検出装置。
【請求項６】
コンピュータに、
所定の機能を表す要素の接続関係が、前記要素への入力信号又は前記要素からの出力信号のうち少なくとも何れか１つの信号の向きを示す有向線で表されたモデルファイルを取得する取得機能と、
前記モデルファイルが有する、任意の前記要素の接続関係が前記有向線で表された所定サイズの要素群と、同一又は類似する所定サイズの要素群を、前記要素及び前記有向線で示された接続関係に基づいて前記取得した同一モデルファイル又は前記取得した異なるモデルファイルから検出するクローン検出機能と、
前記クローン検出機能が検出した前記所定サイズの要素群を出力する出力機能と、
を実行させるためのクローン検出プログラム。
【請求項７】
コンピュータに、
所定の機能を表す要素の接続関係が、前記要素への入力信号又は前記要素からの出力信号のうち少なくとも何れか１つの信号の向きを示す有向線で表されたモデルファイルを取得する取得機能と、
前記モデルファイルが有する、任意の前記要素の接続関係が前記有向線で表された所定サイズの要素群と、同一又は類似する所定サイズの要素群を、前記要素及び前記有向線で示された接続関係に基づいて前記取得した同一モデルファイル又は前記取得した異なるモデルファイルから検出するクローン検出機能と、
前記クローン検出機能が検出した前記所定サイズの要素群を出力する出力機能と、
を実行させるためのクローン検出プログラムを記録した記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、クローン検出装置、クローン検出プログラム、及びクローン検出プログラムを記録した記録媒体に係り、例えば、ブロック線図のクローン検出に関する。
【背景技術】
【０００２】
従来、コンピュータに対する一連の指示は、プログラミング言語の言語仕様に従って書かれるソースコード（原始プログラム）というテキストファイルを用いて行われており、当該ソースコードが書かれたソースファイルは非常に難解な仕様である。
近年、当該ソースコードを生成するためのツール（ソフトウェア）として、ＭａｔｈＷｏｒｋｓ社のＭＡＴＬＡＢ（登録商標）シリーズの１つに「Ｓｉｍｕｌｉｎｋ（登録商標）」がある。当該Ｓｉｍｕｌｉｎｋを利用し、設計仕様としての要求書・設計書のモデルをブロック線図のモデル（Ｓｉｍｕｌｉｎｋモデル）で書くことで、プログラミング言語（Ｃ言語）のソースコードを自動設計することが可能になる。
【０００３】
より詳しくは、ＭＡＴＬＡＢは、アルゴリズム開発、データの可視化、数値計算を行うためのハイレベルなテクニカルコンピューティング言語および対話型環境であり、信号・画像処理、通信システム設計、制御系設計、実験計測、金融工学、生命工学などの様々な分野で利用できる。また、Ｔｏｏｌｂｏｘ（登録商標）という目的別のＭＡＴＬＡＢ関数群を使用することにより、容易にＭＡＴＬＡＢ環境を拡張し、対象分野に特化した問題を解決することができる。
また、ＭＡＴＬＡＢと関連して、マルチドメインシミュレーション及びダイナミックシステムのモデルベースデザインのためのプラットフォームとして提供されているのがＳｉｍｕｌｉｎｋである。Ｓｉｍｕｌｉｎｋの対話型グラフィカル環境及びカスタマイズ可能なブロックライブラリ群により、制御、信号処理、通信、その他の時間依存システムの正確な設計、シミュレーション、実装、テストが可能である。また、ＳｉｍｕｌｉｎｋはＭＡＴＬＡＢ環境に統合されており、ユーザはＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルを利用することで広範囲にわたるアルゴリズム開発、データ可視化、データ解析、および数値計算のツールに迅速にアクセスすることができる。
【０００４】
プログラミングの問題としてプログラムの大規模化がある。大規模化というのは、文字通りソフトウェアの規模が大きくなることであり、１００万行単位のプログラムを数十人〜数百人で開発するような状況になる。大規模なソフトウェアを開発するには、同時並行的に開発を進めたり、理解をし易くするためにソフトウェアを分割することが必要になり、その結果、作業者（プログラマー）自身が他者のソースコードのコピーアンドペーストを行ったり、あるいは、アプリケーションフレームワークなどで同じようなコードが自動生成される事が起こり、これがクローンコードが発生する原因となる。
詳しくは後述するが、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルにおけるクローンとは、プログラムのモデル内において、コピーアンドペーストなどにより他の箇所にも同じブロックを組み合わせた同一又は類似する処理が存在することをいい、見かけ上あるいは実質的に同じ構造をしている箇所を指す。
【０００５】
一方、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルなどを使った開発においても、制御ロジックの再利用率が高くバリエーションが豊富な製品の場合、ひとつのモデルを維持及び修正しながら開発が行われることが多く、こうした維持及び修正の際にモデルのコピーアンドペーストを行うことがある。
このようにモデルのコピーアンドペーストを用いた開発が繰り返されると、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルなどの品質が徐々に劣化していき、その結果、開発に悪影響を及ぼすようになる。
こうした開発への悪影響を防ぐために、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルなどの品質を改善する活動を維持的に行うことが重要である。その改善活動では、まず、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルなどに混入した問題点を発見し、次に、その問題に対して適切な対策を行うことが必要である。
【０００６】
近年、プログラミング言語の「ソースコード」を対象としたクローンを検出するツールは多く世に出ている一方で、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルなどで利用される「ブロック線図」を対象としたクローンを検出するツールは開発されていない。
プログラミング言語（Ｃ言語）のソースコードを自動設計（生成）するブロック線図のモデル（ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋなどを利用したモデル）の段階で、クローンを検出でき、更に、当該クローンを統合することができれば、クローン検出及び統合箇所に紐付いたソースコードの改善も自動設計されることが可能となり、プログラム開発・改善において多大な効率の向上に繋がることが期待できる。
【０００７】
ここで、クローン検出における、従来行われているソースコードを対象にする場合と、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルなどのブロック線図を対象にする場合とでの差異を、図２０を用いて説明する。
図２０はソースコードとブロック線図の検出対象の有向グラフを示した図である。
図２０に示すように、ソースコードとブロック線図には、差異の代表例として以下（１）〜（４）などの違いがある。
（１）検出対象が、ソースコードではテキストファイル（ａ、ｂ、…）であり、一方、ブロック線図ではブロック（Ａ、Ｂ、…）のリストである。
（２）検出対象を有向グラフ（矢印）で表したとき、検出対象の有向グラフは、１入力１出力であるソースコードでは入力側も出力側も１本の矢印で表すことができる。一方、主に多入力１出力であるブロック線図では入力側は２本以上の矢印になる場合がある。
ここで、例えば、ブロックＣやブロックＧは、出力信号を表す矢印が２本出ているが、これは同じ信号が異なる２つのブロックに向けて出力されているためであり、出力信号の種類が２つある（即ち、１つのブロックから異なる２信号が出力されている）というわけではない。
（３）検出対象を有向グラフで表したとき、ソースコードでは繰り返しの処理を行うループ（反復処理部）になる部分は存在せず、一方、ブロック線図ではループになる部分が存在する。
（４）ソースコードでは、特定の行（例えば、図示されたａ−ｂ−ｃ−ｄ−ｅの行）へ到達する経路として、１つ前の行（図示しない）からの到達経路は存在しない。一方、ブロック線図では、特定のブロックへ到達する経路として、接続された入力側のブロックの数の分だけ到達経路が存在する。例えば、ブロックＡからブロックＧへの経路としては、Ａ−Ｂ−Ｄ−Ｇと、Ａ−Ｃ−Ｅ−Ｇとの２経路が存在する。
上述した（１）〜（４）に代表される違いにより、ソースコードを対象としたクローン検出で用いられている技術を、ブロック線図を対象とするクローン検出に適用することは極端に困難である。また、仮に適用したとしてもクローン検出の複雑化を招くことになってしまう。
【０００８】
次に、ブロック線図におけるクローンが及ぼす影響について説明する。
プログラム内にクローン、即ち、同一又は類似する構造を持つ箇所が多く存在すると、以下（１）〜（４）に説明する要因によりプログラム全体の保守性や効率性が悪化する。
（１）プログラム変更時の影響箇所が多くなるなどメンテナンス性が悪化し、メンテナンス費用が増大する。
（２）プログラムの解析性が悪化する。
（３）テスト時に検証項目が重複し、テスト費用が増大する。
（４）プログラムサイズが増大し、マイコンなどへの搭載時にリソース、即ち、ＲＯＭ容量が増大する。
上述した（１）〜（４）などの影響及び問題点があるものの、ブロック線図の大規模化及び複雑化に伴い、目視によるブロック線図のクローン検出はほぼ不可能である。
【０００９】
また、ブロック線図を対象にしたクローン検出として、以下の論文が発表されている。
【先行技術文献】
【非特許文献】
【００１０】
【非特許文献１】Ｆｌｏｒｉａｎ  Ｄｅｉｓｓｅｎｂｌｏｅｃｋ、Ｂｅｎｊａｍｉｎ  Ｈｕｍｍｅｌ、Ｅｌｍａｒ  Ｊｕｒｇｅｎｓ、Ｂｅｒｎｈａｒｄ  Ｓｃｈａｔｚ、Ｓｔｅｆａｎ  Ｗａｇｎｅｒ、ＪｅａｎーＦｒａｎｃｏｉｓ  Ｇｉｒａｒｄ、Ｓｔｅｆａｎ  Ｔｅｕｃｈｅｒｔ著  「Ｃｌｏｎｅ  Ｄｅｔｅｃｔｉｏｎ  ｉｎ  Ａｕｔｏｍｏｔｉｖｅ  ＭｏｄｅｌーＢａｓｅｄ  Ｄｅｖｅｌｏｐｍｅｎｔ．ＩｎＡＣＭ２００８」
【００１１】
上記非特許文献では、まず、ソースコードに対して一定の規則に従って処理を加えるプリプロセスを行い、局所的な１つのシステムとしての構造をもつサブシステムを展開している。次に、展開したデータに対して正規化を行い、ブロックに新たに名前付けを行っている。
そして、幅を優先した幅優先探索でクローン検出を行い、検出されたクローン同士の類似度に基づいてサブグラフを探し、クローンのペアをまとめ、最後に、クラスタリングを行うことが記載されている。なお、幅優先探索については後述する。
また、上記非特許文献では、「最も似ているグラフ（即ち、クローン箇所）」を検出するために、逐一、類似度を判断する演算を行っている。
【００１２】
ここで、図２１（ａ）は、前述の幅優先探索を説明するための図である。
同図の各ブロック上部に付された番号が探索の順序を示している。
幅優先探索は、図２１（ａ）に示すように、同一階層に存在するブロックを全て検出対象にし終わってから、次の階層へと探索を進める。
例えば、開始ブロックＡの次に検出対象になるブロックは同一階層に存在するブロックＢかブロックＣである。仮に、開始ブロックＡの次にブロックＢを検出対象にした場合は、その次の検出対象は、当該ブロックＢと信号のやり取りがあるか否か（有向線で繋がれているか否か）にかかわらず、ブロックＣであり、開始ブロックＡの次に検出対象になるブロックがブロックＣの場合も、その次の検出対象は、当該ブロックＣと信号のやり取りがあるか否かにかかわらず、ブロックＢである。同一階層に存在するブロックを全て検出対象にした後、次の階層（ブロックＤ、ブロックＥ、ブロックＦ）へと進む。
【発明の概要】
【発明が解決しようとする課題】
【００１３】
本発明は、ブロック線図を対象にした保守性及び効率性が高いクローン検出を行うクローン検出装置、クローン検出プログラム、及びクローン検出プログラムを記録した記録媒体を提供することを目的とする。
【課題を解決するための手段】
【００１４】
請求項１記載の発明では、所定の機能を表す要素の接続関係が、前記要素への入力信号又は前記要素からの出力信号のうち少なくとも何れか１つの信号の向きを示す有向線で表されたモデルファイルを取得する取得手段と、前記モデルファイルが有する、任意の前記要素の接続関係が前記有向線で表された所定サイズの要素群と、同一又は類似する所定サイズの要素群を、前記要素及び前記有向線で示された接続関係に基づいて前記取得した同一モデルファイル又は前記取得した異なるモデルファイルから検出するクローン検出手段と、前記クローン検出手段が検出した前記所定サイズの要素群を出力する出力手段と、を備えたことを特徴とするクローン検出装置を提供する。
請求項２記載の発明では、前記クローン検出手段は、前記所定サイズの要素群が含む前記要素の最小数又は所定の含有数を設定し、前記設定を満たす要素群を前記所定サイズの要素群として検出することを特徴とする請求項１に記載のクローン検出装置を提供する。
請求項３記載の発明では、前記クローン検出手段は、前記要素及び前記有向線で示された要素の接続関係において、前記出力信号を示す有向線の終端に位置する要素から、前記入力信号を出力する要素の方向へ向かって、前記所定サイズの要素群の検出を行うことを特徴とする請求項１又は請求項２に記載のクローン検出装置を提供する。
請求項４記載の発明では、前記クローン検出手段は、前記取得したモデルファイルと、前記取得した同一モデルファイル又は前記取得した異なるモデルファイルと、が有する各々の前記要素を、前記有向線で接続された要素を優先して前記所定サイズの要素群を検出を行うことを特徴とする請求項１、請求項２、又は請求項３に記載のクローン検出装置を提供する。
請求項５記載の発明では、前記要素は、前記機能ごとに複数種の形状を有し、且つ、前記機能を表す演算の値を有し、また、前記要素１つが前記有向線を複数有する場合と、当該場合に更に前記有向線に前記入力信号の入力順序が定められている場合とがあり、前記クローン検出手段は、前記要素が有する形状、前記演算の値、前記有向線に定められた順序、又は前記入力信号を示す有向線の数のうち少なくともいずれか１つに基づいて前記所定サイズの要素群を検出することを特徴とする請求項１から請求項４のうちいずれか１項に記載のクローン検出装置を提供する。
請求項６記載の発明では、コンピュータに、所定の機能を表す要素の接続関係が、前記要素への入力信号又は前記要素からの出力信号のうち少なくとも何れか１つの信号の向きを示す有向線で表されたモデルファイルを取得する取得機能と、前記モデルファイルが有する、任意の前記要素の接続関係が前記有向線で表された所定サイズの要素群と、同一又は類似する所定サイズの要素群を、前記要素及び前記有向線で示された接続関係に基づいて前記取得した同一モデルファイル又は前記取得した異なるモデルファイルから検出するクローン検出機能と、前記クローン検出機能が検出した前記所定サイズの要素群を出力する出力機能と、を実行させるためのクローン検出プログラムを提供する。
請求項７記載の発明では、コンピュータに、所定の機能を表す要素の接続関係が、前記要素への入力信号又は前記要素からの出力信号のうち少なくとも何れか１つの信号の向きを示す有向線で表されたモデルファイルを取得する取得機能と、前記モデルファイルが有する、任意の前記要素の接続関係が前記有向線で表された所定サイズの要素群と、同一又は類似する所定サイズの要素群を、前記要素及び前記有向線で示された接続関係に基づいて前記取得した同一モデルファイル又は前記取得した異なるモデルファイルから検出するクローン検出機能と、前記クローン検出機能が検出した前記所定サイズの要素群を出力する出力機能と、を実行させるためのクローン検出プログラムを記録した記録媒体を提供する。
【発明の効果】
【００１５】
本発明では、ブロック線図を対象にした保守性及び効率性が高いクローン検出を行うクローン検出装置、クローン検出プログラム、及びクローン検出プログラムを記録した記録媒体を提供することができる。
【図面の簡単な説明】
【００１６】
【図１】本発明のクローン検出装置の本実施形態におけるＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋブロックのサンプル例を示した図である。
【図２】本発明の実施形態に係るクローン検出装置のハードウェア的な構成例を示した図である。
【図３】本発明の実施形態に係るクローン検出装置が行うクローン検出のパターンを説明するための図である。
【図４】本発明の実施形態に係るクローン検出装置に表示される初期画面の一例を示した図である。
【図５】本発明の実施形態に係るクローン検出装置に表示されるクローン検出設定画面の一例を示した図である。
【図６】本発明の実施形態に係るクローン検出装置が行うクローン検出で、選択可能なクローン類似度設定項目の一例を示した図である。
【図７】本発明の実施形態に係るサブシステムとその内部の関係を示す図である。
【図８】本発明の実施形態に係るブロック図の一例を示した図である。
【図９】本発明の実施形態に係るクローン検出装置が行うクローン検出において、クローン候補となるブロックリストが１つ見つかった状態を示した図である。
【図１０】本発明の実施形態に係るクローン検出装置が行うクローン検出において、クローン候補となるブロックリストが２つ見つかった状態を示した図である。
【図１１】本発明の実施形態に係るクローン検出装置が行うクローン検出において、２つのブロックリストを統合した状態を示した図である。
【図１２】本発明の実施形態に係るクローン検出装置における、クローン検出結果表示画面例を示した図である。
【図１３】本発明の実施形態に係るクローン検出装置における、クローン検出結果表示画面の一覧表示画面例を示した図である。
【図１４】本発明の実施形態に係るクローン検出装置における、クローン検出結果の一覧表示が展開表示された画面例を示した図である。
【図１５】（ａ）は、本発明の実施形態に係るクローン検出装置における、クローン検出の全体的な動作の流れを説明するフローチャートであり、（ｂ）は、本発明の実施形態に係るクローン検出装置における、正規化処理の動作を説明するフローチャートである。
【図１６】本発明の実施形態に係るクローン検出装置における、クローン検出処理の動作を説明するフローチャートである。
【図１７】本発明の実施形態に係るクローン検出装置における、クローン検出処理の動作を説明するフローチャートである。
【図１８】本発明の実施形態に係るクローン検出装置における、クローン登録処理の動作を説明するフローチャートである。
【図１９】本発明の実施形態に係るクローン検出装置における、クローンの統合処理の動作を説明するフローチャートである。
【図２０】ソースコードとブロック線図の検出対象の有向グラフを示した図である。
【図２１】先行技術の幅優先探索、並びに、本発明の実施形態に係るクローン検出装置における幅優先探索及び深さ優先探索の一例を説明するための図である。
【発明を実施するための形態】
【００１７】
以下、本発明のクローン検出装置における好適な実施形態について、図１から図１９を参照して詳細に説明する。また、本実施形態では、ブロック線図のモデルは、ＭａｔｈＷｏｒｋｓ社のＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋを使用して作成されたモデルを一例にとり説明する。
（１）実施形態の概要
本発明に係るクローン検出装置の実施形態について、以下イ〜ホに分けて説明する。
イ．モデルファイルの選択、正規化
ロ．クローンの検出
ハ．クローンの登録
ニ．クローンの統合
ホ．クローン検出結果の表示
【００１８】
データの正規化とは、一般的に、ファイル内のデータの重複がないようにテーブルを適切に分割することである。本発明のクローン検出装置に係る実施形態では、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルのブロック線図全体を、所定の演算を行う単位であるブロックが複数個集まり木のように連なった構造であるツリー構造に正規化する。さらに、局所的な機能を発揮するために複数のブロックを用いて構成されているサブシステムや、繰り返し処理（反復処理）を行う構成になっているループに対しては、各々を展開し、展開した接続関係は保存しておき、クローン検出の開始と同時に保存していた接続関係のテーブルを作成する。
本発明に係るクローン検出装置の実施形態では、この正規化を行うファイル、即ち、クローン検出を行うファイル（ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルが適用されたファイル）を複数選択することが可能である。
また、本発明に係るクローン検出装置の実施形態では、上述したツリー構造は、データフロー（信号線）の下流である終端ブロック、即ち出力側の末端に位置するブロックをクローン検出開始地点とし、上流、即ち入力側へ向かってクローンの検出を進める構成にしている。これは、一般的に、演算を行うブロックの数は出力側の数よりも入力側の数の方が多いことに着目し、データフロー数が少ない出力（下流）側からツリー構造を構築する方が、データフロー数が多い入力（上流）側からツリー構造を構築するよりも、効率的であるからである。しかし、もちろん、上流である入力側からツリー構造を構築してクローン検出を行う構成にしてもよい。
そして、正規化後にクローン検出を行う。
【００１９】
本発明に係るクローン検出装置の実施形態では、ブロック線図を表現するツリーのノードに相当するブロック同士を比較する。そうして比較したブロック同士が一致した場合、そのブロックに接続された（即ち、有向線で繋がっている）ブロックを次の比較対象に設定する。
ここで、本実施形態では、説明のため便宜的に、ツリー構造において各々のブロックの入力方向側に接続されたブロックを「子ブロック」、出力方向側に接続されたブロックを「親ブロック」として説明する。
また、本発明に係るクローン検出装置の実施形態では、ブロック線図を表現するツリー構造において、深さ優先探索を行う構成とした。これは、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルを有向グラフで表したときのツリー構造は、一般的に、幅よりも深さの方が広がりが大きい（即ち、ブロックの接続の深さが増大する）傾向にあることに着目して、深さを優先した方が幅を優先するよりも効率的に探索できるためである。しかし、もちろん、幅を優先して探索を行う構成にしてもよい。
【００２０】
ここで、図２１（ｂ）及び（ｃ）は、前述の幅優先探索とは別の探索方法である、本発明の実施形態に係るクローン検出装置における深さ優先探索及び幅優先探索の一例を説明するための図である。
同図の各ブロック上部に付された番号が探索の順序を示している。
本実施形態における深さ優先探索は、信号が出力される方面の末端に位置するブロック（出力側ブロック）を探索の先頭ブロックとして開始し、信号を入力する方面の末端に位置するブロック（入力側ブロック）へ向かって探索（クローン検出）を進める。
つまり、図２１（ｂ）のブロックＡで示されるブロックは出力側の末端ブロックであり、有向線（太矢印線）は入出力信号を示す向きとは逆向きであり探索していく向き（即ち、クローン検出を進める方向）を示している。
深さ優先探索は、図２１（ｂ）に示すように、まず、信号のやり取りがある（有向線で繋がれている）ブロックを、階層を跨いで全て検出対象にして探索を進める。
例えば、開始ブロックＡの次に検出対象になるブロックは有向線で繋がれたブロックＢかブロックＣである。仮に、開始ブロックＡの次にブロックＢを検出対象にした場合は、その次の検出対象は、当該ブロックＢと有向線で繋がれたブロックＤであり、同様にしてブロックＧ、ブロックＨへと探索を進める。
また、仮に、開始ブロックＡの次にブロックＣを検出対象にした場合は、その次の検出対象は、当該ブロックＣと有向線で繋がれたブロックＥ（又はブロックＦ）であり、同様にしてブロックＧ、ブロックＩへと進む（ブロックＣの次にブロックＦが検出対象に選択された場合は、ブロックＦからブロックＩへと進む）。
本実施形態では、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルを有向グラフで表したときのツリー構造は、一般的に、幅よりも深さの方が広がりが大きい（即ち、ブロックの接続の深さが増大する）傾向にあることに着目して深さ優先探索を行う構成とした。これは、深さを優先した方が幅を優先するよりも効率的に探索できるためである。しかし、もちろん、図２１（ｃ）に示すような、信号が出力される方面の末端に位置するブロック（出力側ブロック）を探索の先頭ブロックとして開始し、信号を入力する方面の末端に位置するブロック（入力側ブロック）へ向かって幅を優先して探索を行う、幅優先探索の構成にしてもよい。
【００２１】
ここで、各用語の定義について説明する。
（ｉ）ブロック、及びブロック線図
図１は、本発明のクローン検出装置の本実施形態におけるＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋブロックのサンプル例を示した図である。
ブロック（又は演算ブロック）は、１つのまとまった演算単位を表す要素であり、しばしば矩形などを用いて図示され所定の機能を表し、各ブロック１つ１つに、類似した特性をもつブロックが存在する場合がある。例えば、図１において、入力に対して指定した定数、変数、又は式を乗算することによって出力を生成するＧａｉｎブロック（Ｇ）と、Ｎｕｍｂｅｒ  ｏｆ  ｉｎｐｕｔｓパラメータの値に応じてブロック入力の積または商を計算するＰｒｏｄｕｃｔブロック（Ｐ）とが、その演算機能のうえで似ている、即ち類似するブロック同士であると言える。
本実施形態では、この類似性をもつブロック同士を類似度判断基準テーブルとして、例えばＨＤなどに保存している。
ブロック線図とは、制御アルゴリズムをデータフロー（信号線、即ち有向線）と演算ブロックとの繋がりで表現したものであり、当該ブロック線図におけるデータフローには、分岐や合流が存在する。一般的に、ブロック線図は階層化することで整理することが可能である。
（ｉｉ）クローン
ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルにおけるクローンとは、プログラムのモデル内において、他の箇所にも同じブロックを組み合わせた同一又は類似する処理が存在し、見かけ上あるいは実質的に同じ構造をしている箇所を指す。
例えば、モデル内でコピーアンドペーストが行われるなどしてクローン化されたモデルが生成されると、当該モデルに不具合があった場合にコピーした部分（モデル）を全て修正しなければならない。その結果、作業量が増大し、また、修正漏れをしてしまうことが想定される。そのため、このようにクローン化されたモデルを早期に発見（即ち、クローン検出）して対策を行う必要がある。
（ｉｉｉ）クローン検出
クローン検出とは、ブロック図を対象にして、同一あるいは類似したブロックと信号線（データフロー）の接続関係によって作られた塊（この塊をクローンと呼ぶ）を見つけることである。
【００２２】
（２）実施形態の詳細
図２は、本実施形態に係るクローン検出装置４０のハードウェア的な構成例を示した図である。
本発明の実施形態に係るクローン検出装置４０は、例えばパーソナルコンピュータやＰＤＡなどであり、ＣＰＵ１００、ＲＡＭ２００、ＲＯＭ３００、通信Ｉ／Ｆ（インターフェース）コントローラ４００、ディスクコントローラ５００及びＨＤ（ハードディスク）５１０、ディスプレイコントローラ６００及びディスプレイ６０１、タッチパネル６０２、ＳＤカードコントローラ７００及びＳＤ７０１、キーボードコントローラ８００及びキーボード８０１、マウスコントローラ９００及びマウス９０１、などがシステムバス５０によって接続された構成になっている。
【００２３】
ＣＰＵ１００は、ＲＯＭ３００やＨＤ５１０などに記憶されたプログラムを実行し、各種演算や上述した各部を制御する中央処理装置であり、本実施形態のクローン検出装置４０の実施形態に係る、対象モデル取得機能１０１、比較モデル取得機能１０２、正規化機能１０３、比較機能１０４、クローン検出機能１０５、クローン判定機能１０６、比較基準設定機能１０７などを実現するための制御を行う。
ＲＡＭ２００は、ＣＰＵ１００に対してワーキングメモリを提供するランダムアクセスメモリであり、本実施形態において、クローン検出装置４０にクローン検出機能を発揮させるプログラムは、当該プログラムを実行する際にこのＲＡＭ２００上に読み込まれる。
また、本実施形態では、当該プログラムが実行されると、ＲＡＭ２００は、接続関係テーブル２０１、ループファイル２０２、対象モデルファイル２０３、比較モデルファイル２０４、ｓｏｕｒｃｅ用キュー２０５、ｄｅｓｔｉｎａｔｉｏｎ用キュー２０６、子ｓｒｃ用キュー２０７、子ｄｓｔ用キュー２０８、クローン（クローンペアのリスト）ファイル２０９、表示用クローン（統合後クローン）ファイル２１０、ｓｒｃｉｎｄｅｘ２１１、ｄｓｔｉｎｄｅｘ２１２などの各ファイルやテーブルを保存（記憶）する記憶領域を提供する（記憶手段）。
ＲＯＭ３００は、一度書き込まれた情報を読み出すための読み出し専用記憶装置で、書き換える必要のない情報や、書き換えられては困る情報が記憶されている。
通信Ｉ／Ｆコントローラ４００は、ネットワークに接続するための制御装置であり、端末装置（コンピュータなど）と周辺機器とのデータ伝送や、コンピュータ間の通信などを行う。例えば、クローン検出を実施するモデルファイルをネットワーク経由により取得する場合は、当該ファイルを取得する取得手段となる。
【００２４】
ディスクコントローラ５００は、ＨＤ（ハードディスク）５１０を制御する制御装置である。
ＨＤ５１０は、例えば、半導体装置などによって構成されており、各種のプログラムやデータを記憶している。
本実施形態では、クローン検出を行うための類似判断基準（類似要素情報）を登録したデータベースである類似判断基準表５１２などを記憶している。なお、類似判断基準表５１２については後述する。
また、本実施形態に係るクローン検出プログラム５１１は、このＨＤ５１０が保存している。しかし、当該クローン検出プログラム５１１を、図示しない他の記憶媒体や別途設けられたサーバなどに保存（格納）しておき、必要に応じて取り出せるように、即ち、当該記憶媒体や外部サーバからネットワーク経由によって取得（インストール）をすることができるように、当該クローン検出プログラム５１１が記憶された記憶媒体や外部サーバとクローン検出装置４０とを接続可能に配設しておく構成にすることも可能である。また、ＲＯＭ３００がクローン検出プログラム５１１を保存する構成にしてもよい。
【００２５】
ディスプレイ６０１は、例えば、液晶ディスプレイなどによって構成されており、ディスプレイコントローラ６００により制御される。
また、タッチパネル６０２は、表示機能及び入力機能の２つの機能を備えており、コンピュータなどの外部から受けた画像情報を液晶ディスプレイなどのディスプレイ６０１で表示すると共に、操作者（クローン検出を実行するユーザ）がその画面に表示された絵やピクトグラムなどの点又は領域に手で触れたり、専用の「スタイラス」などと呼ばれるペンや、一般のペンで圧力を加える等により、触れられた画面位置の情報を感知して外部へ情報信号として出力する。外部装置が画面での位置情報に基づいて、操作者が望む適切な動作を行なう。
タッチパネル６０２を介することより、操作者は画面に表示された部分を押したり滑らせたりするなど、操作が直感的に理解しやすくなるため、扱いやすい装置を実現することが可能となる。
本実施形態では、上述したディスプレイ６０１及びタッチパネル６０２は、管理者がクローン検出装置４０を操作するときの操作画面、起動画面、設定画面、及び結果画面などの各種画面を表示する。
【００２６】
ＳＤカードコントローラ７００は、ＳＤ７０１を制御する制御装置である。
本実施形態では、クローン検出装置４０は、クローン検出の対象にするファイル（ブロック線図により構成されているモデルファイル）として、前述のＨＤ５１０や当該ＳＤ７０１、ＵＳＢメモリ（図示しない）に保存されているファイル、あるいは、ネットワーク経由により取得するファイルなどを対象にしてクローン検出を実施することが可能である。
キーボードコントローラ８００は、キーボード８０１を介して取得するユーザからの指示操作を受け付けて制御する制御装置である、
マウスコントローラ９００は、マウス９０１を介して取得するユーザからの指示操作を受け付けて制御する制御装置である。このマウス９０１を利用し、例えば、ユーザがクローン検出を希望するモデルの範囲を、画面上に表示された検出対象のモデルファイルの全体図などに対してマウス９０１でポイントアンドドラッグをして希望検出対象範囲を囲うことで、クローン検出装置４０は、クローン検出を実施する範囲を決定（設定）することができるように構成することもできる。
【００２７】
（イ）モデルファイルの選択と正規化
本実施形態に係るクローン検出におけるモデルファイルの選択と正規化の好適な実施形態について詳細に説明する。
図３は、本実施形態に係るクローン検出装置４０が行うクローン検出のパターンを説明するための図である。
本実施形態に係るクローン検出装置４０は、クローンを検出する対象となるモデルファイルからクローンを検出するにあたり、一例として、以下３つのパターンによりクローンを検出することが可能である。
（１）パターン１（同一ファイル内検索）
１つのモデルファイルの中に、いくつ、どこに、どのようなクローンが存在しているかを検出する。
例えば、図３のパターン１に示したように、対象モデルファイルの中に、モデルＡで表されるクローンが２箇所、モデルＢで表されるクローンが２箇所存在していることを検出する。図３では、クローン検出をする場合に必要となる検出元である対象モデルファイル（左図）と、検出先である比較モデルファイル（右図）として、１つのファイル（対象モデルファイル）が複製された概念図が記載されている。
（２）パターン２（別ファイル内検索）
異なるモデルの中に、いくつ、どこに、どのようなクローンが存在しているかを検出する。
例えば、図３のパターン２に示したように、対象モデルファイル（左図）の中に存在しているモデルＡ、モデルＢ、及びモデルＣで表される各モデルが、比較モデルファイル（右図）の中に、モデルＡが２箇所、モデルＢが２箇所、及びモデルＣが２箇所、クローンとして存在していることを検出する。
（３）パターン３（基モデル検索）
ユーザからの選択を受け付けて、クローンとして検出したいモデルＡを基モデルとして取得し、この基モデル（モデルＡ）を比較モデルに設定することで、当該モデルＡが任意のモデルファイル（対象モデルファイル）の中に、いくつ、どこに存在しているかを検出する。
例えば、図３のパターン３に示したように、基モデルに設定したモデルＡ（右図）が、対象モデルファイル（左図）の中に３箇所存在していることを検出する（モデルＡのクローンを３箇所見つける）。
【００２８】
図４は、本実施形態に係るクローン検出装置４０においてクローン検出プログラム５１１を起動したときに、クローン検出装置４０のディスプレイ６０１に表示される初期画面の一例を示した図である。
図４において、クローン検出設定ボタン１ａはＳｉｍｕｌｉｎｋモデルのクローン検出に際し設定を受け付けるボタンであり、品質診断設定ボタン１ｂはＳｉｍｕｌｉｎｋモデルの品質診断に際する設定を受け付けるボタンである。ユーザがクローン検出設定ボタン１ａを押下することで、クローン検出装置４０は、クローン検出に際し設定画面（図５）を表示させることができる。設定及び設定画面の詳細については後述する。
クローン検出実行ボタン２はクローン検出装置４０がクローン検出プログラム５１１を実行するためのボタンであり、品質診断実行ボタン４は品質診断プログラムを実行するためのボタンである。
本実施形態のディスプレイ６０１には、クローンの検出対象とするＳｉｍｕｌｉｎｋモデルに対して、クローンの検出だけではなく、モデルの品質診断を実行できる場合の画面が表示されているが、クローン検出のみを目的とした画面の構成にすることも可能である。
また、ユーザから終了ボタン３の押下を受け付けた場合は、実行中のクローン検出プログラムを終了する。
このように、本実施形態に係るクローン検出装置４０では、上述した初期画面を介してユーザ（クローン検出を行う実行者など）からの操作を受け付けることで、クローン検出を開始又は終了する。
【００２９】
図５は、本実施形態に係るクローン検出装置４０に表示されるクローン検出設定画面の一例を示した図であり、図６は、本実施形態のクローン検出装置４０において、選択可能なクローン類似度設定項目の一例を示した図である。
ディスプレイ６０１には、最小ブロック設定数値表示エリア６、最小ブロック設定数値調整入力エリア７、Ｒｅｓｅｔ（リセット）ボタン８、類似度設定エリア９、クローン範囲設定エリア１０、設定ＯＫボタン１１などの設定項目が表示されており、更に、類似度設定エリア９には、ブロックタイプ９ａ、ブロックの設定値９ｂ、入力ポートの順序９ｃ、及び入力ポートの数９ｄが、また、クローン範囲設定エリア１０には、無視設定ボタン１０ａ、類似設定ボタン１０ｂ、及び一致設定ボタン１０ｃなどの設定項目がそれぞれ配置（表示）されている。
本実施形態に係るクローン検出装置４０は、最小ブロック設定数値表示エリア６で、ユーザによりキーボード８０１(図２)を介して入力される数値を設定値として受け付けることで、クローンとする最小ブロック数を設定（確定）する。その場合の数値入力は、ユーザが目的に合わせて押下する、又は最小ブロック設定数値調整入力エリア７の各種ボタンにより選択される数値を受け付けることで設定することができる。また、Ｒｅｓｅｔボタン８が押下されれば、入力されていた数値の取消を受け付けることができる。
あるいは、最小ブロック数という閾値ではなく、任意の数のブロック数を設定できる構成にすることもできるし、デフォルト値として最初に表示される値（例えば「１０」、「２０」、あるいは「５０」など）を適宜設定しておく構成にすることもできる。
【００３０】
また、本実施形態に係るクローン検出装置４０は、類似度設定エリア９及びクローン範囲設定エリア１０の各種項目の入力を受け付けることで、クローン検出に際する類似度の設定をユーザの目的や用途に合わせて多種多様に設定することができる。
本実施形態に係るクローン検出装置４０が類似度を設定する場合は、例えば、ブロックタイプ９ａでは、クローン検出の際に、図１に示したようなブロックのタイプに関わる類似度について、類似判断基準表５１２で各ブロックに予め定められた「類似ブロック」に該当するブロックにまで範囲を広げて検出対象として設定するか（類似設定ボタン１０ｂを選択）、又は、「類似ブロック」に該当するブロックは検出対象に設定せず、一致するブロックのみを検出対象として設定するか（一致設定ボタン１０ｃを選択）などを、ユーザからの各ボタン（１０ｂ又は１０ｃ）の押下を受け付けることで設定することができる。なお、本実施形態に係るクローン検出装置４０は、この設定に基づきクローン検出を実行する。つまり、「類似ブロック」に該当するブロックを検出対象にする設定がなされた場合は、ＨＤ５１０に保存している類似判断基準表５１２で各ブロックに予め定められた「類似ブロック」に該当するブロックを、当該各ブロックの検出対象として（検出範囲を広げて）検出を行う。
また、本実施形態に係るクローン検出装置４０の検出設定画面は、ブロックの設定値９ｂには「類似」と「一致」とを、入力ポートの順序９ｃには「無視」（無視設定ボタン１０ａ）と「類似」と「一致」とを、また入力ポートの数９ｄには「無視」と「一致」とを、各々選択するための各ボタン（１０ａ、１０ｂ、１０ｃ）が設けられており、ユーザからの押下を受け付けることでクローン検出の際の類似度の設定をユーザの目的や用途に合わせて多種多様に設定することができる。
なお、「ブロックタイプ」、「ブロックの設定値」、「入力ポートの順序」、及び「入力ポートの数」については後述する。
【００３１】
また、本実施形態に係るクローン検出装置４０では、検出設定画面を表示させて類似度に関する各設定を行う構成としたが、これに限られることはない。例えば、上述した各設定ボタンを用いて頻繁に設定される設定の組み合わせを、予め、パターン化し、更に名称などを付けて登録(記憶)しておき、そのパターン名（例えば、甲、乙、丙など）を選ぶことで、自動で類似設定がなされる構成にすることもできる。
また、本実施形態に係るクローン検出装置４０では、当該設定をクローン検出を実施する度に設定する構成にしたが、例えば、所定の類似度設定をデフォルト値として保存しておくことで、この設定フローそのものを毎回実施する必要がないように構成することもできる。あるいは、予め類似度設定に係る設定がなされたモデルファイルを取得する構成としてもよい。
また、本実施形態に係るクローン検出装置４０では、ユーザによるキーボード８０１からの手入力を受け付ける構成にしたが、例えば、ディスプレイ６０１をタッチパネル６０２にして入力を受け付ける構成や、図示しない音声入力装置からユーザの音声を受け付けて設定する構成にしてもよい。
これらの構成により、類似設定に要する時間を短縮することが可能となり、効率良くクローン検出を行うことができる。
【００３２】
本発明の実施形態に係るクローン検出装置４０では、クローン検出におけるクローンと判断する基準（即ち、ブロック同士を比較する際の比較項目）として、「ブロックのタイプ」、「ブロックの設定値」、「入力ポートの順序」、及び「入力ポートの数」の選択可能な４項目を設けた構成にしている。
「ブロックのタイプ」は、一部を図１に示したように数多く存在するブロックの１つ１つについて、１つのブロックが持つ機能に着目し、異なる他のブロックとの類似性を定める項目である。
本発明の実施形態に係るクローン検出装置４０は、例えば、Ｇａｉｎブロック（Ｇ）の「類似ブロック」にＰｒｏｄｕｃｔブロック（Ｐ）を設定しておくことで、類似度の設定を行う時にその粒度、即ち類似判断の精度が「類似」である（即ち、設定画面：図５におけるブロックタイプ９ａについて類似設定ボタン１０ｂが選択されている）場合は、クローン検出を行う時に、検出対象ブロックがＧａｉｎブロック（Ｇ）で比較対象ブロックがＰｒｏｄｕｃｔブロック（Ｐ）の場合も、検出対象ブロックがＧａｉｎブロック（Ｇ）で比較対象ブロックもＧａｉｎブロック（Ｇ）の場合と同様に、クローンファイル２０９に登録する。つまり、検出するブロックを「一致」のみではなく「類似」にまで広げて該当するブロックをクローン（即ち、最終的に検出されるクローンを構成する要素としてのブロック）として検出し、登録する。
【００３３】
「ブロックの設定値」は、ブロックの１つ１つが有する演算の値について、１つのブロックが持つ演算の値に着目し、異なる他のブロックとの演算の値の類似性を定める項目である。例えば、定数を出力するブロックであるＣｏｎｓｔａｎｔブロックには、「１０」や「１０００」といった設定値が設定されている。
本発明の実施形態に係るクローン検出装置４０では、例えば、上述した類似判断基準表５１２においてＣｏｎｓｔａｎｔブロックの設定値「１０」と「１０００」とを類似とする登録がなされており、且つ、類似度設定エリア９のブロックの設定値９ｂの設定がクローン範囲設定エリア１０で類似設定ボタン１０ｂに設定されている場合には、設定値「１０」のＣｏｎｓｔａｎｔブロック（検出対象ブロック）と設定値「１０００」のＣｏｎｓｔａｎｔブロック（比較対象ブロック）を類似ブロックであるとして判断し、クローンを構成するブロックとして検出することができる。
【００３４】
「入力ポートの順序」は、ブロックが複数の入力信号を受信する場合で且つ当該入力信号が順序を有する場合に、当該順序に着目して類似性を設定するための項目である。
本発明の実施形態に係るクローン検出装置４０は、例えば、検出対象ブロックと比較対象ブロックとが同じブロックであっても、Ｓｗｉｔｃｈの真偽の違いにまで着目するか否かを、無視設定ボタン１０ａ、類似設定ボタン１０ｂ、又は一致設定ボタン１０ｃの何れかの選択を受け付けることで、当該順序に係る粒度（類似判断の精度）を定めることができる。
より詳しくは、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルにおいては、各ブロックは入力信号ごとに一意的な、且つ、意味を持つ番号を有している。例えば、上述したＳｗｉｔｃｈブロックには、２番目の入力が成り立った場合（即ち、「真」）に、１番目に入力していた信号が出力される。一方、成り立たない場合は、３番目に入力する入力信号が出力される、という決まりがある。
本実施形態に係るクローン検出装置４０は、例えば、類似度設定エリア９の入力ポートの順序９ｃの設定が、クローン範囲設定エリア１０で一致設定ボタン１０ｃに設定されている状態で、検出対象ブロックと比較対象ブロックとが同じＳｗｉｔｃｈブロックの場合には、「真」に接続されたブロック同士を比較し、「偽」に接続されたブロック同士を比較する。
【００３５】
「入力ポートの数」は、１つのブロックが複数の入力信号を受信する場合に、当該入力信号の数に着目して類似性を設定するための項目である。本発明の実施形態に係るクローン検出装置４０は、例えば、１つのブロックに対する入力信号の数を無視して検索、登録するか（無視設定ボタン１０ａを選択する）、あるいは、１つのブロックに対する入力信号の数まで一致するブロックをクローンとして検索し、登録するか（一致設定ボタン１０ｃを選択）を設定することができる。
本実施形態では、クローン検出装置４０のＨＤ５１０は、どこまでを「類似」と判断するかの範囲（類似性）について予め設定した類似判断基準表５１２を保存している構成（図２）としたが、都度設定を行う構成にすることもできる。
本実施形態では、このようにしてクローン検出の精度を設定することができるので、クローン検出を行うユーザなどの目的に合わせたクローン検出を効率よく実施することが可能である。
【００３６】
次に、本発明の実施形態に係るクローン検出装置４０は、クローン検出のための各種設定がある場合は当該設定の完了後、ユーザからクローン検出実行ボタン２（図４）の押下を受け付けると、図示しないファイル選択画面を表示する。ユーザがクローン検出を行うファイルを選択すると、本実施形態のクローン検出装置４０は、対象ファイルとして選択されたファイルをクローン検出対象ファイルとして設定し、また、比較ファイルや基モデルがユーザから選択されている場合は、比較ファイル、基モデル（比較用）として設定する。
なお、本実施形態のクローン検出装置４０は、複数のファイルを同時に検出対象ファイルに設定することが可能である
【００３７】
図７は、本実施形態に係るサブシステムとその内部の関係を示す図である。
図７に示したように、サブシステムの中には、Ｉｎｐｏｒｔ(Ｉｎ１、Ｉｎ２、Ｉｎ３など)、Ｏｕｔｐｏｒｔ(Ｏｕｔ１、Ｏｕｔ２、Ｏｕｔ３など)がブロックとブロックの間に入る。
本実施形態では、クローン検出装置４０が正規化を行ってサブシステムを展開し、ブロックに挟まれた（接続された）Ｉｎｐｏｒｔ又はＯｕｔｐｏｒｔを除いた接続関係（例えば、Ｂ−Ｆ、Ｃ−Ｇ、Ｃ−Ｈや、Ｉ−Ｄ、Ｉ−Ｅ、Ｈ−Ｅ）を、接続関係テーブル２０１としてＲＡＭ２００に保存する(図２)。この接続関係テーブル２０１は、本実施形態のクローン検出装置４０が実施するクローン検出において、任意のブロックに接続されているブロックを取得する際に使用する。なお、ブロックの取得については後述する。
更に、本実施形態のクローン検出装置４０は、この正規化時に、ユニットディレイ（ユニットディレイとは、信号が１つのゲートを通過するたびに、出力は入力に対して所定の最小時間単位だけ遅れることを指す）などのループを展開し、ループファイル２０２としてＲＡＭ２００に記憶(保存)する(図２)。このように、ループファイル２０２を記憶しておくことで、無意味な検出が繰り返されてしまうという不具合が発生しないようにすることができる。
【００３８】
（ロ）クローンの検出
次に、本発明に係るクローン検出装置４０の好適な実施形態について詳細に説明する。
本実施形態に係るクローン検出装置４０は、ブロック同士の接続関係を有向線に基づいて辿りながら、且つ、類似度設定に基づくブロック同士の比較を逐次行い、比較結果が類似度設定にマッチするブロックを探し続けることによってクローン検出を行う。
本実施形態では、図５及び図６で説明したように「ブロックのタイプ」、「ブロックの値」、ポートに順番がある場合は「入力ポートの順序」、又は「入力ポートの数」の４つの値のうちの、少なくともいずれか１つを判断基準にし、上記いずれか同士の比較を行うことで、対象同士が同一(あるいは、同一又は類似)か否か（即ち、クローンであるか違うか）を設定に従って判断している。この際、上述した判断基準を全て用いることなく、いずれか１つを基準とする構成にすることもできる。
【００３９】
（ハ）クローンの登録
次に、本発明の実施形態に係るクローン検出装置４０におけるクローンの登録の好適な実施形態について、図８〜図１０を用いて説明する。
図８は、本発明の実施形態に係るブロック図の一例を示した図である。
図９は、本発明の実施形態に係るクローン検出装置４０が行うクローン検出において、クローン候補となる、部分的なクローンである部分クローン（ブロックリスト）が１つ見つかった（有色で示されたブロック）状態を示した図である。
図１０は、本発明の実施形態に係るクローン検出装置４０が行うクローン検出において、クローン候補となるブロックリストが２つ見つかった（有色及び網掛で示されたブロック）状態を示した図である。
本実施形態に係るクローン検出装置４０におけるクローンの登録は、検出対象ファイルと比較対象ファイル(図３：パターン１、パターン２、パターン３のうちの選択されたパターンにより比較対象ファイル又はモデルの種類は異なる)とが有するブロック各々を比較した結果、ブロック同士が、事前の設定とマッチ(一致)したときに必ず行う。
この際、検出対象のＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルなどを有向グラフで表したときに、同じ深さ(一例として、鎖線Ｚで示した階層)で既にマッチしたブロックがある場合と、そうでない場合とで、ＲＡＭ２００のクローンファイル２０９に登録（保存）する方法は異なる。
【００４０】
（同じ深さで、マッチしたブロックがない場合）
同じ深さ(Ｚ)において、本実施形態に係るクローン検出装置４０は、任意のブロック同士の比較を初めて行い、その結果、比較したブロック同士がマッチした場合は、当該マッチしたブロックをそのままクローンファイル２０９に登録する。更に比較と検出を続けて検出されたクローンが図９：Ａ−Ｂ−Ｄ−Ｈに示されており、クローンファイル２０９には図１０に示すように保存される。
【００４１】
（同じ深さで、既にマッチしたブロックがある場合）
同じ深さ(Ｚ)において、本実施形態に係るクローン検出装置４０は、その深さで（Ｘの場合）で登録したブロック(例えば、ブロックＢ)とは別の任意のブロック(例えば、ブロックＣ)同士の比較（即ち、深さＺにおける２回目以降の比較）を行い、その結果、比較したブロック同士がマッチした場合は、当該対象ブロック（ブロックＣ）の親ブロック(ブロックＡ)を先頭にしたブロックリストを新規に作成する。更に比較と検出を続け、当該対象ブロックの子ブロック（ブロックＥ及びブロックＦ）を比較してマッチしたブロックが存在した場合(ブロックＥがマッチ)は、そのブロックを続けてクローンファイル２０９に登録する（図１０：Ａ−Ｃ−Ｅ)。
【００４２】
（ニ）クローンの統合
次に、本発明の実施形態に係るクローン検出装置４０が行うクローンの統合の好適な実施形態について詳細に説明する。
図１１は、本発明の実施形態に係るクローン検出装置４０が、検出された２つのブロックリスト(図１０)を統合した状態を示した図である。
本発明の実施形態に係るクローン検出装置４０が行うクローンの統合は、図１０に示すような、分岐などを持たない部分クローンであるブロックリスト（Ａ−Ｂ−Ｄ−ＨとＡ−Ｃ−Ｅ）を、図１１に示すようなツリー構造にする処理であり、全ての部分クローン（ブロックリスト）のペアの中から２つを取り出して行う。部分クローン、即ちブロックリストのペア(以後、クローンのペアと呼ぶ)とは、対象モデルファイルと比較モデルファイルとの比較で検出されクローンファイル２０９に略同じに登録された、対象モデルファイル内及び比較モデルファイル内の部分クローンの２組の組み合わせを指す。また、このクローンの統合処理前は当該クローンのペアが複数存在している。
本実施形態では、クローン検出装置４０は、任意のブロックリスト（クローン候補リスト）の、先頭ブロック(例えば、ブロックＡ)を基点にして部分クローン単体のブロックリスト同士（Ａ−Ｂ−Ｄ−ＨとＡ−Ｃ−Ｅ）を繋ぎ合わせることで、同一の先頭ブロック（即ち、最初にマッチしたブロック）を有するブロックリストが重複して存在しないように再編する処理を行う。
これは同時に、クローン候補リストとしてＲＡＭ２００のクローンファイル２０９に保存（記憶）されたクローンのペアのうち包含関係にあるクローンのペアについては、クラスタリングによって削除する処理である。より詳しくは、全てのクローンのペアの中から２つ（すなわち、合計４つの部分クローン）を取り出し、片方の部分クローン（対象モデルファイル内）の先頭ブロックが、他方の部分クローン（対象モデルファイル内）の途中に含まれていた場合に、先頭ブロックが途中に含まれていた部分クローンをインデックスとしてｓｒｃｉｎｄｅｘ２１１に登録する。また、同様の処理を比較モデルファイル内の部分クローン同士に対して行うと、完全に包含される部分クローンが存在することがわかる。この、完全に包含される部分クローンを削除する処理である。
【００４３】
（ホ）クローン検出結果の表示
本発明の実施形態に係るクローン検出装置４０におけるクローン検出結果の表示について詳細に説明する。
図１２は、本発明の実施形態に係るクローン検出装置４０における、クローン検出結果表示画面例を示した図である。
まず、本発明の実施形態に係るクローン検出装置４０は、図１２に示したように、ディスプレイ６０１の画面中央の、上側のエリア５００１にクローンの検出元であるｓｒｃ、下側のエリア５００２に検出されたクローンであるｄｓｔを表示する。また、本実施形態では、クローン検出装置４０は、各クローンが複数のサブシステムにまたがっている場合は、クローンとして見つかったブロックを最も多く含むシステムの画像を表示する。
表示切替ボタン１０００は、検出されたクローンのクラス(即ち、クローンの種類)を変更させて表示するためのボタンである。
本実施形態のクローン検出装置４０は、クローンが有するブロックの数が大きいものの順にクローンのクラスを並べて表示する。
クラス切替ボタン２０００は、クローンのクラスの並び順を変更するためのボタンである。
全体表示切替ボタン３０００は、検出したクローンを、縦に並べて表示するか、一覧で表示するかを切り替えるためのボタンである。
画像変更ボタン４０００は、上下それぞれの中央に表示された画像を変更するためのボタンである。
本実施形態のクローン検出装置４０は、エリア５００１やエリア５００２に表示した画像を、ユーザがマウス９０１を用いてクリックするのを受け付けるなどして、別ウインドウを用意して画像を拡大表示することができる。
また、本実施形態のクローン検出装置４０は、ユーザがマウス９０１を用いてラベル６００１やラベル６００２をダブルクリックするのを受け付けることで、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋで、各ラベルに表示されたシステムを開くことができる。この構成により、クローン検出装置４０は見つかったクローンに対して編集作業などを行うことができる。
本実施形態のクローン検出装置４０は、設定内容表示エリア７０００に設定画面(図５)で設定した内容を表示する。なお、本実施形態では、クローン検出装置４０が設定内容表示エリア７０００に表示する内容は、最小ブロック数のみとする構成にしている。しかし、類似度の設定まで表示する構成にすることも勿論可能である。
【００４４】
図１３は、本発明の実施形態に係るクローン検出装置４０における、クローン検出結果表示画面の一覧表示画面例を示した図である。
図１３において、表示エリア５０００内の「＋」ボタンがユーザによりクリックされると、本実施形態のクローン検出装置４０は、該当するエリアに表示していたクローンのクラスと同一のクラスのクローンを全て表示する。クラスエリアＣに、該当するクローンのクラスの情報を表示する。クローンのクラスの情報とは、例えば、「見つかった数２」と表示された場合、同じクラスのクローンが２箇所に存在するという情報であり、「規模(最大)１０」と表示された場合、クローンに含まれるブロックの数が１０であるという情報を表す。
また、本実施形態のクローン検出装置４０は、エリア１ｓにｓｒｃの画像を表示する。  本実施形態のクローン検出装置４０が、ユーザからの、エリア１ｓ(又は、表示エリア５０００)に表示されたｓｒｃ画像のクリックを受け付けると、クローン検出装置４０は当該ｓｒｃ画像を別のウインドウに拡大表示する。
【００４５】
次に、ユーザによるエリア１ｓ（又は表示エリア５０００）のクリックを受け付けた場合に本実施形態のクローン検出装置４０が表示するディスプレイ６０１を説明する。
図１４は、本発明の実施形態に係るクローン検出装置４０における、クローン検出結果の一覧表示が展開表示された画面例を示した図である。
本実施形態のクローン検出装置４０は、エリア１ｓにｓｒｃの画像、エリア１ｄにｄｓｔの画像を表示し、更に、それぞれの画像に対するユーザからのクリックを受け付けることなどで、別ウインドウに拡大表示することができる。
また、本実施形態のクローン検出装置４０は、ユーザがマウス９０１を用いてラベル６００３やラベル６００４をダブルクリックするのを受け付けることで、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋで、各ラベルに表示されたシステムを開くことができる。この構成により、本実施形態のクローン検出装置４０は、モデル(即ち、ブロック線図)を編集することが可能になる。
【００４６】
次に、以上のように構成された本発明の実施形態に係るクローン検出装置４０が行う、クローン検出の一連の動作について詳細に説明する。
まず、本実施形態のクローン検出装置４０におけるクローン検出の全体的な動作について説明する。
図１５（ａ）は、本発明の実施形態に係るクローン検出装置４０における、クローン検出の全体的な動作の流れを説明するフローチャートである。
本発明の実施形態に係るクローン検出装置４０は、まず、クローンを検出する対象となるＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルのファイル（クローンを見つけ出したいファイル）を、ＨＤ５１０、ＳＤ７０１、ＵＳＢ（不図示）、あるいはインターネットを介して他サーバ（不図示）から取得し、クローンの検出対象元ファイル（不図示）としてＲＡＭ２００に保存する。
ここで、本実施形態では、異なる２つのファイルを当該検出対象元ファイルとして取得し、各々のファイルに対するクローン検出を同時に実施することが可能である。更には、上述した３つの検索パターン（図３、パターン１：同一ファイル内検索、パターン２：別ファイル内検索、パターン３：基モデル検索）のうち、パターン２又はパターン３の場合は、該当する別ファイル（パターン２）又は基モデルファイル（パターン３）を、同じく、ＨＤ５１０、ＳＤ７０１、ＵＳＢ（不図示）、あるいはインターネットを介して他サーバ（不図示）から取得し、クローン検出比較元ファイル（不図示）としてＲＡＭ２００に保存する（Ｓ１００）。
【００４７】
次に、本発明の実施形態に係るクローン検出装置４０は、初期画面（図４）をディスプレイ６０１に表示する。そして、ユーザによるクローン検出設定ボタン１ａの押下を受け付けると、同じくディスプレイ６０１に検出設定画面（図５）を表示し、ユーザによる上述したような各種設定の選択をキーボード８０１やマウス９０１、あるいはディスプレイ６０１を直接操作するタッチパネル６０２の操作を介して受け付けて、設定を確定する（Ｓ１０１）。
本発明の実施形態に係るクローン検出装置４０は、ユーザによる設定ＯＫボタン１１の押下を受け付ける（Ｓ１０２；Ｙ）と、設定に係る処理を終了し、再度、ディスプレイ６０１に初期画面を表示する。ユーザによる設定ＯＫボタン１１の押下が確認されない場合（Ｓ１０２；Ｎ）は、各種設定が確定していないと判断して検出設定画面を表示し続ける。
各種設定を終了すると、次に、本発明の実施形態に係るクローン検出装置４０は、ＲＡＭ２００に保存したクローン検出対象元ファイルに対する正規化処理を行い、この時、上述した検索パターンがパターン２又はパターン３である場合は、同時に、クローン検出比較元ファイルに対する正規化処理を行う（Ｓ２００）。
正規化処理の詳細については後述する。
また、本実施形態では、上記の流れとしたが、モデルファイルを受け付ける（取得する）（Ｓ１００）、各種設定を受け付ける（Ｓ１０１及びＳ１０２）、正規化処理を行う（Ｓ２００）は、この順番に限られることはない。例えば、各種設定を受け付けてからモデルファイルを取得する構成や、予め正規化処理されたモデルファイルを取得する構成や、モデルファイルを受け付けて正規化処理を行ってから、各種設定を受け付ける構成にすることもできる。あるいは、各種設定をデフォルト値として設定（登録保存）しておき、各種設定そのものを省略する構成にすることもでき、ディスプレイ６０１は各フローの順番に適するように初期画面を構成する（必要なボタンを追加配置するなど）ことができる。
【００４８】
正規化処理を終了すると、次に、本発明の実施形態に係るクローン検出装置４０は、クローン検出処理を実施し（Ｓ３００）、クローンが検出された場合は随時クローン登録処理を行い（Ｓ４００）、その後、クローンの統合処理を行って検出されたクローンを保存し（Ｓ５００）、ユーザの目的に応じて出力を行う。クローンの統合処理を終了すると、又は、クローンが１つも検出されなかった場合は、本発明の実施形態に係るクローン検出装置４０はクローン検出に係る一連の処理を終了する。
【００４９】
（イ）正規化処理
本実施形態のクローン検出装置４０における、モデルファイルの選択及び正規化の動作について説明する。なお、本実施形態では、検索パターンがパターン１（同一ファイル内検索）として説明を進める。
図１５（ｂ）は、本発明の実施形態に係るクローン検出装置４０における、正規化処理（Ｓ２００）の動作を説明するフローチャートである。
本発明の実施形態に係るクローン検出装置４０は、初期画面（図４）で表示したクローン検出実行ボタン２がユーザにより押下されると、クローンの検出対象元ファイル（ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルのブロック線図）全体を、ブロックが複数個集まり木のように連なった構造であるツリー構造にする正規化処理を行う。この時、上述したように、データフローの出力側の末端ブロックをクローン検出開始地点とし、入力側へ向かってクローンの検出を進めることができるツリー構造の構成にしている。こうして得られた正規化後のファイルを、対象モデルファイル２０３としてＲＡＭ２００に保存する（Ｓ２０５）。また、本実施形態では、比較用としてＲＡＭ２００に保存する比較モデルファイル２０４は、対象モデルファイル２０３を複製したファイルを利用する。
【００５０】
仮に、検索パターンがパターン２やパターン３である場合は、本発明の実施形態に係るクローン検出装置４０は、ＲＡＭ２００に保存した（Ｓ１００）クローン検出比較元ファイル（不図示）を正規化処理し、処理したファイルを比較モデルファイル２０４としてＲＡＭ２００に保存する。
【００５１】
更に、本発明の実施形態に係るクローン検出装置４０は、クローンの検出対象元ファイル内にサブシステムが存在するか否かを確認し（Ｓ２０１）、サブシステムが存在する場合（Ｓ２０１；Ｙ）はサブシステムを展開する（Ｓ２０２）。サブシステムを展開した後又はサブシステムが存在しない場合（Ｓ２０１；Ｎ）は、本実施形態のクローン検出装置４０は、クローンの検出対象元ファイルにループが存在するか否かを確認し（Ｓ２０３）、ループが存在する場合（Ｓ２０３；Ｙ）、上述したように１度出現したブロックが２度出現しないように抑制するための処理であるループの展開を行う（Ｓ２０４）。クローン検出装置４０は、このループ展開を行うことでユニットディレイなどのループをループファイル２０２としてＲＡＭ２００に記憶（保存）する（Ｓ２０５）。この構成により、クローン検出において、ループ処理の箇所で堂々巡りをして検出が終わらないという不具合が発生することを未然に回避することができる。
また、サブシステムを展開して得られる接続関係を接続関係テーブル２０１として、同時にＲＡＭ２００に保存（Ｓ２０５）し、正規化処理を終了する。
ここで、本実施形態では、サブシステムの展開後にループ展開を行う構成としたが、これに限られることはなく、ループの展開後にサブシステムを展開するように構成することもできる。
【００５２】
（ロ）クローンの検出
次に、本実施形態のクローン検出装置４０における、クローンの検出の実施形態の動作について詳細に説明する。
図１６及び図１７は、本実施形態のクローン検出装置４０における、クローン検出の動作を示すフローチャートである。
まず、本実施形態のクローン検出装置４０が行うクローン検出のアルゴリズムを以下に示す。ここで付された番号は、当該クローン検出アルゴリズム内で適用される順序を示している。
（ｉ）クローン検出アルゴリズム
１、与えられたモデルの正規化を行い、サブシステムの展開、ループの展開を行う。
２、与えられたモデルから、全てのブロックを取得しキューに入れる。このキューをｓｏｕｒｃｅ用キューとし、３へ。
３、ｓｏｕｒｃｅ用キューの中から１つブロックを取りだし、ｓｒｃとする。４へ。もし、ｓｏｕｒｃｅ用キューの中が空ならば、１２へ。(ブロックが１つもない場合)
４、ｄｅｓｔｉｎａｔｉｏｎ用キューとして、与えられたモデルから、全てのブロックを取得しキューに入れる。５へ。２と同じ操作をｄｅｓｔｉｎａｔｉｏｎ用キューに対して行う。
５、ｄｅｓｔｉｎａｔｉｏｎ用キューの中から１つブロックを取りだし、ｄｓｔとする。ｄｅｓｔｉｎａｔｉｏｎ用キューの中が空ならば、３へ。そうでなければ、６へ。
６、ｓｒｃとｄｓｔを比較し、マッチしたら７へ（階層を１つ下がる）。マッチしなかったら５へ。
７、ｓｒｃの子ブロックを全て取得し、ｓｒｃ用キューを新規に作成し、入れる。
８、ｄｓｔの子ブロックを全て取得し、ｄｓｔ用キューを新規に作成し、入れる。
９、７で作成したｓｒｃ用キューが空でなければ、ｓｒｃ用キューから、ブロックを１つ取りだし、ｓｒｃｃｈｉｌｄとし、１０へ。ｓｒｃ用キューが空ならば、階層を１つ上がり、階層が一番上であれば、３へ。そうでなければ、９へ。
１０、８で作成したｄｓｔ用キューが空でなければ、ｄｓｔ用キューから、ブロックを１つ取りだし、ｄｓｔｃｈｉｌｄとし、１１へ。一方、ｄｓｔ用キューが空ならば、階層を１つ上がり、階層が一番上であれば、３へ。そうでなければ、８へ。
１１、ｓｒｃｃｈｉｌｄとｄｓｔｃｈｉｌｄを比較し、マッチしたら、ｓｒｃｃｈｉｌｄをｓｒｃとし、ｄｓｔｃｈｉｌｄをｄｓｔとして、７へ。
マッチしなかったら、１０へ。
１２、終了。
【００５３】
次に、本実施形態のクローン検出装置４０における上述したアルゴリズムに基づく、クローン検出処理（Ｓ３００）の動作について詳細に説明する。
本発明の実施形態に係るクローン検出装置４０は、対象モデルファイル２０３が有する全てのブロックを取得し、キュー（ｑｕｅｕｅ、即ち、待ち行列）に入れる（Ｓ３０１）。本実施形態では、このキューをｓｏｕｒｃｅ（検出元）用キュー２０５としてＲＡＭ２００に保存する。
次に、クローン検出装置４０は、ｓｏｕｒｃｅ用キュー２０５が空か否かを判断する（Ｓ３０２）。ｓｏｕｒｃｅ用キュー２０５の中が空の場合、即ち、ブロックが１つもない場合（Ｓ３０２；Ｙ）は、クローン検出処理を終了する。
一方、ｓｏｕｒｃｅ用キュー２０５の中が空ではない場合、即ち、ブロックが１つ以上存在している場合（Ｓ３０２；Ｎ）は、クローン検出装置４０は、ｓｏｕｒｃｅ用キューの中から１つのブロックを取りだし、ｓｒｃとする（Ｓ３０３）。
次に、クローン検出装置４０は、比較モデルファイル２０４から全てのブロックを取得し、ｄｅｓｔｉｎａｔｉｏｎ（検出先）用キューに保存する（Ｓ３０４）。つまり、Ｓ３０１と同じ処理をｄｅｓｔｉｎａｔｉｏｎ用キュー２０６に対して行う。
ここで、クローン検出装置４０は、ｄｅｓｔｉｎａｔｉｏｎ用キュー２０６の中が空か否かを判断する（Ｓ３０５）。この時、ｄｅｓｔｉｎａｔｉｏｎ用キュー２０６の中が空の場合、即ち、ブロックが１つもない場合（Ｓ３０５；Ｙ）は、Ｓ３０２に戻る。
一方、ｄｅｓｔｉｎａｔｉｏｎ用キュー２０６の中が空ではない場合、即ち、ブロックが１つ以上存在している場合（Ｓ３０５；Ｎ）は、クローン検出装置４０はｄｅｓｔｉｎａｔｉｏｎ用キュー２０６から１つのブロックを取りだし、ｄｓｔとする（Ｓ３０６）。
【００５４】
次に、クローン検出装置４０は、各々取り出したｓｒｃとｄｓｔとを比較（Ｓ３０７）、各々取り出したｓｒｃとｄｓｔとが、設定画面（図５）で設定した設定とマッチ（一致）したか否かを判断する（Ｓ３０８）。比較結果が設定内容と一致した場合（Ｓ３０８；Ｙ）は、当該ブロックを登録する処理であるクローン登録処理を行う（Ｓ４００）。クローン登録処理（Ｓ４００）については後述する。
一方、比較した結果、各々取り出したｓｒｃとｄｓｔとが設定とマッチ（一致）しなかった場合（Ｓ３０８；Ｎ）、クローン検出装置４０はＳ３０５へ戻り処理を続ける。
【００５５】
次に、クローン検出装置４０は、ｓｒｃの子ブロックを全て取得し、ＲＡＭ２００に子ｓｒｃ用キュー２０７を新規作成し、当該子ｓｒｃ用キュー２０７にｓｒｃの子ブロックを全て入れる（Ｓ３０９）。具体的には、例えば図８（又は図９）で示したようにｓｒｃのブロックＡには２つの子ブロック（ブロックＢ及びブロックＣ）が存在するので、当該ブロックＢ及びブロックＣを子ｓｒｃキューに入れる。
ここで、クローン検出装置４０がブロック同士の比較を実施している階層が１つ下がったことがわかる。
また、同様に、ｄｓｔの子ブロックを全て取得し、ＲＡＭ２００に子ｄｓｔ用キュー２０８を新規作成し、ｄｓｔの同一階層且つ有向線で繋がっているブロックである子ブロックを当該ｄｓｔ用キュー２０８に全て入れる（Ｓ３１０）。具体的には、本実施形態では、例えば図８（又は図９）で示したようにｄｓｔのブロックＡには２つの子ブロック（ブロックＢ及びブロックＣ）が存在するので、当該ブロックＢ及びブロックＣをｄｓｔキュー２０８に入れる。
【００５６】
次に、クローン検出装置４０は、子ｓｒｃ用キュー２０７が空か否かを判断する（Ｓ３１１）。判断の結果、子ｓｒｃ用キュー２０７が空の場合、即ち、ブロックが１つもない場合（Ｓ３１１；Ｙ）は、クローン検出装置４０は、それまでブロック同士の比較を実施していた（クローン検出を行っていた）階層から１つ上の階層へ上がる（Ｓ３１２）。そして、上がった階層が一番上の階層（即ち、クローン検出を開始した出力側の末端ブロックか）か否かを判断し（Ｓ３１３）、当該上がった階層が一番上の階層であった場合（Ｓ３１３；Ｙ）は、Ｓ３０２へ戻って処理を続ける。
一方、当該階層が一番上の階層ではなかった場合（Ｓ３１３；Ｎ）、クローン検出装置４０は、その階層でのｄｓｔの同一階層かつ有向線で繋がっている子ブロックを全て取得し、子ｄｓｔ用キュー２０８に入れる（Ｓ３１４）。
子ｄｓｔ用キュー２０８に入れた（Ｓ３１４）後か、又は、Ｓ３１１の判断の結果、子ｓｒｃ用キュー２０７が空ではない（即ち、ブロックが１以上存在していた）場合（Ｓ３１１；Ｎ）は、クローン検出装置４０は、子ｓｒｃ用キュー２０７から１つのブロックを取り出してｓｒｃｃｈｉｌｄとする（Ｓ３１５）。
【００５７】
続いて、クローン検出装置４０は、同一階層で作成した子ｄｓｔ用キュー２０８が空か否かを判断する（Ｓ３１６）。判断の結果、同一階層で作成した子ｄｓｔ用キューが空の場合、即ち、ブロックが１つもない場合（Ｓ３１６；Ｙ）は、当該階層の１つ上の階層が一番上の階層か否かを判断する（Ｓ３１７）。判断の結果、当該階層の１つ上の階層が一番上の階層ではない場合（Ｓ３１７；Ｎ）は、Ｓ３１０へ戻り処理を続ける。
一方、当該階層の１つ上の階層が一番上の階層だった場合（Ｓ３１７；Ｙ）はＳ３０２へ戻って処理を続ける。
【００５８】
また、一方、Ｓ３１６の判断の結果、子ｄｓｔ用キュー２０８が空ではない場合、即ち、ブロックが１つ以上存在している場合（Ｓ３１６；Ｎ）は、クローン検出装置４０は、子ｄｓｔ用キュー２０８から１つのブロックを取り出してｄｓｔｃｈｉｌｄとする（Ｓ３１８）。そして、クローン検出装置４０は、Ｓ３１５で子ｓｒｃ用キュー２０７から取り出したｓｒｃｃｈｉｌｄと、Ｓ３１８で子ｄｓｔ用キュー２０８から取り出したｄｓｔｃｈｉｌｄを比較し（Ｓ３１９）、設定画面（図５）で設定した内容と一致するかを判断する（Ｓ３２０）。比較の結果、ｓｒｃｃｈｉｌｄとｄｓｔｃｈｉｌｄとがマッチしなかった場合（Ｓ３２０；Ｎ）は、Ｓ３１６へ戻り処理を続ける。
一方、クローン検出装置４０は、比較の結果、ｓｒｃｃｈｉｌｄとｄｓｔｃｈｉｌｄとが設定内容とマッチした場合（Ｓ３２０；Ｙ）は、ｓｒｃｃｈｉｌｄをｓｒｃに、且つ、ｄｓｔｃｈｉｌｄをｄｓｔにして（Ｓ３２１）、Ｓ４００へ戻って登録処理を行う。その後、Ｓ３０９からの一連の処理を繰り返す。
具体的には、例えば図８（図９）では、クローン検出装置４０は子ｓｒｃキュー２０７から子ブロックであるブロックＢを取り出し、且つ、子ｄｓｔキュー２０８から子ブロックであるブロックＢを取り出し（Ｓ４０７）、取り出したｓｒｃのブロックＢとｄｓｔのブロックＢとを比較し、設定内容と一致（マッチ）するかを判断する。この場合、子ブロック同士が共にブロックＢなので、比較の結果はマッチするので、クローン検出装置４０は、ｓｒｃのブロックＢとｄｓｔのブロックＢとをクローンファイル２０９に登録する処理を行う。更に、クローン検出装置４０は、ｓｒｃの子ブロックであるブロックＢに更に、例えば、ｓｒｃの子ブロックであるブロックＤが存在するので、当該ブロックＤを子ｓｒｃ用キュー２０７に入れ、ｄｓｔの子ブロックであるブロックＤを子ｄｓｔ用キュー２０８に入れて、ｓｒｃのブロックＤとｄｓｔのブロックＤとを比較する。この場合は、ブロックＤ同士でマッチするので、登録処理（Ｓ４００）に進む。一方、判断の結果、ｓｒｃの子ブロックであるブロックＢに、他に子ブロックが存在しない場合は、ｓｒｃ及びｄｓｔ共に階層を１つ上がって、その階層で、同一階層且つ有向線で繋がっているブロックである子ブロックを全て取得し（Ｓ３１０）、そして、その階層（上がった階層）でＳ３１１以降の処理を行う。
【００５９】
（ハ）クローンの登録
次に、本発明の実施形態に係るクローン検出装置４０における、クローンの登録の動作について詳細に説明する。
まず、本発明のクローン検出装置４０に係る実施形態における、クローンの登録のアルゴリズムを以下に示す。ここで付された番号は、当該クローン登録アルゴリズム内で適用される順序を示し、Ａ〜Ｈは図８、図９、及び図１０のブロックＡ〜ブロックＨに対応している。
（ｉｉ）クローン登録アルゴリズム
１，ｓｒｃのブロックＡとｄｓｔのブロックＡを比較してマッチしたので、それぞれを登録する。
２、ｓｒｃの子ブロックであるブロックＢ及びＣをｓｒｃキューに入れる。
３、ｄｓｔの子ブロックであるブロックＢ及びＣをｄｓｔキューに入れる。
４、ｓｒｃキューからブロックＢを取りだし、ｄｓｔキューからブロックＢを取りだす。
５、ｓｒｃのブロックＢとｄｓｔのブロックＢを比較しマッチしたので、登録する。
６、ｓｒｃの子ブロックであるブロックＤをｓｒｃキューに入れる。
７，ｄｓｔの子ブロックであるブロックＤをｄｓｔキューに入れる。
８、ｓｒｃのブロックＤとｄｓｔのブロックＤを比較しマッチしたので、登録する。
９、ｓｒｃの子ブロックであるブロックＨをｓｒｃキューに入れる。
１０、ｄｓｔの子ブロックであるブロックＧ及びブロックＨをｄｓｔキューに入れる。
１１、ｓｒｃのブロックＨとｄｓｔのブロックＧを比較しマッチしなかったので、登録はしない。
１２、ｓｒｃのブロックＨとｄｓｔのブロックＨを比較しマッチしたので、登録する。
１３、ｓｒｃの子ブロックはないので、ｓｒｃ、ｄｓｔ共に１つ階層を上がる。（Ｄの階層へ）
１４、ｓｒｃ、ｄｓｔの他の子ブロックはないので、ｓｒｃ、ｄｓｔ共に１つ階層を上がる。（Ｂの階層へ）
１５、ｓｒｃ、ｄｓｔの他の子ブロックはないので、ｓｒｃ、ｄｓｔ共に１つ階層を上がる。（Ａの階層へ）この時点で図９のようにクローンが見つかる。
１６、ｓｒｃのブロックＣ、ｄｓｔのブロックＣを比較しマッチしたので、登録する。ここで、深さ（鎖線Ｚ）では、すでに登録されているので、親ブロックであるブロックＡを先頭にしたリストを新規に作成する（図１０）。この時登録されているブロックリストは、Ａ−Ｂ−Ｄ−Ｈと、Ａ−Ｃの２種類になる。以下他のブロックに対して同様に処理を進めると、最終的に図１０に示したブロックリストが記憶される。
【００６０】
次に、本発明の実施形態に係るクローン検出装置４０における、上述したアルゴリズムに基づくクローン登録処理（Ｓ４００）の動作について詳細に説明する。
図１８は、本発明の実施形態に係るクローン検出装置４０における、クローン登録処理の動作を説明するフローチャートである。
このクローン登録処理は、本発明の実施形態に係るクローン検出装置４０が、ブロック同士を比較した結果、当該ブロック同士がマッチした場合に必ず行う処理であり、例えば、上述したＳ３０８におけるｓｒｃとｄｓｔとを比較した結果、図９に示したようにｓｒｃのブロックＡとｄｓｔのブロックＡとがマッチすると、クローン検出装置４０は、それぞれをＲＡＭ２００のクローンファイル２０９に登録（記憶）する処理である。
【００６１】
（クローン登録処理）
本発明の実施形態に係るクローン検出装置４０が行うクローン登録処理は、まず、現階層（即ち、マッチするブロック同士が検出された階層）で既に他のブロックがクローンファイル２０９に登録されているか否かを判断する（Ｓ４０１）。判断の結果、既に他のブロック（ブロックリスト）がクローンファイル２０９に登録されている場合（Ｓ４０１；Ｙ）、本発明の実施形態に係るクローン検出装置４０は、この時に登録対象となっているブロック（ｓｒｃ及びｄｓｔ）の親ブロックであるブロックを先頭にして、新規リストを作成し、当該新規リストをクローンファイル２０９に保存（登録）する（Ｓ４０２）。
一方、判断の結果、既に他のブロックがクローンファイル２０９に登録されていない場合（Ｓ４０１；Ｎ）、本発明の実施形態に係るクローン検出装置４０は、一致したブロック（ｓｒｃ及びｄｓｔ）をクローンファイル２０９に保存する（Ｓ４０３）。
本発明の実施形態に係るクローン検出装置４０は、登録したブロックリストが有するブロック数が、設定画面（図５）で設定した「クローンと判定する最小ブロック数」を満たすか否かを判断する（Ｓ４０４）。設定した最小ブロックを満たす場合（Ｓ４０４；Ｙ）は、本発明の実施形態に係るクローン検出装置４０は、当該ブロックリストを表示用クローンファイル２１０に保存し（Ｓ４０５）、一方、設定した最小ブロックを満たさない場合（Ｓ４０４；Ｎ）は、登録せずに、クローン登録処理を終了する。
具体的には、例えば、図８（図９）では、ブロックＢ及びＣが存在する深さ（この深さとは、図８や図９において鎖線Ｚで囲まれた階層のことである）では、既にブロックＢがクローンとしてリスト登録されている。そこで、同じ親ブロックＡを先頭にした新しいリストを新規に作成する。
この時、ＲＡＭ２００のクローンファイル２０９に登録されているブロックリストは、Ａ→Ｂ→Ｄ→Ｈと、Ａ→Ｃの２種類になる。以下、ブロックＥ、ブロックＦ、及びブロックＪについても同様の処理を行うと、最終的に図１０のようなブロックリストがＲＡＭ２００に記憶される。
【００６２】
（ニ）クローンの統合
次に、本発明の本実施形態に係るクローン検出装置４０における、クローンの統合の動作について説明する。
まず、本発明の実施形態に係るクローン検出装置４０における、クローンの統合のアルゴリズムを以下に示す。ここで付された番号は、当該クローン統合アルゴリズム内で適用される順序を示している。
（ｉｉｉ）クローン統合アルゴリズム
１、見つかったクローンのペアの両方(ｓｒｃとｄｓｔ)のリストに対して、先頭のブロックが含まれているクローンを探す。先頭のブロックが含まれていたら、そのインデックスをｓｒｃはｓｒｃｉｎｄｅｘ、ｄｓｔはｄｓｔｉｎｄｅｘに入れ、２へ。
一方、先頭のブロックが含まれていなかったら、残りのクローンのペアのリストに対して同じことを行う。残りのクローンのリストがなければ、４へ。
２、ｓｒｃｉｎｄｅｘとｄｓｔｉｎｄｅｘが同じかチェックする。同じであれば、３へ。同じでなければ、１へ。
３、ｄｓｔの全てのブロックが、全て含まれているかを調べる。全て含まれていたら、追加する必要がないので、１へ。１つでも含まれていなかったら、含まれていないブロックを追加し、１へ。
４、終了。
【００６３】
次に、本発明の実施形態に係るクローン検出装置４０における、上述したアルゴリズムに基づくクローン統合処理（Ｓ５００）の動作について説明する。
図１９は、本発明の本実施形態に係るクローン検出装置４０における、クローン統合処理の動作を説明するフローチャートである。
本発明の実施形態に係るクローン検出装置４０は、まず、クローンファイル２０９にクローンのペアのリストが保存されているか否かを判断する（Ｓ５０１）。
判断の結果、クローンのペアのリストが登録されていなかった場合（Ｓ５０１；Ｎ）は、クローン統合処理を終了する。
一方、本発明の実施形態に係るクローン検出装置４０は、クローンのペアのリストが登録されていた場合（Ｓ５０１；Ｙ）は、検出されたクローンのペアのリスト（クローンファイル２０９に保存されているブロックリスト）１つ１つに対して、最初にマッチしたブロックである先頭のブロック（図８〜図１１における、ブロックＡ）が含まれているか否かを判断する（Ｓ５０２）。この先頭ブロックが含まれているかの判断処理は、ｓｒｃとｄｓｔの両方のクローンのペアに対して行う。判断の結果、先頭ブロックが含まれていなかった場合（Ｓ５０２；Ｎ）はＳ５０１へ戻り、クローンファイル２０９に対して先頭ブロックが含まれるクローンのペアのリストを探す処理を続ける。一方、判断の結果、先頭ブロックが含まれていた場合（Ｓ５０２；Ｙ）は、当該リストの先頭ブロックから数えて２番目のブロックが異なるブロックであるか否かを判断する（Ｓ５０３）。これは、同じｓｒｃに対して異なるｄｓｔが複数見つかる場合があるためである。
本発明の実施形態に係るクローン検出装置４０は、当該リストの先頭ブロックから数えて２番目のブロックが異なるブロックではないと判断した場合、即ち、ｓｒｃのＴｏｐ（先頭ブロック）が同じだが、異なるｄｓｔのＴｏｐであるリストであった場合（Ｓ５０３；Ｎ）、当該検出されたクローンリストを除外し（Ｓ５０４）、Ｓ５０１へ戻る。
一方、当該リストの先頭ブロックから数えて２番目のブロックが異なるブロックであると判断した場合（Ｓ５０３；Ｙ）、本発明の実施形態に係るクローン検出装置４０は、当該クローンのペアのリストのインデックスを、ｓｒｃはｓｒｃｉｎｄｅｘ２１１、ｄｓｔはｄｓｔｉｎｄｅｘ２１２に登録し（Ｓ５０５）、ｓｒｃｉｎｄｅｘ２１１とｄｓｔｉｎｄｅｘ２１２とを比較して一致するか否かを判断する（Ｓ５０６）。
本発明の実施形態に係るクローン検出装置４０は、判断の結果、一致していなかった場合（Ｓ５０６；Ｎ）はＳ５０１へ戻る。一致していた場合（Ｓ５０６；Ｙ）は、クローンのペアのｄｓｔの方の全てのブロックが、全て含まれているかを判断し（Ｓ５０７）、全て含まれていた場合（Ｓ５０７；Ｙ）はＳ５０１へ戻る。一方、ｄｓｔのｉｎｄｅｘ内に１つでも含まれていないブロックがあれば（Ｓ５０７；Ｎ）、当該含まれていないブロックを追加して保存し（Ｓ５０８）、追加し終えた統合リストをＲＡＭ２００に保存する（Ｓ５０９）。
【００６４】
以上説明したように、本実施形態のクローン検出装置４０によれば、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルなどのブロック線図のクローン検出を機械的且つ自動的に行うことが可能になり、その結果、目視に比べて短時間で、また、漏れなくクローンを検出することができる。
更に、検出されたクローンに対してクローンを統合、即ち、共通部分を部品化・再利用をすることで、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルなどのメンテナンスやテストに関わる費用を低減させることができ、保守性や効率性を向上させることができる。
また、「一致」した構造だけではなく「類似」した構造をもクローンとして検出することができる。このように、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルなどにおける、完全一致する構造だけではなく似ている構造も検出できることが可能になり、その結果、該当する部分の共通化及び／又は部品化による改善範囲が広がり、保守性や効率性を向上させることができる。
【００６５】
また、クローンは、大きな塊（つまり、同じ構造になっている箇所が、複数のブロックにわたって構成されている）であるほど、当該クローンを含むプログラムへの上述したような悪影響も改善時の効果も大きい。
そこで、クローンであると判定（判断）をするための最小ブロック数を、予め、閾値として指定（設定）することができる構成にしたので、例えば、クローン検出の実施者（ユーザ）が目的にあわせて当該閾値を調整することが可能になる。例えば、優先度の高いもの、つまり、プログラムに対してより高い確率で悪影響を及ぼす可能性のあるクローンの箇所から効率よく検出し、プログラムの改善を進めていくことが可能になり、その結果、保守性や効率性を向上させることができる。また、この閾値を設定する仕方としては、ユーザが閾値を直接入力するように構成してもよいし、あるいは、予め数パターン設定された閾値の中からユーザが選択できるように構成してもよい。
【００６６】
以上、本発明のクローン検出装置に係る１実施形態について説明したが、本発明は説明した実施形態に限定されるものではなく、各請求項に記載した範囲において各種の変形を行うことが可能である。
また、特定のブロック（例えば、ユーザを介して指定された特定のブロック・タイプ、あるいはブロックの値）を含んだクローンを検出できるように設定することができる構成にすることができる。つまり、「Ｓｗｉｔｃｈ」を含むクローンのみが検出されるように初期設定ができる構成とすることができる。このような構成により、開発の目的や用途に合わせた効率の良いクローン検出を実現することができる。
また、本発明のクローン検出装置に係るクローン検出機能を、例えば、新旧モデルファイルの差分検出といった他の用途に使用することも考えられる。これは、クローン検出を実施した結果、検出されなかった方のブロックを報告する構成にすることで可能になる。
また、例えば、説明した実施形態では、深さ優先探索によるクローン検出としたが、幅優先探索によるクローン検出にしてもよい。
【００６７】
また、現状ではモデルの品質に問題がない場合であっても、本願発明のクローン検出を定期的に行うことで品質が劣化した時にすぐに気付くことができ、開発に悪影響を及ぼす前に対策をとることができる。
更には、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルなどのソフトフェア品質診断を視覚的に行うためのツールとして利用することもできる。例えば、本願発明のクローン検出技術を用いてＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルなどに対してクローン検出を行った結果をもとに得点化を行う。そして、例えばスコープ・品質特性といった２つの評価軸に分類及び分析し、定量化したものを、例えばレーダチャートや散布図などを用いて視覚的な「結果」に落とし込む。そうすることで、ソフトフェア品質の可視化を行うことができる。この可視化により、マクロ的な品質判断と品質を妨げる要素、即ち、ファイルや関数などを特定することが可能になる。
【００６８】
また、本実施形態では、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋモデルを例にとり説明をしたが、これに限られるものではない。例えば、ＬａｂＶＩＥＷ、ＭａｐｌｅＳｉｍ、そしてＳｃｉｌａｂ（登録商標）／Ｓｃｉｃｏｓなど様々な製品によるモデルへの本発明のクローン検出装置、クローン検出プログラム、及びクローン検出プログラムを記録した記録媒体の適用が可能になり得る。
【符号の説明】
【００６９】
１ａ    クローン検出設定ボタン
１ｂ    品質診断設定ボタン
１ｓ    ｓｒｃ画像表示エリア
１ｄ    ｄｓｔ画像表示エリア
２    クローン検出実行ボタン
３    終了ボタン
４    品質診断実行ボタン
５    ディスプレイ
６    最小ブロック設定数値表示エリア
７    最小ブロック設定数値調整入力エリア
８    Ｒｅｓｅｔボタン
９    類似度設定エリア
９ａ    ブロックタイプ
９ｂ    ブロックの設定値
９ｃ    入力ポートの順序
９ｄ    入力ポートの数
１０    クローン範囲設定エリア
１０ａ    無視設定ボタン
１０ｂ    類似設定ボタン
１０ｃ    一致設定ボタン
１１    設定ＯＫボタン
４０    クローン検出装置
５０    システムバス
１００    ＣＰＵ
２００    ＲＡＭ
２０１    接続関係テーブル
２０２    ループファイル
２０３    対象モデルファイル
２０４    比較モデルファイル
２０５    ｓｏｕｒｓｅ用キュー
２０６    ｄｅｓｔｉｎａｔｉｏｎ用キュー
２０７    子ｓｒｃ用キュー
２０８    子ｄｓｔ用キュー
２０９    クローンファイル
２１０    表示用クローンファイル
２１１    ｓｒｃｉｎｄｅｘ
２１２    ｄｓｔｉｎｄｅｘ
３００    ＲＯＭ
４００    通信Ｉ／Ｆコントローラ
５００    ディスクコントローラ
５１０    ＨＤ
５１１    クローン検出プログラム
５１２    類似判定基準表
６００    ディスプレイコントローラ
６０１    ディスプレイ
６０２    タッチパネル
７００    ＳＤカードコントローラ
７０１    ＳＤ
８００    キーボードコントローラ
８０１    キーボード
９００    マウスコントローラ
９０１    マウス
１０００  表示切替ボタン
２０００  クラス切替ボタン
３０００  全体表示切替ボタン
４０００  画像変更ボタン
５０００  表示エリア
５００１  エリア
５００２  エリア
６００１  ラベル
６００２  ラベル
６００３  ラベル
６００４  ラベル
７０００  設定内容表示エリア
Ｃ  クラス表示エリア
【図１】
2012038022.tif 000003
【図２】
2012038022.tif 000004
【図３】
2012038022.tif 000005
【図４】
2012038022.tif 000006
【図５】
2012038022.tif 000007
【図６】
2012038022.tif 000008
【図７】
2012038022.tif 000009
【図８】
2012038022.tif 000010
【図９】
2012038022.tif 000011
【図１０】
2012038022.tif 000012
【図１１】
2012038022.tif 000013
【図１２】
2012038022.tif 000014
【図１３】
2012038022.tif 000015
【図１４】
2012038022.tif 000016
【図１５】
2012038022.tif 000017
【図１６】
2012038022.tif 000018
【図１７】
2012038022.tif 000019
【図１８】
2012038022.tif 000020
【図１９】
2012038022.tif 000021
【図２０】
2012038022.tif 000022
【図２１】
2012038022.tif 000023