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 <[email protected]> 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 <[email protected]> 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 <[email protected]>
> >> wrote:
> >>
> >> On Thu, Jun 30, 2011 at 7:17 AM, Matthew Rocklin
> >> <[email protected]> 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
> >> <[email protected]>
> >> > 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<[email protected]>
> >> 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<[email protected]>
> >> 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<
> >> >>>>>
> >> >>>>>
> >> >>>>>
> >> >>>>>
> >> >>>>>
> >> >>>>>
> >> >>>>>
> >> >>>>> [email protected]> wrote:
> >> >>>>>>
> >> >>>>>> On Jun 28, 4:32 am, Matthew
> >> Rocklin<[email protected]> 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
> >> [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.
> >> >>>>
> >> >>>> --
> >> >>>> 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.
> >> >>>>
> >> >>>>
> >> >>
> >> >> --
> >> >> 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.
> >> >>
> >> >
> >> > --
> >> > 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.
> >> >
> >>
> >> --
> >> 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 sympy
> >> [email protected].
> >> 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 [email protected].
> >> To unsubscribe from this group, send email to sympy
> >> [email protected].
> >> 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 [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.
> >
> >
>
> --
> 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.
>
>
--
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.