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);