src/tensor/transform_observation.bend

bendtorch-core@0.1.0.0 · 203 lines · 33 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/transforms.bend as Transforms
5import bendtorch-core@0.1.0.0/src/tensor/observation.bend as Observation
6
7type Request is Data:
8  Permute{axes: List<&2, U32>}
9  Transpose{a: U32, b: U32}
10
11def apply(+input: Shape.Shape, tensor: Core.Tensor<input>, request: Request) ->
12  Core.Tensor<input> & Result<&2, &1, Transforms.Error, Core.Dynamic>:
13  match request:
14    case Permute{+axes}:
15      Transforms.permute_copy(input, tensor, axes)
16    case Transpose{+a, +b}:
17      Transforms.transpose_copy(input, tensor, a, b)
18
19def status(result: Result<&2, &1, Transforms.Error, Core.Dynamic>) -> U32:
20  match result:
21    case Fail{error}:
22      Transforms.error_code(error)
23    case Done{output}:
24      0
25
26def failure_code_pair(-input: Shape.Shape, pair: Core.Tensor<input> & Result<&2, &1, Transforms.Error, Core.Dynamic>) -> U32:
27  (source, result) = pair
28  status(result)
29
30def failure_code(+input: Shape.Shape, +request: Request, result: Result<&2, &1, Core.Error, Core.Tensor<input>>) -> Maybe<&2, U32>:
31  match result:
32    case Fail{error}:
33      None{}
34    case Done{tensor}:
35      Some{failure_code_pair(input, apply(input, tensor, request))}
36
37def kept_value_pair(-input: Shape.Shape, +other: U32, pair: Core.Tensor<input> & Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Maybe<&2, F32>:
38  (source, result) = pair
39  Core.read_value(input, Core.read_flat(input, source, other))
40
41def kept_value(+input: Shape.Shape, +request: Request, +other: U32, result: Result<&2, &1, Core.Error, Core.Tensor<input>>) -> Maybe<&2, F32>:
42  match result:
43    case Fail{error}:
44      None{}
45    case Done{tensor}:
46      kept_value_pair(input, other, apply(input, tensor, request))
47
48def kept_dimensions_pair(+input: Shape.Shape, pair: Core.Tensor<input> & Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Maybe<&2, List<&2, U32>>:
49  (source, result) = pair
50  Observation.dimensions_pair(Core.shape(Core.pack(input, source)))
51
52def kept_dimensions(+input: Shape.Shape, +request: Request, result: Result<&2, &1, Core.Error, Core.Tensor<input>>) -> Maybe<&2, List<&2, U32>>:
53  match result:
54    case Fail{error}:
55      None{}
56    case Done{tensor}:
57      kept_dimensions_pair(input, apply(input, tensor, request))
58
59def kept_length_pair(-input: Shape.Shape, pair: Core.Tensor<input> & Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Nat:
60  (source, result) = pair
61  Core.logical_length(input, source)
62
63def kept_length(+input: Shape.Shape, +request: Request, result: Result<&2, &1, Core.Error, Core.Tensor<input>>) -> Maybe<&2, Nat>:
64  match result:
65    case Fail{error}:
66      None{}
67    case Done{tensor}:
68      Some{kept_length_pair(input, apply(input, tensor, request))}
69
70def kept_count_pair(+input: Shape.Shape, pair: Core.Tensor<input> & Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Maybe<&2, U32>:
71  (source, result) = pair
72  Observation.count_pair(Core.count(Core.pack(input, source)))
73
74def kept_count(+input: Shape.Shape, +request: Request, result: Result<&2, &1, Core.Error, Core.Tensor<input>>) -> Maybe<&2, U32>:
75  match result:
76    case Fail{error}:
77      None{}
78    case Done{tensor}:
79      kept_count_pair(input, apply(input, tensor, request))
80
81def reshape_code(+input: Shape.Shape, +dimensions: List<&2, U32>, result: Result<&2, &1, Core.Error, Core.Tensor<input>>) -> Maybe<&2, U32>:
82  match result:
83    case Fail{error}:
84      None{}
85    case Done{tensor}:
86      Some{status(Transforms.reshape(input, tensor, dimensions))}
87
88def output_dimensions(result: Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Maybe<&2, List<&2, U32>>:
89  match result:
90    case Fail{error}:
91      None{}
92    case Done{output}:
93      Some{Transforms.dynamic_dimensions(output)}
94
95def reshape_dimensions(+input: Shape.Shape, +dimensions: List<&2, U32>, result: Result<&2, &1, Core.Error, Core.Tensor<input>>) -> Maybe<&2, List<&2, U32>>:
96  match result:
97    case Fail{error}:
98      None{}
99    case Done{tensor}:
100      output_dimensions(Transforms.reshape(input, tensor, dimensions))
101
102def dynamic_length(dynamic: Core.Dynamic) -> Nat:
103  Core.Packed{shape, tensor} = dynamic
104  Core.logical_length(shape, tensor)
105
106def output_length(result: Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Maybe<&2, Nat>:
107  match result:
108    case Fail{error}:
109      None{}
110    case Done{output}:
111      Some{dynamic_length(output)}
112
113def reshape_length(+input: Shape.Shape, +dimensions: List<&2, U32>, result: Result<&2, &1, Core.Error, Core.Tensor<input>>) -> Maybe<&2, Nat>:
114  match result:
115    case Fail{error}:
116      None{}
117    case Done{tensor}:
118      output_length(Transforms.reshape(input, tensor, dimensions))
119
120def output_count(result: Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Maybe<&2, U32>:
121  match result:
122    case Fail{error}:
123      None{}
124    case Done{output}:
125      Observation.count_pair(Core.count(output))
126
127def reshape_count(+input: Shape.Shape, +dimensions: List<&2, U32>, result: Result<&2, &1, Core.Error, Core.Tensor<input>>) -> Maybe<&2, U32>:
128  match result:
129    case Fail{error}:
130      None{}
131    case Done{tensor}:
132      output_count(Transforms.reshape(input, tensor, dimensions))
133
134def output_value(+other: U32, result: Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Maybe<&2, F32>:
135  match result:
136    case Fail{error}:
137      None{}
138    case Done{output}:
139      Core.dynamic_read_value(Core.read_dynamic(output, other))
140
141def reshape_value(+input: Shape.Shape, +dimensions: List<&2, U32>, +other: U32, result: Result<&2, &1, Core.Error, Core.Tensor<input>>) -> Maybe<&2, F32>:
142  match result:
143    case Fail{error}:
144      None{}
145    case Done{tensor}:
146      output_value(other, Transforms.reshape(input, tensor, dimensions))
147
148def reshape_written_pair(+input: Shape.Shape, +dimensions: List<&2, U32>, +other: U32,
149  pair: Core.Tensor<input> & Result<&2, &2, Core.Error, Unit>) -> Maybe<&2, F32>:
150  (tensor, result) = pair
151  output_value(other, Transforms.reshape(input, tensor, dimensions))
152
153def reshape_written(+input: Shape.Shape, +index: U32, +value: F32, +dimensions: List<&2, U32>, +other: U32,
154  result: Result<&2, &1, Core.Error, Core.Tensor<input>>) -> Maybe<&2, F32>:
155  match result:
156    case Fail{error}:
157      None{}
158    case Done{tensor}:
159      reshape_written_pair(input, dimensions, other, Core.write_flat(input, tensor, index, value))
160
161def applied_dimensions_pair(-input: Shape.Shape, pair: Core.Tensor<input> & Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Maybe<&2, List<&2, U32>>:
162  (source, result) = pair
163  output_dimensions(result)
164
165def applied_dimensions(+input: Shape.Shape, +request: Request, result: Result<&2, &1, Core.Error, Core.Tensor<input>>) -> Maybe<&2, List<&2, U32>>:
166  match result:
167    case Fail{error}:
168      None{}
169    case Done{tensor}:
170      applied_dimensions_pair(input, apply(input, tensor, request))
171
172def applied_length_pair(-input: Shape.Shape, pair: Core.Tensor<input> & Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Maybe<&2, Nat>:
173  (source, result) = pair
174  output_length(result)
175
176def applied_length(+input: Shape.Shape, +request: Request, result: Result<&2, &1, Core.Error, Core.Tensor<input>>) -> Maybe<&2, Nat>:
177  match result:
178    case Fail{error}:
179      None{}
180    case Done{tensor}:
181      applied_length_pair(input, apply(input, tensor, request))
182
183def applied_count_pair(-input: Shape.Shape, pair: Core.Tensor<input> & Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Maybe<&2, U32>:
184  (source, result) = pair
185  output_count(result)
186
187def applied_count(+input: Shape.Shape, +request: Request, result: Result<&2, &1, Core.Error, Core.Tensor<input>>) -> Maybe<&2, U32>:
188  match result:
189    case Fail{error}:
190      None{}
191    case Done{tensor}:
192      applied_count_pair(input, apply(input, tensor, request))
193
194def applied_value_pair(-input: Shape.Shape, +other: U32, pair: Core.Tensor<input> & Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Maybe<&2, F32>:
195  (source, result) = pair
196  output_value(other, result)
197
198def applied_value(+input: Shape.Shape, +request: Request, +other: U32, result: Result<&2, &1, Core.Error, Core.Tensor<input>>) -> Maybe<&2, F32>:
199  match result:
200    case Fail{error}:
201      None{}
202    case Done{tensor}:
203      applied_value_pair(input, other, apply(input, tensor, request))