Collatz Conjecture was solved 2022/01/01 ・・・Really?

You can confirm it with your own eyes!

スパイラル1

Now Collatz Tree Generator V1.1.5 is available here for free.

The newest release Collatz Tree Generator V1.1.5

The ZIP package includes a PDF manual in it but you can READ the manual FIRST!

Collatz Tree Generator Manual (online PDF) 18 pages

This tiny program (200KB) contains 5 functions.

  1. Generate a regular Collatz tree of an arbitrary size (degree x height) and output the adjacency list of the tree in CSV file format
  2. Output the branch order sequence of an arbitrary odd number
  3. Output the odd number at an arbitrary position on the Collatz tree designated by a branch order sequence
  4. Output the adjacency list of a truncated Collatz subtree of which end node is designated by a branch order sequence.
  5. Verify the Collatz tree structure on which the Collatz Tree Generator is entirely based by testing every odd number in a designated range.

The first function “Collatz Tree Generator” implies that the Collatz Conjecture was essentially solved already. The last function “Verification” tests this premise. We are curious about if our solution would fail in the Verification Test. Please try those functions and make us informed with the result.

Current maximum odd number passed the Verification: 
2483029087

Start the Verification from 2483029089 and send the result to us. We will update this information every morning.

特性関数を対話的に切り替える

また,CalcTrajectoryでエラーが出ている.⇒処理本体を関数化したため,変数が見えなくなっている.変数をトップスコープに移した.

PNGファイルの保存パスが存在しないというエラーになる.

png(“.\\PNG\\” * titleName())

現在の作業フォルダが蜜天GUIになっているためではないか?その下のmittenを開くようにした方がよい.⇒このフォルダは事前に作っておく必要がある.あるいは,むしろデスクトップに生成するようにした方が分かり易いかもしれないが…⇒これは後から考えることにして,とりあえずフォルダを作っておこう.

一応一通り動くようになった.⇒InfinitePoolGameをモジュール化したらまた動かなくなってしまった.isinteractiveをisinteractive()に変えたためだ.isinteractiveは変数ではないので,これまでそれが通っていたことの方がおかしいのだが,デバッガで走らせることはinteractiveには入らないのだろう.REPLからinclude(“src\\InfinitePoolGame.jl”)では想定通りの動作,つまり,isinteractiveはtrueになる.定数を切って切り分けるしかなさそうだ.技術的にかなり難しい問題が出てきた.

ようやく元のように動くようになった.特性関数を動的に切り替えるというのが目下の課題だ.julia には eval という関数があるのでなんとかなるのではないかと思っているのだが… まず,関数ポインタのようなものがあるかどうかを探さなくてはならない.⇒プロットを表示するのは以外と簡単にできた.

include(“InfinitePoolGame.jl”)

でInfinitePoolGame内の関数にアクセスできる.とりあえずは,これで十分だ.本当はimporないしusingでロードしたいのだが,まだパッケージになっていないためロードできない.includeは実行時に何回でも実行できるので,最悪の場合(他に打つ手がない場合)は,InfinitePoolGame.jlを直接書き換えて再ロードするということが考えられる.多分,これは不可能ではないと思われる.juliaは正規表現をサポートしているので,ソースファイルの書き換えはできるはずだ.一度ここでバックアップを取っておこう.

スタンドアローン型のJuliaアプリを断念

スタンドアローン型のJuliaアプリを作ろうとしていたのだが,断念した.ともかく,先に進むことにしよう.画面上にはまだボタン1つしか出ていないが,少なくとも,①関数入力用のテキストボックス,②グラフの範囲を設定するための数値ボックスx4,③実行ボタンが必要だ.ただし,それに入る前にこれまで開発したPlotsを使ったグラフ表示を組み込んで動作確認しておいた方がよい.

なぜだろう?Plotsが読み込めなくなっている.Juliah本体でも読めない.⇒pkgで読み直した.Rootsも入っていない.⇒追加した.最終版と思われるものを動かしているのだが,エラーになった.グラフは一応出ているが,軌跡は描画されていない.CalcTrajectoryの中でエラーが起きている.なぜだろう?メニューに中国語が出ている.

image

いままではGotoDefinitionが先頭にあったような気がするのだが… おかしい.元に戻っている.Julia には言語設定というのがあったろうか?CalcProjectoryの中でplot!を実行して例外が起きている.

ErrorException(“Cannot convert Float64 to series data for plotting”)

