Hi!
I tested some corner cases of MPolynomialRing_polydict and found the
following:
1.
sage: P.<x> = ZZ['x'][]
sage: P
Univariate Polynomial Ring in x over Univariate Polynomial Ring in x
over Integer Ring
I think that name conflicts should give rise to raising an error. Or
is there a reason for allowing coinciding names?
###########
2.
The code in test.py is as below. It defines something that to some
extent behaves like a ring (mathematically, it isn't a ring). Let's
try to construct a polynomial ring over the fake ring:
sage: attach test.py
sage: R.<a,b> = FakeRing(ZZ)
sage: 2*a
(2)*(a)
sage: P.<x,y> = PolynomialRing(R)
sage: a*x
(1)*(a)*x
sage: P(a)
a
sage: P('a')
---------------------------------------------------------------------------
TypeError Traceback (most recent
call last)
/home/king/SAGE/work/SymmetricIdeals/test2.py in <module>()
/home/king/SAGE/sage-4.1/local/lib/python2.6/site-packages/sage/
rings/polynomial /multi_polynomial_ring.pyc in __call__(self, x,
check)
437 return sage_eval(x, self.gens_dict())
438 except NameError, e:
--> 439 raise TypeError, "unable to convert string"
440
441 elif is_Macaulay2Element(x):
TypeError: unable to convert string
sage: P('1*x')
---------------------------------------------------------------------------
TypeError Traceback (most recent
call last)
/home/king/SAGE/work/SymmetricIdeals/test2.py in <module>()
/home/king/SAGE/sage-4.1/local/lib/python2.6/site-packages/sage/
rings/polynomial/multi_polynomial_ring.pyc in __call__(self, x, check)
437 return sage_eval(x, self.gens_dict())
438 except NameError, e:
--> 439 raise TypeError, "unable to convert string"
440
441 elif is_Macaulay2Element(x):
TypeError: unable to convert string
Shouldn't these conversions work?
Clearly the critical part of P.__call__ is:
...
elif isinstance(x, str):
try:
from sage.misc.sage_eval import sage_eval
return sage_eval(x, self.gens_dict())
except NameError, e:
raise TypeError, "unable to convert string"
The obvious problem is that 'a' is not traced in P.gens_dict()
I also find it rather odd that 'x' is not traced by its name but by
its string representation:
sage: P.gens_dict()
{'1*x': 1*x, '1*y': 1*y}
This is easy to fix:
sage: P._gens_dict = {'x':x, 'y':y}
sage: P('x')
1*x
Certainly the FakeRing class is nonsense. But I still think the fact
that P('a') and P('x') raise errors reveals two bugs.
Do you agree? Or do you think such nonsense rings are irrelevant?
Cheers,
Simon
########################
This is in test.py:
from sage.all import CommutativeRing, CommutativeRingElement,
SageObject
class FakeElement(CommutativeRingElement):
def __init__(self,parent,name):
self._name = name
CommutativeRingElement.__init__(self,parent)
def __repr__(self):
return self._name
def _cmp_(self,other):
return cmp(self._name,other._name)
def _add_(self,other):
return FakeElement(self.parent(), '('+self._name+')+
('+other._name+')')
def _mul_(self,other):
return FakeElement(self.parent(), '('+self._name+')*
('+other._name+')')
def _sub_(self,other):
return FakeElement(self.parent(), '('+self._name+')-
('+other._name+')')
class FakeRing(CommutativeRing):
def __init__(self, R, names):
CommutativeRing.__init__(self,base=R)
self._names = names
self._gens = [FakeElement(self, n) for n in names]
self._populate_coercion_lists_()
def __repr__(self):
return 'Fake ring over %s with generators %s'%(repr
(self.base_ring()),','.join(self._names))
def _element_constructor_(self, r):
return FakeElement(self, str(r))
def _coerce_map_from_(self, R):
return self.base_ring().has_coerce_map_from(R)
def an_element(self):
return self.gen()
def gen(self,i=None):
if i is not None:
return self._gens[i]
return self._gens[0]
--
To post to this group, send an email to [email protected]
To unsubscribe from this group, send an email to
[email protected]
For more options, visit this group at http://groups.google.com/group/sage-devel
URL: http://www.sagemath.org