縦系図と横系図の切り替えをサポートする

▲YGroup32.zelを開こうとしたら,MakePairListCleanで無限ループしてしまった.最初に以下のエラーが発生している.SUPPORTSIMPLEGRAPHをオンにしたためだろうか?

image

確かにそのようだ.オフにしたら描画できた.親子連結線の不良に関係があるかどうか見るためにオンにしたのだが,無関係のようだ.このオプションに関しては後日調べることにして戻しておこう.⇒YGroup.zelで不用な親子連結線が表示されている.これは少し気になるので,見ておきたい.画面右下の連結線はどこにもつながっていない.

image

この線はYGroupから出ているので,YGroupの子どもと考えられるが,hiddenとcheckcidの間には,printnamaeしかない.printnamaeは一世代下の箱に入っている.YGroupの子どもは13人だ.結婚点の位置もおかしい.⇒縦系図/横系図は,DrawObject.cppのbool reverseAxisで切り替えできる.結婚点などはその切替を行っていないのではないか?本来論理座標は一つであり,描画する側で対処する必要がある.reverseAxisはDrawObject.cppの中でしか参照されていない.

座標軸の変換関数として,reversePoint, reverseRectがある._CDCというCDCの派生クラスにはこれらを使った描画関数のセットがある._CDCを経由して描画していれば,間違いないはずだ.他の描画関数はほぼ対応済みと見られるが,Polygonは残ったままとなっていたものと思われる.⇒対処した.これで座標軸の転換は完結したものと見られる.

上記の不明な連結線の出所がわかった.

image

NAMEBOX::DrawLongTailでCheckYrouteのLDR垂線として描画している.しかし,CheckYrouteのLDRはYGroupの子どもとしてすでに描画されており,CheckYroute自身は実体を持っている.つまり,余分なノード対を持っているように思われる.何か操作しているときに誤って残してしまったのではないだろうか?このノード対は,CheckYroute(2)→ (1)を連結するものだ.本来の(1)→(2)はノーマルに描画されている.このようなノード対が発生していること自体問題だ.段数が2となっている.どうも,LongTailを作り損なっているのではないか?

NAMEBOX::DumpLongTail NAMEBOX::DrawLongTail > #1157 CheckYroute(2)
   1  dum#=1 #1157 CheckYroute(2)
   1  dum#=2 #1169 YRight(2)
   2  dum#=2 #1905 YRight(3)
NAMEBOX::DumpDummyChain NAMEBOX::DrawLongTail
   1  thread        #1157 CheckYroute(2) #1169 YRight(2)
   2  #1913 [結婚枠]:[2] #1905 YRight(3)

長いしっぽの構成を忘れてしまった.確か複合的なものであったような気はするが…YRightはYgroupの子どもであり,CheckYrouteとはつながらないような気がするのだが…⇒なぜ,複合構造になるかというと,LDRは複数のLDRが束ねられる場合があるからだ.確かにYRightはYGroupの子ノードであり,CheckYrouteと共通の親を持っているから,LDR束だ.しかし,YRightは親を2人持っていて,それがCheckYrouteだ.どうもかなりややこしい話になってきた.

出力ではYRightはYgroupの子ども枠の中にLDRはとして入っているように見える.結局,この線分は下図のように引かれなくてはならなかったものと思われる.

image

従って,描画していることではなく,描画している位置が間違っている,つまり,一世代下がり過ぎということになるのだろう.⇒できた!

image

かなりノーマルなモードに近づいた.バックアップを取っておこう.⇒TYW2ExtractBoxでは問題なく動作することが確認できたが,RestoreYoungWifeとどこが違うのかをチェックしておく必要がある.このために,関数の参照関係を洗い出そうとしたのだが,関数木の原本が見つからなくなってしまった.いや,その前にYGroup32.zelで出ていた部分図の障害を見ておこう.というか,この図面は相当乱れている.

image

