{"record":{"id":"d14ba025b21ac4c9","repo":"microsoft/qlib","slug":"optimizer-is-not-supported-d14ba0","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.py","lineNumber":135,"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":117,"sourceCodeEnd":153,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/pytorch_tcn.py#L117-L153","documentation":"Raised by the TCN (Temporal Convolutional Network) model init in qlib/contrib/model/pytorch_tcn.py:135 when optimizer.lower() is neither 'adam' nor 'gd'. As with the other pytorch contrib models, 'adam' maps to torch.optim.Adam and 'gd' to torch.optim.SGD at self.lr; other tokens raise NotImplementedError right after the model-size log line, during construction.","triggerScenarios":"Passing optimizer='sgd', 'adamw', 'rmsprop', etc. in TCN model kwargs; fails in __init__ before fit() is ever reached.","commonSituations":"'sgd' vs qlib's 'gd' naming; optimizer strings pasted from PyTorch tutorials or other model sections.","solutions":["Set optimizer: 'adam' or 'gd' in TCN kwargs.","Subclass the TCN model and replace self.train_optimizer for other optimizers."],"exampleFix":"# before\nkwargs:\n  optimizer: sgd\n\n# after\nkwargs:\n  optimizer: adam   # or 'gd'","handlingStrategy":"validation","validationCode":"assert config[\"optimizer\"].lower() in (\"adam\", \"gd\"), \"TCN supports only 'adam' or 'gd'\"","typeGuard":"def is_supported_optimizer(optimizer: str) -> bool:\n    return optimizer.lower() in (\"adam\", \"gd\")","tryCatchPattern":"try:\n    model = TCNModel(**kwargs)\nexcept NotImplementedError as e:\n    if \"optimizer\" in str(e):\n        raise ValueError(\"Use optimizer='adam' or 'gd'\") from e\n    raise","preventionTips":["Apply the repo-wide 'adam'/'gd' optimizer vocabulary.","Fail fast on config validation instead of at model construction time."],"tags":["qlib","pytorch","optimizer","config","not-implemented","tcn"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}