mirror of
https://github.com/TREX-CoE/qmckl.git
synced 2025-01-09 12:44:12 +01:00
Added threshold function. Tests still dont compile. #25
This commit is contained in:
parent
6e047046f4
commit
dcb4816941
@ -28,6 +28,120 @@ int main() {
|
|||||||
context = qmckl_context_create();
|
context = qmckl_context_create();
|
||||||
|
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
* Sherman-Morrison Helper Functions
|
||||||
|
|
||||||
|
[TODO: FMJC] Add doc
|
||||||
|
|
||||||
|
** ~qmckl_sherman_morrison_threshold~
|
||||||
|
:PROPERTIES:
|
||||||
|
:Name: qmckl_sherman_morrison_threshold
|
||||||
|
:CRetType: double
|
||||||
|
:FRetType: double precision
|
||||||
|
:END:
|
||||||
|
|
||||||
|
[TODO: FMJC] Add doc
|
||||||
|
|
||||||
|
#+NAME: qmckl_sherman_morrison_threshold_args
|
||||||
|
| double | thresh | out | Threshold |
|
||||||
|
|
||||||
|
*** Requirements
|
||||||
|
|
||||||
|
Add description of the input variables. (see for e.g. qmckl_distance.org)
|
||||||
|
|
||||||
|
*** C header
|
||||||
|
|
||||||
|
#+CALL: generate_c_header(table=qmckl_sherman_morrison_threshold_args,rettyp=get_value("CRetType"),fname=get_value("Name"))
|
||||||
|
|
||||||
|
#+RESULTS:
|
||||||
|
#+begin_src c :tangle (eval h_func) :comments org
|
||||||
|
// Sherman-Morrison-Woodbury break-down threshold
|
||||||
|
#ifndef THRESHOLD
|
||||||
|
#define THRESHOLD 1e-3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
qmckl_exit_code qmckl_sherman_morrison_threshold (
|
||||||
|
double* const thresh );
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
|
*** Source Fortran
|
||||||
|
|
||||||
|
#+begin_src f90 :tangle (eval f)
|
||||||
|
integer function qmckl_sherman_morrison_threshold_f(thresh) result(info)
|
||||||
|
use qmckl
|
||||||
|
implicit none
|
||||||
|
real*8 , intent(inout) :: thresh
|
||||||
|
!logical, external :: qmckl_sherman_morrison_f
|
||||||
|
info = qmckl_sherman_morrison_threshold(thresh)
|
||||||
|
end function qmckl_sherman_morrison_threshold_f
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
*** Source C
|
||||||
|
|
||||||
|
#+begin_src c :tangle (eval c) :comments org
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include "qmckl.h"
|
||||||
|
|
||||||
|
// Sherman-Morrison-Woodbury break-down threshold
|
||||||
|
static double qmckl_shreman_morrison_threshold(double* const threshold) {
|
||||||
|
*threshold = THRESHOLD;
|
||||||
|
#ifdef DEBUG
|
||||||
|
std::cerr << "Break-down threshold set to: " << threshold << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
|
*** Performance
|
||||||
|
|
||||||
|
** C interface :noexport:
|
||||||
|
|
||||||
|
#+CALL: generate_c_interface(table=qmckl_sherman_morrison_threshold_args,rettyp=get_value("FRetType"),fname=get_value("Name"))
|
||||||
|
|
||||||
|
#+RESULTS:
|
||||||
|
#+begin_src f90 :tangle (eval f) :comments org :exports none
|
||||||
|
integer(c_int32_t) function qmckl_sherman_morrison_threshold &
|
||||||
|
(thresh) &
|
||||||
|
bind(C) result(info)
|
||||||
|
|
||||||
|
use, intrinsic :: iso_c_binding
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
real (c_double ) , intent(out) :: thresh
|
||||||
|
|
||||||
|
integer(c_int32_t), external :: qmckl_sherman_morrison_threshold_f
|
||||||
|
info = qmckl_sherman_morrison_threshold_f &
|
||||||
|
(thresh)
|
||||||
|
|
||||||
|
end function qmckl_sherman_morrison_threshold
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+CALL: generate_f_interface(table=qmckl_sherman_morrison_threshold_args,rettyp=get_value("FRetType"),fname=get_value("Name"))
|
||||||
|
|
||||||
|
#+RESULTS:
|
||||||
|
#+begin_src f90 :tangle (eval fh_func) :comments org :exports none
|
||||||
|
interface
|
||||||
|
integer(c_int32_t) function qmckl_sherman_morrison_threshold &
|
||||||
|
(thresh) &
|
||||||
|
bind(C)
|
||||||
|
use, intrinsic :: iso_c_binding
|
||||||
|
import
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
real (c_double ) , intent(out) :: thresh
|
||||||
|
|
||||||
|
end function qmckl_sherman_morrison_threshold
|
||||||
|
end interface
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
*** Test :noexport:
|
||||||
|
|
||||||
|
[TODO: FMJC] Write tests for the Sherman-Morrison part.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
* Naïve Sherman-Morrison
|
* Naïve Sherman-Morrison
|
||||||
|
|
||||||
@ -64,12 +178,6 @@ int main() {
|
|||||||
|
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
#+begin_src c :tangle (eval h_func) :comments org
|
#+begin_src c :tangle (eval h_func) :comments org
|
||||||
// Sherman-Morrison-Woodbury break-down threshold
|
|
||||||
#ifndef THRESHOLD
|
|
||||||
#define THRESHOLD 1e-3
|
|
||||||
#endif
|
|
||||||
static double threshold();
|
|
||||||
|
|
||||||
qmckl_exit_code qmckl_sherman_morrison_c (
|
qmckl_exit_code qmckl_sherman_morrison_c (
|
||||||
const qmckl_context context,
|
const qmckl_context context,
|
||||||
const uint64_t Dim,
|
const uint64_t Dim,
|
||||||
@ -102,15 +210,6 @@ end function qmckl_sherman_morrison_f
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "qmckl.h"
|
#include "qmckl.h"
|
||||||
|
|
||||||
// Sherman-Morrison-Woodbury break-down threshold
|
|
||||||
static double threshold() {
|
|
||||||
const double threshold = THRESHOLD;
|
|
||||||
#ifdef DEBUG
|
|
||||||
std::cerr << "Break-down threshold set to: " << threshold << std::endl;
|
|
||||||
#endif
|
|
||||||
return threshold;
|
|
||||||
}
|
|
||||||
|
|
||||||
qmckl_exit_code qmckl_sherman_morrison_c(const qmckl_context context,
|
qmckl_exit_code qmckl_sherman_morrison_c(const qmckl_context context,
|
||||||
const uint64_t Dim,
|
const uint64_t Dim,
|
||||||
const uint64_t N_updates,
|
const uint64_t N_updates,
|
||||||
@ -124,6 +223,9 @@ qmckl_exit_code qmckl_sherman_morrison_c(const qmckl_context context,
|
|||||||
double C[Dim];
|
double C[Dim];
|
||||||
double D[Dim];
|
double D[Dim];
|
||||||
|
|
||||||
|
double threshold = 0.0;
|
||||||
|
qmckl_sherman_morrison_threshold(&threshold);
|
||||||
|
|
||||||
unsigned int l = 0;
|
unsigned int l = 0;
|
||||||
// For each update
|
// For each update
|
||||||
while (l < N_updates) {
|
while (l < N_updates) {
|
||||||
@ -137,7 +239,7 @@ qmckl_exit_code qmckl_sherman_morrison_c(const qmckl_context context,
|
|||||||
|
|
||||||
// Denominator
|
// Denominator
|
||||||
double den = 1 + C[Updates_index[l] - 1];
|
double den = 1 + C[Updates_index[l] - 1];
|
||||||
if (fabs(den) < threshold()) {
|
if (fabs(den) < threshold) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
double iden = 1 / den;
|
double iden = 1 / den;
|
||||||
|
Loading…
Reference in New Issue
Block a user