これまではこれで動いていたはずなのだが,Plotsをリロードしたことでバージョンが変わってしまったのだろうか?少しバージョンを戻したら動いた.多分,この辺りは仕掛りのままになっていたのだろう.蜜蜂天国 2024-04-05の前は2024-04-01で4日も空いている.ログを見てみよう.4月5日には「find_zeroが動作していない」というのがあり,修正して動作するようになったが,それ以上の記載はない.その一つ前は2024/03/29で「た軌跡の描線が出なくなっている」から始まる.

2024/04/05という日付のログは2本あり,2本目のログでは「蜜蜂天国のまとめに入っているところだが,足踏み状態だ.いろいろなパターンを試してみたいのだが,そのためにはもうちょっと準備が必要だ.」として,「まとめ」を打ち切り,「JuliaでGUIアプリ」という方向に走り出している.2024-04-01版ではCalcTrajectoryではplot!を実行する代わりにpush(plt,…)している.確かにこの違いは大きい.⇒論理を戻して動作するようになった.ただし,ウィンドウが出てこない.PNGとGIFは保存されている.どこが違うのだろう?⇒出た!show=:trueのコロンが落ちていた.うまく行ったようだ.アニメを作らないオプションでも動作するようになった.

image

これで行くしかない.

なぜだろう?実行しようとすると,precompiling Gtkというのが入るようになってしまった.ステータスバーでは Julia: Evaluateing…という状態が続いている.⇒Execute active file in REPLモードでは問題なく動作するようになったが,create_appでアプリが生成されていない.⇒REPLで動作するようにjulia_main()を追加したためだ.これを外すと今度はパネルのボタンイベントが無視されるようになる.アプリの場合にはやはりコードをすべて julia_main の中に置くしかないのではないか?どうもそういうことのようだ.バックアップに戻って確認してみよう.2024-04-10版を走らせるとパネルが2つも出た.いや,遅れてでてきたのを見落としていただけだ.

書き始めてから大部日時が経ってしまったが,続けよう.ようやく動いたが,エラーが出ている.

★★★★★ julia_main ENTER ★★★★★

(mitten.exe:10740): GLib-GObject-CRITICAL **: 14:44:46.180: g_boxed_type_register_static: assertion ‘g_type_from_name (name) == 0’ failed

(mitten.exe:10740): GLib-CRITICAL **: 14:44:46.180: g_once_init_leave: assertion ‘result != 0’ failed

(mitten.exe:10740): GLib-GObject-CRITICAL **: 14:44:46.180: g_boxed_type_register_static: assertion ‘g_type_from_name (name) == 0’ failed

(mitten.exe:10740): GLib-CRITICAL **: 14:44:46.180: g_once_init_leave: assertion ‘result != 0’ failed

(mitten.exe:10740): GLib-GObject-CRITICAL **: 14:44:46.180: g_boxed_type_register_static: assertion ‘g_type_from_name (name) == 0’ failed

(mitten.exe:10740): GLib-CRITICAL **: 14:44:46.180: g_once_init_leave: assertion ‘result != 0’ failed
★★★★★ julia_main INIT ★★★★★

クリックでフリーズし,以下が出る.

image

ともかく一度バックアップしておこう.

⠸ [00m:16s] PackageCompiler: compiling incremental system image★★★★★ julia_main ENTER ★★★★★
⣄ [00m:17s] PackageCompiler: compiling incremental system imagecould not load library “C:\Users\babalabo\.julia\artifacts\da6c2aa0d20a483437256f245d3c35b25e667c62\bin\libgtk-3-0.dll”
The specified module could not be found.

▲久留島喜内の道具箱でエラーが出た.α=2, ε=1000, γ=19

image

どこかでゼロ割が発生している.εを100まで落としても同じ.自動計算ではエラーにならない.更新ボタンを押したときエラーが起きるようだ.⇒これは後日見ることにしよう.

またEXEが作れなくなってしまったい.どこをいじるとどうなるという脈絡がよくわからない.REPLでもエラーが出ている.

仕掛版ではREPLでカウントアップによるアプリ終了が機能していない.というか,その処理が入っていないので停止しない.ウィンドウを閉じれば完了するが,signal_connect(win, :destroy)のところでエラーが出る.ここではnotify(c)というのを投げているがうまく通っていないようだ.グローバル変数で状態を渡したいところだが,gtk_mainで回っているだけなので,対応できない.以前,Gtk.gtk_mainの引数のところでループを回していたことがあるが,復活させてみよう.

