{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RecordWildCards #-}
module Math.Regression.Simple (
linear,
linearFit,
linearWithWeights,
linearWithYerrors,
linearWithXYerrors,
linearFit',
LinRegAcc (..),
zeroLinRegAcc,
addLinReg,
addLinRegW,
quadratic,
quadraticFit,
quadraticWithWeights,
quadraticWithYerrors,
quadraticWithXYerrors,
quadraticFit',
QuadRegAcc (..),
zeroQuadRegAcc,
addQuadReg,
addQuadRegW,
quadRegAccToLin,
levenbergMarquardt1,
levenbergMarquardt1WithWeights,
levenbergMarquardt1WithYerrors,
levenbergMarquardt1WithXYerrors,
levenbergMarquardt2,
levenbergMarquardt2WithWeights,
levenbergMarquardt2WithYerrors,
levenbergMarquardt2WithXYerrors,
levenbergMarquardt3,
levenbergMarquardt3WithWeights,
levenbergMarquardt3WithYerrors,
levenbergMarquardt3WithXYerrors,
Fit (..),
V2 (..),
V3 (..),
) where
import Control.DeepSeq (NFData (..))
import qualified Data.Foldable as F
import qualified Data.List.NonEmpty as NE
import Math.Regression.Simple.LinAlg
import Numeric.KBN
linear :: F.Foldable f => (a -> (Double, Double)) -> f a -> V2
linear :: forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double)) -> f a -> V2
linear a -> (Double, Double)
f = forall v. Fit v -> v
fitParams forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double)) -> f a -> Fit V2
linearFit a -> (Double, Double)
f
linearFit :: F.Foldable f => (a -> (Double, Double)) -> f a -> Fit V2
linearFit :: forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double)) -> f a -> Fit V2
linearFit a -> (Double, Double)
f = LinRegAcc -> Fit V2
linearFit' forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double)) -> f a -> LinRegAcc
linRegAcc a -> (Double, Double)
f
linearWithWeights :: F.Foldable f => (a -> (Double, Double, Double)) -> f a -> Fit V2
linearWithWeights :: forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double, Double)) -> f a -> Fit V2
linearWithWeights a -> (Double, Double, Double)
f = LinRegAcc -> Fit V2
linearFit' forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double, Double)) -> f a -> LinRegAcc
linRegAccW a -> (Double, Double, Double)
f
linearWithYerrors :: F.Foldable f => (a -> (Double, Double, Double)) -> f a -> Fit V2
linearWithYerrors :: forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double, Double)) -> f a -> Fit V2
linearWithYerrors a -> (Double, Double, Double)
f = forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double, Double)) -> f a -> Fit V2
linearWithWeights a -> (Double, Double, Double)
f' where
f' :: a -> (Double, Double, Double)
f' a
a = case a -> (Double, Double, Double)
f a
a of
(Double
x, Double
y, Double
dy) -> (Double
x, Double
y, forall a. Fractional a => a -> a
recip (Double
dy forall a. Num a => a -> a -> a
* Double
dy))
linearWithXYerrors
:: F.Foldable f
=> (a -> (Double, Double, Double, Double))
-> f a
-> NE.NonEmpty (Fit V2)
linearWithXYerrors :: forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double, Double, Double)) -> f a -> NonEmpty (Fit V2)
linearWithXYerrors a -> (Double, Double, Double, Double)
f f a
xs = forall b. (b -> b) -> b -> NonEmpty b
iterate1 Fit V2 -> Fit V2
go Fit V2
fit0 where
fit0 :: Fit V2
fit0 = forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double, Double)) -> f a -> Fit V2
linearWithYerrors (\a
a -> case a -> (Double, Double, Double, Double)
f a
a of (Double
x,Double
y,Double
_,Double
dy) -> (Double
x,Double
y,Double
dy)) f a
xs
go :: Fit V2 -> Fit V2
go Fit V2
fit = forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double, Double)) -> f a -> Fit V2
linearWithWeights (\a
a -> case a -> (Double, Double, Double, Double)
f a
a of (Double
x,Double
y,Double
dx,Double
dy) -> (Double
x,Double
y,forall a. Fractional a => a -> a
recip forall a b. (a -> b) -> a -> b
$ forall a. Num a => a -> a
sq (Double
param1 forall a. Num a => a -> a -> a
* Double
dx) forall a. Num a => a -> a -> a
+ forall a. Num a => a -> a
sq Double
dy)) f a
xs where
V2 Double
param1 Double
_ = forall v. Fit v -> v
fitParams Fit V2
fit
linearFit' :: LinRegAcc -> Fit V2
linearFit' :: LinRegAcc -> Fit V2
linearFit' LinRegAcc {Int
KBN
lra_y2 :: LinRegAcc -> KBN
lra_xy :: LinRegAcc -> KBN
lra_y :: LinRegAcc -> KBN
lra_x2 :: LinRegAcc -> KBN
lra_x :: LinRegAcc -> KBN
lra_w :: LinRegAcc -> KBN
lra_n :: LinRegAcc -> Int
lra_y2 :: KBN
lra_xy :: KBN
lra_y :: KBN
lra_x2 :: KBN
lra_x :: KBN
lra_w :: KBN
lra_n :: Int
..} = forall v. v -> v -> Int -> Double -> Fit v
Fit V2
params V2
errors Int
ndf Double
wssr where
matrix :: SM22
matrix@(SM22 Double
a11 Double
_ Double
a22) = forall a. Inv a => a -> a
inv (Double -> Double -> Double -> SM22
SM22 Double
x2 Double
x Double
w)
params :: V2
params@(V2 Double
a Double
b) = forall a b c. Mult a b c => a -> b -> c
mult SM22
matrix (Double -> Double -> V2
V2 Double
xy Double
y)
errors :: V2
errors = Double -> Double -> V2
V2 Double
sa Double
sb
wssr :: Double
wssr = forall a. Ord a => a -> a -> a
max Double
0 (Double
y2 forall a. Num a => a -> a -> a
- Double
a forall a. Num a => a -> a -> a
* Double
xy forall a. Num a => a -> a -> a
- Double
b forall a. Num a => a -> a -> a
* Double
y)
ndf :: Int
ndf = Int
lra_n forall a. Num a => a -> a -> a
- Int
2
ndf' :: Double
ndf' = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
ndf :: Double
sa :: Double
sa = forall a. Floating a => a -> a
sqrt (Double
a11 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
sb :: Double
sb = forall a. Floating a => a -> a
sqrt (Double
a22 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
w :: Double
w = KBN -> Double
getKBN KBN
lra_w
x :: Double
x = KBN -> Double
getKBN KBN
lra_x
x2 :: Double
x2 = KBN -> Double
getKBN KBN
lra_x2
y :: Double
y = KBN -> Double
getKBN KBN
lra_y
xy :: Double
xy = KBN -> Double
getKBN KBN
lra_xy
y2 :: Double
y2 = KBN -> Double
getKBN KBN
lra_y2
linRegAcc :: F.Foldable f => (a -> (Double, Double)) -> f a -> LinRegAcc
linRegAcc :: forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double)) -> f a -> LinRegAcc
linRegAcc a -> (Double, Double)
f = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
F.foldl' (\LinRegAcc
acc a
a -> case a -> (Double, Double)
f a
a of (Double
x,Double
y) -> LinRegAcc -> Double -> Double -> LinRegAcc
addLinReg LinRegAcc
acc Double
x Double
y) LinRegAcc
zeroLinRegAcc
linRegAccW :: F.Foldable f => (a -> (Double, Double, Double)) -> f a -> LinRegAcc
linRegAccW :: forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double, Double)) -> f a -> LinRegAcc
linRegAccW a -> (Double, Double, Double)
f = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
F.foldl' (\LinRegAcc
acc a
a -> case a -> (Double, Double, Double)
f a
a of (Double
x,Double
y,Double
w) -> LinRegAcc -> Double -> Double -> Double -> LinRegAcc
addLinRegW LinRegAcc
acc Double
x Double
y Double
w) LinRegAcc
zeroLinRegAcc
quadratic :: F.Foldable f => (a -> (Double, Double)) -> f a -> V3
quadratic :: forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double)) -> f a -> V3
quadratic a -> (Double, Double)
f = forall v. Fit v -> v
fitParams forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double)) -> f a -> Fit V3
quadraticFit a -> (Double, Double)
f
quadraticFit :: F.Foldable f => (a -> (Double, Double)) -> f a -> Fit V3
quadraticFit :: forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double)) -> f a -> Fit V3
quadraticFit a -> (Double, Double)
f = QuadRegAcc -> Fit V3
quadraticFit' forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double)) -> f a -> QuadRegAcc
quadRegAcc a -> (Double, Double)
f
quadraticWithWeights :: F.Foldable f => (a -> (Double, Double, Double)) -> f a -> Fit V3
quadraticWithWeights :: forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double, Double)) -> f a -> Fit V3
quadraticWithWeights a -> (Double, Double, Double)
f = QuadRegAcc -> Fit V3
quadraticFit' forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double, Double)) -> f a -> QuadRegAcc
quadRegAccW a -> (Double, Double, Double)
f
quadraticWithYerrors :: F.Foldable f => (a -> (Double, Double, Double)) -> f a -> Fit V3
quadraticWithYerrors :: forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double, Double)) -> f a -> Fit V3
quadraticWithYerrors a -> (Double, Double, Double)
f = forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double, Double)) -> f a -> Fit V3
quadraticWithWeights a -> (Double, Double, Double)
f' where
f' :: a -> (Double, Double, Double)
f' a
a = case a -> (Double, Double, Double)
f a
a of
(Double
x, Double
y, Double
dy) -> (Double
x, Double
y, forall a. Fractional a => a -> a
recip (Double
dy forall a. Num a => a -> a -> a
* Double
dy))
quadraticWithXYerrors
:: F.Foldable f
=> (a -> (Double, Double, Double, Double))
-> f a
-> NE.NonEmpty (Fit V3)
quadraticWithXYerrors :: forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double, Double, Double)) -> f a -> NonEmpty (Fit V3)
quadraticWithXYerrors a -> (Double, Double, Double, Double)
f f a
xs = forall b. (b -> b) -> b -> NonEmpty b
iterate1 Fit V3 -> Fit V3
go Fit V3
fit0 where
fit0 :: Fit V3
fit0 = forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double, Double)) -> f a -> Fit V3
quadraticWithYerrors (\a
a -> case a -> (Double, Double, Double, Double)
f a
a of (Double
x,Double
y,Double
_,Double
dy) -> (Double
x,Double
y,Double
dy)) f a
xs
go :: Fit V3 -> Fit V3
go Fit V3
fit = forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double, Double)) -> f a -> Fit V3
quadraticWithWeights (\a
a -> case a -> (Double, Double, Double, Double)
f a
a of (Double
x,Double
y,Double
dx,Double
dy) -> (Double
x,Double
y,forall a. Fractional a => a -> a
recip forall a b. (a -> b) -> a -> b
$ forall a. Num a => a -> a
sq ((Double
2 forall a. Num a => a -> a -> a
* Double
p1 forall a. Num a => a -> a -> a
* Double
x forall a. Num a => a -> a -> a
+ Double
p2) forall a. Num a => a -> a -> a
* Double
dx) forall a. Num a => a -> a -> a
+ forall a. Num a => a -> a
sq Double
dy)) f a
xs where
V3 Double
p1 Double
p2 Double
_ = forall v. Fit v -> v
fitParams Fit V3
fit
quadraticFit' :: QuadRegAcc -> Fit V3
quadraticFit' :: QuadRegAcc -> Fit V3
quadraticFit' QuadRegAcc {Int
KBN
qra_y2 :: QuadRegAcc -> KBN
qra_x2y :: QuadRegAcc -> KBN
qra_xy :: QuadRegAcc -> KBN
qra_y :: QuadRegAcc -> KBN
qra_x4 :: QuadRegAcc -> KBN
qra_x3 :: QuadRegAcc -> KBN
qra_x2 :: QuadRegAcc -> KBN
qra_x :: QuadRegAcc -> KBN
qra_w :: QuadRegAcc -> KBN
qra_n :: QuadRegAcc -> Int
qra_y2 :: KBN
qra_x2y :: KBN
qra_xy :: KBN
qra_y :: KBN
qra_x4 :: KBN
qra_x3 :: KBN
qra_x2 :: KBN
qra_x :: KBN
qra_w :: KBN
qra_n :: Int
..} = forall v. v -> v -> Int -> Double -> Fit v
Fit V3
params V3
errors Int
ndf Double
wssr where
matrix :: SM33
matrix@(SM33 Double
a11
Double
_ Double
a22
Double
_ Double
_ Double
a33) = forall a. Inv a => a -> a
inv (Double -> Double -> Double -> Double -> Double -> Double -> SM33
SM33 Double
x4
Double
x3 Double
x2
Double
x2 Double
x Double
w)
params :: V3
params@(V3 Double
a Double
b Double
c) = forall a b c. Mult a b c => a -> b -> c
mult SM33
matrix (Double -> Double -> Double -> V3
V3 Double
x2y Double
xy Double
y)
errors :: V3
errors = Double -> Double -> Double -> V3
V3 Double
sa Double
sb Double
sc
wssr :: Double
wssr = forall a. Ord a => a -> a -> a
max Double
0 (Double
y2 forall a. Num a => a -> a -> a
- Double
a forall a. Num a => a -> a -> a
* Double
x2y forall a. Num a => a -> a -> a
- Double
b forall a. Num a => a -> a -> a
* Double
xy forall a. Num a => a -> a -> a
- Double
c forall a. Num a => a -> a -> a
* Double
y)
ndf :: Int
ndf = Int
qra_n forall a. Num a => a -> a -> a
- Int
3
ndf' :: Double
ndf' = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
ndf :: Double
sa :: Double
sa = forall a. Floating a => a -> a
sqrt (Double
a11 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
sb :: Double
sb = forall a. Floating a => a -> a
sqrt (Double
a22 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
sc :: Double
sc = forall a. Floating a => a -> a
sqrt (Double
a33 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
w :: Double
w = KBN -> Double
getKBN KBN
qra_w
x :: Double
x = KBN -> Double
getKBN KBN
qra_x
x2 :: Double
x2 = KBN -> Double
getKBN KBN
qra_x2
x3 :: Double
x3 = KBN -> Double
getKBN KBN
qra_x3
x4 :: Double
x4 = KBN -> Double
getKBN KBN
qra_x4
y :: Double
y = KBN -> Double
getKBN KBN
qra_y
xy :: Double
xy = KBN -> Double
getKBN KBN
qra_xy
x2y :: Double
x2y = KBN -> Double
getKBN KBN
qra_x2y
y2 :: Double
y2 = KBN -> Double
getKBN KBN
qra_y2
quadRegAcc :: F.Foldable f => (a -> (Double, Double)) -> f a -> QuadRegAcc
quadRegAcc :: forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double)) -> f a -> QuadRegAcc
quadRegAcc a -> (Double, Double)
f = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
F.foldl' (\QuadRegAcc
acc a
a -> case a -> (Double, Double)
f a
a of (Double
x,Double
y) -> QuadRegAcc -> Double -> Double -> QuadRegAcc
addQuadReg QuadRegAcc
acc Double
x Double
y) QuadRegAcc
zeroQuadRegAcc
quadRegAccW :: F.Foldable f => (a -> (Double, Double, Double)) -> f a -> QuadRegAcc
quadRegAccW :: forall (f :: * -> *) a.
Foldable f =>
(a -> (Double, Double, Double)) -> f a -> QuadRegAcc
quadRegAccW a -> (Double, Double, Double)
f = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
F.foldl' (\QuadRegAcc
acc a
a -> case a -> (Double, Double, Double)
f a
a of (Double
x,Double
y,Double
w) -> QuadRegAcc -> Double -> Double -> Double -> QuadRegAcc
addQuadRegW QuadRegAcc
acc Double
x Double
y Double
w) QuadRegAcc
zeroQuadRegAcc
levenbergMarquardt1
:: F.Foldable f
=> (Double -> a -> (Double, Double, Double))
-> Double
-> f a
-> NE.NonEmpty (Fit Double)
levenbergMarquardt1 :: forall (f :: * -> *) a.
Foldable f =>
(Double -> a -> (Double, Double, Double))
-> Double -> f a -> NonEmpty (Fit Double)
levenbergMarquardt1 Double -> a -> (Double, Double, Double)
f Double
b0 f a
xs = Double -> Double -> LM1Acc -> NonEmpty (Fit Double)
loop Double
lambda0 Double
b0 LM1Acc
acc0 where
acc0 :: LM1Acc
acc0 = Double -> LM1Acc
calcAcc Double
b0
lambda0 :: Double
lambda0 = forall a. Floating a => a -> a
sqrt (Double
c11 forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n)
where
n :: Int
n = LM1Acc -> Int
lm1_n LM1Acc
acc0
c11 :: Double
c11 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM1Acc -> KBN
lm1_c11 LM1Acc
acc0
calcAcc :: Double -> LM1Acc
calcAcc Double
beta = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
F.foldl' (\LM1Acc
acc a
p -> case Double -> a -> (Double, Double, Double)
f Double
beta a
p of (Double
y, Double
g, Double
d) -> LM1Acc -> Double -> Double -> Double -> LM1Acc
addLM1Acc LM1Acc
acc Double
y Double
g Double
d) LM1Acc
zeroLM1Acc f a
xs
loop :: Double -> Double -> LM1Acc -> NonEmpty (Fit Double)
loop Double
lambda Double
beta LM1Acc
acc
| Double -> Double -> Double -> Bool
lmStop Double
lambda Double
wssr Double
wssr'
= forall v. v -> v -> Int -> Double -> Fit v
Fit Double
beta Double
errors Int
ndf Double
wssr forall a. a -> [a] -> NonEmpty a
NE.:| []
| Double
wssr' forall a. Ord a => a -> a -> Bool
>= Double
wssr
= Double -> Double -> LM1Acc -> NonEmpty (Fit Double)
loop (Double
lambda forall a. Num a => a -> a -> a
* Double
10) Double
beta LM1Acc
acc
| Bool
otherwise
= forall v. v -> v -> Int -> Double -> Fit v
Fit Double
beta Double
errors Int
ndf Double
wssr forall a. a -> NonEmpty a -> NonEmpty a
`NE.cons` Double -> Double -> LM1Acc -> NonEmpty (Fit Double)
loop (Double
lambda forall a. Fractional a => a -> a -> a
/ Double
10) Double
beta' LM1Acc
acc'
where
lambda1 :: Double -> Double
lambda1 Double
z = (Double
1 forall a. Num a => a -> a -> a
+ Double
lambda) forall a. Num a => a -> a -> a
* Double
z
matrix :: Double
matrix = forall a. Inv a => a -> a
inv (Double -> Double
lambda1 Double
c11)
delta :: Double
delta = forall a b c. Mult a b c => a -> b -> c
mult Double
matrix Double
z1
beta' :: Double
beta' = forall a. Add a => a -> a -> a
add Double
beta Double
delta
acc' :: LM1Acc
acc' = Double -> LM1Acc
calcAcc Double
beta'
a11 :: Double
a11 = forall a. Inv a => a -> a
inv Double
c11
errors :: Double
errors = Double
sa
wssr :: Double
wssr = forall a. Ord a => a -> a -> a
max Double
0 forall a b. (a -> b) -> a -> b
$ KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM1Acc -> KBN
lm1_wssr LM1Acc
acc
wssr' :: Double
wssr' = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM1Acc -> KBN
lm1_wssr LM1Acc
acc'
ndf :: Int
ndf = LM1Acc -> Int
lm1_n LM1Acc
acc forall a. Num a => a -> a -> a
- Int
1
ndf' :: Double
ndf' = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
ndf :: Double
sa :: Double
sa = forall a. Floating a => a -> a
sqrt (Double
a11 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
c11 :: Double
c11 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM1Acc -> KBN
lm1_c11 LM1Acc
acc
z1 :: Double
z1 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM1Acc -> KBN
lm1_z1 LM1Acc
acc
levenbergMarquardt1WithWeights
:: F.Foldable f
=> (Double -> a -> (Double, Double, Double, Double))
-> Double
-> f a
-> NE.NonEmpty (Fit Double)
levenbergMarquardt1WithWeights :: forall (f :: * -> *) a.
Foldable f =>
(Double -> a -> (Double, Double, Double, Double))
-> Double -> f a -> NonEmpty (Fit Double)
levenbergMarquardt1WithWeights Double -> a -> (Double, Double, Double, Double)
f Double
b0 f a
xs = Double -> Double -> LM1Acc -> NonEmpty (Fit Double)
loop Double
lambda0 Double
b0 LM1Acc
acc0 where
acc0 :: LM1Acc
acc0 = Double -> LM1Acc
calcAcc Double
b0
lambda0 :: Double
lambda0 = forall a. Floating a => a -> a
sqrt (Double
c11 forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n)
where
n :: Int
n = LM1Acc -> Int
lm1_n LM1Acc
acc0
c11 :: Double
c11 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM1Acc -> KBN
lm1_c11 LM1Acc
acc0
calcAcc :: Double -> LM1Acc
calcAcc Double
beta = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
F.foldl' (\LM1Acc
acc a
p -> case Double -> a -> (Double, Double, Double, Double)
f Double
beta a
p of (Double
y, Double
g, Double
d, Double
w) -> LM1Acc -> Double -> Double -> Double -> Double -> LM1Acc
addLM1AccW LM1Acc
acc Double
y Double
g Double
d Double
w) LM1Acc
zeroLM1Acc f a
xs
loop :: Double -> Double -> LM1Acc -> NonEmpty (Fit Double)
loop Double
lambda Double
beta LM1Acc
acc
| Double -> Double -> Double -> Bool
lmStop Double
lambda Double
wssr Double
wssr'
= forall v. v -> v -> Int -> Double -> Fit v
Fit Double
beta Double
errors Int
ndf Double
wssr forall a. a -> [a] -> NonEmpty a
NE.:| []
| Double
wssr' forall a. Ord a => a -> a -> Bool
>= Double
wssr
= Double -> Double -> LM1Acc -> NonEmpty (Fit Double)
loop (Double
lambda forall a. Num a => a -> a -> a
* Double
10) Double
beta LM1Acc
acc
| Bool
otherwise
= forall v. v -> v -> Int -> Double -> Fit v
Fit Double
beta Double
errors Int
ndf Double
wssr forall a. a -> NonEmpty a -> NonEmpty a
`NE.cons` Double -> Double -> LM1Acc -> NonEmpty (Fit Double)
loop (Double
lambda forall a. Fractional a => a -> a -> a
/ Double
10) Double
beta' LM1Acc
acc'
where
lambda1 :: Double -> Double
lambda1 Double
z = (Double
1 forall a. Num a => a -> a -> a
+ Double
lambda) forall a. Num a => a -> a -> a
* Double
z
matrix :: Double
matrix = forall a. Inv a => a -> a
inv (Double -> Double
lambda1 Double
c11)
delta :: Double
delta = forall a b c. Mult a b c => a -> b -> c
mult Double
matrix Double
z1
beta' :: Double
beta' = forall a. Add a => a -> a -> a
add Double
beta Double
delta
acc' :: LM1Acc
acc' = Double -> LM1Acc
calcAcc Double
beta'
a11 :: Double
a11 = forall a. Inv a => a -> a
inv Double
c11
errors :: Double
errors = Double
sa
wssr :: Double
wssr = forall a. Ord a => a -> a -> a
max Double
0 forall a b. (a -> b) -> a -> b
$ KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM1Acc -> KBN
lm1_wssr LM1Acc
acc
wssr' :: Double
wssr' = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM1Acc -> KBN
lm1_wssr LM1Acc
acc'
ndf :: Int
ndf = LM1Acc -> Int
lm1_n LM1Acc
acc forall a. Num a => a -> a -> a
- Int
1
ndf' :: Double
ndf' = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
ndf :: Double
sa :: Double
sa = forall a. Floating a => a -> a
sqrt (Double
a11 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
c11 :: Double
c11 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM1Acc -> KBN
lm1_c11 LM1Acc
acc
z1 :: Double
z1 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM1Acc -> KBN
lm1_z1 LM1Acc
acc
levenbergMarquardt1WithYerrors
:: F.Foldable f
=> (Double -> a -> (Double, Double, Double, Double))
-> Double
-> f a
-> NE.NonEmpty (Fit Double)
levenbergMarquardt1WithYerrors :: forall (f :: * -> *) a.
Foldable f =>
(Double -> a -> (Double, Double, Double, Double))
-> Double -> f a -> NonEmpty (Fit Double)
levenbergMarquardt1WithYerrors Double -> a -> (Double, Double, Double, Double)
f = forall (f :: * -> *) a.
Foldable f =>
(Double -> a -> (Double, Double, Double, Double))
-> Double -> f a -> NonEmpty (Fit Double)
levenbergMarquardt1WithWeights Double -> a -> (Double, Double, Double, Double)
f' where
f' :: Double -> a -> (Double, Double, Double, Double)
f' Double
beta a
x = case Double -> a -> (Double, Double, Double, Double)
f Double
beta a
x of (Double
y, Double
fbetax, Double
grad, Double
dy) -> (Double
y, Double
fbetax, Double
grad, forall a. Fractional a => a -> a
recip forall a b. (a -> b) -> a -> b
$ forall a. Num a => a -> a
sq Double
dy)
levenbergMarquardt1WithXYerrors
:: F.Foldable f
=> (Double -> a -> (Double, Double, Double, Double, Double, Double))
-> Double
-> f a
-> NE.NonEmpty (Fit Double)
levenbergMarquardt1WithXYerrors :: forall (f :: * -> *) a.
Foldable f =>
(Double -> a -> (Double, Double, Double, Double, Double, Double))
-> Double -> f a -> NonEmpty (Fit Double)
levenbergMarquardt1WithXYerrors Double -> a -> (Double, Double, Double, Double, Double, Double)
g = forall (f :: * -> *) a.
Foldable f =>
(Double -> a -> (Double, Double, Double, Double))
-> Double -> f a -> NonEmpty (Fit Double)
levenbergMarquardt1WithWeights Double -> a -> (Double, Double, Double, Double)
g' where
g' :: Double -> a -> (Double, Double, Double, Double)
g' Double
beta a
x = case Double -> a -> (Double, Double, Double, Double, Double, Double)
g Double
beta a
x of (Double
y, Double
fbetax, Double
grad, Double
f', Double
dx, Double
dy) -> (Double
y, Double
fbetax, Double
grad, forall a. Fractional a => a -> a
recip forall a b. (a -> b) -> a -> b
$ forall a. Num a => a -> a
sq (Double
f' forall a. Num a => a -> a -> a
* Double
dx) forall a. Num a => a -> a -> a
+ forall a. Num a => a -> a
sq Double
dy)
data LM1Acc = LM1Acc
{ LM1Acc -> Int
lm1_n :: !Int
, LM1Acc -> KBN
lm1_c11 :: !KBN
, LM1Acc -> KBN
lm1_z1 :: !KBN
, LM1Acc -> KBN
lm1_wssr :: !KBN
}
deriving Int -> LM1Acc -> ShowS
[LM1Acc] -> ShowS
LM1Acc -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LM1Acc] -> ShowS
$cshowList :: [LM1Acc] -> ShowS
show :: LM1Acc -> String
$cshow :: LM1Acc -> String
showsPrec :: Int -> LM1Acc -> ShowS
$cshowsPrec :: Int -> LM1Acc -> ShowS
Show
zeroLM1Acc :: LM1Acc
zeroLM1Acc :: LM1Acc
zeroLM1Acc = Int -> KBN -> KBN -> KBN -> LM1Acc
LM1Acc Int
0 KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN
addLM1Acc :: LM1Acc -> Double -> Double -> Double -> LM1Acc
addLM1Acc :: LM1Acc -> Double -> Double -> Double -> LM1Acc
addLM1Acc LM1Acc {Int
KBN
lm1_wssr :: KBN
lm1_z1 :: KBN
lm1_c11 :: KBN
lm1_n :: Int
lm1_z1 :: LM1Acc -> KBN
lm1_wssr :: LM1Acc -> KBN
lm1_c11 :: LM1Acc -> KBN
lm1_n :: LM1Acc -> Int
..} Double
y Double
f Double
d1 = LM1Acc
{ lm1_n :: Int
lm1_n = Int
lm1_n forall a. Num a => a -> a -> a
+ Int
1
, lm1_c11 :: KBN
lm1_c11 = KBN -> Double -> KBN
addKBN KBN
lm1_c11 (Double
d1 forall a. Num a => a -> a -> a
* Double
d1)
, lm1_z1 :: KBN
lm1_z1 = KBN -> Double -> KBN
addKBN KBN
lm1_z1 (Double
d1 forall a. Num a => a -> a -> a
* Double
res)
, lm1_wssr :: KBN
lm1_wssr = KBN -> Double -> KBN
addKBN KBN
lm1_wssr (Double
res forall a. Num a => a -> a -> a
* Double
res)
}
where
res :: Double
res = Double
y forall a. Num a => a -> a -> a
- Double
f
addLM1AccW :: LM1Acc -> Double -> Double -> Double -> Double -> LM1Acc
addLM1AccW :: LM1Acc -> Double -> Double -> Double -> Double -> LM1Acc
addLM1AccW LM1Acc {Int
KBN
lm1_wssr :: KBN
lm1_z1 :: KBN
lm1_c11 :: KBN
lm1_n :: Int
lm1_z1 :: LM1Acc -> KBN
lm1_wssr :: LM1Acc -> KBN
lm1_c11 :: LM1Acc -> KBN
lm1_n :: LM1Acc -> Int
..} Double
y Double
f Double
d1 Double
w = LM1Acc
{ lm1_n :: Int
lm1_n = Int
lm1_n forall a. Num a => a -> a -> a
+ Int
1
, lm1_c11 :: KBN
lm1_c11 = KBN -> Double -> KBN
addKBN KBN
lm1_c11 (Double
w forall a. Num a => a -> a -> a
* Double
d1 forall a. Num a => a -> a -> a
* Double
d1)
, lm1_z1 :: KBN
lm1_z1 = KBN -> Double -> KBN
addKBN KBN
lm1_z1 (Double
w forall a. Num a => a -> a -> a
* Double
d1 forall a. Num a => a -> a -> a
* Double
res)
, lm1_wssr :: KBN
lm1_wssr = KBN -> Double -> KBN
addKBN KBN
lm1_wssr (Double
w forall a. Num a => a -> a -> a
* Double
res forall a. Num a => a -> a -> a
* Double
res)
}
where
res :: Double
res = Double
y forall a. Num a => a -> a -> a
- Double
f
levenbergMarquardt2
:: F.Foldable f
=> (V2 -> a -> (Double, Double, V2))
-> V2
-> f a
-> NE.NonEmpty (Fit V2)
levenbergMarquardt2 :: forall (f :: * -> *) a.
Foldable f =>
(V2 -> a -> (Double, Double, V2)) -> V2 -> f a -> NonEmpty (Fit V2)
levenbergMarquardt2 V2 -> a -> (Double, Double, V2)
f V2
b0 f a
xs = Double -> V2 -> LM2Acc -> NonEmpty (Fit V2)
loop Double
lambda0 V2
b0 LM2Acc
acc0 where
acc0 :: LM2Acc
acc0 = V2 -> LM2Acc
calcAcc V2
b0
calcAcc :: V2 -> LM2Acc
calcAcc V2
beta = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
F.foldl' (\LM2Acc
acc a
p -> case V2 -> a -> (Double, Double, V2)
f V2
beta a
p of (Double
y, Double
g, V2
d) -> LM2Acc -> Double -> Double -> V2 -> LM2Acc
addLM2Acc LM2Acc
acc Double
y Double
g V2
d) LM2Acc
zeroLM2Acc f a
xs
lambda0 :: Double
lambda0 = forall a. Floating a => a -> a
sqrt forall a b. (a -> b) -> a -> b
$ (Double
c11 forall a. Num a => a -> a -> a
+ Double
c22) forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n forall a. Fractional a => a -> a -> a
/ Double
2
where
n :: Int
n = LM2Acc -> Int
lm2_n LM2Acc
acc0
c11 :: Double
c11 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_c11 LM2Acc
acc0
c22 :: Double
c22 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_c22 LM2Acc
acc0
loop :: Double -> V2 -> LM2Acc -> NonEmpty (Fit V2)
loop Double
lambda V2
beta LM2Acc
acc
| Double -> Double -> Double -> Bool
lmStop Double
lambda Double
wssr Double
wssr'
= forall v. v -> v -> Int -> Double -> Fit v
Fit V2
beta V2
errors Int
ndf Double
wssr forall a. a -> [a] -> NonEmpty a
NE.:| []
| Double
wssr' forall a. Ord a => a -> a -> Bool
>= Double
wssr
= Double -> V2 -> LM2Acc -> NonEmpty (Fit V2)
loop (Double
lambda forall a. Num a => a -> a -> a
* Double
10) V2
beta LM2Acc
acc
| Bool
otherwise
= forall v. v -> v -> Int -> Double -> Fit v
Fit V2
beta V2
errors Int
ndf Double
wssr forall a. a -> NonEmpty a -> NonEmpty a
`NE.cons` Double -> V2 -> LM2Acc -> NonEmpty (Fit V2)
loop (Double
lambda forall a. Fractional a => a -> a -> a
/ Double
10) V2
beta' LM2Acc
acc'
where
lambda1 :: Double -> Double
lambda1 Double
z = (Double
1 forall a. Num a => a -> a -> a
+ Double
lambda) forall a. Num a => a -> a -> a
* Double
z
matrix :: SM22
matrix = forall a. Inv a => a -> a
inv (Double -> Double -> Double -> SM22
SM22 (Double -> Double
lambda1 Double
c11) Double
c12 (Double -> Double
lambda1 Double
c22))
delta :: V2
delta = forall a b c. Mult a b c => a -> b -> c
mult SM22
matrix (Double -> Double -> V2
V2 Double
z1 Double
z2)
beta' :: V2
beta' = forall a. Add a => a -> a -> a
add V2
beta V2
delta
acc' :: LM2Acc
acc' = V2 -> LM2Acc
calcAcc V2
beta'
SM22 Double
a11 Double
_ Double
a22 = forall a. Inv a => a -> a
inv (Double -> Double -> Double -> SM22
SM22 Double
c11 Double
c12 Double
c22)
errors :: V2
errors = Double -> Double -> V2
V2 Double
sa Double
sb
wssr :: Double
wssr = forall a. Ord a => a -> a -> a
max Double
0 forall a b. (a -> b) -> a -> b
$ KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_wssr LM2Acc
acc
wssr' :: Double
wssr' = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_wssr LM2Acc
acc'
ndf :: Int
ndf = LM2Acc -> Int
lm2_n LM2Acc
acc forall a. Num a => a -> a -> a
- Int
2
ndf' :: Double
ndf' = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
ndf :: Double
sa :: Double
sa = forall a. Floating a => a -> a
sqrt (Double
a11 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
sb :: Double
sb = forall a. Floating a => a -> a
sqrt (Double
a22 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
c11 :: Double
c11 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_c11 LM2Acc
acc
c12 :: Double
c12 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_c12 LM2Acc
acc
c22 :: Double
c22 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_c22 LM2Acc
acc
z1 :: Double
z1 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_z1 LM2Acc
acc
z2 :: Double
z2 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_z2 LM2Acc
acc
levenbergMarquardt2WithWeights
:: F.Foldable f
=> (V2 -> a -> (Double, Double, V2, Double))
-> V2
-> f a
-> NE.NonEmpty (Fit V2)
levenbergMarquardt2WithWeights :: forall (f :: * -> *) a.
Foldable f =>
(V2 -> a -> (Double, Double, V2, Double))
-> V2 -> f a -> NonEmpty (Fit V2)
levenbergMarquardt2WithWeights V2 -> a -> (Double, Double, V2, Double)
f V2
b0 f a
xs = Double -> V2 -> LM2Acc -> NonEmpty (Fit V2)
loop Double
lambda0 V2
b0 LM2Acc
acc0 where
acc0 :: LM2Acc
acc0 = V2 -> LM2Acc
calcAcc V2
b0
lambda0 :: Double
lambda0 = forall a. Floating a => a -> a
sqrt forall a b. (a -> b) -> a -> b
$ (Double
c11 forall a. Num a => a -> a -> a
+ Double
c22) forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n forall a. Fractional a => a -> a -> a
/ Double
2
where
n :: Int
n = LM2Acc -> Int
lm2_n LM2Acc
acc0
c11 :: Double
c11 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_c11 LM2Acc
acc0
c22 :: Double
c22 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_c22 LM2Acc
acc0
calcAcc :: V2 -> LM2Acc
calcAcc V2
beta = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
F.foldl' (\LM2Acc
acc a
p -> case V2 -> a -> (Double, Double, V2, Double)
f V2
beta a
p of (Double
y, Double
g, V2
d, Double
w) -> LM2Acc -> Double -> Double -> V2 -> Double -> LM2Acc
addLM2AccW LM2Acc
acc Double
y Double
g V2
d Double
w) LM2Acc
zeroLM2Acc f a
xs
loop :: Double -> V2 -> LM2Acc -> NonEmpty (Fit V2)
loop Double
lambda V2
beta LM2Acc
acc
| Double -> Double -> Double -> Bool
lmStop Double
lambda Double
wssr Double
wssr'
= forall v. v -> v -> Int -> Double -> Fit v
Fit V2
beta V2
errors Int
ndf Double
wssr forall a. a -> [a] -> NonEmpty a
NE.:| []
| Double
wssr' forall a. Ord a => a -> a -> Bool
>= Double
wssr
= Double -> V2 -> LM2Acc -> NonEmpty (Fit V2)
loop (Double
lambda forall a. Num a => a -> a -> a
* Double
10) V2
beta LM2Acc
acc
| Bool
otherwise
= forall v. v -> v -> Int -> Double -> Fit v
Fit V2
beta V2
errors Int
ndf Double
wssr forall a. a -> NonEmpty a -> NonEmpty a
`NE.cons` Double -> V2 -> LM2Acc -> NonEmpty (Fit V2)
loop (Double
lambda forall a. Fractional a => a -> a -> a
/ Double
10) V2
beta' LM2Acc
acc'
where
lambda1 :: Double -> Double
lambda1 Double
z = (Double
1 forall a. Num a => a -> a -> a
+ Double
lambda) forall a. Num a => a -> a -> a
* Double
z
matrix :: SM22
matrix = forall a. Inv a => a -> a
inv (Double -> Double -> Double -> SM22
SM22 (Double -> Double
lambda1 Double
c11) Double
c12 (Double -> Double
lambda1 Double
c22))
delta :: V2
delta = forall a b c. Mult a b c => a -> b -> c
mult SM22
matrix (Double -> Double -> V2
V2 Double
z1 Double
z2)
beta' :: V2
beta' = forall a. Add a => a -> a -> a
add V2
beta V2
delta
acc' :: LM2Acc
acc' = V2 -> LM2Acc
calcAcc V2
beta'
SM22 Double
a11 Double
_ Double
a22 = forall a. Inv a => a -> a
inv (Double -> Double -> Double -> SM22
SM22 Double
c11 Double
c12 Double
c22)
errors :: V2
errors = Double -> Double -> V2
V2 Double
sa Double
sb
wssr :: Double
wssr = forall a. Ord a => a -> a -> a
max Double
0 forall a b. (a -> b) -> a -> b
$ KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_wssr LM2Acc
acc
wssr' :: Double
wssr' = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_wssr LM2Acc
acc'
ndf :: Int
ndf = LM2Acc -> Int
lm2_n LM2Acc
acc forall a. Num a => a -> a -> a
- Int
2
ndf' :: Double
ndf' = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
ndf :: Double
sa :: Double
sa = forall a. Floating a => a -> a
sqrt (Double
a11 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
sb :: Double
sb = forall a. Floating a => a -> a
sqrt (Double
a22 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
c11 :: Double
c11 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_c11 LM2Acc
acc
c12 :: Double
c12 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_c12 LM2Acc
acc
c22 :: Double
c22 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_c22 LM2Acc
acc
z1 :: Double
z1 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_z1 LM2Acc
acc
z2 :: Double
z2 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM2Acc -> KBN
lm2_z2 LM2Acc
acc
levenbergMarquardt2WithYerrors
:: F.Foldable f
=> (V2 -> a -> (Double, Double, V2, Double))
-> V2
-> f a
-> NE.NonEmpty (Fit V2)
levenbergMarquardt2WithYerrors :: forall (f :: * -> *) a.
Foldable f =>
(V2 -> a -> (Double, Double, V2, Double))
-> V2 -> f a -> NonEmpty (Fit V2)
levenbergMarquardt2WithYerrors V2 -> a -> (Double, Double, V2, Double)
f = forall (f :: * -> *) a.
Foldable f =>
(V2 -> a -> (Double, Double, V2, Double))
-> V2 -> f a -> NonEmpty (Fit V2)
levenbergMarquardt2WithWeights V2 -> a -> (Double, Double, V2, Double)
f' where
f' :: V2 -> a -> (Double, Double, V2, Double)
f' V2
beta a
x = case V2 -> a -> (Double, Double, V2, Double)
f V2
beta a
x of (Double
y, Double
fbetax, V2
grad, Double
dy) -> (Double
y, Double
fbetax, V2
grad, forall a. Fractional a => a -> a
recip forall a b. (a -> b) -> a -> b
$ forall a. Num a => a -> a
sq Double
dy)
levenbergMarquardt2WithXYerrors
:: F.Foldable f
=> (V2 -> a -> (Double, Double, V2, Double, Double, Double))
-> V2
-> f a
-> NE.NonEmpty (Fit V2)
levenbergMarquardt2WithXYerrors :: forall (f :: * -> *) a.
Foldable f =>
(V2 -> a -> (Double, Double, V2, Double, Double, Double))
-> V2 -> f a -> NonEmpty (Fit V2)
levenbergMarquardt2WithXYerrors V2 -> a -> (Double, Double, V2, Double, Double, Double)
g = forall (f :: * -> *) a.
Foldable f =>
(V2 -> a -> (Double, Double, V2, Double))
-> V2 -> f a -> NonEmpty (Fit V2)
levenbergMarquardt2WithWeights V2 -> a -> (Double, Double, V2, Double)
g' where
g' :: V2 -> a -> (Double, Double, V2, Double)
g' V2
beta a
x = case V2 -> a -> (Double, Double, V2, Double, Double, Double)
g V2
beta a
x of (Double
y, Double
fbetax, V2
grad, Double
f', Double
dx, Double
dy) -> (Double
y, Double
fbetax, V2
grad, forall a. Fractional a => a -> a
recip forall a b. (a -> b) -> a -> b
$ forall a. Num a => a -> a
sq (Double
f' forall a. Num a => a -> a -> a
* Double
dx) forall a. Num a => a -> a -> a
+ forall a. Num a => a -> a
sq Double
dy)
data LM2Acc = LM2Acc
{ LM2Acc -> Int
lm2_n :: !Int
, LM2Acc -> KBN
lm2_c11 :: !KBN
, LM2Acc -> KBN
lm2_c12 :: !KBN
, LM2Acc -> KBN
lm2_c22 :: !KBN
, LM2Acc -> KBN
lm2_z1 :: !KBN
, LM2Acc -> KBN
lm2_z2 :: !KBN
, LM2Acc -> KBN
lm2_wssr :: !KBN
}
deriving Int -> LM2Acc -> ShowS
[LM2Acc] -> ShowS
LM2Acc -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LM2Acc] -> ShowS
$cshowList :: [LM2Acc] -> ShowS
show :: LM2Acc -> String
$cshow :: LM2Acc -> String
showsPrec :: Int -> LM2Acc -> ShowS
$cshowsPrec :: Int -> LM2Acc -> ShowS
Show
zeroLM2Acc :: LM2Acc
zeroLM2Acc :: LM2Acc
zeroLM2Acc = Int -> KBN -> KBN -> KBN -> KBN -> KBN -> KBN -> LM2Acc
LM2Acc Int
0 KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN
addLM2Acc :: LM2Acc -> Double -> Double -> V2 -> LM2Acc
addLM2Acc :: LM2Acc -> Double -> Double -> V2 -> LM2Acc
addLM2Acc LM2Acc {Int
KBN
lm2_wssr :: KBN
lm2_z2 :: KBN
lm2_z1 :: KBN
lm2_c22 :: KBN
lm2_c12 :: KBN
lm2_c11 :: KBN
lm2_n :: Int
lm2_z2 :: LM2Acc -> KBN
lm2_z1 :: LM2Acc -> KBN
lm2_c12 :: LM2Acc -> KBN
lm2_wssr :: LM2Acc -> KBN
lm2_c22 :: LM2Acc -> KBN
lm2_c11 :: LM2Acc -> KBN
lm2_n :: LM2Acc -> Int
..} Double
y Double
f (V2 Double
d1 Double
d2) = LM2Acc
{ lm2_n :: Int
lm2_n = Int
lm2_n forall a. Num a => a -> a -> a
+ Int
1
, lm2_c11 :: KBN
lm2_c11 = KBN -> Double -> KBN
addKBN KBN
lm2_c11 (Double
d1 forall a. Num a => a -> a -> a
* Double
d1)
, lm2_c12 :: KBN
lm2_c12 = KBN -> Double -> KBN
addKBN KBN
lm2_c12 (Double
d1 forall a. Num a => a -> a -> a
* Double
d2)
, lm2_c22 :: KBN
lm2_c22 = KBN -> Double -> KBN
addKBN KBN
lm2_c22 (Double
d2 forall a. Num a => a -> a -> a
* Double
d2)
, lm2_z1 :: KBN
lm2_z1 = KBN -> Double -> KBN
addKBN KBN
lm2_z1 (Double
d1 forall a. Num a => a -> a -> a
* Double
res)
, lm2_z2 :: KBN
lm2_z2 = KBN -> Double -> KBN
addKBN KBN
lm2_z2 (Double
d2 forall a. Num a => a -> a -> a
* Double
res)
, lm2_wssr :: KBN
lm2_wssr = KBN -> Double -> KBN
addKBN KBN
lm2_wssr (Double
res forall a. Num a => a -> a -> a
* Double
res)
}
where
res :: Double
res = Double
y forall a. Num a => a -> a -> a
- Double
f
addLM2AccW :: LM2Acc -> Double -> Double -> V2 -> Double -> LM2Acc
addLM2AccW :: LM2Acc -> Double -> Double -> V2 -> Double -> LM2Acc
addLM2AccW LM2Acc {Int
KBN
lm2_wssr :: KBN
lm2_z2 :: KBN
lm2_z1 :: KBN
lm2_c22 :: KBN
lm2_c12 :: KBN
lm2_c11 :: KBN
lm2_n :: Int
lm2_z2 :: LM2Acc -> KBN
lm2_z1 :: LM2Acc -> KBN
lm2_c12 :: LM2Acc -> KBN
lm2_wssr :: LM2Acc -> KBN
lm2_c22 :: LM2Acc -> KBN
lm2_c11 :: LM2Acc -> KBN
lm2_n :: LM2Acc -> Int
..} Double
y Double
f (V2 Double
d1 Double
d2) Double
w = LM2Acc
{ lm2_n :: Int
lm2_n = Int
lm2_n forall a. Num a => a -> a -> a
+ Int
1
, lm2_c11 :: KBN
lm2_c11 = KBN -> Double -> KBN
addKBN KBN
lm2_c11 (Double
w forall a. Num a => a -> a -> a
* Double
d1 forall a. Num a => a -> a -> a
* Double
d1)
, lm2_c12 :: KBN
lm2_c12 = KBN -> Double -> KBN
addKBN KBN
lm2_c12 (Double
w forall a. Num a => a -> a -> a
* Double
d1 forall a. Num a => a -> a -> a
* Double
d2)
, lm2_c22 :: KBN
lm2_c22 = KBN -> Double -> KBN
addKBN KBN
lm2_c22 (Double
w forall a. Num a => a -> a -> a
* Double
d2 forall a. Num a => a -> a -> a
* Double
d2)
, lm2_z1 :: KBN
lm2_z1 = KBN -> Double -> KBN
addKBN KBN
lm2_z1 (Double
w forall a. Num a => a -> a -> a
* Double
d1 forall a. Num a => a -> a -> a
* Double
res)
, lm2_z2 :: KBN
lm2_z2 = KBN -> Double -> KBN
addKBN KBN
lm2_z2 (Double
w forall a. Num a => a -> a -> a
* Double
d2 forall a. Num a => a -> a -> a
* Double
res)
, lm2_wssr :: KBN
lm2_wssr = KBN -> Double -> KBN
addKBN KBN
lm2_wssr (Double
w forall a. Num a => a -> a -> a
* Double
res forall a. Num a => a -> a -> a
* Double
res)
}
where
res :: Double
res = Double
y forall a. Num a => a -> a -> a
- Double
f
levenbergMarquardt3
:: F.Foldable f
=> (V3 -> a -> (Double, Double, V3))
-> V3
-> f a
-> NE.NonEmpty (Fit V3)
levenbergMarquardt3 :: forall (f :: * -> *) a.
Foldable f =>
(V3 -> a -> (Double, Double, V3)) -> V3 -> f a -> NonEmpty (Fit V3)
levenbergMarquardt3 V3 -> a -> (Double, Double, V3)
f V3
b0 f a
xs = Double -> V3 -> LM3Acc -> NonEmpty (Fit V3)
loop Double
lambda0 V3
b0 LM3Acc
acc0 where
acc0 :: LM3Acc
acc0 = V3 -> LM3Acc
calcAcc V3
b0
calcAcc :: V3 -> LM3Acc
calcAcc V3
beta = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
F.foldl' (\LM3Acc
acc a
p -> case V3 -> a -> (Double, Double, V3)
f V3
beta a
p of (Double
y, Double
g, V3
d) -> LM3Acc -> Double -> Double -> V3 -> LM3Acc
addLM3Acc LM3Acc
acc Double
y Double
g V3
d) LM3Acc
zeroLM3Acc f a
xs
lambda0 :: Double
lambda0 = forall a. Floating a => a -> a
sqrt forall a b. (a -> b) -> a -> b
$ (Double
c11 forall a. Num a => a -> a -> a
+ Double
c22 forall a. Num a => a -> a -> a
+ Double
c33) forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n forall a. Fractional a => a -> a -> a
/ Double
3
where
n :: Int
n = LM3Acc -> Int
lm3_n LM3Acc
acc0
c11 :: Double
c11 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c11 LM3Acc
acc0
c22 :: Double
c22 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c22 LM3Acc
acc0
c33 :: Double
c33 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c33 LM3Acc
acc0
loop :: Double -> V3 -> LM3Acc -> NonEmpty (Fit V3)
loop Double
lambda V3
beta LM3Acc
acc
| Double -> Double -> Double -> Bool
lmStop Double
lambda Double
wssr Double
wssr'
= forall v. v -> v -> Int -> Double -> Fit v
Fit V3
beta V3
errors Int
ndf Double
wssr forall a. a -> [a] -> NonEmpty a
NE.:| []
| Double
wssr' forall a. Ord a => a -> a -> Bool
>= Double
wssr
= Double -> V3 -> LM3Acc -> NonEmpty (Fit V3)
loop (Double
lambda forall a. Num a => a -> a -> a
* Double
10) V3
beta LM3Acc
acc
| Bool
otherwise
= forall v. v -> v -> Int -> Double -> Fit v
Fit V3
beta V3
errors Int
ndf Double
wssr forall a. a -> NonEmpty a -> NonEmpty a
`NE.cons` Double -> V3 -> LM3Acc -> NonEmpty (Fit V3)
loop (Double
lambda forall a. Fractional a => a -> a -> a
/ Double
10) V3
beta' LM3Acc
acc'
where
lambda1 :: Double -> Double
lambda1 Double
z = (Double
1 forall a. Num a => a -> a -> a
+ Double
lambda) forall a. Num a => a -> a -> a
* Double
z
matrix :: SM33
matrix = forall a. Inv a => a -> a
inv (Double -> Double -> Double -> Double -> Double -> Double -> SM33
SM33 (Double -> Double
lambda1 Double
c11)
Double
c12 (Double -> Double
lambda1 Double
c22)
Double
c13 Double
c23 (Double -> Double
lambda1 Double
c33))
delta :: V3
delta = forall a b c. Mult a b c => a -> b -> c
mult SM33
matrix (Double -> Double -> Double -> V3
V3 Double
z1 Double
z2 Double
z3)
beta' :: V3
beta' = forall a. Add a => a -> a -> a
add V3
beta V3
delta
acc' :: LM3Acc
acc' = V3 -> LM3Acc
calcAcc V3
beta'
SM33 Double
a11
Double
_ Double
a22
Double
_ Double
_ Double
a33 = forall a. Inv a => a -> a
inv (Double -> Double -> Double -> Double -> Double -> Double -> SM33
SM33 Double
c11
Double
c12 Double
c22
Double
c13 Double
c23 Double
c33)
errors :: V3
errors = Double -> Double -> Double -> V3
V3 Double
sa Double
sb Double
sc
wssr :: Double
wssr = forall a. Ord a => a -> a -> a
max Double
0 forall a b. (a -> b) -> a -> b
$ KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_wssr LM3Acc
acc
wssr' :: Double
wssr' = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_wssr LM3Acc
acc'
ndf :: Int
ndf = LM3Acc -> Int
lm3_n LM3Acc
acc forall a. Num a => a -> a -> a
- Int
3
ndf' :: Double
ndf' = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
ndf :: Double
sa :: Double
sa = forall a. Floating a => a -> a
sqrt (Double
a11 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
sb :: Double
sb = forall a. Floating a => a -> a
sqrt (Double
a22 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
sc :: Double
sc = forall a. Floating a => a -> a
sqrt (Double
a33 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
c11 :: Double
c11 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c11 LM3Acc
acc
c12 :: Double
c12 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c12 LM3Acc
acc
c13 :: Double
c13 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c13 LM3Acc
acc
c22 :: Double
c22 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c22 LM3Acc
acc
c23 :: Double
c23 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c23 LM3Acc
acc
c33 :: Double
c33 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c33 LM3Acc
acc
z1 :: Double
z1 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_z1 LM3Acc
acc
z2 :: Double
z2 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_z2 LM3Acc
acc
z3 :: Double
z3 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_z3 LM3Acc
acc
levenbergMarquardt3WithWeights
:: F.Foldable f
=> (V3 -> a -> (Double, Double, V3, Double))
-> V3
-> f a
-> NE.NonEmpty (Fit V3)
levenbergMarquardt3WithWeights :: forall (f :: * -> *) a.
Foldable f =>
(V3 -> a -> (Double, Double, V3, Double))
-> V3 -> f a -> NonEmpty (Fit V3)
levenbergMarquardt3WithWeights V3 -> a -> (Double, Double, V3, Double)
f V3
b0 f a
xs = Double -> V3 -> LM3Acc -> NonEmpty (Fit V3)
loop Double
lambda0 V3
b0 LM3Acc
acc0 where
acc0 :: LM3Acc
acc0 = V3 -> LM3Acc
calcAcc V3
b0
lambda0 :: Double
lambda0 = forall a. Floating a => a -> a
sqrt forall a b. (a -> b) -> a -> b
$ (Double
c11 forall a. Num a => a -> a -> a
+ Double
c22 forall a. Num a => a -> a -> a
+ Double
c33) forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n forall a. Fractional a => a -> a -> a
/ Double
3
where
n :: Int
n = LM3Acc -> Int
lm3_n LM3Acc
acc0
c11 :: Double
c11 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c11 LM3Acc
acc0
c22 :: Double
c22 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c22 LM3Acc
acc0
c33 :: Double
c33 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c33 LM3Acc
acc0
calcAcc :: V3 -> LM3Acc
calcAcc V3
beta = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
F.foldl' (\LM3Acc
acc a
p -> case V3 -> a -> (Double, Double, V3, Double)
f V3
beta a
p of (Double
y, Double
g, V3
d, Double
w) -> LM3Acc -> Double -> Double -> V3 -> Double -> LM3Acc
addLM3AccW LM3Acc
acc Double
y Double
g V3
d Double
w) LM3Acc
zeroLM3Acc f a
xs
loop :: Double -> V3 -> LM3Acc -> NonEmpty (Fit V3)
loop Double
lambda V3
beta LM3Acc
acc
| Double -> Double -> Double -> Bool
lmStop Double
lambda Double
wssr Double
wssr'
= forall v. v -> v -> Int -> Double -> Fit v
Fit V3
beta V3
errors Int
ndf Double
wssr forall a. a -> [a] -> NonEmpty a
NE.:| []
| Double
wssr' forall a. Ord a => a -> a -> Bool
>= Double
wssr
= Double -> V3 -> LM3Acc -> NonEmpty (Fit V3)
loop (Double
lambda forall a. Num a => a -> a -> a
* Double
10) V3
beta LM3Acc
acc
| Bool
otherwise
= forall v. v -> v -> Int -> Double -> Fit v
Fit V3
beta V3
errors Int
ndf Double
wssr forall a. a -> NonEmpty a -> NonEmpty a
`NE.cons` Double -> V3 -> LM3Acc -> NonEmpty (Fit V3)
loop (Double
lambda forall a. Fractional a => a -> a -> a
/ Double
10) V3
beta' LM3Acc
acc'
where
lambda1 :: Double -> Double
lambda1 Double
z = (Double
1 forall a. Num a => a -> a -> a
+ Double
lambda) forall a. Num a => a -> a -> a
* Double
z
matrix :: SM33
matrix = forall a. Inv a => a -> a
inv (Double -> Double -> Double -> Double -> Double -> Double -> SM33
SM33 (Double -> Double
lambda1 Double
c11)
Double
c12 (Double -> Double
lambda1 Double
c22)
Double
c13 Double
c23 (Double -> Double
lambda1 Double
c33))
delta :: V3
delta = forall a b c. Mult a b c => a -> b -> c
mult SM33
matrix (Double -> Double -> Double -> V3
V3 Double
z1 Double
z2 Double
z3)
beta' :: V3
beta' = forall a. Add a => a -> a -> a
add V3
beta V3
delta
acc' :: LM3Acc
acc' = V3 -> LM3Acc
calcAcc V3
beta'
SM33 Double
a11 Double
_ Double
_ Double
a22 Double
_ Double
a33 = forall a. Inv a => a -> a
inv (Double -> Double -> Double -> Double -> Double -> Double -> SM33
SM33 Double
c11 Double
c12 Double
c13 Double
c22 Double
c23 Double
c33)
errors :: V3
errors = Double -> Double -> Double -> V3
V3 Double
sa Double
sb Double
sc
wssr :: Double
wssr = forall a. Ord a => a -> a -> a
max Double
0 forall a b. (a -> b) -> a -> b
$ KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_wssr LM3Acc
acc
wssr' :: Double
wssr' = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_wssr LM3Acc
acc'
ndf :: Int
ndf = LM3Acc -> Int
lm3_n LM3Acc
acc forall a. Num a => a -> a -> a
- Int
3
ndf' :: Double
ndf' = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
ndf :: Double
sa :: Double
sa = forall a. Floating a => a -> a
sqrt (Double
a11 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
sb :: Double
sb = forall a. Floating a => a -> a
sqrt (Double
a22 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
sc :: Double
sc = forall a. Floating a => a -> a
sqrt (Double
a33 forall a. Num a => a -> a -> a
* Double
wssr forall a. Fractional a => a -> a -> a
/ Double
ndf')
c11 :: Double
c11 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c11 LM3Acc
acc
c12 :: Double
c12 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c12 LM3Acc
acc
c13 :: Double
c13 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c13 LM3Acc
acc
c22 :: Double
c22 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c22 LM3Acc
acc
c23 :: Double
c23 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c23 LM3Acc
acc
c33 :: Double
c33 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_c33 LM3Acc
acc
z1 :: Double
z1 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_z1 LM3Acc
acc
z2 :: Double
z2 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_z2 LM3Acc
acc
z3 :: Double
z3 = KBN -> Double
getKBN forall a b. (a -> b) -> a -> b
$ LM3Acc -> KBN
lm3_z3 LM3Acc
acc
levenbergMarquardt3WithYerrors
:: F.Foldable f
=> (V3 -> a -> (Double, Double, V3, Double))
-> V3
-> f a
-> NE.NonEmpty (Fit V3)
levenbergMarquardt3WithYerrors :: forall (f :: * -> *) a.
Foldable f =>
(V3 -> a -> (Double, Double, V3, Double))
-> V3 -> f a -> NonEmpty (Fit V3)
levenbergMarquardt3WithYerrors V3 -> a -> (Double, Double, V3, Double)
f = forall (f :: * -> *) a.
Foldable f =>
(V3 -> a -> (Double, Double, V3, Double))
-> V3 -> f a -> NonEmpty (Fit V3)
levenbergMarquardt3WithWeights V3 -> a -> (Double, Double, V3, Double)
f' where
f' :: V3 -> a -> (Double, Double, V3, Double)
f' V3
beta a
x = case V3 -> a -> (Double, Double, V3, Double)
f V3
beta a
x of (Double
y, Double
fbetax, V3
grad, Double
dy) -> (Double
y, Double
fbetax, V3
grad, forall a. Fractional a => a -> a
recip forall a b. (a -> b) -> a -> b
$ forall a. Num a => a -> a
sq Double
dy)
levenbergMarquardt3WithXYerrors
:: F.Foldable f
=> (V3 -> a -> (Double, Double, V3, Double, Double, Double))
-> V3
-> f a
-> NE.NonEmpty (Fit V3)
levenbergMarquardt3WithXYerrors :: forall (f :: * -> *) a.
Foldable f =>
(V3 -> a -> (Double, Double, V3, Double, Double, Double))
-> V3 -> f a -> NonEmpty (Fit V3)
levenbergMarquardt3WithXYerrors V3 -> a -> (Double, Double, V3, Double, Double, Double)
g = forall (f :: * -> *) a.
Foldable f =>
(V3 -> a -> (Double, Double, V3, Double))
-> V3 -> f a -> NonEmpty (Fit V3)
levenbergMarquardt3WithWeights V3 -> a -> (Double, Double, V3, Double)
g' where
g' :: V3 -> a -> (Double, Double, V3, Double)
g' V3
beta a
x = case V3 -> a -> (Double, Double, V3, Double, Double, Double)
g V3
beta a
x of (Double
y, Double
fbetax, V3
grad, Double
f', Double
dx, Double
dy) -> (Double
y, Double
fbetax, V3
grad, forall a. Fractional a => a -> a
recip forall a b. (a -> b) -> a -> b
$ forall a. Num a => a -> a
sq (Double
f' forall a. Num a => a -> a -> a
* Double
dx) forall a. Num a => a -> a -> a
+ forall a. Num a => a -> a
sq Double
dy)
data LM3Acc = LM3Acc
{ LM3Acc -> Int
lm3_n :: !Int
, LM3Acc -> KBN
lm3_c11 :: !KBN
, LM3Acc -> KBN
lm3_c12 :: !KBN
, LM3Acc -> KBN
lm3_c13 :: !KBN
, LM3Acc -> KBN
lm3_c22 :: !KBN
, LM3Acc -> KBN
lm3_c23 :: !KBN
, LM3Acc -> KBN
lm3_c33 :: !KBN
, LM3Acc -> KBN
lm3_z1 :: !KBN
, LM3Acc -> KBN
lm3_z2 :: !KBN
, LM3Acc -> KBN
lm3_z3 :: !KBN
, LM3Acc -> KBN
lm3_wssr :: !KBN
}
deriving Int -> LM3Acc -> ShowS
[LM3Acc] -> ShowS
LM3Acc -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LM3Acc] -> ShowS
$cshowList :: [LM3Acc] -> ShowS
show :: LM3Acc -> String
$cshow :: LM3Acc -> String
showsPrec :: Int -> LM3Acc -> ShowS
$cshowsPrec :: Int -> LM3Acc -> ShowS
Show
zeroLM3Acc :: LM3Acc
zeroLM3Acc :: LM3Acc
zeroLM3Acc = Int
-> KBN
-> KBN
-> KBN
-> KBN
-> KBN
-> KBN
-> KBN
-> KBN
-> KBN
-> KBN
-> LM3Acc
LM3Acc Int
0 KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN
addLM3Acc :: LM3Acc -> Double -> Double -> V3 -> LM3Acc
addLM3Acc :: LM3Acc -> Double -> Double -> V3 -> LM3Acc
addLM3Acc LM3Acc {Int
KBN
lm3_wssr :: KBN
lm3_z3 :: KBN
lm3_z2 :: KBN
lm3_z1 :: KBN
lm3_c33 :: KBN
lm3_c23 :: KBN
lm3_c22 :: KBN
lm3_c13 :: KBN
lm3_c12 :: KBN
lm3_c11 :: KBN
lm3_n :: Int
lm3_z3 :: LM3Acc -> KBN
lm3_z2 :: LM3Acc -> KBN
lm3_z1 :: LM3Acc -> KBN
lm3_c23 :: LM3Acc -> KBN
lm3_c13 :: LM3Acc -> KBN
lm3_c12 :: LM3Acc -> KBN
lm3_wssr :: LM3Acc -> KBN
lm3_c33 :: LM3Acc -> KBN
lm3_c22 :: LM3Acc -> KBN
lm3_c11 :: LM3Acc -> KBN
lm3_n :: LM3Acc -> Int
..} Double
y Double
f (V3 Double
d1 Double
d2 Double
d3) = LM3Acc
{ lm3_n :: Int
lm3_n = Int
lm3_n forall a. Num a => a -> a -> a
+ Int
1
, lm3_c11 :: KBN
lm3_c11 = KBN -> Double -> KBN
addKBN KBN
lm3_c11 (Double
d1 forall a. Num a => a -> a -> a
* Double
d1)
, lm3_c12 :: KBN
lm3_c12 = KBN -> Double -> KBN
addKBN KBN
lm3_c12 (Double
d1 forall a. Num a => a -> a -> a
* Double
d2)
, lm3_c13 :: KBN
lm3_c13 = KBN -> Double -> KBN
addKBN KBN
lm3_c12 (Double
d1 forall a. Num a => a -> a -> a
* Double
d3)
, lm3_c22 :: KBN
lm3_c22 = KBN -> Double -> KBN
addKBN KBN
lm3_c22 (Double
d2 forall a. Num a => a -> a -> a
* Double
d2)
, lm3_c23 :: KBN
lm3_c23 = KBN -> Double -> KBN
addKBN KBN
lm3_c22 (Double
d2 forall a. Num a => a -> a -> a
* Double
d3)
, lm3_c33 :: KBN
lm3_c33 = KBN -> Double -> KBN
addKBN KBN
lm3_c22 (Double
d3 forall a. Num a => a -> a -> a
* Double
d3)
, lm3_z1 :: KBN
lm3_z1 = KBN -> Double -> KBN
addKBN KBN
lm3_z1 (Double
d1 forall a. Num a => a -> a -> a
* Double
res)
, lm3_z2 :: KBN
lm3_z2 = KBN -> Double -> KBN
addKBN KBN
lm3_z2 (Double
d2 forall a. Num a => a -> a -> a
* Double
res)
, lm3_z3 :: KBN
lm3_z3 = KBN -> Double -> KBN
addKBN KBN
lm3_z3 (Double
d3 forall a. Num a => a -> a -> a
* Double
res)
, lm3_wssr :: KBN
lm3_wssr = KBN -> Double -> KBN
addKBN KBN
lm3_wssr (Double
res forall a. Num a => a -> a -> a
* Double
res)
}
where
res :: Double
res = Double
y forall a. Num a => a -> a -> a
- Double
f
addLM3AccW :: LM3Acc -> Double -> Double -> V3 -> Double -> LM3Acc
addLM3AccW :: LM3Acc -> Double -> Double -> V3 -> Double -> LM3Acc
addLM3AccW LM3Acc {Int
KBN
lm3_wssr :: KBN
lm3_z3 :: KBN
lm3_z2 :: KBN
lm3_z1 :: KBN
lm3_c33 :: KBN
lm3_c23 :: KBN
lm3_c22 :: KBN
lm3_c13 :: KBN
lm3_c12 :: KBN
lm3_c11 :: KBN
lm3_n :: Int
lm3_z3 :: LM3Acc -> KBN
lm3_z2 :: LM3Acc -> KBN
lm3_z1 :: LM3Acc -> KBN
lm3_c23 :: LM3Acc -> KBN
lm3_c13 :: LM3Acc -> KBN
lm3_c12 :: LM3Acc -> KBN
lm3_wssr :: LM3Acc -> KBN
lm3_c33 :: LM3Acc -> KBN
lm3_c22 :: LM3Acc -> KBN
lm3_c11 :: LM3Acc -> KBN
lm3_n :: LM3Acc -> Int
..} Double
y Double
f (V3 Double
d1 Double
d2 Double
d3) Double
w = LM3Acc
{ lm3_n :: Int
lm3_n = Int
lm3_n forall a. Num a => a -> a -> a
+ Int
1
, lm3_c11 :: KBN
lm3_c11 = KBN -> Double -> KBN
addKBN KBN
lm3_c11 (Double
w forall a. Num a => a -> a -> a
* Double
d1 forall a. Num a => a -> a -> a
* Double
d1)
, lm3_c12 :: KBN
lm3_c12 = KBN -> Double -> KBN
addKBN KBN
lm3_c12 (Double
w forall a. Num a => a -> a -> a
* Double
d1 forall a. Num a => a -> a -> a
* Double
d2)
, lm3_c13 :: KBN
lm3_c13 = KBN -> Double -> KBN
addKBN KBN
lm3_c12 (Double
w forall a. Num a => a -> a -> a
* Double
d1 forall a. Num a => a -> a -> a
* Double
d3)
, lm3_c22 :: KBN
lm3_c22 = KBN -> Double -> KBN
addKBN KBN
lm3_c22 (Double
w forall a. Num a => a -> a -> a
* Double
d2 forall a. Num a => a -> a -> a
* Double
d2)
, lm3_c23 :: KBN
lm3_c23 = KBN -> Double -> KBN
addKBN KBN
lm3_c22 (Double
w forall a. Num a => a -> a -> a
* Double
d2 forall a. Num a => a -> a -> a
* Double
d3)
, lm3_c33 :: KBN
lm3_c33 = KBN -> Double -> KBN
addKBN KBN
lm3_c22 (Double
w forall a. Num a => a -> a -> a
* Double
d3 forall a. Num a => a -> a -> a
* Double
d3)
, lm3_z1 :: KBN
lm3_z1 = KBN -> Double -> KBN
addKBN KBN
lm3_z1 (Double
w forall a. Num a => a -> a -> a
* Double
d1 forall a. Num a => a -> a -> a
* Double
res)
, lm3_z2 :: KBN
lm3_z2 = KBN -> Double -> KBN
addKBN KBN
lm3_z2 (Double
w forall a. Num a => a -> a -> a
* Double
d2 forall a. Num a => a -> a -> a
* Double
res)
, lm3_z3 :: KBN
lm3_z3 = KBN -> Double -> KBN
addKBN KBN
lm3_z3 (Double
w forall a. Num a => a -> a -> a
* Double
d3 forall a. Num a => a -> a -> a
* Double
res)
, lm3_wssr :: KBN
lm3_wssr = KBN -> Double -> KBN
addKBN KBN
lm3_wssr (Double
w forall a. Num a => a -> a -> a
* Double
res forall a. Num a => a -> a -> a
* Double
res)
}
where
res :: Double
res = Double
y forall a. Num a => a -> a -> a
- Double
f
data Fit v = Fit
{ forall v. Fit v -> v
fitParams :: !v
, forall v. Fit v -> v
fitErrors :: !v
, forall v. Fit v -> Int
fitNDF :: !Int
, forall v. Fit v -> Double
fitWSSR :: !Double
}
deriving Int -> Fit v -> ShowS
forall v. Show v => Int -> Fit v -> ShowS
forall v. Show v => [Fit v] -> ShowS
forall v. Show v => Fit v -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Fit v] -> ShowS
$cshowList :: forall v. Show v => [Fit v] -> ShowS
show :: Fit v -> String
$cshow :: forall v. Show v => Fit v -> String
showsPrec :: Int -> Fit v -> ShowS
$cshowsPrec :: forall v. Show v => Int -> Fit v -> ShowS
Show
instance (NFData v) => NFData (Fit v) where
rnf :: Fit v -> ()
rnf (Fit v
p v
e Int
_ Double
_) = forall a. NFData a => a -> ()
rnf v
p seq :: forall a b. a -> b -> b
`seq` forall a. NFData a => a -> ()
rnf v
e
data LinRegAcc = LinRegAcc
{ LinRegAcc -> Int
lra_n :: {-# UNPACK #-} !Int
, LinRegAcc -> KBN
lra_w :: {-# UNPACK #-} !KBN
, LinRegAcc -> KBN
lra_x :: {-# UNPACK #-} !KBN
, LinRegAcc -> KBN
lra_x2 :: {-# UNPACK #-} !KBN
, LinRegAcc -> KBN
lra_y :: {-# UNPACK #-} !KBN
, LinRegAcc -> KBN
lra_xy :: {-# UNPACK #-} !KBN
, LinRegAcc -> KBN
lra_y2 :: {-# UNPACK #-} !KBN
}
deriving Int -> LinRegAcc -> ShowS
[LinRegAcc] -> ShowS
LinRegAcc -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LinRegAcc] -> ShowS
$cshowList :: [LinRegAcc] -> ShowS
show :: LinRegAcc -> String
$cshow :: LinRegAcc -> String
showsPrec :: Int -> LinRegAcc -> ShowS
$cshowsPrec :: Int -> LinRegAcc -> ShowS
Show
instance NFData LinRegAcc where
rnf :: LinRegAcc -> ()
rnf LinRegAcc {} = ()
zeroLinRegAcc :: LinRegAcc
zeroLinRegAcc :: LinRegAcc
zeroLinRegAcc = Int -> KBN -> KBN -> KBN -> KBN -> KBN -> KBN -> LinRegAcc
LinRegAcc Int
0 KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN
addLinReg
:: LinRegAcc
-> Double
-> Double
-> LinRegAcc
addLinReg :: LinRegAcc -> Double -> Double -> LinRegAcc
addLinReg LinRegAcc {Int
KBN
lra_y2 :: KBN
lra_xy :: KBN
lra_y :: KBN
lra_x2 :: KBN
lra_x :: KBN
lra_w :: KBN
lra_n :: Int
lra_y2 :: LinRegAcc -> KBN
lra_xy :: LinRegAcc -> KBN
lra_y :: LinRegAcc -> KBN
lra_x2 :: LinRegAcc -> KBN
lra_x :: LinRegAcc -> KBN
lra_w :: LinRegAcc -> KBN
lra_n :: LinRegAcc -> Int
..} Double
x Double
y = LinRegAcc
{ lra_n :: Int
lra_n = Int
lra_n forall a. Num a => a -> a -> a
+ Int
1
, lra_w :: KBN
lra_w = KBN -> Double -> KBN
addKBN KBN
lra_w Double
1
, lra_x :: KBN
lra_x = KBN -> Double -> KBN
addKBN KBN
lra_x Double
x
, lra_x2 :: KBN
lra_x2 = KBN -> Double -> KBN
addKBN KBN
lra_x2 (Double
x forall a. Num a => a -> a -> a
* Double
x)
, lra_y :: KBN
lra_y = KBN -> Double -> KBN
addKBN KBN
lra_y Double
y
, lra_xy :: KBN
lra_xy = KBN -> Double -> KBN
addKBN KBN
lra_xy (Double
x forall a. Num a => a -> a -> a
* Double
y)
, lra_y2 :: KBN
lra_y2 = KBN -> Double -> KBN
addKBN KBN
lra_y2 (Double
y forall a. Num a => a -> a -> a
* Double
y)
}
addLinRegW
:: LinRegAcc
-> Double
-> Double
-> Double
-> LinRegAcc
addLinRegW :: LinRegAcc -> Double -> Double -> Double -> LinRegAcc
addLinRegW LinRegAcc {Int
KBN
lra_y2 :: KBN
lra_xy :: KBN
lra_y :: KBN
lra_x2 :: KBN
lra_x :: KBN
lra_w :: KBN
lra_n :: Int
lra_y2 :: LinRegAcc -> KBN
lra_xy :: LinRegAcc -> KBN
lra_y :: LinRegAcc -> KBN
lra_x2 :: LinRegAcc -> KBN
lra_x :: LinRegAcc -> KBN
lra_w :: LinRegAcc -> KBN
lra_n :: LinRegAcc -> Int
..} Double
x Double
y Double
w = LinRegAcc
{ lra_n :: Int
lra_n = Int
lra_n forall a. Num a => a -> a -> a
+ Int
1
, lra_w :: KBN
lra_w = KBN -> Double -> KBN
addKBN KBN
lra_w Double
w
, lra_x :: KBN
lra_x = KBN -> Double -> KBN
addKBN KBN
lra_x (Double
w forall a. Num a => a -> a -> a
* Double
x)
, lra_x2 :: KBN
lra_x2 = KBN -> Double -> KBN
addKBN KBN
lra_x2 (Double
w forall a. Num a => a -> a -> a
* Double
x forall a. Num a => a -> a -> a
* Double
x)
, lra_y :: KBN
lra_y = KBN -> Double -> KBN
addKBN KBN
lra_y (Double
w forall a. Num a => a -> a -> a
* Double
y)
, lra_xy :: KBN
lra_xy = KBN -> Double -> KBN
addKBN KBN
lra_xy (Double
w forall a. Num a => a -> a -> a
* Double
x forall a. Num a => a -> a -> a
* Double
y)
, lra_y2 :: KBN
lra_y2 = KBN -> Double -> KBN
addKBN KBN
lra_y2 (Double
w forall a. Num a => a -> a -> a
* Double
y forall a. Num a => a -> a -> a
* Double
y)
}
data QuadRegAcc = QuadRegAcc
{ QuadRegAcc -> Int
qra_n :: {-# UNPACK #-} !Int
, QuadRegAcc -> KBN
qra_w :: {-# UNPACK #-} !KBN
, QuadRegAcc -> KBN
qra_x :: {-# UNPACK #-} !KBN
, QuadRegAcc -> KBN
qra_x2 :: {-# UNPACK #-} !KBN
, QuadRegAcc -> KBN
qra_x3 :: {-# UNPACK #-} !KBN
, QuadRegAcc -> KBN
qra_x4 :: {-# UNPACK #-} !KBN
, QuadRegAcc -> KBN
qra_y :: {-# UNPACK #-} !KBN
, QuadRegAcc -> KBN
qra_xy :: {-# UNPACK #-} !KBN
, QuadRegAcc -> KBN
qra_x2y :: {-# UNPACK #-} !KBN
, QuadRegAcc -> KBN
qra_y2 :: {-# UNPACK #-} !KBN
}
deriving Int -> QuadRegAcc -> ShowS
[QuadRegAcc] -> ShowS
QuadRegAcc -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [QuadRegAcc] -> ShowS
$cshowList :: [QuadRegAcc] -> ShowS
show :: QuadRegAcc -> String
$cshow :: QuadRegAcc -> String
showsPrec :: Int -> QuadRegAcc -> ShowS
$cshowsPrec :: Int -> QuadRegAcc -> ShowS
Show
instance NFData QuadRegAcc where
rnf :: QuadRegAcc -> ()
rnf QuadRegAcc {} = ()
zeroQuadRegAcc :: QuadRegAcc
zeroQuadRegAcc :: QuadRegAcc
zeroQuadRegAcc = Int
-> KBN
-> KBN
-> KBN
-> KBN
-> KBN
-> KBN
-> KBN
-> KBN
-> KBN
-> QuadRegAcc
QuadRegAcc Int
0 KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN KBN
zeroKBN
addQuadReg
:: QuadRegAcc
-> Double
-> Double
-> QuadRegAcc
addQuadReg :: QuadRegAcc -> Double -> Double -> QuadRegAcc
addQuadReg QuadRegAcc {Int
KBN
qra_y2 :: KBN
qra_x2y :: KBN
qra_xy :: KBN
qra_y :: KBN
qra_x4 :: KBN
qra_x3 :: KBN
qra_x2 :: KBN
qra_x :: KBN
qra_w :: KBN
qra_n :: Int
qra_y2 :: QuadRegAcc -> KBN
qra_x2y :: QuadRegAcc -> KBN
qra_xy :: QuadRegAcc -> KBN
qra_y :: QuadRegAcc -> KBN
qra_x4 :: QuadRegAcc -> KBN
qra_x3 :: QuadRegAcc -> KBN
qra_x2 :: QuadRegAcc -> KBN
qra_x :: QuadRegAcc -> KBN
qra_w :: QuadRegAcc -> KBN
qra_n :: QuadRegAcc -> Int
..} Double
x Double
y = QuadRegAcc
{ qra_n :: Int
qra_n = Int
qra_n forall a. Num a => a -> a -> a
+ Int
1
, qra_w :: KBN
qra_w = KBN -> Double -> KBN
addKBN KBN
qra_w Double
1
, qra_x :: KBN
qra_x = KBN -> Double -> KBN
addKBN KBN
qra_x Double
x
, qra_x2 :: KBN
qra_x2 = KBN -> Double -> KBN
addKBN KBN
qra_x2 Double
x2
, qra_x3 :: KBN
qra_x3 = KBN -> Double -> KBN
addKBN KBN
qra_x3 (Double
x forall a. Num a => a -> a -> a
* Double
x2)
, qra_x4 :: KBN
qra_x4 = KBN -> Double -> KBN
addKBN KBN
qra_x4 (Double
x2 forall a. Num a => a -> a -> a
* Double
x2)
, qra_y :: KBN
qra_y = KBN -> Double -> KBN
addKBN KBN
qra_y Double
y
, qra_xy :: KBN
qra_xy = KBN -> Double -> KBN
addKBN KBN
qra_xy (Double
x forall a. Num a => a -> a -> a
* Double
y)
, qra_x2y :: KBN
qra_x2y = KBN -> Double -> KBN
addKBN KBN
qra_x2y (Double
x2 forall a. Num a => a -> a -> a
* Double
y)
, qra_y2 :: KBN
qra_y2 = KBN -> Double -> KBN
addKBN KBN
qra_y2 (Double
y forall a. Num a => a -> a -> a
* Double
y)
}
where
x2 :: Double
x2 = Double
x forall a. Num a => a -> a -> a
* Double
x
addQuadRegW
:: QuadRegAcc
-> Double
-> Double
-> Double
-> QuadRegAcc
addQuadRegW :: QuadRegAcc -> Double -> Double -> Double -> QuadRegAcc
addQuadRegW QuadRegAcc {Int
KBN
qra_y2 :: KBN
qra_x2y :: KBN
qra_xy :: KBN
qra_y :: KBN
qra_x4 :: KBN
qra_x3 :: KBN
qra_x2 :: KBN
qra_x :: KBN
qra_w :: KBN
qra_n :: Int
qra_y2 :: QuadRegAcc -> KBN
qra_x2y :: QuadRegAcc -> KBN
qra_xy :: QuadRegAcc -> KBN
qra_y :: QuadRegAcc -> KBN
qra_x4 :: QuadRegAcc -> KBN
qra_x3 :: QuadRegAcc -> KBN
qra_x2 :: QuadRegAcc -> KBN
qra_x :: QuadRegAcc -> KBN
qra_w :: QuadRegAcc -> KBN
qra_n :: QuadRegAcc -> Int
..} Double
x Double
y Double
w = QuadRegAcc
{ qra_n :: Int
qra_n = Int
qra_n forall a. Num a => a -> a -> a
+ Int
1
, qra_w :: KBN
qra_w = KBN -> Double -> KBN
addKBN KBN
qra_w Double
w
, qra_x :: KBN
qra_x = KBN -> Double -> KBN
addKBN KBN
qra_x (Double
w forall a. Num a => a -> a -> a
* Double
x)
, qra_x2 :: KBN
qra_x2 = KBN -> Double -> KBN
addKBN KBN
qra_x2 (Double
w forall a. Num a => a -> a -> a
* Double
x2)
, qra_x3 :: KBN
qra_x3 = KBN -> Double -> KBN
addKBN KBN
qra_x3 (Double
w forall a. Num a => a -> a -> a
* Double
x forall a. Num a => a -> a -> a
* Double
x2)
, qra_x4 :: KBN
qra_x4 = KBN -> Double -> KBN
addKBN KBN
qra_x4 (Double
w forall a. Num a => a -> a -> a
* Double
x2 forall a. Num a => a -> a -> a
* Double
x2)
, qra_y :: KBN
qra_y = KBN -> Double -> KBN
addKBN KBN
qra_y (Double
w forall a. Num a => a -> a -> a
* Double
y)
, qra_xy :: KBN
qra_xy = KBN -> Double -> KBN
addKBN KBN
qra_xy (Double
w forall a. Num a => a -> a -> a
* Double
x forall a. Num a => a -> a -> a
* Double
y)
, qra_x2y :: KBN
qra_x2y = KBN -> Double -> KBN
addKBN KBN
qra_x2y (Double
w forall a. Num a => a -> a -> a
* Double
x2 forall a. Num a => a -> a -> a
* Double
y)
, qra_y2 :: KBN
qra_y2 = KBN -> Double -> KBN
addKBN KBN
qra_y2 (Double
w forall a. Num a => a -> a -> a
* Double
y forall a. Num a => a -> a -> a
* Double
y)
}
where
x2 :: Double
x2 = Double
x forall a. Num a => a -> a -> a
* Double
x
quadRegAccToLin :: QuadRegAcc -> LinRegAcc
quadRegAccToLin :: QuadRegAcc -> LinRegAcc
quadRegAccToLin QuadRegAcc {Int
KBN
qra_y2 :: KBN
qra_x2y :: KBN
qra_xy :: KBN
qra_y :: KBN
qra_x4 :: KBN
qra_x3 :: KBN
qra_x2 :: KBN
qra_x :: KBN
qra_w :: KBN
qra_n :: Int
qra_y2 :: QuadRegAcc -> KBN
qra_x2y :: QuadRegAcc -> KBN
qra_xy :: QuadRegAcc -> KBN
qra_y :: QuadRegAcc -> KBN
qra_x4 :: QuadRegAcc -> KBN
qra_x3 :: QuadRegAcc -> KBN
qra_x2 :: QuadRegAcc -> KBN
qra_x :: QuadRegAcc -> KBN
qra_w :: QuadRegAcc -> KBN
qra_n :: QuadRegAcc -> Int
..} = LinRegAcc
{ lra_n :: Int
lra_n = Int
qra_n
, lra_w :: KBN
lra_w = KBN
qra_w
, lra_x :: KBN
lra_x = KBN
qra_x
, lra_x2 :: KBN
lra_x2 = KBN
qra_x2
, lra_y :: KBN
lra_y = KBN
qra_y
, lra_xy :: KBN
lra_xy = KBN
qra_xy
, lra_y2 :: KBN
lra_y2 = KBN
qra_y2
}
sq :: Num a => a -> a
sq :: forall a. Num a => a -> a
sq a
x = a
x forall a. Num a => a -> a -> a
* a
x
{-# INLINE sq #-}
iterate1 :: (b -> b) -> b -> NE.NonEmpty b
iterate1 :: forall b. (b -> b) -> b -> NonEmpty b
iterate1 b -> b
g b
x = forall a. a -> NonEmpty a -> NonEmpty a
NE.cons b
x (forall b. (b -> b) -> b -> NonEmpty b
iterate1 b -> b
g (b -> b
g b
x))
lmStop :: Double -> Double -> Double -> Bool
lmStop :: Double -> Double -> Double -> Bool
lmStop Double
lambda Double
wssr Double
wssr' =
Double
lambda forall a. Ord a => a -> a -> Bool
< Double
1e-20 Bool -> Bool -> Bool
|| Double
lambda forall a. Ord a => a -> a -> Bool
> Double
1e20 Bool -> Bool -> Bool
|| forall a. RealFloat a => a -> Bool
isNaN Double
wssr' Bool -> Bool -> Bool
|| Double
relDiff forall a. Ord a => a -> a -> Bool
< Double
1e-10
where
relDiff :: Double
relDiff = forall a. Num a => a -> a
abs (Double
wssr' forall a. Num a => a -> a -> a
- Double
wssr) forall a. Fractional a => a -> a -> a
/ Double
wssr