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,165 @@
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 - present, Ruby Science Foundation
13
+ // NMatrix is Copyright (c) 2012 - present, 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
+ // == nrm2.h
25
+ //
26
+ // CBLAS nrm2 function
27
+ //
28
+
29
+ /*
30
+ * Automatically Tuned Linear Algebra Software v3.8.4
31
+ * (C) Copyright 1999 R. Clint Whaley
32
+ *
33
+ * Redistribution and use in source and binary forms, with or without
34
+ * modification, are permitted provided that the following conditions
35
+ * are met:
36
+ * 1. Redistributions of source code must retain the above copyright
37
+ * notice, this list of conditions and the following disclaimer.
38
+ * 2. Redistributions in binary form must reproduce the above copyright
39
+ * notice, this list of conditions, and the following disclaimer in the
40
+ * documentation and/or other materials provided with the distribution.
41
+ * 3. The name of the ATLAS group or the names of its contributers may
42
+ * not be used to endorse or promote products derived from this
43
+ * software without specific written permission.
44
+ *
45
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
46
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
47
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
48
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS
49
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
50
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
51
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
52
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
53
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
54
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
55
+ * POSSIBILITY OF SUCH DAMAGE.
56
+ *
57
+ */
58
+
59
+ #ifndef NRM2_H
60
+ # define NRM2_H
61
+
62
+ #include "math/long_dtype.h"
63
+
64
+
65
+ namespace nm { namespace math {
66
+
67
+ /*
68
+ * Level 1 BLAS routine which returns the 2-norm of an n-vector x.
69
+ #
70
+ * Based on input types, these are the valid return types:
71
+ * int -> int
72
+ * float -> float or double
73
+ * double -> double
74
+ * complex64 -> float or double
75
+ * complex128 -> double
76
+ */
77
+ template <typename DType, typename MDType = typename MagnitudeDType<DType>::type>
78
+ MDType nrm2(const int N, const DType* X, const int incX) {
79
+ const DType ONE = 1, ZERO = 0;
80
+ typename LongDType<DType>::type scale = 0, ssq = 1, absxi, temp;
81
+
82
+
83
+ if ((N < 1) || (incX < 1)) return ZERO;
84
+ else if (N == 1) return std::abs(X[0]);
85
+
86
+ for (int i = 0; i < N; ++i) {
87
+ absxi = std::abs(X[i*incX]);
88
+ if (scale < absxi) {
89
+ temp = scale / absxi;
90
+ scale = absxi;
91
+ ssq = ONE + ssq * (temp * temp);
92
+ }
93
+ else if(scale != 0) {
94
+ temp = absxi / scale;
95
+ ssq += temp * temp;
96
+ }
97
+ }
98
+
99
+ return (MDType)(scale * std::sqrt( ssq ));
100
+ }
101
+
102
+
103
+ template <typename FloatDType>
104
+ static inline void nrm2_complex_helper(const FloatDType& xr, const FloatDType& xi, double& scale, double& ssq) {
105
+ double absx = std::abs(xr);
106
+ if (scale < absx) {
107
+ double temp = scale / absx;
108
+ scale = absx;
109
+ ssq = 1.0 + ssq * (temp * temp);
110
+ }
111
+ else if(scale != 0) {
112
+ double temp = absx / scale;
113
+ ssq += temp * temp;
114
+ }
115
+
116
+ absx = std::abs(xi);
117
+ if (scale < absx) {
118
+ double temp = scale / absx;
119
+ scale = absx;
120
+ ssq = 1.0 + ssq * (temp * temp);
121
+ }
122
+ else if(scale != 0) {
123
+ double temp = absx / scale;
124
+ ssq += temp * temp;
125
+ }
126
+ }
127
+
128
+ template <>
129
+ float nrm2(const int N, const Complex64* X, const int incX) {
130
+ double scale = 0, ssq = 1;
131
+
132
+ if ((N < 1) || (incX < 1)) return 0.0;
133
+
134
+ for (int i = 0; i < N; ++i) {
135
+ nrm2_complex_helper<float>(X[i*incX].r, X[i*incX].i, scale, ssq);
136
+ }
137
+
138
+ return scale * std::sqrt( ssq );
139
+ }
140
+
141
+ // FIXME: Function above is duplicated here, should be writeable as a template using
142
+ // FIXME: xMagnitudeDType.
143
+ template <>
144
+ double nrm2(const int N, const Complex128* X, const int incX) {
145
+ double scale = 0, ssq = 1;
146
+
147
+ if ((N < 1) || (incX < 1)) return 0.0;
148
+
149
+ for (int i = 0; i < N; ++i) {
150
+ nrm2_complex_helper<double>(X[i*incX].r, X[i*incX].i, scale, ssq);
151
+ }
152
+
153
+ return scale * std::sqrt( ssq );
154
+ }
155
+
156
+ template <typename DType, typename MDType = typename MagnitudeDType<DType>::type>
157
+ inline void cblas_nrm2(const int N, const void* X, const int incX, void* result) {
158
+ *reinterpret_cast<MDType*>( result ) = nrm2<DType, MDType>( N, reinterpret_cast<const DType*>(X), incX );
159
+ }
160
+
161
+
162
+
163
+ }} // end of namespace nm::math
164
+
165
+ #endif // NRM2_H
@@ -0,0 +1,117 @@
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
+ // == rot.h
25
+ //
26
+ // BLAS rot function in native C++.
27
+ //
28
+
29
+ /*
30
+ * Automatically Tuned Linear Algebra Software v3.8.4
31
+ * (C) Copyright 1999 R. Clint Whaley
32
+ *
33
+ * Redistribution and use in source and binary forms, with or without
34
+ * modification, are permitted provided that the following conditions
35
+ * are met:
36
+ * 1. Redistributions of source code must retain the above copyright
37
+ * notice, this list of conditions and the following disclaimer.
38
+ * 2. Redistributions in binary form must reproduce the above copyright
39
+ * notice, this list of conditions, and the following disclaimer in the
40
+ * documentation and/or other materials provided with the distribution.
41
+ * 3. The name of the ATLAS group or the names of its contributers may
42
+ * not be used to endorse or promote products derived from this
43
+ * software without specific written permission.
44
+ *
45
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
46
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
47
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
48
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS
49
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
50
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
51
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
52
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
53
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
54
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
55
+ * POSSIBILITY OF SUCH DAMAGE.
56
+ *
57
+ */
58
+
59
+ #ifndef ROT_H
60
+ # define ROT_H
61
+
62
+ namespace nm { namespace math {
63
+
64
+
65
+ // TODO: Test this to see if it works properly on complex. ATLAS has a separate algorithm for complex, which looks like
66
+ // TODO: it may actually be the same one.
67
+ //
68
+ // This function is called ATL_rot in ATLAS 3.8.4.
69
+ template <typename DType>
70
+ inline void rot_helper(const int N, DType* X, const int incX, DType* Y, const int incY, const DType c, const DType s) {
71
+ if (c != 1 || s != 0) {
72
+ if (incX == 1 && incY == 1) {
73
+ for (int i = 0; i != N; ++i) {
74
+ DType tmp = X[i] * c + Y[i] * s;
75
+ Y[i] = Y[i] * c - X[i] * s;
76
+ X[i] = tmp;
77
+ }
78
+ } else {
79
+ for (int i = N; i > 0; --i, Y += incY, X += incX) {
80
+ DType tmp = *X * c + *Y * s;
81
+ *Y = *Y * c - *X * s;
82
+ *X = tmp;
83
+ }
84
+ }
85
+ }
86
+ }
87
+
88
+
89
+ /* Applies a plane rotation. From ATLAS 3.8.4. */
90
+ template <typename DType, typename CSDType>
91
+ inline void rot(const int N, DType* X, const int incX, DType* Y, const int incY, const CSDType c, const CSDType s) {
92
+ int incx = incX, incy = incY;
93
+ DType *x = X, *y = Y;
94
+
95
+ if (N > 0) {
96
+ if (incX < 0) {
97
+ if (incY < 0) { incx = -incx; incy = -incy; }
98
+ else x += -incX * (N-1);
99
+ } else if (incY < 0) {
100
+ incy = -incy;
101
+ incx = -incx;
102
+ x += (N-1) * incX;
103
+ }
104
+ rot_helper<DType>(N, x, incx, y, incy, c, s);
105
+ }
106
+ }
107
+
108
+ template <typename DType, typename CSDType>
109
+ inline void cblas_rot(const int N, void* X, const int incX, void* Y, const int incY, const void* c, const void* s) {
110
+ rot<DType,CSDType>(N, reinterpret_cast<DType*>(X), incX, reinterpret_cast<DType*>(Y), incY,
111
+ *reinterpret_cast<const CSDType*>(c), *reinterpret_cast<const CSDType*>(s));
112
+ }
113
+
114
+
115
+ } } //nm::math
116
+
117
+ #endif // ROT_H
@@ -0,0 +1,106 @@
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
+ // == rotg.h
25
+ //
26
+ // BLAS rotg function in native C++.
27
+ //
28
+
29
+ /*
30
+ * Automatically Tuned Linear Algebra Software v3.8.4
31
+ * (C) Copyright 1999 R. Clint Whaley
32
+ *
33
+ * Redistribution and use in source and binary forms, with or without
34
+ * modification, are permitted provided that the following conditions
35
+ * are met:
36
+ * 1. Redistributions of source code must retain the above copyright
37
+ * notice, this list of conditions and the following disclaimer.
38
+ * 2. Redistributions in binary form must reproduce the above copyright
39
+ * notice, this list of conditions, and the following disclaimer in the
40
+ * documentation and/or other materials provided with the distribution.
41
+ * 3. The name of the ATLAS group or the names of its contributers may
42
+ * not be used to endorse or promote products derived from this
43
+ * software without specific written permission.
44
+ *
45
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
46
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
47
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
48
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS
49
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
50
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
51
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
52
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
53
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
54
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
55
+ * POSSIBILITY OF SUCH DAMAGE.
56
+ *
57
+ */
58
+
59
+ #ifndef ROTG_H
60
+ # define ROTG_H
61
+
62
+ namespace nm { namespace math {
63
+
64
+ /* Givens plane rotation. From ATLAS 3.8.4. */
65
+ // FIXME: Not working properly for Ruby objects.
66
+ template <typename DType>
67
+ inline void rotg(DType* a, DType* b, DType* c, DType* s) {
68
+ DType aa = std::abs(*a), ab = std::abs(*b);
69
+ DType roe = aa > ab ? *a : *b;
70
+ DType scal = aa + ab;
71
+
72
+ if (scal == 0) {
73
+ *c = 1;
74
+ *s = *a = *b = 0;
75
+ } else {
76
+ DType t0 = aa / scal, t1 = ab / scal;
77
+ DType r = scal * std::sqrt(t0 * t0 + t1 * t1);
78
+ if (roe < 0) r = -r;
79
+ *c = *a / r;
80
+ *s = *b / r;
81
+ DType z = (*c != 0) ? (1 / *c) : DType(1);
82
+ *a = r;
83
+ *b = z;
84
+ }
85
+ }
86
+
87
+ template <>
88
+ inline void rotg(Complex64* a, Complex64* b, Complex64* c, Complex64* s) {
89
+ rb_raise(rb_eNotImpError, "BLAS not available, and existing template requires modification for complex");
90
+ }
91
+
92
+ template <>
93
+ inline void rotg(Complex128* a, Complex128* b, Complex128* c, Complex128* s) {
94
+ rb_raise(rb_eNotImpError, "BLAS not available, and existing template requires modification for complex");
95
+ }
96
+
97
+
98
+ template <typename DType>
99
+ inline void cblas_rotg(void* a, void* b, void* c, void* s) {
100
+ rotg<DType>(reinterpret_cast<DType*>(a), reinterpret_cast<DType*>(b), reinterpret_cast<DType*>(c), reinterpret_cast<DType*>(s));
101
+ }
102
+
103
+
104
+ } } //nm::math
105
+
106
+ #endif // ROTG_H
@@ -0,0 +1,71 @@
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
+ // == scal.h
25
+ //
26
+ // BLAS scal function.
27
+ //
28
+
29
+ #ifndef SCAL_H
30
+ #define SCAL_H
31
+
32
+ namespace nm { namespace math {
33
+
34
+ /* Purpose */
35
+ /* ======= */
36
+
37
+ /* DSCAL scales a vector by a constant. */
38
+ /* uses unrolled loops for increment equal to one. */
39
+
40
+ /* Further Details */
41
+ /* =============== */
42
+
43
+ /* jack dongarra, linpack, 3/11/78. */
44
+ /* modified 3/93 to return if incx .le. 0. */
45
+ /* modified 12/3/93, array(1) declarations changed to array(*) */
46
+
47
+ /* ===================================================================== */
48
+
49
+ template <typename DType>
50
+ inline void scal(const int n, const DType scalar, DType* x, const int incx) {
51
+
52
+ if (n <= 0 || incx <= 0) {
53
+ return;
54
+ }
55
+
56
+ for (int i = 0; incx < 0 ? i > n*incx : i < n*incx; i += incx) {
57
+ x[i] = scalar * x[i];
58
+ }
59
+ }
60
+
61
+ /*
62
+ * Function signature conversion for LAPACK's scal function.
63
+ */
64
+ template <typename DType>
65
+ inline void cblas_scal(const int n, const void* scalar, void* x, const int incx) {
66
+ scal<DType>(n, *reinterpret_cast<const DType*>(scalar), reinterpret_cast<DType*>(x), incx);
67
+ }
68
+
69
+ }} // end of nm::math
70
+
71
+ #endif