From 61f134aa45668d19f70b05bdffa0f73824971a3a Mon Sep 17 00:00:00 2001
From: hanna julienne <hanna.julienne@pasteur.fr>
Date: Tue, 19 Nov 2019 11:36:59 +0100
Subject: [PATCH] add adaptation of rcond to data if needed

---
 raiss/stat_models.py | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/raiss/stat_models.py b/raiss/stat_models.py
index 1cec678..ea864f8 100644
--- a/raiss/stat_models.py
+++ b/raiss/stat_models.py
@@ -68,6 +68,14 @@ def var_in_boundaries(var,lamb):
 
     return var
 
+def invert_sig_t(sig_t, lamb, rcond):
+    try:
+        np.fill_diagonal(sig_t.values, (1+lamb))
+        sig_t_inv = scipy.linalg.pinv(sig_t, rcond=rcond)
+        return(sig_t_inv)
+    except np.linalg.LinAlgError:
+        invert_sig_t(sig_t, lamb*1.1, rcond*1.1)
+
 def raiss_model(zt, sig_t, sig_i_t, lamb=0.01, rcond=0.01,  batch=True):
     """
     Compute the variance
@@ -80,9 +88,8 @@ def raiss_model(zt, sig_t, sig_i_t, lamb=0.01, rcond=0.01,  batch=True):
         rcond (float): threshold to filter eigenvector with a eigenvalue under rcond
         make inversion biased but much more numerically robust
     """
-    sig_t = sig_t.values
-    np.fill_diagonal(sig_t, (1+lamb))
-    sig_t_inv = scipy.linalg.pinv(sig_t, rcond=rcond)
+    sig_t_inv = invert_sig_t(sig_t, lamb, rcond)
+
 
     if batch:
         condition_number = np.array([np.linalg.cond(sig_t)]*sig_i_t.shape[0])
-- 
GitLab