Loading...
Searching...
No Matches
GPRHelpers.cpp
Go to the documentation of this file.
1/*
2** This file is part of eOn.
3**
4** SPDX-License-Identifier: BSD-3-Clause
5**
6** Copyright (c) 2010--present, eOn Development Team
7** All rights reserved.
8**
9** Repo:
10** https://github.com/TheochemUI/eOn
11*/
12#include "eon/GPRHelpers.h"
13#include "eon/EonLogger.h"
14
15#include "subprojects/gpr_optim/data_types/EigenHelpers.h"
16
17#include <cstring>
18#include <map>
19#include <set>
20#include <unordered_map>
21
22gpr::InputParameters
24 gpr::InputParameters p;
25 // Problem parameters
26 p.actdist_fro.value = parameters.gpr_dimer_options.active_radius;
27 p.dimer_sep.value = parameters.gpr_dimer_options.dimer_sep;
28 p.method_rot.value = parameters.gpr_dimer_options.rot_opt_method;
29 p.method_trans.value = parameters.gpr_dimer_options.trans_opt_method;
30 p.param_trans.value[0] = parameters.gpr_dimer_options.conv_step;
31 p.param_trans.value[1] = parameters.gpr_dimer_options.max_step;
32 // Saddle point convergence parameter
33 p.T_dimer.value = parameters.saddle_search_options.converged_force;
34 p.T_anglerot_init.value = parameters.gpr_dimer_options.converged_angle;
35 // ---
36 p.initrot_nogp.value = parameters.gpr_dimer_options.init_rot_gp;
37 p.num_iter_initrot.value = parameters.gpr_dimer_options.init_rotations_max;
38 // unused except in the capnp for now
39 // p.inittrans_nogp.value = parameters.gpr_dimer_options.init_trans_gp;
40 p.T_anglerot_gp.value = parameters.gpr_dimer_options.relax_conv_angle;
41 p.num_iter_rot_gp.value = parameters.gpr_dimer_options.relax_rotations_max;
42 p.divisor_T_dimer_gp.value = parameters.gpr_dimer_options.divisor_t_dimer_gp;
43 p.disp_max.value = parameters.gpr_dimer_options.midpoint_max_disp;
44 p.ratio_at_limit.value = parameters.gpr_dimer_options.ratio_at_limit;
45 p.num_bigiter.value = parameters.gpr_dimer_options.max_outer_iterations;
46 p.num_iter.value = parameters.gpr_dimer_options.max_inner_iterations;
47 p.islarge_num_iter.value = parameters.gpr_dimer_options.many_iterations;
48 // GPR Parameters
49 p.gp_sigma2.value = parameters.gpr_dimer_options.gpr_params.sigma2;
50 p.jitter_sigma2.value = parameters.gpr_dimer_options.gpr_params.jitter_sigma2;
51 p.sigma2.value = parameters.gpr_dimer_options.gpr_params.noise_sigma2;
52 p.prior_mu.value = parameters.gpr_dimer_options.gpr_params.prior_mu;
53 p.prior_nu.value = parameters.gpr_dimer_options.gpr_params.prior_nu;
54 p.prior_s2.value = parameters.gpr_dimer_options.gpr_params.prior_sigma2;
55 p.check_derivative.value =
57 p.max_iter.value = parameters.gpr_dimer_options.opt_params.max_iterations;
58 p.tolerance_func.value = parameters.gpr_dimer_options.opt_params.tol_func;
59 p.tolerance_sol.value = parameters.gpr_dimer_options.opt_params.tol_sol;
60 p.lambda_limit.value = parameters.gpr_dimer_options.opt_params.lambda_limit;
61 p.lambda.value = parameters.gpr_dimer_options.opt_params.lambda_init;
62 // Prune
63 p.use_prune.value = parameters.gpr_dimer_options.prune_params.use_prune;
64 p.start_prune_at.value = parameters.gpr_dimer_options.prune_params.begin;
65 p.nprune_vals.value = parameters.gpr_dimer_options.prune_params.n_vals;
66 p.prune_threshold.value = parameters.gpr_dimer_options.prune_params.threshold;
67 // Debugging
68 p.report_level.value = parameters.gpr_dimer_options.debug_params.report_level;
69 p.debug_level.value = parameters.gpr_dimer_options.debug_params.debug_level;
70 p.debug_output_dir.value = parameters.gpr_dimer_options.debug_params.out_dir;
71 p.debug_output_file_R.value =
73 p.debug_output_file_E.value =
75 p.debug_output_file_G.value =
77 p.debug_output_file_extension.value =
79 p.debug_offset_from_mid_point.value =
81 p.debug_dy.value = parameters.gpr_dimer_options.debug_params.dy;
82 p.debug_dz.value = parameters.gpr_dimer_options.debug_params.dz;
83 return p;
84}
85
86namespace {
87
88// AtomMatrix is row-major N×3; gpr::Coord is 1×(3N) with the same flat packing.
89void copyAtomMatrixToCoord(const AtomMatrix &src, gpr::Coord &dst) {
90 dst.resize(1, static_cast<Eigen::Index>(src.size()));
91 if (src.size() > 0) {
92 std::memcpy(dst.data(), src.data(),
93 static_cast<size_t>(src.size()) * sizeof(double));
94 }
95}
96
97} // namespace
98
99// FIXME: Take in the active / inactive pairs / atomtypes
100gpr::AtomsConfiguration eonc::helpers::eon_matter_to_atmconf(Matter *matter) {
101 gpr::AtomsConfiguration atoms_config;
102 aux::ProblemSetUp problem_setup;
103 gpr::Index_t number_of_mov_atoms;
104 gpr::Index_t number_of_fro_atoms;
105 std::set<int> unique_atomtypes;
106 gpr::Index_t n_at;
107 std::vector<int> atomnrs;
108 std::unordered_map<int, int>
109 atype_to_gprd_atype;
112 int fake_atype;
113
114 atoms_config.clear();
115 // gpr_optim stores positions as row-major 1×(3N), matching AtomMatrix flat
116 // layout.
117 copyAtomMatrixToCoord(matter->getPositions(), atoms_config.positions);
118 const auto nAtoms = matter->numberOfAtoms();
119 atoms_config.is_frozen.resize(1, nAtoms);
120 atoms_config.id.resize(1, nAtoms);
121 atoms_config.atomicNrs.resize(1, nAtoms);
122 for (auto i = 0; i < nAtoms; i++) {
123 atomnrs.push_back(matter->getAtomicNr(i));
124 // Field matrices are 1×N; use (0, i). getFixed is bool → MOVING/FROZEN.
125 atoms_config.atomicNrs(0, i) = matter->getAtomicNr(i);
126 atoms_config.is_frozen(0, i) =
127 matter->getFixed(i) ? FROZEN_ATOM : MOVING_ATOM;
128 atoms_config.id(0, i) = static_cast<gpr::Index_t>(i + 1);
129 }
130
131 unique_atomtypes = std::set<int>(atomnrs.begin(), atomnrs.end());
132 n_at = unique_atomtypes.size();
133 fake_atype = 0;
134 for (auto uatom : unique_atomtypes) {
135 atype_to_gprd_atype.insert(
136 std::pair<int, int>(static_cast<int>(uatom), fake_atype));
137 fake_atype++;
138 }
139
140 number_of_mov_atoms = atoms_config.countMovingAtoms();
141 number_of_fro_atoms =
142 static_cast<gpr::Index_t>(atoms_config.is_frozen.size()) -
143 number_of_mov_atoms;
144
145 if (number_of_fro_atoms > 0 && number_of_mov_atoms > 0) {
146 // Resize structures for moving and frozen atoms
147 atoms_config.atoms_mov.resize(number_of_mov_atoms);
148 atoms_config.atoms_froz_inactive.resize(number_of_fro_atoms);
149
154 if (atype_to_gprd_atype.size() > 1) {
155 int mov_counter = 0;
156 int froz_inactive_counter = 0;
157 for (auto i = 0; i < nAtoms; i++) {
158 if (matter->getFixed(i)) {
161 atoms_config.atoms_froz_inactive.type(0, froz_inactive_counter) =
162 atype_to_gprd_atype.at(atomnrs[i]);
163 froz_inactive_counter++;
164 } else {
166 atoms_config.atoms_mov.type(0, mov_counter) =
167 atype_to_gprd_atype.at(atomnrs[i]);
168 mov_counter++;
169 }
170 }
171 }
174 else if (atype_to_gprd_atype.size() == 1) {
175 atoms_config.atoms_mov.type.setConstant(
176 atype_to_gprd_atype.at(atomnrs[0]));
177 atoms_config.atoms_froz_inactive.type.setConstant(
178 atype_to_gprd_atype.at(atomnrs[0]));
179 }
180 // Assign moving and frozen atoms and list all frozen atoms as inactive
181 gpr::Index_t counter_f = 0, counter_m = 0;
182 for (gpr::Index_t n = 0;
183 n < static_cast<gpr::Index_t>(atoms_config.is_frozen.size()); ++n) {
184 if (atoms_config.is_frozen(0, n) == MOVING_ATOM)
185 gpr::coord::set(atoms_config.atoms_mov.positions, 0, counter_m++,
186 gpr::coord::at(atoms_config.positions, n));
187 else
188 gpr::coord::set(atoms_config.atoms_froz_inactive.positions, 0,
189 counter_f++, gpr::coord::at(atoms_config.positions, n));
190 }
192 } else {
193 if (number_of_mov_atoms == 0) {
195 QUILL_LOG_CRITICAL(
197 " You need to have atoms move!!!\nIn stillness there is only "
198 "death\n");
199 std::exit(1);
200 }
203 atoms_config.atoms_mov.resize(number_of_mov_atoms);
204
206 if (atype_to_gprd_atype.size() > 1) {
207 int mov_counter = 0;
208 for (auto i = 0; i < nAtoms; i++) {
209 atoms_config.atoms_mov.type(0, mov_counter) =
210 atype_to_gprd_atype.at(atomnrs[i]);
211 mov_counter++;
212 }
213 }
216 else if (atype_to_gprd_atype.size() == 1) {
217 atoms_config.atoms_mov.type.setConstant(
218 atype_to_gprd_atype.at(atomnrs[0]));
219 }
220 }
221 // Pairtype indices for pairs of atomtypes (n_at x n_at)
222 // Active pairtypes are indexed as 0,1,...,n_pt-1. Inactive pairtypes are
223 // given index EMPTY.
224 atoms_config.pairtype.resize(n_at, n_at);
225 atoms_config.pairtype.setConstant(EMPTY);
226
227 // Set pairtype indices for moving+moving atom pairs (and update number of
228 // active pairtypes)
229 problem_setup.setPairtypeForMovingAtoms(
230 atoms_config.atoms_mov.type, atoms_config.n_pt, atoms_config.pairtype);
231
232 return atoms_config;
233}
234
236 gpr::Observation o;
237 o.clear();
238 copyAtomMatrixToCoord(matter->getPositions(), o.R);
239 // Forces as negative gradients; same N×3 → 1×(3N) packing as positions.
240 AtomMatrix neg_forces = -matter->getForces();
241 copyAtomMatrixToCoord(neg_forces, o.G);
242 o.E.resize(1, 1);
243 o.E(0, 0) = matter->getPotentialEnergy();
244 return o;
245}
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
Definition Eigen.h:37
double getPotentialEnergy() const
Definition Matter.cpp:446
const AtomMatrix & getForces() const
Definition Matter.cpp:324
long int numberOfAtoms() const
Definition Matter.cpp:209
long getAtomicNr(long int atom) const
Definition Matter.cpp:392
const AtomMatrix & getPositions() const
Definition Matter.cpp:236
int getFixed(long int atom) const
1 if every Cartesian axis of the atom is fixed, else 0.
Definition Matter.cpp:402
struct eonc::Parameters::gpr_dimer_options_t gpr_dimer_options
struct eonc::Parameters::saddle_search_options_t saddle_search_options
gpr::InputParameters eon_parameters_to_gpr(const Parameters &parameters)
Create a parameters object for gpr_dimer.
gpr::AtomsConfiguration eon_matter_to_atmconf(Matter *matter)
Create a configuration of atoms for gpr_dimer.
gpr::Observation eon_matter_to_init_obs(Matter *matter)
Create an initial Observation object for gpr_dimer.
quill::Logger * get() noexcept
Get or create the default "combi" logger.
Definition EonLogger.h:44
struct eonc::Parameters::gpr_dimer_options_t::gpr_params_t gpr_params
struct eonc::Parameters::gpr_dimer_options_t::debug_params_t debug_params
struct eonc::Parameters::gpr_dimer_options_t::prune_params_t prune_params
struct eonc::Parameters::gpr_dimer_options_t::opt_params_t opt_params