CheckSamePointで「端点一致でsamepointゼロ」というエラー

源氏物語全系譜6.1.ZELの全体図を#127 摂政太政大臣でソートしてPAIRBOX:repairCommonEndPointの出口でGENELIST:CheckPairBoxの不良ノード対エラーにより停止.CheckSamePointで「端点一致でsamepointゼロ」というエラーが起きている.問題のノード対はPAIRBOX:#49223:#23382 蛍兵部卿宮の前の北の方(1)→#13126 蛍兵部卿宮の前の北の方(0).

PAIRBOX:#49223:#23382 蛍兵部卿宮の前の北の方(1)→#13126(0)と#49237:#23394 致仕太政大臣の北の方(1)→#13143(0)が端点共有と認定されているが,CheckCommonEndPointでは端点共有なしを返している.つまり,CheckCommonEndPointとCheckSamePointの基準が異なる.⇒CheckSamePointのロジックから,PAIRLIST::searchCommonPairという関数を作り,CheckCommonEndPointから呼び出すようにした.

系統並び替えの出口検査でCheckPairListのエラーが検出される.サンプルは源氏物語全系譜6.1.ZELの全体図 #1 光源氏.CheckPairBoxCollisionで障害が発生している.ノード対の衝突が5件発生している.この障害はHeapTribeBoxesを実行することで発生している.たとえば,PAIRBOX:#55361:#23947 八宮の北の方の母(1)→#14452(0)とPAIRBOX:#55518:#24194 受領(1)→#15438(0)が衝突している.

これは当然あり得ない.受領はまるきり離れた別系統のノードだ.これは,HeapTribeBoxesの中で独立系列をMoveRectRightで前詰めしているために起きている.ノード対管理は全域的に実施されているため,別系統のノード対とも数字的には衝突が起きる可能性はある.区間計算で用いている数字は,あらかじめ計算されてノード対の矩形領域に格納されているものが使われているためだ.

HeapTribeBoxesの実行後に再計算するか,ないし直接値を計算するしかない.衝突はPAIRLIST::VerifyPairBox→ CheckNormalizedSectionで検出されているので,この関数では値を直接計算するようにしておこう.⇒だいぶ正確に動作するようになってきたようだ.

同上サンプルを#2 桐壷院でソートして,CheckCommonEndPointで停止した.PAIRLIST::searchCommonPairとCheckCommonEndPointの判定が相反している.⇒searchCommonPairでは計算誤差を見ているのに対し,CheckCommonEndPointでは厳密値を適用しているためだ.⇒対処した.これでエラーは解消したが,別のエラーが発生している.

同上サンプルを開いて,PAIRBOX::MoveSamePointで停止する.この関数は対象ノード,移動先ノードともに直列リスト上のノードと仮定している.⇒searchCommonPairで端点共有の中まで探していた.

同上サンプルを#12 桐壷の更衣の母でソートして,TRIBELIST:MakePairListCleanでループカウントオーバーになった.PAIRBOX:#53758:#23537 致仕太政大臣の北の方(1)→#13143(0)の補修を反復しているようだ.衝突の相手方は毎回変化している.どうも補修が循環してしまっているように思われる.⇒#156006 ノード対:四宮(桐壷院の)(1)→(0)が割り込んで,致仕太政大臣の北の方を共有端点から追い出しているようだ.判定ではAfordableChannelが使われている.⇒checkNormalizedSectionで正規化していない区間を使っていた.

同上サンプルの#13 春宮でTOPOLOGY::CheckPairListのループカウントオーバーが起きた.PAIRBOX::CalcPairBoxで最大区間ノード対の逆転を解決が反復されている.PAIRBOX:#54628:#23016 致仕太政大臣の北の方(1)→#13143(0)とPAIRBOX:#54614:#23004 蛍兵部卿宮の前の北の方(1)→#13126(0)の入れ替えが実施されている.蛍兵部卿宮の前の北の方は同じチャンネルの葵の上のノード対と衝突して一旦チャンネルを追い出され,その後もう一度端点共有でこのチャンネルに戻るという動作を繰り返している.

端点共有ノード対とそうでないノード対の衝突では非共有ノード対側で処理するようにしてエラーは一応解消したが,端点共有同士の衝突という可能性もあり,むしろ,端点共有ノード対を移動する場合は端点共有束全体を移動するようにすべきだろう.チャンネル移動はPAIRBOX::MoveChannelToで実施している.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA