CheckAxisLineStraightで例外が発生

最近の修正をフィックス.

  1. MAXREPEATCOUNTを廃止する@20210315 8箇所
  2. MakingLookUpは系統並び替えで一度だけ実行する@20210227 11箇所

源氏物語全系譜7.ZELの全体図 #4 明石中宮で被参照カウントの残留が起きている.TribeRelocationのフェーズAFTERMARGSAMEGENEでTribeGhostNameを実行しているところだ.障害はNAMEBOX:ExtractBox2LDRsubで対象ノードを削除するところで起きている.その後,CheckAxisLineStraightで例外が発生する.TREEVIEW:GetBaseBoxが空を返している.まず,この障害を先に見ておこう.

CheckAxisLineStraightでは「血統軸線図で軸線上の描画要素が垂直線上にあることを確認」している.TREEVIEW::GetBaseBoxはTREEVIEWが管理している基準ノードの仮ノードbaseboxを返す関数で,この値を設定しているのはTREEVIEW::SetBaseBoxだ.値は設定されているが,その後このリンクはExtractBox2LDRsubの中で削除されている.TREEVIEW::CleanSansyoでは参照解除した後,SelectBaseBoxで取り直しを実施しているのだが… ⇒実際,この時点では値は再設定されているのだが…どこかでリセットされている.再設定されてはいるが,値は削除対象リンクと同じだ.

TREEVIEW::SelectBaseBoxでは基準カードの仮ノードが無効になっている場合には取り直しするようになっているが,まだこの時点では活きているためだ.すでにNAMEBOXのデストラクタが発動された状態になっているので,disposingを見るようにしておこう.⇒解決した.この修正で上記の非参照カウントの残留も発生しないようになった.

上記サンプルの#6 玉鬘でAFTERMARGSAMEGENEフェーズのループが停止しなくなった.TOPOLOGY::EstablishMajorTribeChainが収束しない.EstablishMajorTribeChainでは系列木グラフを連結成分に分解しているが,3成分に分離した状態から脱出できない.分離している系列は以下の2つだ.

  1. TRIBEBOX #16586 先祖=#12539 中将のお許(髭黒付)(0)[34] 優先=#19098 髭黒(3)→#10720 髭黒(0) →主系列#15210:※3 type=BTW右接続関係
  2. TRIBEBOX #16599 先祖=#12556 木工の君(0)[35] 優先=#19115 髭黒(4)→#10720 髭黒(0) →主系列#15210:※3 type=BTW右接続関係

どちらも髭黒が系列優先ノードになっている.ループを強制脱出して描画まで進むことはできる.最終出力ではすべての系列の参照関係は解決している.2つの系列の共通の優先実ノードである髭黒(0)では当初「系列優先実ノードの絶対/物理世代番号不一致」が発生しているが,その後解消しているようだ.それでは何が原因で「物理コネクション不在」になっているのか?系列接続種別が途中でどちらも逆婚姻関係に切り替わっている.参照先も髭黒(2) →主系列#16307:右大臣(明石)に変わる.最終的には髭黒(0) を左手本人とするBTWが成立する.髭黒(0) を左手本人とするBTWには以下がある.

  1. rightbox=MARGBOX #8100:#11026 髭黒の前の北の方(0)+#18238 髭黒(1)→#18252 真木柱(2)
  2. rightbox=MARGBOX #8020:#12539 中将のお許(髭黒付)(0)+#19098 髭黒(3)→
  3. rightbox=MARGBOX #8276:#12556 木工の君(0)+#19115 髭黒(4)→

なぜだろう?AFTERMARGSAMEGENEフェーズではこれらの結婚に対するBTWは試されていない.MainExperiment→ ReduceMultiCard→ FindDoublyBlessedOneでは多重カードを持つ人名リンクを対象にそのノードが配偶者となっている結婚枠を総当りでチェックしているので漏れがないが,TRIBEBOX::BetweenTwoWomenでは制約条件が多いため外れている.現行方針は,AFTERMARGSAMEGENEで①すべての系列の物理コネクションを確立する,②多重不可避を除くすべてのノードで絶対世代番号と物理世代番号が一致する配置を確定する,というものになっているので,少なくとも系列優先ノードの関わるBTWはこのフェーズの中で決めてしまう必要がある.

