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