NOCOMMONPAIRノード対は端点共有束で唯一でなくてはならない

源氏物語全系譜6.1.ZELの直系血族図 #114 先帝でPAIRBOX:SwapBundledPairのエラー,「NOCOMMONPAIRノード対は端点共有束で唯一でなくてはならない」というルールの違反が起きている.PAIRBOX:#23978:#20650 冷泉院(2)→#20622(1)とPAIRBOX:#26892:#26825 冷泉院(3)→#20622(1)が競合している.どちらもNOCOMMONPAIRで端点共有の中では両存できないことになっている.ノード対の仮ノードが前者は実親子関係,後者は養親子関係であるという点からも共存できないとされるのだが…

PAIRBOX:MoveSamePointではCheckCommonEndPointで端点共有を見つけているのだが,おそらくルールが甘いのだろう.CheckCommonEndPointではsearchCommonPairで候補を見つけた後,共有種別不一致と始点共有の親子関係のチェックを実施している.⇒判定が悪いのではなく,ロジックが悪い.端点共有候補がリジェクトされた場合もリセットされないため,ループから出るときその値が残ってしまっている.⇒修正した.

image

CheckCommonEndPointのロジックをsearchCommonPairに移植した.この論理はCheckCommonEndPointの追加条件ではなく,searchCommonPair自身が判定できなくてはならない.親子関係による実子太線,養子細線の別は,細線の方が長ければ判別できるので,その条件も加味してより詳細化した.これでノード対の端点共有論理は完全にsearchCommonPair一本に統括できたのではないかと思う.

同上サンプルの全体図:#1 光源氏でPAIRBOX:#60400:#23602 蛍兵部卿宮の前の北の方(1)→#13153(0)の端点共有が解決できない.⇒searchCommonPairでは共有種別を返していない.⇒対処した.

同上サンプルの傍系血族図:#42 朱雀院でMakePairListClean中,PAIRBOX:MoveChannelToで停止した.この関数は対象ノード対が直列リスト上にあることを仮定しているが,端点共有ノード対が引っかかった.⇒障害ノードはPAIRBOX #38053:#21312 雲井の雁(1)→ #12405(0)で,PAIRBOX:#38039:#21295 玉鬘(1)→ #10977(0)に繋がっている.CheckPairEndPoint→ CheckInverseCycle→ PAIRBOX::RepairVerticalInverseで起きている.

この関数では「始点終点が同一座標で逆転」が起きたときの処理を実施している.「逆転循環検定」は端点共有とまったく関わりがないと考えられるので,MoveChannelToに変わるノード対単体の移動ができる関数を用意する必要がある.MoveChannelToの中で使っているTakeoutを小文字のtakeoutに変えればよいと思われるので,引数で判別できるようにしてみよう.⇒対処した.

同上サンプルの傍系血族図 基準ノード=#57 女三宮でPAIRBOX:RepairCommonEndPointの出口検査で停止した.PAIRBOX #39234:#21555 蛍兵部卿宮の前の北の方(1)→#13153(0) の「共有端点不一致」が解決していない.CheckSamePointの判定のロジックが悪いのではないか?現行では対象ノードが端点共有代表ノード対の場合に限って検査しているが,その逆ではないか?つまり,代表ノード対を基準にして他のメンバーが間違っているかいないかを決めるべきではないのか?⇒書き直してみよう.⇒うまくいったようだ.

同上サンプルの傍系親族図 基準ノード=#135 致仕太政大臣の北の方でNAMEBOX::IsPossibleBTWLeftHandのエラーで停止した (rightwife->IsLeftHandBox())というエラーが起きている.BTW(Between Two Women)の右手結婚枠配偶者が左手結婚枠本人というエラーだ.エラーを無視して描画は可能.障害ノードはNAMEBOX #21314 冷泉院(1).冷泉院は結婚を7つ持っている.子どもは3人で弘徽殿女御との子ども女一宮と冷泉院の御息所との子ども女二宮,若宮だけだ.この図面は致仕太政大臣の傍系親族図なので,表示されているのは冷泉院+弘徽殿女御→女一宮だけのようだ.⇒いや,違う.

image

表示されている結婚枠は3つ,弘徽殿女御,冷泉院の御息所,秋好中宮の3箇所だ.冷泉院の仮ノード(人名枠)は5つ出ているが,うち,可視ノードは弘徽殿女御のところに出ている(0)と上図右端の光源氏の下の2つだけだ.桐壷院の下の養子ノードは消去された仮ノードになっていて,残り2つがBTWに関係している.⇒この図面は他にもいろいろ問題があるが,保留して先に進もう.ここでは「右手配偶者が左手本人で停止しない@20210108」としておく.

▲HOMEキーが利かなくなっている.

