Skip to content

Commit 4330de3

Browse files
authored
Refactor GraverBasis methods for ambient vectors
1 parent 4f0442a commit 4330de3

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

src/sage/matrix/matrix_integer_dense.pyx

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ from sage.misc.verbose import verbose, get_verbose
7373
from sage.arith.misc import previous_prime
7474
from sage.arith.long cimport integer_check_long_py
7575
from sage.arith.power cimport generic_power
76-
from sage.structure.element cimport Element
76+
from sage.structure.element cimport Element, Vector
7777
from sage.structure.proof.proof import get_flag as get_proof_flag
7878
from sage.structure.richcmp cimport rich_to_bool
7979
from sage.misc.randstate cimport randstate, current_randstate
@@ -88,11 +88,10 @@ from sage.rings.rational_field import QQ
8888
from sage.rings.real_double import RDF
8989
from sage.rings.integer_ring import ZZ, IntegerRing_class
9090
from sage.rings.integer_ring cimport IntegerRing_class
91+
from sage.matrix.matrix_dense cimport Matrix_dense
9192
from sage.rings.finite_rings.integer_mod_ring import IntegerModRing
9293
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
9394
from sage.rings.polynomial.polynomial_integer_dense_flint cimport Polynomial_integer_dense_flint
94-
from sage.structure.element cimport Element, Vector
95-
9695
from sage.rings.finite_rings.finite_field_constructor import GF
9796

9897

@@ -101,8 +100,9 @@ from sage.matrix.matrix2 import decomp_seq
101100
from sage.matrix.matrix cimport Matrix
102101
from sage.matrix.constructor import matrix
103102
cimport sage.structure.element
104-
from sage.rings.integer_ring import ZZ
105103
import sage.matrix.matrix_space as matrix_space
104+
from sage.modules.free_module_element import vector # to use in GraverBasis.orthogonal_range_search
105+
106106

107107
################
108108
# Used for modular HNF
@@ -152,7 +152,7 @@ class GraverBasis:
152152
def __iter__(self):
153153
"""To Iterate over the Graver basis vectors (each to return as a vector in ZZ^n)."""
154154
for i in range(self._nrows):
155-
yield self._basis_matrix.row(i) # To return each row as a Sage vector (element of ZZ^n)
155+
yield self._ambient(self._basis_matrix.row(i)) # To return each row as a Sage vector (element of ZZ^n)
156156

157157
def __len__(self):
158158
"""To return the number of vectors in the Graver basis."""
@@ -172,7 +172,7 @@ class GraverBasis:
172172
index += self._nrows
173173
if index < 0 or index >= self._nrows:
174174
raise IndexError("GraverBasis index out of range")
175-
return self._basis_matrix.row(index)
175+
return self._ambient(self._basis_matrix.row(index))
176176

177177
def orthogonal_range_search(self, l, u):
178178
r"""
@@ -202,8 +202,14 @@ class GraverBasis:
202202
....: def __init__(self, amb): self._ambient = amb
203203
....: def __iter__(self): return _fake_iter()
204204
....: def orthogonal_range_search(self, l, u):
205-
....: # Reuse the library implementation for filtering:
206-
....: return GraverBasis.orthogonal_range_search(self, l, u)
205+
....: # To Inline the small filter: avoid referring to GraverBasis in doctest scope
206+
....: l_vec = vector(ZZ, l); u_vec = vector(ZZ, u)
207+
....: n = self._ambient.rank()
208+
....: def _gen():
209+
....: for v in self:
210+
....: w = self._ambient(v)
211+
....: if all(l_vec[i] <= w[i] <= u_vec[i] for i in range(n)): ....: yield w
212+
....: return _gen()
207213
sage: G = _GB(amb)
208214
sage: list(G.orthogonal_range_search([0,0,0], [2,2,2]))
209215
[(0, 1, 2), (1, 1, 1)]
@@ -959,7 +965,7 @@ cdef class Matrix_integer_dense(Matrix_dense):
959965
sig_off()
960966
return M
961967

962-
def graver_basis(self):
968+
cpdef graver_basis(self):
963969
r"""
964970
To Compute the Graver basis of this integer matrix.
965971

0 commit comments

Comments
 (0)