Packages

MLX machine learning framework bindings for Erlang

Current section

Files

Jump to
mlx src mlx_linalg_nif.erl
Raw

src/mlx_linalg_nif.erl

-module(mlx_linalg_nif).
%% Linear algebra NIF functions
-export([
%% Basic linear algebra
dot/2, matmul/2, inner/2, outer/2, tensordot/3,
%% Matrix decompositions
svd/2, eig/1, eigh/1, qr/2, cholesky/1, lu/2,
%% Matrix properties
det/1, slogdet/1, trace/1, diagonal/2, matrix_rank/2, norm/3,
%% Matrix operations
inv/1, pinv/2, solve/2, lstsq/2, matrix_power/2,
%% Vector operations
cross/3,
%% Eigenvalues and eigenvectors
eigvals/1, eigvalsh/1,
%% Condition numbers
condition_number/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_linalg_nif"), 0).
%% NIF stubs - these will be replaced by the actual NIF implementations
%% Basic linear algebra
-spec dot(reference(), reference()) -> {ok, reference()} | {error, term()}.
dot(_A, _B) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec matmul(reference(), reference()) -> {ok, reference()} | {error, term()}.
matmul(_A, _B) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec inner(reference(), reference()) -> {ok, reference()} | {error, term()}.
inner(_A, _B) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec outer(reference(), reference()) -> {ok, reference()} | {error, term()}.
outer(_A, _B) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec tensordot(reference(), reference(), integer()) -> {ok, reference()} | {error, term()}.
tensordot(_A, _B, _Axes) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
%% Matrix decompositions
-spec svd(reference(), boolean()) -> {ok, {reference(), reference(), reference()}} | {error, term()}.
svd(_A, _FullMatrices) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec eig(reference()) -> {ok, {reference(), reference()}} | {error, term()}.
eig(_A) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec eigh(reference()) -> {ok, {reference(), reference()}} | {error, term()}.
eigh(_A) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec qr(reference(), atom()) -> {ok, {reference(), reference()}} | {error, term()}.
qr(_A, _Mode) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec cholesky(reference()) -> {ok, reference()} | {error, term()}.
cholesky(_A) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec lu(reference(), boolean()) -> {ok, {reference(), reference(), reference()}} | {error, term()}.
lu(_A, _Permute) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
%% Matrix properties
-spec det(reference()) -> {ok, reference()} | {error, term()}.
det(_A) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec slogdet(reference()) -> {ok, {reference(), reference()}} | {error, term()}.
slogdet(_A) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec trace(reference()) -> {ok, reference()} | {error, term()}.
trace(_A) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec diagonal(reference(), integer()) -> {ok, reference()} | {error, term()}.
diagonal(_A, _Offset) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec matrix_rank(reference(), number()) -> {ok, reference()} | {error, term()}.
matrix_rank(_A, _Tol) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec norm(reference(), atom() | number(), [integer()]) -> {ok, reference()} | {error, term()}.
norm(_A, _Ord, _Axis) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
%% Matrix operations
-spec inv(reference()) -> {ok, reference()} | {error, term()}.
inv(_A) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec pinv(reference(), number()) -> {ok, reference()} | {error, term()}.
pinv(_A, _Rcond) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec solve(reference(), reference()) -> {ok, reference()} | {error, term()}.
solve(_A, _B) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec lstsq(reference(), reference()) -> {ok, {reference(), reference(), integer(), reference()}} | {error, term()}.
lstsq(_A, _B) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec matrix_power(reference(), integer()) -> {ok, reference()} | {error, term()}.
matrix_power(_A, _N) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
%% Vector operations
-spec cross(reference(), reference(), integer()) -> {ok, reference()} | {error, term()}.
cross(_A, _B, _Axis) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
%% Eigenvalues and eigenvectors
-spec eigvals(reference()) -> {ok, reference()} | {error, term()}.
eigvals(_A) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
-spec eigvalsh(reference()) -> {ok, reference()} | {error, term()}.
eigvalsh(_A) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).
%% Condition numbers
-spec condition_number(reference(), atom() | number()) -> {ok, reference()} | {error, term()}.
condition_number(_A, _P) ->
erlang:nif_error({nif_not_loaded, ?MODULE}).