mirror of
https://github.com/kalmarek/SmallHyperbolic
synced 2024-11-27 16:35:26 +01:00
commit
8df415ca59
306
data/morphisms.dot
Normal file
306
data/morphisms.dot
Normal file
@ -0,0 +1,306 @@
|
|||||||
|
digraph {
|
||||||
|
"G^{14,14,48}_{0}" -> "G^{14,14,24}_{1}"
|
||||||
|
"G^{14,14,48}_{0}" -> "G^{14,14,16}_{1}"
|
||||||
|
"G^{14,14,48}_{1}" -> "G^{14,14,24}_{0}"
|
||||||
|
"G^{14,14,48}_{1}" -> "G^{14,14,16}_{0}"
|
||||||
|
"G^{14,14,48}_{4}" -> "G^{14,14,24}_{5}"
|
||||||
|
"G^{14,14,48}_{4}" -> "G^{14,14,16}_{5}"
|
||||||
|
"G^{14,14,48}_{5}" -> "G^{14,14,24}_{4}"
|
||||||
|
"G^{14,14,48}_{5}" -> "G^{14,14,16}_{4}"
|
||||||
|
"G^{14,14,54}_{0}" -> "G^{14,14,18}_{0}"
|
||||||
|
"G^{14,14,54}_{4}" -> "G^{14,14,18}_{4}"
|
||||||
|
"G^{14,16,48}_{0}" -> "G^{14,16,24}_{1}"
|
||||||
|
"G^{14,16,48}_{0}" -> "G^{14,16,16}_{1}"
|
||||||
|
"G^{14,16,48}_{1}" -> "G^{14,16,24}_{0}"
|
||||||
|
"G^{14,16,48}_{1}" -> "G^{14,16,16}_{0}"
|
||||||
|
"G^{14,16,54}_{0}" -> "G^{14,16,18}_{0}"
|
||||||
|
"G^{14,16,54}_{2}" -> "G^{14,16,18}_{0}"
|
||||||
|
"G^{14,18,48}_{0}" -> "G^{14,18,24}_{0}"
|
||||||
|
"G^{14,18,48}_{0}" -> "G^{14,16,18}_{0}"
|
||||||
|
"G^{14,18,54}_{0}" -> "G^{14,18,18}_{0}"
|
||||||
|
"G^{14,18,54}_{2}" -> "G^{14,18,18}_{0}"
|
||||||
|
"G^{14,24,48}_{0}" -> "G^{14,24,24}_{1}"
|
||||||
|
"G^{14,24,48}_{0}" -> "G^{14,16,24}_{1}"
|
||||||
|
"G^{14,24,48}_{1}" -> "G^{14,24,24}_{0}"
|
||||||
|
"G^{14,24,48}_{1}" -> "G^{14,16,24}_{0}"
|
||||||
|
"G^{14,24,54}_{0}" -> "G^{14,18,24}_{0}"
|
||||||
|
"G^{14,24,54}_{2}" -> "G^{14,18,24}_{0}"
|
||||||
|
"G^{14,26,48}_{0}" -> "G^{14,24,26}_{3}"
|
||||||
|
"G^{14,26,48}_{0}" -> "G^{14,16,26}_{3}"
|
||||||
|
"G^{14,26,48}_{1}" -> "G^{14,24,26}_{7}"
|
||||||
|
"G^{14,26,48}_{1}" -> "G^{14,16,26}_{7}"
|
||||||
|
"G^{14,26,48}_{4}" -> "G^{14,24,26}_{0}"
|
||||||
|
"G^{14,26,48}_{4}" -> "G^{14,16,26}_{0}"
|
||||||
|
"G^{14,26,48}_{5}" -> "G^{14,24,26}_{1}"
|
||||||
|
"G^{14,26,48}_{5}" -> "G^{14,16,26}_{1}"
|
||||||
|
"G^{14,26,54}_{0}" -> "G^{14,18,26}_{3}"
|
||||||
|
"G^{14,26,54}_{2}" -> "G^{14,18,26}_{3}"
|
||||||
|
"G^{14,26,54}_{4}" -> "G^{14,18,26}_{0}"
|
||||||
|
"G^{14,26,54}_{6}" -> "G^{14,18,26}_{0}"
|
||||||
|
"G^{16,16,48}_{0}" -> "G^{16,16,24}_{1}"
|
||||||
|
"G^{16,16,48}_{0}" -> "G^{16,16,16}_{1}"
|
||||||
|
"G^{16,16,48}_{1}" -> "G^{16,16,24}_{0}"
|
||||||
|
"G^{16,16,48}_{1}" -> "G^{16,16,16}_{0}"
|
||||||
|
"G^{16,16,54}_{0}" -> "G^{16,16,18}_{0}"
|
||||||
|
"G^{16,18,48}_{0}" -> "G^{16,18,24}_{0}"
|
||||||
|
"G^{16,18,48}_{0}" -> "G^{16,16,18}_{0}"
|
||||||
|
"G^{16,18,54}_{0}" -> "G^{16,18,18}_{0}"
|
||||||
|
"G^{16,18,54}_{2}" -> "G^{16,18,18}_{0}"
|
||||||
|
"G^{16,24,48}_{0}" -> "G^{16,24,24}_{1}"
|
||||||
|
"G^{16,24,48}_{0}" -> "G^{16,16,24}_{1}"
|
||||||
|
"G^{16,24,48}_{1}" -> "G^{16,24,24}_{0}"
|
||||||
|
"G^{16,24,48}_{1}" -> "G^{16,16,24}_{0}"
|
||||||
|
"G^{16,24,54}_{0}" -> "G^{16,18,24}_{0}"
|
||||||
|
"G^{16,24,54}_{2}" -> "G^{16,18,24}_{0}"
|
||||||
|
"G^{16,26,48}_{0}" -> "G^{16,24,26}_{1}"
|
||||||
|
"G^{16,26,48}_{0}" -> "G^{16,16,26}_{1}"
|
||||||
|
"G^{16,26,48}_{1}" -> "G^{16,24,26}_{0}"
|
||||||
|
"G^{16,26,48}_{1}" -> "G^{16,16,26}_{0}"
|
||||||
|
"G^{16,26,54}_{0}" -> "G^{16,18,26}_{0}"
|
||||||
|
"G^{16,26,54}_{2}" -> "G^{16,18,26}_{0}"
|
||||||
|
"G^{18,18,48}_{0}" -> "G^{18,18,24}_{0}"
|
||||||
|
"G^{18,18,48}_{0}" -> "G^{16,18,18}_{0}"
|
||||||
|
"G^{18,18,54}_{0}" -> "G^{18,18,18}_{0}"
|
||||||
|
"G^{18,24,48}_{0}" -> "G^{18,24,24}_{0}"
|
||||||
|
"G^{18,24,48}_{0}" -> "G^{16,18,24}_{0}"
|
||||||
|
"G^{18,24,54}_{0}" -> "G^{18,18,24}_{0}"
|
||||||
|
"G^{18,24,54}_{2}" -> "G^{18,18,24}_{0}"
|
||||||
|
"G^{18,26,48}_{0}" -> "G^{18,24,26}_{0}"
|
||||||
|
"G^{18,26,48}_{0}" -> "G^{16,18,26}_{0}"
|
||||||
|
"G^{18,26,54}_{0}" -> "G^{18,18,26}_{0}"
|
||||||
|
"G^{18,26,54}_{2}" -> "G^{18,18,26}_{0}"
|
||||||
|
"G^{24,24,48}_{0}" -> "G^{24,24,24}_{1}"
|
||||||
|
"G^{24,24,48}_{0}" -> "G^{16,24,24}_{1}"
|
||||||
|
"G^{24,24,48}_{1}" -> "G^{24,24,24}_{0}"
|
||||||
|
"G^{24,24,48}_{1}" -> "G^{16,24,24}_{0}"
|
||||||
|
"G^{24,24,54}_{0}" -> "G^{18,24,24}_{0}"
|
||||||
|
"G^{24,26,48}_{0}" -> "G^{24,24,26}_{1}"
|
||||||
|
"G^{24,26,48}_{0}" -> "G^{16,24,26}_{1}"
|
||||||
|
"G^{24,26,48}_{1}" -> "G^{24,24,26}_{0}"
|
||||||
|
"G^{24,26,48}_{1}" -> "G^{16,24,26}_{0}"
|
||||||
|
"G^{24,26,54}_{0}" -> "G^{18,24,26}_{0}"
|
||||||
|
"G^{24,26,54}_{2}" -> "G^{18,24,26}_{0}"
|
||||||
|
"G^{26,26,48}_{0}" -> "G^{24,26,26}_{3}"
|
||||||
|
"G^{26,26,48}_{0}" -> "G^{16,26,26}_{3}"
|
||||||
|
"G^{26,26,48}_{1}" -> "G^{24,26,26}_{0}"
|
||||||
|
"G^{26,26,48}_{1}" -> "G^{16,26,26}_{0}"
|
||||||
|
"G^{26,26,48}_{4}" -> "G^{24,26,26}_{5}"
|
||||||
|
"G^{26,26,48}_{4}" -> "G^{16,26,26}_{5}"
|
||||||
|
"G^{26,26,48}_{5}" -> "G^{24,26,26}_{1}"
|
||||||
|
"G^{26,26,48}_{5}" -> "G^{16,26,26}_{1}"
|
||||||
|
"G^{26,26,54}_{0}" -> "G^{18,26,26}_{0}"
|
||||||
|
"G^{26,26,54}_{4}" -> "G^{18,26,26}_{1}"
|
||||||
|
"G^{14,40,48}_{0}" -> "G^{14,24,40}_{0}"
|
||||||
|
"G^{14,40,48}_{0}" -> "G^{14,16,40}_{0}"
|
||||||
|
"G^{14,40,54}_{0}" -> "G^{14,18,40}_{0}"
|
||||||
|
"G^{14,40,54}_{2}" -> "G^{14,18,40}_{0}"
|
||||||
|
"G^{14,48,48}_{0}" -> "G^{14,24,48}_{1}"
|
||||||
|
"G^{14,48,48}_{0}" -> "G^{14,16,48}_{1}"
|
||||||
|
"G^{14,48,48}_{0}" -> "G^{14,24,48}_{1}"
|
||||||
|
"G^{14,48,48}_{0}" -> "G^{14,16,48}_{1}"
|
||||||
|
"G^{14,48,48}_{1}" -> "G^{14,24,48}_{0}"
|
||||||
|
"G^{14,48,48}_{1}" -> "G^{14,16,48}_{0}"
|
||||||
|
"G^{14,48,48}_{1}" -> "G^{14,24,48}_{0}"
|
||||||
|
"G^{14,48,48}_{1}" -> "G^{14,16,48}_{0}"
|
||||||
|
"G^{14,48,54}_{0}" -> "G^{14,18,48}_{0}"
|
||||||
|
"G^{14,48,54}_{0}" -> "G^{14,24,54}_{0}"
|
||||||
|
"G^{14,48,54}_{0}" -> "G^{14,16,54}_{0}"
|
||||||
|
"G^{14,48,54}_{2}" -> "G^{14,18,48}_{0}"
|
||||||
|
"G^{14,48,54}_{2}" -> "G^{14,24,54}_{2}"
|
||||||
|
"G^{14,48,54}_{2}" -> "G^{14,16,54}_{2}"
|
||||||
|
"G^{14,54,54}_{0}" -> "G^{14,18,54}_{2}"
|
||||||
|
"G^{14,54,54}_{0}" -> "G^{14,18,54}_{0}"
|
||||||
|
"G^{14,54,54}_{2}" -> "G^{14,18,54}_{2}"
|
||||||
|
"G^{14,54,54}_{2}" -> "G^{14,18,54}_{2}"
|
||||||
|
"G^{14,54,54}_{8}" -> "G^{14,18,54}_{0}"
|
||||||
|
"G^{14,54,54}_{8}" -> "G^{14,18,54}_{0}"
|
||||||
|
"G^{16,40,40}_{0}" -> "G^{8,40,40}_{0}"
|
||||||
|
"G^{16,40,48}_{0}" -> "G^{16,24,40}_{0}"
|
||||||
|
"G^{16,40,48}_{0}" -> "G^{16,16,40}_{0}"
|
||||||
|
"G^{16,40,48}_{0}" -> "G^{8,40,48}_{0}"
|
||||||
|
"G^{16,40,54}_{0}" -> "G^{16,18,40}_{0}"
|
||||||
|
"G^{16,40,54}_{0}" -> "G^{8,40,54}_{0}"
|
||||||
|
"G^{16,40,54}_{2}" -> "G^{16,18,40}_{0}"
|
||||||
|
"G^{16,40,54}_{2}" -> "G^{8,40,54}_{2}"
|
||||||
|
"G^{16,48,48}_{0}" -> "G^{16,24,48}_{1}"
|
||||||
|
"G^{16,48,48}_{0}" -> "G^{16,16,48}_{1}"
|
||||||
|
"G^{16,48,48}_{0}" -> "G^{16,24,48}_{1}"
|
||||||
|
"G^{16,48,48}_{0}" -> "G^{16,16,48}_{1}"
|
||||||
|
"G^{16,48,48}_{0}" -> "G^{8,48,48}_{1}"
|
||||||
|
"G^{16,48,48}_{1}" -> "G^{16,24,48}_{0}"
|
||||||
|
"G^{16,48,48}_{1}" -> "G^{16,16,48}_{0}"
|
||||||
|
"G^{16,48,48}_{1}" -> "G^{16,24,48}_{0}"
|
||||||
|
"G^{16,48,48}_{1}" -> "G^{16,16,48}_{0}"
|
||||||
|
"G^{16,48,48}_{1}" -> "G^{8,48,48}_{0}"
|
||||||
|
"G^{16,48,54}_{0}" -> "G^{16,18,48}_{0}"
|
||||||
|
"G^{16,48,54}_{0}" -> "G^{16,24,54}_{0}"
|
||||||
|
"G^{16,48,54}_{0}" -> "G^{16,16,54}_{0}"
|
||||||
|
"G^{16,48,54}_{0}" -> "G^{8,48,54}_{0}"
|
||||||
|
"G^{16,48,54}_{2}" -> "G^{16,18,48}_{0}"
|
||||||
|
"G^{16,48,54}_{2}" -> "G^{16,24,54}_{2}"
|
||||||
|
"G^{16,48,54}_{2}" -> "G^{16,16,54}_{0}"
|
||||||
|
"G^{16,48,54}_{2}" -> "G^{8,48,54}_{2}"
|
||||||
|
"G^{16,54,54}_{0}" -> "G^{16,18,54}_{2}"
|
||||||
|
"G^{16,54,54}_{0}" -> "G^{16,18,54}_{0}"
|
||||||
|
"G^{16,54,54}_{0}" -> "G^{8,54,54}_{0}"
|
||||||
|
"G^{16,54,54}_{2}" -> "G^{16,18,54}_{2}"
|
||||||
|
"G^{16,54,54}_{2}" -> "G^{16,18,54}_{2}"
|
||||||
|
"G^{16,54,54}_{2}" -> "G^{8,54,54}_{2}"
|
||||||
|
"G^{16,54,54}_{8}" -> "G^{16,18,54}_{0}"
|
||||||
|
"G^{16,54,54}_{8}" -> "G^{16,18,54}_{0}"
|
||||||
|
"G^{16,54,54}_{8}" -> "G^{8,54,54}_{8}"
|
||||||
|
"G^{18,40,40}_{0}" -> "G^{6,40,40}_{0}"
|
||||||
|
"G^{18,40,48}_{0}" -> "G^{18,24,40}_{0}"
|
||||||
|
"G^{18,40,48}_{0}" -> "G^{16,18,40}_{0}"
|
||||||
|
"G^{18,40,48}_{0}" -> "G^{6,40,48}_{0}"
|
||||||
|
"G^{18,40,54}_{0}" -> "G^{18,18,40}_{0}"
|
||||||
|
"G^{18,40,54}_{0}" -> "G^{6,40,54}_{0}"
|
||||||
|
"G^{18,40,54}_{2}" -> "G^{18,18,40}_{0}"
|
||||||
|
"G^{18,40,54}_{2}" -> "G^{6,40,54}_{2}"
|
||||||
|
"G^{18,48,48}_{0}" -> "G^{18,24,48}_{0}"
|
||||||
|
"G^{18,48,48}_{0}" -> "G^{16,18,48}_{0}"
|
||||||
|
"G^{18,48,48}_{0}" -> "G^{18,24,48}_{0}"
|
||||||
|
"G^{18,48,48}_{0}" -> "G^{16,18,48}_{0}"
|
||||||
|
"G^{18,48,48}_{0}" -> "G^{6,48,48}_{0}"
|
||||||
|
"G^{18,48,54}_{0}" -> "G^{18,18,48}_{0}"
|
||||||
|
"G^{18,48,54}_{0}" -> "G^{18,24,54}_{0}"
|
||||||
|
"G^{18,48,54}_{0}" -> "G^{16,18,54}_{2}"
|
||||||
|
"G^{18,48,54}_{0}" -> "G^{6,48,54}_{0}"
|
||||||
|
"G^{18,48,54}_{2}" -> "G^{18,18,48}_{0}"
|
||||||
|
"G^{18,48,54}_{2}" -> "G^{18,24,54}_{2}"
|
||||||
|
"G^{18,48,54}_{2}" -> "G^{16,18,54}_{0}"
|
||||||
|
"G^{18,48,54}_{2}" -> "G^{6,48,54}_{2}"
|
||||||
|
"G^{18,54,54}_{0}" -> "G^{18,18,54}_{0}"
|
||||||
|
"G^{18,54,54}_{0}" -> "G^{18,18,54}_{0}"
|
||||||
|
"G^{18,54,54}_{0}" -> "G^{6,54,54}_{0}"
|
||||||
|
"G^{18,54,54}_{2}" -> "G^{18,18,54}_{0}"
|
||||||
|
"G^{18,54,54}_{2}" -> "G^{18,18,54}_{0}"
|
||||||
|
"G^{18,54,54}_{2}" -> "G^{6,54,54}_{2}"
|
||||||
|
"G^{18,54,54}_{8}" -> "G^{18,18,54}_{0}"
|
||||||
|
"G^{18,54,54}_{8}" -> "G^{18,18,54}_{0}"
|
||||||
|
"G^{18,54,54}_{8}" -> "G^{6,54,54}_{8}"
|
||||||
|
"G^{24,40,40}_{0}" -> "G^{6,40,40}_{0}"
|
||||||
|
"G^{24,40,40}_{0}" -> "G^{8,40,40}_{0}"
|
||||||
|
"G^{24,40,48}_{0}" -> "G^{24,24,40}_{0}"
|
||||||
|
"G^{24,40,48}_{0}" -> "G^{16,24,40}_{0}"
|
||||||
|
"G^{24,40,48}_{0}" -> "G^{6,40,48}_{0}"
|
||||||
|
"G^{24,40,48}_{0}" -> "G^{8,40,48}_{0}"
|
||||||
|
"G^{24,40,54}_{0}" -> "G^{18,24,40}_{0}"
|
||||||
|
"G^{24,40,54}_{0}" -> "G^{6,40,54}_{0}"
|
||||||
|
"G^{24,40,54}_{0}" -> "G^{8,40,54}_{0}"
|
||||||
|
"G^{24,40,54}_{2}" -> "G^{18,24,40}_{0}"
|
||||||
|
"G^{24,40,54}_{2}" -> "G^{6,40,54}_{2}"
|
||||||
|
"G^{24,40,54}_{2}" -> "G^{8,40,54}_{2}"
|
||||||
|
"G^{24,48,48}_{0}" -> "G^{24,24,48}_{1}"
|
||||||
|
"G^{24,48,48}_{0}" -> "G^{16,24,48}_{1}"
|
||||||
|
"G^{24,48,48}_{0}" -> "G^{24,24,48}_{1}"
|
||||||
|
"G^{24,48,48}_{0}" -> "G^{16,24,48}_{1}"
|
||||||
|
"G^{24,48,48}_{0}" -> "G^{6,48,48}_{0}"
|
||||||
|
"G^{24,48,48}_{0}" -> "G^{8,48,48}_{1}"
|
||||||
|
"G^{24,48,48}_{1}" -> "G^{24,24,48}_{0}"
|
||||||
|
"G^{24,48,48}_{1}" -> "G^{16,24,48}_{0}"
|
||||||
|
"G^{24,48,48}_{1}" -> "G^{24,24,48}_{0}"
|
||||||
|
"G^{24,48,48}_{1}" -> "G^{16,24,48}_{0}"
|
||||||
|
"G^{24,48,48}_{1}" -> "G^{6,48,48}_{0}"
|
||||||
|
"G^{24,48,48}_{1}" -> "G^{8,48,48}_{0}"
|
||||||
|
"G^{24,48,54}_{0}" -> "G^{18,24,48}_{0}"
|
||||||
|
"G^{24,48,54}_{0}" -> "G^{24,24,54}_{0}"
|
||||||
|
"G^{24,48,54}_{0}" -> "G^{16,24,54}_{2}"
|
||||||
|
"G^{24,48,54}_{0}" -> "G^{6,48,54}_{0}"
|
||||||
|
"G^{24,48,54}_{0}" -> "G^{8,48,54}_{0}"
|
||||||
|
"G^{24,48,54}_{2}" -> "G^{18,24,48}_{0}"
|
||||||
|
"G^{24,48,54}_{2}" -> "G^{24,24,54}_{0}"
|
||||||
|
"G^{24,48,54}_{2}" -> "G^{16,24,54}_{0}"
|
||||||
|
"G^{24,48,54}_{2}" -> "G^{6,48,54}_{2}"
|
||||||
|
"G^{24,48,54}_{2}" -> "G^{8,48,54}_{2}"
|
||||||
|
"G^{24,54,54}_{0}" -> "G^{18,24,54}_{0}"
|
||||||
|
"G^{24,54,54}_{0}" -> "G^{18,24,54}_{2}"
|
||||||
|
"G^{24,54,54}_{0}" -> "G^{6,54,54}_{0}"
|
||||||
|
"G^{24,54,54}_{0}" -> "G^{8,54,54}_{0}"
|
||||||
|
"G^{24,54,54}_{2}" -> "G^{18,24,54}_{0}"
|
||||||
|
"G^{24,54,54}_{2}" -> "G^{18,24,54}_{0}"
|
||||||
|
"G^{24,54,54}_{2}" -> "G^{6,54,54}_{2}"
|
||||||
|
"G^{24,54,54}_{2}" -> "G^{8,54,54}_{2}"
|
||||||
|
"G^{24,54,54}_{8}" -> "G^{18,24,54}_{2}"
|
||||||
|
"G^{24,54,54}_{8}" -> "G^{18,24,54}_{2}"
|
||||||
|
"G^{24,54,54}_{8}" -> "G^{6,54,54}_{8}"
|
||||||
|
"G^{24,54,54}_{8}" -> "G^{8,54,54}_{8}"
|
||||||
|
"G^{26,40,48}_{0}" -> "G^{24,26,40}_{0}"
|
||||||
|
"G^{26,40,48}_{0}" -> "G^{16,26,40}_{0}"
|
||||||
|
"G^{26,40,54}_{0}" -> "G^{18,26,40}_{0}"
|
||||||
|
"G^{26,40,54}_{2}" -> "G^{18,26,40}_{0}"
|
||||||
|
"G^{26,48,48}_{0}" -> "G^{24,26,48}_{1}"
|
||||||
|
"G^{26,48,48}_{0}" -> "G^{16,26,48}_{1}"
|
||||||
|
"G^{26,48,48}_{0}" -> "G^{24,26,48}_{1}"
|
||||||
|
"G^{26,48,48}_{0}" -> "G^{16,26,48}_{1}"
|
||||||
|
"G^{26,48,48}_{1}" -> "G^{24,26,48}_{0}"
|
||||||
|
"G^{26,48,48}_{1}" -> "G^{16,26,48}_{0}"
|
||||||
|
"G^{26,48,48}_{1}" -> "G^{24,26,48}_{0}"
|
||||||
|
"G^{26,48,48}_{1}" -> "G^{16,26,48}_{0}"
|
||||||
|
"G^{26,48,54}_{0}" -> "G^{18,26,48}_{0}"
|
||||||
|
"G^{26,48,54}_{0}" -> "G^{24,26,54}_{2}"
|
||||||
|
"G^{26,48,54}_{0}" -> "G^{16,26,54}_{2}"
|
||||||
|
"G^{26,48,54}_{2}" -> "G^{18,26,48}_{0}"
|
||||||
|
"G^{26,48,54}_{2}" -> "G^{24,26,54}_{0}"
|
||||||
|
"G^{26,48,54}_{2}" -> "G^{16,26,54}_{0}"
|
||||||
|
"G^{26,54,54}_{0}" -> "G^{18,26,54}_{0}"
|
||||||
|
"G^{26,54,54}_{0}" -> "G^{18,26,54}_{2}"
|
||||||
|
"G^{26,54,54}_{2}" -> "G^{18,26,54}_{0}"
|
||||||
|
"G^{26,54,54}_{2}" -> "G^{18,26,54}_{0}"
|
||||||
|
"G^{26,54,54}_{8}" -> "G^{18,26,54}_{2}"
|
||||||
|
"G^{26,54,54}_{8}" -> "G^{18,26,54}_{2}"
|
||||||
|
"G^{40,40,48}_{0}" -> "G^{24,40,40}_{0}"
|
||||||
|
"G^{40,40,48}_{0}" -> "G^{16,40,40}_{0}"
|
||||||
|
"G^{40,40,54}_{0}" -> "G^{18,40,40}_{0}"
|
||||||
|
"G^{40,48,48}_{0}" -> "G^{24,40,48}_{0}"
|
||||||
|
"G^{40,48,48}_{0}" -> "G^{16,40,48}_{0}"
|
||||||
|
"G^{40,48,48}_{0}" -> "G^{24,40,48}_{0}"
|
||||||
|
"G^{40,48,48}_{0}" -> "G^{16,40,48}_{0}"
|
||||||
|
"G^{40,48,54}_{0}" -> "G^{18,40,48}_{0}"
|
||||||
|
"G^{40,48,54}_{0}" -> "G^{24,40,54}_{2}"
|
||||||
|
"G^{40,48,54}_{0}" -> "G^{16,40,54}_{2}"
|
||||||
|
"G^{40,48,54}_{2}" -> "G^{18,40,48}_{0}"
|
||||||
|
"G^{40,48,54}_{2}" -> "G^{24,40,54}_{0}"
|
||||||
|
"G^{40,48,54}_{2}" -> "G^{16,40,54}_{0}"
|
||||||
|
"G^{40,54,54}_{0}" -> "G^{18,40,54}_{0}"
|
||||||
|
"G^{40,54,54}_{0}" -> "G^{18,40,54}_{2}"
|
||||||
|
"G^{40,54,54}_{2}" -> "G^{18,40,54}_{0}"
|
||||||
|
"G^{40,54,54}_{2}" -> "G^{18,40,54}_{0}"
|
||||||
|
"G^{40,54,54}_{8}" -> "G^{18,40,54}_{2}"
|
||||||
|
"G^{40,54,54}_{8}" -> "G^{18,40,54}_{2}"
|
||||||
|
"G^{48,48,48}_{0}" -> "G^{24,48,48}_{1}"
|
||||||
|
"G^{48,48,48}_{0}" -> "G^{16,48,48}_{1}"
|
||||||
|
"G^{48,48,48}_{0}" -> "G^{24,48,48}_{1}"
|
||||||
|
"G^{48,48,48}_{0}" -> "G^{16,48,48}_{1}"
|
||||||
|
"G^{48,48,48}_{0}" -> "G^{24,48,48}_{1}"
|
||||||
|
"G^{48,48,48}_{0}" -> "G^{16,48,48}_{1}"
|
||||||
|
"G^{48,48,48}_{1}" -> "G^{24,48,48}_{0}"
|
||||||
|
"G^{48,48,48}_{1}" -> "G^{16,48,48}_{0}"
|
||||||
|
"G^{48,48,48}_{1}" -> "G^{24,48,48}_{0}"
|
||||||
|
"G^{48,48,48}_{1}" -> "G^{16,48,48}_{0}"
|
||||||
|
"G^{48,48,48}_{1}" -> "G^{24,48,48}_{0}"
|
||||||
|
"G^{48,48,48}_{1}" -> "G^{16,48,48}_{0}"
|
||||||
|
"G^{48,48,54}_{0}" -> "G^{18,48,48}_{0}"
|
||||||
|
"G^{48,48,54}_{0}" -> "G^{24,48,54}_{2}"
|
||||||
|
"G^{48,48,54}_{0}" -> "G^{16,48,54}_{2}"
|
||||||
|
"G^{48,48,54}_{0}" -> "G^{24,48,54}_{0}"
|
||||||
|
"G^{48,48,54}_{0}" -> "G^{16,48,54}_{0}"
|
||||||
|
"G^{48,54,54}_{0}" -> "G^{18,48,54}_{0}"
|
||||||
|
"G^{48,54,54}_{0}" -> "G^{18,48,54}_{2}"
|
||||||
|
"G^{48,54,54}_{0}" -> "G^{24,54,54}_{0}"
|
||||||
|
"G^{48,54,54}_{0}" -> "G^{16,54,54}_{0}"
|
||||||
|
"G^{48,54,54}_{2}" -> "G^{18,48,54}_{0}"
|
||||||
|
"G^{48,54,54}_{2}" -> "G^{18,48,54}_{0}"
|
||||||
|
"G^{48,54,54}_{2}" -> "G^{24,54,54}_{2}"
|
||||||
|
"G^{48,54,54}_{2}" -> "G^{16,54,54}_{2}"
|
||||||
|
"G^{48,54,54}_{8}" -> "G^{18,48,54}_{2}"
|
||||||
|
"G^{48,54,54}_{8}" -> "G^{18,48,54}_{2}"
|
||||||
|
"G^{48,54,54}_{8}" -> "G^{24,54,54}_{8}"
|
||||||
|
"G^{48,54,54}_{8}" -> "G^{16,54,54}_{8}"
|
||||||
|
"G^{54,54,54}_{0}" -> "G^{18,54,54}_{0}"
|
||||||
|
"G^{54,54,54}_{0}" -> "G^{18,54,54}_{0}"
|
||||||
|
"G^{54,54,54}_{0}" -> "G^{18,54,54}_{0}"
|
||||||
|
"G^{54,54,54}_{2}" -> "G^{18,54,54}_{0}"
|
||||||
|
"G^{54,54,54}_{2}" -> "G^{18,54,54}_{8}"
|
||||||
|
"G^{54,54,54}_{2}" -> "G^{18,54,54}_{2}"
|
||||||
|
}
|
2646
data/triangle_groups_morphisms.json
Normal file
2646
data/triangle_groups_morphisms.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -27,6 +27,8 @@
|
|||||||
</h3>
|
</h3>
|
||||||
by Pierre-Emmanuel Caprace, Marston Conder, Marek Kaluba and Stefan Witzel.
|
by Pierre-Emmanuel Caprace, Marston Conder, Marek Kaluba and Stefan Witzel.
|
||||||
|
|
||||||
|
<p>You may also look at the <a href="morphisms/" target="_blank">graph of natural epimorphisms</a> between those groups.</p>
|
||||||
|
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="checkbox" value="" id="renderWithKatex">
|
<input class="form-check-input" type="checkbox" value="" id="renderWithKatex">
|
||||||
<label class="form-check-label" for="renderWithKatex">
|
<label class="form-check-label" for="renderWithKatex">
|
||||||
|
13
docs/main.js
13
docs/main.js
@ -14,3 +14,16 @@ let table = fetch_json(groups_url)
|
|||||||
.then(setup_table)
|
.then(setup_table)
|
||||||
.then(setup_filter)
|
.then(setup_filter)
|
||||||
;
|
;
|
||||||
|
|
||||||
|
let math_objects = document.getElementsByClassName("math");
|
||||||
|
let katex_switch = document.getElementById("renderWithKatex");
|
||||||
|
katex_switch.checked = true;
|
||||||
|
katex_switch.addEventListener(
|
||||||
|
"change",
|
||||||
|
function () {
|
||||||
|
let toggle = this.checked;
|
||||||
|
for (let element of math_objects) {
|
||||||
|
toggleKaTeX(element, toggle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
@ -18,8 +18,8 @@ function createMathSpan(content) {
|
|||||||
math_tex.className = "math-tex";
|
math_tex.className = "math-tex";
|
||||||
katex.render(prepareTextForKatex(math_text.innerText), math_tex);
|
katex.render(prepareTextForKatex(math_text.innerText), math_tex);
|
||||||
|
|
||||||
item.appendChild(math_text);
|
|
||||||
item.appendChild(math_tex);
|
item.appendChild(math_tex);
|
||||||
|
item.appendChild(math_text);
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
@ -40,16 +40,3 @@ function toggleKaTeX(elt, toggle) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let math_objects = document.getElementsByClassName("math");
|
|
||||||
let katex_switch = document.getElementById("renderWithKatex");
|
|
||||||
katex_switch.checked = true;
|
|
||||||
katex_switch.addEventListener(
|
|
||||||
"change",
|
|
||||||
function () {
|
|
||||||
let toggle = this.checked;
|
|
||||||
for (let element of math_objects) {
|
|
||||||
toggleKaTeX(element, toggle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
89
docs/morphisms/index.html
Normal file
89
docs/morphisms/index.html
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/d3@7"></script>
|
||||||
|
|
||||||
|
<!-- Bootstrap -->
|
||||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"
|
||||||
|
integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
|
||||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.1/font/bootstrap-icons.css">
|
||||||
|
|
||||||
|
<!-- KaTeX -->
|
||||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/katex.min.css"
|
||||||
|
integrity="sha384-MlJdn/WNKDGXveldHDdyRP1R4CTHr3FeuDNfhsLPYrq2t0UBkUdK2jyTnXPEK1NQ" crossorigin="anonymous">
|
||||||
|
<!-- The loading of KaTeX is deferred to speed up page rendering -->
|
||||||
|
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/katex.min.js"
|
||||||
|
integrity="sha384-VQ8d8WVFw0yHhCk5E8I86oOhv48xLpnDZx5T9GogA/Y84DcCKWXDmSDfn13bzFZY"
|
||||||
|
crossorigin="anonymous"></script>
|
||||||
|
<!-- To automatically render math in text elements, include the auto-render extension: -->
|
||||||
|
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/contrib/auto-render.min.js"
|
||||||
|
integrity="sha384-+XBljXPPiv+OzfbB3cVmLHf4hdUFHlWNZN5spNQ7rmHTXpd7WvJum6fIACpNNfIR" crossorigin="anonymous"
|
||||||
|
onload="renderMathInElement(document.body);"></script>
|
||||||
|
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style type="text/css">
|
||||||
|
body {
|
||||||
|
background-color: #eee;
|
||||||
|
font-family: "Helvetica", sans-serif;
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.height {
|
||||||
|
height: 100vh
|
||||||
|
}
|
||||||
|
|
||||||
|
.canvas {
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100vh;
|
||||||
|
vertical-align: top;
|
||||||
|
overflow: hidden;
|
||||||
|
border: 1mm black;
|
||||||
|
}
|
||||||
|
.svg-content {
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.math {
|
||||||
|
position: absolute;
|
||||||
|
top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.foreground {
|
||||||
|
opacity: 1;
|
||||||
|
filter: sepia(0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-field {
|
||||||
|
position: relative;
|
||||||
|
/* width: 30%; */
|
||||||
|
z-index: 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="canvas">
|
||||||
|
<!-- <div class="container">
|
||||||
|
<div class="search-field">
|
||||||
|
<label for="exampleDataList" class="form-label">Datalist example</label>
|
||||||
|
<input class="form-control" list="datalistOptions" id="exampleDataList" placeholder="Type to search...">
|
||||||
|
<datalist id="datalistOptions">
|
||||||
|
</datalist>
|
||||||
|
</div>
|
||||||
|
</div> -->
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="../math_render.js"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="js/d3_visualisation.js"></script>
|
||||||
|
<script type="text/javascript" src="js/morphisms.js"></script>
|
||||||
|
|
||||||
|
</html>
|
219
docs/morphisms/js/d3_visualisation.js
vendored
Normal file
219
docs/morphisms/js/d3_visualisation.js
vendored
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
function drag(simulation) {
|
||||||
|
|
||||||
|
function dragstarted(event, d) {
|
||||||
|
if (!event.active) simulation.alphaTarget(0.3).restart();
|
||||||
|
d.fx = d.x;
|
||||||
|
d.fy = d.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
function dragged(event, d) {
|
||||||
|
d.fx = event.x;
|
||||||
|
d.fy = event.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
function dragended(event, d) {
|
||||||
|
if (!event.active) simulation.alphaTarget(0);
|
||||||
|
d.fx = null;
|
||||||
|
d.fy = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return d3.drag()
|
||||||
|
.on("start", dragstarted)
|
||||||
|
.on("drag", dragged)
|
||||||
|
.on("end", dragended);
|
||||||
|
}
|
||||||
|
|
||||||
|
function linkArc(d) {
|
||||||
|
const r = Math.hypot(d.target.x - d.source.x, d.target.y - d.source.y);
|
||||||
|
return `
|
||||||
|
M${d.source.x},${d.source.y}
|
||||||
|
A${r},${r} 0 0,1 ${d.target.x},${d.target.y}
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function highlight(node) {
|
||||||
|
return node.transition()
|
||||||
|
.duration('400')
|
||||||
|
.attr('opacity', 1)
|
||||||
|
.attr('filter', 'sepia(0.0)')
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
function dehighlight(node) {
|
||||||
|
return node.transition()
|
||||||
|
.duration('400')
|
||||||
|
.attr('opacity', 0.3)
|
||||||
|
.attr('filter', 'sepia(0.8)')
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _union(...arr) {
|
||||||
|
return arr.reduce((first, second) => [...new Set(first.concat(second))]);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function create_svg(
|
||||||
|
data,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
) {
|
||||||
|
let links = data.links;
|
||||||
|
let nodes = data.nodes;
|
||||||
|
let types = Array.from(new Set(nodes.map(d => d.level)));
|
||||||
|
let color = d3.scaleOrdinal(types, d3.schemeSet1);
|
||||||
|
|
||||||
|
d3.select("datalist")
|
||||||
|
.selectAll("option")
|
||||||
|
.data(nodes)
|
||||||
|
.join("option")
|
||||||
|
.attr("value", n=>n.id)
|
||||||
|
.text(n=>n.id)
|
||||||
|
|
||||||
|
const simulation = d3.forceSimulation(nodes)
|
||||||
|
.force("link", d3.forceLink(links).id(d => d.id))
|
||||||
|
.force("charge", d3.forceManyBody().strength(-400))
|
||||||
|
.force("center", d3.forceCenter(width/2, height/2))
|
||||||
|
.force("x", d3.forceX())
|
||||||
|
.force("y", d3.forceY());
|
||||||
|
|
||||||
|
const svg = d3.create("svg")
|
||||||
|
.attr("preserveAspectRatio", "xMinYMin meet")
|
||||||
|
.attr("viewBox", [0, 0, width, height])
|
||||||
|
.classed("svg-content", true)
|
||||||
|
.style("font", "12px sans-serif");
|
||||||
|
|
||||||
|
// Per-type markers, as they don't inherit styles.
|
||||||
|
svg.append("defs").selectAll("marker")
|
||||||
|
.data(types)
|
||||||
|
.join("marker")
|
||||||
|
.attr("id", d => `arrow-${d}`)
|
||||||
|
.attr("viewBox", "0 -5 10 10")
|
||||||
|
.attr("refX", 15)
|
||||||
|
.attr("refY", 0)
|
||||||
|
.attr("markerWidth", 6)
|
||||||
|
.attr("markerHeight", 6)
|
||||||
|
.attr("orient", "auto")
|
||||||
|
.append("path")
|
||||||
|
.attr("fill", d=>color(d))
|
||||||
|
.attr("d", "M0,-5 L10,0 L0,5 z")
|
||||||
|
;
|
||||||
|
|
||||||
|
const svg_content = svg.append("g")
|
||||||
|
|
||||||
|
const link = svg_content.append("g")
|
||||||
|
.attr("fill", "none")
|
||||||
|
.attr("stroke-width", 1.5)
|
||||||
|
.selectAll("path")
|
||||||
|
.data(links)
|
||||||
|
.join("path")
|
||||||
|
.attr("stroke", d => color(d.source.level))
|
||||||
|
.attr("marker-end", d => `url(${new URL(`#arrow-${d.source.level}`, location)})`)
|
||||||
|
.attr("opacity", 0.3)
|
||||||
|
.attr("filter", "sepia(0.8)")
|
||||||
|
;
|
||||||
|
|
||||||
|
function find_descendants(node) {
|
||||||
|
let desc = links.filter(l => l.source.id == node.id );
|
||||||
|
if (desc.length == 0) {
|
||||||
|
return []
|
||||||
|
} else {
|
||||||
|
let all_desc = desc
|
||||||
|
.map(d => find_descendants(d.target))
|
||||||
|
.reduce(
|
||||||
|
(total, item) => Array.from(new Set(total.concat(item))),
|
||||||
|
desc.map(l=>l.target)
|
||||||
|
)
|
||||||
|
;
|
||||||
|
return all_desc;
|
||||||
|
// return _union(desc, _union(...desc.map(l=>find_descendants(l.target))));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const descendants = {};
|
||||||
|
|
||||||
|
nodes.forEach((node) => {
|
||||||
|
let desc = find_descendants(node);
|
||||||
|
desc.push(node)
|
||||||
|
descendants[node.id] = desc;
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(descendants)
|
||||||
|
|
||||||
|
function foreground_descendants(id) {
|
||||||
|
node.classed("foreground", (n) => {
|
||||||
|
return (descendants[id].find(v => v.id == n.id)) ? true : false;
|
||||||
|
});
|
||||||
|
|
||||||
|
link.classed("foreground", (n) => {
|
||||||
|
let verts = descendants[id]
|
||||||
|
return (verts.includes(n.source) && verts.includes(n.target)) ? true : false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
d3.select("input").on("input", function () {
|
||||||
|
let id = this.value;
|
||||||
|
let n = nodes.find(n => n.id == id)
|
||||||
|
if (n) {
|
||||||
|
foreground_descendants(id)
|
||||||
|
|
||||||
|
svg.transition()
|
||||||
|
.duration(750)
|
||||||
|
.call(zoom.transform, d3.zoomIdentity);
|
||||||
|
|
||||||
|
zoom.translateTo(svg.transition().duration(750), n.x, n.y)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const node = svg_content.append("g")
|
||||||
|
.attr("stroke-linecap", "round")
|
||||||
|
.attr("stroke-linejoin", "round")
|
||||||
|
.selectAll("g")
|
||||||
|
.data(nodes)
|
||||||
|
.join("g")
|
||||||
|
.attr("class", d=>d.id)
|
||||||
|
.attr("opacity", 0.3)
|
||||||
|
.attr("filter", "sepia(0.8)")
|
||||||
|
.on("mouseover", function (d, i) {
|
||||||
|
highlight(d3.select(this));
|
||||||
|
})
|
||||||
|
.on("mouseout", function (d, i) {
|
||||||
|
dehighlight(d3.select(this))
|
||||||
|
})
|
||||||
|
.on("click", function (d, i) {
|
||||||
|
console.log(this)
|
||||||
|
let id = this.classList[0];
|
||||||
|
foreground_descendants(id);
|
||||||
|
})
|
||||||
|
.call(drag(simulation));
|
||||||
|
|
||||||
|
// circles for nodes:
|
||||||
|
node.append("circle")
|
||||||
|
.attr("stroke", "white")
|
||||||
|
.attr("stroke-width", 1.5)
|
||||||
|
.attr("r", 5)
|
||||||
|
.attr("fill", d => color(d.level));
|
||||||
|
|
||||||
|
node.append("foreignObject")
|
||||||
|
.attr("x", 10)
|
||||||
|
.attr("y", "0.31em")
|
||||||
|
.clone(true).lower()
|
||||||
|
.attr("fill", "none")
|
||||||
|
.attr("stroke", "white")
|
||||||
|
.attr("stroke-width", 5)
|
||||||
|
.append(d => createMathSpan(d.id));
|
||||||
|
|
||||||
|
const zoom = d3.zoom()
|
||||||
|
.scaleExtent([0.2, 5])
|
||||||
|
.on("zoom", (e) => {
|
||||||
|
console.log(e.transform)
|
||||||
|
svg_content.attr("transform", e.transform)
|
||||||
|
});
|
||||||
|
|
||||||
|
svg.call(zoom)
|
||||||
|
|
||||||
|
simulation.on("tick", () => {
|
||||||
|
link.attr("d", linkArc);
|
||||||
|
node.attr("transform", d => `translate(${d.x},${d.y})`);
|
||||||
|
});
|
||||||
|
|
||||||
|
return svg;
|
||||||
|
}
|
71
docs/morphisms/js/morphisms.js
Normal file
71
docs/morphisms/js/morphisms.js
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
const morphisms_url = new URL("https://raw.githubusercontent.com/kalmarek/SmallHyperbolic/master/data/triangle_groups_morphisms.json")
|
||||||
|
|
||||||
|
async function fetch_json(url) {
|
||||||
|
try {
|
||||||
|
let response = await fetch(url);
|
||||||
|
let json = await response.json();
|
||||||
|
return json;
|
||||||
|
} catch (err) {
|
||||||
|
console.log("Error while fetching json:" + err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
async function place_svg(svg) {
|
||||||
|
d3.select("div.canvas")
|
||||||
|
.append("div")
|
||||||
|
.attr("class", "container-fluid")
|
||||||
|
.attr("class", "svg-container")
|
||||||
|
.node()
|
||||||
|
.appendChild(svg.node())
|
||||||
|
;
|
||||||
|
};
|
||||||
|
|
||||||
|
async function add_search() {
|
||||||
|
let input_grp = d3.select("div.canvas")
|
||||||
|
.append("div")
|
||||||
|
.classed("search-field", true)
|
||||||
|
.append("div")
|
||||||
|
.classed("container", true)
|
||||||
|
;
|
||||||
|
|
||||||
|
let input = input_grp.insert("input")
|
||||||
|
.attr("class", "form-control")
|
||||||
|
.attr("list", "datalistOptions")
|
||||||
|
.attr("id", "groupSearch")
|
||||||
|
.attr("placeholder", "Type to search...")
|
||||||
|
;
|
||||||
|
|
||||||
|
input_grp.insert("datalist")
|
||||||
|
.attr("id", "datalistOptions")
|
||||||
|
;
|
||||||
|
|
||||||
|
input_grp.insert("div")
|
||||||
|
.classed("form-text", true)
|
||||||
|
.text("Or click to highlight descendants")
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function switch_katex(toggle=true) {
|
||||||
|
let math_objects = document.getElementsByClassName("math");
|
||||||
|
for (let elt of math_objects) {
|
||||||
|
toggleKaTeX(elt, toggle);
|
||||||
|
let fObj = elt.parentElement;
|
||||||
|
let rect = elt.getElementsByClassName("math-tex")[0].getBoundingClientRect();
|
||||||
|
fObj.setAttribute("width", rect.width+4);
|
||||||
|
fObj.setAttribute("height", rect.height+4);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
add_search()
|
||||||
|
|
||||||
|
fetch_json(morphisms_url)
|
||||||
|
// .then(async (data) => { console.log(data); return data;})
|
||||||
|
.then(async (data) => {
|
||||||
|
return create_svg(data, window.innerWidth, window.innerHeight);
|
||||||
|
})
|
||||||
|
// .then(async (data) => { console.log(data); return data; })
|
||||||
|
.then(place_svg)
|
||||||
|
.then(switch_katex)
|
||||||
|
// .then(add_search)
|
||||||
|
;
|
||||||
|
|
41
scripts/morphisms/morphisms.py
Normal file
41
scripts/morphisms/morphisms.py
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
import networkx
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
|
||||||
|
DATA_DIR = os.path.join("..", "..", "data")
|
||||||
|
|
||||||
|
MORPHISMS_FILE = os.path.join(DATA_DIR, "morphisms.dot")
|
||||||
|
MORPHISMS_JSON = os.path.join(DATA_DIR, "triangle_groups_morphisms.json")
|
||||||
|
|
||||||
|
def level(G, node):
|
||||||
|
parents = list(G.predecessors(node))
|
||||||
|
if len(parents) == 0:
|
||||||
|
return 0
|
||||||
|
else:
|
||||||
|
return 1 + max([level(G, n) for n in parents])
|
||||||
|
|
||||||
|
def nodes_from_component(G, cc, graph_json):
|
||||||
|
subG = networkx.induced_subgraph(G, cc)
|
||||||
|
assert networkx.is_weakly_connected(subG)
|
||||||
|
|
||||||
|
root = [n for n,d in subG.in_degree() if d==0][0]
|
||||||
|
|
||||||
|
for node in graph_json["nodes"]:
|
||||||
|
if node["id"] in subG:
|
||||||
|
print(node)
|
||||||
|
n = node["id"]
|
||||||
|
node["level"] = level(G, n)
|
||||||
|
node["component_id"] = root
|
||||||
|
|
||||||
|
return graph_json
|
||||||
|
|
||||||
|
G = networkx.nx_pydot.read_dot(MORPHISMS_FILE)
|
||||||
|
G_json = networkx.node_link_data(G)
|
||||||
|
G_components = networkx.weakly_connected_components(G)
|
||||||
|
|
||||||
|
for cc in G_components:
|
||||||
|
nodes_from_component(G, cc, G_json)
|
||||||
|
|
||||||
|
with open(MORPHISMS_JSON, "w") as file:
|
||||||
|
print("writing to ", MORPHISMS_JSON, "\n")
|
||||||
|
json.dump(G_json, file, indent=4)
|
Loading…
Reference in New Issue
Block a user