LAWS.bend
bendtorch@1.3.0.0 · 325 lines · 28 definitions
1
2
3
4
5
6import Base
7import bendtorch@1.3.0.0/main.bend as T
8import bendtorch@1.3.0.0/spec.bend as Spec
9import bendtorch@1.3.0.0/tensor.bend as TT
10
11
12
13law adjoint:
14 for w: List<&2, List<&2, Nat>>
15 for g: List<&2, Nat>
16 for +v: List<&2, Nat>
17 {Spec.dotn(g, Spec.mv(w, v)) == Spec.dotn(Spec.mtv(w, g), v) : Nat}
18
19
20law weight_adjoint:
21 for w: List<&2, List<&2, Nat>>
22 for g: List<&2, Nat>
23 for +v: List<&2, Nat>
24 {Spec.dotn(g, Spec.mv(w, v)) == Spec.frob(Spec.outer(g, v), w) : Nat}
25
26
27
28law adjoint_seq:
29 for +w1: List<&2, List<&2, Nat>>
30 for +w2: List<&2, List<&2, Nat>>
31 for +g: List<&2, Nat>
32 for +v: List<&2, Nat>
33 {Spec.dotn(g, Spec.mv(w2, Spec.mv(w1, v))) == Spec.dotn(Spec.mtv(w1, Spec.mtv(w2, g)), v) : Nat}
34
35
36
37
38
39law seq_chain:
40 for +w1: List<&2, List<&2, Nat>>
41 for +w2: List<&2, List<&2, Nat>>
42 for +x: List<&2, Nat>
43 for +dy: List<&2, Nat>
44 for g1: List<&2, List<&2, Nat>>
45 for g2: List<&2, List<&2, Nat>>
46 {Spec.dotn(dy, Spec.fy(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, List<&2, Nat>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Layer.fwd(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, List<&2, Nat>, List<&2, Nat>, T.Two<List<&2, Nat>, List<&2, Nat>>, Spec.SeqL(), T.Two{w1, w2}, x))) == Spec.dotn(Spec.bdx(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, List<&2, Nat>, T.Layer.bwd(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, List<&2, Nat>, List<&2, Nat>, T.Two<List<&2, Nat>, List<&2, Nat>>, Spec.SeqL(), T.Two{w1, w2}, Spec.fsv(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, List<&2, Nat>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Layer.fwd(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, List<&2, Nat>, List<&2, Nat>, T.Two<List<&2, Nat>, List<&2, Nat>>, Spec.SeqL(), T.Two{w1, w2}, x)), dy, T.Two{g1, g2})), x) : Nat}
47
48
49
50
51law fork_sum:
52 for +w1: List<&2, List<&2, Nat>>
53 for +w2: List<&2, List<&2, Nat>>
54 for +x: List<&2, Nat>
55 for +dy1: List<&2, Nat>
56 for +dy2: List<&2, Nat>
57 for g1: List<&2, List<&2, Nat>>
58 for g2: List<&2, List<&2, Nat>>
59 {Spec.pdot(T.Two{dy1, dy2}, Spec.fy(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Layer.fwd(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, List<&2, Nat>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Two<List<&2, Nat>, List<&2, Nat>>, Spec.ForkL(), T.Two{w1, w2}, x))) == Spec.dotn(Spec.bdx(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, List<&2, Nat>, T.Layer.bwd(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, List<&2, Nat>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Two<List<&2, Nat>, List<&2, Nat>>, Spec.ForkL(), T.Two{w1, w2}, Spec.fsv(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Layer.fwd(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, List<&2, Nat>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Two<List<&2, Nat>, List<&2, Nat>>, Spec.ForkL(), T.Two{w1, w2}, x)), T.Two{dy1, dy2}, T.Two{g1, g2})), x) : Nat}
60
61
62
63
64
65law both_sum:
66 for +w1: List<&2, List<&2, Nat>>
67 for +w2: List<&2, List<&2, Nat>>
68 for +x1: List<&2, Nat>
69 for +x2: List<&2, Nat>
70 for +dy1: List<&2, Nat>
71 for +dy2: List<&2, Nat>
72 for g1: List<&2, List<&2, Nat>>
73 for g2: List<&2, List<&2, Nat>>
74 {Spec.pdot(T.Two{dy1, dy2}, Spec.fy(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Layer.fwd(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Two<List<&2, Nat>, List<&2, Nat>>, Spec.BothL(), T.Two{w1, w2}, T.Two{x1, x2}))) == Spec.pdot(Spec.bdx(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Layer.bwd(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Two<List<&2, Nat>, List<&2, Nat>>, Spec.BothL(), T.Two{w1, w2}, Spec.fsv(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Layer.fwd(T.Two<List<&2, List<&2, Nat>>, List<&2, List<&2, Nat>>>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Two<List<&2, Nat>, List<&2, Nat>>, T.Two<List<&2, Nat>, List<&2, Nat>>, Spec.BothL(), T.Two{w1, w2}, T.Two{x1, x2})), T.Two{dy1, dy2}, T.Two{g1, g2})), T.Two{x1, x2}) : Nat}
75
76
77
78
79
80
81law residual:
82 for +w: List<&2, List<&2, Nat>>
83 for +x: List<&2, Nat>
84 for +dy: List<&2, Nat>
85 for g: List<&2, List<&2, Nat>>
86 {Spec.dotn(dy, Spec.fy(T.Two<T.Two<Unit, List<&2, List<&2, Nat>>>, Unit>, List<&2, Nat>, T.Two<T.Two<Unit, List<&2, Nat>>, Unit>, T.Layer.fwd(T.Two<T.Two<Unit, List<&2, List<&2, Nat>>>, Unit>, List<&2, Nat>, List<&2, Nat>, T.Two<T.Two<Unit, List<&2, Nat>>, Unit>, Spec.ResL(), T.Two{T.Two{Unit{}, w}, Unit{}}, x))) == Spec.dotn(Spec.bdx(T.Two<T.Two<Unit, List<&2, List<&2, Nat>>>, Unit>, List<&2, Nat>, T.Layer.bwd(T.Two<T.Two<Unit, List<&2, List<&2, Nat>>>, Unit>, List<&2, Nat>, List<&2, Nat>, T.Two<T.Two<Unit, List<&2, Nat>>, Unit>, Spec.ResL(), T.Two{T.Two{Unit{}, w}, Unit{}}, Spec.fsv(T.Two<T.Two<Unit, List<&2, List<&2, Nat>>>, Unit>, List<&2, Nat>, T.Two<T.Two<Unit, List<&2, Nat>>, Unit>, T.Layer.fwd(T.Two<T.Two<Unit, List<&2, List<&2, Nat>>>, Unit>, List<&2, Nat>, List<&2, Nat>, T.Two<T.Two<Unit, List<&2, Nat>>, Unit>, Spec.ResL(), T.Two{T.Two{Unit{}, w}, Unit{}}, x)), dy, T.Two{T.Two{Unit{}, g}, Unit{}})), x) : Nat}
87
88
89
90
91law causal_keys:
92 for +i: Nat
93 for +hd: Nat
94 for +qs: U32
95 for +qc: U32
96 for +ks: U32
97 for +kc: U32
98 for q: Array<F32>
99 for k: Array<F32>
100 {List.length(&2, F32, T.dr_row(T.qrow(i, hd, qs, qc, ks, kc, q, k))) == 1n+i : Nat}
101
102
103
104
105
106
107law causal:
108 for +i: Nat
109 for +t: Nat
110 for +hd: Nat
111 for +sc: F32
112 for +qs: U32
113 for +qc: U32
114 for +ks: U32
115 for +kc: U32
116 for q: Array<F32>
117 for k: Array<F32>
118 for p: Array<F32>
119 {T.pr_n(T.prow(i, t, hd, sc, qs, qc, ks, kc, q, k, p)) == 1n+i : Nat}
120
121
122
123
124
125
126law full_keys:
127 for +i: Nat
128 for +m: Nat
129 for +hd: Nat
130 for +qs: U32
131 for +qc: U32
132 for +ks: U32
133 for +kc: U32
134 for q: Array<F32>
135 for k: Array<F32>
136 {List.length(&2, F32, T.dr_row(T.frow(i, m, hd, qs, qc, ks, kc, q, k))) == 1n+m : Nat}
137
138
139law full:
140 for +i: Nat
141 for +m: Nat
142 for +hd: Nat
143 for +sc: F32
144 for +qs: U32
145 for +qc: U32
146 for +ks: U32
147 for +kc: U32
148 for q: Array<F32>
149 for k: Array<F32>
150 for pa: Array<F32>
151 {T.pr_n(T.fprow(i, m, hd, sc, qs, qc, ks, kc, q, k, pa)) == 1n+m : Nat}
152
153
154law full_grad:
155 for +i: Nat
156 for +m: Nat
157 for +hd: Nat
158 for +sc: F32
159 for +ds: U32
160 for +dc: U32
161 for +vs: U32
162 for +vc: U32
163 for d: Array<F32>
164 for v: Array<F32>
165 for pa: Array<F32>
166 for ga: Array<F32>
167 {T.gr_n(T.fgrow(i, m, hd, sc, ds, dc, vs, vc, d, v, pa, ga)) == 1n+m : Nat}
168
169
170
171
172
173
174law causal_grad:
175 for +i: Nat
176 for +t: Nat
177 for +hd: Nat
178 for +sc: F32
179 for +ds: U32
180 for +dc: U32
181 for +vs: U32
182 for +vc: U32
183 for d: Array<F32>
184 for v: Array<F32>
185 for p: Array<F32>
186 for g: Array<F32>
187 {T.gr_n(T.grow(i, t, hd, sc, ds, dc, vs, vc, d, v, p, g)) == 1n+i : Nat}
188
189
190
191
192
193law attn_par_fwd:
194 for d: Nat
195 for gs: T.Halves<T.FS>
196 for +n: Nat
197 for +h: Nat
198 for +dm: T.Dm
199 {T.fpar(d, gs, n, h, dm) == T.fleaf(T.hcat(T.FS, gs), h, dm, Nil{}) : List<&1, Array<F32>>}
200
201
202
203
204law attn_par_fwd_full:
205 for d: Nat
206 for gs: T.Halves<T.FS>
207 for +n: Nat
208 for +h: Nat
209 for +dm: T.Dm
210 {T.fpar_full(d, gs, n, h, dm) == T.fleaf_full(T.hcat(T.FS, gs), h, dm, Nil{}) : List<&1, Array<F32>>}
211
212
213
214law attn_par_bwd:
215 for d: Nat
216 for gs: T.Halves<T.BG>
217 for +n: Nat
218 for +kv: Nat
219 for +dm: T.Dm
220 {T.bpar(d, gs, n, kv, dm) == T.bleaf(T.hcat(T.BG, gs), kv, dm, Nil{}) : List<&1, T.DB>}
221
222
223law attn_par_bwd_full:
224 for d: Nat
225 for gs: T.Halves<T.BG>
226 for +n: Nat
227 for +kv: Nat
228 for +dm: T.Dm
229 {T.bpar_full(d, gs, n, kv, dm) == T.bleaf_full(T.hcat(T.BG, gs), kv, dm, Nil{}) : List<&1, T.DB>}
230
231
232
233law kv_of_group:
234 for +j: Nat
235 for +i: Nat
236 for +k: Nat
237 {T.kv_of(Nat.add(Nat.mul(j, 1n+Nat.add(i, k)), i), 1n+Nat.add(i, k)) == j : Nat}
238
239
240
241
242law gqa_head:
243 for +j: Nat
244 for +i: Nat
245 for +k: Nat
246 {Nat.div(Nat.add(Nat.mul(j, 1n+Nat.add(i, k)), i), 1n+Nat.add(i, k)) == j : Nat}
247
248
249
250
251law kv_cols:
252 for +t: Nat
253 for +hd: Nat
254 for +w: Nat
255 for +kvw: Nat
256 for +sc: F32
257 for +j: Nat
258 for +i: Nat
259 for +k: Nat
260 {T.hc_kc(T.head_cols(T.Dm{t, 1n+Nat.add(i, k), hd, w, kvw, sc}, Nat.add(Nat.mul(j, 1n+Nat.add(i, k)), i))) == U32.from_nat(Nat.mul(j, hd)) : U32}
261
262
263
264law bc_sym:
265 for +a: List<&2, Nat>
266 for +b: List<&2, Nat>
267 for +o: List<&2, Nat>
268 {TT.bc_ok(a, b, o) == TT.bc_ok(b, a, o) : Bool}
269
270
271
272law sum_numel:
273 for +s: List<&2, Nat>
274 for +k: Nat
275 {TT.numel(s) == Nat.mul(TT.at1(s, k), TT.numel(TT.remove(s, k))) : Nat}
276
277
278
279law narrow_rest:
280 for +s: List<&2, Nat>
281 for +d: Nat
282 for +l: Nat
283 {TT.remove(TT.setd(s, d, l), d) == TT.remove(s, d) : List<&2, Nat>}
284
285
286law narrow_axis:
287 for +s: List<&2, Nat>
288 for +d: Nat
289 for +l: Nat
290 for e: {True{} == Nat.is_lt(d, TT.rank(s)) : Bool}
291 {TT.at1(TT.setd(s, d, l), d) == l : Nat}
292
293
294
295law cat_numel:
296 for +s: List<&2, Nat>
297 for +d: Nat
298 for +x: Nat
299 for +y: Nat
300 for e: {True{} == Nat.is_lt(d, TT.rank(s)) : Bool}
301 {TT.numel(TT.setd(s, d, Nat.add(x, y))) == Nat.add(TT.numel(TT.setd(s, d, x)), TT.numel(TT.setd(s, d, y))) : Nat}
302
303
304law mat_numel:
305 for +r: Nat
306 for +c: Nat
307 {TT.numel([r, c]) == Nat.mul(r, c) : Nat}
308
309
310law permute_rank:
311 for +s: List<&2, Nat>
312 for p: List<&2, Nat>
313 {TT.rank(TT.permuted(s, p)) == List.length(&2, Nat, p) : Nat}
314
315
316
317
318
319
320
321law block_sum:
322 for +p: Nat
323 for +k: Nat
324 for +r: Nat
325 {Spec.passes(Nat.add(r, p), Spec.blocks(0n, Nat.mul(Spec.pw(p), k), 0n)) == Spec.passes(r, Spec.blocks(p, k, 0n)) : List<&2, Spec.Sum>}