~/bend-docscommunity

tensor.bend checks

raw source on the hub · import stelliferous@0.0.2.0/tensor.bend as Tensor

Public tensors own dense row-major storage or image-row bands, their extents, the value used to initialize allocations, a sticky status, and the number of workers their operations may use. A failed operation leaves values untouched and records why; later operations skip a failed tensor, and check is the only way to observe or clear the failure.

10 imports
import Base
import ./storage_buffer.bend as Storage
import ./storage_allocation.bend as Allocation
import ./tensor_shape.bend as Shapes
import ./tensor_view.bend as Views
import ./tensor_operations.bend as Operations
import ./machine_limits.bend as Machine
import ./default_machine_limits.bend as Default
import ./tensor_band.bend as Bands
import ./tensor_band_schedule.bend as BandSchedule

Types

type Reason source · line 17 · raw

Data

type Problem source · line 24 · raw

Data

type Status source · line 27 · raw

Data

type Tensor source · line 35 · raw

@-Element:Data -> Type

Like a PyTorch tensor's device, workers is execution context: the size of the runtime's worker pool, read once with IO.thread_count and set with with_workers. Pure constructors cannot read it and use one worker. Results keep the largest worker count of their operands. It never changes a value.

type Parts source · line 42 · raw

@-Element:Data -> Type

A nonempty sequence of tensors. Base List is not used for tensors: the compiler shares every constructor of a list type that is duplicated anywhere, and that sharing would reach the certificate inside each tensor's storage.

Definitions

def within source · line 47 · raw

@fits:Bool -> @count:U32 -> Maybe<&2, U32>

Element count of a shape that the default machine can allocate.

def allocatable source · line 52 · raw

@count:Maybe<&2, U32> -> Maybe<&2, U32>

def count_of source · line 57 · raw

@+shape:List<&2, U32> -> Maybe<&2, U32>

def known_count source · line 60 · raw

@count:Maybe<&2, U32> -> U32

def count_or_zero source · line 66 · raw

@+shape:List<&2, U32> -> U32

The element count as a number; a shape too large to allocate counts 0.

def view_of source · line 69 · raw

@+shape:List<&2, U32> -> Maybe<&2, 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View>

def significant_bits source · line 75 · raw

@remaining:Nat -> @+value:U32 -> @+bits:Nat -> @zero:Bool -> Nat

Bits of value, counted by tail recursion. Storage.bit_length is not tail recursive, and a non-tail recursive callee turns the calling chain into worklist dispatch: measured allocation of 2^20 floats took twice as long.

def depth_for source · line 79 · raw

@+count:U32 -> Nat

The smallest depth whose capacity holds count elements (at least one).

def mismatch source · line 110 · raw

@same:Bool -> @left:List<&2, U32> -> @right:List<&2, U32> -> Reason

def same_or_invalid source · line 115 · raw

@+left:List<&2, U32> -> @+right:List<&2, U32> -> Reason

def matches_count source · line 149 · raw

@count:Maybe<&2, U32> -> @length:Nat -> Bool

def first_failure source · line 246 · raw

@left:Status -> @right:Status -> Status

def stretched source · line 265 · raw

@view:Maybe<&2, 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View> -> @+target:List<&2, U32> -> Maybe<&2, 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View>

A view of an operand read with the extents target; see Views.stretch.

def indexed_width_positive source · line 447 · raw

@geometry:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Geometry -> Bool

def broadcast_axes source · line 511 · raw

@axes:List<&2, 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.Axis> -> List<&2, 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.Axis>

Scalar operands are read through a stride-zero view of one element.

def broadcast source · line 516 · raw

@view:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View -> 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View

def show_extents source · line 554 · raw

@extents:List<&2, U32> -> String

def show_shape source · line 560 · raw

@extents:List<&2, U32> -> String

def explain source · line 563 · raw

@reason:Reason -> String

def describe source · line 576 · raw

@problem:Problem -> String

Templates

template buffer source · line 82 · raw

@-Element:Data -> @+fill:Element -> @+count:U32 -> 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>

template with_dense source · line 85 · raw

@-Element:Data -> @-Result:Type -> @tensor:Tensor<Element> -> @body:(@_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @_:List<&2, U32> -> @_:Element -> @_:Status -> @_:U32 -> Result) -> Result

