Current section
Files
Jump to
Current section
Files
src/mlx_nif.erl
-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}).