{"record":{"id":"3e7112af5836f5ba","repo":"microsoft/qlib","slug":"model-is-not-fitted-yet-3e7112","errorCode":null,"errorMessage":"model is not fitted yet!","messagePattern":"model is not fitted yet!","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"qlib/contrib/model/pytorch_tra.py","lineNumber":503,"sourceCode":"                    \"alpha\": self.alpha,\n                    \"seed\": self.seed,\n                    \"logdir\": self.logdir,\n                    \"pretrain\": self.pretrain,\n                    \"init_state\": self.init_state,\n                    \"transport_method\": self.transport_method,\n                    \"use_daily_transport\": self.use_daily_transport,\n                },\n                \"best_eval_metric\": -best_score,  # NOTE: -1 for minimize\n                \"metrics\": {\"train\": train_metrics, \"valid\": valid_metrics, \"test\": test_metrics},\n            }\n            with open(self.logdir + \"/info.json\", \"w\") as f:\n                json.dump(info, f)\n\n    def predict(self, dataset, segment=\"test\"):\n        assert isinstance(dataset, MTSDatasetH), \"TRAModel only supports `qlib.contrib.data.dataset.MTSDatasetH`\"\n\n        if not self.fitted:\n            raise ValueError(\"model is not fitted yet!\")\n\n        test_set = dataset.prepare(segment)\n\n        metrics, preds, _, _ = self.test_epoch(-1, test_set, return_pred=True)\n        self.logger.info(\"test metrics: %s\" % metrics)\n\n        return preds\n\n\nclass RNN(nn.Module):\n    \"\"\"RNN Model\n\n    Args:\n        input_size (int): input size (# features)\n        hidden_size (int): hidden size\n        num_layers (int): number of hidden layers\n        rnn_arch (str): rnn architecture\n        use_attn (bool): whether use attention layer.","sourceCodeStart":485,"sourceCodeEnd":521,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/pytorch_tra.py#L485-L521","documentation":"Thrown by TRAModel.predict when self.fitted is False. TRAModel (temporal routing adaptor) sets fitted only after a full train run (which also writes info.json to logdir). Note predict additionally asserts the dataset is an MTSDatasetH, so the fitted check fires after that type check passes.","triggerScenarios":"Calling TRAModel.predict(dataset) where dataset is an MTSDatasetH but model.train(...) was never called or raised before completion (e.g. logging/threading errors or a failed epoch) — fitted stays False and predict raises.","commonSituations":"TRA workflow scripts that train and evaluate in separate stages; a crashed train (OOM, bad task config) followed by an eval stage that unconditionally predicts; reusing a model object after partially running TRA's task-aware training.","solutions":["Run the full TRA training entry point (model.train / the workflow's fit stage) to completion before predicting.","If training failed, read the earlier traceback and fix it — fitted is only set on the success path.","Persist the trained TRAModel (e.g. save state + logdir) and reload the fitted object instead of predicting from a fresh instance."],"exampleFix":"# before\nmodel = TRAModel(...)\nmodel.predict(mts_dataset)  # ValueError: not fitted\n\n# after\nmodel = TRAModel(...)\nmodel.train(mts_dataset, ...)\nmodel.predict(mts_dataset)","handlingStrategy":"validation","validationCode":"from qlib.contrib.data.dataset import MTSDatasetH\nassert isinstance(dataset, MTSDatasetH), \"TRAModel requires MTSDatasetH\"\nassert getattr(model, \"fitted\", False), \"TRAModel not fitted — run train(...) before predict\"","typeGuard":"def tra_predict_ready(model, dataset) -> bool:\n    from qlib.contrib.data.dataset import MTSDatasetH\n    return isinstance(dataset, MTSDatasetH) and getattr(model, \"fitted\", False)","tryCatchPattern":"try:\n    preds = model.predict(dataset)\nexcept ValueError as e:\n    if \"not fitted\" in str(e):\n        raise RuntimeError(\"Complete TRA training before evaluation\") from e\n    raise","preventionTips":["Run TRA train and eval as ordered stages in the workflow, gating eval on train success.","Check logdir/info.json exists as evidence training completed before predicting."],"tags":["qlib","pytorch","tra","lifecycle","state"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}