{"record":{"id":"c29a207772046473","repo":"microsoft/qlib","slug":"unknown-base-model-name-s-c29a20","errorCode":null,"errorMessage":"unknown base model name `%s`","messagePattern":"unknown base model name `(.+?)`","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"qlib/contrib/model/pytorch_gats_ts.py","lineNumber":268,"sourceCode":"        train_loader = DataLoader(dl_train, sampler=sampler_train, num_workers=self.n_jobs, drop_last=True)\n        valid_loader = DataLoader(dl_valid, sampler=sampler_valid, num_workers=self.n_jobs, drop_last=True)\n\n        save_path = get_or_create_path(save_path)\n\n        stop_steps = 0\n        train_loss = 0\n        best_score = -np.inf\n        best_epoch = 0\n        evals_result[\"train\"] = []\n        evals_result[\"valid\"] = []\n\n        # load pretrained base_model\n        if self.base_model == \"LSTM\":\n            pretrained_model = LSTMModel(d_feat=self.d_feat, hidden_size=self.hidden_size, num_layers=self.num_layers)\n        elif self.base_model == \"GRU\":\n            pretrained_model = GRUModel(d_feat=self.d_feat, hidden_size=self.hidden_size, num_layers=self.num_layers)\n        else:\n            raise ValueError(\"unknown base model name `%s`\" % self.base_model)\n\n        if self.model_path is not None:\n            self.logger.info(\"Loading pretrained model...\")\n            pretrained_model.load_state_dict(torch.load(self.model_path, map_location=self.device))\n\n        model_dict = self.GAT_model.state_dict()\n        pretrained_dict = {\n            k: v for k, v in pretrained_model.state_dict().items() if k in model_dict  # pylint: disable=E1135\n        }\n        model_dict.update(pretrained_dict)\n        self.GAT_model.load_state_dict(model_dict)\n        self.logger.info(\"Loading pretrained model Done...\")\n\n        # train\n        self.logger.info(\"training...\")\n        self.fitted = True\n\n        for step in range(self.n_epochs):","sourceCodeStart":250,"sourceCodeEnd":286,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/pytorch_gats_ts.py#L250-L286","documentation":"In fit(), GATsTSModel instantiates a pretrained base RNN for warm-starting and accepts only exact-case 'LSTM' and 'GRU' for self.base_model; anything else raises ValueError before loading pretrained weights. The comparison is case-sensitive, matching the non-ts GATs behavior.","triggerScenarios":"GATsTSModel(base_model='gru') or any non-exact string followed by fit().","commonSituations":"Lowercase values in YAML configs; porting base_model settings between models; using names of custom base networks not registered here.","solutions":["Use exact 'LSTM' or 'GRU'.","Fix case and typos in the base_model config value.","Subclass GATsTSModel.fit to construct a custom pretrained base model."],"exampleFix":"# before\nmodel = GATsTSModel(base_model='gru')\n\n# after\nmodel = GATsTSModel(base_model='GRU')","handlingStrategy":"validation","validationCode":"assert model.base_model in ('LSTM', 'GRU'), f\"base_model must be exactly 'LSTM' or 'GRU', got {model.base_model!r}\"","typeGuard":"def is_valid_base_model(name: str) -> bool:\n    return name in ('LSTM', 'GRU')","tryCatchPattern":"try:\n    model.fit(dataset)\nexcept ValueError as e:\n    if 'unknown base model name' in str(e):\n        model.base_model = model.base_model.upper()\n        model.fit(dataset)\n    else:\n        raise","preventionTips":["Write base_model in exact case: 'LSTM' or 'GRU'.","Validate against the two-value enum before fit.","Normalize string hyperparameters to expected case in your config loader."],"tags":["pytorch","qlib","config-validation","case-sensitivity","gats-ts"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}