nmatrix-lapacke 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
  }