packages feed

numeric-prelude-0.4.3.3: test/Test/MathObj/RefinementMask2.hs

-- Do not edit! Automatically created with doctest-extract from src/MathObj/RefinementMask2.hs
{-# LINE 32 "src/MathObj/RefinementMask2.hs" #-}

module Test.MathObj.RefinementMask2 where

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

{-# LINE 33 "src/MathObj/RefinementMask2.hs" #-}
import     qualified MathObj.RefinementMask2 as Mask
import     qualified MathObj.Polynomial      as Poly
import     qualified MathObj.Polynomial.Core as PolyCore

import     qualified Algebra.Differential as D
import     qualified Algebra.Ring as Ring
import     Test.NumericPrelude.Utility ((/\))
import     qualified Test.QuickCheck as QC
import     NumericPrelude.Numeric as NP
import     NumericPrelude.Base as P
import     Prelude ()

import     Data.Function.HT (nest)
import     Data.Maybe (fromMaybe)


hasMultipleZero     :: (Ring.C a, Eq a) => Int -> a -> Poly.T a -> Bool
hasMultipleZero     n x poly =
       all (zero==) $ take n $
       map (flip Poly.evaluate x) $
       iterate D.differentiate poly

genAdmissibleMask     :: QC.Gen (Mask.T Rational, Poly.T Rational)
genAdmissibleMask     =
       QC.suchThatMap QC.arbitrary $
          \mask -> fmap ((,) mask) $ Mask.toPolynomial mask

polyFromMask     :: Mask.T a -> Poly.T a
polyFromMask     = Poly.fromCoeffs . Mask.coeffs

genShortPolynomial     :: Int -> QC.Gen (Poly.T Rational)
genShortPolynomial     n =
       fmap (Poly.fromCoeffs . PolyCore.normalize . take n) $ QC.arbitrary

test :: DocTest.T ()
test = do
 DocTest.printPrefix "MathObj.RefinementMask2:127: "
{-# LINE 127 "src/MathObj/RefinementMask2.hs" #-}
 DocTest.property
{-# LINE 127 "src/MathObj/RefinementMask2.hs" #-}
     (genAdmissibleMask /\ \(mask,poly) -> hasMultipleZero (fromMaybe 0 $ Poly.degree poly) 1 (polyFromMask (Mask.fromPolynomial poly) - polyFromMask mask))
 DocTest.printPrefix "MathObj.RefinementMask2:129: "
{-# LINE 129 "src/MathObj/RefinementMask2.hs" #-}
 DocTest.property
{-# LINE 129 "src/MathObj/RefinementMask2.hs" #-}
     (genShortPolynomial 5 /\ \poly -> maybe False (Poly.collinear poly) $ Mask.toPolynomial $ Mask.fromPolynomial poly)
 DocTest.printPrefix "MathObj.RefinementMask2:161: "
{-# LINE 161 "src/MathObj/RefinementMask2.hs" #-}
 DocTest.example
{-# LINE 161 "src/MathObj/RefinementMask2.hs" #-}
   (fmap ((6::Rational) *>) $ Mask.toPolynomial (Mask.fromCoeffs [0.1, 0.02, 0.005::Rational]))
  [ExpectedLine [LineChunk "Just (Polynomial.fromCoeffs [-12732 % 109375,272 % 625,-18 % 25,1 % 1])"]]
 DocTest.printPrefix "MathObj.RefinementMask2:207: "
{-# LINE 207 "src/MathObj/RefinementMask2.hs" #-}
 DocTest.property
{-# LINE 207 "src/MathObj/RefinementMask2.hs" #-}
     (genShortPolynomial 5 /\ \poly -> poly == Mask.refinePolynomial (Mask.fromPolynomial poly) poly)
 DocTest.printPrefix "MathObj.RefinementMask2:209: "
{-# LINE 209 "src/MathObj/RefinementMask2.hs" #-}
 DocTest.example
{-# LINE 209 "src/MathObj/RefinementMask2.hs" #-}
   (fmap (round :: Double -> Integer) $ fmap (1000000*) $ nest 50 (Mask.refinePolynomial (Mask.fromCoeffs [0.1, 0.02, 0.005])) (Poly.fromCoeffs [0,0,0,1]))
  [ExpectedLine [LineChunk "Polynomial.fromCoeffs [-116407,435200,-720000,1000000]"]]