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上で動 作するサンプルアプリケーションのスクリーンスナップショットである.この アプリケーションにおいてユーザーは,ノードの追加や,その位置の固定,エ ッジの方向の固定などの操作を行い,グラフを編集できる。