template with_metadata source · line 93 · raw

@-Element:Data -> @-Result:Type -> @tensor:Tensor<Element> -> @body:(@_:Tensor<Element> -> @_:List<&2, U32> -> @_:Element -> @_:Status -> @_:U32 -> Result) -> Result

Metadata inspection retains the original layout and affine storage.

template failed source · line 99 · raw

@-Element:Data -> @operation:String -> @reason:Reason -> @shape:List<&2, U32> -> @+fill:Element -> @workers:U32 -> Tensor<Element>

template rejected source · line 103 · raw

@-Element:Data -> @name:String -> @tensor:Tensor<Element> -> Tensor<Element>

A usable tensor fails with an invalid argument of the operation; a failed one keeps its problem.

template full_count source · line 120 · raw

@-Element:Data -> @+shape:List<&2, U32> -> @count:Maybe<&2, U32> -> @+value:Element -> Tensor<Element>

template full source · line 125 · raw

@-Element:Data -> @+shape:List<&2, U32> -> @+value:Element -> Tensor<Element>

template listed_count source · line 128 · raw

@-Element:Data -> @matches:Bool -> @+shape:List<&2, U32> -> @+count:U32 -> @values:List<&2, Element> -> @+fill:Element -> Tensor<Element>

template listed source · line 134 · raw

@-Element:Data -> @+shape:List<&2, U32> -> @count:Maybe<&2, U32> -> @+values:List<&2, Element> -> @+fill:Element -> Tensor<Element>

template from_list source · line 141 · raw

@-Element:Data -> @+shape:List<&2, U32> -> @+values:List<&2, Element> -> @+fill:Element -> Tensor<Element>

fill initializes storage this tensor or its results allocate; it is never observable in a successful result.

template stored source · line 144 · raw

@-Element:Data -> @matches:Bool -> @storage:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+shape:List<&2, U32> -> @fill:Element -> Tensor<Element>

template storage_of source · line 154 · raw

@-Element:Data -> @+shape:List<&2, U32> -> @count:Maybe<&2, U32> -> @storage:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @fill:Element -> Tensor<Element>

template from_storage source · line 159 · raw

@-Element:Data -> @+shape:List<&2, U32> -> @storage:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+fill:Element -> Tensor<Element>

Storage handed over by foreign I/O keeps its documented trust boundary.

template with_workers source · line 165 · raw

@-Element:Data -> @tensor:Tensor<Element> -> @+count:U32 -> Tensor<Element>

Sets the worker count, at least one; values and status are unchanged.

template workers source · line 170 · raw

@-Element:Data -> @tensor:Tensor<Element> -> Pair(Tensor<Element>, U32)

template shape source · line 177 · raw

@-Element:Data -> @tensor:Tensor<Element> -> Pair(Tensor<Element>, List<&2, U32>)

template checked source · line 182 · raw

@-Element:Data -> @status:Status -> @storage:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @shape:List<&2, U32> -> @fill:Element -> @workers:U32 -> Result<&1, &1, Pair(Tensor<Element>, Problem), Tensor<Element>>

template checked_bands source · line 188 · raw

@-Element:Data -> @status:Status -> @bands:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Bands(Element) -> @geometry:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Geometry -> @shape:List<&2, U32> -> @fill:Element -> @workers:U32 -> Result<&1, &1, Pair(Tensor<Element>, Problem), Tensor<Element>>

template check source · line 194 · raw

@-Element:Data -> @tensor:Tensor<Element> -> Result<&1, &1, Pair(Tensor<Element>, Problem), Tensor<Element>>

template released source · line 199 · raw

@-Element:Data -> @status:Status -> @storage:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> Result<&2, &1, Problem, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>>

template into_storage source · line 204 · raw

@-Element:Data -> @tensor:Tensor<Element> -> Result<&2, &1, Problem, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>>

template listed_values source · line 207 · raw

@-Element:Data -> @status:Status -> @storage:Array<Element> -> @length:Nat -> Result<&2, &2, Problem, List<&2, Element>>

template listed_buffer source · line 212 · raw

