ハイブリッド並行制約プログラミングにおける 制約エラー説明機能の設計と実装 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) 出力 Hybrid cc インタプリタ y:: 0.000000e+00 1.000000e+01 1.000000e+01 1.000000e-02 9.999510e+00 9.999510e+00 2.000000e-02 9.998040e+00 9.998040e+00 ・・・・ 研究の目的と背景 制約はpoint phaseで制約ストアに追加(Tell)される。制約ス トアに矛盾があれば制約エラーとなる。 問題点 制約エラーが生じても、デバッグに有効な情報を返さない 制約エラー発生時に処理系がプログラム実行中の制約情報 を教えてくれるとデバッグが行いやすくなる ビリヤードモデル 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の挙動計算 } }, Hybrid ccでモデリング 摩擦は無視で完全弾性衝突とする 球同士の衝突のみを表現 Ballをクラス、当たり判定、衝突後の挙動 をCollisions()で表現 問題点 3つの球が同時衝突するとエラーが発生し 計算が中断されてしまう 制約エラー Bとの衝突に よって速度Vab が生じる B A A Cとの衝突に よって速度Vac が生じる C 制約の矛盾を原因とするエラー 制約エラーで即時計算が中断される 例:ビリヤードモデルにおける3物体衝突 AとBの衝突によって生じる速度Vab A.V = Vab, AとCの衝突によって生じる速度Vac A.V = Vac, A.V = Vab, A.V = Vac 制約の矛盾が発生 制約エラー説明機能 設計 Hybrid ccプログラム 構文解析 point phase処理・計算 処理データ 制約、エージェント 制約トレースへの記録 interval phase処理・計算 制約エラー発生 制約エラー処理 制約トレースの追加 サンプル値出力 制約トレースの出力 上書きされた変数の出力 制約ストア表示 制約エラー説明機能 実装 hybrid cc処理系を改良 - C++で実装 制約エラー説明モードの追加 制約トレースの表示 あるpoint phaseにおいて今まで追加された制約と記述を記録し管理 制約ストア表示 制約エラー検出時の制約ストアと制約の矛盾を起こした制約の表示 上書きのあった変数の表示 変数の上書きが起こると制約エラーが起こる。エラーの原因となった 変数名と値の出力 以前の処理系出力例:ビリヤードモデル 制約エラー検出時の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! • 記述だけでは、どのオブジェクトでエラーが発生したのかがわからない • 制約エラーの原因である制約情報が一切ない 出力例:ビリヤードモデル the following variable might be set incorrectly ..... varibale name: B1.vy latest variable value: latest access value: 21.650635 ] ConstrTrace List--------------- 上書きされた変数名 [ 21.650635 , 21.650635 ] [ -21.650635 , - 代入しようとした計算値 制約トレース表示開始 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 ・・・・・・ プログラムの修正 ビリヤードモデルの場合、ユーザーは以下の手順で修 正する 上書きされた変数を見る 1. B1.vyが値の衝突を起こしている B1.vy = 21.56 ? B1.vy = -21.56? 上書きされた変数を縛る制約を制約トレースから探す 2. B1.vy+c$0*ix$4+(-prev(B1.vy)) = 0.00000 B1.vy+(-prev(B1.vy))+c$1*ix$6 = 0.00000 上の制約をTellしたエージェントに問題がある 3. 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
© Copyright 2024 ExpyDoc