Current section
Files
Jump to
Current section
Files
src/mlx_random_nif.erl
-module(mlx_random_nif).
%% Random number generation NIF functions
-export([
%% Basic random operations
seed/1, key/1,
normal/3, uniform/4, randint/4,
%% Statistical distributions
bernoulli/3, categorical/3, multinomial/4,
%% Advanced distributions
gamma/4, beta/4, exponential/3, poisson/3,
%% Random utilities
shuffle/2, choice/3, permutation/1, permutation/2
]).
%% Load the NIF library
-on_load(init/0).
-spec init() -> ok | {error, term()}.
init() ->
PrivDir = case code:priv_dir(mlx) of
{error, _} ->
EbinDir = filename:dirname(code:which(?MODULE)),
AppPath = filename:dirname(EbinDir),
filename:join(AppPath, "priv");
Path ->
Path
end,
erlang:load_nif(filename:join(PrivDir, "mlx_random_nif"), 0).
%% NIF stubs - these will be replaced by the actual NIF implementations
-spec seed(integer()) -> ok | {error, term()}.
seed(_Seed) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec key(integer()) -> {ok, reference()} | {error, term()}.
key(_Seed) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec normal([integer()], number(), number()) -> {ok, reference()} | {error, term()}.
normal(_Shape, _Mean, _Std) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec uniform([integer()], number(), number(), atom()) -> {ok, reference()} | {error, term()}.
uniform(_Shape, _Low, _High, _Dtype) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec randint(integer(), integer(), [integer()], atom()) -> {ok, reference()} | {error, term()}.
randint(_Low, _High, _Shape, _Dtype) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec bernoulli(reference(), [integer()], atom()) -> {ok, reference()} | {error, term()}.
bernoulli(_P, _Shape, _Dtype) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec categorical(reference(), [integer()], atom()) -> {ok, reference()} | {error, term()}.
categorical(_Logits, _Shape, _Dtype) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec multinomial(reference(), integer(), [integer()], atom()) -> {ok, reference()} | {error, term()}.
multinomial(_P, _N, _Shape, _Dtype) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec gamma(reference(), reference(), [integer()], atom()) -> {ok, reference()} | {error, term()}.
gamma(_Alpha, _Beta, _Shape, _Dtype) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec beta(reference(), reference(), [integer()], atom()) -> {ok, reference()} | {error, term()}.
beta(_Alpha, _Beta, _Shape, _Dtype) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec exponential(reference(), [integer()], atom()) -> {ok, reference()} | {error, term()}.
exponential(_Lambda, _Shape, _Dtype) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec poisson(reference(), [integer()], atom()) -> {ok, reference()} | {error, term()}.
poisson(_Lambda, _Shape, _Dtype) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec shuffle(reference(), integer()) -> {ok, reference()} | {error, term()}.
shuffle(_Array, _Axis) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec choice(reference(), integer(), boolean()) -> {ok, reference()} | {error, term()}.
choice(_Array, _Size, _Replace) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec permutation(integer()) -> {ok, reference()} | {error, term()}.
permutation(_N) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec permutation(reference(), integer()) -> {ok, reference()} | {error, term()}.
permutation(_Array, _Axis) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).