nclickで離脱できるようになったが,エラーが出ている.MethodError: no method matching gtk_main(::Nothing) そもそもこの構文自体よく理解できないのだが…

Gtk.gtk_main(
 while nclick < 21
  println(“gtk_main:”, nclick)
  sleep(1)
 end
)

この構文もよくわからない.

@async Gtk.gtk_main()
wait(c)

C言語風に書けば,gtk_main(void)なので,エラーになるのは当然だろう.メソッドのオーバーロードというのはJuliaでは聞いたことがない… ⇒ notify(c)を2個所で呼び出していたのが,競合していたようだ.signal_connect(win, :destroy)を止めて動作するようになった.Julia の主画面とパネルが出るようになったが,動作していない.クリックイベントが受け付けられていない.やはり,以前と同じ mitten.exeは応答していませんになってしまう.とりあえずバックアップしておこう.

EXEを実行すると,主画面が表示され,ループが回りだしてプリント文を出すところまでは動いたが,クリックするとループが停止してしまう.これは生のループでもgtk_mainでも同じだ.つまり,クリックイベントを処理する段階でどこか野壺にはまってしまっているように思われるが,その場所を特定することができない.本体ループではないことは確かだし,REPLでは動作しているので,パネル上のパーツの動作でもなく,おそらく,イベント処理後の戻り道を見失ってしまっているのではないかという気がする.

元々Juliaではこのような構成は予定外なので「できない」と言ってしまえばそれまでなのだが… GTKやそれ以外にもJuliaにGUIを付け加えるためのモジュールは多数ある.また,パッケージを生成してスタンドアローンアプリを走らせるためのモジュールというのもあるにはあるのだが,それらを同時に実現した事例というのは見当たらない.あきらめるのが一番早いのかもしれないが,それではこれまでに費やした時間がすべてただの浪費になってしまう.

実際問題としてはJuliaのパッケージは一般に配布するには大き過ぎるので,これを定版とするというつもりは元々ないのだが… 次善策として,バッチファイルでジュリアのモジュールを走らせるということは可能だろうか?これができれば実質的にスタンドアローンアプリを走らせると同等のことができるようになり,かつ配布パッケージも極小のもので済むという利点がある.この構成なら現状でもなんとか動かせるのではないかと思う.これが現時点における現実策ではないだろうか?しかし,

julia mitten.jl

を実行しても何も起こらない.以下のURLでは

https://qiita.com/Authns/items/9b13655159f90715b2fd

「> julia 〇〇.jl してはいけないよ」とあり,理由としてコンパイル時間が掛かることを挙げているが,動いている気配がない.この記事ではむしろjuliaを開いてそのREPLから実行することを勧めている.しかし,REPLからmitten.jlを実行することもできない.(以前はこの方法で走ったような気がするのだが…)どうもモジュール自体をあらかじめpkgしておく必要があるという感じだ.ただし,エラーになった.

(@v1.10) pkg> add mitten
     Updating registry at `C:\Users\babalabo\.julia\registries\General.toml`
ERROR: The following package names could not be resolved:
  * mitten (not found in project, manifest or registry)
    Suggestions: MieScattering MoistThermodynamics LimitOfDetection MicrostructureNoise mosquitto_client_jll

この方向なら行けるだろうと思っていたのだが,逆にますます嵌りそうだ.往くも地獄戻るも地獄の世界になってきた.

run(command, args…; wait::Bool = true)

というコマンドがある.これはどうだろう?juliaのREPLを開いておいて,そこにソースを流し込む方法で実行することはできる.これはVS Code内でもできる.モジュールをincludeしたりusingしたりするためにはその名前のパッケージが存在しなくてはならないようだ.このためにはgitに登録する必要があるのではないか?以前にできたというのはgitに登録したことがあったからではないだろうか?この辺りを習得するにはまた,かなりの習熟曲線が必要になりそうだ.

パッケージと呼んでいるものは,数百MBもあるフォルダのことを言っているのだろうか?ますますわからなくなってきた.ここまで粘って解けないというのも悔しいが,ここでは一旦打ち切って,juliaのREPL上で動かすことを考えてみよう.できれば,それをバッチファイルのようなものでアイコンから起動できるようなればベストなのだが… ⇒ともかく,includeで実行できることが分かった.たとえば,

julia> include(“./mitten/src/mitten.jl”)

ただし,その前にディレクトリをcd(パス名)で切り替えておく必要がある.コンソール出力はすべてJuliaのREPLに出力される.これで行くしかない.バッチコマンドから起動については後で考えることにする.

