1 import Base
2 import ../shape/core.bend as Shape
3 import ./core.bend as Core
4 import ./transforms.bend as Transforms
5 import ./observation.bend as Observation
6
7 type Request is Data:
8 Permute{axes: List<&2, U32>}
9 Transpose{a: U32, b: U32}
10
11 def apply(+input: Shape.Shape, tensor: Core.Tensor, request: Request) ->
12 Core.Tensor & 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
19 def 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
26 def failure_code_pair(-input: Shape.Shape, pair: Core.Tensor & Result<&2, &1, Transforms.Error, Core.Dynamic>) -> U32:
27 (source, result) = pair
28 status(result)
29
30 def failure_code(+input: Shape.Shape, +request: Request, result: Result<&2, &1, Core.Error, Core.Tensor>) -> 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
37 def kept_value_pair(-input: Shape.Shape, +other: U32, pair: Core.Tensor & 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
41 def kept_value(+input: Shape.Shape, +request: Request, +other: U32, result: Result<&2, &1, Core.Error, Core.Tensor>) -> 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
48 def kept_dimensions_pair(+input: Shape.Shape, pair: Core.Tensor & 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
52 def kept_dimensions(+input: Shape.Shape, +request: Request, result: Result<&2, &1, Core.Error, Core.Tensor>) -> 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
59 def kept_length_pair(-input: Shape.Shape, pair: Core.Tensor & Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Nat:
60 (source, result) = pair
61 Core.logical_length(input, source)
62
63 def kept_length(+input: Shape.Shape, +request: Request, result: Result<&2, &1, Core.Error, Core.Tensor>) -> 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
70 def kept_count_pair(+input: Shape.Shape, pair: Core.Tensor & 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
74 def kept_count(+input: Shape.Shape, +request: Request, result: Result<&2, &1, Core.Error, Core.Tensor>) -> 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
81 def reshape_code(+input: Shape.Shape, +dimensions: List<&2, U32>, result: Result<&2, &1, Core.Error, Core.Tensor>) -> 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
88 def 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
95 def reshape_dimensions(+input: Shape.Shape, +dimensions: List<&2, U32>, result: Result<&2, &1, Core.Error, Core.Tensor>) -> 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
102 def dynamic_length(dynamic: Core.Dynamic) -> Nat:
103 Core.Packed{shape, tensor} = dynamic
104 Core.logical_length(shape, tensor)
105
106 def 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
113 def reshape_length(+input: Shape.Shape, +dimensions: List<&2, U32>, result: Result<&2, &1, Core.Error, Core.Tensor>) -> 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
120 def 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
127 def reshape_count(+input: Shape.Shape, +dimensions: List<&2, U32>, result: Result<&2, &1, Core.Error, Core.Tensor>) -> 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
134 def 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
141 def reshape_value(+input: Shape.Shape, +dimensions: List<&2, U32>, +other: U32, result: Result<&2, &1, Core.Error, Core.Tensor>) -> 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
148 def reshape_written_pair(+input: Shape.Shape, +dimensions: List<&2, U32>, +other: U32,
149 pair: Core.Tensor & Result<&2, &2, Core.Error, Unit>) -> Maybe<&2, F32>:
150 (tensor, result) = pair
151 output_value(other, Transforms.reshape(input, tensor, dimensions))
152
153 def reshape_written(+input: Shape.Shape, +index: U32, +value: F32, +dimensions: List<&2, U32>, +other: U32,
154 result: Result<&2, &1, Core.Error, Core.Tensor>) -> 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
161 def applied_dimensions_pair(-input: Shape.Shape, pair: Core.Tensor & Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Maybe<&2, List<&2, U32>>:
162 (source, result) = pair
163 output_dimensions(result)
164
165 def applied_dimensions(+input: Shape.Shape, +request: Request, result: Result<&2, &1, Core.Error, Core.Tensor>) -> 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
172 def applied_length_pair(-input: Shape.Shape, pair: Core.Tensor & Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Maybe<&2, Nat>:
173 (source, result) = pair
174 output_length(result)
175
176 def applied_length(+input: Shape.Shape, +request: Request, result: Result<&2, &1, Core.Error, Core.Tensor>) -> 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
183 def applied_count_pair(-input: Shape.Shape, pair: Core.Tensor & Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Maybe<&2, U32>:
184 (source, result) = pair
185 output_count(result)
186
187 def applied_count(+input: Shape.Shape, +request: Request, result: Result<&2, &1, Core.Error, Core.Tensor>) -> 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
194 def applied_value_pair(-input: Shape.Shape, +other: U32, pair: Core.Tensor & Result<&2, &1, Transforms.Error, Core.Dynamic>) -> Maybe<&2, F32>:
195 (source, result) = pair
196 output_value(other, result)
197
198 def applied_value(+input: Shape.Shape, +request: Request, +other: U32, result: Result<&2, &1, Core.Error, Core.Tensor>) -> 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))