@-Element:Data -> @status:Status -> @buffer:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> Result<&2, &2, Problem, List<&2, Element>>

template to_list source · line 216 · raw

@-Element:Data -> @tensor:Tensor<Element> -> Result<&2, &2, Problem, List<&2, Element>>

template only_value source · line 220 · raw

@-Element:Data -> @+shape:List<&2, U32> -> @values:List<&2, Element> -> Result<&2, &2, Problem, Element>

template single source · line 225 · raw

@-Element:Data -> @+shape:List<&2, U32> -> @values:Result<&2, &2, Problem, List<&2, Element>> -> Result<&2, &2, Problem, Element>

template item source · line 230 · raw

@-Element:Data -> @tensor:Tensor<Element> -> Result<&2, &2, Problem, Element>

template value_or source · line 236 · raw

@-Value:Data -> @result:Result<&2, &2, Problem, Value> -> @fallback:Value -> Value

The value read, or fallback when the tensor carries a failure.

template combined source · line 251 · raw

@-Element:Data -> @operation:String -> @+left_shape:List<&2, U32> -> @+right_shape:List<&2, U32> -> @+fill:Element -> @+workers:U32 -> @result:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_operations.Outcome<Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)> -> Tensor<Element>

template combine_views_with source · line 257 · raw

@-Element:Data -> @-kernel:(@+count:Nat -> @+right_view:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View -> @+offset:U32 -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)) -> @name:String -> @left_view:Maybe<&2, 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View> -> @right_view:Maybe<&2, 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View> -> @left:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+left_shape:List<&2, U32> -> @+fill:Element -> @right:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+right_shape:List<&2, U32> -> @+workers:U32 -> Tensor<Element>

template combined_fresh_with source · line 274 · raw

@-Element:Data -> @-kernel:(@+count:Nat -> @+right_view:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View -> @+offset:U32 -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)) -> @name:String -> @+shape:List<&2, U32> -> @+fill:Element -> @+workers:U32 -> @right:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @right_view:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View -> @target:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View -> @copied:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_operations.Outcome<Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)> -> Tensor<Element>

The left operand was copied through its stretched view into new storage of the common extents; the right operand is then combined into that storage. The view of that storage is built once for each of the two steps: using one view value twice would make the compiler share every View constructor.

template combine_fresh_views_with source · line 282 · raw

@-Element:Data -> @-kernel:(@+count:Nat -> @+right_view:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View -> @+offset:U32 -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)) -> @name:String -> @left_view:Maybe<&2, 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View> -> @right_view:Maybe<&2, 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View> -> @target:Maybe<&2, 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View> -> @output:Maybe<&2, 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View> -> @count:Maybe<&2, U32> -> @left:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @right:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+shape:List<&2, U32> -> @+fill:Element -> @+workers:U32 -> Tensor<Element>

template combine_stretched_with source · line 297 · raw

@-Element:Data -> @-kernel:(@+count:Nat -> @+right_view:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View -> @+offset:U32 -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)) -> @name:String -> @in_place:Bool -> @left:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+left_shape:List<&2, U32> -> @+fill:Element -> @right:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+right_shape:List<&2, U32> -> @+shape:List<&2, U32> -> @+workers:U32 -> Tensor<Element>

Operands of different extents with the common extents shape. When shape is the left extents, only the right operand is stretched and the result reuses the left storage. Otherwise the left operand is first copied through its stretched view into new storage, which the right operand is combined into; both steps run the innermost axis as one loop, which the three-buffer combination with two cursors does not.

template combine_broadcast_with source · line 306 · raw

@-Element:Data -> @-kernel:(@+count:Nat -> @+right_view:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View -> @+offset:U32 -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)) -> @name:String -> @shape:Maybe<&2, List<&2, U32>> -> @left:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+left_shape:List<&2, U32> -> @+fill:Element -> @right:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+right_shape:List<&2, U32> -> @+workers:U32 -> Tensor<Element>

template combine_shapes_with source · line 315 · raw

@-Element:Data -> @-kernel:(@+count:Nat -> @+right_view:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View -> @+offset:U32 -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)) -> @name:String -> @same:Bool -> @left:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+left_shape:List<&2, U32> -> @+fill:Element -> @right:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+right_shape:List<&2, U32> -> @+workers:U32 -> Tensor<Element>

