TailSheddingで差分が負のときはノード対を破棄する

源氏物語全系譜6.1.ZELの直系親族図を#57 女三宮でソートして,TRIBELIST::ShiftDirectAbsolute→ NAMEBOX:TailSheddingで停止.TailSheddingはトカゲの尻尾切り(tail shedding)のように長い尻尾を切り詰める操作だ.仮ノードと実ノードの世代差をD,長い尻尾の長さをLとしてdiff = L-Dだけ短縮されるが,diffが負の場合は操作できないためエラーになる.ShiftDirectAbsoluteではカードを絶対世代番号で指定された位置にシフトして重婚同類検定の結果を図面に反映させようとしているが,重婚同類循環が発生している場合には絶対世代番号を一意に決定することができないため,矛盾が生じているものと考えられる.

従来仕様では重婚同類循環が検出された場合にはShiftDirectAbsoluteを実行しないようになっていたのだが,可能な限り適用するというのが現在の方針だ.,まず,diffが負のときには無動作で抜けるように修正してみよう.⇒停止しないで描画できるようになった.このような事象は光源氏(2)と朱雀院(1)で起きている.TailSheddingでは差分がゼロのときには「LDRノード対の世代差がゼロになったときは仮ノード消去に転換する」という処理が組み込まれている.

また,TOPOLOGY::CheckShiftedPairBoxでは差分が負の場合はノード対を破棄するという処理を実行しているので,この論理をTailShedding本体に組み入れてみよう.⇒出力はかなり変わった.光源氏(0)と朱雀院(0)の頭に入っていた連結線が消え,桐壷の更衣→光源氏,弘徽殿大后→朱雀院が直結するようになった.

image

図面的にはこの方がわかり易い.修正前の図面を出してみよう.

image

コンポーネントは同一で,それらが水平シフトしているだけの違いだが,(修正後の方が)変に込み入ったところがないのがよいと思う.

同上サンプルの傍系親族図を#6 玉鬘でソートしてTRIBEBOX:SetMinorTribeで停止した.系列優先実ノードと優先仮ノードの実ノードが異なるというエラーだ.⇒NAMEBOX:DoublyBlessedOneでOnDoublyBlessedOneである区間を延長して,ChangeTribeRealnodeを実行しているブロックを含むようにした.また,これと付随して,hasPhysicalConnectionでこれまで優先仮ノードが(PRIMGHOST | ELDERWIFE))属性を持つ場合はつねに物理コネクション成立としていたのを,「実ノード不一致」と「実ノード属性不正」では不成立とした.

▲同上サンプルの傍系親族図を#8 夕霧でソートしてMARGBOX:GetUpperNodeで停止した.MakePairListClean実行中,CheckPassingPoint→ NoCommonGoodSon→ GetUpperNodeで起きている.障害が起きているのはMARGBOX #2396:#2438 弘徽殿女御(3)+→#1704 弘徽殿女御(1)で,TOOYOUNGWIFE|MOTHERLESS属性とHASNOMARGLINKクリティカル属性を持っている.

HASNOMARGLINKは「結婚リンクに接続していない結婚枠」の意味で,#2438 弘徽殿女御(3)に接続している.しかし,この結婚枠の上流には弘徽殿女御(3)は出てこない.このパスは#1324 致仕太政大臣(0)まで続いているが,弘徽殿女御(3)はその経路上に現れない.

この結婚枠の上にはMARGBOX #2348:#2541 紅梅(2)+→#1328 紅梅(0)があり,その上のノードはNAMEBOX #2541 紅梅(2)だ.MARGBOX #2348もMARGBOX #2396とまったく同じ属性を持っているのでTYW枠と考えられる.紅梅(2)はダミーノードでその上にMARGBOX #2435:#1700 柏木(2)+→#2541 紅梅(2)があり,その上がNAMEBOX #2347 紅梅(1) でEXTRACTBOX|ELDERWIFEになる.#2438 弘徽殿女御(3)の長い尻尾をDumpLongTail で見ると,

NAMEBOX::DumpLongTail >>>>>>>>>> #2438 弘徽殿女御(3)
   1  dum#=1 #1700 柏木(2)
   1  dum#=2 #2347 紅梅(1)
   2  dum#=2 #2541 紅梅(2)
   1  dum#=3 #2395 弘徽殿女御(2)
   2  dum#=3 #2438 弘徽殿女御(3)
NAMEBOX::DumpDummyChain >>>>>>>>>>>
   1  thread #1700 柏木(2) #2347 紅梅(1) #2395 弘徽殿女御(2)
   2  #2435 [結婚枠]:[4] #2541 紅梅(2) #2438 弘徽殿女御(3)
NAMEBOX::DumpLongTail <<<<<<<<<<<<

