Martin Albrecht <[EMAIL PROTECTED]> writes: > 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:
This list of exceptions is interesting. Is it possible that is_zero is in the wrong place in the hierarchy? And the precision issues are more widespread; is_zero for reals, etc, has the same issues. Other than that, +1 include from me. Nick > ./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] > > > > > > # 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: --~--~---------~--~----~------------~-------~--~----~ To post to this group, send email to sage-devel@googlegroups.com 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/ -~----------~----~----~----~------~----~------~--~---