On Sep 30, 2009, at 2:38 PM, Burcin Erocal wrote:

> Hi,
>
> Here is the current state of my symbolic functions changes. I won't be
> able to work on this much in the near future. I don't even expect to
> have e-mail access in the next few days.
>
> I would really like to hear comments and suggestions on the new  
> design.
> Below is a quick summary of some of the new stuff. I need to go pack,
> and get some sleep before I leave tomorrow. :)
>
>
> Here are the major changes:
>       
>  * evalf now accepts a parent argument instead of a precision
>   This allows us to use the numeric evaluation framework in ginac for
>   evaluating things with RIF, CIF, instances as well, not just RR, or
>   CC with the given precision.

+1

>  * python arguments passed to custom methods of sfunctions are not
>    wrapped in Expression objects any more. No need to call .pyobject()
>    to unwrap these.

+1

>  * custom methods support calling methods on self.
>   This would be useful if you need access to other function of the
>   defining class, or store tables of data calculated on demand.
>
>  * __call__ method supports hold parameter
>   This works:
>       sage: exp(log(x))
>         x
>         sage: exp(log(x), hold=True)
>         e^log(x)

+1. Now we should hook this up to a context, e.g.

with symbolic_hold(True):  # name ???
     exp(log(x)) + 2 + 2 # doesn't evaluate it at all, or at least  
not the function calling part

>  * Custom methods for symbolic functions (_eval_, _evalf_,  
> _conjugate_,
>    _derivative_, etc. See [1] for a list of support functions.) can be
>    written in Cython for builtin functions (that are provided by the
>    Sage library)

Excellent.

>   The pickling code tries to pickle the custom functions as well, and
>   this is only supported for python functions. We don't need to store
>   the function code if it is already defined in the library though.
>
> Some things that need thought:
>
>  * The new class structure
>
>   We have 4 different types of functions, those defined by
>    * ginac (sin, cos, ...),
>    * the Sage library (cot)
>    * the user (in a python file, subclassing the new
>      SymbolicFunction)
>    * the command line function_factory (by calling function('f') )
>
>   Things we need to do for these functions different for each of  
> these,
>   perhaps similar for the last two. Normally initializing a function
>   means checking if it's already defined, if not, initializing a
>   structure from ginac called function_options, and registering  
> this in
>   a table. There are also issues with pickling.
>
>   For ginac functions, we don't need any of this, since we can't  
> change
>   it at python level. We only need to look up the serial number (the
>   indicator in the table) of the function. We don't need to do  
> anything
>   to pickle or unpickle these either.
>
>   Pickling and unpickling library functions only needs an identifier
>   for the class to initialize it again if necessary.
>
>   User defined functions need to lookup if there is an existing
>   function in the table, since we should try to keep the table small.
>
>   The new hierarchy under sage.symbolic.function is:
>   Function
>     GinacFunction
>     CustomizableFunction
>       BuiltinFunction
>       SymbolicFunction

That sounds a lot nicer.

>
>   There is also a new function_factory in  
> sage.symbolic.function_factory
>   (it needs to be in a python file) that creates NewSymbolicFunction
>   classes on the fly for the function() calls from the command line.
>
>  * We should think about unifying these functions with the
>    CallableSymbolicExpression's This might be an easy way to
>    support arithmetic with these functions.
>
>  * Or, any other way to make arithmetic with these work.

Give them a Parent that coerces in to SR.

> Some of the things that still need work:
>
>  * pickling for NewSymbolicFunctions created in function_factory
>  * removing calls to math.* functions
>    we can't guarantee precision of these, IMHO, even for floats we
>    should call mpfr or mpmath, and convert the result back to float

I'm not so sure about this. IMHO, MPFR input -> MPFR output, double  
input -> double output. We shouldn't be using these on non-float/RDF  
inputs though.

All in all, it sounds like an welcome improvement.

- Robert


--~--~---------~--~----~------------~-------~--~----~
To post to this group, send an email to sage-devel@googlegroups.com
To unsubscribe from this group, send an email to 
sage-devel-unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sage-devel
URL: http://www.sagemath.org
-~----------~----~----~----~------~----~------~--~---

Reply via email to