summaryrefslogtreecommitdiff
path: root/experiments
diff options
context:
space:
mode:
authorYurenHao0426 <Blackhao0426@gmail.com>2026-07-22 15:18:17 -0500
committerYurenHao0426 <Blackhao0426@gmail.com>2026-07-22 15:18:17 -0500
commit7455c126ab8a5cbfd3bb1ebe8b029a04f858e824 (patch)
tree4125948b36cec38b92b4c5476d287babd81eae64 /experiments
parentf75412664634494b3a6ebefd1f70d63a0f3e18c5 (diff)
theory: formalize reciprocal KP tracking dynamics
Diffstat (limited to 'experiments')
-rw-r--r--experiments/verify_theory.py37
1 files changed, 37 insertions, 0 deletions
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")