Tensor
Imports
open Math;
open List;
Types
Functions
def vzeros (n: {k : Int | k ≥ 0}) : {v : Vector | dim v = n && (lower v = 0.0 && upper v = 0.0)}
def vones (n: {k : Int | k ≥ 0}) : {v : Vector | dim v = n && (lower v = 1.0 && upper v = 1.0)}
def vfull (n: {k : Int | k ≥ 0}) (x: Float) : {v : Vector | dim v = n && (lower v = x && upper v = x)}
def from_list (xs: List Float) : {v : Vector | dim v = size xs}
def vdim (v: Vector) : {n : Int | n = dim v && n ≥ 0}
def vget (v: Vector) (i: {k : Int | k ≥ 0 && k < dim v}) : {x : Float | lower v ≤ x && x ≤ upper v}
def vlower (v: {x : Vector | dim x > 0}) : {f : Float | f = lower v}
def vupper (v: {x : Vector | dim x > 0}) : {f : Float | f = upper v}
def vadd (a: Vector) (b: {x : Vector | dim x = dim a}) : {r : Vector | dim r = dim a && (lower r ≥ lower a + lower b && upper r ≤ upper a + upper b)}
def vsub (a: Vector) (b: {x : Vector | dim x = dim a}) : {r : Vector | dim r = dim a && (lower r ≥ lower a - upper b && upper r ≤ upper a - lower b)}
def hadamard (a: Vector) (b: {x : Vector | dim x = dim a}) : {r : Vector | dim r = dim a}
def hadamard_nonneg (a: {x : Vector | lower x ≥ 0.0}) (b: {x : Vector | dim x = dim a && lower x ≥ 0.0}) : {r : Vector | dim r = dim a && (lower r ≥ lower a * lower b && upper r ≤ upper a * upper b)}
def scale (s: Float) (v: Vector) : {r : Vector | dim r = dim v}
def scale_nonneg (s: {f : Float | f ≥ 0.0}) (v: Vector) : {r : Vector | dim r = dim v && (lower r ≥ s * lower v && upper r ≤ s * upper v)}
def dot (a: Vector) (b: {x : Vector | dim x = dim a}) : Float
def dot_nonneg (a: {x : Vector | lower x ≥ 0.0}) (b: {x : Vector | dim x = dim a && lower x ≥ 0.0}) : {f : Float | f ≥ 0.0}
def norm (v: Vector) : {f : Float | f ≥ 0.0}
def normalize (v: {x : Vector | dim x > 0}) : {r : Vector | dim r = dim v}
def vsum (v: Vector) : Float
def mzeros (r: {k : Int | k ≥ 0}) (c: {k : Int | k ≥ 0}) : {m : Matrix | rows m = r && (cols m = c && (mlower m = 0.0 && mupper m = 0.0))}
def eye (n: {k : Int | k ≥ 0}) : {m : Matrix | rows m = n && (cols m = n && (mlower m ≥ 0.0 && mupper m ≤ 1.0))}
def mrows (m: Matrix) : {n : Int | n = rows m && n ≥ 0}
def mcols (m: Matrix) : {n : Int | n = cols m && n ≥ 0}
def mget (m: Matrix) (i: {k : Int | k ≥ 0 && k < rows m}) (j: {k : Int | k ≥ 0 && k < cols m}) : {x : Float | mlower m ≤ x && x ≤ mupper m}
def mlower_of (m: {x : Matrix | rows x > 0 && cols x > 0}) : {f : Float | f = mlower m}
def mupper_of (m: {x : Matrix | rows x > 0 && cols x > 0}) : {f : Float | f = mupper m}
def madd (a: Matrix) (b: {x : Matrix | rows x = rows a && cols x = cols a}) : {r : Matrix | rows r = rows a && (cols r = cols a && (mlower r ≥ mlower a + mlower b && mupper r ≤ mupper a + mupper b))}
def matmul (a: Matrix) (b: {x : Matrix | rows x = cols a}) : {r : Matrix | rows r = rows a && cols r = cols b}
def matvec (m: Matrix) (v: {x : Vector | dim x = cols m}) : {r : Vector | dim r = rows m}
def transpose (m: Matrix) : {r : Matrix | rows r = cols m && (cols r = rows m && (mlower r = mlower m && mupper r = mupper m))}
Uninterpreted
Functions declared as def f ... = uninterpreted: only their signature is known to the verifier; they have no body.
def dim : (v : Vector) → Int
def rows : (m : Matrix) → Int
def cols : (m : Matrix) → Int
def lower : (v : Vector) → Float
def upper : (v : Vector) → Float
def mlower : (m : Matrix) → Float
def mupper : (m : Matrix) → Float