From 3a2138d7c929e4f65751f0509cb0354b0f3431c5 Mon Sep 17 00:00:00 2001 From: Robrecht Cannoodt Date: Thu, 13 Aug 2026 15:00:42 +0200 Subject: [PATCH] fix novel silently saving no model An empty ATAC cell gives a constant lsi row, so the per-cell z-score divided 0 by 0. The resulting nan rmse never beat best_score, so tensor.pt was never written and novel_predict failed on a train step that had exited 0. --- src/methods/novel/helper_functions.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/methods/novel/helper_functions.py b/src/methods/novel/helper_functions.py index 0ebe2009..14595179 100644 --- a/src/methods/novel/helper_functions.py +++ b/src/methods/novel/helper_functions.py @@ -75,7 +75,9 @@ def transform(self, adata): X_norm = np.log1p(X_norm * 1e4) X_lsi = self.pcaTransformer.transform(X_norm) X_lsi -= X_lsi.mean(axis=1, keepdims=True) - X_lsi /= X_lsi.std(axis=1, ddof=1, keepdims=True) + lsi_std = X_lsi.std(axis=1, ddof=1, keepdims=True) + lsi_std[lsi_std == 0] = 1 + X_lsi /= lsi_std lsi_df = pd.DataFrame(X_lsi, index = adata_use.obs_names) return lsi_df @@ -205,7 +207,7 @@ def rmse(y, y_pred): return np.sqrt(np.mean(np.square(y - y_pred))) def train_and_valid(model, optimizer, loss_fn, dataloader_train, dataloader_test, name_model, device, n_epochs=100): - best_score = 100000 + best_score = None for i in range(n_epochs): train_losses = [] model.train() @@ -231,7 +233,12 @@ def train_and_valid(model, optimizer, loss_fn, dataloader_train, dataloader_test cat_targets = np.concatenate(targets) cat_outputs[cat_outputs<0.0] = 0 - if best_score > rmse(cat_targets,cat_outputs): + score = rmse(cat_targets,cat_outputs) + if best_score is None or score < best_score: torch.save(model.state_dict(), name_model) - best_score = rmse(cat_targets,cat_outputs) + best_score = score + if best_score is None or not np.isfinite(best_score): + raise RuntimeError( + f"validation rmse never became finite (best: {best_score}), so no usable model was saved" + ) print("best rmse: ", best_score)