Skip to content

Instantly share code, notes, and snippets.

@omochi
Created February 5, 2020 03:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save omochi/ed7e3f3a1e20cc1caeb38e573de5fc2a to your computer and use it in GitHub Desktop.
Save omochi/ed7e3f3a1e20cc1caeb38e573de5fc2a to your computer and use it in GitHub Desktop.

Link::FindHomologyの

        aborted = BuildEdges(MM, msg, &count) || Reduce(MM, msg, &count);

SwiftyKnotsの以下のコメントされた connect verticesとreduce verticesに対応する気がするが・・・

        for k in mRange.reversed() {
            ...
            
            // connect vertices [k] -> [k-1]
            ...
            
            // reduce vertices:
            //
            //      a   x             a'
            //      |\ /|\             \
            //      | X | \    ==>       \
            //      |/ \|  \               \
            //      y   b   b'          b   b'

            ...
        }

Link::FindHomologyに

    for (MM = 4*gridsize -1; MM > 0; MM--) {
        printf("MM=%d\n", MM);

を入れて、得た出力が以下

MM=39
MM=38
MM=37
MM=36
MM=35
MM=34
MM=33
MM=32
MM=31
MM=30
MM=29
MM=28
MM=27
MM=26
MM=25
   1%
   1%
MM=24
   1%
   1%
MM=23
   1%
   1%
MM=22
   1%
   2%
MM=21
   4%
  10%
MM=20
  17%
  30%
MM=19
  42%
  56%
MM=18
  70%
  79%
MM=17
  88%
  92%
MM=16
  96%
  97%
MM=15
  99%
  99%
MM=14
  99%
  99%
MM=13
  99%
  99%
MM=12
MM=11
MM=10
MM=9
MM=8
MM=7
MM=6
MM=5
MM=4
MM=3
MM=2
MM=1
 100%

SwiftyKnotsに

        for k in mRange.reversed() {
            print("[\(cnt)] k=\(k)")
            cnt += 1

を入れて得た出力が以下

alex=0
[0] k=5
[1] k=4
[2] k=3
[3] k=2
[4] k=1
[5] k=0
[6] k=-1
[7] k=-2
[8] k=-3
[9] k=-4
[10] k=-5
[11] k=-6
[12] k=-7
alex=1
[13] k=4
[14] k=3
[15] k=2
[16] k=1
[17] k=0
[18] k=-1
[19] k=-2
[20] k=-3
[21] k=-4
[22] k=-5
alex=2
[23] k=4
[24] k=3
[25] k=2
[26] k=1
[27] k=0
[28] k=-1
[29] k=-2
[30] k=-3
alex=3
[31] k=4
[32] k=3
[33] k=2
[34] k=1
[35] k=0
@omochi
Copy link
Author

omochi commented Feb 5, 2020

C++のやつは40回の1次元ループになっているのに対して、
SwiftのやつはAlexanderDegreeで区切った単位の中での範囲のループになっている
合計数も微妙に違ってよくわからない・・・

処理の対応関係がわかれば、
個別のステップを対比して分析できる。
そのステップに入力している問題がそもそも同じかどうか確認したいし、
そのステップの単位で更に細かく内部の計算過程の処理時間を分析することで、
どのような差が出ているかわかる。

そもそも数学上の問題をロジックに落とし込む過程で、
なんかうまいこと畳み込みによって再帰性が消せてたり消せてなかったりみたいな、
決定的なタスク量の違いが出てしまっているのではないか?とか気になっている。

@omochi
Copy link
Author

omochi commented Feb 5, 2020

C++のやつがM=25からM=13にかけて進捗率のログが一気に出るのも気になる。
なんか最後の行列表示の非ゼロ成分の分布と関係がありそうだけど。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment