pnmatrix 1.2.4

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 (111) hide show
  1. checksums.yaml +7 -0
  2. data/ext/nmatrix/binary_format.txt +53 -0
  3. data/ext/nmatrix/data/complex.h +388 -0
  4. data/ext/nmatrix/data/data.cpp +274 -0
  5. data/ext/nmatrix/data/data.h +651 -0
  6. data/ext/nmatrix/data/meta.h +64 -0
  7. data/ext/nmatrix/data/ruby_object.h +386 -0
  8. data/ext/nmatrix/extconf.rb +70 -0
  9. data/ext/nmatrix/math/asum.h +99 -0
  10. data/ext/nmatrix/math/cblas_enums.h +36 -0
  11. data/ext/nmatrix/math/cblas_templates_core.h +507 -0
  12. data/ext/nmatrix/math/gemm.h +241 -0
  13. data/ext/nmatrix/math/gemv.h +178 -0
  14. data/ext/nmatrix/math/getrf.h +255 -0
  15. data/ext/nmatrix/math/getrs.h +121 -0
  16. data/ext/nmatrix/math/imax.h +82 -0
  17. data/ext/nmatrix/math/laswp.h +165 -0
  18. data/ext/nmatrix/math/long_dtype.h +62 -0
  19. data/ext/nmatrix/math/magnitude.h +54 -0
  20. data/ext/nmatrix/math/math.h +751 -0
  21. data/ext/nmatrix/math/nrm2.h +165 -0
  22. data/ext/nmatrix/math/rot.h +117 -0
  23. data/ext/nmatrix/math/rotg.h +106 -0
  24. data/ext/nmatrix/math/scal.h +71 -0
  25. data/ext/nmatrix/math/trsm.h +336 -0
  26. data/ext/nmatrix/math/util.h +162 -0
  27. data/ext/nmatrix/math.cpp +1368 -0
  28. data/ext/nmatrix/nm_memory.h +60 -0
  29. data/ext/nmatrix/nmatrix.cpp +285 -0
  30. data/ext/nmatrix/nmatrix.h +476 -0
  31. data/ext/nmatrix/ruby_constants.cpp +151 -0
  32. data/ext/nmatrix/ruby_constants.h +106 -0
  33. data/ext/nmatrix/ruby_nmatrix.c +3130 -0
  34. data/ext/nmatrix/storage/common.cpp +77 -0
  35. data/ext/nmatrix/storage/common.h +183 -0
  36. data/ext/nmatrix/storage/dense/dense.cpp +1096 -0
  37. data/ext/nmatrix/storage/dense/dense.h +129 -0
  38. data/ext/nmatrix/storage/list/list.cpp +1628 -0
  39. data/ext/nmatrix/storage/list/list.h +138 -0
  40. data/ext/nmatrix/storage/storage.cpp +730 -0
  41. data/ext/nmatrix/storage/storage.h +99 -0
  42. data/ext/nmatrix/storage/yale/class.h +1139 -0
  43. data/ext/nmatrix/storage/yale/iterators/base.h +143 -0
  44. data/ext/nmatrix/storage/yale/iterators/iterator.h +131 -0
  45. data/ext/nmatrix/storage/yale/iterators/row.h +450 -0
  46. data/ext/nmatrix/storage/yale/iterators/row_stored.h +140 -0
  47. data/ext/nmatrix/storage/yale/iterators/row_stored_nd.h +169 -0
  48. data/ext/nmatrix/storage/yale/iterators/stored_diagonal.h +124 -0
  49. data/ext/nmatrix/storage/yale/math/transpose.h +110 -0
  50. data/ext/nmatrix/storage/yale/yale.cpp +2074 -0
  51. data/ext/nmatrix/storage/yale/yale.h +203 -0
  52. data/ext/nmatrix/types.h +55 -0
  53. data/ext/nmatrix/util/io.cpp +279 -0
  54. data/ext/nmatrix/util/io.h +115 -0
  55. data/ext/nmatrix/util/sl_list.cpp +627 -0
  56. data/ext/nmatrix/util/sl_list.h +144 -0
  57. data/ext/nmatrix/util/util.h +78 -0
  58. data/lib/nmatrix/blas.rb +378 -0
  59. data/lib/nmatrix/cruby/math.rb +744 -0
  60. data/lib/nmatrix/enumerate.rb +253 -0
  61. data/lib/nmatrix/homogeneous.rb +241 -0
  62. data/lib/nmatrix/io/fortran_format.rb +138 -0
  63. data/lib/nmatrix/io/harwell_boeing.rb +221 -0
  64. data/lib/nmatrix/io/market.rb +263 -0
  65. data/lib/nmatrix/io/point_cloud.rb +189 -0
  66. data/lib/nmatrix/jruby/decomposition.rb +24 -0
  67. data/lib/nmatrix/jruby/enumerable.rb +13 -0
  68. data/lib/nmatrix/jruby/error.rb +4 -0
  69. data/lib/nmatrix/jruby/math.rb +501 -0
  70. data/lib/nmatrix/jruby/nmatrix_java.rb +840 -0
  71. data/lib/nmatrix/jruby/operators.rb +283 -0
  72. data/lib/nmatrix/jruby/slice.rb +264 -0
  73. data/lib/nmatrix/lapack_core.rb +181 -0
  74. data/lib/nmatrix/lapack_plugin.rb +44 -0
  75. data/lib/nmatrix/math.rb +953 -0
  76. data/lib/nmatrix/mkmf.rb +100 -0
  77. data/lib/nmatrix/monkeys.rb +137 -0
  78. data/lib/nmatrix/nmatrix.rb +1172 -0
  79. data/lib/nmatrix/rspec.rb +75 -0
  80. data/lib/nmatrix/shortcuts.rb +1163 -0
  81. data/lib/nmatrix/version.rb +39 -0
  82. data/lib/nmatrix/yale_functions.rb +118 -0
  83. data/lib/nmatrix.rb +28 -0
  84. data/spec/00_nmatrix_spec.rb +892 -0
  85. data/spec/01_enum_spec.rb +196 -0
  86. data/spec/02_slice_spec.rb +407 -0
  87. data/spec/03_nmatrix_monkeys_spec.rb +80 -0
  88. data/spec/2x2_dense_double.mat +0 -0
  89. data/spec/4x4_sparse.mat +0 -0
  90. data/spec/4x5_dense.mat +0 -0
  91. data/spec/blas_spec.rb +215 -0
  92. data/spec/elementwise_spec.rb +311 -0
  93. data/spec/homogeneous_spec.rb +100 -0
  94. data/spec/io/fortran_format_spec.rb +88 -0
  95. data/spec/io/harwell_boeing_spec.rb +98 -0
  96. data/spec/io/test.rua +9 -0
  97. data/spec/io_spec.rb +159 -0
  98. data/spec/lapack_core_spec.rb +482 -0
  99. data/spec/leakcheck.rb +16 -0
  100. data/spec/math_spec.rb +1363 -0
  101. data/spec/nmatrix_yale_resize_test_associations.yaml +2802 -0
  102. data/spec/nmatrix_yale_spec.rb +286 -0
  103. data/spec/rspec_monkeys.rb +56 -0
  104. data/spec/rspec_spec.rb +35 -0
  105. data/spec/shortcuts_spec.rb +474 -0
  106. data/spec/slice_set_spec.rb +162 -0
  107. data/spec/spec_helper.rb +172 -0
  108. data/spec/stat_spec.rb +214 -0
  109. data/spec/test.pcd +20 -0
  110. data/spec/utm5940.mtx +83844 -0
  111. metadata +295 -0
