module Gev.Weibull
(
WeibullDistribution
, weibullDist
, weibullDistMaybe
, location
, scale
, shape
) where
import qualified Gev
data WeibullDistribution = Weibull {
WeibullDistribution -> Double
location :: {-# UNPACK #-} !Double
, WeibullDistribution -> Double
scale :: {-# UNPACK #-} !Double
, WeibullDistribution -> Double
shape :: {-# UNPACK #-} !Double
} deriving (WeibullDistribution -> WeibullDistribution -> Bool
(WeibullDistribution -> WeibullDistribution -> Bool)
-> (WeibullDistribution -> WeibullDistribution -> Bool)
-> Eq WeibullDistribution
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: WeibullDistribution -> WeibullDistribution -> Bool
$c/= :: WeibullDistribution -> WeibullDistribution -> Bool
== :: WeibullDistribution -> WeibullDistribution -> Bool
$c== :: WeibullDistribution -> WeibullDistribution -> Bool
Eq)
instance Show WeibullDistribution where
show :: WeibullDistribution -> String
show (Weibull Double
loc Double
sc Double
sh) = ShowS
forall a. Show a => a -> String
show String
"Weibull Distribution; loc: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Double -> String
forall a. Show a => a -> String
show Double
loc String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
", scale: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Double -> String
forall a. Show a => a -> String
show Double
sc String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" and shape: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Double -> String
forall a. Show a => a -> String
show Double
sh
weibullErrMsg :: Double -> Double -> Double -> String
weibullErrMsg :: Double -> Double -> Double -> String
weibullErrMsg Double
loc Double
scale Double
sh = String
"Gev.Weibull: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"loc = " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Double -> String
forall a. Show a => a -> String
show Double
loc
String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" scale = " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Double -> String
forall a. Show a => a -> String
show Double
scale
String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" schape = " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Double -> String
forall a. Show a => a -> String
show Double
sh
String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
", but both the scale and shape parameters must be positive!"
weibullDistMaybe :: Double -> Double -> Double -> Maybe WeibullDistribution
weibullDistMaybe :: Double -> Double -> Double -> Maybe WeibullDistribution
weibullDistMaybe Double
loc Double
sc Double
sh
| Double
sc Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
> Double
0 Bool -> Bool -> Bool
&& Double
sh Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
> Double
0 = WeibullDistribution -> Maybe WeibullDistribution
forall a. a -> Maybe a
Just (WeibullDistribution -> Maybe WeibullDistribution)
-> WeibullDistribution -> Maybe WeibullDistribution
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Double -> WeibullDistribution
Weibull Double
loc Double
sc Double
sh
| Bool
otherwise = Maybe WeibullDistribution
forall a. Maybe a
Nothing
weibullDist :: Double -> Double -> Double -> WeibullDistribution
weibullDist :: Double -> Double -> Double -> WeibullDistribution
weibullDist Double
loc Double
sc Double
sh = WeibullDistribution
-> (WeibullDistribution -> WeibullDistribution)
-> Maybe WeibullDistribution
-> WeibullDistribution
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (String -> WeibullDistribution
forall a. HasCallStack => String -> a
error (String -> WeibullDistribution) -> String -> WeibullDistribution
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Double -> String
weibullErrMsg Double
loc Double
sc Double
sh) WeibullDistribution -> WeibullDistribution
forall a. a -> a
id (Maybe WeibullDistribution -> WeibullDistribution)
-> Maybe WeibullDistribution -> WeibullDistribution
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Double -> Maybe WeibullDistribution
weibullDistMaybe Double
loc Double
sh Double
sc
cdfWeibull :: WeibullDistribution -> Double -> Double
cdfWeibull :: WeibullDistribution -> Double -> Double
cdfWeibull (Weibull Double
loc Double
sc Double
sh) Double
x
| Double
x Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
<= Double
0 = Double
0
| Bool
otherwise = Double -> Double
forall a. Floating a => a -> a
exp (Double -> Double) -> Double -> Double
forall a b. (a -> b) -> a -> b
$ - ((- Double
y) Double -> Double -> Double
forall a. Floating a => a -> a -> a
** Double
sh)
where
y :: Double
y = (Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
loc) Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
sc
pdfWeibull :: WeibullDistribution -> Double -> Double
pdfWeibull :: WeibullDistribution -> Double -> Double
pdfWeibull (Weibull Double
loc Double
sc Double
sh) Double
x =
let y :: Double
y = (Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
loc) Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
sc
const :: Double
const = Double
sh Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
sc
expterm :: Double
expterm = Double -> Double
forall a. Floating a => a -> a
exp (Double -> Double) -> Double -> Double
forall a b. (a -> b) -> a -> b
$ - ((- Double
y) Double -> Double -> Double
forall a. Floating a => a -> a -> a
** Double
sh)
middle :: Double
middle = (- Double
y) Double -> Double -> Double
forall a. Floating a => a -> a -> a
** (Double
sh Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
1)
in Double
const Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
middle Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
expterm
quantileWeibull :: WeibullDistribution -> Double -> Double
quantileWeibull :: WeibullDistribution -> Double -> Double
quantileWeibull (Weibull Double
loc Double
sc Double
sh) Double
x
| Double
x Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
> Double
0 Bool -> Bool -> Bool
&& Double
x Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Double
1 = Double
loc Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
sc Double -> Double -> Double
forall a. Num a => a -> a -> a
* (Double
logexp Double -> Double -> Double
forall a. Floating a => a -> a -> a
** Double
pow)
| Bool
otherwise =
String -> Double
forall a. HasCallStack => String -> a
error (String -> Double) -> String -> Double
forall a b. (a -> b) -> a -> b
$ String
"Gev.WeibullDistribution.quantile: The given value must be between 0 and 1, got: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Double -> String
forall a. Show a => a -> String
show Double
x
where
logexp :: Double
logexp = - Double -> Double
forall a. Floating a => a -> a
log Double
x
pow :: Double
pow = Double
1 Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
sh
instance Gev.Distribution WeibullDistribution where
pdf :: WeibullDistribution -> Double -> Double
pdf = WeibullDistribution -> Double -> Double
pdfWeibull
cdf :: WeibullDistribution -> Double -> Double
cdf = WeibullDistribution -> Double -> Double
cdfWeibull
quantile :: WeibullDistribution -> Double -> Double
quantile = WeibullDistribution -> Double -> Double
quantileWeibull