jblas-ruby 1.1.1
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.
- data/lib/jblas.rb +325 -0
- data/lib/jblas/0readme.rb +69 -0
- data/lib/jblas/arith.rb +62 -0
- data/lib/jblas/complex.rb +92 -0
- data/lib/jblas/errors.rb +52 -0
- data/lib/jblas/extensions.rb +114 -0
- data/lib/jblas/functions.rb +404 -0
- data/lib/jblas/java.rb +75 -0
- data/lib/jblas/jblas-1.1.1.jar +0 -0
- data/lib/jblas/matrix_mixin.rb +64 -0
- data/lib/jblas/mixin_access.rb +155 -0
- data/lib/jblas/mixin_arith.rb +168 -0
- data/lib/jblas/mixin_class.rb +80 -0
- data/lib/jblas/mixin_complex_matrix.rb +64 -0
- data/lib/jblas/mixin_convert.rb +104 -0
- data/lib/jblas/mixin_enum.rb +83 -0
- data/lib/jblas/mixin_general.rb +202 -0
- data/lib/jblas/proxies.rb +55 -0
- metadata +81 -0
data/lib/jblas.rb
ADDED
@@ -0,0 +1,325 @@
|
|
1
|
+
# Java based matrix classes for ruby
|
2
|
+
#
|
3
|
+
# This file provides a module JBLAS which contains efficient matrix
|
4
|
+
# implementations based on java and BLAS/LAPACK implementations.
|
5
|
+
#
|
6
|
+
# For double precision computations, DoubleMatrix and DoubleVector are
|
7
|
+
# provided, for single precision computations, FloatMatrix and
|
8
|
+
# FloatVector.
|
9
|
+
#
|
10
|
+
# Basically, the classes provided are the actual java classes with
|
11
|
+
# syntactic sugar added (for example for arithmetic operations). This
|
12
|
+
# is integrates very nicely, however, not that the full list of
|
13
|
+
# methods is not available in rdoc.
|
14
|
+
|
15
|
+
# Copyright (c) 2009-2010, Mikio L. Braun and contributors
|
16
|
+
# All rights reserved.
|
17
|
+
#
|
18
|
+
# Redistribution and use in source and binary forms, with or without
|
19
|
+
# modification, are permitted provided that the following conditions are
|
20
|
+
# met:
|
21
|
+
#
|
22
|
+
# * Redistributions of source code must retain the above copyright
|
23
|
+
# notice, this list of conditions and the following disclaimer.
|
24
|
+
#
|
25
|
+
# * Redistributions in binary form must reproduce the above
|
26
|
+
# copyright notice, this list of conditions and the following
|
27
|
+
# disclaimer in the documentation and/or other materials provided
|
28
|
+
# with the distribution.
|
29
|
+
#
|
30
|
+
# * Neither the name of the Technische Universität Berlin nor the
|
31
|
+
# names of its contributors may be used to endorse or promote
|
32
|
+
# products derived from this software without specific prior
|
33
|
+
# written permission.
|
34
|
+
#
|
35
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
36
|
+
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
37
|
+
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
38
|
+
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
39
|
+
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
40
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
41
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
42
|
+
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
43
|
+
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
44
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
45
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
46
|
+
|
47
|
+
require 'jblas/java'
|
48
|
+
require 'jblas/matrix_mixin'
|
49
|
+
require 'jblas/extensions'
|
50
|
+
require 'jblas/functions'
|
51
|
+
require 'jblas/arith'
|
52
|
+
require 'jblas/complex'
|
53
|
+
require 'jblas/errors'
|
54
|
+
require 'jblas/mixin_complex_matrix'
|
55
|
+
|
56
|
+
# The jblas module provides matrix classes and functions to
|
57
|
+
# comfortably work with the matrices.
|
58
|
+
#
|
59
|
+
# = Overview
|
60
|
+
#
|
61
|
+
# JBLAS defines the following six classes:
|
62
|
+
#
|
63
|
+
# * DoubleMatrix - double precision real matrix
|
64
|
+
# * FloatMatrix - single precision real matrix
|
65
|
+
# * ComplexDoubleMatrix - double precision complex matrix
|
66
|
+
# * ComplexFloatMatrix - single precision complex matrix
|
67
|
+
# * ComplexDouble - double precision complex number
|
68
|
+
# * ComplexFloat - single precision complex number
|
69
|
+
#
|
70
|
+
# These classes have the usual arithmetic operations defined as well as coercion
|
71
|
+
# to make them work as seamlessly as possible with the norm built-in Ruby
|
72
|
+
# numerical types.
|
73
|
+
#
|
74
|
+
# Technically, jblas-ruby is organized in a number of mixins which are included
|
75
|
+
# in the Java objects to add syntactic sugar and make the objects play well
|
76
|
+
# with Ruby. Links to these mixins are included in each section.
|
77
|
+
#
|
78
|
+
# = Creation
|
79
|
+
#
|
80
|
+
# <em>See also JBLAS::MatrixClassMixin, mat</em>
|
81
|
+
#
|
82
|
+
# You create a matrix or vector explicitly by using the
|
83
|
+
# DoubleMatrix[], or FloatMatrix[] constructor. For example:
|
84
|
+
#
|
85
|
+
# DoubleMatrix[[1,2,3],[4,5,6]]
|
86
|
+
# => 1.0 2.0 3.0
|
87
|
+
# 4.0 5.0 6.0
|
88
|
+
#
|
89
|
+
# DoubleMatrix[1,2,3]
|
90
|
+
# => 1.0
|
91
|
+
# 2.0
|
92
|
+
# 3.0
|
93
|
+
#
|
94
|
+
# Since typing DoubleMatrix all the time is a bit cumbersome, jblas also
|
95
|
+
# provides the mat function which is a short-hand for DoubleMatrix[...]:
|
96
|
+
#
|
97
|
+
# mat[1,2,3]
|
98
|
+
# => 1.0
|
99
|
+
# 2.0
|
100
|
+
# 3.0
|
101
|
+
#
|
102
|
+
# Apart from these constructors, there are few more functions which
|
103
|
+
# generate matrices or vectors:
|
104
|
+
#
|
105
|
+
# * zeros(n), and zeros(n,m): vector or matrix of zeros.
|
106
|
+
# * ones(...) - a vector or matrix of ones.
|
107
|
+
# * rand(...) - a vector or matrix whose elements are drawn uniformly in [0,1]
|
108
|
+
# * randn(...) - elemens are drawn from normal Gaussian distribution
|
109
|
+
# * diag(x) - return diagonal of a matrix or matrix with given diagonal
|
110
|
+
# * eye(n) - identity matrix
|
111
|
+
# * x.hcat(y) - returns the horizontal concatenation of x and y
|
112
|
+
# * x.vcat(y) - returns the vertical concatenation of x and y
|
113
|
+
#
|
114
|
+
# hcat and vcat also exist as methods which take an arbitrary number of arguments
|
115
|
+
# and returns the horizontal or vertical concatenation of its arguments.
|
116
|
+
#
|
117
|
+
# = Accessing elements
|
118
|
+
#
|
119
|
+
# <em>See also JBLAS::MatrixAccessMixin.</em>
|
120
|
+
#
|
121
|
+
# To access individual elements, use the [] or []= methods, or +get+, and +put+
|
122
|
+
# respectively.
|
123
|
+
#
|
124
|
+
# Rows and columns can be accessed with get_row, put_row and get_column, put_column.
|
125
|
+
#
|
126
|
+
# You can also often use ranges or enumerables with [] and []=, for example
|
127
|
+
#
|
128
|
+
# x[0..2, [1,2,3]]
|
129
|
+
#
|
130
|
+
# = Arithmetics
|
131
|
+
#
|
132
|
+
# <em>See also JBLAS::MatrixAccessMixin.</em>
|
133
|
+
#
|
134
|
+
# Arithmetic is defined using the usual operators, that is
|
135
|
+
#
|
136
|
+
# * (matrix-)multiplication: a * b
|
137
|
+
# * addition: a + b
|
138
|
+
# * subtraction: a - b
|
139
|
+
#
|
140
|
+
# Multiplication is the usual (linear algebra) multiplication.
|
141
|
+
#
|
142
|
+
# There exist also non-operator versions (which are the original Java functions)
|
143
|
+
# These also give you more control over the generation
|
144
|
+
# of temporary objects. The suffix "!" or "i" indicates that the computation
|
145
|
+
# is performed in-place on the left operand.
|
146
|
+
#
|
147
|
+
# * (matrix-)multiplication: a.mmul(b), a.mmul!(b)
|
148
|
+
# * elementwise multiplication: a.mul(b), a.mul!(b)
|
149
|
+
# * addition: a.add(b), a.add!(b)
|
150
|
+
# * subtraction: a.sub(b), a.sub!(b)
|
151
|
+
# * elementwise division: a.div(b), a.div!(b)
|
152
|
+
#
|
153
|
+
# Some special functions exist for adding the same column vector to
|
154
|
+
# all columns of a matrix, or row vector to all rows:
|
155
|
+
#
|
156
|
+
# * m.add_column_vector(x) adds a column vector
|
157
|
+
# * m.add_row_vector(x) adds a row vector
|
158
|
+
#
|
159
|
+
# = Matrix and Vectors as Enumerables
|
160
|
+
#
|
161
|
+
# <em>See also JBLAS::MatrixEnumMixin.</em>
|
162
|
+
#
|
163
|
+
# Both the matrices and vectors implement the Enumerable mixin. Matrices behave
|
164
|
+
# as if they are a linear array of their elements (going down rows first). If
|
165
|
+
# you want to iterate over rows or columns, use the rows_to_a or columns_to_a methods,
|
166
|
+
# as well as each_row and each_column.
|
167
|
+
#
|
168
|
+
# = Functions
|
169
|
+
#
|
170
|
+
# JBLAS defines a large number of mathematical functions. You can
|
171
|
+
# either call these as a method on a matrix, vector, or even number,
|
172
|
+
# or in the usual notation as a function.
|
173
|
+
#
|
174
|
+
# * acos: arcus cosine
|
175
|
+
# * asin: arcus sine
|
176
|
+
# * atan: arcus tangens
|
177
|
+
# * cos: cosine
|
178
|
+
# * cosh: hyperbolic cosine
|
179
|
+
# * exp: exponential
|
180
|
+
# * log10: logarithm to base 10
|
181
|
+
# * log: natural logarithm
|
182
|
+
# * sin: sine
|
183
|
+
# * sinh: hyperbolic sine
|
184
|
+
# * sqrt: square root
|
185
|
+
# * tan: tangens
|
186
|
+
# * tanh: hyperbolic tangens
|
187
|
+
#
|
188
|
+
# By adding the suffix "i" or "!" to the method functions, you again perform the
|
189
|
+
# computation in-place. For example
|
190
|
+
#
|
191
|
+
# exp(x)
|
192
|
+
#
|
193
|
+
# returns a copy of +x+, but
|
194
|
+
#
|
195
|
+
# exp(x)
|
196
|
+
# exp!(x)
|
197
|
+
#
|
198
|
+
# do not.
|
199
|
+
#
|
200
|
+
#
|
201
|
+
# = Geometry
|
202
|
+
#
|
203
|
+
# Some functions to deal with geometric properties:
|
204
|
+
#
|
205
|
+
# * norm(x, type=2) computes the norm for type=1, 2, or :inf
|
206
|
+
# * x.dot(y) computes the scalar product
|
207
|
+
#
|
208
|
+
#
|
209
|
+
# = Linear Equations
|
210
|
+
#
|
211
|
+
# In order to solve the linear equation <tt>a * x = b</tt>, with +b+
|
212
|
+
# either being a matrix or a vector, call solve:
|
213
|
+
#
|
214
|
+
# x = a.solve(b)
|
215
|
+
#
|
216
|
+
# or
|
217
|
+
#
|
218
|
+
# solve(a, b)
|
219
|
+
#
|
220
|
+
#
|
221
|
+
# = Eigenproblems
|
222
|
+
#
|
223
|
+
# Compute the eigenvalue of a square matrix +a+ with
|
224
|
+
#
|
225
|
+
# e = eig(a)
|
226
|
+
#
|
227
|
+
# Compute the eigenvectors as well with
|
228
|
+
#
|
229
|
+
# u, d = eigv(a)
|
230
|
+
#
|
231
|
+
# eigv returns two matrices, the matrix +u+ whose columns are the
|
232
|
+
# eigenvectors, and the matrix +d+, whose diagonal contains the
|
233
|
+
# eigenvalues.
|
234
|
+
#
|
235
|
+
# = Singular value decomposition
|
236
|
+
#
|
237
|
+
# Compute the singular value decomposition of an (arbitrarily shaped)
|
238
|
+
# matrix +a+ with
|
239
|
+
#
|
240
|
+
# u, s, v = svd(a)
|
241
|
+
#
|
242
|
+
# The columns of +u+ and +v+ will contain the singular vectors, and +s+ is
|
243
|
+
# a vector containing the singular values.
|
244
|
+
#
|
245
|
+
# You can also compute a sparse SVD with svd(a, true) (meaning that +u+
|
246
|
+
# and +v+ are not square but have the minimal rectangular size necessary).
|
247
|
+
#
|
248
|
+
# Finally, svdv(a) computes only the singular values of +a+.
|
249
|
+
|
250
|
+
module JBLAS
|
251
|
+
######################################################################
|
252
|
+
#
|
253
|
+
# Matrices
|
254
|
+
#
|
255
|
+
######################################################################
|
256
|
+
|
257
|
+
# Matrix for stroing float values.
|
258
|
+
#
|
259
|
+
# This matrix is essentially org.jblas.DoubleMatrix with all the syntactic
|
260
|
+
# sugar defined in the MatrixClassMixin and MatrixMixin mix-ins. See those
|
261
|
+
# modules for further information, and the JBLAS module for an overview.
|
262
|
+
class DoubleMatrix
|
263
|
+
class <<self
|
264
|
+
include MatrixClassMixin
|
265
|
+
end
|
266
|
+
|
267
|
+
include MatrixMixin
|
268
|
+
end
|
269
|
+
|
270
|
+
# Matrix for storing float values.
|
271
|
+
#
|
272
|
+
# This matrix is essentially org.jblas.FloatMatrix with all the syntactic
|
273
|
+
# sugar defined in the MatrixClassMixin and MatrixMixin mix-ins. See those
|
274
|
+
# modules for further information, and the JBLAS module for an overview.
|
275
|
+
class FloatMatrix
|
276
|
+
class <<self
|
277
|
+
include MatrixClassMixin
|
278
|
+
end
|
279
|
+
include MatrixMixin
|
280
|
+
end
|
281
|
+
|
282
|
+
# Matrix for storing complex double values.
|
283
|
+
#
|
284
|
+
# This matrix is essentially org.jblas.ComplexDoubleMatrix with all the syntactic
|
285
|
+
# sugar defined in the MatrixClassMixin and MatrixMixin mix-ins. See those
|
286
|
+
# modules for further information, and the JBLAS module for an overview.
|
287
|
+
class ComplexDoubleMatrix
|
288
|
+
class <<self
|
289
|
+
include MatrixClassMixin
|
290
|
+
end
|
291
|
+
include MatrixMixin
|
292
|
+
include ComplexMatrixMixin
|
293
|
+
end
|
294
|
+
|
295
|
+
# Matrix for storing complex float values.
|
296
|
+
#
|
297
|
+
# This matrix is essentially org.jblas.ComplexFloatMatrix with all the syntactic
|
298
|
+
# sugar defined in the MatrixClassMixin and MatrixMixin mix-ins. See those
|
299
|
+
# modules for further information, and the JBLAS module for an overview.
|
300
|
+
class ComplexFloatMatrix
|
301
|
+
class <<self
|
302
|
+
include MatrixClassMixin
|
303
|
+
end
|
304
|
+
include MatrixMixin
|
305
|
+
include ComplexMatrixMixin
|
306
|
+
end
|
307
|
+
|
308
|
+
# Double precision complex number.
|
309
|
+
#
|
310
|
+
# This class is essentially org.jblas.ComplexDouble with the syntactic sugar
|
311
|
+
# defined in the module ComplexMixin.
|
312
|
+
class ComplexDouble
|
313
|
+
include ComplexMixin
|
314
|
+
end
|
315
|
+
|
316
|
+
# Single precision complex number.
|
317
|
+
#
|
318
|
+
# This class is essentially org.jblas.ComplexFloat with the syntactic sugar
|
319
|
+
# defined in the module ComplexMixin.
|
320
|
+
class ComplexFloat
|
321
|
+
include ComplexMixin
|
322
|
+
end
|
323
|
+
|
324
|
+
I = ComplexDouble::I
|
325
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# jblas-ruby - fast linear algebra for JRuby
|
2
|
+
# (c) 2009-2010 by Mikio L. Braun and contributors
|
3
|
+
#
|
4
|
+
# Version 1.1, August 20, 2010
|
5
|
+
# (jblas-ruby follows jblas (http://jblas.org) version numbers, although
|
6
|
+
# jblas-ruby is somewhat more unstable)
|
7
|
+
#
|
8
|
+
# Homepage: http://mikiobraun.github.com/jblas-ruby/
|
9
|
+
#
|
10
|
+
# This is only the rdoc starting page. For more information, have a look at
|
11
|
+
# the JBLAS module.
|
12
|
+
#
|
13
|
+
# jblas-ruby is under a BSD style license. See the file COPYING.
|
14
|
+
#
|
15
|
+
# = Relationship to jblas
|
16
|
+
#
|
17
|
+
# jblas-ruby started as being a somewhat thin layer around the jblas library.
|
18
|
+
# In the beginning, I only added syntatic sugar for arithmetic operations.
|
19
|
+
# From that, jblas-ruby has evolved somewhat towards a more M*TLAB like environment.
|
20
|
+
# For example, many methods like DoubleMatrix#diag are also available as
|
21
|
+
# functions such that you can say the more natural diag(x) instead of x.diag.
|
22
|
+
#
|
23
|
+
# I also tried to cover most of the Java methods in the documentation, such that
|
24
|
+
# you don't need to be proficient in jblas to be able to work with jblas.
|
25
|
+
# Occasionally, things may just not work the way you expect them due to some
|
26
|
+
# strange typing error. I apologize for all the cases where this happens.
|
27
|
+
#
|
28
|
+
# Finally, if you're already familiar to jblas, here is a short overview of
|
29
|
+
# how Java names translate to JRuby ones:
|
30
|
+
#
|
31
|
+
# * methods are translated from CamelCase to underscore_style. So x.getRows()
|
32
|
+
# becomes x.get_rows().
|
33
|
+
# * argument parenthesis are optional, so x.getRows() becomes x.get_rows.
|
34
|
+
# * Bean-like methods can be accessed as attributes. Another way to call x.getLength is
|
35
|
+
# x.length. Likewise, x.setLength(i) becomes x.length = i.
|
36
|
+
# * Packages are converted from the dot.interleaving.style to CamelCase and prefixed
|
37
|
+
# with Java::. So org.jblas.DoubleMatrix becomes Java::OrgJblas::DoubleMatrix.
|
38
|
+
|
39
|
+
# Copyright (c) 2009-2010, Mikio L. Braun and contributors
|
40
|
+
# All rights reserved.
|
41
|
+
#
|
42
|
+
# Redistribution and use in source and binary forms, with or without
|
43
|
+
# modification, are permitted provided that the following conditions are
|
44
|
+
# met:
|
45
|
+
#
|
46
|
+
# * Redistributions of source code must retain the above copyright
|
47
|
+
# notice, this list of conditions and the following disclaimer.
|
48
|
+
#
|
49
|
+
# * Redistributions in binary form must reproduce the above
|
50
|
+
# copyright notice, this list of conditions and the following
|
51
|
+
# disclaimer in the documentation and/or other materials provided
|
52
|
+
# with the distribution.
|
53
|
+
#
|
54
|
+
# * Neither the name of the Technische Universität Berlin nor the
|
55
|
+
# names of its contributors may be used to endorse or promote
|
56
|
+
# products derived from this software without specific prior
|
57
|
+
# written permission.
|
58
|
+
#
|
59
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
60
|
+
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
61
|
+
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
62
|
+
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
63
|
+
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
64
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
65
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
66
|
+
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
67
|
+
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
68
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
69
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/lib/jblas/arith.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# Defines class JBLAS::ReversedArithmetic which is necessary for expressions
|
2
|
+
# like "3 - matrix".
|
3
|
+
|
4
|
+
# Copyright (c) 2009-2010, Mikio L. Braun and contributors
|
5
|
+
# All rights reserved.
|
6
|
+
#
|
7
|
+
# Redistribution and use in source and binary forms, with or without
|
8
|
+
# modification, are permitted provided that the following conditions are
|
9
|
+
# met:
|
10
|
+
#
|
11
|
+
# * Redistributions of source code must retain the above copyright
|
12
|
+
# notice, this list of conditions and the following disclaimer.
|
13
|
+
#
|
14
|
+
# * Redistributions in binary form must reproduce the above
|
15
|
+
# copyright notice, this list of conditions and the following
|
16
|
+
# disclaimer in the documentation and/or other materials provided
|
17
|
+
# with the distribution.
|
18
|
+
#
|
19
|
+
# * Neither the name of the Technische Universität Berlin nor the
|
20
|
+
# names of its contributors may be used to endorse or promote
|
21
|
+
# products derived from this software without specific prior
|
22
|
+
# written permission.
|
23
|
+
#
|
24
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
25
|
+
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
26
|
+
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
27
|
+
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
28
|
+
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
29
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
30
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
31
|
+
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
32
|
+
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
33
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
34
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
35
|
+
|
36
|
+
module JBLAS
|
37
|
+
# When arguments to arithmetic operators are promoted via coerce, they
|
38
|
+
# change their order. This class is a wrapper for the promoted self
|
39
|
+
# which has <tt>-</tt> and <tt>/</tt> overloaded to call +rsub+ and
|
40
|
+
# +rdiv+ instead of +div+ and +sub+
|
41
|
+
class ReversedArithmetic
|
42
|
+
def initialize(o)
|
43
|
+
@value = o;
|
44
|
+
end
|
45
|
+
|
46
|
+
def +(o)
|
47
|
+
@value.add o
|
48
|
+
end
|
49
|
+
|
50
|
+
def *(o)
|
51
|
+
@value.mul o
|
52
|
+
end
|
53
|
+
|
54
|
+
def -(o)
|
55
|
+
@value.rsub o
|
56
|
+
end
|
57
|
+
|
58
|
+
def /(o)
|
59
|
+
@value.rdiv o
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|