Skip to content

Metrics

torch_world.metrics implements the metrics the JEPA papers report. Every function takes plain tensors (features, predictions, similarities), so it works with any model.

question metric reported by
Do frozen features encode a quantity? linear_probe (accuracy for classes, R² for regression) I-JEPA, LeJEPA, LeWM (physical probing)
Same, with no training at all knn_accuracy (weighted k-NN, cosine) DINO, LeJEPA
Same, from all tokens of a video or image attentive_probe V-JEPA, V-JEPA 2
Has the representation collapsed? rankme (effective rank, no labels) RankMe; collapse checks in SSL
Will linear probes work, without labels? lidar (effective rank of the LDA matrix over views) LiDAR, designed for JEPAs
How fast do imagined latents drift? rollout_error per step V-JEPA 2-AC (L1), DINO-WM and LeWM (MSE)
How good are decoded predictions? ssim, psnr DINO-WM
How close are two point sets? chamfer_distance DINO-WM (rope, granular)
Does retrieval find the right item? recall_at_k, topk_accuracy VL-JEPA (retrieval, zero-shot classification)
How often does the robot succeed, and how sure are we? success_rate (with a Wilson interval) DINO-WM, LeWM, V-JEPA 2-AC report the rate; the interval is added here
How fast does it get there? first_success (steps to success) time to goal, a common efficiency measure
How close does it get? progress (fraction of the start distance closed) partial credit for failed episodes
How direct is the path? spl (success weighted by path length) Anderson et al. 2018, standard in embodied navigation
How smooth are the commands? smoothness (change between consecutive actions) flags jittery commands from sampling planners
Push-T score PushT.coverage (overlap with the goal region) Diffusion Policy's Push-T score

Protocols that run a model and then apply these metrics live in torch_world.evaluation: goal_reaching for planners and vqa for question answering.

Probing frozen features

from torch_world import metrics

with torch.no_grad():
    z = encoder(images)                          # (N, D)
probe = metrics.linear_probe(z[:4000], y[:4000], z[4000:], y[4000:])
probe.score, probe.predictions                   # R² for float targets, accuracy for class ids
metrics.knn_accuracy(z[:4000], labels[:4000], z[4000:], labels[4000:], k=20)
metrics.rankme(z)                                # from 1 (collapsed) to D

Class probes fit multinomial logistic regression with L-BFGS; regression probes are solved in closed form. Both standardize features and apply a small L2 penalty, ridge. For video or patch features, attentive_probe(tokens, ...) trains a cross-attention pooler on (N, T, D) tokens instead, which can find the tokens that matter.

lidar needs several views of each sample, (N, Q, D), for example the embeddings of Q crops of N images.

Prediction quality of world models

with torch.no_grad():
    real = model.encode(pixels)                  # (B, T, ...) encodings of the real frames
    imagined = model.rollout(real[:, :1], actions[:, : T - 1])
metrics.rollout_error(imagined, real)            # (T,), L1 per step; p=2 for MSE

Compare against the "nothing changes" baseline, real[:, :1].expand_as(real): a useful model stays well below it. When latents can be decoded to images (PixelPatches.unpatchify, or a trained decoder), ssim and psnr score each predicted frame.

Robotics and control

evaluation.goal_reaching records everything these measures need (states, per-step success, actions, planning time), and its result prints them as one table per policy:

from torch_world import evaluation, plots

results = evaluation.goal_reaching(env, policies, start, goal, steps=30)
print(results)          # success [95% CI], reached, steps, final distance, progress, SPL, smoothness, ms / step
results.summary()       # the same, as a dict per policy
plots.bars({"Push-T": results.intervals()}, xlabel="success rate", baseline="random actions")
measure meaning
success final success rate with its 95% Wilson interval: with 16 episodes, 50% means anything from 28% to 72%, so compare intervals, not points
reached share of episodes that satisfied the goal at any step, even if they drifted away afterwards. OGBench ends an episode at the first success, so this is the column comparable to OGBench success rates
steps mean steps to first reach the goal, over the episodes that did
final distance median distance to the goal at the end (meters in the MuJoCo environments)
progress mean fraction of the start distance closed: partial credit for failures
SPL success weighted by path length of what the task moves (env.object_position): the cube on the table plane for pick-and-place, the gripper in 3D for reach. A detour twice too long counts one half. Push-T has no SPL: its goal includes an angle, which a path length cannot measure; coverage scores it instead
smoothness mean change between consecutive actions; sampling planners like CEM tend to jitter
ms / step wall time of one policy call, the planning cost LeWM compares against DINO-WM
coverage for Push-T, the best overlap of the block with the goal T over the episode, the score of Diffusion Policy

Environments provide distance and success; object_position (for SPL) and coverage are used when present.