next up previous
Next: 性能評価 Up: 階層連立1次方程式のための効率的解消系の開発 (最終報告書概要) Previous: HiRise アルゴリズム

実装

HiRise アルゴリズムに基づき,制約解消系をC++で実装した.この際,HLS などを表す行列は,実際のアプリケーションにおいて疎になる傾向があるので, 配列ではなくリストとして実装した.これにより,巨大な制約階層に対しても 少ない時間とメモリで実行可能になった.

HiRise 制約解消系を利用する際,変数と制約はC++のオブジェクトとして表 現する.例えば,以下のようにプログラムを記述することになる.

HRVar x(1), y, z;               // 変数(xの初期値は1)
HRStay cstay(0); cstay.add(x);  // xに関する強さ0(必須)のstay制約
HREdit cedit(1); cedit.add(y);  // yに関する強さ1のedit制約
HRLinear clinear(2); clinear.add(x, 1).add(y, 2).add(z, -1).setConst(3);
                                // 強さ2の1次方程式制約 x + 2 * y - z = 3
HRSolver solver;                // HiRise制約解消系
solver.add(cstay); solver.add(cedit); solver.add(clinear); // 制約を追加
solver.plan();                  // プランニング
cedit.set(2);                   // ceditによってyに2を代入
solver.execute();               // 実行
printf("x = %f, y = %f, z = %f\n", *x, *y, *z); // 変数の値を表示
cedit.set(3);                   // ceditによってyに3を代入
solver.execute();               // 再実行
printf("x = %f, y = %f, z = %f\n", *x, *y, *z); // 変数の値を表示

これを実行すると,以下のような結果が得られる.

x = 1.000000, y = 2.000000, z = 2.000000
x = 1.000000, y = 3.000000, z = 4.000000

また,制約をより容易に記述するためのパーザーを提供している.これを利用 すれば,変数と制約を以下のように記述できる.

HRParser parser;
parser.createVar("x", 1); parser.createVar("y"); parser.createVar("z");
HRCon* cstay = parser.createCon(0, "stay(x)");
HRCon* cedit = parser.createCon(1, "edit(y)");
HRCon* clinear = parser.createCon(2, "x + 2 * y - z = 3");

HiRise 制約解消系は標準的なC++で実装されているので,多様なプラットフ ォームで利用できる.図1は,Microsoft Windows 95/NT上で動 作するサンプルアプリケーションのスクリーンスナップショットである.この アプリケーションにおいてユーザーは,ノードの追加や,その位置の固定,エ ッジの方向の固定などの操作を行い,グラフを編集できる。

  
図 1: グラフを編集するアプリケーション



next up previous
Next: 性能評価 Up: 階層連立1次方程式のための効率的解消系の開発 (最終報告書概要) Previous: HiRise アルゴリズム



www-admin@icot.or.jp