のような3本のスレッドからなるLDR束になっている.#2541 紅梅(2) と#2438 弘徽殿女御(3)は一つのダミー枠に入っているので,その下位のMARGBOX #2396が上位の#2541 紅梅(2)を参照しているというのはノーマルなのではないだろうか?#2438 弘徽殿女御(3)はDUMMYBOX|BUNDLEDSTRINGという属性を持っている.この結婚枠のownerは弘徽殿女御(0)だ.

障害はNAMEBOX::TailSheddingで発生している.NAMEBOX #2347 紅梅(1)の長い尻尾の始末を付ける段で,同じLDR束に入っている#2438 弘徽殿女御(3)が影響を受けているものと見られる.処理開始前の状態は下記のようになっている.

NAMEBOX::DumpLongTail NAMEBOX::TailShedding >>>>>>>>>> #2347 紅梅(1)
   1  dum#=1 #1700 柏木(2)
   1  dum#=2 #2347 紅梅(1)
   1  dum#=3 #2395 弘徽殿女御(2)
   2  dum#=3 #2438 弘徽殿女御(3)
NAMEBOX::DumpDummyChain NAMEBOX::TailShedding >>>>>
   1  thread #1700 柏木(2) #2347 紅梅(1) #2395 弘徽殿女御(2)
   2  #2435 [結婚枠]:[4] #2438 弘徽殿女御(3)
NAMEBOX::DumpLongTail NAMEBOX::TailShedding <<<<<

TailShedding実施後は下記のようになっている.

NAMEBOX::DumpLongTail NAMEBOX::TailShedding >>>>> #2347 紅梅(1)
   1  dum#=1 #1700 柏木(2)
   1  dum#=2 #2347 紅梅(1)
   2  dum#=2 #2541 紅梅(2)
   1  dum#=3 #2395 弘徽殿女御(2)
   2  dum#=3 #2438 弘徽殿女御(3)
NAMEBOX::DumpDummyChain NAMEBOX::TailShedding >>>>>>
   1  thread #1700 柏木(2) #2347 紅梅(1) #2395 弘徽殿女御(2)
   2  #2435 [結婚枠]:[4] #2541 紅梅(2) #2438 弘徽殿女御(3)

結局,紅梅の長い尻尾が1伸びて,#2435のダミー枠に#2541 紅梅(2)が追加されたということになる.この煽りで,MARGBOX #2396が紅梅(2)に直結するようになってしまったのだろう.それでは,紅梅のTYW枠はどこに接続しているのだろう?紅梅のTYW枠#2348:#2541 紅梅(2)+→#1328 紅梅(0)は紅梅(2)を直接参照している.これに対し,弘徽殿女御のTYW枠は「紅梅のTYW枠#2348」を参照している.明らかにこれは誤っていると考えられる.

TailShedding では処理を開始する前に対象スレッドのTYW枠を一旦外して安全な場所に移動した後,スレッドの伸縮を実施して,その後またスレッドの末尾につなぎ戻す操作を行っている.このとき,弘徽殿のTYW枠を共連れにしているような気がする.⇒TailShedding に入ってきたときの紅梅のTYW枠の位置がおかしい.最初から#2438 弘徽殿女御(3) と弘徽殿のTYW枠#2396の間に入っている.CutBranch(false)では下流系を連れて出るので,弘徽殿のTYW枠も一緒に移動してしまう.

最初の構図では確かにGetUpperNodeでは弘徽殿女御(3)をキャッチできるのだが,その後紅梅(2)が入って,紅梅のTYW枠がそれに連結されるため,弘徽殿女御(3)に到達できなくなってしまう.この不良はNAMEBOX #2347 紅梅(1)のTailShedding で起きている.入口では,

NAMEBOX::DumpLongTail NAMEBOX::TailShedding >>>>> #2347 紅梅(1)
   1  dum#=1 #2347 紅梅(1)
   2  dum#=1 #2434 紅梅(2)
   1  dum#=2 #2395 弘徽殿女御(2)
   2  dum#=2 #2438 弘徽殿女御(3)
NAMEBOX::DumpDummyChain NAMEBOX::TailShedding >>>>>
   1  thread #2347 紅梅(1) #2395 弘徽殿女御(2)
   2  #2435 [結婚枠]:[5] #2434 紅梅(2) #2438 弘徽殿女御(3)

のようになっているが,出口では

NAMEBOX::DumpLongTail NAMEBOX::TailShedding >>>>> #2347 紅梅(1)
   1  dum#=1 #2347 紅梅(1)
   1  dum#=2 #2395 弘徽殿女御(2)
   2  dum#=2 #2438 弘徽殿女御(3)
NAMEBOX::DumpDummyChain NAMEBOX::TailShedding >>>>
   1  thread #2347 紅梅(1) #2395 弘徽殿女御(2)
   2  #2435 [結婚枠]:[5] #2438 弘徽殿女御(3)

のように変化している.このとき,紅梅のTYW枠#2348のownerは弘徽殿女御(3)に変わり,Yリストもそのように変化している.これは明らかに誤りと思われる.

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA