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