Skip to content
86 changes: 49 additions & 37 deletions src/sage/modules/free_module_element.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -1920,15 +1920,20 @@ cdef class FreeModuleElement(Vector): # abstract base class

def get(self, i):
"""
Like ``__getitem__`` but without bounds checking:
`i` must satisfy ``0 <= i < self.degree``.
Return the `i`-th entry of ``self``.

This is equivalent to ``self[i]``.

EXAMPLES::

sage: vector(SR, [1/2,2/5,0]).get(0) # needs sage.symbolic
1/2
sage: zero_vector(3).get(5)
Traceback (most recent call last):
...
IndexError: vector index out of range
"""
return self.get_unsafe(i)
return self[i]

def __setitem__(self, i, value):
"""
Expand Down Expand Up @@ -1982,19 +1987,23 @@ cdef class FreeModuleElement(Vector): # abstract base class

def set(self, i, value):
"""
Like ``__setitem__`` but without type or bounds checking:
`i` must satisfy ``0 <= i < self.degree`` and ``value`` must be
an element of the coordinate ring.
Set the `i`-th entry of ``self`` to ``value``.

This is equivalent to ``self[i] = value``.

EXAMPLES::

sage: v = vector(SR, [1/2,2/5,0]); v # needs sage.symbolic
sage: # needs sage.symbolic
sage: v = vector(SR, [1/2,2/5,0]); v
(1/2, 2/5, 0)
sage: v.set(2, pi); v # needs sage.symbolic
sage: v.set(2, pi); v
(1/2, 2/5, pi)
sage: v.set(5, 1)
Traceback (most recent call last):
...
IndexError: vector index out of range
"""
assert value.parent() is self.coordinate_ring()
self.set_unsafe(i, value)
self[i] = value

def __invert__(self):
"""
Expand Down Expand Up @@ -4667,12 +4676,13 @@ cdef class FreeModuleElement_generic_dense(FreeModuleElement):

@cython.boundscheck(False)
@cython.wraparound(False)
cdef get_unsafe(self, Py_ssize_t i):
cpdef get_unsafe(self, Py_ssize_t i):
"""
EXAMPLES::

sage: v = vector(RR, [-1,0,2/3,pi]) # needs sage.symbolic
sage: v.get(3) # needs sage.symbolic
sage: # needs sage.symbolic
sage: v = vector(RR, [-1,0,2/3,pi])
sage: v.get_unsafe(3)
3.14159265358979

::
Expand Down Expand Up @@ -4704,13 +4714,15 @@ cdef class FreeModuleElement_generic_dense(FreeModuleElement):

@cython.boundscheck(False)
@cython.wraparound(False)
cdef int set_unsafe(self, Py_ssize_t i, value) except -1:
cpdef int set_unsafe(self, Py_ssize_t i, value) except -1:
"""
EXAMPLES::

sage: v = vector(RR, [-1, 0, 2/3, pi]) # needs sage.symbolic
sage: v.set(3, RR(1)) # needs sage.symbolic
sage: v # needs sage.symbolic
sage: # needs sage.symbolic
sage: v = vector(RR, [-1, 0, 2/3, pi])
sage: v.set_unsafe(3, RR(1))
0
sage: v
(-1.00000000000000, 0.000000000000000, 0.666666666666667, 1.00000000000000)
"""
self._entries[i] = value
Expand Down Expand Up @@ -5298,27 +5310,27 @@ cdef class FreeModuleElement_generic_sparse(FreeModuleElement):
raise IndexError("vector index out of range")
return self.get_unsafe(n)

cdef get_unsafe(self, Py_ssize_t i):
cpdef get_unsafe(self, Py_ssize_t i):
"""
EXAMPLES::

sage: v = vector([-1,0,2/3,pi], sparse=True) # needs sage.symbolic
sage: v.get(1) # needs sage.symbolic
sage: # needs sage.symbolic
sage: v = vector([-1,0,2/3,pi], sparse=True)
sage: v.get_unsafe(1)
0
sage: v.get(2) # needs sage.symbolic
sage: v.get_unsafe(2)
2/3

For this class, 0 is returned if the access is out of bounds::

sage: v.get(10) # needs sage.symbolic
0
sage: v.get(10)
Traceback (most recent call last):
...
IndexError: vector index out of range
"""
try:
return self._entries[i]
except KeyError:
return self.coordinate_ring().zero()

cdef int set_unsafe(self, Py_ssize_t i, value) except -1:
cpdef int set_unsafe(self, Py_ssize_t i, value) except -1:
"""
EXAMPLES::

Expand All @@ -5336,26 +5348,26 @@ cdef class FreeModuleElement_generic_sparse(FreeModuleElement):
...
TypeError: self must be a numeric expression

::
TESTS::

sage: # needs sage.symbolic
sage: v = vector([1,2/3,pi], sparse=True)
sage: v.set(1, pi^3)
sage: v.set_unsafe(1, pi^3)
0
sage: v
(1, pi^3, pi)
sage: v.set(2, SR(0))
sage: v.set_unsafe(2, SR(0))
0
sage: v
(1, pi^3, 0)

This assignment is illegal::

sage: v.set(10, pi) # needs sage.symbolic

This lack of bounds checking causes trouble later::

sage: v # needs sage.symbolic
<repr(<sage.modules.free_module.FreeModule_ambient_field_with_category.element_class at 0x...>) failed:
IndexError: list assignment index out of range>
sage: # needs sage.symbolic
sage: v.set(10, pi)
Traceback (most recent call last):
...
IndexError: vector index out of range
"""
if value:
self._entries[i] = value
Expand Down
Loading