Equal extents take the direct path. Different extents follow NumPy broadcasting (Shapes.broadcast) and fail only when they are incompatible.

template combine_status_with source · line 321 · raw

@-Element:Data -> @-kernel:(@+count:Nat -> @+right_view:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View -> @+offset:U32 -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)) -> @name:String -> @status:Status -> @left:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+left_shape:List<&2, U32> -> @+fill:Element -> @right:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+right_shape:List<&2, U32> -> @+workers:U32 -> Tensor<Element>

template combine_dense_with source · line 329 · raw

@-Element:Data -> @-kernel:(@+count:Nat -> @+right_view:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View -> @+offset:U32 -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)) -> @name:String -> @left:Tensor<Element> -> @right:Tensor<Element> -> Tensor<Element>

Band layout is kept only for equal extents: operands that need broadcasting are gathered and combined on dense storage.

template with_status source · line 334 · raw

@-Element:Data -> @status:Status -> @tensor:Tensor<Element> -> Tensor<Element>

template aligned source · line 339 · raw

@-Element:Data -> @geometry:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Geometry -> @layout:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Plan -> @tensor:Tensor<Element> -> 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Bands(Element)

template combine_bands_checked_with source · line 344 · raw

@-Element:Data -> @-kernel:(@+count:Nat -> @+right_view:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View -> @+offset:U32 -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)) -> @name:String -> @operations:F32 -> @status:Status -> @same:Bool -> @+geometry:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Geometry -> @+layout:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Plan -> @+left_shape:List<&2, U32> -> @+right_shape:List<&2, U32> -> @fill:Element -> @+workers:U32 -> @left:Tensor<Element> -> @right:Tensor<Element> -> Tensor<Element>

template combine_bands_plan_with source · line 353 · raw

@-Element:Data -> @-kernel:(@+count:Nat -> @+right_view:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View -> @+offset:U32 -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)) -> @name:String -> @operations:F32 -> @status:Status -> @same:Bool -> @+geometry:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Geometry -> @+left_shape:List<&2, U32> -> @+right_shape:List<&2, U32> -> @+fill:Element -> @+workers:U32 -> @right:Tensor<Element> -> @planned:Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Bands(Element), 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Plan) -> Tensor<Element>

template combine_right_plan_with source · line 359 · raw

@-Element:Data -> @-kernel:(@+count:Nat -> @+right_view:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View -> @+offset:U32 -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)) -> @name:String -> @operations:F32 -> @status:Status -> @same:Bool -> @+geometry:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Geometry -> @+left_shape:List<&2, U32> -> @+right_shape:List<&2, U32> -> @left_fill:Element -> @+right_fill:Element -> @+workers:U32 -> @left:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @planned:Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Bands(Element), 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Plan) -> Tensor<Element>

template combine_pair_plans_with source · line 367 · raw

@-Element:Data -> @-kernel:(@+count:Nat -> @+right_view:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View -> @+offset:U32 -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)) -> @name:String -> @operations:F32 -> @status:Status -> @same:Bool -> @+geometry:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Geometry -> @right_geometry:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Geometry -> @+left_shape:List<&2, U32> -> @+right_shape:List<&2, U32> -> @+left_fill:Element -> @right_fill:Element -> @+workers:U32 -> @left:Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Bands(Element), 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Plan) -> @right:Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Bands(Element), 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Plan) -> Tensor<Element>

template combine_with source · line 378 · raw

@-Element:Data -> @-kernel:(@+count:Nat -> @+right_view:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View -> @+offset:U32 -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)) -> @name:String -> @operations:F32 -> @left:Tensor<Element> -> @right:Tensor<Element> -> Tensor<Element>

operation(left element, right element), retaining band layout when either operand is banded. Alignment is done once, before any parallel leaf work. operations counts the operation's scalar work for the band schedule.

template combine source · line 393 · raw

@-Element:Data -> @-operation:(@_:Element -> @_:Element -> Element) -> @name:String -> @operations:F32 -> @left:Tensor<Element> -> @right:Tensor<Element> -> Tensor<Element>

The elementwise form: the kernel applies operation to each pair in order.

template applied source · line 396 · raw

