1-6-4 正則コラッツ一般木でかなり奇妙なことが起きているのを発見

今日もかなり冷え込みがきびしい.今年初めて室内で手袋を着用した.

IMG_20220225_224236

1-6-4 正則コラッツ一般木でかなり奇妙なことが起きているのを発見した.このグラフは511点という比較的小さな木だが,そのうちの22点で下位31ビットが同じという「ハッシュ衝突」が起きている.ハッシュ衝突は2つのカードで起きているが,中には3つのカードで衝突ということも起きている.これをチェックするのに部分図機能を使っているが,動作が思わしくない.

一覧画面でシフトキーを押しながらクリックする「拡張選択」ができない場合がある.できる場合もある…コントロールキーを使った拡張選択もできない.⇒ドラッグすると拡張選択になる.⇒選択規則を誤解している.一覧表左端のカード番号をクリックしたときは,選択領域を変化させないという仕様になっている.選択状態を変えるためには性別より右の欄をクリックしなくてはならない.⇒現状はこの仕様に沿った動作になっている.最左列をクリックするとカード画面上のカードが切り替わる.この仕様は悪くないと思う.選択状態を保持したまま,任意のカードの情報を確認できるというのは利便性の高い機能だ.確かに,この点を知らないとかなり戸惑う可能性はあるかもしれないが…

上記22点を選択して部分図に追加しようとしてエラーが発生する.また,部分図に切り替えても全体図が表示されたままになっている.⇒下記の通り,「MAXIMALGRAPHを縮小する」に対応・修正して解決.

一覧画面で表示範囲を部分図に含まれるカードに設定すると,エラーが発生し,一覧表が空になる.⇒問題なく動作するようになった.

まず,これらの不具合を片付けないと問題の解析に入れない.ちょっと手間が掛かりそうだが,こちらを先行させることにしよう.部分図の動作不具合と,選択操作の不良の2件を片付ける必要がある.

HashCollision 511.zelを開いて,異世代多重反復カウントオーバーが起きている.⇒多重カウントが変化していない場合にはSTOPCARDSHIFTでブレークするというフローになっているが,そもそも多重になっていないので,エラーとする必要はない.

同上サンプルで任意の数点を選択し,部分図に追加してエラーになる.ただし,部分図に切り替えない場合はエラーは発生しない.1点だけなら部分図に切り替え可能.⇒対処した.

1点だけの部分図からこのノードを削除して描画でエラーになる.⇒カードゼロの状態で有効な結婚枠が残っている.セグメントリストが空になっていない.⇒対処した.

前回,MAXIMALGRAPHを縮小する@20220221の修正がまだ収束していない.segmentsとlooseboxをメモリ使用量削減のために,MAXIMALGRAPHの静的変数に変更しているので,一つの系列の処理が完了した場合にはその領域を次の系列のために解放しなくてはならないが,それをやっていない.CheckMaximalSegmentは毎回セグメントの初期化を実施しているが,問題はこの関数がHorizontalSegmentの下位関数としてだけではなく,独立の関数としても実行される場合があるという点だ.CheckMaximalSegmentの実行後にセグメントを解放してしまうと,HorizontalSegmentの処理が続かない.

OnHorizontalSegmentを見ればどちらのモードで動作しているかは判別できる.OnHorizontalSegmentがオフのときはセグメントを解放するようにすればよい.ただし,このとき,segmetcntなどをクリアしないようにしなくてはならない.

動作するようになった.ReleaseSegmentという関数を新設して,HorizontalSegmentとCheckMaximalSegmentの出口で呼び出すようにした.これで問題は基本的に解決しているが,副作用としてオブジェクトのセグメント番号が失われてしまうという欠陥がある.これがないとSUWのときにセグメントを色別表示するなどのことができなくなってしまうが,已むを得ない.どうしても必要な場合はなにか対策を講じるしかないが,今のところはこれで十分だ.

部分図に含まれる要素をすべて除去して,描画時にエラーが発生する.DrawTreeLine→ getSpecialSpouseでオーナー不在という状況が起きている.部分図では完全に空という状況が起こり得るが,有効な結婚枠が残っているということ自体がおかしい.部分図を描画したときの結婚枠とは別物なので,どこかで新たに生成されている模様だ.

TopologicalSort→ClearTableでは結婚枠を持たない結婚リンクには一律結婚枠を生成して渡している.部分図の抽出はそのあとで実行されているため,すべての結婚リンクが再生成されていると考えられる.しかし,そのあとでExtractPartialCardが実行されるので,不要な結婚枠は非アクティブになっているはずなのだが…

ExtractPartialCardではカードリンクの有効・無効は決定しているが,結婚リンクのチェックは抜けているようだ.FilteringKinshipでカードと結婚の有効/無効を決定しているが,カード無しの場合は無動作で抜けている.⇒HideNameboxを実行してから抜けるようにした.

部分図を登録・保存したあと,ファイルを開き直して,InitFileで「算術演算の結果オーバーフローが発生しました」のエラーになった.

image

OpenFileProcの戻り値の317834583をShortのInitFileに格納できないという意味だろう.lretはIntegerなのでIntegerにしてやれば間に合うだろう.⇒オープンできた.

ハッシュ衝突が起きているノードは以下のような状況になっている.

image

興味深いのは半数近くが親子関係になっているという点だ.おそらく,親子関係を持たないノードもコラッツ木の規模をもう少し大きくすればおそらく,その下に接続するノードが出てくるはずだ.隣の兄弟との関係は4N+1だから,左に2回シフトして+1という操作になる.つまり,末尾が01というパターンの繰り返しになっているはずだ.ノード番号を10進ではなく16進で表示してみればわかるのではないだろうか?やってみよう.やるとしたら,インポートするところでやる以外ないだろう.

カード上で性別を変更・登録して一覧画面の性別が変化しない.一覧画面で性別をダブルクリックすると変化するが,系列画面上のカラーは変化しない.⇒一般に一覧画面上でのデータ更新は,リターンキーによって受け付けられる.一覧画面のダブルクリックだけでは登録にならない.「カード上で性別を変更・登録して一覧画面の性別が変化しない」というのは事実誤認ではないか?登録ボタンを押すと一覧画面も更新されている.リターンキーを押すと,選択行が一つ前に進んでしまうことが動作を不明瞭なものにしている…


コメントを残す

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

CAPTCHA