Andy Ray Terrel wrote:
> * The implicit_functions dict should only rename functions if
> necessary.  As it is this makes the code bloated.

It is also used to check if a function is an implicit function. We can split up 
the dictionary into a set and a dictionary in this style:

implicit_functions = set([sin, cos, tan, asin, acos, atan, atan2, sinh, cosh, 
tanh, sqrt, log, exp, abs, sign])
# The following are also considered to be implicit functions, but with a
# different fortran name:
translate_functions = {conjugate: "conjg"}

> * Can you do piecewise functions the same way as ccode does where you
> have the _print_Piecewise function.  Probably could go into
> LowLevelCodePrinter as well.

This is indeed a fly in our soup. The approach in ccode is not workable when 
there are non-top-level piecewise functions.

 >>> ccode(Piecewise((x, x<1),(1/x,True))**2)
'pow(if (x < 1) {\nx\n}\nelse {\n1.0/x\n},2)'

One can easily see that a 'buried' Piecewise can only be handled by 
_print_Piecewise if the target language supports a conditional operator. 
Fortran 
does not have one, C does but is not used in ccode. Other solutions are not 
compatible with the Printer approach: introducing temporary variables, or only 
allowing a top-level Piecewise.

If we want to translate buried Piecewise functions, we will have to do this 
outside the printer. The above expression should be split in multiple 
expressions before it can be fed to a printer:

 >>> print fcode(Piecewise((x, x<1),(1/x,True)), assign_to="x1")
       if (x < 1) then
         x1 = x
       else
         x1 = 1.0/x
       end if
 >>> print fcode(x1**2, assign_to="x2")
       x2 = x1**2

Any suggestions for a more elegant approach are highly welcome. :) The 
splitting 
is very similar to common subexpression elimination, which I would like to 
include in codegen.py. Therefore, it might be a good idea to treat both 
problems 
  in codegen.py with a generalized cse algorithm.

> * the line wrapping produces bad code (unreadable).  There needs to be
> work to take care of cases where operators will be split.  For
> example:
> 
> In [12]: e = [x**i for i in range(11)]
> 
> In [13]: print fcode(Add(*e))
> -------> print(fcode(Add(*e)))
>       1 + x + x**2 + x**3 + x**4 + x**5 + x**6 + x**7 + x**8 + x**9 + x*
>      @    *10

Will be fixed. Thanks for the nice example.

> * fcode function should move to something like the following signature
> (expr, *args, **kws) and look up the keywords, it gets too many
> optional keywords as is.

ok

> * Something that might be nice, instead of an exception being thrown
> just have a list of functions that are in the expression but not
> implemented in the core language. That way a code generator can look
> at what needs to be implemented and prompt the user appropriately
> instead of just halting.

That is indeed a better approach. It is a user friendly alternative to the 
exceptions. Thanks for the suggestion.

> * One test failed for me:
> 
> __________________________ sympy.printing.fcode.fcode 
> __________________________
> File "/Users/aterrel/workspace/sympy/sympy/printing/fcode.py", line
> 252, in sympy.printing.fcode.fcode
> Failed example:
>     fcode((2*tau)**Rational(7,2))
> Expected:
>     '      8*2**(1.0/2.0)*tau**(7.0/2.0)'
> Got:
>     '      8*sqrt(2)*tau**(7.0/2.0)'

oops.

> The tests and docs look good.  We should probably take some time and
> make ccode this good as well.

As soon as fcode is 'in', ccode will be brought to the same level, and both 
will 
be based on a low-level code printer. I'll first introduce all your 
suggestions. 
Thanks for reviewing.

cheers,

Toon

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

begin:vcard
fn:Toon Verstraelen
n:Verstraelen;Toon
org:Ghent University;Center for Molecular Modeling
adr:;;Proeftuinstraat 86;Ghent;;9000;Belgium
email;internet:[email protected]
title:ir.
tel;work:+32 (0) 9 264 65 56
tel;home:+32 (0) 9 351 56 05
x-mozilla-html:FALSE
url:http://molmod.ugent.be
version:2.1
end:vcard

Reply via email to