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 "defs.hpp"
19#include "mpi_logger.hpp"
20#include "config_defaults.hpp"
21#include "config_validators.hpp"
22
23
56class Config {
57 private:
58 // Logging
59 MPILogger logger;
60
61 // General options
62 std::vector<size_t> nlevels;
63 std::vector<size_t> nessential;
64 size_t ntime;
65 double dt;
66 double total_time;
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 ~Config() = default;
119
120 static Config fromFile(const std::string& filename, const MPILogger& logger);
121 static Config fromString(const std::string& toml_content, const MPILogger& logger);
122
123 void printConfig(std::stringstream& log) const;
124
125 // getters
126 const std::vector<size_t>& getNLevels() const { return nlevels; }
127 size_t getNLevels(size_t i_osc) const { return nlevels[i_osc]; }
128 size_t getNumOsc() const { return nlevels.size(); }
129 const std::vector<size_t>& getNEssential() const { return nessential; }
130 size_t getNEssential(size_t i_osc) const { return nessential[i_osc]; }
131 size_t getNTime() const { return ntime; }
132 double getDt() const { return dt; }
133 double getTotalTime() const { return total_time; }
134
135 const std::vector<double>& getTransitionFrequency() const { return transition_frequency; }
136 const std::vector<double>& getSelfKerr() const { return selfkerr; }
137 const std::vector<double>& getCrossKerrCoupling() const { return crosskerr_coupling; }
138 const std::vector<double>& getDipoleCoupling() const { return dipole_coupling; }
139 const std::vector<double>& getRotationFrequency() const { return rotation_frequency; }
140 DecoherenceType getDecoherenceType() const { return decoherence_type; }
141 const std::vector<double>& getDecayTime() const { return decay_time; }
142 const std::vector<double>& getDephaseTime() const { return dephase_time; }
143 size_t getNInitialConditions() const { return n_initial_conditions; }
144 const InitialConditionSettings& getInitialCondition() const { return initial_condition; }
145 const std::optional<std::string>& getHamiltonianFileHsys() const { return hamiltonian_file_Hsys; }
146 const std::optional<std::string>& getHamiltonianFileHc() const { return hamiltonian_file_Hc; }
147
148 const ControlParameterizationSettings& getControlParameterizations(size_t i_osc) const { return control_parameterizations[i_osc]; }
149 bool getControlZeroBoundaryCondition() const { return control_zero_boundary_condition; }
151 return control_initializations[i_osc];
152 }
153 double getControlAmplitudeBound(size_t i_osc) const { return control_amplitude_bounds[i_osc]; }
154 const std::vector<double>& getCarrierFrequencies(size_t i_osc) const { return carrier_frequencies[i_osc]; }
155 const OptimTargetSettings& getOptimTarget() const { return optim_target; }
156 ObjectiveType getOptimObjective() const { return optim_objective; }
157 const std::vector<double>& getOptimWeights() const { return optim_weights; }
158 double getOptimTolGradAbs() const { return optim_tol_grad_abs; }
159 double getOptimTolGradRel() const { return optim_tol_grad_rel; }
160 double getOptimTolFinalCost() const { return optim_tol_final_cost; }
161 double getOptimTolInfidelity() const { return optim_tol_infidelity; }
162 size_t getOptimMaxiter() const { return optim_maxiter; }
163 double getOptimTikhonovCoeff() const { return optim_tikhonov_coeff; }
164 bool getOptimTikhonovUseX0() const { return optim_tikhonov_use_x0; }
165 double getOptimPenaltyLeakage() const { return optim_penalty_leakage; }
166 double getOptimPenaltyWeightedCost() const { return optim_penalty_weightedcost; }
167 double getOptimPenaltyWeightedCostWidth() const { return optim_penalty_weightedcost_width; }
168 double getOptimPenaltyDpdm() const { return optim_penalty_dpdm; }
169 double getOptimPenaltyEnergy() const { return optim_penalty_energy; }
170 double getOptimPenaltyVariation() const { return optim_penalty_variation; }
171
172 const std::string& getOutputDirectory() const { return output_directory; }
173 const std::vector<OutputType>& getOutputObservables() const { return output_observables; }
174 size_t getOutputTimestepStride() const { return output_timestep_stride; }
175 size_t getOutputOptimizationStride() const { return output_optimization_stride; }
176 RunType getRuntype() const { return runtype; }
177 bool getUseMatFree() const { return usematfree; }
178 LinearSolverType getLinearSolverType() const { return linearsolver_type; }
179 size_t getLinearSolverMaxiter() const { return linearsolver_maxiter; }
180 TimeStepperType getTimestepperType() const { return timestepper_type; }
181 int getRandSeed() const { return rand_seed; }
182
183 private:
184 void finalize();
185 void validate() const;
186
187 size_t computeNumInitialConditions(InitialConditionSettings init_cond_settings, std::vector<size_t> nlevels, std::vector<size_t> nessential, DecoherenceType decoherence_type) const;
188
189 void setRandSeed(int rand_seed_);
190
191 // Helper function to parse a single control parameterization table
192 ControlParameterizationSettings parseControlParameterizationSpecs(const toml::table& param_table) const;
193
194 // Helper function to parse a single control initialization table
195 ControlInitializationSettings parseControlInitializationSpecs(const toml::table& table) const;
196
204 OptimTargetSettings parseOptimTarget(const toml::table& table, size_t num_osc) const;
205};
Configuration class containing all validated settings.
Definition config.hpp:56
bool getUseMatFree() const
Definition config.hpp:177
const std::vector< double > & getOptimWeights() const
Definition config.hpp:157
double getOptimTolGradRel() const
Definition config.hpp:159
const std::vector< double > & getDecayTime() const
Definition config.hpp:141
const std::vector< size_t > & getNEssential() const
Definition config.hpp:129
size_t getNInitialConditions() const
Definition config.hpp:143
const OptimTargetSettings & getOptimTarget() const
Definition config.hpp:155
bool getControlZeroBoundaryCondition() const
Definition config.hpp:149
const std::vector< size_t > & getNLevels() const
Definition config.hpp:126
const std::string & getOutputDirectory() const
Definition config.hpp:172
double getOptimPenaltyLeakage() const
Definition config.hpp:165
double getOptimPenaltyEnergy() const
Definition config.hpp:169
size_t getNTime() const
Definition config.hpp:131
const std::vector< OutputType > & getOutputObservables() const
Definition config.hpp:173
size_t getLinearSolverMaxiter() const
Definition config.hpp:179
size_t getOptimMaxiter() const
Definition config.hpp:162
const ControlParameterizationSettings & getControlParameterizations(size_t i_osc) const
Definition config.hpp:148
const std::vector< double > & getTransitionFrequency() const
Definition config.hpp:135
const std::vector< double > & getDephaseTime() const
Definition config.hpp:142
static Config fromString(const std::string &toml_content, const MPILogger &logger)
Definition config.cpp:335
double getOptimTikhonovCoeff() const
Definition config.hpp:163
double getOptimTolFinalCost() const
Definition config.hpp:160
double getOptimTolInfidelity() const
Definition config.hpp:161
double getTotalTime() const
Definition config.hpp:133
double getOptimTolGradAbs() const
Definition config.hpp:158
const std::vector< double > & getDipoleCoupling() const
Definition config.hpp:138
double getOptimPenaltyWeightedCost() const
Definition config.hpp:166
double getOptimPenaltyVariation() const
Definition config.hpp:170
const InitialConditionSettings & getInitialCondition() const
Definition config.hpp:144
const std::optional< std::string > & getHamiltonianFileHc() const
Definition config.hpp:146
size_t getOutputOptimizationStride() const
Definition config.hpp:175
ObjectiveType getOptimObjective() const
Definition config.hpp:156
double getControlAmplitudeBound(size_t i_osc) const
Definition config.hpp:153
size_t getOutputTimestepStride() const
Definition config.hpp:174
TimeStepperType getTimestepperType() const
Definition config.hpp:180
LinearSolverType getLinearSolverType() const
Definition config.hpp:178
const std::vector< double > & getCarrierFrequencies(size_t i_osc) const
Definition config.hpp:154
size_t getNumOsc() const
Definition config.hpp:128
void printConfig(std::stringstream &log) const
Definition config.cpp:583
size_t getNEssential(size_t i_osc) const
Definition config.hpp:130
const ControlInitializationSettings & getControlInitializations(size_t i_osc) const
Definition config.hpp:150
const std::optional< std::string > & getHamiltonianFileHsys() const
Definition config.hpp:145
const std::vector< double > & getSelfKerr() const
Definition config.hpp:136
bool getOptimTikhonovUseX0() const
Definition config.hpp:164
DecoherenceType getDecoherenceType() const
Definition config.hpp:140
const std::vector< double > & getCrossKerrCoupling() const
Definition config.hpp:137
const std::vector< double > & getRotationFrequency() const
Definition config.hpp:139
int getRandSeed() const
Definition config.hpp:181
RunType getRuntype() const
Definition config.hpp:176
double getDt() const
Definition config.hpp:132
size_t getNLevels(size_t i_osc) const
Definition config.hpp:127
double getOptimPenaltyWeightedCostWidth() const
Definition config.hpp:167
static Config fromFile(const std::string &filename, const MPILogger &logger)
Definition config.cpp:330
double getOptimPenaltyDpdm() const
Definition config.hpp:168
~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