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