Eq-1.0: EqManips/Algorithm/Eval.hs
{-# LANGUAGE Rank2Types #-}
module EqManips.Algorithm.Eval( reduce
, exactReduce
, evalGlobalLossyStatement
, evalGlobalLosslessStatement
) where
import EqManips.Types
import EqManips.Algorithm.Cleanup
import EqManips.Algorithm.Eval.GenericEval
import EqManips.Algorithm.Eval.GlobalStatement
import EqManips.Algorithm.Eval.Floating
import EqManips.Algorithm.Eval.Polynomial
import EqManips.Algorithm.Eval.Ratio
import EqManips.Algorithm.Eval.Complex
import EqManips.Algorithm.Eval.Types
import EqManips.Algorithm.Simplify
evalGlobalLossyStatement, evalGlobalLosslessStatement :: FormulaEvaluator
evalGlobalLossyStatement = evalGlobalStatement reduce'
evalGlobalLosslessStatement = evalGlobalStatement exactReduce'
-- | Main function to evaluate another function
reduce :: FormulaEvaluator
reduce = taggedEvaluator reduce'
-- | Main function to evaluate raw formula
reduce' :: EvalFun
reduce' f = eval reduce' (cleaner f)
>>= ratioEvalRules
>>= complexEvalRules reduce'
>>= polyEvalRules reduce' . cleaner
>>= floatEvalRules . cleaner
>>= simplifyFormula reduce'
>>= return . cleaner
where cleaner = unTagFormula . cleanupRules . Formula
-- | Only perform non-lossy transformations
exactReduce :: FormulaEvaluator
exactReduce = taggedEvaluator exactReduce'
-- | same as exactReduce, but perform on raw formula.
exactReduce' :: EvalFun
exactReduce' f = eval exactReduce' (cleaner f)
>>= ratioEvalRules
>>= complexEvalRules exactReduce'
>>= polyEvalRules exactReduce' . cleaner
>>= simplifyFormula reduce'
where cleaner = unTagFormula . cleanupRules . Formula