いや,今度はノーマルに開けた.インストール版でテストしていた.修正の入った版では解決している.

image

YGroup32.zelで「人名枠線を表示する」をオンにしようとして,エラーになった.ResetTooYoungWifeだ.

image

(topology->TooYoungList->len() != ztywcount) が起きている.

ztywcountは-1で,TooYoungListのデータカウントはゼロだ.どこかで引き過ぎているのだろう.ztywcountはZTYWのカウントでTYWのカウントではない.この辺りで食い違いが生じているのでは?明らかに行き違いがある.TooYoungListに格納されているのはZTYWだけではない.それにしてもおかしいことはおかしいのだが…ztywcountをtywcountに統合するのではなく,別途tywcountをカウントすべきだろう.同様に,SymmetryCountも別途カウントすべきだ.つまり,システムの内部パラメータはつねに,2つの方法でカウントされなくてはならない.言い換えると複式でカウントされなくてはならないというのが原則だ.この考え方は徹底されなくてはならない.

  1. 系列枠は個別にTooYoungCount, ZTYWCount, SymmetryCountを管理している これに対応して大域的にtywcount, ztywcount, symcountを管理するものとする
  2. これらのカウントはそれぞれの属性のセット・リセットを行うsetghostbits, resetghostbitsで同期を取るものとする
  3. TouYoungList, SymmetryListへの追加,削除のタイミングで上記カウンタとの一致を確認する
  4. 系列枠のカウンタを更新した場合にもそれらの合計と一致していることを確認する
  5. これらの属性はすべて結婚枠の属性であるとする
  6. TOPOLOGY::CountTooYoungWifeという集計関数もある

TopologicalSortの冒頭でTOPOLOGY::ResetExperimentが実行されている.このとき,3つのカウンタがリセットされているが,オブジェクトは温存されているためカウント不一致が発生する.⇒SymmetryList,TooYoungListの廃棄とtywcount,ztywcount,symcountのリセットはClearTableより後に実行することにした.ResetExperimentもそのタイミングでよいのではないだろうか?ただし,genelist, tribeListの初期化はClearTableに先行させる必要がある.

YGroup32.zelでは多重カードが3件出ている.これは削減できないのだろうか?あるいは,どこかで機能劣化してしまった可能性もある.

image

一番左のYGroup(♀)は祖父のYGroup(♂)の配偶者なので,多重となるのは避けられない.真ん中のCutBranch(♂)は娘のCutBranch(♀)の配偶者なのでやはり不可避だ.CheckYroute(♂)は親を3組持っているが,そのうちの一人は兄弟のCutBranch(♂)なのでやはり,避けられないということのようだ.これは,再帰ないし再入呼び出しを表現するための苦肉の策として取られた手段ではなかったろうか?

ゼルコバの木では血統循環を禁止しているため,婚姻関係を使って擬似的な血統循環を成立させていたのだと思う.⇒関数木では再帰的な呼び出しを,同名の子ノードを作りそれを親ノード(呼び出し先)と配偶させることで擬似的に表現している.再帰呼び出しは必ず血統循環を発生してしまうので,ゼルコバの木では禁止されているが,多重カードになることを許容するのなら,血統循環を許すという設計も(将来的には)考えられなくもない…

関数とその所属するクラスとの関係もある種の木を構成すると考えられるが,関数木ではクラスを部分図で代替している.ゼルコバの木では最大32個までの部分図しか登録できないが,ゼルコバの木の実装ではおおむねそのくらいの数のクラスしか扱わないので,ほぼカバーできるのではないかと思う.⇒部分図自体を一つのオブジェクトとしてその包含関係を明示できれば,部分図木のようなものを構成することも可能となるが,現在の実装では部分図は単純な集合であり,必ずしも順序関係を定義することはできないので,多分実装は難しいと思う.(関係グラフのようなものは構成できるかもしれないが…)

コメントを残す

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

CAPTCHA