summaryrefslogtreecommitdiff
path: root/experiments/verify_theory.py
diff options
context:
space:
mode:
Diffstat (limited to 'experiments/verify_theory.py')
-rw-r--r--experiments/verify_theory.py26
1 files changed, 26 insertions, 0 deletions
diff --git a/experiments/verify_theory.py b/experiments/verify_theory.py
index ba07487..8054b0d 100644
--- a/experiments/verify_theory.py
+++ b/experiments/verify_theory.py
@@ -196,6 +196,31 @@ def check_innovation_identification():
assert abs(retained_fraction - (1.0 - predictable_fraction)) < 0.01
+def check_intermittent_feedback_tracking():
+ eta_m = 0.1
+ cadence = 16
+ per_step_change = 0.002
+ block_change = cadence * per_step_change
+
+ # Constant collinear forward-weight motion attains the norm bound.
+ error = 0.0
+ for _ in range(1000):
+ error = (1.0 - eta_m) * error - block_change
+ steady_state = -block_change / eta_m
+ assert abs(error - steady_state) < 1e-14
+
+ # Once forward motion stops, endpoint tracking can look excellent despite
+ # the large error accumulated during the task-active trajectory.
+ error_before_quiet_tail = abs(error)
+ for _ in range(80):
+ error *= 1.0 - eta_m
+ expected_endpoint = error_before_quiet_tail * (1.0 - eta_m) ** 80
+ print("\nINTERMITTENT FEEDBACK TRACKING")
+ print(f"steady_error={abs(steady_state):.6f} bound={cadence * per_step_change / eta_m:.6f} "
+ f"endpoint_after_quiet_tail={abs(error):.9e}")
+ assert abs(abs(error) - expected_endpoint) < 1e-15
+
+
def main():
check_simultaneous_variance()
check_sigma_bias()
@@ -203,6 +228,7 @@ def main():
check_conditional_projection()
check_predictor_timescale()
check_innovation_identification()
+ check_intermittent_feedback_tracking()
print("\nALL THEORY CHECKS PASSED")