-module(mlx_nif). %% Type definitions -type array() :: reference(). -type shape() :: [integer()]. -type dtype() :: atom(). -type device() :: cpu | gpu. %% Export all NIF functions %% Array creation -export([array/2, zeros/2, ones/2, full/3, eye/2, arange/3, linspace/3]). %% Basic arithmetic operations -export([add/2, subtract/2, multiply/2, divide/2, floor_divide/2, remainder/2, divmod/2, power/2, abs/1, negative/1, reciprocal/1, sign/1]). %% Trigonometric operations -export([sin/1, cos/1, tan/1, arcsin/1, arccos/1, arctan/1, arctan2/2, sinh/1, cosh/1, tanh/1, arcsinh/1, arccosh/1, arctanh/1]). %% Exponential and logarithmic operations -export([exp/1, expm1/1, log/1, log2/1, log10/1, log1p/1, logaddexp/2, sqrt/1, square/1, rsqrt/1]). %% Array manipulation operations -export([reshape/2, transpose/1, transpose/2, squeeze/1, squeeze/2, expand_dims/2]). %% Reduction operations -export([sum/1, sum/2, sum/3, mean/1, mean/2, mean/3, max/1, max/2, max/3, min/1, min/2, min/3, var/1, var/2, var/3, var/4, std/1, std/2, std/3, std/4]). %% Cumulative operations -export([cumsum/2, cumprod/2, cummax/2, cummin/2]). %% Linear algebra operations -export([matmul/2, dot/2, inner/2, outer/2, tensordot/3]). %% Comparison operations -export([equal/2, not_equal/2, less/2, less_equal/2, greater/2, greater_equal/2, maximum/2, minimum/2, allclose/3, array_equal/2, isfinite/1, isinf/1, isnan/1]). %% Logical operations -export([logical_and/2, logical_or/2, logical_not/1, all/3, any/3]). %% Bitwise operations -export([bitwise_and/2, bitwise_or/2, bitwise_xor/2, bitwise_invert/1, left_shift/2, right_shift/2]). %% Selection and indexing operations -export([where/3, sort/1, sort/2, argsort/1, argsort/2]). %% Array concatenation and stacking -export([concatenate/2, stack/2, split/3]). %% Broadcasting operations -export([broadcast_to/2, broadcast_arrays/1]). %% Clipping and rounding operations -export([clip/3, ceil/1, floor/1, round/2]). %% Array properties and conversion -export([shape/1, size/1, ndim/1, dtype_str/1, eval/1, to_list/1]). %% Neural network operations -export([softmax/2, sigmoid/1, conv1d/3, conv2d/3]). %% Device management and utilities -export([set_default_device/1, test_basic/0, version/0]). %% Random number generation -export([random_normal/2, random_uniform/2, random_randint/3, random_seed/1]). %% Advanced mathematical functions -export([erf/1, erfc/1, gamma/1, loggamma/1, digamma/1, lgamma/1]). %% 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_nif"), 0). %% NIF stubs - these will be replaced by the actual NIF implementations %% Array creation -spec array(term(), dtype()) -> {ok, array()} | {error, term()}. array(_Data, _Dtype) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec zeros(shape(), dtype()) -> {ok, array()} | {error, term()}. zeros(_Shape, _Dtype) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec ones(shape(), dtype()) -> {ok, array()} | {error, term()}. ones(_Shape, _Dtype) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec full(shape(), number(), dtype()) -> {ok, array()} | {error, term()}. full(_Shape, _Value, _Dtype) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec eye(integer(), dtype()) -> {ok, array()} | {error, term()}. eye(_N, _Dtype) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec arange(number(), number(), number()) -> {ok, array()} | {error, term()}. arange(_Start, _Stop, _Step) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec linspace(number(), number(), integer()) -> {ok, array()} | {error, term()}. linspace(_Start, _Stop, _Num) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Basic arithmetic operations -spec add(array(), array()) -> {ok, array()} | {error, term()}. add(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec subtract(array(), array()) -> {ok, array()} | {error, term()}. subtract(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec multiply(array(), array()) -> {ok, array()} | {error, term()}. multiply(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec divide(array(), array()) -> {ok, array()} | {error, term()}. divide(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec floor_divide(array(), array()) -> {ok, array()} | {error, term()}. floor_divide(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec remainder(array(), array()) -> {ok, array()} | {error, term()}. remainder(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec divmod(array(), array()) -> {ok, {array(), array()}} | {error, term()}. divmod(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec power(array(), array()) -> {ok, array()} | {error, term()}. power(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec abs(array()) -> {ok, array()} | {error, term()}. abs(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec negative(array()) -> {ok, array()} | {error, term()}. negative(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec reciprocal(array()) -> {ok, array()} | {error, term()}. reciprocal(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec sign(array()) -> {ok, array()} | {error, term()}. sign(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Trigonometric operations -spec sin(array()) -> {ok, array()} | {error, term()}. sin(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec cos(array()) -> {ok, array()} | {error, term()}. cos(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec tan(array()) -> {ok, array()} | {error, term()}. tan(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec arcsin(array()) -> {ok, array()} | {error, term()}. arcsin(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec arccos(array()) -> {ok, array()} | {error, term()}. arccos(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec arctan(array()) -> {ok, array()} | {error, term()}. arctan(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec arctan2(array(), array()) -> {ok, array()} | {error, term()}. arctan2(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec sinh(array()) -> {ok, array()} | {error, term()}. sinh(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec cosh(array()) -> {ok, array()} | {error, term()}. cosh(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec tanh(array()) -> {ok, array()} | {error, term()}. tanh(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec arcsinh(array()) -> {ok, array()} | {error, term()}. arcsinh(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec arccosh(array()) -> {ok, array()} | {error, term()}. arccosh(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec arctanh(array()) -> {ok, array()} | {error, term()}. arctanh(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Exponential and logarithmic operations -spec exp(array()) -> {ok, array()} | {error, term()}. exp(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec expm1(array()) -> {ok, array()} | {error, term()}. expm1(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec log(array()) -> {ok, array()} | {error, term()}. log(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec log2(array()) -> {ok, array()} | {error, term()}. log2(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec log10(array()) -> {ok, array()} | {error, term()}. log10(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec log1p(array()) -> {ok, array()} | {error, term()}. log1p(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec logaddexp(array(), array()) -> {ok, array()} | {error, term()}. logaddexp(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec sqrt(array()) -> {ok, array()} | {error, term()}. sqrt(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec square(array()) -> {ok, array()} | {error, term()}. square(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec rsqrt(array()) -> {ok, array()} | {error, term()}. rsqrt(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Array manipulation operations -spec reshape(array(), shape()) -> {ok, array()} | {error, term()}. reshape(_A, _Shape) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec transpose(array()) -> {ok, array()} | {error, term()}. transpose(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec transpose(array(), list()) -> {ok, array()} | {error, term()}. transpose(_A, _Axes) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec squeeze(array()) -> {ok, array()} | {error, term()}. squeeze(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec squeeze(array(), list()) -> {ok, array()} | {error, term()}. squeeze(_A, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec expand_dims(array(), integer()) -> {ok, array()} | {error, term()}. expand_dims(_A, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Reduction operations -spec sum(array()) -> {ok, array()} | {error, term()}. sum(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec sum(array(), list()) -> {ok, array()} | {error, term()}. sum(_A, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec sum(array(), list(), boolean()) -> {ok, array()} | {error, term()}. sum(_A, _Axis, _Keepdims) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec mean(array()) -> {ok, array()} | {error, term()}. mean(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec mean(array(), list()) -> {ok, array()} | {error, term()}. mean(_A, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec mean(array(), list(), boolean()) -> {ok, array()} | {error, term()}. mean(_A, _Axis, _Keepdims) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec max(array()) -> {ok, array()} | {error, term()}. max(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec max(array(), list()) -> {ok, array()} | {error, term()}. max(_A, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec max(array(), list(), boolean()) -> {ok, array()} | {error, term()}. max(_A, _Axis, _Keepdims) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec min(array()) -> {ok, array()} | {error, term()}. min(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec min(array(), list()) -> {ok, array()} | {error, term()}. min(_A, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec min(array(), list(), boolean()) -> {ok, array()} | {error, term()}. min(_A, _Axis, _Keepdims) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec var(array()) -> {ok, array()} | {error, term()}. var(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec var(array(), list()) -> {ok, array()} | {error, term()}. var(_A, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec var(array(), list(), boolean()) -> {ok, array()} | {error, term()}. var(_A, _Axis, _Keepdims) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec var(array(), list(), boolean(), integer()) -> {ok, array()} | {error, term()}. var(_A, _Axis, _Keepdims, _Ddof) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec std(array()) -> {ok, array()} | {error, term()}. std(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec std(array(), list()) -> {ok, array()} | {error, term()}. std(_A, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec std(array(), list(), boolean()) -> {ok, array()} | {error, term()}. std(_A, _Axis, _Keepdims) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec std(array(), list(), boolean(), integer()) -> {ok, array()} | {error, term()}. std(_A, _Axis, _Keepdims, _Ddof) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Cumulative operations -spec cumsum(array(), integer()) -> {ok, array()} | {error, term()}. cumsum(_A, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec cumprod(array(), integer()) -> {ok, array()} | {error, term()}. cumprod(_A, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec cummax(array(), integer()) -> {ok, array()} | {error, term()}. cummax(_A, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec cummin(array(), integer()) -> {ok, array()} | {error, term()}. cummin(_A, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Linear algebra operations -spec matmul(array(), array()) -> {ok, array()} | {error, term()}. matmul(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec dot(array(), array()) -> {ok, array()} | {error, term()}. dot(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec inner(array(), array()) -> {ok, array()} | {error, term()}. inner(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec outer(array(), array()) -> {ok, array()} | {error, term()}. outer(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec tensordot(array(), array(), integer()) -> {ok, array()} | {error, term()}. tensordot(_A, _B, _Axes) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Comparison operations -spec equal(array(), array()) -> {ok, array()} | {error, term()}. equal(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec not_equal(array(), array()) -> {ok, array()} | {error, term()}. not_equal(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec less(array(), array()) -> {ok, array()} | {error, term()}. less(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec less_equal(array(), array()) -> {ok, array()} | {error, term()}. less_equal(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec greater(array(), array()) -> {ok, array()} | {error, term()}. greater(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec greater_equal(array(), array()) -> {ok, array()} | {error, term()}. greater_equal(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec maximum(array(), array()) -> {ok, array()} | {error, term()}. maximum(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec minimum(array(), array()) -> {ok, array()} | {error, term()}. minimum(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec allclose(array(), array(), float()) -> {ok, boolean()} | {error, term()}. allclose(_A, _B, _Tolerance) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec array_equal(array(), array()) -> {ok, boolean()} | {error, term()}. array_equal(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec isfinite(array()) -> {ok, array()} | {error, term()}. isfinite(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec isinf(array()) -> {ok, array()} | {error, term()}. isinf(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec isnan(array()) -> {ok, array()} | {error, term()}. isnan(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Logical operations -spec logical_and(array(), array()) -> {ok, array()} | {error, term()}. logical_and(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec logical_or(array(), array()) -> {ok, array()} | {error, term()}. logical_or(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec logical_not(array()) -> {ok, array()} | {error, term()}. logical_not(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec all(array(), list(), boolean()) -> {ok, array()} | {error, term()}. all(_A, _Axis, _Keepdims) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec any(array(), list(), boolean()) -> {ok, array()} | {error, term()}. any(_A, _Axis, _Keepdims) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Bitwise operations -spec bitwise_and(array(), array()) -> {ok, array()} | {error, term()}. bitwise_and(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec bitwise_or(array(), array()) -> {ok, array()} | {error, term()}. bitwise_or(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec bitwise_xor(array(), array()) -> {ok, array()} | {error, term()}. bitwise_xor(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec bitwise_invert(array()) -> {ok, array()} | {error, term()}. bitwise_invert(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec left_shift(array(), array()) -> {ok, array()} | {error, term()}. left_shift(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec right_shift(array(), array()) -> {ok, array()} | {error, term()}. right_shift(_A, _B) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Selection and indexing operations -spec where(array(), array(), array()) -> {ok, array()} | {error, term()}. where(_Condition, _X, _Y) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec sort(array()) -> {ok, array()} | {error, term()}. sort(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec sort(array(), integer()) -> {ok, array()} | {error, term()}. sort(_A, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec argsort(array()) -> {ok, array()} | {error, term()}. argsort(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec argsort(array(), integer()) -> {ok, array()} | {error, term()}. argsort(_A, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Array concatenation and stacking -spec concatenate(list(), integer()) -> {ok, array()} | {error, term()}. concatenate(_Arrays, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec stack(list(), integer()) -> {ok, array()} | {error, term()}. stack(_Arrays, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec split(array(), list(), integer()) -> {ok, list()} | {error, term()}. split(_A, _Indices, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Broadcasting operations -spec broadcast_to(array(), shape()) -> {ok, array()} | {error, term()}. broadcast_to(_A, _Shape) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec broadcast_arrays(list()) -> {ok, list()} | {error, term()}. broadcast_arrays(_Arrays) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Clipping and rounding operations -spec clip(array(), number(), number()) -> {ok, array()} | {error, term()}. clip(_A, _Min, _Max) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec ceil(array()) -> {ok, array()} | {error, term()}. ceil(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec floor(array()) -> {ok, array()} | {error, term()}. floor(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec round(array(), integer()) -> {ok, array()} | {error, term()}. round(_A, _Decimals) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Array properties and conversion -spec shape(array()) -> {ok, shape()} | {error, term()}. shape(_Array) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec size(array()) -> {ok, integer()} | {error, term()}. size(_Array) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec ndim(array()) -> {ok, integer()} | {error, term()}. ndim(_Array) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec dtype_str(array()) -> {ok, string()} | {error, term()}. dtype_str(_Array) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec eval(array()) -> {ok, array()} | {error, term()}. eval(_Array) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec to_list(array()) -> {ok, list()} | {error, term()}. to_list(_Array) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Neural network operations -spec softmax(array(), integer()) -> {ok, array()} | {error, term()}. softmax(_A, _Axis) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec sigmoid(array()) -> {ok, array()} | {error, term()}. sigmoid(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec conv1d(array(), array(), integer()) -> {ok, array()} | {error, term()}. conv1d(_Input, _Weight, _Stride) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec conv2d(array(), array(), list()) -> {ok, array()} | {error, term()}. conv2d(_Input, _Weight, _Stride) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Device management and utilities -spec set_default_device(device()) -> ok | {error, term()}. set_default_device(_Device) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec test_basic() -> ok | {error, term()}. test_basic() -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec version() -> {ok, string()} | {error, term()}. version() -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Random number generation -spec random_normal(shape(), dtype()) -> {ok, array()} | {error, term()}. random_normal(_Shape, _Dtype) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec random_uniform(shape(), dtype()) -> {ok, array()} | {error, term()}. random_uniform(_Shape, _Dtype) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec random_randint(number(), number(), shape()) -> {ok, array()} | {error, term()}. random_randint(_Low, _High, _Shape) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec random_seed(integer()) -> ok | {error, term()}. random_seed(_Seed) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Advanced mathematical functions -spec erf(array()) -> {ok, array()} | {error, term()}. erf(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec erfc(array()) -> {ok, array()} | {error, term()}. erfc(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec gamma(array()) -> {ok, array()} | {error, term()}. gamma(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec loggamma(array()) -> {ok, array()} | {error, term()}. loggamma(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec digamma(array()) -> {ok, array()} | {error, term()}. digamma(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec lgamma(array()) -> {ok, array()} | {error, term()}. lgamma(_A) -> erlang:nif_error({nif_not_loaded, ?MODULE}).