On Sep 24, 4:17 pm, Julius <[email protected]> wrote:
> Hi list,
>
> I wonder if there is any command similar to subsop in maple
> (www.maplesoft.com/support/help/Maple/view.aspx?path=subsop).
> There is an operands(), but I don't see how substitutions can be made
> from it.
>
> Antonio
Hi,
here is a try to mimic subsop:
{{{
def subsop(e, d=None):
"""
Some sort of subsop, inspired by maple...
EXAMPLES::
sage: var('a, x, y, z, f, g, h, w')
(a, x, y, z, f, g, h, w)
sage: p = x^7 + 8*x^6 + x^2 - 9
sage: subsop(p, {1: y})
x^7 + x^2 + y - 9
sage: subsop(p, {0: 0})
8*x^6 + x^2 - 9
sage: subsop(x*y*z, {0: 1})
y*z
sage: subsop([x, y, z], {0: None, 1: z, 2: y})
[None, z, y]
sage: p = function('f', x, function('g', x, y, z), x)
sage: subsop(p, {(1,2): w})
f(x, g(x, y, w), x)
sage: subsop(p, {(1,-1): function('h', x, y, z), (1,2): w, 2:
a})
f(x, h(x, y, w), a)
sage: subsop(p)
f(x, g(x, y, z), x)
"""
if not d:
return e
if isinstance(e, list):
operands_ = copy(e)
operator_ = list
elif isinstance(e, tuple):
operands_ = copy(e)
operator_ = tuple
else:
operands_ = e.operands()
operator_ = e.operator()
for i, di in d.iteritems():
if isinstance(i, tuple):
if len(i) > 1:
di = subsop(operands_[i[0]], {i[1:]: di})
i = i[0]
if i == -1:
operator_ = di
else:
operands_[i] = di
# does this operator accepts lists?
try:
r = operator_(*operands_)
except TypeError:
# maybe we can reduce then ?
try:
r = reduce(operator_, operands_)
except TypeError:
# let's try lists...
r = operator_(operands_)
return r
}}}
It's zero-based, and the substitutions are given with a dict for
consistency with Sage.
The case of function is slightly different and the way I did it you
get a deprecation warning.
I hope this still gives you some insight.
Yann
--
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-support
URL: http://www.sagemath.org