xai-org/x-algorithm · error · ValueError

`static_args` must specify a subset of `inner_factory`'s par

Error message

`static_args` must specify a subset of `inner_factory`'s parameters. Given `static_args`: {static_args}. `inner_factory` parameters: {set(inner_signature.parameters.keys())}

What it means

inject_hyperparams wraps an optax optimizer factory so that named hyperparameters (learning_rate, etc.) are traced/scheduled from outside instead of baked in. It validates that every name in static_args is an actual parameter of the factory function; unknown names raise this ValueError listing both sets.

Source

Thrown at phoenix/xrex/optimizers/optim.py:42

def _instantiate(x: BaseSchedule | Any):
    return x.make() if isinstance(x, BaseSchedule) else x


class InjectHyperparamsState(NamedTuple):
    count: jnp.ndarray
    hyperparams: dict[str, chex.Numeric]
    inner_state: optax.OptState


def inject_hyperparams(
    inner_factory: Callable[..., optax.GradientTransformation],
    static_args: Union[str, Iterable[str]] = (),
) -> Callable[..., optax.GradientTransformationExtraArgs]:
    static_args = {static_args} if isinstance(static_args, str) else set(static_args)
    inner_signature = inspect.signature(inner_factory)

    if not static_args.issubset(inner_signature.parameters):
        raise ValueError(
            "`static_args` must specify a subset of `inner_factory`'s parameters. "
            f"Given `static_args`: {static_args}. `inner_factory` parameters: "
            f"{set(inner_signature.parameters.keys())}"
        )

    @functools.wraps(inner_factory)
    def wrapped_transform(*args, **kwargs) -> optax.GradientTransformation:
        bound_arguments = inner_signature.bind(*args, **kwargs)
        bound_arguments.apply_defaults()

        sched_hps, numeric_hps, other_hps = {}, {}, {}
        for name, value in bound_arguments.arguments.items():
            if name in static_args or isinstance(value, bool):
                other_hps[name] = value
            elif callable(value):
                sched_hps[name] = value
            elif isinstance(value, (int, float, chex.Array)):
                numeric_hps[name] = value

View on GitHub (pinned to 24c60942c5)

Solutions

  1. Match static_args exactly to the factory's parameter names as shown in the error message
  2. Rename the factory parameter or the static_args entry so they agree
  3. Use inspect.signature on your factory in a test to assert static_args stays valid

Example fix

# before
@inject_hyperparams
def factory(learning_rate, b1):
    ...
# invoked with static_args={'lr'}
# after
static_args={'learning_rate'}  # or rename the parameter to lr
Defensive patterns

Strategy: validation

Validate before calling

import inspect
sig = inspect.signature(inner_factory)
assert set(static_args) <= set(sig.parameters), 'static_args not in factory signature'

Type guard

def static_args_valid(factory, static_args) -> bool:
    return set(static_args) <= set(inspect.signature(factory).parameters)

Prevention

When it happens

Trigger: Calling inject_hyperparams(factory, static_args="eps") when factory has no eps parameter; passing a schedule name that was renamed in a newer version of the factory (e.g. 'lr' vs 'learning_rate').

Common situations: Upgrading phoenix/xrex or optax where parameter names changed; copy-pasting an inject_hyperparams call from another optimizer factory with a different signature.

Related errors


AI-assisted analysis of xai-org/x-algorithm@24c60942c5 (2026-08-28). Data as JSON: /api/errors/53190899486696b1. Report an issue: GitHub.