17 #ifndef ERKALE_UNITARY
18 #define ERKALE_UNITARY
80 virtual void setW(
const arma::cx_mat &
W);
82 arma::cx_mat
getW()
const;
94 virtual double cost_func(
const arma::cx_mat &
W)=0;
96 virtual arma::cx_mat
cost_der(
const arma::cx_mat &
W)=0;
98 virtual void cost_func_der(
const arma::cx_mat &
W,
double &
f, arma::cx_mat & der)=0;
101 virtual std::string
legend()
const;
103 virtual std::string
status(
bool lfmt=
false);
154 virtual void print_step(
enum unitmethod & met,
double step)
const;
161 void classify(
const arma::cx_mat & W)
const;
171 double step_der(
const arma::cx_mat & W,
const arma::cx_mat & der)
const;
192 void open_log(
const std::string & fname);
201 void set_thr(
double Gtol,
double Ftol);
209 double bracket(
const arma::cx_mat & X,
const arma::cx_mat & Y);
212 arma::cx_vec fourier_shift(
const arma::cx_vec & v);
215 arma::vec fit_polynomial(
const arma::vec & x,
const arma::vec & y,
int deg=-1);
217 arma::vec fit_polynomial_fdf(
const arma::vec & x,
const arma::vec & y,
const arma::vec & dy,
int deg=-1);
220 arma::vec derivative_coefficients(
const arma::vec & c);
223 arma::cx_vec solve_roots_cplx(
const arma::cx_vec & v);
225 arma::cx_vec solve_roots_cplx(
const arma::vec & v);
227 arma::vec solve_roots(
const arma::vec & v);
229 double smallest_positive(
const arma::vec & v);
240 std::string
legend()
const;
242 std::string
status(
bool lfmt=
false);
250 Brockett(
size_t N,
unsigned long int seed=0);
258 arma::cx_mat
cost_der(
const arma::cx_mat &
W);
260 void cost_func_der(
const arma::cx_mat &
W,
double &
f, arma::cx_mat & der);
int fourier_periods
Amount of quasi-periods for Fourier method (N_T = 1, 2, ...)
Definition: unitary.h:137
UnitaryFunction(int q, bool max)
Constructor.
Definition: unitary.cpp:26
arma::cx_mat Hvec
Eigenvectors of search direction.
Definition: unitary.h:116
void open_log(const std::string &fname)
Open log file.
Definition: unitary.cpp:99
void classify(const arma::cx_mat &W) const
Classify matrix.
Definition: unitary.cpp:387
int fourier_samples
Amount of samples per one period (K = 3, 4, or 5)
Definition: unitary.h:139
void update_gradient(const arma::cx_mat &W, UnitaryFunction *f)
Get new gradient direction.
Definition: unitary.cpp:149
A timer routine.
Definition: timer.h:43
double Gthr
Convergence threshold wrt norm of Riemannian derivative.
Definition: unitary.h:129
int sign
Maximization or minimization?
Definition: unitary.h:71
void check_derivative(const UnitaryFunction *f)
Check that the programmed cost function and its derivative are OK.
Definition: unitary.cpp:406
double Fthr
Convergence threshold wrt relative change in function.
Definition: unitary.h:131
double cost_func(const arma::cx_mat &W)
Evaluate cost function.
Definition: unitary.cpp:1124
arma::cx_mat get_rotation(double step) const
Get rotation matrix with wanted step size.
Definition: unitary.cpp:130
virtual std::string status(bool lfmt=false)
Print status information, possibly in a longer format.
Definition: unitary.cpp:64
void polynomial_step_f(UnitaryFunction *&f)
Polynomial step (fit function)
Definition: unitary.cpp:448
virtual arma::cx_mat cost_der(const arma::cx_mat &W)=0
Evaluate derivative of cost function.
double step_der(const arma::cx_mat &W, const arma::cx_mat &der) const
Get derivative wrt step length.
Definition: unitary.cpp:644
double unitarity() const
Compute unitarity criterion.
Definition: unitary.cpp:1174
std::string legend() const
Print legend.
Definition: unitary.cpp:1140
virtual ~UnitaryFunction()
Destructor.
Definition: unitary.cpp:31
FILE * log
Log file.
Definition: unitary.h:145
double Tmu
Maximum step size.
Definition: unitary.h:120
virtual void print_progress(size_t k, UnitaryFunction *f, const UnitaryFunction *fold) const
Print progress.
Definition: unitary.cpp:338
arma::cx_mat H
Search direction.
Definition: unitary.h:114
arma::cx_mat G
Gradient.
Definition: unitary.h:112
virtual UnitaryFunction * copy() const =0
Copy constructor.
UnitaryOptimizer(double Gthr, double Fthr, bool verbose=true, bool real=false)
Constructor.
Definition: unitary.cpp:70
void set_q(int q)
Set degree.
void set_fourier(int Nsamples, int Nperiods)
Set Fourier search options.
Definition: unitary.cpp:144
Unitary function optimizer, used to hold values during the optimization.
Definition: unitary.h:62
void set_thr(double Gtol, double Ftol)
Set convergence threshold.
Definition: unitary.cpp:94
void fourier_step_df(UnitaryFunction *&f)
Fourier step.
Definition: unitary.cpp:747
void check_unitary(const arma::cx_mat &W) const
Check that the matrix is unitary.
Definition: unitary.cpp:119
arma::cx_mat sigma
Sigma matrix.
Definition: unitary.h:235
void set_debug(bool dbg)
Set debug mode.
Definition: unitary.cpp:90
virtual void cost_func_der(const arma::cx_mat &W, double &f, arma::cx_mat &der)=0
Evaluate cost function and its derivative.
int getsign() const
Get sign.
Definition: unitary.cpp:50
arma::cx_mat getW() const
Get matrix.
Definition: unitary.cpp:38
std::string status(bool lfmt=false)
Print progress.
Definition: unitary.cpp:1146
void armijo_step(UnitaryFunction *&f)
Armijo step.
Definition: unitary.cpp:648
virtual void setW(const arma::cx_mat &W)
Set matrix.
Definition: unitary.cpp:34
void polynomial_step_df(UnitaryFunction *&f)
Polynomial step (fit only derivative)
Definition: unitary.cpp:533
virtual void print_step(enum unitmethod &met, double step) const
Print chosen step length.
Definition: unitary.cpp:365
int polynomial_degree
Degree of polynomial used for fit: a_0 + a_1*mu + ... + a_(d-1)*mu^(d-1)
Definition: unitary.h:134
bool real
Operate with real or complex matrices?
Definition: unitary.h:126
virtual std::string legend() const
Get status legend.
Definition: unitary.cpp:59
virtual bool converged()
Check convergence.
Definition: unitary.cpp:54
bool verbose
Verbose operation?
Definition: unitary.h:124
double getf() const
Get function value.
Definition: unitary.cpp:46
virtual double cost_func(const arma::cx_mat &W)=0
Evaluate cost function.
double diagonality() const
Compute diagonality criterion.
Definition: unitary.cpp:1155
virtual void print_legend(const UnitaryFunction *f) const
Print legend.
Definition: unitary.cpp:334
virtual void print_time(const Timer &t) const
Print time.
Definition: unitary.cpp:355
Brockett * copy() const
Copy constructor.
Definition: unitary.cpp:1120
Unitary optimization worker.
Definition: unitary.h:109
Brockett.
Definition: unitary.h:233
int q
Order in W.
Definition: unitary.h:69
double optimize(UnitaryFunction *&f, enum unitmethod met, enum unitacc acc, size_t maxiter)
Unitary optimization.
Definition: unitary.cpp:175
int getq() const
Get q.
Definition: unitary.cpp:42
bool debug
Debugging mode - print out line search every iteration.
Definition: unitary.h:142
arma::cx_mat cost_der(const arma::cx_mat &W)
Evaluate derivative of cost function.
Definition: unitary.cpp:1130
void set_poly(int deg)
Set polynomial search options.
Definition: unitary.cpp:140
void update_search_direction(int q)
Compute new search direction (diagonalize H) and max step length.
Definition: unitary.cpp:161
arma::mat Nmat
N matrix.
Definition: unitary.h:237
virtual ~UnitaryOptimizer()
Destructor.
Definition: unitary.cpp:85
arma::cx_mat W
Present matrix.
Definition: unitary.h:65
arma::vec Hval
Eigenvalues of search direction.
Definition: unitary.h:118
double f
Present value.
Definition: unitary.h:67
void cost_func_der(const arma::cx_mat &W, double &f, arma::cx_mat &der)
Evaluate cost function and its derivative.
Definition: unitary.cpp:1135