HerbiePlugin-0.2.0.0: test/ValidRewrite.hs
{-# LANGUAGE GADTs,RebindableSyntax,CPP,FlexibleContexts,FlexibleInstances,ConstraintKinds #-}
{-# LANGUAGE StandaloneDeriving,DeriveDataTypeable #-}
{-
- This test suite ensures that the rewrites that HerbiePlugin performs
- give the correct results.
-}
module Main
where
import SubHask
import System.IO
import Linear.Quaternion
import Linear.V3
import Linear.Vector
--------------------------------------------------------------------------------
test1a :: Double -> Double -> Double
test1a far near = -(2 * far * near) / (far - near)
{-# ANN test1b "NoHerbie" #-}
test1b :: Double -> Double -> Double
test1b far near = -(2 * far * near) / (far - near)
{-# ANN test1c "NoHerbie" #-}
test1c :: Double -> Double -> Double
test1c far near = -(if far < (negate 1.7210442634149447e81)
then (far / (far - near)) * 2 * near
else if far < 8.364504563556443e16
then (far * 2) / (far - near) / near
else (far / (far - near)) * 2 * near)
--------------------
test2a :: Double -> Double -> Double
test2a a b = a + ((b - a) / 2)
{-# ANN test2b "NoHerbie" #-}
test2b :: Double -> Double -> Double
test2b a b = a + ((b - a) / 2)
--------------------
test3a :: Quaternion Double -> Quaternion Double -> Quaternion Double
test3a (Quaternion q0 (V3 q1 q2 q3)) (Quaternion r0 (V3 r1 r2 r3)) =
Quaternion (r0*q0+r1*q1+r2*q2+r3*q3)
(V3 (r0*q1-r1*q0-r2*q3+r3*q2)
(r0*q2+r1*q3-r2*q0-r3*q1)
(r0*q3-r1*q2+r2*q1-r3*q0))
^/ (r0*r0 + r1*r1 + r2*r2 + r3*r3)
{-# ANN test3b "NoHerbie" #-}
test3b :: Quaternion Double -> Quaternion Double -> Quaternion Double
test3b (Quaternion q0 (V3 q1 q2 q3)) (Quaternion r0 (V3 r1 r2 r3)) =
Quaternion (r0*q0+r1*q1+r2*q2+r3*q3)
(V3 (r0*q1-r1*q0-r2*q3+r3*q2)
(r0*q2+r1*q3-r2*q0-r3*q1)
(r0*q3-r1*q2+r2*q1-r3*q0))
^/ (r0*r0 + r1*r1 + r2*r2 + r3*r3)
--------------------------------------------------------------------------------
#define mkTest(f1,f2,a,b) \
putStrLn $ "mkTest: " ++ show (f1 (a) (b)); \
putStrLn $ "mkTest: " ++ show (f2 (a) (b)); \
putStrLn ""
main = do
mkTest(test1a,test1b,-2e90,6)
mkTest(test1a,test1b,0,6)
mkTest(test1a,test1b,2e90,6)
mkTest(test1a,test1c,-2e90,6)
mkTest(test1a,test1c,0,6)
mkTest(test1a,test1c,2e90,6)
mkTest(test2a,test2b,1,2)
mkTest(test3a,test3b,(Quaternion 1 (V3 1 2 3)),(Quaternion 2 (V3 2 3 4)))
putStrLn "done"