[SciPy-user] symbolic strings

Robert Clewley rclewley at cam.cornell.edu
Fri Feb 3 14:28:40 CST 2006


>From your output I cannot see how you set up your variables. If I enter 
at the prompt:

>> anum=QuantSpec('anum', 'a')

>> aden=QuantSpec('aden', 'c1*s+k1')

>> temp=anum/aden

>> print temp

a/(c1*s+k1)


How is what you are doing different to this?

Rob

On Fri, 3 Feb 2006, Ryan Krauss 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
>>>
>>
>
> _______________________________________________
> 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



More information about the SciPy-user mailing list