packages feed

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