pnmatrix 1.2.4

Sign up to get free protection for your applications and to get access to all the features.
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