{"record":{"id":"6affffd7f913dec9","repo":"microsoft/qlib","slug":"optimizer-is-not-supported-6affff","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_tcn_ts.py","lineNumber":136,"sourceCode":"            np.random.seed(self.seed)\n            torch.manual_seed(self.seed)\n\n        self.TCN_model = TCNModel(\n            num_input=self.d_feat,\n            output_size=1,\n            num_channels=[self.n_chans] * self.num_layers,\n            kernel_size=self.kernel_size,\n            dropout=self.dropout,\n        )\n        self.logger.info(\"model:\\n{:}\".format(self.TCN_model))\n        self.logger.info(\"model size: {:.4f} MB\".format(count_parameters(self.TCN_model)))\n\n        if optimizer.lower() == \"adam\":\n            self.train_optimizer = optim.Adam(self.TCN_model.parameters(), lr=self.lr)\n        elif optimizer.lower() == \"gd\":\n            self.train_optimizer = optim.SGD(self.TCN_model.parameters(), lr=self.lr)\n        else:\n            raise NotImplementedError(\"optimizer {} is not supported!\".format(optimizer))\n\n        self.fitted = False\n        self.TCN_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":118,"sourceCodeEnd":154,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/pytorch_tcn_ts.py#L118-L154","documentation":"Thrown in TCNTSModel's (time-series TCN) fit setup while constructing the training optimizer. The `optimizer` hyperparameter is matched case-insensitively against 'adam' and 'gd' (plain SGD); anything else raises NotImplementedError. This happens at the start of fit, before any training.","triggerScenarios":"Calling TCNTSModel.fit() with optimizer='sgd', 'adamw', 'rmsprop', or any string other than 'adam'/'gd'; the optimizer-dispatch if/elif falls through to the raise.","commonSituations":"Configs ported from other qlib models or tutorials that use 'sgd' (here plain SGD is spelled 'gd'); using newer PyTorch optimizer names like 'adamw' expecting support; typos.","solutions":["Use optimizer='adam' or optimizer='gd' — these are the only two supported by TCNTSModel.","If you typed 'sgd', change it to 'gd' (that is this model's name for plain SGD).","For another optimizer, subclass TCNTSModel, override the fit setup, and construct optim.<Opt>(self.TCN_model.parameters(), lr=self.lr) yourself."],"exampleFix":"# before\nmodel = TCNTSModel(..., optimizer=\"sgd\")\nmodel.fit(dataset)  # NotImplementedError\n\n# after\nmodel = TCNTSModel(..., optimizer=\"gd\")\nmodel.fit(dataset)","handlingStrategy":"validation","validationCode":"optimizer = model_kwargs.get(\"optimizer\", \"adam\")\nassert optimizer.lower() in (\"adam\", \"gd\"), f\"TCNTSModel optimizer must be 'adam' or 'gd', got {optimizer!r}\"","typeGuard":null,"tryCatchPattern":"try:\n    model.fit(ds, valid)\nexcept NotImplementedError as e:\n    if \"optimizer\" in str(e):\n        model_kwargs[\"optimizer\"] = \"adam\"\n        model = TCNTSModel(**model_kwargs)\n        model.fit(ds, valid)\n    else:\n        raise","preventionTips":["Map optimizer names through {sgd: gd} when porting configs between qlib models.","Fail fast on config load: validate optimizer strings against each model's supported set."],"tags":["qlib","pytorch","tcn","optimizer","hyperparameter"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}