17 #ifndef QMCPLUSPLUS_POLYNOMIAL3D_FUNCTOR_H 18 #define QMCPLUSPLUS_POLYNOMIAL3D_FUNCTOR_H 63 app_error() <<
"PolynomialFunctor3D does not support nonzero cusp.\n";
93 for (
int l =
m; l <=
N_eI; l++)
112 for (k = 0; k <= 2 *
N_eI; k++)
114 for (
int m = 0;
m <= k;
m++)
128 for (
int kp = 0; kp <=
N_eI +
N_ee; kp++)
135 for (
int l = 1; l <= kp; l++)
172 if (abs_val > max_abs)
178 if (max_abs < 1.0
e-6)
180 }
while (max_abs < 1.0
e-6);
196 for (
int c = col + 1; c <
NumGamma; c++)
253 for (
int m = 0;
m <=
N_eI;
m++)
254 for (
int l =
m; l <=
N_eI; l++)
255 for (
int n = 0;
n <=
N_ee;
n++)
260 for (
int k = 0; k <= 2 *
N_eI; k++)
263 for (
int m = 0;
m <= k;
m++)
276 std::cerr <<
"error in k = " << k <<
" sum = " << sum << std::endl;
278 for (
int k = 0; k <= 2 *
N_eI; k++)
281 for (
int l = 0; l <= k; l++)
293 app_error() <<
"e-e constraint not satisfied in PolynomialFunctor3D: k=" << k <<
" sum=" << sum << std::endl;
298 for (
int k = 0; k <=
N_eI +
N_ee; k++)
301 for (
int m = 0;
m <= k;
m++)
314 app_error() <<
"e-I constraint not satisfied in PolynomialFunctor3D: k=" << k <<
" sum=" << sum << std::endl;
327 if (r_1I >= L || r_2I >= L)
331 for (
int l = 0; l <=
N_eI; l++)
334 for (
int m = 0;
m <=
N_eI;
m++)
337 for (
int n = 0;
n <=
N_ee;
n++)
346 for (
int i = 0; i <
C; i++)
347 val *= (r_1I - L) * (r_2I - L);
355 const real_type* restrict r_2I_array)
const 364 #pragma omp simd aligned(r_12_array, r_1I_array, r_2I_array : QMC_SIMD_ALIGNMENT) reduction(+ : val_tot) 365 for (
int ptcl = 0; ptcl < Nptcl; ptcl++)
372 for (
int l = 0; l <=
N_eI; l++)
375 for (
int m = 0;
m <=
N_eI;
m++)
378 for (
int n = 0;
n <=
N_ee;
n++)
387 const real_type both_minus_L = (r_2I - L) * (r_1I - L);
388 for (
int i = 0; i <
C; i++)
408 if (r_1I >= L || r_2I >= L)
418 for (
int l = 0; l <=
N_eI; l++)
421 for (
int m = 0;
m <=
N_eI;
m++)
424 for (
int n = 0;
n <=
N_ee;
n++)
433 grad[0] += g00x * r2n_1;
434 grad[1] += g10x * r2n;
435 grad[2] += g01x * r2n;
436 hess(0, 0) += g00x * r2n_2;
437 hess(0, 1) += g10x * r2n_1;
438 hess(0, 2) += g01x * r2n_1;
439 hess(1, 1) += gxx0 * r2l_2 * r2m;
440 hess(1, 2) += gxx0 * r2l_1 * r2m_1;
441 hess(2, 2) += gxx0 * r2l * r2m_2;
460 const real_type both_minus_L = r_2I_minus_L * r_1I_minus_L;
461 for (
int i = 0; i <
C; i++)
463 hess(0, 0) = both_minus_L * hess(0, 0);
464 hess(0, 1) = both_minus_L * hess(0, 1) + r_2I_minus_L * grad[0];
465 hess(0, 2) = both_minus_L * hess(0, 2) + r_1I_minus_L * grad[0];
466 hess(1, 1) = both_minus_L * hess(1, 1) + ctwo * r_2I_minus_L * grad[1];
467 hess(1, 2) = both_minus_L * hess(1, 2) + r_1I_minus_L * grad[1] + r_2I_minus_L * grad[2] + val;
468 hess(2, 2) = both_minus_L * hess(2, 2) + ctwo * r_1I_minus_L * grad[2];
469 grad[0] = both_minus_L * grad[0];
470 grad[1] = both_minus_L * grad[1] + r_2I_minus_L * val;
471 grad[2] = both_minus_L * grad[2] + r_1I_minus_L * val;
474 hess(1, 0) = hess(0, 1);
475 hess(2, 0) = hess(0, 2);
476 hess(2, 1) = hess(1, 2);
501 #pragma omp simd aligned(r_12_array, r_1I_array, r_2I_array, val_array, grad0_array, grad1_array, grad2_array, \ 502 hess00_array, hess11_array, hess22_array, hess01_array, hess02_array \ 503 : QMC_SIMD_ALIGNMENT) 504 for (
int ptcl = 0; ptcl < Nptcl; ptcl++)
521 for (
int l = 0; l <=
N_eI; l++)
524 for (
int m = 0;
m <=
N_eI;
m++)
527 for (
int n = 0;
n <=
N_ee;
n++)
536 grad0 += g00x * r2n_1;
539 hess00 += g00x * r2n_2;
540 hess01 += g10x * r2n_1;
541 hess02 += g01x * r2n_1;
542 hess11 += gxx0 * r2l_2 * r2m;
543 hess22 += gxx0 * r2l * r2m_2;
562 const real_type both_minus_L = r_2I_minus_L * r_1I_minus_L;
563 for (
int i = 0; i <
C; i++)
565 hess00 = both_minus_L * hess00;
566 hess01 = both_minus_L * hess01 + r_2I_minus_L * grad0;
567 hess02 = both_minus_L * hess02 + r_1I_minus_L * grad0;
568 hess11 = both_minus_L * hess11 + ctwo * r_2I_minus_L * grad1;
569 hess22 = both_minus_L * hess22 + ctwo * r_1I_minus_L * grad2;
570 grad0 = both_minus_L * grad0;
571 grad1 = both_minus_L * grad1 + r_2I_minus_L * val;
572 grad2 = both_minus_L * grad2 + r_1I_minus_L * val;
576 val_array[ptcl] = val;
577 grad0_array[ptcl] = grad0 / r_12;
578 grad1_array[ptcl] = grad1 / r_1I;
579 grad2_array[ptcl] = grad2 / r_2I;
580 hess00_array[ptcl] = hess00;
581 hess11_array[ptcl] = hess11;
582 hess22_array[ptcl] = hess22;
583 hess01_array[ptcl] = hess01 / (r_12 * r_1I);
584 hess02_array[ptcl] = hess02 / (r_12 * r_2I);
600 if (r_1I >= L || r_2I >= L)
603 real_type r2l(1.0), r2l_1(0.0), r2l_2(0.0), r2l_3(0.0), lf(0.0);
604 for (
int l = 0; l <=
N_eI; l++)
606 real_type r2m(1.0), r2m_1(0.0), r2m_2(0.0), r2m_3(0.0), mf(0.0);
607 for (
int m = 0;
m <=
N_eI;
m++)
609 real_type r2n(1.0), r2n_1(0.0), r2n_2(0.0), r2n_3(0.0), nf(0.0);
610 for (
int n = 0;
n <=
N_ee;
n++)
613 val += g * r2l * r2m * r2n;
614 grad[0] += nf * g * r2l * r2m * r2n_1;
615 grad[1] += lf * g * r2l_1 * r2m * r2n;
616 grad[2] += mf * g * r2l * r2m_1 * r2n;
617 hess(0, 0) += nf * (nf - 1.0) * g * r2l * r2m * r2n_2;
618 hess(0, 1) += nf * lf * g * r2l_1 * r2m * r2n_1;
619 hess(0, 2) += nf * mf * g * r2l * r2m_1 * r2n_1;
620 hess(1, 1) += lf * (lf - 1.0) * g * r2l_2 * r2m * r2n;
621 hess(1, 2) += lf * mf * g * r2l_1 * r2m_1 * r2n;
622 hess(2, 2) += mf * (mf - 1.0) * g * r2l * r2m_2 * r2n;
623 d3[0](0, 0) += nf * (nf - 1.0) * (nf - 2.0) * g * r2l * r2m * r2n_3;
624 d3[0](0, 1) += nf * (nf - 1.0) * lf * g * r2l_1 * r2m * r2n_2;
625 d3[0](0, 2) += nf * (nf - 1.0) * mf * g * r2l * r2m_1 * r2n_2;
626 d3[0](1, 1) += nf * lf * (lf - 1.0) * g * r2l_2 * r2m * r2n_1;
627 d3[0](1, 2) += nf * lf * mf * g * r2l_1 * r2m_1 * r2n_1;
628 d3[0](2, 2) += nf * mf * (mf - 1.0) * g * r2l * r2m_2 * r2n_1;
629 d3[1](1, 1) += lf * (lf - 1.0) * (lf - 2.0) * g * r2l_3 * r2m * r2n;
630 d3[1](1, 2) += lf * (lf - 1.0) * mf * g * r2l_2 * r2m_1 * r2n;
631 d3[1](2, 2) += lf * mf * (mf - 1.0) * g * r2l_1 * r2m_2 * r2n;
632 d3[2](2, 2) += mf * (mf - 1.0) * (mf - 2.0) * g * r2l * r2m_3 * r2n;
651 for (
int i = 0; i <
C; i++)
653 d3[0](0, 0) = (r_1I - L) * (r_2I - L) * d3[0](0, 0);
654 d3[0](0, 1) = (r_1I - L) * (r_2I - L) * d3[0](0, 1) + (r_2I - L) * hess(0, 0);
655 d3[0](0, 2) = (r_1I - L) * (r_2I - L) * d3[0](0, 2) + (r_1I - L) * hess(0, 0);
656 d3[0](1, 1) = (r_1I - L) * (r_2I - L) * d3[0](1, 1) + 2.0 * (r_2I - L) * hess(0, 1);
657 d3[0](1, 2) = (r_1I - L) * (r_2I - L) * d3[0](1, 2) + (r_1I - L) * hess(0, 1) + (r_2I - L) * hess(0, 2) + grad[0];
658 d3[0](2, 2) = (r_1I - L) * (r_2I - L) * d3[0](2, 2) + 2.0 * (r_1I - L) * hess(0, 2);
659 d3[1](1, 1) = (r_1I - L) * (r_2I - L) * d3[1](1, 1) + 3.0 * (r_2I - L) * hess(1, 1);
660 d3[1](1, 2) = (r_1I - L) * (r_2I - L) * d3[1](1, 2) + 2.0 * (r_2I - L) * hess(1, 2) + 2.0 * grad[1] +
661 (r_1I - L) * hess(1, 1);
662 d3[1](2, 2) = (r_1I - L) * (r_2I - L) * d3[1](2, 2) + 2.0 * (r_1I - L) * hess(1, 2) + 2.0 * grad[2] +
663 (r_2I - L) * hess(2, 2);
664 d3[2](2, 2) = (r_1I - L) * (r_2I - L) * d3[2](2, 2) + 3.0 * (r_1I - L) * hess(2, 2);
665 hess(0, 0) = (r_1I - L) * (r_2I - L) * hess(0, 0);
666 hess(0, 1) = (r_1I - L) * (r_2I - L) * hess(0, 1) + (r_2I - L) * grad[0];
667 hess(0, 2) = (r_1I - L) * (r_2I - L) * hess(0, 2) + (r_1I - L) * grad[0];
668 hess(1, 1) = (r_1I - L) * (r_2I - L) * hess(1, 1) + 2.0 * (r_2I - L) * grad[1];
669 hess(1, 2) = (r_1I - L) * (r_2I - L) * hess(1, 2) + (r_1I - L) * grad[1] + (r_2I - L) * grad[2] + val;
670 hess(2, 2) = (r_1I - L) * (r_2I - L) * hess(2, 2) + 2.0 * (r_1I - L) * grad[2];
671 grad[0] = (r_1I - L) * (r_2I - L) * grad[0];
672 grad[1] = (r_1I - L) * (r_2I - L) * grad[1] + (r_2I - L) * val;
673 grad[2] = (r_1I - L) * (r_2I - L) * grad[2] + (r_1I - L) * val;
674 val *= (r_1I - L) * (r_2I - L);
676 hess(1, 0) = hess(0, 1);
677 hess(2, 0) = hess(0, 2);
678 hess(2, 1) = hess(1, 2);
679 d3[0](1, 0) = d3[0](0, 1);
680 d3[0](2, 0) = d3[0](0, 2);
681 d3[0](2, 1) = d3[0](1, 2);
682 d3[1](0, 0) = d3[0](1, 1);
683 d3[1](0, 1) = d3[0](0, 1);
684 d3[1](0, 2) = d3[0](1, 2);
685 d3[1](1, 0) = d3[0](0, 1);
686 d3[1](2, 0) = d3[0](1, 2);
687 d3[1](2, 1) = d3[1](1, 2);
688 d3[2](0, 0) = d3[0](0, 2);
689 d3[2](0, 1) = d3[0](1, 2);
690 d3[2](0, 2) = d3[0](2, 2);
691 d3[2](1, 0) = d3[0](1, 2);
692 d3[2](1, 1) = d3[1](1, 2);
693 d3[2](1, 2) = d3[1](2, 2);
694 d3[2](2, 0) = d3[0](2, 2);
695 d3[2](2, 1) = d3[1](2, 2);
706 std::vector<double>& d_vals,
714 for (
int ip = 0; ip <
Parameters.size(); ip++)
722 v_plus =
evaluate(r_12, r_1I, r_2I, g_plus, h_plus);
725 v_minus =
evaluate(r_12, r_1I, r_2I, g_minus, h_minus);
729 d_vals[ip] = dp_inv * (v_plus - v_minus);
730 d_grads[ip] = dp_inv * (g_plus - g_minus);
731 d_hess[ip] = dp_inv * (h_plus - h_minus);
740 std::vector<real_type>& d_vals)
743 if (r_1I >= L || r_2I >= L)
751 for (
int i = 0; i <
dval_Vec.size(); i++)
756 const real_type both_minus_L = r_2I_minus_L * r_1I_minus_L;
759 for (
int l = 0; l <=
N_eI; l++)
762 for (
int m = 0;
m <=
N_eI;
m++)
766 num = ((2 *
N_eI - l + 3) * l / 2 +
m - l) * (
N_ee + 1);
768 num = ((2 *
N_eI -
m + 3) *
m / 2 + l -
m) * (
N_ee + 1);
770 for (
int n = 0;
n <=
N_ee;
n++, num++)
772 dval_dgamma = r2l * r2m * r2n;
773 for (
int i = 0; i <
C; i++)
774 dval_dgamma *= both_minus_L;
789 std::fill(d_vals.begin(), d_vals.end(), 0.0);
820 std::vector<real_type>& d_vals,
825 if (r_1I >= L || r_2I >= L)
836 for (
int i = 0; i <
dval_Vec.size(); i++)
845 const real_type both_minus_L = r_2I_minus_L * r_1I_minus_L;
848 for (
int l = 0; l <=
N_eI; l++)
851 for (
int m = 0;
m <=
N_eI;
m++)
855 num = ((2 *
N_eI - l + 3) * l / 2 +
m - l) * (
N_ee + 1);
857 num = ((2 *
N_eI -
m + 3) *
m / 2 + l -
m) * (
N_ee + 1);
859 for (
int n = 0;
n <=
N_ee;
n++, num++)
861 dval_dgamma = r2l * r2m * r2n;
862 dgrad_dgamma[0] = r2l * r2m * r2n_1;
863 dgrad_dgamma[1] = r2l_1 * r2m * r2n;
864 dgrad_dgamma[2] = r2l * r2m_1 * r2n;
865 dhess_dgamma(0, 0) = r2l * r2m * r2n_2;
866 dhess_dgamma(0, 1) = r2l_1 * r2m * r2n_1;
867 dhess_dgamma(0, 2) = r2l * r2m_1 * r2n_1;
868 dhess_dgamma(1, 1) = r2l_2 * r2m * r2n;
869 dhess_dgamma(1, 2) = r2l_1 * r2m_1 * r2n;
870 dhess_dgamma(2, 2) = r2l * r2m_2 * r2n;
872 for (
int i = 0; i <
C; i++)
874 dhess_dgamma(0, 0) = both_minus_L * dhess_dgamma(0, 0);
875 dhess_dgamma(0, 1) = both_minus_L * dhess_dgamma(0, 1) + r_2I_minus_L * dgrad_dgamma[0];
876 dhess_dgamma(0, 2) = both_minus_L * dhess_dgamma(0, 2) + r_1I_minus_L * dgrad_dgamma[0];
877 dhess_dgamma(1, 1) = both_minus_L * dhess_dgamma(1, 1) + ctwo * r_2I_minus_L * dgrad_dgamma[1];
878 dhess_dgamma(1, 2) = both_minus_L * dhess_dgamma(1, 2) + r_1I_minus_L * dgrad_dgamma[1] +
879 r_2I_minus_L * dgrad_dgamma[2] + dval_dgamma;
880 dhess_dgamma(2, 2) = both_minus_L * dhess_dgamma(2, 2) + ctwo * r_1I_minus_L * dgrad_dgamma[2];
881 dgrad_dgamma[0] = both_minus_L * dgrad_dgamma[0];
882 dgrad_dgamma[1] = both_minus_L * dgrad_dgamma[1] + r_2I_minus_L * dval_dgamma;
883 dgrad_dgamma[2] = both_minus_L * dgrad_dgamma[2] + r_1I_minus_L * dval_dgamma;
884 dval_dgamma *= both_minus_L;
889 for (
int i = 0; i < 3; i++)
893 for (
int j = i + 1; j < 3; j++)
920 std::fill(d_vals.begin(), d_vals.end(), 0.0);
952 fprintf(stderr,
"Param Analytic Finite diffference\n");
953 for (
int ip = 0; ip <
Parameters.size(); ip++)
954 fprintf(stderr,
" %3d %12.6e %12.6e\n", ip, d_vals[ip],
d_valsFD[ip]);
955 fprintf(stderr,
"Param Analytic Finite diffference\n");
956 for (
int ip = 0; ip <
Parameters.size(); ip++)
957 fprintf(stderr,
" %3d %12.6e %12.6e %12.6e %12.6e %12.6e %12.6e\n", ip, d_grads[ip][0],
d_gradsFD[ip][0],
959 fprintf(stderr,
"Param Analytic Finite diffference\n");
960 for (
int ip = 0; ip <
Parameters.size(); ip++)
961 for (
int dim = 0; dim < 3; dim++)
962 fprintf(stderr,
" %3d %12.6e %12.6e %12.6e %12.6e %12.6e %12.6e\n", ip, d_hess[ip](0, dim),
963 d_hessFD[ip](0, dim), d_hess[ip](1, dim),
d_hessFD[ip](1, dim), d_hess[ip](2, dim),
971 bool put(xmlNodePtr cur)
override 973 ReportEngine PRE(
"PolynomialFunctor3D",
"put(xmlNodePtr)");
983 PRE.
error(
"You must specify a positive number for \"isize\"",
true);
985 PRE.
error(
"You must specify a positive number for \"esize\"",
true);
988 app_summary() <<
" Number of parameters for e-e: " <<
N_ee <<
", for e-I: " <<
N_eI << std::endl;
993 xmlNodePtr xmlCoefs = cur->xmlChildrenNode;
994 while (xmlCoefs != NULL)
996 std::string cname((
const char*)xmlCoefs->name);
997 if (cname ==
"coefficients")
999 std::string type(
"0"), id(
"0"), opt(
"yes");
1001 cAttrib.
add(
id,
"id");
1002 cAttrib.
add(type,
"type");
1003 cAttrib.
add(opt,
"optimize");
1004 cAttrib.
put(xmlCoefs);
1006 if (type !=
"Array")
1008 PRE.
error(
"Unknown correlation type " + type +
" in PolynomialFunctor3D." +
"Resetting to \"Array\"");
1009 xmlNewProp(xmlCoefs, (
const xmlChar*)
"type", (
const xmlChar*)
"Array");
1011 std::vector<real_type> params;
1018 <<
" but found " << params.size() <<
" in PolynomialFunctor3D.\n";
1019 if (params.size() != 0)
1025 std::stringstream sstr;
1026 sstr <<
id <<
"_" << i;
1042 int left_pad_spaces = 6;
1047 xmlCoefs = xmlCoefs->next;
std::vector< real_type > dval_Vec
helper functions for EinsplineSetBuilder
void setIndexDefault()
set default Indices, namely all the variables are active
void reset() override
reset function
MakeReturn< UnaryNode< FnFabs, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t abs(const Vector< T1, C1 > &l)
real_type evaluateV(int Nptcl, const real_type *restrict r_12_array, const real_type *restrict r_1I_array, const real_type *restrict r_2I_array) const
std::ostream & app_summary()
bool put(xmlNodePtr cur)
assign attributes to the set
constexpr std::complex< float > czero
constexpr std::complex< float > cone
std::ostream & app_error()
void swap_rows(int r1, int r2)
std::vector< std::string > ParameterNames
void resize(size_type n, size_type m)
Resize the container.
Define a base class for one-dimensional functions with optimizable variables.
void resize(const std::array< SIZET, D > &dims)
Resize the container.
real_type evaluate(const real_type r, const real_type rinv)
bool evaluateDerivativesFD(const real_type r_12, const real_type r_1I, const real_type r_2I, std::vector< double > &d_vals, std::vector< TinyVector< real_type, 3 >> &d_grads, std::vector< Tensor< real_type, 3 >> &d_hess)
std::vector< real_type > Parameters
void checkOutVariables(const opt_variables_type &active) override
check out variational optimizable variables
real_type evaluate(real_type r_12, real_type r_1I, real_type r_2I) const
void resetParametersExclusive(const opt_variables_type &active) override
reset the parameters during optimizations.
real_type evaluate(real_type r_12, real_type r_1I, real_type r_2I, TinyVector< real_type, 3 > &grad, Tensor< real_type, 3 > &hess) const
Tensor<T,D> class for D by D tensor.
bool evaluateDerivatives(const real_type r_12, const real_type r_1I, const real_type r_2I, std::vector< real_type > &d_vals)
calculate derivatives with respect to polynomial parameters
void insert(const std::string &vname, real_type v, bool enable=true, int type=OTHER_P)
std::vector< int > GammaPerm
Final class and should not be derived.
class to handle a set of attributes of an xmlNode
declaration of ProgressReportEngine
bool put(xmlNodePtr cur) override
process xmlnode and registers variables to optimize
real_type df(real_type r) override
class to handle a set of variables that can be modified during optimizations
void resize(int neI, int nee)
int where(int i) const
return the locator of the i-th Index
std::vector< real_type > GammaVec
OHMMS_PRECISION real_type
bool evaluateDerivatives(const real_type r_12, const real_type r_1I, const real_type r_2I, std::vector< real_type > &d_vals, std::vector< TinyVector< real_type, 3 >> &d_grads, std::vector< Tensor< real_type, 3 >> &d_hess)
real_type cutoff_radius
maximum cutoff
Base class for any functor with optimizable parameters.
bool putContent(T &a, xmlNodePtr cur)
replaces a's value with the first "element" in the "string" returned by XMLNodeString{cur}.
Define determinant operators.
void print(std::ostream &os)
Array< real_type, 3 > gamma
void error(const std::string &msg, bool fatal=false)
std::vector< bool > IndepVar
std::vector< TinyVector< real_type, 3 > > d_gradsFD
void insertFrom(const VariableSet &input)
insert a VariableSet to the list
std::vector< TinyVector< real_type, 3 > > dgrad_Vec
void checkInVariablesExclusive(opt_variables_type &active) override
check in variational parameters to the global list of parameters used by the optimizer.
PolynomialFunctor3D(const std::string &my_name, real_type ee_cusp=0.0, real_type eI_cusp=0.0)
constructor
OptimizableFunctorBase * makeClone() const override
create a clone of this object
void add(PDT &aparam, const std::string &aname, std::vector< PDT > candidate_values={}, TagStatus status=TagStatus::OPTIONAL)
add a new attribute
void evaluateVGL(int Nptcl, const real_type *restrict r_12_array, const real_type *restrict r_1I_array, const real_type *restrict r_2I_array, real_type *restrict val_array, real_type *restrict grad0_array, real_type *restrict grad1_array, real_type *restrict grad2_array, real_type *restrict hess00_array, real_type *restrict hess11_array, real_type *restrict hess22_array, real_type *restrict hess01_array, real_type *restrict hess02_array) const
void print(std::ostream &os, int leftPadSpaces=0, bool printHeader=false) const
optimize::VariableSet::real_type real_type
typedef for real values
int getIndex(const std::string &vname) const
return the Index vaule for the named parameter
Matrix< real_type > ConstraintMatrix
std::vector< Tensor< real_type, 3 > > d_hessFD
real_type evaluate(const real_type r_12, const real_type r_1I, const real_type r_2I, TinyVector< real_type, 3 > &grad, Tensor< real_type, 3 > &hess, TinyVector< Tensor< real_type, 3 >, 3 > &d3)
real_type f(real_type r) override
std::vector< real_type > d_valsFD
std::vector< Tensor< real_type, 3 > > dhess_Vec
opt_variables_type myVars
set of variables to be optimized