- S式
(op args...)により計算を記述 - 暗号文:
(+ a b),(* a b),(L a 3),(get_index a 3),(set_index a 2 4) - 集合:
(set 1 2 3), 合併(union (set 1) (set 2)) - 定数ベクトル:
(all 3),(mask (set 1)),(vec 1 2 3 4) - 定数演算:
(+. 1 2),(-. 3 4),(*. 1 2) - 変数宣言, 使用:
(let b 3 (+ (var b) 1)) - 集約演算:
(rep + 4 i (var i))
(# (>> a i) i) -> (# a 0)
[(# ?a ?i) -> (<< (* ?a m_i) ?i)]
= (<< (* (>> a i) m_i) i)
[(<< (* ?a ?b) ?k) => (* (<< ?a ?k) (<< ?b ?k))]
= (* (<< (>> a i) i) (<< m_i i))
[(<< (>> ?a ?i) ?i) => a]
= (* a m_0)
= (# a 0)例: 内積
(let a (vec 1 2 3 4))
(let b (vec 5 6 7 8))
(rep + i 4
(* (get_index a (var i)) (get_index b (var i)))
)- 型チェックの導入
Vector型に対する演算+!,-!,*!の追加
2023-01-23
(#= a i v)
=>
(let a (+
(* a (ecd (mask (setinv (set i)))))
(* (L v -i) (ecd (mask (set i)))))
a
)だと,
(#= a i v)
(#= a j w)の時にline1の let の中に入れられないので, #=/4 にする
(#= a i v
(#= a j w)
))=>
(let a (+
(* a (ecd (mask (setinv (set i)))))
(* (L v -i) (ecd (mask (set i)))))
(let a (+
(* a (ecd (mask (setinv (set j)))))
(* (L w -j) (ecd (mask (set j)))))
a
))(let a (enc (ecd (vec 1 2 3 4)))
(let b (enc (ecd (vec 5 6 7 8)))
(#= a 0 (# b 1)
(#= a 1 (# b 0)
a=> #=, # が LinTrans で表される
(let a
(+
(* a ![0])
(* (app lintrans b one_01) [0]))
)
(+
(* a ![1])
(* (>> (app lintrans b one_00) 1) [1])
)=> let が展開される
(+
(*
(+
(* a ![0])
(* (lt b one_01) [0])
)
![1]
)
(* (>> (lt b one_00) 1) [1])
)batching a[0] = b[1], b[1] = a[0]
-
onehot(i,j) == mask(set(i*d+j)) -
(# a i) -> (lintrans a onehot(0,i)) -
(# a i v) ->
(+
(* (ecd (mask (set 0))) (<< b 1))
(+
(* (ecd (mask (set 1))) (>> (* b (ecd (mask (set 0)))) 1))
(* a (ecd
(*! (mask (set 2 3 1)) (mask (set 0 2 3)))
))
)
))))- 2023-01-24 線形変換 に関する規則
(v @ a) + (w @ a) == (v + w) @ av @ (w @ a)) == matmul(v, w) @ a(v @ a) * (w @ a) == (v * w) @ a
- これが出来て, batching出来た所で matmul の batch化は, でもとても重そう. 絶望的.
- 他のHEカーネル作成して, profileとる方が先?
- 全力で体裁整えるムーブした方がいい気がする