1
- # cython: wraparound=False, boundscheck=False
2
1
r """
3
2
Cython helper methods to compute integral points in polyhedra.
4
3
"""
@@ -19,16 +18,11 @@ import itertools
19
18
20
19
from sage.matrix.constructor import matrix, column_matrix, vector, diagonal_matrix
21
20
from sage.rings.integer_ring import ZZ
22
- from sage.rings.rational_field import QQ
23
- from sage.rings.real_mpfr import RR
24
21
from sage.rings.integer cimport Integer
25
- from sage.arith.misc import GCD as gcd
22
+ from sage.arith.misc import gcd
26
23
from sage.arith.functions import lcm
27
- from sage.combinat.permutation import Permutation
28
24
from sage.misc.misc_c import prod
29
25
from sage.modules.free_module import FreeModule
30
- from sage.modules.vector_integer_dense cimport Vector_integer_dense
31
- from sage.matrix.matrix_integer_dense cimport Matrix_integer_dense
32
26
33
27
# #############################################################################
34
28
# The basic idea to enumerate the lattice points in the parallelotope
@@ -140,8 +134,8 @@ cpdef tuple parallelotope_points(spanning_points, lattice):
140
134
sage: len( parallelotope_points( rays, ZZ^ 4))
141
135
967
142
136
"""
143
- cdef Matrix_integer_dense VDinv
144
- cdef Matrix_integer_dense R = matrix(spanning_points).transpose()
137
+ cdef MatrixClass VDinv
138
+ cdef MatrixClass R = matrix(spanning_points).transpose()
145
139
e, d, VDinv = ray_matrix_normal_form(R)
146
140
cdef tuple points = loop_over_parallelotope_points(e, d, VDinv, R, lattice)
147
141
for p in points:
@@ -183,8 +177,8 @@ cpdef tuple ray_matrix_normal_form(R):
183
177
184
178
185
179
# The optimized version avoids constructing new matrices, vectors, and lattice points
186
- cpdef tuple loop_over_parallelotope_points(e, d, Matrix_integer_dense VDinv,
187
- Matrix_integer_dense R, lattice,
180
+ cpdef tuple loop_over_parallelotope_points(e, d, MatrixClass VDinv,
181
+ MatrixClass R, lattice,
188
182
A = None , b = None ):
189
183
r """
190
184
The inner loop of :func:`parallelotope_points`.
@@ -224,7 +218,7 @@ cpdef tuple loop_over_parallelotope_points(e, d, Matrix_integer_dense VDinv,
224
218
s = ZZ.zero() # summation variable
225
219
cdef list gens = []
226
220
gen = lattice(ZZ.zero())
227
- cdef Vector_integer_dense q_times_d = vector(ZZ, dim)
221
+ cdef VectorClass q_times_d = vector(ZZ, dim)
228
222
for base in itertools.product(* [ range (i) for i in e ]):
229
223
for i in range (dim):
230
224
s = ZZ.zero()
@@ -308,15 +302,15 @@ cpdef tuple simplex_points(vertices):
308
302
cdef list rays = [vector(ZZ, list (v)) for v in vertices]
309
303
if not rays:
310
304
return ()
311
- cdef Vector_integer_dense origin = rays.pop()
305
+ cdef VectorClass origin = rays.pop()
312
306
origin.set_immutable()
313
307
if not rays:
314
308
return (origin,)
315
309
translate_points(rays, origin)
316
310
317
311
# Find equation Ax<=b that cuts out simplex from parallelotope
318
- cdef Matrix_integer_dense Rt = matrix(ZZ, rays)
319
- cdef Matrix_integer_dense R = Rt.transpose()
312
+ cdef MatrixClass Rt = matrix(ZZ, rays)
313
+ cdef MatrixClass R = Rt.transpose()
320
314
cdef int nrays = len (rays)
321
315
cdef Integer b
322
316
M = FreeModule(ZZ, nrays)
@@ -335,7 +329,7 @@ cpdef tuple simplex_points(vertices):
335
329
return points
336
330
337
331
338
- cdef translate_points(v_list, Vector_integer_dense delta):
332
+ cdef translate_points(v_list, VectorClass delta):
339
333
r """
340
334
Add ``delta`` to each vector in ``v_list``.
341
335
"""
@@ -568,7 +562,7 @@ cpdef rectangular_box_points(list box_min, list box_max,
568
562
return loop_over_rectangular_box_points( box_min, box_max, inequalities, d, count_only)
569
563
570
564
cdef list points = []
571
- cdef Vector_integer_dense v = vector( ZZ, d)
565
+ cdef VectorClass v = vector( ZZ, d)
572
566
if not return_saturated:
573
567
for p in loop_over_rectangular_box_points( box_min, box_max, inequalities, d, count_only) :
574
568
# v = vector( ZZ, perm_action( orig_perm, p)) # too slow
0 commit comments