Packages
Tensor library for Gleam/BEAM with a pure Gleam API, zero-copy views, and optional native acceleration
Current section
Files
Jump to
Current section
Files
src/viva_tensor@nn@activations.erl
-module(viva_tensor@nn@activations).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/viva_tensor/nn/activations.gleam").
-export([sigmoid/1, tanh/1, relu/1, leaky_relu/2, elu/2, selu/1, gelu/1, swish/1, mish/1, softplus/1, softmax/2, log_softmax/2, hardswish/1, hardtanh/3]).
-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(false).
-file("src/viva_tensor/nn/activations.gleam", 53).
?DOC(false).
-spec sigmoid_scalar(float()) -> float().
sigmoid_scalar(X) ->
case X >= +0.0 of
true ->
case (1.0 + math:exp(+0.0 - X)) of
+0.0 -> +0.0;
-0.0 -> -0.0;
Gleam@denominator -> 1.0 / Gleam@denominator
end;
false ->
Ex = math:exp(X),
case (1.0 + Ex) of
+0.0 -> +0.0;
-0.0 -> -0.0;
Gleam@denominator@1 -> Ex / Gleam@denominator@1
end
end.
-file("src/viva_tensor/nn/activations.gleam", 49).
?DOC(false).
-spec sigmoid(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
sigmoid(T) ->
viva_tensor@tensor:map(T, fun sigmoid_scalar/1).
-file("src/viva_tensor/nn/activations.gleam", 75).
?DOC(false).
-spec tanh(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
tanh(T) ->
viva_tensor@tensor:map(T, fun gleam_community@maths:tanh/1).
-file("src/viva_tensor/nn/activations.gleam", 91).
?DOC(false).
-spec relu(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
relu(T) ->
viva_tensor@tensor:map(T, fun(X) -> gleam@float:max(X, +0.0) end).
-file("src/viva_tensor/nn/activations.gleam", 107).
?DOC(false).
-spec leaky_relu(viva_tensor@tensor:tensor(), float()) -> viva_tensor@tensor:tensor().
leaky_relu(T, Negative_slope) ->
viva_tensor@tensor:map(T, fun(X) -> case X > +0.0 of
true ->
X;
false ->
Negative_slope * X
end end).
-file("src/viva_tensor/nn/activations.gleam", 132).
?DOC(false).
-spec elu_scalar(float(), float()) -> float().
elu_scalar(X, Alpha) ->
case X > +0.0 of
true ->
X;
false ->
Alpha * (math:exp(X) - 1.0)
end.
-file("src/viva_tensor/nn/activations.gleam", 128).
?DOC(false).
-spec elu(viva_tensor@tensor:tensor(), float()) -> viva_tensor@tensor:tensor().
elu(T, Alpha) ->
viva_tensor@tensor:map(T, fun(X) -> elu_scalar(X, Alpha) end).
-file("src/viva_tensor/nn/activations.gleam", 152).
?DOC(false).
-spec selu(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
selu(T) ->
viva_tensor@tensor:map(
T,
fun(X) ->
1.0507009873554804934193349852946 * elu_scalar(
X,
1.6732632423543772848170429916717
)
end
).
-file("src/viva_tensor/nn/activations.gleam", 168).
?DOC(false).
-spec gelu(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
gelu(T) ->
viva_tensor@tensor:map(T, fun viva_math@scalar:gelu/1).
-file("src/viva_tensor/nn/activations.gleam", 185).
?DOC(false).
-spec swish(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
swish(T) ->
viva_tensor@tensor:map(T, fun(X) -> X * sigmoid_scalar(X) end).
-file("src/viva_tensor/nn/activations.gleam", 200).
?DOC(false).
-spec mish(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
mish(T) ->
viva_tensor@tensor:map(T, fun viva_math@scalar:mish/1).
-file("src/viva_tensor/nn/activations.gleam", 217).
?DOC(false).
-spec softplus(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
softplus(T) ->
viva_tensor@tensor:map(T, fun viva_math@scalar:softplus/1).
-file("src/viva_tensor/nn/activations.gleam", 250).
?DOC(false).
-spec softmax(viva_tensor@tensor:tensor(), integer()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
softmax(T, Axis) ->
viva_tensor@tensor:softmax_axis(T, Axis).
-file("src/viva_tensor/nn/activations.gleam", 294).
?DOC(false).
-spec log_softmax_slice(list(float())) -> list(float()).
log_softmax_slice(Values) ->
case Values of
[] ->
[];
[First | Rest] ->
Max_v = gleam@list:fold(
Rest,
First,
fun(Acc, V) -> gleam@float:max(Acc, V) end
),
Shifted = gleam@list:map(Values, fun(V@1) -> V@1 - Max_v end),
Sum_exp = gleam@list:fold(
Shifted,
+0.0,
fun(Acc@1, S) -> Acc@1 + math:exp(S) end
),
Log_sum = case gleam@float:logarithm(Sum_exp) of
{ok, L} ->
L;
{error, _} ->
+0.0
end,
gleam@list:map(Shifted, fun(S@1) -> S@1 - Log_sum end)
end.
-file("src/viva_tensor/nn/activations.gleam", 266).
?DOC(false).
-spec log_softmax(viva_tensor@tensor:tensor(), integer()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
log_softmax(T, Axis) ->
Shp = viva_tensor@tensor:shape(T),
Rnk = erlang:length(Shp),
case (Axis >= 0) andalso (Axis < Rnk) of
false ->
{error, {dimension_error, <<"Invalid axis for log_softmax"/utf8>>}};
true ->
gleam@result:'try'(
viva_tensor@core@tensor_axis:axis_size(Shp, Axis),
fun(Axis_size) ->
Inner_size = viva_tensor@core@layout_math:size(
gleam@list:drop(Shp, Axis + 1)
),
case Axis_size =< 0 of
true ->
{ok, {tensor, [], Shp}};
false ->
Data = viva_tensor@tensor:to_list(T),
gleam@result:'try'(
viva_tensor@core@tensor_axis:axis_transform_data(
Data,
viva_tensor@tensor:size(T),
Axis_size,
Inner_size,
fun log_softmax_slice/1
),
fun(Result_data) ->
{ok, {tensor, Result_data, Shp}}
end
)
end
end
)
end.
-file("src/viva_tensor/nn/activations.gleam", 325).
?DOC(false).
-spec hardswish(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
hardswish(T) ->
viva_tensor@tensor:map(
T,
fun(X) ->
R6 = gleam@float:min(gleam@float:max(X + 3.0, +0.0), 6.0),
(X * R6) / 6.0
end
).
-file("src/viva_tensor/nn/activations.gleam", 343).
?DOC(false).
-spec hardtanh(viva_tensor@tensor:tensor(), float(), float()) -> viva_tensor@tensor:tensor().
hardtanh(T, Min_val, Max_val) ->
viva_tensor@tensor:map(
T,
fun(X) -> gleam@float:min(gleam@float:max(X, Min_val), Max_val) end
).