Current section

Files

Jump to
gleam_stats src gleam_stats@distributions@binomial.erl
Raw

src/gleam_stats@distributions@binomial.erl

-module(gleam_stats@distributions@binomial).
-compile(no_auto_import).
-export([binomial_mean/2, binomial_variance/2, binomial_pmf/3, binomial_cdf/3, binomial_random/4]).
-spec check_binomial_parameters(integer(), float()) -> {ok, boolean()} |
{error, binary()}.
check_binomial_parameters(N, P) ->
case N >= 0 of
false ->
_pipe = <<"Invalid input argument: n < 0. Valid input is n >= 0."/utf8>>,
{error, _pipe};
true ->
case (0.0 =< P) andalso (P =< 1.0) of
false ->
_pipe@1 = <<"Invalid input argument: p < 0 or p > 1. Valid input is 0 <= p <= 1."/utf8>>,
{error, _pipe@1};
true ->
_pipe@2 = true,
{ok, _pipe@2}
end
end.
-spec binomial_mean(integer(), float()) -> {ok, float()} | {error, binary()}.
binomial_mean(N, P) ->
case check_binomial_parameters(N, P) of
{error, String} ->
_pipe = String,
{error, _pipe};
_@1 ->
_pipe@1 = gleam@int:to_float(N) * P,
{ok, _pipe@1}
end.
-spec binomial_variance(integer(), float()) -> {ok, float()} | {error, binary()}.
binomial_variance(N, P) ->
case check_binomial_parameters(N, P) of
{error, String} ->
_pipe = String,
{error, _pipe};
_@1 ->
_pipe@1 = (gleam@int:to_float(N) * P) * (1.0 - P),
{ok, _pipe@1}
end.
-spec binomial_pmf(integer(), integer(), float()) -> {ok, float()} |
{error, binary()}.
binomial_pmf(X, N, P) ->
do_binomial_pmf(X, N, P).
-spec do_binomial_pmf(integer(), integer(), float()) -> {ok, float()} |
{error, binary()}.
do_binomial_pmf(X, N, P) ->
case check_binomial_parameters(N, P) of
{error, String} ->
_pipe = String,
{error, _pipe};
_@1 ->
case (X >= 0) andalso (X =< N) of
true ->
{ok, C@1} = case gleam_stats@math:combination(N, X) of
{ok, C} -> {ok, C};
_try ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try,
module => <<"gleam_stats/distributions/binomial"/utf8>>,
function => <<"do_binomial_pmf"/utf8>>,
line => 151})
end,
{ok, V1@1} = case gleam_stats@math:pow(
P,
gleam@int:to_float(X)
) of
{ok, V1} -> {ok, V1};
_try@1 ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try@1,
module => <<"gleam_stats/distributions/binomial"/utf8>>,
function => <<"do_binomial_pmf"/utf8>>,
line => 152})
end,
{ok, V2@1} = case gleam_stats@math:pow(
1.0
- P,
gleam@int:to_float(N - X)
) of
{ok, V2} -> {ok, V2};
_try@2 ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try@2,
module => <<"gleam_stats/distributions/binomial"/utf8>>,
function => <<"do_binomial_pmf"/utf8>>,
line => 153})
end,
_pipe@1 = (gleam@int:to_float(C@1) * V1@1) * V2@1,
{ok, _pipe@1};
_@2 ->
_pipe@2 = 0.0,
{ok, _pipe@2}
end
end.
-spec binomial_cdf(integer(), integer(), float()) -> {ok, float()} |
{error, binary()}.
binomial_cdf(X, N, P) ->
do_binomial_cdf(X, N, P).
-spec do_binomial_cdf(integer(), integer(), float()) -> {ok, float()} |
{error, binary()}.
do_binomial_cdf(X, N, P) ->
case check_binomial_parameters(N, P) of
{error, String} ->
_pipe = String,
{error, _pipe};
_@1 ->
case X < 0 of
true ->
_pipe@1 = 0.0,
{ok, _pipe@1};
false ->
case (X >= 0) andalso (X < N) of
true ->
_pipe@2 = gleam@list:range(0, X + 1),
_pipe@3 = gleam@list:fold(
_pipe@2,
0.0,
fun(Acc, I) ->
{ok, C@1} = case gleam_stats@math:combination(
N,
I
) of
{ok, C} -> {ok, C};
_try ->
erlang:error(
#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try,
module => <<"gleam_stats/distributions/binomial"/utf8>>,
function => <<"do_binomial_cdf"/utf8>>,
line => 235}
)
end,
{ok, V1@1} = case gleam_stats@math:pow(
P,
gleam@int:to_float(I)
) of
{ok, V1} -> {ok, V1};
_try@1 ->
erlang:error(
#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try@1,
module => <<"gleam_stats/distributions/binomial"/utf8>>,
function => <<"do_binomial_cdf"/utf8>>,
line => 236}
)
end,
{ok, V2@1} = case gleam_stats@math:pow(
1.0
- P,
gleam@int:to_float(N - I)
) of
{ok, V2} -> {ok, V2};
_try@2 ->
erlang:error(
#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try@2,
module => <<"gleam_stats/distributions/binomial"/utf8>>,
function => <<"do_binomial_cdf"/utf8>>,
line => 237}
)
end,
Acc
+ ((gleam@int:to_float(C@1)
* V1@1)
* V2@1)
end
),
{ok, _pipe@3};
false ->
_pipe@4 = 1.0,
{ok, _pipe@4}
end
end
end.
-spec binomial_random(
gleam@iterator:iterator(integer()),
integer(),
float(),
integer()
) -> {ok, {list(integer()), gleam@iterator:iterator(integer())}} |
{error, binary()}.
binomial_random(Stream, N, P, M) ->
do_binomial_random(Stream, N, P, M).
-spec do_binomial_random(
gleam@iterator:iterator(integer()),
integer(),
float(),
integer()
) -> {ok, {list(integer()), gleam@iterator:iterator(integer())}} |
{error, binary()}.
do_binomial_random(Stream, N, P, M) ->
case check_binomial_parameters(N, P) of
{error, String} ->
_pipe = String,
{error, _pipe};
_@1 ->
case M > 0 of
false ->
_pipe@1 = <<"Invalid input arugment: m < 0. Valid input is m > 0."/utf8>>,
{error, _pipe@1};
true ->
{ok, Out@1} = case gleam_stats@distributions@bernoulli:bernoulli_random(
Stream,
P,
N
* M
) of
{ok, Out} -> {ok, Out};
_try ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try,
module => <<"gleam_stats/distributions/binomial"/utf8>>,
function => <<"do_binomial_random"/utf8>>,
line => 322})
end,
Numbers = begin
_pipe@2 = gleam@pair:first(Out@1),
_pipe@3 = gleam@list:window(_pipe@2, N),
gleam@list:map(
_pipe@3,
fun(X) ->
_pipe@4 = X,
gleam@list:fold(
_pipe@4,
0,
fun(A, B) -> A + B end
)
end
)
end,
_pipe@5 = {Numbers, gleam@pair:second(Out@1)},
{ok, _pipe@5}
end
end.