Quandary
Loading...
Searching...
No Matches
controlbasis.hpp
Go to the documentation of this file.
1#include "defs.hpp"
2#include <stdio.h>
3#include <stdlib.h>
4#include <math.h>
5#include <vector>
6#include <cassert>
7#include "util.hpp"
8#pragma once
9
10
26 protected:
27 int nparams;
28 double tstart;
29 double tstop;
30 int skip;
33
34 public:
36
45 ControlBasis(int nparams_, double tstart, double tstop, bool enforceZeroBoundary);
46
47 virtual ~ControlBasis();
48
54 int getNparams() {return nparams; };
55
61 double getTstart() {return tstart; };
62
68 double getTstop() {return tstop; };
69
76
82 void setSkip(int skip_) {skip = skip_;};
83
89 int getSkip(){return skip;};
90
96 virtual int getNSplines() {return 0;};
97
105 virtual double computeVariation(std::vector<double>& /*params*/, int /*carrierfreqID*/){return 0.0;};
106
112 virtual void computeVariation_diff(double* /*grad*/, std::vector<double>& /*params*/, double /*var_bar*/, int /*carrierfreqID*/){};
113
123 virtual void enforceBoundary(double* /*x*/, int /*carrier_id*/) {};
124
134 virtual void evaluate(const double t, const std::vector<double>& coeff, int carrier_freq_id, double* Blt1, double*Blt2) = 0;
135
146 virtual void derivative(const double t, const std::vector<double>& coeff, double* coeff_diff, const double valbar1, const double valbar2, int carrier_freq_id)= 0;
147};
148
155class BSpline2nd : public ControlBasis {
156 protected:
158 double dtknot;
159 double *tcenter;
160 double width;
161
169 double basisfunction(int id, double t);
170
171 public:
180 BSpline2nd(int nsplines, double tstart, double tstop, bool enforceZeroBoundary);
181
182 ~BSpline2nd();
183
184 int getNSplines() {return nsplines;};
185
193 void enforceBoundary(double* x, int carrier_id);
194
195 void evaluate(const double t, const std::vector<double>& coeff, int carrier_freq_id, double* Blt1_ptr, double* Blt2_ptr);
196
197 void derivative(const double t, const std::vector<double>& coeff, double* coeff_diff, const double valbar1, const double valbar2, int carrier_freq_id);
198};
199
209 protected:
211 double dtknot;
212 double *tcenter;
213 double width;
214 double scaling;
215
223 double basisfunction(int id, double t);
224
225 public:
235 BSpline2ndAmplitude(int nsplines, double scaling, double tstart, double tstop, bool enforceZeroBoundary);
236
238
239 int getNSplines() {return nsplines;};
240
247 void enforceBoundary(double* x, int carrier_id);
248
249 void evaluate(const double t, const std::vector<double>& coeff, int carrier_freq_id, double* Blt1_ptr, double* Blt2_ptr);
250
251 void derivative(const double t, const std::vector<double>& coeff, double* coeff_diff, const double valbar1, const double valbar2, int carrier_freq_id);
252};
253
260class BSpline0 : public ControlBasis {
261 protected:
263 double dtknot;
264 double width;
265
266 public:
267 BSpline0(int nsplines, double tstart, double tstop, bool enforceZeroBoundary);
268 ~BSpline0();
269
270 int getNSplines() {return nsplines;};
271
279 void enforceBoundary(double* x, int carrier_id);
280
290 double computeVariation(std::vector<double>& params, int carrierfreqID);
291
300 virtual void computeVariation_diff(double* grad, std::vector<double>&params, double var_bar, int carrierfreqID);
301
302 void evaluate(const double t, const std::vector<double>& coeff, int carrier_freq_id, double* Blt1_ptr, double* Blt2_ptr);
303
304 void derivative(const double t, const std::vector<double>& coeff, double* coeff_diff, const double valbar1, const double valbar2, int carrier_freq_id);
305};
306
Discretization of the Controls using piece-wise constant (0-th order) Bsplines.
Definition controlbasis.hpp:260
virtual void computeVariation_diff(double *grad, std::vector< double > &params, double var_bar, int carrierfreqID)
Computes derivative of control parameter variation.
Definition controlbasis.cpp:248
int getNSplines()
Retrieves the number of splines (default implementation returns 0).
Definition controlbasis.hpp:270
void derivative(const double t, const std::vector< double > &coeff, double *coeff_diff, const double valbar1, const double valbar2, int carrier_freq_id)
Evaluates the derivative of the control basis at a given time.
Definition controlbasis.cpp:213
double computeVariation(std::vector< double > &params, int carrierfreqID)
Computes total variation of the control parameters.
Definition controlbasis.cpp:225
double dtknot
Spacing of time knot vector.
Definition controlbasis.hpp:263
~BSpline0()
Definition controlbasis.cpp:195
void evaluate(const double t, const std::vector< double > &coeff, int carrier_freq_id, double *Blt1_ptr, double *Blt2_ptr)
Evaluates the control basis at a given time using the provided coefficients.
Definition controlbasis.cpp:198
void enforceBoundary(double *x, int carrier_id)
Sets the first and last parameter to zero for this carrier wave, so that the controls start and end a...
Definition controlbasis.cpp:282
int nsplines
Number of splines.
Definition controlbasis.hpp:262
double width
Support of each basis function (m*dtknot).
Definition controlbasis.hpp:264
Control parameterization where only the pulse amplitude is parameterized by Bsplines,...
Definition controlbasis.hpp:208
void derivative(const double t, const std::vector< double > &coeff, double *coeff_diff, const double valbar1, const double valbar2, int carrier_freq_id)
Evaluates the derivative of the control basis at a given time.
Definition controlbasis.cpp:145
double basisfunction(int id, double t)
Evaluate one basis function B_i(tau_i(t)).
Definition controlbasis.cpp:169
double * tcenter
Vector of basis function center positions.
Definition controlbasis.hpp:212
int nsplines
Number of splines.
Definition controlbasis.hpp:210
double scaling
Scaling for the phase.
Definition controlbasis.hpp:214
double width
Support of each basis function (m * dtknot).
Definition controlbasis.hpp:213
~BSpline2ndAmplitude()
Definition controlbasis.cpp:115
void enforceBoundary(double *x, int carrier_id)
Sets the first and last two spline coefficients in x to zero, so that the controls start and end at z...
Definition controlbasis.cpp:119
void evaluate(const double t, const std::vector< double > &coeff, int carrier_freq_id, double *Blt1_ptr, double *Blt2_ptr)
Evaluates the control basis at a given time using the provided coefficients.
Definition controlbasis.cpp:128
int getNSplines()
Retrieves the number of splines (default implementation returns 0).
Definition controlbasis.hpp:239
double dtknot
Spacing of the time knot vector.
Definition controlbasis.hpp:211
Control parameterization using quadratic (2nd order) Bspline basis functions.
Definition controlbasis.hpp:155
double basisfunction(int id, double t)
Evaluate one basis function B_i(tau_i(t)).
Definition controlbasis.cpp:81
double width
Support of each basis function (m*dtknot).
Definition controlbasis.hpp:160
int getNSplines()
Retrieves the number of splines (default implementation returns 0).
Definition controlbasis.hpp:184
void enforceBoundary(double *x, int carrier_id)
Sets the first and last two spline coefficients in x to zero for this carrier wave,...
Definition controlbasis.cpp:38
double dtknot
Spacing of time knot vector.
Definition controlbasis.hpp:158
void derivative(const double t, const std::vector< double > &coeff, double *coeff_diff, const double valbar1, const double valbar2, int carrier_freq_id)
Evaluates the derivative of the control basis at a given time.
Definition controlbasis.cpp:68
~BSpline2nd()
Definition controlbasis.cpp:34
void evaluate(const double t, const std::vector< double > &coeff, int carrier_freq_id, double *Blt1_ptr, double *Blt2_ptr)
Evaluates the control basis at a given time using the provided coefficients.
Definition controlbasis.cpp:48
double * tcenter
Vector of basis function center positions.
Definition controlbasis.hpp:159
int nsplines
Number of splines.
Definition controlbasis.hpp:157
Abstract base class for control parameterizations.
Definition controlbasis.hpp:25
int getSkip()
Retrieves the offset for the starting location in the global control vector.
Definition controlbasis.hpp:89
virtual void enforceBoundary(double *, int)
Enforces boundary conditions for controls (default implementation does nothing).
Definition controlbasis.hpp:123
virtual void derivative(const double t, const std::vector< double > &coeff, double *coeff_diff, const double valbar1, const double valbar2, int carrier_freq_id)=0
Evaluates the derivative of the control basis at a given time.
double tstart
Start time of the interval where the control basis is applied.
Definition controlbasis.hpp:28
virtual void computeVariation_diff(double *, std::vector< double > &, double, int)
Computes the gradient of the variation (default implementation does nothing).
Definition controlbasis.hpp:112
virtual int getNSplines()
Retrieves the number of splines (default implementation returns 0).
Definition controlbasis.hpp:96
virtual double computeVariation(std::vector< double > &, int)
Computes the variation of control parameters (default implementation returns 0.0).
Definition controlbasis.hpp:105
ControlBasis()
Definition controlbasis.cpp:4
virtual ~ControlBasis()
Definition controlbasis.cpp:17
ControlType getType()
Retrieves the type of control parameterization.
Definition controlbasis.hpp:75
int getNparams()
Retrieves the number of parameters defining the controls.
Definition controlbasis.hpp:54
int nparams
Number of parameters that define the control pulse.
Definition controlbasis.hpp:27
int skip
Offset to the starting location for this basis inside the global control vector.
Definition controlbasis.hpp:30
ControlType controltype
Type of control parameterization.
Definition controlbasis.hpp:31
double getTstart()
Retrieves the start time of the interval.
Definition controlbasis.hpp:61
void setSkip(int skip_)
Sets the offset for the starting location in the global control vector.
Definition controlbasis.hpp:82
bool enforceZeroBoundary
Flag to enforce zero boundary conditions for control pulses.
Definition controlbasis.hpp:32
virtual void evaluate(const double t, const std::vector< double > &coeff, int carrier_freq_id, double *Blt1, double *Blt2)=0
Evaluates the control basis at a given time using the provided coefficients.
double tstop
Stop time of the interval where the control basis is applied.
Definition controlbasis.hpp:29
double getTstop()
Retrieves the stop time of the interval.
Definition controlbasis.hpp:68
Core type definitions and enumerations for Quandary quantum optimal control.
ControlType
Types of control parameterizations.
Definition defs.hpp:149