{"record":{"id":"52bf822945ebe415","repo":"microsoft/qlib","slug":"optimizer-is-not-supported-52bf82","errorCode":null,"errorMessage":"optimizer {} is not supported!","messagePattern":"optimizer (.+?) is not supported!","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"qlib/contrib/model/pytorch_igmtf.py","lineNumber":134,"sourceCode":"            np.random.seed(self.seed)\n            torch.manual_seed(self.seed)\n\n        self.igmtf_model = IGMTFModel(\n            d_feat=self.d_feat,\n            hidden_size=self.hidden_size,\n            num_layers=self.num_layers,\n            dropout=self.dropout,\n            base_model=self.base_model,\n        )\n        self.logger.info(\"model:\\n{:}\".format(self.igmtf_model))\n        self.logger.info(\"model size: {:.4f} MB\".format(count_parameters(self.igmtf_model)))\n\n        if optimizer.lower() == \"adam\":\n            self.train_optimizer = optim.Adam(self.igmtf_model.parameters(), lr=self.lr)\n        elif optimizer.lower() == \"gd\":\n            self.train_optimizer = optim.SGD(self.igmtf_model.parameters(), lr=self.lr)\n        else:\n            raise NotImplementedError(\"optimizer {} is not supported!\".format(optimizer))\n\n        self.fitted = False\n        self.igmtf_model.to(self.device)\n\n    @property\n    def use_gpu(self):\n        return self.device != torch.device(\"cpu\")\n\n    def mse(self, pred, label):\n        loss = (pred - label) ** 2\n        return torch.mean(loss)\n\n    def loss_fn(self, pred, label):\n        mask = ~torch.isnan(label)\n\n        if self.loss == \"mse\":\n            return self.mse(pred[mask], label[mask])\n","sourceCodeStart":116,"sourceCodeEnd":152,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/pytorch_igmtf.py#L116-L152","documentation":"IGMTFModel accepts only two optimizers, case-insensitively: 'adam' (optim.Adam) and 'gd' (optim.SGD). Any other optimizer string raises NotImplementedError at the end of __init__, so the object fails during construction, not during fit.","triggerScenarios":"Constructing IGMTFModel(optimizer='adamw'), 'rmsprop', 'adagrad', or any string other than adam/gd (any case).","commonSituations":"Porting a config from a framework where 'adamw' or 'rmsprop' are standard; typos like 'Adamm'; copying hyperparameter blocks between models without checking each model's supported optimizer set.","solutions":["Use optimizer='adam' or optimizer='gd' (other capitalizations like 'Adam' are accepted because of .lower())","If you need a different optimizer, subclass IGMTFModel and add a branch creating it from torch.optim"],"exampleFix":"# before\nIGMTFModel(optimizer=\"adamw\")\n\n# after\nIGMTFModel(optimizer=\"adam\")","handlingStrategy":"validation","validationCode":"assert optimizer.lower() in (\"adam\", \"gd\"), f\"unsupported optimizer {optimizer!r}; use 'adam' or 'gd'\"","typeGuard":"def is_supported_optimizer(name: str) -> bool:\n    return name.lower() in (\"adam\", \"gd\")","tryCatchPattern":null,"preventionTips":["Keep a per-model allowlist of optimizer strings validated at config load","Remember 'gd' (not 'sgd') is the accepted spelling in qlib torch models"],"tags":["qlib","igmtf","optimizer","invalid-argument"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}