Current section
Files
Jump to
Current section
Files
src/gleam_stats@distributions@weibull.erl
-module(gleam_stats@distributions@weibull).
-compile(no_auto_import).
-export([weibull_mean/2, weibull_variance/2, weibull_pdf/3, weibull_cdf/3, do_weibull_cdf/3, weibull_random/4]).
-spec check_weibull_parameters(float(), float()) -> {ok, boolean()} |
{error, binary()}.
check_weibull_parameters(Lambda, K) ->
case (Lambda > 0.0) andalso (K > 0.0) of
false ->
_pipe = <<"Invalid input argument: lambda < 0 or k < 0. Valid input is lambda > 0 and k > 0."/utf8>>,
{error, _pipe};
true ->
_pipe@1 = true,
{ok, _pipe@1}
end.
-spec weibull_mean(float(), float()) -> {ok, float()} | {error, binary()}.
weibull_mean(Lambda, K) ->
case check_weibull_parameters(Lambda, K) of
{error, String} ->
_pipe = String,
{error, _pipe};
_@1 ->
_pipe@1 = Lambda * gleam_stats@math:gamma(1.0 + (case K of
0.0 -> 0.0;
Gleam@denominator -> 1.0 / Gleam@denominator
end)),
{ok, _pipe@1}
end.
-spec weibull_variance(float(), float()) -> {ok, float()} | {error, binary()}.
weibull_variance(Lambda, K) ->
case check_weibull_parameters(Lambda, K) of
{error, String} ->
_pipe = String,
{error, _pipe};
_@1 ->
{ok, V1@1} = case gleam_stats@math:pow(Lambda, 2.0) of
{ok, V1} -> {ok, V1};
_try ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try,
module => <<"gleam_stats/distributions/weibull"/utf8>>,
function => <<"weibull_variance"/utf8>>,
line => 85})
end,
{ok, V2@1} = case gleam_stats@math:pow(
gleam_stats@math:gamma(1.0 + (case K of
0.0 -> 0.0;
Gleam@denominator -> 1.0 / Gleam@denominator
end)),
2.0
) of
{ok, V2} -> {ok, V2};
_try@1 ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try@1,
module => <<"gleam_stats/distributions/weibull"/utf8>>,
function => <<"weibull_variance"/utf8>>,
line => 86})
end,
_pipe@1 = V1@1 * (gleam_stats@math:gamma(1.0 + (case K of
0.0 -> 0.0;
Gleam@denominator@1 -> 2.0 / Gleam@denominator@1
end)) - V2@1),
{ok, _pipe@1}
end.
-spec weibull_pdf(float(), float(), float()) -> {ok, float()} |
{error, binary()}.
weibull_pdf(X, Lambda, K) ->
do_weibull_pdf(X, Lambda, K).
-spec do_weibull_pdf(float(), float(), float()) -> {ok, float()} |
{error, binary()}.
do_weibull_pdf(X, Lambda, K) ->
case check_weibull_parameters(Lambda, K) of
{error, String} ->
_pipe = String,
{error, _pipe};
_@1 ->
case X < 0.0 of
true ->
_pipe@1 = 0.0,
{ok, _pipe@1};
false ->
{ok, V1@1} = case gleam_stats@math:pow(case Lambda of
0.0 -> 0.0;
Gleam@denominator -> X / Gleam@denominator
end, K - 1.0) of
{ok, V1} -> {ok, V1};
_try ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try,
module => <<"gleam_stats/distributions/weibull"/utf8>>,
function => <<"do_weibull_pdf"/utf8>>,
line => 140})
end,
{ok, V2@1} = case gleam_stats@math:pow(case Lambda of
0.0 -> 0.0;
Gleam@denominator@1 -> X / Gleam@denominator@1
end, K) of
{ok, V2} -> {ok, V2};
_try@1 ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try@1,
module => <<"gleam_stats/distributions/weibull"/utf8>>,
function => <<"do_weibull_pdf"/utf8>>,
line => 141})
end,
_pipe@2 = ((case Lambda of
0.0 -> 0.0;
Gleam@denominator@2 -> K / Gleam@denominator@2
end) * V1@1) * gleam_stats@math:exp(-1.0 * V2@1),
{ok, _pipe@2}
end
end.
-spec weibull_cdf(float(), float(), float()) -> {ok, float()} |
{error, binary()}.
weibull_cdf(X, Lambda, K) ->
do_weibull_cdf(X, Lambda, K).
-spec do_weibull_cdf(float(), float(), float()) -> {ok, float()} |
{error, binary()}.
do_weibull_cdf(X, Lambda, K) ->
case check_weibull_parameters(Lambda, K) of
{error, String} ->
_pipe = String,
{error, _pipe};
_@1 ->
case X < 0.0 of
true ->
_pipe@1 = 0.0,
{ok, _pipe@1};
false ->
{ok, V@1} = case gleam_stats@math:pow(case Lambda of
0.0 -> 0.0;
Gleam@denominator -> X / Gleam@denominator
end, K) of
{ok, V} -> {ok, V};
_try ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try,
module => <<"gleam_stats/distributions/weibull"/utf8>>,
function => <<"do_weibull_cdf"/utf8>>,
line => 206})
end,
_pipe@2 = 1.0 - gleam_stats@math:exp(-1.0 * V@1),
{ok, _pipe@2}
end
end.
-spec weibull_random(
gleam@iterator:iterator(integer()),
float(),
float(),
integer()
) -> {ok, {list(float()), gleam@iterator:iterator(integer())}} |
{error, binary()}.
weibull_random(Stream, Lambda, K, M) ->
do_weibull_random(Stream, Lambda, K, M).
-spec do_weibull_random(
gleam@iterator:iterator(integer()),
float(),
float(),
integer()
) -> {ok, {list(float()), gleam@iterator:iterator(integer())}} |
{error, binary()}.
do_weibull_random(Stream, Lambda, K, M) ->
case check_weibull_parameters(Lambda, K) of
{error, String} ->
_pipe = String,
{error, _pipe};
_@1 ->
case M > 0 of
false ->
{error,
<<"Invalid input arugment: m < 0. Valid input is m > 0."/utf8>>};
true ->
{ok, Out@1} = case gleam_stats@distributions@uniform:uniform_random(
Stream,
0.0,
1.0,
M
) of
{ok, Out} -> {ok, Out};
_try ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try,
module => <<"gleam_stats/distributions/weibull"/utf8>>,
function => <<"do_weibull_random"/utf8>>,
line => 283})
end,
Numbers = begin
_pipe@1 = gleam@pair:first(Out@1),
gleam@list:map(
_pipe@1,
fun(X) ->
{ok, X1@1} = case gleam_stats@math:log(1.0 - X) of
{ok, X1} -> {ok, X1};
_try@1 ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try@1,
module => <<"gleam_stats/distributions/weibull"/utf8>>,
function => <<"do_weibull_random"/utf8>>,
line => 289})
end,
{ok, X2@1} = case gleam_stats@math:pow(
-1.0
* X1@1,
case K of
0.0 -> 0.0;
Gleam@denominator -> 1.0
/ Gleam@denominator
end
) of
{ok, X2} -> {ok, X2};
_try@2 ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try@2,
module => <<"gleam_stats/distributions/weibull"/utf8>>,
function => <<"do_weibull_random"/utf8>>,
line => 290})
end,
Lambda
* X2@1
end
)
end,
_pipe@2 = {Numbers, gleam@pair:second(Out@1)},
{ok, _pipe@2}
end
end.