On Fri, Oct 31, 2008 at 1:03 AM, Andy Ray Terrel <[EMAIL PROTECTED]> wrote:
>
> On Fri, Oct 31, 2008 at 6:39 AM, Brian Granger <[EMAIL PROTECTED]> wrote:
>>
>> Hi,
>>
>> I am continuing some work that Ondrej and I started this week
>> implementing quantum operators in sympy.  I am building a Dagger class
>> that does the hermitian conjugate.  In the canonize method, the Dagger
>> operator need to test what type of object has been passed to Dagger.
>> From there it 1) either actually takes the dagger if it knows how or
>> 2) just leaves Dagger unevaluated.  So, I need to test for various
>> types of objects.
>>
>> The common way of testing the type of object you get in sympy is to
>> use the attributes like is_number, is_real, etc.  But, I have two, no
>> three problems with this:
>>
>> 1.  Only subclasses of Basic have these attributes.  Matrices (and any
>> other immutable type) don't inherit from Basic and so they don't have
>> all these attributes.
>
> I agree with Brian here.  This "some objects are basic others are not"
> design is confusing, unfortunately there are not many design docs
> around so I don't know if this was intentional or not.

The logical things to do would be to have the following hierarchy of classes:

Basic-------------ImmutableBasic
|
|
MutableBasic

Although I am still not clear where and how the immutability of the
current Basic class shows up.

>>
>> 2.  There is no is_complex attribute in basic.  This brings up another
>> ?: how are complex number represented in sympy?
>
> The is_complex attribute comes from the assumptions, although this
> seems to be broken.  You can simpify a built-in complex to play
> around, in the example b.is_complex should be true:
>
> In [1]: a = complex(3,2)
>
> In [2]: a
> Out[2]: (3+2j)
>
> In [3]: type(a)
> Out[3]: <type 'complex'>
>
> In [4]: b = sympify(a)
>
> In [5]: type(b)
> Out[5]: <class 'sympy.core.add.Add'>
>
> In [6]: b
> Out[6]: 3 + 2*I
>
> In [7]: b.is_complex
>
> In [8]: b.args[1].args[1]
> Out[8]: I
>
> In [9]: type(b.args[1].args[1])
> Out[9]: <class 'sympy.core.numbers.ImaginaryUnit'>
>
> In [10]: i = b.args[1].args[1]
>
> In [11]: i.is_complex
> Out[11]: True
>
>
>>
>> 3.  For custom object types, like my operators, I have to add custom
>> code to my Dagger class that does things like:
>>
>> if isinstance(QuantumOperator):
>>   # take Dagger of operator
>>
>> Is this the best way of going about this?
>
> Its the only way I know unless you add some new property
> (is_QuantumOperator) to Basic.

Again, this seems like a perfect place to have objects themselves know
how to take their dagger (transpose+conjugate), using a _dagger_
method.  Otherwise, if I create a new type, I have to hack the Dagger
class to know about this object.  This makes it difficult for people
to extend Sympy.

Sorry for all these questions.  I am just trying to get a feel for the
how and why of Sympy so I can hack on it.  It is quite cool.


Cheers,

Brian

> -- Andy
>
>>
>> Cheers,
>>
>> Brian
>>
>> >
>>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sympy" group.
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/sympy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to