▲下のような設定で,垂直親子連結線が兄弟連結水平線を突き出ている.
サンプルはCollatz Tree 3-10-990.zel.
▲Zelkova Treeのリリース版ではCT 3-12-990.CSVを読み込んでエラーパネルが出る.デバッグ版では出ない.また,このサンプルでは「42725406261」というノードが孤立カードになっている.コラッツ木では基準番号と氏名は同じ数字になっているが,このノードに限って214783647という異なる番号が振られている.このカードは3の倍数だ.コラッツ木生成ツールで調べると,このノードは4005506837に繋がっていなくてはならないのだが…42725406261は1から8世代目で左端の枝番号3の枝を辿ると行き着けるはずなのだが,そもそもその親の4005506837がこのグラフに載っていない.この番号はCSVにも記載されていない.いや,記載されている.4005506837に接続する子ノードは3つある.
原因は分かった.この木の左橋辺で187758133の子どもが2人しかいない.カード数が1000点を超えるときにはカットされることはあり得るとしても,上位階のノードが先にカットされることはあり得ない.カード数が990になっていることに関係しているのかもしれない.
あるカードがレンジオーバーしていれば,その場で落とされるということもあり得るが…いまのケースはそれには該当しない.⇒CSVには1000点入っている.ゼルコバの木で失敗しているようだ.⇒どうもこれは,与えられた数が大き過ぎるためではないかと思われる.番号は本来「氏名」でしかないのだが,実際には基準番号として使われている.基準番号はおそらくLONGとして扱われているはずだが,32ビットしかないのではないだろうか?基準番号がレンジオーバーを起こしているときどのように処理されているのかを見る必要がある.リリース版で起きているエラーはおそらくこれだろう.
エラーの原因はatoiにあるようだ.この関数で”4005506837″という文字列が2147483647という数字に化けてしまう.atoiをatolに変えてみたが,結果は同じだ.longは64ビットで9,223,372,036,854,775,807まで扱えるので十分なはずなのだが…受ける側でlong longで受け取って正しい値が取り出せた.C言語の仕様では,longは64ビットとなっているが,マイクロソフトのlongは32ビットのようだ.つまり,intと同じだ.対策としては,
- 現状のまま,32ビットを超えるデータは扱わない
- データの仕様を変更して64ビットを扱えるようにする
- 基準番号を振り替えて1~1000の範囲に収まるように振り替える
現時点では2の選択肢はないように思われる.3の修正にどの程度のコストが掛かるか?が問題だ.手が掛かるとすれば,現状であきらめるしかない.⇒やってできないほどのことではないと思われるので3の修正を試みることにしよう.⇒意外と簡単に実装できた.CT 3-12-1000.CSVを取りこぼしなく読み出せるようになった.CSVファイルは4種あるが,これはメインのCSVで,残り3つはまだ読み出せるようになっていない.まず,CollatzChain.CSVから見てゆくことにしよう.このコラッツ木は倒立しているので,逆順に直さなくてはならない.⇒できたようだ.いや,まだできていない.ノードが一つ足りない.⇒終わった.
▲コラッツ木生成の動作がおかしい.Rootに17602325と入れて,GOで
17602325
11734883
という出力になった.これはかなりおかしい.この表示は孤立ノードが2つあるということになるが,17602325と11734883のどちらも3の倍数ではない.また,エラーになったあとの動作もおかしい.CSVは開いていないのに,別アプリが使っているという警告が出る.⇒これは,自分で使ったままにしている可能性がある.⇒論理ミスがある.設定樹高を超えた場合には打ち切るようになっているが,途中から開始した場合には差分を引かなくてはならない.⇒対処した.
▲CollatzStreamingが立ったままになっている.オーバーフローの始末が付いていないようだ.CARDTABLE::makelinkでは,(nod->getpnum() != nod->cardbase.carddata.refnum && nod->cardbase.carddata.refnum <= tablesize) のようなエラーが起きているのだが,理由が分からない.nodというのはカードリンクであり,この親はテーブルのはずだから,一致しているはずがない.また,参照番号がテーブルサイズより小さいというのは標準的なサンプルなら普通のことで,エラーとするのはおかしいように思われる.これとは別に両親不在の子どもというのが1件起きている.⇒解消したものと思われる.
▲白紙で起動して最初にインポートしたとき,イレギュラーなフェーズ遷移エラーが起きる.いや,起動直後ではなく,すでにインポートを実施したあとだろう.
▲CSVでは1000点までのファイルを生成しているはずなのに,ノード数が990しかないのはなぜか?⇒カードの基準番号をノード番号と共通にしていたため,基準番号は16ビット整数であるため,atoiでオーバーフローしてしまう.⇒基準番号が1~1000の範囲に収まるようCVS出力関数で調整した.CSV4種のうち,CollatzTree.csv, CollatzChain.csv, CollatzNumber.csvまでは対処し,残りはCollatzTrancate.csvだけになった.⇒できた!
いよいよ,このノートも年貢の収め時が来たようだ.いろいろと不具合が出ていたが,とうとうネットにアクセスできないようになってしまった.最近は頻繁に切れるようになっていたのを何とかだましだまし使ってきたが,アクセスポイントリストでは接続状態になっているのに,ブラウザでは「インターネットに接続されていません」となってしまう.予備機は一応仕立ててあるので,移行するだけだ.
▲CN 335627293189680917.zelを開いて,「画面に合わせてズーム」,「縦幅に合わせてズーム」すると画面が白紙になってしまう.「横幅に合わせてズーム」では以下のパネルを出して,100%で表示する.
このサンプルは154世代あり,1%でも画面内に収まらない.⇒動作していた.木が細過ぎて見えなかっただけだ.
▲コラッツ木生成で.Root=1, Degree=1, Height=1で何も表示されない.このループはWX<MAXの間だけ実行するようになっているが,WX=MAX=1となっているため,無動作で抜けている.これはMAXの計算が間違っているのではないか?R=1, D=1, H=1なら,MAXは1+Dでなくてはならない.⇒修正した.
大体片付いたのではないかと思う.いや,まだある.
▲A面を走らせているとき,B面で例外が発生すると,A面も止まってしまう.いや,エラーが発生しなくても止まっているようだ.Get the Sequenceで停止している.TextBox1_TextChangedで複数のイベントを一括処理している.これは,入力パラメータ値が変更されたときに,MaxNumberを更新するための処理だから,A面にだけ関わるものだ.B面のTree Heightは計算完了して始めて更新されるものだから,イベントを取る必要はない.
A面では枝数3で樹高17くらいまでが限界だが,B面なら樹高120くらいまでは計算できる.そのような大きな(深いところにある)奇数を取り出すには,A面で得られた最大奇数を木の根に設定して再計算というのを複数回反復することで得られる.1111…. 1 という巨大奇数では227桁という長い鎖を得られた.A面では枝数2でも樹高26が限界だ.
大体収まったと思われるので,リリースの準備に入ることにしよう.まず,外部接続用に使っているVAIOから2 in 1 ノートのBlackHawkに移行する必要がある.VAIOではまだ所内LANに繋げることはできるので,ログを付けるのに用いることもできないことはないが,サイトに投稿できないのではどうしようもない.LANに切り替えて受け渡しすることも考えられなくはないが,いずれにしても完全移行を実現してからだ.