{"record":{"id":"53190899486696b1","repo":"xai-org/x-algorithm","slug":"static-args-must-specify-a-subset-of-inner-fact","errorCode":null,"errorMessage":"`static_args` must specify a subset of `inner_factory`'s parameters. Given `static_args`: {static_args}. `inner_factory` parameters: {set(inner_signature.parameters.keys())}","messagePattern":"`static_args` must specify a subset of `inner_factory`'s parameters\\. Given `static_args`: (.+?)\\. `inner_factory` parameters: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"phoenix/xrex/optimizers/optim.py","lineNumber":42,"sourceCode":"def _instantiate(x: BaseSchedule | Any):\n    return x.make() if isinstance(x, BaseSchedule) else x\n\n\nclass InjectHyperparamsState(NamedTuple):\n    count: jnp.ndarray\n    hyperparams: dict[str, chex.Numeric]\n    inner_state: optax.OptState\n\n\ndef inject_hyperparams(\n    inner_factory: Callable[..., optax.GradientTransformation],\n    static_args: Union[str, Iterable[str]] = (),\n) -> Callable[..., optax.GradientTransformationExtraArgs]:\n    static_args = {static_args} if isinstance(static_args, str) else set(static_args)\n    inner_signature = inspect.signature(inner_factory)\n\n    if not static_args.issubset(inner_signature.parameters):\n        raise ValueError(\n            \"`static_args` must specify a subset of `inner_factory`'s parameters. \"\n            f\"Given `static_args`: {static_args}. `inner_factory` parameters: \"\n            f\"{set(inner_signature.parameters.keys())}\"\n        )\n\n    @functools.wraps(inner_factory)\n    def wrapped_transform(*args, **kwargs) -> optax.GradientTransformation:\n        bound_arguments = inner_signature.bind(*args, **kwargs)\n        bound_arguments.apply_defaults()\n\n        sched_hps, numeric_hps, other_hps = {}, {}, {}\n        for name, value in bound_arguments.arguments.items():\n            if name in static_args or isinstance(value, bool):\n                other_hps[name] = value\n            elif callable(value):\n                sched_hps[name] = value\n            elif isinstance(value, (int, float, chex.Array)):\n                numeric_hps[name] = value","sourceCodeStart":24,"sourceCodeEnd":60,"githubUrl":"https://github.com/xai-org/x-algorithm/blob/24c60942c5c5fdad3a6addffb4c6e6d2f228f04f/phoenix/xrex/optimizers/optim.py#L24-L60","documentation":"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.","triggerScenarios":"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').","commonSituations":"Upgrading phoenix/xrex or optax where parameter names changed; copy-pasting an inject_hyperparams call from another optimizer factory with a different signature.","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"],"exampleFix":"# before\n@inject_hyperparams\ndef factory(learning_rate, b1):\n    ...\n# invoked with static_args={'lr'}\n# after\nstatic_args={'learning_rate'}  # or rename the parameter to lr","handlingStrategy":"validation","validationCode":"import inspect\nsig = inspect.signature(inner_factory)\nassert set(static_args) <= set(sig.parameters), 'static_args not in factory signature'","typeGuard":"def static_args_valid(factory, static_args) -> bool:\n    return set(static_args) <= set(inspect.signature(factory).parameters)","tryCatchPattern":null,"preventionTips":["Write static_args next to the factory definition","Add a unit test asserting static_args subset of signature"],"tags":["optax","optimizer","hyperparameters","validation"],"backgroundTag":"invalid-function-argument","analyzedSha":"24c60942c5c5fdad3a6addffb4c6e6d2f228f04f","analyzedAt":"2026-08-28T11:40:14.686Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}