codegen.mw

Illustration of the "codegen" Maple package 

 

Clara Masse, John Masse and François Ollivier 

 

> with(codegen); -1
 

> F := proc (x, y) local a, b, c; a := `+`(x, y); b := `*`(a, `*`(x)); c := `+`(b, 2); `*`(c, `*`(y)) end proc; -1
 

Reverse mode 

> H := GRADIENT(F, mode = reverse)
 

proc (x, y) local a, b, c, df; a := `+`(x, y); b := `*`(a, `*`(x)); c := `+`(b, 2); df := array(1 .. 3); df[3] := y; df[2] := df[3]; df[1] := `*`(df[2], `*`(x)); return `+`(`*`(a, `*`(df[2])), df[1]),...
proc (x, y) local a, b, c, df; a := `+`(x, y); b := `*`(a, `*`(x)); c := `+`(b, 2); df := array(1 .. 3); df[3] := y; df[2] := df[3]; df[1] := `*`(df[2], `*`(x)); return `+`(`*`(a, `*`(df[2])), df[1]),...
proc (x, y) local a, b, c, df; a := `+`(x, y); b := `*`(a, `*`(x)); c := `+`(b, 2); df := array(1 .. 3); df[3] := y; df[2] := df[3]; df[1] := `*`(df[2], `*`(x)); return `+`(`*`(a, `*`(df[2])), df[1]),...
proc (x, y) local a, b, c, df; a := `+`(x, y); b := `*`(a, `*`(x)); c := `+`(b, 2); df := array(1 .. 3); df[3] := y; df[2] := df[3]; df[1] := `*`(df[2], `*`(x)); return `+`(`*`(a, `*`(df[2])), df[1]),...
proc (x, y) local a, b, c, df; a := `+`(x, y); b := `*`(a, `*`(x)); c := `+`(b, 2); df := array(1 .. 3); df[3] := y; df[2] := df[3]; df[1] := `*`(df[2], `*`(x)); return `+`(`*`(a, `*`(df[2])), df[1]),...
proc (x, y) local a, b, c, df; a := `+`(x, y); b := `*`(a, `*`(x)); c := `+`(b, 2); df := array(1 .. 3); df[3] := y; df[2] := df[3]; df[1] := `*`(df[2], `*`(x)); return `+`(`*`(a, `*`(df[2])), df[1]),...
proc (x, y) local a, b, c, df; a := `+`(x, y); b := `*`(a, `*`(x)); c := `+`(b, 2); df := array(1 .. 3); df[3] := y; df[2] := df[3]; df[1] := `*`(df[2], `*`(x)); return `+`(`*`(a, `*`(df[2])), df[1]),...
proc (x, y) local a, b, c, df; a := `+`(x, y); b := `*`(a, `*`(x)); c := `+`(b, 2); df := array(1 .. 3); df[3] := y; df[2] := df[3]; df[1] := `*`(df[2], `*`(x)); return `+`(`*`(a, `*`(df[2])), df[1]),...
proc (x, y) local a, b, c, df; a := `+`(x, y); b := `*`(a, `*`(x)); c := `+`(b, 2); df := array(1 .. 3); df[3] := y; df[2] := df[3]; df[1] := `*`(df[2], `*`(x)); return `+`(`*`(a, `*`(df[2])), df[1]),...
proc (x, y) local a, b, c, df; a := `+`(x, y); b := `*`(a, `*`(x)); c := `+`(b, 2); df := array(1 .. 3); df[3] := y; df[2] := df[3]; df[1] := `*`(df[2], `*`(x)); return `+`(`*`(a, `*`(df[2])), df[1]),...
proc (x, y) local a, b, c, df; a := `+`(x, y); b := `*`(a, `*`(x)); c := `+`(b, 2); df := array(1 .. 3); df[3] := y; df[2] := df[3]; df[1] := `*`(df[2], `*`(x)); return `+`(`*`(a, `*`(df[2])), df[1]),...
(1)
 

