estimate ¶
estimate(scene: Any, worlds: int | None = None, seconds: float = 1.0, device: str | None = None, *, measure: bool = False) -> dict[str, Any]
Estimate a run of seconds simulated time in worlds worlds (JSON-ready dict).
Keys: physics_steps_per_world, step_time_s, wall_time_s, world_steps_per_s, real_time_factor, memory_bytes,
compile_s_first_run, counts (per world), solvers, rigid_step (its "fast" row: the rigid fast mode's step, time and
cost, for a scene of free bodies), routes (per object: route, solver, reasons, as Sim.routes()), vbd (the
cloth / soft solver's particles per world, iterations and self-contact), basis.
Wall time is of warm stepping, fitted to measured runs (bench/results/estimate_calib/: robot + water, bins,
an arm, cloth, a pour; 1-64 worlds, CPU and L4): within 1.3x on those 55 rows. Right after a build or reset a GPU
run captures CUDA graphs first (up to 2.65x on a 1 s run); a scene far from those rows can be further off. Memory
on a GPU is what the run needs to capture its CUDA graphs, fitted to 38 L4 rows (memory_rows.json: within
1.2x); many worlds of scanned meshes (YCB, Google Scanned Objects) are not among them. measure=True times a
short real run instead (wall time; no memory). Example: alloy.estimate(scene, 64, 2.0).