ideas-0.7: src/Domain/Math/Polynomial/Tests.hs
-----------------------------------------------------------------------------
-- Copyright 2010, Open Universiteit Nederland. This file is distributed
-- under the terms of the GNU General Public License. For more information,
-- see the file "LICENSE.txt", which is included in the distribution.
-----------------------------------------------------------------------------
-- |
-- Maintainer : bastiaan.heeren@ou.nl
-- Stability : provisional
-- Portability : portable (depends on ghc)
--
-----------------------------------------------------------------------------
module Domain.Math.Polynomial.Tests (tests) where
import Common.TestSuite
import Common.View
import Domain.Math.Polynomial.Generators
import Domain.Math.Polynomial.Views
import Domain.Math.Numeric.Views
import Domain.Math.Numeric.Laws
import Test.QuickCheck
------------------------------------------------------------
-- Testing instances
tests :: TestSuite
tests = do
let v = viewEquivalent (polyViewWith rationalView)
testNumLawsWith v "polynomial" (sized polynomialGen)
-- see the derivations for the DWO exercise set
{-
seeLE n = printDerivation linearExercise $ concat linearEquations !! (n-1)
seeQE n = printDerivation quadraticExercise $ orList $ return $ build equationView $ concat quadraticEquations !! (n-1)
seeHDE n = printDerivation higherDegreeExercise $ orList $ return $ build equationView $ higherDegreeEquations !! (n-1)
-- test strategies with DWO exercise set
{-
testLE = concat $ zipWith (f linearExercise) [1..] $ concat linearEquations
testQE = concat $ zipWith (f quadraticExercise) [1..] $ map (orList . return . build equationView) $ concat quadraticEquations
testHDE = concat $ zipWith (f higherDegreeExercise) [1..] $ map (orList . return . build equationView) higherDegreeEquations
-}
f :: (Show b, Show a) => Exercise a -> b -> a -> [b]
f s n e = map p (g (applyAll (strategy s) (inContext s e))) where
g xs | null xs = error $ show n ++ ": " ++ show e
| otherwise = xs
p a | maybe False (isReady s) (fromContext a) = n
| otherwise = error $ show n ++ ": " ++ show e ++ " => " ++ maybe "??" show (fromContext a)
randomLE = quickCheck $ forAll (liftM2 (:==:) (sized linearGen) (sized linearGen)) $ \eq ->
(>0) (sum (take 10 $ f linearExercise 1 eq))
randomQE = quickCheck $ forAll (liftM2 (:==:) (sized quadraticGen) (sized quadraticGen)) $ \eq ->
(>0) (sum (take 10 $ f quadraticExercise 1 (orList [build equationView eq])))
{-
eqLE = concat $ zipWith (g linearExercise) [1..] $ concat linearEquations
eqQE = concat $ zipWith (g quadraticExercise) [1..] $ map (orList . return) $ concat quadraticEquations
eqHDE = concat $ zipWith (g higherDegreeExercise) [1..] $ map (orList . return) higherDegreeEquations
g s n e = map p (h (derivations (derivationTree (strategy s) (inContext e)))) where
h xs | null xs = error $ show n ++ ": " ++ show e
| otherwise = xs
p (a, xs) = case [ (x, y) | x <- ys, y <- ys, Prelude.not (equivalence s x y) ] of
[] -> let l = length xs in l*l
(x, y):_ -> error $ show n ++ ": " ++ show x ++ " is not " ++ show y
where ys = map fromContext (a : map snd xs)
-}
-- e1 = match higherDegreeEquationsView $ OrList [(x :==: 2)] where x = Var "x"
-- e2 = simplify rationalView (Sqrt ())
-- goLE = eqTest ineqLinearExercise
goQE = eqTest ineqQuadraticExercise
--eqTest :: Exercise a -> IO ()
eqTest ex =
forM_ (examples ex) $ \eq -> do
let tree = derivationTree (strategy ex) (inContext ex eq)
forM_ (derivations tree) $ \d -> do
let xs = terms d
pp = maybe "??" (prettyPrinter ex) . fromContext
forM [ (a, b) | a <- xs, b <- xs ] $ \(a, b) ->
if equalityIneq a b -- equivalence ex (fromContext a) (fromContext b)
then putChar '.'
else error $ unlines ["", pp a, pp b]
equalityIneq :: Context (Logic (Relation Expr)) -> Context (Logic (Relation Expr)) -> Bool
equalityIneq ca cb = fromMaybe False $
liftM2 (equivalence ineqQuadraticExercise) (f ca) (f cb)
where
f = fmap g . fromContext
g | any clipboardHasIneq [ca,cb] = turnIntoEqualTo
| otherwise = id
clipboardHasIneq :: Context a -> Bool
clipboardHasIneq = isJust . evalCM (\_ -> lookupClipboard "ineq")
turnIntoEqualTo :: Logic (Relation a) -> Logic (Relation a)
turnIntoEqualTo = g . fmap (\rel ->
leftHandSide rel .==. rightHandSide rel)
where
-- temporary fix
g (p :&&: q) = g p :&&: g q
g (p :||: q) = g p :||: g q
g p = p -}