[SciPy-user] symbolic strings

Ryan Krauss ryanlists at gmail.com
Fri Feb 3 14:39:44 EST 2006


So all of my scripts begin with from __future__ import division, so
defining a __truediv_ method has my symstr class working.  I don't
seem to be able to add __truediv__ or __pow__ to QuantSpec or Quantity
though.  Any thoughts?

Ryan

On 2/3/06, Ryan Krauss <ryanlists at gmail.com> wrote:
> So, I tried to get around the pow problem by just using *s*s, since I
> only need squares in this particular function.  That gets me as far as
> I was before:
> /home/ryan/rwkpython/TMM/feedback/__init__.py in GetAugMat()
>      58         aden=c1*s+k1
> ---> 59         temp=anum/aden
>      60         temp2=temp*-1
>
> ipdb>
> TypeError: "unsupported operand type(s) for /: 'QuantSpec' and 'QuantSpec'"
> /home/ryan/rwkpython/TMM/feedback/__init__.py in GetAugMat()
>      58         aden=c1*s+k1
> ---> 59         temp=anum/aden
>      60         temp2=temp*-1
>
> Help.
>
> Ryan
>
> On 2/3/06, Ryan Krauss <ryanlists at gmail.com> wrote:
> > I am checking out QuantSpec and it seems very powerful and like it
> > should be able to do what I need.  I am having trouble defining a
> > __pow__ method though:
> >
> > I tried just adding this in the Quant class:
> >     def __pow__(self, other):
> >         return self.__combine(other, "**")
> >
> > following the example of;
> >     def __mul__(self, other):
> >         return self.__combine(other, "*")
> >
> > I was originally trying to evaluate this expression:
> > anum=L0*m1*r1*s**2-c1*s-k1
> > where everything on the right is a ModelSpec.Par
> >
> > I get this message:
> > *** ValueError: Operator ** is not allowed. Please use the pow() call
> >
> > I changed to pow(s,2), but it still didn't work:
> > ipdb> type(s)
> > Out[3]: <class 'ModelSpec.Par'>
> > ipdb> s**2
> > TypeError: "unsupported operand type(s) for ** or pow(): 'Par' and 'float'"
> >
> > What would need to change to make Par**2 work?
> >
> > Thanks Rob, I think this can be really helpful.
> >
> > Ryan
> >
> > On 2/3/06, Robert Clewley <rclewley at cam.cornell.edu> wrote:
> > > Ryan, you'll probably need __rdiv__ and __rmul__ methods to help with
> > > this, in case the other objects involved in the construction are not
> > > symbolic objects. There are a bunch of cases you have to check to add
> > > braces appropriately if one of the operands is "compound", and you can
> > > find an example of what's needed in my code for the QuantSpec
> > > class.
> > >
> > > -Rob
> > >
> > >
> > > On Fri, 3 Feb 2006, Ryan Krauss wrote:
> > >
> > > > Thanks Travis, it sounds like I am on the right track.  I defined
> > > > checks in the __mul__ and __div__ methods to look for compound
> > > > expressions and add parentheses.
> > > >
> > > > I am running into a weird problem though.  I broke the expression into
> > > > a numerator and denominator to get the parentheses to work, but when I
> > > > try a=anum/aden*-1
> > > > I get an error: TypeError: unsupported operand type(s) for /: 'symstr'
> > > > and 'symstr'.  But symstr does have a __div__ method and when I run
> > > > the code with the ipython pdb magic turned on, I have no trouble
> > > > executing temp=anum/aden*-1 and getting the correct result.  Why does
> > > > it work in the debugger and not in the script?
> > > >
> > > > Below is a chunk of the ipython session.
> > > >
> > > > Thanks,
> > > >
> > > > Ryan
> > > >
> > > > /home/ryan/rwkpython/TMM/feedback/__init__.py in GetAugMat(self, s)
> > > >     55         anum=L0*m1*r1*s**2-c1*s-k1
> > > >     56         aden=c1*s+k1
> > > > ---> 57         a=anum/aden*-1
> > > >     58 #        a=(-1)*(L0*m1*r1*s**2-c1*s-k1)/(c1*s+k1)
> > > >     59
> > > > b=(-1)*((L0*m1*r1**2-L0*L1*m1*r1+Iz1*L0)*s**2+(c1*L1+c1*L0)*s+k1*L1+k1*L0)/(c1*s+k1)
> > > >
> > > > TypeError: unsupported operand type(s) for /: 'symstr' and 'symstr'
> > > > /home/ryan/rwkpython/TMM/feedback/__init__.py in GetAugMat()
> > > >     56         aden=c1*s+k1
> > > > ---> 57         a=anum/aden*-1
> > > >     58 #        a=(-1)*(L0*m1*r1*s**2-c1*s-k1)/(c1*s+k1)
> > > >
> > > > ipdb> temp=anum/aden*-1
> > > > ipdb> temp
> > > > '((Ll0*ml1*rl1*s**2-cj1*s-kj1)/(cj1*s+kj1))*(-1)'
> > > > ipdb> type(anum)
> > > > <class 'rwkmisc.symstr'>
> > > > ipdb> type(aden)
> > > > <class 'rwkmisc.symstr'>
> > > > ipdb> rwkmisc.symstr(1)
> > > > '1'
> > > > ipdb>
> > > >
> > > >
> > > > On 2/3/06, Travis Oliphant <oliphant.travis at ieee.org> wrote:
> > > >> Ryan Krauss wrote:
> > > >>
> > > >>> I may be getting in over my head, but I think this can work.  I do a
> > > >>> lot of analysis with matrices using the transfer matrix method.
> > > >>> Sometimes I want to do numeric work with them and sometimes I use
> > > >>> python to generate an input script for Maxima.  Right now I have two
> > > >>> methods for my transfer matrix element, one that outputs a numeric
> > > >>> matrix and one that outputs a string for Maxima.  I am working on a
> > > >>> new element and would like to combined these two expressions by
> > > >>> creating a symbolic string method so that expressions like
> > > >>> a=-(L0*m1*r1*s**2-c1*s-k1)/(c1*s+k1)
> > > >>>
> > > >>> make sense whether L0, m1, r1, s, etc are floats or symstrs (my new
> > > >>> class).  I overrode the __mul__, __add__, __div__,__sub__, and __pow__
> > > >>> methods but don't know if there are methods to override to deal with
> > > >>> the parenthesis and the unary - out in front.  Can this be done with
> > > >>> only a little bit more work?  Basically I want the output of this
> > > >>> expression to be 'a=-(L0*m1*r1*s**2-c1*s-k1)/(c1*s+k1)' if it is a
> > > >>> string and a float or complex if the variables are numbers.
> > > >>>
> > > >>>
> > > >> This can be done, but you would basically have to add the parenthesis in
> > > >> yourself as you build up your string...
> > > >>
> > > >> Yes, the unary '-' can be over-written (see __neg__ special method).
> > > >>
> > > >> -Travis
> > > >>
> > > >> _______________________________________________
> > > >> SciPy-user mailing list
> > > >> SciPy-user at scipy.net
> > > >> http://www.scipy.net/mailman/listinfo/scipy-user
> > > >>
> > > >
> > > > _______________________________________________
> > > > SciPy-user mailing list
> > > > SciPy-user at scipy.net
> > > > http://www.scipy.net/mailman/listinfo/scipy-user
> > > >
> > >
> > > -----------------------------------
> > > Rob Clewley
> > > Research Associate
> > > Department of Mathematics
> > >   and Center for Applied Mathematics
> > > Cornell University
> > > Ithaca, NY 14853
> > > www.cam.cornell.edu/~rclewley
> > > Tel: 607-255-7760
> > > Fax: 607-255-9860
> > >
> > > _______________________________________________
> > > SciPy-user mailing list
> > > SciPy-user at scipy.net
> > > http://www.scipy.net/mailman/listinfo/scipy-user
> > >
> >
>




More information about the SciPy-User mailing list