nmatrix-lapacke 0.2.1 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/ext/nmatrix/data/data.h +7 -8
  3. data/ext/nmatrix/data/ruby_object.h +1 -4
  4. data/ext/nmatrix/math/asum.h +10 -31
  5. data/ext/nmatrix/math/cblas_templates_core.h +10 -10
  6. data/ext/nmatrix/math/getrf.h +2 -2
  7. data/ext/nmatrix/math/imax.h +12 -9
  8. data/ext/nmatrix/math/laswp.h +3 -3
  9. data/ext/nmatrix/math/long_dtype.h +16 -3
  10. data/ext/nmatrix/math/magnitude.h +54 -0
  11. data/ext/nmatrix/math/nrm2.h +19 -14
  12. data/ext/nmatrix/math/trsm.h +40 -36
  13. data/ext/nmatrix/math/util.h +14 -0
  14. data/ext/nmatrix/nmatrix.h +39 -1
  15. data/ext/nmatrix/storage/common.h +9 -3
  16. data/ext/nmatrix/storage/yale/class.h +1 -1
  17. data/ext/nmatrix_lapacke/extconf.rb +3 -136
  18. data/ext/nmatrix_lapacke/lapacke.cpp +104 -84
  19. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cgeqrf.c +77 -0
  20. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cgeqrf_work.c +89 -0
  21. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cunmqr.c +88 -0
  22. data/ext/nmatrix_lapacke/lapacke/src/lapacke_cunmqr_work.c +111 -0
  23. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dgeqrf.c +75 -0
  24. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dgeqrf_work.c +87 -0
  25. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dormqr.c +86 -0
  26. data/ext/nmatrix_lapacke/lapacke/src/lapacke_dormqr_work.c +109 -0
  27. data/ext/nmatrix_lapacke/lapacke/src/lapacke_sgeqrf.c +75 -0
  28. data/ext/nmatrix_lapacke/lapacke/src/lapacke_sgeqrf_work.c +87 -0
  29. data/ext/nmatrix_lapacke/lapacke/src/lapacke_sormqr.c +86 -0
  30. data/ext/nmatrix_lapacke/lapacke/src/lapacke_sormqr_work.c +109 -0
  31. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zgeqrf.c +77 -0
  32. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zgeqrf_work.c +89 -0
  33. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zunmqr.c +88 -0
  34. data/ext/nmatrix_lapacke/lapacke/src/lapacke_zunmqr_work.c +111 -0
  35. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_c_nancheck.c +51 -0
  36. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_d_nancheck.c +51 -0
  37. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_s_nancheck.c +51 -0
  38. data/ext/nmatrix_lapacke/lapacke/utils/lapacke_z_nancheck.c +51 -0
  39. data/ext/nmatrix_lapacke/math_lapacke.cpp +149 -17
  40. data/ext/nmatrix_lapacke/math_lapacke/lapacke_templates.h +76 -0
  41. data/lib/nmatrix/lapacke.rb +118 -0
  42. data/spec/00_nmatrix_spec.rb +50 -1
  43. data/spec/02_slice_spec.rb +21 -21
  44. data/spec/blas_spec.rb +25 -3
  45. data/spec/math_spec.rb +233 -5
  46. data/spec/plugins/lapacke/lapacke_spec.rb +187 -0
  47. data/spec/shortcuts_spec.rb +145 -5
  48. data/spec/spec_helper.rb +24 -1
  49. metadata +38 -8
