Items tagged with codegen

I'm trying to use the CodeGeneration package to generate code for a series expansion. I'd like to wrap it in a function that specifies the arguments, so that the code generation package can generate a complete function definition along with definitions for all the temporary variables.

f := proc(r): x->r end proc:
to_translate := f(convert(series(sin(x),x,20),polynom));

to_translate := proc (x) options operator, arrow; x-(1/6)*x^3+(1/120)*x^5-(1/5040)*x^7+(1/362880)*x^9-(1/39916800)*x^11+(1/6227020800)*x^13-(1/1307674368000)*x^15+(1/355687428096000)*x^17-(1/121645100408832000)*x^19 end proc

CodeGeneration['C']( to_translate );

Warning, procedure/module options ignored
double to_translate (double x)

Instead of using the value for 'r' passed in, CodeGenerate is producing a function which returns the bare symbol 'r' which is treated as a double. It shouldn't be an issue with lazy evalution because 'to_translate' is evaluated on the statement before the call to CodeGeneration, and to_translate has the full expression that I want to generate code for. How do I get CodeGeneration to produce the intented result?

that can run without maple using my own maple code?

And how about Maplesim? I heard that Maplesim can generate executable file

I have a series of formulae arranged as a vector.  I need to do two things to this vector:

(1) Optimize it using 'tryhard'.  

(2) Use the optimized results to create a new procedure.


I can do either (1) or (2) alone, but when I try to combine them as one command it never works.  A simplified example of what I'm attempting with the resulting error message is below:

with(codegen, optimize, makeproc);
V := Vector(4);
V[1] := x+y;
V[2] := x^2+y^2;
V[3] := x^3+y^3;
V[4] := x^2+y^2+x+y;

T := makeproc([optimize(V, 'tryhard')], [x, y]);

Error, (in codegen/makeproc) Unrecognized input [t78 = x+y, t73 = y^2, t74 = x^2, t77 = t73+t74, t1 = (Vector(4, {(1) = t78, (2) = t77, (3) = t73*y+t74*x, (4) = t77+t78}))]

It seems that makeproc cannot handle a combination of optimized assignments and a vector of formulae.  Is there anyway to fix this?




I am trying to optimize a 39, 1 MATLAB matrix, but cannot seem to get a result beyond a 6, 1 matrix. I am getting "Warning, cannot resolve types, reassigning t##'s type" where t## varies from each time I run it, and can show multiple of these warnings. It also says "Warning, cannot translate list".


I found a pretty similar problem posted here earlier, where the user "Carl Love" suggested to replace a command from the original code with

     subsop([-1,1]= J, eval([codegen:-optimize](tmp, tryhard), pow= `^`)),
     output = string, defaulttype = numeric


I was wondering what exactly this command does? Can I apply it to my code to solve my problem? It yielded a result that looks (on the surface) as an optimized code, but I don't feel completely comfortable using it without being certain.

What I have done is simply to replace Matlab(tmp, optimize) with the suggested code above. My code is attached. Thanks in advance for any help.

Cannot calculate derivative (gradient) of a procedure returned by dsolve.

Say, I solve the equation:

S1 := dsolve([diff(y(x), x$2)-1.0325*diff(y(x), x)+1.36*y(x)=sin(2*x), y(0)=0, y(1)=1], numeric, y(x), 'output' = listprocedure);

Its solution easily can be retrieved and looks fine:


plot(H(t), t = 0..1, thickness = 4);


But when I try to calculate the gradient of H, I receive the error:

H1 := codegen[GRADIENT](H);

Error, (in intrep/statement) unable to translate Array(1..4, {(1) = proc (outpoint) local X, Y, YP, yout, errproc, L, V, i; option `Copyright (c) 2000 by Waterloo Maple Inc. All rights reserved.`; X := Vector(8, {(1) = .0, (2) = .14817993189456188, (3) = .31785812820433257, (4) = .47163479035679234, (5) = .6130306894371967, (6) = .7460958115245858, (7) = .8741894219027533, (8) = 1.0}, datatype = float[8], order = C_order); Y := Matrix(8, 2, {(1, 1) = .0, (1, 2) = .47692145669848085, (2, 1) = 0.7710429970702501e-1, (2, 2) = .5707930170882397, (3, 1) = .1866916935738028, (3, 2) = .7299040171277492, (4, 1) = .3128649714509215, (4, 2) = .9171936...

Gradient of procedures defined by  ":= proc()" is calculated properly.


I use maple for the determination of the symbolic relations between the geometric relations on multibody system.

I would like to create a dll function for the functions that I have determined symbolically.

I have already a paper presenting : 
- the transformation Maple --> code C with the package with(CodeGeneration)
- and the transformation code C --> another software.

I would like to directly create a dll function from my maple function with using code C. Is it possible and how ?

Thanks a lot for your help.


Hi all,

I'm using MAPLE 13 and I'd like to know if someone knows how to generate the variables associated to the CodeGeneration for C code. At this moment I need to create manually the variable generated from the C code.


JJ := Jacobian(convert(Pint, Vector), [P1xenu, P1yenu, P1zenu, roll, pitch, yaw, D1xbody, D1ybody, P2xenu, P2yenu, P2zenu, ROLL, PITCH, YAW, D2xbody, D2ybody]);

CodeGeneration['C'](JJ, optimize);


t1 = cov2 * cov2;
t2 = cov1 * cov1;
t4 = 0.1e1 / (t1 + t2);

And in the C code I need to create:

double t1, t2, t3..... manually

I can I solve this issue?

Best regards

André Dias

I'm new to Maple, so my question could appear idiotic. But, anyway. :-)

I want to understand the restrictions of code generation in Maple.
What functions could I convert to code?
Only listed in "Translation of Functions" block in this link?

For example, I've found this post - 

Could functions "Maximize" and "diff" be converted to Java, VB or something or not? If yes, how?

Thanks anyway. :-)

I have a maple classic code. at the end I convert a parametric matrix to fortran77 code. in optimized mode

now I need to edit the Fortran77 code to Fortran90. for this job I have another code to do that.

but how should I write the codegen output to a test file?

The version 16 of Maple does not know the function "pow", it is replaced by "power". Nevertheless, the codegen[optimize] procedure still generates it!  Moreower, it's not optimal even to write poser(..., 1/2)  as, most probably, the function sqrt must run faster. 

  Here's an example: (the function being optimized just contains some nested square roots)

> iang10 := [codegen[optimize](Re(int11), tryhard)];
[ 2 t17
Page 1 of 1