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
C++のやつは40回の1次元ループになっているのに対して、
SwiftのやつはAlexanderDegreeで区切った単位の中での範囲のループになっている
合計数も微妙に違ってよくわからない・・・
処理の対応関係がわかれば、
個別のステップを対比して分析できる。
そのステップに入力している問題がそもそも同じかどうか確認したいし、
そのステップの単位で更に細かく内部の計算過程の処理時間を分析することで、
どのような差が出ているかわかる。
そもそも数学上の問題をロジックに落とし込む過程で、
なんかうまいこと畳み込みによって再帰性が消せてたり消せてなかったりみたいな、
決定的なタスク量の違いが出てしまっているのではないか?とか気になっている。