@-Element:Data -> @name:String -> @+shape:List<&2, U32> -> @+fill:Element -> @+workers:U32 -> @result:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_operations.Outcome<0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>> -> Tensor<Element>

template apply_view_context source · line 401 · raw

@-Element:Data -> @-Context:Data -> @-mapper:(@+count:Nat -> @+position:U32 -> @+context:Context -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>) -> @context:Context -> @name:String -> @view:Maybe<&2, 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View> -> @storage:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+shape:List<&2, U32> -> @+fill:Element -> @+workers:U32 -> Tensor<Element>

template apply_status_context source · line 407 · raw

@-Element:Data -> @-Context:Data -> @-mapper:(@+count:Nat -> @+position:U32 -> @+context:Context -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>) -> @context:Context -> @name:String -> @status:Status -> @storage:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+shape:List<&2, U32> -> @+fill:Element -> @+workers:U32 -> Tensor<Element>

template apply_bands_context source · line 413 · raw

@-Element:Data -> @-Context:Data -> @-mapper:(@+count:Nat -> @+position:U32 -> @+context:Context -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>) -> @context:Context -> @operations:F32 -> @status:Status -> @bands:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Bands(Element) -> @+geometry:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Geometry -> @shape:List<&2, U32> -> @fill:Element -> @+workers:U32 -> Tensor<Element>

template apply_context source · line 419 · raw

@-Element:Data -> @-Context:Data -> @-mapper:(@+count:Nat -> @+position:U32 -> @+context:Context -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>) -> @context:Context -> @name:String -> @operations:F32 -> @tensor:Tensor<Element> -> Tensor<Element>

template apply source · line 424 · raw

@-Element:Data -> @-mapper:(@+count:Nat -> @+position:U32 -> @_:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>) -> @name:String -> @operations:F32 -> @tensor:Tensor<Element> -> Tensor<Element>

template indexed source · line 429 · raw

@-Element:Data -> @+shape:List<&2, U32> -> @+fill:Element -> @+workers:U32 -> @result:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_operations.Outcome<Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)> -> Tensor<Element>

The function also receives each element's row-major index.

template apply_indexed_count source · line 434 · raw

@-Element:Data -> @-operation:(@_:U32 -> @_:Element -> Element) -> @count:Maybe<&2, U32> -> @view:Maybe<&2, 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View> -> @storage:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+shape:List<&2, U32> -> @+fill:Element -> @+workers:U32 -> Tensor<Element>

template apply_indexed_status source · line 441 · raw

@-Element:Data -> @-operation:(@_:U32 -> @_:Element -> Element) -> @status:Status -> @storage:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+shape:List<&2, U32> -> @+fill:Element -> @+workers:U32 -> Tensor<Element>

template apply_indexed_positive source · line 453 · raw

@-Element:Data -> @-operation:(@_:U32 -> @_:Element -> Element) -> @positive:Bool -> @operations:F32 -> @bands:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Bands(Element) -> @+geometry:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Geometry -> @+shape:List<&2, U32> -> @+fill:Element -> @+workers:U32 -> Tensor<Element>

Empty widths use the existing dense indexed operation after one gather. The choice is made once, before the band scheduler or element loop.

template apply_indexed_bands source · line 462 · raw

@-Element:Data -> @-operation:(@_:U32 -> @_:Element -> Element) -> @operations:F32 -> @status:Status -> @bands:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Bands(Element) -> @+geometry:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Geometry -> @shape:List<&2, U32> -> @+fill:Element -> @+workers:U32 -> Tensor<Element>

template apply_indexed source · line 468 · raw

@-Element:Data -> @-operation:(@_:U32 -> @_:Element -> Element) -> @operations:F32 -> @tensor:Tensor<Element> -> Tensor<Element>

template reduced source · line 474 · raw

@-Element:Data -> @-Accumulator:Data -> @name:String -> @+shape:List<&2, U32> -> @result:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_operations.Outcome<Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, Accumulator)> -> Result<&2, &2, Problem, Accumulator>

Reductions visit elements in row-major order.

template reduce_view source · line 480 · raw

