summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'dev-haskell/math-functions/files/math-functions-0.3.4.2-fix-test-suite.patch')
-rw-r--r--dev-haskell/math-functions/files/math-functions-0.3.4.2-fix-test-suite.patch118
1 files changed, 118 insertions, 0 deletions
diff --git a/dev-haskell/math-functions/files/math-functions-0.3.4.2-fix-test-suite.patch b/dev-haskell/math-functions/files/math-functions-0.3.4.2-fix-test-suite.patch
new file mode 100644
index 000000000000..5dd2d9c622f7
--- /dev/null
+++ b/dev-haskell/math-functions/files/math-functions-0.3.4.2-fix-test-suite.patch
@@ -0,0 +1,118 @@
+From 7e5deed1cb3fafdd6eb035b3713ae2f46b67014a Mon Sep 17 00:00:00 2001
+From: Alexey Khudyakov <alexey.skladnoy@gmail.com>
+Date: Thu, 8 Jun 2023 13:26:11 +0300
+Bug: https://github.com/haskell/math-functions/pull/75
+Signed-off-by: hololeap <hololeap@protonmail.com>
+Subject: [PATCH] Fix test suite
+
+QC as of 2.14.3. became much better at generating test cases and started
+reliably failing Kahan summation
+
+This was fixed by tweaking badvec to be just very bad. Not outrageously
+bad.
+---
+ tests/Tests/Sum.hs | 72 +++++++++++++++++++++++++++-------------------
+ 1 file changed, 43 insertions(+), 29 deletions(-)
+
+diff --git a/tests/Tests/Sum.hs b/tests/Tests/Sum.hs
+index 08eaf1e..1fcb2e9 100644
+--- a/tests/Tests/Sum.hs
++++ b/tests/Tests/Sum.hs
+@@ -4,54 +4,68 @@ module Tests.Sum (tests) where
+
+ import Control.Applicative ((<$>))
+ import Numeric.Sum as Sum
++import Numeric.MathFunctions.Comparison
+ import Prelude hiding (sum)
+ import Test.Tasty (TestTree, testGroup)
+-import Test.Tasty.QuickCheck (testProperty)
++import Test.Tasty.QuickCheck
+ import Test.QuickCheck (Arbitrary(..))
+ import qualified Prelude
+
+-t_sum :: ([Double] -> Double) -> [Double] -> Bool
+-t_sum f xs = f xs == trueSum xs
+-
+-t_sum_error :: ([Double] -> Double) -> [Double] -> Bool
+-t_sum_error f xs = abs (ts - f xs) <= abs (ts - Prelude.sum xs)
+- where ts = trueSum xs
+-
+-t_sum_shifted :: ([Double] -> Double) -> [Double] -> Bool
++-- Test that summation result is same as exact sum. That should pass
++-- if we're effectively working with quad precision
++t_sum :: ([Double] -> Double) -> [Double] -> Property
++t_sum f xs
++ = counterexample ("APPROX = " ++ show approx)
++ $ counterexample ("EXACT = " ++ show exact)
++ $ counterexample ("DELTA = " ++ show (approx - exact))
++ $ counterexample ("ULPS = " ++ show (ulpDistance approx exact))
++ $ approx == exact
++ where
++ approx = f xs
++ exact = trueSum xs
++
++-- Test that summation has smaller error than naive summation or no
++-- worse than given number of ulps. If we're close enough to exact
++-- answer naive may get ahead
++t_sum_error :: ([Double] -> Double) -> [Double] -> Property
++t_sum_error f xs
++ = counterexample ("APPROX = " ++ show approx)
++ $ counterexample ("NAIVE = " ++ show naive)
++ $ counterexample ("EXACT = " ++ show exact)
++ $ counterexample ("A-EXACT = " ++ show (approx - exact))
++ $ counterexample ("N-EXACT = " ++ show (naive - exact))
++ $ counterexample ("ULPS[A] = " ++ show (ulpDistance approx exact))
++ $ counterexample ("ULPS[N] = " ++ show (ulpDistance naive exact))
++ $ abs (exact - approx) <= abs (exact - naive)
++ where
++ naive = Prelude.sum xs
++ approx = f xs
++ exact = trueSum xs
++
++t_sum_shifted :: ([Double] -> Double) -> [Double] -> Property
+ t_sum_shifted f = t_sum_error f . zipWith (+) badvec
+
+ trueSum :: (Fractional b, Real a) => [a] -> b
+ trueSum xs = fromRational . Prelude.sum . map toRational $ xs
+
+ badvec :: [Double]
+-badvec = cycle [1,1e16,-1e16]
++badvec = cycle [1, 1e14, -1e14]
+
+ tests :: TestTree
+-tests = testGroup "Summation" [
+- testGroup "ID" [
+- -- plain summation loses precision quickly
+- -- testProperty "t_sum" $ t_sum (sum id)
+-
+- -- tautological tests:
+- -- testProperty "t_sum_error" $ t_sum_error (sum id)
+- -- testProperty "t_sum_shifted" $ t_sum_shifted (sum id)
+- ]
+- , testGroup "Kahan" [
+- -- tests that cannot pass:
+- -- testProprty "t_sum" $ t_sum (sum kahan)
+- -- testProperty "t_sum_error" $ t_sum_error (sum kahan)
+-
+- -- kahan summation only beats normal summation with large values
++tests = testGroup "Summation"
++ [ testGroup "Kahan" [
++ -- Kahan summation only beats naive summation when truly
++ -- catastrophic cancellation occurs
+ testProperty "t_sum_shifted" $ t_sum_shifted (sum kahan)
+ ]
+ , testGroup "KBN" [
+- testProperty "t_sum" $ t_sum (sum kbn)
+- , testProperty "t_sum_error" $ t_sum_error (sum kbn)
++ testProperty "t_sum" $ t_sum (sum kbn)
++ , testProperty "t_sum_error" $ t_sum_error (sum kbn)
+ , testProperty "t_sum_shifted" $ t_sum_shifted (sum kbn)
+ ]
+ , testGroup "KB2" [
+- testProperty "t_sum" $ t_sum (sum kb2)
+- , testProperty "t_sum_error" $ t_sum_error (sum kb2)
++ testProperty "t_sum" $ t_sum (sum kb2)
++ , testProperty "t_sum_error" $ t_sum_error (sum kb2)
+ , testProperty "t_sum_shifted" $ t_sum_shifted (sum kb2)
+ ]
+ ]