-module(viva_tensor@core@error). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/viva_tensor/core/error.gleam"). -export([shape_to_string/1, to_string/1]). -export_type([tensor_error/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(false). -type tensor_error() :: {shape_mismatch, list(integer()), list(integer())} | {invalid_shape, binary()} | {dimension_error, binary()} | {broadcast_error, list(integer()), list(integer())} | {index_out_of_bounds, integer(), integer()} | {dtype_error, binary()} | {axis_out_of_bounds, binary(), integer(), integer()} | {rank_mismatch, binary(), integer(), list(integer())} | {operand_shape_mismatch, binary(), binary(), binary(), list(integer())} | {slice_arity_mismatch, list(integer()), list(integer()), list(integer())} | {backend_mismatch, binary(), binary(), binary(), binary()} | {nif_not_loaded, binary()}. -file("src/viva_tensor/core/error.gleam", 193). ?DOC(false). -spec shape_to_string(list(integer())) -> binary(). shape_to_string(Shape) -> <<<<"["/utf8, (gleam@string:join( gleam@list:map(Shape, fun erlang:integer_to_binary/1), <<", "/utf8>> ))/binary>>/binary, "]"/utf8>>. -file("src/viva_tensor/core/error.gleam", 113). ?DOC(false). -spec to_string(tensor_error()) -> binary(). to_string(Error) -> case Error of {shape_mismatch, Expected, Got} -> <<<<<<"Shape mismatch: expected "/utf8, (shape_to_string(Expected))/binary>>/binary, ", got "/utf8>>/binary, (shape_to_string(Got))/binary>>; {invalid_shape, Reason} -> <<"Invalid shape: "/utf8, Reason/binary>>; {dimension_error, Reason@1} -> <<"Dimension error: "/utf8, Reason@1/binary>>; {broadcast_error, A, B} -> <<<<<<"Cannot broadcast shapes "/utf8, (shape_to_string(A))/binary>>/binary, " and "/utf8>>/binary, (shape_to_string(B))/binary>>; {index_out_of_bounds, Index, Size} -> <<<<<<"Index "/utf8, (erlang:integer_to_binary(Index))/binary>>/binary, " out of bounds for size "/utf8>>/binary, (erlang:integer_to_binary(Size))/binary>>; {dtype_error, Reason@2} -> <<"Dtype error: "/utf8, Reason@2/binary>>; {axis_out_of_bounds, Operation, Axis, Rank} -> <<<<<<<<<<<<<>/binary, (erlang:integer_to_binary(Axis))/binary>>/binary, " is out of bounds for tensor of rank "/utf8>>/binary, (erlang:integer_to_binary(Rank))/binary>>/binary, " (valid: 0.."/utf8>>/binary, (erlang:integer_to_binary(Rank - 1))/binary>>/binary, ")"/utf8>>; {rank_mismatch, Operation@1, Expected_rank, Got_shape} -> <<<<<<<<<<<>/binary, (erlang:integer_to_binary(Expected_rank))/binary>>/binary, "D tensor, got rank "/utf8>>/binary, (erlang:integer_to_binary(erlang:length(Got_shape)))/binary>>/binary, " with shape "/utf8>>/binary, (shape_to_string(Got_shape))/binary>>; {operand_shape_mismatch, Operation@2, Operand, Expected@1, Got@1} -> <<<<<<<<<<<>/binary, Operand/binary>>/binary, " has shape "/utf8>>/binary, (shape_to_string(Got@1))/binary>>/binary, ", expected "/utf8>>/binary, Expected@1/binary>>; {slice_arity_mismatch, Tensor_shape, Start, Lengths} -> <<<<<<<<<<<<<<"slice: start and length must have rank "/utf8, (erlang:integer_to_binary( erlang:length(Tensor_shape) ))/binary>>/binary, " (tensor shape "/utf8>>/binary, (shape_to_string(Tensor_shape))/binary>>/binary, "); got start="/utf8>>/binary, (shape_to_string(Start))/binary>>/binary, ", length="/utf8>>/binary, (shape_to_string(Lengths))/binary>>; {backend_mismatch, Operation@3, Out, Lhs, Rhs} -> <<<<<<<<<<<> end.