@@ -0,0 +1,144 @@
1
+ /////////////////////////////////////////////////////////////////////
2
+ // = NMatrix
3
+ //
4
+ // A linear algebra library for scientific computation in Ruby.
5
+ // NMatrix is part of SciRuby.
6
+ //
7
+ // NMatrix was originally inspired by and derived from NArray, by
8
+ // Masahiro Tanaka: http://narray.rubyforge.org
9
+ //
10
+ // == Copyright Information
11
+ //
12
+ // SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
13
+ // NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
14
+ //
15
+ // Please see LICENSE.txt for additional copyright notices.
16
+ //
17
+ // == Contributing
18
+ //
19
+ // By contributing source code to SciRuby, you agree to be bound by
20
+ // our Contributor Agreement:
21
+ //
22
+ // * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
23
+ //
24
+ // == sl_list.h
25
+ //
26
+ // Singly-linked list implementation used for List Storage.
27
+
28
+ #ifndef SL_LIST_H
29
+ #define SL_LIST_H
30
+
31
+
32
+ /*
33
+ * Standard Includes
34
+ */
35
+
36
+ #include <ruby.h>
37
+ #include <type_traits>
38
+ #include <cstdlib>
39
+
40
+ /*
41
+ * Project Includes
42
+ */
43
+
44
+ #include "types.h"
45
+
46
+ #include "data/data.h"
47
+
48
+ #include "nmatrix.h"
49
+
50
+ namespace nm { namespace list {
51
+
52
+ /*
53
+ * Macros
54
+ */
55
+
56
+ /*
57
+ * Types
58
+ */
59
+
60
+ /*
61
+ * Data
62
+ */
63
+
64
+
65
+ /*
66
+ * Functions
67
+ */
68
+
69
+ ////////////////
70
+ // Lifecycle //
71
+ ///////////////
72
+
73
+ LIST* create(void);
74
+ void del(LIST* list, size_t recursions);
75
+ void mark(LIST* list, size_t recursions);
76
+
77
+ ///////////////
78
+ // Accessors //
79
+ ///////////////
80
+
81
+ NODE* insert(LIST* list, bool replace, size_t key, void* val);
82
+ NODE* insert_copy(LIST *list, bool replace, size_t key, void *val, size_t size);
83
+ NODE* insert_first_node(LIST* list, size_t key, void* val, size_t val_size);
84
+ NODE* insert_first_list(LIST* list, size_t key, LIST* l);
85
+ NODE* insert_after(NODE* node, size_t key, void* val);
86
+ NODE* replace_insert_after(NODE* node, size_t key, void* val, bool copy, size_t copy_size);
87
+ void* remove(LIST* list, size_t key);
88
+ void* remove_by_node(LIST* list, NODE* prev, NODE* rm);
89
+ bool remove_recursive(LIST* list, const size_t* coords, const size_t* offset, const size_t* lengths, size_t r, const size_t& dim);
90
+ bool node_is_within_slice(NODE* n, size_t coord, size_t len);
91
+
92
+ template <typename Type>
93
+ inline NODE* insert_helper(LIST* list, NODE* node, size_t key, Type val) {
94
+ Type* val_mem = NM_ALLOC(Type);
95
+ *val_mem = val;
96
+
97
+ if (node == NULL) {
98
+ return insert(list, false, key, val_mem);
99
+
100
+ } else {
101
+ return insert_after(node, key, val_mem);
102
+ }
103
+ }
104
+
105
+ template <typename Type>
106
+ inline NODE* insert_helper(LIST* list, NODE* node, size_t key, Type* ptr) {
107
+ if (node == NULL) {
108
+ return insert(list, false, key, ptr);
109
+
110
+ } else {
111
+ return insert_after(node, key, ptr);
112
+ }
113
+ }
114
+
115
+ ///////////
116
+ // Tests //
117
+ ///////////
118
+
119
+
120
+ /////////////
121
+ // Utility //
122
+ /////////////
123
+
124
+ NODE* find(LIST* list, size_t key);
125
+ NODE* find_preceding_from_node(NODE* prev, size_t key);
126
+ NODE* find_preceding_from_list(LIST* l, size_t key);
127
+ NODE* find_nearest(LIST* list, size_t key);
128
+ NODE* find_nearest_from(NODE* prev, size_t key);
129
+
130
+ /////////////////////////
131
+ // Copying and Casting //
132
+ /////////////////////////
133
+
134
+ template <typename LDType, typename RDType>
135
+ void cast_copy_contents(LIST* lhs, const LIST* rhs, size_t recursions);
136
+
137
+ }} // end of namespace nm::list
138
+
139
+ extern "C" {
140
+ void nm_list_cast_copy_contents(LIST* lhs, const LIST* rhs, nm::dtype_t lhs_dtype, nm::dtype_t rhs_dtype, size_t recursions);
141
+ VALUE nm_list_copy_to_hash(const LIST* l, const nm::dtype_t dtype, size_t recursions, VALUE default_value);
142
+ } // end of extern "C" block
143
+
144
+ #endif // SL_LIST_H
@@ -0,0 +1,78 @@
1
+ /////////////////////////////////////////////////////////////////////
2
+ // = NMatrix
3
+ //
4
+ // A linear algebra library for scientific computation in Ruby.
5
+ // NMatrix is part of SciRuby.
6
+ //
7
+ // NMatrix was originally inspired by and derived from NArray, by
8
+ // Masahiro Tanaka: http://narray.rubyforge.org
9
+ //
10
+ // == Copyright Information
11
+ //
12
+ // SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
13
+ // NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
14
+ //
15
+ // Please see LICENSE.txt for additional copyright notices.
16
+ //
17
+ // == Contributing
18
+ //
19
+ // By contributing source code to SciRuby, you agree to be bound by
20
+ // our Contributor Agreement:
21
+ //
22
+ // * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
23
+ //
24
+ // == util.h
25
+ //
26
+ // Header file for utility functions and data.
27
+
28
+ #ifndef UTIL_H
29
+ #define UTIL_H
30
+
31
+ /*
32
+ * Standard Includes
33
+ */
34
+
35
+ /*
36
+ * Project Includes
37
+ */
38
+
39
+ #include "types.h"
40
+
41
+ /*
42
+ * Macros
43
+ */
44
+
45
+ /*
46
+ * Types
47
+ */
48
+
49
+ /*
50
+ * Data
51
+ */
52
+
53
+ /*
54
+ * Functions
55
+ */
56
+ namespace nm {
57
+ template <typename Type>
58
+ inline Type gcf(Type x, Type y) {
59
+ Type t;
60
+
61
+ if (x < 0) x = -x;
62
+ if (y < 0) y = -y;
63
+
64
+ if (x == 0) return y;
65
+ if (y == 0) return x;
66
+
67
+ while (x > 0) {
68
+ t = x;
69
+ x = y % x;
70
+ y = t;
71
+ }
72
+
73
+ return y;
74
+ }
75
+ } // end of namespace nm
76
+
77
+
78
+ #endif // UTIL_H
@@ -0,0 +1,378 @@
1
+ #--
2
+ # = NMatrix
3
+ #
4
+ # A linear algebra library for scientific computation in Ruby.
5
+ # NMatrix is part of SciRuby.
6
+ #
7
+ # NMatrix was originally inspired by and derived from NArray, by
8
+ # Masahiro Tanaka: http://narray.rubyforge.org
9
+ #
10
+ # == Copyright Information
11
+ #
12
+ # SciRuby is Copyright (c) 2010 - 2016, Ruby Science Foundation
13
+ # NMatrix is Copyright (c) 2012 - 2016, John Woods and the Ruby Science Foundation
14
+ #
15
+ # Please see LICENSE.txt for additional copyright notices.
16
+ #
17
+ # == Contributing
18
+ #
19
+ # By contributing source code to SciRuby, you agree to be bound by
20
+ # our Contributor Agreement:
21
+ #
22
+ # * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
23
+ #
24
+ # == blas.rb
25
+ #
26
+ # This file contains the safer accessors for the BLAS functions
27
+ # supported by NMatrix.
28
+ #++
29
+
30
+ module NMatrix::BLAS
31
+
32
+ #Add functions from C extension to main BLAS module
33
+ class << self
34
+ if jruby?
35
+ # BLAS functionalities for JRuby need to be implemented
36
+ else
37
+ NMatrix::Internal::BLAS.singleton_methods.each do |m|
38
+ define_method m, NMatrix::Internal::BLAS.method(m).to_proc
39
+ end
40
+ end
41
+ end
42
+
43
+ class << self
44
+ #
45
+ # call-seq:
46
+ # gemm(a, b) -> NMatrix
47
+ # gemm(a, b, c) -> NMatrix
48
+ # gemm(a, b, c, alpha, beta) -> NMatrix
49
+ #
50
+ # Updates the value of C via the matrix multiplication
51
+ # C = (alpha * A * B) + (beta * C)
52
+ # where +alpha+ and +beta+ are scalar values.
53
+ #
54
+ # * *Arguments* :
55
+ # - +a+ -> Matrix A.
56
+ # - +b+ -> Matrix B.
57
+ # - +c+ -> Matrix C.
58
+ # - +alpha+ -> A scalar value that multiplies A * B.
59
+ # - +beta+ -> A scalar value that multiplies C.
60
+ # - +transpose_a+ ->
61
+ # - +transpose_b+ ->
62
+ # - +m+ ->
63
+ # - +n+ ->
64
+ # - +k+ ->
65
+ # - +lda+ ->
66
+ # - +ldb+ ->
67
+ # - +ldc+ ->
68
+ # * *Returns* :
69
+ # - A NMatrix equal to (alpha * A * B) + (beta * C).
70
+ # * *Raises* :
71
+ # - +ArgumentError+ -> +a+ and +b+ must be dense matrices.
72
+ # - +ArgumentError+ -> +c+ must be +nil+ or a dense matrix.
73
+ # - +ArgumentError+ -> The dtype of the matrices must be equal.
74
+ #
75
+ def gemm(a, b, c = nil, alpha = 1.0, beta = 0.0,
76
+ transpose_a = false, transpose_b = false, m = nil,
77
+ n = nil, k = nil, lda = nil, ldb = nil, ldc = nil)
78
+
79
+ raise(ArgumentError, 'Expected dense NMatrices as first two arguments.') \
80
+ unless a.is_a?(NMatrix) and b.is_a? \
81
+ (NMatrix) and a.stype == :dense and b.stype == :dense
82
+
83
+ raise(ArgumentError, 'Expected nil or dense NMatrix as third argument.') \
84
+ unless c.nil? or (c.is_a?(NMatrix) \
85
+ and c.stype == :dense)
86
+ raise(ArgumentError, 'NMatrix dtype mismatch.') \
87
+ unless a.dtype == b.dtype and (c ? a.dtype == c.dtype : true)
88
+
89
+ # First, set m, n, and k, which depend on whether we're taking the
90
+ # transpose of a and b.
91
+ if c
92
+ m ||= c.shape[0]
93
+ n ||= c.shape[1]
94
+ k ||= transpose_a ? a.shape[0] : a.shape[1]
95
+
96
+ else
97
+ if transpose_a
98
+ # Either :transpose or :complex_conjugate.
99
+ m ||= a.shape[1]
100
+ k ||= a.shape[0]
101
+
102
+ else
103
+ # No transpose.
104
+ m ||= a.shape[0]
105
+ k ||= a.shape[1]
106
+ end
107
+
108
+ n ||= transpose_b ? b.shape[0] : b.shape[1]
109
+ c = NMatrix.new([m, n], dtype: a.dtype)
110
+ end
111
+
112
+ # I think these are independent of whether or not a transpose occurs.
113
+ lda ||= a.shape[1]
114
+ ldb ||= b.shape[1]
115
+ ldc ||= c.shape[1]
116
+
117
+ # NM_COMPLEX64 and NM_COMPLEX128 both require complex alpha and beta.
118
+ if a.dtype == :complex64 or a.dtype == :complex128
119
+ alpha = Complex(1.0, 0.0) if alpha == 1.0
120
+ beta = Complex(0.0, 0.0) if beta == 0.0
121
+ end
122
+
123
+ # For argument descriptions, see: http://www.netlib.org/blas/dgemm.f
124
+ ::NMatrix::BLAS.cblas_gemm(:row, transpose_a, transpose_b,
125
+ m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
126
+
127
+ return c
128
+ end
129
+
130
+ #
131
+ # call-seq:
132
+ # gemv(a, x) -> NMatrix
133
+ # gemv(a, x, y) -> NMatrix
134
+ # gemv(a, x, y, alpha, beta) -> NMatrix
135
+ #
136
+ # Implements matrix-vector product via
137
+ # y = (alpha * A * x) + (beta * y)
138
+ # where +alpha+ and +beta+ are scalar values.
139
+ #
140
+ # * *Arguments* :
141
+ # - +a+ -> Matrix A.
142
+ # - +x+ -> Vector x.
143
+ # - +y+ -> Vector y.
144
+ # - +alpha+ -> A scalar value that multiplies A * x.
145
+ # - +beta+ -> A scalar value that multiplies y.
146
+ # - +transpose_a+ ->
147
+ # - +m+ ->
148
+ # - +n+ ->
149
+ # - +lda+ ->
150
+ # - +incx+ ->
151
+ # - +incy+ ->
152
+ # * *Returns* :
153
+ # -
154
+ # * *Raises* :
155
+ # - ++ ->
156
+ #
157
+ def gemv(a, x, y = nil, alpha = 1.0, beta = 0.0,
158
+ transpose_a = false, m = nil, n = nil, lda = nil,
159
+ incx = nil, incy = nil)
160
+ raise(ArgumentError, 'Expected dense NMatrices as first two arguments.') \
161
+ unless a.is_a?(NMatrix) and x.is_a?(NMatrix) and \
162
+ a.stype == :dense and x.stype == :dense
163
+
164
+ raise(ArgumentError, 'Expected nil or dense NMatrix as third argument.') \
165
+ unless y.nil? or (y.is_a?(NMatrix) and y.stype == :dense)
166
+
167
+ raise(ArgumentError, 'NMatrix dtype mismatch.') \
168
+ unless a.dtype == x.dtype and (y ? a.dtype == y.dtype : true)
169
+
170
+ m ||= transpose_a == :transpose ? a.shape[1] : a.shape[0]
171
+ n ||= transpose_a == :transpose ? a.shape[0] : a.shape[1]
172
+ raise(ArgumentError, "dimensions don't match") \
173
+ unless x.shape[0] == n && x.shape[1] == 1
174
+
175
+ if y
176
+ raise(ArgumentError, "dimensions don't match") \
177
+ unless y.shape[0] == m && y.shape[1] == 1
178
+ else
179
+ y = NMatrix.new([m,1], dtype: a.dtype)
180
+ end
181
+
182
+ lda ||= a.shape[1]
183
+ incx ||= 1
184
+ incy ||= 1
185
+
186
+ ::NMatrix::BLAS.cblas_gemv(transpose_a, m, n,
187
+ alpha, a, lda, x, incx, beta, y, incy)
188
+
189
+ return y
190
+ end
191
+
192
+ #
193
+ # call-seq:
194
+ # rot(x, y, c, s) -> [NMatrix, NMatrix]
195
+ #
196
+ # Apply plane rotation.
197
+ #
198
+ # * *Arguments* :
199
+ # - +x+ -> NMatrix
200
+ # - +y+ -> NMatrix
201
+ # - +c+ -> cosine of the angle of rotation
202
+ # - +s+ -> sine of the angle of rotation
203
+ # - +incx+ -> stride of NMatrix +x+
204
+ # - +incy+ -> stride of NMatrix +y+
205
+ # - +n+ -> number of elements to consider in x and y
206
+ # - +in_place+ -> true if it's okay to modify the supplied
207
+ # +x+ and +y+ parameters directly;
208
+ # false if not. Default is false.
209
+ # * *Returns* :
210
+ # - Array with the results, in the format [xx, yy]
211
+ # * *Raises* :
212
+ # - +ArgumentError+ -> Expected dense NMatrices as first two arguments.
213
+ # - +ArgumentError+ -> NMatrix dtype mismatch.
214
+ # - +ArgumentError+ -> Need to supply n for non-standard incx,
215
+ # incy values.
216
+ #
217
+ def rot(x, y, c, s, incx = 1, incy = 1, n = nil, in_place=false)
218
+ raise(ArgumentError, 'Expected dense NMatrices as first two arguments.') \
219
+ unless x.is_a?(NMatrix) and y.is_a?(NMatrix) \
220
+ and x.stype == :dense and y.stype == :dense
221
+
222
+ raise(ArgumentError, 'NMatrix dtype mismatch.') \
223
+ unless x.dtype == y.dtype
224
+
225
+ raise(ArgumentError, 'Need to supply n for non-standard incx, incy values') \
226
+ if n.nil? && incx != 1 && incx != -1 && incy != 1 && incy != -1
227
+
228
+ n ||= [x.size/incx.abs, y.size/incy.abs].min
229
+
230
+ if in_place
231
+ ::NMatrix::BLAS.cblas_rot(n, x, incx, y, incy, c, s)
232
+ return [x,y]
233
+ else
234
+ xx = x.clone
235
+ yy = y.clone
236
+
237
+ ::NMatrix::BLAS.cblas_rot(n, xx, incx, yy, incy, c, s)
238
+
239
+ return [xx,yy]
240
+ end
241
+ end
242
+
243
+
244
+ #
245
+ # call-seq:
246
+ # rot!(x, y, c, s) -> [NMatrix, NMatrix]
247
+ #
248
+ # Apply plane rotation directly to +x+ and +y+.
249
+ #
250
+ # See rot for arguments.
251
+ def rot!(x, y, c, s, incx = 1, incy = 1, n = nil)
252
+ rot(x,y,c,s,incx,incy,n,true)
253
+ end
254
+
255
+
256
+ #
257
+ # call-seq:
258
+ # rotg(ab) -> [Numeric, Numeric]
259
+ #
260
+ # Apply givens plane rotation to the coordinates (a,b),
261
+ # returning the cosine and sine of the angle theta.
262
+ #
263
+ # Since the givens rotation includes a square root,
264
+ # integers are disallowed.
265
+ #
266
+ # * *Arguments* :
267
+ # - +ab+ -> NMatrix with two elements
268
+ # * *Returns* :
269
+ # - Array with the results, in the format [cos(theta), sin(theta)]
270
+ # * *Raises* :
271
+ # - +ArgumentError+ -> Expected dense NMatrix of size 2
272
+ #
273
+ def rotg(ab)
274
+ raise(ArgumentError, "Expected dense NMatrix of shape [2,1] or [1,2]") \
275
+ unless ab.is_a?(NMatrix) && ab.stype == :dense && ab.size == 2
276
+
277
+ ::NMatrix::BLAS.cblas_rotg(ab)
278
+ end
279
+
280
+
281
+ #
282
+ # call-seq:
283
+ # asum(x, incx, n) -> Numeric
284
+ #
285
+ # Calculate the sum of absolute values of the entries of a
286
+ # vector +x+ of size +n+
287
+ #
288
+ # * *Arguments* :
289
+ # - +x+ -> an NMatrix (will also allow an NMatrix,
290
+ # but will treat it as if it's a vector )
291
+ # - +incx+ -> the skip size (defaults to 1)
292
+ # - +n+ -> the size of +x+ (defaults to +x.size / incx+)
293
+ # * *Returns* :
294
+ # - The sum
295
+ # * *Raises* :
296
+ # - +ArgumentError+ -> Expected dense NMatrix for arg 0
297
+ # - +RangeError+ -> n out of range
298
+ #
299
+ def asum(x, incx = 1, n = nil)
300
+ n ||= x.size / incx
301
+ raise(ArgumentError, "Expected dense NMatrix for arg 0") \
302
+ unless x.is_a?(NMatrix)
303
+
304
+ raise(RangeError, "n out of range") \
305
+ if n*incx > x.size || n*incx <= 0 || n <= 0
306
+ ::NMatrix::BLAS.cblas_asum(n, x, incx)
307
+ end
308
+
309
+ #
310
+ # call-seq:
311
+ # nrm2(x, incx, n)
312
+ #
313
+ # Calculate the 2-norm of a vector +x+ of size +n+
314
+ #
315
+ # * *Arguments* :
316
+ # - +x+ -> an NMatrix (will also allow an
317
+ # NMatrix, but will treat it as if it's a vector )
318
+ # - +incx+ -> the skip size (defaults to 1)
319
+ # - +n+ -> the size of +x+ (defaults to +x.size / incx+)
320
+ # * *Returns* :
321
+ # - The 2-norm
322
+ # * *Raises* :
323
+ # - +ArgumentError+ -> Expected dense NMatrix for arg 0
324
+ # - +RangeError+ -> n out of range
325
+ #
326
+ def nrm2(x, incx = 1, n = nil)
327
+ n ||= x.size / incx
328
+ raise(ArgumentError, "Expected dense NMatrix for arg 0") \
329
+ unless x.is_a?(NMatrix)
330
+
331
+ raise(RangeError, "n out of range") \
332
+ if n*incx > x.size || n*incx <= 0 || n <= 0
333
+ ::NMatrix::BLAS.cblas_nrm2(n, x, incx)
334
+ end
335
+
336
+ #
337
+ # call-seq:
338
+ # scal(alpha, vector, incx, n)
339
+ #
340
+ # Scale a matrix by a given scaling factor
341
+ #
342
+ # * *Arguments* :
343
+ # - +alpha+ -> a scaling factor
344
+ # - +vector+ -> an NMatrix
345
+ # - +incx+ -> the skip size (defaults to 1)
346
+ # - +n+ -> the size of +x+ (defaults to +x.size / incx+)
347
+ # * *Returns* :
348
+ # - The scaling result
349
+ # * *Raises* :
350
+ # - +ArgumentError+ -> Expected dense NMatrix for arg 0
351
+ # - +RangeError+ -> n out of range
352
+ #
353
+ def scal(alpha, vector, incx=1, n=nil)
354
+ n ||= vector.size / incx
355
+ raise(ArgumentError, "Expected dense NMatrix for arg 0") unless vector.is_a?(NMatrix)
356
+ raise(RangeError, "n out of range") if n*incx > vector.size || n*incx <= 0 || n <= 0
357
+ ::NMatrix::BLAS.cblas_scal(n, alpha, vector, incx)
358
+ end
359
+
360
+ # The following are functions that used to be implemented in C, but
361
+ # now require nmatrix-atlas or nmatrix-lapcke to run properly, so we can just
362
+ # implemented their stubs in Ruby.
363
+ def cblas_trmm(order, side, uplo, trans_a, diag, m, n, alpha, a, lda, b, ldb)
364
+ raise(NotImplementedError,"cblas_trmm requires either the
365
+ nmatrix-lapacke or nmatrix-atlas gem")
366
+ end
367
+
368
+ def cblas_syrk(order, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
369
+ raise(NotImplementedError,"cblas_syrk requires either the
370
+ nmatrix-lapacke or nmatrix-atlas gem")
371
+ end
372
+
373
+ def cblas_herk(order, uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
374
+ raise(NotImplementedError,"cblas_herk requires either the
375
+ nmatrix-lapacke or nmatrix-atlas gem")
376
+ end
377
+ end
378
+ end