FA-98996 / Optimizer update state / Open access
Adam local update leaves its parameter step counter stale · case 01
Adam local update leaves its parameter step counter stale.
ROOT CAUSE
After guarding the first update, the stored local count is reused without incrementing it.
THE FAILURE
After guarding the first update, the stored local count is reused without incrementing it.
Unsuccessful approach: Incrementing twice advances both moments past the actual number of parameter updates.
Case contract
Given [m,v,t], increment this parameter t and return [mhat,vhat,new_t] with beta values .5.
Why this case matters
Optimizer implementations must associate each parameter with its own mathematically specified update state.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(m, v, t):
nt=max(1,t)
return [m/(1-0.5**nt),v/(1-0.5**nt),nt]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('first local update',solve(2,4,0),[4,8,1])
check('after skipped rounds',solve(2,4,3),[32/15,64/15,4])
check('second local update',solve(1,3,1),[4/3,4,2])
check('zero moments',solve(0,0,5),[0,0,6])
check('larger first moment',solve(5,2,2),[40/7,16/7,3])
check('step state returned',solve(1,1,N),[1/(1-0.5**(N+1)),1/(1-0.5**(N+1)),N+1])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| first local update | [4.0, 8.0, 1] | [4, 8, 1] | Passed |
| after skipped rounds | [2.2857142857142856, 4.571428571428571, 3] | [2.1333333333333333, 4.266666666666667, 4] | Failed |
| second local update | [2.0, 6.0, 1] | [1.3333333333333333, 4, 2] | Failed |
| zero moments | [0.0, 0.0, 5] | [0, 0, 6] | Failed |
| larger first moment | [6.666666666666667, 2.6666666666666665, 2] | [5.714285714285714, 2.2857142857142856, 3] | Failed |
| step state returned | [2.0, 2.0, 1] | [1.3333333333333333, 1.3333333333333333, 2] | Failed |
SHA-256 / d5b5c17f90ff4ce516ae9fa90a232e9e6058f63990337ec055ad2e973c23802a
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(m, v, t):
nt=t+2
return [m/(1-0.5**nt),v/(1-0.5**nt),nt]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('first local update',solve(2,4,0),[4,8,1])
check('after skipped rounds',solve(2,4,3),[32/15,64/15,4])
check('second local update',solve(1,3,1),[4/3,4,2])
check('zero moments',solve(0,0,5),[0,0,6])
check('larger first moment',solve(5,2,2),[40/7,16/7,3])
check('step state returned',solve(1,1,N),[1/(1-0.5**(N+1)),1/(1-0.5**(N+1)),N+1])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| first local update | [2.6666666666666665, 5.333333333333333, 2] | [4, 8, 1] | Failed |
| after skipped rounds | [2.064516129032258, 4.129032258064516, 5] | [2.1333333333333333, 4.266666666666667, 4] | Failed |
| second local update | [1.1428571428571428, 3.4285714285714284, 3] | [1.3333333333333333, 4, 2] | Failed |
| zero moments | [0.0, 0.0, 7] | [0, 0, 6] | Failed |
| larger first moment | [5.333333333333333, 2.1333333333333333, 4] | [5.714285714285714, 2.2857142857142856, 3] | Failed |
| step state returned | [1.1428571428571428, 1.1428571428571428, 3] | [1.3333333333333333, 1.3333333333333333, 2] | Failed |
SHA-256 / b950093b4e5877f934f925e7a596a2b25cf27ff2d8a6b825926e684176202a8f
HELD IN THE MEMBER ARCHIVE
The verified repair and its recorded checks are member-only.
This mechanism has 6 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.
Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.
Member access is invitation-based. Sign in with your invited account to inspect the repair.
Sign in to the archive ↗Verification & scope
These are deterministic scalar or short-vector toy contracts, not claims about production optimizer APIs or training quality. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-30T16:48:18.999649+00:00.
Case digest / dbe2483f243895ac510e139740a2382bc797424de36612c33977b5567928bd11