B面のユーザインターフェースを整備する

開発機では昨日仕掛けた仮想木の検証テストがまだ走っている.2^26という設定で,9時間40分走って残り時間9時間40分だ.予備機の検証テストも続いている.こちらの版は古いので仮想木ではなく,一般木のテストを実行している.22時間34分走って残り時間2時間だ.テスト範囲は2^26で開発機と同じだが,だいぶ遅い.開発機にはもう一つ画面が開いていて,こちらはA面で5-3-12の仮想木を生成したところで止まっている.このテストには1時間27分掛かっている.最大数は95374949936989296587566193というすでに十分大きな数だ.

同じ設定で一般木をテストすれば一般木と仮想木の規模の差を感じられることだろう.仮想木モードと一般木モードを切り替えるとルート番号が5から1に切り替わる.仮想モードで1をルートとすることも可能だが,1の下には5というノードしかないので意味がない.仮想木のテストは1分34秒で終わってしまった.最大数は1106193406531349.テストした有効ノード数は12286で仮想木の797161より圧倒的に少ない.所要時間はほぼ有効ノード数に見合っているとみてよいだろう.開発機のテストは一旦打ち切って先に進むことにしよう.

現行ではB面の処理は検証テストを除くと実行時イベントを取っていない.つまり,打ち切ることができない状態になっている.ここまで大きな数を扱うようになると,それでは不便なのではないか?少なくともどこかでイベントを取るようにしなくてはならないし,またそれが可能になったときには少なくともボタンが押されたときに停止するようになっていなくてはならない.しかし,通常ならあっと言う間に終わってしまうので,ループで毎回イベントを取るというのも負荷が大き過ぎるような気がする.まぁ,軽い処理なら余分な処理が入っても逆に大した負荷にはならないとも考えられるが…

枝番号列が1, 10000, 10000, 10000, 10000, 10000, 10000の設定で幹線木を実行してハングした.DumpSuccessorsでループしている.木の高さ1のところで立ち往生している.DoEventsを入れたら動作するようになった.ただし,出力枠の表示は更新できない.B面でもA面と同じようにバッファの裾刈りをするしかないのではないか?テキストボックスは現在最大32767バイトになっている(リッチテキストボックスは2147483647).A面の最大テキスト長は2048でこれよりはるかに少ない.裾刈りをするとそのたびに再描画が発生するのであまり長いと却って効率を落とす可能性がある.両者共通に4096=1000Hくらいではどうだろうか?多少軽くなったが,スクロールは起きない.最大奇数の更新が忙しくて間に合わないように見受けられる.⇒幹線木では木の高さが増加するまでは画面が更新されていない.⇒テキストが更新されたタイミングで画面を更新するようにした

▲テキストをカットしているのでそれを補完するためにはファイルへの保存ができるようにする必要がある.

コラッツ数列取得では計算完了しないと枝番号列を出力しないが,中間結果を表示するようにした方がよい.⇒対処した.

B面にもHideボタンを設ける.⇒設置したが,それほど目覚ましい変化はないような感じもする.⇒いや,確かに速くなっている.

▲コラッツ数列取得処理をコラッツ番号取得と同等程度にスピードアップする.

▲処理開始で他の機能ボタンはディスエーブルとし,処理開始ボタンの二度押しで処理を停止するようにする.このボタンは中断ではなく,停止なので再開はできないが,表示されている内容が改変されないようにするというところがポイントだ.Get the Numberは停止→再実行を反復実行できる.Get the Sequenceでも動作している.⇒幹線木でも動作しているようだ.ただし,停止したときに枝番号列を書き換えている.また,Odd numberなどの更新が即時には停止しない.しばらくすると止まる.DumpSuccessorsで抜けてこないのではないか?⇒停止するようになった.

Get the Numberでエラーで停止したあとの動作が悪い.Value could not be parsed というエラーが起きている.カンマの後の空白だろうか?どうもそのようだ.というか,改行コードかもしれない.⇒次の構文で除去できた.

s = s.Replace(Chr(13), “”).Replace(Chr(10), “”)

コラッツ数列ではTree heightが更新されない.中間でも表示した方がよい.⇒対処した.

検証テストは巨大数から開始すると動作していないように見える.⇒動いてはいるようだが,画面が更新されていないためではないか?巨大数の場合はその場でDoEventsを実行するなど対処して,改善した.

▲Odd numberの最大テキスト長を2147483647にしてみたが,表示が消えてしまう.ただし,中身は入っているように思われる.実際問題として32767を超えていないのではないかと思うのだが…⇒効果がないので戻しておこう.⇒数字が表示されていない場合でも保持されている内容は正しいことを確認する.

検証テストでコラッツ数ではない数からテストに入ると,検定に失敗する.いや,そもそも,GetTheNumberでは仮想木モードのときは開始番号は1以外を認めていない.いや,それ以前に一般木モードでも動作しなくなっている…どこか壊してしまったのではないだろうか?⇒どうも何か致命的なミスを冒してしまったようだ.今日の始業時バックアップまで戻らないと動作しない.今日の修正はかなり広範にわたるものであり,しかもその間一度もバックアップを取っていなかった…

バックアップまで戻るしかないのではないか?しかし,それをやるとしたら今日の仕事ではなくなる.もう少し粘ってデバッグしてみることにしよう.GetTheNumberに一つ余分な処理を挿入したのが敗因だったようだ.それを除いたら動き始めた.どうもかなり由々しき事態になってきた.これまでのテスト結果がすべて無効になる可能性がある.無効というよりはほとんどイカサマだ.検証テストは通常1から始まるが,GetTheSequenceは1を与えられたときに返す値がない.1には親がないのだから当然だ.⇒コラッツ数列処理では1に戻るまでの経路を出力する.1は戻るべき親がいないのだから,無出力というのが正しい.

枝番号リストを指定してコラッツ数列の逆演算を実行する場合,「空」が与えられた場合には1が出力される.枝番号リストは1を出発点とする経路リストであり,たとえば,1を与えると1[1]=5が出力される.枝番号リストが「空」であるということは移動が発生しないということを意味すると考えられるので,1を出力することにした.すべての処理開始番号である1と枝番号リストの関係が確立された.

枝番号リストが空のとき,一般木ではエラ-にならないのに,仮想木ではエラーになるのはなぜか?仮想木の場合は冒頭でリストをチェックして先頭要素が1であることを求めている.枝番号リストは必ず1から始まることを想定している.⇒対処した.

コメントを残す

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

CAPTCHA