From 7455c126ab8a5cbfd3bb1ebe8b029a04f858e824 Mon Sep 17 00:00:00 2001 From: YurenHao0426 Date: Wed, 22 Jul 2026 15:18:17 -0500 Subject: theory: formalize reciprocal KP tracking dynamics --- experiments/verify_theory.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'experiments/verify_theory.py') diff --git a/experiments/verify_theory.py b/experiments/verify_theory.py index 8054b0d..cc9b6c3 100644 --- a/experiments/verify_theory.py +++ b/experiments/verify_theory.py @@ -221,6 +221,42 @@ def check_intermittent_feedback_tracking(): assert abs(abs(error) - expected_endpoint) < 1e-15 +def check_kolen_pollack_difference_dynamics(): + rng = np.random.default_rng(601) + eta = 0.07 + momentum = 0.9 + decay = 1e-3 + forward = rng.normal(size=(7, 5)) + reciprocal = rng.normal(size=(7, 5)) + forward_momentum = rng.normal(size=(7, 5)) + reciprocal_momentum = rng.normal(size=(7, 5)) + maximum_error = 0.0 + for _ in range(40): + # Both paths independently obtain the same local activity product. + correlation = rng.normal(size=(7, 5)) + difference = reciprocal - forward + momentum_difference = reciprocal_momentum - forward_momentum + predicted_momentum_difference = ( + momentum * momentum_difference - decay * difference) + predicted_difference = difference + eta * predicted_momentum_difference + + forward_momentum = (momentum * forward_momentum + + correlation - decay * forward) + reciprocal_momentum = (momentum * reciprocal_momentum + + correlation - decay * reciprocal) + forward = forward + eta * forward_momentum + reciprocal = reciprocal + eta * reciprocal_momentum + maximum_error = max( + maximum_error, + float(np.abs((reciprocal_momentum - forward_momentum) + - predicted_momentum_difference).max()), + float(np.abs((reciprocal - forward) + - predicted_difference).max())) + print("\nKOLEN-POLLACK DIFFERENCE DYNAMICS") + print(f"task-correlation cancellation error={maximum_error:.3e}") + assert maximum_error < 3e-15 + + def main(): check_simultaneous_variance() check_sigma_bias() @@ -229,6 +265,7 @@ def main(): check_predictor_timescale() check_innovation_identification() check_intermittent_feedback_tracking() + check_kolen_pollack_difference_dynamics() print("\nALL THEORY CHECKS PASSED") -- cgit v1.2.3