スタンドアローン型の julia アプリ

スタンドアローン型のアプリを作ろうとしているのだが,動作しない.必ずしもスタンドアローン型である必要はないのだが,生成されているのに動かないというのはおもしろくないので,もう少し粘ってみることにする.パッケージは800MBを超えてしまうので,これを毎回バックアップしていたのではたまらない.外部に置くことにしてD:の直下のcompiledに保存するようにした.ここに生成されたmitten.exeを実行すると,いままでよりは多少長い時間ウィンドウが表示されるようになった.と言っても数秒も立たないうちに閉じてしまうのだが…

ただこれではっきり分かったことは,Gtkではjulia_mainを実行しているということだ.この中にループを組んでやれば多分動作するようになると思う.ただし,動作を観ていると,Julia_mainでシェルは開かれてはいるが,UIの入ったウィンドウは開かれていないように見える.多分,これはどこかに書いてあったような気がするが,Julia_mainの中にすべての処理を突っ込まなくてはならないのではないかと思う.言い換えると,REPL用のコードとスタンドアローン用のコードが切り分けできるようになっていなくてはならない.

コマンドシェルでmitten.exeを実行すると,julia_main中のプリント文は表示されるが,すぐに抜けてしまう.また,EXEのダブルクリックによる実行では何も表示されず,プリント文も出ない.⇒julia_mainの中でwaitすることによって,下図までは動いた.

image

生成された小さいパネルも表示されているが,ボタンクリックでフリーズしてしまった.

なかなか埒が明かない

なかなか埒が明かない.パッケージを作るのにPkgTemplates.jlというのが出てきた.これを試してみよう.

https://julialang.org/contribute/developing_package/

ここではGitHubを使っている.アカウントは作ってあるので,乗ってみることにする.まず,

using Pkg
Pkg.add(“PkgTemplates”)

でPkgTemplatesをインストールし,次に以下のテンプレートを作る.

using PkgTemplates
t = Template(; user=”your-GitHub-username”,
 authors=[“your-name”],
 plugins=[
  License(name=”MIT”),
  Git(),
  GitHubActions(),
 ],
)

エラーが出てしまった.user名が通らない.ArgumentError: Git: Global Git config is missing required value ‘user.name’ “babalabos” で登録しているはずなのだが… 中にピリオドが入ることが必須なのだろうか?⇒GitHubは将来(近未来的)使うことになるような気もしているのだが,どうもとんだ回り道になりそうな気がしてきた.PkgTemplatesというのを下調べしてみた方がよさそうだ.PkgTemplatesはJulia パッケージを新規生成しようとするときの手段を与えるものだ.典型的には,既存のGit 構成から起こすというのが手っ取り早い.最初からGitに繋がっているので,いろいろ好都合ということなのだろう.これは,もうちょっと手が空いてからということにしておこう.

https://qiita.com/mametank/items/9fc1c9227303d6ca304b

この記事はJuliaのプロジェクトについての分かり易い解説になっている.この続きでPkgTemplatesを解説している.現行の開発環境では,トップに蜜蜂天国GUIというフォルダがあり,その下に蜜蜂天国GUI→ 蜜天GUI→ 蜜天→ という構成になっている..code-workspace は蜜天GUIの並びにあり,蜜天の並びには.gitと.vscodeがある.このプロジェクトはGitに登録しているので,その際に.gitが生成されたのだろう..vscodeにはlaunch.jsonが入っている.これはVS Codeに関係するものだ.つまり,Julia的には外部に当たる.

蜜天というフォルダがJuliaのプロジェクトファイルに当たる.まだプロジェクトは生成されていないが(一度は生成しているが,後に削除)srcというフォルダが残っていて,蜜天.jlが配置されている.プロジェクトとして構成するためには,ここにProject.tomlとManifest.tomlを置く必要がある.これとは別にJulia本体がインストールされたユーザ環境がある.babalabo\.juliaで,この下のenvironmentsにもManifest.tomlとProject.tomlがある.Project.tomlを開いてみると,

[deps]
Gtk = “4c0ca9eb-093a-5379-98c5-f87ac0bbbf44”
JuliaFormatter = “98e50ef6-434e-11e9-1051-2b60c6c9e899”
PkgTemplates = “14b8a8f1-9102-5b29-a752-f990bacb7fe1”
Printf = “de0858da-6303-5e67-8744-51eddeeeb8d7”

