World Model — Spike Prediction + Planning¶
Three components: (1) online-learnable spike predictor for codec integration, (2) stochastic state-transition model, (3) greedy action planner.
SpikePredictor — Online Autoregressive Codec¶
The core workhorse. Predicts multi-channel spike patterns from recent history using a linear autoregressive model trained online via LMS (Least Mean Squares). No backprop, no batches — updates one sample at a time.
Codec integration: Encoder and decoder both maintain identical SpikePredictor instances. Both see the same history. Prediction error (XOR of actual vs predicted) is what gets transmitted. At the decoder, XOR recovers the original. Deterministic: same history → same prediction → lossless roundtrip.
| Parameter | Default | Meaning |
|---|---|---|
n_channels |
(required) | Number of spike channels |
history_len |
8 | Context window (K past timesteps) |
lr |
0.01 | LMS learning rate |
threshold |
0.5 | Binary prediction threshold |
Codec functions:
predict_and_xor_world_model(spikes, n_channels, ...)→ (errors, correct_count) — Encoderxor_and_recover_world_model(errors, n_channels, ...)→ spikes — Decoder
PredictiveWorldModel — Linear Gaussian State-Space¶
Probabilistic predictive model implemented as a Linear Gaussian State-Space Model (LGSSM) with Kalman filter (forward), RTS smoother (backward), and EM parameter learner. References: Kalman 1960, Rauch-Tung-Striebel 1965, Shumway & Stoffer 1982, Bishop 2006 §13.3.
Model parameters and returned moments are finite float64 arrays with
fail-closed shape and covariance validation. The Python inference path uses
Cholesky solves and Joseph-form covariance updates without explicit matrix
inverses. The forward filter is cross-wired to Mojo, Go, Rust, Julia, and
Python backends; backend="auto" follows that stable availability-aware
order. RTS smoothing and the EM M-step remain explicit Python/NumPy
responsibilities.
Provides predict_next_state() (deterministic mean),
predict_next_state_with_cov() (mean + covariance),
forecast() / forecast_with_cov() for multi-step rollouts.
In controlled EM fits, B and D are fixed but their B @ u_t and D @ u_t
contributions are subtracted from the sufficient statistics. Lag-one smoother
covariances have the documented Cov[x_t, x_{t+1} | y] orientation. See the
predictive-model detail page for contracts,
backend boundaries, source-bound benchmark evidence, and verification.
SCPlanner — Greedy Action Selection¶
Uses PredictiveWorldModel for random-shooting planning: sample N candidate actions, predict outcomes, pick the one closest to the goal state.
propose_action(current, goal, n_candidates)— Best single actionplan_sequence(current, goal, horizon)— Greedy multi-step plan
Usage¶
from sc_neurocore.world_model import SpikePredictor
from sc_neurocore.world_model.spike_predictor import (
predict_and_xor_world_model,
xor_and_recover_world_model,
)
import numpy as np
# Lossless codec roundtrip
spikes = (np.random.rand(100, 32) < 0.3).astype(np.int8)
errors, correct = predict_and_xor_world_model(spikes, n_channels=32)
recovered = xor_and_recover_world_model(errors, n_channels=32)
assert np.array_equal(spikes, recovered) # Always true
print(f"Prediction accuracy: {correct / (100 * 32):.1%}")
# Planning
from sc_neurocore.world_model import PredictiveWorldModel, SCPlanner
model = PredictiveWorldModel(state_dim=4, action_dim=2)
planner = SCPlanner(world_model=model)
plan = planner.plan_sequence(
current_state=np.array([0.1, 0.2, 0.3, 0.4]),
goal_state=np.array([0.9, 0.8, 0.7, 0.6]),
horizon=5,
)
sc_neurocore.world_model
¶
sc_neurocore.world_model -- Tier: research (experimental / research).
SpikePredictor
dataclass
¶
Online autoregressive spike pattern predictor.
Learns to predict spike[t] from spike[t-K:t] per channel. Weight matrix W of shape (N, N*K) maps flattened history to per-channel firing probabilities. Binary prediction via threshold.
LMS update after each timestep.
W += lr * outer(error, history)
where error = actual - predicted_prob.
Parameters¶
n_channels : int Number of spike channels. history_len : int Number of past timesteps to use as context (K). lr : float LMS learning rate. threshold : float Probability threshold for binary prediction. seed : int RNG seed for weight initialization.
Source code in src/sc_neurocore/world_model/spike_predictor.py
| Python | |
|---|---|
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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | |
__post_init__()
¶
Seed the RNG and initialise the predictor weights.
Source code in src/sc_neurocore/world_model/spike_predictor.py
| Python | |
|---|---|
63 64 65 66 67 68 69 70 71 72 | |
predict_probs()
¶
Predict per-channel firing probabilities from history.
Source code in src/sc_neurocore/world_model/spike_predictor.py
| Python | |
|---|---|
80 81 82 83 84 85 86 | |
predict()
¶
Predict binary spike pattern.
Source code in src/sc_neurocore/world_model/spike_predictor.py
| Python | |
|---|---|
88 89 90 | |
update(actual)
¶
Update weights with observed spike pattern (LMS rule).
Parameters¶
actual : ndarray of shape (n_channels,), binary
Source code in src/sc_neurocore/world_model/spike_predictor.py
| Python | |
|---|---|
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | |
reset()
¶
Reset to initial state (same seed → same weights).
Source code in src/sc_neurocore/world_model/spike_predictor.py
| Python | |
|---|---|
111 112 113 | |
SCPlanner
dataclass
¶
A planner that uses a PredictiveWorldModel to select actions.
Source code in src/sc_neurocore/world_model/planner.py
| Python | |
|---|---|
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 | |
propose_action(current_state, goal_state, n_candidates=10)
¶
Propose the best action among n_candidates based on predicted outcome.
Source code in src/sc_neurocore/world_model/planner.py
| Python | |
|---|---|
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 | |
plan_sequence(current_state, goal_state, horizon=5)
¶
Simple greedy planning for a sequence of actions.
Source code in src/sc_neurocore/world_model/planner.py
| Python | |
|---|---|
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | |
PredictiveWorldModel
dataclass
¶
Forecast latent-state means and covariances through an LGSSM.
Parameters¶
state_dim : int Positive latent-state dimension. action_dim : int Non-negative action dimension. seed : int, default=42 Seed used to initialise the stable random LGSSM.
Notes¶
This class preserves the historical planning-facing API. Use
:class:LinearGaussianSSM, :class:KalmanFilter, and
:class:RTSSmoother when observations are available.
Source code in src/sc_neurocore/world_model/_predictive_world_model.py
| Python | |
|---|---|
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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 | |
__post_init__()
¶
Initialise a validated stable state-transition model.
Source code in src/sc_neurocore/world_model/_predictive_world_model.py
| Python | |
|---|---|
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | |
reset()
¶
Reset the stored belief moments to the model prior.
Source code in src/sc_neurocore/world_model/_predictive_world_model.py
| Python | |
|---|---|
74 75 76 77 | |
predict_next_state(current_state, action)
¶
Predict the next latent-state mean.
Parameters¶
current_state : array-like, shape (state_dim,)
Current state estimate.
action : array-like, shape (action_dim,)
Current control input. A scalar is accepted when action_dim=1.
Returns¶
numpy.ndarray, shape (state_dim,)
Conditional mean A x_t + B u_t.
Raises¶
ValueError If an input has an incompatible shape or non-finite value.
Source code in src/sc_neurocore/world_model/_predictive_world_model.py
| Python | |
|---|---|
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | |
predict_next_state_with_cov(current_state, current_cov, action)
¶
Predict the next latent-state mean and covariance.
Parameters¶
current_state : array-like, shape (state_dim,) Current state estimate. current_cov : array-like, shape (state_dim, state_dim) Symmetric positive-semidefinite current covariance. action : array-like, shape (action_dim,) Current control input.
Returns¶
tuple of numpy.ndarray
Mean A x_t + B u_t and covariance A P_t A^T + Q.
Source code in src/sc_neurocore/world_model/_predictive_world_model.py
| Python | |
|---|---|
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | |
forecast(initial_state, actions)
¶
Forecast a deterministic mean trajectory.
Parameters¶
initial_state : array-like, shape (state_dim,) State before the first action. actions : list of array-like Ordered actions, one per returned state.
Returns¶
list of numpy.ndarray Independent state arrays after each action.
Source code in src/sc_neurocore/world_model/_predictive_world_model.py
| Python | |
|---|---|
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | |
forecast_with_cov(initial_state, initial_cov, actions)
¶
Forecast a mean and covariance trajectory.
Parameters¶
initial_state : array-like, shape (state_dim,) State before the first action. initial_cov : array-like, shape (state_dim, state_dim) Initial symmetric positive-semidefinite covariance. actions : list of array-like Ordered actions, one per returned state.
Returns¶
list of tuple of numpy.ndarray
Independent (mean, covariance) pairs after each action.
Source code in src/sc_neurocore/world_model/_predictive_world_model.py
| Python | |
|---|---|
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 | |