Hi everyone,
attached is a patch to make the is_zero -> __nonzero__ change, to summarize:
> Conclusions:
> (1) Do not eliminate the is_zero method. I.e., it should still be
> possible to write x.is_zero() for x an element.
It is in element.pyx. Nick, does the documentation satisfy your request or
should it be more prominent?
> (2) Do implement __nonzero__, and redefine is_zero in the base to be
> def is_zero(self):
> return not self.__nonzero__()
See above.
> (3) Make sure no derived classes define is_zero; they should instead
> always define __nonzero__.
Almost, done. Exception:
./libs/ntl/ntl.pyx: def is_zero(self):
./libs/ntl/ntl.pyx: def is_zero(self):
./libs/ntl/ntl.pyx: def is_zero(ntl_GF2E self):
./libs/ntl/ntl.pyx: def is_zero(self):
Does not inherit from Element.
./modular/hecke/module.py: def is_zero(self):
Does not inherit from Element.
./structure/element.pyx: def is_zero(self):
Does not inherit from Element.
./rings/morphism.py: def is_zero(self):
Does not inherit from Element.
./rings/number_field/number_field_ideal.py: def is_zero(self):
./rings/number_field/number_field_ideal.py: def is_zero(self):
Does not inherit from Element.
./rings/padics/padic_lazy_element.py: def is_zero(self, prec):
./rings/padics/padic_capped_relative_element.py: def is_zero(self, prec =
None):
./rings/padics/padic_extension_generic_element.py: def is_zero(self, prec):
./rings/padics/padic_ring_fixed_mod_element.py.orig: def is_zero(self, prec
= None):
./rings/padics/local_generic_element.py: def is_zero(self, prec):
./rings/padics/padic_ring_fixed_mod_element.py: def is_zero(self, prec =
None):
Require additional prec parameter which doesn't fit into the __nonzero__
concept, so I left it as is. Ideas?
Martin
--
name: Martin Albrecht
_pgp: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x8EF0DC99
_www: http://www.informatik.uni-bremen.de/~malb
_jab: [EMAIL PROTECTED]
--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/sage-devel
URLs: http://sage.scipy.org/sage/ and http://modular.math.washington.edu/sage/
-~----------~----~----~----~------~----~------~--~---
# HG changeset patch
# User 'Martin Albrecht <[EMAIL PROTECTED]>'
# Date 1176936753 -7200
# Node ID 7a77bea899e0a396854646ff62bfee5240ab0857
# Parent a62ae3f310f2a583235aaf13c382f52fa5b276d8
is_zero methods replaced by __nonzero__ methods, is_zero now in Element as "not self.__nonzero__()"
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/interfaces/gap.py
--- a/sage/interfaces/gap.py Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/interfaces/gap.py Thu Apr 19 00:52:33 2007 +0200
@@ -591,6 +591,9 @@ class GapElement(ExpectElement):
raise RuntimeError, "An error occured creating an object in %s from:\n'%s'\n%s"%(self.parent().name(), self._createu, s)
return s
+ def __nonzero__(self):
+ return self.bool()
+
def __len__(self):
"""
EXAMPLES:
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/interfaces/macaulay2.py
--- a/sage/interfaces/macaulay2.py Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/interfaces/macaulay2.py Thu Apr 19 00:52:33 2007 +0200
@@ -376,9 +376,9 @@ class Macaulay2Element(ExpectElement):
else:
return self.parent().new('%s %% %s'%(self.name(), x.name()))
- def is_zero(self):
+ def __nonzero__(self):
P = self.parent()
- return P.eval('%s == 0'%self.name()) == 'true'
+ return P.eval('%s == 0'%self.name()) == 'false'
def sage_polystring(self):
"""
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/interfaces/singular.py
--- a/sage/interfaces/singular.py Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/interfaces/singular.py Thu Apr 19 00:52:33 2007 +0200
@@ -793,9 +793,9 @@ class SingularElement(ExpectElement):
else:
P.eval('%s[%s] = %s'%(self.name(), n, value.name()))
- def is_zero(self):
+ def __nonzero__(self):
P = self.parent()
- return P.eval('%s == 0'%self.name()) == '1'
+ return P.eval('%s == 0'%self.name()) == '0'
def sage_polystring(self):
"""
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/libs/cf/cf.pyxe
--- a/sage/libs/cf/cf.pyxe Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/libs/cf/cf.pyxe Thu Apr 19 00:52:33 2007 +0200
@@ -872,15 +872,13 @@ cdef class CanonicalForm:
#}embed
return bool(CF_isOne(self.thisptr))
- def is_zero(CanonicalForm self):
- """
- This predicate returns true if self represents the zero
- element of the current base domain. Like the predicate is_one
- using the predicate f.is_zero() is also faster than a
- comparison via f == 0.
+ def __nonzero__(CanonicalForm self):
+ """
+ This predicate returns true if self does not represent the zero
+ element of the current base domain.
"""
#embed{ int CF_isZero(void *e)
- return ((CanonicalForm*)e)->isZero();
+ return not ((CanonicalForm*)e)->isZero();
#}embed
return bool(CF_isZero(self.thisptr))
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/matrix/matrix_integer_dense.pyx
--- a/sage/matrix/matrix_integer_dense.pyx Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/matrix/matrix_integer_dense.pyx Thu Apr 19 00:52:33 2007 +0200
@@ -496,14 +496,14 @@ cdef class Matrix_integer_dense(matrix_d
# def _list(self):
# def _dict(self):
- def is_zero(self):
+ def __nonzero__(self):
cdef mpz_t *a, *b
cdef Py_ssize_t i, j
cdef int k
for i from 0 <= i < self._nrows * self._ncols:
if mpz_cmp_si(self._entries[i], 0):
- return False
- return True
+ return True
+ return False
def _multiply_linbox(self, Matrix right):
"""
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/modular/modform/element.py
--- a/sage/modular/modform/element.py Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/modular/modform/element.py Thu Apr 19 00:52:33 2007 +0200
@@ -102,8 +102,8 @@ class ModularFormElement(element.HeckeMo
"case not implemented yet."
return chi
- def is_zero(self):
- return self.element().is_zero()
+ def __nonzero__(self):
+ return not self.element().is_zero()
def level(self):
return self.parent().level()
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/contfrac.py
--- a/sage/rings/contfrac.py Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/rings/contfrac.py Thu Apr 19 00:52:33 2007 +0200
@@ -763,9 +763,9 @@ class ContinuedFraction(FieldElement):
"""
return self._rational_().is_one()
- def is_zero(self):
- """
- Return True if self is zero.
+ def __nonzero__(self):
+ """
+ Return False if self is zero.
EXAMPLES:
sage: continued_fraction(0).is_zero()
@@ -773,7 +773,7 @@ class ContinuedFraction(FieldElement):
sage: continued_fraction(1).is_zero()
False
"""
- return self._rational_().is_zero()
+ return not self._rational_().is_zero()
def _pari_(self):
"""
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/finite_field_givaro.pyx
--- a/sage/rings/finite_field_givaro.pyx Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/rings/finite_field_givaro.pyx Thu Apr 19 00:52:33 2007 +0200
@@ -1224,9 +1224,9 @@ cdef class FiniteField_givaroElement(Fin
"""
return (<FiniteField_givaro>self._parent)
- def is_zero(FiniteField_givaroElement self):
+ def __nonzero__(FiniteField_givaroElement self):
r"""
- Return True if \code{self == k(0)}.
+ Return True if \code{self != k(0)}.
EXAMPLES:
sage: k.<a> = GF(3^4); k
@@ -1236,7 +1236,7 @@ cdef class FiniteField_givaroElement(Fin
sage: k(0).is_zero()
True
"""
- return bool((<FiniteField_givaro>self._parent).objectptr.isZero(self.element))
+ return not bool((<FiniteField_givaro>self._parent).objectptr.isZero(self.element))
def is_one(FiniteField_givaroElement self):
r"""
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/ideal.py
--- a/sage/rings/ideal.py Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/rings/ideal.py Thu Apr 19 00:52:33 2007 +0200
@@ -185,8 +185,8 @@ class Ideal_generic(MonoidElement):
# check if x, which is assumed to be in the ambient ring, is actually in this ideal.
raise NotImplementedError
- def is_zero(self):
- return self.gens() == [self.ring()(0)]
+ def __nonzero__(self):
+ return self.gens() != [self.ring()(0)]
def base_ring(self):
return self.ring().base_ring()
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/integer.pyx
--- a/sage/rings/integer.pyx Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/rings/integer.pyx Thu Apr 19 00:52:33 2007 +0200
@@ -1066,9 +1066,6 @@ cdef class Integer(sage.structure.elemen
def __long__(self):
return mpz_get_pylong(self.value)
- def __nonzero__(self):
- return not self.is_zero()
-
def __float__(self):
return mpz_get_d(self.value)
@@ -1317,9 +1314,9 @@ cdef class Integer(sage.structure.elemen
"""
return bool(mpz_cmp_si(self.value, 1) == 0)
- def is_zero(self):
+ def __nonzero__(self):
r"""
- Returns \code{True} if the integers is $0$, otherwise \code{False}.
+ Returns \code{True} if the integers is not $0$, otherwise \code{False}.
EXAMPLES:
sage: Integer(1).is_zero()
@@ -1327,7 +1324,7 @@ cdef class Integer(sage.structure.elemen
sage: Integer(0).is_zero()
True
"""
- return bool(mpz_cmp_si(self.value, 0) == 0)
+ return bool(mpz_cmp_si(self.value, 0) != 0)
def is_unit(self):
r"""
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/integer_mod.pyx
--- a/sage/rings/integer_mod.pyx Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/rings/integer_mod.pyx Thu Apr 19 00:52:33 2007 +0200
@@ -834,9 +834,9 @@ cdef class IntegerMod_gmp(IntegerMod_abs
"""
return bool(mpz_cmp_si(self.value, 1) == 0)
- def is_zero(IntegerMod_gmp self):
- """
- Returns \code{True} if this is $0$, otherwise \code{False}.
+ def __nonzero__(IntegerMod_gmp self):
+ """
+ Returns \code{True} if this is not $0$, otherwise \code{False}.
EXAMPLES:
sage: mod(13,5^23).is_zero()
@@ -844,7 +844,7 @@ cdef class IntegerMod_gmp(IntegerMod_abs
sage: (mod(25,5^23)^23).is_zero()
True
"""
- return bool(mpz_cmp_si(self.value, 0) == 0)
+ return bool(mpz_cmp_si(self.value, 0) != 0)
def is_unit(self):
return bool(self.lift().gcd(self.modulus()) == 1)
@@ -1159,9 +1159,9 @@ cdef class IntegerMod_int(IntegerMod_abs
"""
return bool(self.ivalue == 1)
- def is_zero(IntegerMod_int self):
- """
- Returns \code{True} if this is $0$, otherwise \code{False}.
+ def __nonzero__(IntegerMod_int self):
+ """
+ Returns \code{True} if this is not $0$, otherwise \code{False}.
EXAMPLES:
sage: mod(13,5).is_zero()
@@ -1169,7 +1169,7 @@ cdef class IntegerMod_int(IntegerMod_abs
sage: mod(25,5).is_zero()
True
"""
- return bool(self.ivalue == 0)
+ return bool(self.ivalue != 0)
def is_unit(IntegerMod_int self):
return bool(gcd_int(self.ivalue, self.__modulus.int32) == 1)
@@ -1670,9 +1670,9 @@ cdef class IntegerMod_int64(IntegerMod_a
"""
return bool(self.ivalue == 1)
- def is_zero(IntegerMod_int64 self):
- """
- Returns \code{True} if this is $0$, otherwise \code{False}.
+ def __nonzero__(IntegerMod_int64 self):
+ """
+ Returns \code{True} if this is not $0$, otherwise \code{False}.
EXAMPLES:
sage: mod(13,5^10).is_zero()
@@ -1680,7 +1680,7 @@ cdef class IntegerMod_int64(IntegerMod_a
sage: mod(5^12,5^10).is_zero()
True
"""
- return bool(self.ivalue == 0)
+ return bool(self.ivalue != 0)
def is_unit(IntegerMod_int64 self):
return bool(gcd_int64(self.ivalue, self.__modulus.int64) == 1)
@@ -2222,4 +2222,4 @@ def slow_lucas(k, P, Q=1):
elif k == 1:
return P
else:
- return P*slow_lucas(k-1, P, Q) - Q*slow_lucas(k-2, P, Q)
\ No newline at end of file
+ return P*slow_lucas(k-1, P, Q) - Q*slow_lucas(k-2, P, Q)
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/laurent_series_ring_element.py
--- a/sage/rings/laurent_series_ring_element.py Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/rings/laurent_series_ring_element.py Thu Apr 19 00:52:33 2007 +0200
@@ -111,7 +111,7 @@ class LaurentSeries(ring_element.RingEle
"""
return self.__u.is_unit()
- def is_zero(self):
+ def __nonzero__(self):
"""
EXAMPLES:
sage: x = Frac(QQ[['x']]).0
@@ -122,7 +122,7 @@ class LaurentSeries(ring_element.RingEle
sage: z.is_zero()
1
"""
- return self.__u.is_zero()
+ return not self.__u.is_zero()
def _im_gens_(self, codomain, im_gens):
return codomain(self(im_gens[0]))
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/multi_polynomial_element.py
--- a/sage/rings/multi_polynomial_element.py Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/rings/multi_polynomial_element.py Thu Apr 19 00:52:33 2007 +0200
@@ -970,13 +970,13 @@ class MPolynomial_polydict(Polynomial_si
return self._richcmp_(right,3)
return self._MPolynomial__element != right._MPolynomial__element
- def is_zero(self):
- """
- Returns True if self == 0
+ def __nonzero__(self):
+ """
+ Returns True if self != 0
\note{This is much faster than actually writing self == 0}
"""
- return self._MPolynomial__element.dict()=={}
+ return self._MPolynomial__element.dict()!={}
############################################################################
# END: Some functions added by Martin Albrecht <[EMAIL PROTECTED]>
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/polynomial_element.pyx
--- a/sage/rings/polynomial_element.pyx Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/rings/polynomial_element.pyx Thu Apr 19 00:52:33 2007 +0200
@@ -1242,9 +1242,6 @@ cdef class Polynomial(CommutativeAlgebra
def is_gen(self):
return bool(self._is_gen)
-
- def is_zero(self):
- return bool(self.degree() == -1)
def leading_coefficient(self):
return self[self.degree()]
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/polynomial_pyx.pyx
--- a/sage/rings/polynomial_pyx.pyx Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/rings/polynomial_pyx.pyx Thu Apr 19 00:52:33 2007 +0200
@@ -1143,8 +1143,8 @@ cdef class Polynomial_rational(sage.stru
def degree(self):
return self.pq.degree
- def is_zero(self):
- return self.pq.degree == -1
+ def __nonzero__(self):
+ return self.pq.degree != -1
def list(self):
return PQ_list(self.pq)
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/power_series_ring_element.py
--- a/sage/rings/power_series_ring_element.py Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/rings/power_series_ring_element.py Thu Apr 19 00:52:33 2007 +0200
@@ -604,9 +604,9 @@ class PowerSeries(ring_element.RingEleme
# endif
return self._mul_(right, prec)
- def is_zero(self):
- """
- Return True if this power series equals 0.
+ def __nonzero__(self):
+ """
+ Return True if this power series doesn't equal 0.
EXAMPLES:
sage: R.<q> = ZZ[[ ]]; R
@@ -621,7 +621,7 @@ class PowerSeries(ring_element.RingEleme
sage: (0 + O(q^1000)).is_zero()
True
"""
- return self.polynomial().is_zero()
+ return not self.polynomial().is_zero()
def is_unit(self):
"""
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/quotient_ring_element.py
--- a/sage/rings/quotient_ring_element.py Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/rings/quotient_ring_element.py Thu Apr 19 00:52:33 2007 +0200
@@ -79,8 +79,8 @@ class QuotientRingElement(ring_element.R
def lift(self):
return self.__rep
- def is_zero(self):
- return self.__rep in self.parent().defining_ideal()
+ def __nonzero__(self):
+ return self.__rep not in self.parent().defining_ideal()
def is_unit(self):
if self.__rep.is_unit():
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/rational.pyx
--- a/sage/rings/rational.pyx Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/rings/rational.pyx Thu Apr 19 00:52:33 2007 +0200
@@ -686,9 +686,6 @@ cdef class Rational(sage.structure.eleme
mpq_neg(x.value, self.value)
return x
- def __nonzero__(self):
- return not self.numerator().is_zero()
-
def __abs__(self):
cdef Rational x
x = <Rational> PY_NEW(Rational)
@@ -1037,8 +1034,8 @@ cdef class Rational(sage.structure.eleme
def is_one(self):
return bool(mpz_cmp_si(mpq_numref(self.value), 1) == 0)
- def is_zero(self):
- return bool(mpz_cmp_si(mpq_numref(self.value), 0) == 0)
+ def __nonzero__(self):
+ return bool(mpz_cmp_si(mpq_numref(self.value), 0) != 0)
cdef _lshift(self, long int exp):
r"""
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/sparse_poly.pyx
--- a/sage/rings/sparse_poly.pyx Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/rings/sparse_poly.pyx Thu Apr 19 00:52:33 2007 +0200
@@ -130,7 +130,7 @@ cdef class Polynomial:
def is_irreducible(self):
raise NotImplementedError
- def is_zero(self):
+ def __nonzero__(self):
raise NotImplementedError
def leading_coefficient(self):
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/schemes/elliptic_curves/ell_point.py
--- a/sage/schemes/elliptic_curves/ell_point.py Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/schemes/elliptic_curves/ell_point.py Thu Apr 19 00:52:33 2007 +0200
@@ -142,7 +142,7 @@ class EllipticCurvePoint_field(SchemeMor
"""
return self.scheme()
- def is_zero(self):
+ def __nonzero__(self):
"""
Return True if this is the zero point on the curve.
@@ -156,7 +156,7 @@ class EllipticCurvePoint_field(SchemeMor
sage: P.is_zero()
False
"""
- return self[2] == 0
+ return self[2] != 0
def is_finite_order(self):
"""
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/schemes/hyperelliptic_curves/jacobian_morphism.py
--- a/sage/schemes/hyperelliptic_curves/jacobian_morphism.py Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/schemes/hyperelliptic_curves/jacobian_morphism.py Thu Apr 19 00:52:33 2007 +0200
@@ -177,5 +177,5 @@ class JacobianMorphism_divisor_class(Sch
def __rmul__(self, n):
return self.__mul__(n)
- def is_zero(self):
- return self.__polys[0] == 1
+ def __nonzero__(self):
+ return self.__polys[0] != 1
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/structure/element.pyx
--- a/sage/structure/element.pyx Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/structure/element.pyx Thu Apr 19 00:52:33 2007 +0200
@@ -313,8 +313,21 @@ cdef class Element(sage_object.SageObjec
s = str(self)
return PyBool_FromLong(s.find("+") == -1 and s.find("-") == -1 and s.find(" ") == -1)
+ def __nonzero__(self):
+ """
+ Return True if self does not equal self.parent()(0).
+ """
+ return PyBool_FromLong(self != self._parent(0))
+
def is_zero(self):
- return PyBool_FromLong(self == self._parent(0))
+ """
+ Return True if self equals self.parent()(0). The default
+ implementation is to fall back to 'not self.__nonzero__'.
+
+ NOTE: Do not re-implement this method in your subclass but
+ implement __nonzero__ instead.
+ """
+ return PyBool_FromLong(not self)
def _cmp_(left, right):
return left._cmp(right)
@@ -439,10 +452,7 @@ cdef class ModuleElement(Element):
"""
Generic element of a module.
"""
- ##################################################
- def is_zero(self):
- return PyBool_FromLong(self == self._parent(0))
-
+
##################################################
# Addition
##################################################
@@ -1050,9 +1060,6 @@ def is_RingElement(x):
cdef class RingElement(ModuleElement):
##################################################
- def is_zero(self):
- return PyBool_FromLong(self == self.parent()(0))
-
def is_one(self):
return PyBool_FromLong(self == self.parent()(1))
diff -r a62ae3f310f2 -r 7a77bea899e0 sage/structure/formal_sum.py
--- a/sage/structure/formal_sum.py Wed Apr 18 15:18:44 2007 +0200
+++ b/sage/structure/formal_sum.py Thu Apr 19 00:52:33 2007 +0200
@@ -154,13 +154,13 @@ class FormalSum(ModuleElement):
def _rmul_(self, s):
return self.__class__([(s*c, x) for (c, x) in self], check=False, parent=self.parent())
- def is_zero(self):
+ def __nonzero__(self):
if len(self._data) == 0:
- return True
+ return False
for c, _ in self._data:
if not c.is_zero():
- return False
- return True
+ return True
+ return False
def reduce(self):
if len(self) == 0: