1 ////////////////////////////////////////////////////////////////////////////////////// 2 //// This file is distributed under the University of Illinois/NCSA Open Source License. 3 //// See LICENSE file in top directory for details. 4 //// 5 //// Copyright (c) QMCPACK developers. 6 //// 7 //// File developed by: Sergio D. Pineda Flores, sergio_pinedaflores@berkeley.edu, University of California, Berkeley 8 //// Eric Neuscamman, eneuscamman@berkeley.edu, University of California, Berkeley 9 //// Ye Luo, yeluo@anl.gov, Argonne National Laboratory 10 //// 11 //// File created by: Sergio D. Pineda Flores, sergio_pinedaflores@berkeley.edu, University of California, Berkeley 12 //////////////////////////////////////////////////////////////////////////////////////// 13 #ifndef QMCPLUSPLUS_ROTATION_HELPER_H 14 #define QMCPLUSPLUS_ROTATION_HELPER_H 15 16 #include "QMCWaveFunctions/SPOSet.h" 17 18 19 namespace qmcplusplus 20 { 21 class RotatedSPOs : public SPOSet 22 { 23 public: 24 //constructor 25 RotatedSPOs(SPOSet* spos); 26 //destructor 27 ~RotatedSPOs(); 28 29 //vector that contains active orbital rotation parameter indices 30 std::vector<std::pair<int, int>> m_act_rot_inds; 31 32 //function to perform orbital rotations 33 void apply_rotation(const std::vector<RealType>& param, bool use_stored_copy); 34 35 //helper function to apply_rotation 36 void exponentiate_antisym_matrix(ValueMatrix_t& mat); 37 38 //A particular SPOSet used for Orbitals 39 SPOSet* Phi; 40 41 /// true if SPO parameters (orbital rotation parameters) have been supplied by input 42 bool params_supplied; 43 /// list of supplied orbital rotation parameters 44 std::vector<RealType> params; 45 46 /// the number of electrons of the majority spin 47 size_t nel_major_; 48 49 SPOSet* makeClone() const override; 50 51 // myG_temp (myL_temp) is the Gradient (Laplacian) value of of the Determinant part of the wfn 52 // myG_J is the Gradient of the all other parts of the wavefunction (typically just the Jastrow). 53 // It represents \frac{\nabla\psi_{J}}{\psi_{J}} 54 // myL_J will be used to represent \frac{\nabla^2\psi_{J}}{\psi_{J}} . The Laplacian portion 55 // IMPORTANT NOTE: The value of P.L holds \nabla^2 ln[\psi] but we need \frac{\nabla^2 \psi}{\psi} and this is what myL_J will hold 56 ParticleSet::ParticleGradient_t myG_temp, myG_J; 57 ParticleSet::ParticleLaplacian_t myL_temp, myL_J; 58 59 ValueMatrix_t Bbar; 60 ValueMatrix_t psiM_inv; 61 ValueMatrix_t psiM_all; 62 GradMatrix_t dpsiM_all; 63 ValueMatrix_t d2psiM_all; 64 65 66 // Single Slater creation 67 void buildOptVariables(const size_t nel) override; 68 // For the MSD case rotations must be created in MultiSlaterFast class 69 void buildOptVariables(const std::vector<std::pair<int, int>>& rotations) override; 70 71 72 void evaluateDerivatives(ParticleSet& P, 73 const opt_variables_type& optvars, 74 std::vector<ValueType>& dlogpsi, 75 std::vector<ValueType>& dhpsioverpsi, 76 const int& FirstIndex, 77 const int& LastIndex) override; 78 79 void evaluateDerivatives(ParticleSet& P, 80 const opt_variables_type& optvars, 81 std::vector<ValueType>& dlogpsi, 82 std::vector<ValueType>& dhpsioverpsi, 83 const ValueType& psiCurrent, 84 const std::vector<ValueType>& Coeff, 85 const std::vector<size_t>& C2node_up, 86 const std::vector<size_t>& C2node_dn, 87 const ValueVector_t& detValues_up, 88 const ValueVector_t& detValues_dn, 89 const GradMatrix_t& grads_up, 90 const GradMatrix_t& grads_dn, 91 const ValueMatrix_t& lapls_up, 92 const ValueMatrix_t& lapls_dn, 93 const ValueMatrix_t& M_up, 94 const ValueMatrix_t& M_dn, 95 const ValueMatrix_t& Minv_up, 96 const ValueMatrix_t& Minv_dn, 97 const GradMatrix_t& B_grad, 98 const ValueMatrix_t& B_lapl, 99 const std::vector<int>& detData_up, 100 const size_t N1, 101 const size_t N2, 102 const size_t NP1, 103 const size_t NP2, 104 const std::vector<std::vector<int>>& lookup_tbl) override; 105 106 void evaluateDerivativesWF(ParticleSet& P, 107 const opt_variables_type& optvars, 108 std::vector<ValueType>& dlogpsi, 109 const QTFull::ValueType& psiCurrent, 110 const std::vector<ValueType>& Coeff, 111 const std::vector<size_t>& C2node_up, 112 const std::vector<size_t>& C2node_dn, 113 const ValueVector_t& detValues_up, 114 const ValueVector_t& detValues_dn, 115 const ValueMatrix_t& M_up, 116 const ValueMatrix_t& M_dn, 117 const ValueMatrix_t& Minv_up, 118 const ValueMatrix_t& Minv_dn, 119 const std::vector<int>& detData_up, 120 const std::vector<std::vector<int>>& lookup_tbl) override; 121 122 //helper function to evaluatederivative; evaluate orbital rotation parameter derivative using table method 123 void table_method_eval(std::vector<ValueType>& dlogpsi, 124 std::vector<ValueType>& dhpsioverpsi, 125 const ParticleSet::ParticleLaplacian_t& myL_J, 126 const ParticleSet::ParticleGradient_t& myG_J, 127 const size_t nel, 128 const size_t nmo, 129 const ValueType& psiCurrent, 130 const std::vector<RealType>& Coeff, 131 const std::vector<size_t>& C2node_up, 132 const std::vector<size_t>& C2node_dn, 133 const ValueVector_t& detValues_up, 134 const ValueVector_t& detValues_dn, 135 const GradMatrix_t& grads_up, 136 const GradMatrix_t& grads_dn, 137 const ValueMatrix_t& lapls_up, 138 const ValueMatrix_t& lapls_dn, 139 const ValueMatrix_t& M_up, 140 const ValueMatrix_t& M_dn, 141 const ValueMatrix_t& Minv_up, 142 const ValueMatrix_t& Minv_dn, 143 const GradMatrix_t& B_grad, 144 const ValueMatrix_t& B_lapl, 145 const std::vector<int>& detData_up, 146 const size_t N1, 147 const size_t N2, 148 const size_t NP1, 149 const size_t NP2, 150 const std::vector<std::vector<int>>& lookup_tbl); 151 152 void table_method_evalWF(std::vector<ValueType>& dlogpsi, 153 const size_t nel, 154 const size_t nmo, 155 const ValueType& psiCurrent, 156 const std::vector<RealType>& Coeff, 157 const std::vector<size_t>& C2node_up, 158 const std::vector<size_t>& C2node_dn, 159 const ValueVector_t& detValues_up, 160 const ValueVector_t& detValues_dn, 161 const ValueMatrix_t& M_up, 162 const ValueMatrix_t& M_dn, 163 const ValueMatrix_t& Minv_up, 164 const ValueMatrix_t& Minv_dn, 165 const std::vector<int>& detData_up, 166 const std::vector<std::vector<int>>& lookup_tbl); 167 checkInVariables(opt_variables_type & active)168 void checkInVariables(opt_variables_type& active) override 169 { 170 //reset parameters to zero after coefficient matrix has been updated 171 for (int k = 0; k < myVars.size(); ++k) 172 myVars[k] = 0.0; 173 174 if (Optimizable) 175 { 176 if (myVars.size()) 177 active.insertFrom(myVars); 178 Phi->storeParamsBeforeRotation(); 179 } 180 } 181 checkOutVariables(const opt_variables_type & active)182 void checkOutVariables(const opt_variables_type& active) override 183 { 184 if (Optimizable) 185 { 186 myVars.getIndex(active); 187 } 188 } 189 190 ///reset resetParameters(const opt_variables_type & active)191 void resetParameters(const opt_variables_type& active) override 192 { 193 if (Optimizable) 194 { 195 std::vector<RealType> param(m_act_rot_inds.size()); 196 for (int i = 0; i < m_act_rot_inds.size(); i++) 197 { 198 int loc = myVars.where(i); 199 param[i] = myVars[i] = active[loc]; 200 } 201 apply_rotation(param, true); 202 } 203 } 204 205 //********************************************************************************* 206 //the following functions simply call Phi's corresponding functions setOrbitalSetSize(int norbs)207 void setOrbitalSetSize(int norbs) override { Phi->setOrbitalSetSize(norbs); } 208 209 // void setBasisSet(basis_type* bs); 210 getBasisSetSize()211 int getBasisSetSize() const override { return Phi->getBasisSetSize(); } 212 checkObject()213 void checkObject() const override { Phi->checkObject(); } 214 evaluateValue(const ParticleSet & P,int iat,ValueVector_t & psi)215 void evaluateValue(const ParticleSet& P, int iat, ValueVector_t& psi) override 216 { 217 assert(psi.size() <= OrbitalSetSize); 218 Phi->evaluateValue(P, iat, psi); 219 } 220 221 evaluateVGL(const ParticleSet & P,int iat,ValueVector_t & psi,GradVector_t & dpsi,ValueVector_t & d2psi)222 void evaluateVGL(const ParticleSet& P, int iat, ValueVector_t& psi, GradVector_t& dpsi, ValueVector_t& d2psi) override 223 { 224 assert(psi.size() <= OrbitalSetSize); 225 Phi->evaluateVGL(P, iat, psi, dpsi, d2psi); 226 } 227 evaluateDetRatios(const VirtualParticleSet & VP,ValueVector_t & psi,const ValueVector_t & psiinv,std::vector<ValueType> & ratios)228 void evaluateDetRatios(const VirtualParticleSet& VP, 229 ValueVector_t& psi, 230 const ValueVector_t& psiinv, 231 std::vector<ValueType>& ratios) override 232 { 233 Phi->evaluateDetRatios(VP, psi, psiinv, ratios); 234 } 235 evaluateVGH(const ParticleSet & P,int iat,ValueVector_t & psi,GradVector_t & dpsi,HessVector_t & grad_grad_psi)236 void evaluateVGH(const ParticleSet& P, 237 int iat, 238 ValueVector_t& psi, 239 GradVector_t& dpsi, 240 HessVector_t& grad_grad_psi) override 241 { 242 assert(psi.size() <= OrbitalSetSize); 243 Phi->evaluateVGH(P, iat, psi, dpsi, grad_grad_psi); 244 } 245 246 evaluateVGHGH(const ParticleSet & P,int iat,ValueVector_t & psi,GradVector_t & dpsi,HessVector_t & grad_grad_psi,GGGVector_t & grad_grad_grad_psi)247 void evaluateVGHGH(const ParticleSet& P, 248 int iat, 249 ValueVector_t& psi, 250 GradVector_t& dpsi, 251 HessVector_t& grad_grad_psi, 252 GGGVector_t& grad_grad_grad_psi) override 253 { 254 Phi->evaluateVGHGH(P, iat, psi, dpsi, grad_grad_psi, grad_grad_grad_psi); 255 } 256 257 evaluate_notranspose(const ParticleSet & P,int first,int last,ValueMatrix_t & logdet,GradMatrix_t & dlogdet,ValueMatrix_t & d2logdet)258 void evaluate_notranspose(const ParticleSet& P, 259 int first, 260 int last, 261 ValueMatrix_t& logdet, 262 GradMatrix_t& dlogdet, 263 ValueMatrix_t& d2logdet) override 264 { 265 Phi->evaluate_notranspose(P, first, last, logdet, dlogdet, d2logdet); 266 } 267 evaluate_notranspose(const ParticleSet & P,int first,int last,ValueMatrix_t & logdet,GradMatrix_t & dlogdet,HessMatrix_t & grad_grad_logdet)268 void evaluate_notranspose(const ParticleSet& P, 269 int first, 270 int last, 271 ValueMatrix_t& logdet, 272 GradMatrix_t& dlogdet, 273 HessMatrix_t& grad_grad_logdet) override 274 { 275 Phi->evaluate_notranspose(P, first, last, logdet, dlogdet, grad_grad_logdet); 276 } 277 evaluate_notranspose(const ParticleSet & P,int first,int last,ValueMatrix_t & logdet,GradMatrix_t & dlogdet,HessMatrix_t & grad_grad_logdet,GGGMatrix_t & grad_grad_grad_logdet)278 void evaluate_notranspose(const ParticleSet& P, 279 int first, 280 int last, 281 ValueMatrix_t& logdet, 282 GradMatrix_t& dlogdet, 283 HessMatrix_t& grad_grad_logdet, 284 GGGMatrix_t& grad_grad_grad_logdet) override 285 { 286 Phi->evaluate_notranspose(P, first, last, logdet, dlogdet, grad_grad_logdet, grad_grad_grad_logdet); 287 } 288 evaluateGradSource(const ParticleSet & P,int first,int last,const ParticleSet & source,int iat_src,GradMatrix_t & grad_phi)289 void evaluateGradSource(const ParticleSet& P, 290 int first, 291 int last, 292 const ParticleSet& source, 293 int iat_src, 294 GradMatrix_t& grad_phi) override 295 { 296 Phi->evaluateGradSource(P, first, last, source, iat_src, grad_phi); 297 } 298 evaluateGradSource(const ParticleSet & P,int first,int last,const ParticleSet & source,int iat_src,GradMatrix_t & grad_phi,HessMatrix_t & grad_grad_phi,GradMatrix_t & grad_lapl_phi)299 void evaluateGradSource(const ParticleSet& P, 300 int first, 301 int last, 302 const ParticleSet& source, 303 int iat_src, 304 GradMatrix_t& grad_phi, 305 HessMatrix_t& grad_grad_phi, 306 GradMatrix_t& grad_lapl_phi) override 307 { 308 Phi->evaluateGradSource(P, first, last, source, iat_src, grad_phi, grad_grad_phi, grad_lapl_phi); 309 } 310 311 // void evaluateThirdDeriv(const ParticleSet& P, int first, int last, GGGMatrix_t& grad_grad_grad_logdet) 312 // {Phi->evaluateThridDeriv(P, first, last, grad_grad_grad_logdet); } 313 }; 314 315 } //namespace qmcplusplus 316 317 #endif 318