92 float *
const restrict
L,
size_t n)
98 if(
A[0] <= 0.0f)
return 0;
100 for(
size_t i = 0;
i <
n;
i++)
101 for(
size_t j = 0; j < (
i + 1); j++)
105 for(
size_t k = 0;
k < j;
k++)
106 sum +=
L[
i *
n +
k] *
L[j *
n +
k];
108 L[
i *
n + j] = (
i == j) ?
109 sqrtf(
A[
i *
n +
i] - sum) :
110 (
A[
i *
n + j] - sum) /
L[j *
n + j];
118 float *
const restrict
L,
size_t n)
123 if(
A[0] <= 0.0f)
return 0;
127 for(
size_t i = 0;
i <
n;
i++)
128 for(
size_t j = 0; j < (
i + 1); j++)
132 for(
size_t k = 0;
k < j;
k++)
133 sum +=
L[
i *
n +
k] *
L[j *
n +
k];
137 const float temp =
A[
i *
n +
i] - sum;
145 L[
i *
n + j] = sqrtf(
A[
i *
n +
i] - sum);
149 const float temp =
L[j *
n + j];
157 L[
i *
n + j] = (
A[
i *
n + j] - sum) / temp;
166 const float *
const restrict y,
float *
const restrict b,
172 for(
size_t i = 0;
i <
n; ++
i)
175 for(
size_t j = 0; j <
i; ++j)
176 sum -=
L[
i *
n + j] * b[j];
178 b[
i] = sum /
L[
i *
n +
i];
186 const float *
const restrict y,
float *
const restrict b,
194 for(
size_t i = 0;
i <
n; ++
i)
197 for(
size_t j = 0; j <
i; ++j)
198 sum -=
L[
i *
n + j] * b[j];
200 const float temp =
L[
i *
n +
i];
216 const float *
const restrict b,
float *
const restrict
x,
222 for(
int i = (
n - 1);
i > -1 ; --
i)
225 for(
int j = (
n - 1); j >
i; --j)
226 sum -=
L[j *
n +
i] *
x[j];
228 x[
i] = sum /
L[
i *
n +
i];
236 const float *
const restrict b,
float *
const restrict
x,
244 for(
int i = (
n - 1);
i > -1 ; --
i)
247 for(
int j = (
n - 1); j >
i; --j)
248 sum -=
L[j *
n +
i] *
x[j];
250 const float temp =
L[
i *
n +
i];
265 float *
const restrict y,
266 const size_t n,
const int checks)
290 dt_control_log(_(
"Choleski decomposition failed to allocate memory, check your RAM settings"));
291 fprintf(stdout,
"Choleski decomposition failed to allocate memory, check your RAM settings\n");
299 if(!valid) fprintf(stdout,
"Cholesky decomposition returned NaNs\n");
305 if(!valid) fprintf(stdout,
"Cholesky LU triangular descent returned NaNs\n");
311 if(!valid) fprintf(stdout,
"Cholesky LU triangular ascent returned NaNs\n");
327 float *
const restrict A_square,
328 const size_t m,
const size_t n)
333 for(
size_t i = 0;
i <
n; ++
i)
334 for(
size_t j = 0; j < (
i + 1); ++j)
337 for(
size_t k = 0;
k <
m; ++
k)
338 sum +=
A[
k *
n +
i] *
A[
k *
n + j];
340 A_square[
i *
n + j] = sum;
348 float *
const restrict y,
349 float *
const restrict y_square,
350 const size_t m,
const size_t n)
354 for(
size_t i = 0;
i <
n; ++
i)
357 for(
size_t k = 0;
k <
m; ++
k)
358 sum +=
A[
k *
n +
i] * y[
k];
368 float *
const restrict y,
369 const size_t m,
const size_t n,
const int checks)
379 fprintf(stdout,
"Pseudo solve: cannot cast %" G_GSIZE_FORMAT
" \303\227 %" G_GSIZE_FORMAT
" matrice\n",
m,
n);
388 dt_control_log(_(
"Choleski decomposition failed to allocate memory, check your RAM settings"));
394 #pragma omp parallel sections
static void error(char *msg)
static int transpose_dot_vector(float *const restrict A, float *const restrict y, float *const restrict y_square, const size_t m, const size_t n)
static int transpose_dot_matrix(float *const restrict A, float *const restrict A_square, const size_t m, const size_t n)
static int choleski_decompose_safe(const float *const restrict A, float *const restrict L, size_t n)
static int solve_hermitian(const float *const restrict A, float *const restrict y, const size_t n, const int checks)
static int pseudo_solve(float *const restrict A, float *const restrict y, const size_t m, const size_t n, const int checks)
static int choleski_decompose_fast(const float *const restrict A, float *const restrict L, size_t n)
static int triangular_ascent_safe(const float *const restrict L, const float *const restrict b, float *const restrict x, const size_t n)
static int triangular_ascent_fast(const float *const restrict L, const float *const restrict b, float *const restrict x, const size_t n)
static int triangular_descent_fast(const float *const restrict L, const float *const restrict y, float *const restrict b, const size_t n)
static int triangular_descent_safe(const float *const restrict L, const float *const restrict y, float *const restrict b, const size_t n)
void dt_control_log(const char *msg,...)
#define dt_free_align(ptr)
static float * dt_alloc_align_float(size_t pixels)
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
static __DT_CLONE_TARGETS__ void dt_simd_memcpy(const float *const __restrict__ in, float *const __restrict__ out, const size_t num_elem)
float *const restrict const size_t k