From 6ad4aabdfa6d70df61342e84c0f88a10db529f0d Mon Sep 17 00:00:00 2001 From: Francois Coppens Date: Fri, 10 Feb 2023 17:16:08 +0100 Subject: [PATCH] Still working --- org/qmckl_sherman_morrison_woodbury.org | 80 ++++++++++++------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/org/qmckl_sherman_morrison_woodbury.org b/org/qmckl_sherman_morrison_woodbury.org index 7d2b32d..dbe1880 100644 --- a/org/qmckl_sherman_morrison_woodbury.org +++ b/org/qmckl_sherman_morrison_woodbury.org @@ -33,39 +33,39 @@ range(2, 22) * Naïve Sherman-Morrison - :PROPERTIES: - :Name: qmckl_sherman_morrison_naive - :CRetType: qmckl_exit_code - :FRetType: qmckl_exit_code - :END: - - This is the simplest of the available Sherman-Morrison-Woodbury kernels. It applies rank-1 updates one by one in - the order that is given. It only checks if the denominator in the Sherman-Morrison formula is not too close to - zero when an update is evaluated. It will exit with an error code of the denominator is too close to zero. +:PROPERTIES: +:Name: qmckl_sherman_morrison_naive +:CRetType: qmckl_exit_code +:FRetType: qmckl_exit_code +:END: - The formula for any update $u_j$ (index $j$ is suppresed for clarity) that is applied is - \[ - (S + uv^T)^{-1} = S^{-1} - \frac{S^{-1} uv^T S^{-1}}{1 + v^T S^{-1} u} - \] +This is the simplest of the available Sherman-Morrison-Woodbury kernels. It applies rank-1 updates one by one in +the order that is given. It only checks if the denominator in the Sherman-Morrison formula is not too close to +zero when an update is evaluated. It will exit with an error code of the denominator is too close to zero. - where - $S$ is the Slater-matrix, - $u$ and $v^T$ are the column and row vectors containing the updates, - $S^{-1}$ is the inverse of the Slater-matrix. +The formula for any update $u_j$ (index $j$ is suppresed for clarity) that is applied is +\[ +(S + uv^T)^{-1} = S^{-1} - \frac{S^{-1} uv^T S^{-1}}{1 + v^T S^{-1} u} +\] - Even though the Slater-matrix $S$ with all updates applied at once is invertable, during the course of applying - updates to the inverse Slater-matrix $S^{-1}$ one-by-one it can happen that one of the intermediate inverse - matrices $S^{-1}$ becomes singular. Therefore a global threshold value $\epsilon$ is defined that is used to - evaluate each individual update $u_j$ when it is applied. +where +$S$ is the Slater-matrix, +$u$ and $v^T$ are the column and row vectors containing the updates, +$S^{-1}$ is the inverse of the Slater-matrix. - This value sets the lower bound for which the - denominator $1+v_j^TS^{-1}u_j$ is considered to be too small and will most probably result in a singular matrix - $S$, or at least in an inverse of $S$ of very poor numerical quality. Therefore, when $1+v_j^TS^{-1}u_j \geq \epsilon$, - the update is applied as usual and the kernel exits with return code \texttt{QMCKL_SUCCESS}. - If $1+v_j^TS^{-1}u_j \leq \epsilon$ the update is rejected and the kernel exits with return code \texttt{QMCKL_FAILURE}. +Even though the Slater-matrix $S$ with all updates applied at once is invertable, during the course of applying +updates to the inverse Slater-matrix $S^{-1}$ one-by-one it can happen that one of the intermediate inverse +matrices $S^{-1}$ becomes singular. Therefore a global threshold value $\epsilon$ is defined that is used to +evaluate each individual update $u_j$ when it is applied. - If the determinant of the Slater-matrix is passed, it will be updated to the determinant resulting - from applying the updates to the original matrix. +This value sets the lower bound for which the +denominator $1+v_j^TS^{-1}u_j$ is considered to be too small and will most probably result in a singular matrix +$S$, or at least in an inverse of $S$ of very poor numerical quality. Therefore, when $1+v_j^TS^{-1}u_j \geq \epsilon$, +the update is applied as usual and the kernel exits with return code \texttt{QMCKL_SUCCESS}. +If $1+v_j^TS^{-1}u_j \leq \epsilon$ the update is rejected and the kernel exits with return code \texttt{QMCKL_FAILURE}. + +If the determinant of the Slater-matrix is passed, it will be updated to the determinant resulting +from applying the updates to the original matrix. #+NAME: qmckl_sherman_morrison_naive_args | Variable | Type | In/Out | Description | @@ -149,15 +149,15 @@ end function qmckl_sherman_morrison_naive_doc ** Requirements - * ~context~ is not ~QMCKL_NULL_CONTEXT~ - * ~LDS >= 2~ - * ~Dim >= 2~ - * ~N_updates >= 1~ - * ~Updates~ is allocated with $N_updates \times Dim$ elements - * ~Updates_index~ is allocated with $N_updates$ elements - * ~breakdown~ is a small number such that $0 < breakdown << 1$ - * ~Slater_inv~ is allocated with $Dim \times Dim$ elements - * ~determinant > 0~ + * ~context~ is not ~QMCKL_NULL_CONTEXT~ + * ~LDS >= 2~ + * ~Dim >= 2~ + * ~N_updates >= 1~ + * ~Updates~ is allocated with $N_updates \times Dim$ elements + * ~Updates_index~ is allocated with $N_updates$ elements + * ~breakdown~ is a small number such that $0 < breakdown << 1$ + * ~Slater_inv~ is allocated with $Dim \times Dim$ elements + * ~determinant > 0~ ** C headers (exposed in qmckl.h) @@ -612,9 +612,9 @@ end interface * End of files - #+begin_src c :comments link :tangle (eval c_test) - assert (qmckl_context_destroy(context) == QMCKL_SUCCESS); - return 0; +#+begin_src c :comments link :tangle (eval c_test) +assert (qmckl_context_destroy(context) == QMCKL_SUCCESS); +return 0; } #+end_src