summaryrefslogtreecommitdiff
path: root/src/cython/gudhi.pyx
blob: dd87f4bb4aa36ad5166bebc9cc33a17b21d3631e (plain)
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
from cython cimport numeric
from libcpp.vector cimport vector
from libcpp.utility cimport pair

cimport cgudhi


# SimplexTree python interface
cdef class SimplexTree:
    cdef cgudhi.Simplex_tree_interface[cgudhi.Simplex_tree_options_full_featured] *thisptr
    def __cinit__(self, points=None, max_dimension=3, max_edge_length=float('inf')):
        self.thisptr = new cgudhi.Simplex_tree_interface[cgudhi.Simplex_tree_options_full_featured]()
        # Constructor from graph expansion
        if points is not None:
            self.thisptr.graph_expansion(points,max_dimension,max_edge_length)
    def __dealloc__(self):
        if self.thisptr != NULL:
            del self.thisptr
    def get_filtration(self):
        return self.thisptr.filtration()
    def filtration(self, simplex):
        return self.thisptr.simplex_filtration(simplex)
    def set_filtration(self, filtration):
        self.thisptr.set_filtration(<double>filtration)
    def initialize_filtration(self):
        self.thisptr.initialize_filtration()
    def num_vertices(self):
        return self.thisptr.num_vertices()
    def num_simplices(self):
        return self.thisptr.num_simplices()
    def dimension(self):
        return self.thisptr.dimension()
    def set_dimension(self, dim):
        self.thisptr.set_dimension(<int>dim)
    def find(self, simplex):
        cdef vector[int] complex
        for i in simplex:
          complex.push_back(i)
        return self.thisptr.find_simplex(complex)
    def insert(self, simplex, filtration = 0.0):
        cdef vector[int] complex
        for i in simplex:
          complex.push_back(i)
        return self.thisptr.insert_simplex(complex, <double>filtration)
    def insert_with_subfaces(self, simplex, filtration = 0.0):
        cdef vector[int] complex
        for i in simplex:
          complex.push_back(i)
        return self.thisptr.insert_simplex_and_subfaces(complex, <double>filtration)
    def get_filtered_tree(self):
        cdef vector[pair[vector[int], double]] coface_tree = self.thisptr.get_filtered_tree()
        ct = []
        for filtered_complex in coface_tree:
            v = []
            for vertex in filtered_complex.first:
                v.append(vertex)
            ct.append((v,filtered_complex.second))
        return ct
    def get_skeleton_tree(self, dim):
        cdef vector[pair[vector[int], double]] coface_tree = self.thisptr.get_skeleton_tree(<int>dim)
        ct = []
        for filtered_complex in coface_tree:
            v = []
            for vertex in filtered_complex.first:
                v.append(vertex)
            ct.append((v,filtered_complex.second))
        return ct
    def get_star_tree(self, simplex):
        cdef vector[int] complex
        for i in simplex:
          complex.push_back(i)
        cdef vector[pair[vector[int], double]] coface_tree = self.thisptr.get_star_tree(complex)
        ct = []
        for filtered_complex in coface_tree:
            v = []
            for vertex in filtered_complex.first:
                v.append(vertex)
            ct.append((v,filtered_complex.second))
        return ct
    def get_coface_tree(self, simplex, dim):
        cdef vector[int] complex
        for i in simplex:
          complex.push_back(i)
        cdef vector[pair[vector[int], double]] coface_tree = self.thisptr.get_coface_tree(complex, <int>dim)
        ct = []
        for filtered_complex in coface_tree:
            v = []
            for vertex in filtered_complex.first:
                v.append(vertex)
            ct.append((v,filtered_complex.second))
        return ct


cdef class MiniSimplexTree:
    cdef cgudhi.Simplex_tree_interface[cgudhi.Simplex_tree_options_mini] *thisptr
    def __cinit__(self):
        self.thisptr = new cgudhi.Simplex_tree_interface[cgudhi.Simplex_tree_options_mini]()
    def __dealloc__(self):
        if self.thisptr != NULL:
            del self.thisptr
    def num_vertices(self):
        return self.thisptr.num_vertices()
    def num_simplices(self):
        return self.thisptr.num_simplices()
    def dimension(self):
        return self.thisptr.dimension()
    def set_dimension(self, dim):
        self.thisptr.set_dimension(<int>dim)
    def find(self, simplex):
        cdef vector[int] complex
        for i in simplex:
          complex.push_back(i)
        return self.thisptr.find_simplex(complex)
    def insert(self, simplex):
        cdef vector[int] complex
        for i in simplex:
          complex.push_back(i)
        return self.thisptr.insert_simplex(complex, 0.0)
    def insert_with_subfaces(self, simplex, filtration = 0.0):
        cdef vector[int] complex
        for i in simplex:
          complex.push_back(i)
        return self.thisptr.insert_simplex_and_subfaces(complex, <double>filtration)
    def get_filtered_tree(self):
        cdef vector[pair[vector[int], double]] coface_tree = self.thisptr.get_filtered_tree()
        ct = []
        for filtered_complex in coface_tree:
            v = []
            for vertex in filtered_complex.first:
                v.append(vertex)
            ct.append((v,filtered_complex.second))
        return ct
    def get_skeleton_tree(self, dim):
        cdef vector[pair[vector[int], double]] coface_tree = self.thisptr.get_skeleton_tree(<int>dim)
        ct = []
        for filtered_complex in coface_tree:
            v = []
            for vertex in filtered_complex.first:
                v.append(vertex)
            ct.append((v,filtered_complex.second))
        return ct
    def get_star_tree(self, simplex):
        cdef vector[int] complex
        for i in simplex:
          complex.push_back(i)
        cdef vector[pair[vector[int], double]] coface_tree = self.thisptr.get_star_tree(complex)
        ct = []
        for filtered_complex in coface_tree:
            v = []
            for vertex in filtered_complex.first:
                v.append(vertex)
            ct.append((v,filtered_complex.second))
        return ct
    def get_coface_tree(self, simplex, dim):
        cdef vector[int] complex
        for i in simplex:
          complex.push_back(i)
        cdef vector[pair[vector[int], double]] coface_tree = self.thisptr.get_coface_tree(complex, <int>dim)
        ct = []
        for filtered_complex in coface_tree:
            v = []
            for vertex in filtered_complex.first:
                v.append(vertex)
            ct.append((v,filtered_complex.second))
        return ct