@@ -0,0 +1,88 @@
1
+ /*****************************************************************************
2
+ Copyright (c) 2014, Intel Corp.
3
+ All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ * Redistributions of source code must retain the above copyright notice,
9
+ this list of conditions and the following disclaimer.
10
+ * Redistributions in binary form must reproduce the above copyright
11
+ notice, this list of conditions and the following disclaimer in the
12
+ documentation and/or other materials provided with the distribution.
13
+ * Neither the name of Intel Corporation nor the names of its contributors
14
+ may be used to endorse or promote products derived from this software
15
+ without specific prior written permission.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27
+ THE POSSIBILITY OF SUCH DAMAGE.
28
+ *****************************************************************************
29
+ * Contents: Native high-level C interface to LAPACK function zunmqr
30
+ * Author: Intel Corporation
31
+ * Generated November 2015
32
+ *****************************************************************************/
33
+
34
+ #include "lapacke_utils.h"
35
+
36
+ lapack_int LAPACKE_zunmqr( int matrix_layout, char side, char trans,
37
+ lapack_int m, lapack_int n, lapack_int k,
38
+ const lapack_complex_double* a, lapack_int lda,
39
+ const lapack_complex_double* tau,
40
+ lapack_complex_double* c, lapack_int ldc )
41
+ {
42
+ lapack_int info = 0;
43
+ lapack_int lwork = -1;
44
+ lapack_complex_double* work = NULL;
45
+ lapack_complex_double work_query;
46
+ lapack_int r;
47
+ if( matrix_layout != LAPACK_COL_MAJOR && matrix_layout != LAPACK_ROW_MAJOR ) {
48
+ LAPACKE_xerbla( "LAPACKE_zunmqr", -1 );
49
+ return -1;
50
+ }
51
+ #ifndef LAPACK_DISABLE_NAN_CHECK
52
+ /* Optionally check input matrices for NaNs */
53
+ r = LAPACKE_lsame( side, 'l' ) ? m : n;
54
+ if( LAPACKE_zge_nancheck( matrix_layout, r, k, a, lda ) ) {
55
+ return -7;
56
+ }
57
+ if( LAPACKE_zge_nancheck( matrix_layout, m, n, c, ldc ) ) {
58
+ return -10;
59
+ }
60
+ if( LAPACKE_z_nancheck( k, tau, 1 ) ) {
61
+ return -9;
62
+ }
63
+ #endif
64
+ /* Query optimal working array(s) size */
65
+ info = LAPACKE_zunmqr_work( matrix_layout, side, trans, m, n, k, a, lda, tau,
66
+ c, ldc, &work_query, lwork );
67
+ if( info != 0 ) {
68
+ goto exit_level_0;
69
+ }
70
+ lwork = LAPACK_Z2INT( work_query );
71
+ /* Allocate memory for work arrays */
72
+ work = (lapack_complex_double*)
73
+ LAPACKE_malloc( sizeof(lapack_complex_double) * lwork );
74
+ if( work == NULL ) {
75
+ info = LAPACK_WORK_MEMORY_ERROR;
76
+ goto exit_level_0;
77
+ }
78
+ /* Call middle-level interface */
79
+ info = LAPACKE_zunmqr_work( matrix_layout, side, trans, m, n, k, a, lda, tau,
80
+ c, ldc, work, lwork );
81
+ /* Release memory and exit */
82
+ LAPACKE_free( work );
83
+ exit_level_0:
84
+ if( info == LAPACK_WORK_MEMORY_ERROR ) {
85
+ LAPACKE_xerbla( "LAPACKE_zunmqr", info );
86
+ }
87
+ return info;
88
+ }
@@ -0,0 +1,111 @@
1
+ /*****************************************************************************
2
+ Copyright (c) 2014, Intel Corp.
3
+ All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ * Redistributions of source code must retain the above copyright notice,
9
+ this list of conditions and the following disclaimer.
10
+ * Redistributions in binary form must reproduce the above copyright
11
+ notice, this list of conditions and the following disclaimer in the
12
+ documentation and/or other materials provided with the distribution.
13
+ * Neither the name of Intel Corporation nor the names of its contributors
14
+ may be used to endorse or promote products derived from this software
15
+ without specific prior written permission.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27
+ THE POSSIBILITY OF SUCH DAMAGE.
28
+ *****************************************************************************
29
+ * Contents: Native middle-level C interface to LAPACK function zunmqr
30
+ * Author: Intel Corporation
31
+ * Generated November 2015
32
+ *****************************************************************************/
33
+
34
+ #include "lapacke_utils.h"
35
+
36
+ lapack_int LAPACKE_zunmqr_work( int matrix_layout, char side, char trans,
37
+ lapack_int m, lapack_int n, lapack_int k,
38
+ const lapack_complex_double* a, lapack_int lda,
39
+ const lapack_complex_double* tau,
40
+ lapack_complex_double* c, lapack_int ldc,
41
+ lapack_complex_double* work, lapack_int lwork )
42
+ {
43
+ lapack_int info = 0;
44
+ if( matrix_layout == LAPACK_COL_MAJOR ) {
45
+ /* Call LAPACK function and adjust info */
46
+ LAPACK_zunmqr( &side, &trans, &m, &n, &k, a, &lda, tau, c, &ldc, work,
47
+ &lwork, &info );
48
+ if( info < 0 ) {
49
+ info = info - 1;
50
+ }
51
+ } else if( matrix_layout == LAPACK_ROW_MAJOR ) {
52
+ lapack_int r = LAPACKE_lsame( side, 'l' ) ? m : n;
53
+ lapack_int lda_t = MAX(1,r);
54
+ lapack_int ldc_t = MAX(1,m);
55
+ lapack_complex_double* a_t = NULL;
56
+ lapack_complex_double* c_t = NULL;
57
+ /* Check leading dimension(s) */
58
+ if( lda < k ) {
59
+ info = -8;
60
+ LAPACKE_xerbla( "LAPACKE_zunmqr_work", info );
61
+ return info;
62
+ }
63
+ if( ldc < n ) {
64
+ info = -11;
65
+ LAPACKE_xerbla( "LAPACKE_zunmqr_work", info );
66
+ return info;
67
+ }
68
+ /* Query optimal working array(s) size if requested */
69
+ if( lwork == -1 ) {
70
+ LAPACK_zunmqr( &side, &trans, &m, &n, &k, a, &lda_t, tau, c, &ldc_t,
71
+ work, &lwork, &info );
72
+ return (info < 0) ? (info - 1) : info;
73
+ }
74
+ /* Allocate memory for temporary array(s) */
75
+ a_t = (lapack_complex_double*)
76
+ LAPACKE_malloc( sizeof(lapack_complex_double) * lda_t * MAX(1,k) );
77
+ if( a_t == NULL ) {
78
+ info = LAPACK_TRANSPOSE_MEMORY_ERROR;
79
+ goto exit_level_0;
80
+ }
81
+ c_t = (lapack_complex_double*)
82
+ LAPACKE_malloc( sizeof(lapack_complex_double) * ldc_t * MAX(1,n) );
83
+ if( c_t == NULL ) {
84
+ info = LAPACK_TRANSPOSE_MEMORY_ERROR;
85
+ goto exit_level_1;
86
+ }
87
+ /* Transpose input matrices */
88
+ LAPACKE_zge_trans( matrix_layout, r, k, a, lda, a_t, lda_t );
89
+ LAPACKE_zge_trans( matrix_layout, m, n, c, ldc, c_t, ldc_t );
90
+ /* Call LAPACK function and adjust info */
91
+ LAPACK_zunmqr( &side, &trans, &m, &n, &k, a_t, &lda_t, tau, c_t, &ldc_t,
92
+ work, &lwork, &info );
93
+ if( info < 0 ) {
94
+ info = info - 1;
95
+ }
96
+ /* Transpose output matrices */
97
+ LAPACKE_zge_trans( LAPACK_COL_MAJOR, m, n, c_t, ldc_t, c, ldc );
98
+ /* Release memory and exit */
99
+ LAPACKE_free( c_t );
100
+ exit_level_1:
101
+ LAPACKE_free( a_t );
102
+ exit_level_0:
103
+ if( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
104
+ LAPACKE_xerbla( "LAPACKE_zunmqr_work", info );
105
+ }
106
+ } else {
107
+ info = -1;
108
+ LAPACKE_xerbla( "LAPACKE_zunmqr_work", info );
109
+ }
110
+ return info;
111
+ }
@@ -0,0 +1,51 @@
1
+ /*****************************************************************************
2
+ Copyright (c) 2010, Intel Corp.
3
+ All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ * Redistributions of source code must retain the above copyright notice,
9
+ this list of conditions and the following disclaimer.
10
+ * Redistributions in binary form must reproduce the above copyright
11
+ notice, this list of conditions and the following disclaimer in the
12
+ documentation and/or other materials provided with the distribution.
13
+ * Neither the name of Intel Corporation nor the names of its contributors
14
+ may be used to endorse or promote products derived from this software
15
+ without specific prior written permission.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27
+ THE POSSIBILITY OF SUCH DAMAGE.
28
+ ******************************************************************************
29
+ * Contents: Native C interface to LAPACK utility function
30
+ * Author: Intel Corporation
31
+ * Created in February, 2010
32
+ *****************************************************************************/
33
+ #include "lapacke_utils.h"
34
+
35
+ /* Check a vector for NaN entries. */
36
+
37
+ lapack_logical LAPACKE_c_nancheck( lapack_int n,
38
+ const lapack_complex_float *x,
39
+ lapack_int incx )
40
+ {
41
+ lapack_int i, inc;
42
+
43
+ if( incx == 0 ) return (lapack_logical) LAPACK_CISNAN( x[0] );
44
+ inc = ( incx > 0 ) ? incx : -incx ;
45
+
46
+ for( i = 0; i < n*inc; i+=inc ) {
47
+ if( LAPACK_CISNAN( x[i] ) )
48
+ return (lapack_logical) 1;
49
+ }
50
+ return (lapack_logical) 0;
51
+ }
@@ -0,0 +1,51 @@
1
+ /*****************************************************************************
2
+ Copyright (c) 2010, Intel Corp.
3
+ All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ * Redistributions of source code must retain the above copyright notice,
9
+ this list of conditions and the following disclaimer.
10
+ * Redistributions in binary form must reproduce the above copyright
11
+ notice, this list of conditions and the following disclaimer in the
12
+ documentation and/or other materials provided with the distribution.
13
+ * Neither the name of Intel Corporation nor the names of its contributors
14
+ may be used to endorse or promote products derived from this software
15
+ without specific prior written permission.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27
+ THE POSSIBILITY OF SUCH DAMAGE.
28
+ ******************************************************************************
29
+ * Contents: Native C interface to LAPACK utility function
30
+ * Author: Intel Corporation
31
+ * Created in February, 2010
32
+ *****************************************************************************/
33
+ #include "lapacke_utils.h"
34
+
35
+ /* Check a vector for NaN entries. */
36
+
37
+ lapack_logical LAPACKE_d_nancheck( lapack_int n,
38
+ const double *x,
39
+ lapack_int incx )
40
+ {
41
+ lapack_int i, inc;
42
+
43
+ if( incx == 0 ) return (lapack_logical) LAPACK_DISNAN( x[0] );
44
+ inc = ( incx > 0 ) ? incx : -incx ;
45
+
46
+ for( i = 0; i < n*inc; i+=inc ) {
47
+ if( LAPACK_DISNAN( x[i] ) )
48
+ return (lapack_logical) 1;
49
+ }
50
+ return (lapack_logical) 0;
51
+ }
@@ -0,0 +1,51 @@
1
+ /*****************************************************************************
2
+ Copyright (c) 2010, Intel Corp.
3
+ All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ * Redistributions of source code must retain the above copyright notice,
9
+ this list of conditions and the following disclaimer.
10
+ * Redistributions in binary form must reproduce the above copyright
11
+ notice, this list of conditions and the following disclaimer in the
12
+ documentation and/or other materials provided with the distribution.
13
+ * Neither the name of Intel Corporation nor the names of its contributors
14
+ may be used to endorse or promote products derived from this software
15
+ without specific prior written permission.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27
+ THE POSSIBILITY OF SUCH DAMAGE.
28
+ ******************************************************************************
29
+ * Contents: Native C interface to LAPACK utility function
30
+ * Author: Intel Corporation
31
+ * Created in February, 2010
32
+ *****************************************************************************/
33
+ #include "lapacke_utils.h"
34
+
35
+ /* Check a vector for NaN entries. */
36
+
37
+ lapack_logical LAPACKE_s_nancheck( lapack_int n,
38
+ const float *x,
39
+ lapack_int incx )
40
+ {
41
+ lapack_int i, inc;
42
+
43
+ if( incx == 0 ) return (lapack_logical) LAPACK_SISNAN( x[0] );
44
+ inc = ( incx > 0 ) ? incx : -incx ;
45
+
46
+ for( i = 0; i < n*inc; i+=inc ) {
47
+ if( LAPACK_SISNAN( x[i] ) )
48
+ return (lapack_logical) 1;
49
+ }
50
+ return (lapack_logical) 0;
51
+ }
@@ -0,0 +1,51 @@
1
+ /*****************************************************************************
2
+ Copyright (c) 2010, Intel Corp.
3
+ All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ * Redistributions of source code must retain the above copyright notice,
9
+ this list of conditions and the following disclaimer.
10
+ * Redistributions in binary form must reproduce the above copyright
11
+ notice, this list of conditions and the following disclaimer in the
12
+ documentation and/or other materials provided with the distribution.
13
+ * Neither the name of Intel Corporation nor the names of its contributors
14
+ may be used to endorse or promote products derived from this software
15
+ without specific prior written permission.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27
+ THE POSSIBILITY OF SUCH DAMAGE.
28
+ ******************************************************************************
29
+ * Contents: Native C interface to LAPACK utility function
30
+ * Author: Intel Corporation
31
+ * Created in February, 2010
32
+ *****************************************************************************/
33
+ #include "lapacke_utils.h"
34
+
35
+ /* Check a vector for NaN entries. */
36
+
37
+ lapack_logical LAPACKE_z_nancheck( lapack_int n,
38
+ const lapack_complex_double *x,
39
+ lapack_int incx )
40
+ {
41
+ lapack_int i, inc;
42
+
43
+ if( incx == 0 ) return (lapack_logical) LAPACK_ZISNAN( x[0] );
44
+ inc = ( incx > 0 ) ? incx : -incx ;
45
+
46
+ for( i = 0; i < n*inc; i+=inc ) {
47
+ if( LAPACK_ZISNAN( x[i] ) )
48
+ return (lapack_logical) 1;
49
+ }
50
+ return (lapack_logical) 0;
51
+ }
@@ -77,6 +77,11 @@ extern "C" {
77
77
  static VALUE nm_lapacke_lapacke_potrs(VALUE self, VALUE order, VALUE uplo, VALUE n, VALUE nrhs, VALUE a, VALUE lda, VALUE b, VALUE ldb);
78
78
  static VALUE nm_lapacke_lapacke_potri(VALUE self, VALUE order, VALUE uplo, VALUE n, VALUE a, VALUE lda);
79
79
 
80
+ static VALUE nm_lapacke_lapacke_geqrf(VALUE self, VALUE order, VALUE m, VALUE n, VALUE a, VALUE lda, VALUE tau);
81
+ static VALUE nm_lapacke_lapacke_ormqr(VALUE self, VALUE order, VALUE side, VALUE trans, VALUE m, VALUE n, VALUE k, VALUE a, VALUE lda, VALUE tau, VALUE c, VALUE ldc);
82
+ static VALUE nm_lapacke_lapacke_unmqr(VALUE self, VALUE order, VALUE side, VALUE trans, VALUE m, VALUE n, VALUE k, VALUE a, VALUE lda, VALUE tau, VALUE c, VALUE ldc);
83
+
84
+
80
85
  static VALUE nm_lapacke_lapacke_gesvd(VALUE self, VALUE order, VALUE jobu, VALUE jobvt, VALUE m, VALUE n, VALUE a, VALUE lda, VALUE s, VALUE u, VALUE ldu, VALUE vt, VALUE ldvt, VALUE superb);
81
86
  static VALUE nm_lapacke_lapacke_gesdd(VALUE self, VALUE order, VALUE jobz, VALUE m, VALUE n, VALUE a, VALUE lda, VALUE s, VALUE u, VALUE ldu, VALUE vt, VALUE ldvt);
82
87
  static VALUE nm_lapacke_lapacke_geev(VALUE self, VALUE order, VALUE jobvl, VALUE jobvr, VALUE n, VALUE a, VALUE lda, VALUE w, VALUE wi, VALUE vl, VALUE ldvl, VALUE vr, VALUE ldvr);
@@ -121,6 +126,10 @@ void nm_math_init_lapack() {
121
126
  rb_define_singleton_method(cNMatrix_LAPACKE_LAPACK, "lapacke_potrs", (METHOD)nm_lapacke_lapacke_potrs, 8);
122
127
  rb_define_singleton_method(cNMatrix_LAPACKE_LAPACK, "lapacke_potri", (METHOD)nm_lapacke_lapacke_potri, 5);
123
128
 
129
+ rb_define_singleton_method(cNMatrix_LAPACKE_LAPACK, "lapacke_geqrf", (METHOD)nm_lapacke_lapacke_geqrf, 6);
130
+ rb_define_singleton_method(cNMatrix_LAPACKE_LAPACK, "lapacke_ormqr", (METHOD)nm_lapacke_lapacke_ormqr, 11);
131
+ rb_define_singleton_method(cNMatrix_LAPACKE_LAPACK, "lapacke_unmqr", (METHOD)nm_lapacke_lapacke_unmqr, 11);
132
+
124
133
  rb_define_singleton_method(cNMatrix_LAPACKE_LAPACK, "lapacke_gesvd", (METHOD)nm_lapacke_lapacke_gesvd, 13);
125
134
  rb_define_singleton_method(cNMatrix_LAPACKE_LAPACK, "lapacke_gesdd", (METHOD)nm_lapacke_lapacke_gesdd, 11);
126
135
  rb_define_singleton_method(cNMatrix_LAPACKE_LAPACK, "lapacke_geev", (METHOD)nm_lapacke_lapacke_geev, 12);
@@ -311,11 +320,11 @@ static VALUE nm_lapacke_cblas_nrm2(VALUE self, VALUE n, VALUE x, VALUE incx) {
311
320
 
312
321
  static void (*ttable[nm::NUM_DTYPES])(const int N, const void* X, const int incX, void* sum) = {
313
322
  NULL, NULL, NULL, NULL, NULL, // no help for integers
314
- nm::math::lapacke::cblas_nrm2<float32_t,float32_t>,
315
- nm::math::lapacke::cblas_nrm2<float64_t,float64_t>,
316
- nm::math::lapacke::cblas_nrm2<float32_t,nm::Complex64>,
317
- nm::math::lapacke::cblas_nrm2<float64_t,nm::Complex128>,
318
- nm::math::lapacke::cblas_nrm2<nm::RubyObject,nm::RubyObject>
323
+ nm::math::lapacke::cblas_nrm2<float32_t>,
324
+ nm::math::lapacke::cblas_nrm2<float64_t>,
325
+ nm::math::lapacke::cblas_nrm2<nm::Complex64>,
326
+ nm::math::lapacke::cblas_nrm2<nm::Complex128>,
327
+ nm::math::lapacke::cblas_nrm2<nm::RubyObject>
319
328
  };
320
329
 
321
330
  nm::dtype_t dtype = NM_DTYPE(x);
@@ -360,16 +369,16 @@ static VALUE nm_lapacke_cblas_nrm2(VALUE self, VALUE n, VALUE x, VALUE incx) {
360
369
  static VALUE nm_lapacke_cblas_asum(VALUE self, VALUE n, VALUE x, VALUE incx) {
361
370
 
362
371
  static void (*ttable[nm::NUM_DTYPES])(const int N, const void* X, const int incX, void* sum) = {
363
- nm::math::lapacke::cblas_asum<uint8_t,uint8_t>,
364
- nm::math::lapacke::cblas_asum<int8_t,int8_t>,
365
- nm::math::lapacke::cblas_asum<int16_t,int16_t>,
366
- nm::math::lapacke::cblas_asum<int32_t,int32_t>,
367
- nm::math::lapacke::cblas_asum<int64_t,int64_t>,
368
- nm::math::lapacke::cblas_asum<float32_t,float32_t>,
369
- nm::math::lapacke::cblas_asum<float64_t,float64_t>,
370
- nm::math::lapacke::cblas_asum<float32_t,nm::Complex64>,
371
- nm::math::lapacke::cblas_asum<float64_t,nm::Complex128>,
372
- nm::math::lapacke::cblas_asum<nm::RubyObject,nm::RubyObject>
372
+ nm::math::lapacke::cblas_asum<uint8_t>,
373
+ nm::math::lapacke::cblas_asum<int8_t>,
374
+ nm::math::lapacke::cblas_asum<int16_t>,
375
+ nm::math::lapacke::cblas_asum<int32_t>,
376
+ nm::math::lapacke::cblas_asum<int64_t>,
377
+ nm::math::lapacke::cblas_asum<float32_t>,
378
+ nm::math::lapacke::cblas_asum<float64_t>,
379
+ nm::math::lapacke::cblas_asum<nm::Complex64>,
380
+ nm::math::lapacke::cblas_asum<nm::Complex128>,
381
+ nm::math::lapacke::cblas_asum<nm::RubyObject>
373
382
  };
374
383
 
375
384
  nm::dtype_t dtype = NM_DTYPE(x);
@@ -647,7 +656,7 @@ static VALUE nm_lapacke_lapacke_getri(VALUE self, VALUE order, VALUE n, VALUE a,
647
656
 
648
657
  // Allocate the C version of the pivot index array
649
658
  int* ipiv_;
650
- if (TYPE(ipiv) != T_ARRAY) {
659
+ if (!RB_TYPE_P(ipiv, T_ARRAY)) {
651
660
  rb_raise(rb_eArgError, "ipiv must be of type Array");
652
661
  } else {
653
662
  ipiv_ = NM_ALLOCA_N(int, RARRAY_LEN(ipiv));
@@ -739,7 +748,7 @@ static VALUE nm_lapacke_lapacke_getrs(VALUE self, VALUE order, VALUE trans, VALU
739
748
 
740
749
  // Allocate the C version of the pivot index array
741
750
  int* ipiv_;
742
- if (TYPE(ipiv) != T_ARRAY) {
751
+ if (!RB_TYPE_P(ipiv, T_ARRAY)) {
743
752
  rb_raise(rb_eArgError, "ipiv must be of type Array");
744
753
  } else {
745
754
  ipiv_ = NM_ALLOCA_N(int, RARRAY_LEN(ipiv));
@@ -963,5 +972,128 @@ static VALUE nm_lapacke_lapacke_geev(VALUE self, VALUE order, VALUE jobvl, VALUE
963
972
  }
964
973
  }
965
974
 
975
+ /*
976
+ * GEQRF calculates the QR factorization for an MxN real or complex matrix.
977
+ *
978
+ * The QR factorization is A = QR, where Q is orthogonal and R is Upper Triangular
979
+ * +A+ is overwritten with the elements of R and Q with Q being represented by the
980
+ * elements below A's diagonal and an array of scalar factors in the output NMatrix.
981
+ *
982
+ * The matrix Q is represented as a product of elementary reflectors
983
+ * Q = H(1) H(2) . . . H(k), where k = min(m,n).
984
+ *
985
+ * Each H(i) has the form
986
+ *
987
+ * H(i) = I - tau * v * v'
988
+ *
989
+ * http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html
990
+ */
991
+
992
+ static VALUE nm_lapacke_lapacke_geqrf(VALUE self, VALUE order, VALUE m, VALUE n, VALUE a, VALUE lda, VALUE tau) {
993
+ static int (*ttable[nm::NUM_DTYPES])(const enum CBLAS_ORDER order, const int m, const int n, void* a, const int lda, void* tau) = {
994
+ NULL, NULL, NULL, NULL, NULL,
995
+ nm::math::lapacke::lapacke_geqrf<float>,
996
+ nm::math::lapacke::lapacke_geqrf<double>,
997
+ nm::math::lapacke::lapacke_geqrf<nm::Complex64>,
998
+ nm::math::lapacke::lapacke_geqrf<nm::Complex128>,
999
+ NULL
1000
+ };
1001
+
1002
+ int M = FIX2INT(m),
1003
+ N = FIX2INT(n);
1004
+
1005
+ nm::dtype_t dtype = NM_DTYPE(a);
1006
+
1007
+ if (!ttable[dtype]) {
1008
+ rb_raise(nm_eDataTypeError, "this matrix operation is undefined for integer matrices");
1009
+ return Qfalse;
1010
+ } else {
1011
+ int info = ttable[dtype](blas_order_sym(order), M, N, NM_STORAGE_DENSE(a)->elements, FIX2INT(lda), NM_STORAGE_DENSE(tau)->elements);
1012
+ return INT2FIX(info);
1013
+ }
1014
+ }
1015
+
1016
+ /* ORMQR calculates the orthogonal matrix Q from TAU and A after calling GEQRF on a real matrix
1017
+ *
1018
+ *
1019
+ * The matrix Q is represented as a product of elementary reflectors
1020
+ * Q = H(1) H(2) . . . H(k), where k = min(m,n).
1021
+ *
1022
+ * Each H(i) has the form
1023
+ *
1024
+ * H(i) = I - tau * v * v'
1025
+ *
1026
+ * v is contained in the matrix passed to GEQRF
1027
+ *
1028
+ * www.netlib.org/lapack/explore-html/da/d82/dormqr_8f.html
1029
+ */
1030
+
1031
+ static VALUE nm_lapacke_lapacke_ormqr(VALUE self, VALUE order, VALUE side, VALUE trans, VALUE m, VALUE n, VALUE k, VALUE a, VALUE lda, VALUE tau, VALUE c, VALUE ldc) {
1032
+ static int (*ttable[nm::NUM_DTYPES])(const enum CBLAS_ORDER order, char side, char trans, const int m, const int n, const int k, void* a, const int lda, void* tau, void* c, const int ldc) = {
1033
+ NULL, NULL, NULL, NULL, NULL,
1034
+ nm::math::lapacke::lapacke_ormqr<float>,
1035
+ nm::math::lapacke::lapacke_ormqr<double>,
1036
+ NULL,NULL,NULL // no complex or Ruby objects
1037
+ };
1038
+
1039
+ int M = FIX2INT(m),
1040
+ N = FIX2INT(n),
1041
+ K = FIX2INT(k);
1042
+
1043
+ char SIDE = lapacke_side_sym(side),
1044
+ TRANS = lapacke_transpose_sym(trans);
1045
+
1046
+ nm::dtype_t dtype = NM_DTYPE(a);
1047
+
1048
+
1049
+ if (!ttable[dtype]) {
1050
+ rb_raise(nm_eDataTypeError, "this matrix operation is undefined for integer matrices");
1051
+ return Qfalse;
1052
+ } else {
1053
+ int info = ttable[dtype](blas_order_sym(order), SIDE, TRANS, M, N, K, NM_STORAGE_DENSE(a)->elements, FIX2INT(lda), NM_STORAGE_DENSE(tau)->elements, NM_STORAGE_DENSE(c)->elements, FIX2INT(ldc));
1054
+ return INT2FIX(info);
1055
+ }
1056
+ }
1057
+
1058
+ /* UNMQR calculates the orthogonal matrix Q from TAU and A after calling GEQRF on a complex matrix.
1059
+ *
1060
+ *
1061
+ * The matrix Q is represented as a product of elementary reflectors
1062
+ * Q = H(1) H(2) . . . H(k), where k = min(m,n).
1063
+ *
1064
+ * Each H(i) has the form
1065
+ *
1066
+ * H(i) = I - tau * v * v'
1067
+ *
1068
+ * v is contained in the matrix passed to GEQRF
1069
+ *
1070
+ * http://www.netlib.org/lapack/explore-html/d5/d65/zunmqr_8f.html
1071
+ */
1072
+
1073
+ static VALUE nm_lapacke_lapacke_unmqr(VALUE self, VALUE order, VALUE side, VALUE trans, VALUE m, VALUE n, VALUE k, VALUE a, VALUE lda, VALUE tau, VALUE c, VALUE ldc) {
1074
+ static int (*ttable[nm::NUM_DTYPES])(const enum CBLAS_ORDER order, char side, char trans, const int m, const int n, const int k, void* a, const int lda, void* tau, void* c, const int ldc) = {
1075
+ NULL, NULL, NULL, NULL, NULL,NULL,NULL, // no non-complex ops
1076
+ nm::math::lapacke::lapacke_unmqr<nm::Complex64>,
1077
+ nm::math::lapacke::lapacke_unmqr<nm::Complex128>,
1078
+ NULL // no Ruby objects
1079
+ };
1080
+
1081
+ int M = FIX2INT(m),
1082
+ N = FIX2INT(n),
1083
+ K = FIX2INT(k);
1084
+
1085
+ char SIDE = lapacke_side_sym(side),
1086
+ TRANS = lapacke_transpose_sym(trans);
1087
+
1088
+ nm::dtype_t dtype = NM_DTYPE(a);
1089
+
1090
+ if (!ttable[dtype]) {
1091
+ rb_raise(nm_eDataTypeError, "this matrix operation is valid only for complex datatypes");
1092
+ return Qfalse;
1093
+ } else {
1094
+ int info = ttable[dtype](blas_order_sym(order), SIDE, TRANS, M, N, K, NM_STORAGE_DENSE(a)->elements, FIX2INT(lda), NM_STORAGE_DENSE(tau)->elements, NM_STORAGE_DENSE(c)->elements, FIX2INT(ldc));
1095
+ return INT2FIX(info);
1096
+ }
1097
+ }
966
1098
 
967
1099
  }