同上サンプルの法定親族図:#110 弘徽殿大后を開いてNAMEBOX:makePairBoxで停止した.ノード対冷泉院(3)→#101539147(1)で「共有端点不一致」が発生している.makePairBoxは新規ノード対を生成する関数だが,この時点で端点共有可能であれば端点共有を実施している.makePairBoxが呼び出される前にこの端点共有は指定されていて,それを決定しているのはAvailableChannelだ.

この関数は内部でSearchSamePointPairを呼び出している.SearchSamePointPairはNAMEBOX::IsBindablePair→ getCommonPairで判定している.NAMEBOX::IsBindablePairは複数箇所から呼び出されている.判定基準をすべての箇所で統一する必要がある.Bobject:getCommonPairTypeという関数を作ってNAMEBOX::IsBindablePairから呼び出すようにした.この論理はPAIRLIST::searchCommonPairから切り出してきたものだ.

しかし,これだけではエラーは止まらない.今度はノード対生成後に,端点共有エラーが発生するようになった.元々あったノード対の連結線の方向が逆向きに変化している.これは仮ノード消去によってトポロジーにドラスティックな変化が生じたためと考えられる.⇒この変化はNAMEBOX::EraseGhostNodeの中でEraseGhostを実行することによって生じているので,端点共有サーチを実施する前にEraseGhostを実行するように書き換えた.⇒これで一応解決したが,searchCommonPairもこの関数を使うように書き換える必要がある.

傍系血族図 基準ノード=#75 葵の上でソートしてPAIRBOX:SwapBundledPairで「NOCOMMONPAIRノード対は端点共有束で唯一でなくてはならない」というエラーで停止した.⇒このエラーはNAMEBOX::makePairBoxで発生している.実際には複数のNOCOMMONPAIRが発生していた訳ではないが,その点を修正しても「最大区間でないnocommonを別チャンネルに移動」が発生する.これは,端点共有を探すときにはまだ,ノード対実ノードのNOCOMMONENDPT属性がセットされていないためだ.これを避けるためにgetCommonPairTypeに渡す引数でNoCommonGoodSonをチェックするようにした.

傍系親族図 基準ノード=#133 麗景殿女御(朱雀院の)でソートしてPAIRBOX::CheckSamePointで停止した.対象ノードが直列リスト上にないというエラーだ.障害ノードはPAIRBOX:#36478:#21473 冷泉院(3)→#21310(1)で右始点共有となってはいるが,所属しているノード対はこれだけだ.これは結局,samepointが間違った値を持っているということを意味する.この不良は「非共有対でsamepoint」としてCheckPairBoxで検出されているが,CheckSamePointに伝達されていない.このようなパラメータ不良が発生したときは,CheckSamePointを呼び出さずにCheckPairBoxでエラー復帰するようにした.

takeoutでノード対を削除して端点共有が解消した場合には,samepointをリセットしておくべきだ.⇒一応そのような論理は整備されているのだが… 何か穴があるのだろうか?⇒ノード対の移動関数には,takeout, Takeoutの他,MoveChannelTo,MoveSamePointがある.PAIRLIST::dataCountDownにも所要の修正を入れた.⇒いや,ここに入れても効果ないのではないだろうか?dataCountDownは事前処理であり,この時点では接続関係に変化はないはずだ.

源氏物語全系譜6.1.ZELの完全木テストが通った!

image

所要時間を以前のレコードと比較したいのだが… 2020/03/12に「源氏4の完全木テストとパックマン全点をPCで並行して走らせておいたのだが,完全木テストの方は5726面:12時間12分21秒で完了していた.」というのがあった.2020年3月なら多分開発環境はいまと同じではないかと思うのだが… 5726面で12時間も掛かっている.今回の検定図面数は2862面で約半分だが,30分そこそこで完了している.体感的には「昔より遅くなった」ような気がしていたのだが… 1台のマシンで2つのテストを並列実行するというのは少し負荷が大き過ぎるような気もするが,それを差し引いてもかなり大きな落差がある.

いや,違う.上の引用は2012/03/12投稿の記事だ.確かにこの頃ならそんなものだったかもしれない.CPUも速くなっているし,この頃はおそらくまたリサイクルシステムも導入されていなかったはずだ.確かに,源氏の完全木テストが30分くらいで終わるというのはこれまで見たことがないような気がする.もう少し整理したらリリース版を起こしてみることにしよう.リリース版は多分これよりずっと速いと思う.

端点共有ノード対が削除されて共有ノード対が単体に戻ったときにsamepointをリセットするために,PAIRLIST::deleteElementを新設した.これで上記傍系親族図 #133 麗景殿女御で出ていた問題は完全にクリアできた.Bobject::getCommonPairTypeという関数を作ってあるので,PAIRLIST::searchCommonPairでこの関数を使うようにする必要がある.⇒対処した.これで端点共有に関する修正は基本的に閉じたのではないかと思う.リリース版を起こしてみよう.

コメントを残す

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

CAPTCHA