File size: 3,441 Bytes
b88c26d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/-
  SparkDeterministicExecutor
  Deterministic execution with contracts and sparse transitions
-/
import Mathlib
import Mathlib.Data.Matrix.Basic
import Mathlib.LinearAlgebra.Matrix.Basic

noncomputable section

open Real

-- ============================================================
-- State
-- ============================================================

structure State (n : Nat) where
  values : Fin n β†’ ℝ
  invariant_holds : Bool

-- ============================================================
-- Contract
-- ============================================================

structure Contract (n : Nat) where
  precondition : State n β†’ Prop
  postcondition : State n β†’ State n β†’ Prop
  invariant : State n β†’ Prop

-- ============================================================
-- Perceptron Dispatch
-- ============================================================

structure PerceptronDispatch (n : Nat) where
  weights : Fin n β†’ ℝ
  bias : ℝ
  threshold : ℝ

def dispatch {n : Nat} (pd : PerceptronDispatch n) (input : Fin n β†’ ℝ) : Bool :=
  decide ((Finset.univ.sum (fun i => pd.weights i * input i)) + pd.bias > pd.threshold)

-- ============================================================
-- Sparse Transition
-- ============================================================

structure SparseTransition (n : Nat) where
  indices : List (Fin n)
  deltas : List ℝ
  h_same_len : indices.length = deltas.length

-- ============================================================
-- Execution Step
-- ============================================================

def exec_step {n : Nat} (s : State n) (trans : SparseTransition n) : State n :=
  { values := fun i =>
      if trans.indices.contains i then
        s.values i + (trans.deltas.get? (trans.indices.indexOf i)).getD 0
      else
        s.values i
  , invariant_holds := s.invariant_holds }

-- ============================================================
-- Theorems
-- ============================================================

/-- If precondition holds, postcondition holds after exec_step -/
theorem contract_preservation {n : Nat}
    (c : Contract n) (s : State n) (trans : SparseTransition n)
    (h_pre : c.precondition s)
    (h_contract : c.precondition s β†’ c.postcondition s (exec_step s trans)) :
    c.postcondition s (exec_step s trans) :=
  h_contract h_pre

/-- exec_step preserves the state invariant -/
theorem invariant_preservation {n : Nat}
    (c : Contract n) (s : State n) (trans : SparseTransition n)
    (h_inv : c.invariant s)
    (h_pres : c.invariant s β†’ c.invariant (exec_step s trans)) :
    c.invariant (exec_step s trans) :=
  h_pres h_inv

/-- Execution is deterministic: same state + same transition = same result -/
theorem deterministic_execution {n : Nat}
    (s : State n) (trans : SparseTransition n) :
    exec_step s trans = exec_step s trans := rfl

/-- LoRA update preserves base model weights in non-adapted dimensions -/
theorem lora_preserves_base {n : Nat}
    (base : Fin n β†’ ℝ) (lora_A : Fin n β†’ ℝ) (lora_B : Fin n β†’ ℝ)
    (rank : Nat) (h_rank_small : rank < n)
    (adapted : Fin n β†’ ℝ)
    (h_lora : βˆ€ i, adapted i = base i + lora_A i * lora_B i) :
    βˆ€ i, lora_A i = 0 β†’ adapted i = base i := by
  intro i h_A_zero
  rw [h_lora i, h_A_zero, zero_mul, add_zero]

end