On Tue, Feb 14, 2012 at 2:45 AM, Aaron Meurer <asmeu...@gmail.com> wrote:
> On Mon, Feb 13, 2012 at 4:21 AM, Sergiu Ivanov
> <unlimitedscol...@gmail.com> wrote:
>>
>> 1. Karr algorithm
>>
>> 2. Improvement of Groebner bases
>>
>> 3. Improvements to the poly module
>
> What do you mean by relevance? Those are all relevant to SymPy.  If
> you want to sort by importance, then they are ordered from less
> important to more important the way you've listed them.

Hm, I see.

Although it's kind of obvious, I'd still like to make it explicitly
clear that, of all the tasks I could potentially commit to, I'd rather
choose the subset of tasks which are more likely to be accepted,
that's why the question.

> Pretty much all the algebra related ideas are relevant enough to be a
> good project.  I'd still need more convincing for category theory
> (i.e., more specifics about what the module would look like).

This is how I envision the structure of a module that would approach
the problems I described.  It should include a Python class to
represent an abstract category (call it Category), another one for an
object (CategoryObject) of the category and another one for a morphism
(CategoryMorphism).  Category must expose a method to test whether a
CategoryObject is contained in it; likewise for CategoryMorphism.
CategoryObject must have a name.  CategoryMorphism must have a name
and references to its domain and codomain.  In the cases of concrete
categories the user is expected to derive their own classes which
would define the corresponding structure.  For example, for the
category of groups, a GroupObject should include a reference to the
set over which it is defined and (symbolically) define the group
operation.  Correspondingly, a GroupMorphism should define a
(symbolic) transition from an element of its domain to an element of
its codomain (like, a -> a/2).  The class GroupCategory, derived from
Category, has the responsibility to check whether an instance of
GroupObject is indeed a group and whether a GroupMorphism is indeed a
group morphism.

As you can see, all of this stuff relies very heavily on symbolic
computations.

Further, the module should contain a class Diagram, which contain a
collection of CategoryObjects and corresponding CategoryMorphisms.
Diagram should be able to draw itself and, I'd like this one as well,
pretty print itself to the isympy console.  Diagram should also
support annotating every object it includes.  In this way, some
additional information can be included in the diagram, like the values
of concrete elements we pick out in the objects.

Obviously, the scent of graph theory can be sensed here.  However, an
algebraic diagram is a very specific type of graph.  One of the most
important specific details is that the dimension of a diagram is very
small, on graph scale: I've rarely seen diagrams containing more than
20 objects (actually, I don't think many people have seen/drawn such
diagrams).

As I said earlier, there are two essentially different ways of
checking the commutativity of a diagram.  For a concrete category, the
problem is in checking the equivalence of paths from A to B, where A
and B and are arbitrary sources and sinks in the diagram.  Here,
obviously, I'm going to rely on symbolic calculations a big deal,
while the graph theoretical part is quite trivial (find the sources
and sinks, traverse all paths).  This functionality may fit within a
single function or it might be factored out in a class and a couple
satellites if need be.

The other way of checking commutativity is for abstract categories.  I
think this capability should be central to the tool and I expect it to
require the better part of the effort.  I expect to see something like
a class AbstractCategory, which should be able to accept a list of
diagrams which are *assumed* to be commutative.  Checking the
commutativity of a diagram in this setup would include considering the
embeddings of the diagrams known to be commutative.

Apparently, the scent of graph theory becomes very powerful here.
However, the algorithms I am going to need are quite specific and
aren't really relevant outside the domain I'm considering.  With the
simplest approach, I need to find *all* possible embeddings of every
diagram and then consider *all* possible combinations of such
embeddings.  Every found embedding states that a certain part of the
diagram in question is commutative.  The problem is how to interpret a
combination of embeddings.  Right now I have the following idea:
suppose I have found that two subsets of objects A and B of the
diagram in question (together with the corresponding morphisms) form
commutative (sub)diagrams.  If the intersection of A and B is not
empty, then the combination of objects A U B (union of A and B)
together with the corresponding morphisms, forms a commutative diagram
as well.

Therefore, the straightforward way to see if a diagram is commutative
is finding all possible embeddings of the diagrams known to be
commutative, start from one of the embeddings and try to find
embeddings which have common points with this one.  Then, attempt to
increase the coverage of the initial diagram and see whether it can
all be covered.  If no, drop the current route and start with another
one.

Now observe that I'm talking of "embeddings of diagrams" rather than
"embeddings of graphs".  The reason for this is that, when one has a
diagram, one essentially considers the reflexive and transitive
closure of the underlying graph.  This, I believe, may make it easier
to solve the problem of finding an embedding.  Observer further that,
beyond finding embeddings, the problems I describe are quite specific
to category theoretic reasoning.  I've skimmed the pages
http://networkx.lanl.gov/contents.html ,
http://code.google.com/p/python-graph/ , and I've also read
attentively http://wiki.python.org/moin/PythonGraphApi , and I've
found little related to what I'm suggesting.

Now, diagrams can actually include more information than I have
already described.  A commutative diagram which describes a property
is usually specified as causal relation (like, if there is a morphism
A -> B with <property1> and a morphism B -> C, then there *exists* a
morphism A -> C such that <something>).  Therefore, checking whether a
given diagram is commutative does not only consist in finding
embeddings, but rather, in finding the embeddings of the causal parts
of diagrams (and checking the properties of the morphisms and objects
specified in the causal parts) and in adding the inferred objects and
morphisms, together with their properties.  All this additional
properties are, obviously, going to be stored in Diagram.

This whole explanation makes me feel that the module I am talking of
is very much similar to a proof checker.  While I am still interested,
I'd like to hear an assessment of how relevant to SymPy this could be.

> I recommend that you pick an idea that is interesting to you and
> research it so that you understand exactly what needs to be done in
> SymPy to get it to work (and don't worry, we are here to help with
> that too).  And also, make sure that you have a good enough feel for
> the mathematical background required for the project that you can do
> it. It's OK if you haven't studied the thing itself yet, but you
> should have all the prerequisites, so to speak.

Oh, great, thank you :-)

In this case, I'll have to confess that I've been musing on the
perspective of working on Karr a couple days, and I feel like I'm more
attracted to the problems listed here
https://github.com/sympy/sympy/wiki/gsoc-2012-Ideas under the title
Polynomials module.  My interest decreases the way the ideas are
ordered there, i.e., I like the idea about the Groebner bases most.
Therefore, in accordance with your suggestion (I believe) I'll find
some papers on this topic and, specifically, Faugere F4 (since F5 has
already been implemented, I think).

(BTW, I'm not saying that Karr is not interesting, it's just that I
don't somehow feel emotionally attached to it :-) )

I am, of course, still willing to work on the commutative diagram
tool, but I'm only in case you deem it relevant *and* important :-)

Sergiu

-- 
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