@-Element:Data -> @-Accumulator:Data -> @-operation:(@_:Accumulator -> @_:Element -> Accumulator) -> @name:String -> @view:Maybe<&2, 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View> -> @storage:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+shape:List<&2, U32> -> @initial:Accumulator -> Result<&2, &2, Problem, Accumulator>

template reduce_status source · line 486 · raw

@-Element:Data -> @-Accumulator:Data -> @-operation:(@_:Accumulator -> @_:Element -> Accumulator) -> @name:String -> @status:Status -> @storage:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+shape:List<&2, U32> -> @initial:Accumulator -> Result<&2, &2, Problem, Accumulator>

template reduce source · line 492 · raw

@-Element:Data -> @-Accumulator:Data -> @-operation:(@_:Accumulator -> @_:Element -> Accumulator) -> @name:String -> @tensor:Tensor<Element> -> @initial:Accumulator -> Result<&2, &2, Problem, Accumulator>

template scalar_result source · line 498 · raw

@-Element:Data -> @+fill:Element -> @+count:U32 -> @result:Result<&2, &2, Problem, Element> -> Tensor<Element>

A reduction as a rank-0 tensor, so a failure propagates like any result.

template reduce_counted source · line 503 · raw

@-Element:Data -> @-operation:(@_:Element -> @_:Element -> Element) -> @name:String -> @pair:Pair(Tensor<Element>, U32) -> @+initial:Element -> Tensor<Element>

template reduce_all source · line 507 · raw

@-Element:Data -> @-operation:(@_:Element -> @_:Element -> Element) -> @name:String -> @tensor:Tensor<Element> -> @+initial:Element -> Tensor<Element>

template scalar_applied source · line 520 · raw

@-Element:Data -> @name:String -> @+shape:List<&2, U32> -> @+fill:Element -> @+workers:U32 -> @result:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_operations.Outcome<Pair(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)> -> Tensor<Element>

template scalar_view source · line 526 · raw

@-Element:Data -> @-operation:(@_:Element -> @_:Element -> Element) -> @name:String -> @view:Maybe<&2, 0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_view.View> -> @storage:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+shape:List<&2, U32> -> @+fill:Element -> @+value:Element -> @+workers:U32 -> Tensor<Element>

template scalar_status source · line 533 · raw

@-Element:Data -> @-operation:(@_:Element -> @_:Element -> Element) -> @name:String -> @status:Status -> @storage:0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element> -> @+shape:List<&2, U32> -> @+fill:Element -> @+value:Element -> @+workers:U32 -> Tensor<Element>

template scalar_bands source · line 540 · raw

@-Element:Data -> @-operation:(@_:Element -> @_:Element -> Element) -> @operations:F32 -> @status:Status -> @bands:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Bands(Element) -> @+geometry:0x9be3b13bf249759bc81e1958bcd1a4c0/tensor_band.Geometry -> @shape:List<&2, U32> -> @fill:Element -> @+workers:U32 -> @value:Element -> Tensor<Element>

Updates every element x to operation(x, value).

template combine_scalar source · line 546 · raw

@-Element:Data -> @-operation:(@_:Element -> @_:Element -> Element) -> @name:String -> @operations:F32 -> @tensor:Tensor<Element> -> @+value:Element -> Tensor<Element>

template expected source · line 580 · raw

@-Element:Data -> @result:Result<&1, &1, Pair(Tensor<Element>, Problem), Tensor<Element>> -> IO(Tensor<Element>)

template expect source · line 586 · raw

@-Element:Data -> @tensor:Tensor<Element> -> IO(Tensor<Element>)

Stops the program with the recorded problem, for scripts and examples.

template expected_storage source · line 589 · raw

@-Element:Data -> @result:Result<&2, &1, Problem, 0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>> -> IO(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)

template expect_storage source · line 594 · raw

@-Element:Data -> @tensor:Tensor<Element> -> IO(0x9be3b13bf249759bc81e1958bcd1a4c0/storage_buffer.Buffer<Element>)

template then source · line 599 · raw

@-First:Type -> @-Second:Type -> @-Result:Type -> @pair:Pair(First, Second) -> @body:(@_:First -> @_:Second -> Result) -> Result

Read-only operations return their tensor in a pair; Bend destructures only parameters, so a continuation receives both halves.