Quandary
Loading...
Searching...
No Matches
config.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <algorithm>
4#include <petsc.h>
5#include <cstddef>
6#include <optional>
7#include <set>
8#include <sstream>
9#include <string>
10#include <toml++/toml.hpp>
11#include <vector>
12#include <cassert>
13#include <iostream>
14#include <iomanip>
15#include <limits>
16#include <random>
17#include <type_traits>
18#include "cfgparser.hpp"
19#include "defs.hpp"
20#include "mpi_logger.hpp"
21#include "config_defaults.hpp"
22#include "config_validators.hpp"
23
24
57class Config {
58 private:
59 // Logging
60 MPILogger logger;
61
62 // General options
63 std::vector<size_t> nlevels;
64 std::vector<size_t> nessential;
65 size_t ntime;
66 double dt;
67 std::vector<double> transition_frequency;
68 std::vector<double> selfkerr;
69 std::vector<double> crosskerr_coupling;
70 std::vector<double> dipole_coupling;
71 std::vector<double> rotation_frequency;
72 DecoherenceType decoherence_type;
73 std::vector<double> decay_time;
74 std::vector<double> dephase_time;
75 size_t n_initial_conditions;
76 InitialConditionSettings initial_condition;
77 std::optional<std::string> hamiltonian_file_Hsys;
78 std::optional<std::string> hamiltonian_file_Hc;
79
80 // Optimization options
81 bool control_zero_boundary_condition;
82 std::vector<ControlParameterizationSettings> control_parameterizations;
83 std::vector<ControlInitializationSettings> control_initializations;
84 std::vector<double> control_amplitude_bounds;
85 std::vector<std::vector<double>> carrier_frequencies;
86 OptimTargetSettings optim_target;
87 ObjectiveType optim_objective;
88 std::vector<double> optim_weights;
89 double optim_tol_grad_abs;
90 double optim_tol_grad_rel;
91 double optim_tol_final_cost;
92 double optim_tol_infidelity;
93 size_t optim_maxiter;
94 double optim_tikhonov_coeff;
95 bool optim_tikhonov_use_x0;
96 double optim_penalty_leakage;
97 double optim_penalty_weightedcost;
98 double optim_penalty_weightedcost_width;
99 double optim_penalty_dpdm;
100 double optim_penalty_energy;
101 double optim_penalty_variation;
102
103 // Output and runtypes
104 std::string output_directory;
105 std::vector<OutputType> output_observables;
106 size_t output_timestep_stride;
107 size_t output_optimization_stride;
108 RunType runtype;
109 bool usematfree;
110 LinearSolverType linearsolver_type;
111 size_t linearsolver_maxiter;
112 TimeStepperType timestepper_type;
113 int rand_seed;
114
115 public:
116 Config(const MPILogger& logger, const toml::table& table);
117
118 // TODO cfg: delete this when .cfg format is removed.
119 Config(const MPILogger& logger, const ParsedConfigData& settings);
120
121 ~Config() = default;
122
123 static Config fromFile(const std::string& filename, const MPILogger& logger);
124 static Config fromToml(const std::string& toml_filename, const MPILogger& logger);
125 static Config fromTomlString(const std::string& toml_content, const MPILogger& logger);
126
127 // TODO cfg: delete these when .cfg format is removed.
128 static Config fromCfg(const std::string& cfg_filename, const MPILogger& logger);
129 static Config fromCfgString(const std::string& cfg_content, const MPILogger& logger);
130
131 void printConfig(std::stringstream& log) const;
132
133 // getters
134 const std::vector<size_t>& getNLevels() const { return nlevels; }
135 size_t getNLevels(size_t i_osc) const { return nlevels[i_osc]; }
136 size_t getNumOsc() const { return nlevels.size(); }
137 const std::vector<size_t>& getNEssential() const { return nessential; }
138 size_t getNEssential(size_t i_osc) const { return nessential[i_osc]; }
139 size_t getNTime() const { return ntime; }
140 double getDt() const { return dt; }
141 double getTotalTime() const { return ntime * dt; }
142
143 const std::vector<double>& getTransitionFrequency() const { return transition_frequency; }
144 const std::vector<double>& getSelfKerr() const { return selfkerr; }
145 const std::vector<double>& getCrossKerrCoupling() const { return crosskerr_coupling; }
146 const std::vector<double>& getDipoleCoupling() const { return dipole_coupling; }
147 const std::vector<double>& getRotationFrequency() const { return rotation_frequency; }
148 DecoherenceType getDecoherenceType() const { return decoherence_type; }
149 const std::vector<double>& getDecayTime() const { return decay_time; }
150 const std::vector<double>& getDephaseTime() const { return dephase_time; }
151 size_t getNInitialConditions() const { return n_initial_conditions; }
152 const InitialConditionSettings& getInitialCondition() const { return initial_condition; }
153 const std::optional<std::string>& getHamiltonianFileHsys() const { return hamiltonian_file_Hsys; }
154 const std::optional<std::string>& getHamiltonianFileHc() const { return hamiltonian_file_Hc; }
155
156 const ControlParameterizationSettings& getControlParameterizations(size_t i_osc) const { return control_parameterizations[i_osc]; }
157 bool getControlZeroBoundaryCondition() const { return control_zero_boundary_condition; }
159 return control_initializations[i_osc];
160 }
161 double getControlAmplitudeBound(size_t i_osc) const { return control_amplitude_bounds[i_osc]; }
162 const std::vector<double>& getCarrierFrequencies(size_t i_osc) const { return carrier_frequencies[i_osc]; }
163 const OptimTargetSettings& getOptimTarget() const { return optim_target; }
164 ObjectiveType getOptimObjective() const { return optim_objective; }
165 const std::vector<double>& getOptimWeights() const { return optim_weights; }
166 double getOptimTolGradAbs() const { return optim_tol_grad_abs; }
167 double getOptimTolGradRel() const { return optim_tol_grad_rel; }
168 double getOptimTolFinalCost() const { return optim_tol_final_cost; }
169 double getOptimTolInfidelity() const { return optim_tol_infidelity; }
170 size_t getOptimMaxiter() const { return optim_maxiter; }
171 double getOptimTikhonovCoeff() const { return optim_tikhonov_coeff; }
172 bool getOptimTikhonovUseX0() const { return optim_tikhonov_use_x0; }
173 double getOptimPenaltyLeakage() const { return optim_penalty_leakage; }
174 double getOptimPenaltyWeightedCost() const { return optim_penalty_weightedcost; }
175 double getOptimPenaltyWeightedCostWidth() const { return optim_penalty_weightedcost_width; }
176 double getOptimPenaltyDpdm() const { return optim_penalty_dpdm; }
177 double getOptimPenaltyEnergy() const { return optim_penalty_energy; }
178 double getOptimPenaltyVariation() const { return optim_penalty_variation; }
179
180 const std::string& getOutputDirectory() const { return output_directory; }
181 const std::vector<OutputType>& getOutputObservables() const { return output_observables; }
182 size_t getOutputTimestepStride() const { return output_timestep_stride; }
183 size_t getOutputOptimizationStride() const { return output_optimization_stride; }
184 RunType getRuntype() const { return runtype; }
185 bool getUseMatFree() const { return usematfree; }
186 LinearSolverType getLinearSolverType() const { return linearsolver_type; }
187 size_t getLinearSolverMaxiter() const { return linearsolver_maxiter; }
188 TimeStepperType getTimestepperType() const { return timestepper_type; }
189 int getRandSeed() const { return rand_seed; }
190
191 private:
192 void finalize();
193 void validate() const;
194
195 size_t computeNumInitialConditions(InitialConditionSettings init_cond_settings, std::vector<size_t> nlevels, std::vector<size_t> nessential, DecoherenceType decoherence_type) const;
196
197 void setRandSeed(int rand_seed_);
198
199 // Helper function to parse a single control parameterization table
200 ControlParameterizationSettings parseControlParameterizationSpecs(const toml::table& param_table) const;
201
202 // Helper function to parse a single control initialization table
203 ControlInitializationSettings parseControlInitializationSpecs(const toml::table& table) const;
204
212 OptimTargetSettings parseOptimTarget(const toml::table& table, size_t num_osc) const;
213
214
215 // TODO cfg: delete these when .cfg format is removed.
216 template <typename T>
217 std::vector<std::vector<T>> parseOscillatorSettingsCfg(const std::optional<std::map<int, std::vector<T>>>& indexed, size_t num_entries, const std::vector<T>& default_values = {}) const;
218
219 std::vector<ControlParameterizationSettings> parseControlParameterizationsCfg(const std::optional<std::map<int, ControlParameterizationData>>& parameterizations_map) const;
220
221 std::vector<ControlInitializationSettings> parseControlInitializationsCfg(const std::optional<std::map<int, ControlInitializationSettings>>& init_configs) const;
222};
Configuration class containing all validated settings.
Definition config.hpp:57
bool getUseMatFree() const
Definition config.hpp:185
const std::vector< double > & getOptimWeights() const
Definition config.hpp:165
double getOptimTolGradRel() const
Definition config.hpp:167
const std::vector< double > & getDecayTime() const
Definition config.hpp:149
const std::vector< size_t > & getNEssential() const
Definition config.hpp:137
size_t getNInitialConditions() const
Definition config.hpp:151
const OptimTargetSettings & getOptimTarget() const
Definition config.hpp:163
bool getControlZeroBoundaryCondition() const
Definition config.hpp:157
const std::vector< size_t > & getNLevels() const
Definition config.hpp:134
static Config fromToml(const std::string &toml_filename, const MPILogger &logger)
Definition config.cpp:509
const std::string & getOutputDirectory() const
Definition config.hpp:180
double getOptimPenaltyLeakage() const
Definition config.hpp:173
double getOptimPenaltyEnergy() const
Definition config.hpp:177
size_t getNTime() const
Definition config.hpp:139
const std::vector< OutputType > & getOutputObservables() const
Definition config.hpp:181
size_t getLinearSolverMaxiter() const
Definition config.hpp:187
size_t getOptimMaxiter() const
Definition config.hpp:170
const ControlParameterizationSettings & getControlParameterizations(size_t i_osc) const
Definition config.hpp:156
const std::vector< double > & getTransitionFrequency() const
Definition config.hpp:143
const std::vector< double > & getDephaseTime() const
Definition config.hpp:150
double getOptimTikhonovCoeff() const
Definition config.hpp:171
double getOptimTolFinalCost() const
Definition config.hpp:168
double getOptimTolInfidelity() const
Definition config.hpp:169
double getTotalTime() const
Definition config.hpp:141
double getOptimTolGradAbs() const
Definition config.hpp:166
const std::vector< double > & getDipoleCoupling() const
Definition config.hpp:146
static Config fromCfg(const std::string &cfg_filename, const MPILogger &logger)
Definition config.cpp:519
double getOptimPenaltyWeightedCost() const
Definition config.hpp:174
double getOptimPenaltyVariation() const
Definition config.hpp:178
const InitialConditionSettings & getInitialCondition() const
Definition config.hpp:152
const std::optional< std::string > & getHamiltonianFileHc() const
Definition config.hpp:154
size_t getOutputOptimizationStride() const
Definition config.hpp:183
ObjectiveType getOptimObjective() const
Definition config.hpp:164
double getControlAmplitudeBound(size_t i_osc) const
Definition config.hpp:161
size_t getOutputTimestepStride() const
Definition config.hpp:182
TimeStepperType getTimestepperType() const
Definition config.hpp:188
LinearSolverType getLinearSolverType() const
Definition config.hpp:186
const std::vector< double > & getCarrierFrequencies(size_t i_osc) const
Definition config.hpp:162
size_t getNumOsc() const
Definition config.hpp:136
void printConfig(std::stringstream &log) const
Definition config.cpp:774
size_t getNEssential(size_t i_osc) const
Definition config.hpp:138
const ControlInitializationSettings & getControlInitializations(size_t i_osc) const
Definition config.hpp:158
static Config fromCfgString(const std::string &cfg_content, const MPILogger &logger)
Definition config.cpp:525
const std::optional< std::string > & getHamiltonianFileHsys() const
Definition config.hpp:153
const std::vector< double > & getSelfKerr() const
Definition config.hpp:144
bool getOptimTikhonovUseX0() const
Definition config.hpp:172
DecoherenceType getDecoherenceType() const
Definition config.hpp:148
const std::vector< double > & getCrossKerrCoupling() const
Definition config.hpp:145
const std::vector< double > & getRotationFrequency() const
Definition config.hpp:147
int getRandSeed() const
Definition config.hpp:189
static Config fromTomlString(const std::string &toml_content, const MPILogger &logger)
Definition config.cpp:514
RunType getRuntype() const
Definition config.hpp:184
double getDt() const
Definition config.hpp:140
size_t getNLevels(size_t i_osc) const
Definition config.hpp:135
double getOptimPenaltyWeightedCostWidth() const
Definition config.hpp:175
static Config fromFile(const std::string &filename, const MPILogger &logger)
Definition config.cpp:497
double getOptimPenaltyDpdm() const
Definition config.hpp:176
~Config()=default
MPI-aware logger that handles rank filtering and quiet mode.
Definition mpi_logger.hpp:12
Core type definitions and enumerations for Quandary quantum optimal control.
RunType
Types of execution modes.
Definition defs.hpp:128
DecoherenceType
Available Lindblad operator types for open quantum systems, or NONE for closed quantum systems.
Definition defs.hpp:31
ObjectiveType
Types of objective functions for quantum control optimization.
Definition defs.hpp:95
TimeStepperType
Types of time-stepping methods for evolving quantum states.
Definition defs.hpp:183
LinearSolverType
Available types for solving linear systems at each time step.
Definition defs.hpp:113
Settings for control initialization with defaults.
Definition config_defaults.hpp:112
Settings for control parameterizations with defaults.
Definition config_defaults.hpp:100
Settings for initial conditions. Required, no defaults.
Definition config_defaults.hpp:77
Settings for optimization targets with defaults.
Definition config_defaults.hpp:89
Configuration settings passed to Config constructor.
Definition cfgparser.hpp:31