AFTERMARGSAMEGENEのループで実行しているBetweenTwoWomenを廃止して,系列優先ノードに限定してFindDoublyBlessedOneを使ってみることにしよう.⇒いや,むしろ,EstablishMajorTribeChainにそれを組み込んだ方がよいのではないか?⇒TRIBEBOX:addTribeTreeGraphでHasPhysicalConnectionに失敗したとき,系列優先ノードのBTWを試みるようにした.⇒これにより,TRIBEBOX #16586 先祖=#12539 中将のお許(髭黒付)(0)[6] 優先=#19098 髭黒(3)→#8697 玉鬘(0) →主系列#15210:※3 type=BTW左接続関係を確立できた.しかも,これ一発ですべての障害が解決した.

このサンプルでは髭黒が多重になって,多重が6件発生しているが,髭黒(2)と(3)は同世代なので仮ノード消去できるように見える.なぜ,それができないのかを見ておこう.髭黒の仮ノードは7個あるが,可視ノードはNAMEBOX #18950 髭黒(2)と#19098 髭黒(3)だけだ.髭黒(3)は配偶者だが,BTWの左手本人になっている.髭黒(2)は消去された仮ノードの実ノードで同時にTYW枠本人でもある.TYWをLDRに転換するという関数はあったはずだが… ⇒NAMEBOX::ExtractBox2LDRsubでそれをやっている.ExtractBox2LDRはeraseGhostからしか呼び出されていない.TYW枠を吸収するという処理もあったのではないか?

TOPOLOGY::CheckAbsorbMarriageは一度も実行されていない.⇒クラスタ循環がある場合には実行を抑制している.⇒クラスタ循環がある場合もCheckAbsorbMarriageを実行するようにした.これで髭黒の多重は消えて,多重5件という最小値まで削減することができた.これ以外のパターンで多重カードが5件以上になるケースがかなりある.これは避けられないのだろうか?

▲同上サンプルの#56 今上で停止した.TRIBEBOX:CheckAbsoluteGeneで(prime->IsValidNameBox() && !primary->breakup)が起きている.(primary->getnodegene() == prime->getFloor())の場合はその直前でゼロ復帰しているので,系列優先仮ノードの絶対世代番号と物理世代番号が一致していないことを意味する.系列優先仮ノードがbreakupでないということは,そのノードがクラスタ循環でパージされた結婚に関わっていないということを意味するので,本来なら一致していなくてはならないのだが…

エラーを無視して続行すると,EstablishMajorTribeChainで停止しない状態になる.障害が起きているのは,TRIBEBOX #15140 先祖=#10448 二条太政大臣(0)[1] 優先=#9547 今上(0) で始系列だ.これはかなりおかしい.TRIBELIST::SetAbsolutePotentialでは,「絶対世代番号系と物理世代番号系を一致させる」としているのだが,一致していない.SetAbsolutePotentialは以下の3箇所から呼び出されている.

  1. AdjustTribeGeneration(void) (TRIBELIST)
  2. HeapTribeBoxes(bool symmetry) (TRIBELIST)
  3. SetTribeMaxGene(char * caller) (TRIBELIST)

SetTribeMaxGeneはGoDownStreamの出口で呼び出されている.また,TribeRelocationのステージ【1】系列相対世代番号を正規化するの段でNormalizeRelativeGenerationにより「系列相対世代番号を正規化する」ところでも実行される.また,ShiftDirectAbsoluteの中からも実行される.ShiftDirectAbsoluteの中からも実行されている.系統の最古世代先祖の絶対世代番号が1になっている.これはかなりおかしい.

絶対世代番号は0発進のはずだ.最古世代先祖として#10448 二条太政大臣(0)が選択されているが,明らかにこれは間違いだ.CARDLINK:#2922 @211※2[0]かないし,CARDLINK:#1473 @50※3[0]でなくてはならない.ということは,TRIBELIST::GetTheEldestが間違っているということになる.

コメントを残す

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

CAPTCHA