130 likes | 236 Views
ハイブリッド並行制約プログラミングにおける制約エラー説明機能の設計と実装. 2006 年度 卒業論文 1G03R090-5 笹嶋 唯 指導:上田 和紀教授. ハイブリッド並行制約プログラミング. ハイブリッド並行制約プログラミング( hybrid cc )は時間軸に沿った連続的・離散的変化からなるハイブリッドシステムを表現できる宣言型言語 実行は 2 つのフェーズの繰り返し 連続変化 interval phase 離散変化 point phase
E N D
ハイブリッド並行制約プログラミングにおける制約エラー説明機能の設計と実装ハイブリッド並行制約プログラミングにおける制約エラー説明機能の設計と実装 2006年度 卒業論文 1G03R090-5 笹嶋 唯 指導:上田 和紀教授
ハイブリッド並行制約プログラミング • ハイブリッド並行制約プログラミング(hybrid cc)は時間軸に沿った連続的・離散的変化からなるハイブリッドシステムを表現できる宣言型言語 • 実行は2つのフェーズの繰り返し • 連続変化 interval phase • 離散変化 point phase • プログラムは既存実装であるhybrid ccインタプリタ(hybrid cc処理系)で解釈されシミュレーション結果を得る 可視化ツール Hybrid ccプログラム 出力 y=20, y‘=0, x=0, x'=3, always{ cont(y),cont(x), x''=0, if(y>0) then y‘’=-9.8,if(y=0) then y‘=-0.7*prev(y’)}, sample(x,y) y:: 0.000000e+00 1.000000e+011.000000e+01 1.000000e-02 9.999510e+009.999510e+00 2.000000e-02 9.998040e+009.998040e+00 ・・・・ Hybrid cc インタプリタ
研究の目的と背景 • 制約はpoint phaseで制約ストアに追加(Tell)される。制約ストアに矛盾があれば制約エラーとなる。 • 問題点 • 制約エラーが生じても、デバッグに有効な情報を返さない • 制約エラー発生時に処理系がプログラム実行中の制約情報を教えてくれるとデバッグが行いやすくなる
ビリヤードモデル • Hybrid ccでモデリング • 摩擦は無視で完全弾性衝突とする • 球同士の衝突のみを表現 • Ballをクラス、当たり判定、衝突後の挙動をCollisions()で表現 • 問題点 • 3つの球が同時衝突するとエラーが発生し計算が中断されてしまう Ballクラス Ball = (initpx, initpy, initvx, initvy) [px, py, vx, vy, ChangeX, ChangeY] { px = initpx, py = initpy, vx = initvx, vy = initvy, ・・・・・・ }, Collisions() Collisions = (){ always forall Ball(A) do forall Ball(B) do { If(当たり判定) then { 衝突後のBallの挙動計算 } },
制約エラー • 制約の矛盾を原因とするエラー • 制約エラーで即時計算が中断される • 例:ビリヤードモデルにおける3物体衝突 AとBの衝突によって生じる速度Vab A.V = Vab, AとCの衝突によって生じる速度Vac A.V = Vac, A.V = Vab,A.V = Vac 制約の矛盾が発生 Bとの衝突によって速度Vabが生じる B A A C Cとの衝突によって速度Vacが生じる
制約エラー説明機能 設計 Hybrid ccプログラム 構文解析 制約トレースへの記録 point phase処理・計算 処理データ 制約、エージェント interval phase処理・計算 制約エラー発生 制約トレースの出力 上書きされた変数の出力 制約ストア表示 制約エラー処理 制約トレースの追加 サンプル値出力
制約エラー説明機能 実装 • hybrid cc処理系を改良 - C++で実装 • 制約エラー説明モードの追加 • 制約トレースの表示 • あるpoint phaseにおいて今まで追加された制約と記述を記録し管理 • 制約ストア表示 • 制約エラー検出時の制約ストアと制約の矛盾を起こした制約の表示 • 上書きのあった変数の表示 • 変数の上書きが起こると制約エラーが起こる。エラーの原因となった変数名と値の出力
以前の処理系出力例:ビリヤードモデル 制約エラー検出時のpoint phase処理 Doing Point computation... Unexpected failure! Last statement executed was: c = (B.py+(-(A.py)))*1/(B.px+(-(A.px))) (今までのサンプル値の出力) ・・・・・ Constraint error! Point phase開始 最後に実行された記述 • 記述だけでは、どのオブジェクトでエラーが発生したのかがわからない • 制約エラーの原因である制約情報が一切ない
出力例:ビリヤードモデル the following variable might be set incorrectly ..... varibale name: B1.vy latest variable value: [ 21.650635 , 21.650635 ] latest access value: [ -21.650635 , -21.650635 ] ConstrTrace List--------------- Agent (15) --- ix = (prev(B.vx)+c*prev(B.vy))*1/(1.00000+c^2.00000) Tell Constraint ---ix$6+(((prev(B1.vx)+c$1*prev(B1.vy))*1/(1.00000+c$1^2.00000))) = 0.00000 Agent (14) ---B.vx = prev(B.vx)+(-ix) Tell Constraint ---B1.vx+(-prev(B1.vx))+ix$6 = 0.00000 ・・・・・・・・ 上書きされた変数名 既に代入されている計算値 代入しようとした計算値 制約トレース表示開始 制約を制約ストアに 加えた記述 加えられた制約
出力例:ビリヤードモデル ---- last constraint store state ---- >>latest tell-constraint ---- c$1+(-((B1.py+(-A1.py))*1/(B1.px+(-A1.px)))) = 0.00000 >>constraint list 0> ix$6+(((prev(B1.vx)+c$1*prev(B1.vy))*1/(1.00000+c$1^2.00000))) = 0.00000 1> B1.vx+(-prev(B1.vx))+ix$6 = 0.00000 2> B1.vy+(-prev(B1.vy))+c$1*ix$6 = 0.00000 3> c$0+(-((B1.py+(-A2.py))*1/(B1.px+(-A2 ・・・・・・ 最後に追加された制約 制約ストアの最終状態。制約をリスト表示
プログラムの修正 • ビリヤードモデルの場合、ユーザーは以下の手順で修正する • 上書きされた変数を見る • B1.vyが値の衝突を起こしている • B1.vy = 21.56 ? B1.vy = -21.56? • 上書きされた変数を縛る制約を制約トレースから探す • B1.vy+c$0*ix$4+(-prev(B1.vy)) = 0.00000 • B1.vy+(-prev(B1.vy))+c$1*ix$6 = 0.00000 • 上の制約をTellしたエージェントに問題がある • B.vy = prev(B.vy)+(-(c*ix)) • 解決案 • 矛盾の原因となる制約をTellしたエージェントを修正する • 上書きされた変数の初期値を修正する - 微小値εずらす
まとめと今後の課題 • まとめ • 制約に関する情報が増えたため、制約エラーを起こすプログラムのデバッグは以前に比べて容易に行うことができるようになった • 問題のある記述、制約の検出機能の改良 • ユーザーに依存するのではなく、処理系が自動的に問題のある記述、制約の特定を目標とする
y=20, y‘=0, x=0, x'=3, always{ cont(y),cont(x), //連続量 x''=0, if(y>0) then y‘’=-9.8,//重力による自由落下 if(y=0) then y‘=-0.7*prev(y’)//地面に衝突 }, sample(x,y)//X、Yのサンプル値を取得 A B