src/tensor/elementwise_totality.bend

bendtorch-core@0.1.0.0 · 69 lines · 14 definitions

1import Base
2import bendtorch-core@0.1.0.0/src/shape/core.bend as Shape
3import bendtorch-core@0.1.0.0/src/tensor/core.bend as Core
4import bendtorch-core@0.1.0.0/src/tensor/elementwise.bend as Elementwise
5
6def dimensions(dynamic: Core.Dynamic) -> List<&2, U32>:
7  Core.Packed{shape, tensor} = dynamic
8  Shape.dimensions(shape)
9
10def dynamic_shape(dynamic: Core.Dynamic) -> Shape.Shape:
11  Core.Packed{shape, tensor} = dynamic
12  shape
13
14def retained_left(pair: (Core.Dynamic & Core.Dynamic) & Result<&2, &1, Core.Error, Core.Dynamic>) -> Core.Dynamic:
15  ((left, right), result) = pair
16  left
17
18def retained_right(pair: (Core.Dynamic & Core.Dynamic) & Result<&2, &1, Core.Error, Core.Dynamic>) -> Core.Dynamic:
19  ((left, right), result) = pair
20  right
21
22def succeeded(pair: (Core.Dynamic & Core.Dynamic) & Result<&2, &1, Core.Error, Core.Dynamic>) -> Bool:
23  (inputs, result) = pair
24  Result.is_done(&2, &1, Core.Error, Core.Dynamic, result)
25
26type Property is Data:
27  Dimensions{}
28  Checked{index: U32}
29  Raw{index: U32}
30
31type Inspection is Data:
32  Dims{dimensions: List<&2, U32>}
33  Value{value: Maybe<&2, F32>}
34
35def inspect(property: Property, dynamic: Core.Dynamic) -> Inspection:
36  match property:
37    case Dimensions{}:
38      Dims{dimensions(dynamic)}
39    case Checked{index}:
40      Value{Core.checked_observe_dynamic(dynamic, index)}
41    case Raw{index}:
42      Value{Core.observe_dynamic(dynamic, index)}
43
44def SameSource(-original: Core.Dynamic, -retained: Core.Dynamic) -> Type:
45  @+property: Property -> {inspect(property, retained) == inspect(property, original) : Inspection}
46
47type Retention<-left: Core.Dynamic, -right: Core.Dynamic,
48  -pair: (Core.Dynamic & Core.Dynamic) & Result<&2, &1, Core.Error, Core.Dynamic>> is Data:
49  Retention{-left: SameSource(left, retained_left(pair)),
50    -right: SameSource(right, retained_right(pair))}
51
52def OutputDimensions(+output: List<&2, U32>, pair: (Core.Dynamic & Core.Dynamic) & Result<&2, &1, Core.Error, Core.Dynamic>) -> Type:
53  (inputs, result) = pair
54  match result:
55    case Fail{error}:
56      Unit
57    case Done{dynamic}:
58      {dimensions(dynamic) == output : List<&2, U32>}
59
60type DimensionsModel<-output: List<&2, U32>,
61  -pair: (Core.Dynamic & Core.Dynamic) & Result<&2, &1, Core.Error, Core.Dynamic>> is Data:
62  DimensionsModel{-exact: OutputDimensions(output, pair)}
63
64type Success<-pair: (Core.Dynamic & Core.Dynamic) & Result<&2, &1, Core.Error, Core.Dynamic>> is Data:
65  Success{-successful: {succeeded(pair) == True{} : Bool}}
66
67type Compatible<-left: Core.Dynamic, -right: Core.Dynamic, -output: List<&2, U32>> is Data:
68  Compatible{alignment: Shape.Broadcast<Shape.extents(dynamic_shape(left)), Shape.extents(dynamic_shape(right)), Shape.naturals(output)>,
69    rank: Shape.LE(Shape.rank_dimensions(output), 4n), capacity: Shape.LE(Shape.logical_numel(output), 1048576n)}