NN
Types
Functions
def relu (v : Vector) : {r : Vector | dim r = dim v && lower r ≥ 0.0}
def sigmoid (v : Vector) : {r : Vector | dim r = dim v && (lower r ≥ 0.0 && upper r ≤ 1.0)}
def tanh_act (v : Vector) : {r : Vector | dim r = dim v && (lower r ≥ 0.0 - 1.0 && upper r ≤ 1.0)}
def softmax (v : Vector | dim v > 0) : {r : Vector | dim r = dim v && (lower r ≥ 0.0 && upper r ≤ 1.0)}
def dense (nin : Int | nin > 0) (nout : Int | nout > 0) : {l : Layer | in_features l = nin && out_features l = nout}
def dense_relu (nin : Int | nin > 0) (nout : Int | nout > 0) : {l : Layer | in_features l = nin && out_features l = nout}
def dense_sigmoid (nin : Int | nin > 0) (nout : Int | nout > 0) : {l : Layer | in_features l = nin && out_features l = nout}
def dense_tanh (nin : Int | nin > 0) (nout : Int | nout > 0) : {l : Layer | in_features l = nin && out_features l = nout}
def make_layer (w : Matrix) (b : Vector | dim b = rows w) : {l : Layer | in_features l = cols w && out_features l = rows w}
def layer_in (l : Layer) : {n : Int | n = in_features l && n ≥ 0}
def layer_out (l : Layer) : {n : Int | n = out_features l && n ≥ 0}
def forward (l : Layer) (x : Vector | dim x = in_features l) : {r : Vector | dim r = out_features l}
def sequential (l : Layer) : {n : Network | net_in n = in_features l && net_out n = out_features l}
def stack (net : Network) (l : Layer | in_features l = net_out net) : {n : Network | net_in n = net_in net && net_out n = out_features l}
def net_in_of (net : Network) : {n : Int | n = net_in net && n ≥ 0}
def net_out_of (net : Network) : {n : Int | n = net_out net && n ≥ 0}
def predict (net : Network) (x : Vector | dim x = net_in net) : {r : Vector | dim r = net_out net}
def predict_unchecked (net : Network) (x : Vector) : Vector
def predict_scalar (net : Network) (x : Vector) : Float
def mse (pred : Vector) (target : Vector | dim target = dim pred) : {f : Float | f ≥ 0.0}
def cross_entropy (pred : Vector | dim pred > 0) (target : Vector | dim target = dim pred) : {f : Float | f ≥ 0.0}
def softmax_cross_entropy (logits : Vector | dim logits > 0) (target : Vector | dim target = dim logits) : {f : Float | f ≥ 0.0}
def backward (net : Network) (x : Vector | dim x = net_in net) (target : Vector | dim target = net_out net) : {g : Gradients | grad_in g = net_in net && grad_out g = net_out net}
def backward_ce (net : Network) (x : Vector | dim x = net_in net) (target : Vector | dim target = net_out net) : {g : Gradients | grad_in g = net_in net && grad_out g = net_out net}
def grad_in_of (g : Gradients) : {n : Int | n = grad_in g && n ≥ 0}
def grad_out_of (g : Gradients) : {n : Int | n = grad_out g && n ≥ 0}
def sgd_step (net : Network) (grads : Gradients | grad_in grads = net_in net && grad_out grads = net_out net) (lr : Float | lr > 0.0) : {out : Network | net_in out = net_in net && net_out out = net_out net}
def train_step (net : Network) (x : Vector | dim x = net_in net) (target : Vector | dim target = net_out net) (lr : Float | lr > 0.0) : {out : Network | net_in out = net_in net && net_out out = net_out net}
def train_step_ce (net : Network) (x : Vector | dim x = net_in net) (target : Vector | dim target = net_out net) (lr : Float | lr > 0.0) : {out : Network | net_in out = net_in net && net_out out = net_out net}
Uninterpreted
Functions declared as def f ... = uninterpreted: only their signature is known to the verifier; they have no body.
def in_features : (l : Layer) → Int
def out_features : (l : Layer) → Int
def net_in : (n : Network) → Int
def net_out : (n : Network) → Int
def grad_in : (g : Gradients) → Int
def grad_out : (g : Gradients) → Int