ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
kedf_ml.h
Go to the documentation of this file.
1#ifndef KEDF_ML_H
2#define KEDF_ML_H
3
4#ifdef __MLALGO
5
7
8#include <vector>
9#include "./ml_tools/nn_of.h"
10
12{
13public:
15 {
16 // this->stress.create(3,3);
17 }
19 {
20 delete this->cal_tool;
21 }
22
23 void set_para(
24 const int nx,
25 const double dV,
26 const double nelec,
27 const double tf_weight,
28 const double vw_weight,
29 const double chi_p,
30 const double chi_q,
31 const std::vector<double> &chi_xi,
32 const std::vector<double> &chi_pnl,
33 const std::vector<double> &chi_qnl,
34 const int &nkernel,
35 const std::vector<int> &kernel_type,
36 const std::vector<double> &kernel_scaling,
37 const std::vector<double> &yukawa_alpha,
38 const std::vector<std::string> &kernel_file,
39 const bool &of_ml_gamma,
40 const bool &of_ml_p,
41 const bool &of_ml_q,
42 const bool &of_ml_tanhp,
43 const bool &of_ml_tanhq,
44 const std::vector<int> &of_ml_gammanl,
45 const std::vector<int> &of_ml_pnl,
46 const std::vector<int> &of_ml_qnl,
47 const std::vector<int> &of_ml_xi,
48 const std::vector<int> &of_ml_tanhxi,
49 const std::vector<int> &of_ml_tanhxi_nl,
50 const std::vector<int> &of_ml_tanh_pnl,
51 const std::vector<int> &of_ml_tanh_qnl,
52 const std::vector<int> &of_ml_tanhp_nl,
53 const std::vector<int> &of_ml_tanhq_nl,
54 const std::string device_inpt,
55 ModulePW::PW_Basis *pw_rho);
56
57 void set_device(std::string device_inpt);
58
59 double get_energy(const double * const * prho, ModulePW::PW_Basis *pw_rho);
60 // double get_energy_density(const double * const *prho, int is, int ir, ModulePW::PW_Basis *pw_rho);
61 void ml_potential(const double * const * prho, ModulePW::PW_Basis *pw_rho, ModuleBase::matrix &rpotential);
62 // void get_stress(double cellVol, const double * const * prho, ModulePW::PW_Basis *pw_rho, double vw_weight);
63 // double diffLinhard(double eta, double vw_weight);
64
65 // output all parameters
66 void generateTrainData(const double * const *prho, ModulePW::PW_Basis *pw_rho, const double *veff);
67 void localTest(const double * const *prho, ModulePW::PW_Basis *pw_rho);
68
69 // interface to NN
70 void NN_forward(const double * const * prho, ModulePW::PW_Basis *pw_rho, bool cal_grad);
71
72 void get_potential_(const double * const * prho, ModulePW::PW_Basis *pw_rho, ModuleBase::matrix &rpotential);
73
74 // potentials
75 double potGammaTerm(int ir);
76 double potPTerm1(int ir);
77 double potQTerm1(int ir);
78 double potXiTerm1(int ir);
79 double potTanhxiTerm1(int ir);
80 double potTanhpTerm1(int ir);
81 double potTanhqTerm1(int ir);
82 void potGammanlTerm(const double * const *prho, ModulePW::PW_Basis *pw_rho, std::vector<double> &rGammanlTerm);
83 void potXinlTerm(const double * const *prho, ModulePW::PW_Basis *pw_rho, std::vector<double> &rXinlTerm);
84 void potTanhxinlTerm(const double * const *prho, ModulePW::PW_Basis *pw_rho, std::vector<double> &rTanhxinlTerm);
85 void potTanhxi_nlTerm(const double * const *prho, ModulePW::PW_Basis *pw_rho, std::vector<double> &rTanhxi_nlTerm); // 2023-03-20 for tanhxi_nl
86 void potPPnlTerm(const double * const *prho, ModulePW::PW_Basis *pw_rho, std::vector<double> &rPPnlTerm);
87 void potQQnlTerm(const double * const *prho, ModulePW::PW_Basis *pw_rho, std::vector<double> &rQQnlTerm);
88 void potTanhpTanh_pnlTerm(const double * const *prho, ModulePW::PW_Basis *pw_rho, std::vector<double> &rTanhpTanh_pnlTerm);
89 void potTanhqTanh_qnlTerm(const double * const *prho, ModulePW::PW_Basis *pw_rho, std::vector<double> &rTanhqTanh_qnlTerm);
90 void potTanhpTanhp_nlTerm(const double * const *prho, ModulePW::PW_Basis *pw_rho, std::vector<double> &rTanhpTanhp_nlTerm);
91 void potTanhqTanhq_nlTerm(const double * const *prho, ModulePW::PW_Basis *pw_rho, std::vector<double> &rTanhqTanhq_nlTerm);
92 // tools
93 void loadVector(std::string filename, std::vector<double> &data);
94 void dumpVector(std::string filename, const std::vector<double> &data);
95 void dumpTensor(std::string filename, const torch::Tensor &data);
96 void dumpMatrix(std::string filename, const ModuleBase::matrix &data);
97 void updateInput(const double * const * prho, ModulePW::PW_Basis *pw_rho);
98
100
101 int nx = 0; // number of grid points
102 int nx_tot = 0; // equal to nx (called by NN)
103 double dV = 0.;
104 // double weightml = 1.;
105 const double cTF = 3.0/10.0 * std::pow(3*std::pow(M_PI, 2.0), 2.0/3.0) * 2; // 10/3*(3*pi^2)^{2/3}, multiply by 2 to convert unit from Hartree to Ry, finally in Ry*Bohr^(-2)
106 const double pqcoef = 1.0 / (4.0 * std::pow(3*std::pow(M_PI, 2.0), 2.0/3.0)); // coefficient of p and q
107 double ml_energy = 0.;
108 // ModuleBase::matrix stress;
109 double feg_net_F = 0.;
110 double feg3_correct = 0.541324854612918; // ln(e - 1)
111
112 // Descriptors and hyperparameters
113 int ninput = 0; // number of descriptors
114 std::vector<double> gamma = {};
115 std::vector<double> p = {};
116 std::vector<double> q = {};
117 std::vector<std::vector<double>> gammanl = {};
118 std::vector<std::vector<double>> pnl = {};
119 std::vector<std::vector<double>> qnl = {};
120 std::vector<std::vector<double>> nablaRho = {};
121 // new parameters 2023-02-13
122 std::vector<double> chi_xi = {1.0};
123 double chi_p = 1.;
124 double chi_q = 1.;
125 std::vector<std::vector<double>> xi = {}; // we assume ONLY ONE of them is used.
126 std::vector<std::vector<double>> tanhxi = {};
127 std::vector<std::vector<double>> tanhxi_nl= {}; // 2023-03-20
128 std::vector<double> tanhp = {};
129 std::vector<double> tanhq = {};
130 // plan 1
131 std::vector<double> chi_pnl = {1.0};
132 std::vector<double> chi_qnl = {1.0};
133 std::vector<std::vector<double>> tanh_pnl = {};
134 std::vector<std::vector<double>> tanh_qnl = {};
135 // plan 2
136 std::vector<std::vector<double>> tanhp_nl = {};
137 std::vector<std::vector<double>> tanhq_nl = {};
138 // GPU
139 torch::DeviceType device_type = torch::kCPU;
140 torch::Device device = torch::Device(torch::kCPU);
141 torch::Device device_CPU = torch::Device(torch::kCPU);
142
143 // Nueral Network
144 std::shared_ptr<NN_OFImpl> nn;
145 double* enhancement_cpu_ptr = nullptr;
146 double* gradient_cpu_ptr = nullptr;
147
148 int nkernel = 1; // number of kernels
149
150 // maps
151 void init_data(
152 const int &nkernel,
153 const bool &of_ml_gamma,
154 const bool &of_ml_p,
155 const bool &of_ml_q,
156 const bool &of_ml_tanhp,
157 const bool &of_ml_tanhq,
158 const std::vector<int> &of_ml_gammanl_,
159 const std::vector<int> &of_ml_pnl,
160 const std::vector<int> &of_ml_qnl,
161 const std::vector<int> &of_ml_xi,
162 const std::vector<int> &of_ml_tanhxi,
163 const std::vector<int> &of_ml_tanhxi_nl,
164 const std::vector<int> &of_ml_tanh_pnl,
165 const std::vector<int> &of_ml_tanh_qnl,
166 const std::vector<int> &of_ml_tanhp_nl,
167 const std::vector<int> &of_ml_tanhq_nl
168 );
169
170 // Whether to use corresponding descriptors
171 bool ml_gamma = false;
172 bool ml_p = false;
173 bool ml_q = false;
174 bool ml_tanhp = false;
175 bool ml_tanhq = false;
176 bool ml_gammanl = false;
177 bool ml_pnl = false;
178 bool ml_qnl = false;
179 bool ml_xi = false;
180 bool ml_tanhxi = false;
181 bool ml_tanhxi_nl = false;
182 bool ml_tanh_pnl = false;
183 bool ml_tanh_qnl = false;
184 bool ml_tanhp_nl = false;
185 bool ml_tanhq_nl = false;
186
187 std::vector<std::string> descriptor_type = {}; // the descriptors used
188 std::vector<int> kernel_index = {}; // the index of the kernel used
189 std::map<std::string, std::vector<int>> descriptor2kernel = {}; // the map from descriptor to kernel index
190 std::map<std::string, std::vector<int>> descriptor2index = {}; // the map from descriptor to index
191 std::map<std::string, std::vector<bool>> gene_data_label = {}; // the map from descriptor to gene label
192
193 torch::Tensor get_data(std::string parameter, const int ikernel); // get the descriptor data for the ikernel-th kernel
194};
195
196#endif
197#endif
Definition kedf_ml.h:12
void potTanhxi_nlTerm(const double *const *prho, ModulePW::PW_Basis *pw_rho, std::vector< double > &rTanhxi_nlTerm)
Definition kedf_ml_pot.cpp:177
double potPTerm1(int ir)
Definition kedf_ml_pot.cpp:69
std::vector< double > gamma
Definition kedf_ml.h:114
bool ml_pnl
Definition kedf_ml.h:177
bool ml_tanhp
Definition kedf_ml.h:174
void potTanhpTanh_pnlTerm(const double *const *prho, ModulePW::PW_Basis *pw_rho, std::vector< double > &rTanhpTanh_pnlTerm)
Definition kedf_ml_pot.cpp:315
std::vector< std::vector< double > > tanhxi
Definition kedf_ml.h:126
int nx
Definition kedf_ml.h:101
double chi_q
Definition kedf_ml.h:124
bool ml_tanhxi
Definition kedf_ml.h:180
bool ml_tanh_qnl
Definition kedf_ml.h:183
void dumpMatrix(std::string filename, const ModuleBase::matrix &data)
Dump the matrix into .npy file.
Definition kedf_ml.cpp:363
bool ml_tanh_pnl
Definition kedf_ml.h:182
void dumpTensor(std::string filename, const torch::Tensor &data)
Dump the torch::Tensor into .npy file.
Definition kedf_ml.cpp:348
void loadVector(std::string filename, std::vector< double > &data)
Definition kedf_ml.cpp:329
void generateTrainData(const double *const *prho, ModulePW::PW_Basis *pw_rho, const double *veff)
Generate training data for ML KEDF.
Definition kedf_ml.cpp:188
void potXinlTerm(const double *const *prho, ModulePW::PW_Basis *pw_rho, std::vector< double > &rXinlTerm)
Definition kedf_ml_pot.cpp:136
bool ml_gammanl
Definition kedf_ml.h:176
const double cTF
Definition kedf_ml.h:105
double potQTerm1(int ir)
Definition kedf_ml_pot.cpp:74
double feg_net_F
Definition kedf_ml.h:109
bool ml_tanhxi_nl
Definition kedf_ml.h:181
std::vector< std::vector< double > > tanh_qnl
Definition kedf_ml.h:134
std::vector< double > chi_xi
Definition kedf_ml.h:122
int nkernel
Definition kedf_ml.h:148
bool ml_tanhq_nl
Definition kedf_ml.h:185
std::vector< double > q
Definition kedf_ml.h:116
std::vector< std::vector< double > > qnl
Definition kedf_ml.h:119
std::vector< std::vector< double > > tanhxi_nl
Definition kedf_ml.h:127
torch::Device device_CPU
Definition kedf_ml.h:141
void ml_potential(const double *const *prho, ModulePW::PW_Basis *pw_rho, ModuleBase::matrix &rpotential)
Get the potential of ML KEDF, and add it into rpotential.
Definition kedf_ml.cpp:153
void potTanhpTanhp_nlTerm(const double *const *prho, ModulePW::PW_Basis *pw_rho, std::vector< double > &rTanhpTanhp_nlTerm)
Definition kedf_ml_pot.cpp:426
std::vector< std::vector< double > > tanhp_nl
Definition kedf_ml.h:136
std::map< std::string, std::vector< int > > descriptor2index
Definition kedf_ml.h:190
std::vector< std::vector< double > > nablaRho
Definition kedf_ml.h:120
std::vector< std::vector< double > > xi
Definition kedf_ml.h:125
std::vector< double > tanhq
Definition kedf_ml.h:129
std::vector< int > kernel_index
Definition kedf_ml.h:188
void potGammanlTerm(const double *const *prho, ModulePW::PW_Basis *pw_rho, std::vector< double > &rGammanlTerm)
Definition kedf_ml_pot.cpp:116
KEDF_ML()
Definition kedf_ml.h:14
~KEDF_ML()
Definition kedf_ml.h:18
bool ml_p
Definition kedf_ml.h:172
void set_para(const int nx, const double dV, const double nelec, const double tf_weight, const double vw_weight, const double chi_p, const double chi_q, const std::vector< double > &chi_xi, const std::vector< double > &chi_pnl, const std::vector< double > &chi_qnl, const int &nkernel, const std::vector< int > &kernel_type, const std::vector< double > &kernel_scaling, const std::vector< double > &yukawa_alpha, const std::vector< std::string > &kernel_file, const bool &of_ml_gamma, const bool &of_ml_p, const bool &of_ml_q, const bool &of_ml_tanhp, const bool &of_ml_tanhq, const std::vector< int > &of_ml_gammanl, const std::vector< int > &of_ml_pnl, const std::vector< int > &of_ml_qnl, const std::vector< int > &of_ml_xi, const std::vector< int > &of_ml_tanhxi, const std::vector< int > &of_ml_tanhxi_nl, const std::vector< int > &of_ml_tanh_pnl, const std::vector< int > &of_ml_tanh_qnl, const std::vector< int > &of_ml_tanhp_nl, const std::vector< int > &of_ml_tanhq_nl, const std::string device_inpt, ModulePW::PW_Basis *pw_rho)
Definition kedf_ml.cpp:10
int nx_tot
Definition kedf_ml.h:102
void potPPnlTerm(const double *const *prho, ModulePW::PW_Basis *pw_rho, std::vector< double > &rPPnlTerm)
Definition kedf_ml_pot.cpp:210
torch::DeviceType device_type
Definition kedf_ml.h:139
std::vector< double > chi_qnl
Definition kedf_ml.h:132
double chi_p
Definition kedf_ml.h:123
double dV
Definition kedf_ml.h:103
double potGammaTerm(int ir)
Definition kedf_ml_pot.cpp:64
void potTanhqTanhq_nlTerm(const double *const *prho, ModulePW::PW_Basis *pw_rho, std::vector< double > &rTanhqTanhq_nlTerm)
Definition kedf_ml_pot.cpp:484
double potTanhqTerm1(int ir)
Definition kedf_ml_pot.cpp:110
std::vector< double > chi_pnl
Definition kedf_ml.h:131
void localTest(const double *const *prho, ModulePW::PW_Basis *pw_rho)
For test.
Definition kedf_ml.cpp:218
std::map< std::string, std::vector< bool > > gene_data_label
Definition kedf_ml.h:191
torch::Tensor get_data(std::string parameter, const int ikernel)
Return the descriptors for ML KEDF.
Definition kedf_ml.cpp:445
void potQQnlTerm(const double *const *prho, ModulePW::PW_Basis *pw_rho, std::vector< double > &rQQnlTerm)
Definition kedf_ml_pot.cpp:267
void NN_forward(const double *const *prho, ModulePW::PW_Basis *pw_rho, bool cal_grad)
Interface to Neural Network forward.
Definition kedf_ml.cpp:292
std::vector< std::vector< double > > tanhq_nl
Definition kedf_ml.h:137
double get_energy(const double *const *prho, ModulePW::PW_Basis *pw_rho)
Get the energy of ML KEDF.
Definition kedf_ml.cpp:125
void set_device(std::string device_inpt)
Set the device for ML KEDF.
Definition kedf_ml.cpp:261
void potTanhqTanh_qnlTerm(const double *const *prho, ModulePW::PW_Basis *pw_rho, std::vector< double > &rTanhqTanh_qnlTerm)
Definition kedf_ml_pot.cpp:374
torch::Device device
Definition kedf_ml.h:140
double feg3_correct
Definition kedf_ml.h:110
bool ml_tanhq
Definition kedf_ml.h:175
double potTanhpTerm1(int ir)
Definition kedf_ml_pot.cpp:104
std::vector< double > p
Definition kedf_ml.h:115
void dumpVector(std::string filename, const std::vector< double > &data)
Definition kedf_ml.cpp:336
std::vector< double > tanhp
Definition kedf_ml.h:128
std::shared_ptr< NN_OFImpl > nn
Definition kedf_ml.h:144
void init_data(const int &nkernel, const bool &of_ml_gamma, const bool &of_ml_p, const bool &of_ml_q, const bool &of_ml_tanhp, const bool &of_ml_tanhq, const std::vector< int > &of_ml_gammanl_, const std::vector< int > &of_ml_pnl, const std::vector< int > &of_ml_qnl, const std::vector< int > &of_ml_xi, const std::vector< int > &of_ml_tanhxi, const std::vector< int > &of_ml_tanhxi_nl, const std::vector< int > &of_ml_tanh_pnl, const std::vector< int > &of_ml_tanh_qnl, const std::vector< int > &of_ml_tanhp_nl, const std::vector< int > &of_ml_tanhq_nl)
Initialize the data for ML KEDF, and generate the mapping between descriptor and kernel.
Definition kedf_ml_label.cpp:25
std::map< std::string, std::vector< int > > descriptor2kernel
Definition kedf_ml.h:189
double * enhancement_cpu_ptr
Definition kedf_ml.h:145
double ml_energy
Definition kedf_ml.h:107
bool ml_gamma
Definition kedf_ml.h:171
std::vector< std::vector< double > > gammanl
Definition kedf_ml.h:117
double potXiTerm1(int ir)
Definition kedf_ml_pot.cpp:79
void potTanhxinlTerm(const double *const *prho, ModulePW::PW_Basis *pw_rho, std::vector< double > &rTanhxinlTerm)
Definition kedf_ml_pot.cpp:156
std::vector< std::vector< double > > pnl
Definition kedf_ml.h:118
void updateInput(const double *const *prho, ModulePW::PW_Basis *pw_rho)
Update the desciptors for ML KEDF.
Definition kedf_ml.cpp:377
std::vector< std::vector< double > > tanh_pnl
Definition kedf_ml.h:133
void get_potential_(const double *const *prho, ModulePW::PW_Basis *pw_rho, ModuleBase::matrix &rpotential)
Calculate the Pauli potential of ML KEDF.
Definition kedf_ml_pot.cpp:15
bool ml_tanhp_nl
Definition kedf_ml.h:184
const double pqcoef
Definition kedf_ml.h:106
bool ml_qnl
Definition kedf_ml.h:178
bool ml_q
Definition kedf_ml.h:173
int ninput
Definition kedf_ml.h:113
double potTanhxiTerm1(int ir)
Definition kedf_ml_pot.cpp:91
double * gradient_cpu_ptr
Definition kedf_ml.h:146
bool ml_xi
Definition kedf_ml.h:179
ModuleIO::Cal_MLKEDF_Descriptors * cal_tool
Definition kedf_ml.h:99
std::vector< std::string > descriptor_type
Definition kedf_ml.h:187
Definition matrix.h:19
A class to calculate the descriptors for ML KEDF. Sun, Liang, and Mohan Chen. Physical Review B 109....
Definition cal_mlkedf_descriptors.h:19
A class which can convert a function of "r" to the corresponding linear superposition of plane waves ...
Definition pw_basis.h:56