---
license: mit
library_name: pytorch
tags:
- world-model
- jepa
- planning
- model-predictive-control
- representation-evaluation
pipeline_tag: robotics
---
VIScore: Diagnosing Planning-Relevant Quality in Latent World Models
**Key results:**
- 🔍 **Covers all four stages that decide planning success**: encoder, predictor, planner, task tolerance
- 🔥 **High correlation with success rate**: pooled ρ +0.90, against +0.82 for raw empowerment
- 💪 **Best calibration across planners and datasets**: below the constant-predictor reference on every pool
- 🚀 **20× faster than the real evaluation**: ~7 s per checkpoint, no environment and no planner rollouts
- 🧩 **Model-agnostic**: three methods (`encode`, `action_embed`, `predict_next`) are the whole interface
- ♻️ **CPU-reproducible**: every table in the paper recomputes in seconds
Available Checkpoints
Each file is a full-object `torch.save` pickle of `jepa.JEPA`: ViT-Tiny encoder + action-conditioned AdaLN transformer predictor, ~15M parameters, 72 MB. Filenames say which model the weights are — `vis-wm_epoch_.ckpt`, `lewm_epoch_.ckpt` (the SIGReg baseline) or `dino-cls_epoch_.ckpt`.
| Path | Contents | Files | Size |
|------|----------|-------|------|
| `vis-wm//seed/` | VIS-WM at the epoch the paper reports, + `config.yaml` | 39 | 0.88 GiB |
| `baselines-lewm/maze2d/seed729/` | SIGReg (LeWM) baseline on MAZE | 3 | 0.07 GiB |
| `pools////` | every checkpoint behind a reported number, plus the calibration pool | 547 | 36.7 GiB |
**VIS-WM**: PushT / Reacher / Two-Room / Cube × seeds 403, 46, 729, plus MAZE at seed 729. Reported epoch per arm — maximum success on the single-seed d=25 evaluation, ties to the later epoch:
| Task | seed 403 | seed 46 | seed 729 |
|------|----------|---------|----------|
| PushT | 9 | 10 | 10 |
| Reacher | 5 | 10 | 4 |
| Two-Room | 5 | 10 | 9 |
| Cube | 6 | 8 | 4 |
| MAZE | — | — | 8 (SIGReg baseline: 10) |
**Pools.** The split is by training run, so no checkpoint in a test pool comes from a run used to
fit anything. Every directory says what its checkpoints are *for*:
| Directory | Ckpt / runs | Which reported number it produces | Evaluation seeds |
|-----------|-------------|-----------------------------------|------------------|
| `pools/development/` | 137 / 14 | block 1 of `tab:viscore`; the constants are fitted here | all available |
| `pools/heldout/` | 103 / 33 | block 2 -- the headline test, runs disjoint from development | 5501, 60601, 90210 |
| `pools/heldout-method/` | 3 / 3 | block 3, our DINO-CLS arms (the other 27 are other groups', not re-hosted) | its own |
| `pools/heldout-dataset/` | 20 / 2 | block 4 -- the unseen MAZE task | its own |
| `pools/cube-reference/` | 50 / 5 | the parenthesised Cube column, and nothing else | 5501, 60601, 90210 |
| `pools/calibration-fit/` | 232 / 47 | *no* reported number: these fit the frozen map blocks 3--4 apply | all available |
So: **340 checkpoints** produce every number in the paper (313 hosted here + 27 fetched with
`reproduce/download_external.py`), **572** if you also want to refit the frozen calibration map
from weights, and **0** if you only want to recompute the tables from the shipped metric values.
Per-task counts in the two ranked pools (PushT / Reacher / Two-Room): development 57 / 50 / 30,
held-out 27 / 44 / 32.
`heldout` absorbed what earlier versions reported as a separate `terminal` pool: 14 of that pool's
17 runs were also in the held-out fold, and restricted to converged epochs its labels no longer
resolve individual checkpoints.
`cube-reference` is separate from `heldout` because Cube entered no fold. Its label spread does not
exceed its own binomial standard error, so nothing there is rankable; the paper prints its
correlation in parentheses and excludes it from every pooled and calibration number. These
checkpoints are published because that exclusion argument is measured on them.
`calibration-fit` is the part of the 472-cell calibration pool that is not already in
`development` or `heldout` (both of which are subsets of it). Its checkpoints enter no correlation
and no reported error -- they only determine the metric-to-success map that the two transfer blocks
apply without refitting. They are published so that a competing metric can be calibrated on the
same 472 cells.
Three SIGReg Two-Room runs landed in neither fold and are not released, which is why Two-Room
carries no SIGReg checkpoint in `heldout`.
The rest of the held-out-method pool is other groups' released checkpoints (Qantara, RC-aux,
INTACT), which are not re-hosted here; fetch them with `reproduce/download_external.py`.
`pools/pool_manifest.csv` gives each checkpoint's pool membership, success labels and seven metric values; `pools/pool_assignment.csv` gives run → fold.
Training
LeWM architecture with the VISReg regularizer, λ = 4.5. AdamW, linear warmup + cosine decay, 10 epochs, batch 128, lr 1e-4. Two-Room uses `history_size=1`, the other tasks 3.
Usage
Score a checkpoint
```python
from viscore import score_checkpoint
f = score_checkpoint("vis-wm/pusht/seed403/vis-wm_epoch_9.ckpt",
"probes/probe_pusht.npz", task="pusht")
print(f) # VIS + veracity / influence / sobriety + their inputs
```
The pickle names `jepa` and `module` as top-level modules; `viscore` binds the shipped copies automatically, so no LeWorldModel checkout is needed.
Download with huggingface_hub
```python
from huggingface_hub import hf_hub_download, snapshot_download
# one checkpoint
path = hf_hub_download(repo_id="BooBooWu/viscore",
filename="vis-wm/pusht/seed403/vis-wm_epoch_9.ckpt")
# a whole tree
snapshot_download(repo_id="BooBooWu/viscore", allow_patterns=["vis-wm/*"])
```
Build a probe
A probe is one frozen slice of training data (`rng(0)`, 300 episodes, frameskip 5) shared by every checkpoint compared.
```bash
viscore probe --tasks pusht --data-home $STABLEWM_HOME --out-dir probes
viscore score --task pusht --probe probes/probe_pusht.npz \
--run-dir vis-wm/pusht/seed403 --epochs 9 --csv out.csv
```
Evaluation
Both of the paper's main tables recompute from files shipped in the [GitHub repo](https://github.com/HaiyuWu/viscore) — no GPU, dataset or checkpoint download:
```bash
git clone https://github.com/HaiyuWu/viscore && cd viscore && pip install -e .
python reproduce/tables.py # metric vs success, three pools
python reproduce/planning_tables.py --strict # planning tables, gated against published values
```
Notes: peak epoch = maximum evaluation success rate, ties to the later epoch. Cube is reported in parentheses and excluded from pooled and calibration columns. All published labels and sobriety probes use CEM. A single 50-episode evaluation has a success sd of ≈6 points.
Citation
```bibtex
@article{wu2026viscore,
title = {VIScore: Diagnosing Planning-Relevant Quality in Latent World Models},
author = {Wu, Haiyu and Balestriero, Randall and Levine, Morgan},
journal = {arXiv preprint arXiv:2608.11174},
year = {2026},
eprint = {2608.11174},
archivePrefix = {arXiv}
}
```
Architecture and training recipe from [LeWorldModel](https://github.com/lucas-maes/le-wm); regularizer from [VISReg](https://github.com/HaiyuWu/visreg).
License
This project (code and checkpoints) is released under the [MIT License](https://opensource.org/licenses/MIT).