{-# LANGUAGE GADTs,RebindableSyntax,CPP,FlexibleContexts,FlexibleInstances,ConstraintKinds #-} {-# GHC-OPTS -dcore-lint #-} {- - The idea of this test suite is that it should be compiled - with the -fplugin=Herbie and -dcore-lint flags. - Then we check to make sure GHC didn't throw any errors during - the core type checking process. -} module Main where import SubHask -------------------------------------------------------------------------------- -- This section tests that Herbie obeys the code annotations {-# ANN ann "NoHerbie" #-} ann :: Float -> Float ann x = x+x+x*x*x*x noann :: Float -> Float noann x = x+x+x*x*x*x -------------------------------------------------------------------------------- -- This section tests that Herbie gets run on the correct types. -- Herbie should be run on all the functions below. #define f1(x) (sqrt ((x)+1) - sqrt (x)) herbie1 :: Real a => a -> a herbie1 x = f1(x) herbie2 :: Real a => a -> a -> a -> a -> a herbie2 a b c d = f1(a)+f1(b)+f1(c)+f1(d) herbie3 :: Float -> Float herbie3 x = f1(x) herbie4 :: String -> String herbie4 str = show $ f1(x1) where x1 = fromIntegral (length str) :: Float herbie5 :: (Show a, Real a) => String -> a -> String herbie5 str x1 = show $ f1(x1) herbie6 :: (Show a, Real a) => a -> String -> String herbie6 x1 str = show $ f1(x1) herbie7 :: Semigroup a => a -> a herbie7 x1 = x1+x1+x1+x1+x1 herbie8 :: Float -> Float herbie8 x1 = case x1 of 1.0 -> f1(x1) 2.0 -> x1 herbie9 :: Float -> Float herbie9 x1 = go 4 x1 where go :: Float -> Float -> Float go 0 b = b go a b = go (a-1) (sqrt (b-1)) -- Herbie should not get run on any of the functions in this section. #define f2(a,b) a+b*(a+b*a)+a*b noherbie1 :: String -> String noherbie1 x = x++"hello world" noherbie2 :: Rational -> Rational -> Rational noherbie2 a b = f2(a,b) noherbie3 :: Int -> Int -> Int noherbie3 a b = f2(a,b) noherbie4 :: x -> Int -> Int -> Int noherbie4 x a b = f2(a,b) -------------------------------------------------------------------------------- -- Herbie shouldn't process these because the expression size is too small. -- We're unlikely to get any benefit, and it might take a long time. toosmall1 :: Float -> Float toosmall1 a = a+a toosmall2 :: Float -> Float -> Float -> Float toosmall2 a b c = a+b*c -- These are big enough and should get processed bigenough1 :: Float -> Float bigenough1 a = a+a*a bigenough2 :: Float -> Float -> Float -> Float bigenough2 a b c = a+b*(c+a) bigenough3 :: Float -> Float -> Float -> Float bigenough3 a b c = f1(c) -------------------------------------------------------------------------------- -- This section contains lots of examples of expressions that the Herbie plugin can parse -- and find improved versions. example1 x1 x2 = sqrt (x1*x1 + x2*x2) example2 x = exp(log(x)+8) example3 x = sqrt(x*x +1) -1 example4 x = exp(x)-1 example5 x = log(1+x) example6 x y = sqrt(x+ y) - sqrt(y) example7 k r a = k*(r-a)^3 example8 k r a = k*(r-a)^2 example9 x y = sin(x - y) example10 p1x p2x p1y p2y = sqrt((p1x - p2x) * (p1x - p2x) + (p1y - p2y) * (p1y - p2y)) example11 x = sin(x)-x example12 x = 1-cos(x) example13 x1 x2 = sqrt((x1 - x2) * (x1 - x2)) example14 x y z = sqrt(x*x + y*y + z*z) example15 x y z c = sqrt(x*x + y*y + z*z)/c example16 tdx dx tdy dy = (tdx * dx + tdy * dy) / (dx * dx + dy * dy) example17 tdx dx tdy dy sl2 = (tdx * dx + tdy * dy) / sl2 example18 x = (x + 0.1)-x example19 x = log(x) - sin(x+1) example20 a b = exp(1+log(a) + log(b)) example21 x = (1+sqrt(x-1))/(x-1)^2 example22 x = (1+sqrt(x))/(x-1)^2 example23 a b c d e f = a+b+(((d-c)*(d-c))*e*f/(e+f)) example24 q = sqrt(q*(q-1)) example25 a = sqrt(a^2-1) example26 a b c d = ((a*b)+(c*d))/(a+c) example27 x = sqrt(x^2) example28 x y = sqrt(x) * y * y example29 x y z = sqrt(x*x+y*y+z*z) example30 x y = 1.75 * x * y*y + sqrt(x/y) example31 x = exp(3*log(x)+2) example32 x = exp(2*log(x)) example33 x = sqrt(1/x + 1) - sqrt(1/x) example34 left i right count = left + i * ((left - right) / count) example35 left right count = left + count * ((left - right) / count) example36 x y = sqrt(x*x) - sqrt(y*y) example37 x = log(x+1)-log(x) example38 x = log(x+1)^x example39 minval minstep val = (minval/minstep + val) * minstep example40 x = x*x*cos(x/2 - sqrt(x)) example41 x = sqrt(4+x^2+x) example42 x y z = x / sqrt(x*x + y*y + z*z) example43 x = sin(sqrt(x+1)) example44 x = sqrt(x-2)-sqrt(x*x-3) example45 x = (sin(x) - tan(x)) / x example46 x y = 1 / sqrt(x^2 - y^2) example47 x1 x2 = sqrt((x1 - x2)^2) example48 x = x - sin(x) example49 x = sqrt(x + 1) - 1 + x example50 a b c = (a*a - c*c)/b example51 x y = sin(x+y)-cos(x+y) example52 x = (x + 1)^2 - 1 example53 x = sqrt(1+x) - sqrt(x) example54 x = sqrt(x + 1) / (x*x) example55 x = sqrt(x^2 / 3) example56 a b = 100*(a-b)/a example57 x = abs(x^3)-x^3 example58 x = log(x) - log(x+1) example59 x = 1/x - 1/(x+1) example60 a b c = -b + sqrt(b*b-4*a*c)/(2*a) example61 a c an cn = log(exp(a)*an + exp(c)*cn) - log(an+cn) example62 x = sqrt(sin(x)) - sqrt(x) example63 x = log(1+x) example64 a b = a * b / (1 - b + a * b) example65 a b = b*sqrt(a * a + 1.0) example65' a = sqrt(a * a + 1.0) example66 x y = x * y * x*pi/y example67 x = sqrt(x + 1) - sqrt(x - 1) example68 x = cos(x + 1) * x^2 example69 a b = b*(a/b - log(1 + a/b)) example70 a b = b*(a/b - 1 - log(a/b)) example71 x = (6/(x^99))*(x^101) example72 x = (1/(x^99))*(x^101) example73 x = (1/(x^100))*(x^100) example74 x y z = cos(sqrt(x*x+y*y+z*z)) example75 x = sqrt(sqrt(x*x+1)+1) example76 a k = a + sqrt(a*a-k) example77 a k = -a - sqrt(a*a-k) example78 a b x = x*x*a+x*(a+b) +x*b example79 x = (x + x) ^ 3 / x example80 x = sqrt(x+1)-sqrt 1 example81 x = (x+1)-x example82 x = sqrt(x+100)-sqrt(x) example83 x = 1-cos(x) example84 u v = sqrt(sqrt(u^2 + v^2) - u) example85 x = exp(log(x)) example86 x = sqrt(x + 1) - sqrt x + sin(x - 1) example87 x = exp x / sqrt(exp x - 1) * sqrt x example88 x = (exp(x) - 1) / x example89 x = sqrt(x + 2) - sqrt(x) -------------------------------------------------------------------------------- -- The main function does nothing main = return ()