It looks like the assumptions system would be a good place for the fancy
matrix questions (positive definite, invertible, etc...). I'm not sure that
it's appropriate for shape though.

I'm going to boldly propose that we add shape as a property to the core Expr
class. It won't be checked as operations happen (to optimize speed for the
common non-matrix case) but will be computed on demand and raise errors at
that time if things are misaligned. I might also push for a is_Matrix flag.

i.e.

>>> A = MatrixSymbol('A', 3, 4)
>>> B = MatrixSymbol('B', 4, 7)
>>> C = 2*A*B # Nothing matrix-y happens here
>>> C.shape # Shape is checked here
(3, 7)
>>> D = 1 + B*A # This passes even though it's invalid
>>> D.shape # Error is found when asking for the shape
ShapeError(....
>>> print Symbol('x').shape # Normal expressions have no shape
None

I don't think this will affect computation at all for non-matrix situations.
It adds a minimal amount of code complexity to the Add, Mul, Pow, etc...
classes.

I'm going to write something up for review later tonight. Please someone
stop me if this is a poor idea.

On Thu, Jun 30, 2011 at 6:14 PM, Aaron Meurer <asmeu...@gmail.com> wrote:

> There's some info at http://docs.sympy.org/0.7.0/modules/assumptions.html.
>
> Aaron Meurer
>
> On Thu, Jun 30, 2011 at 12:35 PM, Ronan Lamy <ronan.l...@gmail.com> wrote:
> > Le jeudi 30 juin 2011 à 13:25 -0500, Matthew Rocklin a écrit :
> >> Where is the best place to read about the new assumptions system?
> >
> > I'm afraid that the best place is the source code in sympy/assumptions/.
> > I'm not aware of any comprehensive and current write-up on the new
> > assumptions.
> >>
> >> On Thu, Jun 30, 2011 at 1:18 PM, Aaron Meurer <asmeu...@gmail.com>
> >> wrote:
> >>
> >>         On Thu, Jun 30, 2011 at 7:17 AM, Matthew Rocklin
> >>         <mrock...@gmail.com> wrote:
> >>         > I agree that support for derivatives on matrices is
> >>         important; I would like
> >>         > this myself. I haven't thought much about it in the context
> >>         of SymPy before
> >>         > though so thank you for bringing it up.
> >>         > I haven't solidified my understanding of this problem but it
> >>         seems like
> >>         > there are a few concepts of a derivative here.
> >>         >
> >>         > Given a matrix expression we can differentiate with respect
> >>         to the various
> >>         > matrices themselves. This is likely very similar to Aaron's
> >>         example using
> >>         > stock SymPy with non-commutative symbols. This should (I
> >>         think) work out of
> >>         > the box
> >>         > Given a function on vector valued inputs with possible
> >>         vector valued outputs
> >>         > we can define directional derivatives. I think this is what
> >>         Alan is talking
> >>         > about. In this situation the objects can easily become high
> >>         rank (Hessians
> >>         > of vector-valued functions are not matrices). This leads me
> >>         to the idea that
> >>         > we should consider mathematical Tensors rather than
> >>         matrices.
> >>         >
> >>         > The tensor vs matrix issue makes me nervous. There is a lot
> >>         of special stuff
> >>         > happening on rank two tensors (matrices) that we rarely care
> >>         about at higher
> >>         > ranks. Maybe this work should be done on a Tensor class and
> >>         Matrices should
> >>         > subclass Tensors? This is getting beyond the scope of what I
> >>         was looking for
> >>         > with a Matrix Symbol. I probably won't pursue this
> >>         enhancement in the near
> >>         > future but would be happy to support someone else's effort.
> >>         > For the moment I'm not working on Matrix Expressions
> >>         actually. I'm a bit
> >>         > stuck on how to proceed and would welcome any
> >>         suggestions. The best idea I
> >>         > have now is to insert symbols into standard sympy Exprs and
> >>         have aspects
> >>         > like shape and is_invertible be functions which are called
> >>         on the Expr tree
> >>         > rather than fields or methods of the object. This will fail
> >>         to raise
> >>         > exceptions when illegal operations are performed but should
> >>         get the job
> >>         > done. The Indexed class is somewhat similar in flavor.
> >>
> >>
> >>         This is something that you would (hopefully) be able to do
> >>         with the
> >>         new assumptions system.  In other words, without having to
> >>         modify the
> >>         core, you should be able to say ask(Q.invertable(A*B)) and it
> >>         would
> >>         determine it based on whether you set A and B to be
> >>         invertible.  Shape
> >>         should work too, though I'm not sure if the system can
> >>         currently
> >>         handle non-boolean assumptions (someone else will have to fill
> >>         in
> >>         here).
> >>
> >>         By the way, is_invertible is perhaps something that could be
> >>         implemented in the core directly, so you could have support
> >>         for
> >>         non-invertible symbols in any case.  It should just be a
> >>         matter of
> >>         making ._eval_power do the right thing in any case.
> >>
> >>
> >>         Aaron Meurer
> >>
> >>
> >>         >
> >>         >
> >>         > On Thu, Jun 30, 2011 at 7:05 AM, Alan Bromborsky
> >>         <abro...@verizon.net>
> >>         > wrote:
> >>         >>
> >>         >> Differentiation would only work with a scalar
> >>         (communicative)
> >>         >> differentiation operator.  If the matrix function is a
> >>         function of a vector
> >>         >> or matrix one would have to define the directional
> >>         derivative for each case
> >>         >> (which would be a scalar differential operator) and use the
> >>         results of that
> >>         >> operation to determine the properties of a vector or matrix
> >>         derivative.
> >>         >>  Note that determining the operator properties would also
> >>         require a
> >>         >> definition for the scalar product of vectors and matrices.
> >>         >>
> >>         >> Consider the vector directional derivative of a matrix M
> >>         that is the
> >>         >> function of a vector v, M(v), then if a is an arbitrary
> >>         vector (LaTeX
> >>         >> expression) the definition of the directional derivative
> >>         would be
> >>         >>
> >>         >> a\cdot\nabla M(v) \equiv  \lim_{h \rightarrow 0}\frac{M(v
> >>         +ha)-M(v)}{h}
> >>         >>
> >>         >>
> >>         >> from this the properties of \nabla M(v) could be determined
> >>         and if v is
> >>         >> expanded in a arbitrary basis the \nabla operator could
> >>         also be expanded.  A
> >>         >> similar treatment is possible for a matrix that is a
> >>         function of a matrix if
> >>         >> the scalar product of two matrices is defined.
> >>         >>
> >>         >>
> >>         >>
> >>         >> On 06/30/2011 04:20 AM, Aaron Meurer wrote:
> >>         >>>
> >>         >>> As I pointed out in the other thread, non-commutative
> >>         differentiation
> >>         >>> already works in SymPy, so doing this should not be
> >>         difficult.
> >>         >>>
> >>         >>> Aaron Meurer
> >>         >>>
> >>         >>> On Thu, Jun 30, 2011 at 1:58 AM, Amit<amiti...@gmail.com>
> >>          wrote:
> >>         >>>>
> >>         >>>> Hi,
> >>         >>>>
> >>         >>>> I am not familiar with the internals of sympy. But I
> >>         suggest that if
> >>         >>>> you start working on the implementation of symbolic
> >>         matrices, you
> >>         >>>> should take into consideration more complicated operators
> >>         like
> >>         >>>> differentiation.
> >>         >>>> 'The Matrix Cookbook' has many matrix equalities that
> >>         maybe can be
> >>         >>>> implemented using some kind of pattern recognition.
> >>         >>>>
> >>         >>>> Amit
> >>         >>>>
> >>         >>>> On Jun 28, 8:16 pm, Matthew Rocklin<mrock...@gmail.com>
> >>          wrote:
> >>         >>>>>
> >>         >>>>> @Brian - Thanks for the heads up Brian. I'll see what I
> >>         can do with
> >>         >>>>> option
> >>         >>>>> (1). My short term solution was to start a "matrixify"
> >>         function a la
> >>         >>>>> sympify. It would probably be too annoying to use
> >>         everywhere though.
> >>         >>>>>
> >>         >>>>> @Vinzent - Where is a good place to start learning about
> >>         the new
> >>         >>>>> assumption
> >>         >>>>> system (or the old one... I'm not up to speed on these)
> >>         >>>>>
> >>         >>>>> On Tue, Jun 28, 2011 at 11:36 AM, Vinzent Steinberg<
> >>         >>>>>
> >>         >>>>>
> >>         >>>>>
> >>         >>>>>
> >>         >>>>>
> >>         >>>>>
> >>         >>>>>
> >>         >>>>> vinzent.steinb...@googlemail.com>  wrote:
> >>         >>>>>>
> >>         >>>>>> On Jun 28, 4:32 am, Matthew
> >>         Rocklin<mrock...@gmail.com>  wrote:
> >>         >>>>>>>
> >>         >>>>>>> Yeah, definitely. I must confess that a hidden passion
> >>         of mine is
> >>         >>>>>>
> >>         >>>>>> optimizing
> >>         >>>>>>>
> >>         >>>>>>> linear algebra (we all have our quirks). I was just
> >>         looking at Theano
> >>         >>>>>>> a
> >>         >>>>>>> minute ago actually - I think it would be cool to
> >>         easily dump Matrix
> >>         >>>>>>> expressions onto them.
> >>         >>>>>>> How should matrix expressions be represented in SymPy
> >>         though? The way
> >>         >>>>>>> I
> >>         >>>>>>
> >>         >>>>>> see
> >>         >>>>>>>
> >>         >>>>>>> it there are three options
> >>         >>>>>>>    1. Leave it as a SymPy Expr, forget shape,
> >>         transpose, rank, etc...
> >>         >>>>>>> for
> >>         >>>>>>>    now. Maybe future SymPy elegance will make clever
> >>         things possible
> >>         >>>>>>
> >>         >>>>>> (such as
> >>         >>>>>>>
> >>         >>>>>>>    issue 1941)
> >>         >>>>>>>    2. Enhance SymPy Expr's to play nice with Matrices
> >>         >>>>>>>    3. Subclass a family of MatrixExpr classes that
> >>         live outside the
> >>         >>>>>>> core
> >>         >>>>>>> Probably there are things I'm missing but this is how
> >>         I separate
> >>         >>>>>>> things.
> >>         >>>>>>> Because I'd like this done sooner rather than later
> >>         I'm obviously in
> >>         >>>>>>
> >>         >>>>>> favor
> >>         >>>>>>>
> >>         >>>>>>> of 2 or 3 with a preference for 3. I don't know enough
> >>         about SymPy
> >>         >>>>>>
> >>         >>>>>> however
> >>         >>>>>>>
> >>         >>>>>>> to tell whether this is the "right way" and I'd rather
> >>         not work on
> >>         >>>>>>
> >>         >>>>>> something
> >>         >>>>>>>
> >>         >>>>>>> unless it has a chance at getting in.
> >>         >>>>>>> I'll push again for three by saying that there is a
> >>         lot going on in
> >>         >>>>>>
> >>         >>>>>> Matrix
> >>         >>>>>>>
> >>         >>>>>>> Expressions other than just non-commutativity and
> >>         shape. Inverses,
> >>         >>>>>>> transposes, rank, symmetry, positive_definiteness,
> >>         conditioning,
> >>         >>>>>>> etc...
> >>         >>>>>>
> >>         >>>>>> all
> >>         >>>>>>>
> >>         >>>>>>> play a big role in computational decisions made on
> >>         matrices.
> >>         >>>>>>> Additionally
> >>         >>>>>>> matrix expressions are ubiquitous and important in the
> >>         scientific
> >>         >>>>>>
> >>         >>>>>> computing
> >>         >>>>>>>
> >>         >>>>>>> world. From my (strongly biased) perspective they
> >>         deserve special
> >>         >>>>>>> treatment.
> >>         >>>>>>
> >>         >>>>>> I think all this '.is_*' stuff should rather be
> >>         implemented using the
> >>         >>>>>> new assumption system (not sure about shape, maybe this
> >>         should really
> >>         >>>>>> go into the core). If we use noncommutative symbols, I
> >>         think we can
> >>         >>>>>> avoid messing around with Mul and friends.
> >>         >>>>>> A.T could be implemented as a unary function.
> >>         >>>>>> Vinzent
> >>         >>>>>> --
> >>         >>>>>> You received this message because you are subscribed to
> >>         the Google
> >>         >>>>>> Groups
> >>         >>>>>> "sympy" group.
> >>         >>>>>> To post to this group, send email to
> >>         sympy@googlegroups.com.
> >>         >>>>>> To unsubscribe from this group, send email to
> >>         >>>>>> sympy+unsubscr...@googlegroups.com.
> >>         >>>>>> For more options, visit this group at
> >>         >>>>>> http://groups.google.com/group/sympy?hl=en.
> >>         >>>>
> >>         >>>> --
> >>         >>>> You received this message because you are subscribed to
> >>         the Google
> >>         >>>> Groups "sympy" group.
> >>         >>>> To post to this group, send email to
> >>         sympy@googlegroups.com.
> >>         >>>> To unsubscribe from this group, send email to
> >>         >>>> sympy+unsubscr...@googlegroups.com.
> >>         >>>> For more options, visit this group at
> >>         >>>> http://groups.google.com/group/sympy?hl=en.
> >>         >>>>
> >>         >>>>
> >>         >>
> >>         >> --
> >>         >> You received this message because you are subscribed to the
> >>         Google Groups
> >>         >> "sympy" group.
> >>         >> To post to this group, send email to
> >>         sympy@googlegroups.com.
> >>         >> To unsubscribe from this group, send email to
> >>         >> sympy+unsubscr...@googlegroups.com.
> >>         >> For more options, visit this group at
> >>         >> http://groups.google.com/group/sympy?hl=en.
> >>         >>
> >>         >
> >>         > --
> >>         > You received this message because you are subscribed to the
> >>         Google Groups
> >>         > "sympy" group.
> >>         > To post to this group, send email to sympy@googlegroups.com.
> >>         > To unsubscribe from this group, send email to
> >>         > sympy+unsubscr...@googlegroups.com.
> >>         > For more options, visit this group at
> >>         > http://groups.google.com/group/sympy?hl=en.
> >>         >
> >>
> >>         --
> >>         You received this message because you are subscribed to the
> >>         Google Groups "sympy" group.
> >>         To post to this group, send email to sympy@googlegroups.com.
> >>         To unsubscribe from this group, send email to sympy
> >>         +unsubscr...@googlegroups.com.
> >>         For more options, visit this group at
> >>         http://groups.google.com/group/sympy?hl=en.
> >>
> >>
> >>
> >>
> >>
> >> --
> >> You received this message because you are subscribed to the Google
> >> Groups "sympy" group.
> >> To post to this group, send email to sympy@googlegroups.com.
> >> To unsubscribe from this group, send email to sympy
> >> +unsubscr...@googlegroups.com.
> >> For more options, visit this group at
> >> http://groups.google.com/group/sympy?hl=en.
> >
> >
> > --
> > You received this message because you are subscribed to the Google Groups
> "sympy" group.
> > To post to this group, send email to sympy@googlegroups.com.
> > To unsubscribe from this group, send email to
> sympy+unsubscr...@googlegroups.com.
> > For more options, visit this group at
> http://groups.google.com/group/sympy?hl=en.
> >
> >
>
> --
> You received this message because you are subscribed to the Google Groups
> "sympy" group.
> To post to this group, send email to sympy@googlegroups.com.
> To unsubscribe from this group, send email to
> sympy+unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/sympy?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To post to this group, send email to sympy@googlegroups.com.
To unsubscribe from this group, send email to 
sympy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sympy?hl=en.

Reply via email to