-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlocal_homology.go
106 lines (100 loc) · 2.9 KB
/
local_homology.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package golsv
// xxx test; needed?
// func CycleIsInD2Image(alpha Path) bool {
// expander := NewTriangleExpander(alpha, -1)
// expander.Expand()
// relevantTriangles := expander.Triangles()
// Y := ComplexFromTriangles(relevantTriangles, false)
// log.Printf("Y: %v", Y)
// if Y.D2ImageContainsPath(alpha) {
// log.Printf("d_2|Y image contains alpha")
// return true
// } else {
// log.Printf("d_2|Y image does not contain alpha")
// log.Printf("systole is at most %d", len(alpha))
// return false
// }
// }
// xxx test; deprecate?
// func CycleIsInD2ImageGraded(lsv *LsvContext, alpha Path, sortBases bool, verbose bool) bool {
// for maxDepth := 0; maxDepth < 1000; maxDepth++ {
// expander := NewTriangleExpander(lsv, alpha, maxDepth, verbose)
// exhausted := expander.Expand()
// relevantTriangles := expander.Triangles()
// Y := ComplexFromTriangles(relevantTriangles, sortBases, verbose)
// if verbose {
// log.Printf("Y[grade %d]: %v", maxDepth, Y)
// log.Printf("exhausted: %v", exhausted)
// }
// // log.Printf("bases: %v", Y.DumpBases())
// if Y.D2ImageContainsPath(alpha) {
// if verbose {
// log.Printf("d_2|Y[%d] image contains alpha", maxDepth)
// }
// return true
// } else {
// if verbose {
// log.Printf("d_2|Y[%d] image does not contain alpha", maxDepth)
// }
// if exhausted {
// if verbose {
// log.Printf("systole is at most %d", len(alpha))
// }
// return false
// }
// }
// }
// return false
// }
// xxx test; needed?
// func ComplexFromGradedTriangles(alpha Path, maxDepth int, sortBases bool) *Complex {
// expander := NewTriangleExpander(alpha, maxDepth)
// expander.Expand()
// relevantTriangles := expander.Triangles()
// return ComplexFromTriangles(relevantTriangles, sortBases)
// }
// xxx test
func FindTriangleContainingEdge(lsv *LsvContext, T []Triangle, e Edge) *Triangle {
for _, t := range T {
if g, found := t.OrbitContainsEdge(lsv, e); found {
translation := t.Translate(lsv, g)
return &translation
}
}
return nil
}
func AllTrianglesContainingEdge(lsv *LsvContext, T []Triangle, e Edge) []Triangle {
triangles := make(map[Triangle]any)
for _, t := range T {
if g, found := t.OrbitContainsEdge(lsv, e); found {
translation := t.Translate(lsv, g)
triangles[translation] = nil
}
}
// log.Printf("found %d triangles containing edge %v", len(triangles), e)
result := make([]Triangle, len(triangles))
i := 0
for t, _ := range triangles {
result[i] = t
i++
}
return result
}
func AllTrianglesSharingEdgeWithTriangle(lsv *LsvContext, T []Triangle, t Triangle) []Triangle {
triangles := make(map[Triangle]any)
for _, e := range t.Edges() {
for _, u := range AllTrianglesContainingEdge(lsv, T, e) {
if t.Equal(lsv, &u) {
continue
}
triangles[u] = nil
}
}
result := make([]Triangle, len(triangles))
i := 0
for u, _ := range triangles {
result[i] = u
i++
}
return result
}