Packages

Tensor library for Gleam/BEAM with a pure Gleam API, zero-copy views, and optional native acceleration

Retired package: Release invalid

Current section

Files

Jump to
viva_tensor src viva_tensor@lns.erl
Raw

src/viva_tensor@lns.erl

-module(viva_tensor@lns).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/viva_tensor/lns.gleam").
-export([from_tensor/1, to_tensor/1, mul/2, 'div'/2, sqrt/1]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(
" LNS - Log-Number System\n"
"\n"
" Efficient arithmetic for resonance and probabilistic computing.\n"
"\n"
" Represents numbers as their logarithms: x => log(|x|) + sign.\n"
" Multiplication becomes addition: log(a*b) = log(a) + log(b).\n"
" Division becomes subtraction: log(a/b) = log(a) - log(b).\n"
" Power becomes multiplication: log(x^p) = p * log(x).\n"
"\n"
" Used for:\n"
" - High-dynamic range calculations\n"
" - Chain multiplications (probability chains)\n"
" - \"Resonance\" calculations (heavy multiplication/exponentiation)\n"
"\n"
" Precision is traded for speed (up to 8x faster than FP32 FMA).\n"
).
-file("src/viva_tensor/lns.gleam", 24).
?DOC(" Convert standard f64 tensor to LNS format\n").
-spec from_tensor(viva_tensor@core@ffi:native_tensor_ref()) -> viva_tensor@core@ffi:lns_tensor_ref().
from_tensor(Ref) ->
Lns@1 = case viva_tensor@core@ffi:lns_from_f64(Ref) of
{ok, Lns} -> Lns;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"viva_tensor/lns"/utf8>>,
function => <<"from_tensor"/utf8>>,
line => 25,
value => _assert_fail,
start => 846,
'end' => 888,
pattern_start => 857,
pattern_end => 864})
end,
Lns@1.
-file("src/viva_tensor/lns.gleam", 30).
?DOC(" Convert LNS tensor back to standard f64 tensor\n").
-spec to_tensor(viva_tensor@core@ffi:lns_tensor_ref()) -> viva_tensor@core@ffi:native_tensor_ref().
to_tensor(Lns) ->
Ref@1 = case viva_tensor@core@ffi:lns_to_f64(Lns) of
{ok, Ref} -> Ref;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"viva_tensor/lns"/utf8>>,
function => <<"to_tensor"/utf8>>,
line => 31,
value => _assert_fail,
start => 1009,
'end' => 1049,
pattern_start => 1020,
pattern_end => 1027})
end,
Ref@1.
-file("src/viva_tensor/lns.gleam", 36).
?DOC(" Multiply two LNS tensors (Addition in log-domain)\n").
-spec mul(
viva_tensor@core@ffi:lns_tensor_ref(),
viva_tensor@core@ffi:lns_tensor_ref()
) -> viva_tensor@core@ffi:lns_tensor_ref().
mul(A, B) ->
Res@1 = case viva_tensor@core@ffi:lns_mul(A, B) of
{ok, Res} -> Res;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"viva_tensor/lns"/utf8>>,
function => <<"mul"/utf8>>,
line => 37,
value => _assert_fail,
start => 1169,
'end' => 1207,
pattern_start => 1180,
pattern_end => 1187})
end,
Res@1.
-file("src/viva_tensor/lns.gleam", 42).
?DOC(" Divide two LNS tensors (Subtraction in log-domain)\n").
-spec 'div'(
viva_tensor@core@ffi:lns_tensor_ref(),
viva_tensor@core@ffi:lns_tensor_ref()
) -> viva_tensor@core@ffi:lns_tensor_ref().
'div'(A, B) ->
Res@1 = case viva_tensor@core@ffi:lns_div(A, B) of
{ok, Res} -> Res;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"viva_tensor/lns"/utf8>>,
function => <<"div"/utf8>>,
line => 43,
value => _assert_fail,
start => 1328,
'end' => 1366,
pattern_start => 1339,
pattern_end => 1346})
end,
Res@1.
-file("src/viva_tensor/lns.gleam", 48).
?DOC(" Square root of LNS tensor (Bit shift / division by 2 in log-domain)\n").
-spec sqrt(viva_tensor@core@ffi:lns_tensor_ref()) -> viva_tensor@core@ffi:lns_tensor_ref().
sqrt(A) ->
Res@1 = case viva_tensor@core@ffi:lns_sqrt(A) of
{ok, Res} -> Res;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"viva_tensor/lns"/utf8>>,
function => <<"sqrt"/utf8>>,
line => 49,
value => _assert_fail,
start => 1491,
'end' => 1527,
pattern_start => 1502,
pattern_end => 1509})
end,
Res@1.