のようになっている.Gtk, JuliaFormatter, PkgTemplates, Printfの名前が見える.これらは比較的最近導入されたもので,それ以前にインストールしたPlotsなどの名前は出てこない.この記事では最初にPkgモードでgenerateによってプロジェクトを作っている.これは前にやったことがあるが,もう一度作り直してみよう.蜜天というフォルダは温存して,別にmittenというプロジェクトを起こしてみる.

pkg> generate mitten

mittenというフォルダが生成され,その中にProject.tomlというファイルとsrcというフォルダがあり,srcにはmitten.jlというファイルが作られている.このままactivateしてみよう.

(@v1.10) pkg> activate mitten
   Activating project at `D:\蜜蜂天国GUI\密天GUI\mitten`

(mitten) pkg>

プロンプトの表示が(mitten) pkg> のように変わり,「環境」が変化したことを示している.mitten.jl には以下のコードが入っている.

module mitten
greet() = print(“Hello World!”)
end # module mitten

しかし,実行しても

> Connecting to debugger… Done!

が出るだけで,何も表示されない.println(“蜜蜂天国”)を追加すれば出る.greet()は単に宣言されているというだけのようだ.確かに,呼び出せば実行できる.⇒動画を1本観た(1時間物).

Juliaのパッケージ開発2022年版 @ Bio”Pack”athon2022#2
https://togotv.dbcls.jp/en/20220421.html

ようやくコンパイルが通ったようだ.コンパイル後にアプリの実行が始まった.正常に動作している.コマンドは

julia> using PackageCompiler
julia> create_app(“mitten”, “compiled”)

で compiled フォルダには,julia.exe だけではなく,mitten.exe もできている.ただし,これを実行しても画面をちらっと見せただけで閉じてしまう.ともかく,一度バックアップしておこう.⇒julia_mainをGtk.gtk_mainで置き換えるという修正を入れてようやく動くようにはなったが,今度は最後にエラーが出るようになってしまった.