> H2 := optimize(H)
 

proc (x, y) local a, df, t2; a := `+`(x, y); df := array(1 .. 3); df[1] := `*`(y, `*`(x)); t2 := df[1]; return `+`(`*`(a, `*`(y)), t2), `+`(`*`(a, `*`(x)), t2, 2) end proc
proc (x, y) local a, df, t2; a := `+`(x, y); df := array(1 .. 3); df[1] := `*`(y, `*`(x)); t2 := df[1]; return `+`(`*`(a, `*`(y)), t2), `+`(`*`(a, `*`(x)), t2, 2) end proc
proc (x, y) local a, df, t2; a := `+`(x, y); df := array(1 .. 3); df[1] := `*`(y, `*`(x)); t2 := df[1]; return `+`(`*`(a, `*`(y)), t2), `+`(`*`(a, `*`(x)), t2, 2) end proc
proc (x, y) local a, df, t2; a := `+`(x, y); df := array(1 .. 3); df[1] := `*`(y, `*`(x)); t2 := df[1]; return `+`(`*`(a, `*`(y)), t2), `+`(`*`(a, `*`(x)), t2, 2) end proc
(2)
 

Forward mode 

> K := GRADIENT(F, mode = forward)
 

proc (x, y) local a, b, c, da, db, dc; da := array(1 .. 2); db := array(1 .. 2); dc := array(1 .. 2); da[1] := 1; da[2] := 1; a := `+`(x, y); db[1] := `+`(`*`(x, `*`(da[1])), a); db[2] := `*`(da[2], `...
proc (x, y) local a, b, c, da, db, dc; da := array(1 .. 2); db := array(1 .. 2); dc := array(1 .. 2); da[1] := 1; da[2] := 1; a := `+`(x, y); db[1] := `+`(`*`(x, `*`(da[1])), a); db[2] := `*`(da[2], `...
proc (x, y) local a, b, c, da, db, dc; da := array(1 .. 2); db := array(1 .. 2); dc := array(1 .. 2); da[1] := 1; da[2] := 1; a := `+`(x, y); db[1] := `+`(`*`(x, `*`(da[1])), a); db[2] := `*`(da[2], `...
proc (x, y) local a, b, c, da, db, dc; da := array(1 .. 2); db := array(1 .. 2); dc := array(1 .. 2); da[1] := 1; da[2] := 1; a := `+`(x, y); db[1] := `+`(`*`(x, `*`(da[1])), a); db[2] := `*`(da[2], `...
proc (x, y) local a, b, c, da, db, dc; da := array(1 .. 2); db := array(1 .. 2); dc := array(1 .. 2); da[1] := 1; da[2] := 1; a := `+`(x, y); db[1] := `+`(`*`(x, `*`(da[1])), a); db[2] := `*`(da[2], `...
proc (x, y) local a, b, c, da, db, dc; da := array(1 .. 2); db := array(1 .. 2); dc := array(1 .. 2); da[1] := 1; da[2] := 1; a := `+`(x, y); db[1] := `+`(`*`(x, `*`(da[1])), a); db[2] := `*`(da[2], `...
proc (x, y) local a, b, c, da, db, dc; da := array(1 .. 2); db := array(1 .. 2); dc := array(1 .. 2); da[1] := 1; da[2] := 1; a := `+`(x, y); db[1] := `+`(`*`(x, `*`(da[1])), a); db[2] := `*`(da[2], `...
proc (x, y) local a, b, c, da, db, dc; da := array(1 .. 2); db := array(1 .. 2); dc := array(1 .. 2); da[1] := 1; da[2] := 1; a := `+`(x, y); db[1] := `+`(`*`(x, `*`(da[1])), a); db[2] := `*`(da[2], `...
proc (x, y) local a, b, c, da, db, dc; da := array(1 .. 2); db := array(1 .. 2); dc := array(1 .. 2); da[1] := 1; da[2] := 1; a := `+`(x, y); db[1] := `+`(`*`(x, `*`(da[1])), a); db[2] := `*`(da[2], `...
proc (x, y) local a, b, c, da, db, dc; da := array(1 .. 2); db := array(1 .. 2); dc := array(1 .. 2); da[1] := 1; da[2] := 1; a := `+`(x, y); db[1] := `+`(`*`(x, `*`(da[1])), a); db[2] := `*`(da[2], `...
proc (x, y) local a, b, c, da, db, dc; da := array(1 .. 2); db := array(1 .. 2); dc := array(1 .. 2); da[1] := 1; da[2] := 1; a := `+`(x, y); db[1] := `+`(`*`(x, `*`(da[1])), a); db[2] := `*`(da[2], `...
proc (x, y) local a, b, c, da, db, dc; da := array(1 .. 2); db := array(1 .. 2); dc := array(1 .. 2); da[1] := 1; da[2] := 1; a := `+`(x, y); db[1] := `+`(`*`(x, `*`(da[1])), a); db[2] := `*`(da[2], `...
proc (x, y) local a, b, c, da, db, dc; da := array(1 .. 2); db := array(1 .. 2); dc := array(1 .. 2); da[1] := 1; da[2] := 1; a := `+`(x, y); db[1] := `+`(`*`(x, `*`(da[1])), a); db[2] := `*`(da[2], `...
proc (x, y) local a, b, c, da, db, dc; da := array(1 .. 2); db := array(1 .. 2); dc := array(1 .. 2); da[1] := 1; da[2] := 1; a := `+`(x, y); db[1] := `+`(`*`(x, `*`(da[1])), a); db[2] := `*`(da[2], `...
proc (x, y) local a, b, c, da, db, dc; da := array(1 .. 2); db := array(1 .. 2); dc := array(1 .. 2); da[1] := 1; da[2] := 1; a := `+`(x, y); db[1] := `+`(`*`(x, `*`(da[1])), a); db[2] := `*`(da[2], `...
proc (x, y) local a, b, c, da, db, dc; da := array(1 .. 2); db := array(1 .. 2); dc := array(1 .. 2); da[1] := 1; da[2] := 1; a := `+`(x, y); db[1] := `+`(`*`(x, `*`(da[1])), a); db[2] := `*`(da[2], `...
(3)
 

> K2 := optimize(K)
 

proc (x, y) local a, db, dc; db := array(1 .. 2); dc := array(1 .. 2); a := `+`(x, y); db[1] := `+`(a, x); dc[1] := db[1]; return `*`(dc[1], `*`(y)), `+`(`*`(a, `*`(x)), `*`(y, `*`(x)), 2) end proc
proc (x, y) local a, db, dc; db := array(1 .. 2); dc := array(1 .. 2); a := `+`(x, y); db[1] := `+`(a, x); dc[1] := db[1]; return `*`(dc[1], `*`(y)), `+`(`*`(a, `*`(x)), `*`(y, `*`(x)), 2) end proc
proc (x, y) local a, db, dc; db := array(1 .. 2); dc := array(1 .. 2); a := `+`(x, y); db[1] := `+`(a, x); dc[1] := db[1]; return `*`(dc[1], `*`(y)), `+`(`*`(a, `*`(x)), `*`(y, `*`(x)), 2) end proc
proc (x, y) local a, db, dc; db := array(1 .. 2); dc := array(1 .. 2); a := `+`(x, y); db[1] := `+`(a, x); dc[1] := db[1]; return `*`(dc[1], `*`(y)), `+`(`*`(a, `*`(x)), `*`(y, `*`(x)), 2) end proc
proc (x, y) local a, db, dc; db := array(1 .. 2); dc := array(1 .. 2); a := `+`(x, y); db[1] := `+`(a, x); dc[1] := db[1]; return `*`(dc[1], `*`(y)), `+`(`*`(a, `*`(x)), `*`(y, `*`(x)), 2) end proc
(4)
 

>