module Dvda.Examples ( doCse
, showFg
, cgen
, mexgen
) where
import Dvda.Expr
import Dvda.FunGraph
import Dvda.CGen
import Dvda.Vis ( previewGraph )
import Dvda.CSE ( cse )
import Dvda.AD ( rad )
someFunGraph :: IO (FunGraph Double)
someFunGraph = toFunGraph inputs outputs
where
x = sym "x" :: Expr Double
y = sym "y"
z = sym "z"
w = sym "w"
w1 = sym "w1"
w2 = sym "w2"
w3 = sym "w3"
f0 = x*y + z + w1 + w2
f2 = f0 * w2/w3
f1 = [f0/2, f0*y, w, 0.0, 0]
boo = x
inputs = boo :* [y]:*[[z]] :* [w3,w1,w2,w]
outputs = f0:*f1:*f2:*[[f0*f0]]:*(rad f2 [x,y,z,w,w1,w2,w3])
doCse :: IO ()
doCse = do
fg' <- someFunGraph
putStrLn $ "fungraph has " ++ show (countNodes fg') ++ " nodes"
let fg = cse fg'
putStrLn $ "fungraph has " ++ show (countNodes fg) ++ " nodes after cse"
showFg :: IO ()
showFg = someFunGraph >>= previewGraph
cgen :: IO ()
cgen = fmap (showC RowMajor "foo") someFunGraph >>= putStrLn
mexgen :: IO ()
mexgen = fmap (showMex "foo") someFunGraph >>= putStrLn