Forward x_scale through the sysid mujoco backend.

mujoco.minimize.least_squares now supports x_scale natively, so the
sysid wrapper becomes a thin pass-through. 'jac' is adaptive per
iteration (was static at x0).
This commit is contained in:
Kevin Zakka
2026-05-26 17:13:37 -07:00
parent 5ae677f026
commit d75b709892
+18 -3
View File
@@ -26,6 +26,9 @@ import scipy.optimize as scipy_optimize
import scipy.special
XScale = Literal["jac"] | np.ndarray | float
def _scipy_least_squares(
x0: np.ndarray,
residual_fn: Callable[..., Any],
@@ -83,6 +86,7 @@ def _mujoco_least_squares(
x0: np.ndarray,
residual_fn: Callable[..., Any],
bounds: tuple[np.ndarray, np.ndarray],
x_scale: XScale = 1.0,
**kwargs,
) -> scipy_optimize.OptimizeResult:
"""Run MuJoCo's native least_squares optimizer."""
@@ -91,16 +95,17 @@ def _mujoco_least_squares(
else:
verbose = mujoco_minimize.Verbosity.SILENT
max_iter = kwargs.pop("max_iters", 200)
x, log = mujoco_minimize.least_squares(
x0=x0,
bounds=bounds,
residual=residual_fn,
verbose=verbose,
max_iter=max_iter,
x_scale=x_scale,
**kwargs,
)
# If verbose, return the full optimization log.
extras = {}
if verbose == mujoco_minimize.Verbosity.FULLITER:
extras["objective"] = [entry.objective for entry in log]
@@ -155,8 +160,18 @@ def optimize(
optimizer: Backend — ``"mujoco"`` (default), ``"scipy"``, or
``"scipy_parallel_fd"`` (scipy with MuJoCo finite-difference Jacobian).
verbose: If True, log parameter comparison table after optimization.
**optimizer_kwargs: Forwarded to the backend (e.g. ``max_iters``,
``verbose``, ``loss``).
**optimizer_kwargs: Forwarded to the backend. Common ones:
* ``max_iters``: maximum number of optimizer iterations.
* ``verbose``: per-backend verbosity flag (separate from this
function's ``verbose``).
* ``loss``: scipy loss function name (scipy backends only).
* ``x_scale``: per-parameter scaling. ``"jac"`` is adaptive
``D_i = 1/||J(:,i)||`` per iteration; an explicit array or
positive scalar is used as ``D`` directly. Defaults: ``"jac"``
for scipy backends, ``1.0`` (no scaling) for the mujoco backend.
See :func:`scipy.optimize.least_squares` and
:func:`mujoco.minimize.least_squares` for details.
Returns:
``(opt_params, opt_result)`` — the optimized ParameterDict and a