From dac7a768210ff28a36073627b865cc17446fbcc6 Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Mon, 22 Jan 2024 18:40:11 +0800 Subject: [PATCH 001/103] add torch backend support --- source/api_cc/include/DeepPotPT.h | 329 ++++++++++++++++++++++++++++++ source/api_cc/include/commonPT.h | 26 +++ source/api_cc/src/DeepPot.cc | 3 +- source/api_cc/src/DeepPotPT.cc | 246 ++++++++++++++++++++++ source/api_cc/src/commonPT.cc | 20 ++ 5 files changed, 623 insertions(+), 1 deletion(-) create mode 100644 source/api_cc/include/DeepPotPT.h create mode 100644 source/api_cc/include/commonPT.h create mode 100644 source/api_cc/src/DeepPotPT.cc create mode 100644 source/api_cc/src/commonPT.cc diff --git a/source/api_cc/include/DeepPotPT.h b/source/api_cc/include/DeepPotPT.h new file mode 100644 index 0000000000..62035d9010 --- /dev/null +++ b/source/api_cc/include/DeepPotPT.h @@ -0,0 +1,329 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +#pragma once + +#include "DeepPot.h" +#include "commonPT.h" +#include + +namespace deepmd { +/** + * @brief PyTorch implementation for Deep Potential. + **/ +class DeepPotPT : public DeepPotBase { + public: + /** + * @brief DP constructor without initialization. + **/ + DeepPotPT(); + ~DeepPotPT(); + /** + * @brief DP constructor with initialization. + * @param[in] model The name of the frozen model file. + * @param[in] gpu_rank The GPU rank. Default is 0. + * @param[in] file_content The content of the model file. If it is not empty, + *DP will read from the string instead of the file. + **/ + DeepPotPT(const std::string& model, + const int& gpu_rank = 0, + const std::string& file_content = ""); + /** + * @brief Initialize the DP. + * @param[in] model The name of the frozen model file. + * @param[in] gpu_rank The GPU rank. Default is 0. + * @param[in] file_content The content of the model file. If it is not empty, + *DP will read from the string instead of the file. + **/ + void init(const std::string& model, + const int& gpu_rank = 0); + + private: + /** + * @brief Evaluate the energy, force, virial, atomic energy, and atomic virial + *by using this DP. + * @param[out] ener The system energy. + * @param[out] force The force on each atom. + * @param[out] virial The virial. + * @param[out] atom_energy The atomic energy. + * @param[out] atom_virial The atomic virial. + * @param[in] coord The coordinates of atoms. The array should be of size + *nframes x natoms x 3. + * @param[in] atype The atom types. The list should contain natoms ints. + * @param[in] box The cell of the region. The array should be of size nframes + *x 9. + * @param[in] fparam The frame parameter. The array can be of size : + * nframes x dim_fparam. + * dim_fparam. Then all frames are assumed to be provided with the same + *fparam. + * @param[in] aparam The atomic parameter The array can be of size : + * nframes x natoms x dim_aparam. + * natoms x dim_aparam. Then all frames are assumed to be provided with the + *same aparam. + **/ + template + void compute(ENERGYVTYPE& ener, + std::vector& force, + std::vector& virial, + // std::vector& atom_energy, + // std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box); + // const std::vector& fparam = std::vector(), + // const std::vector& aparam = std::vector()); + /** + * @brief Evaluate the energy, force, virial, atomic energy, and atomic virial + *by using this DP. + * @param[out] ener The system energy. + * @param[out] force The force on each atom. + * @param[out] virial The virial. + * @param[out] atom_energy The atomic energy. + * @param[out] atom_virial The atomic virial. + * @param[in] coord The coordinates of atoms. The array should be of size + *nframes x natoms x 3. + * @param[in] atype The atom types. The list should contain natoms ints. + * @param[in] box The cell of the region. The array should be of size nframes + *x 9. + * @param[in] nghost The number of ghost atoms. + * @param[in] lmp_list The input neighbour list. + * @param[in] ago Update the internal neighbour list if ago is 0. + * @param[in] fparam The frame parameter. The array can be of size : + * nframes x dim_fparam. + * dim_fparam. Then all frames are assumed to be provided with the same + *fparam. + * @param[in] aparam The atomic parameter The array can be of size : + * nframes x natoms x dim_aparam. + * natoms x dim_aparam. Then all frames are assumed to be provided with the + *same aparam. + **/ + template + void compute(ENERGYVTYPE& ener, + std::vector& force, + std::vector& virial, + // std::vector& atom_energy, + // std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + // const int nghost, + const InputNlist& lmp_list, + const int& ago); + // const std::vector& fparam = std::vector(), + // const std::vector& aparam = std::vector()); + /** + * @brief Evaluate the energy, force, and virial with the mixed type + *by using this DP. + * @param[out] ener The system energy. + * @param[out] force The force on each atom. + * @param[out] virial The virial. + * @param[in] nframes The number of frames. + * @param[in] coord The coordinates of atoms. The array should be of size + *nframes x natoms x 3. + * @param[in] atype The atom types. The array should be of size nframes x + *natoms. + * @param[in] box The cell of the region. The array should be of size nframes + *x 9. + * @param[in] fparam The frame parameter. The array can be of size : + * nframes x dim_fparam. + * dim_fparam. Then all frames are assumed to be provided with the same + *fparam. + * @param[in] aparam The atomic parameter The array can be of size : + * nframes x natoms x dim_aparam. + * natoms x dim_aparam. Then all frames are assumed to be provided with the + *same aparam. + **/ + template + void compute_mixed_type( + ENERGYVTYPE& ener, + std::vector& force, + std::vector& virial, + const int& nframes, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam = std::vector(), + const std::vector& aparam = std::vector()); + /** + * @brief Evaluate the energy, force, and virial with the mixed type + *by using this DP. + * @param[out] ener The system energy. + * @param[out] force The force on each atom. + * @param[out] virial The virial. + * @param[out] atom_energy The atomic energy. + * @param[out] atom_virial The atomic virial. + * @param[in] nframes The number of frames. + * @param[in] coord The coordinates of atoms. The array should be of size + *nframes x natoms x 3. + * @param[in] atype The atom types. The array should be of size nframes x + *natoms. + * @param[in] box The cell of the region. The array should be of size nframes + *x 9. + * @param[in] fparam The frame parameter. The array can be of size : + * nframes x dim_fparam. + * dim_fparam. Then all frames are assumed to be provided with the same + *fparam. + * @param[in] aparam The atomic parameter The array can be of size : + * nframes x natoms x dim_aparam. + * natoms x dim_aparam. Then all frames are assumed to be provided with the + *same aparam. + **/ + template + void compute_mixed_type( + ENERGYVTYPE& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const int& nframes, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam = std::vector(), + const std::vector& aparam = std::vector()); + + public: + /** + * @brief Get the cutoff radius. + * @return The cutoff radius. + **/ + double cutoff() const { + assert(inited); + return rcut; + }; + /** + * @brief Get the number of types. + * @return The number of types. + **/ + int numb_types() const { + assert(inited); + return ntypes; + }; + /** + * @brief Get the number of types with spin. + * @return The number of types with spin. + **/ + int numb_types_spin() const { + assert(inited); + return ntypes_spin; + }; + /** + * @brief Get the dimension of the frame parameter. + * @return The dimension of the frame parameter. + **/ + int dim_fparam() const { + assert(inited); + return dfparam; + }; + /** + * @brief Get the dimension of the atomic parameter. + * @return The dimension of the atomic parameter. + **/ + int dim_aparam() const { + assert(inited); + return daparam; + }; + /** + * @brief Get the type map (element name of the atom types) of this model. + * @param[out] type_map The type map of this model. + **/ + void get_type_map(std::string& type_map); + + /** + * @brief Get whether the atom dimension of aparam is nall instead of fparam. + * @param[out] aparam_nall whether the atom dimension of aparam is nall + *instead of fparam. + **/ + bool is_aparam_nall() const { + assert(inited); + return aparam_nall; + }; + + // forward to template class + void computew(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam = std::vector(), + const std::vector& aparam = std::vector()); + void computew(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam = std::vector(), + const std::vector& aparam = std::vector()); + void computew(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& inlist, + const int& ago, + const std::vector& fparam = std::vector(), + const std::vector& aparam = std::vector()); + void computew(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& inlist, + const int& ago, + const std::vector& fparam = std::vector(), + const std::vector& aparam = std::vector()); + void computew_mixed_type( + std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const int& nframes, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam = std::vector(), + const std::vector& aparam = std::vector()); + void computew_mixed_type( + std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const int& nframes, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam = std::vector(), + const std::vector& aparam = std::vector()); + + private: + + bool inited; + int ntypes; + int ntypes_spin; + int dfparam; + int daparam; + // copy neighbor list info from host + torch::jit::script::Module module; + double rcut; + NeighborListData nlist_data; + //InputNlist nlist; + int max_num_neighbors; + int gpu_id; + at::Tensor firstneigh_tensor; +}; + +} // namespace deepmd diff --git a/source/api_cc/include/commonPT.h b/source/api_cc/include/commonPT.h new file mode 100644 index 0000000000..6e7b957aeb --- /dev/null +++ b/source/api_cc/include/commonPT.h @@ -0,0 +1,26 @@ +#include +#ifndef COMMON_H +#define COMMON_H +#include +#include +#include +#include +#include "neighbor_list.h" + + +struct NeighborListData { + /// Array stores the core region atom's index + std::vector ilist; + /// Array stores the core region atom's neighbor index + //std::vector> jlist; + int *jlist; + /// Array stores the number of neighbors of core region atoms + std::vector numneigh; + /// Array stores the the location of the first neighbor of core region atoms + std::vector firstneigh; + + public: + void copy_from_nlist(const InputNlist& inlist, int& max_num_neighbors,int nnei); + //void make_inlist(InputNlist& inlist); +}; +#endif \ No newline at end of file diff --git a/source/api_cc/src/DeepPot.cc b/source/api_cc/src/DeepPot.cc index 083e9b091f..15030b8841 100644 --- a/source/api_cc/src/DeepPot.cc +++ b/source/api_cc/src/DeepPot.cc @@ -38,7 +38,8 @@ void DeepPot::init(const std::string& model, // TODO: throw errors if TF backend is not built, without mentioning TF dp = std::make_shared(model, gpu_rank, file_content); } else if (deepmd::DPBackend::PyTorch == backend) { - throw deepmd::deepmd_exception("PyTorch backend is not supported yet"); + //throw deepmd::deepmd_exception("PyTorch backend is not supported yet"); + dp = std::make_shared(model, gpu_rank, file_content); } else if (deepmd::DPBackend::Paddle == backend) { throw deepmd::deepmd_exception("PaddlePaddle backend is not supported yet"); } else { diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc new file mode 100644 index 0000000000..956d6084bd --- /dev/null +++ b/source/api_cc/src/DeepPotPT.cc @@ -0,0 +1,246 @@ +#include "DeepPotPT.h" + +using namespace deepmd; +DeepPotPT::DeepPotPT() +: inited(false) { } +DeepPotPT::DeepPotPT(const std::string& model, + const int& gpu_rank, + const std::string& file_content) + : inited(false){ + try { + init(model, gpu_rank); + } catch (...) { + // Clean up and rethrow, as the destructor will not be called + throw; + } +} +void DeepPotPT::init(const std::string& model, const int& gpu_rank) { + if (inited) { + std::cerr << "WARNING: deepmd-kit should not be initialized twice, do " + "nothing at the second call of initializer" + << std::endl; + return; + } + std::cout << "load model from: " <(rcut_); + inited = true; +} +DeepPotPT::~DeepPotPT() { } + + + +template +void DeepPotPT::compute(ENERGYVTYPE& ener, + std::vector& force, + std::vector& virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const InputNlist& lmp_list, + const int& ago) +{ + torch::Device device(torch::kCUDA, gpu_id); + std::vector coord_wrapped = coord; + int natoms = atype.size(); + auto options = torch::TensorOptions().dtype(torch::kFloat64); + auto int_options = torch::TensorOptions().dtype(torch::kInt64); + auto int32_options = torch::TensorOptions().dtype(torch::kInt32); + std::vector inputs; + at::Tensor coord_wrapped_Tensor = torch::from_blob(coord_wrapped.data(), {1,natoms, 3}, options).to(device); + inputs.push_back(coord_wrapped_Tensor); + std::vector atype_64(atype.begin(), atype.end()); + at::Tensor atype_Tensor = torch::from_blob(atype_64.data(), {1,natoms}, int_options).to(device); + inputs.push_back(atype_Tensor); + if(ago == 0) + { + int64_t nnei = module.run_method("get_nnei").toInt(); + nlist_data.copy_from_nlist(lmp_list,max_num_neighbors,nnei); + if(max_num_neighbors > nnei) + { + at::Tensor firstneigh = torch::from_blob(nlist_data.jlist, {lmp_list.inum,max_num_neighbors}, int32_options); + at::Tensor nlist= firstneigh.to(torch::kInt64).to(device); + firstneigh_tensor = module.run_method("sort_neighbor_list",coord_wrapped_Tensor,nlist).toTensor(); + } + else + { + at::Tensor firstneigh = torch::from_blob(nlist_data.jlist, {1,lmp_list.inum,max_num_neighbors}, int32_options); + firstneigh_tensor = firstneigh.to(torch::kInt64).to(device); + } + } + inputs.push_back(firstneigh_tensor); + c10::Dict outputs = module.forward(inputs).toGenericDict(); + c10::IValue energy_ = outputs.at("energy"); + c10::IValue force_ = outputs.at("extended_force"); + c10::IValue virial_ = outputs.at("extended_virial"); + ener = energy_.toTensor().item(); + + torch::Tensor flat_force_ = force_.toTensor().view({-1}); + torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); + force.assign(cpu_force_.data_ptr(), cpu_force_.data_ptr() + cpu_force_.numel()); + + torch::Tensor flat_virial_ = virial_.toTensor().view({-1}); + torch::Tensor cpu_virial_ = flat_virial_.to(torch::kCPU); + virial.assign(cpu_virial_.data_ptr(), cpu_virial_.data_ptr() + cpu_virial_.numel()); + +} +template void DeepPotPT::compute(double& ener, + std::vector& force, + std::vector& virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const InputNlist& lmp_list, + const int& ago); + + +template +void DeepPotPT::compute(ENERGYVTYPE& ener, + std::vector& force, + std::vector& virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box) +{ + auto device = torch::kCUDA; + module.to(device); + std::vector coord_wrapped = coord; + int natoms = atype.size(); + auto options = torch::TensorOptions().dtype(torch::kFloat64); + auto int_options = torch::TensorOptions().dtype(torch::kInt64); + std::vector inputs; + at::Tensor coord_wrapped_Tensor = torch::from_blob(coord_wrapped.data(), {1, natoms, 3}, options).to(device); + inputs.push_back(coord_wrapped_Tensor); + std::vector atype_64(atype.begin(), atype.end()); + at::Tensor atype_Tensor = torch::from_blob(atype_64.data(), {1, natoms}, int_options).to(device); + inputs.push_back(atype_Tensor); + at::Tensor box_Tensor = torch::from_blob(const_cast(box.data()), {1, 9}, options).to(device); + inputs.push_back(box_Tensor); + c10::Dict outputs = module.forward(inputs).toGenericDict(); + + + c10::IValue energy_ = outputs.at("energy"); + c10::IValue force_ = outputs.at("force"); + c10::IValue virial_ = outputs.at("virial"); + ener = energy_.toTensor().item(); + + torch::Tensor flat_force_ = force_.toTensor().view({-1}); + torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); + force.assign(cpu_force_.data_ptr(), cpu_force_.data_ptr() + cpu_force_.numel()); + + torch::Tensor flat_virial_ = virial_.toTensor().view({-1}); + torch::Tensor cpu_virial_ = flat_virial_.to(torch::kCPU); + virial.assign(cpu_virial_.data_ptr(), cpu_virial_.data_ptr() + cpu_virial_.numel()); + +} +template void DeepPotPT::compute(double& ener, + std::vector& force, + std::vector& virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box); + +void DeepPotPT::get_type_map(std::string& type_map) { + auto ret = module.run_method("get_type_map").toList(); + for (const torch::IValue& element : ret) { + type_map += torch::str(element); // Convert each element to a string + type_map += " "; // Add a space between elements + } +} + +// forward to template method +void DeepPotPT::computew(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam) { + //TODO: atomic compute unsupported + compute(ener, force, virial, coord, atype, box); +} +void DeepPotPT::computew(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam) { + //TODO: atomic compute unsupported + compute(ener, force, virial, coord, atype, box); +} +void DeepPotPT::computew(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& inlist, + const int& ago, + const std::vector& fparam, + const std::vector& aparam) { + //TODO: atomic compute unsupported + compute(ener, force, virial, coord, atype, box, inlist,ago); +} +void DeepPotPT::computew(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& inlist, + const int& ago, + const std::vector& fparam, + const std::vector& aparam) { + //TODO: atomic compute unsupported + compute(ener, force, virial, coord, atype, box, inlist,ago); +} +void DeepPotPT::computew_mixed_type(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const int& nframes, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam) { + throw; + +} +void DeepPotPT::computew_mixed_type(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const int& nframes, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam) { + throw; +} diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc new file mode 100644 index 0000000000..d4b3236064 --- /dev/null +++ b/source/api_cc/src/commonPT.cc @@ -0,0 +1,20 @@ +#include "commonPT.h" + +void NeighborListData::copy_from_nlist(const InputNlist& inlist, int& max_num_neighbors, int nnei) +{ + int inum = inlist.inum; + ilist.resize(inum); + numneigh.resize(inum); + memcpy(&ilist[0], inlist.ilist, inum * sizeof(int)); + int* max_element = std::max_element(inlist.numneigh, inlist.numneigh + inum); + max_num_neighbors = *max_element; + if (max_num_neighbors < nnei) + max_num_neighbors = nnei; + jlist = (int*)malloc(inum * max_num_neighbors * sizeof(int)); + memset(jlist, -1 , inum * max_num_neighbors * sizeof(int)); + for (int ii = 0; ii < inum; ++ii) { + int jnum = inlist.numneigh[ii]; + numneigh[ii] = inlist.numneigh[ii]; + memcpy(&jlist[ii * max_num_neighbors], inlist.firstneigh[ii], jnum * sizeof(int)); + } +} \ No newline at end of file From d3befece4465d7f15cf4c69cc666567cfafdd60f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 22 Jan 2024 10:43:35 +0000 Subject: [PATCH 002/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/include/DeepPotPT.h | 29 ++-- source/api_cc/include/commonPT.h | 19 ++- source/api_cc/src/DeepPot.cc | 2 +- source/api_cc/src/DeepPotPT.cc | 275 +++++++++++++++--------------- source/api_cc/src/commonPT.cc | 16 +- 5 files changed, 178 insertions(+), 163 deletions(-) diff --git a/source/api_cc/include/DeepPotPT.h b/source/api_cc/include/DeepPotPT.h index 62035d9010..efe453ae8e 100644 --- a/source/api_cc/include/DeepPotPT.h +++ b/source/api_cc/include/DeepPotPT.h @@ -1,9 +1,10 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once +#include + #include "DeepPot.h" #include "commonPT.h" -#include namespace deepmd { /** @@ -33,8 +34,7 @@ class DeepPotPT : public DeepPotBase { * @param[in] file_content The content of the model file. If it is not empty, *DP will read from the string instead of the file. **/ - void init(const std::string& model, - const int& gpu_rank = 0); + void init(const std::string& model, const int& gpu_rank = 0); private: /** @@ -63,13 +63,13 @@ class DeepPotPT : public DeepPotBase { void compute(ENERGYVTYPE& ener, std::vector& force, std::vector& virial, - // std::vector& atom_energy, - // std::vector& atom_virial, + // std::vector& atom_energy, + // std::vector& atom_virial, const std::vector& coord, const std::vector& atype, const std::vector& box); - // const std::vector& fparam = std::vector(), - // const std::vector& aparam = std::vector()); + // const std::vector& fparam = std::vector(), + // const std::vector& aparam = std::vector()); /** * @brief Evaluate the energy, force, virial, atomic energy, and atomic virial *by using this DP. @@ -99,16 +99,16 @@ class DeepPotPT : public DeepPotBase { void compute(ENERGYVTYPE& ener, std::vector& force, std::vector& virial, - // std::vector& atom_energy, - // std::vector& atom_virial, + // std::vector& atom_energy, + // std::vector& atom_virial, const std::vector& coord, const std::vector& atype, const std::vector& box, - // const int nghost, + // const int nghost, const InputNlist& lmp_list, const int& ago); - // const std::vector& fparam = std::vector(), - // const std::vector& aparam = std::vector()); + // const std::vector& fparam = std::vector(), + // const std::vector& aparam = std::vector()); /** * @brief Evaluate the energy, force, and virial with the mixed type *by using this DP. @@ -310,7 +310,6 @@ class DeepPotPT : public DeepPotBase { const std::vector& aparam = std::vector()); private: - bool inited; int ntypes; int ntypes_spin; @@ -320,10 +319,10 @@ class DeepPotPT : public DeepPotBase { torch::jit::script::Module module; double rcut; NeighborListData nlist_data; - //InputNlist nlist; + // InputNlist nlist; int max_num_neighbors; int gpu_id; - at::Tensor firstneigh_tensor; + at::Tensor firstneigh_tensor; }; } // namespace deepmd diff --git a/source/api_cc/include/commonPT.h b/source/api_cc/include/commonPT.h index 6e7b957aeb..d2d2e106c7 100644 --- a/source/api_cc/include/commonPT.h +++ b/source/api_cc/include/commonPT.h @@ -1,26 +1,29 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later #include #ifndef COMMON_H #define COMMON_H -#include -#include #include +#include +#include #include -#include "neighbor_list.h" +#include "neighbor_list.h" struct NeighborListData { /// Array stores the core region atom's index std::vector ilist; /// Array stores the core region atom's neighbor index - //std::vector> jlist; - int *jlist; + // std::vector> jlist; + int* jlist; /// Array stores the number of neighbors of core region atoms std::vector numneigh; /// Array stores the the location of the first neighbor of core region atoms std::vector firstneigh; public: - void copy_from_nlist(const InputNlist& inlist, int& max_num_neighbors,int nnei); - //void make_inlist(InputNlist& inlist); + void copy_from_nlist(const InputNlist& inlist, + int& max_num_neighbors, + int nnei); + // void make_inlist(InputNlist& inlist); }; -#endif \ No newline at end of file +#endif diff --git a/source/api_cc/src/DeepPot.cc b/source/api_cc/src/DeepPot.cc index 15030b8841..e3640517cf 100644 --- a/source/api_cc/src/DeepPot.cc +++ b/source/api_cc/src/DeepPot.cc @@ -38,7 +38,7 @@ void DeepPot::init(const std::string& model, // TODO: throw errors if TF backend is not built, without mentioning TF dp = std::make_shared(model, gpu_rank, file_content); } else if (deepmd::DPBackend::PyTorch == backend) { - //throw deepmd::deepmd_exception("PyTorch backend is not supported yet"); + // throw deepmd::deepmd_exception("PyTorch backend is not supported yet"); dp = std::make_shared(model, gpu_rank, file_content); } else if (deepmd::DPBackend::Paddle == backend) { throw deepmd::deepmd_exception("PaddlePaddle backend is not supported yet"); diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 956d6084bd..9f3cb998bf 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -1,12 +1,12 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later #include "DeepPotPT.h" using namespace deepmd; -DeepPotPT::DeepPotPT() -: inited(false) { } +DeepPotPT::DeepPotPT() : inited(false) {} DeepPotPT::DeepPotPT(const std::string& model, const int& gpu_rank, const std::string& file_content) - : inited(false){ + : inited(false) { try { init(model, gpu_rank); } catch (...) { @@ -15,146 +15,156 @@ DeepPotPT::DeepPotPT(const std::string& model, } } void DeepPotPT::init(const std::string& model, const int& gpu_rank) { - if (inited) { + if (inited) { std::cerr << "WARNING: deepmd-kit should not be initialized twice, do " "nothing at the second call of initializer" << std::endl; return; - } - std::cout << "load model from: " <(rcut_); - inited = true; + } + std::cout << "load model from: " << model << " to gpu " << gpu_rank + << std::endl; + gpu_id = gpu_rank; + torch::Device device(torch::kCUDA, gpu_rank); + + module = torch::jit::load(model, device); + torch::jit::FusionStrategy strategy; + strategy = {{torch::jit::FusionBehavior::DYNAMIC, 10}}; + torch::jit::setFusionStrategy(strategy); + + // at::globalContext().setAllowTF32CuBLAS(true); + // at::globalContext().setAllowTF32CuDNN(true); + auto rcut_ = module.run_method("get_rcut").toDouble(); + rcut = static_cast(rcut_); + inited = true; } -DeepPotPT::~DeepPotPT() { } - - +DeepPotPT::~DeepPotPT() {} template void DeepPotPT::compute(ENERGYVTYPE& ener, - std::vector& force, - std::vector& virial, - const std::vector& coord, - const std::vector& atype, - const std::vector& box, - const InputNlist& lmp_list, - const int& ago) -{ - torch::Device device(torch::kCUDA, gpu_id); - std::vector coord_wrapped = coord; - int natoms = atype.size(); - auto options = torch::TensorOptions().dtype(torch::kFloat64); - auto int_options = torch::TensorOptions().dtype(torch::kInt64); - auto int32_options = torch::TensorOptions().dtype(torch::kInt32); - std::vector inputs; - at::Tensor coord_wrapped_Tensor = torch::from_blob(coord_wrapped.data(), {1,natoms, 3}, options).to(device); - inputs.push_back(coord_wrapped_Tensor); - std::vector atype_64(atype.begin(), atype.end()); - at::Tensor atype_Tensor = torch::from_blob(atype_64.data(), {1,natoms}, int_options).to(device); - inputs.push_back(atype_Tensor); - if(ago == 0) - { - int64_t nnei = module.run_method("get_nnei").toInt(); - nlist_data.copy_from_nlist(lmp_list,max_num_neighbors,nnei); - if(max_num_neighbors > nnei) - { - at::Tensor firstneigh = torch::from_blob(nlist_data.jlist, {lmp_list.inum,max_num_neighbors}, int32_options); - at::Tensor nlist= firstneigh.to(torch::kInt64).to(device); - firstneigh_tensor = module.run_method("sort_neighbor_list",coord_wrapped_Tensor,nlist).toTensor(); - } - else - { - at::Tensor firstneigh = torch::from_blob(nlist_data.jlist, {1,lmp_list.inum,max_num_neighbors}, int32_options); - firstneigh_tensor = firstneigh.to(torch::kInt64).to(device); - } + std::vector& force, + std::vector& virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const InputNlist& lmp_list, + const int& ago) { + torch::Device device(torch::kCUDA, gpu_id); + std::vector coord_wrapped = coord; + int natoms = atype.size(); + auto options = torch::TensorOptions().dtype(torch::kFloat64); + auto int_options = torch::TensorOptions().dtype(torch::kInt64); + auto int32_options = torch::TensorOptions().dtype(torch::kInt32); + std::vector inputs; + at::Tensor coord_wrapped_Tensor = + torch::from_blob(coord_wrapped.data(), {1, natoms, 3}, options) + .to(device); + inputs.push_back(coord_wrapped_Tensor); + std::vector atype_64(atype.begin(), atype.end()); + at::Tensor atype_Tensor = + torch::from_blob(atype_64.data(), {1, natoms}, int_options).to(device); + inputs.push_back(atype_Tensor); + if (ago == 0) { + int64_t nnei = module.run_method("get_nnei").toInt(); + nlist_data.copy_from_nlist(lmp_list, max_num_neighbors, nnei); + if (max_num_neighbors > nnei) { + at::Tensor firstneigh = torch::from_blob( + nlist_data.jlist, {lmp_list.inum, max_num_neighbors}, int32_options); + at::Tensor nlist = firstneigh.to(torch::kInt64).to(device); + firstneigh_tensor = + module.run_method("sort_neighbor_list", coord_wrapped_Tensor, nlist) + .toTensor(); + } else { + at::Tensor firstneigh = torch::from_blob( + nlist_data.jlist, {1, lmp_list.inum, max_num_neighbors}, + int32_options); + firstneigh_tensor = firstneigh.to(torch::kInt64).to(device); } - inputs.push_back(firstneigh_tensor); - c10::Dict outputs = module.forward(inputs).toGenericDict(); - c10::IValue energy_ = outputs.at("energy"); - c10::IValue force_ = outputs.at("extended_force"); - c10::IValue virial_ = outputs.at("extended_virial"); - ener = energy_.toTensor().item(); - - torch::Tensor flat_force_ = force_.toTensor().view({-1}); - torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); - force.assign(cpu_force_.data_ptr(), cpu_force_.data_ptr() + cpu_force_.numel()); - - torch::Tensor flat_virial_ = virial_.toTensor().view({-1}); - torch::Tensor cpu_virial_ = flat_virial_.to(torch::kCPU); - virial.assign(cpu_virial_.data_ptr(), cpu_virial_.data_ptr() + cpu_virial_.numel()); - + } + inputs.push_back(firstneigh_tensor); + c10::Dict outputs = + module.forward(inputs).toGenericDict(); + c10::IValue energy_ = outputs.at("energy"); + c10::IValue force_ = outputs.at("extended_force"); + c10::IValue virial_ = outputs.at("extended_virial"); + ener = energy_.toTensor().item(); + + torch::Tensor flat_force_ = force_.toTensor().view({-1}); + torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); + force.assign(cpu_force_.data_ptr(), + cpu_force_.data_ptr() + cpu_force_.numel()); + + torch::Tensor flat_virial_ = virial_.toTensor().view({-1}); + torch::Tensor cpu_virial_ = flat_virial_.to(torch::kCPU); + virial.assign(cpu_virial_.data_ptr(), + cpu_virial_.data_ptr() + cpu_virial_.numel()); } -template void DeepPotPT::compute(double& ener, - std::vector& force, - std::vector& virial, - const std::vector& coord, - const std::vector& atype, - const std::vector& box, - const InputNlist& lmp_list, - const int& ago); - +template void DeepPotPT::compute( + double& ener, + std::vector& force, + std::vector& virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const InputNlist& lmp_list, + const int& ago); template void DeepPotPT::compute(ENERGYVTYPE& ener, - std::vector& force, - std::vector& virial, - const std::vector& coord, - const std::vector& atype, - const std::vector& box) -{ - auto device = torch::kCUDA; - module.to(device); - std::vector coord_wrapped = coord; - int natoms = atype.size(); - auto options = torch::TensorOptions().dtype(torch::kFloat64); - auto int_options = torch::TensorOptions().dtype(torch::kInt64); - std::vector inputs; - at::Tensor coord_wrapped_Tensor = torch::from_blob(coord_wrapped.data(), {1, natoms, 3}, options).to(device); - inputs.push_back(coord_wrapped_Tensor); - std::vector atype_64(atype.begin(), atype.end()); - at::Tensor atype_Tensor = torch::from_blob(atype_64.data(), {1, natoms}, int_options).to(device); - inputs.push_back(atype_Tensor); - at::Tensor box_Tensor = torch::from_blob(const_cast(box.data()), {1, 9}, options).to(device); - inputs.push_back(box_Tensor); - c10::Dict outputs = module.forward(inputs).toGenericDict(); - - - c10::IValue energy_ = outputs.at("energy"); - c10::IValue force_ = outputs.at("force"); - c10::IValue virial_ = outputs.at("virial"); - ener = energy_.toTensor().item(); - - torch::Tensor flat_force_ = force_.toTensor().view({-1}); - torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); - force.assign(cpu_force_.data_ptr(), cpu_force_.data_ptr() + cpu_force_.numel()); - - torch::Tensor flat_virial_ = virial_.toTensor().view({-1}); - torch::Tensor cpu_virial_ = flat_virial_.to(torch::kCPU); - virial.assign(cpu_virial_.data_ptr(), cpu_virial_.data_ptr() + cpu_virial_.numel()); - + std::vector& force, + std::vector& virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box) { + auto device = torch::kCUDA; + module.to(device); + std::vector coord_wrapped = coord; + int natoms = atype.size(); + auto options = torch::TensorOptions().dtype(torch::kFloat64); + auto int_options = torch::TensorOptions().dtype(torch::kInt64); + std::vector inputs; + at::Tensor coord_wrapped_Tensor = + torch::from_blob(coord_wrapped.data(), {1, natoms, 3}, options) + .to(device); + inputs.push_back(coord_wrapped_Tensor); + std::vector atype_64(atype.begin(), atype.end()); + at::Tensor atype_Tensor = + torch::from_blob(atype_64.data(), {1, natoms}, int_options).to(device); + inputs.push_back(atype_Tensor); + at::Tensor box_Tensor = + torch::from_blob(const_cast(box.data()), {1, 9}, options) + .to(device); + inputs.push_back(box_Tensor); + c10::Dict outputs = + module.forward(inputs).toGenericDict(); + + c10::IValue energy_ = outputs.at("energy"); + c10::IValue force_ = outputs.at("force"); + c10::IValue virial_ = outputs.at("virial"); + ener = energy_.toTensor().item(); + + torch::Tensor flat_force_ = force_.toTensor().view({-1}); + torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); + force.assign(cpu_force_.data_ptr(), + cpu_force_.data_ptr() + cpu_force_.numel()); + + torch::Tensor flat_virial_ = virial_.toTensor().view({-1}); + torch::Tensor cpu_virial_ = flat_virial_.to(torch::kCPU); + virial.assign(cpu_virial_.data_ptr(), + cpu_virial_.data_ptr() + cpu_virial_.numel()); } -template void DeepPotPT::compute(double& ener, - std::vector& force, - std::vector& virial, - const std::vector& coord, - const std::vector& atype, - const std::vector& box); +template void DeepPotPT::compute( + double& ener, + std::vector& force, + std::vector& virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box); void DeepPotPT::get_type_map(std::string& type_map) { auto ret = module.run_method("get_type_map").toList(); for (const torch::IValue& element : ret) { - type_map += torch::str(element); // Convert each element to a string - type_map += " "; // Add a space between elements + type_map += torch::str(element); // Convert each element to a string + type_map += " "; // Add a space between elements } } @@ -169,7 +179,7 @@ void DeepPotPT::computew(std::vector& ener, const std::vector& box, const std::vector& fparam, const std::vector& aparam) { - //TODO: atomic compute unsupported + // TODO: atomic compute unsupported compute(ener, force, virial, coord, atype, box); } void DeepPotPT::computew(std::vector& ener, @@ -182,7 +192,7 @@ void DeepPotPT::computew(std::vector& ener, const std::vector& box, const std::vector& fparam, const std::vector& aparam) { - //TODO: atomic compute unsupported + // TODO: atomic compute unsupported compute(ener, force, virial, coord, atype, box); } void DeepPotPT::computew(std::vector& ener, @@ -198,8 +208,8 @@ void DeepPotPT::computew(std::vector& ener, const int& ago, const std::vector& fparam, const std::vector& aparam) { - //TODO: atomic compute unsupported - compute(ener, force, virial, coord, atype, box, inlist,ago); + // TODO: atomic compute unsupported + compute(ener, force, virial, coord, atype, box, inlist, ago); } void DeepPotPT::computew(std::vector& ener, std::vector& force, @@ -214,8 +224,8 @@ void DeepPotPT::computew(std::vector& ener, const int& ago, const std::vector& fparam, const std::vector& aparam) { - //TODO: atomic compute unsupported - compute(ener, force, virial, coord, atype, box, inlist,ago); + // TODO: atomic compute unsupported + compute(ener, force, virial, coord, atype, box, inlist, ago); } void DeepPotPT::computew_mixed_type(std::vector& ener, std::vector& force, @@ -228,8 +238,7 @@ void DeepPotPT::computew_mixed_type(std::vector& ener, const std::vector& box, const std::vector& fparam, const std::vector& aparam) { - throw; - + throw; } void DeepPotPT::computew_mixed_type(std::vector& ener, std::vector& force, diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index d4b3236064..aaa19b64f2 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -1,20 +1,24 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later #include "commonPT.h" -void NeighborListData::copy_from_nlist(const InputNlist& inlist, int& max_num_neighbors, int nnei) -{ +void NeighborListData::copy_from_nlist(const InputNlist& inlist, + int& max_num_neighbors, + int nnei) { int inum = inlist.inum; ilist.resize(inum); numneigh.resize(inum); memcpy(&ilist[0], inlist.ilist, inum * sizeof(int)); int* max_element = std::max_element(inlist.numneigh, inlist.numneigh + inum); max_num_neighbors = *max_element; - if (max_num_neighbors < nnei) + if (max_num_neighbors < nnei) { max_num_neighbors = nnei; + } jlist = (int*)malloc(inum * max_num_neighbors * sizeof(int)); - memset(jlist, -1 , inum * max_num_neighbors * sizeof(int)); + memset(jlist, -1, inum * max_num_neighbors * sizeof(int)); for (int ii = 0; ii < inum; ++ii) { int jnum = inlist.numneigh[ii]; numneigh[ii] = inlist.numneigh[ii]; - memcpy(&jlist[ii * max_num_neighbors], inlist.firstneigh[ii], jnum * sizeof(int)); + memcpy(&jlist[ii * max_num_neighbors], inlist.firstneigh[ii], + jnum * sizeof(int)); } -} \ No newline at end of file +} From 051211829ebbd4f5a420e6c3046d17a02a92a1ef Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Thu, 25 Jan 2024 19:37:10 +0800 Subject: [PATCH 003/103] fix some bugs and add atomic output --- source/api_cc/include/DeepPotPT.h | 2 ++ source/api_cc/src/DeepPotPT.cc | 43 ++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/source/api_cc/include/DeepPotPT.h b/source/api_cc/include/DeepPotPT.h index efe453ae8e..cccab63ae2 100644 --- a/source/api_cc/include/DeepPotPT.h +++ b/source/api_cc/include/DeepPotPT.h @@ -310,11 +310,13 @@ class DeepPotPT : public DeepPotBase { const std::vector& aparam = std::vector()); private: + int num_intra_nthreads, num_inter_nthreads; bool inited; int ntypes; int ntypes_spin; int dfparam; int daparam; + bool aparam_nall; // copy neighbor list info from host torch::jit::script::Module module; double rcut; diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 9f3cb998bf..278b517b62 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include "DeepPotPT.h" - +#include "common.h" using namespace deepmd; DeepPotPT::DeepPotPT() : inited(false) {} DeepPotPT::DeepPotPT(const std::string& model, @@ -25,16 +25,30 @@ void DeepPotPT::init(const std::string& model, const int& gpu_rank) { << std::endl; gpu_id = gpu_rank; torch::Device device(torch::kCUDA, gpu_rank); - - module = torch::jit::load(model, device); + //This may be implemented as something like DPErrcheck(DPSetDevice(gpu_rank % gpu_num)); + try { + module = torch::jit::load(model, device); + } + catch (const c10::Error& e) { + std::cerr << "Error loading the model, maybe GPU is not available\n"; + } torch::jit::FusionStrategy strategy; strategy = {{torch::jit::FusionBehavior::DYNAMIC, 10}}; torch::jit::setFusionStrategy(strategy); // at::globalContext().setAllowTF32CuBLAS(true); // at::globalContext().setAllowTF32CuDNN(true); + get_env_nthreads(num_intra_nthreads, num_inter_nthreads);//need to be fixed as DP_INTRA_OP_PARALLELISM_THREADS + at::set_num_interop_threads(num_inter_nthreads); + at::set_num_threads(num_intra_nthreads); + auto rcut_ = module.run_method("get_rcut").toDouble(); rcut = static_cast(rcut_); + ntypes = 0; + ntypes_spin = 0; + dfparam = 0; + daparam = 0; + aparam_nall = false; inited = true; } DeepPotPT::~DeepPotPT() {} @@ -43,6 +57,8 @@ template void DeepPotPT::compute(ENERGYVTYPE& ener, std::vector& force, std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, const std::vector& coord, const std::vector& atype, const std::vector& box, @@ -81,13 +97,21 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, } } inputs.push_back(firstneigh_tensor); + at::Tensor box_Tensor = + torch::from_blob(const_cast(box.data()), {1, 9}, options) + .to(device); + inputs.push_back(box_Tensor); + at::Tensor do_atom_virial_tensor = torch.tensor(True); + inputs.push_back(do_atom_virial_tensor); c10::Dict outputs = module.forward(inputs).toGenericDict(); c10::IValue energy_ = outputs.at("energy"); c10::IValue force_ = outputs.at("extended_force"); c10::IValue virial_ = outputs.at("extended_virial"); + c10::IValue atom_virial_ = outputs.at("atomic_virial"); + c10::IValue atom_energy_ = outputs.at("atom_energy"); ener = energy_.toTensor().item(); - + atom_energy = atom_energy_.toTensor().item(); torch::Tensor flat_force_ = force_.toTensor().view({-1}); torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); force.assign(cpu_force_.data_ptr(), @@ -97,6 +121,11 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor cpu_virial_ = flat_virial_.to(torch::kCPU); virial.assign(cpu_virial_.data_ptr(), cpu_virial_.data_ptr() + cpu_virial_.numel()); + + torch::Tensor flat_atom_virial_ = atom_virial_.toTensor().view({-1}); + torch::Tensor cpu_atom_virial_ = flat_atom_virial_.to(torch::kCPU); + atom_virial.assign(cpu_atom_virial_.data_ptr(), + cpu_atom_virial_.data_ptr() + cpu_atom_virial_.numel()); } template void DeepPotPT::compute( double& ener, @@ -238,7 +267,8 @@ void DeepPotPT::computew_mixed_type(std::vector& ener, const std::vector& box, const std::vector& fparam, const std::vector& aparam) { - throw; + throw deepmd::deepmd_exception( + "computew_mixed_type is not implemented"); } void DeepPotPT::computew_mixed_type(std::vector& ener, std::vector& force, @@ -251,5 +281,6 @@ void DeepPotPT::computew_mixed_type(std::vector& ener, const std::vector& box, const std::vector& fparam, const std::vector& aparam) { - throw; + throw deepmd::deepmd_exception( + "computew_mixed_type is not implemented"); } From 018a0353ffcec86d2d5f4ff414050ea207a8aa1d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 11:41:57 +0000 Subject: [PATCH 004/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 278b517b62..6aa92fafcd 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -1,5 +1,6 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include "DeepPotPT.h" + #include "common.h" using namespace deepmd; DeepPotPT::DeepPotPT() : inited(false) {} @@ -25,12 +26,12 @@ void DeepPotPT::init(const std::string& model, const int& gpu_rank) { << std::endl; gpu_id = gpu_rank; torch::Device device(torch::kCUDA, gpu_rank); - //This may be implemented as something like DPErrcheck(DPSetDevice(gpu_rank % gpu_num)); + // This may be implemented as something like DPErrcheck(DPSetDevice(gpu_rank % + // gpu_num)); try { module = torch::jit::load(model, device); - } - catch (const c10::Error& e) { - std::cerr << "Error loading the model, maybe GPU is not available\n"; + } catch (const c10::Error& e) { + std::cerr << "Error loading the model, maybe GPU is not available\n"; } torch::jit::FusionStrategy strategy; strategy = {{torch::jit::FusionBehavior::DYNAMIC, 10}}; @@ -38,7 +39,9 @@ void DeepPotPT::init(const std::string& model, const int& gpu_rank) { // at::globalContext().setAllowTF32CuBLAS(true); // at::globalContext().setAllowTF32CuDNN(true); - get_env_nthreads(num_intra_nthreads, num_inter_nthreads);//need to be fixed as DP_INTRA_OP_PARALLELISM_THREADS + get_env_nthreads(num_intra_nthreads, + num_inter_nthreads); // need to be fixed as + // DP_INTRA_OP_PARALLELISM_THREADS at::set_num_interop_threads(num_inter_nthreads); at::set_num_threads(num_intra_nthreads); @@ -124,8 +127,9 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor flat_atom_virial_ = atom_virial_.toTensor().view({-1}); torch::Tensor cpu_atom_virial_ = flat_atom_virial_.to(torch::kCPU); - atom_virial.assign(cpu_atom_virial_.data_ptr(), - cpu_atom_virial_.data_ptr() + cpu_atom_virial_.numel()); + atom_virial.assign( + cpu_atom_virial_.data_ptr(), + cpu_atom_virial_.data_ptr() + cpu_atom_virial_.numel()); } template void DeepPotPT::compute( double& ener, @@ -267,8 +271,7 @@ void DeepPotPT::computew_mixed_type(std::vector& ener, const std::vector& box, const std::vector& fparam, const std::vector& aparam) { - throw deepmd::deepmd_exception( - "computew_mixed_type is not implemented"); + throw deepmd::deepmd_exception("computew_mixed_type is not implemented"); } void DeepPotPT::computew_mixed_type(std::vector& ener, std::vector& force, @@ -281,6 +284,5 @@ void DeepPotPT::computew_mixed_type(std::vector& ener, const std::vector& box, const std::vector& fparam, const std::vector& aparam) { - throw deepmd::deepmd_exception( - "computew_mixed_type is not implemented"); + throw deepmd::deepmd_exception("computew_mixed_type is not implemented"); } From 5ebb9bf68ec7107decf3178f1763ea328caa9c22 Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Thu, 25 Jan 2024 20:25:26 +0800 Subject: [PATCH 005/103] fix atom compute bugs --- source/api_cc/include/DeepPotPT.h | 8 ++++---- source/api_cc/src/DeepPotPT.cc | 27 ++++++++++++++++++--------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/source/api_cc/include/DeepPotPT.h b/source/api_cc/include/DeepPotPT.h index cccab63ae2..4a6c8166f9 100644 --- a/source/api_cc/include/DeepPotPT.h +++ b/source/api_cc/include/DeepPotPT.h @@ -63,8 +63,8 @@ class DeepPotPT : public DeepPotBase { void compute(ENERGYVTYPE& ener, std::vector& force, std::vector& virial, - // std::vector& atom_energy, - // std::vector& atom_virial, + std::vector& atom_energy, + std::vector& atom_virial, const std::vector& coord, const std::vector& atype, const std::vector& box); @@ -99,8 +99,8 @@ class DeepPotPT : public DeepPotBase { void compute(ENERGYVTYPE& ener, std::vector& force, std::vector& virial, - // std::vector& atom_energy, - // std::vector& atom_virial, + std::vector& atom_energy, + std::vector& atom_virial, const std::vector& coord, const std::vector& atype, const std::vector& box, diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 6aa92fafcd..12f1ab9dc1 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -46,7 +46,7 @@ void DeepPotPT::init(const std::string& model, const int& gpu_rank) { at::set_num_threads(num_intra_nthreads); auto rcut_ = module.run_method("get_rcut").toDouble(); - rcut = static_cast(rcut_); + rcut = static_cast(rcut_); ntypes = 0; ntypes_spin = 0; dfparam = 0; @@ -99,13 +99,13 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, firstneigh_tensor = firstneigh.to(torch::kInt64).to(device); } } - inputs.push_back(firstneigh_tensor); at::Tensor box_Tensor = torch::from_blob(const_cast(box.data()), {1, 9}, options) .to(device); inputs.push_back(box_Tensor); - at::Tensor do_atom_virial_tensor = torch.tensor(True); + at::Tensor do_atom_virial_tensor = torch::tensor(true); inputs.push_back(do_atom_virial_tensor); + inputs.push_back(firstneigh_tensor); c10::Dict outputs = module.forward(inputs).toGenericDict(); c10::IValue energy_ = outputs.at("energy"); @@ -114,7 +114,9 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, c10::IValue atom_virial_ = outputs.at("atomic_virial"); c10::IValue atom_energy_ = outputs.at("atom_energy"); ener = energy_.toTensor().item(); - atom_energy = atom_energy_.toTensor().item(); + torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}); + torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); + force.assign(cpu_atom_energy_.data_ptr(), cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); torch::Tensor flat_force_ = force_.toTensor().view({-1}); torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); force.assign(cpu_force_.data_ptr(), @@ -135,6 +137,8 @@ template void DeepPotPT::compute( double& ener, std::vector& force, std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, const std::vector& coord, const std::vector& atype, const std::vector& box, @@ -145,6 +149,8 @@ template void DeepPotPT::compute(ENERGYVTYPE& ener, std::vector& force, std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, const std::vector& coord, const std::vector& atype, const std::vector& box) { @@ -189,6 +195,8 @@ template void DeepPotPT::compute( double& ener, std::vector& force, std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, const std::vector& coord, const std::vector& atype, const std::vector& box); @@ -212,8 +220,7 @@ void DeepPotPT::computew(std::vector& ener, const std::vector& box, const std::vector& fparam, const std::vector& aparam) { - // TODO: atomic compute unsupported - compute(ener, force, virial, coord, atype, box); + compute(ener, force, virial, atom_energy,atom_virial, atype, box); } void DeepPotPT::computew(std::vector& ener, std::vector& force, @@ -226,7 +233,8 @@ void DeepPotPT::computew(std::vector& ener, const std::vector& fparam, const std::vector& aparam) { // TODO: atomic compute unsupported - compute(ener, force, virial, coord, atype, box); + //compute(ener, force, virial, atom_energy,atom_virial, atype, box); + throw deepmd::deepmd_exception("unsupported float type"); } void DeepPotPT::computew(std::vector& ener, std::vector& force, @@ -242,7 +250,7 @@ void DeepPotPT::computew(std::vector& ener, const std::vector& fparam, const std::vector& aparam) { // TODO: atomic compute unsupported - compute(ener, force, virial, coord, atype, box, inlist, ago); + compute(ener, force, virial, atom_energy,atom_virial, coord, atype, box, inlist, ago); } void DeepPotPT::computew(std::vector& ener, std::vector& force, @@ -258,7 +266,8 @@ void DeepPotPT::computew(std::vector& ener, const std::vector& fparam, const std::vector& aparam) { // TODO: atomic compute unsupported - compute(ener, force, virial, coord, atype, box, inlist, ago); + //compute(ener, force, virial, coord, atype, box, inlist, ago); + throw deepmd::deepmd_exception("unsupported float type"); } void DeepPotPT::computew_mixed_type(std::vector& ener, std::vector& force, From 6924e060a8b9dc520bb7d376077baa565aa2d68d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 12:25:52 +0000 Subject: [PATCH 006/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 12f1ab9dc1..c3beba8207 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -115,8 +115,9 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, c10::IValue atom_energy_ = outputs.at("atom_energy"); ener = energy_.toTensor().item(); torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}); - torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); - force.assign(cpu_atom_energy_.data_ptr(), cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); + torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); + force.assign(cpu_atom_energy_.data_ptr(), + cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); torch::Tensor flat_force_ = force_.toTensor().view({-1}); torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); force.assign(cpu_force_.data_ptr(), @@ -220,7 +221,7 @@ void DeepPotPT::computew(std::vector& ener, const std::vector& box, const std::vector& fparam, const std::vector& aparam) { - compute(ener, force, virial, atom_energy,atom_virial, atype, box); + compute(ener, force, virial, atom_energy, atom_virial, atype, box); } void DeepPotPT::computew(std::vector& ener, std::vector& force, @@ -233,7 +234,7 @@ void DeepPotPT::computew(std::vector& ener, const std::vector& fparam, const std::vector& aparam) { // TODO: atomic compute unsupported - //compute(ener, force, virial, atom_energy,atom_virial, atype, box); + // compute(ener, force, virial, atom_energy,atom_virial, atype, box); throw deepmd::deepmd_exception("unsupported float type"); } void DeepPotPT::computew(std::vector& ener, @@ -250,7 +251,8 @@ void DeepPotPT::computew(std::vector& ener, const std::vector& fparam, const std::vector& aparam) { // TODO: atomic compute unsupported - compute(ener, force, virial, atom_energy,atom_virial, coord, atype, box, inlist, ago); + compute(ener, force, virial, atom_energy, atom_virial, coord, atype, box, + inlist, ago); } void DeepPotPT::computew(std::vector& ener, std::vector& force, @@ -266,7 +268,7 @@ void DeepPotPT::computew(std::vector& ener, const std::vector& fparam, const std::vector& aparam) { // TODO: atomic compute unsupported - //compute(ener, force, virial, coord, atype, box, inlist, ago); + // compute(ener, force, virial, coord, atype, box, inlist, ago); throw deepmd::deepmd_exception("unsupported float type"); } void DeepPotPT::computew_mixed_type(std::vector& ener, From 26217bf06435033230e69ba7fabf74296ea6bf35 Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Thu, 25 Jan 2024 20:42:52 +0800 Subject: [PATCH 007/103] fix bugs --- source/api_cc/src/DeepPotPT.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 12f1ab9dc1..2ff36eb16d 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -103,7 +103,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::from_blob(const_cast(box.data()), {1, 9}, options) .to(device); inputs.push_back(box_Tensor); - at::Tensor do_atom_virial_tensor = torch::tensor(true); + bool do_atom_virial_tensor = true; inputs.push_back(do_atom_virial_tensor); inputs.push_back(firstneigh_tensor); c10::Dict outputs = From c9bbd83cf0aabfb8e0e8b0a413aac29a2d963a9e Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Thu, 25 Jan 2024 20:47:42 +0800 Subject: [PATCH 008/103] include deeppotpt.h --- source/api_cc/src/DeepPot.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/api_cc/src/DeepPot.cc b/source/api_cc/src/DeepPot.cc index a5a558e484..4d023f927d 100644 --- a/source/api_cc/src/DeepPot.cc +++ b/source/api_cc/src/DeepPot.cc @@ -10,6 +10,9 @@ #ifdef BUILD_TENSORFLOW #include "DeepPotTF.h" #endif +#ifdef BUILD_PYTORCH +#include "DeepPotPT.h" +#endif #include "device.h" using namespace deepmd; From 54e81662438b756149e80d6b507887f852fd6172 Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Thu, 25 Jan 2024 21:11:24 +0800 Subject: [PATCH 009/103] add float and vector energytype implement --- source/api_cc/include/commonPT.h | 2 - source/api_cc/src/DeepPotPT.cc | 102 +++++++++++++++++++++++++------ 2 files changed, 82 insertions(+), 22 deletions(-) diff --git a/source/api_cc/include/commonPT.h b/source/api_cc/include/commonPT.h index d2d2e106c7..16c08c11b5 100644 --- a/source/api_cc/include/commonPT.h +++ b/source/api_cc/include/commonPT.h @@ -1,7 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include -#ifndef COMMON_H -#define COMMON_H #include #include #include diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 23ec06170e..f6798c6da4 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -113,29 +113,33 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, c10::IValue virial_ = outputs.at("extended_virial"); c10::IValue atom_virial_ = outputs.at("atomic_virial"); c10::IValue atom_energy_ = outputs.at("atom_energy"); - ener = energy_.toTensor().item(); + + torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); + torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); + energy.assign(cpu_energy_.data_ptr(), + cpu_energy_.data_ptr() + cpu_energy_.numel()); torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); - force.assign(cpu_atom_energy_.data_ptr(), - cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); + atom_energy.assign(cpu_atom_energy_.data_ptr(), + cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); torch::Tensor flat_force_ = force_.toTensor().view({-1}); torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); - force.assign(cpu_force_.data_ptr(), - cpu_force_.data_ptr() + cpu_force_.numel()); + force.assign(cpu_force_.data_ptr(), + cpu_force_.data_ptr() + cpu_force_.numel()); torch::Tensor flat_virial_ = virial_.toTensor().view({-1}); torch::Tensor cpu_virial_ = flat_virial_.to(torch::kCPU); - virial.assign(cpu_virial_.data_ptr(), - cpu_virial_.data_ptr() + cpu_virial_.numel()); + virial.assign(cpu_virial_.data_ptr(), + cpu_virial_.data_ptr() + cpu_virial_.numel()); torch::Tensor flat_atom_virial_ = atom_virial_.toTensor().view({-1}); torch::Tensor cpu_atom_virial_ = flat_atom_virial_.to(torch::kCPU); atom_virial.assign( - cpu_atom_virial_.data_ptr(), - cpu_atom_virial_.data_ptr() + cpu_atom_virial_.numel()); + cpu_atom_virial_.data_ptr(), + cpu_atom_virial_.data_ptr() + cpu_atom_virial_.numel()); } -template void DeepPotPT::compute( - double& ener, +template void DeepPotPT::compute( + ENERGYTYPE& ener, std::vector& force, std::vector& virial, std::vector& atom_energy, @@ -145,7 +149,39 @@ template void DeepPotPT::compute( const std::vector& box, const InputNlist& lmp_list, const int& ago); - +template void DeepPotPT::compute( + ENERGYTYPE& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const InputNlist& lmp_list, + const int& ago); + template void DeepPotPT::compute>( + std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const InputNlist& lmp_list, + const int& ago); + template void DeepPotPT::compute>( + std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const InputNlist& lmp_list, + const int& ago); template void DeepPotPT::compute(ENERGYVTYPE& ener, std::vector& force, @@ -180,20 +216,20 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, c10::IValue energy_ = outputs.at("energy"); c10::IValue force_ = outputs.at("force"); c10::IValue virial_ = outputs.at("virial"); - ener = energy_.toTensor().item(); + ener = energy_.toTensor().item(); torch::Tensor flat_force_ = force_.toTensor().view({-1}); torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); - force.assign(cpu_force_.data_ptr(), - cpu_force_.data_ptr() + cpu_force_.numel()); + force.assign(cpu_force_.data_ptr(), + cpu_force_.data_ptr() + cpu_force_.numel()); torch::Tensor flat_virial_ = virial_.toTensor().view({-1}); torch::Tensor cpu_virial_ = flat_virial_.to(torch::kCPU); - virial.assign(cpu_virial_.data_ptr(), - cpu_virial_.data_ptr() + cpu_virial_.numel()); + virial.assign(cpu_virial_.data_ptr(), + cpu_virial_.data_ptr() + cpu_virial_.numel()); } -template void DeepPotPT::compute( - double& ener, +template void DeepPotPT::compute( + ENERGYTYPE& ener, std::vector& force, std::vector& virial, std::vector& atom_energy, @@ -201,7 +237,33 @@ template void DeepPotPT::compute( const std::vector& coord, const std::vector& atype, const std::vector& box); - +template void DeepPotPT::compute( + ENERGYTYPE& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box); + template void DeepPotPT::compute>( + std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box); + template void DeepPotPT::compute>( + std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box); void DeepPotPT::get_type_map(std::string& type_map) { auto ret = module.run_method("get_type_map").toList(); for (const torch::IValue& element : ret) { From 8f0219bf80ea6501c5344935e70dff5ded3eb8e0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 13:11:50 +0000 Subject: [PATCH 010/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/include/commonPT.h | 1 + source/api_cc/src/DeepPotPT.cc | 15 ++++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/source/api_cc/include/commonPT.h b/source/api_cc/include/commonPT.h index 16c08c11b5..0220e7b790 100644 --- a/source/api_cc/include/commonPT.h +++ b/source/api_cc/include/commonPT.h @@ -1,5 +1,6 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include + #include #include #include diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index f6798c6da4..bfb979e6a4 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -117,11 +117,12 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); energy.assign(cpu_energy_.data_ptr(), - cpu_energy_.data_ptr() + cpu_energy_.numel()); + cpu_energy_.data_ptr() + cpu_energy_.numel()); torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); - atom_energy.assign(cpu_atom_energy_.data_ptr(), - cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); + atom_energy.assign( + cpu_atom_energy_.data_ptr(), + cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); torch::Tensor flat_force_ = force_.toTensor().view({-1}); torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); force.assign(cpu_force_.data_ptr(), @@ -160,7 +161,7 @@ template void DeepPotPT::compute( const std::vector& box, const InputNlist& lmp_list, const int& ago); - template void DeepPotPT::compute>( +template void DeepPotPT::compute>( std::vector& ener, std::vector& force, std::vector& virial, @@ -171,7 +172,7 @@ template void DeepPotPT::compute( const std::vector& box, const InputNlist& lmp_list, const int& ago); - template void DeepPotPT::compute>( +template void DeepPotPT::compute>( std::vector& ener, std::vector& force, std::vector& virial, @@ -246,7 +247,7 @@ template void DeepPotPT::compute( const std::vector& coord, const std::vector& atype, const std::vector& box); - template void DeepPotPT::compute>( +template void DeepPotPT::compute>( std::vector& ener, std::vector& force, std::vector& virial, @@ -255,7 +256,7 @@ template void DeepPotPT::compute( const std::vector& coord, const std::vector& atype, const std::vector& box); - template void DeepPotPT::compute>( +template void DeepPotPT::compute>( std::vector& ener, std::vector& force, std::vector& virial, From 0a8e19e7f06a1b7393ccc41a916eb0e5928b506e Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Thu, 25 Jan 2024 21:12:57 +0800 Subject: [PATCH 011/103] modify pt nlistdata name --- source/api_cc/include/DeepPotPT.h | 2 +- source/api_cc/include/commonPT.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/api_cc/include/DeepPotPT.h b/source/api_cc/include/DeepPotPT.h index 4a6c8166f9..4cd39cdc9c 100644 --- a/source/api_cc/include/DeepPotPT.h +++ b/source/api_cc/include/DeepPotPT.h @@ -320,7 +320,7 @@ class DeepPotPT : public DeepPotBase { // copy neighbor list info from host torch::jit::script::Module module; double rcut; - NeighborListData nlist_data; + NeighborListDataPT nlist_data; // InputNlist nlist; int max_num_neighbors; int gpu_id; diff --git a/source/api_cc/include/commonPT.h b/source/api_cc/include/commonPT.h index 16c08c11b5..396c69ff15 100644 --- a/source/api_cc/include/commonPT.h +++ b/source/api_cc/include/commonPT.h @@ -7,7 +7,7 @@ #include "neighbor_list.h" -struct NeighborListData { +struct NeighborListDataPT { /// Array stores the core region atom's index std::vector ilist; /// Array stores the core region atom's neighbor index From 02cf214533fee5e5d80f03f67e826f8564c19e8e Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Thu, 25 Jan 2024 21:17:27 +0800 Subject: [PATCH 012/103] fix some bugs --- source/api_cc/src/DeepPotPT.cc | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index bfb979e6a4..901deb33ae 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -116,7 +116,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); - energy.assign(cpu_energy_.data_ptr(), + ener.assign(cpu_energy_.data_ptr(), cpu_energy_.data_ptr() + cpu_energy_.numel()); torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); @@ -211,13 +211,25 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::from_blob(const_cast(box.data()), {1, 9}, options) .to(device); inputs.push_back(box_Tensor); + bool do_atom_virial_tensor = true; + inputs.push_back(do_atom_virial_tensor); c10::Dict outputs = module.forward(inputs).toGenericDict(); c10::IValue energy_ = outputs.at("energy"); c10::IValue force_ = outputs.at("force"); c10::IValue virial_ = outputs.at("virial"); - ener = energy_.toTensor().item(); + c10::IValue atom_virial_ = outputs.at("atomic_virial"); + c10::IValue atom_energy_ = outputs.at("atom_energy"); + torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); + torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); + ener.assign(cpu_energy_.data_ptr(), + cpu_energy_.data_ptr() + cpu_energy_.numel()); + torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}); + torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); + atom_energy.assign( + cpu_atom_energy_.data_ptr(), + cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); torch::Tensor flat_force_ = force_.toTensor().view({-1}); torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); @@ -228,6 +240,12 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor cpu_virial_ = flat_virial_.to(torch::kCPU); virial.assign(cpu_virial_.data_ptr(), cpu_virial_.data_ptr() + cpu_virial_.numel()); + + torch::Tensor flat_atom_virial_ = atom_virial_.toTensor().view({-1}); + torch::Tensor cpu_atom_virial_ = flat_atom_virial_.to(torch::kCPU); + atom_virial.assign( + cpu_atom_virial_.data_ptr(), + cpu_atom_virial_.data_ptr() + cpu_atom_virial_.numel()); } template void DeepPotPT::compute( ENERGYTYPE& ener, From 1d5fb1caf62f0ea7bdf9aaaa681cf6ec29034955 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 13:18:17 +0000 Subject: [PATCH 013/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 901deb33ae..a9c4ebb3d8 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -117,7 +117,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); ener.assign(cpu_energy_.data_ptr(), - cpu_energy_.data_ptr() + cpu_energy_.numel()); + cpu_energy_.data_ptr() + cpu_energy_.numel()); torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); atom_energy.assign( @@ -224,7 +224,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); ener.assign(cpu_energy_.data_ptr(), - cpu_energy_.data_ptr() + cpu_energy_.numel()); + cpu_energy_.data_ptr() + cpu_energy_.numel()); torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); atom_energy.assign( From f8dab4de3b1096014ef63ef64da464f24c3732bd Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Thu, 25 Jan 2024 23:41:29 +0800 Subject: [PATCH 014/103] fix bug --- source/api_cc/include/commonPT.h | 1 - 1 file changed, 1 deletion(-) diff --git a/source/api_cc/include/commonPT.h b/source/api_cc/include/commonPT.h index 8d9cd90532..0f753a365f 100644 --- a/source/api_cc/include/commonPT.h +++ b/source/api_cc/include/commonPT.h @@ -25,4 +25,3 @@ struct NeighborListDataPT { int nnei); // void make_inlist(InputNlist& inlist); }; -#endif From 795058ce9922dc56924005a49e5c42c33c7e7c3b Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Thu, 25 Jan 2024 23:42:30 +0800 Subject: [PATCH 015/103] fix bug --- source/api_cc/include/commonPT.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/api_cc/include/commonPT.h b/source/api_cc/include/commonPT.h index 0f753a365f..d5b3f15155 100644 --- a/source/api_cc/include/commonPT.h +++ b/source/api_cc/include/commonPT.h @@ -7,7 +7,7 @@ #include #include "neighbor_list.h" - +namespace deepmd { struct NeighborListDataPT { /// Array stores the core region atom's index std::vector ilist; @@ -25,3 +25,4 @@ struct NeighborListDataPT { int nnei); // void make_inlist(InputNlist& inlist); }; +} From a3cd2ef585059d1553e06395f950c742d1782e49 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 15:43:59 +0000 Subject: [PATCH 016/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/include/commonPT.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/api_cc/include/commonPT.h b/source/api_cc/include/commonPT.h index d5b3f15155..d357b76085 100644 --- a/source/api_cc/include/commonPT.h +++ b/source/api_cc/include/commonPT.h @@ -25,4 +25,4 @@ struct NeighborListDataPT { int nnei); // void make_inlist(InputNlist& inlist); }; -} +} // namespace deepmd From f4c69013c17a3e852e78cf7de1104e17080e5c46 Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Thu, 25 Jan 2024 23:47:10 +0800 Subject: [PATCH 017/103] fix compute api --- source/api_cc/src/DeepPotPT.cc | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index a9c4ebb3d8..e8961d08c7 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -302,7 +302,7 @@ void DeepPotPT::computew(std::vector& ener, const std::vector& box, const std::vector& fparam, const std::vector& aparam) { - compute(ener, force, virial, atom_energy, atom_virial, atype, box); + compute(ener, force, virial, atom_energy, atom_virial,coord, atype, box); } void DeepPotPT::computew(std::vector& ener, std::vector& force, @@ -314,9 +314,7 @@ void DeepPotPT::computew(std::vector& ener, const std::vector& box, const std::vector& fparam, const std::vector& aparam) { - // TODO: atomic compute unsupported - // compute(ener, force, virial, atom_energy,atom_virial, atype, box); - throw deepmd::deepmd_exception("unsupported float type"); + compute(ener, force, virial, atom_energy, atom_virial,coord, atype, box); } void DeepPotPT::computew(std::vector& ener, std::vector& force, @@ -348,9 +346,8 @@ void DeepPotPT::computew(std::vector& ener, const int& ago, const std::vector& fparam, const std::vector& aparam) { - // TODO: atomic compute unsupported - // compute(ener, force, virial, coord, atype, box, inlist, ago); - throw deepmd::deepmd_exception("unsupported float type"); + compute(ener, force, virial, atom_energy, atom_virial, coord, atype, box, + inlist, ago); } void DeepPotPT::computew_mixed_type(std::vector& ener, std::vector& force, From 08ea8dfde5181cd7574ee49913f1a7563ad5e3a4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 15:47:37 +0000 Subject: [PATCH 018/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index e8961d08c7..07b46bcbf3 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -302,7 +302,7 @@ void DeepPotPT::computew(std::vector& ener, const std::vector& box, const std::vector& fparam, const std::vector& aparam) { - compute(ener, force, virial, atom_energy, atom_virial,coord, atype, box); + compute(ener, force, virial, atom_energy, atom_virial, coord, atype, box); } void DeepPotPT::computew(std::vector& ener, std::vector& force, @@ -314,7 +314,7 @@ void DeepPotPT::computew(std::vector& ener, const std::vector& box, const std::vector& fparam, const std::vector& aparam) { - compute(ener, force, virial, atom_energy, atom_virial,coord, atype, box); + compute(ener, force, virial, atom_energy, atom_virial, coord, atype, box); } void DeepPotPT::computew(std::vector& ener, std::vector& force, From ca70171386c13ec14b0662a269d6146ded80a02f Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Thu, 25 Jan 2024 23:53:43 +0800 Subject: [PATCH 019/103] Deprecated valuetype --- source/api_cc/src/DeepPotPT.cc | 80 +++++++++++++++++----------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 07b46bcbf3..743b7da90d 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -139,28 +139,28 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, cpu_atom_virial_.data_ptr(), cpu_atom_virial_.data_ptr() + cpu_atom_virial_.numel()); } -template void DeepPotPT::compute( - ENERGYTYPE& ener, - std::vector& force, - std::vector& virial, - std::vector& atom_energy, - std::vector& atom_virial, - const std::vector& coord, - const std::vector& atype, - const std::vector& box, - const InputNlist& lmp_list, - const int& ago); -template void DeepPotPT::compute( - ENERGYTYPE& ener, - std::vector& force, - std::vector& virial, - std::vector& atom_energy, - std::vector& atom_virial, - const std::vector& coord, - const std::vector& atype, - const std::vector& box, - const InputNlist& lmp_list, - const int& ago); +// template void DeepPotPT::compute( +// ENERGYTYPE& ener, +// std::vector& force, +// std::vector& virial, +// std::vector& atom_energy, +// std::vector& atom_virial, +// const std::vector& coord, +// const std::vector& atype, +// const std::vector& box, +// const InputNlist& lmp_list, +// const int& ago); +// template void DeepPotPT::compute( +// ENERGYTYPE& ener, +// std::vector& force, +// std::vector& virial, +// std::vector& atom_energy, +// std::vector& atom_virial, +// const std::vector& coord, +// const std::vector& atype, +// const std::vector& box, +// const InputNlist& lmp_list, +// const int& ago); template void DeepPotPT::compute>( std::vector& ener, std::vector& force, @@ -247,24 +247,24 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, cpu_atom_virial_.data_ptr(), cpu_atom_virial_.data_ptr() + cpu_atom_virial_.numel()); } -template void DeepPotPT::compute( - ENERGYTYPE& ener, - std::vector& force, - std::vector& virial, - std::vector& atom_energy, - std::vector& atom_virial, - const std::vector& coord, - const std::vector& atype, - const std::vector& box); -template void DeepPotPT::compute( - ENERGYTYPE& ener, - std::vector& force, - std::vector& virial, - std::vector& atom_energy, - std::vector& atom_virial, - const std::vector& coord, - const std::vector& atype, - const std::vector& box); +// template void DeepPotPT::compute( +// ENERGYTYPE& ener, +// std::vector& force, +// std::vector& virial, +// std::vector& atom_energy, +// std::vector& atom_virial, +// const std::vector& coord, +// const std::vector& atype, +// const std::vector& box); +// template void DeepPotPT::compute( +// ENERGYTYPE& ener, +// std::vector& force, +// std::vector& virial, +// std::vector& atom_energy, +// std::vector& atom_virial, +// const std::vector& coord, +// const std::vector& atype, +// const std::vector& box); template void DeepPotPT::compute>( std::vector& ener, std::vector& force, From 7c66cf792c95da4d900afe14328b2d85ea55d1de Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Thu, 25 Jan 2024 23:55:06 +0800 Subject: [PATCH 020/103] Deprecated valuetype --- source/api_cc/src/DeepPotPT.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 743b7da90d..d1ce395d85 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -57,7 +57,7 @@ void DeepPotPT::init(const std::string& model, const int& gpu_rank) { DeepPotPT::~DeepPotPT() {} template -void DeepPotPT::compute(ENERGYVTYPE& ener, +void DeepPotPT::compute(std::vector& ener, std::vector& force, std::vector& virial, std::vector& atom_energy, @@ -184,7 +184,7 @@ template void DeepPotPT::compute>( const InputNlist& lmp_list, const int& ago); template -void DeepPotPT::compute(ENERGYVTYPE& ener, +void DeepPotPT::compute(std::vector& ener, std::vector& force, std::vector& virial, std::vector& atom_energy, From b9c74dbc97b40d25be0dafb02171d438cb24901c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 15:55:54 +0000 Subject: [PATCH 021/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index d1ce395d85..8e0dd84c7f 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -57,7 +57,7 @@ void DeepPotPT::init(const std::string& model, const int& gpu_rank) { DeepPotPT::~DeepPotPT() {} template -void DeepPotPT::compute(std::vector& ener, +void DeepPotPT::compute(std::vector& ener, std::vector& force, std::vector& virial, std::vector& atom_energy, From 295751caba080bf958d1f9c1d71b716cbb5aeaec Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Fri, 26 Jan 2024 09:49:54 +0800 Subject: [PATCH 022/103] fix compute definition --- source/api_cc/include/DeepPotPT.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/api_cc/include/DeepPotPT.h b/source/api_cc/include/DeepPotPT.h index 4cd39cdc9c..bb2072b587 100644 --- a/source/api_cc/include/DeepPotPT.h +++ b/source/api_cc/include/DeepPotPT.h @@ -60,7 +60,7 @@ class DeepPotPT : public DeepPotBase { *same aparam. **/ template - void compute(ENERGYVTYPE& ener, + void compute(std::vector& ener, std::vector& force, std::vector& virial, std::vector& atom_energy, @@ -96,7 +96,7 @@ class DeepPotPT : public DeepPotBase { *same aparam. **/ template - void compute(ENERGYVTYPE& ener, + void compute(std::vector& ener, std::vector& force, std::vector& virial, std::vector& atom_energy, From fc3040bc965a66893eb60df17e26ea82dc3dc192 Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Fri, 26 Jan 2024 10:15:28 +0800 Subject: [PATCH 023/103] implement virtual function --- source/api_cc/include/DeepPotPT.h | 2 +- source/api_cc/src/DeepPotPT.cc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/api_cc/include/DeepPotPT.h b/source/api_cc/include/DeepPotPT.h index bb2072b587..4c9c81f8f9 100644 --- a/source/api_cc/include/DeepPotPT.h +++ b/source/api_cc/include/DeepPotPT.h @@ -34,7 +34,7 @@ class DeepPotPT : public DeepPotBase { * @param[in] file_content The content of the model file. If it is not empty, *DP will read from the string instead of the file. **/ - void init(const std::string& model, const int& gpu_rank = 0); + void init(const std::string& model, const int& gpu_rank = 0, const std::string& file_content = ""); private: /** diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 8e0dd84c7f..7a1306bece 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -9,13 +9,13 @@ DeepPotPT::DeepPotPT(const std::string& model, const std::string& file_content) : inited(false) { try { - init(model, gpu_rank); + init(model, gpu_rank,file_content); } catch (...) { // Clean up and rethrow, as the destructor will not be called throw; } } -void DeepPotPT::init(const std::string& model, const int& gpu_rank) { +void DeepPotPT::init(const std::string& model, const int& gpu_rank, const std::string& file_content = "") { if (inited) { std::cerr << "WARNING: deepmd-kit should not be initialized twice, do " "nothing at the second call of initializer" From 3e70a287ab073dabe068eb54de093368fc223c92 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 02:16:06 +0000 Subject: [PATCH 024/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/include/DeepPotPT.h | 4 +++- source/api_cc/src/DeepPotPT.cc | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/source/api_cc/include/DeepPotPT.h b/source/api_cc/include/DeepPotPT.h index 4c9c81f8f9..c9da731cd4 100644 --- a/source/api_cc/include/DeepPotPT.h +++ b/source/api_cc/include/DeepPotPT.h @@ -34,7 +34,9 @@ class DeepPotPT : public DeepPotBase { * @param[in] file_content The content of the model file. If it is not empty, *DP will read from the string instead of the file. **/ - void init(const std::string& model, const int& gpu_rank = 0, const std::string& file_content = ""); + void init(const std::string& model, + const int& gpu_rank = 0, + const std::string& file_content = ""); private: /** diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 7a1306bece..1aefc1b8d5 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -9,13 +9,15 @@ DeepPotPT::DeepPotPT(const std::string& model, const std::string& file_content) : inited(false) { try { - init(model, gpu_rank,file_content); + init(model, gpu_rank, file_content); } catch (...) { // Clean up and rethrow, as the destructor will not be called throw; } } -void DeepPotPT::init(const std::string& model, const int& gpu_rank, const std::string& file_content = "") { +void DeepPotPT::init(const std::string& model, + const int& gpu_rank, + const std::string& file_content = "") { if (inited) { std::cerr << "WARNING: deepmd-kit should not be initialized twice, do " "nothing at the second call of initializer" From 1576fbbf944fa929409c7ae61bba889c4448f12d Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Fri, 26 Jan 2024 10:28:01 +0800 Subject: [PATCH 025/103] fix bug --- source/api_cc/include/DeepPotPT.h | 4 ++-- source/api_cc/src/DeepPotPT.cc | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/api_cc/include/DeepPotPT.h b/source/api_cc/include/DeepPotPT.h index c9da731cd4..2935d5387b 100644 --- a/source/api_cc/include/DeepPotPT.h +++ b/source/api_cc/include/DeepPotPT.h @@ -62,7 +62,7 @@ class DeepPotPT : public DeepPotBase { *same aparam. **/ template - void compute(std::vector& ener, + void compute(ENERGYTYPE& ener, std::vector& force, std::vector& virial, std::vector& atom_energy, @@ -98,7 +98,7 @@ class DeepPotPT : public DeepPotBase { *same aparam. **/ template - void compute(std::vector& ener, + void compute(ENERGYTYPE& ener, std::vector& force, std::vector& virial, std::vector& atom_energy, diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 1aefc1b8d5..816571297a 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -17,7 +17,7 @@ DeepPotPT::DeepPotPT(const std::string& model, } void DeepPotPT::init(const std::string& model, const int& gpu_rank, - const std::string& file_content = "") { + const std::string& file_content) { if (inited) { std::cerr << "WARNING: deepmd-kit should not be initialized twice, do " "nothing at the second call of initializer" @@ -59,7 +59,7 @@ void DeepPotPT::init(const std::string& model, DeepPotPT::~DeepPotPT() {} template -void DeepPotPT::compute(std::vector& ener, +void DeepPotPT::compute(ENERGYTYPE& ener, std::vector& force, std::vector& virial, std::vector& atom_energy, @@ -186,7 +186,7 @@ template void DeepPotPT::compute>( const InputNlist& lmp_list, const int& ago); template -void DeepPotPT::compute(std::vector& ener, +void DeepPotPT::compute(ENERGYTYPE& ener, std::vector& force, std::vector& virial, std::vector& atom_energy, From af415f402c08e446898eb8bcf055d2a3e6792307 Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Fri, 26 Jan 2024 10:41:21 +0800 Subject: [PATCH 026/103] try direct = --- source/api_cc/src/DeepPotPT.cc | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 816571297a..a10c45b7c3 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -115,11 +115,11 @@ void DeepPotPT::compute(ENERGYTYPE& ener, c10::IValue virial_ = outputs.at("extended_virial"); c10::IValue atom_virial_ = outputs.at("atomic_virial"); c10::IValue atom_energy_ = outputs.at("atom_energy"); - - torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); - torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); - ener.assign(cpu_energy_.data_ptr(), - cpu_energy_.data_ptr() + cpu_energy_.numel()); + ener = energy_.toTensor().item(); + // torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); + // torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); + // ener.assign(cpu_energy_.data_ptr(), + // cpu_energy_.data_ptr() + cpu_energy_.numel()); torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); atom_energy.assign( @@ -223,10 +223,7 @@ void DeepPotPT::compute(ENERGYTYPE& ener, c10::IValue virial_ = outputs.at("virial"); c10::IValue atom_virial_ = outputs.at("atomic_virial"); c10::IValue atom_energy_ = outputs.at("atom_energy"); - torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); - torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); - ener.assign(cpu_energy_.data_ptr(), - cpu_energy_.data_ptr() + cpu_energy_.numel()); + ener = energy_.toTensor().item(); torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); atom_energy.assign( From 306f7d90c8920c89a292dba4c4a9403a2c3fc38f Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Fri, 26 Jan 2024 10:47:10 +0800 Subject: [PATCH 027/103] fix vtype and type bug --- source/api_cc/include/DeepPotPT.h | 4 ++-- source/api_cc/src/DeepPotPT.cc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/api_cc/include/DeepPotPT.h b/source/api_cc/include/DeepPotPT.h index 2935d5387b..2c71982545 100644 --- a/source/api_cc/include/DeepPotPT.h +++ b/source/api_cc/include/DeepPotPT.h @@ -62,7 +62,7 @@ class DeepPotPT : public DeepPotBase { *same aparam. **/ template - void compute(ENERGYTYPE& ener, + void compute(ENERGYVTYPE& ener, std::vector& force, std::vector& virial, std::vector& atom_energy, @@ -98,7 +98,7 @@ class DeepPotPT : public DeepPotBase { *same aparam. **/ template - void compute(ENERGYTYPE& ener, + void compute(ENERGYVTYPE& ener, std::vector& force, std::vector& virial, std::vector& atom_energy, diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index a10c45b7c3..3539c8160d 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -59,7 +59,7 @@ void DeepPotPT::init(const std::string& model, DeepPotPT::~DeepPotPT() {} template -void DeepPotPT::compute(ENERGYTYPE& ener, +void DeepPotPT::compute(ENERGYVTYPE& ener, std::vector& force, std::vector& virial, std::vector& atom_energy, @@ -186,7 +186,7 @@ template void DeepPotPT::compute>( const InputNlist& lmp_list, const int& ago); template -void DeepPotPT::compute(ENERGYTYPE& ener, +void DeepPotPT::compute(ENERGYVTYPE& ener, std::vector& force, std::vector& virial, std::vector& atom_energy, From 39a8de44b3c8896731066dba9d0cfd42a085f4b7 Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Fri, 26 Jan 2024 14:08:50 +0800 Subject: [PATCH 028/103] fix energy to vector --- source/api_cc/src/DeepPotPT.cc | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 3539c8160d..9cb5849437 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -115,11 +115,11 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, c10::IValue virial_ = outputs.at("extended_virial"); c10::IValue atom_virial_ = outputs.at("atomic_virial"); c10::IValue atom_energy_ = outputs.at("atom_energy"); - ener = energy_.toTensor().item(); - // torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); - // torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); - // ener.assign(cpu_energy_.data_ptr(), - // cpu_energy_.data_ptr() + cpu_energy_.numel()); + //ener = energy_.toTensor().item(); + torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); + torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); + ener.assign(cpu_energy_.data_ptr(), + cpu_energy_.data_ptr() + cpu_energy_.numel()); torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); atom_energy.assign( @@ -223,7 +223,11 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, c10::IValue virial_ = outputs.at("virial"); c10::IValue atom_virial_ = outputs.at("atomic_virial"); c10::IValue atom_energy_ = outputs.at("atom_energy"); - ener = energy_.toTensor().item(); + //ener = energy_.toTensor().item(); + torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); + torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); + ener.assign(cpu_energy_.data_ptr(), + cpu_energy_.data_ptr() + cpu_energy_.numel()); torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); atom_energy.assign( From c86c14e8d47b8d73c3d37247f18e8e9abf9dae8a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 06:09:16 +0000 Subject: [PATCH 029/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 9cb5849437..255a0d6dd1 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -115,7 +115,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, c10::IValue virial_ = outputs.at("extended_virial"); c10::IValue atom_virial_ = outputs.at("atomic_virial"); c10::IValue atom_energy_ = outputs.at("atom_energy"); - //ener = energy_.toTensor().item(); + // ener = energy_.toTensor().item(); torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); ener.assign(cpu_energy_.data_ptr(), @@ -223,7 +223,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, c10::IValue virial_ = outputs.at("virial"); c10::IValue atom_virial_ = outputs.at("atomic_virial"); c10::IValue atom_energy_ = outputs.at("atom_energy"); - //ener = energy_.toTensor().item(); + // ener = energy_.toTensor().item(); torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); ener.assign(cpu_energy_.data_ptr(), From a2e214433d123632a2367a818880af6a07058833 Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Fri, 26 Jan 2024 14:47:31 +0800 Subject: [PATCH 030/103] using namespace deepmd --- source/api_cc/src/commonPT.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index aaa19b64f2..dc2696f274 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include "commonPT.h" - +using namespace deepmd; void NeighborListData::copy_from_nlist(const InputNlist& inlist, int& max_num_neighbors, int nnei) { From e9b10787586d2622b55201ceaba1ebd98da9ec8a Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Fri, 26 Jan 2024 14:57:44 +0800 Subject: [PATCH 031/103] fix bug --- source/api_cc/src/commonPT.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index dc2696f274..eac31b03e9 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -1,7 +1,7 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include "commonPT.h" using namespace deepmd; -void NeighborListData::copy_from_nlist(const InputNlist& inlist, +void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, int& max_num_neighbors, int nnei) { int inum = inlist.inum; From 18c8cd34578cb3c155db152005b5a54f508b5d35 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 06:58:52 +0000 Subject: [PATCH 032/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/commonPT.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index eac31b03e9..c4e8315192 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -2,8 +2,8 @@ #include "commonPT.h" using namespace deepmd; void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, - int& max_num_neighbors, - int nnei) { + int& max_num_neighbors, + int nnei) { int inum = inlist.inum; ilist.resize(inum); numneigh.resize(inum); From 6b27552a03ac5d805a773c9da40a681e86ecd346 Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Fri, 26 Jan 2024 15:23:17 +0800 Subject: [PATCH 033/103] pass no backend test --- source/api_cc/src/DeepPot.cc | 4 ++++ source/api_cc/src/DeepPotPT.cc | 2 ++ 2 files changed, 6 insertions(+) diff --git a/source/api_cc/src/DeepPot.cc b/source/api_cc/src/DeepPot.cc index 4d023f927d..d985eb4951 100644 --- a/source/api_cc/src/DeepPot.cc +++ b/source/api_cc/src/DeepPot.cc @@ -47,7 +47,11 @@ void DeepPot::init(const std::string& model, #endif } else if (deepmd::DPBackend::PyTorch == backend) { // throw deepmd::deepmd_exception("PyTorch backend is not supported yet"); +#ifdef BUILD_PYTORCH dp = std::make_shared(model, gpu_rank, file_content); +#else + throw deepmd::deepmd_exception("PyTorch backend is not built"); +#endif } else if (deepmd::DPBackend::Paddle == backend) { throw deepmd::deepmd_exception("PaddlePaddle backend is not supported yet"); } else { diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 255a0d6dd1..8e093b7a3d 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -1,4 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-or-later +#ifdef BUILD_PYTORCH #include "DeepPotPT.h" #include "common.h" @@ -378,3 +379,4 @@ void DeepPotPT::computew_mixed_type(std::vector& ener, const std::vector& aparam) { throw deepmd::deepmd_exception("computew_mixed_type is not implemented"); } +#endif \ No newline at end of file From 0d494b46f335b37c6df2f96397e1726ac064b744 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 07:23:42 +0000 Subject: [PATCH 034/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 8e093b7a3d..3ddfc011ae 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -379,4 +379,4 @@ void DeepPotPT::computew_mixed_type(std::vector& ener, const std::vector& aparam) { throw deepmd::deepmd_exception("computew_mixed_type is not implemented"); } -#endif \ No newline at end of file +#endif From b1cc7545770470191c1fa765a2497d89ec58026f Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Fri, 26 Jan 2024 15:35:33 +0800 Subject: [PATCH 035/103] implement detect backend --- source/api_cc/src/DeepPot.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/source/api_cc/src/DeepPot.cc b/source/api_cc/src/DeepPot.cc index d985eb4951..d0430d39d0 100644 --- a/source/api_cc/src/DeepPot.cc +++ b/source/api_cc/src/DeepPot.cc @@ -37,8 +37,13 @@ void DeepPot::init(const std::string& model, << std::endl; return; } - // TODO: To implement detect_backend - DPBackend backend = deepmd::DPBackend::TensorFlow; + if (model.length() >= 4 && model.substr(model.length() - 4) == ".pth") { + DPBackend backend = deepmd::DPBackend::PyTorch; + } else if (model.length() >= 3 && model.substr(model.length() - 3) == ".pb") { + DPBackend backend = deepmd::DPBackend::TensorFlow; + else { + throw deepmd::deepmd_exception("Unsupported model file format"); + } if (deepmd::DPBackend::TensorFlow == backend) { #ifdef BUILD_TENSORFLOW dp = std::make_shared(model, gpu_rank, file_content); From cedcdc7b5364f06de606d9e182571ef1db81e60f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 07:36:06 +0000 Subject: [PATCH 036/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPot.cc | 1395 +++++++++++++++------------------- 1 file changed, 607 insertions(+), 788 deletions(-) diff --git a/source/api_cc/src/DeepPot.cc b/source/api_cc/src/DeepPot.cc index d0430d39d0..273344ffb6 100644 --- a/source/api_cc/src/DeepPot.cc +++ b/source/api_cc/src/DeepPot.cc @@ -38,850 +38,669 @@ void DeepPot::init(const std::string& model, return; } if (model.length() >= 4 && model.substr(model.length() - 4) == ".pth") { - DPBackend backend = deepmd::DPBackend::PyTorch; - } else if (model.length() >= 3 && model.substr(model.length() - 3) == ".pb") { - DPBackend backend = deepmd::DPBackend::TensorFlow; + DPBackend backend = deepmd::DPBackend::PyTorch; + } else if (model.length() >= 3 && model.substr(model.length() - 3) == ".pb") { + DPBackend backend = deepmd::DPBackend::TensorFlow; else { - throw deepmd::deepmd_exception("Unsupported model file format"); + throw deepmd::deepmd_exception("Unsupported model file format"); } - if (deepmd::DPBackend::TensorFlow == backend) { + if (deepmd::DPBackend::TensorFlow == backend) { #ifdef BUILD_TENSORFLOW - dp = std::make_shared(model, gpu_rank, file_content); + dp = std::make_shared(model, gpu_rank, file_content); #else - throw deepmd::deepmd_exception("TensorFlow backend is not built"); + throw deepmd::deepmd_exception("TensorFlow backend is not built"); #endif - } else if (deepmd::DPBackend::PyTorch == backend) { - // throw deepmd::deepmd_exception("PyTorch backend is not supported yet"); + } else if (deepmd::DPBackend::PyTorch == backend) { + // throw deepmd::deepmd_exception("PyTorch backend is not supported yet"); #ifdef BUILD_PYTORCH - dp = std::make_shared(model, gpu_rank, file_content); + dp = std::make_shared(model, gpu_rank, file_content); #else - throw deepmd::deepmd_exception("PyTorch backend is not built"); + throw deepmd::deepmd_exception("PyTorch backend is not built"); #endif - } else if (deepmd::DPBackend::Paddle == backend) { - throw deepmd::deepmd_exception("PaddlePaddle backend is not supported yet"); - } else { - throw deepmd::deepmd_exception("Unknown file type"); + } else if (deepmd::DPBackend::Paddle == backend) { + throw deepmd::deepmd_exception( + "PaddlePaddle backend is not supported yet"); + } else { + throw deepmd::deepmd_exception("Unknown file type"); + } + inited = true; } - inited = true; -} -void DeepPot::print_summary(const std::string& pre) const { - deepmd::print_summary(pre); -} + void DeepPot::print_summary(const std::string& pre) const { + deepmd::print_summary(pre); + } -template -void DeepPot::compute(ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam_, - const std::vector& aparam_) { - std::vector dener_; - std::vector datom_energy_, datom_virial_; - dp->computew(dener_, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, - datype_, dbox, fparam_, aparam_); - dener = dener_[0]; -} + template + void DeepPot::compute( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const std::vector& fparam_, + const std::vector& aparam_) { + std::vector dener_; + std::vector datom_energy_, datom_virial_; + dp->computew(dener_, dforce_, dvirial, datom_energy_, datom_virial_, + dcoord_, datype_, dbox, fparam_, aparam_); + dener = dener_[0]; + } -template -void DeepPot::compute(std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam_, - const std::vector& aparam_) { - std::vector datom_energy_, datom_virial_; - dp->computew(dener, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, - datype_, dbox, fparam_, aparam_); -} + template + void DeepPot::compute( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const std::vector& fparam_, + const std::vector& aparam_) { + std::vector datom_energy_, datom_virial_; + dp->computew(dener, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, + datype_, dbox, fparam_, aparam_); + } -template void DeepPot::compute(ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam); - -template void DeepPot::compute(ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam); - -template void DeepPot::compute(std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam); - -template void DeepPot::compute(std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam); - -template -void DeepPot::compute(ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam_, - const std::vector& aparam__) { - std::vector dener_; - std::vector datom_energy_, datom_virial_; - dp->computew(dener_, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, - datype_, dbox, nghost, lmp_list, ago, fparam_, aparam__); - dener = dener_[0]; -} + template void DeepPot::compute( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const std::vector& fparam, const std::vector& aparam); + + template void DeepPot::compute( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const std::vector& fparam, const std::vector& aparam); + + template void DeepPot::compute( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const std::vector& fparam, const std::vector& aparam); + + template void DeepPot::compute( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const std::vector& fparam, const std::vector& aparam); + + template + void DeepPot::compute( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const int nghost, const InputNlist& lmp_list, const int& ago, + const std::vector& fparam_, + const std::vector& aparam__) { + std::vector dener_; + std::vector datom_energy_, datom_virial_; + dp->computew(dener_, dforce_, dvirial, datom_energy_, datom_virial_, + dcoord_, datype_, dbox, nghost, lmp_list, ago, fparam_, + aparam__); + dener = dener_[0]; + } -template -void DeepPot::compute(std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam_, - const std::vector& aparam__) { - std::vector datom_energy_, datom_virial_; - dp->computew(dener, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, - datype_, dbox, nghost, lmp_list, ago, fparam_, aparam__); -} + template + void DeepPot::compute( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const int nghost, const InputNlist& lmp_list, const int& ago, + const std::vector& fparam_, + const std::vector& aparam__) { + std::vector datom_energy_, datom_virial_; + dp->computew(dener, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, + datype_, dbox, nghost, lmp_list, ago, fparam_, aparam__); + } -template void DeepPot::compute(ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam, - const std::vector& aparam_); - -template void DeepPot::compute(ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam, - const std::vector& aparam_); - -template void DeepPot::compute(std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam, - const std::vector& aparam_); - -template void DeepPot::compute(std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam, - const std::vector& aparam_); - -template -void DeepPot::compute(ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam_, - const std::vector& aparam_) { - std::vector dener_; - dp->computew(dener_, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, - datype_, dbox, fparam_, aparam_); - dener = dener_[0]; -} -template -void DeepPot::compute(std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam_, - const std::vector& aparam_) { - dp->computew(dener, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, - datype_, dbox, fparam_, aparam_); -} + template void DeepPot::compute( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const int nghost, const InputNlist& lmp_list, const int& ago, + const std::vector& fparam, const std::vector& aparam_); + + template void DeepPot::compute( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const int nghost, const InputNlist& lmp_list, const int& ago, + const std::vector& fparam, const std::vector& aparam_); + + template void DeepPot::compute( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const int nghost, const InputNlist& lmp_list, const int& ago, + const std::vector& fparam, const std::vector& aparam_); + + template void DeepPot::compute( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const int nghost, const InputNlist& lmp_list, const int& ago, + const std::vector& fparam, const std::vector& aparam_); + + template + void DeepPot::compute( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const std::vector& fparam_, + const std::vector& aparam_) { + std::vector dener_; + dp->computew(dener_, dforce_, dvirial, datom_energy_, datom_virial_, + dcoord_, datype_, dbox, fparam_, aparam_); + dener = dener_[0]; + } + template + void DeepPot::compute( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const std::vector& fparam_, + const std::vector& aparam_) { + dp->computew(dener, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, + datype_, dbox, fparam_, aparam_); + } -template void DeepPot::compute(ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam); - -template void DeepPot::compute(ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam); - -template void DeepPot::compute(std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam); - -template void DeepPot::compute(std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam); - -template -void DeepPot::compute(ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam_, - const std::vector& aparam__) { - std::vector dener_; - dp->computew(dener_, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, - datype_, dbox, nghost, lmp_list, ago, fparam_, aparam__); - dener = dener_[0]; -} -template -void DeepPot::compute(std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam_, - const std::vector& aparam__) { - dp->computew(dener, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, - datype_, dbox, nghost, lmp_list, ago, fparam_, aparam__); -} + template void DeepPot::compute( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const std::vector& fparam, const std::vector& aparam); + + template void DeepPot::compute( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const std::vector& fparam, const std::vector& aparam); + + template void DeepPot::compute( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const std::vector& fparam, const std::vector& aparam); + + template void DeepPot::compute( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const std::vector& fparam, const std::vector& aparam); + + template + void DeepPot::compute( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const int nghost, + const InputNlist& lmp_list, const int& ago, + const std::vector& fparam_, + const std::vector& aparam__) { + std::vector dener_; + dp->computew(dener_, dforce_, dvirial, datom_energy_, datom_virial_, + dcoord_, datype_, dbox, nghost, lmp_list, ago, fparam_, + aparam__); + dener = dener_[0]; + } + template + void DeepPot::compute( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const int nghost, + const InputNlist& lmp_list, const int& ago, + const std::vector& fparam_, + const std::vector& aparam__) { + dp->computew(dener, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, + datype_, dbox, nghost, lmp_list, ago, fparam_, aparam__); + } -template void DeepPot::compute(ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam, - const std::vector& aparam_); - -template void DeepPot::compute(ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam, - const std::vector& aparam_); - -template void DeepPot::compute(std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam, - const std::vector& aparam_); - -template void DeepPot::compute(std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam, - const std::vector& aparam_); - -// mixed type -template -void DeepPot::compute_mixed_type(ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - const int& nframes, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam_, - const std::vector& aparam_) { - std::vector dener_; - std::vector datom_energy_, datom_virial_; - dp->computew_mixed_type(dener_, dforce_, dvirial, datom_energy_, - datom_virial_, nframes, dcoord_, datype_, dbox, - fparam_, aparam_); - dener = dener_[0]; -} -template -void DeepPot::compute_mixed_type(std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - const int& nframes, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam_, - const std::vector& aparam_) { - std::vector datom_energy_, datom_virial_; - dp->computew_mixed_type(dener, dforce_, dvirial, datom_energy_, datom_virial_, - nframes, dcoord_, datype_, dbox, fparam_, aparam_); -} + template void DeepPot::compute( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const int nghost, const InputNlist& lmp_list, const int& ago, + const std::vector& fparam, const std::vector& aparam_); + + template void DeepPot::compute( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const int nghost, const InputNlist& lmp_list, const int& ago, + const std::vector& fparam, const std::vector& aparam_); + + template void DeepPot::compute( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const int nghost, const InputNlist& lmp_list, const int& ago, + const std::vector& fparam, const std::vector& aparam_); + + template void DeepPot::compute( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, const std::vector& dcoord_, + const std::vector& datype_, const std::vector& dbox, + const int nghost, const InputNlist& lmp_list, const int& ago, + const std::vector& fparam, const std::vector& aparam_); + + // mixed type + template + void DeepPot::compute_mixed_type( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, const int& nframes, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const std::vector& fparam_, + const std::vector& aparam_) { + std::vector dener_; + std::vector datom_energy_, datom_virial_; + dp->computew_mixed_type(dener_, dforce_, dvirial, datom_energy_, + datom_virial_, nframes, dcoord_, datype_, dbox, + fparam_, aparam_); + dener = dener_[0]; + } + template + void DeepPot::compute_mixed_type( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, const int& nframes, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const std::vector& fparam_, + const std::vector& aparam_) { + std::vector datom_energy_, datom_virial_; + dp->computew_mixed_type(dener, dforce_, dvirial, datom_energy_, + datom_virial_, nframes, dcoord_, datype_, dbox, + fparam_, aparam_); + } -template void DeepPot::compute_mixed_type( - ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - const int& nframes, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam); - -template void DeepPot::compute_mixed_type( - ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - const int& nframes, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam); - -template void DeepPot::compute_mixed_type( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - const int& nframes, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam); - -template void DeepPot::compute_mixed_type( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - const int& nframes, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam); - -template -void DeepPot::compute_mixed_type(ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const int& nframes, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam_, - const std::vector& aparam_) { - std::vector dener_; - dp->computew_mixed_type(dener_, dforce_, dvirial, datom_energy_, - datom_virial_, nframes, dcoord_, datype_, dbox, - fparam_, aparam_); - dener = dener_[0]; -} -template -void DeepPot::compute_mixed_type(std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const int& nframes, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam_, - const std::vector& aparam_) { - dp->computew_mixed_type(dener, dforce_, dvirial, datom_energy_, datom_virial_, - nframes, dcoord_, datype_, dbox, fparam_, aparam_); -} + template void DeepPot::compute_mixed_type( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, const int& nframes, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const std::vector& fparam, + const std::vector& aparam); + + template void DeepPot::compute_mixed_type( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, const int& nframes, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const std::vector& fparam, + const std::vector& aparam); + + template void DeepPot::compute_mixed_type( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, const int& nframes, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const std::vector& fparam, + const std::vector& aparam); + + template void DeepPot::compute_mixed_type( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, const int& nframes, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const std::vector& fparam, + const std::vector& aparam); + + template + void DeepPot::compute_mixed_type( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, const int& nframes, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const std::vector& fparam_, + const std::vector& aparam_) { + std::vector dener_; + dp->computew_mixed_type(dener_, dforce_, dvirial, datom_energy_, + datom_virial_, nframes, dcoord_, datype_, dbox, + fparam_, aparam_); + dener = dener_[0]; + } + template + void DeepPot::compute_mixed_type( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, const int& nframes, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const std::vector& fparam_, + const std::vector& aparam_) { + dp->computew_mixed_type(dener, dforce_, dvirial, datom_energy_, + datom_virial_, nframes, dcoord_, datype_, dbox, + fparam_, aparam_); + } -template void DeepPot::compute_mixed_type( - ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const int& nframes, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam); - -template void DeepPot::compute_mixed_type( - ENERGYTYPE& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const int& nframes, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam); - -template void DeepPot::compute_mixed_type( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const int& nframes, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam); - -template void DeepPot::compute_mixed_type( - std::vector& dener, - std::vector& dforce_, - std::vector& dvirial, - std::vector& datom_energy_, - std::vector& datom_virial_, - const int& nframes, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const std::vector& fparam, - const std::vector& aparam); - -double DeepPot::cutoff() const { return dp->cutoff(); } - -int DeepPot::numb_types() const { return dp->numb_types(); } - -int DeepPot::numb_types_spin() const { return dp->numb_types_spin(); } - -int DeepPot::dim_fparam() const { return dp->dim_fparam(); } - -int DeepPot::dim_aparam() const { return dp->dim_aparam(); } - -void DeepPot::get_type_map(std::string& type_map) { - dp->get_type_map(type_map); -} + template void DeepPot::compute_mixed_type( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, const int& nframes, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const std::vector& fparam, + const std::vector& aparam); + + template void DeepPot::compute_mixed_type( + ENERGYTYPE & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, const int& nframes, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const std::vector& fparam, + const std::vector& aparam); + + template void DeepPot::compute_mixed_type( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, const int& nframes, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const std::vector& fparam, + const std::vector& aparam); + + template void DeepPot::compute_mixed_type( + std::vector & dener, std::vector & dforce_, + std::vector & dvirial, std::vector & datom_energy_, + std::vector & datom_virial_, const int& nframes, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const std::vector& fparam, + const std::vector& aparam); + + double DeepPot::cutoff() const { return dp->cutoff(); } + + int DeepPot::numb_types() const { return dp->numb_types(); } + + int DeepPot::numb_types_spin() const { return dp->numb_types_spin(); } + + int DeepPot::dim_fparam() const { return dp->dim_fparam(); } + + int DeepPot::dim_aparam() const { return dp->dim_aparam(); } + + void DeepPot::get_type_map(std::string & type_map) { + dp->get_type_map(type_map); + } -bool DeepPot::is_aparam_nall() const { return dp->is_aparam_nall(); } + bool DeepPot::is_aparam_nall() const { return dp->is_aparam_nall(); } -DeepPotModelDevi::DeepPotModelDevi() : inited(false), numb_models(0) {} + DeepPotModelDevi::DeepPotModelDevi() : inited(false), numb_models(0) {} -DeepPotModelDevi::DeepPotModelDevi( - const std::vector& models, - const int& gpu_rank, - const std::vector& file_contents) - : inited(false), numb_models(0) { - init(models, gpu_rank, file_contents); -} + DeepPotModelDevi::DeepPotModelDevi( + const std::vector& models, const int& gpu_rank, + const std::vector& file_contents) + : inited(false), numb_models(0) { + init(models, gpu_rank, file_contents); + } -DeepPotModelDevi::~DeepPotModelDevi() {} + DeepPotModelDevi::~DeepPotModelDevi() {} -void DeepPotModelDevi::init(const std::vector& models, - const int& gpu_rank, - const std::vector& file_contents) { - if (inited) { - std::cerr << "WARNING: deepmd-kit should not be initialized twice, do " - "nothing at the second call of initializer" - << std::endl; - return; - } - numb_models = models.size(); - if (numb_models == 0) { - throw deepmd::deepmd_exception("no model is specified"); - } - dps.resize(numb_models); - for (unsigned int ii = 0; ii < numb_models; ++ii) { - dps[ii].init(models[ii], gpu_rank, - file_contents.size() > ii ? file_contents[ii] : ""); + void DeepPotModelDevi::init(const std::vector& models, + const int& gpu_rank, + const std::vector& file_contents) { + if (inited) { + std::cerr << "WARNING: deepmd-kit should not be initialized twice, do " + "nothing at the second call of initializer" + << std::endl; + return; + } + numb_models = models.size(); + if (numb_models == 0) { + throw deepmd::deepmd_exception("no model is specified"); + } + dps.resize(numb_models); + for (unsigned int ii = 0; ii < numb_models; ++ii) { + dps[ii].init(models[ii], gpu_rank, + file_contents.size() > ii ? file_contents[ii] : ""); + } + inited = true; } - inited = true; -} -template -void DeepPotModelDevi::compute(std::vector& all_energy, - std::vector>& all_force, - std::vector>& all_virial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam, - const std::vector& aparam_) { - if (numb_models == 0) { - return; - } - all_energy.resize(numb_models); - all_force.resize(numb_models); - all_virial.resize(numb_models); - for (unsigned ii = 0; ii < numb_models; ++ii) { - dps[ii].compute(all_energy[ii], all_force[ii], all_virial[ii], dcoord_, - datype_, dbox, nghost, lmp_list, ago, fparam, aparam_); + template + void DeepPotModelDevi::compute( + std::vector & all_energy, + std::vector> & all_force, + std::vector> & all_virial, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const int nghost, + const InputNlist& lmp_list, const int& ago, + const std::vector& fparam, + const std::vector& aparam_) { + if (numb_models == 0) { + return; + } + all_energy.resize(numb_models); + all_force.resize(numb_models); + all_virial.resize(numb_models); + for (unsigned ii = 0; ii < numb_models; ++ii) { + dps[ii].compute(all_energy[ii], all_force[ii], all_virial[ii], dcoord_, + datype_, dbox, nghost, lmp_list, ago, fparam, aparam_); + } } -} -template void DeepPotModelDevi::compute( - std::vector& all_energy, - std::vector>& all_force, - std::vector>& all_virial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam, - const std::vector& aparam); - -template void DeepPotModelDevi::compute( - std::vector& all_energy, - std::vector>& all_force, - std::vector>& all_virial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam, - const std::vector& aparam); - -template -void DeepPotModelDevi::compute( - std::vector& all_energy, - std::vector>& all_force, - std::vector>& all_virial, - std::vector>& all_atom_energy, - std::vector>& all_atom_virial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam, - const std::vector& aparam_) { - if (numb_models == 0) { - return; - } - all_energy.resize(numb_models); - all_force.resize(numb_models); - all_virial.resize(numb_models); - all_atom_energy.resize(numb_models); - all_atom_virial.resize(numb_models); - for (unsigned ii = 0; ii < numb_models; ++ii) { - dps[ii].compute(all_energy[ii], all_force[ii], all_virial[ii], - all_atom_energy[ii], all_atom_virial[ii], dcoord_, datype_, - dbox, nghost, lmp_list, ago, fparam, aparam_); + template void DeepPotModelDevi::compute( + std::vector & all_energy, + std::vector> & all_force, + std::vector> & all_virial, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const int nghost, + const InputNlist& lmp_list, const int& ago, + const std::vector& fparam, const std::vector& aparam); + + template void DeepPotModelDevi::compute( + std::vector & all_energy, + std::vector> & all_force, + std::vector> & all_virial, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const int nghost, + const InputNlist& lmp_list, const int& ago, + const std::vector& fparam, const std::vector& aparam); + + template + void DeepPotModelDevi::compute( + std::vector & all_energy, + std::vector> & all_force, + std::vector> & all_virial, + std::vector> & all_atom_energy, + std::vector> & all_atom_virial, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const int nghost, + const InputNlist& lmp_list, const int& ago, + const std::vector& fparam, + const std::vector& aparam_) { + if (numb_models == 0) { + return; + } + all_energy.resize(numb_models); + all_force.resize(numb_models); + all_virial.resize(numb_models); + all_atom_energy.resize(numb_models); + all_atom_virial.resize(numb_models); + for (unsigned ii = 0; ii < numb_models; ++ii) { + dps[ii].compute(all_energy[ii], all_force[ii], all_virial[ii], + all_atom_energy[ii], all_atom_virial[ii], dcoord_, + datype_, dbox, nghost, lmp_list, ago, fparam, aparam_); + } } -} -template void DeepPotModelDevi::compute( - std::vector& all_energy, - std::vector>& all_force, - std::vector>& all_virial, - std::vector>& all_atom_energy, - std::vector>& all_atom_virial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam, - const std::vector& aparam); - -template void DeepPotModelDevi::compute( - std::vector& all_energy, - std::vector>& all_force, - std::vector>& all_virial, - std::vector>& all_atom_energy, - std::vector>& all_atom_virial, - const std::vector& dcoord_, - const std::vector& datype_, - const std::vector& dbox, - const int nghost, - const InputNlist& lmp_list, - const int& ago, - const std::vector& fparam, - const std::vector& aparam); - -template -void DeepPotModelDevi::compute_avg(VALUETYPE& dener, - const std::vector& all_energy) { - assert(all_energy.size() == numb_models); - if (numb_models == 0) { - return; - } + template void DeepPotModelDevi::compute( + std::vector & all_energy, + std::vector> & all_force, + std::vector> & all_virial, + std::vector> & all_atom_energy, + std::vector> & all_atom_virial, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const int nghost, + const InputNlist& lmp_list, const int& ago, + const std::vector& fparam, const std::vector& aparam); + + template void DeepPotModelDevi::compute( + std::vector & all_energy, + std::vector> & all_force, + std::vector> & all_virial, + std::vector> & all_atom_energy, + std::vector> & all_atom_virial, + const std::vector& dcoord_, const std::vector& datype_, + const std::vector& dbox, const int nghost, + const InputNlist& lmp_list, const int& ago, + const std::vector& fparam, const std::vector& aparam); + + template + void DeepPotModelDevi::compute_avg(VALUETYPE & dener, + const std::vector& all_energy) { + assert(all_energy.size() == numb_models); + if (numb_models == 0) { + return; + } - dener = 0; - for (unsigned ii = 0; ii < numb_models; ++ii) { - dener += all_energy[ii]; + dener = 0; + for (unsigned ii = 0; ii < numb_models; ++ii) { + dener += all_energy[ii]; + } + dener /= (VALUETYPE)(numb_models); } - dener /= (VALUETYPE)(numb_models); -} -template void DeepPotModelDevi::compute_avg( - double& dener, const std::vector& all_energy); + template void DeepPotModelDevi::compute_avg( + double& dener, const std::vector& all_energy); -template void DeepPotModelDevi::compute_avg( - float& dener, const std::vector& all_energy); + template void DeepPotModelDevi::compute_avg( + float& dener, const std::vector& all_energy); -template -void DeepPotModelDevi::compute_avg( - std::vector& avg, - const std::vector>& xx) { - assert(xx.size() == numb_models); - if (numb_models == 0) { - return; - } + template + void DeepPotModelDevi::compute_avg( + std::vector & avg, + const std::vector>& xx) { + assert(xx.size() == numb_models); + if (numb_models == 0) { + return; + } - avg.resize(xx[0].size()); - fill(avg.begin(), avg.end(), VALUETYPE(0.)); + avg.resize(xx[0].size()); + fill(avg.begin(), avg.end(), VALUETYPE(0.)); + + for (unsigned ii = 0; ii < numb_models; ++ii) { + for (unsigned jj = 0; jj < avg.size(); ++jj) { + avg[jj] += xx[ii][jj]; + } + } - for (unsigned ii = 0; ii < numb_models; ++ii) { for (unsigned jj = 0; jj < avg.size(); ++jj) { - avg[jj] += xx[ii][jj]; + avg[jj] /= VALUETYPE(numb_models); } } - for (unsigned jj = 0; jj < avg.size(); ++jj) { - avg[jj] /= VALUETYPE(numb_models); + template void DeepPotModelDevi::compute_avg( + std::vector & avg, const std::vector>& xx); + + template void DeepPotModelDevi::compute_avg( + std::vector & avg, const std::vector>& xx); + + template + void DeepPotModelDevi::compute_std( + std::vector & std, const std::vector& avg, + const std::vector>& xx, const int& stride) { + assert(xx.size() == numb_models); + if (numb_models == 0) { + return; + } + + unsigned ndof = avg.size(); + unsigned nloc = ndof / stride; + assert(nloc * stride == ndof); + + std.resize(nloc); + fill(std.begin(), std.end(), VALUETYPE(0.)); + + for (unsigned ii = 0; ii < numb_models; ++ii) { + for (unsigned jj = 0; jj < nloc; ++jj) { + const VALUETYPE* tmp_f = &(xx[ii][static_cast(jj) * stride]); + const VALUETYPE* tmp_avg = &(avg[static_cast(jj) * stride]); + for (unsigned dd = 0; dd < stride; ++dd) { + VALUETYPE vdiff = tmp_f[dd] - tmp_avg[dd]; + std[jj] += vdiff * vdiff; + } + } + } + + for (unsigned jj = 0; jj < nloc; ++jj) { + std[jj] = sqrt(std[jj] / VALUETYPE(numb_models)); + } } -} -template void DeepPotModelDevi::compute_avg( - std::vector& avg, const std::vector>& xx); + template void DeepPotModelDevi::compute_std( + std::vector & std, const std::vector& avg, + const std::vector>& xx, const int& stride); -template void DeepPotModelDevi::compute_avg( - std::vector& avg, const std::vector>& xx); + template void DeepPotModelDevi::compute_std( + std::vector & std, const std::vector& avg, + const std::vector>& xx, const int& stride); -template -void DeepPotModelDevi::compute_std( - std::vector& std, - const std::vector& avg, - const std::vector>& xx, - const int& stride) { - assert(xx.size() == numb_models); - if (numb_models == 0) { - return; + template + void DeepPotModelDevi::compute_std_e( + std::vector & std, const std::vector& avg, + const std::vector>& xx) { + compute_std(std, avg, xx, 1); } - unsigned ndof = avg.size(); - unsigned nloc = ndof / stride; - assert(nloc * stride == ndof); + template void DeepPotModelDevi::compute_std_e( + std::vector & std, const std::vector& avg, + const std::vector>& xx); - std.resize(nloc); - fill(std.begin(), std.end(), VALUETYPE(0.)); + template void DeepPotModelDevi::compute_std_e( + std::vector & std, const std::vector& avg, + const std::vector>& xx); - for (unsigned ii = 0; ii < numb_models; ++ii) { - for (unsigned jj = 0; jj < nloc; ++jj) { - const VALUETYPE* tmp_f = &(xx[ii][static_cast(jj) * stride]); - const VALUETYPE* tmp_avg = &(avg[static_cast(jj) * stride]); + template + void DeepPotModelDevi::compute_std_f( + std::vector & std, const std::vector& avg, + const std::vector>& xx) { + compute_std(std, avg, xx, 3); + } + + template void DeepPotModelDevi::compute_std_f( + std::vector & std, const std::vector& avg, + const std::vector>& xx); + + template void DeepPotModelDevi::compute_std_f( + std::vector & std, const std::vector& avg, + const std::vector>& xx); + + template + void DeepPotModelDevi::compute_relative_std( + std::vector & std, const std::vector& avg, + const VALUETYPE eps, const int& stride) { + unsigned ndof = avg.size(); + unsigned nloc = std.size(); + assert(nloc * stride == ndof); + + for (unsigned ii = 0; ii < nloc; ++ii) { + const VALUETYPE* tmp_avg = &(avg[static_cast(ii) * stride]); + VALUETYPE f_norm = 0.0; for (unsigned dd = 0; dd < stride; ++dd) { - VALUETYPE vdiff = tmp_f[dd] - tmp_avg[dd]; - std[jj] += vdiff * vdiff; + f_norm += tmp_avg[dd] * tmp_avg[dd]; } + f_norm = sqrt(f_norm); + std[ii] /= f_norm + eps; } } - for (unsigned jj = 0; jj < nloc; ++jj) { - std[jj] = sqrt(std[jj] / VALUETYPE(numb_models)); - } -} - -template void DeepPotModelDevi::compute_std( - std::vector& std, - const std::vector& avg, - const std::vector>& xx, - const int& stride); - -template void DeepPotModelDevi::compute_std( - std::vector& std, - const std::vector& avg, - const std::vector>& xx, - const int& stride); - -template -void DeepPotModelDevi::compute_std_e( - std::vector& std, - const std::vector& avg, - const std::vector>& xx) { - compute_std(std, avg, xx, 1); -} + template void DeepPotModelDevi::compute_relative_std( + std::vector & std, const std::vector& avg, + const double eps, const int& stride); -template void DeepPotModelDevi::compute_std_e( - std::vector& std, - const std::vector& avg, - const std::vector>& xx); - -template void DeepPotModelDevi::compute_std_e( - std::vector& std, - const std::vector& avg, - const std::vector>& xx); - -template -void DeepPotModelDevi::compute_std_f( - std::vector& std, - const std::vector& avg, - const std::vector>& xx) { - compute_std(std, avg, xx, 3); -} + template void DeepPotModelDevi::compute_relative_std( + std::vector & std, const std::vector& avg, const float eps, + const int& stride); -template void DeepPotModelDevi::compute_std_f( - std::vector& std, - const std::vector& avg, - const std::vector>& xx); - -template void DeepPotModelDevi::compute_std_f( - std::vector& std, - const std::vector& avg, - const std::vector>& xx); - -template -void DeepPotModelDevi::compute_relative_std(std::vector& std, - const std::vector& avg, - const VALUETYPE eps, - const int& stride) { - unsigned ndof = avg.size(); - unsigned nloc = std.size(); - assert(nloc * stride == ndof); - - for (unsigned ii = 0; ii < nloc; ++ii) { - const VALUETYPE* tmp_avg = &(avg[static_cast(ii) * stride]); - VALUETYPE f_norm = 0.0; - for (unsigned dd = 0; dd < stride; ++dd) { - f_norm += tmp_avg[dd] * tmp_avg[dd]; - } - f_norm = sqrt(f_norm); - std[ii] /= f_norm + eps; + template + void DeepPotModelDevi::compute_relative_std_f( + std::vector & std, const std::vector& avg, + const VALUETYPE eps) { + compute_relative_std(std, avg, eps, 3); } -} - -template void DeepPotModelDevi::compute_relative_std( - std::vector& std, - const std::vector& avg, - const double eps, - const int& stride); - -template void DeepPotModelDevi::compute_relative_std( - std::vector& std, - const std::vector& avg, - const float eps, - const int& stride); - -template -void DeepPotModelDevi::compute_relative_std_f(std::vector& std, - const std::vector& avg, - const VALUETYPE eps) { - compute_relative_std(std, avg, eps, 3); -} -template void DeepPotModelDevi::compute_relative_std_f( - std::vector& std, const std::vector& avg, const double eps); + template void DeepPotModelDevi::compute_relative_std_f( + std::vector & std, const std::vector& avg, + const double eps); -template void DeepPotModelDevi::compute_relative_std_f( - std::vector& std, const std::vector& avg, const float eps); + template void DeepPotModelDevi::compute_relative_std_f( + std::vector & std, const std::vector& avg, const float eps); From d157a4fcf614c46ab254618e32f1838d86d9fb5d Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Fri, 26 Jan 2024 12:56:43 -0500 Subject: [PATCH 037/103] fix compilation error --- source/api_cc/src/DeepPot.cc | 5 +++-- source/api_cc/src/commonPT.cc | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/source/api_cc/src/DeepPot.cc b/source/api_cc/src/DeepPot.cc index 273344ffb6..f025f6edc6 100644 --- a/source/api_cc/src/DeepPot.cc +++ b/source/api_cc/src/DeepPot.cc @@ -37,10 +37,11 @@ void DeepPot::init(const std::string& model, << std::endl; return; } + DPBackend backend; if (model.length() >= 4 && model.substr(model.length() - 4) == ".pth") { - DPBackend backend = deepmd::DPBackend::PyTorch; + backend = deepmd::DPBackend::PyTorch; } else if (model.length() >= 3 && model.substr(model.length() - 3) == ".pb") { - DPBackend backend = deepmd::DPBackend::TensorFlow; + backend = deepmd::DPBackend::TensorFlow; else { throw deepmd::deepmd_exception("Unsupported model file format"); } diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index c4e8315192..528ac22c46 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -1,4 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-or-later +#ifdef BUILD_PYTORCH #include "commonPT.h" using namespace deepmd; void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, @@ -22,3 +23,4 @@ void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, jnum * sizeof(int)); } } +#endif From 522b7c89c7ad9077145afe59c80feeb9e9783139 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Fri, 26 Jan 2024 13:01:10 -0500 Subject: [PATCH 038/103] a backet is missing... --- source/api_cc/src/DeepPot.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/source/api_cc/src/DeepPot.cc b/source/api_cc/src/DeepPot.cc index f025f6edc6..efe78417d3 100644 --- a/source/api_cc/src/DeepPot.cc +++ b/source/api_cc/src/DeepPot.cc @@ -42,6 +42,7 @@ void DeepPot::init(const std::string& model, backend = deepmd::DPBackend::PyTorch; } else if (model.length() >= 3 && model.substr(model.length() - 3) == ".pb") { backend = deepmd::DPBackend::TensorFlow; + } else { throw deepmd::deepmd_exception("Unsupported model file format"); } From f75dab6c71c11a603b4d6da1df1de1fdf2a788d5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 18:01:32 +0000 Subject: [PATCH 039/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPot.cc | 1392 +++++++++++++++++++--------------- 1 file changed, 786 insertions(+), 606 deletions(-) diff --git a/source/api_cc/src/DeepPot.cc b/source/api_cc/src/DeepPot.cc index efe78417d3..e7e89b5cd5 100644 --- a/source/api_cc/src/DeepPot.cc +++ b/source/api_cc/src/DeepPot.cc @@ -42,667 +42,847 @@ void DeepPot::init(const std::string& model, backend = deepmd::DPBackend::PyTorch; } else if (model.length() >= 3 && model.substr(model.length() - 3) == ".pb") { backend = deepmd::DPBackend::TensorFlow; + } else { + throw deepmd::deepmd_exception("Unsupported model file format"); } - else { - throw deepmd::deepmd_exception("Unsupported model file format"); - } - if (deepmd::DPBackend::TensorFlow == backend) { + if (deepmd::DPBackend::TensorFlow == backend) { #ifdef BUILD_TENSORFLOW - dp = std::make_shared(model, gpu_rank, file_content); + dp = std::make_shared(model, gpu_rank, file_content); #else - throw deepmd::deepmd_exception("TensorFlow backend is not built"); + throw deepmd::deepmd_exception("TensorFlow backend is not built"); #endif - } else if (deepmd::DPBackend::PyTorch == backend) { - // throw deepmd::deepmd_exception("PyTorch backend is not supported yet"); + } else if (deepmd::DPBackend::PyTorch == backend) { + // throw deepmd::deepmd_exception("PyTorch backend is not supported yet"); #ifdef BUILD_PYTORCH - dp = std::make_shared(model, gpu_rank, file_content); + dp = std::make_shared(model, gpu_rank, file_content); #else - throw deepmd::deepmd_exception("PyTorch backend is not built"); + throw deepmd::deepmd_exception("PyTorch backend is not built"); #endif - } else if (deepmd::DPBackend::Paddle == backend) { - throw deepmd::deepmd_exception( - "PaddlePaddle backend is not supported yet"); - } else { - throw deepmd::deepmd_exception("Unknown file type"); - } - inited = true; + } else if (deepmd::DPBackend::Paddle == backend) { + throw deepmd::deepmd_exception("PaddlePaddle backend is not supported yet"); + } else { + throw deepmd::deepmd_exception("Unknown file type"); } + inited = true; +} - void DeepPot::print_summary(const std::string& pre) const { - deepmd::print_summary(pre); - } +void DeepPot::print_summary(const std::string& pre) const { + deepmd::print_summary(pre); +} - template - void DeepPot::compute( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const std::vector& fparam_, - const std::vector& aparam_) { - std::vector dener_; - std::vector datom_energy_, datom_virial_; - dp->computew(dener_, dforce_, dvirial, datom_energy_, datom_virial_, - dcoord_, datype_, dbox, fparam_, aparam_); - dener = dener_[0]; - } +template +void DeepPot::compute(ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam_, + const std::vector& aparam_) { + std::vector dener_; + std::vector datom_energy_, datom_virial_; + dp->computew(dener_, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, + datype_, dbox, fparam_, aparam_); + dener = dener_[0]; +} - template - void DeepPot::compute( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const std::vector& fparam_, - const std::vector& aparam_) { - std::vector datom_energy_, datom_virial_; - dp->computew(dener, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, - datype_, dbox, fparam_, aparam_); - } +template +void DeepPot::compute(std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam_, + const std::vector& aparam_) { + std::vector datom_energy_, datom_virial_; + dp->computew(dener, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, + datype_, dbox, fparam_, aparam_); +} - template void DeepPot::compute( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const std::vector& fparam, const std::vector& aparam); - - template void DeepPot::compute( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const std::vector& fparam, const std::vector& aparam); - - template void DeepPot::compute( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const std::vector& fparam, const std::vector& aparam); - - template void DeepPot::compute( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const std::vector& fparam, const std::vector& aparam); - - template - void DeepPot::compute( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const int nghost, const InputNlist& lmp_list, const int& ago, - const std::vector& fparam_, - const std::vector& aparam__) { - std::vector dener_; - std::vector datom_energy_, datom_virial_; - dp->computew(dener_, dforce_, dvirial, datom_energy_, datom_virial_, - dcoord_, datype_, dbox, nghost, lmp_list, ago, fparam_, - aparam__); - dener = dener_[0]; - } +template void DeepPot::compute(ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam, + const std::vector& aparam); + +template void DeepPot::compute(ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam, + const std::vector& aparam); + +template void DeepPot::compute(std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam, + const std::vector& aparam); + +template void DeepPot::compute(std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam, + const std::vector& aparam); + +template +void DeepPot::compute(ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam_, + const std::vector& aparam__) { + std::vector dener_; + std::vector datom_energy_, datom_virial_; + dp->computew(dener_, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, + datype_, dbox, nghost, lmp_list, ago, fparam_, aparam__); + dener = dener_[0]; +} - template - void DeepPot::compute( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const int nghost, const InputNlist& lmp_list, const int& ago, - const std::vector& fparam_, - const std::vector& aparam__) { - std::vector datom_energy_, datom_virial_; - dp->computew(dener, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, - datype_, dbox, nghost, lmp_list, ago, fparam_, aparam__); - } +template +void DeepPot::compute(std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam_, + const std::vector& aparam__) { + std::vector datom_energy_, datom_virial_; + dp->computew(dener, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, + datype_, dbox, nghost, lmp_list, ago, fparam_, aparam__); +} - template void DeepPot::compute( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const int nghost, const InputNlist& lmp_list, const int& ago, - const std::vector& fparam, const std::vector& aparam_); - - template void DeepPot::compute( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const int nghost, const InputNlist& lmp_list, const int& ago, - const std::vector& fparam, const std::vector& aparam_); - - template void DeepPot::compute( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const int nghost, const InputNlist& lmp_list, const int& ago, - const std::vector& fparam, const std::vector& aparam_); - - template void DeepPot::compute( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const int nghost, const InputNlist& lmp_list, const int& ago, - const std::vector& fparam, const std::vector& aparam_); - - template - void DeepPot::compute( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const std::vector& fparam_, - const std::vector& aparam_) { - std::vector dener_; - dp->computew(dener_, dforce_, dvirial, datom_energy_, datom_virial_, - dcoord_, datype_, dbox, fparam_, aparam_); - dener = dener_[0]; - } - template - void DeepPot::compute( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const std::vector& fparam_, - const std::vector& aparam_) { - dp->computew(dener, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, - datype_, dbox, fparam_, aparam_); - } +template void DeepPot::compute(ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam_); + +template void DeepPot::compute(ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam_); + +template void DeepPot::compute(std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam_); + +template void DeepPot::compute(std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam_); + +template +void DeepPot::compute(ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam_, + const std::vector& aparam_) { + std::vector dener_; + dp->computew(dener_, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, + datype_, dbox, fparam_, aparam_); + dener = dener_[0]; +} +template +void DeepPot::compute(std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam_, + const std::vector& aparam_) { + dp->computew(dener, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, + datype_, dbox, fparam_, aparam_); +} - template void DeepPot::compute( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const std::vector& fparam, const std::vector& aparam); - - template void DeepPot::compute( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const std::vector& fparam, const std::vector& aparam); - - template void DeepPot::compute( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const std::vector& fparam, const std::vector& aparam); - - template void DeepPot::compute( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const std::vector& fparam, const std::vector& aparam); - - template - void DeepPot::compute( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const int nghost, - const InputNlist& lmp_list, const int& ago, - const std::vector& fparam_, - const std::vector& aparam__) { - std::vector dener_; - dp->computew(dener_, dforce_, dvirial, datom_energy_, datom_virial_, - dcoord_, datype_, dbox, nghost, lmp_list, ago, fparam_, - aparam__); - dener = dener_[0]; - } - template - void DeepPot::compute( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const int nghost, - const InputNlist& lmp_list, const int& ago, - const std::vector& fparam_, - const std::vector& aparam__) { - dp->computew(dener, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, - datype_, dbox, nghost, lmp_list, ago, fparam_, aparam__); - } +template void DeepPot::compute(ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam, + const std::vector& aparam); + +template void DeepPot::compute(ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam, + const std::vector& aparam); + +template void DeepPot::compute(std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam, + const std::vector& aparam); + +template void DeepPot::compute(std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam, + const std::vector& aparam); + +template +void DeepPot::compute(ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam_, + const std::vector& aparam__) { + std::vector dener_; + dp->computew(dener_, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, + datype_, dbox, nghost, lmp_list, ago, fparam_, aparam__); + dener = dener_[0]; +} +template +void DeepPot::compute(std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam_, + const std::vector& aparam__) { + dp->computew(dener, dforce_, dvirial, datom_energy_, datom_virial_, dcoord_, + datype_, dbox, nghost, lmp_list, ago, fparam_, aparam__); +} - template void DeepPot::compute( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const int nghost, const InputNlist& lmp_list, const int& ago, - const std::vector& fparam, const std::vector& aparam_); - - template void DeepPot::compute( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const int nghost, const InputNlist& lmp_list, const int& ago, - const std::vector& fparam, const std::vector& aparam_); - - template void DeepPot::compute( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const int nghost, const InputNlist& lmp_list, const int& ago, - const std::vector& fparam, const std::vector& aparam_); - - template void DeepPot::compute( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, const std::vector& dcoord_, - const std::vector& datype_, const std::vector& dbox, - const int nghost, const InputNlist& lmp_list, const int& ago, - const std::vector& fparam, const std::vector& aparam_); - - // mixed type - template - void DeepPot::compute_mixed_type( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, const int& nframes, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const std::vector& fparam_, - const std::vector& aparam_) { - std::vector dener_; - std::vector datom_energy_, datom_virial_; - dp->computew_mixed_type(dener_, dforce_, dvirial, datom_energy_, - datom_virial_, nframes, dcoord_, datype_, dbox, - fparam_, aparam_); - dener = dener_[0]; - } - template - void DeepPot::compute_mixed_type( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, const int& nframes, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const std::vector& fparam_, - const std::vector& aparam_) { - std::vector datom_energy_, datom_virial_; - dp->computew_mixed_type(dener, dforce_, dvirial, datom_energy_, - datom_virial_, nframes, dcoord_, datype_, dbox, - fparam_, aparam_); - } +template void DeepPot::compute(ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam_); + +template void DeepPot::compute(ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam_); + +template void DeepPot::compute(std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam_); + +template void DeepPot::compute(std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam_); + +// mixed type +template +void DeepPot::compute_mixed_type(ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + const int& nframes, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam_, + const std::vector& aparam_) { + std::vector dener_; + std::vector datom_energy_, datom_virial_; + dp->computew_mixed_type(dener_, dforce_, dvirial, datom_energy_, + datom_virial_, nframes, dcoord_, datype_, dbox, + fparam_, aparam_); + dener = dener_[0]; +} +template +void DeepPot::compute_mixed_type(std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + const int& nframes, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam_, + const std::vector& aparam_) { + std::vector datom_energy_, datom_virial_; + dp->computew_mixed_type(dener, dforce_, dvirial, datom_energy_, datom_virial_, + nframes, dcoord_, datype_, dbox, fparam_, aparam_); +} - template void DeepPot::compute_mixed_type( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, const int& nframes, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const std::vector& fparam, - const std::vector& aparam); - - template void DeepPot::compute_mixed_type( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, const int& nframes, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const std::vector& fparam, - const std::vector& aparam); - - template void DeepPot::compute_mixed_type( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, const int& nframes, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const std::vector& fparam, - const std::vector& aparam); - - template void DeepPot::compute_mixed_type( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, const int& nframes, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const std::vector& fparam, - const std::vector& aparam); - - template - void DeepPot::compute_mixed_type( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, const int& nframes, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const std::vector& fparam_, - const std::vector& aparam_) { - std::vector dener_; - dp->computew_mixed_type(dener_, dforce_, dvirial, datom_energy_, - datom_virial_, nframes, dcoord_, datype_, dbox, - fparam_, aparam_); - dener = dener_[0]; - } - template - void DeepPot::compute_mixed_type( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, const int& nframes, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const std::vector& fparam_, - const std::vector& aparam_) { - dp->computew_mixed_type(dener, dforce_, dvirial, datom_energy_, - datom_virial_, nframes, dcoord_, datype_, dbox, - fparam_, aparam_); - } +template void DeepPot::compute_mixed_type( + ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + const int& nframes, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam, + const std::vector& aparam); + +template void DeepPot::compute_mixed_type( + ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + const int& nframes, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam, + const std::vector& aparam); + +template void DeepPot::compute_mixed_type( + std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + const int& nframes, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam, + const std::vector& aparam); + +template void DeepPot::compute_mixed_type( + std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + const int& nframes, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam, + const std::vector& aparam); + +template +void DeepPot::compute_mixed_type(ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const int& nframes, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam_, + const std::vector& aparam_) { + std::vector dener_; + dp->computew_mixed_type(dener_, dforce_, dvirial, datom_energy_, + datom_virial_, nframes, dcoord_, datype_, dbox, + fparam_, aparam_); + dener = dener_[0]; +} +template +void DeepPot::compute_mixed_type(std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const int& nframes, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam_, + const std::vector& aparam_) { + dp->computew_mixed_type(dener, dforce_, dvirial, datom_energy_, datom_virial_, + nframes, dcoord_, datype_, dbox, fparam_, aparam_); +} - template void DeepPot::compute_mixed_type( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, const int& nframes, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const std::vector& fparam, - const std::vector& aparam); - - template void DeepPot::compute_mixed_type( - ENERGYTYPE & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, const int& nframes, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const std::vector& fparam, - const std::vector& aparam); - - template void DeepPot::compute_mixed_type( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, const int& nframes, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const std::vector& fparam, - const std::vector& aparam); - - template void DeepPot::compute_mixed_type( - std::vector & dener, std::vector & dforce_, - std::vector & dvirial, std::vector & datom_energy_, - std::vector & datom_virial_, const int& nframes, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const std::vector& fparam, - const std::vector& aparam); - - double DeepPot::cutoff() const { return dp->cutoff(); } - - int DeepPot::numb_types() const { return dp->numb_types(); } - - int DeepPot::numb_types_spin() const { return dp->numb_types_spin(); } - - int DeepPot::dim_fparam() const { return dp->dim_fparam(); } - - int DeepPot::dim_aparam() const { return dp->dim_aparam(); } - - void DeepPot::get_type_map(std::string & type_map) { - dp->get_type_map(type_map); - } +template void DeepPot::compute_mixed_type( + ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const int& nframes, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam, + const std::vector& aparam); + +template void DeepPot::compute_mixed_type( + ENERGYTYPE& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const int& nframes, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam, + const std::vector& aparam); + +template void DeepPot::compute_mixed_type( + std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const int& nframes, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam, + const std::vector& aparam); + +template void DeepPot::compute_mixed_type( + std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const int& nframes, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const std::vector& fparam, + const std::vector& aparam); + +double DeepPot::cutoff() const { return dp->cutoff(); } + +int DeepPot::numb_types() const { return dp->numb_types(); } + +int DeepPot::numb_types_spin() const { return dp->numb_types_spin(); } + +int DeepPot::dim_fparam() const { return dp->dim_fparam(); } + +int DeepPot::dim_aparam() const { return dp->dim_aparam(); } + +void DeepPot::get_type_map(std::string& type_map) { + dp->get_type_map(type_map); +} - bool DeepPot::is_aparam_nall() const { return dp->is_aparam_nall(); } +bool DeepPot::is_aparam_nall() const { return dp->is_aparam_nall(); } - DeepPotModelDevi::DeepPotModelDevi() : inited(false), numb_models(0) {} +DeepPotModelDevi::DeepPotModelDevi() : inited(false), numb_models(0) {} - DeepPotModelDevi::DeepPotModelDevi( - const std::vector& models, const int& gpu_rank, - const std::vector& file_contents) - : inited(false), numb_models(0) { - init(models, gpu_rank, file_contents); - } +DeepPotModelDevi::DeepPotModelDevi( + const std::vector& models, + const int& gpu_rank, + const std::vector& file_contents) + : inited(false), numb_models(0) { + init(models, gpu_rank, file_contents); +} - DeepPotModelDevi::~DeepPotModelDevi() {} +DeepPotModelDevi::~DeepPotModelDevi() {} - void DeepPotModelDevi::init(const std::vector& models, - const int& gpu_rank, - const std::vector& file_contents) { - if (inited) { - std::cerr << "WARNING: deepmd-kit should not be initialized twice, do " - "nothing at the second call of initializer" - << std::endl; - return; - } - numb_models = models.size(); - if (numb_models == 0) { - throw deepmd::deepmd_exception("no model is specified"); - } - dps.resize(numb_models); - for (unsigned int ii = 0; ii < numb_models; ++ii) { - dps[ii].init(models[ii], gpu_rank, - file_contents.size() > ii ? file_contents[ii] : ""); - } - inited = true; +void DeepPotModelDevi::init(const std::vector& models, + const int& gpu_rank, + const std::vector& file_contents) { + if (inited) { + std::cerr << "WARNING: deepmd-kit should not be initialized twice, do " + "nothing at the second call of initializer" + << std::endl; + return; } - - template - void DeepPotModelDevi::compute( - std::vector & all_energy, - std::vector> & all_force, - std::vector> & all_virial, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const int nghost, - const InputNlist& lmp_list, const int& ago, - const std::vector& fparam, - const std::vector& aparam_) { - if (numb_models == 0) { - return; - } - all_energy.resize(numb_models); - all_force.resize(numb_models); - all_virial.resize(numb_models); - for (unsigned ii = 0; ii < numb_models; ++ii) { - dps[ii].compute(all_energy[ii], all_force[ii], all_virial[ii], dcoord_, - datype_, dbox, nghost, lmp_list, ago, fparam, aparam_); - } + numb_models = models.size(); + if (numb_models == 0) { + throw deepmd::deepmd_exception("no model is specified"); } + dps.resize(numb_models); + for (unsigned int ii = 0; ii < numb_models; ++ii) { + dps[ii].init(models[ii], gpu_rank, + file_contents.size() > ii ? file_contents[ii] : ""); + } + inited = true; +} - template void DeepPotModelDevi::compute( - std::vector & all_energy, - std::vector> & all_force, - std::vector> & all_virial, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const int nghost, - const InputNlist& lmp_list, const int& ago, - const std::vector& fparam, const std::vector& aparam); - - template void DeepPotModelDevi::compute( - std::vector & all_energy, - std::vector> & all_force, - std::vector> & all_virial, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const int nghost, - const InputNlist& lmp_list, const int& ago, - const std::vector& fparam, const std::vector& aparam); - - template - void DeepPotModelDevi::compute( - std::vector & all_energy, - std::vector> & all_force, - std::vector> & all_virial, - std::vector> & all_atom_energy, - std::vector> & all_atom_virial, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const int nghost, - const InputNlist& lmp_list, const int& ago, - const std::vector& fparam, - const std::vector& aparam_) { - if (numb_models == 0) { - return; - } - all_energy.resize(numb_models); - all_force.resize(numb_models); - all_virial.resize(numb_models); - all_atom_energy.resize(numb_models); - all_atom_virial.resize(numb_models); - for (unsigned ii = 0; ii < numb_models; ++ii) { - dps[ii].compute(all_energy[ii], all_force[ii], all_virial[ii], - all_atom_energy[ii], all_atom_virial[ii], dcoord_, - datype_, dbox, nghost, lmp_list, ago, fparam, aparam_); - } +template +void DeepPotModelDevi::compute(std::vector& all_energy, + std::vector>& all_force, + std::vector>& all_virial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam_) { + if (numb_models == 0) { + return; + } + all_energy.resize(numb_models); + all_force.resize(numb_models); + all_virial.resize(numb_models); + for (unsigned ii = 0; ii < numb_models; ++ii) { + dps[ii].compute(all_energy[ii], all_force[ii], all_virial[ii], dcoord_, + datype_, dbox, nghost, lmp_list, ago, fparam, aparam_); } +} - template void DeepPotModelDevi::compute( - std::vector & all_energy, - std::vector> & all_force, - std::vector> & all_virial, - std::vector> & all_atom_energy, - std::vector> & all_atom_virial, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const int nghost, - const InputNlist& lmp_list, const int& ago, - const std::vector& fparam, const std::vector& aparam); - - template void DeepPotModelDevi::compute( - std::vector & all_energy, - std::vector> & all_force, - std::vector> & all_virial, - std::vector> & all_atom_energy, - std::vector> & all_atom_virial, - const std::vector& dcoord_, const std::vector& datype_, - const std::vector& dbox, const int nghost, - const InputNlist& lmp_list, const int& ago, - const std::vector& fparam, const std::vector& aparam); - - template - void DeepPotModelDevi::compute_avg(VALUETYPE & dener, - const std::vector& all_energy) { - assert(all_energy.size() == numb_models); - if (numb_models == 0) { - return; - } +template void DeepPotModelDevi::compute( + std::vector& all_energy, + std::vector>& all_force, + std::vector>& all_virial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam); + +template void DeepPotModelDevi::compute( + std::vector& all_energy, + std::vector>& all_force, + std::vector>& all_virial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam); + +template +void DeepPotModelDevi::compute( + std::vector& all_energy, + std::vector>& all_force, + std::vector>& all_virial, + std::vector>& all_atom_energy, + std::vector>& all_atom_virial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam_) { + if (numb_models == 0) { + return; + } + all_energy.resize(numb_models); + all_force.resize(numb_models); + all_virial.resize(numb_models); + all_atom_energy.resize(numb_models); + all_atom_virial.resize(numb_models); + for (unsigned ii = 0; ii < numb_models; ++ii) { + dps[ii].compute(all_energy[ii], all_force[ii], all_virial[ii], + all_atom_energy[ii], all_atom_virial[ii], dcoord_, datype_, + dbox, nghost, lmp_list, ago, fparam, aparam_); + } +} - dener = 0; - for (unsigned ii = 0; ii < numb_models; ++ii) { - dener += all_energy[ii]; - } - dener /= (VALUETYPE)(numb_models); +template void DeepPotModelDevi::compute( + std::vector& all_energy, + std::vector>& all_force, + std::vector>& all_virial, + std::vector>& all_atom_energy, + std::vector>& all_atom_virial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam); + +template void DeepPotModelDevi::compute( + std::vector& all_energy, + std::vector>& all_force, + std::vector>& all_virial, + std::vector>& all_atom_energy, + std::vector>& all_atom_virial, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam); + +template +void DeepPotModelDevi::compute_avg(VALUETYPE& dener, + const std::vector& all_energy) { + assert(all_energy.size() == numb_models); + if (numb_models == 0) { + return; } - template void DeepPotModelDevi::compute_avg( - double& dener, const std::vector& all_energy); + dener = 0; + for (unsigned ii = 0; ii < numb_models; ++ii) { + dener += all_energy[ii]; + } + dener /= (VALUETYPE)(numb_models); +} - template void DeepPotModelDevi::compute_avg( - float& dener, const std::vector& all_energy); +template void DeepPotModelDevi::compute_avg( + double& dener, const std::vector& all_energy); - template - void DeepPotModelDevi::compute_avg( - std::vector & avg, - const std::vector>& xx) { - assert(xx.size() == numb_models); - if (numb_models == 0) { - return; - } +template void DeepPotModelDevi::compute_avg( + float& dener, const std::vector& all_energy); - avg.resize(xx[0].size()); - fill(avg.begin(), avg.end(), VALUETYPE(0.)); +template +void DeepPotModelDevi::compute_avg( + std::vector& avg, + const std::vector>& xx) { + assert(xx.size() == numb_models); + if (numb_models == 0) { + return; + } - for (unsigned ii = 0; ii < numb_models; ++ii) { - for (unsigned jj = 0; jj < avg.size(); ++jj) { - avg[jj] += xx[ii][jj]; - } - } + avg.resize(xx[0].size()); + fill(avg.begin(), avg.end(), VALUETYPE(0.)); + for (unsigned ii = 0; ii < numb_models; ++ii) { for (unsigned jj = 0; jj < avg.size(); ++jj) { - avg[jj] /= VALUETYPE(numb_models); + avg[jj] += xx[ii][jj]; } } - template void DeepPotModelDevi::compute_avg( - std::vector & avg, const std::vector>& xx); - - template void DeepPotModelDevi::compute_avg( - std::vector & avg, const std::vector>& xx); - - template - void DeepPotModelDevi::compute_std( - std::vector & std, const std::vector& avg, - const std::vector>& xx, const int& stride) { - assert(xx.size() == numb_models); - if (numb_models == 0) { - return; - } - - unsigned ndof = avg.size(); - unsigned nloc = ndof / stride; - assert(nloc * stride == ndof); - - std.resize(nloc); - fill(std.begin(), std.end(), VALUETYPE(0.)); - - for (unsigned ii = 0; ii < numb_models; ++ii) { - for (unsigned jj = 0; jj < nloc; ++jj) { - const VALUETYPE* tmp_f = &(xx[ii][static_cast(jj) * stride]); - const VALUETYPE* tmp_avg = &(avg[static_cast(jj) * stride]); - for (unsigned dd = 0; dd < stride; ++dd) { - VALUETYPE vdiff = tmp_f[dd] - tmp_avg[dd]; - std[jj] += vdiff * vdiff; - } - } - } - - for (unsigned jj = 0; jj < nloc; ++jj) { - std[jj] = sqrt(std[jj] / VALUETYPE(numb_models)); - } + for (unsigned jj = 0; jj < avg.size(); ++jj) { + avg[jj] /= VALUETYPE(numb_models); } +} - template void DeepPotModelDevi::compute_std( - std::vector & std, const std::vector& avg, - const std::vector>& xx, const int& stride); +template void DeepPotModelDevi::compute_avg( + std::vector& avg, const std::vector>& xx); - template void DeepPotModelDevi::compute_std( - std::vector & std, const std::vector& avg, - const std::vector>& xx, const int& stride); +template void DeepPotModelDevi::compute_avg( + std::vector& avg, const std::vector>& xx); - template - void DeepPotModelDevi::compute_std_e( - std::vector & std, const std::vector& avg, - const std::vector>& xx) { - compute_std(std, avg, xx, 1); +template +void DeepPotModelDevi::compute_std( + std::vector& std, + const std::vector& avg, + const std::vector>& xx, + const int& stride) { + assert(xx.size() == numb_models); + if (numb_models == 0) { + return; } - template void DeepPotModelDevi::compute_std_e( - std::vector & std, const std::vector& avg, - const std::vector>& xx); - - template void DeepPotModelDevi::compute_std_e( - std::vector & std, const std::vector& avg, - const std::vector>& xx); + unsigned ndof = avg.size(); + unsigned nloc = ndof / stride; + assert(nloc * stride == ndof); - template - void DeepPotModelDevi::compute_std_f( - std::vector & std, const std::vector& avg, - const std::vector>& xx) { - compute_std(std, avg, xx, 3); - } + std.resize(nloc); + fill(std.begin(), std.end(), VALUETYPE(0.)); - template void DeepPotModelDevi::compute_std_f( - std::vector & std, const std::vector& avg, - const std::vector>& xx); - - template void DeepPotModelDevi::compute_std_f( - std::vector & std, const std::vector& avg, - const std::vector>& xx); - - template - void DeepPotModelDevi::compute_relative_std( - std::vector & std, const std::vector& avg, - const VALUETYPE eps, const int& stride) { - unsigned ndof = avg.size(); - unsigned nloc = std.size(); - assert(nloc * stride == ndof); - - for (unsigned ii = 0; ii < nloc; ++ii) { - const VALUETYPE* tmp_avg = &(avg[static_cast(ii) * stride]); - VALUETYPE f_norm = 0.0; + for (unsigned ii = 0; ii < numb_models; ++ii) { + for (unsigned jj = 0; jj < nloc; ++jj) { + const VALUETYPE* tmp_f = &(xx[ii][static_cast(jj) * stride]); + const VALUETYPE* tmp_avg = &(avg[static_cast(jj) * stride]); for (unsigned dd = 0; dd < stride; ++dd) { - f_norm += tmp_avg[dd] * tmp_avg[dd]; + VALUETYPE vdiff = tmp_f[dd] - tmp_avg[dd]; + std[jj] += vdiff * vdiff; } - f_norm = sqrt(f_norm); - std[ii] /= f_norm + eps; } } - template void DeepPotModelDevi::compute_relative_std( - std::vector & std, const std::vector& avg, - const double eps, const int& stride); + for (unsigned jj = 0; jj < nloc; ++jj) { + std[jj] = sqrt(std[jj] / VALUETYPE(numb_models)); + } +} - template void DeepPotModelDevi::compute_relative_std( - std::vector & std, const std::vector& avg, const float eps, - const int& stride); +template void DeepPotModelDevi::compute_std( + std::vector& std, + const std::vector& avg, + const std::vector>& xx, + const int& stride); + +template void DeepPotModelDevi::compute_std( + std::vector& std, + const std::vector& avg, + const std::vector>& xx, + const int& stride); + +template +void DeepPotModelDevi::compute_std_e( + std::vector& std, + const std::vector& avg, + const std::vector>& xx) { + compute_std(std, avg, xx, 1); +} - template - void DeepPotModelDevi::compute_relative_std_f( - std::vector & std, const std::vector& avg, - const VALUETYPE eps) { - compute_relative_std(std, avg, eps, 3); +template void DeepPotModelDevi::compute_std_e( + std::vector& std, + const std::vector& avg, + const std::vector>& xx); + +template void DeepPotModelDevi::compute_std_e( + std::vector& std, + const std::vector& avg, + const std::vector>& xx); + +template +void DeepPotModelDevi::compute_std_f( + std::vector& std, + const std::vector& avg, + const std::vector>& xx) { + compute_std(std, avg, xx, 3); +} + +template void DeepPotModelDevi::compute_std_f( + std::vector& std, + const std::vector& avg, + const std::vector>& xx); + +template void DeepPotModelDevi::compute_std_f( + std::vector& std, + const std::vector& avg, + const std::vector>& xx); + +template +void DeepPotModelDevi::compute_relative_std(std::vector& std, + const std::vector& avg, + const VALUETYPE eps, + const int& stride) { + unsigned ndof = avg.size(); + unsigned nloc = std.size(); + assert(nloc * stride == ndof); + + for (unsigned ii = 0; ii < nloc; ++ii) { + const VALUETYPE* tmp_avg = &(avg[static_cast(ii) * stride]); + VALUETYPE f_norm = 0.0; + for (unsigned dd = 0; dd < stride; ++dd) { + f_norm += tmp_avg[dd] * tmp_avg[dd]; + } + f_norm = sqrt(f_norm); + std[ii] /= f_norm + eps; } +} + +template void DeepPotModelDevi::compute_relative_std( + std::vector& std, + const std::vector& avg, + const double eps, + const int& stride); + +template void DeepPotModelDevi::compute_relative_std( + std::vector& std, + const std::vector& avg, + const float eps, + const int& stride); + +template +void DeepPotModelDevi::compute_relative_std_f(std::vector& std, + const std::vector& avg, + const VALUETYPE eps) { + compute_relative_std(std, avg, eps, 3); +} - template void DeepPotModelDevi::compute_relative_std_f( - std::vector & std, const std::vector& avg, - const double eps); +template void DeepPotModelDevi::compute_relative_std_f( + std::vector& std, const std::vector& avg, const double eps); - template void DeepPotModelDevi::compute_relative_std_f( - std::vector & std, const std::vector& avg, const float eps); +template void DeepPotModelDevi::compute_relative_std_f( + std::vector& std, const std::vector& avg, const float eps); From 675031203510a036a8eb2bef7fe6f36a2f97c269 Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Sat, 3 Feb 2024 11:07:26 +0800 Subject: [PATCH 040/103] fix model inference interface and add cpu --- deepmd/pt/model/model/dp_atomic_model.py | 5 +++ deepmd/pt/model/model/ener.py | 3 ++ source/api_cc/include/DeepPotPT.h | 2 +- source/api_cc/src/DeepPotPT.cc | 42 ++++++++++++------------ 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/deepmd/pt/model/model/dp_atomic_model.py b/deepmd/pt/model/model/dp_atomic_model.py index b2ae48628b..7190723eb0 100644 --- a/deepmd/pt/model/model/dp_atomic_model.py +++ b/deepmd/pt/model/model/dp_atomic_model.py @@ -71,6 +71,7 @@ def __init__( self.descriptor = descriptor self.rcut = self.descriptor.get_rcut() self.sel = self.descriptor.get_sel() + self.nnei = self.descriptor.get_nsel() self.fitting_net = fitting # Statistics fitting_net = None # TODO: hack!!! not sure if it is correct. @@ -99,6 +100,10 @@ def get_rcut(self) -> float: def get_sel(self) -> List[int]: """Get the neighbor selection.""" return self.sel + + def get_nnei(self) -> List[int]: + """Get the the number of selected atoms in the cut-off radius.""" + return self.nnei def distinguish_types(self) -> bool: """If distinguish different types by sorting.""" diff --git a/deepmd/pt/model/model/ener.py b/deepmd/pt/model/model/ener.py index a408689d8d..8e90872bd2 100644 --- a/deepmd/pt/model/model/ener.py +++ b/deepmd/pt/model/model/ener.py @@ -81,6 +81,9 @@ def forward_lower( model_predict["extended_virial"] = model_ret[ "energy_derv_c" ].squeeze(-3) + model_predict["ruduced_virial"] = model_ret[ + "energy_derv_c_redu" + ].squeeze(-3) else: assert model_ret["dforce"] is not None model_predict["dforce"] = model_ret["dforce"] diff --git a/source/api_cc/include/DeepPotPT.h b/source/api_cc/include/DeepPotPT.h index 2c71982545..a3ca9d69cb 100644 --- a/source/api_cc/include/DeepPotPT.h +++ b/source/api_cc/include/DeepPotPT.h @@ -323,9 +323,9 @@ class DeepPotPT : public DeepPotBase { torch::jit::script::Module module; double rcut; NeighborListDataPT nlist_data; - // InputNlist nlist; int max_num_neighbors; int gpu_id; + bool cpu_enabled; at::Tensor firstneigh_tensor; }; diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 3ddfc011ae..959ebe4695 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -29,19 +29,20 @@ void DeepPotPT::init(const std::string& model, << std::endl; gpu_id = gpu_rank; torch::Device device(torch::kCUDA, gpu_rank); + cpu_enabled = false; // This may be implemented as something like DPErrcheck(DPSetDevice(gpu_rank % // gpu_num)); try { module = torch::jit::load(model, device); } catch (const c10::Error& e) { - std::cerr << "Error loading the model, maybe GPU is not available\n"; + torch::Device device(torch::kCPU); + module = torch::jit::load(model, device); + cpu_enabled = true; } torch::jit::FusionStrategy strategy; strategy = {{torch::jit::FusionBehavior::DYNAMIC, 10}}; torch::jit::setFusionStrategy(strategy); - // at::globalContext().setAllowTF32CuBLAS(true); - // at::globalContext().setAllowTF32CuDNN(true); get_env_nthreads(num_intra_nthreads, num_inter_nthreads); // need to be fixed as // DP_INTRA_OP_PARALLELISM_THREADS @@ -70,21 +71,21 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const std::vector& box, const InputNlist& lmp_list, const int& ago) { - torch::Device device(torch::kCUDA, gpu_id); + if(cpu_enabled) + torch::Device device(torch::kCPU); + else + torch::Device device(torch::kCUDA, gpu_id); std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); auto int_options = torch::TensorOptions().dtype(torch::kInt64); auto int32_options = torch::TensorOptions().dtype(torch::kInt32); - std::vector inputs; at::Tensor coord_wrapped_Tensor = torch::from_blob(coord_wrapped.data(), {1, natoms, 3}, options) .to(device); - inputs.push_back(coord_wrapped_Tensor); std::vector atype_64(atype.begin(), atype.end()); at::Tensor atype_Tensor = torch::from_blob(atype_64.data(), {1, natoms}, int_options).to(device); - inputs.push_back(atype_Tensor); if (ago == 0) { int64_t nnei = module.run_method("get_nnei").toInt(); nlist_data.copy_from_nlist(lmp_list, max_num_neighbors, nnei); @@ -93,7 +94,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, nlist_data.jlist, {lmp_list.inum, max_num_neighbors}, int32_options); at::Tensor nlist = firstneigh.to(torch::kInt64).to(device); firstneigh_tensor = - module.run_method("sort_neighbor_list", coord_wrapped_Tensor, nlist) + module.run_method("format_nlist", coord_wrapped_Tensor,atype_Tensor,nlist) .toTensor(); } else { at::Tensor firstneigh = torch::from_blob( @@ -102,21 +103,15 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, firstneigh_tensor = firstneigh.to(torch::kInt64).to(device); } } - at::Tensor box_Tensor = - torch::from_blob(const_cast(box.data()), {1, 9}, options) - .to(device); - inputs.push_back(box_Tensor); bool do_atom_virial_tensor = true; - inputs.push_back(do_atom_virial_tensor); - inputs.push_back(firstneigh_tensor); + torch::Tensor mapping_tensor = torch::Tensor(nullptr); c10::Dict outputs = - module.forward(inputs).toGenericDict(); + module.run_method("forward_lower",coord_wrapped_Tensor,atype_Tensor,firstneigh_tensor,mapping_tensor, do_atom_virial_tensor).toGenericDict(); c10::IValue energy_ = outputs.at("energy"); c10::IValue force_ = outputs.at("extended_force"); - c10::IValue virial_ = outputs.at("extended_virial"); - c10::IValue atom_virial_ = outputs.at("atomic_virial"); + c10::IValue virial_ = outputs.at("reduced_virial"); + c10::IValue atom_virial_ = outputs.at("extended_virial"); c10::IValue atom_energy_ = outputs.at("atom_energy"); - // ener = energy_.toTensor().item(); torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); ener.assign(cpu_energy_.data_ptr(), @@ -195,8 +190,10 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const std::vector& coord, const std::vector& atype, const std::vector& box) { - auto device = torch::kCUDA; - module.to(device); + if(cpu_enabled) + torch::Device device(torch::kCPU); + else + torch::Device device(torch::kCUDA, gpu_id); std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); @@ -214,6 +211,10 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::from_blob(const_cast(box.data()), {1, 9}, options) .to(device); inputs.push_back(box_Tensor); + torch::Tensor fparam_tensor = torch::Tensor(nullptr); + inputs.push_back(fparam_tensor); + torch::Tensor aparam_tensor = torch::Tensor(nullptr); + inputs.push_back(aparam_tensor); bool do_atom_virial_tensor = true; inputs.push_back(do_atom_virial_tensor); c10::Dict outputs = @@ -224,7 +225,6 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, c10::IValue virial_ = outputs.at("virial"); c10::IValue atom_virial_ = outputs.at("atomic_virial"); c10::IValue atom_energy_ = outputs.at("atom_energy"); - // ener = energy_.toTensor().item(); torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); ener.assign(cpu_energy_.data_ptr(), From 0a3e2086e262b166eefa3b6762be4b4928c509f8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 3 Feb 2024 03:07:52 +0000 Subject: [PATCH 041/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- deepmd/pt/model/model/dp_atomic_model.py | 2 +- source/api_cc/src/DeepPotPT.cc | 22 ++++++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/deepmd/pt/model/model/dp_atomic_model.py b/deepmd/pt/model/model/dp_atomic_model.py index 7190723eb0..f9c47105cf 100644 --- a/deepmd/pt/model/model/dp_atomic_model.py +++ b/deepmd/pt/model/model/dp_atomic_model.py @@ -100,7 +100,7 @@ def get_rcut(self) -> float: def get_sel(self) -> List[int]: """Get the neighbor selection.""" return self.sel - + def get_nnei(self) -> List[int]: """Get the the number of selected atoms in the cut-off radius.""" return self.nnei diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 959ebe4695..3cb8e32046 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -71,10 +71,11 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const std::vector& box, const InputNlist& lmp_list, const int& ago) { - if(cpu_enabled) + if (cpu_enabled) { torch::Device device(torch::kCPU); - else + } else { torch::Device device(torch::kCUDA, gpu_id); + } std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); @@ -93,9 +94,10 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, at::Tensor firstneigh = torch::from_blob( nlist_data.jlist, {lmp_list.inum, max_num_neighbors}, int32_options); at::Tensor nlist = firstneigh.to(torch::kInt64).to(device); - firstneigh_tensor = - module.run_method("format_nlist", coord_wrapped_Tensor,atype_Tensor,nlist) - .toTensor(); + firstneigh_tensor = module + .run_method("format_nlist", coord_wrapped_Tensor, + atype_Tensor, nlist) + .toTensor(); } else { at::Tensor firstneigh = torch::from_blob( nlist_data.jlist, {1, lmp_list.inum, max_num_neighbors}, @@ -106,7 +108,10 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, bool do_atom_virial_tensor = true; torch::Tensor mapping_tensor = torch::Tensor(nullptr); c10::Dict outputs = - module.run_method("forward_lower",coord_wrapped_Tensor,atype_Tensor,firstneigh_tensor,mapping_tensor, do_atom_virial_tensor).toGenericDict(); + module + .run_method("forward_lower", coord_wrapped_Tensor, atype_Tensor, + firstneigh_tensor, mapping_tensor, do_atom_virial_tensor) + .toGenericDict(); c10::IValue energy_ = outputs.at("energy"); c10::IValue force_ = outputs.at("extended_force"); c10::IValue virial_ = outputs.at("reduced_virial"); @@ -190,10 +195,11 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const std::vector& coord, const std::vector& atype, const std::vector& box) { - if(cpu_enabled) + if (cpu_enabled) { torch::Device device(torch::kCPU); - else + } else { torch::Device device(torch::kCUDA, gpu_id); + } std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); From 3de36b035fa68b9af3dc7eae2321b310633d7424 Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Sat, 3 Feb 2024 12:17:57 +0800 Subject: [PATCH 042/103] fix bug: device init --- source/api_cc/src/DeepPotPT.cc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 959ebe4695..d59b5562a9 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -71,10 +71,11 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const std::vector& box, const InputNlist& lmp_list, const int& ago) { + torch::Device device; if(cpu_enabled) - torch::Device device(torch::kCPU); + device = torch::Device(torch::kCPU); else - torch::Device device(torch::kCUDA, gpu_id); + device = torch::Device(torch::kCUDA, gpu_id); std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); @@ -190,10 +191,11 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const std::vector& coord, const std::vector& atype, const std::vector& box) { + torch::Device device; if(cpu_enabled) - torch::Device device(torch::kCPU); + device = torch::Device(torch::kCPU); else - torch::Device device(torch::kCUDA, gpu_id); + device = torch::Device(torch::kCUDA, gpu_id); std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); From e5d1533c5f43a284bcff24effe59dfbdfaf9207f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 3 Feb 2024 04:20:00 +0000 Subject: [PATCH 043/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 651a12eb97..3939efedb9 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -72,10 +72,11 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const InputNlist& lmp_list, const int& ago) { torch::Device device; - if(cpu_enabled) + if (cpu_enabled) { device = torch::Device(torch::kCPU); - else + } else { device = torch::Device(torch::kCUDA, gpu_id); + } std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); @@ -196,10 +197,11 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const std::vector& atype, const std::vector& box) { torch::Device device; - if(cpu_enabled) + if (cpu_enabled) { device = torch::Device(torch::kCPU); - else + } else { device = torch::Device(torch::kCUDA, gpu_id); + } std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); From e61a50983f3436a21f30d9faa916dbb0d1dafe6d Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Sat, 3 Feb 2024 12:44:04 +0800 Subject: [PATCH 044/103] fix bug: device constructor --- source/api_cc/src/DeepPotPT.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 651a12eb97..9b642eac8b 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -71,11 +71,9 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const std::vector& box, const InputNlist& lmp_list, const int& ago) { - torch::Device device; + torch::Device device(torch::kCUDA, gpu_id); if(cpu_enabled) device = torch::Device(torch::kCPU); - else - device = torch::Device(torch::kCUDA, gpu_id); std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); From 6c4a641855f5e0b8b98b8be4cd61e08faf262383 Mon Sep 17 00:00:00 2001 From: zxysbsbzxy Date: Sat, 3 Feb 2024 12:44:34 +0800 Subject: [PATCH 045/103] fix bug:device constructor --- source/api_cc/src/DeepPotPT.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 9b642eac8b..624c6299f8 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -193,11 +193,9 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const std::vector& coord, const std::vector& atype, const std::vector& box) { - torch::Device device; + torch::Device device(torch::kCUDA, gpu_id); if(cpu_enabled) device = torch::Device(torch::kCPU); - else - device = torch::Device(torch::kCUDA, gpu_id); std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); From 22d1a7e2ebab97ea466569963556338d1d1c89e5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 3 Feb 2024 04:48:42 +0000 Subject: [PATCH 046/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 624c6299f8..de2611d3e9 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -72,8 +72,9 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const InputNlist& lmp_list, const int& ago) { torch::Device device(torch::kCUDA, gpu_id); - if(cpu_enabled) + if (cpu_enabled) { device = torch::Device(torch::kCPU); + } std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); @@ -194,8 +195,9 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const std::vector& atype, const std::vector& box) { torch::Device device(torch::kCUDA, gpu_id); - if(cpu_enabled) + if (cpu_enabled) { device = torch::Device(torch::kCPU); + } std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); From a68742d8384a1e5cedce7bb210ce85773bd94085 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Sat, 3 Feb 2024 04:29:24 -0500 Subject: [PATCH 047/103] add tests, although not passed Signed-off-by: Jinzhe Zeng --- source/api_cc/src/DeepPotPT.cc | 8 +- source/api_cc/tests/test_deeppot_pt.cc | 619 +++++++++++++++++++++++++ source/install/test_cc_local.sh | 10 +- source/tests/infer/deeppot_sea.pth | Bin 0 -> 193994 bytes 4 files changed, 634 insertions(+), 3 deletions(-) create mode 100644 source/api_cc/tests/test_deeppot_pt.cc create mode 100644 source/tests/infer/deeppot_sea.pth diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index de2611d3e9..655061aced 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -46,8 +46,12 @@ void DeepPotPT::init(const std::string& model, get_env_nthreads(num_intra_nthreads, num_inter_nthreads); // need to be fixed as // DP_INTRA_OP_PARALLELISM_THREADS - at::set_num_interop_threads(num_inter_nthreads); - at::set_num_threads(num_intra_nthreads); + if (num_inter_nthreads) { + at::set_num_interop_threads(num_inter_nthreads); + } + if (num_intra_nthreads) { + at::set_num_threads(num_intra_nthreads); + } auto rcut_ = module.run_method("get_rcut").toDouble(); rcut = static_cast(rcut_); diff --git a/source/api_cc/tests/test_deeppot_pt.cc b/source/api_cc/tests/test_deeppot_pt.cc new file mode 100644 index 0000000000..e27401bb3c --- /dev/null +++ b/source/api_cc/tests/test_deeppot_pt.cc @@ -0,0 +1,619 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "DeepPot.h" +#include "neighbor_list.h" +#include "test_utils.h" + +template +class TestInferDeepPotAPt : public ::testing::Test { + protected: + std::vector coord = {12.83, 2.56, 2.18, 12.09, 2.87, 2.74, + 00.25, 3.32, 1.68, 3.36, 3.00, 1.81, + 3.51, 2.51, 2.60, 4.27, 3.22, 1.56}; + std::vector atype = {0, 1, 1, 0, 1, 1}; + std::vector box = {13., 0., 0., 0., 13., 0., 0., 0., 13.}; + std::vector expected_e = {-53.7147059, -49.94367351, + -49.9434903, -53.71488615, + -49.9438445, -49.94379288}; + std::vector expected_f = { + -0.00120548, 0.00809608, -0.00064437, 0.00641376, -0.00109731, + -0.00529648, -0.00551271, -0.0070066, 0.00597296, 0.00397807, + -0.00078519, 0.00165795, 0.0003451, 0.00228841, -0.0036, + -0.00401874, -0.00149539, 0.00190994}; + std::vector expected_v = { + -3.72974819e-03, -9.98227220e-04, 3.37664388e-03, -1.10154761e-03, + -4.68713907e-03, 1.84604369e-03, 3.41017698e-03, 1.81164563e-03, + -3.22243690e-03, -1.99493894e-03, 5.97534768e-05, 1.80584573e-03, + -2.62579356e-04, -1.12440024e-04, 2.42097709e-04, 1.89528468e-03, + -3.24777812e-05, -1.60401783e-03, -8.97106345e-04, -1.15497829e-03, + 1.17916578e-03, -7.55372233e-04, -8.56277743e-04, 7.92455483e-04, + 1.07793900e-03, 1.10623290e-03, -1.12596261e-03, -2.90655831e-03, + -3.70173918e-04, 2.98300648e-04, -3.95329633e-04, -7.64980354e-04, + 1.16308129e-03, 3.15914358e-04, 1.15922497e-03, -1.79216186e-03, + 3.24153403e-04, -3.17404215e-04, 4.23089883e-04, -1.83222341e-04, + -4.67327552e-04, 7.21883299e-04, 2.39115354e-04, 7.09732333e-04, + -1.09491651e-03, -3.87972886e-04, -3.39632835e-04, 4.29685964e-04, + -4.22611827e-04, -2.23877230e-04, 3.02037131e-04, 5.74301510e-04, + 3.13240553e-04, -4.22617216e-04}; + int natoms; + double expected_tot_e; + std::vector expected_tot_v; + + deepmd::DeepPot dp; + + void SetUp() override { + std::string file_name = "../../tests/infer/deeppot_sea.pth"; + + dp.init(file_name); + + natoms = expected_e.size(); + EXPECT_EQ(natoms * 3, expected_f.size()); + EXPECT_EQ(natoms * 9, expected_v.size()); + expected_tot_e = 0.; + expected_tot_v.resize(9); + std::fill(expected_tot_v.begin(), expected_tot_v.end(), 0.); + for (int ii = 0; ii < natoms; ++ii) { + expected_tot_e += expected_e[ii]; + } + for (int ii = 0; ii < natoms; ++ii) { + for (int dd = 0; dd < 9; ++dd) { + expected_tot_v[dd] += expected_v[ii * 9 + dd]; + } + } + }; + + void TearDown() override { remove("deeppot.pb"); }; +}; + +TYPED_TEST_SUITE(TestInferDeepPotAPt, ValueTypes); + +TYPED_TEST(TestInferDeepPotAPt, cpu_build_nlist) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + double ener; + std::vector force, virial; + dp.compute(ener, force, virial, coord, atype, box); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepPotAPt, cpu_build_nlist_numfv) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + class MyModel : public EnergyModelTest { + deepmd::DeepPot& mydp; + const std::vector atype; + + public: + MyModel(deepmd::DeepPot& dp_, const std::vector& atype_) + : mydp(dp_), atype(atype_){}; + virtual void compute(double& ener, + std::vector& force, + std::vector& virial, + const std::vector& coord, + const std::vector& box) { + mydp.compute(ener, force, virial, coord, atype, box); + } + }; + MyModel model(dp, atype); + model.test_f(coord, box); + model.test_v(coord, box); + std::vector box_(box); + box_[1] -= 0.4; + model.test_f(coord, box_); + model.test_v(coord, box_); + box_[2] += 0.5; + model.test_f(coord, box_); + model.test_v(coord, box_); + box_[4] += 0.2; + model.test_f(coord, box_); + model.test_v(coord, box_); + box_[3] -= 0.3; + model.test_f(coord, box_); + model.test_v(coord, box_); + box_[6] -= 0.7; + model.test_f(coord, box_); + model.test_v(coord, box_); + box_[7] += 0.6; + model.test_f(coord, box_); + model.test_v(coord, box_); +} + +TYPED_TEST(TestInferDeepPotAPt, cpu_build_nlist_atomic) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + double ener; + std::vector force, virial, atom_ener, atom_vir; + dp.compute(ener, force, virial, atom_ener, atom_vir, coord, atype, box); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + EXPECT_EQ(atom_ener.size(), natoms); + EXPECT_EQ(atom_vir.size(), natoms * 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } + for (int ii = 0; ii < natoms; ++ii) { + EXPECT_LT(fabs(atom_ener[ii] - expected_e[ii]), EPSILON); + } + for (int ii = 0; ii < natoms * 9; ++ii) { + EXPECT_LT(fabs(atom_vir[ii] - expected_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepPotAPt, cpu_lmp_nlist) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + float rc = dp.cutoff(); + int nloc = coord.size() / 3; + std::vector coord_cpy; + std::vector atype_cpy, mapping; + std::vector > nlist_data; + _build_nlist(nlist_data, coord_cpy, atype_cpy, mapping, coord, + atype, box, rc); + int nall = coord_cpy.size() / 3; + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]); + convert_nlist(inlist, nlist_data); + + double ener; + std::vector force_, virial; + dp.compute(ener, force_, virial, coord_cpy, atype_cpy, box, nall - nloc, + inlist, 0); + std::vector force; + _fold_back(force, force_, mapping, nloc, nall, 3); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } + + ener = 0.; + std::fill(force_.begin(), force_.end(), 0.0); + std::fill(virial.begin(), virial.end(), 0.0); + dp.compute(ener, force_, virial, coord_cpy, atype_cpy, box, nall - nloc, + inlist, 1); + _fold_back(force, force_, mapping, nloc, nall, 3); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepPotAPt, cpu_lmp_nlist_atomic) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + float rc = dp.cutoff(); + int nloc = coord.size() / 3; + std::vector coord_cpy; + std::vector atype_cpy, mapping; + std::vector > nlist_data; + _build_nlist(nlist_data, coord_cpy, atype_cpy, mapping, coord, + atype, box, rc); + int nall = coord_cpy.size() / 3; + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]); + convert_nlist(inlist, nlist_data); + + double ener; + std::vector force_, atom_ener_, atom_vir_, virial; + std::vector force, atom_ener, atom_vir; + dp.compute(ener, force_, virial, atom_ener_, atom_vir_, coord_cpy, atype_cpy, + box, nall - nloc, inlist, 0); + _fold_back(force, force_, mapping, nloc, nall, 3); + _fold_back(atom_ener, atom_ener_, mapping, nloc, nall, 1); + _fold_back(atom_vir, atom_vir_, mapping, nloc, nall, 9); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + EXPECT_EQ(atom_ener.size(), natoms); + EXPECT_EQ(atom_vir.size(), natoms * 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } + for (int ii = 0; ii < natoms; ++ii) { + EXPECT_LT(fabs(atom_ener[ii] - expected_e[ii]), EPSILON); + } + for (int ii = 0; ii < natoms * 9; ++ii) { + EXPECT_LT(fabs(atom_vir[ii] - expected_v[ii]), EPSILON); + } + + ener = 0.; + std::fill(force_.begin(), force_.end(), 0.0); + std::fill(virial.begin(), virial.end(), 0.0); + std::fill(atom_ener_.begin(), atom_ener_.end(), 0.0); + std::fill(atom_vir_.begin(), atom_vir_.end(), 0.0); + dp.compute(ener, force_, virial, atom_ener_, atom_vir_, coord_cpy, atype_cpy, + box, nall - nloc, inlist, 1); + _fold_back(force, force_, mapping, nloc, nall, 3); + _fold_back(atom_ener, atom_ener_, mapping, nloc, nall, 1); + _fold_back(atom_vir, atom_vir_, mapping, nloc, nall, 9); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + EXPECT_EQ(atom_ener.size(), natoms); + EXPECT_EQ(atom_vir.size(), natoms * 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } + for (int ii = 0; ii < natoms; ++ii) { + EXPECT_LT(fabs(atom_ener[ii] - expected_e[ii]), EPSILON); + } + for (int ii = 0; ii < natoms * 9; ++ii) { + EXPECT_LT(fabs(atom_vir[ii] - expected_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepPotAPt, cpu_lmp_nlist_2rc) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + float rc = dp.cutoff(); + int nloc = coord.size() / 3; + std::vector coord_cpy; + std::vector atype_cpy, mapping; + std::vector > nlist_data; + _build_nlist(nlist_data, coord_cpy, atype_cpy, mapping, coord, + atype, box, rc * 2); + int nall = coord_cpy.size() / 3; + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]); + convert_nlist(inlist, nlist_data); + + double ener; + std::vector force_(nall * 3, 0.0), virial(9, 0.0); + dp.compute(ener, force_, virial, coord_cpy, atype_cpy, box, nall - nloc, + inlist, 0); + std::vector force; + _fold_back(force, force_, mapping, nloc, nall, 3); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } + + ener = 0.; + std::fill(force_.begin(), force_.end(), 0.0); + std::fill(virial.begin(), virial.end(), 0.0); + dp.compute(ener, force_, virial, coord_cpy, atype_cpy, box, nall - nloc, + inlist, 1); + _fold_back(force, force_, mapping, nloc, nall, 3); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepPotAPt, cpu_lmp_nlist_type_sel) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + float rc = dp.cutoff(); + + // add vir atoms + int nvir = 2; + std::vector coord_vir(nvir * 3); + std::vector atype_vir(nvir, 2); + for (int ii = 0; ii < nvir; ++ii) { + coord_vir[ii] = coord[ii]; + } + coord.insert(coord.begin(), coord_vir.begin(), coord_vir.end()); + atype.insert(atype.begin(), atype_vir.begin(), atype_vir.end()); + natoms += nvir; + std::vector expected_f_vir(nvir * 3, 0.0); + expected_f.insert(expected_f.begin(), expected_f_vir.begin(), + expected_f_vir.end()); + + // build nlist + int nloc = coord.size() / 3; + std::vector coord_cpy; + std::vector atype_cpy, mapping; + std::vector > nlist_data; + _build_nlist(nlist_data, coord_cpy, atype_cpy, mapping, coord, + atype, box, rc); + int nall = coord_cpy.size() / 3; + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]); + convert_nlist(inlist, nlist_data); + + // dp compute + double ener; + std::vector force_(nall * 3, 0.0), virial(9, 0.0); + dp.compute(ener, force_, virial, coord_cpy, atype_cpy, box, nall - nloc, + inlist, 0); + // fold back + std::vector force; + _fold_back(force, force_, mapping, nloc, nall, 3); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepPotAPt, cpu_lmp_nlist_type_sel_atomic) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + float rc = dp.cutoff(); + + // add vir atoms + int nvir = 2; + std::vector coord_vir(nvir * 3); + std::vector atype_vir(nvir, 2); + for (int ii = 0; ii < nvir; ++ii) { + coord_vir[ii] = coord[ii]; + } + coord.insert(coord.begin(), coord_vir.begin(), coord_vir.end()); + atype.insert(atype.begin(), atype_vir.begin(), atype_vir.end()); + natoms += nvir; + std::vector expected_f_vir(nvir * 3, 0.0); + expected_f.insert(expected_f.begin(), expected_f_vir.begin(), + expected_f_vir.end()); + + // build nlist + int nloc = coord.size() / 3; + std::vector coord_cpy; + std::vector atype_cpy, mapping; + std::vector > nlist_data; + _build_nlist(nlist_data, coord_cpy, atype_cpy, mapping, coord, + atype, box, rc); + int nall = coord_cpy.size() / 3; + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]); + convert_nlist(inlist, nlist_data); + + // dp compute + double ener; + std::vector force_(nall * 3, 0.0), virial(9, 0.0), atomic_energy, + atomic_virial; + dp.compute(ener, force_, virial, atomic_energy, atomic_virial, coord_cpy, + atype_cpy, box, nall - nloc, inlist, 0); + // fold back + std::vector force; + _fold_back(force, force_, mapping, nloc, nall, 3); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepPotAPt, print_summary) { + deepmd::DeepPot& dp = this->dp; + dp.print_summary(""); +} + +template +class TestInferDeepPotAPtNoPbc : public ::testing::Test { + protected: + std::vector coord = {12.83, 2.56, 2.18, 12.09, 2.87, 2.74, + 00.25, 3.32, 1.68, 3.36, 3.00, 1.81, + 3.51, 2.51, 2.60, 4.27, 3.22, 1.56}; + std::vector atype = {0, 1, 1, 0, 1, 1}; + std::vector box = {}; + std::vector expected_e = {-53.70576165, -49.9427077, -49.68506898, + -53.71490191, -49.94386836, -49.9438074}; + std::vector expected_f = { + -0.05793241, 0.02426898, 0.04384074, 0.05793241, -0.02426898, + -0.04384074, 0.0061137, -0.00121445, -0.00052675, -0.04546273, + 0.00444365, -0.00071007, 0.01261648, -0.00107514, 0.00036128, + 0.02673255, -0.00215406, 0.00087553}; + std::vector expected_v = { + -9.02965689e-03, 3.78269410e-03, 6.83325386e-03, 3.78269410e-03, + -1.58464212e-03, -2.86257932e-03, 6.83325386e-03, -2.86257932e-03, + -5.17111103e-03, -3.38403230e-02, 1.41763515e-02, 2.56088931e-02, + 1.41763515e-02, -5.93874186e-03, -1.07280498e-02, 2.56088931e-02, + -1.07280498e-02, -1.93797029e-02, 2.16816985e-04, -1.26051843e-05, + 4.08880185e-06, -8.85403363e-06, 4.69563180e-08, 4.27221711e-07, + -5.68134313e-06, 1.25803648e-06, -1.28751543e-06, -1.55377477e-01, + 1.53205867e-02, -6.03170230e-03, 1.53638777e-02, -2.28187375e-03, + 1.66104531e-03, -6.12092196e-03, 1.66503657e-03, -1.81384836e-03, + 4.03275109e-02, -1.02905681e-02, 1.17738547e-02, -1.01342635e-02, + 2.05898924e-03, -2.16858200e-03, 1.15576484e-02, -2.17555574e-03, + 2.21173836e-03, 1.22038623e-01, -3.36194524e-03, -3.25713729e-03, + -3.56529198e-03, -1.12860297e-04, 3.54141978e-04, -2.94194119e-03, + 3.56293646e-04, -2.61599053e-04}; + int natoms; + double expected_tot_e; + std::vector expected_tot_v; + + deepmd::DeepPot dp; + + void SetUp() override { + std::string file_name = "../../tests/infer/deeppot_sea.pth"; + dp.init(file_name); + + natoms = expected_e.size(); + EXPECT_EQ(natoms * 3, expected_f.size()); + EXPECT_EQ(natoms * 9, expected_v.size()); + expected_tot_e = 0.; + expected_tot_v.resize(9); + std::fill(expected_tot_v.begin(), expected_tot_v.end(), 0.); + for (int ii = 0; ii < natoms; ++ii) { + expected_tot_e += expected_e[ii]; + } + for (int ii = 0; ii < natoms; ++ii) { + for (int dd = 0; dd < 9; ++dd) { + expected_tot_v[dd] += expected_v[ii * 9 + dd]; + } + } + }; + + void TearDown() override { remove("deeppot.pb"); }; +}; + +TYPED_TEST_SUITE(TestInferDeepPotAPtNoPbc, ValueTypes); + +TYPED_TEST(TestInferDeepPotAPtNoPbc, cpu_build_nlist) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + double ener; + std::vector force, virial; + dp.compute(ener, force, virial, coord, atype, box); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } +} diff --git a/source/install/test_cc_local.sh b/source/install/test_cc_local.sh index 22d22a27f6..73aa74ed90 100755 --- a/source/install/test_cc_local.sh +++ b/source/install/test_cc_local.sh @@ -18,7 +18,15 @@ INSTALL_PREFIX=${SCRIPT_PATH}/../../dp_test BUILD_TMP_DIR=${SCRIPT_PATH}/../build_tests mkdir -p ${BUILD_TMP_DIR} cd ${BUILD_TMP_DIR} -cmake -DINSTALL_TENSORFLOW=FALSE -DUSE_TF_PYTHON_LIBS=TRUE -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} -DBUILD_TESTING:BOOL=TRUE -DLAMMPS_VERSION=stable_2Aug2023_update2 ${CUDA_ARGS} .. +cmake \ + -D ENABLE_TENSORFLOW=TRUE \ + -D ENABLE_PYTORCH=TRUE \ + -D INSTALL_TENSORFLOW=FALSE \ + -D USE_TF_PYTHON_LIBS=TRUE \ + -D CMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} \ + -D BUILD_TESTING:BOOL=TRUE \ + -D LAMMPS_VERSION=stable_2Aug2023_update2 \ + ${CUDA_ARGS} .. cmake --build . -j${NPROC} cmake --install . ctest --output-on-failure diff --git a/source/tests/infer/deeppot_sea.pth b/source/tests/infer/deeppot_sea.pth new file mode 100644 index 0000000000000000000000000000000000000000..d8deb94c93de05df446e61228341d07e6fdb2f97 GIT binary patch literal 193994 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

qILC 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

~S7}=G36|&x7p5#O+oq~sG_crLHtKWsS17{!Q zet?D?L0KvMaH@#eS89mc)x@mJRK*@NoP>2tqH)z* zqEDR8M(3Q)L%U`1I8`d5PtKQ7y0pZiZEAV`@YS=HDItAwI{1!xJe!g>HPRAk_3p-i z8#ndSkc9`fGJ1*?P+eV32jy~Tp+u!i{Vr>f*~9k=DL@|qI57v26L0(sms4J|ZXR9b z@9wU0uF4~d!Ww0$u6(W&z|vmyZyaUatsBRX4GNDS1bmga_WL7g$hwvDk( zQ=o=OwLf+QQm;26RzqJBhi%}7cqktw553Z)$XSRJKYol`pH%LxOZeYRgynAjV@GKL#D_XfQ;_#qUi7c4{P5T9qZPm8{4*R+qP}nPIjE^ zSUa|@9Va`sZQHh!eRIy&x5v5N_d8#AkFGIl)T;VXqiVj-yC&9r=JPpowHSH|6H?_> zssU30Uj90%Ilx0&B<0r8E6GjwaCTrVHyLImC&6nks@9PMtW=ZQTYu&&0y|E5sH=MA zklchx23)=wvMCMzrhwOAwoNTC4D{Q|pv5`udlHWdx8%FAv(oD!!p|r>`rC`~jtXJn zB1M!071YI5XkxgbB_YO=>o`n zOUhpO6{kTRof(^gQ||L4-!IBc@-;*b@vgke=?Vp-r;L2xdC-g0vRUTjDY{h1yR1-4|T= zk37tB>Ewbqz}WWIaZ2lto2T zt(5R@G+X-V3KMM;DPPe@$8SChzU|c?JRMq1Pw-U@j+X?N9cC>-G9M5~MLvy(gvF^g z6Lp`y=CBOrOX(y8D6*v4O( zP27cG=_Ol+k)4Lo&IQ%VgGI3j1pvtdZrZgccM)W_3A%7V)q!2=Zgjxaf#){(>R-e* zU@x5p?x+EO?2WF0w+loFHsr_ghqxC+dEFs^=_Z`#hGFlcbpVO!Wt``R3o3P|UI!C) z0J0OW;^wIWfa#OO2;eqE8QeyR>H}E^1xOGufGXZ$$qc~kpA>?*;B;Rwn zmKQMPipJ+MLF!Z;&NH{)`!!+BMyg7-qhKZH)rSH6DF_T*Ak;HV7zl&J5KyTT85m2~ zIZbCt!i~LkdN00XA}}E|U0Hg6Wn$kvL-)B+Ivc6het4N(^jtOu^u616FMdpCeO1Ix zgWF|Hz??VTcI&HWL}KA=9;Aw7sRV4m8U$c($%Ps3|Qv=Qe|w zzpkmkrUrOBpVOr~X$s`Wn)G*e^UUh}kFRuYqtKO^0a5&};?Y|?M$vz7$K#J2$C|Fu z(o&$Mk04WgBHpbLiFk_)#xzO@A}F#>)uw1ml5F?p=+uo5ENP8!m%f^(csGfruNN@A zrrNxDeyL3n53TAvM@o10ixx$ni`@LAdr^yI`E@mXTwiz5rt>vLfD+~RVf;mvQ2(12 zDa||;C}aP?9ALcojcdwuya(U_yH0$9VnU>vKL6KeqMb_z%OMmzM+llTo=phwY|jWx-LEV_5-5ke#0 zh*%%M+GZW5(E<6F-8H(jl$l^6*j(*k@7A&J?mA9+ zBz#f3Z4y~-;W))nT6I-(bVXj0Vv!fUrSeYaXS(}qVI4>DR}srk9A#`w?gja1QR0I=FT4Gbf$5By(EiHZM{N1BH z10w92LN{F)^yv6kk4(Swr1jt>C@tZoPSz0<$(ohL+(Aj#HUueGc$r$sDaPGMC`d!T z=m>bug8eX_@l63aP95b|ykUhSd}Tb|;46l3?qzTk5jk=AKnzbN~hBBdWYrp`a8s9RbRIe)48 z%Q#b@eg%`FI0q<@1XHsu=&v-}%jRk>#wQDoqp7AXQIdE0{3 z?>9X^ppe3}U@Noi)#ttEb!VS*>pG$;>-+Cca$`sQPu|T(Im2e0g2!=8nF+Gd$;ZeO z&&Cs){tSnxV|om5&O&Z$JmcBV|THr3#(JQN{A0fDNpm7?W9OSQ)W=kZz=R zx))&ywKRsZr8py7DMf0WU7-^Il4oliFT87-4U-kO{!opSVeTF|9EBYI!O7G%6OfN> z{0#;ib-#;sAe-oUa2!t~NWh2-*t8smqm$8Rp&HIT%C4_VNh@LMw~5J+rK%SPp|@?rPKqS>fLUg%T!aP0<%{Z_QI zn`GuhPq|#^)^})bRUi#SX!ZOtIfiJ0eyplVe>t~q8(r_0`!(TrXHJvK%+koW^=z zou`22Ief{6zG+4qyt_++v!GX+Ywnc;m-0GTGWPV{EBd}w1HcPLuna@v;t4YWf zXyOgwtB5>Nt#F(|puN4iyLtgDU7E#0^%9a13U{wOAHAnpL3(Jo%7{1t%(VfD#T z(-6oOx(JWfGJLkEY|M7Q2=IKECRmop5U^l&818u6!Vnw%L5J?i>H|pdvd2rg$qVb( za3q>?T^bu15-WFC+OWy$lcU9K;Gel3gx`Oydz86LCH??eAG_mqj=|9r=Q3#h$RgXn0Q;&g-=g2VLZ30f*|^Y<%N#cfO}u4dR!A3{EoPEboJoHkvjECb9V_ z%mM$VD>%<-?6If8lhn>vEVYY5w@vJ`GXI3F5JkC(iZQc#eUz|qND@8A^A zbh7VpuLUsV{C17};I^Tv0He6HZS;(lnPGkXpz2MLpsLCfn&D9Ewpo4}v{n{c{!4zP zLgd#2NbyhXi6xNkxZml`7T)f~)x5C%!YS{tNiU-HKGNHIHm2Jr{|@f{N1jEO&Jn3%->r!$n;! zlkknzN-`ZUli)enAo2G;KXijj9JB<$>u>8EDHplYBd@V5ch6{&$(gZ{IPO}X@k}l* znvP7kH+ecy+h(u3*wEFbjq7}ioT@94wcEtS+9@VhU@4q#|EWMi0;Ql`H1MQ$B3IUM zT$&h;aU_;vk4!n2A!*R*jN#Qs&*gXfXH9(uu@0Kx>!8gP=kK;M5igdk|X2oVG#0n2oG zSkuv@_0{+#mm+Pf`=sv{=M&E*@6)qb+$9ASRXPX1teAOz%G9`w82yAy4yQX87qgd> zRVM0pie6C~fwODj!JOdu#DbZMi0ac(B^IoBjX1ScjNh87vm03W1J)pE5iO^t*^v{w?;dadpq zc@>CuK0$}GP8$k}%Z`p=@|veDI}zn@(mcR%k(OqB4=byP;K7#uNx7GvJR@YAc5v_7 zBi|WrQ=h(jR{~oGx7Ri7+33>}f>ekopWj!v$+!DoP6 zUR^P!UPT-t4$UqiZP)Vy`+yu%`La~XhMYG&c8GVkXe8C%k#xTnVNeWBw*OwE6uDzn zl>UJEheE?c>Egv3k)7s%yDM*T#TmBNrYtci?GXF*3{fuNF9-4PVPh+uoIP^x=B&v( z-yqzgg$oL^-rAE=Dtj(xBLJmB>5EyF8s2yj=5Z#=Z6 z3afF;g3S>9p6k_wQ@9SfSt6eY&S1j-gsXSx$PFwn~&TSIlDOL zw3p19j{-;R=jI(?pHQxqooz$#FG~*7&s^6ktz*#FSQpi=(;c6_8<+DhC6X@!W2fJO za0+n8jZR$4n&XC0T)h!KJu;Pmy^HjLZ)lIRS?QtZI%Sltkktx$2{4#v&wDSLEvn5% zxcXkhZwUyq=yca54K~?ru{-KqAXL?Ie`o&hNB=WZ73$49AnW^)mOS zD`)nLZ6sUT0}Y9WXR(k|x6Sv$64WZY%u;4FRA0%>`GjYm39VKE#TSYpyZTD(2pYfh#1J!P-@n|?!DU3|D{C0mvPgvHRqS=Ex zdsOSL=VbTCOkQ)$HuTsm#?LrD!%oE5U#H$gbnj17D{;CUSVvqUO~}Ni<=%~1F1YyB zD;Z{twEI2Yp;G|qS=K86j)w+v!)cR8=YCw(^VZ-S@5P}s2iT-UBCLQ>iVGWZV17&X z%x>8=t17&>`usByTrae>6<5G--4k!2lx5?*m$-a+VMG*6o5lBT{W|ivT?h~Yhyewl zB87gLpv$$Peeyx%C=)V2Xo=FurIkBAnbfWXt5bisCbP?0Q zh+bC6r?jBMcMuZK-m}T}+iz&zoyUFlwn&M7$G~4>jjfZFQJ>$_#`Np=tDX}R^WG-_ zJR!HJZ!Br0B;sDbjJQ#SkQ>YQP%d5=l2p)oP&Kf?%qqL$K|>xR5^6fP_Pf)L?BuQ@yf5^LbS}5%Z{D zqDd?gyi&o^bZ&V<8b_FL8zKCdg@Ae3I$p?|gWC$P?cm=8Rj9YpTZPhr3bWKRkBlk+ zHg~t30dI+bWS`rK0;kl8TJQ)!m=~h9&ys*Va)N{fozQyFKq@Lg9L!N$m5rz_MJiSM zi<=KJ$J@X%n&l4ZI_sMt&%d#?AwP1TH^V%FNDaZ%Wu$nub^98&4O|A=g?{JYf|ti2305FaG5a+iJ_`uXMo{k4 zKIycL08`M1$N?no7+~yxBiCJefdmN#Q{1h-^9HsO3)ZQVqO=XYZ|Qx}dxY*9*s-Q} z4vYAPKcvT2Yqtq`s@NWhO3q8sxCA{8A>`3Hp4#`^K5}pZ@GI)7#CnKqsx-x%ak+|9EUbQa(yJ30rdb3pdilfaCbg{ zbgQ!s36kf@G~q8SYoh#oDOk#q9s-YO#z_kA76mo4B^}GMh;MX8Ehn-L06qHQ+xVOw zbOO}`4hT7IM9+NSH+0^Z0fOFI>HTuk!P`@`4iGuIL@jM26)U3$@*u-U*B=OcUHi9P z!27nFWWVJ3-dXW|*Ft|6k04)Nd0*qVL^Ugbtj!zpA+bPrHnI^v7ZJR$1tNmPMsA0j z*{c)~d5nU`gm1S@om`3t}BKM^ii{!G&U8~QP^ zwQ#)*Fe2`qM8q_j%WZpG5vrr^%WM`9)b6Mmm@ns6=;eDcE z)7A)^TZL(m@FiJ{011(HA_J)a<10Mb71~p_Z^n+uV$MtfjSxPvshvs%&^Rq)Vzfe_ z2uKagi1U;1k&&?XM8ccuy&h9jpmhgS7ywDf-vHX=#%zXIjqCI@m~jifPc0m`5C<1* zcP=4<>|C0`Au-2c{K3h*WF_x1KaJk$VC|0`kizl;0*D`WmOv_|~T zp|wAd#@Dq45R+Gu6;#nzmsF9^S5{GyloQui5fqXUbp+7(ghW@EGA&}e~0-`IQ>okXi^;iAN-wxC+|P`JFn*47DIBj#dd@cTbe1U2}OO$ zkROk()rn1UqzV0VbMTwk%PBxtSX6V`G)*sh%^Oevj*lzkOrxNP*@k`^^PMq!{3CU- zNCyzO_vPM<1A)e-gPZVkD@Xq13uPPbRQETWb3nI5R-5@!K^IF;XTrop>4!VP$3Qcg zfzZyg0_WwTbaKO!>EutXZ6O{ln1~iOzGQ;yD7&?9cO5e1yR%ACjzJNPrHQzoE%7PD z$b7%H;F=wtfE3SX2?fY1G`AfeK>xs+HC6uh+?SF66@iE9Z?X2zTf_g;efx)@{|Ys- z{|vQ%&)NRE;2o8={x|*(Ja+3@aYnLcaRyB*jct#RkHdfD@A$3Fe0SLHewn0H`UxxN%A9|#!w0m-UpDSr4gox-wF*Ux(Zr|gJ8X;iGuSb1zJ zmAf3f_-c{0c=P=>Ywug|>_tYMRP$hw3&X+WsfQ>O_|us@8=^_h~}{blThe}QW7|1D!P{fTPe zKTMo7U2FA)U$AXnc|s;qVcCS6T%SPclj(mWpf#D;;1b&FZzatpx{Z(!et7q7fontI z^vecl>AT!D+GU^u7}c$aDShErZ`(twdV>X~OD?_2e9GJ+7a7ud7#*h=p{D-Bqj6DNf;d`A&Vu7r6JM--R@Jb|HHC#uDYbFUsetM+n#(?0OJ2m%l;L{`2PyV{|vvPHPfN%VuWCs(K-w< zW-eiyChKi8FKaP$!NA~Oyx<>RVE#FZ*$>d^FcJJ%=r0D((xSi5erFIW1_XTff?{2Q zmNapdO>9`D+vGEfnKwqDG%eVuE<5-(j=KOmXMTpIO#jV$?-?!6CF6^JmgGojEBmX7 zEBhiUE8!pXGrBagKj~*z^r-Q;BCcp(0M6|A1Hk&%3+B8#^#!HX_EYeDynl961Au+X z{n5Yw_W+gw0R3At|Hr1uzw=Cte}!o~+`Fgaoz=-7z~0cfj>)GFLc z)V6?hNic(GImv>=$15JGQr#SYrp-p%)8+=RniR(n9=a zR|A~?M*Un9>gK3nM*W2*l=$x{nC@8jB z!8vMBb4A_F;HsU4ROkmkH$5!cc}j$!Z&wKIHZz{*Y8|ER@5DTT#aWP_hAe#1xJniE z8j|84s6*oCz<&y6;{?7 zM%V6Sj^|nNv02DQm*@VlAJmIba|I>QqP~w5qKLc~;{3(L216-5>88JT*^9dX|iNya13>C~dvB zIP{E|5W)$Hb4HO zclv7oWp>CvT5|sty8e0>|Be6ut}JWwC;wkALvHrHX+l211ww^`q)GJ?6{Qdjt5mNf zI#3i`^vB9FvS-FawYj@YhlGTK05Jl4OoxMrfc7Xq3LJ!EB|<5X<1Pr25J8KBt-1Tx z41klVKW6~EZ9YAAtf<3sWlI$$%m0ioD7sBUE;1jRN>Y>0^eWcj@;cvl%pO$~E%8W) zs{mK47-hRDKFeb6u!3_8f@_%SJ7E6i40r>RC4#Ra^l15OI>` zN|t&=yjj8ca`F8+yE?E|k8#(cZ9Ahv#dz5XOE&NP?N}jD*EIixbM&V^_a@t#G&$0c z;PeG6f^6a1m~F(eP2A(zhM;#CoE7E`l3D>~aje@xxX)>EDf@*^MI*ulb$|9kdfy%6 zdX0?g8wBqo?JgiuvkloJh z?WJ)r?J<1KA?Z9*aO#O*wp9_wJ87wiXA&O^@e-9qaMca>5$`xYr?qj%0_tjIMo~N3 zbC-(7PX7uuA4)%wMyrUJbt68illz#AyA6Vp|r95BHg8wy0-r1=A25Xz$rLg;b6w=Cq0w?3JU*6VqaI zbrq&#h)oC3{pQYRoMdW*pp+w5(RiogpAt(#V6z4SV0F{LZ3gW3y?6pvOW+?h=wJp2 zAqE&?1}Kj`z8nC?3~K=o8N4Qz{G4s{J3HrZecVE@>sR%mk<=IKX@+&utId&M zN|;%GLC|9uW{>z#i8r?OQ0$o^@su);4ZU`P;ZNCriBdydSV4EW(8AVJy@r-dCwylM z(Jya0E&Cb`!0vjXP3X<;`~4>gCw}i1j1h&0XgoFH`v$@9vhAOwFMJ6Y%c@y#g6YYHd(sD=`(@p{6^3Mq3`)Tus&gas~h^0R4Z_S^a}-=45JaX>a$Z zSEBw`KL4-rYf{3PT^|90=+g&OvIbG|#U)i^&a|q#Vz5psSt$k)fo1&9D}bgw5?j1v zQ|<9Ryi0>G7MaFUqZY0|v~^bD$%_zQx5wEsa*wqCVxN?tnf=ERG?=HT9^_FESM6?l zBEXqk@|l8N;B2Q$jml!;*}^9KD2PLCVP^@6DSIt~v`S!vsp_F|c=!(^7_pdnBy5)| zCL|nHA3NPa9&p1wn9--Rh1zft{Fo?st!;s83_QRFrYb!r(s^ONUhKD4vf8g(QAjQDDC+j$WMovmb2G3EifDlyUcHz$+{Ki$bs z&bmggxt^C)(qKpDz$%Y}xk6fNLwQpr4vq-kPk)xMfW&1+~g` z&*pPsEG@xc^bzBp%e<2->qDBdoa9{19Pn-Y9PV#JoE2{zXOu@GM`%ZOem$N}m)8X0 z_FVG9Mk~O{q-cuwCx6mAJ5aJUioU#%>)$fQ_yOqtXR!IJyP^7T04Q3`(gu47_3*SN zt8tIH6A7RC1;X+U=|H*3M!L>~axYvrEoR76)vZG(5<5X>(#cdB2nt1Zl@^L6;75bx zTH!|uzO7a>1q=(n7l5S}3N2D0ZTgw~C#fLPzKGnu2XmXwL?s1rFj#u?)|W3j>}VGD zEs3@X8!#d+8N3nb^suAh*WyXQ$8Wn6VdQ79oBkQXQH=aT`N09wO*vb zYPv|=rLrZ)2AtdO%el9#zQ8ze*{o!>AupSCqw8_3S4snSk7ETOZAQaiJr$ zwY7ntK8!}Wc{xbT!2+99u97@k+pWyIELCfT{IpweS+XfqZ4ILkP&+ZIBZ6?!a=$M> zNtY8YlI|@jyDpf`*iW!^4Cd@ zHwCm`cPYulBB`PAMk(KtY1p1Y75}+3p;Rl%tJdRm+L(-mhN<9YnbaH34T9&Hhwrd`d%{Kj~qwJH|oP-erqRx6*dJt1{a zEsB%+i53%&`#fQr+lq_Mr6J}I-yRT0qQf=@K>1c3s#&VX=qI5}PB)Bt5@maF210~u5JzLgk9kOqKi#W*Iao^ej z%PeH`3^seg)Rb7F)0>B_*9fHWnqV;G`ZjFn$W`$`xwPNmet~i)%j&aYPvt zd=Z>5)!wDtOOlI8m0^>nZZQfcZDkWO=`yWN);o6#eJ@1nDZV3+$R9o8E@tq9Ui&b~ zgKz;^ha8e(l5dt?p5FL526cJBr$DC`y}4b0Pl% z@Oftq)__yY9B@w*&9LuSf0}9z!Jj=KE;VRd@$xysxGpJAERA7Tn zvVxx}NBdjg$CRM_z|#bk1EV-0p(y;#+JWnfA-}4G&t^ghx}uNOvbSt4l$qP)V&V4q zsh=&sgWg;hVl-AKhTe=p`2zdz)%cPG{)QxB2anel8mS5_3~6mKaaVRo5Es8jhRW>k z>#Na2H_o=bGo}+-n|5mez7T0H;E>AIwP2UZN0E9{WRkc!hHO{t(asao#VZD+A7eg& zWJ((&3ia|t`!=oD@H0(vvY;T9>KSj?2xPH&ZM5K74^-}C2f60b8kwmrC*X`V~xT@u7w0t7$C;xlnYNG_J?%^m8K`uxh@HF{;q2Rp()2PNo( z80a%$#ZT#4-@p%Pv5V-ri?}BTEr@rhdkDoF769gKq5I{krVDuyJpV5A2lLne#1~J^ z5h3!U;v!%Bkh}b2!qa>xTwY%(KCYm6hA#HgF@{VZA$*R}&FYvj1o7_9oB`%IS1b&? zA8h5f)S?1tJUs9-J;=AtU{9n+V9G=IG*hCrKJ)I^r2e-$Ce2A-;uj2lu{f4B{cxhLVQo zgilYIt`gU6(|7lCqhx;nVArfj+bGx;uA%RJ{izc0TXg!jG^+<)ARm7C2T}bSs&BM+ zWQUp3xjgZ)Int{q$OjRU_6Z8~^d@CN)_AtUHr`zgTt(yxI;uD5Bf0_ZISSMwK45Ib zHlw7uLU0IC`yS#9;>-&Q@K35|L^sNsGK3y45ErfiB^IJmY6V@d(3DT4KPyc!EX=`Q zoYAnqosiE0fc4)B5A6P^ivJl@qWzPYph{!JZchxMUAasOM!r#D& zC>Tt%sW5~xzR%9f#LuVPYmaCpKIol}XUfeWf?#ite(ldJ8>*yj3+Y1f%0TbWn7%1W}k z+XwJJlw%ytrM}q<4{r=%8b_imB^L*^~rbwqcZa*IR}X-QIVCSluRMSVlSL) z?yA-E>4?s5qvgVqBTi}y7myeg9ak!*S#RAxTR6UzRI|(rZx7?Sp#Gjwgep1Zv<8f9 z9lm&x^Pk70o=nD5DW(heCKn~#L4#b@!$<1nAf)q}a{nx+KD8|z6VUWvj0*RO=X#Kr zN}Sa-JS5#Nt?}G*AI%)$1`tTH7&#dXK>`M_iYXW2r}alihSeQ z;~O7VJSP9+G9;VIBcJ#r1K7uvwvc`i=||J{OG3o_B0Dd;hDAQ@T}{cg6Za>MNPZ(?#qRbifb<5DiSv5h(-?kJU9uj z>_eLVF|tI&?>u=1D2(=N@mE9AQ0KFn0gWE_s@$0ws+RU*g41VL(7v+39*sUwtCsVV z5=KxE+=b=x(C<=0Jix#CFV|ibSFgpvvb160@3tH&yG9W~^$!K4ZHs?H7I0+I0d9B9 z&yNA>2`GvNluYc3H=&zw&}*tr*DnHWyCNSwBghWcn?9aT!-$nd*f=r3n{>>s&nl?h zT<-JT_HLom%XeM8Kx1TT>9AhdgoxaPY6H+SBF>APe*+DF-Bm#8yYesLili*E_=Id+ z@P+7V8J(sEk0VCxi#E~`$)#%bV9ZZ|7G}^hEhf6>yA4*VshmC=&a&7nx5W{`iCb29#1#Atx<1J(I-z7h)14jriD0 z8nzgi^qVU^Xg5^aZg;qV z-V!~@_e=Gs1sBCv^q^l5f(J!j|P+;(r78B;vRuh~RE zF?UI%sh$(egJG(FwySg? z_%QOJo)6^+%saCf6DT)-dj~_ZXuhcy#Ql(_v%^135hqVVL@W`zP28#iQC&b0lcI<~uXbnhEAuB%TX}LruV*#es?P>jR8R3vX$}W~bhGLtAj+}Qph_Am zjUOQ~`O0U|g2`xd?I)U%=Jf}q^`P-kwvb$ejk?mWL%|Y*67$SC&;!o%#yDrI-wAQ& zRs;=uM5Kca3BGz)sn3v&5Ct=jlr9EUm{8Q;*=if25VQDpcfw-3ELw#r!-~T~5Ch>IM$NzH8Q|NzJKjs5q{U5pJ zzb5XC|HMiEwczs~)cv3W?Ncs0e`#*n1o!E=;fq zY4`Us5TX7=F*JB#P+<`**^zY-;DMzU?P{Wn#!t>0d)hyFU37J?jCnhsTEB6r(nI2R zZ5^gC++F!~sQ=XKDEIoA&dRwOR#{n@=6rN#>DnX8>RKNJeR{YwKMA!c%WXXg!%UqE zm}P2ay>gwG%DH-Tjk%byps{QL8$3_dC>N`FBl1IwOO@4Vglb@X0Za&6RrYv9g{U}W zw8r#@(V=IZtIG5XRNc#}f+kzCm8~{frLboXIe(kFXBV4HvOO#*vY5C78x_U0oC9jZ zqn%*hVys1}vP_Y5-BahAOG0K%tC z=G_82E}8GvWLG4rgcQs$tI8}OfV(ZT8nh875)`YbM1xL4f{bEjV-W9G>T{$9Gcp!L zC~OM5vkDpu*1_&Bu0zF*+r_iL$a6*R@X074 zM{bet_^ZF5SK!TrXn>B0NyMN9%;m&VHZ#BmpK+6K2kHJY%|rUvZSSplEH zB+^q5oL9ikeK9gODB#pfVM=YE^TfQFak*jp|ud zc`^PUg&;7tRe1XObTbcZ?_A6v$Vw`UcoD@e3?D94VhXc{9$4$oG>wh(vGx>-%v;@{ zHMiUBmCe|)UX6Ix^cj46?dkRA{#gt0ou(Zp71#HwIC@(ul3TZ%_o`m6RPaBqU~B_9 zHciI_4MTVORmzA%xRXauB z_EXDt@wc+$~v_~9? z)w721jwltLH-@AWL61B)tEnJvpp`q89BSwSZ4+v$*naJY+kr88Zc`;sWu8jy149l> zt-d1ZsKU3#c3RDBpjgd=T8hj#Q`<3_3BJw?DO%LV3fd9^MeJ{7tCQ|`9!o!>x6|W{ zKF5`jp+aLtWO-GY;TCiZa?ad-RpN&ygW395nyRpt|C&}V$PmvblUPt$v!c5NGcCf3 z6_FpFSk>jd{LF6#!HUehVfDi56MOq%VdGS9ElIpjE~X7Mr=eo=#&1I}sj{BRl)qz8 zYzDo{BV2Q)$7?9=A=>=fxI#VU0IR;U0K#K?^C&1Cn(t-^GfPC%CEW_;_$A)pHWM?! za1%JsZL0BufDX7q$~J1qQM*#Q(8a>aBB*wJKrjNWTLImgxlQS&-T_7KAT8Lilmn&_ zvokoiC8ANpwGmT#jEVcL)*$a}rkV?NG=$WoeFLhgG|~73*EW>a6H9ocSOVb+ef*dGM#NeMuHW8Kgod*0oChny$lTCB(FG(H=pQubyf~tB>M1jPEXf%s+pNl zjU+p8#b!RsGMGi1F=3TNXCxi3a+_3<@UbbfR9CQ8|0h#_=5K-0CT&*AA>q zj)3Y=sq7tLwdd*3j2CdFqvU5_g>BKpJZ);Sf8%RrE;$~b5Ud!n0a@n#weIIkM#lB=c`(`C@u z4NdD|t^7WiszfK@_NxGvn(<#E`NSgiHF2?nd(ye^#*if9=+d4eQb$s~Y1&6`QUf}q zjVH&)ue4PTzNpTPCgN8;W-0d4uB=E_OAGt6EzFS-zr-pE-Imo1diItH`6`EbRK}%A zda|R=b|AI9%h1_$m9t0csWR6QxzxuS^-$03l=QH<0TK3!8h|EW#@aWQWm!q14Lm(L z$-bTOlmym)4FcQHTF$oDc=H(Y_~kO>@2pg{Xv{)owpw5`={zp9gN@$yV&uT< z>bASdyxlxCi-QX`^5Wz6NRRJ)#N17JV0~Nn+pZ8vXK6~7p*}nWCjLBGk=>Qtw}Eyg zZaEA?_}d82Bp-8~9CY6Ep zV_7ev9n)IH_5~Y9Da7-EGSPF%uEn-u8Il@o9Y;*Ywuqh~y))SjUYu@U+gq;KhBi5p z_3=)igx51(KhxJ5{sA)fdj>KHn1S_kTv5hlESm*81+~Csw43U&n6kNwix7lR?IKtK zwhF34kp1Y{0~Ps2Q!TqYI?Hgs453tzjlzW)E7YtbmVnbisQWr`VTZg9IU+b?=Log& zlWR9{=G=^;hkX!6IY@pjq72K)hvQe92-i_f!8G z=bFB4lsmSvS2Vx&0O~{f_9Ws@14E}a7lu9f)+0E3c=V-&xtAUEMCMv|s{>w8^E78Q z(2Qsc769Y|xkmEB;SKt$+xYHmIoPnywxaimiCWu<9=i!#Yw664Ii!UZgsU5&3@U|j zeYcL+GtmO0%X=!zHreLNcRl*b^Y^u}P5)N;jI|`XDW+9djzHb3?wf3tK1T^JqnpCS zU61Aq1q^e&3`n7fUt?>aUT8su$LhM0Kiq52=)M^Wq2Bq@i{+LWm~EaKvf*D-U71*~ z{m_9?F*)^YV{Xgex}b%R3Xs{t5cL4!Kc0weR_+1ea(;|!#!I+0vVjz23U1bdm!7#; zfspePIU{CBx;BYbfAy%R5GC~u#b(sOiuGbY(8YZsGZ?zkvuC1tqL72aYkFGr*|Zj? ziGcwIn(O6J47E{^7eF=6Sw}dHo#DpbP5Mw`WdNJArNP8{C{`Gq%_6F%MCtPnOvHi5 zYiG`3wa+u+quXe2!jzQ`yvziN->k$4ad?1DC*Nj#3r;LiDlniKQ81oAfhE%qJ!c^_ zshWe*to#F#AiNf(5~h1Sp}fs$xR9$F^>h@vx7;JizT>E zd>T|mVrrFtET>CoZ4c_C8$CCam!=0Qa&F#aAOPZGC9@ZtRHAm)8*ZhlYAXE!gHc`d zfJWmt#tTPN(KCimK>eLAXJ&9D#q?4WHFn4G;DNvdcZzJ{2#BU)#Ij{sA{o?CM^V?& zj@Y0xi}&V5Kv+P2(p-~<+P2fcubciV1y?Y{v>qpU>{f&Cj**|*;Jb{W&$41A{g_ah zFAcZtXF7h?gt%GBN-2xCNNZwgb^NCd0QN9gZI2BE_Gn1$POcjWcRFrgjOkGA-U_4* ziSi1C2UmKuA$eWGvW6QIbPbV*()eI4lG^B~1}F9ul?G`>x13=~UHG*-Rz^QrJr&#c ztjY2f6*n;M1X*MA+WMWX6C1F1?t}@WdQDjFP)4>;N42rTI?ro&I*aTnv>L9axU3@> zQ^arlww=TFqX*xd=6Eu*4oghMZM@kHa2=u}nR$fU*;B57*I_*1cB~QY#}C#3noW$c zd)TGpytz``fiMA?sN$bnsMX*8ws`yctq{<2?`f&*fi(3F%1&`$co`$HET_ zQ_sG`2meOi-R1GM!qZAR#7F+z3bVdzNe&Gu_H>IGr{)Y~M2?d=xLKIy0NeNeVI$xq zjMv2kADViI9$^wE5rSYpwdW3O2i&e@t9K_0 z{t@!}xe=}d)b&&FZ^WBA?@lxa?(H0ioGj?)ChtzhvQs{nn#Ws+B(rt2yH*(0|-qi@K^oX~xKfDv->?8NpgWtg%i(=&g>*>JO$>Fa- zz<&aH>tyqs??Li2$+KybzL)Z7{>JEE;L`*4VBHR<%Lep-m191!XWN+~{9x>zB7C)$ zeESv5kA5S`rw90q)V=iMaS8eJkf$e&8{$R!$GYe+FOg?lTqwfN>zgqEeW+*Mernuy zwCkgOT7861>i(41XRYoOz|ZvSErgFP!p`*}c0fJw7X8kkpJ3jca@KsB9l`in^iS*| z*W`y|uS17pcD!lVqG85-o$H|`kT&OqK2g^fFM-S{$WB!f#gM-gNv??YdBgnn_WVG+ zLASwe*`J>QyUzgmX`$SSUJ_&7fnJ;ma!^N(Mga5>M$jQ&;wA7%_Nj?H!!Yi#jjp!_ z27eQz^C67*#bbU-knof3lM}tz&mOUdb=}?U`0~8Zy=(U#J%j8Z@}=<%9>J6@$EFFT z%L{q`$PowB2YsgLXZ7WSzg}q36E(f_xdlKE+ZW2=;f)lz^(J~@{?YCq2TSBh$Vedp zqesPdc|GE*Ll#dh!A>peg!)5=Hr`qyNBwypQ$zk)HvgJ8cs=~thJWk-koFG1u|?au zaBSPQvt!%bv5g(uw!LF>$F^>p{^1-TzDWQ(;?KnyKOk@V-6y24zL_21PH2F+k$G+svoCR?KJu+q!h4GB zH%aj=B*{ymZ?s3AGUz{wC^zfTUbzVW9KLJndmF{+eMMd@*y1*Wu z7<+%`^(700GnXmhi3e2Fn@=2lPn~EP)}3}27sw7d+3sP&cZ(vCbX{MhngLlMFXuQ?K_L+!3~< zo1_hG%m%y@b+k&*7IRD&9JvnX8m-M-5fBCP2@16x{syrxNGwo{6o`~+LA2L_;TjY9P`&ClA=k$q+hxfN~; z2Be~VbVTqWqI@zI^|U~L5u9H8^nbzMK!&_K^=>ftI9&>TsyUaC+!crSP#v}@vR(u6 z;ydK@`}o@poJ9c|!o6ciWQVz6#>T{Mb%due$G}A|g$EbV^X1 z0i-;6_7&|C^P<$T&X;7_+R&XIKE{2Uqk3n!Z1=CqL6skMeP82BkoQW01$+? z#e?lIaj!`aeFt}_ynhi=MFJ5zI{@!yV|5n*MuOjiq5Npr9|_5mLL{Jz=2zP2pjq%4 z-ZS?4YeK}*`Y<{$ePuMz7~Zusqldol#iY~q(WRJBFHfhmulV6xV{1>V)h1sUHAhyN zS*?;kvh5aI(|1Hy8K*X|b_7W9dLKXUHR0JGdDuB z*Fnf0%6DziPno)gtk3#%j}P$q6@B&v#zgQB(xi?1*4t~p?k;v0(iPBFjZ65JCoYDe*|HmLCO zGU1;)R1k9Fl?L!a>Nz{!AQJIFP+%Xldw$XP_ak65fcnDOkIP=a1n+$THTCiaHSM;~ z+w2j3E`)$d;_#0rMS7y$wFK@~13pfg#z6YyonIsA&t-I77L@eKqERF?Cs#5;2mggNA(2(fGZj>NU|G0Fm8%K_~8LU zvd)mu_=p6Dtlb2o>VV~+WS~JNWBWq4_0+`P=~R>Pc*>&_z1U#@o51f0l&%kj4m${m z0UAW23%V*jYEy8?keUU2Sb_EZ$qwqJoa*J3$isD8;#~(=0BpG@6m!(XSs&$-mgI|X ze=FpD#$R8e2f-Dv;J?#5i%VydF%(R|p@G4OPq)e)6yJb!?F_I3u0g@IBRixR{GvPD z0sX|!aS!*SJM@+0`+}?ih4QnnuX`i5@bIrjfFBp$FQ3ADTgd~=;2ImXR?++0>{=0dnHPJiS z;5V{={>*Q$hTtZ^`px?l_FY%-85X(cw+-$s`!aL*&eY%QJ-xsik>@4RPn5wOvpasS zctenFv5SseKnHT%^d7o@UEE5zPYvp~`WWS3fSBT5SKQN8K?A?2qbGs@Ce9Z+qCvuY zgybVWh5Rg2dRDZ%0)ig`>j%7>AEq0~C(kZMKW@1G=w1!zCnUv>;5ZV7u_M%cuuq`t zCrLjyB;RAEHJc}7U%~{xKma7tcSyPc>=&-gChL066Z{2qgWL8_+WR$F=)$?Xb9Czl zVVgrHhLLf2ZE{(k0+~!G<`o=h`JCdbcI{ivKlv zAQ^h+jvJo~`tpPMFM2;AN^sKOeCM@)6`&I5hi97#8Ls{hpa~K2q_=roBj2xNX zvtY=s6#)7189`WFR7$t-{vtJw870+MP{R3#*=m6%rk?WL>8A;yUqpQd&vF>y@OOHL zP+N=8uKpmM!@m6x#VJL?JhpNh&1#JftmfIeoT?^H%q0bqk_$Tyr8bxRv`t*-lh#_& zJ-K;2IO{8j0rHV*CJJKTC@$OX<1IHx3xud4OvoOC^0TT09Jj2wpM{jqVklL^2L1rWTXF#J^xoM(#j0dvFiuxS%*_ zUvB;&L7mqQ&S_Fr3PwEre4GiO6j~OL;^Df{PFB={SWxt6N;cn~AXK(+y{RVT?1@l| z`s0sj@`g{0uF5X1L`&tXjEbx4LY%D(RPVTX=qr_!^%RnkqmC6Jo@br)QbI0cde;*X z;~OiEt4xz*5Rhc^fx8D_Idg0a8or_ z2b=f2bVn#0KHsA1Bu~n9CyiyMO+fyO+HIVeCgV5_AL9w-A@DP6RJYKS_j}hU*SO7s z#-G9+$%BDrNLAbV2*=m5!&lrv@ z7ip?j0@s7JKil)C??;%R=-Q>p>ACMX->Nyiklmj{qsx=4yoUxy&T-IgMG~M3{x)KA z7S!6z%YUjVIZueaKgnBmVFUwcjT_Ed<;%cRBK(20Z>)pNtEZwwSd#h6RB+O1s8@Q?3(3h`72CXHmHBq0H3PwbANg z!?dVjM*!<5l?f4z4HxS0Qw4f?SXW%c?k#rB{%JWq_GO}FGFi@fUl?iZ!~qGlTa7sn zSz+l=&X{z{w_AYg{Us;kGcE4MV5)nVO~NwNr2%a_Xd%CXYRFFu969KsF=OKRan;2#hq#Sc~P=JfHg<> zHvJsrv_tLUT5|6il%M#58#$3khodlK*?)Pqg1=PBzyKT*fv3;WKxEf0u9=}SZN+J{ zSVU-I<(zZ+>Du)4OIq)Y|8qG#__bQ#WWw>Mu+yKAUJv)vV5T&vwQaag5Qncw8fgeY zJ&;*_L+On_9wNPKV>fMn*p!p5ZuaapA2H ziaYMZ*kuD%!aC;qJIZGxRRAOVTKLBk1nTxI+l%Pfqkl2G-* zqf2ZF4_T9*WQ`a~7T#48aO?5%!nAp<9ahdQ#%Rz50`7dqe19wTO-%c=?Cw>{bmMji z!N&fYqJVXGVKBR(jZk$?%OB5*d9O%xcIad&d-JZB$G6ZA>5K)pUL%wvy=AYj8WF=w z2OwU_=oWOA1>waBV(#I%#M_stdDXTZKI~vl1Gj`f2QhL+SVT%oD?8I&41kHSjF<-l zZ6hm&eMj?XxE2_5cyai^n+;$+@o}s{T`}uPzaY(EHDONfrJF2>cDZVDdeRM8+e)@Q z#v0r}Yna?&53$yJ3(83}H9i0g*?*YwP2%4o=v5L3fe%q1b;P8OSpY&)_4k7|4hCcs zXJ#rOe!u0k4u6(d0!QUzQjU`>8tl)bwbu0_dNG=i#+?dl0GpPF_>?m&esSYGP=F;q z$;diiuBR{W?^~e2{;ZFmq>sZx_1k0C!k6&ZqrsxcXX%TM;75AOi^J2U|H3Y2`+BjO z9MgY1h;x~ueSdXQMPEvK;H1PS;oxq!i(UmK7*Gy^jB{Ef0z!~+BFa{rYceaN5>=6l z1$hGN})jFx9vb*6NY8)pWg5W_|GO3zX9Sy; zW6uV(?FAy}mZzErg0zhVWQXK$&kwXs3%WbSGn5JI@Ad`c?g^x(4!YYz3FPdeQ>6m5 z%mL9$2xh=X2=tW<3^>l-p8@af`A#nI0cA$W3^=bjuQV?`iW4XttZj`RxbY6ZL2Xk! z8qk00pJ52Nq6~gP{sWU)IEQ76^-YoRN&N3(5{3Ulh4Q~0ll*5S$bVaZGFubc9e1gz znXCr29?4vPWI8Zw)X~J8%|V#Rq@ztU+oTtZSmxlDk>65aN7j zq~==oni>GXZ>4S!A9@>)`##7cJ_3De8|wVuP4`*pbI;qf)UD6P1uw?}$D2;qSx#4N z1M)3D%8QCj#?D-ve_Giu+%B8;Jye~i)M(*Y>pDMLq^(sSRni~^t$HYm{V_&tG z+_@7hpQPF)(#IpTT?3iq8)R?BEbsb^noxsf-mJqCrRclc(i@JGj-(trmA5HIj3a7` zQmK<{ZX`*texPh=ai+~FX;CfHxsjnTw~6VYL>8;o>Qu`D&2hK+3Nh2{Dibv2Y;7Lls?`*(;NZH}8~={F9Cqdfe<`}BuH0EbSxrXU$=)GvS@ z{fegD^>d*_j;cYF~OqTK6A8HzE$!7Qh# zXHwqA)|fOfA;CdnChW>B{dyl5q`hIT$Mp7!J-O#cop%04I9aRp=?m`kjMlfQSo`=W zhr4ew+=CTj7~L<}r<8JxO{Y|KDocN0tkA;Y2UDw|!i+rA(&j$T8m%Balq>qF=??4EQ1Iry_tF>M0=E1tspj; z#;@f25TA^p5q??)r}QGmA3Vg1tgwNlohUE{xOBLW1LhlVd4;*l%@rq4TxMb1gc-j| zd0_8{BCRto7Nd1?e~|@R??9cpRVzCvUT9Cl%WxV#F4l^&z+t8EanP~pgTaKMMyP;A z#oIf^-+7vGBRUOm#{dOd7jXAYovs=T+c4rI-(28B|O< z9s0}VlHYnD-wBh<@Il?tD|0LIF3ON?Uj=&rYF~Q@VUzkLu{+XAyA}*gWP^3{>TGHX zWXN8>H?ToVlZedImuE_q@xrD~i_5HUG$YVQ2~5uk>`j4mu~-Y9N_0r;&RwgP%6zw} z$|*M3V?!@TpQt-W8+KZ25H4BG)Cd`v(pk_l=*OS%-x^NZgOGV$%-0%8$9DP$=u%Rz zCB8Iinc83oM3Dve3i+!!%J!5_uGx1N1;<6*qztFWnPvWSX>OAV_w1AkKhitlI(x_F zqti##Anf3ZCzDc>$1WowXHJnmF}ZmV4$qY&sV8}{ASx{)+;JL~PEp_g3URG+v|>O1 zH(~|7L9W0Z`Dk(K`fCUd6rAQ~=H-rQ|3q2Y zIl%lW-da0txE78tF!%#6+yxI~o{D0iCrVNHVt@7bZMB-bD|Ux}7#?m4Yo+D(!!ju@ zXtu@GX{fdVRa{7bwE?N5<08qOBo^ONN0aWb=^#0dT5(4&gp4m=GMZW=rD$Gp@m#R` z7e$4=MZ@9a0&NpfEKd4%JqIlDA+ugOy#xU92XWrHg z#-;usKcdIkO|kSHW{JinJ!_;ii$%lzFQ-3EY)dV5k9^_3fts zW2l>Zcud^+7%(H6SpD>x8lE@e(|F~#r__EBcfA`YAay$*d=&G8jU z5Wi0qD`TuKm~LK&`^r7j8y>h~Z+Dc1`NTm&KAsWjX63KQcFed!U0)*lQB`U)i=AQJ zVX=QJ-4wDTjs23bDu;XwnMkJD(9zw1D}`3)oYJAnR#Of=N%4`@0+%5@Rp&0tKKADO z5}kLWJ{Q$IuAQ2whej<;nnBUaPg78*uE@gc<(ud4>pPpMUC7)?zrngrY7uX;N0ScA z;5i-2_q#q}RzX|ClX3QEY&&ykx^uvs&H$fI*SreyXDTFW_dlJXNk{B@SMj!vA5f|O ziGkiSUY+z|;@Ou#{-Jf}Y{DodY_<9UKfA3;nk*vs?c3`4Q8I&#+k}p$<3v zb=dVy`j z6Igro!EDf0DW(2fTN@9}Rr{u?DW5Bs&AZDY^OV5OEXq-sy+V6*_D6ZADoa5v)G65@ zWj7X_`u&8X_WTp4KJFCdZt#$(3MpFb{@7hgcT!G9VLqrq3Hj-c(+~K4fy!xsW)JXN z%g;1zePui~r=;HLe#!&COIhQ(7Qd!>9P~pwm)9s^L+-*~5gjp%4k=yNdi&ki?_Xeb zMGo8c$(N7H?F3Y3uiYTkklh{UZ*K>l{%#+!%I(`4iw``ot=rFAx&pI=E4Usj*Nz~S zl43{g2vR+n=QrzQA9*ZK%E^DR-w{A{d-*=*VGmF7&r9rysGq#F44J%P*3p%S@EhqVa9Qp+o-6&xAXV0?S<622X6gBt9C;A z%8crUdGZURjd^y#^dYAgcK)WtjFylTcs6 zu`a9{v>xo;Gn2eW)UhUP8?gv>G@=-TA8r-iU7UJ`Bjv}qoaDB70s)bE{UM!@6T&_s z@1k->ak0O8U4KQwdtsO_RKKZUwc%J(;9t){LXQ(EBnHS$dI0ob&*Q9{e+^I;{SoFh zMZiwb^Ha)qt(_Fak8pooDa|%T4cIruff(Gh(Pb! z0bh1rCeQ#2EI;-hFo0mM@wmG$-oCc_ojY)O10#U%DOCyH_|NL*WcCKR)0XADTtdT}ZP3=K;BB$v>yKZtV7DW5FQIbXkcU)60%Gr;Tp#$mbN;k6?%gmq zPDl45y~aQ*t5`2}X~7@@9f8=^^5D63PMVH6c^(w|K1cUVyAJ+^;hD52?U8i&i0*{@ zbLh@LcA@>h8UmpcSHN!NT#MYmZV@a0s)M{B4%Vp7J^?F$>8Ot}J~T?_VLU-kRtyG-K5L|3A$GNT-AF!l$v=<)WW9*6?}f>evT?A} z{KJWHuo(&@{CZLfAUV-Tz&8=nuTH(nK;Iw?Sd1K)XX5|?>Jz_!*2-}@Z*w4q3J@Jl zu@T@$kQ|+%J7r{jO))pn;mbPJ-3J=q7Oz_A)nu^GF&f|V55f2^ja>zpcc2K(Z^h6` zt>&~WnUwfqvzGd3I*yKH^x*j9;6&B$OPu!PpC<5{GRp}MMakCwImV=GqG*nK)d#Jt z6#}y6Z6|9?$X)+nQ}NVE*)8FI2Ik0g3~ z1@wws=fH#p$#Kw!2XrrBi5oii+_i_0x4J3scw?vxuPj8k{*?q!&k`8lxQ))3TwpvP z9Yz3rxPGHOsqHHWA=c=I9nL7+cI06VT}!6_X7n>{YFp1#@VVpQ!KO3$=1kx@*1kWk z7LBB8t9ueE6r!U5z zkRAfPK)XI@wr3XG?v-|h$0i;(I5X!Bgy)b6OwKzot8!jJ%U@G3A2vvCeRFl>>6wYl4qN+M4-f26YG+Rw@YP_NhY35p<~vRL_!Co$fZGs2sy?PBsi$pl{~3YhG%{x0?d5j}4E1zB4GZjQk|Bc!;tmz2_ba%%6BZ6|EZlDeJ!EAzd zbbFp|$w7hJSxjL4a5l|ax29hGpl3eB4_X7>4nnj;MCkXff%GwcwtgCjE)$-%G##Uq zK>R}`N9;8z21@mK+A#)4^tKF>F}6c3NBlPa)OV-)SBFwj1=CY8gS#r^=qW?e!jV&V z%t4owQ2SK;v3Mu&`gC%2s6(xkO``Zrq^H(jjJpWEHXu8;2ejX;cDUhg?I%b6r2bxD zzO?(5=utF(f%dmBt_EGxT>j<>Zj(|GnuY8jk6ILBIet>*s2~X(1Xc!MfFeGGf6bWY zAQiYvwlMqF&(+owf3BPQBCLTtf3M2*d0#X}aT~nCE`1N?gR>q)ghA(|0bdn)ekcy( zauR}^F2;O#@Xz6ypGYE@)u!PB_0M2xZ*!gRZ{ezlU2yg&h<$}^moA4`IRt#6niV%7 zTn=#8UNOB2!m_-qP#Tb(z&Bz9&syMb%)5CpKlx)mVZ9UabtD{9#cy*#yNvBuGI*dwvr$;H!1_nm=T7L@?!>Daj9cf6%u zCE!>~lQIg!M$PbR*Euhs12a~M-Q&9PW8##5YH!i``bj6P93X1$3Hk(Wlj zIuT<|Z_TnPh+kXGObAT^xc3v7ZxaH{JMo|uA1nAX&V|lepC4&_4XK{to)z#{4*H|q z;g~Ke_APq=Z@@DJA|Kc@cW;kj$PUVAi{>pO$P2ZMFLAuS+@X4f=wFYP7y)2!J_F6a z>J{R?4$x;A5B+ps{!;iyF4)W@YSRQA2q=^L-{pdZfaw35O@RNZOq-ZG89Q3ofAgGv zt2?{u+Zg_t__ab2N+B4$s+0Mi$(n% z^0Kg_Rd5_ay2wrZ>FH_dfef~73usqLtB@c5DtP=zl@RnY$DO{0H3mU<`;l`qY81Q9 zGJClYCE9FMJX_GEY!@Y7-PX{Sx?CX#p>S-r9b4EPpVN99C4r`?BPBCSut#HDZ^K2R z#}ie*Lm+-x>auDq%8Q6y=iis)9~4y7=k>UyE#etsAe&7qhXl%rAw_(PW5TdUagAUF zS~TdvVmv~~zz{WxMYrWA*DvP_?+QS9zf=evRF=1wtI_tQNDZliiIutHj!S`~he~<_ zs7i@Solh_QKoegn{o4q^Ja9>4C$K=8)^0jsE^!5@*%GoMqVb7&4bJHgQqj|OE$TPS zFJG_~vK_X~TN;nlHyz#j=;x;g&7y(<7zlxyA=L=? zjo*=%CKKf7k*Jgs^4*@jxxow%2R-WOgK+J}Vu4o36R|yL7xeKBU6n*yd)4bfS~8x4 zz>iW{=y&&QO~s0n`rK*Z86N|x3TiPAze&41D#Fm(<8Fi zcsRnC`iu!km>A4x5)*dcMWHBLZwb~zDvXzQ36w4@=5mmZ zzDp!^?2M|I#_1Ja9&T8vcZ+#FA6Tip5#qh6-R<}m3-OmSlR68j^qYb@xMH>$FV>7W z3->?SGqi}s5$vj}nAxwH{g_EFQ`UE02ai6D1{|la7pI&^ZU=Kr>K_t}=ugg};$`uS z#xu-kg5(hhH~Spqf5$2NKB*(Ua|Q`l?1>NFM;ygxzy;UK9Y+C3p4KtN{@|IR^V zfQ0|w9ppb3O8Ec#uJXTh&i?DNSY6W^cLg1tTDp!hw#7Xzm2v`>`e%^|PqUazJ;p?e z(*vD4#_S3e4c|U*0&0TDw6NBX`E`qhdTJOjxp^Old1sjgGpBW5+%10y`gvdQ56b|c z4~sxFi+}?9z- zDdhci=v?t~`!vp1p=aiE;^44RF!mkT9O|-A=O3(llPpQ9(}@S_lWAG!ndsM)ap(wGufv1d%0J8KUO%8M8m+eV`FT!qE{X58 zhF6B=nBse(S`+MnhO9?;H6bLc#!SvJe!T`#MvU*`%_~vI7cU9rOR71Uq@k6is;FVs zMj`>kS5mF});A#HKiX;PHDF;`(ojt&%0J={4xx}GNP5EgGuI$i%oDX$MOesvqMphp zUJ~xB=o%W^d?>L&*ON=l3_znk*tb{~h|AAv%>jDNwx@#9uk5aaA=Q!hVF+^LIR&Rz z*it*w^6f#Ox@1ylF184npwqvq{UJst@9YcL`sS-wWB;);Ob|)dLCleKI zZER@%Ob^#a!4;Wzt1IG}93OAu{Y%9D(&(dR9&F!c!Xe{OJ zX68dC^3$-?-xVYL^|D+PrxI(#>K1lQweEOsm#p#|aAybBR*H7zD{Z4ZhJK5btJ5n74#A$3b9Nd8mNA@f0 zbJ?H_r@EC}_?G5DjZU9dG(8wCOS*ik7zcr~%kNYL)Kl-LCK>S;C&wslo+7&ccoRdvbAKMX`~C9>>!`?0rfCB+nuTZU z(GBTMCbTH`mOU18(C36K7Y!CQi(N`!s+n!wm;>RePyR0ySy$?%g(9EiS~A;eY^-r& zj-k($zm?7uCSAvsQnBStWrJ?R^jmA;jg8AOl)*DgboJ)1?6R>jHShH^c_Rpx7z?Rg z45tGwFM1uNT#mVl=3Vq;sTH;PH_gsD^>VQe4g*HX#5Gm!NuZ6xYovw~2ANmQ8Bw+0 zO>z(e6xsbI;rKSJuHDTeOdELjzs@l!NOPc9R=%-x?58bq;$4oDXBX=X$6Hee?VJ;3 zH{Ratdn&Gdcgl%PX7Hf_0mPBfo&Nl8)t%Q+8GDW8IP8IIHbVXCyrRi$k&B&lW< zmOsagkmh8_@b_69Y~_SeS(hFh-Y`E4m5PY4!UfSXh#}}_Vchz-H4srY;c<5fR-rNh zmu9OV+IxE6QZa^*7s0x)9fom#}<5Z&Hz3+Md5#Dx%$)2KA#~CkcMJmRkh))Dj{9 z1+a5MUD`t-d`pSII8g3@iJrZZxAO=iik{7?{aKjePYTmXLO2N~a~6V`pM~eMhl?G6 zZY7lOr{;w3iVt9!T}ktQaPa}L?Ynb%MVGalyLKyVV*+OEqjh;zEh2bO&c#@?aj%l^ z30*YyJ!1*Hg*yk?3RpS6KM&7AK4}5*0iA0AzTyhl4sJQS&kXk^pY>wJC|j^2_SWuA z6{Fb^zn72qULpJ>6uR<(td?+x-MdP&I|)eZ>1G#LBDfpjIs6kl_+Cu-pnRi2qyZ`H z$tfI$BoO32I%F|8Ly~iAMF>ZB7oVE}eacU8+l3Q99jY-jbP(PX^c=eLY9{zfE%2b> z|5};*s$&2{@T8oJDE1cE`vS#=ED-ig84%&aJou@z`-kKnWB;1OcfszXMR2j@W08k= zs{>>wVpf3UlVBg8KKu(W-%sM*XRwQ&-@z}O_nZ<^`@Mnb;*Yp+`_F(Cu~P`|&j8L{ zVgfLN=y@sc&wLH6fUp8*klfsnnFqmA3E>M$;WONC9$-M+py9WSM7%GSe*+Vg2ooHs zJ%aciuZ};nK4hCLqlEqX`8_yV_qtN;jq0F)_;|L}^zf;{oM%fY?>PIEAh!B&bqb-23b5X#>5s&p)ccrV zSJow6;eMgd^1YXs#E+@O4>dlfTCWmkWncd!xIT#I0rY<3RBX`x6?*-jg*|=%5&hfH z>wkzXn7P;*JAaeW8e0DoD2w-RBPRUn5h0 ze{cFdz(1ZM`u@fL&F+7iIhs1VINJV)4a`4cQ!=`-+x%~S`G36s?+oC){{@4~|M?I4 z&%x;b5B?UPpK^8!f=EpZ*O!pRN4*Y9j`l^v42>wG1(HIFrOgo3@Mn7Q9S#)knN#al zH6i`Lts$i0UrM{f5j#T^4odT&v=bFAEZ0+$nKS5~EA^EJD=~T7a5D-Si~|j32Zu{h zwVHmOuR59tY=$yxtW4^-+?=34Idw`x9vx6ka!kBd1^Y+<4zyBW{QV=chl)c@l%}C^ zHw-BeM*P06tvx;FzKHSVvl(-Pe@%FJcvjk#y9zV8C8vIF*vDu5c}Ub&Q0^lh;f7ey zF7gNy!G&cAFl~+3Iglrwaw1`dItf^8dg6t|%mpTD65LW6i36K(`r0p)ucvY?cE+`T z{R`rj2=|l-XOGKzK;o95RWw09b|15d;vzlD!)fNhsRTu7Iv`wMDL_zlM%u(%kCI9W zs%tVoYogr?U&3;4f|y#ZBGLVBrQo5Spp~DwLND7KfL8EiCVdn#YsPl~9ky?{hM`n} zmRx4Q%dyGU{^ob}yIsD8!V3?PMPA%8C@0Myladd>Ai&G(eaJjkAlkeZKe9<22z*j z*%&d9Fd3LDt|f@k6|mKt3vugC@jBK^%kylr%Lv*tE#5P<0MXdaV*mBeW0sk2TL|6v zG0X9rf%^YGm4$%F{~NykKOOyllT+dNr|T2{Ti5^R0jgMC#_oU}sr$Ny$U6eOG(c3^ z)w;LKMnMdg4x@_f`TD@MFq+mb+e}=? zPNMM={^76HUrhwoLzSOY!4uUIzAsHtzhD!2iFoQ~=gFvdGLjV863_?rlgg>TB^$-W zi%5_F6^iv`&X%w$@OCPya-L{XYqUx#lS?;2os<&k#3V{xdm^MXwdA7{pwC_&L=oe= zJXr1?fH7jb-J6}SMtBHz9P;E!^3`Vv6PeomJth8wqS4Y&}gKRwF;Ac-I4<38?76*Z~?~o0?lWW1a{59T*{y43bURH zmUAi~mbI%bILyBq_v~~2mdh8FbL!tVAx_Vg`+M4XY3hEl!xFSy%L!*qz{Eqk>_#a# zmuVx*)d>bA`l6n?CET!%F`v6>E@kL>O%ld5u07Pbar5A- zY=Fnw=Xvu}cN(fGmXH8F*Xqi0dxNg)Pl(HYSkwL1%3?om09FD*{q6nD36qhLh(~Vn zG`u4QGt+r(o~x)&d6?U=VAo;u=gTXFIT%&e)$T&j1(ZkdL>xS4J#=+OyqNxK_L!C5 z6@n4&-ib571r9$~32uoLl|0L>YmU(EUK*_yjoZ+|{UGVshtX|Rh6(*(lM3~LBE?|k zHqcjXSV0L**pxeGR-!3iAR94Z&z{U*SMF8zs#~03t+K*lK45x^WrY zBZE}Yoh5)>fG{;*ku%1grC_!_TT|hc7z^&lQY;9i!Z4PC#jr)*ALJ&A<5Ij=Z*FY5 zA=el^f-p|*U$a(W#$osr>%{}woYCf- z_DtEyvRN5BP43R)Jev(z8An4&!}WBM=X_m%{PfZXF<-?q7pAmW{msfiM2E7$vb^ck zO;(SR>sKWFr}nTlN*~vwaJ7=L&rMXZHE zW3>i0ixE`YUA?F}Cg9LGpTlvYJsWw-EcnmOQkT#%+(^T(Ry7!LLfumro2|LE(u%J7 z7n5GfE{CYRw&!Za$??4EJR_?->skyU0iQIlTUjcE9ykop#w(&1@Qg5Z3w|+2(T9yO zUs_~VrJn{gvmcc>yVtvduv~gTg5PaG83BJmJJJztMEB^Cv1w}CR{MX>oOw*MV^HON z$oQaJVPxWLTsAN=dY2fw>;{hTk=%AtVY;))7=ilAz?tw&>F z5Zn3b)#$CyMl{#)$h82R6=kupFW|L<$$f8PCB{_EB9e@{U*X~DYVEx9z) z3yj!JAO`CjkFC8Ns2fvqi)fi6~IBjdDt_xnAaO=2z0qB6vP2W?y_ySzcFM z$2neC*!pZj0;Zd-4jXRQbL>xp2p1P?$Qv6C=H^cxbvaYot~O4?V$Sg+Tn7)tyoqMg zQ|m8%;mK3zofK>@V50!H{zRuqDi3~b;Q@G`Y!S)=W;e2=HLlJ#^N6Vz;ny2fbm5qQy%C8NgK zR_?6OK9onIci2KO`m;oWNEW#rf_SbB-o4**N8osWg@wd=IEk!z%t&a>P&a7?Qc@vY ztAuEc4{0HOj6N|z7>T(|&8-Ylj({z=@G%LsToNzNKh|=Y{LOR+Yg-mv-nEqxV(kt{ zkj7~>apW+DFXGc+wyZ_C8z;Y%yLdIqy5~SdI84VW0%=M z-TmwJ4JQT|3{jj&Wq!K(zDM>l^NJLA6(C^f#DNS2r_0)Mu6r@n?@uCBW%xR>_XjpZ zwUHPT?2!~~?ibrV>r~fDQ=g!UQ~VqS-fn>UQ}xM?@umyk=12~9v|@>@Nx`FmCbXE;yPSqWu@0DrKF=- z9?P}F->5-Wv09t{h-6XNp^OOK3lF+x<}f!;YHUvg_i=InMrPqgLPuMYPDb0MB}Pa4 zqoz+c_NYGMfwTAg(vFOkpq#*8SMi}@VX7==$@0~Kv*yS~uqF(GxG_@+1wOwxO}S^P zO}1Owz9fsSVMW;=-7s_z*&t|_%9@WQy_O!$CtHEi!5OeSbVge(M#iu>lfv2YtZ=IN zn&1GCaKJdVBBNH!5D4Al9pJ}KHUPQ)ckm2-j}0Ks%Y|i^2ElNa6g(vlNDSFJC!NGop)skBknGU zB`E->I-;xSY%5XnPO^W}V;_sU7}P4>&R1kgLo$Hl9ov`qH(`+ zR{ID(a?Qk)cz}Syugr{prXu8(rp67DG+M{joQ1UTZHqUM6kF786~U`Z=o(HEd`tmS z511PW`bA zq4x$ksX#mIsr{gtJORyXJ3m!K|J$nNMq6&30j|h{-DJ#zBEPTlQ1*E+7QPFb% zI-C6l@(l`iURF~x3UkjO6@`4pL!2QsKlotn$e_eg*MVDDY!gcp09FmJ@-}k7>Dw`W zG_|gXY@Ww36R9bq-ZzKg-$7-oM6s0{2(5jhKQ0{EAg>-*)4X5F_-3|&92CiWI|b3j z(A#0LK(T~_b{d-UhtvEFm#jSi3e$??7NXiIfkg(>;LGYKclnfM*uL}G1B#cxY7Eu% zd}9I&X~H8#Qx~%8xaMoweD63onUO*7@T>#FJBB8q?oOR8e5vk;(e;SGoaZ6d?MEPc zJx=k3rP8r=SF>kxEEUx;o{XYja^4hoQYhv4_>D-14dDZ6 z$Bn&+<%e0G_2s$d*h3pcUB-%|qjoJ?;ThNvL#dPYUrFr@(*3R{+T?~(TyPxGX4Q^) zO%AXvLW|SJr^#qEVxz=|-FFY6KmWhht^=OR?vGzYA$t``W|X~0h>UEKtPr|J#^qWU z871XbLUt;pMD`||%#t#)GOiVckaf-bf4q8M_j2{`ee3i&=<0K9Kon zecD>Zx%h1uyiLTRNI*s>t(`oGCP&Fv!L=fp`V(VLfVfg+l!lc$Tqr@D?!3tx6%@xu z$O{qCmx&oh`kFE16_NL1QPk2xadm|HvlRx7fukm^PuwB!lsKJ~ASvhOkwl$p%?E4G z8AW+6zJ;=ipU!cOV!ky7OHv*6NiBnyM$Uy!E{^+v;gO36`Le&4mYdMALEn0dHKv(*q4*gG#R>B>u^}UfN=})yQw(xeT zMTW!)eb@dVYe$`=ESogM=~!q}cj&2PVk&jpxSWwnh4FDEws*`Y&6U>g>y#-tF9te( zK4tZl>J_e0)B;?-^~u<=ubC_7YM#O)ou92M4Q0h@SV-d~x30UKih65&hTpYH#Mm;C z!tkOOr}pB6+Vw|AecA5#KCTb(IVkZYGxGe?$iW$?G~RxL8>{^lC!9C7=C~8sjHHrz(^O~_Vc5QNDx+cABg7XCOGox%P#EK%Ua%`&P&2F?uey!&}H6B8HR*ySir8#ggk$=UW2`-bS4q zOABI0oz5m;ebO`fCKV@aT4%pf?-$rJ6=&$^Jq`9b7X}?7;+n(tL)RJBIF3J}*3_#e zWmme}FfkV55ZSdc)pGueDqYTgzEAY2s-$TjNIp7UxSc9=rDHKg@bZ^KIY>{(md2B! z%mcnYk`)bF}o@Hq->}JOgQgDeou^qVoi7D6(5plIy*d!pwmWO83+Z zm6IbSFZy=2Au5EaeL$r_@{y08cRb?qiZ0Dpp$V@q3t8c@WK$25D;yz_QYqU%PvKt0 z50mhEeznAYrru@Ha1K~lSmK{cs#aZF!FH=8fOyz?^?)Br%1RF^+%6?OdwZny1NeC{ z{j0Q;+#}rLynGd0b6Vvmi2gN5LH<)=mrg z;LMq(GRfFd>E%piTdiqxrZuT|n{&!HnAfK02Tgw>tID}q>h#EWrmL3jz3g?ayk6Ow zgw6@PjI72@k*%vXhre}wZ)*J+P3U%#ZqJn{7D@#}9GSv#2;#Su>H;Z-R*NSlz~8uuW}H<)gJMv_)tgr%}NtXOKkTE%n_{(fC&!_UsB zwdi>M5y|3m%QJVvL?~f2_IZVu(>7>Za&1EjGHji7j*2|n@6vVXbUw3c$hpGWh9|Fv zdK;(J)++3E9$iU(l!Ee8YyYfq-t?G_%x9D`r=O?N%Y=1UY@xChHB*&$bosHSI}B$W z**eawc|v=@%zX#w;CPC$c8XI`kn2PlRe3|xm8LULh0Kset|BNub7gDdY_7u zeLd-;*)kmw^RoYIVE0NTDs(`dYp$e2Cw$&FW{FDd_T`+$Wuf=Wa|alr$roCf-=2wU zP(9Kdqv}`nhOLEYj+2qI`8bOYMcb#>b=l5}W8rIZD49qOT!!}?S@fb572#c%Me*Oi zw5QkYauvmkx6U!N7ma%j97&f(3zISSuORMbS$kalwd*CUBdgY)(D+T%U>o#B4h^hh zxbRx~<)myqdyzX?O74UcWe>kRwdo|Fw=%b#I$M0>&5K#Nl;t2;-p2# zTi&WdpUGo)vc-iAWVNre$2Oj`_fHh4tByG{$*)adLq5;#>kx$({rYPW*GGmhu91 zZ)-!H)$cbF3hYnKygHeee)4vYzW-`{(p%n--<7jHar35*De0mR4ajGi{Y2cj;u9 z^hs}3R9apQbF(ZJUOZgwhAWG=mZspR`Cwvs_6u;9{{H+G#^7F))T!DAYXRum4N$ff zZqTY-zA1S;p0iP?_@kixcKQ2)%YCyQGwN#WD>)B9a~v!(GG?iU+U=$w=eUsg8UzG1&AfJ_a$uj#u@*P@ zz(JxywxLM5ArZ=1;0UD0nd=0|>1z#QC}_;FmFlbSQB=U{S>v-4&uYY+-w$kPHFim96k?#(0o>xdD5!A>gY zOJVNpK`7jzkmps?>ZHbgLlHBk8LXwrn!492$V#JTIwW}r)`(`5n5GFfaGaJRW-J!Z z&X-Z5K!ZoGp=e+VLlqYj%$R3o#o4pEw9eKjU$3!d8_Jb&_xC&N$o!BRsdt-IC0vYs z#h4P+{_zC(-!p4hh z`~(K4J8Wg~*6Sl60pWeD6tY|bvW!R8^x#OVP-KR}nnS2K#3;rAZ;u$~OLQS%X+zSbr;YcxcvO}5iL1ovG1f%-4GalCil9~@t=~c6;<(qI4`r%(C z7HzR^TH@WA5+V6fk6!OR@ zaL<{_3Y>Bmt1dwgwRvy04InnlAy5PxD@{%ZeasS2r-x9|gAYb8R-kY$ShWo1UW_X& zO-ElhDVPW`D0SAAbCI*_A6s-4_nGdH`gZOXB*-a4NNIN7W>&Ss>Cm^=-YbHsS_0J1cg|F zU0nW}V*1_ndv0OxZofW89k}E}6iwuQmcWYkT5Qs|seK+?*z1npyJ7v>o)@9q^5T!D zOQJbP@PnT~s?)4T`5 z7U1J&bLPQ|OQbZc4zl+@xXZ?7x9+#2^nw9XeESb1wLQ8v0L)xd0MmYZPx+kz@&9x< zd;1s)EOtO2#^(N4!`OlM--Ucqpst+i`xd>l>dj>=Y{EP!tReqYJLo~Ws-Efs|H-Jc zMUKD7h6OZj1y}nG0B)6^!l%lj|BR@tiR#Y9hD4Xo{B@WgR=SBukfcbh( zulL8z_A&~HQ7d}7S$7uo6!e#O`@Zu^E%TlWX1K8W^<<`*^=(HB1M?J5d?wyLR?YTc z?}tXVVz-N|%e2;gLMAfep;E5np7&kXvs4zZH+;sOl%hPL5gZ)D_bd=$ZD%)O#LMz3 zXoMw)j=d)FWjIoxo}I)d`sS&0%WHK?8Y~mp@Q?Xzc&#kT>5ZcoDqhuTGA4C<998?| zxKQ8P7329V>y@%?SNrT&xx8s9_e+5komv}I>?=CcbAjdOTDpo1BMVH)q-)`!Mt&(o zw&W)B(iXuQF&c)>upk-(cSnSBW|?@U9&|A9svaxdEsM#Wx?rX!E86hu> z9^S8eu~J5F+MXEviOIAWdG0lQCWe7G(YZ675qXi9K>#ve#PmE^{HZgggs{fM?0$72 zJ!%{Kp7v42@kQJ|4vnE($ONe(n>PO7`$R7t-m;g^9(F00O*oPjFxO2V$HP`IK^ol@ z$*#v7D;6JiKa|viJBIi;qqVVoj=@<@242GxYDPYd(CkNforfI_1+>VFzOT}>`jqK5 zdK4HTFQS}^An#7C7V$m3$7dSPc)$VG-uX_YspR4J8nUIrZUSqq@h9S*8xHZE>0KVA zxG8R4z6hf(p-QQ=?6#E>$rF6xT%u6sp=GWB@1_zU|Qvgw9);!q`;_urHd0+fSAy*rR}SGQTTbidS%0i zq(s{ING0S|{$*l{UOngLCW9J;en3^GTI4{(JBbFhh551|C;)*^4QzDy4r&`Yamd1_%KkdZJ z186H_0}$Q`V00LVW)Fa~*Z@R!0_Z9+BlZAL!3H3@6F^U`WRe`vznL-XKwA|X0N@vx zeqeXrNfJ~ETn%JQ00dS5@tpt`)J{`BuHONmO^k!Z419???hL2Lj5 zyIhf#_{lo3oDsB{F%dqHU`5#Fi#g#L#GW=w<+%~%n3 zd7}pjPdau4@()-McDdthf;Sv{J!rRJMcCz!2fMf$RDn0jZf0Qf8d~bYhOikgw#-Ql zI&ff<8U*TdqgWXR-hQ`m35*-!K3{!V^#l>{>)iZ|MIWt0UOe z0|K?9qRu|GYCHu9+)n{7Q9xq>f$SK6hi7kPl#+Z8TLC6J91sZb7qnE&{By>C z*6;$(=w=Ug;j@G|x|-VpKDlcNBtI6Z32%7^s{p!oAnT#gf

+f0TG{?d-0_iRS>_ zi$IM_VH6>Z?dL`KaX(&m+PV?99s_@v7K_%SO}Yz30MR~x2ngV4$%5mzi1yZ2fg|2s z2M{p;w3uy81Lw~v_qHn*WoI8~!2Y)488lrW5bcTIpxIkjS!_G?9H2=LxD$mj2z5^W zoN&7h-7?o-U$IEK9PAT*7ci78a1Ua(X0Lhv8^hjelvyVFCV>Y8abS6!IEI>DfnVj? zazR&f7dv3%GuD9ck=zX0NDKn09|Hj+Oz7#9*nel)TU8514)HO-KHwueRmGn9CBDD! ztF1G}fdg}`u-J)Iom|_95Cn1tddZlo_*MQp%igN2KgrT30hK2Oc%M3YC4x@q{t};) zE8mu_&|<)@rc(GHrP~iA*|TNRR{+M%d;x>msk=b@nSm*{IF$m~9%WmTX zKP_1PM~c1mpuc|`GkQ|n|2r~Ads~;y6E=1}3!uMz0yBDMy8JhWz15%}DvjB#q7MF5 zt}WmE5kq&s++wFZ^s`H}Fszjv`G+X?){A~Fgd7HWUh2OiM|;lNJ}hOYR`k7)n9bhD zj6XoPQ|ETPL*HX4h@n%v=;y@$#G38>SXg`%edE_D41DKT{{?@ilI`GyzI_7IVy8-f zg=t&Hu2{Lbt!$^o(5D$OEq1Bu576zc6MbF{^JycgfJ?%HdC-w@NFFQF?md!h@ChX(*Qeh&Lx1&7& zjOXvfKp*;M#lVQ#iGh7UUR#ZTfcwXVNAY<6fsp?3)8F6u>9#%)?*~RsfCO9z#5oYi ZW?}39KwJer!zbAMOd9yN`S)9Y`#*n|2ebeH literal 0 HcmV?d00001 From ba510e8b15973005a0ec8b2a5fa8a711533f2f34 Mon Sep 17 00:00:00 2001 From: CaRoLZhangxy Date: Fri, 23 Feb 2024 04:44:22 +0000 Subject: [PATCH 048/103] fix memory leak and nlist dim --- deepmd/pt/model/model/ener_model.py | 2 +- deepmd/pt/model/model/make_model.py | 2 +- source/api_cc/include/DeepPotPT.h | 2 +- source/api_cc/include/commonPT.h | 2 +- source/api_cc/src/DeepPotPT.cc | 19 +++++++------------ source/api_cc/src/commonPT.cc | 1 + 6 files changed, 12 insertions(+), 16 deletions(-) diff --git a/deepmd/pt/model/model/ener_model.py b/deepmd/pt/model/model/ener_model.py index 2afeb2762b..d9920cae0e 100644 --- a/deepmd/pt/model/model/ener_model.py +++ b/deepmd/pt/model/model/ener_model.py @@ -55,7 +55,7 @@ def forward( model_predict = model_ret model_predict["updated_coord"] += coord return model_predict - + @torch.jit.export def forward_lower( self, extended_coord, diff --git a/deepmd/pt/model/model/make_model.py b/deepmd/pt/model/model/make_model.py index 19bc514a2d..75ef8c5769 100644 --- a/deepmd/pt/model/model/make_model.py +++ b/deepmd/pt/model/model/make_model.py @@ -179,7 +179,7 @@ def forward_common_lower( do_atomic_virial=do_atomic_virial, ) return model_predict - + @torch.jit.export def format_nlist( self, extended_coord: torch.Tensor, diff --git a/source/api_cc/include/DeepPotPT.h b/source/api_cc/include/DeepPotPT.h index a3ca9d69cb..1b757069c3 100644 --- a/source/api_cc/include/DeepPotPT.h +++ b/source/api_cc/include/DeepPotPT.h @@ -325,7 +325,7 @@ class DeepPotPT : public DeepPotBase { NeighborListDataPT nlist_data; int max_num_neighbors; int gpu_id; - bool cpu_enabled; + bool gpu_enabled; at::Tensor firstneigh_tensor; }; diff --git a/source/api_cc/include/commonPT.h b/source/api_cc/include/commonPT.h index d357b76085..58eccb3488 100644 --- a/source/api_cc/include/commonPT.h +++ b/source/api_cc/include/commonPT.h @@ -20,9 +20,9 @@ struct NeighborListDataPT { std::vector firstneigh; public: + ~NeighborListDataPT(); void copy_from_nlist(const InputNlist& inlist, int& max_num_neighbors, int nnei); - // void make_inlist(InputNlist& inlist); }; } // namespace deepmd diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 655061aced..e30a55dd06 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -29,16 +29,11 @@ void DeepPotPT::init(const std::string& model, << std::endl; gpu_id = gpu_rank; torch::Device device(torch::kCUDA, gpu_rank); - cpu_enabled = false; - // This may be implemented as something like DPErrcheck(DPSetDevice(gpu_rank % - // gpu_num)); - try { - module = torch::jit::load(model, device); - } catch (const c10::Error& e) { - torch::Device device(torch::kCPU); - module = torch::jit::load(model, device); - cpu_enabled = true; + gpu_enabled = torch::cuda::is_available(); + if (!gpu_enabled) { + device = torch::Device(torch::kCPU); } + module = torch::jit::load(model, device); torch::jit::FusionStrategy strategy; strategy = {{torch::jit::FusionBehavior::DYNAMIC, 10}}; torch::jit::setFusionStrategy(strategy); @@ -76,7 +71,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const InputNlist& lmp_list, const int& ago) { torch::Device device(torch::kCUDA, gpu_id); - if (cpu_enabled) { + if (!gpu_enabled) { device = torch::Device(torch::kCPU); } std::vector coord_wrapped = coord; @@ -95,7 +90,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, nlist_data.copy_from_nlist(lmp_list, max_num_neighbors, nnei); if (max_num_neighbors > nnei) { at::Tensor firstneigh = torch::from_blob( - nlist_data.jlist, {lmp_list.inum, max_num_neighbors}, int32_options); + nlist_data.jlist, {1, lmp_list.inum, max_num_neighbors}, int32_options); at::Tensor nlist = firstneigh.to(torch::kInt64).to(device); firstneigh_tensor = module .run_method("format_nlist", coord_wrapped_Tensor, @@ -199,7 +194,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const std::vector& atype, const std::vector& box) { torch::Device device(torch::kCUDA, gpu_id); - if (cpu_enabled) { + if (!gpu_enabled) { device = torch::Device(torch::kCPU); } std::vector coord_wrapped = coord; diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index 528ac22c46..c04e7065f3 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -2,6 +2,7 @@ #ifdef BUILD_PYTORCH #include "commonPT.h" using namespace deepmd; +NeighborListDataPT::~NeighborListDataPT() {free(jlist);} void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, int& max_num_neighbors, int nnei) { From 936b29a4c31cfca5ce021176529a275ee96dc5de Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 23 Feb 2024 04:45:10 +0000 Subject: [PATCH 049/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- deepmd/pt/model/model/ener_model.py | 1 + deepmd/pt/model/model/make_model.py | 1 + source/api_cc/src/DeepPotPT.cc | 3 ++- source/api_cc/src/commonPT.cc | 2 +- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/deepmd/pt/model/model/ener_model.py b/deepmd/pt/model/model/ener_model.py index d9920cae0e..6488559bc8 100644 --- a/deepmd/pt/model/model/ener_model.py +++ b/deepmd/pt/model/model/ener_model.py @@ -55,6 +55,7 @@ def forward( model_predict = model_ret model_predict["updated_coord"] += coord return model_predict + @torch.jit.export def forward_lower( self, diff --git a/deepmd/pt/model/model/make_model.py b/deepmd/pt/model/model/make_model.py index 75ef8c5769..0d5cc48983 100644 --- a/deepmd/pt/model/model/make_model.py +++ b/deepmd/pt/model/model/make_model.py @@ -179,6 +179,7 @@ def forward_common_lower( do_atomic_virial=do_atomic_virial, ) return model_predict + @torch.jit.export def format_nlist( self, diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index e30a55dd06..081c91ed5c 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -90,7 +90,8 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, nlist_data.copy_from_nlist(lmp_list, max_num_neighbors, nnei); if (max_num_neighbors > nnei) { at::Tensor firstneigh = torch::from_blob( - nlist_data.jlist, {1, lmp_list.inum, max_num_neighbors}, int32_options); + nlist_data.jlist, {1, lmp_list.inum, max_num_neighbors}, + int32_options); at::Tensor nlist = firstneigh.to(torch::kInt64).to(device); firstneigh_tensor = module .run_method("format_nlist", coord_wrapped_Tensor, diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index c04e7065f3..6ded23ef96 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -2,7 +2,7 @@ #ifdef BUILD_PYTORCH #include "commonPT.h" using namespace deepmd; -NeighborListDataPT::~NeighborListDataPT() {free(jlist);} +NeighborListDataPT::~NeighborListDataPT() { free(jlist); } void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, int& max_num_neighbors, int nnei) { From 16a3e6bc5fc6cf7eadd623b54b3f3658665f0558 Mon Sep 17 00:00:00 2001 From: CaRoLZhangxy Date: Fri, 23 Feb 2024 05:33:53 +0000 Subject: [PATCH 050/103] get cublasCreate(handle) error local --- source/api_cc/src/DeepPotPT.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 081c91ed5c..f0b7c392a7 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -42,10 +42,16 @@ void DeepPotPT::init(const std::string& model, num_inter_nthreads); // need to be fixed as // DP_INTRA_OP_PARALLELISM_THREADS if (num_inter_nthreads) { - at::set_num_interop_threads(num_inter_nthreads); + try{ + at::set_num_interop_threads(num_inter_nthreads); + } + catch (...) {} } if (num_intra_nthreads) { + try{ at::set_num_threads(num_intra_nthreads); + } + catch (...) {} } auto rcut_ = module.run_method("get_rcut").toDouble(); @@ -105,11 +111,12 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, } } bool do_atom_virial_tensor = true; - torch::Tensor mapping_tensor = torch::Tensor(nullptr); + //torch::Tensor mapping_tensor = torch::Tensor(nullptr); + c10::optional optional_tensor; c10::Dict outputs = module .run_method("forward_lower", coord_wrapped_Tensor, atype_Tensor, - firstneigh_tensor, mapping_tensor, do_atom_virial_tensor) + firstneigh_tensor,optional_tensor,optional_tensor,optional_tensor,do_atom_virial_tensor) .toGenericDict(); c10::IValue energy_ = outputs.at("energy"); c10::IValue force_ = outputs.at("extended_force"); From 72454704d132de55c56755d7333cd18c26ab29f2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 23 Feb 2024 05:40:31 +0000 Subject: [PATCH 051/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index f0b7c392a7..0383631135 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -42,16 +42,16 @@ void DeepPotPT::init(const std::string& model, num_inter_nthreads); // need to be fixed as // DP_INTRA_OP_PARALLELISM_THREADS if (num_inter_nthreads) { - try{ + try { at::set_num_interop_threads(num_inter_nthreads); + } catch (...) { } - catch (...) {} } if (num_intra_nthreads) { - try{ - at::set_num_threads(num_intra_nthreads); + try { + at::set_num_threads(num_intra_nthreads); + } catch (...) { } - catch (...) {} } auto rcut_ = module.run_method("get_rcut").toDouble(); @@ -111,12 +111,13 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, } } bool do_atom_virial_tensor = true; - //torch::Tensor mapping_tensor = torch::Tensor(nullptr); + // torch::Tensor mapping_tensor = torch::Tensor(nullptr); c10::optional optional_tensor; c10::Dict outputs = module .run_method("forward_lower", coord_wrapped_Tensor, atype_Tensor, - firstneigh_tensor,optional_tensor,optional_tensor,optional_tensor,do_atom_virial_tensor) + firstneigh_tensor, optional_tensor, optional_tensor, + optional_tensor, do_atom_virial_tensor) .toGenericDict(); c10::IValue energy_ = outputs.at("energy"); c10::IValue force_ = outputs.at("extended_force"); From 7b9239134e3597e71a47908c195a7e7a8e5eaf51 Mon Sep 17 00:00:00 2001 From: CaRoLZhangxy Date: Fri, 23 Feb 2024 05:49:49 +0000 Subject: [PATCH 052/103] fix error in no nlist impl --- source/api_cc/src/DeepPotPT.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index f0b7c392a7..6004a320d0 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -111,7 +111,6 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, } } bool do_atom_virial_tensor = true; - //torch::Tensor mapping_tensor = torch::Tensor(nullptr); c10::optional optional_tensor; c10::Dict outputs = module @@ -222,9 +221,9 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::from_blob(const_cast(box.data()), {1, 9}, options) .to(device); inputs.push_back(box_Tensor); - torch::Tensor fparam_tensor = torch::Tensor(nullptr); + c10::optional fparam_tensor; inputs.push_back(fparam_tensor); - torch::Tensor aparam_tensor = torch::Tensor(nullptr); + c10::optional aparam_tensor; inputs.push_back(aparam_tensor); bool do_atom_virial_tensor = true; inputs.push_back(do_atom_virial_tensor); From fc084db916ea0021f3230d5152ea6a3bf9e92fda Mon Sep 17 00:00:00 2001 From: CaRoLZhangxy Date: Fri, 23 Feb 2024 06:31:13 +0000 Subject: [PATCH 053/103] fix loading info --- source/api_cc/src/DeepPotPT.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 04e0fba548..265ec48af7 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -25,15 +25,20 @@ void DeepPotPT::init(const std::string& model, << std::endl; return; } - std::cout << "load model from: " << model << " to gpu " << gpu_rank - << std::endl; gpu_id = gpu_rank; torch::Device device(torch::kCUDA, gpu_rank); gpu_enabled = torch::cuda::is_available(); if (!gpu_enabled) { device = torch::Device(torch::kCPU); + std::cout << "load model from: " << model << " to cpu " << gpu_rank + << std::endl; + } + else{ + std::cout << "load model from: " << model << " to gpu " << gpu_rank + << std::endl; } module = torch::jit::load(model, device); + torch::jit::FusionStrategy strategy; strategy = {{torch::jit::FusionBehavior::DYNAMIC, 10}}; torch::jit::setFusionStrategy(strategy); From 93dacb6683a680dc21c9ca9548be980b37640858 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 23 Feb 2024 06:31:40 +0000 Subject: [PATCH 054/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 265ec48af7..34f54fa8be 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -31,11 +31,10 @@ void DeepPotPT::init(const std::string& model, if (!gpu_enabled) { device = torch::Device(torch::kCPU); std::cout << "load model from: " << model << " to cpu " << gpu_rank - << std::endl; - } - else{ - std::cout << "load model from: " << model << " to gpu " << gpu_rank - << std::endl; + << std::endl; + } else { + std::cout << "load model from: " << model << " to gpu " << gpu_rank + << std::endl; } module = torch::jit::load(model, device); From 8b49cf1c8839b4f894f329f98fcb83edca9c30dd Mon Sep 17 00:00:00 2001 From: CaRoLZhangxy Date: Mon, 26 Feb 2024 02:35:01 +0000 Subject: [PATCH 055/103] pass cpu test --- source/api_cc/src/DeepPotPT.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 34f54fa8be..89226ff4ee 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -124,7 +124,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, .toGenericDict(); c10::IValue energy_ = outputs.at("energy"); c10::IValue force_ = outputs.at("extended_force"); - c10::IValue virial_ = outputs.at("reduced_virial"); + c10::IValue virial_ = outputs.at("virial"); c10::IValue atom_virial_ = outputs.at("extended_virial"); c10::IValue atom_energy_ = outputs.at("atom_energy"); torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); @@ -238,7 +238,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, c10::IValue energy_ = outputs.at("energy"); c10::IValue force_ = outputs.at("force"); c10::IValue virial_ = outputs.at("virial"); - c10::IValue atom_virial_ = outputs.at("atomic_virial"); + c10::IValue atom_virial_ = outputs.at("atom_virial"); c10::IValue atom_energy_ = outputs.at("atom_energy"); torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); From 12c279677d56894044b928586d3c1a34d47d2cff Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Sun, 25 Feb 2024 21:50:00 -0500 Subject: [PATCH 056/103] download libtorch in test_cuda action --- .github/workflows/test_cuda.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test_cuda.yml b/.github/workflows/test_cuda.yml index 0d934e6d77..8e925e4a13 100644 --- a/.github/workflows/test_cuda.yml +++ b/.github/workflows/test_cuda.yml @@ -53,7 +53,13 @@ jobs: DP_ENABLE_NATIVE_OPTIMIZATION: 1 - run: dp --version - run: python -m pytest source/tests --durations=0 - - run: source/install/test_cc_local.sh + - name: Download libtorch + run: | + wget https://download.pytorch.org/libtorch/cu121/libtorch-cxx11-abi-shared-with-deps-2.2.1%2Bcu121.zip -O libtorch.zip + unzip libtorch.zip + - run: | + export CMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/libtorch + source/install/test_cc_local.sh env: OMP_NUM_THREADS: 1 TF_INTRA_OP_PARALLELISM_THREADS: 1 From b390e6a372e2f30e7f4e788459ef30a7bd9d1f1f Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Sun, 25 Feb 2024 22:24:49 -0500 Subject: [PATCH 057/103] install wget... --- .github/workflows/test_cuda.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test_cuda.yml b/.github/workflows/test_cuda.yml index 8e925e4a13..b821572a5a 100644 --- a/.github/workflows/test_cuda.yml +++ b/.github/workflows/test_cuda.yml @@ -38,6 +38,8 @@ jobs: with: useLocalCache: true useCloudCache: false + - name: Install wget + run: apt-get update && apt-get install -y wget - run: | wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb \ && sudo dpkg -i cuda-keyring_1.0-1_all.deb \ From 48c1759883dee1e783d46cbfc243c14feef5a6e4 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Sun, 25 Feb 2024 23:30:32 -0500 Subject: [PATCH 058/103] install unzip --- .github/workflows/test_cuda.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test_cuda.yml b/.github/workflows/test_cuda.yml index b821572a5a..9fb11c467b 100644 --- a/.github/workflows/test_cuda.yml +++ b/.github/workflows/test_cuda.yml @@ -38,8 +38,8 @@ jobs: with: useLocalCache: true useCloudCache: false - - name: Install wget - run: apt-get update && apt-get install -y wget + - name: Install wget and unzip + run: apt-get update && apt-get install -y wget unzip - run: | wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb \ && sudo dpkg -i cuda-keyring_1.0-1_all.deb \ From 768dd93fb56580b671f4cb2e1f989385f5df0c94 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Mon, 26 Feb 2024 01:32:23 -0500 Subject: [PATCH 059/103] update the frozen model --- source/tests/infer/deeppot_sea.pth | Bin 193994 -> 125020 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/source/tests/infer/deeppot_sea.pth b/source/tests/infer/deeppot_sea.pth index d8deb94c93de05df446e61228341d07e6fdb2f97..6d4b0e2fac7dc9e0a771a3f52bc7c78ae3b10362 100644 GIT binary patch literal 125020 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 literal 193994 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

qILC z|5(W|wE}R48duF&4g)ih;V1U)L>RCpO_}(y3m#xQSkq38{O9j%E-!iagCVvfRnP7w z!V244%M1wvFvFPm`gKP=keVIuj>8Ya>l^iQ>PLD|UGo|3_<;dd+#KaO~3@cH3WX1d9#1-3KOn;8VjN zUj==~z_+mN@!VuhaNz*{Iq~oy%*-=#D4|1n)&w4pBSuL6?B*GVUywbAQP-zz8imR& z+UC)0=p40&tcPYlvL~6+A_*uCdkQbi)_b`W*mm!oENN?nOL8L)OJ?YOv$mjauk#2b z56iTxRhR&QDM9i!nW%okP4@wJpFwCH;B-ugFaQEseLn6${={zI`+J3T24L>70Iuqc z9vBt+QZL{Y0T`dEpsv}`0gR=buirrW3kJ?-WXm-Jp2CVeGDv`pDXX{>9mDWWpZ^lw z6BO^?Y~k^$W(at5-p}9&M!0~r%JWYqI-#Ps&dbR1F39uAa7wO$*v0X-aW`n7$acZAyL4gMcXPKljPH<4zPAW;b|2N^X9owTd4K}_I|)Zvn`o=p#$QgH8$3f-Hz!EQV?`Q{aLOTGtB}LB;@w9`>$zC*u1_*yG<7i9= ziVFw^=fj2`wSbM7*QqoUh~845QU)^&W$x@C-X|S~T8~RYf)Ordy9}rFxhH5oc{5(5 zN(f*2PL*Q?vTr{Kq$FwF*f zBEoCQS9;Kh{LU@r(B=IEs7}11lU6(d>Ti5>j1eV5J+}hydQ_J{FuU`yDc=jIYY?v2 zjN;65?8q;dN+7*>PJfqq48mP7UTbUa8UlPbo`x$U8~~V@GVI$+fFJMUr~FY|ikZ%b z(PpDQAkgB_vPf-#6cMOP>Y zbO_&{G%rkg62&3;Hj4?_B0qO(t&-1nR2OP~cFhmr3;MY%Qf^c1gxxjt!$R&Y;Bnv* z1GW&I=Z3uAhq=-Pd~Y8LJR>yCwjS4JLhp^9DO#h4 zP=0C5c-~j39YnZTY=YO@iQ-Hh`mnd!(fPA!{He)dBEsWd{b2B!01M-c7NwOC{?cqE z!;#1_@GMMu{0OQ`;nP#EI+R9)dns{zd+i5c@?l(?egw)#{NT)6I<*Kq_N>2`8t8}U ze1&hqm4NE^glZ{ zN2%}_iX#hh*yEr?J_EdSK5QSJABLvRMfaEIQCyPZy|;`LBj7%nxC+D(fZ3;9Vxwjs z43+H*)0rB8K{rxlZ+oJ;I<(1_p7Oo0yP@l&CEEZHyXpFw)^`Z#9xFOD(LMl7Rd_d2 zxrYGnmy=XM2q$Iq)4CY}i{gBAFmY>pyP(&8=Lep5df}X*y67ns4^%2+b|5zUA@J>Z zm?MblY?5Wnw5WbYaah+%_LEtmI*u;J0fs0(ulQ>4=`eKO6E|J7U1t>K<*@9Gh%!Ov zY1h0?Gz|7ZMfKIa>cw49pwC*}H?1AgY4a89Aio`7-BDSZyTeF-Nhn*S4Z#yZ9Pf@Q zcY&Zw&c$M%I$cBSmip!E)iqnP_yr^w70q z-?s}>aF^!pCEdzFD6djK)?|d@E{~DEqHV4Rgt;6KezgB;=RgnlMq*P%F6Z__(AU0{C; zByUI6%_|W8x~)boogd08%gm8*6&!%!IVO2kXr1p!?bOn&?S_h^jtDvm`6(5>*5?pz zk=1GE;80c+Z<mdpRi4697%|p8I8m1Yl|!u|FNz;rY6|C~2*c9ffnjCL@1>bhK@_Kl1-8 z_^suVFQW6SLs_1wGy~x5K}PCfM6dMQPNVb3ilMWHnIXom0pX&55nbU$aTw{lJ~~^E zfae=jM*N&(kmmX6OAP27Z>PRKe)7-+@U}ThF(--e8*?vIGDmg+>Uf#?ol(8ub!v+W zqgy+8_z`nU*kb^m&rc2+Jc{VpZiL-n7y_mljgdrZ*SH|-Hd`Q^6z$PnV>i~QQhZlrHx>1 zc1fb*O*gD@UQy@s8UpKbDwGE&QG8Kl*3#H)FAR{?q}Mb@cvciDa~UHIkX=Aq>wIhp zj80sZD9J{3F3i)X=L|^jOLJ2w?11l*oC!%W z1n8c(UXvxz4#l*xFQ9`@n4~LJ;Ia$VQz6jNiii-wDc$cH;tk!Pu#zz{iMk(rZ=7v7 zp)~;ge>}WlGn@{K;vNU?aSa*gzo2|OJ>G;hw>=2ofbdh7w-WoyYKTcjiS6%nWK;F z=tp58i*KjeKojU)dgJM5N&xS)y4IaKhrz**4Hhp<5Ptmg>IE$+4;Ww{-XU{)5*)vm zXj!?l7cRWN74#wz)t~ch!iq^F|I77>1LX{8p9D>ZLJICfWST@9ZQfJZ2g2rK%Oyc{mk+ML6%cNtY}6u|2@5zUAC}(+fE7{4E7@ ztP#*Fz0NG)L3|TGS-;PH6twvUO0rtlgRTQ(4=KiwJyQJq(^s_tn0fLhl^ppX%-eo3 z_MB!jRHY6{%F!AF8yU6&d8*^!sKK0z$m|dtaCDVW9GwJinqm!n4-o!+{`BNFog9}V&Yd#v8zFZ_=1V)x`XavW`g!uG}W z0R`xsXqVQ85Gw%!D$neY!f#D88S=S9Z}jWEaBUz?eH4w7sO z;dDmy(_F0il#-0{;_eLS^F<;Y=Du${aakxIdxx`0u2e4wVlcVpc=s`=kUaSb$I%LT z1pDu9V{8Xz!#%ql{D#4)D|^mgHAepZJo~Ku4plJi!27;4C{Fg>-D5$NxwYUSZhVXu z*-6ZeOV<>Uzs+D5bHvjZy+CiACji4w1QA1dJ-P@VH#TxXRN=&PX!uE4ODy*u`@U zd}PMIC(oURX)BdYspwp+b=SKD+FcXCD?+N?hLapvJze+JMe6NXOPb`V50MIzu?L+NVe{!_Ck7Jcb;mJ z-v!~~p`>YU<5lfGRr zHWs|oNAVv1Nv`3d)d+_gOTpw2&;(|^OXSC{_QT4P{-IhQQC(G^Ca4qI3-^&0QXblc z^7%Am-=9hBh3B7pX}yc>hQq8Z(Gdur@YovvF6Kk1ZiUzOfCm#@z&R#K#z&YH#B1Ta`Rn!U^4^^{KzHEa}sz3WyH>3LI zmdDo#`n@1_Ja&B!`5ES3UE%$L>TD*}@MyFw3<58&^Y6=95zgXChYq8pR%pthcvNM$ z6LPJF8fZK90sjrZ+_uM)@WGEIk#?>juoSUO)`!k_-c?-xAykF(Lv7#uc#r%fd#xs` z=TSYGgUy9<96{ZnMmVRp3Dg0B6WvbVa0uT`&yFPr#o-DaX*3uJS%BDC4-KlxF<^ny z73uXrxNmF*vdPFF$M5l&dq;aW44jjW6H9Lc%u~$FdrG>&m&hrSkRNUE{y|#0)3(FF zCjM5lsMbBO(cf`J)ma9=s(d4%GM5~RRQJLYNd zf~RAVR%hT?S?Ce9YLxHb8n%yS zr3bE@$})BCMDK$tFEVZQk=@kL#K?i_^G?L)hkr&m6h66=bQW&?P%8I%%wX9aQ0=`Q zH2bj&w7#b=t%^r=;44x{@83o7nmMl)U|%0RchAvP-Jlof9EsE}i0%b*vNmn^Q5@qB z%MHn3t~S70T53O=eie8)-#jLS&dDBco06yZ8Gz&8w$T}EM}C)!?nbm%kw3*|rCi8< z0>16LpZeUk3mlwH#B;`?xcP>d9jedTfbgE~8l`=GaQi5s;(^jQ^f+00l77b!I5Q_~ z_Z{V#(`FW&V;M)d^9(py32J_pA|+HW%YvzA8*MY2{dCsLsIe_4(vCXLqyVAQ%x1{UovMGK$ZGO`FibirM^ z_6q@C+&dpiMj*hEm67igJ3C-n!!k+3VU+L9c`owZS}CO7_cmV5st?x1pUKWab`~Zq z?x7I_%5PfCD(Y=&2fcmoRIpZ~@MHq;^SXfQlI0Fm%%Sz1k78!L{;dJ-`*I|ghpZH) zc#jsTT^NPwMM93&>Ej?p?lx!2j~XyRKVfxK1Nn{gQtG*!CV&lCEG| zdh;NNT|b3?#oYkR=`8pj8+Ae()BOVb#=3!aqM2IgQB?Od^>b3u*KQz5`c6%w0o92s zdL1pfqZ>9>J&Ms98UlH1f=%-d2+#HNK@Xw)253+|nYx;d>aSSTUC^OHa&}2hX|H7i zz;zC=_wMV5MxmEd0`HCk>SRi3CdYQjFPcPFC5G(r8C2PTs{ty<)Hk28E`w>2hUv`x zwJ_tPXUWKp9zZ#Erp)hbf;pk{3;Ebw=&ZHt_*bNFUS?AW zHSu@C_o{)f+7EPr%S$vLRGIsri5bS%leZHnbF!efajoFbS$`G z+#7K{rx3i`9bkT81LZ}<_V3eb=2)+gk8c_VmS#>Jvl9+g#j*%GuuYbZ^H5K#cW})Jq^mI3tMrdn2Pv&)iOuo@Oqo7!# z6=Z9@kEoAp1eyo;d9Tm*K`!PU2i1acnQ zzr001zN}09wTN1q?LVfU^#6^1mwFRUCSTe(mvgx22Qam;8572k)Se#lpZr!!BG2TtGNNQdS}Pv> zSf%4IiG1lE=Hs<5*WqQYBN0*>KVXf@ogPLr68SUQ&H}}>B()P|Z|!$qUWdCRSyqdS zzeCL<+8jKc8=%GV>&KwBb&zAzn7_7d1B$WEwcS7Q1BCinu#Xv%)V`nHX_%5uTANr% zaqr`cb-20zF42kR|F7wH`2R+~_UflOj#{6$#<7s*8?w3aH`{-|j?5&7|IPZl zz;JVz?yeX+Cp#xwJZZ2Y3;MsgotwFhhl7K;CC1AB62{fq9Ovw8k0;amd9}9-*4z=} zf+x4ydZgGzJ9ja27dtC^2P};%)(w4#HFw{<$Q@%#gQqYRFeF8tYU8(U{d)#ai8b7g zKG3jpb2o8wcQwUR1?d`6qEDPQ?{dRatCJZb@j>Eh<>8Lsep;Rt{f&MM$dMIpYlo**4>hDgeOP1NtX%C}&^YmQ z|AuaVUMA*-HOJ5>ZQkbMu7^EEgWtJHI~-{+4$*Durb>!x5ZH@KBv*FM%aJz9opK=J# zj{DU$$3JzA``H8MPr~7TTiVV2u({mkZjSCa{Jzs*8hwC%er^k_hpV#_em`z&RT(zd zln#AoW9Q(Gbv1YT`7PIP-|j%)V!Y5M{`DQVI>Xi-ZdiA7YmBF@xewOW8Gj(eaQEhg zXsVu=&FP{&@3b{Qq~oA`Woce2zO_AY_YQoHsY7ql*JxFa(FTHjd`!NPq3lpS#BjFZ7d=zZOx$*~#`_ zODMdxgpzm>9E&&(BKdM$%Z)Q-#Yvy0a3q@^;7Jf`WI`eIMLwG{7J(tG5#mx;#G0H9+r4D z)YMVaKur_Jj{9wqasU0w;*R3}vO2geYUBP&;=_2YUxd>BXA+;q{gtvu@H)S4(EU4Q z^?nIJ#Sq+YWWyOAOL(eux%>p$HYL=*3p=OO5)^JlT*x0$d zBTHwKba_P@AmQz&|3kQ&=$B8M%0*?g?6H{NkmbZ!kAi6-+cYsAGJ z@1#jWx}}0PKXgV0lJlQ3i*-{qZVGy9BpuN#J?z|YTb7s`-sLCrZSgVI(i)Es!3hL! zb?)ThXlZWaf^o$-;$78A{`?H{^D{Sfk}Wy-2Xk*)P(Lp>N2(O>u4TCM&rj@}Jk615 zfcMb)$)a0bY+dL1^SYm%B17%xb(geoNGl>OM27lsw8ne=eM$Zh;%Kfe$Uv~h+R*%3 z4DGE?l+Xuw@2w^IgO=zTH@pvy0-0!z|Dz6n_H+*8YKK9#(^ikZTRmk7Rw5jwz>F{e?a`rE( z8~4A|)>3~_g4ee?-m(S$NeTWj;lFBY6{M{Lf4flz?f*Y?^yYs5siT9pbo8bFwFm`ERN!Xkr_{m;b4VZ~dq0A_9rKNF4j$xBfrb8GoDZA(}rekK0?5 z{ZkiivgsiSeAKVOMsE%FU$X5Fdn4wz*=^l%2!99NL5ijqyLrc!Ec};s68GEmwEnOm zwv=JWe^rJ*tuSO5VqEce(In$hOF%6VwR=eC{0}z@4s8zH=6=Ba`^DTEyCnYpAFG-4 z->l|?|2khOeDW^}rTl$4Q-7Q9pGMQa(f(;@cIjw#|F{^^_=mq9mGRGuk@;T-cNqWZ z*J5P-eKE3s8{GfTV&FDcAP2Qv)bdcvN38&7g!>Dh|G!$3O^*4G8KDr3sOUG!ZEno} zV7qP2uo(4Gf?6qRkN@B8vCTd6AMb=RG=}ou=CirB|LKZVpgt;5t3vGwYEMzCMy&?5 zXJVV4G};ltR<&IuB%5v1gT;hAxtpr>uRpRR^ndkWSs}NQ_`lSc_)n8w+{Imd%cA=A zd(*ZNbMaPD*zvoU>!p#2^VkulD^rCGi%O(97Hz7D6rcRb9FxmgMn2oH28s}lFdFF! zwyVm$gC9R>nO-(3Veh>uz|!V6BfG!nMtet|<8^vw%vd29-X_R+{AqL`J)j_M)@&|0 zF%wwEN)={N6`lUpsq_sUK8_H2Zfu&{aM(kTg}~zcq@?k!$kog3h5?s6)~T10*|pvZ z3E#C$eYj3!sP18lUkfR}JnG6HBz$PHo-6-obxHM$PbGqHHLA-WO25UJ6%W3-SLn@Y8QrqOdWs1WXRqQ+ zfiLAbsobVVPYztX!ZYFRs_J<~Rp&+cuy5iEa;&s)Y|ozkr6qirPp?|0PjqFl^W=}u zpXzH{$56hyK+(sF$>NK3)}IdlSf75op!kwr|BtsVGU>`n0?)*-^pe@fYQr1w@a^*ek= z37KsBStI(00ou=*6y@f}6rM3kzcOa`Q)g(D@?DW zF65jRTZz9Jx4bLYBt#*-v3D2AUA@$R6l`9!S>CN9RfT=BH}3Nj6QAw7OC0Qfbk>Ua zUSgm)Cvxgauf)L@zLA_>JIx*tue8{WHitW$vb-?pkQ}?rUgz2qy7-M3YoM?*q)qCe zL2A~g-7n>;Ck92&vo^@=aWTB~ScL0*?|UaxDUoKTh4+k>Q_i!A5S0pOOsT%D2UY%yk4TueR?RHz89Ynhr5= zpIlIV^~2{S*V|VLYI`t@J&ez;>-o?x=Rfe>O;q_lv!Brl-+G zmW0{piF~V@_c??~8d3N_)icHATS@GzZk}C(^8J3(cC4W|$Eqbl_L6Sa4sC!XWwLonJ zPC?Fo&*4WAtPjI(Nrc6EYcz*^bxc|)X%)3f74h7ES@oKc$cT?_;8k<(#-U!TQ=fWW zo3p%cC^0U?N)&3C3q(0J4pUams8VRZ(x59Ew(dT8bZxaHvj4~ZMu)3stln(gw~U$P z%cddnx;c2=TDN*wmD!?aFcs9|cJ5r9kbLHDCsnguSr2d8)QmjtIU3hM&VtI?GtC>T zvH6x1>bUKZyq^^8dfL)Bn(N?Xvt)nO=k(DtA$yd{9whu&is2*VU16i{5f>Po-5psU zeC&9G&RqYS%5(#@@ne_C)LD*wV{rGC?i@J6*&kA5e{pY{@`u9-JQ=mD`Y+hHmfM=D z^e?Mq=w3a!pp%*@&G89dyBUHL67!uk?V%=PE;th9)!t71qoKW3nTyeb7iLEvJh4ZW z*BOMjnq)UslDr)r;ybOvxZqCbcfcnGYmU7hez=b*TJnNXB6}_$MF$J%?xXGXFT$SK zy$B-siI}gPbj(f~H&#GZf;5?qlDRUZR%vrj-IvCx^p;Rf`JE?AHo-)@@FkyoSytE6 zMQuJLImQzgaF&WuR9ION%RF*%Te`(7C#Kopw?Pj)1M9Z=^OaL|^VGFPeNg?ePo7Lm z({eG|HOfjlD~9=mOT}Id)u(P+o}O=c^v@U>?V?#s7ByKMw>AhkZjo~$Y%EHS>jI7Z zx0J^@Rh^YxU!C+F9=Y1l7M4Ct|5RZ7*{Tbwd(R$J^c8v#s=#ApQK0Q%->~km*q#q@iz!n% zy!VfdM~PF@@qF}PrIGonCV!knh^NEs!z#_l*%fsalf@a?gC%4t=RXqTBo>y)t!`6X z%XPU^P(ZaFP|*G?y?a`J0#x3YO_F#SCl>M`Gwsst(p0z0qxt75tK%~#%X;rd)KA>L z5KP7BaGB4(*sZ**F*_^SCn;m~tlN*FjH`T%J9!nRF=a=`if}tl`%zteAM?&a*T7+Q zD(fu{i3rIBf(KHPor#dzKZCK&e zbNv>{XUTybsyrAM#cZADSJ$Gxur0Fl1o~Z?i4VO-x&001`?305m%WkJ>|*57wHJ5uw{&|oIrao+;RY_YoE%El03A_Zte0Hga3A`jShHJ_ zB#O%EyG$y3=Lvr)E#-pK2d8OoaR*VJx-2k1<24;9_gbo{#X}dLn6I8DBk|_l5;J{j&71HQzc&6ZqZ4__t@v`NrEXvo{S!igbj?T;h8Nq-Q_k zFcFt;ZD3+O)?7{(^@3RLG+uqOuY5jB)4mJC&AFdm%I}-kcgDuT$|!1n$szfH(3{ew z8vA)%KF1!`4WaB>erpw0Yshca#3*_xl`w8m7=V*^7Eq9rd}@5n#K)~o<5=Rw9&DcB z`O2;{wo*f%E$m&~_`8DiU+)MF;`K>C_t^HePJ?NB8kOwDz*flwEx#@jT4M;T)ls zM`(ADpSDbR@IZs@{c&A$gGTXqgORAc1*dch4Jf7E?i4V$We;}}#FV4AAG#`eS3OgX z$4*}`fi6=@)`>y?a`;Jg-Ntjzh9#d@8egc*eq{g3a6Op3m}sA1%*f+tm~_3Yb39@j z(S9k*CW2k9J%D2RtDmg?6J;&m*Em6(;& zdBpcKd84+hPj8*Il1i*n1C5FzLTQ0_Y_tZnm#5<-(xg7g&o_n+5IQgV8E;>Gmy3_G z8G3z~kG1lS>bLERCa<~NckL7!v16o3&eOgf$X;36E1U?I4 zVQ-D^o9EaamS%~4ZkT@UUU3g#VQ zc_&N?7c~wg8s#2uv;BC?FLik~Me-|$UzGGai_)*$?XB0lX5CDwx=vx26irhPDXGv` zY0-Q(Ffn;r*4lMy#%4e=FJZ+8%V;V!_a^4yOiPi+UfG8Bi?1%fv`b&gNT3Tua?j~l~1_W z5@aK$U#@n=>GOTfi`uWFJ1OjKVoqw^66$gox~G1oli&B7u8xgSvwPTuf`qUOCOsW1 ziB*On)}PA`F@`Ja9pWE%3BMD*?Y#~zkMEn3UHp63DL0SJ#7+$m8Ce zjx)@_TCeF=arLNm+IEI(9e+~K$ZS$jD8g;?=ukYJiso7Ti&Dmlv4K2HXg43lrJ zHGWlxRV=A!>~uH+4&^7@6gCk|vM5e;oZi{U*=WVpIng`W7oL6T#y)*|%yO*0>0=*C zI{KkA$E;SA^x7t}@b|;#o-9qNAa;UX!XJNk|I8b2Mh}eiF%xCX z?14k?&hUL|TCG%bK2~{n#HUHOa+x7QPA&U*xT!1;XHPOe-3_Qr7~cK}5nE=<)jD6fL)DDa!}5%A@iUHo$6Ie_nRb}I72@<}eHd-zY3aGl zrzbFR#?#ZoI*(dWC&ojK)=NZJYIuKq9Pl~fH6$=zm{_Hg{64l}yhCA<@W4&>`1c$A z^5!$A!d{g0e)ns0I3Fk&>sXenw)fS6BZAwieP<$eFZnYS-O{8xKD8@jr|Td?l)g=E zQFS5XXDRnao0rn~`!^Gv2#>rBj6L&amaOjZj0mR-U83jk&U3vaz_FhHncmuQ#d@^m zvb}WAF)j0xN~6sz6L+QJmC~iQ#@ZRy(T~6>=|R?r>ZU9Vzbq`T*Ch_94{4 zg6zOI4epdjk16Gp*o4mD`a5wL>o-+$ccR#(r80XMdERq~(@h4hrE+#P=RB=!{oMUk z#6~l-A~mv>O866X^F(o<#?jRJ#++>bZFGCO)im#ny`ix>ZYuLcW#(f@AZG6y4)CG$ zU7pIy$O{P&`t-s*9h~hWZXWj1=o-U4URd5Pjd^=u{;A1#iG3`j*6Gpv8Nc@~l090( z>y1+DkJR)Qv*GEg$XU1Z#x=>K-uAE8PO0oSy6`UD*=J>t%A7zYv(OkeV`&(I3pWVU zac6VV7ulxiXBu+&<&O5}KF1Ry#wMK@-aZdD47M@;MsRIPYVtlrI;tc`T~eJXED(&n zlBn3-8Aq@)S1$2M=PlA?YtKU=f6!$9%yqk@Zl%j%3~+I?d*zf-eren-$2Pxq zpY6nFZOgcbR8H3fuF#0gMSq(Iud)Z^?*_ccPumglRx&N&(bBnswGoUACBFFUwP($W z7rXt6ac7;jy?u8s<*k`Z(6fiL+qe?dn1?0XHK#R_?qsno@$J~RgE8VpkdVLZ4!2Pw zwY(78mjvCiWDBulW2GugR~$qK`9WY4xSwJ5rJ{&K~#TF{mbF}t@Z}%mUA4V;F;3~yLXZp1% z=aPX6H9t+2;y9~|Ytw1pw>^HPR7ahArV$~K`gglMsRB*9TyQpEkNx2QF)@u8N_r|^ z!Omc^jc=s@SfTYuwBw3D#0WW#Pr4hiw98Lieq~_&;u!ldJ8473t|`v|r|C0sh>)yI ztf2AUZ0{g@@MNZMOkiDlP0=L56)($Dd)>Je$RC%b8|p=2akM0{supj81l_QznfSoj z+&y6)o%W*~>6nSAkNtPutRdyE*X%6JrzX6dkKP8yT6SkS>UL#jpFar~snn-TeP7+K z>Tc7w{;?0-y{Z+Z|ut6`XpDGu3hMK%bDGfCdP2Q0fs4&(LOjHF2quM%ld^dYPAP z0|iNoH#D*RY292J^+;d7&NNGBz2ZSI3v}^r$UV~PT|}4kM!0>tsz^L zBjI$o--ZJWxT$txU(-x`vMo1(m=(<9k}jm?`Otj4;cZLzRS_Eond%%M~q-er6{((3pBr@-QoA=`YJ6u3a5$Th!98oX~D^H7g)|bGG}~ zNLqP~S7IHc@w`nIH)beXBwGm6NM7_QBeF3y^NCCxc6th$In)Ey{@7kdNsWufp<3`UL$ybBPrX4*6!j zqV8zCa-YY>^P%d64tLR?PM*o#OAT~28}yDW_nbv^2VMDkHrqsQ5Cy><9auurDCDwb| zVEA)b&NTTlT(^lA{hw=Jj+ako8TvYlJt>5KcD;`Pxb_*S#3?^+d`-HqBqf}_zYdrn zeE+zmpYj}ViZh|@*gw+SyN@ni&yXZ;GV@D+Nxo}cu$ZFPWZqHPmUU!n$!BD_$2*iz zb+E+nsMoy&6SooBQO3N(nfq+Fj}reh$Vz|VUlEi2W&SN+fO$s|RorJWypRzyBA&T> zk7|7Ex+7WPP4pbht6=@wlKF-zqY+2dnL0rxF4DQswgE_ffIxj5gy9pqaU@hk?Pq@{ zvvRI7(-D0a3Iz58sc;F*^g<|GnEd@|nt}mAjUkqQ|mvJYr>93S&ur zT2qA+so)aS>J8O}OveToE|eev_(BqR5SD&GuT=%h=GoakCz#Hf$(w$ByEnf7fa*My z!0I1mPI3DJM9t}6u9S2`csbj_H}z>Hw=QIsV9Dhw8xCG^EeU|8Ga~Wet1^<*BVb>s zl#gsY{j{raxQ{kb5ZZ2u-T$dlJA}z*kmaIV0~EEMnOMhnw#-vEJnZVTVZR&UaShaG zi88zxDhKd<3;$^XxfVC6%AFl${kXjKZr=H0tSFbCJU2B{IcP_SfyP92Zfi`7V?HDD za*%b6V5DCYtOlbhEV7l?2-w`ufGJvK@s{x!{3&j#-r|bLM*+s4CK#}Vl(Ijct! z=|9H+Io!{IiS#uWmQ0X!v6mzjUQv%qI^dK6ESPbPSs${=;s-kCpjh$?#V?As_R0;` zjYs1x)C0&cyM+E$O@j-J$e!0w716xNcnNPDw>7ctK1OfJqhH3;T7I3T#D|GAXyWQv zWx^x^V@yE}T5%4o0%R$1QK3pd?8Cp2=h?P{&sz}>P}YIh=SNxz7=e?TQe-j%I8EV< zG_lguWb@+V?;-3Jup|h@3V`R~e5%x$=V+WB5cMUIn_-!8iJQs--oc|3lHT;OUBB*v&CzqyDJDCs%uD5`Kd1*a&X!@CjVx38386q$J8nTUQT-h8U8q;^3G$fF_6 ze5{F{B7{la@CvXA6fed7Z7S+Rc%W+sj*YH~J%N0lVERXDCG z?6;LwZux`my9K825?+zhM8_t5qqHu_|NI?17e#?17I0uFmo(w)8*bWn2@ioM^N{{9 zxWdXzVrEJSI3p#_GC?DB(sx)>fjDMNThpiu#jFY4m80ZNcVbt zECR%V`d?@Q$;^U9YB6s~Z82$rjB9ayZ2SiFAsYK7IY6Ta;ag#&{g-MXm;1TYkZ|;f zaS?odY(V?trfMOg{S5V~4Mx7>;Ld#NfRV3aIp9?0FOw8M=ez?s8x3RQU*X)(Y`xd~zMkONwI*L#6xGA0EjzeZ^$JsRwu5w4SgyqudqLrej~_n>aWF&nXh zw50SDnHZ#$1hB)F-gmI;9ntaiC~SAZIiCK8M|vvwd-%*U`qBhMQfZV?>hzd6<6|mD zxc;|9jQ0L>^0Ee_sZtU-gD0v+7pS9G_V#q&LKN(aSdOqo&YDmU+=J>=4K{Np?|6;7 zp5Y3sGg*jH^MUd~2Q_FPl*i({q)SOmrs)DEP@{JsL2hQ8ek5S6+7y!|!m1qPs_m@Z zY79@{qf?`1xj-GiMWxtwSlFmUo@(1{nao#H+ z<8-U_q!Kp~1aB;Q8x>d=$E<(ls2b-`uMV=7^fRrl?$c{rD1y!yu)6qb(q5(X3IwkWn>Kukp2*e zBAl#X-`3xz5N{u$*QqQ!&d8UnuM&@013R1wf)x^ZnD{1U&`E^(6|@i*i#D;7l5tzX z#7&Iw@yopb=w4zat|f5^4?rt)k1l-5?z7bGr}2&Q$hodijqY@pwZ|)LYrMzn z`3*uV>{BoMJzrOr#zHDSL81dSp5Hmv&QzSxC66shb~Y#{o4`72y8n4sv=ycsiNBZmJ;avz4cgj|U_frS zUp#q?=Q6oN8QnPq(hjl<=_w(<;SlhyX> z5~I374rvCHS8-Y!FlLAWSJ_kEf%F_2s`Ia5uEcMGh?Z>PV@mf#KXDr9GXU^nIlgy+xi zQ$~gvj6{8PiIrItujcQA))o7q>(1YR zKs^xbbKQrLFN;3Qodw_&`;Ai1>%}>FIukhfi zMhG`C1}ogGco$Z`F9(W-Pwu;dO#^@QyTBJDCwl!JX$YeGN^BK6kIS8B~EaQa=H1G<<4LOd(VoIxa($>e&QPn9>|yh-94CJIB$5_fhD`UvfUcbOKX$bN+~Jca2>kp89(Bl zp^qA4;u4C1E3n6m5?3AmD0JjiqoaCk=|?77d{ZXBK#h2=0(2s|!{RcoTz7rc0Nqg6 z15h_aHJSYWF?(NsCBomM`^=I!WRh|X7@*#V$@#-(mxKrOcF-VES~)wwIOm>uVK^>8?JSW7xR5!wo(5$6pFJP8Os(11u1b6sf;k z|L}n@{co**{!^wy{|}kYUzbbh{+BmD|6B_-scu+rvLSoTs6xLsf+j*Vbq_M`f|_UW zHBrv~o>D_@9Mt|=EbN!K9Np8++$p{|6s<@uVDN((xMw?k1K$!mnF@5VhTUrXypucc zQCgG8*6Ef)mBcAlAJVKwC>m3?Z)jNFuBNplt_P+{A@C(f{Ih6s7Zc3P5rfL&%uE4Qwoa@Yd5#!?(vEpCC zY`Zc`f8HY1;JSr0zir!ZN(v~90Ba*{%72QSDc_Xh8?V^7!&3iPo0n;cJy0bLUJ=u% zb6zlmxVz+|FqzoP1d)YmC)MaHblpE(zfAbOSq6&ZZ#e0@(-gqc1ygBArWc+=B+|EX z>zY~5B6T;*g1m8QFtn5cAFb_R4~z3V;oV*&F#dFk<0?v)gE)q@)iB$jz4@H+R(;JpT-@fjR)Ih)#$k)`Z1LB3ex4|{k{mhN1?``OdA^-D3 zzyD??2BO8OUdM|m*b>)!S>trVDCsvKMmMLF5_8*U^Jy@th=oT$qv&DdU^T;QvC#C4 z;@3bsKb+S7B;8c}g7#{~_KLlrx9^vav1vJvB6|=R(^Xv*fb-Z96)MQjj9U(lYyvM1 z$Y$n-Vp9Pqd)J`*2Jl7#$9ZjGNQgJqSIf<-R6-+xnD6w5Uw{UWr_Wy}V<{Gn!@Mz7?5s=(3u3>5 ze&+v?!tD+93mT{%d5IH{6U{kz6sc=dbHL~d35^j3I-0bfI8;5N9T+BCy{=BeS)j%= ziL&~AZsbyUC5C`4(~=GlFQ?l2^l@Jxy$rGe`LL@iszvl#kq7sWxO@3=(XDm24QuNQ z&s#b4gYd=4c8(ZycfZYGjE;^N`5JdLI(F1LTBcZsw8|Ef0FA=NcybieY>4T`;E#<4 z$=q18fDn9_GpOk!f$^#GceIjYiHh|!WfPf4qh-2&OcExjI5PP2y5R@V!{(JEVHb{s z+`_mALwT>NtEX`4cwb7qu$wIEo@Y+DoMv;!zPw#H?QVQ|1=#d(lwZ<>GUI@!bwOTU zN6I!Ux{H}k4)316eV5X4pUalZX*4>Ok;>-AoRYWIh6*B=VRPTkj*%6f*LEzHV0ISm z)FA*x!C<_Z#({zu9+{Z;>X*G-YetLum2-7gx%T51@*{-kEhFB0`t$7TmBAii1%6U*iA2-T@%_U+M%&Y96*qhX6U~Sm2R_rzSy) zZ!1iOOurBbDu7gg!;?qQ7fDc!u7iCIuH*U2i-sgLG*k;kv#D7_qpE7=sU|wQK$d&D z@$)5h-FbaIO*TumN^yhBi{r9!;lpso<$CJM#hG2ehG{JOmHXK9_%Z9=%flYAr@gq? z#)=#-KVo>jeA91(&y2V0cMGgM;uhZ1iclj;LxJqwY;$q;-3+arrWMH@ns% zuo##4T3r@Y1kHm^m6TRCR}dgYqNOb*Y)SRhsaLlhnY7@6gs0iGzr39oRPMgeo;_3K zfrz8?P{)4#c!WIul&o^*^jMfYDz|a}0y>rlGr?KTd75glg3*N$qsCjkir|^|z+|j0 z%T*@l21aEeZH!uQl6pv}OT4$xdD^LyB)7LB5?q{t%Z(E%VYa*$4$+qM`DyF|1FM{ih`w2NlEc^XjJdntz812j ziWcx)Q?j(z3KtWj*h4o|Pls>Ga8-HgIBU89`RrU-7!_=IkU52qodrz zQvWh()n&;rpV9nP)!V1>P0FXGw`nR#gho4yV9M(BWkHdZxyqnm3_!BUVEO~&Abx47^T<_{s)G6{3UKQD&{@#Yjy0}2 z6ItugW>B%XY8>7bi=;id8qer9W$P}e*l6|A9=*b`n{ED?1p8;(5WPvMUh%2-Z#~m=8QZPeLID5vcO!$vMPS7 zKpvXHX2oNr!ps^2SX8#k+;g?#_0(n9lxA9O9{Rp8^{hm|GAyhvm9ZvNT|W0S!ZV$m z-YS}cvVWm5PfP?JSa;@#BMVkGmfLDbN*ev#CPptPc>OaVt{5no6uN=jijIm z{(fH6*v8IXg6)CQnLw9U%7QGCruoKfCi?LqreceT@Tc+6)v*-GOB!T4e7qWCUb3<& z;=ER0XJ$=W5@*>lVlh46x=QR%`rx!=89+S;7X#lue5{ImT=wuET`F07xux2~xBAqk zq{4|BCo*m6F@tH zjQebQ_+q=LtgzxDUU#K6&?3*k7b7$r%)TEHezb$3#4Vc9>3hiQa7TrznTwlOc#{n= z0y>h*k_DwsdYk1h1f%u?8cg^Q&u_I*2UV*9!sfY9ZKeBleyv=Dz_?H6ZE748E-WN$ z30x0~@%=HZj%+uQFg1lt&Ra7#sGjP|`+0<5Qg3ps<)M4%Z zEXnd+?k&sns#9do#gKJXwbvy8gXKa1GK{&xjC-ch`fO@cxTiaWH;q#Wwj+VT@!|wg zx||{HmO2AZ%j$>~`1#WMb(U<71PZcoHQexiKh8;v6d19+kzBDHR5AE>ieZnh*EEI* z<4yedbViWI=_A!hZ_7->bjsQ!Kl4kCI);AHCJbAwPTJ6Y%}M7=c2rCciOyBuyP9=y zv%#)10ED5*@r&BSnaj(wwA>{DO!1JCRAK-CpfJDxmtTqcDcQfHyG|k9W{fKIkC5>X-*^ zAcRJ1!QeYrjMhCHgGuRyjALl9HCw&c5rXESJ49<#{9#L?U3i09e1+GPIZ$2NX?OSd zof7-|$<5pKUJf9Ja=M z)Mv<(Q=l88)H)qgMMGpefP0*TYSJVk=&D`q8x;M;Ww^Lu_>PK||0qWE`t;474h-U%~sn)aTyz&=iCN4ojYA;bXZP1L^D8BV>1Cpg@zbpJ^VK4Re! z@XD}5H8UN7m=(^8USndJ9HZ30`u5|DbD!pG&%?wQQT`FJ3Q_*wXyy1BbG*^qBDgvR z%(jl({hTPS78=cL4D}9Px;v6XY!%vO4EgA7R!MJtc4^0|i9&mVp=-d5Z@0oO&>@}@ zsM}$;O%s;4O$Hu)?{Zq((w%`rEXuf1LuJiUmu+|*aUovC$Z6PESf0#S11GqYS*uT0>HHScnmSJ9;#rNy~1w*=Q0=B-PVx zJn+JDN0X>czD^DtPf8qejTU1&@`YfaHmcywOI|kouG&r-!#M|t09|P}_toLf`PF-d z4-k;9)Y@XJMH=r$?1b6#i&KqZkaGT^|M~?N zk8Tk<+l^sw1IZr_>6h)iDREO;Jjf&r#E}s1AC8@37JO|zu;Zs3_h|EjF(lk(c)YCY$@GIa8W4}U%{QP&Fc+S=T!lO6SvUho zPG;TtM~zUP%Yf^KXJaE9A&I zTJ$Ub4t+fMK6l_M2#!7`+m~Jwy;_LoezsLa;#x3Keew(ctzLbkiy+3qr#_C05E5Jv z1VlmDd5W3=aA`qEcngbe^GgN2L7hi8kbE;D65J1mMO;d=U zN@s$NtvY(qmm6dU@dv6%4Y^CFv;4J`XV?f|IEIyDg&wVV<8_By6&_kEPY~KiGnk&d z{JPXN3J z`(k!sBwp^h`C_`ncYI5D=VN9*?j6DY7clj?84YpPx2*NwSR$X_X@8T8e3G93v?g7u zZA?0eQe>Hv%%7E-`%p3XNLDczR0-#kQ05hxyRRZC;m<4gmYmB`RPM<=fvSpc=_y{d zDcwe*{Jo)~Ad%A&zp1??%GA*)qd~SU>QW#1*o;XeQrO;(`+LaxSo%3-d)zppBHH?x=bH2!t^b9J?c&SLPo80U zWpYaQa_zfgk?<}l8PAw}erxhCUOD*$uuMe^aAU`w&O@N)X?+l(P3(1~GJHJO4cc&j z2u!psYN_m^%44I8FmY?v@vhy5>#I@ce*#I{PfhI^QsU?Y1v9ABP;$eR;CQfq}{E5k0o-*Kyv`)}gp?+nSx&AsE1>hipz@ZbK$>m7yeOLF~j zWHBcGJ6?|q1pj~Qx$ZyA4e0+kjr_&wVgJpOT$O^1%?1N}*Rd)z=bA4u$*JrYEba=eEv{kj&PC1swYV8w;3 zYF6M|?YF?XWSnhZFheZj7T^Qstb^(boVap65!AQDdp{hFTE!E149QY*@M#SxIYOEW zZpyW^loSkWs;A0Fi2G-aJ}@?q_|l05hNDKx9IS#psib_FSu^vpBq3*p#3*G1RXNnv zR&*hh8Sh#h`c%<~^RU=$Sy-?~4zK9I}YvOV)muW1;_v1<|6+j0)Zd~Bhl^GpJ(?j1D1ifUJT1d0Q~$7yYhd-J<`8t6K! zLDq}&s|vEd&KK{<)uEYs$*-z^m$CTyMwSMl-Xr6?0xGc}Vot2dm7OnuDEQl(g_b-c z=F|?Z|=4odF(Vj98tCQ+|koL^#XdPDsm`9cAE|CW4;Y8?-v{xMb?8j&Oy7 zD$F(;IyUZ7l&!|mr;Fqs0V16zIiQh2wV`dbqg8hr8vt~8pK8)*{tRg@y)wx@e)Mt` z(zQ?SxB$|xJ-0rZq#Q?x^5blfTeXdA)p;31?pH8w2f6mRZ}FQnpL$j^j|Wuf{)2eH zBv2j4`6K3a`$InbdqJZx2=o6%g8nP%K>s(X`d{i0f)q7va756WSDfh=Sf1HZwu1$N zgbZrNwMD)c`U|pVk-;Womcg1B#@v#fYtLMzUZGR%nrEZPh4OXT(E*<%4A^pL0zG3n`Z5uBx~Pwt9k_XKIb|Qz z?sq)l%ae8jIoUtIfbD@=3z{Z1W@=)RtOa|!W_+TC@~BUq>(q+gXPTlvQK47@ze=ZY zLItuRGpulCJkg?&sK^gu6*HXJjG^~uuNv$=dKAe;au9T5_dVBJTCqjVOGiOOST_kYk<{P&U!YZnZP;hbwE}sIRdKV*y~m zzK@nrfJ)Rxjd~_}fmySbL!q&}C;^Gwqu4}G2x^%2@y6rut4^E5PkHdwz~$qOJw61j z@k827lAxS{h7k;-1{YivKpOI_d8Z1%EiYoA|Fg(diZyBqg>qa0?_p!=K@|c zdQkfoB!t{|Gh~E3eHMSwIZSLZsM+r7pUC`i|guB3MZ;nEC#^zSQb(k}A0| z;Mp^*9-FlO=&l;vlws8^1@7KA)2~1 zS?MvYx7hz0`#@@|SZIy|wi}gwg*ny`ujgrdNMN)c;}T_y3w+{nY@m{ynNB#WGrgF~SEu zzrn^)Vp+^bLtQRcO)b)b?{S}_I@CL^GUa`CPbbZz*BiyVy8qto^7Ep+sm^2S8ZyYZ zcG{={K{n0t`c|NYyoZH2B64}o@sU9DN+B;h`@LpdRgs26#pL3hLE972RV8cPt45F@ zhnbd;KL3ceoMlzNOOpTxWsU{OR2U=l2u&+B0n$K~*4|Fgd5))T<(+o$U@KI>@SYiF zzZf}YE9csn3ne94Ask1kQl#kOW+bUIGu8Ikn|rf=08Y5hG6W>8(!{T13F9AeM&+W< zoc|*_xBO!t`0wMa3_|_?XPo~P$I1VF#Q$d)=N+H2=odhP*yXO{XLDSUVW(}7W>lge2}{>Q=75TK(f%@?X}8@ zT)RAs#FqB<3U&o*oF$Rex06X~{8S~-WfVK(3{9+`yP93RV?K&L3qI{|iYi;-_dNcE zpXb<7Tsa?QM|mmJ*2JZQ8>t;%mc?2X@j{eFzJ3S|olQ^!h{uxG28R%Z#<A-=TFe>_5BI=;-AmI4>vam`rn58KV<*^Vdg^rmzfLwf6Q`! zr7`M%5!5Y(F6({<hPGCzoy`aVDhBMvCXB|Rm!Jdbc~BypE>c> zev>z%Gq@AiJF#~okl%2mwLc4hIzsgoT+{^N^e%d?$H9z%rRG6Mfj1w1pBJxF`LU!F?+AEfQzkDiPe)!&h6=6tA$YXDsKOg+K2=F{}Buc6;si-s%0(e4-dQ+t(n)OD-1-&|foXJPe=OTWC@G;zoA;_&RN}A*=X{Dvqi#U>o_}P^C z9KE{DA4-R!k%JN{6udLATj`1qX;en}Q``uS2az}qOWLZZ_a0gcf>Ty2W-V9%^z(**hdTvt(|n+?$0GuV^2i0B!P9uL<%ZLqeWSewKlMdYaXCz5N)ES{rk~}P5AgGeQ8{v(N-_>(q z+6Vgp7?HX-Y0kG`9YF@DD*L#s zddYIjTh8AYCF?G6u@G4$IcT$(iQBu*eYndT?wzBwH;q$Riw6(p+d=;U8~BrokF9^Q z4E%4ij1z?DZ?o**cf-Fx1MlxMOF4$odVm35W=3k|)NkKM;a z`GduOv%8*~B~9Ej9?8@2si|M0KfX+E3DM`WZsQ9fdW|<3aaHII;_*Z>qEw_@T$x7O5z(mT(BIHSxFZc_aS&f7g#^iiQ^`3HbGhx)EsZ$>5L`_$5DyVHTmDuXJN73OU ztgD&^k!+?I*tq(u=kCVt5lsW)O}lM9eo|(r*hv3 zAP5$QfJ8qdTGXN^iCbcopSS36eGTPQc>Z3P80FkioP5pbqQowpQ)MaL^|ntvvI1SS z!D5_L9VumQIo`B%Yh`+oDScUKu06><#xh4ICUE2FQ5}0Bp+x@O52b&Mn}WyX7DAU7 z-}8y4d}8fBOD^Ugi71{ffz!KGnJ~}JKVt#@bZFmqmz@b)6B!I$dj0N zRkd&I4O(MRSYE0{Uu&o7q4OH`)0gzV<4BI-xqYmOK3A8M5mjKNXyJ>?K1ssp4kA=# zB0J86r>GW7xhtJP-1B4agoK&uo-|pRMXMXK21}NT7d57cKnf=r%2hbp6|zu%NpF|N z&fu5`;^ZHIF>oXVCMJ-_ik`B*+&y+qZotc+cmNu!GHKR_c6@}Xq#`Y`i)a%os`&=o zLk{dF(sq4vBd4c-axt_MXR~1uXL$#Nq4WFc%C{h&0UTM-s}1Yt2{+5{fq-%@jm7I9 z{MG`dgvRrR%yF*fj^SfqUm*?ZuaY!tHk)jG)3)s{GP(yM*C&k677YnRFA(4AZ34(t z1IF@1F3tthW63>Ipr)!*!kFZY(s&Ss@fIFe;iIe}iFLUYrrHGSr=X0?+&U(kZ>{{L z^tf`*e_0O{e~i8$-5274?{R91x4g$rF%Fm8M0RVTV8}N-m`q&UMP-W3k)%P~~=+e|zYwdy0meD3ZX>YU~X5s7mr?J}%C3 z@K$2r&>Tv)5^1&OZlc>RfFbvNfbK}=^fFN_)6LZe-JD=Q+n=aEP z6pIYEYa`sN`}={Id&ujE`xdbr!P)cErO%l_o_h7HMqUT^5JDI=ArUOI`*?w$ay*GA z8toKuvOIsi2MH}RSH#g11^;A5(BAJydp9SpEINIm^yE+x@H%;yq76BzP$8 zabczyilH0lHOGrRtEDKEZ0t*sBGa|7AZ}f0j_ax334(Y|eC&_---FSs2KARJtC{f3 z5y>0X8R;S$O*mkKMDZC$HPhzgYm|aj>Wv=kXFuZMxea`l+mP7M$0DNHpz#`w!Zvn z)mBe05|*tS+iHJ8lQOAW%lg5UB21I|V;GC}WfJ|XjN^)@)w@_9KY#& z7R$`4XxBA~XS=v7;kA4Yp^}`{x`o>Y-$Ypf@ovn?tVs3u6W}CPJqKll4Yw}cmHrSq zoTYb@&p!D2JI|9G*&q*NWI`@M2~C)k3Hr0fjC!C`T`;T8CVTtXOq4imr6E|%9=i2` zlPhk`2u^Jn`@W1Tb9QgK7F$@$y#eet!)|BaZ3%8H{+6U41aG=O7M}AduFtUFvKic4 z=743nm-c=%Y|pN(PLqvf=JFo#+>sQbjTBG$0CT_h&|a6xN!1rjOymgGIVdQJc z=R8DJky8;wf)&^AyU)1QrOqPzMX)}*HyIW+Ql32)4q*d3sGqZYa{BZRm;{O!4{Co_ z9rI0p7^lq`-0Uhl(Oo%Qg{31@g7O>K5YnaWY81H6@x1_(jPrS3g*E`9&r+-E?hG!O zX86{;MP;Y16Ekg581b#iqeYJ`;Z)Lbp(bxvjyR8Hq@>T`O~;@rJO}v=c1T9~(uU-f zqvl%QTJv4al?65VWW;0lc%@C2 z(T?j_w8w+daXAmh$-PNilWv>fMK)8(ILj~gE}!fx=@DB9C%ZdLRSv1T-Nb?O;Swso zkYyC4szy!C^DaSA@idLRcFX z-Xqc~sdcOA{6FcE0%=u8;+GfQN-n0Au8Pra00$R9txfr&g*|+3{Q)woah{^i(mT4g z$m3AnskJUYoaYe8Aa%uZskSXe>>?25I8k%uL`on^a(8*1TC4~{SGU@j>1eceOk0^F z@J(+Bsi-q5yfeI1l{$6xP#|S4YU90P(xFzFHC0fwUIAMW0`|^oyu;*-4b;m2r1h)d zgOMjunQPEd_L%H6yn1kc)&L&V~6p$~jn?!bZuwAOZYd7_+B8)8f$&Kq(^IP@uTLM^49W-A;f~JTF}d ziv0>j(_A^nBNQ8!_m#ucSy4P~?H&0Jhr4 zsxO{0*G}9d13M!b4&Y_zhJYTI76E4uu`Lp`5>72?!}5FFF<)Pt8}H#s5VZxRi3-gI z4m@+dms(xNqiefwz?Cds@@S^;JI0au?w>I z$?iOdP)fwX8_o|e={~m8W_)X#StjmnU3IjEeg~7LdAZFzvVlCWh27nuUe~4QIlek| zAflWR7g}@asF+Cu48kYKDV>Fl7=xT{K?BkoN0Y|dL7)h!G$0FOhS(>=seqCs%fNHQFi zN)B1AhFWF(oIr9(EtgOwUsQT#PQS%ztp*P}c>EW&W1X(|UCX+Xm-+U= zH@c%36-EE*B7w)FhTK<*mmqqu*JSSrmzWI8gfbak%u5!H7Yu!3=0Z;i8oE#$Y5V4} zF9Cf}!M%_w`me(m;lCj5 ze@$Q%scG8c4gr#^#^Oag>Pa$6e)7aetu?7qPeAg6GmQ$?4=PJFcd{V}Mv8TGt=B!V z#w4lu!uTY_fTQw(N&xZ{#^ip97sZ$Vkf2i9B`#BnCs2494N%>NiG{)xCyd?9UQ23! zCWUL(BpHE_lZnfUBZ#&K z*%0Tv7Za}PPr76@t+8AsEY8S27d`Lby+)H2NpWPdPR%3Dz-^7?MsA8w{);|4d{}LH zTD^2t*aarMy&>LInQQ97H@Cr8w)j3eZsP1zUEVY(Pt%Km`xHQ5jdg08MEa;FT^MJ*NMG`D1N%ryws30ziH z+dByI{IgS6qAG6q`?C}CB;&NET2$ppke_rf@{_rZ;RDP5QD9E99)TfV<#8fDPq|#} zT+*U0GzFN-q*)KC*$qOS#+1%zOyKcdp5Y(2`CMgfC zGd*Yx8PQU9TF5DTpu@yK8Ev*qCG!*PuZICP1z+5}&>T8iM#f{pMYPtNWb#r~<&}LK zBpg$xhi-j90TDx`?3o5Sv~i9xT&#E*m{>!`@^~iP&OY0x$LtzpDSD@7-Xe@OdB-Gh z1M+jq_~gZ0lv{m1(zL6S3SWbV_GR5gmJaMpHt=I-@wBJ(){o`;q;5L%Hn4O4ykbpD z$|m0PUb#NbnIkws(aC9ToJgp1)&uRHi%VIaOxT8FYFuoNG=Mh5Bq#_V9=MndM}748 z;7%Fn8a{;KmA)Uz6y6qag@P7IGGjLL1ArBG&V7pDPu4@TRh#CnBZskCYJ5mj>C|yD z2TN)bgn@Z%=C--yr0gJpAM{&~&5qKaq}4Bav0g_O>lUrVj&0;Ls|jIaPx?9ZNzb@6 zCI7^{rBSo1JvWt#SA`hMTYuk9xb?nO7pmMqc@lq}xMY0BlZd${$usi@l0m+Eg-PDV zC}9bYg84U{Lj?~hq)VmhSXtLzo_mJOA^b9Q*zC?YFDV&a4P&Gde8kJ8 z2~ybl(PG(7=%hO=TZOJJN=B%C6+DFw!CyM!Qi>&4Jc;pRM-KpXFQMgCX(?1{g;d

~S7}=G36|&x7p5#O+oq~sG_crLHtKWsS17{!Q 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

+f0TG{?d-0_iRS>_ zi$IM_VH6>Z?dL`KaX(&m+PV?99s_@v7K_%SO}Yz30MR~x2ngV4$%5mzi1yZ2fg|2s z2M{p;w3uy81Lw~v_qHn*WoI8~!2Y)488lrW5bcTIpxIkjS!_G?9H2=LxD$mj2z5^W zoN&7h-7?o-U$IEK9PAT*7ci78a1Ua(X0Lhv8^hjelvyVFCV>Y8abS6!IEI>DfnVj? zazR&f7dv3%GuD9ck=zX0NDKn09|Hj+Oz7#9*nel)TU8514)HO-KHwueRmGn9CBDD! ztF1G}fdg}`u-J)Iom|_95Cn1tddZlo_*MQp%igN2KgrT30hK2Oc%M3YC4x@q{t};) zE8mu_&|<)@rc(GHrP~iA*|TNRR{+M%d;x>msk=b@nSm*{IF$m~9%WmTX zKP_1PM~c1mpuc|`GkQ|n|2r~Ads~;y6E=1}3!uMz0yBDMy8JhWz15%}DvjB#q7MF5 zt}WmE5kq&s++wFZ^s`H}Fszjv`G+X?){A~Fgd7HWUh2OiM|;lNJ}hOYR`k7)n9bhD zj6XoPQ|ETPL*HX4h@n%v=;y@$#G38>SXg`%edE_D41DKT{{?@ilI`GyzI_7IVy8-f zg=t&Hu2{Lbt!$^o(5D$OEq1Bu576zc6MbF{^JycgfJ?%HdC-w@NFFQF?md!h@ChX(*Qeh&Lx1&7& zjOXvfKp*;M#lVQ#iGh7UUR#ZTfcwXVNAY<6fsp?3)8F6u>9#%)?*~RsfCO9z#5oYi ZW?}39KwJer!zbAMOd9yN`S)9Y`#*n|2ebeH From 2af65a7dcbc25f9736095bd4ab5ecc02a6fe570e Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Mon, 26 Feb 2024 01:41:27 -0500 Subject: [PATCH 060/103] update test ret Signed-off-by: Jinzhe Zeng --- source/api_cc/tests/test_deeppot_pt.cc | 87 ++++++++++++++------------ 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/source/api_cc/tests/test_deeppot_pt.cc b/source/api_cc/tests/test_deeppot_pt.cc index e27401bb3c..5dd8bf206a 100644 --- a/source/api_cc/tests/test_deeppot_pt.cc +++ b/source/api_cc/tests/test_deeppot_pt.cc @@ -21,29 +21,32 @@ class TestInferDeepPotAPt : public ::testing::Test { 3.51, 2.51, 2.60, 4.27, 3.22, 1.56}; std::vector atype = {0, 1, 1, 0, 1, 1}; std::vector box = {13., 0., 0., 0., 13., 0., 0., 0., 13.}; - std::vector expected_e = {-53.7147059, -49.94367351, - -49.9434903, -53.71488615, - -49.9438445, -49.94379288}; + std::vector expected_e = { + + -93.016873944029, -185.923296645958, -185.927096544970, + -93.019371018039, -185.926179995548, -185.924351901852}; std::vector expected_f = { - -0.00120548, 0.00809608, -0.00064437, 0.00641376, -0.00109731, - -0.00529648, -0.00551271, -0.0070066, 0.00597296, 0.00397807, - -0.00078519, 0.00165795, 0.0003451, 0.00228841, -0.0036, - -0.00401874, -0.00149539, 0.00190994}; + + 0.006277522211, -0.001117962774, 0.000618580445, 0.009928999655, + 0.003026035654, -0.006941982227, 0.000667853212, -0.002449963843, + 0.006506463508, -0.007284129115, 0.000530662205, -0.000028806821, + 0.000068097781, 0.006121331983, -0.009019754602, -0.009658343745, + -0.006110103225, 0.008865499697}; std::vector expected_v = { - -3.72974819e-03, -9.98227220e-04, 3.37664388e-03, -1.10154761e-03, - -4.68713907e-03, 1.84604369e-03, 3.41017698e-03, 1.81164563e-03, - -3.22243690e-03, -1.99493894e-03, 5.97534768e-05, 1.80584573e-03, - -2.62579356e-04, -1.12440024e-04, 2.42097709e-04, 1.89528468e-03, - -3.24777812e-05, -1.60401783e-03, -8.97106345e-04, -1.15497829e-03, - 1.17916578e-03, -7.55372233e-04, -8.56277743e-04, 7.92455483e-04, - 1.07793900e-03, 1.10623290e-03, -1.12596261e-03, -2.90655831e-03, - -3.70173918e-04, 2.98300648e-04, -3.95329633e-04, -7.64980354e-04, - 1.16308129e-03, 3.15914358e-04, 1.15922497e-03, -1.79216186e-03, - 3.24153403e-04, -3.17404215e-04, 4.23089883e-04, -1.83222341e-04, - -4.67327552e-04, 7.21883299e-04, 2.39115354e-04, 7.09732333e-04, - -1.09491651e-03, -3.87972886e-04, -3.39632835e-04, 4.29685964e-04, - -4.22611827e-04, -2.23877230e-04, 3.02037131e-04, 5.74301510e-04, - 3.13240553e-04, -4.22617216e-04}; + -0.000155238009, 0.000116605516, -0.007869862476, 0.000465578340, + 0.008182547185, -0.002398713212, -0.008112887338, -0.002423738425, + 0.007210716605, -0.019203504012, 0.001724938709, 0.009909211091, + 0.001153857542, -0.001600015103, -0.000560024090, 0.010727836276, + -0.001034836404, -0.007973454377, -0.021517399106, -0.004064359664, + 0.004866398692, -0.003360038617, -0.007241406162, 0.005920941051, + 0.004899151657, 0.006290788591, -0.006478820311, 0.001921504710, + 0.001313470921, -0.000304091236, 0.001684345981, 0.004124109256, + -0.006396084465, -0.000701095618, -0.006356507032, 0.009818550859, + -0.015230664587, -0.000110244376, 0.000690319396, 0.000045953023, + -0.005726548770, 0.008769818495, -0.000572380210, 0.008860603423, + -0.013819348050, -0.021227082558, -0.004977781343, 0.006646239696, + -0.005987066507, -0.002767831232, 0.003746502525, 0.007697590397, + 0.003746130152, -0.005172634748}; int natoms; double expected_tot_e; std::vector expected_tot_v; @@ -537,28 +540,30 @@ class TestInferDeepPotAPtNoPbc : public ::testing::Test { 3.51, 2.51, 2.60, 4.27, 3.22, 1.56}; std::vector atype = {0, 1, 1, 0, 1, 1}; std::vector box = {}; - std::vector expected_e = {-53.70576165, -49.9427077, -49.68506898, - -53.71490191, -49.94386836, -49.9438074}; + std::vector expected_e = {-93.003304908874, -185.915806542480, + -185.928116717624, -93.017934934346, + -185.924393412278, -185.923906740801}; std::vector expected_f = { - -0.05793241, 0.02426898, 0.04384074, 0.05793241, -0.02426898, - -0.04384074, 0.0061137, -0.00121445, -0.00052675, -0.04546273, - 0.00444365, -0.00071007, 0.01261648, -0.00107514, 0.00036128, - 0.02673255, -0.00215406, 0.00087553}; + 0.000868182637, -0.000363698132, -0.000657003077, -0.000868182637, + 0.000363698132, 0.000657003077, 0.007932614680, -0.001003609844, + 0.000737731722, -0.003883788858, 0.000686896282, -0.000578400682, + 0.004064895086, 0.006115547962, -0.008747097814, -0.008113720908, + -0.005798834400, 0.008587766774}; std::vector expected_v = { - -9.02965689e-03, 3.78269410e-03, 6.83325386e-03, 3.78269410e-03, - -1.58464212e-03, -2.86257932e-03, 6.83325386e-03, -2.86257932e-03, - -5.17111103e-03, -3.38403230e-02, 1.41763515e-02, 2.56088931e-02, - 1.41763515e-02, -5.93874186e-03, -1.07280498e-02, 2.56088931e-02, - -1.07280498e-02, -1.93797029e-02, 2.16816985e-04, -1.26051843e-05, - 4.08880185e-06, -8.85403363e-06, 4.69563180e-08, 4.27221711e-07, - -5.68134313e-06, 1.25803648e-06, -1.28751543e-06, -1.55377477e-01, - 1.53205867e-02, -6.03170230e-03, 1.53638777e-02, -2.28187375e-03, - 1.66104531e-03, -6.12092196e-03, 1.66503657e-03, -1.81384836e-03, - 4.03275109e-02, -1.02905681e-02, 1.17738547e-02, -1.01342635e-02, - 2.05898924e-03, -2.16858200e-03, 1.15576484e-02, -2.17555574e-03, - 2.21173836e-03, 1.22038623e-01, -3.36194524e-03, -3.25713729e-03, - -3.56529198e-03, -1.12860297e-04, 3.54141978e-04, -2.94194119e-03, - 3.56293646e-04, -2.61599053e-04}; + 0.007762485364, -0.003251851977, -0.005874313248, -0.003251851977, + 0.001362262315, 0.002460860955, -0.005874313248, 0.002460860955, + 0.004445426242, -0.007120030212, 0.002982715359, 0.005388130971, + 0.002982715359, -0.001249515894, -0.002257190002, 0.005388130971, + -0.002257190002, -0.004077504519, -0.015805863589, 0.001952684835, + -0.001522876482, 0.001796574704, -0.000358803950, 0.000369710813, + -0.001108943040, 0.000332585300, -0.000395481309, 0.008873525623, + 0.001919112114, -0.001486235522, 0.002002929532, 0.004222469272, + -0.006517211126, -0.001656192522, -0.006501210045, 0.010118622295, + -0.006548889778, -0.000465126991, 0.001002876603, 0.000240398734, + -0.005794489784, 0.008940685179, -0.000121727685, 0.008931999051, + -0.013852797563, -0.017962955675, -0.004645050453, 0.006214692837, + -0.005278283465, -0.002662692758, 0.003618275905, 0.007095320684, + 0.003648086464, -0.005023397513}; int natoms; double expected_tot_e; std::vector expected_tot_v; From e9f582ff8110211b0fc3e4828b3d66d37c37e5f3 Mon Sep 17 00:00:00 2001 From: CaRoLZhangxy Date: Mon, 26 Feb 2024 07:39:00 +0000 Subject: [PATCH 061/103] try to fix float type error --- source/api_cc/src/DeepPotPT.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 89226ff4ee..18ddb89a81 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -87,6 +87,9 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); + if(std::is_same_v){ + options = torch::TensorOptions().dtype(torch::kFloat32); + } auto int_options = torch::TensorOptions().dtype(torch::kInt64); auto int32_options = torch::TensorOptions().dtype(torch::kInt32); at::Tensor coord_wrapped_Tensor = @@ -212,6 +215,9 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); + if(std::is_same_v){ + options = torch::TensorOptions().dtype(torch::kFloat32); + } auto int_options = torch::TensorOptions().dtype(torch::kInt64); std::vector inputs; at::Tensor coord_wrapped_Tensor = From 90e28a2790cde14820d6f59abce8b4889e6bffa5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 26 Feb 2024 07:39:46 +0000 Subject: [PATCH 062/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 18ddb89a81..c1d39ac690 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -87,7 +87,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); - if(std::is_same_v){ + if (std::is_same_v) { options = torch::TensorOptions().dtype(torch::kFloat32); } auto int_options = torch::TensorOptions().dtype(torch::kInt64); @@ -215,7 +215,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); - if(std::is_same_v){ + if (std::is_same_v) { options = torch::TensorOptions().dtype(torch::kFloat32); } auto int_options = torch::TensorOptions().dtype(torch::kInt64); From fdeb9141ce99090160007b1818b658617a1d4291 Mon Sep 17 00:00:00 2001 From: CaRoLZhangxy Date: Tue, 27 Feb 2024 04:03:52 +0000 Subject: [PATCH 063/103] fix memory bug --- source/api_cc/include/commonPT.h | 7 ++----- source/api_cc/src/DeepPotPT.cc | 27 ++++++--------------------- source/api_cc/src/commonPT.cc | 11 +++-------- 3 files changed, 11 insertions(+), 34 deletions(-) diff --git a/source/api_cc/include/commonPT.h b/source/api_cc/include/commonPT.h index 58eccb3488..931b122e28 100644 --- a/source/api_cc/include/commonPT.h +++ b/source/api_cc/include/commonPT.h @@ -12,17 +12,14 @@ struct NeighborListDataPT { /// Array stores the core region atom's index std::vector ilist; /// Array stores the core region atom's neighbor index - // std::vector> jlist; - int* jlist; + std::vector jlist; /// Array stores the number of neighbors of core region atoms std::vector numneigh; /// Array stores the the location of the first neighbor of core region atoms std::vector firstneigh; public: - ~NeighborListDataPT(); void copy_from_nlist(const InputNlist& inlist, - int& max_num_neighbors, - int nnei); + int& max_num_neighbors); }; } // namespace deepmd diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index c1d39ac690..5dd451470f 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -99,24 +99,12 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, at::Tensor atype_Tensor = torch::from_blob(atype_64.data(), {1, natoms}, int_options).to(device); if (ago == 0) { - int64_t nnei = module.run_method("get_nnei").toInt(); - nlist_data.copy_from_nlist(lmp_list, max_num_neighbors, nnei); - if (max_num_neighbors > nnei) { - at::Tensor firstneigh = torch::from_blob( - nlist_data.jlist, {1, lmp_list.inum, max_num_neighbors}, - int32_options); - at::Tensor nlist = firstneigh.to(torch::kInt64).to(device); - firstneigh_tensor = module - .run_method("format_nlist", coord_wrapped_Tensor, - atype_Tensor, nlist) - .toTensor(); - } else { - at::Tensor firstneigh = torch::from_blob( - nlist_data.jlist, {1, lmp_list.inum, max_num_neighbors}, - int32_options); - firstneigh_tensor = firstneigh.to(torch::kInt64).to(device); - } + nlist_data.copy_from_nlist(lmp_list, max_num_neighbors); } + at::Tensor firstneigh = torch::from_blob( + nlist_data.jlist.data(), {1, lmp_list.inum, max_num_neighbors}, + int32_options); + firstneigh_tensor = firstneigh.to(torch::kInt64).to(device); bool do_atom_virial_tensor = true; c10::optional optional_tensor; c10::Dict outputs = @@ -240,7 +228,6 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, inputs.push_back(do_atom_virial_tensor); c10::Dict outputs = module.forward(inputs).toGenericDict(); - c10::IValue energy_ = outputs.at("energy"); c10::IValue force_ = outputs.at("force"); c10::IValue virial_ = outputs.at("virial"); @@ -255,23 +242,21 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, atom_energy.assign( cpu_atom_energy_.data_ptr(), cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); - torch::Tensor flat_force_ = force_.toTensor().view({-1}); torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); force.assign(cpu_force_.data_ptr(), cpu_force_.data_ptr() + cpu_force_.numel()); - torch::Tensor flat_virial_ = virial_.toTensor().view({-1}); torch::Tensor cpu_virial_ = flat_virial_.to(torch::kCPU); virial.assign(cpu_virial_.data_ptr(), cpu_virial_.data_ptr() + cpu_virial_.numel()); - torch::Tensor flat_atom_virial_ = atom_virial_.toTensor().view({-1}); torch::Tensor cpu_atom_virial_ = flat_atom_virial_.to(torch::kCPU); atom_virial.assign( cpu_atom_virial_.data_ptr(), cpu_atom_virial_.data_ptr() + cpu_atom_virial_.numel()); } + // template void DeepPotPT::compute( // ENERGYTYPE& ener, // std::vector& force, diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index 6ded23ef96..34905e6f19 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -2,21 +2,16 @@ #ifdef BUILD_PYTORCH #include "commonPT.h" using namespace deepmd; -NeighborListDataPT::~NeighborListDataPT() { free(jlist); } void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, - int& max_num_neighbors, - int nnei) { + int& max_num_neighbors) { int inum = inlist.inum; ilist.resize(inum); numneigh.resize(inum); memcpy(&ilist[0], inlist.ilist, inum * sizeof(int)); int* max_element = std::max_element(inlist.numneigh, inlist.numneigh + inum); max_num_neighbors = *max_element; - if (max_num_neighbors < nnei) { - max_num_neighbors = nnei; - } - jlist = (int*)malloc(inum * max_num_neighbors * sizeof(int)); - memset(jlist, -1, inum * max_num_neighbors * sizeof(int)); + jlist.resize(inum * max_num_neighbors); + memset(&jlist[0], -1, inum * max_num_neighbors * sizeof(int)); for (int ii = 0; ii < inum; ++ii) { int jnum = inlist.numneigh[ii]; numneigh[ii] = inlist.numneigh[ii]; From 89e151b52761e0c390a1281a83650cc7bd469118 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 04:04:24 +0000 Subject: [PATCH 064/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/include/commonPT.h | 3 +-- source/api_cc/src/DeepPotPT.cc | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/source/api_cc/include/commonPT.h b/source/api_cc/include/commonPT.h index 931b122e28..57ffd5b295 100644 --- a/source/api_cc/include/commonPT.h +++ b/source/api_cc/include/commonPT.h @@ -19,7 +19,6 @@ struct NeighborListDataPT { std::vector firstneigh; public: - void copy_from_nlist(const InputNlist& inlist, - int& max_num_neighbors); + void copy_from_nlist(const InputNlist& inlist, int& max_num_neighbors); }; } // namespace deepmd diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 5dd451470f..748fc2c12d 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -101,9 +101,9 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, if (ago == 0) { nlist_data.copy_from_nlist(lmp_list, max_num_neighbors); } - at::Tensor firstneigh = torch::from_blob( - nlist_data.jlist.data(), {1, lmp_list.inum, max_num_neighbors}, - int32_options); + at::Tensor firstneigh = + torch::from_blob(nlist_data.jlist.data(), + {1, lmp_list.inum, max_num_neighbors}, int32_options); firstneigh_tensor = firstneigh.to(torch::kInt64).to(device); bool do_atom_virial_tensor = true; c10::optional optional_tensor; From fc18da6a7126df6260b835d81b82e2d7d4fb9dbb Mon Sep 17 00:00:00 2001 From: CaRoLZhangxy Date: Tue, 27 Feb 2024 06:22:16 +0000 Subject: [PATCH 065/103] fix bug: precision diff in model and inference api --- deepmd/pt/model/model/dipole_model.py | 8 ++++++- deepmd/pt/model/model/dp_zbl_model.py | 7 +++++++ deepmd/pt/model/model/ener_model.py | 8 +++++++ deepmd/pt/model/model/polar_model.py | 8 ++++++- source/api_cc/src/DeepPotPT.cc | 30 ++++++++++++++------------- 5 files changed, 45 insertions(+), 16 deletions(-) diff --git a/deepmd/pt/model/model/dipole_model.py b/deepmd/pt/model/model/dipole_model.py index 6629541459..852aa0488e 100644 --- a/deepmd/pt/model/model/dipole_model.py +++ b/deepmd/pt/model/model/dipole_model.py @@ -10,7 +10,9 @@ DPModel, ) - +from deepmd.pt.utils import ( + env, +) class DipoleModel(DPModel): model_type = "dipole" @@ -30,6 +32,9 @@ def forward( aparam: Optional[torch.Tensor] = None, do_atomic_virial: bool = False, ) -> Dict[str, torch.Tensor]: + coord = coord.to(env.GLOBAL_PT_FLOAT_PRECISION) + if(box is not None): + box = box.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common( coord, atype, @@ -66,6 +71,7 @@ def forward_lower( aparam: Optional[torch.Tensor] = None, do_atomic_virial: bool = False, ): + extended_coord = extended_coord.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common_lower( extended_coord, extended_atype, diff --git a/deepmd/pt/model/model/dp_zbl_model.py b/deepmd/pt/model/model/dp_zbl_model.py index 0fd8008f21..15c4330af9 100644 --- a/deepmd/pt/model/model/dp_zbl_model.py +++ b/deepmd/pt/model/model/dp_zbl_model.py @@ -16,6 +16,9 @@ DPZBLModel_ = make_model(DPZBLLinearAtomicModel) +from deepmd.pt.utils import ( + env, +) class DPZBLModel(DPZBLModel_): model_type = "ener" @@ -36,6 +39,9 @@ def forward( aparam: Optional[torch.Tensor] = None, do_atomic_virial: bool = False, ) -> Dict[str, torch.Tensor]: + coord = coord.to(env.GLOBAL_PT_FLOAT_PRECISION) + if(box is not None): + box = box.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common( coord, atype, @@ -69,6 +75,7 @@ def forward_lower( aparam: Optional[torch.Tensor] = None, do_atomic_virial: bool = False, ): + extended_coord = extended_coord.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common_lower( extended_coord, extended_atype, diff --git a/deepmd/pt/model/model/ener_model.py b/deepmd/pt/model/model/ener_model.py index 1a5706dbbf..e7fdb8c6e4 100644 --- a/deepmd/pt/model/model/ener_model.py +++ b/deepmd/pt/model/model/ener_model.py @@ -10,6 +10,10 @@ DPModel, ) +from deepmd.pt.utils import ( + env, +) + class EnergyModel(DPModel): model_type = "ener" @@ -30,6 +34,9 @@ def forward( aparam: Optional[torch.Tensor] = None, do_atomic_virial: bool = False, ) -> Dict[str, torch.Tensor]: + coord = coord.to(env.GLOBAL_PT_FLOAT_PRECISION) + if(box is not None): + box = box.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common( coord, atype, @@ -68,6 +75,7 @@ def forward_lower( aparam: Optional[torch.Tensor] = None, do_atomic_virial: bool = False, ): + extended_coord = extended_coord.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common_lower( extended_coord, extended_atype, diff --git a/deepmd/pt/model/model/polar_model.py b/deepmd/pt/model/model/polar_model.py index d956a0344c..4a802cf0b8 100644 --- a/deepmd/pt/model/model/polar_model.py +++ b/deepmd/pt/model/model/polar_model.py @@ -9,7 +9,9 @@ from .dp_model import ( DPModel, ) - +from deepmd.pt.utils import ( + env, +) class PolarModel(DPModel): model_type = "polar" @@ -30,6 +32,9 @@ def forward( aparam: Optional[torch.Tensor] = None, do_atomic_virial: bool = False, ) -> Dict[str, torch.Tensor]: + coord = coord.to(env.GLOBAL_PT_FLOAT_PRECISION) + if(box is not None): + box = box.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common( coord, atype, @@ -58,6 +63,7 @@ def forward_lower( aparam: Optional[torch.Tensor] = None, do_atomic_virial: bool = False, ): + extended_coord = extended_coord.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common_lower( extended_coord, extended_atype, diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 5dd451470f..1c58b35436 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -87,8 +87,10 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); + torch::ScalarType floatType = torch::kFloat64; if (std::is_same_v) { options = torch::TensorOptions().dtype(torch::kFloat32); + floatType = torch::kFloat32; } auto int_options = torch::TensorOptions().dtype(torch::kInt64); auto int32_options = torch::TensorOptions().dtype(torch::kInt32); @@ -120,24 +122,22 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, c10::IValue atom_energy_ = outputs.at("atom_energy"); torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); - ener.assign(cpu_energy_.data_ptr(), - cpu_energy_.data_ptr() + cpu_energy_.numel()); - torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}); + ener.assign(cpu_energy_.data_ptr(), + cpu_energy_.data_ptr() + cpu_energy_.numel()); + torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); atom_energy.assign( cpu_atom_energy_.data_ptr(), cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); - torch::Tensor flat_force_ = force_.toTensor().view({-1}); + torch::Tensor flat_force_ = force_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); force.assign(cpu_force_.data_ptr(), cpu_force_.data_ptr() + cpu_force_.numel()); - - torch::Tensor flat_virial_ = virial_.toTensor().view({-1}); + torch::Tensor flat_virial_ = virial_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_virial_ = flat_virial_.to(torch::kCPU); virial.assign(cpu_virial_.data_ptr(), cpu_virial_.data_ptr() + cpu_virial_.numel()); - - torch::Tensor flat_atom_virial_ = atom_virial_.toTensor().view({-1}); + torch::Tensor flat_atom_virial_ = atom_virial_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_atom_virial_ = flat_atom_virial_.to(torch::kCPU); atom_virial.assign( cpu_atom_virial_.data_ptr(), @@ -203,8 +203,10 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, std::vector coord_wrapped = coord; int natoms = atype.size(); auto options = torch::TensorOptions().dtype(torch::kFloat64); + torch::ScalarType floatType = torch::kFloat64; if (std::is_same_v) { options = torch::TensorOptions().dtype(torch::kFloat32); + floatType = torch::kFloat32; } auto int_options = torch::TensorOptions().dtype(torch::kInt64); std::vector inputs; @@ -235,22 +237,22 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, c10::IValue atom_energy_ = outputs.at("atom_energy"); torch::Tensor flat_energy_ = energy_.toTensor().view({-1}); torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); - ener.assign(cpu_energy_.data_ptr(), - cpu_energy_.data_ptr() + cpu_energy_.numel()); - torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}); + ener.assign(cpu_energy_.data_ptr(), + cpu_energy_.data_ptr() + cpu_energy_.numel()); + torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); atom_energy.assign( cpu_atom_energy_.data_ptr(), cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); - torch::Tensor flat_force_ = force_.toTensor().view({-1}); + torch::Tensor flat_force_ = force_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); force.assign(cpu_force_.data_ptr(), cpu_force_.data_ptr() + cpu_force_.numel()); - torch::Tensor flat_virial_ = virial_.toTensor().view({-1}); + torch::Tensor flat_virial_ = virial_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_virial_ = flat_virial_.to(torch::kCPU); virial.assign(cpu_virial_.data_ptr(), cpu_virial_.data_ptr() + cpu_virial_.numel()); - torch::Tensor flat_atom_virial_ = atom_virial_.toTensor().view({-1}); + torch::Tensor flat_atom_virial_ = atom_virial_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_atom_virial_ = flat_atom_virial_.to(torch::kCPU); atom_virial.assign( cpu_atom_virial_.data_ptr(), From e6dc86a3d080088b5ac84d18a97d7702db9a9baa Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 06:23:18 +0000 Subject: [PATCH 066/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- deepmd/pt/model/model/dipole_model.py | 10 ++++++---- deepmd/pt/model/model/dp_zbl_model.py | 3 ++- deepmd/pt/model/model/ener_model.py | 10 +++++----- deepmd/pt/model/model/polar_model.py | 10 ++++++---- source/api_cc/src/DeepPotPT.cc | 12 ++++++++---- 5 files changed, 27 insertions(+), 18 deletions(-) diff --git a/deepmd/pt/model/model/dipole_model.py b/deepmd/pt/model/model/dipole_model.py index 852aa0488e..6887b0ef57 100644 --- a/deepmd/pt/model/model/dipole_model.py +++ b/deepmd/pt/model/model/dipole_model.py @@ -6,13 +6,15 @@ import torch +from deepmd.pt.utils import ( + env, +) + from .dp_model import ( DPModel, ) -from deepmd.pt.utils import ( - env, -) + class DipoleModel(DPModel): model_type = "dipole" @@ -33,7 +35,7 @@ def forward( do_atomic_virial: bool = False, ) -> Dict[str, torch.Tensor]: coord = coord.to(env.GLOBAL_PT_FLOAT_PRECISION) - if(box is not None): + if box is not None: box = box.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common( coord, diff --git a/deepmd/pt/model/model/dp_zbl_model.py b/deepmd/pt/model/model/dp_zbl_model.py index 15c4330af9..b89e1b67fa 100644 --- a/deepmd/pt/model/model/dp_zbl_model.py +++ b/deepmd/pt/model/model/dp_zbl_model.py @@ -20,6 +20,7 @@ env, ) + class DPZBLModel(DPZBLModel_): model_type = "ener" @@ -40,7 +41,7 @@ def forward( do_atomic_virial: bool = False, ) -> Dict[str, torch.Tensor]: coord = coord.to(env.GLOBAL_PT_FLOAT_PRECISION) - if(box is not None): + if box is not None: box = box.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common( coord, diff --git a/deepmd/pt/model/model/ener_model.py b/deepmd/pt/model/model/ener_model.py index e7fdb8c6e4..1be3045fa7 100644 --- a/deepmd/pt/model/model/ener_model.py +++ b/deepmd/pt/model/model/ener_model.py @@ -6,14 +6,14 @@ import torch -from .dp_model import ( - DPModel, -) - from deepmd.pt.utils import ( env, ) +from .dp_model import ( + DPModel, +) + class EnergyModel(DPModel): model_type = "ener" @@ -35,7 +35,7 @@ def forward( do_atomic_virial: bool = False, ) -> Dict[str, torch.Tensor]: coord = coord.to(env.GLOBAL_PT_FLOAT_PRECISION) - if(box is not None): + if box is not None: box = box.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common( coord, diff --git a/deepmd/pt/model/model/polar_model.py b/deepmd/pt/model/model/polar_model.py index 4a802cf0b8..da27c3d70e 100644 --- a/deepmd/pt/model/model/polar_model.py +++ b/deepmd/pt/model/model/polar_model.py @@ -6,13 +6,15 @@ import torch -from .dp_model import ( - DPModel, -) from deepmd.pt.utils import ( env, ) +from .dp_model import ( + DPModel, +) + + class PolarModel(DPModel): model_type = "polar" @@ -33,7 +35,7 @@ def forward( do_atomic_virial: bool = False, ) -> Dict[str, torch.Tensor]: coord = coord.to(env.GLOBAL_PT_FLOAT_PRECISION) - if(box is not None): + if box is not None: box = box.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common( coord, diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 977658a2f0..8a2208f001 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -124,7 +124,8 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); ener.assign(cpu_energy_.data_ptr(), cpu_energy_.data_ptr() + cpu_energy_.numel()); - torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}).to(floatType); + torch::Tensor flat_atom_energy_ = + atom_energy_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); atom_energy.assign( cpu_atom_energy_.data_ptr(), @@ -137,7 +138,8 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor cpu_virial_ = flat_virial_.to(torch::kCPU); virial.assign(cpu_virial_.data_ptr(), cpu_virial_.data_ptr() + cpu_virial_.numel()); - torch::Tensor flat_atom_virial_ = atom_virial_.toTensor().view({-1}).to(floatType); + torch::Tensor flat_atom_virial_ = + atom_virial_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_atom_virial_ = flat_atom_virial_.to(torch::kCPU); atom_virial.assign( cpu_atom_virial_.data_ptr(), @@ -239,7 +241,8 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); ener.assign(cpu_energy_.data_ptr(), cpu_energy_.data_ptr() + cpu_energy_.numel()); - torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}).to(floatType); + torch::Tensor flat_atom_energy_ = + atom_energy_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); atom_energy.assign( cpu_atom_energy_.data_ptr(), @@ -252,7 +255,8 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor cpu_virial_ = flat_virial_.to(torch::kCPU); virial.assign(cpu_virial_.data_ptr(), cpu_virial_.data_ptr() + cpu_virial_.numel()); - torch::Tensor flat_atom_virial_ = atom_virial_.toTensor().view({-1}).to(floatType); + torch::Tensor flat_atom_virial_ = + atom_virial_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_atom_virial_ = flat_atom_virial_.to(torch::kCPU); atom_virial.assign( cpu_atom_virial_.data_ptr(), From f96062695e0e30db310e2ba8c868487199ecc07d Mon Sep 17 00:00:00 2001 From: CaRoLZhangxy Date: Tue, 27 Feb 2024 07:58:04 +0000 Subject: [PATCH 067/103] try to fix overflow --- source/api_cc/include/DeepPotPT.h | 2 +- source/api_cc/include/commonPT.h | 2 +- source/api_cc/src/commonPT.cc | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/api_cc/include/DeepPotPT.h b/source/api_cc/include/DeepPotPT.h index 1b757069c3..10446c1194 100644 --- a/source/api_cc/include/DeepPotPT.h +++ b/source/api_cc/include/DeepPotPT.h @@ -323,7 +323,7 @@ class DeepPotPT : public DeepPotBase { torch::jit::script::Module module; double rcut; NeighborListDataPT nlist_data; - int max_num_neighbors; + unsigned long int max_num_neighbors; int gpu_id; bool gpu_enabled; at::Tensor firstneigh_tensor; diff --git a/source/api_cc/include/commonPT.h b/source/api_cc/include/commonPT.h index 57ffd5b295..905fdacd15 100644 --- a/source/api_cc/include/commonPT.h +++ b/source/api_cc/include/commonPT.h @@ -19,6 +19,6 @@ struct NeighborListDataPT { std::vector firstneigh; public: - void copy_from_nlist(const InputNlist& inlist, int& max_num_neighbors); + void copy_from_nlist(const InputNlist& inlist, unsigned long int& max_num_neighbors); }; } // namespace deepmd diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index 34905e6f19..86555376f6 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -3,12 +3,12 @@ #include "commonPT.h" using namespace deepmd; void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, - int& max_num_neighbors) { + unsigned long int& max_num_neighbors) { int inum = inlist.inum; ilist.resize(inum); numneigh.resize(inum); memcpy(&ilist[0], inlist.ilist, inum * sizeof(int)); - int* max_element = std::max_element(inlist.numneigh, inlist.numneigh + inum); + unsigned long int* max_element = std::max_element(inlist.numneigh, inlist.numneigh + inum); max_num_neighbors = *max_element; jlist.resize(inum * max_num_neighbors); memset(&jlist[0], -1, inum * max_num_neighbors * sizeof(int)); From 6ba4125ed83c11097d4c0d8afe1cdf6c282d950c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 07:59:38 +0000 Subject: [PATCH 068/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/include/commonPT.h | 3 ++- source/api_cc/src/commonPT.cc | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/source/api_cc/include/commonPT.h b/source/api_cc/include/commonPT.h index 905fdacd15..ce8fcb929b 100644 --- a/source/api_cc/include/commonPT.h +++ b/source/api_cc/include/commonPT.h @@ -19,6 +19,7 @@ struct NeighborListDataPT { std::vector firstneigh; public: - void copy_from_nlist(const InputNlist& inlist, unsigned long int& max_num_neighbors); + void copy_from_nlist(const InputNlist& inlist, + unsigned long int& max_num_neighbors); }; } // namespace deepmd diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index 86555376f6..eb068d27e8 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -8,7 +8,8 @@ void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, ilist.resize(inum); numneigh.resize(inum); memcpy(&ilist[0], inlist.ilist, inum * sizeof(int)); - unsigned long int* max_element = std::max_element(inlist.numneigh, inlist.numneigh + inum); + unsigned long int* max_element = + std::max_element(inlist.numneigh, inlist.numneigh + inum); max_num_neighbors = *max_element; jlist.resize(inum * max_num_neighbors); memset(&jlist[0], -1, inum * max_num_neighbors * sizeof(int)); From d169d81071f57293077bc856082446e6b1a27893 Mon Sep 17 00:00:00 2001 From: CaRoLZhangxy Date: Tue, 27 Feb 2024 08:23:24 +0000 Subject: [PATCH 069/103] fix compile error --- source/api_cc/include/DeepPotPT.h | 2 +- source/api_cc/include/commonPT.h | 2 +- source/api_cc/src/commonPT.cc | 12 +++++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/source/api_cc/include/DeepPotPT.h b/source/api_cc/include/DeepPotPT.h index 10446c1194..1b757069c3 100644 --- a/source/api_cc/include/DeepPotPT.h +++ b/source/api_cc/include/DeepPotPT.h @@ -323,7 +323,7 @@ class DeepPotPT : public DeepPotBase { torch::jit::script::Module module; double rcut; NeighborListDataPT nlist_data; - unsigned long int max_num_neighbors; + int max_num_neighbors; int gpu_id; bool gpu_enabled; at::Tensor firstneigh_tensor; diff --git a/source/api_cc/include/commonPT.h b/source/api_cc/include/commonPT.h index 905fdacd15..57ffd5b295 100644 --- a/source/api_cc/include/commonPT.h +++ b/source/api_cc/include/commonPT.h @@ -19,6 +19,6 @@ struct NeighborListDataPT { std::vector firstneigh; public: - void copy_from_nlist(const InputNlist& inlist, unsigned long int& max_num_neighbors); + void copy_from_nlist(const InputNlist& inlist, int& max_num_neighbors); }; } // namespace deepmd diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index 86555376f6..291d5eeb71 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -3,19 +3,21 @@ #include "commonPT.h" using namespace deepmd; void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, - unsigned long int& max_num_neighbors) { + int& max_num_neighbors) { int inum = inlist.inum; ilist.resize(inum); numneigh.resize(inum); memcpy(&ilist[0], inlist.ilist, inum * sizeof(int)); - unsigned long int* max_element = std::max_element(inlist.numneigh, inlist.numneigh + inum); + int* max_element = std::max_element(inlist.numneigh, inlist.numneigh + inum); max_num_neighbors = *max_element; - jlist.resize(inum * max_num_neighbors); - memset(&jlist[0], -1, inum * max_num_neighbors * sizeof(int)); + unsigned long nlist_size = inum * max_num_neighbors; + jlist.resize(nlist_size); + memset(&jlist[0], -1, nlist_size * sizeof(int)); for (int ii = 0; ii < inum; ++ii) { int jnum = inlist.numneigh[ii]; numneigh[ii] = inlist.numneigh[ii]; - memcpy(&jlist[ii * max_num_neighbors], inlist.firstneigh[ii], + unsigned long start_loc = ii * max_num_neighbors; + memcpy(&jlist[start_loc], inlist.firstneigh[ii], jnum * sizeof(int)); } } From e77f5f3e47521f55e8ea4ebe158ab5f756b7cefd Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 08:28:02 +0000 Subject: [PATCH 070/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/commonPT.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index 291d5eeb71..f8b2d21a83 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -17,8 +17,7 @@ void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, int jnum = inlist.numneigh[ii]; numneigh[ii] = inlist.numneigh[ii]; unsigned long start_loc = ii * max_num_neighbors; - memcpy(&jlist[start_loc], inlist.firstneigh[ii], - jnum * sizeof(int)); + memcpy(&jlist[start_loc], inlist.firstneigh[ii], jnum * sizeof(int)); } } #endif From 7cb94aefa897643ee5008605bd2c015892bdc9f4 Mon Sep 17 00:00:00 2001 From: CaRoLZhangxy Date: Tue, 27 Feb 2024 08:58:18 +0000 Subject: [PATCH 071/103] try to fix overflow --- source/api_cc/src/commonPT.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index f8b2d21a83..db832e0781 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -10,14 +10,13 @@ void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, memcpy(&ilist[0], inlist.ilist, inum * sizeof(int)); int* max_element = std::max_element(inlist.numneigh, inlist.numneigh + inum); max_num_neighbors = *max_element; - unsigned long nlist_size = inum * max_num_neighbors; + unsigned long nlist_size = (unsigned long)inum * max_num_neighbors; jlist.resize(nlist_size); memset(&jlist[0], -1, nlist_size * sizeof(int)); for (int ii = 0; ii < inum; ++ii) { int jnum = inlist.numneigh[ii]; numneigh[ii] = inlist.numneigh[ii]; - unsigned long start_loc = ii * max_num_neighbors; - memcpy(&jlist[start_loc], inlist.firstneigh[ii], jnum * sizeof(int)); + memcpy(&jlist[(unsigned long)ii * max_num_neighbors], inlist.firstneigh[ii], jnum * sizeof(int)); } } #endif From ed453fdf283dcba06d31f09bf3e53c11d6e14aa2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 08:58:55 +0000 Subject: [PATCH 072/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/commonPT.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index db832e0781..345220323b 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -16,7 +16,8 @@ void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, for (int ii = 0; ii < inum; ++ii) { int jnum = inlist.numneigh[ii]; numneigh[ii] = inlist.numneigh[ii]; - memcpy(&jlist[(unsigned long)ii * max_num_neighbors], inlist.firstneigh[ii], jnum * sizeof(int)); + memcpy(&jlist[(unsigned long)ii * max_num_neighbors], inlist.firstneigh[ii], + jnum * sizeof(int)); } } #endif From 3a06dbf3e0ff0bcc11e9fdb2b126ed6f7b04144b Mon Sep 17 00:00:00 2001 From: Lysithea Date: Tue, 27 Feb 2024 17:16:24 +0800 Subject: [PATCH 073/103] update model --- source/tests/infer/deeppot_sea.pth | Bin 125020 -> 123401 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/source/tests/infer/deeppot_sea.pth b/source/tests/infer/deeppot_sea.pth index 6d4b0e2fac7dc9e0a771a3f52bc7c78ae3b10362..6ac68ed7fa6e6ac815516951cd5fdb22f487abab 100644 GIT binary patch delta 68477 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⩔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 Date: Tue, 27 Feb 2024 17:33:22 +0800 Subject: [PATCH 074/103] try to fix nopbc --- source/api_cc/src/DeepPotPT.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 8a2208f001..1b1229ec85 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -220,9 +220,12 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, at::Tensor atype_Tensor = torch::from_blob(atype_64.data(), {1, natoms}, int_options).to(device); inputs.push_back(atype_Tensor); - at::Tensor box_Tensor = - torch::from_blob(const_cast(box.data()), {1, 9}, options) + c10::optional box_Tensor; + if(!box.empty()) + { + box_Tensor = torch::from_blob(const_cast(box.data()), {1, 9}, options) .to(device); + } inputs.push_back(box_Tensor); c10::optional fparam_tensor; inputs.push_back(fparam_tensor); From 0a440c5aedb3612607c2b5994d7ef7c0b7ebfaae Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 09:33:49 +0000 Subject: [PATCH 075/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 1b1229ec85..69d73c18e2 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -221,10 +221,10 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::from_blob(atype_64.data(), {1, natoms}, int_options).to(device); inputs.push_back(atype_Tensor); c10::optional box_Tensor; - if(!box.empty()) - { - box_Tensor = torch::from_blob(const_cast(box.data()), {1, 9}, options) - .to(device); + if (!box.empty()) { + box_Tensor = + torch::from_blob(const_cast(box.data()), {1, 9}, options) + .to(device); } inputs.push_back(box_Tensor); c10::optional fparam_tensor; From bb45b4096c5cdfcbe35bccf2cd1f40a9736f08e8 Mon Sep 17 00:00:00 2001 From: Lysithea Date: Tue, 27 Feb 2024 18:11:33 +0800 Subject: [PATCH 076/103] try to export ut output --- source/api_cc/tests/test_deeppot_pt.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/api_cc/tests/test_deeppot_pt.cc b/source/api_cc/tests/test_deeppot_pt.cc index 5dd8bf206a..254e35499e 100644 --- a/source/api_cc/tests/test_deeppot_pt.cc +++ b/source/api_cc/tests/test_deeppot_pt.cc @@ -279,13 +279,14 @@ TYPED_TEST(TestInferDeepPotAPt, cpu_lmp_nlist_atomic) { std::vector ilist(nloc), numneigh(nloc); std::vector firstneigh(nloc); deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]); + std::cout << nlist_data < force_, atom_ener_, atom_vir_, virial; std::vector force, atom_ener, atom_vir; dp.compute(ener, force_, virial, atom_ener_, atom_vir_, coord_cpy, atype_cpy, box, nall - nloc, inlist, 0); + std::cout << atom_ener_ <(force, force_, mapping, nloc, nall, 3); _fold_back(atom_ener, atom_ener_, mapping, nloc, nall, 1); _fold_back(atom_vir, atom_vir_, mapping, nloc, nall, 9); From 75c8bb96001a8c25272a8a58bd3b3464a5bbb9b2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 10:12:03 +0000 Subject: [PATCH 077/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/tests/test_deeppot_pt.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/api_cc/tests/test_deeppot_pt.cc b/source/api_cc/tests/test_deeppot_pt.cc index 254e35499e..8b2185080f 100644 --- a/source/api_cc/tests/test_deeppot_pt.cc +++ b/source/api_cc/tests/test_deeppot_pt.cc @@ -279,14 +279,14 @@ TYPED_TEST(TestInferDeepPotAPt, cpu_lmp_nlist_atomic) { std::vector ilist(nloc), numneigh(nloc); std::vector firstneigh(nloc); deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]); - std::cout << nlist_data < force_, atom_ener_, atom_vir_, virial; std::vector force, atom_ener, atom_vir; dp.compute(ener, force_, virial, atom_ener_, atom_vir_, coord_cpy, atype_cpy, box, nall - nloc, inlist, 0); - std::cout << atom_ener_ <(force, force_, mapping, nloc, nall, 3); _fold_back(atom_ener, atom_ener_, mapping, nloc, nall, 1); _fold_back(atom_vir, atom_vir_, mapping, nloc, nall, 9); From 045087365e6017a7a028d6990eeea704a6d3e0e1 Mon Sep 17 00:00:00 2001 From: Lysithea Date: Tue, 27 Feb 2024 18:59:39 +0800 Subject: [PATCH 078/103] try to export ut input --- source/api_cc/src/DeepPotPT.cc | 6 ++++++ source/api_cc/tests/test_deeppot_pt.cc | 2 -- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 69d73c18e2..4e27d9a1da 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -102,6 +102,11 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::from_blob(atype_64.data(), {1, natoms}, int_options).to(device); if (ago == 0) { nlist_data.copy_from_nlist(lmp_list, max_num_neighbors); + std::cout << "Vector content:" << std::endl; + for (const auto& element : nlist_data.jlist) { + std::cout << element << " "; + } + std::cout << std::endl; } at::Tensor firstneigh = torch::from_blob(nlist_data.jlist.data(), @@ -127,6 +132,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); + std::cout << cpu_atom_energy_ << std::endl; atom_energy.assign( cpu_atom_energy_.data_ptr(), cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); diff --git a/source/api_cc/tests/test_deeppot_pt.cc b/source/api_cc/tests/test_deeppot_pt.cc index 8b2185080f..cc30e606c0 100644 --- a/source/api_cc/tests/test_deeppot_pt.cc +++ b/source/api_cc/tests/test_deeppot_pt.cc @@ -279,14 +279,12 @@ TYPED_TEST(TestInferDeepPotAPt, cpu_lmp_nlist_atomic) { std::vector ilist(nloc), numneigh(nloc); std::vector firstneigh(nloc); deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]); - std::cout << nlist_data << std::endl; convert_nlist(inlist, nlist_data); double ener; std::vector force_, atom_ener_, atom_vir_, virial; std::vector force, atom_ener, atom_vir; dp.compute(ener, force_, virial, atom_ener_, atom_vir_, coord_cpy, atype_cpy, box, nall - nloc, inlist, 0); - std::cout << atom_ener_ << std::endl; _fold_back(force, force_, mapping, nloc, nall, 3); _fold_back(atom_ener, atom_ener_, mapping, nloc, nall, 1); _fold_back(atom_vir, atom_vir_, mapping, nloc, nall, 9); From 19e3cd580d4c1362c209fe31993b806227a29525 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 11:00:07 +0000 Subject: [PATCH 079/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 4e27d9a1da..65c4e78f0b 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -104,7 +104,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, nlist_data.copy_from_nlist(lmp_list, max_num_neighbors); std::cout << "Vector content:" << std::endl; for (const auto& element : nlist_data.jlist) { - std::cout << element << " "; + std::cout << element << " "; } std::cout << std::endl; } From 5da17cbc6423d0ad46a2ca06f48607fa1b2fdb72 Mon Sep 17 00:00:00 2001 From: Lysithea Date: Tue, 27 Feb 2024 19:09:11 +0800 Subject: [PATCH 080/103] modify output --- source/api_cc/src/DeepPotPT.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 65c4e78f0b..655db179a1 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -104,9 +104,8 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, nlist_data.copy_from_nlist(lmp_list, max_num_neighbors); std::cout << "Vector content:" << std::endl; for (const auto& element : nlist_data.jlist) { - std::cout << element << " "; + std::cout << element << std::endl; } - std::cout << std::endl; } at::Tensor firstneigh = torch::from_blob(nlist_data.jlist.data(), From e4b3265ad8336d47bd16a2d04de1b8c8a0a84ba2 Mon Sep 17 00:00:00 2001 From: Lysithea Date: Tue, 27 Feb 2024 19:43:47 +0800 Subject: [PATCH 081/103] try --- source/api_cc/src/DeepPotPT.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 655db179a1..4f336880a0 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -102,15 +102,12 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::from_blob(atype_64.data(), {1, natoms}, int_options).to(device); if (ago == 0) { nlist_data.copy_from_nlist(lmp_list, max_num_neighbors); - std::cout << "Vector content:" << std::endl; - for (const auto& element : nlist_data.jlist) { - std::cout << element << std::endl; - } } at::Tensor firstneigh = torch::from_blob(nlist_data.jlist.data(), {1, lmp_list.inum, max_num_neighbors}, int32_options); firstneigh_tensor = firstneigh.to(torch::kInt64).to(device); + std::cout << firstneigh_tensor < optional_tensor; c10::Dict outputs = @@ -135,6 +132,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, atom_energy.assign( cpu_atom_energy_.data_ptr(), cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); + std::cout << atom_energy << std::endl; torch::Tensor flat_force_ = force_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); force.assign(cpu_force_.data_ptr(), From 55db21f852139fac27008c8b8b224122a435f5e9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 11:44:12 +0000 Subject: [PATCH 082/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 4f336880a0..adf6815fb3 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -107,7 +107,7 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::from_blob(nlist_data.jlist.data(), {1, lmp_list.inum, max_num_neighbors}, int32_options); firstneigh_tensor = firstneigh.to(torch::kInt64).to(device); - std::cout << firstneigh_tensor < optional_tensor; c10::Dict outputs = From 600e5344c1e913efed8ed07b1381ce017319066e Mon Sep 17 00:00:00 2001 From: Lysithea Date: Tue, 27 Feb 2024 19:58:06 +0800 Subject: [PATCH 083/103] try --- source/api_cc/src/DeepPotPT.cc | 2 -- source/api_cc/src/commonPT.cc | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index adf6815fb3..d5c54fe06a 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -107,7 +107,6 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::from_blob(nlist_data.jlist.data(), {1, lmp_list.inum, max_num_neighbors}, int32_options); firstneigh_tensor = firstneigh.to(torch::kInt64).to(device); - std::cout << firstneigh_tensor << std::endl; bool do_atom_virial_tensor = true; c10::optional optional_tensor; c10::Dict outputs = @@ -128,7 +127,6 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); - std::cout << cpu_atom_energy_ << std::endl; atom_energy.assign( cpu_atom_energy_.data_ptr(), cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index 345220323b..9c447608e7 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -16,6 +16,10 @@ void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, for (int ii = 0; ii < inum; ++ii) { int jnum = inlist.numneigh[ii]; numneigh[ii] = inlist.numneigh[ii]; + for (int j = 0; j < jnum; ++j) { + std::cout << inlist.firstneigh[ii][j] << " "; + } + std::cout << std::endl; memcpy(&jlist[(unsigned long)ii * max_num_neighbors], inlist.firstneigh[ii], jnum * sizeof(int)); } From 7ba3fcfb84f64b03440466865d5aa22723cff853 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 11:58:33 +0000 Subject: [PATCH 084/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/commonPT.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index 9c447608e7..8c115f28b3 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -17,7 +17,7 @@ void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, int jnum = inlist.numneigh[ii]; numneigh[ii] = inlist.numneigh[ii]; for (int j = 0; j < jnum; ++j) { - std::cout << inlist.firstneigh[ii][j] << " "; + std::cout << inlist.firstneigh[ii][j] << " "; } std::cout << std::endl; memcpy(&jlist[(unsigned long)ii * max_num_neighbors], inlist.firstneigh[ii], From 3be3cbc1c1dcd0cf80fd7f3a7d0f622f5db45623 Mon Sep 17 00:00:00 2001 From: Lysithea Date: Tue, 27 Feb 2024 20:09:41 +0800 Subject: [PATCH 085/103] delete print --- source/api_cc/src/DeepPotPT.cc | 1 - source/api_cc/src/commonPT.cc | 4 ---- 2 files changed, 5 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index d5c54fe06a..69d73c18e2 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -130,7 +130,6 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, atom_energy.assign( cpu_atom_energy_.data_ptr(), cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); - std::cout << atom_energy << std::endl; torch::Tensor flat_force_ = force_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_force_ = flat_force_.to(torch::kCPU); force.assign(cpu_force_.data_ptr(), diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index 8c115f28b3..345220323b 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -16,10 +16,6 @@ void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, for (int ii = 0; ii < inum; ++ii) { int jnum = inlist.numneigh[ii]; numneigh[ii] = inlist.numneigh[ii]; - for (int j = 0; j < jnum; ++j) { - std::cout << inlist.firstneigh[ii][j] << " "; - } - std::cout << std::endl; memcpy(&jlist[(unsigned long)ii * max_num_neighbors], inlist.firstneigh[ii], jnum * sizeof(int)); } From 1785cbd8dbe16a905836522916a95c443054cc33 Mon Sep 17 00:00:00 2001 From: Lysithea Date: Tue, 27 Feb 2024 20:30:42 +0800 Subject: [PATCH 086/103] get extended coord and atype --- source/api_cc/src/DeepPotPT.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 69d73c18e2..7c012683c8 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -80,6 +80,14 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const std::vector& box, const InputNlist& lmp_list, const int& ago) { + for (auto element : coord) { + std::cout << element << ", "; + } + std::cout << std::endl; + for (auto element : atype) { + std::cout << element << ", "; + } + std::cout << std::endl; torch::Device device(torch::kCUDA, gpu_id); if (!gpu_enabled) { device = torch::Device(torch::kCPU); From 962cf64351728e76d009f1feffc3a02e07531f74 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 12:31:17 +0000 Subject: [PATCH 087/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 7c012683c8..558f615646 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -80,12 +80,12 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const std::vector& box, const InputNlist& lmp_list, const int& ago) { - for (auto element : coord) { - std::cout << element << ", "; + for (auto element : coord) { + std::cout << element << ", "; } std::cout << std::endl; for (auto element : atype) { - std::cout << element << ", "; + std::cout << element << ", "; } std::cout << std::endl; torch::Device device(torch::kCUDA, gpu_id); From b0053651352344b5cf03fd346fb21f7160407939 Mon Sep 17 00:00:00 2001 From: Lysithea Date: Tue, 27 Feb 2024 21:19:26 +0800 Subject: [PATCH 088/103] delete output --- source/api_cc/src/DeepPotPT.cc | 8 -------- 1 file changed, 8 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 558f615646..69d73c18e2 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -80,14 +80,6 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, const std::vector& box, const InputNlist& lmp_list, const int& ago) { - for (auto element : coord) { - std::cout << element << ", "; - } - std::cout << std::endl; - for (auto element : atype) { - std::cout << element << ", "; - } - std::cout << std::endl; torch::Device device(torch::kCUDA, gpu_id); if (!gpu_enabled) { device = torch::Device(torch::kCPU); From 499ed1743d68b4854f7b63a4b1536b7c4c35b23f Mon Sep 17 00:00:00 2001 From: Lysithea Date: Wed, 28 Feb 2024 10:05:25 +0800 Subject: [PATCH 089/103] remove memset --- source/api_cc/src/commonPT.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/api_cc/src/commonPT.cc b/source/api_cc/src/commonPT.cc index 345220323b..4ed3b21fe8 100644 --- a/source/api_cc/src/commonPT.cc +++ b/source/api_cc/src/commonPT.cc @@ -12,7 +12,7 @@ void NeighborListDataPT::copy_from_nlist(const InputNlist& inlist, max_num_neighbors = *max_element; unsigned long nlist_size = (unsigned long)inum * max_num_neighbors; jlist.resize(nlist_size); - memset(&jlist[0], -1, nlist_size * sizeof(int)); + jlist.assign(nlist_size, -1); for (int ii = 0; ii < inum; ++ii) { int jnum = inlist.numneigh[ii]; numneigh[ii] = inlist.numneigh[ii]; From f872b1f9427074224c977012047616d2a75b8b3d Mon Sep 17 00:00:00 2001 From: Lysithea Date: Wed, 28 Feb 2024 10:49:57 +0800 Subject: [PATCH 090/103] try to resize atom energy --- source/api_cc/src/DeepPotPT.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 69d73c18e2..e353af9051 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -124,8 +124,9 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); ener.assign(cpu_energy_.data_ptr(), cpu_energy_.data_ptr() + cpu_energy_.numel()); + torch::Tensor resize_atom_energy = atom_energy_.toTensor().detach().resize_({1,natoms}); torch::Tensor flat_atom_energy_ = - atom_energy_.toTensor().view({-1}).to(floatType); + resize_atom_energy.view({-1}).to(floatType); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); atom_energy.assign( cpu_atom_energy_.data_ptr(), From aab67712e9b341499269a41b88a230b43cee552b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 28 Feb 2024 02:50:23 +0000 Subject: [PATCH 091/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index e353af9051..b2c7948093 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -124,9 +124,9 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); ener.assign(cpu_energy_.data_ptr(), cpu_energy_.data_ptr() + cpu_energy_.numel()); - torch::Tensor resize_atom_energy = atom_energy_.toTensor().detach().resize_({1,natoms}); - torch::Tensor flat_atom_energy_ = - resize_atom_energy.view({-1}).to(floatType); + torch::Tensor resize_atom_energy = + atom_energy_.toTensor().detach().resize_({1, natoms}); + torch::Tensor flat_atom_energy_ = resize_atom_energy.view({-1}).to(floatType); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); atom_energy.assign( cpu_atom_energy_.data_ptr(), From 414fffe83b1d0714698eb981320ff0b4871b363f Mon Sep 17 00:00:00 2001 From: Lysithea Date: Wed, 28 Feb 2024 11:01:44 +0800 Subject: [PATCH 092/103] fix atom ener size --- source/api_cc/src/DeepPotPT.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index b2c7948093..dfce657f65 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -124,10 +124,9 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); ener.assign(cpu_energy_.data_ptr(), cpu_energy_.data_ptr() + cpu_energy_.numel()); - torch::Tensor resize_atom_energy = - atom_energy_.toTensor().detach().resize_({1, natoms}); - torch::Tensor flat_atom_energy_ = resize_atom_energy.view({-1}).to(floatType); + torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); + atom_energy.resize(natoms,0.0);//resize to nall to be consistenet with TF. atom_energy.assign( cpu_atom_energy_.data_ptr(), cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); From f3f6402e6a9e192be3ece40bf83ff209ddcd30ce Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 28 Feb 2024 03:02:10 +0000 Subject: [PATCH 093/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- source/api_cc/src/DeepPotPT.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index dfce657f65..690ee91817 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -124,9 +124,10 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, torch::Tensor cpu_energy_ = flat_energy_.to(torch::kCPU); ener.assign(cpu_energy_.data_ptr(), cpu_energy_.data_ptr() + cpu_energy_.numel()); - torch::Tensor flat_atom_energy_ = atom_energy_.toTensor().view({-1}).to(floatType); + torch::Tensor flat_atom_energy_ = + atom_energy_.toTensor().view({-1}).to(floatType); torch::Tensor cpu_atom_energy_ = flat_atom_energy_.to(torch::kCPU); - atom_energy.resize(natoms,0.0);//resize to nall to be consistenet with TF. + atom_energy.resize(natoms, 0.0); // resize to nall to be consistenet with TF. atom_energy.assign( cpu_atom_energy_.data_ptr(), cpu_atom_energy_.data_ptr() + cpu_atom_energy_.numel()); From c074687222e7bbdd37f88691bccfbd3290d8f222 Mon Sep 17 00:00:00 2001 From: Lysithea Date: Wed, 28 Feb 2024 11:41:04 +0800 Subject: [PATCH 094/103] precision transfer in common api and skip type sel tests --- deepmd/pt/model/model/dipole_model.py | 7 ------- deepmd/pt/model/model/dp_zbl_model.py | 7 ------- deepmd/pt/model/model/ener_model.py | 5 ----- deepmd/pt/model/model/make_model.py | 8 +++++++- deepmd/pt/model/model/polar_model.py | 7 ------- source/api_cc/tests/test_deeppot_pt.cc | 2 ++ 6 files changed, 9 insertions(+), 27 deletions(-) diff --git a/deepmd/pt/model/model/dipole_model.py b/deepmd/pt/model/model/dipole_model.py index 6887b0ef57..59976ab968 100644 --- a/deepmd/pt/model/model/dipole_model.py +++ b/deepmd/pt/model/model/dipole_model.py @@ -6,9 +6,6 @@ import torch -from deepmd.pt.utils import ( - env, -) from .dp_model import ( DPModel, @@ -34,9 +31,6 @@ def forward( aparam: Optional[torch.Tensor] = None, do_atomic_virial: bool = False, ) -> Dict[str, torch.Tensor]: - coord = coord.to(env.GLOBAL_PT_FLOAT_PRECISION) - if box is not None: - box = box.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common( coord, atype, @@ -73,7 +67,6 @@ def forward_lower( aparam: Optional[torch.Tensor] = None, do_atomic_virial: bool = False, ): - extended_coord = extended_coord.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common_lower( extended_coord, extended_atype, diff --git a/deepmd/pt/model/model/dp_zbl_model.py b/deepmd/pt/model/model/dp_zbl_model.py index b89e1b67fa..1729b29cb2 100644 --- a/deepmd/pt/model/model/dp_zbl_model.py +++ b/deepmd/pt/model/model/dp_zbl_model.py @@ -16,9 +16,6 @@ DPZBLModel_ = make_model(DPZBLLinearAtomicModel) -from deepmd.pt.utils import ( - env, -) class DPZBLModel(DPZBLModel_): @@ -40,9 +37,6 @@ def forward( aparam: Optional[torch.Tensor] = None, do_atomic_virial: bool = False, ) -> Dict[str, torch.Tensor]: - coord = coord.to(env.GLOBAL_PT_FLOAT_PRECISION) - if box is not None: - box = box.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common( coord, atype, @@ -76,7 +70,6 @@ def forward_lower( aparam: Optional[torch.Tensor] = None, do_atomic_virial: bool = False, ): - extended_coord = extended_coord.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common_lower( extended_coord, extended_atype, diff --git a/deepmd/pt/model/model/ener_model.py b/deepmd/pt/model/model/ener_model.py index 1be3045fa7..6f0761c4ff 100644 --- a/deepmd/pt/model/model/ener_model.py +++ b/deepmd/pt/model/model/ener_model.py @@ -6,10 +6,6 @@ import torch -from deepmd.pt.utils import ( - env, -) - from .dp_model import ( DPModel, ) @@ -75,7 +71,6 @@ def forward_lower( aparam: Optional[torch.Tensor] = None, do_atomic_virial: bool = False, ): - extended_coord = extended_coord.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common_lower( extended_coord, extended_atype, diff --git a/deepmd/pt/model/model/make_model.py b/deepmd/pt/model/model/make_model.py index 79634186e4..0d492c15db 100644 --- a/deepmd/pt/model/model/make_model.py +++ b/deepmd/pt/model/model/make_model.py @@ -21,7 +21,9 @@ extend_input_and_build_neighbor_list, nlist_distinguish_types, ) - +from deepmd.pt.utils import ( + env, +) def make_model(T_AtomicModel): """Make a model as a derived class of an atomic model. @@ -115,6 +117,9 @@ def forward_common( The keys are defined by the `ModelOutputDef`. """ + coord = coord.to(env.GLOBAL_PT_FLOAT_PRECISION) + if box is not None: + box = box.to(env.GLOBAL_PT_FLOAT_PRECISION) ( extended_coord, extended_atype, @@ -183,6 +188,7 @@ def forward_common_lower( the result dict, defined by the `FittingOutputDef`. """ + extended_coord = extended_coord.to(env.GLOBAL_PT_FLOAT_PRECISION) nframes, nall = extended_atype.shape[:2] extended_coord = extended_coord.view(nframes, -1, 3) nlist = self.format_nlist(extended_coord, extended_atype, nlist) diff --git a/deepmd/pt/model/model/polar_model.py b/deepmd/pt/model/model/polar_model.py index da27c3d70e..a6b0452068 100644 --- a/deepmd/pt/model/model/polar_model.py +++ b/deepmd/pt/model/model/polar_model.py @@ -6,9 +6,6 @@ import torch -from deepmd.pt.utils import ( - env, -) from .dp_model import ( DPModel, @@ -34,9 +31,6 @@ def forward( aparam: Optional[torch.Tensor] = None, do_atomic_virial: bool = False, ) -> Dict[str, torch.Tensor]: - coord = coord.to(env.GLOBAL_PT_FLOAT_PRECISION) - if box is not None: - box = box.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common( coord, atype, @@ -65,7 +59,6 @@ def forward_lower( aparam: Optional[torch.Tensor] = None, do_atomic_virial: bool = False, ): - extended_coord = extended_coord.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common_lower( extended_coord, extended_atype, diff --git a/source/api_cc/tests/test_deeppot_pt.cc b/source/api_cc/tests/test_deeppot_pt.cc index cc30e606c0..e0e90ac75c 100644 --- a/source/api_cc/tests/test_deeppot_pt.cc +++ b/source/api_cc/tests/test_deeppot_pt.cc @@ -402,6 +402,7 @@ TYPED_TEST(TestInferDeepPotAPt, cpu_lmp_nlist_2rc) { } TYPED_TEST(TestInferDeepPotAPt, cpu_lmp_nlist_type_sel) { + GTEST_SKIP() << "Skipping this test for unsupported"; using VALUETYPE = TypeParam; std::vector& coord = this->coord; std::vector& atype = this->atype; @@ -464,6 +465,7 @@ TYPED_TEST(TestInferDeepPotAPt, cpu_lmp_nlist_type_sel) { } TYPED_TEST(TestInferDeepPotAPt, cpu_lmp_nlist_type_sel_atomic) { + GTEST_SKIP() << "Skipping this test for unsupported"; using VALUETYPE = TypeParam; std::vector& coord = this->coord; std::vector& atype = this->atype; From b1ad4bc8c0ab4082bf1e36951bcc06a6e8670b2e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 28 Feb 2024 03:59:45 +0000 Subject: [PATCH 095/103] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- deepmd/pt/model/model/dipole_model.py | 1 - deepmd/pt/model/model/make_model.py | 7 ++++--- deepmd/pt/model/model/polar_model.py | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/deepmd/pt/model/model/dipole_model.py b/deepmd/pt/model/model/dipole_model.py index 59976ab968..6629541459 100644 --- a/deepmd/pt/model/model/dipole_model.py +++ b/deepmd/pt/model/model/dipole_model.py @@ -6,7 +6,6 @@ import torch - from .dp_model import ( DPModel, ) diff --git a/deepmd/pt/model/model/make_model.py b/deepmd/pt/model/model/make_model.py index 0d492c15db..b6478d297f 100644 --- a/deepmd/pt/model/model/make_model.py +++ b/deepmd/pt/model/model/make_model.py @@ -17,13 +17,14 @@ communicate_extended_output, fit_output_to_model_output, ) +from deepmd.pt.utils import ( + env, +) from deepmd.pt.utils.nlist import ( extend_input_and_build_neighbor_list, nlist_distinguish_types, ) -from deepmd.pt.utils import ( - env, -) + def make_model(T_AtomicModel): """Make a model as a derived class of an atomic model. diff --git a/deepmd/pt/model/model/polar_model.py b/deepmd/pt/model/model/polar_model.py index a6b0452068..d956a0344c 100644 --- a/deepmd/pt/model/model/polar_model.py +++ b/deepmd/pt/model/model/polar_model.py @@ -6,7 +6,6 @@ import torch - from .dp_model import ( DPModel, ) From 1fa1afc5c0577501de7b9a581db4ac287bc28c67 Mon Sep 17 00:00:00 2001 From: Lysithea Date: Wed, 28 Feb 2024 12:01:10 +0800 Subject: [PATCH 096/103] del ener model precison --- deepmd/pt/model/model/ener_model.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/deepmd/pt/model/model/ener_model.py b/deepmd/pt/model/model/ener_model.py index 6f0761c4ff..1a5706dbbf 100644 --- a/deepmd/pt/model/model/ener_model.py +++ b/deepmd/pt/model/model/ener_model.py @@ -30,9 +30,6 @@ def forward( aparam: Optional[torch.Tensor] = None, do_atomic_virial: bool = False, ) -> Dict[str, torch.Tensor]: - coord = coord.to(env.GLOBAL_PT_FLOAT_PRECISION) - if box is not None: - box = box.to(env.GLOBAL_PT_FLOAT_PRECISION) model_ret = self.forward_common( coord, atype, From 44649660419b59f761011323d52a75d32e6d710b Mon Sep 17 00:00:00 2001 From: Lysithea Date: Wed, 28 Feb 2024 13:50:06 +0800 Subject: [PATCH 097/103] updata test model --- source/tests/infer/deeppot_sea.pth | Bin 123401 -> 123025 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/source/tests/infer/deeppot_sea.pth b/source/tests/infer/deeppot_sea.pth index 6ac68ed7fa6e6ac815516951cd5fdb22f487abab..98aaa8a2ad0ccb1f462ff3475f28fea7d28e24fb 100644 GIT binary patch delta 36771 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 z zFY(IlOc5L*$N4T1FeUx=tV|+? zdFlF+{$-_C9Fng%U1oJUZ!TNEqV(mm)%hbmGVu2m@6}%bVD#@$`g2C#{mW53kkpNd zVPCU&lCb+ug=3!WX*8yP2Riz8Z*FT_F6npXy0pNE-bLO>)BdEV7d`=R>FHhH)#KmM z@88_hi(hE$=-afRdslbw_9krBhn3Du6|O;7uj2^0Y33jI-r;U?$!gbugZTKUl8=ui z{T}-kiC_3c@#4l4kooI0e-mz!Th?H!HnGoGuIsMT_O~1S!syy+~MyA3cU?-Wq~R<7Uyd-}I8;HI|VL3id&Yv`BshtiT$uYD{_ za;u~tw@V?Hw6i5sxCirT0K+zj@+aIqNy!`9A(h*GQYl7YwSk^QN7m@4QtwYW?-IFM zJ|&>W)0y9nbmJ9&TVf15yM3dmrLW4*kgC$|<1;>TV>l73d%BdA&8yV6x|GkVl#J5(*MYR)F1OeUNALZ`uuS%cmTg6 z7#h>~O+(alzRr2vGw4yxKFEVSOMk-th5xgT{85fTK1_oGD1J1ha;Shxm;p1P3aX(7YM~D5p#h)Hf<~APb6_sagZUuC zwXgsd!gct6^Lki>_zmDmE_&3`pJK-f*^`A9{Lo@|OdEZQy;R8l7RgsEc7&5@^!PNv zsOkd8s3vHJ#i-JoR5@h z_uX4bRg!;Fl}c*w_g!o4CxHYyRYjJMTCI@RO}i8TbebbkWGV(^*J|gu5!%=CA@|79 zw|!S%GRsi1+Qpb#=BOp-RwVUax!U`~w6hgeaWX&luH9X<19~ zOAwP7fEbK9C=?2YZQqX>b$|`&Rkn-h3vD0DFrcyfs}R@g5Gc=&Uec=*NHjWe|k&@HZA-R2VF;7I4w09@o^ZL$P*7$hrxKp z=~5Kf2e&R)>vDzIJ-|3OOtUg*RgmbTY%-7oK-V0Tm>7JCB|FeU>z+wkJ4}_5mryFY zEO4~iPrR&c+UFJdr8ua+r>TRa6S&%=b*YBrlW1ZSxyn7b-Mp$p?4EP(t20RNEK6l9 z686nTV5g zo7C?=`k62mO7#UD^Pn{kuR=&h8il0CGYX+<; zh4ayA-Qt^jfyZAKP=+O7k93pNtss6R4_)Ucpo=Lu-xmzR%m)4RQMQ`mC*0^{l2#+FDTIh+eLsXR1i4XX{AK1}6s|O2=H$m^lsd*RJYQmn%M^%Uc%%XhRM| z(Q&FtizN$B{i$(|4=a>QNZxu*xs&TU5Fc8U zTtg|jChKle>sOFE4C@M2@9`tHC&o0S*K8#HZR;9X!tM}M9+9YhViFmW>N(;*;Y(PO z{lW`+P~|?;jDuO?Kkc!6pkYq|Vv%|*iFpeaFbOtP&9RBON%g`>pM%D+)1>5Cg{KFu z=@gXjs1yRuqdyI+FPv+d!{|hBI+0%?*4>hGJIYhJ%8v=By%?wyHN@VfYDkT7iGR#& z!NwHmntvxMq}DkQzVTcJW__At`5=wSpqr@mGjCLm{(Xs9ou)Rn%ME)1sQ9=?uHv_E z>swFdje3We)TFM_-LY)WS=R|_Bp!4(X_w{PSu3C5BOl4DT-I4D^X2B9!WJCnDqU_Y z{w7dENi`@w^(iPQz*Z)xsU%8RQE99e-;DitHK58YJQx1&L}4ZF{Eb(vM@i)JtFHCj zhpmVoeI=pjUjpegN*f^LtVCDtlv#FY9${Zi_T=P1=OmwhI;HBKm$KN~QFdt*;jhPf zhZlji1iiY+txTY?g7m;c)vlD(Ssb(2Dn;!TR?xB%|LzIEWBLY;;FmOuU5b}}#!!7` zpz_vdz0-^E)0T*NxS{lxO48L=sO@?x0?8?(AkQi~P4}*!)B;5CD=So-L_QV8_zAKB zBisCmcZ6p74=2wgs!M(CV_` z2Xpw5HpEsgN|)ins!DMzpR&ZZ8PKPYH8or=Bbn6=?E7x$(2q=YxHf(to@kpTapT2_yg0%z0j+@w1%|*dF=2VbeST<{K!L$f z_y>;&)T<0}-4JIIV#hA7$s_;DD!4uemv^<$oR~*}N%!rYn0>Zz@RxqSTeVgK{NIp! zM4S*KdqEH89>_dB-@KX0Gsg!|j4?OtSl-)Na_l$NaId~0SpV*zgLdg7i9wVt0C|>* z*NJ%s$lyY)$s~DorGu=bUb~dOjDey*dJL3qMz?}KGsAjyR`LXgY|+@S1mA`tYNZpw zWWL2$dZlp5vdj)#aDDa9&U`};P2BFxfT5LqkEGoE z&(m2<>!WNy0s{JG{J)+K6i{OJ5h5rz5Lv3xA~0>@<`Dv@xG>Rw?VN_M{b6E&%_b+R z|4j{}SA8GbGwFg1A*|U3znzYzv_S|VYcns2vCLmG3OSjd5Bx3LF_*C>2Uw}FnCUMb zZf@r_L!ttNsK?BWSXJq9_T2C&fjetUN#}3k2*h*8SRG<12E+*Zf~De;zoG5;QWQ23 z;Qa|LVOd4-`?r*HUXRI)eLjQ$jYcuwIKcwh{&mOSetEvfQNCSQP;q9lRG=2W+mAby z(8~p%W?3zxCn|9^H7qCI)F|DeeFl3q@?grVn4octSxcfcM3ekDxOzutT_7d^WpOll zR3|#`e^f`Ibr8IXG2_b;P{QG_u$Q=n5{1PEh~QHb^i8C={$OgBe`EOpF1?kNnM$Jy z{KmAdE~wpGKL^;m{<79h@n*k09z5I*t+E0>|9wo`S2 z>LcR*R@Yb9c!_1e8QwsQ5|p#(SR1e&@s$guG-~Qzq1>3VORk4Seg2b5i6xoLZ}RN< zG5aYrXZ(2bMma$!w{O1z)Ha#)A~DrNwhM@^DSqr7fQJ$yY$`R*A_zaU6wLY{vUcJY zOA*r5NN}rjli{L!bu>?Q0W+z`dj=IZppRm1n~LGX*@m@%_D1~0PL1Fnu*7oqf>@v{ z!A(3_k&%jBk$DKsZdYp9R;~2t3E1G)Eq&arZTubfC+{S10+Traw6B6pcJJc59ZINS#b_k`$7ZimGqTKfCYv4kMJ3Q z0_-f=g5X`>Y~dMTQFjE&N?YtG=eklaT>24oizjSB$l41pMm7ZhB~`I1Y8?^0WHpGb z-@ii*F0Y504#Z#cN?X~kd|Aw?R#k8>bTb$-)6+p;;03`7TU|{gZfv%)p#TRoyTB9g z#%I?6U_t}qrko=jE|V-wd;;Q2VvhG4m=bg)mydFrhuR0Ix-v3ju5@k8v>(O`r?N9Y zKhIMV@L_8q>fXg!1{seOU5wp%g@^!Rz?vklp?n};cn*d-?)FLU_CE$Ab7{60ETS>! zh$fX(#Qs{f>GUWT8&}=t7M&35dmRa=y^x_6ott6QEI`p)<)x({V+~-lfJf5rpyu~V0xeowm_zd#Du?2yPoc@ILTID*ve13Q^Ek%aBTU~bwnJDo?uX_Kea z$8OPQE&0Mhdg_-i2i%jokOTsT5vW4xeBnBh4RSmpkMB(Z*9}oF|B|DGpqizExv+H7z@zJj z!*~G*maP7nG{#8ZCz{Q&wu}fBRKX2CzCyBuftPdYO>P*N%>rR{KnSBl5OFcj(+Zl+ zx)y9mGiunpg4T9i?tjWT+kdt_Ydjr-g^ZK0C6}XW_9S@K}TO8 z^F${V;z^^P3NiU)HR5x%`LVm3K$_9xbE*bFI=^ziU2WriTfPpCQ1}`_OP|tQ%iheCvGx+H>dcw-A$}oX+n9qBOvgvZKXF3*6wl0vJ8f-^b4}1{{|)*d z-M`h#>9rCZ2xuEEwT=iFADH|BM>obB}V09)PPB}FaGd&JY6-N_k-a9%1h@;uybM>}y0))2$v(@0)qR(Z$hM8?l%L>h@ z9)_TvP3KG9NZI0{3 zxrc3jRd$`{>!uWlHCWc2jib{Aik(x_3KvB-NFKv)jOwmcsMRw6ov(fbcuWX(UWr=E(M6$OEXzkrx1-#v!47iF8j0|>7>QXMa`%~R{l&QVomlbP!8O4Oym zRJJbQyE*3Bj3Rn8sIWDh&YUT|q=b%P{)HRyOHr_BaEeU8Kz@SS4ujs6C+`sZpm*}EGoIQV@bxQH`YAYUcv$4-5 z7hraDz&JA@Wh0i#72#Ix*s;)qY7;!0n0;>Lk0pQL+uB){V{t`Y49`?cU18ffC$W?pPfVdQIOn!qp>8>jZgXnM8o(=d zVA3aD=Ovo<(7I!X=Au@WIY!N-=D&x|Oya$3($S8D($q{0GvIW)riM)gHFyBo#MgRO zo-&cr|7p<2b*b~LVT?v6{42|ZW;XOmpZIH^0pz_4!m zde7O*G2UeHB6wt&maIPDvZg>&3qUSpEKNqNV1n%u`iPD6{*#yjj{%Yb-+nDQuGi`ikEm`FB`KTN$! z>*(Y~V`}cr(}C38MIDQ&F+rkZ{SemoFuJVGYpi;JWP*-=mYysTh0W_cQpIaL*-x@j zaTmr!6N^cPf7T`K%_!>42&h;XcvetAfRI4&NZ>h2N|IiV)9S5}Swo;%z%$iDqrZK6 z!qNaHxg^yVL%?Cf>O=fkLB#AM0JEr##H~JRfM8I4nYa^Pd%1>jr#zvwovi&sRQGQm z$XSoJPQr1knZ0eTb{fC(Pg&=J#PKI+)4E4Fc2{7*Df;EwlIto1XoqfYxF}w`JN@qd z*5mnj9QgCz-Rv_7-Z?WgkIONzHUs%C>CB;_|{UY7-vb)Zp=Dr6+Q-_-I-pYrYST z6Rs#p(Kv`FLrHNe;7&PSH7cy*?Do(!w7qYnO=CT+MPvA7UF6Ua?WGUd+W@Dik5LJ< zp}W+zaN|1yl2eWcb%0Cvj`A^w^KyxRq9}9pM;BF+`E_1#R1wFDSC>!nnct)3_Ik_! z%NN+9YqGPltE-PP!mTI}$EG-iAkIvs4uZNYFQuANLkj``;7+UU%kbstn0e9ytq{iTgXk?6U7|E)nJjlPd z(MvXT+C(WbX%3Q1SFF+m_es$*enxdt4O!rpx^5S4I!=O!Se9zT z&C>)2)RWgf8Vryg@Ne>rFxm}R3gGhwOgzVgqyB!#A%sO-JvJm=o4Z;j4R?k#{tlqX z*(3cD@jZ6S?Q#6VZww`$drMNB>_e=_Z$4Oyc*spN&PJJTmriwXpRAQLA(iuc@Tss) z$we;)8Q$7#Oii=SsJrh&wNX;#GpIw!4ku9pg!v4-{8|S;eioKXXsEkLl(Igkj4*Vn zD-r7q8R{~XYLb8_PNl97h4&*+diAR`-n!972+F6weqg^gD)iotiY+c@R%To?XS=BX z!B(n*92hV<#}D8xqtO<-f&H;cJt@Kjd71_KkLo+n6RkMHdNME|c0u%t_gP#P|6Txi zp5iLU>fktecZbb`M%9Fh%)`<@{CoJ|BX+^EZUeub ziyg6!=&i>S``}$N_u}n`R>RR7?TF&73r$@W=&lKGvumyidqD_?SBuXs2*ynWqgRX6 zZiKQ4($a5Ni}hq5N>_{Kz58o5#JdYni}!RL^iQ&N@3UWAKd_<;=&D6{9suTq@&Fbj zuylla-(%c_moNl^*rUW9=okse`$Ek6jafipgee~o^J>Lt2(}*w1S5qRoJ3Gp{?*-W z$yYUHHygruh=O@v8Lc~7`0y1s(~DU|1gbSEgil-B2aEy3c-@f>^mwmjC)NdMuJ49A z5VP~3q?@rC4;dflQye3xzGe3J(D7~Mxct>e7dZ+lqY>!H8+Quo1MX214PK6r zl4hh|xyJl6#sK!SDN{lQlmdWLxxYdmm`^B_0%M1OH)gT73*>M3v2Q!_n)Jde5w37& zJrs_&AvxmKMyV`W$ePWOUJ2}`mJCNFBwWLL4D6;-MXuobHBxbJ@%|Cg54c1F%f;`A z*6@4IM8Im<7xobgrNBC=_`4YNPlD+WccOsxV#>@&o#Hp7z#D`Z*a?7o-&CE_KY2Ns z>d@siI9Zd{dL#WBkjW}WWo@;{SK%15fPBjA)l!fx&h^JxsDFmWST&XO^P%(M1nV`c zz)U+*8@(@=@eNJv12Nf!vS)~++F?LrU-#0#>hTZ0d9fJ+F z&%@JkhM2(Cmdcu4#~eTo*q!)AqX`YLjOUy;BfqhklPA0``1FGYcp)j^PeIW`Tg4-q zCvYJgx+je&eM>iJy2MJonvH!skxPiIiziVi`V05xn%1Mw#}x90-^)yGn);9T((ib} z^yS{|P9VR+;`{13e?TM>z*-rIz0r=#(PcS%z(!IPb%pM7fdN9b2Qd{SU!|Z4QXI3# z1YVAOG^f*Wt(VkI`b)9&n7zuDbbdcX5eXa1FUF-UL=!R1+e7b=uI*qWyL4;yw*(Cy zWJJ|@)d>j8$lnbqqANS(h8MR3L^HX7aR#IA_PH`WKoo}^#x$y?s< zyC@gfr{ByVt{oPB5qU!QS*(llf20HnOyKnNtXj-Tr3E%P{<;pZ;zYpMCEkQh-R+)7 zKT9uog1QEq#%TJO9Y{?r!VmD+?J95=xX>g|t{VZrl;Q{e$oS1iW~czW+5qzWiEKZ- zgPwPDJL>^{3d#FO1Mw87zKC!5ro#=|wp=)L`ad?HzGr*`Iy?}NH|c*vRUAOzsldy? zoM7U@z(6ekEZ_ipK((rz0}c^l*NcYZAhOoln|jgXs>+hSa|3NqYF%`HKe{H*Sj`R4 zNAQJeg(|@%+sE-#CkKnQh~<%p7iqr_ z?2!^^e-Z`1B=pGr2XlLGEU=3bT)VR;F1ng)87z1~`6NfR3T=VQGb-9V%39i~U$=$4qdig+M_{3t5v zxK@=VliK3J8B0qvFelPyHxQ}Zok#prDj0iCvMVCZ#us^bl@Mh1Ce7-r0e&1i-^VQz zp5(&xi97)UKp*21CDl(IjMg=G$}Lin^mv>LT_JB7tr|8e=jC>TPsPFMFK3u(EXPsM7%nDPy;+9PSf@NyNXR4kc>({k}3gCu^zk09j{xB*(Oyz zkYf!tk0lqQPrFog|CXZ2+Ikkr^ouF_J11jZUsTw<;qxBjexq>9 z%ckbaY$xHGWEBC%%aB_foHr)uzr}N?^r(M%`C4dS9;iL&DKboQ3#!*K_4P(B0I3|LEF%@2oHUHb3Mp)}EASPH|ybvjW`?OE_KM2bP?kcxgh7fp>lFxLp#>Fw!oh;zWl8tF9_Hp2GqT2S!IUU7H=oltFWC=M9^D7N zRMIVOuC7rAS%8!g=Qo=Z=ft=4&Br!al()^*^7008i9q5lBhgccPbE__We%Gm-UW;Y zwIO*)@g#fUz+D3O5p(Z&w1;5rDcTZJ5^)W$q`&1U(Iid)(Yl*utQc42F`RN{v5^4! z_H~@vOXGOD{aKjyZ5(D;cpe#PZMi-B*g3j>&+Ur!WB_|x!nIYrw31q*uiVPD`Iv8Y zNjwtsUrTfZhB?e>X>&3YwCua%fAB8_#_aTnsW7$brAwH;s|s_u8s;tXRy&n05oz=4 zh>l)B)>Q?!d`nmX1~g1scwu`qmXyq}HMWq&nCIrsd74%;;~_Tp5&UClLMmCQjaxDr z!7oRhA;6I)TJiK~l|FMab%U~~25a@rE$*R29X_5t?aV!r(KA%&@YjU_7U_r8Wd_jw+7z zS=J}qWF<1pIe8y^k)%X?{^iGS1zw*OKYnB;r9J;}jwY*%i45=VY!Or$z>$ zWMSMbh^ZRa&&kI6vxG>JsQ$nfVp0iCA^^!@{PhiMaeFk{Y|Sx3S6m7U*{Z%t*=o}r zby;(>h$rx+X;iFAjmWR771^z6RU5Gqvvsk=yUm5Cj$!@wiHi+xd-D7^+A*fBigc-Y z0cq8(VgALdrxo?!lDEks)5q6!UCq<(0(XKf+{N=~>o0r$k*5#8ufv3Q{hH7ZZ$L}e zF-2P+aQg;J8GTnEm>!DrsFZkpwJx{&j>x#w7^mcmmvrfS|2|dKxt8n(?zzfzHsvYZ zlh*Lc)(vi%5v)f+szfyF)~QxVtZazzZU|{Vm6e{^pe<@(>c%`rhAG@^_p??C)B3!I z<~rBapK1R#!)@>8C4x=!h`-bI^8k5r(gVb+yAtjR(e<}cj!AO@)Uf0gMSSTR4U!z9YEpw zYIIbx9d@&;X}FoW(@j%~skx~rwe$12Fksm`3Ry`?aI5bIQK`>1R!g)3HvpyD1Or+= z0$79acn>#f78G6pg@!fMv399UShD_!p~S}`3bi_=!{PUu1q)lt<5{|Pc zmb2$Ya=6T3(jW2Wi13a0N42j}Y8d(_Rmlg40>K#49X!Elo+|W0-z=nAVP;_kp;2b zF54B;m&p5D|8Kcz))S!6)bmw|O+J=S`^Yx~rhcFl`&BiaK$dE%Qmj6D*nW0SL zn&>E!!m41&2`6KLtxl$7^b@)31y_&edD_cWgY=-&p#U{JHNHoc%z|;k@}LE z??dp+q9ru+({H45*et*7((FVAj0f(~&r*>+y|UCFI9&7=Qi1k>8RS9xFD0EO!{~#} zomXh3>*Bv_;H6R2j}<0}YK#~ve;SB(i&+H*t=?ztiM!mZ4bX(VFaos=lH;t$YVK8E zh1f8H6w zW1>&=RKb_1Pd$Kj(h}hf@SGd~A508$2=-*7PUFLH@o2(+7Up>DRRrq5UXT;9o<-6c- zSj_~_F^HdJK_W z;=UP5BazxdUXhKFB|d}0K6&>i!XWpJi~10KDDhPhoIaIBzuEV#201{^+YmEjVK?Z4 zMk_*lLOmhwGzP~Q28W`$DU}Tnf;uUb8HR>T0V+lMzr;S!M|z@135ceNz5_yc#C*a3 z0o(3w03elKDn;8cXV;;=JHI4%;OlO@UV-;3!wABb0kDz+NaX;qGC=rZX#no0P7yz> z*hkhuvXYleBb9+jXM@V*<=<(-jfuN>O8lJ?StJElnB|6S<3$`|HjMcrE_zWjoV$gv z+>_U~GGBx{x4|8xp&f+yny|ylY-4nNlyZU)fUCgqYlqSs+F(N%0Da%!d=P@PZ5)Yl<#;Y(=KqiCi!$Q?A_zs{WlLl2#E&YM^J z01*C}px5BI?(sXrNvm@)U;X1&?8MC1>DxExkw~VuiC6u7$YL4U^)JMakGOZdm>%pz zfsq$xe!$7=QrahXx5n+6HqzmW^Cu)mCBDazwJRTn!l0u;!{uH^jCl7_O6^K*Xhf4_bu7s`-j)%S~8h--YIum>? zmssUeyInnb?iLx5R%!DdVVhV7T1)0hRzN>DI0@;p?I2-a7IYYlE=`40sXeYfs*>Jlsb^SphOf6#+coDm83XF z0?%SOApmEORe7&Kq!k+{g_yczVrkv{iX6V;e&{@JLKrhcl5^9D+eJa%=}6jVZ=&Z} zwJ!RQp07Q*wjN(fl)xcMnQY~lAq8hTGc=i&^o6oQy3fcA}Jf3NXm>a)zS71fR_tF)}BixNRIp5!B*L zyl>B+{L;wl9EQfg=4-qT?}8r7m1i{OiOihOrDA^Tck&0cU4hnk>hO+u^5(%chmgHI zo_mcLzFy8g|B8GA(Em2JtUyrzjfJFkX8=S0>u$k- zS~}B!B|reSxMJuz&+$R>qf+#vb56g^6WVymp`G@F2D!56VB!vFgK2FR)2)2GSy=d% z7EF9PC+H{Yx-iDfQLZlt1X@9a<98uL2g$%doWdRuet>}YQA;`X)m|Da*AJj35lRmU20n<_aR%FyME;Jk z3eQGfsGfJPA5yqHJzdo+N4;1_^YLcmO9jPg;03wMP+?@|wgA6*mMbp!CH`&%`Sfj5SrLl4bMH_|tCSQeBA6X*7g1Sqs%* zuI~=FsxKdCuOKcmXHMQdyu+88r{@3W>XQigXcK)9z;1Yw9vZdCd{ilRDJK4$-BB9k zWwxo$q|R1Y{+NCIwNa=B^JG0tD-v4pS;z?>(3CBP9UXS8(nz#Ra&5>81zVUol`SDM zBGNjcSpDq9)|g`aLpZ;pFWOGTYNnHt$ZZPGW72M?s`56jv>%e-SCm+zlUPyRt3yJ3?o0l%?_WKPe@vPzr-)(~|pw=v39H%kwo zBf`o*k`v2#@hxwBS9!L=Izx7?G%r_Q#N$lCxVoj(YMa2&mse*a@0WJyraDPv3*_}t z!9GEi(KrJ)6=AH_P4VG?&<#r4mz<}K760<8CS>wz)Hjs!$a^2&W_2a>H)F&%f>dp< zSo54_hhQ%;&ki-ON*P|bj9Q42AfW+#iI!}3hTD{|)@h+pUqNk`Harg9jA>s_I4pE( zMV!}S=HT^!?*Tc!Rg=KB=G2r>XptWNMR11f5APdl3)oo}wr^9fSZn~L{ply{aajMP z)FM6^pt5!0-53Eg_I*kdw0ehOPiP|w22Qrmn9SPd;U{ZQD2DdWt(D~;a=Zr=n=fGn zHNy+}C(tH6RNm?hoy*^SI7pz$E90+8Eqq4F&ezoscu$WW3yCqDz^zWp*NbdUD;FPQ z`aZ`b8`g!3)9TPZd!23tZ;i(lcY{U3JE&nug*3w~XHwa~AI(m?!{NXB+{(GI}U_Ny$i;9km`h8VAt+acDo z+R=To2tHkZ4}2_~O;K-QM|of$U`Czn?`9e;QZGx3zm|;Q$RCufi8r&yWL7JH1#oRt zsC!Ksa`^7Rc{!l@O!u;MlJSMhk6!<3kEb*BYd z=d?RaIx{$(UQpg>f;2*5c?wKTDT1Xw9DaMt_tk)?*}2`xnk5W$MQChz`P)VQ zSx?C;woEtJadzdexdCY`P}1v=dD){t`-Cau&f_MoP*3XT{|o>G3V_!`97YqrwL7%U zx9Fm2{za!{YYfqGXNA*fbrtZ}4M=SDL}e8~Vnb;0%wU<-Zv0g(fioLS8DVTmvL3Wg z8IX`84MRoG_dAuwvuVFT$uc=N^*Gt}Jy}*gUP!MqB68Neu~3mTP0R@$w~6>Nx|aW2o=H(rNnboZ>b0=e)EzgaD7P`*<2YJmDv4ffz71H@2$GUH#UUs>Y- z;P)f~uU@?X(9dejPrcKqoybFk{7C|lae?r@J9UQyojJgeCC<6{#@w&PKkfy3(dADa zkA$`Z?idE3ZK+M@zlfv4B7c5Sj?Ai2p6uHI>y5<4#MDw?7%({f#Bplue^Xg~Xa2Jz zWc!9*q`Y2aHvhmSE3OT30C`L9%gbcMGOCK0RQQ1Tej-Tu{J9T=jiu?h$bjQg%nXRk>r{7*A$LFPY8e_lP zr3#m63D3X^(HFVtcoq2lPBtZi?2(r5G3P`7&5$P`y_uYFtY)`w1W9Hemd|jqD zIq%IRdZsIfbO>Gb5MIAw+AQ1!{jE^DB0K+0HTX?i*AujAAhIsqvHE-2J>Aa2Q!>D3 za_9%LGi1*QJQkQA+Eb@vwl)W`O@@>q-uF37)q&E%Vbrw;)0d0n-@B40RH&;)9Fq=f z+!#VrR~4xuDdK)au)pW{&%EscGEVe6HM#(p1QG3=#q_Cl%IcH$LfYZ-*zAdqkB$099*{?YPvykVY6#jL+UV93c&2u zUnCm%UlFedk|K=7cxq>m9_hFsSCH2SzS=0WiN&WjjfSa$f%v0I1K5-0r$m-c#nqOI zB;u30h{c9<@dQSFoRhGKiI;HrSqngP0y}ws_oPB5l)-iX2}lk7je8G)|MR7=VQ5&W zq&%h_7!43@2BP858B9!M*W*osR6a3#zf$__8jU=!qdYphOY;TFvTOSM9rUd(GOA%X z3T2ehB~89%ipt`+#BP$1vw2lUJ{L`Hef z=8K`YZTBOe+5w-zu<=6fKWzps_{T3#LeSMr2WhHI(In0v<;)}gju z3PO=}ceoUE>){qWB?rw}4_TcNFQ&VmJz?c{hhTtta$yZ{gTu>JhFda0Aj zlt!&(Eg$N?1&|ZYeCS`tr5aj?n-s_{W@`S{n}B`S!V-{Df=WK~EC5;x`F7>^Jgx%r zXbDEcXlXxSf9H*cb(1zs`octofv)y5pqSOhIJAlpoSOn$|Mb-j5uRi1p9&Mca5v{W z3w2~1Rpo)n;>9xIEygO%&kpXM3W;6>xPr&*@{a+v!E zV?FiNo}E~5VEsAu{LcUKZ%O0hr976+OrO_gD`HyAroS^;f>;0S4na7!&x#ihrHBRf zP+zS26(JJA>{%)iYc~?GC%EdY{FpYcubmiOKQS<2E6Hu8?>Tn7LhxkQ=cykDFM-(A zN`3Hk$!1#c+zmEe%QY=3KVM5_r7NgO+H6tPw(KiqO2+>q87yzq=Y-M2ey=&8c6`Us znd3)4(fOEaR|1R)Sge7~VgS|gWGng`9dKw8FW@}Uo{cnP9#lF}>GNkAOMkjxPn!zU z&$oD`$xXtd@bB~ZaUyW;<1k&|af(Nya^e#JZ!~@K{Hugj~N^f<U3I*w^LydPv(MLhUq|gQLcP+vlD^$*Ll1PG{p;!J zY1&^~r5Y`?S}mf|_4Y&c1%pnsL-*OErL;WZcoXqQoX%>}$q{-^#k%2F(%UyVTiIve zl;|XdP?Oz$Ux1(QuaB1-{B1@t19q$Vq8tEd*LrjJ>Rgwfk8$X`_sjJT-o-|<-wwTn zvM40qSb7!0K|HI9^)$UHi8{T(qxPcjKWz7nmizSRBf<3ETJHEN1k?%*99-F!wMm5` zM{}7J%|_SGbUNL+)50XmITJH|p5CJ`@mchd+;>}>j9TVww25muU*^UJnngr6UN)fe zm5P;}{W(LwF3v@b!LCAUfJU=$lYEK3Y{0yKK%_Uxx=dubHeH2}r*INe7D7_pX_ku*q5o^Iw?h(KvvI64$;yr6l5uwF$f_2FE*Kt-BX8^tGg-xd| zNKY{KmV7QnLj2H{&EzCxGH`!#Q3Jvi8yZ1mDoSWQP@TqteD0=7u_shdTYC^M*`Bt^`Bnnzadgqe1+t)O51n~ zav**{=Pji%~fSE4JH1MbUbpG>BiD3~z`aD`_ zWg3-F1&^IsEO9x<$`ITTSTSzk9#w-TM8x}xpQ_%)7$~Aa@+NW79Se}7aT@WkiAYg6 zzC-9R_;z?W6_i{*S;W|3*gh21!hTweM3bnL)$llwV9gmr`ikxH;7%`9NaHi>fuVuO zR4Agtq`+20;~}0{2e0E zkli)mH3zJrLvvPKv#LN0uLm<87~i$-(=KsHrYOP{U&;>S=PQM)WeMII zKQ5JvkuINM$RuoimVVOyjB>sfa#~zmkkK(_2>kKN@CUIHb4oe0A!FhvmWBfNnVr-U zTS>LGQ_DJPsva}&+z$xSDSH&Io+-y#{Wf+-i~*|*@!vFN4+JpAM6u@r_$P;VBz+pA z`KhL1zIr)h;IG-)@ zLmqoQ2xru@lHcvUVB*MVv`(RqUlq)M#vmm}~rF6tlE)9xr5;d*5@4t+m{%+GVC_a+oz~VhaO{H3+!*ps}R;53E^+6R1Zap(=k)>gecsQ4RUCs1X#uKl;wQNeErc|pTGt8M4posv zks8QVAE0ht|CB>SV4}_(%##its5T581o(**Z9Z6+IDb9`j0psXCs&IUMKrMu-{aaD z)rHO5I#$u<#ukn;TRHPpUHNX)dlLVe&=GgjqLvqR$flg#N|BbmjW2g6Rw}x+`~^SD zV7oM$X9utl9>d9>;IPaYjMR4%@lZo$HJ{CoaOv(AVJfC|M{LMHd`L#$W=nsU>T{6{A;&Z3;HWe!Wy)dGWMif7k@;m{Vm zuz3ugK(CUbz3kKyR7!iYq13cS_q-x-6o|$=uvr~V~@=nx_JpZ+%D9Y#v@!s22`?OpQex<2>XXtqXPpDbPxOQ zfmeUDlVYqZ*ULHeybDSBp`1t}x>)TFrvQ?sB9ZO+SZd>9?_A0Q=fI@Kd3`Cf?)1lW z^;GTUE(hMVTcyYZqJOHr4^iL00@>@)i!ZgAPmKMX>>RR{7*n&P=M19@?6?y%D5$?5 zmY!cKujs5HahYZdo?G@=zTNg=3NBajbkHn1{I3TgNC*AE+e|~Zb$NompDitXC;;#0 zVeYo8VgB@Ce@AA3)^B*>yRIx-Xcqrgd4QT1_@P|JxVyUBlKS!GADC5l`+E4Oon0$p zrX<@(HJ9NO7TLyjt0<==4LCk{URQu=L%ujds$TIW>q!|Y2ayMr+$eWh;dU(ETW)L= z;^AR9zA$|isFYn9>=d}~?FhQayaGO+?_VMs6a)nFi1t0m+liS1zUap|<#LZ;cg>}o zo;8S3I&9V*O*#uT--HR(C$WN=oIb>gR|Db*2H8RCbeT=06Oe|uG+ihuK6F%nn5)~w z=yodHPJ&_Ybh?-xa`&evOWchsUJarS>&L0BlwTZTD>f7>!dRTP4~v!hMxccsj(|pSULwwQ0SFO$+(>cFM+fYHEA;lMC1ij%cn9I3s>u|HnkA|L*NKo1(uKqN=FCB z(I9Y-FW5t83$f}H5g&9JOn~7s`7`Jaq`MubtJUe-W z)Sn!!qDZ0m9WN(qj-6cF}QvXyW!ZTV92um64|ks#Pyr2vOg1_ z{(Wzff5kZ)KzAMcDHRs{7r{n`+pWN7`W~G9UW>MM{7?*Sr-hL2a1%)-F5q2SRqk&zN}CeqKE|A;N_a+QGI{&? z<6vEAZY+%i(U8=;8)>j2`!%_+U3libaetP@!C~`c5l~fGUbFN*f>J z`M6GGY}%u1bc+D}Q6E>+ql|T@oEJ|`JLM(Iqp%>_jcV<#_9ws^e+m95?_MU=1?^;9 zF}!~(QY>uUv`aJgXi0*p@)+&JlguecsCSru+zpHGyL2A^QLkBf^jMVk?QLsZy!V(o zSP_MIrw|s&X>k9AKf*+VUa=xQ`y)(Qop72H{bXvF!^?_dbcOU(kysQ~qQ}*^W-#Va zROJXoeUzXx!W!_m9Eh=BxU8sNc{9tYp;0H1XksH~s6``^UAPYF?H;GB+h=2Lty}4e zr}jY*Ll%!pvlXGgOV4oWpEI#Uo6_4_6fE>7ELvlcb;VwiQ>f)$B`bX}MYYPac8nw3 z0IGzK;l{nG37#k$4YIIIdR=i@F-@*({x1nySWEFm)BG+Eq?iUCA8kx9JT=#xgT?L zIU_5zO=9@keA;lg$h{2gh}uU!*(;qXQ&@q-ggc?} zW(0+l>-1b7oq0yC>(!0=x|!&;s?!?`A@hLC#dRwNLBVf!g!`&mblJ5qRTbNq1tnMI zLtBkR@XFI~Ps}OnJ1vTv-7_5o!)IUQgsNf+)#tLu$o9iU_k!-Ly)-xedO%$`CmiE- z1eVc{>bhE6DcPUlGkpXdrsb>R{dPHY{ZPa{FiII+<&?kTp|4~KxaAS?GoMNwuMglu zLx=Cg?m=(+c2aVzmhVGjc#|5wo;v4Tq~6s!g6;7ut8?gOaUuj^R`5aan4DoUJm0BQ5?Wf|QYzmm!%lW)8P|Du?0-8s9DiGsljg7CBg&v|@w5RM{&nf&AqhX7 zTvB0$HzTj-Qh9b*&$-HM(oA_B!yvUABSbNKaXqg^2CD68yIgZCFNJ#1PY)r`TkOa8 z6r*tlYV_=!Is(>f#nOE~=qG|meRfe|sH+F_*;UB*qSH|8P@F$T!4LZR0<1j6B$wWh z?cP>TvGf!A+zKw84mr@kOB|zwyog)4(BLXI*1cBVIDev*VpM2)&KU7ply+72a|_kH zBvs*(HN~m0vU6lx37i`Bk4X7>%~o0$MDBth{=y#H=ew$G9;CFC^6HCb0tGGDTO(;5 z2d{0*>NJRSzR=_spHgukWSes7rQvel<%Qt+@DON&L;((*-!oS$tAE+EhSuOf%ROHb zZ-i|MB~um{e+x871%^Ivc+1`yqP-!VwQ+X=9b#-0m1BQjFx&)T)HrQWmNMY0JxHh$ zD8f_9-u3zhi=1^Zw~6rbvGL6ke*eVBsrsRzu)$G1_iV=nCnb#bkf`=P@6;HBPg7rF z;C#`Z6q(9LttnPIx0G^@|_pGj_w10Y1!BGy(Q-llXfymb# ze9k79Q6&pJOx`vX(~4VdhBpt3Obe#1npVWN#hESGq&DNK|k(=&~g zV$qW$x9Gh%u-_Q#V^Vv&t;x2^+SCYI(N8AF6!48(F}B7QKo`>)A8?T#j&=Le>l8mB zA6nOjCWU-^hg&nCuf`i|(1l*tNJIxGt?`c%kKQ)ZH0a8ZbvoR+)f{ zM}rn$IXZNNBnOUTz4r#Dj@U!%B8p|8OpIc;x93H*BqHXl>xgqdDK0AR%K1E*ryAY` zkE%_>?DK|1SzGC;MF|2MrOg~W9Ei_WXsZ4W>WbO8*vuw zx8%-PDkR@fqc7}(W}0DVwUiB*$3M5Qflok)m+#h17AG>+w zA==m4d*$$ir;0(bi!JLgjujlQE%B&(I2OD2u z6e&C0e>(#k3#u){kF8|PLWtNh9693>ZBhj8CVox8m9HnB*<&$!t#fLzwnU!CF@e?!!CiWsEMd}>e=E(=tV5l z<2WONhZD0^D=F1xg@5v!%St#yLEUT%C-Bi4s*1CV{_G1Wzs{Yuls3JjWZ*t9Y|O)E zy}TkEg`yEP+Bt~HCXx5AhyrXZDLf9(%Mm*X=68#YReD8d8T&@NMhi|(^80^yf?G>{ zZ68mTt3vg$$**C@*7s#H_Sr-WO%};l4Zr5ZOBOd5WWlpu)+Di_;&cV3jh(jd+j0cm zpy*ffLQyeNDqY}oz)F#{b9{u0H&i?t#>nRL?DR-uz*Lw7L62%=1C-Sp!?CCJp55+0 z7fCil5}#Iyy=4@bj@Rvf&&W>Tf<3m2KCOxCh*nM~is3S3652oABmv;!{fPr{Z9yly zd6_%?zuzPk)yS)`FOi-+sfKXw=<+0iN{?CHmXrFk2;f~1THTT(wmBB!j#|zMKGzsG0v!Oj_pYOtEfIT4J4z~|@yxe0)f=;fZ{tgi zvb`+_^vhH`Y;8MRlkm*Z?4iz?k)f4r7l+(uQrfQqZ)oVZl#@<{?|_Sb7Dvn_M7`;% zh4J3^&BrVvUFL4d3w73vNJy@_5s&Mmxfawz3Bt(Wl+?GdJ~Mh{ZEcv&w)B%0CnP?B zyb=Mfe%6;&ue2Ksoqu)xsq5Y40AxkD-?_Dtu-k{)!hHiv4tSL=Ysq^LC0u)#lk&z@ zuHbG_P;O;@qW!|uq=F60#dOGqTiiV<^773icWd0(+%61A7l=SiF1C<8w z2CgF0u79siQm+-_(p=Xi^1Z~&`5u+zRQ$XeQV!Za9*GDb8jkANiV36MA!aJKHM%21 zUub{RTO9SG?lAmXu6^!>hDX6in}vyiZ~Zo12$`F0t1dZ_Xu9>^j`N2&S}rHM`>I_G z3#&IuXR|2%O%Wx_&~^TsqNgE ztJDJ@7n1M2388FC744dYxoX97*dceULPu|9_ek4tI`u+{(niL~=;%J1w1^}&1f0`PTKA?|R@Rz{>L3R*ulmA_k1A&FS?0*1>`u6Am delta 37036 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 Date: Wed, 28 Feb 2024 00:47:28 -0500 Subject: [PATCH 098/103] fix LD_LIBRARY_PATH Signed-off-by: Jinzhe Zeng --- .github/workflows/test_cc.yml | 4 ++-- .github/workflows/test_cuda.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test_cc.yml b/.github/workflows/test_cc.yml index 2082e7e4cc..d98f8ca58d 100644 --- a/.github/workflows/test_cc.yml +++ b/.github/workflows/test_cc.yml @@ -56,7 +56,7 @@ jobs: TF_INTRA_OP_PARALLELISM_THREADS: 1 TF_INTER_OP_PARALLELISM_THREADS: 1 LAMMPS_PLUGIN_PATH: ${{ github.workspace }}/dp_test/lib/deepmd_lmp - LD_LIBRARY_PATH: ${{ github.workspace }}/dp_test/lib + LD_LIBRARY_PATH: ${{ github.workspace }}/dp_test/lib:${{ github.workspace }}/libtorch/lib if: ${{ !matrix.check_memleak }} # test ipi - run: pytest --cov=deepmd source/ipi/tests @@ -65,7 +65,7 @@ jobs: TF_INTRA_OP_PARALLELISM_THREADS: 1 TF_INTER_OP_PARALLELISM_THREADS: 1 PATH: ${{ github.workspace }}/dp_test/bin:$PATH - LD_LIBRARY_PATH: ${{ github.workspace }}/dp_test/lib + LD_LIBRARY_PATH: ${{ github.workspace }}/dp_test/lib:${{ github.workspace }}/libtorch/lib if: ${{ !matrix.check_memleak }} - uses: codecov/codecov-action@v4 env: diff --git a/.github/workflows/test_cuda.yml b/.github/workflows/test_cuda.yml index 9fb11c467b..915d983663 100644 --- a/.github/workflows/test_cuda.yml +++ b/.github/workflows/test_cuda.yml @@ -71,7 +71,7 @@ jobs: DP_VARIANT: cuda DP_USE_MPICH2: 1 - run: | - export LD_LIBRARY_PATH=$GITHUB_WORKSPACE/dp_test/lib:$CUDA_PATH/lib64:$LD_LIBRARY_PATH + export LD_LIBRARY_PATH=$GITHUB_WORKSPACE/dp_test/lib:$GITHUB_WORKSPACE/libtorch/lib:$CUDA_PATH/lib64:$LD_LIBRARY_PATH export PATH=$GITHUB_WORKSPACE/dp_test/bin:$PATH python -m pytest source/lmp/tests python -m pytest source/ipi/tests From 8d6c11cdda3e41ebee62335c2e186c3110cb9667 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Wed, 28 Feb 2024 00:47:52 -0500 Subject: [PATCH 099/103] fix codeql warning Signed-off-by: Jinzhe Zeng --- source/api_cc/src/DeepPot.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/source/api_cc/src/DeepPot.cc b/source/api_cc/src/DeepPot.cc index e7e89b5cd5..442e2d90cc 100644 --- a/source/api_cc/src/DeepPot.cc +++ b/source/api_cc/src/DeepPot.cc @@ -52,7 +52,6 @@ void DeepPot::init(const std::string& model, throw deepmd::deepmd_exception("TensorFlow backend is not built"); #endif } else if (deepmd::DPBackend::PyTorch == backend) { - // throw deepmd::deepmd_exception("PyTorch backend is not supported yet"); #ifdef BUILD_PYTORCH dp = std::make_shared(model, gpu_rank, file_content); #else From 99dd474f40c62d9bb51d15fb154a6ebb0f52ccf1 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Wed, 28 Feb 2024 00:54:09 -0500 Subject: [PATCH 100/103] add tests for ipi and lammps Signed-off-by: Jinzhe Zeng --- source/ipi/tests/test_driver.py | 105 +++++ source/lmp/tests/test_lammps_pt.py | 695 +++++++++++++++++++++++++++++ 2 files changed, 800 insertions(+) create mode 100644 source/lmp/tests/test_lammps_pt.py diff --git a/source/ipi/tests/test_driver.py b/source/ipi/tests/test_driver.py index 1b2e1dd951..fd84f4d66d 100644 --- a/source/ipi/tests/test_driver.py +++ b/source/ipi/tests/test_driver.py @@ -251,3 +251,108 @@ def test_normalize_coords(self): ) expected_se = np.sum(self.expected_e.reshape([nframes, -1]), axis=1) np.testing.assert_almost_equal(ee.ravel(), expected_se.ravel(), default_places) + + +class TestDPIPIPt(TestDPIPI): + # copy from test_deeppot_a.py + @classmethod + def setUpClass(cls): + cls.model_file = "deeppot_sea.pth" + + def setUp(self): + super().setUp() + + self.expected_e = np.array( + [ + -93.016873944029, + -185.923296645958, + -185.927096544970, + -93.019371018039, + -185.926179995548, + -185.924351901852, + ] + ) + self.expected_f = np.array( + [ + 0.006277522211, + -0.001117962774, + 0.000618580445, + 0.009928999655, + 0.003026035654, + -0.006941982227, + 0.000667853212, + -0.002449963843, + 0.006506463508, + -0.007284129115, + 0.000530662205, + -0.000028806821, + 0.000068097781, + 0.006121331983, + -0.009019754602, + -0.009658343745, + -0.006110103225, + 0.008865499697, + ] + ) + self.expected_v = np.array( + [ + -0.000155238009, + 0.000116605516, + -0.007869862476, + 0.000465578340, + 0.008182547185, + -0.002398713212, + -0.008112887338, + -0.002423738425, + 0.007210716605, + -0.019203504012, + 0.001724938709, + 0.009909211091, + 0.001153857542, + -0.001600015103, + -0.000560024090, + 0.010727836276, + -0.001034836404, + -0.007973454377, + -0.021517399106, + -0.004064359664, + 0.004866398692, + -0.003360038617, + -0.007241406162, + 0.005920941051, + 0.004899151657, + 0.006290788591, + -0.006478820311, + 0.001921504710, + 0.001313470921, + -0.000304091236, + 0.001684345981, + 0.004124109256, + -0.006396084465, + -0.000701095618, + -0.006356507032, + 0.009818550859, + -0.015230664587, + -0.000110244376, + 0.000690319396, + 0.000045953023, + -0.005726548770, + 0.008769818495, + -0.000572380210, + 0.008860603423, + -0.013819348050, + -0.021227082558, + -0.004977781343, + 0.006646239696, + -0.005987066507, + -0.002767831232, + 0.003746502525, + 0.007697590397, + 0.003746130152, + -0.005172634748, + ] + ) + + @classmethod + def tearDownClass(cls): + cls.dp = None diff --git a/source/lmp/tests/test_lammps_pt.py b/source/lmp/tests/test_lammps_pt.py new file mode 100644 index 0000000000..bf1ef97e2b --- /dev/null +++ b/source/lmp/tests/test_lammps_pt.py @@ -0,0 +1,695 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later +import os +import subprocess as sp +import sys +from pathlib import ( + Path, +) + +import constants +import numpy as np +import pytest +from lammps import ( + PyLammps, +) +from write_lmp_data import ( + write_lmp_data, +) + +pbtxt_file2 = ( + Path(__file__).parent.parent.parent / "tests" / "infer" / "deeppot-1.pbtxt" +) +pb_file = Path(__file__).parent.parent.parent / "tests" / "infer" / "deeppot_sea.pth" +pb_file2 = Path(__file__).parent / "graph2.pb" +system_file = Path(__file__).parent.parent.parent / "tests" +data_file = Path(__file__).parent / "data.lmp" +data_file_si = Path(__file__).parent / "data.si" +data_type_map_file = Path(__file__).parent / "data_type_map.lmp" +md_file = Path(__file__).parent / "md.out" + +# this is as the same as python and c++ tests, test_deeppot_a.py +expected_ae = np.array( + [ + -93.016873944029, + -185.923296645958, + -185.927096544970, + -93.019371018039, + -185.926179995548, + -185.924351901852, + ] +) +expected_e = np.sum(expected_ae) +expected_f = np.array( + [ + 0.006277522211, + -0.001117962774, + 0.000618580445, + 0.009928999655, + 0.003026035654, + -0.006941982227, + 0.000667853212, + -0.002449963843, + 0.006506463508, + -0.007284129115, + 0.000530662205, + -0.000028806821, + 0.000068097781, + 0.006121331983, + -0.009019754602, + -0.009658343745, + -0.006110103225, + 0.008865499697, + ] +).reshape(6, 3) + +expected_f2 = np.array( + [ + [-0.6454949, 1.72457783, 0.18897958], + [1.68936514, -0.36995299, -1.36044464], + [-1.09902692, -1.35487928, 1.17416702], + [1.68426111, -0.50835585, 0.98340415], + [0.05771758, 1.12515818, -1.77561531], + [-1.686822, -0.61654789, 0.78950921], + ] +) + +expected_v = -np.array( + [ + -0.000155238009, + 0.000116605516, + -0.007869862476, + 0.000465578340, + 0.008182547185, + -0.002398713212, + -0.008112887338, + -0.002423738425, + 0.007210716605, + -0.019203504012, + 0.001724938709, + 0.009909211091, + 0.001153857542, + -0.001600015103, + -0.000560024090, + 0.010727836276, + -0.001034836404, + -0.007973454377, + -0.021517399106, + -0.004064359664, + 0.004866398692, + -0.003360038617, + -0.007241406162, + 0.005920941051, + 0.004899151657, + 0.006290788591, + -0.006478820311, + 0.001921504710, + 0.001313470921, + -0.000304091236, + 0.001684345981, + 0.004124109256, + -0.006396084465, + -0.000701095618, + -0.006356507032, + 0.009818550859, + -0.015230664587, + -0.000110244376, + 0.000690319396, + 0.000045953023, + -0.005726548770, + 0.008769818495, + -0.000572380210, + 0.008860603423, + -0.013819348050, + -0.021227082558, + -0.004977781343, + 0.006646239696, + -0.005987066507, + -0.002767831232, + 0.003746502525, + 0.007697590397, + 0.003746130152, + -0.005172634748, + ] +).reshape(6, 9) +expected_v2 = -np.array( + [ + [ + -0.70008436, + -0.06399891, + 0.63678391, + -0.07642171, + -0.70580035, + 0.20506145, + 0.64098364, + 0.20305781, + -0.57906794, + ], + [ + -0.6372635, + 0.14315552, + 0.51952246, + 0.04604049, + -0.06003681, + -0.02688702, + 0.54489318, + -0.10951559, + -0.43730539, + ], + [ + -0.25090748, + -0.37466262, + 0.34085833, + -0.26690852, + -0.37676917, + 0.29080825, + 0.31600481, + 0.37558276, + -0.33251064, + ], + [ + -0.80195614, + -0.10273138, + 0.06935364, + -0.10429256, + -0.29693811, + 0.45643496, + 0.07247872, + 0.45604679, + -0.71048816, + ], + [ + -0.03840668, + -0.07680205, + 0.10940472, + -0.02374189, + -0.27610266, + 0.4336071, + 0.02465248, + 0.4290638, + -0.67496763, + ], + [ + -0.61475065, + -0.21163135, + 0.26652929, + -0.26134659, + -0.11560267, + 0.15415902, + 0.34343952, + 0.1589482, + -0.21370642, + ], + ] +).reshape(6, 9) + +box = np.array([0, 13, 0, 13, 0, 13, 0, 0, 0]) +coord = np.array( + [ + [12.83, 2.56, 2.18], + [12.09, 2.87, 2.74], + [0.25, 3.32, 1.68], + [3.36, 3.00, 1.81], + [3.51, 2.51, 2.60], + [4.27, 3.22, 1.56], + ] +) +type_OH = np.array([1, 2, 2, 1, 2, 2]) +type_HO = np.array([2, 1, 1, 2, 1, 1]) + + +sp.check_output( + "{} -m deepmd convert-from pbtxt -i {} -o {}".format( + sys.executable, + pbtxt_file2.resolve(), + pb_file2.resolve(), + ).split() +) + + +def setup_module(): + write_lmp_data(box, coord, type_OH, data_file) + write_lmp_data(box, coord, type_HO, data_type_map_file) + write_lmp_data( + box * constants.dist_metal2si, + coord * constants.dist_metal2si, + type_OH, + data_file_si, + ) + + +def teardown_module(): + os.remove(data_file) + os.remove(data_type_map_file) + + +def _lammps(data_file, units="metal") -> PyLammps: + lammps = PyLammps() + lammps.units(units) + lammps.boundary("p p p") + lammps.atom_style("atomic") + if units == "metal" or units == "real": + lammps.neighbor("2.0 bin") + elif units == "si": + lammps.neighbor("2.0e-10 bin") + else: + raise ValueError("units should be metal, real, or si") + lammps.neigh_modify("every 10 delay 0 check no") + lammps.read_data(data_file.resolve()) + if units == "metal" or units == "real": + lammps.mass("1 16") + lammps.mass("2 2") + elif units == "si": + lammps.mass("1 %.10e" % (16 * constants.mass_metal2si)) + lammps.mass("2 %.10e" % (2 * constants.mass_metal2si)) + else: + raise ValueError("units should be metal, real, or si") + if units == "metal": + lammps.timestep(0.0005) + elif units == "real": + lammps.timestep(0.5) + elif units == "si": + lammps.timestep(5e-16) + else: + raise ValueError("units should be metal, real, or si") + lammps.fix("1 all nve") + return lammps + + +@pytest.fixture +def lammps(): + lmp = _lammps(data_file=data_file) + yield lmp + lmp.close() + + +@pytest.fixture +def lammps_type_map(): + lmp = _lammps(data_file=data_type_map_file) + yield lmp + lmp.close() + + +@pytest.fixture +def lammps_real(): + lmp = _lammps(data_file=data_file, units="real") + yield lmp + lmp.close() + + +@pytest.fixture +def lammps_si(): + lmp = _lammps(data_file=data_file_si, units="si") + yield lmp + lmp.close() + + +def test_pair_deepmd(lammps): + lammps.pair_style(f"deepmd {pb_file.resolve()}") + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + lammps.run(1) + + +def test_pair_deepmd_virial(lammps): + lammps.pair_style(f"deepmd {pb_file.resolve()}") + lammps.pair_coeff("* *") + lammps.compute("virial all centroid/stress/atom NULL pair") + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + lammps.variable(f"virial{jj} atom c_virial[{ii+1}]") + lammps.dump( + "1 all custom 1 dump id " + " ".join([f"v_virial{ii}" for ii in range(9)]) + ) + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + idx_map = lammps.lmp.numpy.extract_atom("id") - 1 + for ii in range(9): + assert np.array( + lammps.variables[f"virial{ii}"].value + ) / constants.nktv2p == pytest.approx(expected_v[idx_map, ii]) + + +def test_pair_deepmd_model_devi(lammps): + lammps.pair_style( + "deepmd {} {} out_file {} out_freq 1 atomic".format( + pb_file.resolve(), pb_file2.resolve(), md_file.resolve() + ) + ) + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f) + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v)) + assert md[2] == pytest.approx(np.min(expected_md_v)) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v)))) + + +def test_pair_deepmd_model_devi_virial(lammps): + lammps.pair_style( + "deepmd {} {} out_file {} out_freq 1 atomic".format( + pb_file.resolve(), pb_file2.resolve(), md_file.resolve() + ) + ) + lammps.pair_coeff("* *") + lammps.compute("virial all centroid/stress/atom NULL pair") + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + lammps.variable(f"virial{jj} atom c_virial[{ii+1}]") + lammps.dump( + "1 all custom 1 dump id " + " ".join([f"v_virial{ii}" for ii in range(9)]) + ) + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + idx_map = lammps.lmp.numpy.extract_atom("id") - 1 + for ii in range(9): + assert np.array( + lammps.variables[f"virial{ii}"].value + ) / constants.nktv2p == pytest.approx(expected_v[idx_map, ii]) + # load model devi + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f) + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v)) + assert md[2] == pytest.approx(np.min(expected_md_v)) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v)))) + + +def test_pair_deepmd_model_devi_atomic_relative(lammps): + relative = 1.0 + lammps.pair_style( + "deepmd {} {} out_file {} out_freq 1 atomic relative {}".format( + pb_file.resolve(), pb_file2.resolve(), md_file.resolve(), relative + ) + ) + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + norm = np.linalg.norm(np.mean([expected_f, expected_f2], axis=0), axis=1) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + expected_md_f /= norm + relative + assert md[7:] == pytest.approx(expected_md_f) + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v)) + assert md[2] == pytest.approx(np.min(expected_md_v)) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v)))) + + +def test_pair_deepmd_model_devi_atomic_relative_v(lammps): + relative = 1.0 + lammps.pair_style( + "deepmd {} {} out_file {} out_freq 1 atomic relative_v {}".format( + pb_file.resolve(), pb_file2.resolve(), md_file.resolve(), relative + ) + ) + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f) + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + norm = ( + np.abs( + np.mean([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) + ) + / 6 + ) + expected_md_v /= norm + relative + assert md[1] == pytest.approx(np.max(expected_md_v)) + assert md[2] == pytest.approx(np.min(expected_md_v)) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v)))) + + +def test_pair_deepmd_type_map(lammps_type_map): + lammps_type_map.pair_style(f"deepmd {pb_file.resolve()}") + lammps_type_map.pair_coeff("* * H O") + lammps_type_map.run(0) + assert lammps_type_map.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps_type_map.atoms[ii].force == pytest.approx( + expected_f[lammps_type_map.atoms[ii].id - 1] + ) + lammps_type_map.run(1) + + +def test_pair_deepmd_real(lammps_real): + lammps_real.pair_style(f"deepmd {pb_file.resolve()}") + lammps_real.pair_coeff("* *") + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + lammps_real.run(1) + + +def test_pair_deepmd_virial_real(lammps_real): + lammps_real.pair_style(f"deepmd {pb_file.resolve()}") + lammps_real.pair_coeff("* *") + lammps_real.compute("virial all centroid/stress/atom NULL pair") + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + lammps_real.variable(f"virial{jj} atom c_virial[{ii+1}]") + lammps_real.dump( + "1 all custom 1 dump id " + " ".join([f"v_virial{ii}" for ii in range(9)]) + ) + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + idx_map = lammps_real.lmp.numpy.extract_atom("id") - 1 + for ii in range(9): + assert np.array( + lammps_real.variables[f"virial{ii}"].value + ) / constants.nktv2p_real == pytest.approx( + expected_v[idx_map, ii] * constants.ener_metal2real + ) + + +def test_pair_deepmd_model_devi_real(lammps_real): + lammps_real.pair_style( + "deepmd {} {} out_file {} out_freq 1 atomic".format( + pb_file.resolve(), pb_file2.resolve(), md_file.resolve() + ) + ) + lammps_real.pair_coeff("* *") + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f * constants.force_metal2real) + assert md[4] == pytest.approx(np.max(expected_md_f) * constants.force_metal2real) + assert md[5] == pytest.approx(np.min(expected_md_f) * constants.force_metal2real) + assert md[6] == pytest.approx(np.mean(expected_md_f) * constants.force_metal2real) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v) * constants.ener_metal2real) + assert md[2] == pytest.approx(np.min(expected_md_v) * constants.ener_metal2real) + assert md[3] == pytest.approx( + np.sqrt(np.mean(np.square(expected_md_v))) * constants.ener_metal2real + ) + + +def test_pair_deepmd_model_devi_virial_real(lammps_real): + lammps_real.pair_style( + "deepmd {} {} out_file {} out_freq 1 atomic".format( + pb_file.resolve(), pb_file2.resolve(), md_file.resolve() + ) + ) + lammps_real.pair_coeff("* *") + lammps_real.compute("virial all centroid/stress/atom NULL pair") + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + lammps_real.variable(f"virial{jj} atom c_virial[{ii+1}]") + lammps_real.dump( + "1 all custom 1 dump id " + " ".join([f"v_virial{ii}" for ii in range(9)]) + ) + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + idx_map = lammps_real.lmp.numpy.extract_atom("id") - 1 + for ii in range(9): + assert np.array( + lammps_real.variables[f"virial{ii}"].value + ) / constants.nktv2p_real == pytest.approx( + expected_v[idx_map, ii] * constants.ener_metal2real + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f * constants.force_metal2real) + assert md[4] == pytest.approx(np.max(expected_md_f) * constants.force_metal2real) + assert md[5] == pytest.approx(np.min(expected_md_f) * constants.force_metal2real) + assert md[6] == pytest.approx(np.mean(expected_md_f) * constants.force_metal2real) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v) * constants.ener_metal2real) + assert md[2] == pytest.approx(np.min(expected_md_v) * constants.ener_metal2real) + assert md[3] == pytest.approx( + np.sqrt(np.mean(np.square(expected_md_v))) * constants.ener_metal2real + ) + + +def test_pair_deepmd_model_devi_atomic_relative_real(lammps_real): + relative = 1.0 + lammps_real.pair_style( + "deepmd {} {} out_file {} out_freq 1 atomic relative {}".format( + pb_file.resolve(), + pb_file2.resolve(), + md_file.resolve(), + relative * constants.force_metal2real, + ) + ) + lammps_real.pair_coeff("* *") + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + norm = np.linalg.norm(np.mean([expected_f, expected_f2], axis=0), axis=1) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + expected_md_f /= norm + relative + assert md[7:] == pytest.approx(expected_md_f * constants.force_metal2real) + assert md[4] == pytest.approx(np.max(expected_md_f) * constants.force_metal2real) + assert md[5] == pytest.approx(np.min(expected_md_f) * constants.force_metal2real) + assert md[6] == pytest.approx(np.mean(expected_md_f) * constants.force_metal2real) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v) * constants.ener_metal2real) + assert md[2] == pytest.approx(np.min(expected_md_v) * constants.ener_metal2real) + assert md[3] == pytest.approx( + np.sqrt(np.mean(np.square(expected_md_v))) * constants.ener_metal2real + ) + + +def test_pair_deepmd_model_devi_atomic_relative_v_real(lammps_real): + relative = 1.0 + lammps_real.pair_style( + "deepmd {} {} out_file {} out_freq 1 atomic relative_v {}".format( + pb_file.resolve(), + pb_file2.resolve(), + md_file.resolve(), + relative * constants.ener_metal2real, + ) + ) + lammps_real.pair_coeff("* *") + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f * constants.force_metal2real) + assert md[4] == pytest.approx(np.max(expected_md_f) * constants.force_metal2real) + assert md[5] == pytest.approx(np.min(expected_md_f) * constants.force_metal2real) + assert md[6] == pytest.approx(np.mean(expected_md_f) * constants.force_metal2real) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + norm = ( + np.abs( + np.mean([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) + ) + / 6 + ) + expected_md_v /= norm + relative + assert md[1] == pytest.approx(np.max(expected_md_v) * constants.ener_metal2real) + assert md[2] == pytest.approx(np.min(expected_md_v) * constants.ener_metal2real) + assert md[3] == pytest.approx( + np.sqrt(np.mean(np.square(expected_md_v))) * constants.ener_metal2real + ) + + +def test_pair_deepmd_si(lammps_si): + lammps_si.pair_style(f"deepmd {pb_file.resolve()}") + lammps_si.pair_coeff("* *") + lammps_si.run(0) + assert lammps_si.eval("pe") == pytest.approx(expected_e * constants.ener_metal2si) + for ii in range(6): + assert lammps_si.atoms[ii].force == pytest.approx( + expected_f[lammps_si.atoms[ii].id - 1] * constants.force_metal2si + ) + lammps_si.run(1) From f4a3271eb8b0c277e080a3c5879b77cde5ebf8ca Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Wed, 28 Feb 2024 01:17:00 -0500 Subject: [PATCH 101/103] fix model path Signed-off-by: Jinzhe Zeng --- source/ipi/tests/test_driver.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/ipi/tests/test_driver.py b/source/ipi/tests/test_driver.py index fd84f4d66d..20e721f686 100644 --- a/source/ipi/tests/test_driver.py +++ b/source/ipi/tests/test_driver.py @@ -254,10 +254,9 @@ def test_normalize_coords(self): class TestDPIPIPt(TestDPIPI): - # copy from test_deeppot_a.py @classmethod def setUpClass(cls): - cls.model_file = "deeppot_sea.pth" + cls.model_file = str(tests_path / "infer" / "deeppot_sea.pth") def setUp(self): super().setUp() From 1e8bdffc4b773b19b1f3a323915558df35109f60 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Wed, 28 Feb 2024 01:31:19 -0500 Subject: [PATCH 102/103] consistent box Signed-off-by: Jinzhe Zeng --- source/ipi/tests/test_driver.py | 1 + 1 file changed, 1 insertion(+) diff --git a/source/ipi/tests/test_driver.py b/source/ipi/tests/test_driver.py index 20e721f686..b0fbf53b01 100644 --- a/source/ipi/tests/test_driver.py +++ b/source/ipi/tests/test_driver.py @@ -261,6 +261,7 @@ def setUpClass(cls): def setUp(self): super().setUp() + self.box = np.array([13.0, 0.0, 0.0, 0.0, 13.0, 0.0, 0.0, 0.0, 13.0]) self.expected_e = np.array( [ -93.016873944029, From da18860b9d48a20dce9c362c6c1ac3a052692f63 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Wed, 28 Feb 2024 02:07:37 -0500 Subject: [PATCH 103/103] remove commented codes Co-authored-by: Han Wang <92130845+wanghan-iapcm@users.noreply.github.com> Signed-off-by: Jinzhe Zeng --- source/api_cc/src/DeepPotPT.cc | 40 ---------------------------------- 1 file changed, 40 deletions(-) diff --git a/source/api_cc/src/DeepPotPT.cc b/source/api_cc/src/DeepPotPT.cc index 690ee91817..f05e27b9b2 100644 --- a/source/api_cc/src/DeepPotPT.cc +++ b/source/api_cc/src/DeepPotPT.cc @@ -146,28 +146,6 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, cpu_atom_virial_.data_ptr(), cpu_atom_virial_.data_ptr() + cpu_atom_virial_.numel()); } -// template void DeepPotPT::compute( -// ENERGYTYPE& ener, -// std::vector& force, -// std::vector& virial, -// std::vector& atom_energy, -// std::vector& atom_virial, -// const std::vector& coord, -// const std::vector& atype, -// const std::vector& box, -// const InputNlist& lmp_list, -// const int& ago); -// template void DeepPotPT::compute( -// ENERGYTYPE& ener, -// std::vector& force, -// std::vector& virial, -// std::vector& atom_energy, -// std::vector& atom_virial, -// const std::vector& coord, -// const std::vector& atype, -// const std::vector& box, -// const InputNlist& lmp_list, -// const int& ago); template void DeepPotPT::compute>( std::vector& ener, std::vector& force, @@ -267,24 +245,6 @@ void DeepPotPT::compute(ENERGYVTYPE& ener, cpu_atom_virial_.data_ptr() + cpu_atom_virial_.numel()); } -// template void DeepPotPT::compute( -// ENERGYTYPE& ener, -// std::vector& force, -// std::vector& virial, -// std::vector& atom_energy, -// std::vector& atom_virial, -// const std::vector& coord, -// const std::vector& atype, -// const std::vector& box); -// template void DeepPotPT::compute( -// ENERGYTYPE& ener, -// std::vector& force, -// std::vector& virial, -// std::vector& atom_energy, -// std::vector& atom_virial, -// const std::vector& coord, -// const std::vector& atype, -// const std::vector& box); template void DeepPotPT::compute>( std::vector& ener, std::vector& force,