module Dvda.Algorithm
( Algorithm
, constructAlgorithm
, runAlgorithm
, runAlgorithm'
, toSymbolicAlg
, squashIsSame
) where
import qualified Data.Vector.Generic as G
import Dvda.Algorithm.Construct ( Algorithm(..), AlgOp(..), constructAlgorithm, squashWorkVector )
import Dvda.Algorithm.Eval ( runAlgorithm, runAlgorithm' )
import Dvda.Expr ( Expr(..), GExpr(..) )
squashIsSame :: (Eq (v a), G.Vector v a) => v a -> Algorithm a -> Bool
squashIsSame x alg = runAlgorithm alg x == runAlgorithm (squashWorkVector alg) x
toSymbolicAlg :: Eq a => Algorithm a -> Algorithm (Expr a)
toSymbolicAlg (Algorithm ind outd ops ws) = Algorithm ind outd (map opToExpr ops) ws
where
opToExpr :: Eq a => AlgOp a -> AlgOp (Expr a)
opToExpr (InputOp k idx) = InputOp k idx
opToExpr (OutputOp k idx) = OutputOp k idx
opToExpr (NormalOp k gexpr) = NormalOp k (g2e gexpr)
where
g2e :: Eq a => GExpr a b -> GExpr (Expr a) b
g2e (GSym x) = GSym x
g2e (GConst x) = GConst (EConst x)
g2e (GNum x) = GNum x
g2e (GFractional x) = GFractional x
g2e (GFloating x) = GFloating x