comparison armadillo-2.4.4/include/armadillo_bits/lapack_wrapper.hpp @ 0:8b6102e2a9b0

Armadillo Library
author maxzanoni76 <max.zanoni@eecs.qmul.ac.uk>
date Wed, 11 Apr 2012 09:27:06 +0100
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:8b6102e2a9b0
1 // Copyright (C) 2008-2011 NICTA (www.nicta.com.au)
2 // Copyright (C) 2008-2011 Conrad Sanderson
3 // Copyright (C) 2009 Edmund Highcock
4 // Copyright (C) 2011 James Sanders
5 //
6 // This file is part of the Armadillo C++ library.
7 // It is provided without any warranty of fitness
8 // for any purpose. You can redistribute this file
9 // and/or modify it under the terms of the GNU
10 // Lesser General Public License (LGPL) as published
11 // by the Free Software Foundation, either version 3
12 // of the License or (at your option) any later version.
13 // (see http://www.opensource.org/licenses for more info)
14
15
16
17 #ifdef ARMA_USE_LAPACK
18
19
20 //! \namespace lapack namespace for LAPACK functions
21 namespace lapack
22 {
23
24
25 template<typename eT>
26 inline
27 void
28 getrf(blas_int* m, blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, blas_int* info)
29 {
30 arma_type_check(( is_supported_blas_type<eT>::value == false ));
31
32 if(is_float<eT>::value == true)
33 {
34 typedef float T;
35 arma_fortran(arma_sgetrf)(m, n, (T*)a, lda, ipiv, info);
36 }
37 else
38 if(is_double<eT>::value == true)
39 {
40 typedef double T;
41 arma_fortran(arma_dgetrf)(m, n, (T*)a, lda, ipiv, info);
42 }
43 else
44 if(is_supported_complex_float<eT>::value == true)
45 {
46 typedef std::complex<float> T;
47 arma_fortran(arma_cgetrf)(m, n, (T*)a, lda, ipiv, info);
48 }
49 else
50 if(is_supported_complex_double<eT>::value == true)
51 {
52 typedef std::complex<double> T;
53 arma_fortran(arma_zgetrf)(m, n, (T*)a, lda, ipiv, info);
54 }
55 }
56
57
58
59 template<typename eT>
60 inline
61 void
62 getri(blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, eT* work, blas_int* lwork, blas_int* info)
63 {
64 arma_type_check(( is_supported_blas_type<eT>::value == false ));
65
66 if(is_float<eT>::value == true)
67 {
68 typedef float T;
69 arma_fortran(arma_sgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info);
70 }
71 else
72 if(is_double<eT>::value == true)
73 {
74 typedef double T;
75 arma_fortran(arma_dgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info);
76 }
77 else
78 if(is_supported_complex_float<eT>::value == true)
79 {
80 typedef std::complex<float> T;
81 arma_fortran(arma_cgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info);
82 }
83 else
84 if(is_supported_complex_double<eT>::value == true)
85 {
86 typedef std::complex<double> T;
87 arma_fortran(arma_zgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info);
88 }
89 }
90
91
92
93 template<typename eT>
94 inline
95 void
96 trtri(char* uplo, char* diag, blas_int* n, eT* a, blas_int* lda, blas_int* info)
97 {
98 arma_type_check(( is_supported_blas_type<eT>::value == false ));
99
100 if(is_float<eT>::value == true)
101 {
102 typedef float T;
103 arma_fortran(arma_strtri)(uplo, diag, n, (T*)a, lda, info);
104 }
105 else
106 if(is_double<eT>::value == true)
107 {
108 typedef double T;
109 arma_fortran(arma_dtrtri)(uplo, diag, n, (T*)a, lda, info);
110 }
111 else
112 if(is_supported_complex_float<eT>::value == true)
113 {
114 typedef std::complex<float> T;
115 arma_fortran(arma_ctrtri)(uplo, diag, n, (T*)a, lda, info);
116 }
117 else
118 if(is_supported_complex_double<eT>::value == true)
119 {
120 typedef std::complex<double> T;
121 arma_fortran(arma_ztrtri)(uplo, diag, n, (T*)a, lda, info);
122 }
123 }
124
125
126
127 template<typename eT>
128 inline
129 void
130 syev(char* jobz, char* uplo, blas_int* n, eT* a, blas_int* lda, eT* w, eT* work, blas_int* lwork, blas_int* info)
131 {
132 arma_type_check(( is_supported_blas_type<eT>::value == false ));
133
134 if(is_float<eT>::value == true)
135 {
136 typedef float T;
137 arma_fortran(arma_ssyev)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, info);
138 }
139 else
140 if(is_double<eT>::value == true)
141 {
142 typedef double T;
143 arma_fortran(arma_dsyev)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, info);
144 }
145 }
146
147
148
149 template<typename eT>
150 inline
151 void
152 heev
153 (
154 char* jobz, char* uplo, blas_int* n,
155 eT* a, blas_int* lda, typename eT::value_type* w,
156 eT* work, blas_int* lwork, typename eT::value_type* rwork,
157 blas_int* info
158 )
159 {
160 arma_type_check(( is_supported_blas_type<eT>::value == false ));
161
162 if(is_supported_complex_float<eT>::value == true)
163 {
164 typedef float T;
165 typedef typename std::complex<T> cx_T;
166 arma_fortran(arma_cheev)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, info);
167 }
168 else
169 if(is_supported_complex_double<eT>::value == true)
170 {
171 typedef double T;
172 typedef typename std::complex<T> cx_T;
173 arma_fortran(arma_zheev)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, info);
174 }
175 }
176
177
178 template<typename eT>
179 inline
180 void
181 geev
182 (
183 char* jobvl, char* jobvr, blas_int* n,
184 eT* a, blas_int* lda, eT* wr, eT* wi, eT* vl,
185 blas_int* ldvl, eT* vr, blas_int* ldvr,
186 eT* work, blas_int* lwork,
187 blas_int* info
188 )
189 {
190 arma_type_check(( is_supported_blas_type<eT>::value == false ));
191
192 if(is_float<eT>::value == true)
193 {
194 typedef float T;
195 arma_fortran(arma_sgeev)(jobvl, jobvr, n, (T*)a, lda, (T*)wr, (T*)wi, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info);
196 }
197 else
198 if(is_double<eT>::value == true)
199 {
200 typedef double T;
201 arma_fortran(arma_dgeev)(jobvl, jobvr, n, (T*)a, lda, (T*)wr, (T*)wi, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info);
202 }
203 }
204
205
206 template<typename eT>
207 inline
208 void
209 cx_geev
210 (
211 char* jobvl, char* jobvr, blas_int* n,
212 eT* a, blas_int* lda, eT* w,
213 eT* vl, blas_int* ldvl,
214 eT* vr, blas_int* ldvr,
215 eT* work, blas_int* lwork, typename eT::value_type* rwork,
216 blas_int* info
217 )
218 {
219 arma_type_check(( is_supported_blas_type<eT>::value == false ));
220
221 if(is_supported_complex_float<eT>::value == true)
222 {
223 typedef float T;
224 typedef typename std::complex<T> cx_T;
225 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);
226 }
227 else
228 if(is_supported_complex_double<eT>::value == true)
229 {
230 typedef double T;
231 typedef typename std::complex<T> cx_T;
232 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);
233 }
234 }
235
236
237
238
239 template<typename eT>
240 inline
241 void
242 potrf(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* info)
243 {
244 arma_type_check(( is_supported_blas_type<eT>::value == false ));
245
246 if(is_float<eT>::value == true)
247 {
248 typedef float T;
249 arma_fortran(arma_spotrf)(uplo, n, (T*)a, lda, info);
250 }
251 else
252 if(is_double<eT>::value == true)
253 {
254 typedef double T;
255 arma_fortran(arma_dpotrf)(uplo, n, (T*)a, lda, info);
256 }
257 else
258 if(is_supported_complex_float<eT>::value == true)
259 {
260 typedef std::complex<float> T;
261 arma_fortran(arma_cpotrf)(uplo, n, (T*)a, lda, info);
262 }
263 else
264 if(is_supported_complex_double<eT>::value == true)
265 {
266 typedef std::complex<double> T;
267 arma_fortran(arma_zpotrf)(uplo, n, (T*)a, lda, info);
268 }
269
270 }
271
272
273
274 template<typename eT>
275 inline
276 void
277 potri(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* info)
278 {
279 arma_type_check(( is_supported_blas_type<eT>::value == false ));
280
281 if(is_float<eT>::value == true)
282 {
283 typedef float T;
284 arma_fortran(arma_spotri)(uplo, n, (T*)a, lda, info);
285 }
286 else
287 if(is_double<eT>::value == true)
288 {
289 typedef double T;
290 arma_fortran(arma_dpotri)(uplo, n, (T*)a, lda, info);
291 }
292 else
293 if(is_supported_complex_float<eT>::value == true)
294 {
295 typedef std::complex<float> T;
296 arma_fortran(arma_cpotri)(uplo, n, (T*)a, lda, info);
297 }
298 else
299 if(is_supported_complex_double<eT>::value == true)
300 {
301 typedef std::complex<double> T;
302 arma_fortran(arma_zpotri)(uplo, n, (T*)a, lda, info);
303 }
304
305 }
306
307
308
309 template<typename eT>
310 inline
311 void
312 geqrf(blas_int* m, blas_int* n, eT* a, blas_int* lda, eT* tau, eT* work, blas_int* lwork, blas_int* info)
313 {
314 arma_type_check(( is_supported_blas_type<eT>::value == false ));
315
316 if(is_float<eT>::value == true)
317 {
318 typedef float T;
319 arma_fortran(arma_sgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info);
320 }
321 else
322 if(is_double<eT>::value == true)
323 {
324 typedef double T;
325 arma_fortran(arma_dgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info);
326 }
327 else
328 if(is_supported_complex_float<eT>::value == true)
329 {
330 typedef std::complex<float> T;
331 arma_fortran(arma_cgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info);
332 }
333 else
334 if(is_supported_complex_double<eT>::value == true)
335 {
336 typedef std::complex<double> T;
337 arma_fortran(arma_zgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info);
338 }
339
340 }
341
342
343
344 template<typename eT>
345 inline
346 void
347 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)
348 {
349 arma_type_check(( is_supported_blas_type<eT>::value == false ));
350
351 if(is_float<eT>::value == true)
352 {
353 typedef float T;
354 arma_fortran(arma_sorgqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info);
355 }
356 else
357 if(is_double<eT>::value == true)
358 {
359 typedef double T;
360 arma_fortran(arma_dorgqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info);
361 }
362 }
363
364
365
366 template<typename eT>
367 inline
368 void
369 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)
370 {
371 arma_type_check(( is_supported_blas_type<eT>::value == false ));
372
373 if(is_supported_complex_float<eT>::value == true)
374 {
375 typedef float T;
376 arma_fortran(arma_cungqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info);
377 }
378 else
379 if(is_supported_complex_double<eT>::value == true)
380 {
381 typedef double T;
382 arma_fortran(arma_zungqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info);
383 }
384 }
385
386
387 template<typename eT>
388 inline
389 void
390 gesvd
391 (
392 char* jobu, char* jobvt, blas_int* m, blas_int* n, eT* a, blas_int* lda,
393 eT* s, eT* u, blas_int* ldu, eT* vt, blas_int* ldvt,
394 eT* work, blas_int* lwork, blas_int* info
395 )
396 {
397 arma_type_check(( is_supported_blas_type<eT>::value == false ));
398
399 if(is_float<eT>::value == true)
400 {
401 typedef float T;
402 arma_fortran(arma_sgesvd)(jobu, jobvt, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, info);
403 }
404 else
405 if(is_double<eT>::value == true)
406 {
407 typedef double T;
408 arma_fortran(arma_dgesvd)(jobu, jobvt, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, info);
409 }
410 }
411
412
413
414 template<typename T>
415 inline
416 void
417 cx_gesvd
418 (
419 char* jobu, char* jobvt, blas_int* m, blas_int* n, std::complex<T>* a, blas_int* lda,
420 T* s, std::complex<T>* u, blas_int* ldu, std::complex<T>* vt, blas_int* ldvt,
421 std::complex<T>* work, blas_int* lwork, T* rwork, blas_int* info
422 )
423 {
424 arma_type_check(( is_supported_blas_type<T>::value == false ));
425 arma_type_check(( is_supported_blas_type< std::complex<T> >::value == false ));
426
427 if(is_float<T>::value == true)
428 {
429 typedef float bT;
430 arma_fortran(arma_cgesvd)
431 (
432 jobu, jobvt, m, n, (std::complex<bT>*)a, lda,
433 (bT*)s, (std::complex<bT>*)u, ldu, (std::complex<bT>*)vt, ldvt,
434 (std::complex<bT>*)work, lwork, (bT*)rwork, info
435 );
436 }
437 else
438 if(is_double<T>::value == true)
439 {
440 typedef double bT;
441 arma_fortran(arma_zgesvd)
442 (
443 jobu, jobvt, m, n, (std::complex<bT>*)a, lda,
444 (bT*)s, (std::complex<bT>*)u, ldu, (std::complex<bT>*)vt, ldvt,
445 (std::complex<bT>*)work, lwork, (bT*)rwork, info
446 );
447 }
448 }
449
450
451
452 template<typename eT>
453 inline
454 void
455 gesv(blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, blas_int* ipiv, eT* b, blas_int* ldb, blas_int* info)
456 {
457 arma_type_check(( is_supported_blas_type<eT>::value == false ));
458
459 if(is_float<eT>::value == true)
460 {
461 typedef float T;
462 arma_fortran(arma_sgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info);
463 }
464 else
465 if(is_double<eT>::value == true)
466 {
467 typedef double T;
468 arma_fortran(arma_dgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info);
469 }
470 else
471 if(is_supported_complex_float<eT>::value == true)
472 {
473 typedef std::complex<float> T;
474 arma_fortran(arma_cgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info);
475 }
476 else
477 if(is_supported_complex_double<eT>::value == true)
478 {
479 typedef std::complex<double> T;
480 arma_fortran(arma_zgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info);
481 }
482 }
483
484
485
486 template<typename eT>
487 inline
488 void
489 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)
490 {
491 arma_type_check(( is_supported_blas_type<eT>::value == false ));
492
493 if(is_float<eT>::value == true)
494 {
495 typedef float T;
496 arma_fortran(arma_sgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info);
497 }
498 else
499 if(is_double<eT>::value == true)
500 {
501 typedef double T;
502 arma_fortran(arma_dgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info);
503 }
504 else
505 if(is_supported_complex_float<eT>::value == true)
506 {
507 typedef std::complex<float> T;
508 arma_fortran(arma_cgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info);
509 }
510 else
511 if(is_supported_complex_double<eT>::value == true)
512 {
513 typedef std::complex<double> T;
514 arma_fortran(arma_zgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info);
515 }
516 }
517
518
519
520 template<typename eT>
521 inline
522 void
523 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)
524 {
525 arma_type_check(( is_supported_blas_type<eT>::value == false ));
526
527 if(is_float<eT>::value == true)
528 {
529 typedef float T;
530 arma_fortran(arma_strtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info);
531 }
532 else
533 if(is_double<eT>::value == true)
534 {
535 typedef double T;
536 arma_fortran(arma_dtrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info);
537 }
538 else
539 if(is_supported_complex_float<eT>::value == true)
540 {
541 typedef std::complex<float> T;
542 arma_fortran(arma_ctrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info);
543 }
544 else
545 if(is_supported_complex_double<eT>::value == true)
546 {
547 typedef std::complex<double> T;
548 arma_fortran(arma_ztrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info);
549 }
550 }
551
552
553
554 template<typename eT>
555 inline
556 void
557 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)
558 {
559 arma_type_check(( is_supported_blas_type<eT>::value == false ));
560
561 if(is_float<eT>::value == true)
562 {
563 typedef float T;
564 arma_fortran(arma_sgees)(jobvs, sort, select, n, (T*)a, lda, sdim, (T*)wr, (T*)wi, (T*)vs, ldvs, (T*)work, lwork, bwork, info);
565 }
566 else
567 if(is_double<eT>::value == true)
568 {
569 typedef double T;
570 arma_fortran(arma_dgees)(jobvs, sort, select, n, (T*)a, lda, sdim, (T*)wr, (T*)wi, (T*)vs, ldvs, (T*)work, lwork, bwork, info);
571 }
572 }
573
574
575
576 template<typename T>
577 inline
578 void
579 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)
580 {
581 arma_type_check(( is_supported_blas_type<T>::value == false ));
582 arma_type_check(( is_supported_blas_type< std::complex<T> >::value == false ));
583
584 if(is_float<T>::value == true)
585 {
586 typedef float bT;
587 typedef std::complex<bT> cT;
588 arma_fortran(arma_cgees)(jobvs, sort, select, n, (cT*)a, lda, sdim, (cT*)w, (cT*)vs, ldvs, (cT*)work, lwork, (bT*)rwork, bwork, info);
589 }
590 else
591 if(is_double<T>::value == true)
592 {
593 typedef double bT;
594 typedef std::complex<bT> cT;
595 arma_fortran(arma_zgees)(jobvs, sort, select, n, (cT*)a, lda, sdim, (cT*)w, (cT*)vs, ldvs, (cT*)work, lwork, (bT*)rwork, bwork, info);
596 }
597 }
598
599
600
601 template<typename eT>
602 inline
603 void
604 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)
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_strsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (T*)scale, info);
612 }
613 else
614 if(is_double<eT>::value == true)
615 {
616 typedef double T;
617 arma_fortran(arma_dtrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (T*)scale, info);
618 }
619 else
620 if(is_supported_complex_float<eT>::value == true)
621 {
622 typedef std::complex<float> T;
623 arma_fortran(arma_ctrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (float*)scale, info);
624 }
625 else
626 if(is_supported_complex_double<eT>::value == true)
627 {
628 typedef std::complex<double> T;
629 arma_fortran(arma_ztrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (double*)scale, info);
630 }
631 }
632
633
634 template<typename eT>
635 inline
636 void
637 sytrf(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, eT* work, blas_int* lwork, blas_int* info)
638 {
639 arma_type_check(( is_supported_blas_type<eT>::value == false ));
640
641 if(is_float<eT>::value == true)
642 {
643 typedef float T;
644 arma_fortran(arma_ssytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info);
645 }
646 else
647 if(is_double<eT>::value == true)
648 {
649 typedef double T;
650 arma_fortran(arma_dsytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info);
651 }
652 else
653 if(is_supported_complex_float<eT>::value == true)
654 {
655 typedef std::complex<float> T;
656 arma_fortran(arma_csytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info);
657 }
658 else
659 if(is_supported_complex_double<eT>::value == true)
660 {
661 typedef std::complex<double> T;
662 arma_fortran(arma_zsytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info);
663 }
664 }
665
666
667 template<typename eT>
668 inline
669 void
670 sytri(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, eT* work, blas_int* info)
671 {
672 arma_type_check(( is_supported_blas_type<eT>::value == false ));
673
674 if(is_float<eT>::value == true)
675 {
676 typedef float T;
677 arma_fortran(arma_ssytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info);
678 }
679 else
680 if(is_double<eT>::value == true)
681 {
682 typedef double T;
683 arma_fortran(arma_dsytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info);
684 }
685 else
686 if(is_supported_complex_float<eT>::value == true)
687 {
688 typedef std::complex<float> T;
689 arma_fortran(arma_csytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info);
690 }
691 else
692 if(is_supported_complex_double<eT>::value == true)
693 {
694 typedef std::complex<double> T;
695 arma_fortran(arma_zsytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info);
696 }
697 }
698
699
700 }
701
702
703 #endif