packages feed

regression-simple-0.2.2: test/generate-test-data.hs

{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
module Main where

import Control.Monad      (unless)
import Data.List          (unfoldr, zip5)
import System.Environment (getArgs)
import Text.Printf        (printf)

import qualified System.Random.SplitMix as SM

main :: IO ()
main = do
    args <- getArgs
    unless (null args) $ do
        let (g1 : g2 : g3 : g4 : _) = unfoldr (Just . SM.splitSMGen) (SM.mkSMGen 42)

        writeFile "gnuplot/linear.dat" $ unlines
            [ printf "%9.05f %9.05f %9.05f %9.05f" (x + dx) (y + dy) devX devY
            | (x, devX, devY, px, py) <- zip5
                [ 1 .. 20 :: Double ]
                devsX
                devsY
                (normals (doubles g1))
                (normals (doubles g2))
            , let y = 3 * x + 5
            , let dx = devX * px
            , let dy = devY * py
            ]

        writeFile "gnuplot/quad.dat" $ unlines
            [ printf "%9.05f %9.05f %9.05f %9.05f" (x + dx) (y + dy) devX devY
            | (x, devX, devY, px, py) <- zip5
                [ 1 .. 20 :: Double ]
                devsX
                devsY
                (normals (doubles g3))
                (normals (doubles g4))
            , let y = 0.1 * x * x - 3 * x + 5
            , let dx = devX * px
            , let dy = devY * py
            ]

boxMuller :: Double -> Double -> (Double, Double)
boxMuller u v = (x, y) where
    x = k * sin (2 * pi * v)
    y = k * cos (2 * pi * u)
    k = sqrt (negate 2 * log u)

doubles :: SM.SMGen -> [Double]
doubles g = let (d, g') = SM.nextDouble g in d : doubles g'

normals :: [Double] -> [Double]
normals []       = []
normals [_]      = []
normals (u:v:ds) = let (x, y) = boxMuller u v in x : y : normals ds

devsY :: [Double]
devsY = 1.2 : 1.4 : 1.6 : devsY

devsX :: [Double]
devsX = 0.2 : 0.3 : devsX