{"record":{"id":"71dd603a1ef9b970","repo":"microsoft/qlib","slug":"optimizer-is-not-supported-71dd60","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_tabnet.py","lineNumber":106,"sourceCode":"\n        self.tabnet_model = TabNet(inp_dim=self.d_feat, out_dim=self.out_dim, vbs=vbs, relax=relax).to(self.device)\n        self.tabnet_decoder = TabNet_Decoder(self.out_dim, self.d_feat, n_shared, n_ind, vbs, n_steps).to(self.device)\n        self.logger.info(\"model:\\n{:}\\n{:}\".format(self.tabnet_model, self.tabnet_decoder))\n        self.logger.info(\"model size: {:.4f} MB\".format(count_parameters([self.tabnet_model, self.tabnet_decoder])))\n\n        if optimizer.lower() == \"adam\":\n            self.pretrain_optimizer = optim.Adam(\n                list(self.tabnet_model.parameters()) + list(self.tabnet_decoder.parameters()), lr=self.lr\n            )\n            self.train_optimizer = optim.Adam(self.tabnet_model.parameters(), lr=self.lr)\n\n        elif optimizer.lower() == \"gd\":\n            self.pretrain_optimizer = optim.SGD(\n                list(self.tabnet_model.parameters()) + list(self.tabnet_decoder.parameters()), lr=self.lr\n            )\n            self.train_optimizer = optim.SGD(self.tabnet_model.parameters(), lr=self.lr)\n        else:\n            raise NotImplementedError(\"optimizer {} is not supported!\".format(optimizer))\n\n    @property\n    def use_gpu(self):\n        return self.device != torch.device(\"cpu\")\n\n    def pretrain_fn(self, dataset=DatasetH, pretrain_file=\"./pretrain/best.model\"):\n        get_or_create_path(pretrain_file)\n\n        [df_train, df_valid] = dataset.prepare(\n            [\"pretrain\", \"pretrain_validation\"],\n            col_set=[\"feature\", \"label\"],\n            data_key=DataHandlerLP.DK_L,\n        )\n\n        df_train.fillna(df_train.mean(), inplace=True)\n        df_valid.fillna(df_valid.mean(), inplace=True)\n\n        x_train = df_train[\"feature\"]","sourceCodeStart":88,"sourceCodeEnd":124,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/pytorch_tabnet.py#L88-L124","documentation":"Raised by TabNet model init in qlib/contrib/model/pytorch_tabnet.py:106 when optimizer.lower() is neither 'adam' nor 'gd'. The constructor builds two optimizers (pretrain_optimizer over model+decoder params, train_optimizer over model params) from the same token; 'adam' -> Adam, 'gd' -> SGD. Anything else raises NotImplementedError during construction.","triggerScenarios":"Passing optimizer='sgd', 'adamw', etc. in TabNet model kwargs; the error appears immediately at model instantiation, before pretrain_fn or fit.","commonSituations":"'sgd' habit (qlib's token is 'gd'); configs migrated from other pytorch contrib models in the same repo that were hand-edited.","solutions":["Set optimizer: 'adam' or 'gd'.","Subclass the TabNet model to install a different optimizer pair if genuinely needed."],"exampleFix":"# before\nkwargs:\n  optimizer: sgd\n\n# after\nkwargs:\n  optimizer: gd   # or 'adam'","handlingStrategy":"validation","validationCode":"assert config[\"optimizer\"].lower() in (\"adam\", \"gd\"), \"TabNet supports only 'adam' or 'gd'\"","typeGuard":"def is_supported_optimizer(optimizer: str) -> bool:\n    return optimizer.lower() in (\"adam\", \"gd\")","tryCatchPattern":"try:\n    model = TabNetModel(**kwargs)\nexcept NotImplementedError as e:\n    if \"optimizer\" in str(e):\n        raise ValueError(\"Use optimizer='adam' or 'gd'\") from e\n    raise","preventionTips":["Use the shared 'adam'/'gd' whitelist for all qlib pytorch models.","Unit-test config parsing so invalid optimizer tokens fail before model construction."],"tags":["qlib","pytorch","optimizer","config","not-implemented","tabnet"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}