[00m:19s] PackageCompiler: compiling nonincremental system image
ERROR: failed process: Process(`’C:\Users\babalabo\.julia\juliaup\j…

バックアップに戻ってもう一度やり直してみよう.なぜだろう.フォルダがやけに大きくなっている.56KBしかなかったものが,700MB以上になっている.システムイメージを持っているかいないかの違いだ.しかし,こんなに大きなパッケージを配布するなど非現実的だ.

確かにこのバージョンではエラーは発生していない.この版ではJulia_main も gtk_main も使わずにモジュール内で単純にループしているだけだ.clickの中でもループカウントをチェックしていて,オーバーするとexitを実行するようになっているが,これを止めても動作は変わらない.ただし,ウィンドウは開いたままになってしまう.これでもう一度ビルドしてみよう.いや,おそらくEXEでウィンドウを開いたままにするには,gtk_mainが必要なのではないか?

Julia で GUI アプリに挑戦

蜜蜂天国のまとめに入っているところだが,足踏み状態だ.いろいろなパターンを試してみたいのだが,そのためにはもうちょっと準備が必要だ.Julia ではGUIを持った独立のアプリを作るというのが難しいので,C#への移植を考えている.C#なら何でもできるし,これまで作ってきた資産を活かすこともできる.そのためには少なくとも,BigFloatをサポートする環境を構築しなくてはならない.以前,C#にBigIntegerを導入しようとして挫折した経験があるので,二の足を踏んでしまうところだが,再チャレンジしてみたい.

C#のライブラリとしてGitHubに公開されているものとしては,Osinkoというのがある.これはベースがBigIntegerなので,多分 BigIntegerを先に導入する必要がありそうだ.Osinko の開発者は名前から想像付くように日本人のようだ.これを使ってみることにしよう.ただし,かなり古い.リリースされたのが10年以上前で最新の更新は8年前という感じ.計算結果がマシーンによって異なるというクレームも上がっている… nuget というディストリビューションもある.

いや,その前にもう一つ考えておかなくてはならないことがある.Julia には solve という関数があり,任意の方程式を解ける機能が備わっているが,この代替になるものがC#にあるだろうか?蜜天法で自力で解くという考え方もあり得るが… いまのところ現実性は薄い.むしろ,がんばって Julia で GUI アプリを作ってしまった方が早いかもしれない… ちょっとそのコースを試してみることにしよう.

https://goropikari.hatenablog.com/entry/julia_gui_app

Julia のREPLではサンプルコードを動かすことができたが,VS Code上ではエラーになってしまう.一行目の

win = Window(“Count Click”) # 大枠のWindowをつくる

でエラーが発生している.何かが不足しているのだろう.上記URLの筆者の記事はシリーズものなので,もう少し前まで遡る必要があるかもしれない.ここではGtkを使っているが,クロスプラットフォームGUIを生成するツールキット Qt.jlというのもある.また,WebベースのGUIアプリを作るWebIO.jlというのもある.PCを使っていないユーザもいるので,ブラウザで動くというのは有用かも知れない.
https://www.reddit.com/r/Julia/comments/wdeda0/help_with_gtkjl_in_vscode/?rdt=48792&onetap_auto=true&one_tap=true

VS Codeの中で,Julia のREPLから実行するという提案があり,実行できた.ただし,まだエラーは出ている.⇒エラーは出ないようになったが,クリックがカウントされない.つまり,イベントを拾っていない.このコードの作者はLinux環境でJuliaを動かしているようだ.別の選択肢としては,Jupyterというのがある.これはJuliaだけでなくPythonその他複数の言語をサポートしている.

VS Codeの右上メニューからJulia:Execute active file in REPL でウィンドウを開き,イベントを取るところまではできた.しかし,デバッグはできない.デバッグモードで実行しようとすると,sigatomic_end called in non-sigatomic region エラーが起きてしまう.クロスプラットフォームパッケージのQtをインストールしてみよう.Qtというパッケージは見つからないので,QT_jllというのをインストールしてみた.インストール時にエラーが起きている.VS Code内でJulia→pkgではエラーは起きなかった.⇒しかし,サンプルは動かない.

オリジナルのソースコードは反応するようになった.

image

デバッグはできないが,何とかアプリを構築できる目処は立ったとも言える.EXEに仕立てるには,PackageCompiler.jlというのが必要になる.⇒インストールできたが,ビルドできない.build_executableが未定義になってしまう.PackageCompilerではなく,ApplicationBuilder という名前が出てきた.以下のコマンドで動いた.

Julia> PackageCompiler
Julia> create_app(“密天GUI.jl”, “密天GUI”)

ただし,エラーが出ている.引数がまずいようだ.

using PackageCompiler
create_app("/path/to/Hello",         # this is the directory where Project.toml resides
           "/path/to/HelloCompiled") # target directory where you want your compiled app to be generated

project.tomlというファイルがどこかになくてはならないのだが… Julia にはプロジェクトという概念はなかったような気がするのだが… 実際,メニューにはそれらしきコマンドは見当たらない.⇒プロジェクトはpkgで生成されるようだ.

pkg> generate 密天GUI

現在のフォルダの下に指定した密天GUIというプロジェクトが生成され,同時に蜜天GUI.jlというファイルも作られる.密天GUIの中にはProject.tomlというファイルが作られ,そこにはsrcというフォルダができていて,その中にも蜜天GUI.jlというファイル作られている.いや,最初の蜜天GUI.jlは元々あったものだ.Project.tomlの内容は以下のようなものだ.

name = “密天GUI”
uuid = “d0bef8e6-be7e-4316-93e9-b4cd7ca35f8f”
authors = [“babalabo “]
version = “0.1.0”

src\蜜天GUI.jlの中身は,以下の3行だ.

module 密天GUI
greet() = print(“Hello World!”)
end # module 密天GUI

このファイルを実行すると,

Main.密天GUI

が出力される.しかし,greet()という関数が実行された気配はない.greet()の下に一行追加して

println(“密天GUI ############”)

実行すると,

WARNING: replacing module 密天GUI.
密天GUI ############
Main.密天GUI

が出力される.どうもよく訳が分からない… フォルダを変えて,新しいプロジェクトフォルダを見るようにしたら,上の警告が消えて,まともな動作になった.

密天GUI ############
Main.密天GUI

(@v1.10) pkg> activate .
   Activating project at `D:\蜜蜂天国GUI\密天GUI\密天GUI`

ビルドするときにはJuliaを以下の構文で起動する必要がある.

❯ julia -q –project ⇒エラーになる.

その後で,以下を実行する.

julia> create_app(“MyApp”, “MyAppCompiled”) [ Info: PackageCompiler: creating base system image (incremental=false), this might take a while… [ Info: PackageCompiler: creating system image object file, this might take a while…

ほとんど空に近いアプリだが,ビルドはかなりの時間が掛かる.⇒しかし,最終的にはエラーで終わってしまった.

ERROR: failed process: Process(setenv(`’C:\Users\babalabo\.julia\juliaup\julia-1.10.2+0.x64.w64.mingw32\bin\julia.exe’ ....

今回は39個しかDLLが生成されていない.(その前は54個?できていた)julia.exeを実行してもぱっとウィンドウが一瞬開いて閉じてしまう.ただし,今回はbinの他に,shareというフォルダができている.この中にはファイルが3個できているが,そのうちの一つはProject.tomlだ.⇒どうも,GtkはWindows向きにはできていないようだ.REPLでは動作しているようなのだが…

https://docs.gtk.org/gtk3/building.html

GtkをWindowsで使うためには,gvebuildが必要なようだ.これはPythonスクリプトで,VSを使ってGTKライブラリを構築する.

いつの間にか来訪者が20万の大台超え

蜜蜂天国のまとめに入っているところだが,find_zeroが動作していない.どうもtryブロック内の変数がローカルになっているようだ.global 宣言することで動作するようになった.

いつの間にか来訪者が20万の大台を超えていた.何かいいことあるだろうか?タバコが切れてからそろそろ一週間…

image

また軌跡の描線が出なくなっている

なぜだろう?また軌跡の描線が出なくなっている.アニメには出力されている.このサンプルでは例外は発生していない.昨日は完全に動作確認したつもりだったのだが…

image

ポイントは描画できているのに線分が描けないというのはどういうことだろう?2024-03-28-1 では出ている.最新版でまったく同じ設定にしてみたが,やはり動作していない.どうもよく分からないので,ここまで戻ることにする.

image

いや,それより後の28-2でも動作している.ここまで戻れば十分だ.

image

この後,どんな修正が入っているかが問題だ.この版にはすでにRootsは組み込まれていて,Find_zeroで不動点を検出している.実際画面にも描画されている.ここまでできれば立派なものだと思うのだが,何を追加しようとしたのだろう?まず,動線を描画できていないサンプル y=x^2-1.5 初期値α=1.8229を試してみよう.確かに画面には何も出てきていない.

image

ただし,これは計算や動作が誤っているためではない.開始点=(1+√7)/2 から出発した場合,値の変化が遅くて不動点の◯の外に出られないためだ.これを区間[1.8, 2.0] point:30で描画すると,以下が出力される.

image

ただし,ステップを増やして,point=34を超えると動線は消えてしまう.

1: 1.82287565553229535809
2: 1.82287565553229552433
3: 1.82287565553229613042

27: 1.84833257470943420165
28: 1.91633330673200616455
29: 2.17233334249042522319
30: 3.21903215089562309242
31: 8.86216798849970155839
32: 77.03802145638884645281
33: 5933.35674991502828268578
34: 35204720.82176222747503632359
35: 1239372368138217.42496308002819849062

36: 1536043866904533138569813670805.66483330243742956258
37: 2359430761055031115005960802378927230275224692180453704350907.12176434601263055879
38: 5566913516212723332117413654604965054786240836971452633864047785437413116991185624735519798218699259766451175951693774848.00000000000000000000
39: 30990526096991907041511225161593806680067925799018141776028714401452471138227479974234438992180424796522079841327601952168724719696008595440015069056256081311447418248647170548763107745965205691210096638929522670926745027633952745003478417408.00000000000000000000

のように変化するとき,39点目で例外が発生しているが,それよりも手前の35点目で描画上の問題が発生するものと考えられる.例外が発生した場合には,例外の発生点から先を切り捨てて自動再計算するようになっているが,動線を描画するためには,maxloopを68以下に設定する必要がある.下図では区間を[1.8-100.0]まで拡大して32点までを描画している.

image

いずれにしても,軌跡の動点数を調整しないと動線を描くことはできないということが分かった.ここで一度バックアップを取ってから,もう少し整理することにしよう.⇒配列XaとYaは廃止できるはずだ.⇒廃止した.⇒lastpos はループの中では更新せず,最後のsweetposから取り出すというのでよいのではないか?(正確に言うと,この点は描画されていない可能性はあるが…)この図は区間[1.8, 4.0]だが,稲妻型の発散としてはこのくらいが分かり易いのではないか?

image

とりあえず,一旦バックアップを取っておこう.ある程度整理が付いた.稲妻型の収束例として以下をピックアップしておこう.

image

スパイラル型の収束例が欲しい.これがスパイラルではないか?

image

そんな感じだ.通常のメルストロム型とはかなり違う.初期値0.5でもほとんど図柄は変わらない.しかし,x^2-1.5の標準図とは大きな違いだ.下図↓

image

ようやく片付いた

プログラムを少し改造する必要がある.

  1. precision を定数で与える ◯
  2. initialpointを冒頭で定義する ◯
  3. setprecision ブロック内の処理はすべて平場で実施する △
  4. 特性関数を y = (x-a)^2+b の形式に変更する X
  5. 特性方程式 x=(x-a)^2+b の解をあらかじめ取り出しておく ◯
  6. その他のパラメータも変数表示してあらかじめ計算しておく △

これは何だ?まだ午後9時というのに…

image

これはこれまでのレコードではないだろうか?ただし,それほど伸びなかったようだ.2000は超えなかった模様.

初期値を2から100に変更しただけでエラーが起きてしまった.10ならば動作する.-10にしたら,今度はDrawLinesで停止するようになった.⇒これはわたしのミスだ.根号の中の変数に負値を与えていた.√(5+x)なので,-5より小さい値は渡せない.しかし,√(20+x)としても,エラーは解消しない.今度は setprecision のエラーだ.

NaN result for non-NaN input

どうも,シグネーチャの異なる呼び出しを実行しようとしているようだ.⇒setprecisionを引数一つの一番シンプルなタイプに書き換えて動作するようになった.しかし,初期値100ではまだエラーになる.今度は UndefVarError: `Rounding` not defined に変わった.

初期値20なら動作する.初期値によって動作が変わるというところが気に食わないところだ.どうも,この setprecision という関数は本当に始末に悪い関数だ.今度は

BoundsError: attempt to access 920-element Vector{UInt8} at index [923]

どうなっているのか?訳が分からない.⇒わかった.おそらくこれは浮動小数点数の指数部のレンジローバーだ.ここでレンジオーバーするということはこの数値はすでに超巨大数になっていることを意味する.つまり,BigFloatでも扱えないほどの数ということになる.precisionは仮数部のビット数なので,これがどれほど大きくても無関係だ.⇒ざっと見た限りではこのレンジを変更する手段はないように思われる.ここでは,エラーで脱出するしかないだろう.

https://discourse.julialang.org/t/cumbersome-scoping-rules-for-try-catch-finally/4582

ようやく片付いた.以下のように手当して切り抜けた.

  1. 任意精度浮動小数点数では仮数部のビット数は指定できるが,指数部を設定できないので,巨大整数では例外が発生する.これを処理するために try・catch ブロックを設けたが,catch ブロックでは外部変数を参照できないなど,いろいろと制約がある.
  2. このため,try・catch ブロック を最上層に仕掛けて,catch ブロックの中ではフラグを立てるだけで抜けるようにした.後処理を catch ブロックの中で実行しようとすると,動作がおかしくなる.
  3. 後処理は最上層に戻ってから実行するようにした.後処理では,例外が発生してご破算になった計算を安全に計算できる範囲で再計算する.このために,maxloop を書き直して,CalcTrajectory を再実行している.

一応これで片付いたが,まだ軌跡は描画できていない.アニメには収録されているのだが… 多分これはどこかで調整できるだろう.⇒とりあえず出るようになったので,よしとしておこう.大部扱い易くなった.

image

あとは,最低限,不動点を描画するだけだが,これを自動計算することはできないだろうか?ともかく,一度バックアップしておこう.⇒Julia にはいくつかsolverパッケージがある.Roots.jl,NLsolve.jl… NLsolve には x=F(x)を解く機能まで備わっているようだ.NLというのはnon-linearという意味だ.Roots では探索範囲を指定しなくてはならないところがやや難だ.しかし,蜜天法よりはましかもしれない.蜜天法では見つかったとしても一つだけだ.NLsolveは二変数以上の方程式が解ける.今のところはそこまで必要ないので,Rootsでゆくことにする.⇒フォルダ名を蜜蜂天国に変えた.

どうも,find_zeroの引数xはFloat64までしか使えないようだ.

どうも,かなり難しい話になってきた

蜜蜂天国の空域の地割りをやろうとしているのだが,手強い.y=x^2-3/2の代わりにy=x^2を適用すると,初期値s<1の場合には単純に収束してしまう.つまり,この代数系の動作を決定しているのは曲線の形状だけではないということになる.

◎オフセット:-1.5 初期値:α=-0.5 α点を含む白地を残して塗り潰し

image

◎オフセット:-1.0 初期値:α=-0.5 無限ループ

image

◎オフセット:-1.5 初期値:α=-0.7071 卍字型循環経路

image