Mercurial > hg > segmenter-vamp-plugin
comparison armadillo-3.900.4/include/armadillo_bits/lapack_wrapper.hpp @ 49:1ec0e2823891
Switch to using subrepo copies of qm-dsp, nnls-chroma, vamp-plugin-sdk; update Armadillo version; assume build without external BLAS/LAPACK
author | Chris Cannam |
---|---|
date | Thu, 13 Jun 2013 10:25:24 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
48:69251e11a913 | 49:1ec0e2823891 |
---|---|
1 // Copyright (C) 2008-2012 NICTA (www.nicta.com.au) | |
2 // Copyright (C) 2008-2012 Conrad Sanderson | |
3 // Copyright (C) 2009 Edmund Highcock | |
4 // Copyright (C) 2011 James Sanders | |
5 // Copyright (C) 2012 Eric Jon Sundstrom | |
6 // | |
7 // This Source Code Form is subject to the terms of the Mozilla Public | |
8 // License, v. 2.0. If a copy of the MPL was not distributed with this | |
9 // file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
10 | |
11 | |
12 | |
13 #ifdef ARMA_USE_LAPACK | |
14 | |
15 | |
16 //! \namespace lapack namespace for LAPACK functions | |
17 namespace lapack | |
18 { | |
19 | |
20 | |
21 template<typename eT> | |
22 inline | |
23 void | |
24 getrf(blas_int* m, blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, blas_int* info) | |
25 { | |
26 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
27 | |
28 if(is_float<eT>::value == true) | |
29 { | |
30 typedef float T; | |
31 arma_fortran(arma_sgetrf)(m, n, (T*)a, lda, ipiv, info); | |
32 } | |
33 else | |
34 if(is_double<eT>::value == true) | |
35 { | |
36 typedef double T; | |
37 arma_fortran(arma_dgetrf)(m, n, (T*)a, lda, ipiv, info); | |
38 } | |
39 else | |
40 if(is_supported_complex_float<eT>::value == true) | |
41 { | |
42 typedef std::complex<float> T; | |
43 arma_fortran(arma_cgetrf)(m, n, (T*)a, lda, ipiv, info); | |
44 } | |
45 else | |
46 if(is_supported_complex_double<eT>::value == true) | |
47 { | |
48 typedef std::complex<double> T; | |
49 arma_fortran(arma_zgetrf)(m, n, (T*)a, lda, ipiv, info); | |
50 } | |
51 } | |
52 | |
53 | |
54 | |
55 template<typename eT> | |
56 inline | |
57 void | |
58 getri(blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, eT* work, blas_int* lwork, blas_int* info) | |
59 { | |
60 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
61 | |
62 if(is_float<eT>::value == true) | |
63 { | |
64 typedef float T; | |
65 arma_fortran(arma_sgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info); | |
66 } | |
67 else | |
68 if(is_double<eT>::value == true) | |
69 { | |
70 typedef double T; | |
71 arma_fortran(arma_dgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info); | |
72 } | |
73 else | |
74 if(is_supported_complex_float<eT>::value == true) | |
75 { | |
76 typedef std::complex<float> T; | |
77 arma_fortran(arma_cgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info); | |
78 } | |
79 else | |
80 if(is_supported_complex_double<eT>::value == true) | |
81 { | |
82 typedef std::complex<double> T; | |
83 arma_fortran(arma_zgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info); | |
84 } | |
85 } | |
86 | |
87 | |
88 | |
89 template<typename eT> | |
90 inline | |
91 void | |
92 trtri(char* uplo, char* diag, blas_int* n, eT* a, blas_int* lda, blas_int* info) | |
93 { | |
94 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
95 | |
96 if(is_float<eT>::value == true) | |
97 { | |
98 typedef float T; | |
99 arma_fortran(arma_strtri)(uplo, diag, n, (T*)a, lda, info); | |
100 } | |
101 else | |
102 if(is_double<eT>::value == true) | |
103 { | |
104 typedef double T; | |
105 arma_fortran(arma_dtrtri)(uplo, diag, n, (T*)a, lda, info); | |
106 } | |
107 else | |
108 if(is_supported_complex_float<eT>::value == true) | |
109 { | |
110 typedef std::complex<float> T; | |
111 arma_fortran(arma_ctrtri)(uplo, diag, n, (T*)a, lda, info); | |
112 } | |
113 else | |
114 if(is_supported_complex_double<eT>::value == true) | |
115 { | |
116 typedef std::complex<double> T; | |
117 arma_fortran(arma_ztrtri)(uplo, diag, n, (T*)a, lda, info); | |
118 } | |
119 } | |
120 | |
121 | |
122 | |
123 template<typename eT> | |
124 inline | |
125 void | |
126 syev(char* jobz, char* uplo, blas_int* n, eT* a, blas_int* lda, eT* w, eT* work, blas_int* lwork, blas_int* info) | |
127 { | |
128 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
129 | |
130 if(is_float<eT>::value == true) | |
131 { | |
132 typedef float T; | |
133 arma_fortran(arma_ssyev)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, info); | |
134 } | |
135 else | |
136 if(is_double<eT>::value == true) | |
137 { | |
138 typedef double T; | |
139 arma_fortran(arma_dsyev)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, info); | |
140 } | |
141 } | |
142 | |
143 | |
144 | |
145 template<typename eT> | |
146 inline | |
147 void | |
148 syevd(char* jobz, char* uplo, blas_int* n, eT* a, blas_int* lda, eT* w, eT* work, blas_int* lwork, blas_int* iwork, blas_int* liwork, blas_int* info) | |
149 { | |
150 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
151 | |
152 if(is_float<eT>::value == true) | |
153 { | |
154 typedef float T; | |
155 arma_fortran(arma_ssyevd)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, iwork, liwork, info); | |
156 } | |
157 else | |
158 if(is_double<eT>::value == true) | |
159 { | |
160 typedef double T; | |
161 arma_fortran(arma_dsyevd)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, iwork, liwork, info); | |
162 } | |
163 } | |
164 | |
165 | |
166 | |
167 template<typename eT> | |
168 inline | |
169 void | |
170 heev | |
171 ( | |
172 char* jobz, char* uplo, blas_int* n, | |
173 eT* a, blas_int* lda, typename eT::value_type* w, | |
174 eT* work, blas_int* lwork, typename eT::value_type* rwork, | |
175 blas_int* info | |
176 ) | |
177 { | |
178 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
179 | |
180 if(is_supported_complex_float<eT>::value == true) | |
181 { | |
182 typedef float T; | |
183 typedef typename std::complex<T> cx_T; | |
184 arma_fortran(arma_cheev)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, info); | |
185 } | |
186 else | |
187 if(is_supported_complex_double<eT>::value == true) | |
188 { | |
189 typedef double T; | |
190 typedef typename std::complex<T> cx_T; | |
191 arma_fortran(arma_zheev)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, info); | |
192 } | |
193 } | |
194 | |
195 | |
196 | |
197 template<typename eT> | |
198 inline | |
199 void | |
200 heevd | |
201 ( | |
202 char* jobz, char* uplo, blas_int* n, | |
203 eT* a, blas_int* lda, typename eT::value_type* w, | |
204 eT* work, blas_int* lwork, typename eT::value_type* rwork, | |
205 blas_int* lrwork, blas_int* iwork, blas_int* liwork, | |
206 blas_int* info | |
207 ) | |
208 { | |
209 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
210 | |
211 if(is_supported_complex_float<eT>::value == true) | |
212 { | |
213 typedef float T; | |
214 typedef typename std::complex<T> cx_T; | |
215 arma_fortran(arma_cheevd)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, lrwork, iwork, liwork, info); | |
216 } | |
217 else | |
218 if(is_supported_complex_double<eT>::value == true) | |
219 { | |
220 typedef double T; | |
221 typedef typename std::complex<T> cx_T; | |
222 arma_fortran(arma_zheevd)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, lrwork, iwork, liwork, info); | |
223 } | |
224 } | |
225 | |
226 | |
227 | |
228 template<typename eT> | |
229 inline | |
230 void | |
231 geev | |
232 ( | |
233 char* jobvl, char* jobvr, blas_int* n, | |
234 eT* a, blas_int* lda, eT* wr, eT* wi, eT* vl, | |
235 blas_int* ldvl, eT* vr, blas_int* ldvr, | |
236 eT* work, blas_int* lwork, | |
237 blas_int* info | |
238 ) | |
239 { | |
240 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
241 | |
242 if(is_float<eT>::value == true) | |
243 { | |
244 typedef float T; | |
245 arma_fortran(arma_sgeev)(jobvl, jobvr, n, (T*)a, lda, (T*)wr, (T*)wi, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info); | |
246 } | |
247 else | |
248 if(is_double<eT>::value == true) | |
249 { | |
250 typedef double T; | |
251 arma_fortran(arma_dgeev)(jobvl, jobvr, n, (T*)a, lda, (T*)wr, (T*)wi, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info); | |
252 } | |
253 } | |
254 | |
255 | |
256 template<typename eT> | |
257 inline | |
258 void | |
259 cx_geev | |
260 ( | |
261 char* jobvl, char* jobvr, blas_int* n, | |
262 eT* a, blas_int* lda, eT* w, | |
263 eT* vl, blas_int* ldvl, | |
264 eT* vr, blas_int* ldvr, | |
265 eT* work, blas_int* lwork, typename eT::value_type* rwork, | |
266 blas_int* info | |
267 ) | |
268 { | |
269 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
270 | |
271 if(is_supported_complex_float<eT>::value == true) | |
272 { | |
273 typedef float T; | |
274 typedef typename std::complex<T> cx_T; | |
275 arma_fortran(arma_cgeev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)w, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info); | |
276 } | |
277 else | |
278 if(is_supported_complex_double<eT>::value == true) | |
279 { | |
280 typedef double T; | |
281 typedef typename std::complex<T> cx_T; | |
282 arma_fortran(arma_zgeev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)w, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info); | |
283 } | |
284 } | |
285 | |
286 | |
287 | |
288 | |
289 template<typename eT> | |
290 inline | |
291 void | |
292 potrf(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* info) | |
293 { | |
294 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
295 | |
296 if(is_float<eT>::value == true) | |
297 { | |
298 typedef float T; | |
299 arma_fortran(arma_spotrf)(uplo, n, (T*)a, lda, info); | |
300 } | |
301 else | |
302 if(is_double<eT>::value == true) | |
303 { | |
304 typedef double T; | |
305 arma_fortran(arma_dpotrf)(uplo, n, (T*)a, lda, info); | |
306 } | |
307 else | |
308 if(is_supported_complex_float<eT>::value == true) | |
309 { | |
310 typedef std::complex<float> T; | |
311 arma_fortran(arma_cpotrf)(uplo, n, (T*)a, lda, info); | |
312 } | |
313 else | |
314 if(is_supported_complex_double<eT>::value == true) | |
315 { | |
316 typedef std::complex<double> T; | |
317 arma_fortran(arma_zpotrf)(uplo, n, (T*)a, lda, info); | |
318 } | |
319 | |
320 } | |
321 | |
322 | |
323 | |
324 template<typename eT> | |
325 inline | |
326 void | |
327 potri(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* info) | |
328 { | |
329 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
330 | |
331 if(is_float<eT>::value == true) | |
332 { | |
333 typedef float T; | |
334 arma_fortran(arma_spotri)(uplo, n, (T*)a, lda, info); | |
335 } | |
336 else | |
337 if(is_double<eT>::value == true) | |
338 { | |
339 typedef double T; | |
340 arma_fortran(arma_dpotri)(uplo, n, (T*)a, lda, info); | |
341 } | |
342 else | |
343 if(is_supported_complex_float<eT>::value == true) | |
344 { | |
345 typedef std::complex<float> T; | |
346 arma_fortran(arma_cpotri)(uplo, n, (T*)a, lda, info); | |
347 } | |
348 else | |
349 if(is_supported_complex_double<eT>::value == true) | |
350 { | |
351 typedef std::complex<double> T; | |
352 arma_fortran(arma_zpotri)(uplo, n, (T*)a, lda, info); | |
353 } | |
354 | |
355 } | |
356 | |
357 | |
358 | |
359 template<typename eT> | |
360 inline | |
361 void | |
362 geqrf(blas_int* m, blas_int* n, eT* a, blas_int* lda, eT* tau, eT* work, blas_int* lwork, blas_int* info) | |
363 { | |
364 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
365 | |
366 if(is_float<eT>::value == true) | |
367 { | |
368 typedef float T; | |
369 arma_fortran(arma_sgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info); | |
370 } | |
371 else | |
372 if(is_double<eT>::value == true) | |
373 { | |
374 typedef double T; | |
375 arma_fortran(arma_dgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info); | |
376 } | |
377 else | |
378 if(is_supported_complex_float<eT>::value == true) | |
379 { | |
380 typedef std::complex<float> T; | |
381 arma_fortran(arma_cgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info); | |
382 } | |
383 else | |
384 if(is_supported_complex_double<eT>::value == true) | |
385 { | |
386 typedef std::complex<double> T; | |
387 arma_fortran(arma_zgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info); | |
388 } | |
389 | |
390 } | |
391 | |
392 | |
393 | |
394 template<typename eT> | |
395 inline | |
396 void | |
397 orgqr(blas_int* m, blas_int* n, blas_int* k, eT* a, blas_int* lda, eT* tau, eT* work, blas_int* lwork, blas_int* info) | |
398 { | |
399 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
400 | |
401 if(is_float<eT>::value == true) | |
402 { | |
403 typedef float T; | |
404 arma_fortran(arma_sorgqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info); | |
405 } | |
406 else | |
407 if(is_double<eT>::value == true) | |
408 { | |
409 typedef double T; | |
410 arma_fortran(arma_dorgqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info); | |
411 } | |
412 } | |
413 | |
414 | |
415 | |
416 template<typename eT> | |
417 inline | |
418 void | |
419 ungqr(blas_int* m, blas_int* n, blas_int* k, eT* a, blas_int* lda, eT* tau, eT* work, blas_int* lwork, blas_int* info) | |
420 { | |
421 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
422 | |
423 if(is_supported_complex_float<eT>::value == true) | |
424 { | |
425 typedef float T; | |
426 arma_fortran(arma_cungqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info); | |
427 } | |
428 else | |
429 if(is_supported_complex_double<eT>::value == true) | |
430 { | |
431 typedef double T; | |
432 arma_fortran(arma_zungqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info); | |
433 } | |
434 } | |
435 | |
436 | |
437 template<typename eT> | |
438 inline | |
439 void | |
440 gesvd | |
441 ( | |
442 char* jobu, char* jobvt, blas_int* m, blas_int* n, eT* a, blas_int* lda, | |
443 eT* s, eT* u, blas_int* ldu, eT* vt, blas_int* ldvt, | |
444 eT* work, blas_int* lwork, blas_int* info | |
445 ) | |
446 { | |
447 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
448 | |
449 if(is_float<eT>::value == true) | |
450 { | |
451 typedef float T; | |
452 arma_fortran(arma_sgesvd)(jobu, jobvt, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, info); | |
453 } | |
454 else | |
455 if(is_double<eT>::value == true) | |
456 { | |
457 typedef double T; | |
458 arma_fortran(arma_dgesvd)(jobu, jobvt, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, info); | |
459 } | |
460 } | |
461 | |
462 | |
463 | |
464 template<typename T> | |
465 inline | |
466 void | |
467 cx_gesvd | |
468 ( | |
469 char* jobu, char* jobvt, blas_int* m, blas_int* n, std::complex<T>* a, blas_int* lda, | |
470 T* s, std::complex<T>* u, blas_int* ldu, std::complex<T>* vt, blas_int* ldvt, | |
471 std::complex<T>* work, blas_int* lwork, T* rwork, blas_int* info | |
472 ) | |
473 { | |
474 arma_type_check(( is_supported_blas_type<T>::value == false )); | |
475 arma_type_check(( is_supported_blas_type< std::complex<T> >::value == false )); | |
476 | |
477 if(is_float<T>::value == true) | |
478 { | |
479 typedef float bT; | |
480 arma_fortran(arma_cgesvd) | |
481 ( | |
482 jobu, jobvt, m, n, (std::complex<bT>*)a, lda, | |
483 (bT*)s, (std::complex<bT>*)u, ldu, (std::complex<bT>*)vt, ldvt, | |
484 (std::complex<bT>*)work, lwork, (bT*)rwork, info | |
485 ); | |
486 } | |
487 else | |
488 if(is_double<T>::value == true) | |
489 { | |
490 typedef double bT; | |
491 arma_fortran(arma_zgesvd) | |
492 ( | |
493 jobu, jobvt, m, n, (std::complex<bT>*)a, lda, | |
494 (bT*)s, (std::complex<bT>*)u, ldu, (std::complex<bT>*)vt, ldvt, | |
495 (std::complex<bT>*)work, lwork, (bT*)rwork, info | |
496 ); | |
497 } | |
498 } | |
499 | |
500 | |
501 | |
502 template<typename eT> | |
503 inline | |
504 void | |
505 gesdd | |
506 ( | |
507 char* jobz, blas_int* m, blas_int* n, | |
508 eT* a, blas_int* lda, eT* s, eT* u, blas_int* ldu, eT* vt, blas_int* ldvt, | |
509 eT* work, blas_int* lwork, blas_int* iwork, blas_int* info | |
510 ) | |
511 { | |
512 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
513 | |
514 if(is_float<eT>::value == true) | |
515 { | |
516 typedef float T; | |
517 arma_fortran(arma_sgesdd)(jobz, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, iwork, info); | |
518 } | |
519 else | |
520 if(is_double<eT>::value == true) | |
521 { | |
522 typedef double T; | |
523 arma_fortran(arma_dgesdd)(jobz, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, iwork, info); | |
524 } | |
525 } | |
526 | |
527 | |
528 | |
529 template<typename T> | |
530 inline | |
531 void | |
532 cx_gesdd | |
533 ( | |
534 char* jobz, blas_int* m, blas_int* n, | |
535 std::complex<T>* a, blas_int* lda, T* s, std::complex<T>* u, blas_int* ldu, std::complex<T>* vt, blas_int* ldvt, | |
536 std::complex<T>* work, blas_int* lwork, T* rwork, blas_int* iwork, blas_int* info | |
537 ) | |
538 { | |
539 arma_type_check(( is_supported_blas_type<T>::value == false )); | |
540 arma_type_check(( is_supported_blas_type< std::complex<T> >::value == false )); | |
541 | |
542 if(is_float<T>::value == true) | |
543 { | |
544 typedef float bT; | |
545 arma_fortran(arma_cgesdd) | |
546 ( | |
547 jobz, m, n, | |
548 (std::complex<bT>*)a, lda, (bT*)s, (std::complex<bT>*)u, ldu, (std::complex<bT>*)vt, ldvt, | |
549 (std::complex<bT>*)work, lwork, (bT*)rwork, iwork, info | |
550 ); | |
551 } | |
552 else | |
553 if(is_double<T>::value == true) | |
554 { | |
555 typedef double bT; | |
556 arma_fortran(arma_zgesdd) | |
557 ( | |
558 jobz, m, n, | |
559 (std::complex<bT>*)a, lda, (bT*)s, (std::complex<bT>*)u, ldu, (std::complex<bT>*)vt, ldvt, | |
560 (std::complex<bT>*)work, lwork, (bT*)rwork, iwork, info | |
561 ); | |
562 } | |
563 } | |
564 | |
565 | |
566 | |
567 template<typename eT> | |
568 inline | |
569 void | |
570 gesv(blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, blas_int* ipiv, eT* b, blas_int* ldb, blas_int* info) | |
571 { | |
572 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
573 | |
574 if(is_float<eT>::value == true) | |
575 { | |
576 typedef float T; | |
577 arma_fortran(arma_sgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); | |
578 } | |
579 else | |
580 if(is_double<eT>::value == true) | |
581 { | |
582 typedef double T; | |
583 arma_fortran(arma_dgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); | |
584 } | |
585 else | |
586 if(is_supported_complex_float<eT>::value == true) | |
587 { | |
588 typedef std::complex<float> T; | |
589 arma_fortran(arma_cgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); | |
590 } | |
591 else | |
592 if(is_supported_complex_double<eT>::value == true) | |
593 { | |
594 typedef std::complex<double> T; | |
595 arma_fortran(arma_zgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); | |
596 } | |
597 } | |
598 | |
599 | |
600 | |
601 template<typename eT> | |
602 inline | |
603 void | |
604 gels(char* trans, blas_int* m, blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, eT* b, blas_int* ldb, eT* work, blas_int* lwork, blas_int* info) | |
605 { | |
606 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
607 | |
608 if(is_float<eT>::value == true) | |
609 { | |
610 typedef float T; | |
611 arma_fortran(arma_sgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info); | |
612 } | |
613 else | |
614 if(is_double<eT>::value == true) | |
615 { | |
616 typedef double T; | |
617 arma_fortran(arma_dgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info); | |
618 } | |
619 else | |
620 if(is_supported_complex_float<eT>::value == true) | |
621 { | |
622 typedef std::complex<float> T; | |
623 arma_fortran(arma_cgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info); | |
624 } | |
625 else | |
626 if(is_supported_complex_double<eT>::value == true) | |
627 { | |
628 typedef std::complex<double> T; | |
629 arma_fortran(arma_zgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info); | |
630 } | |
631 } | |
632 | |
633 | |
634 | |
635 template<typename eT> | |
636 inline | |
637 void | |
638 trtrs(char* uplo, char* trans, char* diag, blas_int* n, blas_int* nrhs, const eT* a, blas_int* lda, eT* b, blas_int* ldb, blas_int* info) | |
639 { | |
640 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
641 | |
642 if(is_float<eT>::value == true) | |
643 { | |
644 typedef float T; | |
645 arma_fortran(arma_strtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info); | |
646 } | |
647 else | |
648 if(is_double<eT>::value == true) | |
649 { | |
650 typedef double T; | |
651 arma_fortran(arma_dtrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info); | |
652 } | |
653 else | |
654 if(is_supported_complex_float<eT>::value == true) | |
655 { | |
656 typedef std::complex<float> T; | |
657 arma_fortran(arma_ctrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info); | |
658 } | |
659 else | |
660 if(is_supported_complex_double<eT>::value == true) | |
661 { | |
662 typedef std::complex<double> T; | |
663 arma_fortran(arma_ztrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info); | |
664 } | |
665 } | |
666 | |
667 | |
668 | |
669 template<typename eT> | |
670 inline | |
671 void | |
672 gees(char* jobvs, char* sort, blas_int* select, blas_int* n, eT* a, blas_int* lda, blas_int* sdim, eT* wr, eT* wi, eT* vs, blas_int* ldvs, eT* work, blas_int* lwork, blas_int* bwork, blas_int* info) | |
673 { | |
674 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
675 | |
676 if(is_float<eT>::value == true) | |
677 { | |
678 typedef float T; | |
679 arma_fortran(arma_sgees)(jobvs, sort, select, n, (T*)a, lda, sdim, (T*)wr, (T*)wi, (T*)vs, ldvs, (T*)work, lwork, bwork, info); | |
680 } | |
681 else | |
682 if(is_double<eT>::value == true) | |
683 { | |
684 typedef double T; | |
685 arma_fortran(arma_dgees)(jobvs, sort, select, n, (T*)a, lda, sdim, (T*)wr, (T*)wi, (T*)vs, ldvs, (T*)work, lwork, bwork, info); | |
686 } | |
687 } | |
688 | |
689 | |
690 | |
691 template<typename T> | |
692 inline | |
693 void | |
694 cx_gees(char* jobvs, char* sort, blas_int* select, blas_int* n, std::complex<T>* a, blas_int* lda, blas_int* sdim, std::complex<T>* w, std::complex<T>* vs, blas_int* ldvs, std::complex<T>* work, blas_int* lwork, T* rwork, blas_int* bwork, blas_int* info) | |
695 { | |
696 arma_type_check(( is_supported_blas_type<T>::value == false )); | |
697 arma_type_check(( is_supported_blas_type< std::complex<T> >::value == false )); | |
698 | |
699 if(is_float<T>::value == true) | |
700 { | |
701 typedef float bT; | |
702 typedef std::complex<bT> cT; | |
703 arma_fortran(arma_cgees)(jobvs, sort, select, n, (cT*)a, lda, sdim, (cT*)w, (cT*)vs, ldvs, (cT*)work, lwork, (bT*)rwork, bwork, info); | |
704 } | |
705 else | |
706 if(is_double<T>::value == true) | |
707 { | |
708 typedef double bT; | |
709 typedef std::complex<bT> cT; | |
710 arma_fortran(arma_zgees)(jobvs, sort, select, n, (cT*)a, lda, sdim, (cT*)w, (cT*)vs, ldvs, (cT*)work, lwork, (bT*)rwork, bwork, info); | |
711 } | |
712 } | |
713 | |
714 | |
715 | |
716 template<typename eT> | |
717 inline | |
718 void | |
719 trsyl(char* transa, char* transb, blas_int* isgn, blas_int* m, blas_int* n, const eT* a, blas_int* lda, const eT* b, blas_int* ldb, eT* c, blas_int* ldc, eT* scale, blas_int* info) | |
720 { | |
721 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
722 | |
723 if(is_float<eT>::value == true) | |
724 { | |
725 typedef float T; | |
726 arma_fortran(arma_strsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (T*)scale, info); | |
727 } | |
728 else | |
729 if(is_double<eT>::value == true) | |
730 { | |
731 typedef double T; | |
732 arma_fortran(arma_dtrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (T*)scale, info); | |
733 } | |
734 else | |
735 if(is_supported_complex_float<eT>::value == true) | |
736 { | |
737 typedef std::complex<float> T; | |
738 arma_fortran(arma_ctrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (float*)scale, info); | |
739 } | |
740 else | |
741 if(is_supported_complex_double<eT>::value == true) | |
742 { | |
743 typedef std::complex<double> T; | |
744 arma_fortran(arma_ztrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (double*)scale, info); | |
745 } | |
746 } | |
747 | |
748 | |
749 template<typename eT> | |
750 inline | |
751 void | |
752 sytrf(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, eT* work, blas_int* lwork, blas_int* info) | |
753 { | |
754 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
755 | |
756 if(is_float<eT>::value == true) | |
757 { | |
758 typedef float T; | |
759 arma_fortran(arma_ssytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info); | |
760 } | |
761 else | |
762 if(is_double<eT>::value == true) | |
763 { | |
764 typedef double T; | |
765 arma_fortran(arma_dsytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info); | |
766 } | |
767 else | |
768 if(is_supported_complex_float<eT>::value == true) | |
769 { | |
770 typedef std::complex<float> T; | |
771 arma_fortran(arma_csytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info); | |
772 } | |
773 else | |
774 if(is_supported_complex_double<eT>::value == true) | |
775 { | |
776 typedef std::complex<double> T; | |
777 arma_fortran(arma_zsytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info); | |
778 } | |
779 } | |
780 | |
781 | |
782 template<typename eT> | |
783 inline | |
784 void | |
785 sytri(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, eT* work, blas_int* info) | |
786 { | |
787 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
788 | |
789 if(is_float<eT>::value == true) | |
790 { | |
791 typedef float T; | |
792 arma_fortran(arma_ssytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info); | |
793 } | |
794 else | |
795 if(is_double<eT>::value == true) | |
796 { | |
797 typedef double T; | |
798 arma_fortran(arma_dsytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info); | |
799 } | |
800 else | |
801 if(is_supported_complex_float<eT>::value == true) | |
802 { | |
803 typedef std::complex<float> T; | |
804 arma_fortran(arma_csytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info); | |
805 } | |
806 else | |
807 if(is_supported_complex_double<eT>::value == true) | |
808 { | |
809 typedef std::complex<double> T; | |
810 arma_fortran(arma_zsytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info); | |
811 } | |
812 } | |
813 | |
814 | |
815 } | |
816 | |
817 | |
818 #endif |