packages feed

interpolation-0.1.1.2: test/Test/Numeric/Interpolation/Piecewise.hs

-- Do not edit! Automatically created with doctest-extract from src/Numeric/Interpolation/Piecewise.hs
{-# LINE 10 "src/Numeric/Interpolation/Piecewise.hs" #-}

module Test.Numeric.Interpolation.Piecewise where

import Test.DocTest.Base
import qualified Test.DocTest.Driver as DocTest

{-# LINE 11 "src/Numeric/Interpolation/Piecewise.hs" #-}
import     qualified Numeric.Interpolation.Piecewise as Piecewise
import     qualified Numeric.Interpolation.NodeList as Nodes
import     qualified Numeric.Interpolation.Type as Type

import     qualified Data.List as List
import     qualified Data.Set as Set
import     Data.Array (accumArray, listArray)
import     Data.List.HT (lengthAtLeast)

import     qualified Test.QuickCheck as QC
import     Test.QuickCheck ((==>))

forAllSortedRatios     ::
       (QC.Testable prop) => ([Rational] -> Rational -> prop) -> QC.Property
forAllSortedRatios     f =
       QC.forAll (fmap Set.toAscList QC.arbitrary) $ \nodeXs x ->
          f (map fromInteger nodeXs) (fromInteger x)

checkEq     ::
       (Ord x, Eq y, Num y) =>
       Type.T x y ny -> [x] -> x -> Bool
checkEq     typ nodeXs x =
       let ys =
              map
                 (flip (Piecewise.interpolateConstantExt typ) x)
                 (Type.basisFunctions typ nodeXs)
           bounds = (0, length ys - 1)
       in  listArray bounds ys
           ==
           accumArray (flip const) 0 bounds
              (Type.sampleBasisFunctions typ nodeXs x)

quantile     :: (Show a, Ord a, Fractional a) => [a] -> a -> a
quantile     [] _ = error "quantile: empty list"
quantile     [y] _ = y
quantile     ys x =
       let len = fromIntegral (length ys - 1)
       in Piecewise.interpolateConstantExt Type.linear
             (Nodes.fromList $ zip (map (/ len) $ map fromInteger [0..]) $
              List.sort ys)
             x

test :: DocTest.T ()
test = do
 DocTest.printPrefix "Numeric.Interpolation.Piecewise:58: "
{-# LINE 58 "src/Numeric/Interpolation/Piecewise.hs" #-}
 DocTest.example
{-# LINE 58 "src/Numeric/Interpolation/Piecewise.hs" #-}
   (Piecewise.interpolate Type.linear (Nodes.fromList [(0,0),(3,6),(5,10::Rational)]) 2)
  [ExpectedLine [LineChunk "4 % 1"]]
 DocTest.printPrefix "Numeric.Interpolation.Piecewise:60: "
{-# LINE 60 "src/Numeric/Interpolation/Piecewise.hs" #-}
 DocTest.example
{-# LINE 60 "src/Numeric/Interpolation/Piecewise.hs" #-}
   (Piecewise.interpolate Type.hermite1 (Nodes.fromList [(0,(0,0)),(3,(9,6)),(5,(25,10::Rational))]) 2)
  [ExpectedLine [LineChunk "4 % 1"]]
 DocTest.printPrefix "Numeric.Interpolation.Piecewise:62: "
{-# LINE 62 "src/Numeric/Interpolation/Piecewise.hs" #-}
 DocTest.example
{-# LINE 62 "src/Numeric/Interpolation/Piecewise.hs" #-}
   (Piecewise.interpolate Type.hermite1 (Nodes.fromList [(0,(1,-2)),(3,(4,4)),(5,(16,8::Rational))]) 2)
  [ExpectedLine [LineChunk "1 % 1"]]
 DocTest.printPrefix "Numeric.Interpolation.Piecewise:75: "
{-# LINE 75 "src/Numeric/Interpolation/Piecewise.hs" #-}
 DocTest.property
{-# LINE 75 "src/Numeric/Interpolation/Piecewise.hs" #-}
     (forAllSortedRatios $ checkEq Type.linear)
 DocTest.printPrefix "Numeric.Interpolation.Piecewise:76: "
{-# LINE 76 "src/Numeric/Interpolation/Piecewise.hs" #-}
 DocTest.property
{-# LINE 76 "src/Numeric/Interpolation/Piecewise.hs" #-}
     (forAllSortedRatios $ checkEq Type.hermite1)
 DocTest.printPrefix "Numeric.Interpolation.Piecewise:77: "
{-# LINE 77 "src/Numeric/Interpolation/Piecewise.hs" #-}
 DocTest.property
{-# LINE 77 "src/Numeric/Interpolation/Piecewise.hs" #-}
     (forAllSortedRatios $ \nodeXs x -> lengthAtLeast 4 nodeXs ==> checkEq Type.cubicLinear nodeXs x)
 DocTest.printPrefix "Numeric.Interpolation.Piecewise:78: "
{-# LINE 78 "src/Numeric/Interpolation/Piecewise.hs" #-}
 DocTest.property
{-# LINE 78 "src/Numeric/Interpolation/Piecewise.hs" #-}
     (forAllSortedRatios $ \nodeXs x -> lengthAtLeast 4 nodeXs ==> checkEq Type.cubicParabola nodeXs x)
 DocTest.printPrefix "Numeric.Interpolation.Piecewise:91: "
{-# LINE 91 "src/Numeric/Interpolation/Piecewise.hs" #-}
 DocTest.property
{-# LINE 91 "src/Numeric/Interpolation/Piecewise.hs" #-}
     (\(QC.NonEmpty xs) -> quantile (xs::[Rational]) 0 == minimum xs)
 DocTest.printPrefix "Numeric.Interpolation.Piecewise:92: "
{-# LINE 92 "src/Numeric/Interpolation/Piecewise.hs" #-}
 DocTest.property
{-# LINE 92 "src/Numeric/Interpolation/Piecewise.hs" #-}
     (\(QC.NonEmpty xs) -> quantile (xs::[Rational]) 1 == maximum xs)
 DocTest.printPrefix "Numeric.Interpolation.Piecewise:84: "
{-# LINE 84 "src/Numeric/Interpolation/Piecewise.hs" #-}
 DocTest.example
{-# LINE 84 "src/Numeric/Interpolation/Piecewise.hs" #-}
   (quantile [2,5,3::Rational] 0.5)
  [ExpectedLine [LineChunk "3 % 1"]]
 DocTest.printPrefix "Numeric.Interpolation.Piecewise:86: "
{-# LINE 86 "src/Numeric/Interpolation/Piecewise.hs" #-}
 DocTest.example
{-# LINE 86 "src/Numeric/Interpolation/Piecewise.hs" #-}
   (quantile [2,5,3,7::Rational] 0.5)
  [ExpectedLine [LineChunk "4 % 1"]]
 DocTest.printPrefix "Numeric.Interpolation.Piecewise:88: "
{-# LINE 88 "src/Numeric/Interpolation/Piecewise.hs" #-}
 DocTest.example
{-# LINE 88 "src/Numeric/Interpolation/Piecewise.hs" #-}
   (quantile [2,5,3,7::Rational] 0.25)
  [ExpectedLine [LineChunk "11 % 4"]]