20 #ifndef QMCPLUSPLUS_MULTIDIRACDETERMINANTCALCULATOR_H 21 #define QMCPLUSPLUS_MULTIDIRACDETERMINANTCALCULATOR_H 44 static T
evaluate(T a11, T a12, T a21, T a22) {
return a11 * a22 - a21 * a12; }
46 static T
evaluate(T a11, T a12, T a13, T a21, T a22, T a23, T a31, T a32, T a33)
48 return (a11 * (a22 * a33 - a32 * a23) - a21 * (a12 * a33 - a32 * a13) + a31 * (a12 * a23 - a22 * a13));
68 return (a11 * (a22 * (a33 * a44 - a43 * a34) - a32 * (a23 * a44 - a43 * a24) + a42 * (a23 * a34 - a33 * a24)) -
69 a21 * (a12 * (a33 * a44 - a43 * a34) - a32 * (a13 * a44 - a43 * a14) + a42 * (a13 * a34 - a33 * a14)) +
70 a31 * (a12 * (a23 * a44 - a43 * a24) - a22 * (a13 * a44 - a43 * a14) + a42 * (a13 * a24 - a23 * a14)) -
71 a41 * (a12 * (a23 * a34 - a33 * a24) - a22 * (a13 * a34 - a33 * a14) + a32 * (a13 * a24 - a23 * a14)));
102 (a22 * (a33 * (a44 * a55 - a54 * a45) - a43 * (a34 * a55 - a54 * a35) + a53 * (a34 * a45 - a44 * a35)) -
103 a32 * (a23 * (a44 * a55 - a54 * a45) - a43 * (a24 * a55 - a54 * a25) + a53 * (a24 * a45 - a44 * a25)) +
104 a42 * (a23 * (a34 * a55 - a54 * a35) - a33 * (a24 * a55 - a54 * a25) + a53 * (a24 * a35 - a34 * a25)) -
105 a52 * (a23 * (a34 * a45 - a44 * a35) - a33 * (a24 * a45 - a44 * a25) + a43 * (a24 * a35 - a34 * a25))) -
107 (a12 * (a33 * (a44 * a55 - a54 * a45) - a43 * (a34 * a55 - a54 * a35) + a53 * (a34 * a45 - a44 * a35)) -
108 a32 * (a13 * (a44 * a55 - a54 * a45) - a43 * (a14 * a55 - a54 * a15) + a53 * (a14 * a45 - a44 * a15)) +
109 a42 * (a13 * (a34 * a55 - a54 * a35) - a33 * (a14 * a55 - a54 * a15) + a53 * (a14 * a35 - a34 * a15)) -
110 a52 * (a13 * (a34 * a45 - a44 * a35) - a33 * (a14 * a45 - a44 * a15) + a43 * (a14 * a35 - a34 * a15))) +
112 (a12 * (a23 * (a44 * a55 - a54 * a45) - a43 * (a24 * a55 - a54 * a25) + a53 * (a24 * a45 - a44 * a25)) -
113 a22 * (a13 * (a44 * a55 - a54 * a45) - a43 * (a14 * a55 - a54 * a15) + a53 * (a14 * a45 - a44 * a15)) +
114 a42 * (a13 * (a24 * a55 - a54 * a25) - a23 * (a14 * a55 - a54 * a15) + a53 * (a14 * a25 - a24 * a15)) -
115 a52 * (a13 * (a24 * a45 - a44 * a25) - a23 * (a14 * a45 - a44 * a15) + a43 * (a14 * a25 - a24 * a15))) -
117 (a12 * (a23 * (a34 * a55 - a54 * a35) - a33 * (a24 * a55 - a54 * a25) + a53 * (a24 * a35 - a34 * a25)) -
118 a22 * (a13 * (a34 * a55 - a54 * a35) - a33 * (a14 * a55 - a54 * a15) + a53 * (a14 * a35 - a34 * a15)) +
119 a32 * (a13 * (a24 * a55 - a54 * a25) - a23 * (a14 * a55 - a54 * a15) + a53 * (a14 * a25 - a24 * a15)) -
120 a52 * (a13 * (a24 * a35 - a34 * a25) - a23 * (a14 * a35 - a34 * a15) + a33 * (a14 * a25 - a24 * a15))) +
122 (a12 * (a23 * (a34 * a45 - a44 * a35) - a33 * (a24 * a45 - a44 * a25) + a43 * (a24 * a35 - a34 * a25)) -
123 a22 * (a13 * (a34 * a45 - a44 * a35) - a33 * (a14 * a45 - a44 * a15) + a43 * (a14 * a35 - a34 * a15)) +
124 a32 * (a13 * (a24 * a45 - a44 * a25) - a23 * (a14 * a45 - a44 * a15) + a43 * (a14 * a25 - a24 * a15)) -
125 a42 * (a13 * (a24 * a35 - a34 * a25) - a23 * (a14 * a35 - a34 * a15) + a33 * (a14 * a25 - a24 * a15))));
134 template<
typename DT>
136 template<
typename ITER>
139 typename std::vector<T>::iterator d =
M.begin();
140 for (
int i = 0; i <
n; i++)
141 for (
int j = 0; j <
n; j++)
144 *(d++) = dots(*(it + i), *(it +
n + j));
150 template<
unsigned NEXCITED>
153 inline size_t flat_idx(
const int i,
const int a,
const int n) {
return a + i *
n; }
159 template<
typename VALUE>
160 static VALUE
evaluate(
const VALUE* table_matrix,
const int* it,
const size_t nb_cols)
163 const int a = *(it + 1);
164 const int n = nb_cols;
165 return table_matrix[
flat_idx(i, a, nb_cols)];
173 template<
typename VALUE>
174 static VALUE
evaluate(
const VALUE* table_matrix,
const int* it,
const size_t nb_cols)
177 const int j = *(it + 1);
178 const int a = *(it + 2);
179 const int b = *(it + 3);
180 const int n = nb_cols;
182 table_matrix[
flat_idx(i, b, nb_cols)],
183 table_matrix[
flat_idx(j, a, nb_cols)],
184 table_matrix[
flat_idx(j, b, nb_cols)]);
192 template<
typename VALUE>
193 static VALUE
evaluate(
const VALUE* table_matrix,
const int* it,
const size_t nb_cols)
196 const int i2 = *(it + 1);
197 const int i3 = *(it + 2);
198 const int a1 = *(it + 3);
199 const int a2 = *(it + 4);
200 const int a3 = *(it + 5);
202 table_matrix[
flat_idx(i1, a2, nb_cols)],
203 table_matrix[
flat_idx(i1, a3, nb_cols)],
204 table_matrix[
flat_idx(i2, a1, nb_cols)],
205 table_matrix[
flat_idx(i2, a2, nb_cols)],
206 table_matrix[
flat_idx(i2, a3, nb_cols)],
207 table_matrix[
flat_idx(i3, a1, nb_cols)],
208 table_matrix[
flat_idx(i3, a2, nb_cols)],
209 table_matrix[
flat_idx(i3, a3, nb_cols)]);
217 template<
typename VALUE>
218 static VALUE
evaluate(
const VALUE* table_matrix,
const int* it,
const size_t nb_cols)
221 const int i2 = *(it + 1);
222 const int i3 = *(it + 2);
223 const int i4 = *(it + 3);
224 const int a1 = *(it + 4);
225 const int a2 = *(it + 5);
226 const int a3 = *(it + 6);
227 const int a4 = *(it + 7);
229 table_matrix[
flat_idx(i1, a2, nb_cols)],
230 table_matrix[
flat_idx(i1, a3, nb_cols)],
231 table_matrix[
flat_idx(i1, a4, nb_cols)],
232 table_matrix[
flat_idx(i2, a1, nb_cols)],
233 table_matrix[
flat_idx(i2, a2, nb_cols)],
234 table_matrix[
flat_idx(i2, a3, nb_cols)],
235 table_matrix[
flat_idx(i2, a4, nb_cols)],
236 table_matrix[
flat_idx(i3, a1, nb_cols)],
237 table_matrix[
flat_idx(i3, a2, nb_cols)],
238 table_matrix[
flat_idx(i3, a3, nb_cols)],
239 table_matrix[
flat_idx(i3, a4, nb_cols)],
240 table_matrix[
flat_idx(i4, a1, nb_cols)],
241 table_matrix[
flat_idx(i4, a2, nb_cols)],
242 table_matrix[
flat_idx(i4, a3, nb_cols)],
243 table_matrix[
flat_idx(i4, a4, nb_cols)]);
251 template<
typename VALUE>
252 static VALUE
evaluate(
const VALUE* table_matrix,
const int* it,
const size_t nb_cols)
255 const int i2 = *(it + 1);
256 const int i3 = *(it + 2);
257 const int i4 = *(it + 3);
258 const int i5 = *(it + 4);
259 const int a1 = *(it + 5);
260 const int a2 = *(it + 6);
261 const int a3 = *(it + 7);
262 const int a4 = *(it + 8);
263 const int a5 = *(it + 9);
266 table_matrix[
flat_idx(i1, a3, nb_cols)], table_matrix[
flat_idx(i1, a4, nb_cols)],
267 table_matrix[
flat_idx(i1, a5, nb_cols)], table_matrix[
flat_idx(i2, a1, nb_cols)],
268 table_matrix[
flat_idx(i2, a2, nb_cols)], table_matrix[
flat_idx(i2, a3, nb_cols)],
269 table_matrix[
flat_idx(i2, a4, nb_cols)], table_matrix[
flat_idx(i2, a5, nb_cols)],
270 table_matrix[
flat_idx(i3, a1, nb_cols)], table_matrix[
flat_idx(i3, a2, nb_cols)],
271 table_matrix[
flat_idx(i3, a3, nb_cols)], table_matrix[
flat_idx(i3, a4, nb_cols)],
272 table_matrix[
flat_idx(i3, a5, nb_cols)], table_matrix[
flat_idx(i4, a1, nb_cols)],
273 table_matrix[
flat_idx(i4, a2, nb_cols)], table_matrix[
flat_idx(i4, a3, nb_cols)],
274 table_matrix[
flat_idx(i4, a4, nb_cols)], table_matrix[
flat_idx(i4, a5, nb_cols)],
275 table_matrix[
flat_idx(i5, a1, nb_cols)], table_matrix[
flat_idx(i5, a2, nb_cols)],
276 table_matrix[
flat_idx(i5, a3, nb_cols)], table_matrix[
flat_idx(i5, a4, nb_cols)],
277 table_matrix[
flat_idx(i5, a5, nb_cols)]);
281 template<
typename VALUE>
297 throw std::runtime_error(
"calculateSmallDeterminant only handles the number of excitations <= 5.");
static T evaluate(T a11, T a12, T a13, T a21, T a22, T a23, T a31, T a32, T a33)
Function class calculates multi determinant ratio from matrix elements needs to be the size of your r...
helper functions for EinsplineSetBuilder
T Determinant(T *restrict x, int n, int m, int *restrict pivot)
determinant of a matrix
static VALUE evaluate(const VALUE *table_matrix, const int *it, const size_t nb_cols)
VALUE calcSmallDeterminant(size_t n, const VALUE *table_matrix, const int *it, const size_t nb_cols)
T evaluate(const OffloadMatrix< T > &dots, ITER it, int n)
static VALUE evaluate(const VALUE *table_matrix, const int *it, const size_t nb_cols)
static T evaluate(T a11, T a12, T a13, T a14, T a15, T a21, T a22, T a23, T a24, T a25, T a31, T a32, T a33, T a34, T a35, T a41, T a42, T a43, T a44, T a45, T a51, T a52, T a53, T a54, T a55)
static T evaluate(T a11, T a12, T a21, T a22)
static VALUE evaluate(const VALUE *table_matrix, const int *it, const size_t nb_cols)
Define determinant operators.
static T evaluate(T a11, T a12, T a13, T a14, T a21, T a22, T a23, T a24, T a31, T a32, T a33, T a34, T a41, T a42, T a43, T a44)
void evaluate(Matrix< T, Alloc > &lhs, const Op &op, const Expression< RHS > &rhs)
static VALUE evaluate(const VALUE *table_matrix, const int *it, const size_t nb_cols)
size_t flat_idx(const int i, const int a, const int n)
static VALUE evaluate(const VALUE *table_matrix, const int *it, const size_t nb_cols)