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.erl
-module(viva_tensor).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/viva_tensor.gleam").
-export([zeros/1, ones/1, fill/2, from_list/1, from_list2d/1, vector/1, matrix/3, from_native_ref/2, native_ref/1, is_native/1, native_zeros/1, native_ones/1, native_fill/2, native_from_list/2, to_accelerated/1, to_rtx4090_fp16/1, to_rtx4090_fp32/1, gpu_workspace/0, workspace_zeros/2, workspace_from_tensor/2, linear_layer_fp16/2, linear_layer/3, random_uniform/1, random_normal/3, xavier_init/2, he_init/2, add/2, sub/2, mul/2, 'div'/2, add_into/3, sub_into/3, mul_into/3, scale/2, scale_into/3, map/2, map2/3, sum/1, mean/1, max/1, min/1, argmax/1, argmin/1, variance/1, std/1, dot/2, matmul/2, matmul_auto/2, matmul_accelerated/2, matmul_accelerated_into/3, matmul_relu_accelerated_into/3, matmul_gelu_accelerated_into/3, linear_relu_accelerated_into/4, linear_gelu_accelerated_into/4, linear_output/3, linear_relu_forward_into/3, linear_gelu_forward_into/3, accelerated_to_tensor/1, accelerated_backend/1, accelerated_shape/1, accelerated_sync/0, workspace_backend/1, linear_layer_backend/1, linear_layer_input_features/1, linear_layer_output_features/1, matmul_into/3, linear_relu/3, linear_relu_into/4, matmul_vec/2, transpose/1, outer/2, reshape/2, flatten/1, squeeze/1, unsqueeze/2, shape/1, size/1, rank/1, to_list/1, norm/1, normalize/1, clamp/3, can_broadcast/2, broadcast_to/2, add_broadcast/2, mul_broadcast/2, to_strided/1, to_contiguous/1, transpose_strided/1, is_contiguous/1, conv2d_config/0, conv2d_same/2, conv2d/3, pad2d/3, pad4d/3, max_pool2d/5, avg_pool2d/5, global_avg_pool2d/1, measure_tflops/4, measure_tflops_averaged/5, detect_backends/0]).
-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(
" High-performance tensor operations for Gleam on the BEAM.\n"
"\n"
" This module is the stable entry point for the package. It re-exports the\n"
" tensor type, common constructors, shape operations, linear algebra,\n"
" element-wise math, reductions, neural-network helpers, and TFLOPS\n"
" measurement utilities.\n"
"\n"
" Lower-level implementation, backend, neural-network, quantization, sparse,\n"
" telemetry, and benchmark modules are intentionally excluded from the public\n"
" documentation until their contracts are stable. Prefer this module as the\n"
" public API surface.\n"
"\n"
" ```gleam\n"
" import gleam/result\n"
" import viva_tensor as t\n"
"\n"
" let a = t.zeros([2, 3])\n"
" let b = t.ones([2, 3])\n"
" use c <- result.try(t.add(a, b))\n"
" c\n"
" ```\n"
).
-file("src/viva_tensor.gleam", 65).
?DOC(" All zeros. The tensor equivalent of a blank canvas.\n").
-spec zeros(list(integer())) -> viva_tensor@tensor:tensor().
zeros(Shape) ->
viva_tensor@tensor:zeros(Shape).
-file("src/viva_tensor.gleam", 70).
?DOC(" Create tensor of ones\n").
-spec ones(list(integer())) -> viva_tensor@tensor:tensor().
ones(Shape) ->
viva_tensor@tensor:ones(Shape).
-file("src/viva_tensor.gleam", 75).
?DOC(" Create tensor filled with value\n").
-spec fill(list(integer()), float()) -> viva_tensor@tensor:tensor().
fill(Shape, Value) ->
viva_tensor@tensor:fill(Shape, Value).
-file("src/viva_tensor.gleam", 80).
?DOC(" Create tensor from list (1D)\n").
-spec from_list(list(float())) -> viva_tensor@tensor:tensor().
from_list(Data) ->
viva_tensor@tensor:from_list(Data).
-file("src/viva_tensor.gleam", 85).
?DOC(" Create 2D tensor from list of lists\n").
-spec from_list2d(list(list(float()))) -> {ok, viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
from_list2d(Rows) ->
viva_tensor@tensor:from_list2d(Rows).
-file("src/viva_tensor.gleam", 90).
?DOC(" Create vector (1D tensor)\n").
-spec vector(list(float())) -> viva_tensor@tensor:tensor().
vector(Data) ->
viva_tensor@tensor:vector(Data).
-file("src/viva_tensor.gleam", 95).
?DOC(" Create matrix (2D tensor)\n").
-spec matrix(integer(), integer(), list(float())) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
matrix(Rows, Cols, Data) ->
viva_tensor@tensor:matrix(Rows, Cols, Data).
-file("src/viva_tensor.gleam", 104).
?DOC(" Wrap an existing native NIF tensor resource.\n").
-spec from_native_ref(viva_tensor@core@ffi:native_tensor_ref(), list(integer())) -> viva_tensor@tensor:tensor().
from_native_ref(Ref, Shape) ->
viva_tensor@tensor:from_native_ref(Ref, Shape).
-file("src/viva_tensor.gleam", 109).
?DOC(" Extract the native NIF tensor resource when present.\n").
-spec native_ref(viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@core@ffi:native_tensor_ref()} |
{error, nil}.
native_ref(T) ->
viva_tensor@tensor:native_ref(T).
-file("src/viva_tensor.gleam", 114).
?DOC(" Check whether a tensor is backed by native NIF memory.\n").
-spec is_native(viva_tensor@tensor:tensor()) -> boolean().
is_native(T) ->
viva_tensor@tensor:is_native(T).
-file("src/viva_tensor.gleam", 119).
?DOC(" Create a native-backed tensor of zeros.\n").
-spec native_zeros(list(integer())) -> {ok, viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
native_zeros(Shape) ->
viva_tensor@tensor:native_zeros(Shape).
-file("src/viva_tensor.gleam", 124).
?DOC(" Create a native-backed tensor of ones.\n").
-spec native_ones(list(integer())) -> {ok, viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
native_ones(Shape) ->
viva_tensor@tensor:native_ones(Shape).
-file("src/viva_tensor.gleam", 129).
?DOC(" Create a native-backed tensor filled with a value.\n").
-spec native_fill(list(integer()), float()) -> {ok, viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
native_fill(Shape, Value) ->
viva_tensor@tensor:native_fill(Shape, Value).
-file("src/viva_tensor.gleam", 137).
?DOC(" Create a native-backed tensor from row-major list data.\n").
-spec native_from_list(list(float()), list(integer())) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
native_from_list(Data, Shape) ->
viva_tensor@tensor:native_from_list(Data, Shape).
-file("src/viva_tensor.gleam", 145).
?DOC(" Move a tensor to the best persistent backend: RTX 4090 first, then MKL/CPU.\n").
-spec to_accelerated(viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@cuda:accelerated_tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
to_accelerated(T) ->
viva_tensor@cuda:to_accelerated(T).
-file("src/viva_tensor.gleam", 150).
?DOC(" Upload a tensor to persistent RTX 4090 FP16 memory.\n").
-spec to_rtx4090_fp16(viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@cuda:accelerated_tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
to_rtx4090_fp16(T) ->
viva_tensor@cuda:to_rtx4090_fp16(T).
-file("src/viva_tensor.gleam", 155).
?DOC(" Upload a tensor to persistent RTX 4090 FP32 memory.\n").
-spec to_rtx4090_fp32(viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@cuda:accelerated_tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
to_rtx4090_fp32(T) ->
viva_tensor@cuda:to_rtx4090_fp32(T).
-file("src/viva_tensor.gleam", 160).
?DOC(" Create an RTX 4090 FP16 workspace.\n").
-spec gpu_workspace() -> {ok, viva_tensor@cuda:gpu_workspace()} |
{error, viva_tensor@core@error:tensor_error()}.
gpu_workspace() ->
viva_tensor@cuda:gpu_workspace().
-file("src/viva_tensor.gleam", 165).
?DOC(" Allocate a reusable zero-filled output buffer in workspace memory.\n").
-spec workspace_zeros(viva_tensor@cuda:gpu_workspace(), list(integer())) -> {ok,
viva_tensor@cuda:accelerated_tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
workspace_zeros(Workspace, Shape) ->
viva_tensor@cuda:workspace_zeros(Workspace, Shape).
-file("src/viva_tensor.gleam", 173).
?DOC(" Move a tensor into workspace memory.\n").
-spec workspace_from_tensor(
viva_tensor@cuda:gpu_workspace(),
viva_tensor@tensor:tensor()
) -> {ok, viva_tensor@cuda:accelerated_tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
workspace_from_tensor(Workspace, Tensor) ->
viva_tensor@cuda:workspace_from_tensor(Workspace, Tensor).
-file("src/viva_tensor.gleam", 181).
?DOC(" Create a persisted FP16 linear layer on the RTX.\n").
-spec linear_layer_fp16(
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor()
) -> {ok, viva_tensor@cuda:linear_layer()} |
{error, viva_tensor@core@error:tensor_error()}.
linear_layer_fp16(Weight, Bias) ->
viva_tensor@cuda:linear_layer_fp16(Weight, Bias).
-file("src/viva_tensor.gleam", 189).
?DOC(" Create a persisted linear layer in workspace memory.\n").
-spec linear_layer(
viva_tensor@cuda:gpu_workspace(),
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor()
) -> {ok, viva_tensor@cuda:linear_layer()} |
{error, viva_tensor@core@error:tensor_error()}.
linear_layer(Workspace, Weight, Bias) ->
viva_tensor@cuda:linear_layer(Workspace, Weight, Bias).
-file("src/viva_tensor.gleam", 200).
?DOC(" Random uniform [0, 1)\n").
-spec random_uniform(list(integer())) -> viva_tensor@tensor:tensor().
random_uniform(Shape) ->
viva_tensor@tensor:random_uniform(Shape).
-file("src/viva_tensor.gleam", 205).
?DOC(" Tensor with normal random values\n").
-spec random_normal(list(integer()), float(), float()) -> viva_tensor@tensor:tensor().
random_normal(Shape, Mean, Std) ->
viva_tensor@tensor:random_normal(Shape, Mean, Std).
-file("src/viva_tensor.gleam", 210).
?DOC(" Xavier initialization for neural network weights\n").
-spec xavier_init(integer(), integer()) -> viva_tensor@tensor:tensor().
xavier_init(Fan_in, Fan_out) ->
viva_tensor@tensor:xavier_init(Fan_in, Fan_out).
-file("src/viva_tensor.gleam", 215).
?DOC(" He initialization (for ReLU networks)\n").
-spec he_init(integer(), integer()) -> viva_tensor@tensor:tensor().
he_init(Fan_in, Fan_out) ->
viva_tensor@tensor:he_init(Fan_in, Fan_out).
-file("src/viva_tensor.gleam", 222).
?DOC(" Add element-wise\n").
-spec add(viva_tensor@tensor:tensor(), viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
add(A, B) ->
viva_tensor@tensor:add(A, B).
-file("src/viva_tensor.gleam", 227).
?DOC(" Element-wise subtraction\n").
-spec sub(viva_tensor@tensor:tensor(), viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
sub(A, B) ->
viva_tensor@tensor:sub(A, B).
-file("src/viva_tensor.gleam", 232).
?DOC(" Element-wise multiplication\n").
-spec mul(viva_tensor@tensor:tensor(), viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
mul(A, B) ->
viva_tensor@tensor:mul(A, B).
-file("src/viva_tensor.gleam", 237).
?DOC(" Element-wise division\n").
-spec 'div'(viva_tensor@tensor:tensor(), viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
'div'(A, B) ->
viva_tensor@tensor:'div'(A, B).
-file("src/viva_tensor.gleam", 242).
?DOC(" Write out = a + b into a preallocated native tensor.\n").
-spec add_into(
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor()
) -> {ok, nil} | {error, viva_tensor@core@error:tensor_error()}.
add_into(Out, A, B) ->
viva_tensor@tensor:add_into(Out, A, B).
-file("src/viva_tensor.gleam", 247).
?DOC(" Write out = a - b into a preallocated native tensor.\n").
-spec sub_into(
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor()
) -> {ok, nil} | {error, viva_tensor@core@error:tensor_error()}.
sub_into(Out, A, B) ->
viva_tensor@tensor:sub_into(Out, A, B).
-file("src/viva_tensor.gleam", 252).
?DOC(" Write out = a * b into a preallocated native tensor.\n").
-spec mul_into(
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor()
) -> {ok, nil} | {error, viva_tensor@core@error:tensor_error()}.
mul_into(Out, A, B) ->
viva_tensor@tensor:mul_into(Out, A, B).
-file("src/viva_tensor.gleam", 257).
?DOC(" Scale by constant\n").
-spec scale(viva_tensor@tensor:tensor(), float()) -> viva_tensor@tensor:tensor().
scale(T, S) ->
viva_tensor@tensor:scale(T, S).
-file("src/viva_tensor.gleam", 262).
?DOC(" Write out = a * scalar into a preallocated native tensor.\n").
-spec scale_into(
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor(),
float()
) -> {ok, nil} | {error, viva_tensor@core@error:tensor_error()}.
scale_into(Out, A, Scalar) ->
viva_tensor@tensor:scale_into(Out, A, Scalar).
-file("src/viva_tensor.gleam", 271).
?DOC(" Apply function to each element\n").
-spec map(viva_tensor@tensor:tensor(), fun((float()) -> float())) -> viva_tensor@tensor:tensor().
map(T, F) ->
viva_tensor@tensor:map(T, F).
-file("src/viva_tensor.gleam", 276).
?DOC(" Apply a binary function element-wise over tensors with the same shape.\n").
-spec map2(
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor(),
fun((float(), float()) -> float())
) -> {ok, viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
map2(A, B, F) ->
viva_tensor@tensor:map2(A, B, F).
-file("src/viva_tensor.gleam", 287).
?DOC(" Sum everything\n").
-spec sum(viva_tensor@tensor:tensor()) -> float().
sum(T) ->
viva_tensor@tensor:sum(T).
-file("src/viva_tensor.gleam", 292).
?DOC(" Mean of all elements\n").
-spec mean(viva_tensor@tensor:tensor()) -> float().
mean(T) ->
viva_tensor@tensor:mean(T).
-file("src/viva_tensor.gleam", 297).
?DOC(" Maximum value\n").
-spec max(viva_tensor@tensor:tensor()) -> float().
max(T) ->
viva_tensor@tensor:max(T).
-file("src/viva_tensor.gleam", 302).
?DOC(" Minimum value\n").
-spec min(viva_tensor@tensor:tensor()) -> float().
min(T) ->
viva_tensor@tensor:min(T).
-file("src/viva_tensor.gleam", 307).
?DOC(" Index of maximum value\n").
-spec argmax(viva_tensor@tensor:tensor()) -> integer().
argmax(T) ->
viva_tensor@tensor:argmax(T).
-file("src/viva_tensor.gleam", 312).
?DOC(" Index of minimum value\n").
-spec argmin(viva_tensor@tensor:tensor()) -> integer().
argmin(T) ->
viva_tensor@tensor:argmin(T).
-file("src/viva_tensor.gleam", 317).
?DOC(" Variance\n").
-spec variance(viva_tensor@tensor:tensor()) -> float().
variance(T) ->
viva_tensor@tensor:variance(T).
-file("src/viva_tensor.gleam", 322).
?DOC(" Standard deviation\n").
-spec std(viva_tensor@tensor:tensor()) -> float().
std(T) ->
viva_tensor@tensor:std(T).
-file("src/viva_tensor.gleam", 329).
?DOC(" Dot product (vectors only)\n").
-spec dot(viva_tensor@tensor:tensor(), viva_tensor@tensor:tensor()) -> {ok,
float()} |
{error, viva_tensor@core@error:tensor_error()}.
dot(A, B) ->
viva_tensor@tensor:dot(A, B).
-file("src/viva_tensor.gleam", 334).
?DOC(" Matrix-matrix multiplication\n").
-spec matmul(viva_tensor@tensor:tensor(), viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
matmul(A, B) ->
viva_tensor@tensor:matmul(A, B).
-file("src/viva_tensor.gleam", 339).
?DOC(" Matrix multiplication with priority: RTX 4090 first, then MKL/native CPU.\n").
-spec matmul_auto(viva_tensor@tensor:tensor(), viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@cuda:accelerated_tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
matmul_auto(A, B) ->
viva_tensor@cuda:matmul_auto(A, B).
-file("src/viva_tensor.gleam", 347).
?DOC(" Matrix multiplication between persistent accelerated tensors.\n").
-spec matmul_accelerated(
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:accelerated_tensor()
) -> {ok, viva_tensor@cuda:accelerated_tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
matmul_accelerated(A, B) ->
viva_tensor@cuda:matmul_accelerated(A, B).
-file("src/viva_tensor.gleam", 355).
?DOC(" Write `out = a @ b` into a persistent accelerated output buffer.\n").
-spec matmul_accelerated_into(
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:accelerated_tensor()
) -> {ok, nil} | {error, viva_tensor@core@error:tensor_error()}.
matmul_accelerated_into(Out, A, B) ->
viva_tensor@cuda:matmul_accelerated_into(Out, A, B).
-file("src/viva_tensor.gleam", 364).
?DOC(" Write `out = relu(a @ b)` using the FP16 Tensor Core fused epilogue.\n").
-spec matmul_relu_accelerated_into(
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:accelerated_tensor()
) -> {ok, nil} | {error, viva_tensor@core@error:tensor_error()}.
matmul_relu_accelerated_into(Out, A, B) ->
viva_tensor@cuda:matmul_relu_accelerated_into(Out, A, B).
-file("src/viva_tensor.gleam", 373).
?DOC(" Write `out = gelu(a @ b)` using the FP16 Tensor Core fused epilogue.\n").
-spec matmul_gelu_accelerated_into(
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:accelerated_tensor()
) -> {ok, nil} | {error, viva_tensor@core@error:tensor_error()}.
matmul_gelu_accelerated_into(Out, A, B) ->
viva_tensor@cuda:matmul_gelu_accelerated_into(Out, A, B).
-file("src/viva_tensor.gleam", 382).
?DOC(" Write `out = relu(a @ b + bias)` using the FP16 Tensor Core fused epilogue.\n").
-spec linear_relu_accelerated_into(
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:accelerated_tensor()
) -> {ok, nil} | {error, viva_tensor@core@error:tensor_error()}.
linear_relu_accelerated_into(Out, A, B, Bias) ->
viva_tensor@cuda:linear_relu_accelerated_into(Out, A, B, Bias).
-file("src/viva_tensor.gleam", 392).
?DOC(" Write `out = gelu(a @ b + bias)` using the FP16 Tensor Core fused epilogue.\n").
-spec linear_gelu_accelerated_into(
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:accelerated_tensor()
) -> {ok, nil} | {error, viva_tensor@core@error:tensor_error()}.
linear_gelu_accelerated_into(Out, A, B, Bias) ->
viva_tensor@cuda:linear_gelu_accelerated_into(Out, A, B, Bias).
-file("src/viva_tensor.gleam", 402).
?DOC(" Allocate a reusable output buffer for a persisted linear layer.\n").
-spec linear_output(
viva_tensor@cuda:gpu_workspace(),
viva_tensor@cuda:linear_layer(),
integer()
) -> {ok, viva_tensor@cuda:accelerated_tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
linear_output(Workspace, Layer, Batch_size) ->
viva_tensor@cuda:linear_output(Workspace, Layer, Batch_size).
-file("src/viva_tensor.gleam", 411).
?DOC(" Run `out = relu(input @ layer.weight + layer.bias)`.\n").
-spec linear_relu_forward_into(
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:linear_layer()
) -> {ok, nil} | {error, viva_tensor@core@error:tensor_error()}.
linear_relu_forward_into(Out, Input, Layer) ->
viva_tensor@cuda:linear_relu_forward_into(Out, Input, Layer).
-file("src/viva_tensor.gleam", 420).
?DOC(" Run `out = gelu(input @ layer.weight + layer.bias)`.\n").
-spec linear_gelu_forward_into(
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:accelerated_tensor(),
viva_tensor@cuda:linear_layer()
) -> {ok, nil} | {error, viva_tensor@core@error:tensor_error()}.
linear_gelu_forward_into(Out, Input, Layer) ->
viva_tensor@cuda:linear_gelu_forward_into(Out, Input, Layer).
-file("src/viva_tensor.gleam", 429).
?DOC(" Download an accelerated tensor back to a regular CPU tensor.\n").
-spec accelerated_to_tensor(viva_tensor@cuda:accelerated_tensor()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
accelerated_to_tensor(T) ->
viva_tensor@cuda:to_cpu_tensor(T).
-file("src/viva_tensor.gleam", 436).
?DOC(" Inspect which backend was selected by `matmul_auto`.\n").
-spec accelerated_backend(viva_tensor@cuda:accelerated_tensor()) -> viva_tensor@cuda:acceleration_backend().
accelerated_backend(T) ->
viva_tensor@cuda:backend(T).
-file("src/viva_tensor.gleam", 441).
?DOC(" Shape of an accelerated tensor without forcing a download.\n").
-spec accelerated_shape(viva_tensor@cuda:accelerated_tensor()) -> list(integer()).
accelerated_shape(T) ->
viva_tensor@cuda:accelerated_shape(T).
-file("src/viva_tensor.gleam", 446).
?DOC(" Wait for queued CUDA work to complete.\n").
-spec accelerated_sync() -> {ok, nil} |
{error, viva_tensor@core@error:tensor_error()}.
accelerated_sync() ->
viva_tensor@cuda:sync().
-file("src/viva_tensor.gleam", 451).
?DOC(" Workspace backend.\n").
-spec workspace_backend(viva_tensor@cuda:gpu_workspace()) -> viva_tensor@cuda:acceleration_backend().
workspace_backend(Workspace) ->
viva_tensor@cuda:workspace_backend(Workspace).
-file("src/viva_tensor.gleam", 456).
?DOC(" Linear layer backend.\n").
-spec linear_layer_backend(viva_tensor@cuda:linear_layer()) -> viva_tensor@cuda:acceleration_backend().
linear_layer_backend(Layer) ->
viva_tensor@cuda:linear_layer_backend(Layer).
-file("src/viva_tensor.gleam", 461).
?DOC(" Linear layer input feature count.\n").
-spec linear_layer_input_features(viva_tensor@cuda:linear_layer()) -> integer().
linear_layer_input_features(Layer) ->
viva_tensor@cuda:linear_layer_input_features(Layer).
-file("src/viva_tensor.gleam", 466).
?DOC(" Linear layer output feature count.\n").
-spec linear_layer_output_features(viva_tensor@cuda:linear_layer()) -> integer().
linear_layer_output_features(Layer) ->
viva_tensor@cuda:linear_layer_output_features(Layer).
-file("src/viva_tensor.gleam", 471).
?DOC(" Write out = a @ b into a preallocated native tensor.\n").
-spec matmul_into(
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor()
) -> {ok, nil} | {error, viva_tensor@core@error:tensor_error()}.
matmul_into(Out, A, B) ->
viva_tensor@tensor:matmul_into(Out, A, B).
-file("src/viva_tensor.gleam", 480).
?DOC(" Fused linear layer with ReLU: max(0, a @ b + bias).\n").
-spec linear_relu(
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor()
) -> {ok, viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
linear_relu(A, B, Bias) ->
viva_tensor@tensor:linear_relu(A, B, Bias).
-file("src/viva_tensor.gleam", 489).
?DOC(" Write out = max(0, a @ b + bias) into a preallocated native tensor.\n").
-spec linear_relu_into(
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor()
) -> {ok, nil} | {error, viva_tensor@core@error:tensor_error()}.
linear_relu_into(Out, A, B, Bias) ->
viva_tensor@tensor:linear_relu_into(Out, A, B, Bias).
-file("src/viva_tensor.gleam", 499).
?DOC(" Matrix-vector multiplication\n").
-spec matmul_vec(viva_tensor@tensor:tensor(), viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
matmul_vec(Mat, Vec) ->
viva_tensor@tensor:matmul_vec(Mat, Vec).
-file("src/viva_tensor.gleam", 504).
?DOC(" Matrix transpose\n").
-spec transpose(viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
transpose(T) ->
viva_tensor@tensor:transpose(T).
-file("src/viva_tensor.gleam", 509).
?DOC(" Outer product\n").
-spec outer(viva_tensor@tensor:tensor(), viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
outer(A, B) ->
viva_tensor@tensor:outer(A, B).
-file("src/viva_tensor.gleam", 516).
?DOC(" Reshape (total size must match)\n").
-spec reshape(viva_tensor@tensor:tensor(), list(integer())) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
reshape(T, New_shape) ->
viva_tensor@tensor:reshape(T, New_shape).
-file("src/viva_tensor.gleam", 521).
?DOC(" Flatten to 1D\n").
-spec flatten(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
flatten(T) ->
viva_tensor@tensor:flatten(T).
-file("src/viva_tensor.gleam", 526).
?DOC(" Remove dimensions of size 1\n").
-spec squeeze(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
squeeze(T) ->
viva_tensor@tensor:squeeze(T).
-file("src/viva_tensor.gleam", 531).
?DOC(" Add dimension of size 1\n").
-spec unsqueeze(viva_tensor@tensor:tensor(), integer()) -> viva_tensor@tensor:tensor().
unsqueeze(T, Axis) ->
viva_tensor@tensor:unsqueeze(T, Axis).
-file("src/viva_tensor.gleam", 538).
?DOC(" Shape as list of dimensions\n").
-spec shape(viva_tensor@tensor:tensor()) -> list(integer()).
shape(T) ->
viva_tensor@tensor:shape(T).
-file("src/viva_tensor.gleam", 543).
?DOC(" Get total size\n").
-spec size(viva_tensor@tensor:tensor()) -> integer().
size(T) ->
viva_tensor@tensor:size(T).
-file("src/viva_tensor.gleam", 548).
?DOC(" Get rank (number of dimensions)\n").
-spec rank(viva_tensor@tensor:tensor()) -> integer().
rank(T) ->
viva_tensor@tensor:rank(T).
-file("src/viva_tensor.gleam", 553).
?DOC(" Convert to list\n").
-spec to_list(viva_tensor@tensor:tensor()) -> list(float()).
to_list(T) ->
viva_tensor@tensor:to_list(T).
-file("src/viva_tensor.gleam", 560).
?DOC(" L2 norm (Euclidean length)\n").
-spec norm(viva_tensor@tensor:tensor()) -> float().
norm(T) ->
viva_tensor@tensor:norm(T).
-file("src/viva_tensor.gleam", 565).
?DOC(" Normalize to unit length\n").
-spec normalize(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
normalize(T) ->
viva_tensor@tensor:normalize(T).
-file("src/viva_tensor.gleam", 570).
?DOC(" Clamp values\n").
-spec clamp(viva_tensor@tensor:tensor(), float(), float()) -> viva_tensor@tensor:tensor().
clamp(T, Min_val, Max_val) ->
viva_tensor@tensor:clamp(T, Min_val, Max_val).
-file("src/viva_tensor.gleam", 577).
?DOC(" Can these shapes broadcast together?\n").
-spec can_broadcast(list(integer()), list(integer())) -> boolean().
can_broadcast(A, B) ->
viva_tensor@tensor:can_broadcast(A, B).
-file("src/viva_tensor.gleam", 582).
?DOC(" Broadcast tensor to a target shape.\n").
-spec broadcast_to(viva_tensor@tensor:tensor(), list(integer())) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
broadcast_to(T, Target_shape) ->
viva_tensor@tensor:broadcast_to(T, Target_shape).
-file("src/viva_tensor.gleam", 590).
?DOC(" Add with broadcasting\n").
-spec add_broadcast(viva_tensor@tensor:tensor(), viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
add_broadcast(A, B) ->
viva_tensor@tensor:add_broadcast(A, B).
-file("src/viva_tensor.gleam", 595).
?DOC(" Multiply with broadcasting\n").
-spec mul_broadcast(viva_tensor@tensor:tensor(), viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
mul_broadcast(A, B) ->
viva_tensor@tensor:mul_broadcast(A, B).
-file("src/viva_tensor.gleam", 602).
?DOC(" Convert to strided representation for O(1) element access\n").
-spec to_strided(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
to_strided(T) ->
viva_tensor@tensor:to_strided(T).
-file("src/viva_tensor.gleam", 607).
?DOC(" Convert to contiguous tensor\n").
-spec to_contiguous(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
to_contiguous(T) ->
viva_tensor@tensor:to_contiguous(T).
-file("src/viva_tensor.gleam", 612).
?DOC(" Zero-copy transpose\n").
-spec transpose_strided(viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
transpose_strided(T) ->
viva_tensor@tensor:transpose_strided(T).
-file("src/viva_tensor.gleam", 617).
?DOC(" Check if contiguous\n").
-spec is_contiguous(viva_tensor@tensor:tensor()) -> boolean().
is_contiguous(T) ->
viva_tensor@tensor:is_contiguous(T).
-file("src/viva_tensor.gleam", 627).
?DOC(" Default conv2d config (3x3 kernel, stride 1, no padding)\n").
-spec conv2d_config() -> viva_tensor@tensor:conv2d_config().
conv2d_config() ->
viva_tensor@tensor:conv2d_config().
-file("src/viva_tensor.gleam", 632).
?DOC(" Conv2d config with \"same\" padding\n").
-spec conv2d_same(integer(), integer()) -> viva_tensor@tensor:conv2d_config().
conv2d_same(Kernel_h, Kernel_w) ->
viva_tensor@tensor:conv2d_same(Kernel_h, Kernel_w).
-file("src/viva_tensor.gleam", 637).
?DOC(" 2D Convolution\n").
-spec conv2d(
viva_tensor@tensor:tensor(),
viva_tensor@tensor:tensor(),
viva_tensor@tensor:conv2d_config()
) -> {ok, viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
conv2d(Input, Kernel, Config) ->
viva_tensor@tensor:conv2d(Input, Kernel, Config).
-file("src/viva_tensor.gleam", 646).
?DOC(" Pad 2D tensor with zeros\n").
-spec pad2d(viva_tensor@tensor:tensor(), integer(), integer()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
pad2d(T, Pad_h, Pad_w) ->
viva_tensor@tensor:pad2d(T, Pad_h, Pad_w).
-file("src/viva_tensor.gleam", 651).
?DOC(" Pad 4D tensor with zeros\n").
-spec pad4d(viva_tensor@tensor:tensor(), integer(), integer()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
pad4d(T, Pad_h, Pad_w) ->
viva_tensor@tensor:pad4d(T, Pad_h, Pad_w).
-file("src/viva_tensor.gleam", 656).
?DOC(" Max pooling 2D\n").
-spec max_pool2d(
viva_tensor@tensor:tensor(),
integer(),
integer(),
integer(),
integer()
) -> {ok, viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
max_pool2d(Input, Pool_h, Pool_w, Stride_h, Stride_w) ->
viva_tensor@tensor:max_pool2d(Input, Pool_h, Pool_w, Stride_h, Stride_w).
-file("src/viva_tensor.gleam", 667).
?DOC(" Average pooling 2D\n").
-spec avg_pool2d(
viva_tensor@tensor:tensor(),
integer(),
integer(),
integer(),
integer()
) -> {ok, viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
avg_pool2d(Input, Pool_h, Pool_w, Stride_h, Stride_w) ->
viva_tensor@tensor:avg_pool2d(Input, Pool_h, Pool_w, Stride_h, Stride_w).
-file("src/viva_tensor.gleam", 678).
?DOC(" Global average pooling\n").
-spec global_avg_pool2d(viva_tensor@tensor:tensor()) -> {ok,
viva_tensor@tensor:tensor()} |
{error, viva_tensor@core@error:tensor_error()}.
global_avg_pool2d(Input) ->
viva_tensor@tensor:global_avg_pool2d(Input).
-file("src/viva_tensor.gleam", 693).
?DOC(" Measure TFLOPS for a single matmul operation\n").
-spec measure_tflops(
viva_tensor@tflops:backend(),
integer(),
integer(),
integer()
) -> viva_tensor@tflops:tflops_result().
measure_tflops(Backend, M, N, K) ->
viva_tensor@tflops:measure_matmul(Backend, M, N, K).
-file("src/viva_tensor.gleam", 703).
?DOC(" Measure averaged TFLOPS (warmup + iterations)\n").
-spec measure_tflops_averaged(
viva_tensor@tflops:backend(),
integer(),
integer(),
integer(),
integer()
) -> viva_tensor@tflops:tflops_result().
measure_tflops_averaged(Backend, M, N, K, Iterations) ->
viva_tensor@tflops:measure_matmul_averaged(Backend, M, N, K, Iterations).
-file("src/viva_tensor.gleam", 714).
?DOC(" Detect available compute backends\n").
-spec detect_backends() -> list(viva_tensor@tflops:backend()).
detect_backends() ->
viva_tensor@tflops:detect_backends().