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] = valueView on GitHub (pinned to 24c60942c5)
Solutions
- Match static_args exactly to the factory's parameter names as shown in the error message
- Rename the factory parameter or the static_args entry so they agree
- 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
- Write static_args next to the factory definition
- Add a unit test asserting static_args subset of signature
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
- unknown optim={optim!r}
- type checking expression %s failed: invalid argument type: %
- Non-optional parameter %s must be declared before optional p
- Duplicated argument name %s
- field name %s is not found in struct tuple class %s
AI-assisted analysis of xai-org/x-algorithm@24c60942c5 (2026-08-28).
Data as JSON: /api/errors/53190899486696b1.
Report an issue: GitHub.