- GitHub Release v1.0.0 created from the existing tag with the ChangeLog entry as notes and the 25 wheels and the sdist from the tag's workflow run attached
- wheels.yml: the publish job creates the GitHub Release on every v* tag, wheels and sdist attached, notes auto-generated; a tag alone never created one
- Released: tag v1.0.0, wheels for Python 3.10 to 3.14 on Windows x64, Linux x86_64 and aarch64, and macOS x86_64 and arm64, plus the sdist, published to PyPI as hypercube-worldmodel 1.0.0 through the trusted publisher with digital attestations
- Repository made public with a fresh history; README badges for the wheels build, PyPI, and Python versions on both pages
- Python planner adapter matches the DMC protocol: rollout takes raw actions and encode_action's the block once; action_space.low / .high for CEM. State-based DMC is the documented path; paint_stripes is not a pixel encoder
- Python SDK: pip package hypercube-worldmodel, import hypercube_worldmodel, with WorldModel, Decoder, and paint_stripes; every batched call loops in C++ with the GIL released; fit with an optional validation set; save and load share the C++ file formats, pickle for convenience; docs/Python_SDK.md, python/README.md, two examples, a 34-test suite, and a cibuildwheel workflow. The version is one string in python/hypercube_worldmodel/_version.py, checked at compile time against WorldModel::kVersion
- WorldModel::RequestedPasses returns encoder.passes as given to Create, for hosts that serialize their own config
- Decoder gains Weights, LoadWeights, Grad, and AddGrad, matching WorldModel
- API: FieldSize and CodeSize on WorldModel and Decoder, k on both configs; Predictor knobs nested as WorldModelConfig.predictor including training; EncoderConfig.verbose dropped; WorldModel::kVersion; RealizedSpectralRadius without a Get prefix; Encoder::Create exceptions named
- LCN Forward and Backward run the vertex loop innermost over a weight layout of depth, axis, tap, vertex, so the weights of one tap are contiguous and the gradient scatter is no longer a strided read-modify-write: about a fifth off Forward and close to half off a training step from dim 6 to 12. Same function, checked against the old code with identical weights. The layout differs from HypercubeLCN, so weights do not move between the two without a transpose. The same seed now draws a different net; the results tables in docs predate this and re-run to different numbers
- ThreadPool constructor is exception-safe: if a worker thread cannot be started, the workers already running are stopped and joined before the exception propagates
- Encoder::Create rejects a non-finite spectral_radius, leak_rate, or input_scaling, and WorldModel::Create a non-finite action_scale, with a bit-level test that holds under fast-math; the main smoke test covers all four
- Encoder accepts dim up to 24, matching the LCN; every cube in the family now has the same ceiling
- C++ SDK: docs/CPP_SDK.md in the family format, with terms defined inline, the cycle, the API map, the replica recipe, encode costs, and a section on driving the model from a planner, including the DeepMind Control Suite latent world model convention
- WorldModel: Save writes encoder.passes as given to Create, not the resolved view T, so Load rebuilds the action encoder with the same T; the main smoke test round-trips a passes = 0 model and compares E(x), E(a), and Predict
- WorldModel: z_max defaults to 0, meaning k+1, instead of a fixed depth bound to the default k
- WorldModel: Rollout chains Predict over H action codes into caller storage, H + 1 view codes out
- WorldModel: Save and Load carry the config and the Predictor weights; the encoders are rebuilt from their seeds
- PaintStripes: a free function that lays a short state or action vector onto a field as contiguous stripes
- examples/quick_start.cpp: the SDK quick start as a CMake target, a point on a plane moved by a bounded velocity; test mse/power about one percent of identity, and a save/load round trip check
- CMake project VERSION 1.0.0
- README SDKs section points at the guide
- Decoder is a first-class SDK class beside WorldModel: its own section in docs/CPP_SDK.md, both targets in Build and link, README shows both; the Python SDK will carry the same two classes
- Terrain walker table re-run at k = 5, 6, 7 with action_scale 0.33 and 1600 epochs: test mse/power 0.108 / 0.077 / 0.072, wrong/true 3.2 / 4.7 / 4.7, argmin==a 93.6 / 98.9 / 99.3 %
- Docs: world_model.md gains a plain-language section on the action path; terrain_walker.md splits the action picture and its code from the Predictor cube layout
- WorldModel: action_scale knob, a multiplier on E(a) as Pack lays it on the extra bit-face; the stored action code is untouched. TerrainWalkerTest exposes it as kActionScale and prints both halves of the P input
- TerrainWalkerTest prints argmin==a to two decimals
- WorldModel: E(a) comes from a second Encoder on a k-cube, same knobs and seeds as the view encoder; EncodeAction takes a 2ᵏ field and writes its whole 2ᵏ output. k must be at least 5
- ActionField paints a rows × cols strip, so the terrain walker's action is a 2ᵏ half-plane instead of an N-float one; the four heading codes now have similar strength
- WorldModelTest dummy action field is 2ᵏ long through EncodeAction
- Docs: world_model.md, terrain_walker.md, world_model_test.md describe the action encoder; terrain walker table re-run at k = 5, 6, 7
- Add TerrainWalkerTest: 64×64 elevation map with barriers and a goal, a 16×16 crop as the view, wander-then-acquire walks, and a WorldModel trained on E(x) cat E(a) pairs across many maps
- Add the swap check to TerrainWalkerTest: the same E(x) through P with all four headings; fail if the wrong heading does not score worse than the true one, and print wrong/true, spread, and argmin==a
- Correct docs/terrain_walker.md: keep/change and straight/turn slices cannot show whether P reads a; the swap check shows it does
- Terrain elevation is three 2D sines (a uniform-per-cell trial was reverted); print stage scales for view, action field, and P input
- Add per-slice next-power and the keep vs change and straight vs turn splits to TerrainWalkerTest
- WorldModel: Predict(z, a) packs E(x) cat E(a) onto a (k+1)-cube; loss and return use the first subcube only
- Add WorldModel: frozen Encoder plus trained Predictor with the k-cut inside; Encode writes into caller storage
- Add WorldModelTest: train on a mix of two-sine songs and score a held-out mix, with a Predictor replica thread pool, wall times, and one score line per split
- Add Predictor: forward map from a k-face to the next k-face, with LCN training and JepaPredictorTest
- Rename CompressionTest2 to JepaEncoderTest with shared run banners; add encoder drive, depth, span, and epoch knobs to CompressionTest
- Docs: terrain walker design, world model and world model test, dimensional vs semantic compression, JEPA encoder and predictor tests, compression test k-sweep