lapack_wrapper.hpp
Go to the documentation of this file.
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 
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  {
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
45  {
46  typedef std::complex<float> T;
47  arma_fortran(arma_cgetrf)(m, n, (T*)a, lda, ipiv, info);
48  }
49  else
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  {
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  {
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
113  {
114  typedef std::complex<float> T;
115  arma_fortran(arma_ctrtri)(uplo, diag, n, (T*)a, lda, info);
116  }
117  else
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  {
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  {
161 
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
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  {
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  {
220 
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
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  {
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
259  {
260  typedef std::complex<float> T;
261  arma_fortran(arma_cpotrf)(uplo, n, (T*)a, lda, info);
262  }
263  else
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  {
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
294  {
295  typedef std::complex<float> T;
296  arma_fortran(arma_cpotri)(uplo, n, (T*)a, lda, info);
297  }
298  else
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  {
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
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
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  {
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  {
372 
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
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  {
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  {
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  {
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
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
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  {
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
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
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  {
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
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
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  {
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  {
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  {
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
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
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  {
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
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
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  {
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
687  {
688  typedef std::complex<float> T;
689  arma_fortran(arma_csytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info);
690  }
691  else
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
int blas_int
#define arma_type_check(condition)
arma_inline const Op< T1, op_htrans > trans(const Base< typename T1::elem_type, T1 > &X)
Definition: fn_trans.hpp:21
#define arma_fortran(function)
arma_inline const Op< T1, op_sort > sort(const Base< typename T1::elem_type, T1 > &X, const uword sort_type=0, const uword dim=0)
Definition: fn_sort.hpp:21


armadillo_matrix
Author(s):
autogenerated on Fri Apr 16 2021 02:31:57