-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}).