PhysEvolve: Verifier-grounded Self-evolution for Physical Reasoning with Executable Worlds
Organizations: MMLab, The Chinese University of Hong Kong
Abstract
Physical reasoning underpins how embodied systems understand and act in the physical world, yet vision-language models (VLMs) remain unreliable on questions about dynamics and physical causality. Progress is critically constrained by the scarcity of grounded counterfactual training data, as observational videos capture only the factual trajectory that occurred. The self-evolving paradigm offers a route beyond fixed datasets by enabling models to construct their own training problems. Extending this paradigm to physics, however, requires an external source of truth that can both validate model-proposed environments and verify alternative physical outcomes under intervention. We introduce \physevolve{}, a verifier-grounded self-evolving framework that trains VLMs for causal physical reasoning from model-proposed executable worlds and simulation-authored tasks. At each round, a shared VLM proposes executable world programs and evidence schemas; a deterministic physics engine freezes each valid world, simulates matched baseline and body-elided counterfactual branches, and synthesizes discrete, answer-bound visual tasks. Exact verifier feedback from task solving updates both the shared policy via GRPO and an adaptive curriculum over physical intents. Starting from Qwen3-VL-8B-Instruct, \physevolve{} achieves targeted gains across PhysBench, CausalPhys, and ContPhy without human intervention data, improving PhysBench Throwing by points and ContPhy Counterfactual Removal and Goal-Pit by and points. These gains concentrate on interaction-sensitive and altered-world questions, demonstrating zero-shot transfer of causal principles to unseen complex dynamics (cloth, fluid, soft bodies) and real-world video.
Figures & tables
| Training Path | Realized Exposure | CausalPhys | ContPhy | ||||||
|---|---|---|---|---|---|---|---|---|---|
| Configuration | Branch Sim. | CF/Inv | Groups | Rollouts | Ovr. | Interv. | Ovr. | CF-Rm. | Goal-Pit |
| PhysEvolve | On | On | 2,167 | 8,668 | 54.50 | 45.03 | 39.54 | 51.64 | 44.44 |
| w/o branch-enabled path | Off | Off | 1,990 | 7,960 | 51.42 | 41.71 | 37.28 | 43.44 | 21.11 |
| Difference | – | – | +177 | +708 | +3.07 | +3.32 | +2.26 | +8.20 | +23.33 |
| Training updates | CausalPhys | ContPhy | ||||
| Configuration | Proposer | Solver | ACC | Parse rate | ACC | Parse rate |
| PhysEvolve | 54.50 | 97.84 | 39.54 | 100.00 | ||
| w/o Proposer-role updates | – | 15.01 | 26.07 | 17.85 | 99.90 | |
| – | – | |||||
Appendix figures & tables20 assets
Supplementary material from the paper’s appendix.
Appendix
| Capability | Calls | Effect |
|---|---|---|
| Geometry | add_box , add_sphere , add_cylinder , add_capsule , add_plane | Register fixed or free rigid bodies and visual/material attributes. |
| Initial state | set_velocity , set_rotation | Set linear/angular velocity or a normalized orientation quaternion. |
| Constraints | add_hinge , add_slide , add_spring | Add one-DOF joints or a damped spatial spring between existing bodies. |
| Environment | set_gravity , set_duration , add_camera | Set the execution horizon, gravity vector, and look-at camera. |
| Finalization | freeze | Add default ground/camera if absent and snapshot a SceneDef . |
| Field | Enforced contract |
|---|---|
| Names | Pattern [a-z_][a-z0-9_]* ; one namespace across bodies, joints, springs, and cameras; ground/world/sky reserved ( ground is allowed for the plane). |
| Body centers and count | and m; a plane may use . At least one body after finalization and at most 20 dynamic bodies; fixed scene furniture does not consume the dynamic-body cap. |
| Geometric size | Each non-plane radius/half-size/half-height in m; each plane half-size is at least m and has no API upper cap. |
| Material | Mass kg, sliding friction , restitution , and every RGBA channel . |
| Initial state | Each linear and angular velocity component has magnitude at most ; orientation is a nonzero quaternion and is normalized. |
| Joint | Nonzero axis; optional limits satisfy ; parent and child differ; only the parent may be world ; one explicit joint per child. |
| World class | Required role fields | Served active families |
|---|---|---|
| Throwing | balls , three or more fixed platforms , two or more removable walls , region_kind , and three destination regions derived from platform gaps | final destination; current-run judgment; counterfactual destination; inverse intervention |
| Collision | dynamic target ; trigger ; exactly four dynamic movers ; relation_pair={a,b,expected} | final state; final relation; motion attribution |
| Motion | dynamic motion_target ; optional speed_pair={a,b} | motion-state change, including forward, speed-profile, and pairwise surface forms |
| Evidence key | Elided bodies | Readout |
|---|---|---|
| none | baseline settled region | |
| wall A and all non-query balls | altered settled region | |
| wall B and all non-query balls | altered settled region | |
| walls A+B and all non-query balls | altered settled region |
| Family | Representative item and option semantics | Evidence, binding, and suppression |
|---|---|---|
| throwing_final_destination | “What is the final destination of the [referent]?” Regions use {left pit, right pit, center pit, none}; an unsettled layout uses {left, right, neither, none}. | Baseline only. A region requires final speed m/s, a non-ejected status, exactly one derived gap interval, and final height no more than m above the platform tops. A settled region binds that region; otherwise neither is bound rather than guessed. |
| throwing_current_run_judgment | “Will the [referent] eventually drop into the left pit?” Options are {Yes, No, Can not answer, Uncertain}; a second surface asks whether it reaches a different destination region than a named one. | Baseline only. Yes iff the settled-region readout equals the named target; otherwise No , including an unsettled/ejected readout. Target choice alternates between matching and nonmatching regions across ball indices. |
| counterfactual_destination | “If we removed the [wall] and other balls, which pit would the [referent] drop into?” Options are {left, right, center, none}. | Matched baseline and one elision branch. Admit only when the branch is available, settles in one region, and differs from the baseline region. The branch region is the answer; failed, unsettled, or unchanged branches suppress the item. |
| inverse_intervention | “What can we do to make the [referent] drop into the [target] pit?” Options are {remove A + other balls, remove B + other balls, remove both + other balls, none}. | Baseline plus all three A/B/A+B branches. In a first fixed-order pass, the first non-baseline target reached by exactly one branch binds that intervention. Only if no target has a unique achiever, a second pass binds none to the first non-baseline target reached by no branch. A multiply achieved target is skipped; missing branches suppress. |
| Family | Representative item and option semantics | Evidence, binding, and suppression |
|---|---|---|
| collision_final_state | “Which phrase best describes the final pose of the [target]?” Options are {standing upright, leaning, lying horizontally, floating}. | Terminal status and speed. Ejected with binds floating; fallen binds lying; moving with speed binds leaning; stable with speed binds standing. Other/borderline combinations suppress the item. |
| collision_final_relation | “Which phrase best describes the interaction between A and B during the run?” Options are {ends in contact, never touches, passes near without touching, ends vertically separated without contact}; a binary surface uses {Yes, No, Sometimes, Uncertain}. | Contact is trajectory-level: any recorded pairwise contact dominates and binds the contact semantic (canonically rendered as “ends in contact”). Otherwise vertical separation requires final and lateral gap m; pass-by requires initial or final distance m; the remainder is no-contact. The computed class must equal the manifest declaration or the family is suppressed. |
| motion_attribution | “Which object experienced a change in motion as a result of the [trigger]?” The four options are the manifest’s four mover bodies. | Candidates must be distinct, dynamic, and different from the trigger. Eligibility requires trigger contact and velocity-change magnitude m/s; the argmax is bound only if its lead over a second eligible candidate is at least m/s. The absence of an eligible candidate, or a lead below this margin, suppresses the item. |
| motion_state_change | Three surfaces: motion change {stop, slow but moving, speed up, same}; speed profile {accelerate, decelerate, accelerate then decelerate, constant}; pairwise semantics {final tie, final A faster, final B faster, non-tied order reversal}. The canonical middle options use “consistently faster” wording. | Require target initial speed m/s. Stop uses final speed ; speed-change/profile boundaries use an absolute m/s gap; pairwise order uses m/s. Crossover is bound only when both endpoint orders are non-tied and reverse; otherwise the final order is bound. The pairwise surface requires both declared bodies. |
| Execution | Baseline | Remove A | Remove B | Remove A+B |
|---|---|---|---|---|
| Stored semantic | ||||
| Required for counterfactual(A) | yes | yes | no | no |
| Required for inverse | yes | yes | yes | yes |
| Component | Reported configuration |
|---|---|
| Failure scale | |
| Instance-level tent coefficient | held at (validity/diversity dominate instance scoring) |
| Intrinsic weight | ; structural diversity only |
| Repair factors | minor; schema; geometry |
| Near-copy control | similarity capped at before repair and family scaling |
| Exact/within-group duplicate proposal | pre-family reward override |
| Component | Configuration |
|---|---|
| Base and horizon | Qwen3-VL-8B-Instruct; 100 steps; checkpoints at 25/50/75/100 |
| Run multiplicity | One training run per reported configuration; no training-seed sweep |
| Compute | 4 GPUs; 32 Ray CPUs; 4 executor workers |
| Proposer sampling | intent groups per step; programs per intent; at least one throwing, collision, and motion intent per step |
| Solver retention and rollout | At most 5 items per scene and 32 groups per step; 4 answers per group; rollout chunk size 8 |
| Visual variants | One additional color permutation per accepted baseline world; one executor camera; 32 rendered frames at |
| Benchmark | Items | Visual input | Generation | Scoring |
|---|---|---|---|---|
| PhysBench | 9,802 | 8 uniform frames | greedy; 2,048 tokens | official prompts, normalization, and scorer |
| CausalPhys | 3,057 | 5 uniform frames | CoT; greedy; 512 tokens | final A–D answer; unparsed output is incorrect |
| ContPhy | 1,950 | 10 uniform frames | greedy; 64 tokens | normalized MC or normalized open-response exact match |
| View ( ) | Base | Naive | vs. Base | PhysEvolve | vs. Base |
|---|---|---|---|---|---|
| Overall (9,802) | 52.92 | 52.39 | 53.47 | ||
| Dynamics (2,932) | 44.37 | 44.44 | 45.29 | ||
| Throwing (410) | 46.10 | 45.85 | 54.88 | ||
| Collision (650) | 38.62 | 38.77 | 40.77 | ||
| Motion (1,433) | 54.71 | 55.48 | 56.45 | ||
| Prediction (1,430) | 42.17 | 42.87 | 43.71 |
| Taxonomy level | View ( ) | Base | PhysEvolve | |
|---|---|---|---|---|
| Task | Dynamics (2,932) | 44.37 | 45.29 | +0.92 |
| Relationships (2,088) | 61.97 | 63.46 | +1.48 | |
| Scene (2,240) | 45.13 | 45.62 | +0.49 | |
| Property (2,542) | 62.20 | 61.61 | ||
| Dynamics subtype | Throwing (410) | 46.10 | 54.88 | +8.78 |
| Collision (650) | 38.62 | 40.77 | +2.15 |
| PhysBench | CausalPhys | ContPhy | ||||||||||||
| Model | Ovr. | Dyn. | Throw. | Coll. | Motion | Pred. | Judg. | Reason. | Ovr. | Antic. | Interv. | Ovr. | CF-Rm. | Goal-Pit |
| InternVL2.5-8B | 43.8 | 42.1 | 40.0 | 38.9 | 27.7 | 43.0 | 32.7 | 27.4 | 50.2 | 51.5 | 42.4 | 31.4 | 48.4 | 23.3 |
| Llama-3.2-11B-Vision | 38.7 | 43.2 | 36.6 | 35.5 | 27.2 | 44.1 | 30.8 | 29.6 | 44.2 | 44.1 | 40.1 | 20.7 | 0.0 | 20.0 |
| Pixtral-12B | 46.9 | 44.6 | 41.2 | 39.2 | 35.2 | 46.9 | 31.0 | 35.1 | 50.2 | 53.0 | 44.5 | 21.5 | 40.2 | 13.3 |
| Qwen2.5-VL-7B | 49.4 | 44.3 | 44.4 | 36.5 | 50.6 | 44.1 | 33.1 | 36.5 | 52.6 | 56.5 | 45.7 | 25.9 | 11.5 | 24.4 |
| Qwen3-VL-32B | 60.9 | 48.7 | 47.1 | 46.0 | 83.5 | 48.0 | 44.3 | 51.4 | 58.9 | 61.9 | 52.9 | 41.0 | 45.9 | 26.7 |
| Benchmark view ( ) | Base | PhysEvolve | |
| CausalPhys Overall (3,057) | 53.94 | 54.50 | |
| Anticipation (896) | 55.92 | 58.37 | |
| Goal orientation (637) | 50.71 | 49.61 | |
| Intervention (573) | 42.76 | 45.03 | |
| Perception (951) | 60.99 | 59.83 | |
| ContPhy Overall (1,950) | 37.08 | 39.54 |
| Task | Base | Naive | w/o branch | PhysEvolve | |
|---|---|---|---|---|---|
| ContPhy | |||||
| Counterfactual Removal | 122 | 44.26 | 43.44 | 43.44 | 51.64 |
| Goal-Pit | 90 | 20.00 | 25.56 | 21.11 | 44.44 |
| CausalPhys / Anticipation | |||||
| Collision Prediction | 300 | 53.67 | 50.67 | 54.67 | 51.67 |
| Fluid Flow | 200 | 47.50 | 60.50 | 35.50 | 58.50 |
| Task | Both correct | Ours only | Base only | Neither | (pp) | |
|---|---|---|---|---|---|---|
| Overall | 9802 | 4487 | 754 | 700 | 3861 | +0.55 |
| Throwing | 410 | 156 | 69 | 33 | 152 | +8.78 |
| Judgment | 767 | 220 | 87 | 48 | 412 | +5.08 |
| Motion | 1433 | 730 | 79 | 54 | 570 | +1.74 |