{"record":{"id":"403dfa8a439aa8f5","repo":"huggingface/pytorch-image-models","slug":"eps-must-be-non-negative","errorCode":null,"errorMessage":"Eps must be non-negative","messagePattern":"Eps must be non-negative","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"timm/optim/madgrad.py","lineNumber":71,"sourceCode":"    \"\"\"\n\n    def __init__(\n            self,\n            params: _params_t,\n            lr: float = 1e-2,\n            momentum: float = 0.9,\n            weight_decay: float = 0,\n            eps: float = 1e-6,\n            decoupled_decay: bool = False,\n    ):\n        if momentum < 0 or momentum >= 1:\n            raise ValueError(f\"Momentum {momentum} must be in the range [0,1]\")\n        if lr <= 0:\n            raise ValueError(f\"Learning rate {lr} must be positive\")\n        if weight_decay < 0:\n            raise ValueError(f\"Weight decay {weight_decay} must be non-negative\")\n        if eps < 0:\n            raise ValueError(f\"Eps must be non-negative\")\n\n        defaults = dict(\n            lr=lr,\n            eps=eps,\n            momentum=momentum,\n            weight_decay=weight_decay,\n            decoupled_decay=decoupled_decay,\n        )\n        super().__init__(params, defaults)\n\n    @property\n    def supports_memory_efficient_fp16(self) -> bool:\n        return False\n\n    @property\n    def supports_flat_params(self) -> bool:\n        return True\n","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/huggingface/pytorch-image-models/blob/9a5261e31b3b5128526eb2658333b4c0a54464ae/timm/optim/madgrad.py#L53-L89","documentation":"The numerical-stability epsilon in MADGRAD's denominator must be non-negative; a negative eps is rejected because it can invalidate the sqrt/normalization steps of the update.","triggerScenarios":"Passing eps<0 (e.g. eps=-1e-6, a sign typo) to the MADGRAD constructor.","commonSituations":"Typos in config files; programmatically derived eps values with a wrong sign; copy-paste from a config that used a negative offset for something else.","solutions":["Use a positive eps (default 1e-6)","Fix the sign in the config/sweep generating eps"],"exampleFix":"# before\nopt = MADGRAD(model.parameters(), eps=-1e-6)\n# after\nopt = MADGRAD(model.parameters(), eps=1e-6)","handlingStrategy":"validation","validationCode":"assert cfg.eps >= 0, 'eps must be non-negative'","typeGuard":"def is_valid_eps(e: float) -> bool:\n    return isinstance(e, (int, float)) and e >= 0","tryCatchPattern":null,"preventionTips":["Leave eps at the 1e-6 default unless numerics require change","Lint config values for sign errors"],"tags":["optimizer","madgrad","epsilon","hyperparameter-validation"],"backgroundTag":"hyperparameter-out-of-range","analyzedSha":"9a5261e31b3b5128526eb2658333b4c0a54464ae","analyzedAt":"2026-08-27T02:34:25.417Z","schemaVersion":2},"datasetVersion":"2026-08-27T03:17:27.898Z"}