1 /** D bindings for GSL.
2     Authors:    Chibisi Chima-Okereke
3     Copyright:  Copyright (c) 2016, Chibisi Chima-Okereke. All rights reserved.
4     License:    Boost License 1.0
5 */
6 
7 module gsl.eigen;
8 import gsl.vector;
9 import gsl.matrix;
10 import gsl.complex;
11 
12 extern (C):
13 
14 enum gsl_eigen_sort_t
15 {
16     GSL_EIGEN_SORT_VAL_ASC = 0,
17     GSL_EIGEN_SORT_VAL_DESC = 1,
18     GSL_EIGEN_SORT_ABS_ASC = 2,
19     GSL_EIGEN_SORT_ABS_DESC = 3
20 }
21 
22 struct gsl_eigen_symm_workspace
23 {
24     size_t size;
25     double* d;
26     double* sd;
27 }
28 
29 struct gsl_eigen_symmv_workspace
30 {
31     size_t size;
32     double* d;
33     double* sd;
34     double* gc;
35     double* gs;
36 }
37 
38 struct gsl_eigen_herm_workspace
39 {
40     size_t size;
41     double* d;
42     double* sd;
43     double* tau;
44 }
45 
46 struct gsl_eigen_hermv_workspace
47 {
48     size_t size;
49     double* d;
50     double* sd;
51     double* tau;
52     double* gc;
53     double* gs;
54 }
55 
56 struct gsl_eigen_francis_workspace
57 {
58     size_t size;
59     size_t max_iterations;
60     size_t n_iter;
61     size_t n_evals;
62     int compute_t;
63     gsl_matrix* H;
64     gsl_matrix* Z;
65 }
66 
67 struct gsl_eigen_nonsymm_workspace
68 {
69     size_t size;
70     gsl_vector* diag;
71     gsl_vector* tau;
72     gsl_matrix* Z;
73     int do_balance;
74     size_t n_evals;
75     gsl_eigen_francis_workspace* francis_workspace_p;
76 }
77 
78 struct gsl_eigen_nonsymmv_workspace
79 {
80     size_t size;
81     gsl_vector* work;
82     gsl_vector* work2;
83     gsl_vector* work3;
84     gsl_matrix* Z;
85     gsl_eigen_nonsymm_workspace* nonsymm_workspace_p;
86 }
87 
88 struct gsl_eigen_gensymm_workspace
89 {
90     size_t size;
91     gsl_eigen_symm_workspace* symm_workspace_p;
92 }
93 
94 struct gsl_eigen_gensymmv_workspace
95 {
96     size_t size;
97     gsl_eigen_symmv_workspace* symmv_workspace_p;
98 }
99 
100 struct gsl_eigen_genherm_workspace
101 {
102     size_t size;
103     gsl_eigen_herm_workspace* herm_workspace_p;
104 }
105 
106 struct gsl_eigen_genhermv_workspace
107 {
108     size_t size;
109     gsl_eigen_hermv_workspace* hermv_workspace_p;
110 }
111 
112 struct gsl_eigen_gen_workspace
113 {
114     size_t size;
115     gsl_vector* work;
116     size_t n_evals;
117     size_t max_iterations;
118     size_t n_iter;
119     double eshift;
120     int needtop;
121     double atol;
122     double btol;
123     double ascale;
124     double bscale;
125     gsl_matrix* H;
126     gsl_matrix* R;
127     int compute_s;
128     int compute_t;
129     gsl_matrix* Q;
130     gsl_matrix* Z;
131 }
132 
133 struct gsl_eigen_genv_workspace
134 {
135     size_t size;
136     gsl_vector* work1;
137     gsl_vector* work2;
138     gsl_vector* work3;
139     gsl_vector* work4;
140     gsl_vector* work5;
141     gsl_vector* work6;
142     gsl_matrix* Q;
143     gsl_matrix* Z;
144     gsl_eigen_gen_workspace* gen_workspace_p;
145 }
146 
147 gsl_eigen_symm_workspace* gsl_eigen_symm_alloc (const size_t n);
148 void gsl_eigen_symm_free (gsl_eigen_symm_workspace* w);
149 int gsl_eigen_symm (gsl_matrix* A, gsl_vector* eval, gsl_eigen_symm_workspace* w);
150 gsl_eigen_symmv_workspace* gsl_eigen_symmv_alloc (const size_t n);
151 void gsl_eigen_symmv_free (gsl_eigen_symmv_workspace* w);
152 int gsl_eigen_symmv (gsl_matrix* A, gsl_vector* eval, gsl_matrix* evec, gsl_eigen_symmv_workspace* w);
153 gsl_eigen_herm_workspace* gsl_eigen_herm_alloc (const size_t n);
154 void gsl_eigen_herm_free (gsl_eigen_herm_workspace* w);
155 int gsl_eigen_herm (gsl_matrix_complex* A, gsl_vector* eval, gsl_eigen_herm_workspace* w);
156 gsl_eigen_hermv_workspace* gsl_eigen_hermv_alloc (const size_t n);
157 void gsl_eigen_hermv_free (gsl_eigen_hermv_workspace* w);
158 int gsl_eigen_hermv (gsl_matrix_complex* A, gsl_vector* eval, gsl_matrix_complex* evec, gsl_eigen_hermv_workspace* w);
159 gsl_eigen_francis_workspace* gsl_eigen_francis_alloc ();
160 void gsl_eigen_francis_free (gsl_eigen_francis_workspace* w);
161 void gsl_eigen_francis_T (const int compute_t, gsl_eigen_francis_workspace* w);
162 int gsl_eigen_francis (gsl_matrix* H, gsl_vector_complex* eval, gsl_eigen_francis_workspace* w);
163 int gsl_eigen_francis_Z (gsl_matrix* H, gsl_vector_complex* eval, gsl_matrix* Z, gsl_eigen_francis_workspace* w);
164 gsl_eigen_nonsymm_workspace* gsl_eigen_nonsymm_alloc (const size_t n);
165 void gsl_eigen_nonsymm_free (gsl_eigen_nonsymm_workspace* w);
166 void gsl_eigen_nonsymm_params (const int compute_t, const int balance, gsl_eigen_nonsymm_workspace* w);
167 int gsl_eigen_nonsymm (gsl_matrix* A, gsl_vector_complex* eval, gsl_eigen_nonsymm_workspace* w);
168 int gsl_eigen_nonsymm_Z (gsl_matrix* A, gsl_vector_complex* eval, gsl_matrix* Z, gsl_eigen_nonsymm_workspace* w);
169 gsl_eigen_nonsymmv_workspace* gsl_eigen_nonsymmv_alloc (const size_t n);
170 void gsl_eigen_nonsymmv_free (gsl_eigen_nonsymmv_workspace* w);
171 void gsl_eigen_nonsymmv_params (const int balance, gsl_eigen_nonsymmv_workspace* w);
172 int gsl_eigen_nonsymmv (gsl_matrix* A, gsl_vector_complex* eval, gsl_matrix_complex* evec, gsl_eigen_nonsymmv_workspace* w);
173 int gsl_eigen_nonsymmv_Z (gsl_matrix* A, gsl_vector_complex* eval, gsl_matrix_complex* evec, gsl_matrix* Z, gsl_eigen_nonsymmv_workspace* w);
174 gsl_eigen_gensymm_workspace* gsl_eigen_gensymm_alloc (const size_t n);
175 void gsl_eigen_gensymm_free (gsl_eigen_gensymm_workspace* w);
176 int gsl_eigen_gensymm (gsl_matrix* A, gsl_matrix* B, gsl_vector* eval, gsl_eigen_gensymm_workspace* w);
177 int gsl_eigen_gensymm_standardize (gsl_matrix* A, const(gsl_matrix)* B);
178 gsl_eigen_gensymmv_workspace* gsl_eigen_gensymmv_alloc (const size_t n);
179 void gsl_eigen_gensymmv_free (gsl_eigen_gensymmv_workspace* w);
180 int gsl_eigen_gensymmv (gsl_matrix* A, gsl_matrix* B, gsl_vector* eval, gsl_matrix* evec, gsl_eigen_gensymmv_workspace* w);
181 gsl_eigen_genherm_workspace* gsl_eigen_genherm_alloc (const size_t n);
182 void gsl_eigen_genherm_free (gsl_eigen_genherm_workspace* w);
183 int gsl_eigen_genherm (gsl_matrix_complex* A, gsl_matrix_complex* B, gsl_vector* eval, gsl_eigen_genherm_workspace* w);
184 int gsl_eigen_genherm_standardize (gsl_matrix_complex* A, const(gsl_matrix_complex)* B);
185 gsl_eigen_genhermv_workspace* gsl_eigen_genhermv_alloc (const size_t n);
186 void gsl_eigen_genhermv_free (gsl_eigen_genhermv_workspace* w);
187 int gsl_eigen_genhermv (gsl_matrix_complex* A, gsl_matrix_complex* B, gsl_vector* eval, gsl_matrix_complex* evec, gsl_eigen_genhermv_workspace* w);
188 gsl_eigen_gen_workspace* gsl_eigen_gen_alloc (const size_t n);
189 void gsl_eigen_gen_free (gsl_eigen_gen_workspace* w);
190 void gsl_eigen_gen_params (const int compute_s, const int compute_t, const int balance, gsl_eigen_gen_workspace* w);
191 int gsl_eigen_gen (gsl_matrix* A, gsl_matrix* B, gsl_vector_complex* alpha, gsl_vector* beta, gsl_eigen_gen_workspace* w);
192 int gsl_eigen_gen_QZ (gsl_matrix* A, gsl_matrix* B, gsl_vector_complex* alpha, gsl_vector* beta, gsl_matrix* Q, gsl_matrix* Z, gsl_eigen_gen_workspace* w);
193 gsl_eigen_genv_workspace* gsl_eigen_genv_alloc (const size_t n);
194 void gsl_eigen_genv_free (gsl_eigen_genv_workspace* w);
195 int gsl_eigen_genv (gsl_matrix* A, gsl_matrix* B, gsl_vector_complex* alpha, gsl_vector* beta, gsl_matrix_complex* evec, gsl_eigen_genv_workspace* w);
196 int gsl_eigen_genv_QZ (gsl_matrix* A, gsl_matrix* B, gsl_vector_complex* alpha, gsl_vector* beta, gsl_matrix_complex* evec, gsl_matrix* Q, gsl_matrix* Z, gsl_eigen_genv_workspace* w);
197 int gsl_eigen_symmv_sort (gsl_vector* eval, gsl_matrix* evec, gsl_eigen_sort_t sort_type);
198 int gsl_eigen_hermv_sort (gsl_vector* eval, gsl_matrix_complex* evec, gsl_eigen_sort_t sort_type);
199 int gsl_eigen_nonsymmv_sort (gsl_vector_complex* eval, gsl_matrix_complex* evec, gsl_eigen_sort_t sort_type);
200 int gsl_eigen_gensymmv_sort (gsl_vector* eval, gsl_matrix* evec, gsl_eigen_sort_t sort_type);
201 int gsl_eigen_genhermv_sort (gsl_vector* eval, gsl_matrix_complex* evec, gsl_eigen_sort_t sort_type);
202 int gsl_eigen_genv_sort (gsl_vector_complex* alpha, gsl_vector* beta, gsl_matrix_complex* evec, gsl_eigen_sort_t sort_type);
203 int gsl_schur_gen_eigvals (const(gsl_matrix)* A, const(gsl_matrix)* B, double* wr1, double* wr2, double* wi, double* scale1, double* scale2);
204 int gsl_schur_solve_equation (double ca, const(gsl_matrix)* A, double z, double d1, double d2, const(gsl_vector)* b, gsl_vector* x, double* s, double* xnorm, double smin);
205 int gsl_schur_solve_equation_z (double ca, const(gsl_matrix)* A, gsl_complex* z, double d1, double d2, const(gsl_vector_complex)* b, gsl_vector_complex* x, double* s, double* xnorm, double smin);
206 int gsl_eigen_jacobi (gsl_matrix* matrix, gsl_vector* eval, gsl_matrix* evec, uint max_rot, uint* nrot);
207 int gsl_eigen_invert_jacobi (const(gsl_matrix)* matrix, gsl_matrix* ainv, uint max_rot);