Génération de Code C en Mathematica

Le packetage SymbolicC

Yves Papegay

INRIA Sophia Antipolis, COPRIN - France

Dans cet exposé, je vais décrire notre approche de la génération de code C en Mathematica, et notamment les fonctionnalités développées dans le packetage SymbolicC, qui implémente une représention complète du langage C en Mathematica et facilite ainsi la génération de code C lorsque celui-ci doit satisfaire des règles de codage, des contraintes de développement, et autres critères de qualité, ou doit être compilé et interfacé avec du code préexistant.

Motivations

pour utiliser C

pour utiliser Mathematica pour générer du C

pour utiliser SymbolicC

Un exemple simple

Ecrire une fonction C calculant ((∫_0)^x)f(t) dt avec f(t)=(sin^6)(t).

à la main

Integrate[g=Sin[t]^6,{t,0,x}]
%//CForm

#include "mdefs.h"
double f(double x)
{
double y;
y = ;
return(y) ;
}

avec Splice

Import["templ.mc","Text"]

Splice["templ.mc","integsplice.c"]
Import["integsplice.c"]

et pour une liste d' expressions...

exprList=Table[With[{n=RandomInteger[9]+1},Apply[Plus,Transpose[{RandomInteger[9,n],RandomInteger[9,n]}]/.{a_,b_}:>RandomChoice[{-1,1}]Sin[t]^a Cos[t]^b]],{10}];

First[exprList]

Timing[MapIndexed[Block[{g=#1,i=First[#2]},Splice["templ.mc","integ"<>ToString[First[#2]]<>".c"]]&,exprList];]

Select[Import["."],StringMatchQ[#,"*.c"]&]

Import["integ1.c"]

avec SymbolicC

<<SymbolicC`

p=ProgramC[
IncludeC["mdefs.h"],
FunctionC[double,"f",{DeclareC[double,x]},BlockC[{
DeclareC[double,y],
AssignC[y,Integrate[Sin[t]^6,{t,0,x}]],
ReturnC[y]}]]]

CCode[p]

et pour une liste d' expressions...

Timing[p=ProgramC[
IncludeC["mdefs.h"],MapIndexed[
FunctionC[double,"f"<>ToString[First[#2]],{DeclareC[double,x]},BlockC[{
DeclareC[double,y],
AssignC[y,Integrate[#1,{t,0,x}]],
ReturnC[y]}]]&,exprList]];CWrite["integsymb.c",p]]

Import["integsymb.c","Text"]

Génération de code C

un processus complexe en trois étapes

voir l'exemple Hessian.nb de MathCode et les fonctions Mathematica Compile et CForm.

avec une représentation interne de C en Mathematica

SymbolicC

représentation interne du C

SymbolicC fournit une représentation complète du langage normalisé ANSI C et des instructions du préprocesseur (SymbolicC/CWrapper.nb)

SymbolicCKeywords

export

SymbolicC possède une fonction de traduction CCode et une fonction d'export CWrite function. (SymbolicC/CodeGen.nb)

mais aussi

SymbolicC définit quelques macros très utile pour la génération d'objets SymbolicC.

SymbolicMCKeywords

MainMC[{instr1,instr2}]

Deux autres exemples

académique

Etant donné une expression et un nombre N, générer une fonction C calculant toutes ses dérivées d'ordre N.

expr=5x Cos[y+z]-y^3Sin[x z]

GenCode[expr_,N_Integer]:=CCode[With[{inputs=Union[Cases[expr,_Symbol,Infinity]]},ProgramC[IncludeC["math.h"],FunctionMC[double,PtrC["gen_diff"<>ToString[N]],Map[{#,double}&,inputs],Flatten[{DeclareC[Nest[ArrayC[#,Length[inputs]]&,double,N],m],MapIndexed[Function[{s,t},AssignC[Fold[ArrayC[#1,#2-1]&,m,t],s]],D[expr,{inputs,N}],{N}],ReturnC[PtrC[m]]}]]]]]

GenCode[expr,2]

industriel

Conclusion

J'ai sans doute oublié de parler de :

UpValues[IncludeC]

mailto:Yves.Papegay@sophia.inria.fr

http://gforge.inria.fr/projects/mathematools/

Utiliser SymbolicC and participer à son développement - nous aimerions un "Import" !