mdarray 0.5.4-java → 0.5.5-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,466 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ##########################################################################################
4
+ # Copyright © 2013 Rodrigo Botafogo. All Rights Reserved. Permission to use, copy, modify,
5
+ # and distribute this software and its documentation for educational, research, and
6
+ # not-for-profit purposes, without fee and without a signed licensing agreement, is hereby
7
+ # granted, provided that the above copyright notice, this paragraph and the following two
8
+ # paragraphs appear in all copies, modifications, and distributions. Contact Rodrigo
9
+ # Botafogo - rodrigo.a.botafogo@gmail.com for commercial licensing opportunities.
10
+ #
11
+ # IN NO EVENT SHALL RODRIGO BOTAFOGO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
12
+ # INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF
13
+ # THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF RODRIGO BOTAFOGO HAS BEEN ADVISED OF THE
14
+ # POSSIBILITY OF SUCH DAMAGE.
15
+ #
16
+ # RODRIGO BOTAFOGO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
17
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
18
+ # SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS".
19
+ # RODRIGO BOTAFOGO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
20
+ # OR MODIFICATIONS.
21
+ ##########################################################################################
22
+
23
+ # require 'jruby/core_ext'
24
+
25
+ require 'java'
26
+
27
+ ##########################################################################################
28
+ #
29
+ ##########################################################################################
30
+
31
+ class Colt
32
+
33
+ ##########################################################################################
34
+ #
35
+ ##########################################################################################
36
+
37
+ module Matrix1DAlgebra
38
+
39
+ #------------------------------------------------------------------------------------
40
+ # Returns the dot product of two vectors x and y, which is Sum(x[i]*y[i]).
41
+ #------------------------------------------------------------------------------------
42
+
43
+ def mult(other_val, from = 0, length = other_val.size)
44
+
45
+ p "mult"
46
+ @mdarray.print
47
+ other_val.mdarray.print
48
+ printf("\n\n")
49
+
50
+ if (other_val.is_a? Numeric)
51
+ MDMatrix.from_mdarray(@mdarray * other_val)
52
+ elsif (other_val.is_a? MDMatrix)
53
+ if (other_val.rank == 2)
54
+ MDMatrix
55
+ .from_colt_matrix(other_val.transpose.colt_matrix.zMult(@colt_matrix, nil))
56
+ else
57
+ p "other_val.rank = #{other_val.rank}"
58
+ @colt_matrix.zDotProduct(other_val.colt_matrix, from, length)
59
+ end
60
+ else
61
+ raise "Cannot multiply matrix by given value"
62
+ end
63
+
64
+ end
65
+
66
+ alias :* :mult
67
+
68
+ end # Matrix1DAlgebra
69
+
70
+ ##########################################################################################
71
+ #
72
+ ##########################################################################################
73
+
74
+ module Matrix2DAlgebra
75
+
76
+ #------------------------------------------------------------------------------------
77
+ # Linear algebraic matrix-matrix multiplication; C = alpha * A x B + beta*C.
78
+ # C[i,j] = alpha*Sum(A[i,k] * B[k,j]) + beta*C[i,j], k=0..n-1.
79
+ # Matrix shapes: A(m x n), B(n x p), C(m x p).
80
+ # Note: Matrix shape conformance is checked after potential transpositions.
81
+ #------------------------------------------------------------------------------------
82
+
83
+ def mult(other_val, alpha = 1, beta = 0, transA = false, transB = false, result = nil)
84
+
85
+ if (other_val.is_a? Numeric)
86
+ MDMatrix.from_mdarray(@mdarray * other_val)
87
+ elsif (other_val.is_a? MDMatrix)
88
+ if (other_val.rank > 2)
89
+ raise "Rank should be 1 or 2"
90
+ elsif (other_val.rank == 2)
91
+ result = MDMatrix
92
+ .build(@mdarray.type, [@mdarray.shape[0],
93
+ other_val.mdarray.shape[1]]) if result == nil
94
+ @colt_matrix.zMult(other_val.colt_matrix, result.colt_matrix, alpha, beta,
95
+ transA, transB)
96
+ else # multiplying by a vector
97
+ result = MDMatrix.build(@mdarray.type, [@mdarray.shape[1]]) if result == nil
98
+ @colt_matrix.zMult(other_val.colt_matrix, result.colt_matrix, alpha, beta, transA)
99
+ end
100
+
101
+ # MDMatrix.from_colt_matrix(result)
102
+ result
103
+ else
104
+ raise "Cannot multiply matrix by given value"
105
+ end
106
+
107
+ end
108
+
109
+ alias :* :mult
110
+
111
+ #------------------------------------------------------------------------------------
112
+ # Constructs and returns a new view which is the transposition of the given matrix A.
113
+ #------------------------------------------------------------------------------------
114
+
115
+ def transpose
116
+ MDMatrix.from_mdarray(@mdarray.transpose(0, 1))
117
+ end
118
+
119
+ end # Matrix2DAlgebra
120
+
121
+ ########################################################################################
122
+ #
123
+ ########################################################################################
124
+
125
+ module MatrixFloatingAlgebra
126
+
127
+ #------------------------------------------------------------------------------------
128
+ # Computes the Kronecker product of two real matrices.
129
+ #------------------------------------------------------------------------------------
130
+
131
+ def kron(matrix)
132
+ result = @colt_algebra.kron(@colt_matrix, matrix.colt_matrix)
133
+ MDMatrix.from_colt_matrix(result)
134
+ end
135
+
136
+ #------------------------------------------------------------------------------------
137
+ # Returns the one-norm of vector x, which is Sum(abs(x[i])).
138
+ #------------------------------------------------------------------------------------
139
+
140
+ def norm1
141
+ @colt_algebra.norm1(@colt_matrix)
142
+ end
143
+
144
+ #------------------------------------------------------------------------------------
145
+ # Returns the two-norm of matrix A, which is the maximum singular value; obtained
146
+ # from SVD.
147
+ #------------------------------------------------------------------------------------
148
+
149
+ def norm2
150
+ @colt_algebra.norm2(@colt_matrix)
151
+ end
152
+
153
+ #------------------------------------------------------------------------------------
154
+ # Returns the Frobenius norm of matrix A, which is Sqrt(Sum(A[i,j]^2))
155
+ #------------------------------------------------------------------------------------
156
+
157
+ def normF
158
+ @colt_algebra.normF(@colt_matrix)
159
+ end
160
+
161
+ #------------------------------------------------------------------------------------
162
+ # Returns the infinity norm of matrix A, which is the maximum absolute row sum.
163
+ #------------------------------------------------------------------------------------
164
+
165
+ def norm_infinity
166
+ @colt_algebra.normInfinity(@colt_matrix)
167
+ end
168
+
169
+ end # MatrixFloatingAlgebra
170
+
171
+
172
+ ########################################################################################
173
+ #
174
+ ########################################################################################
175
+
176
+ module Matrix2DFloatingAlgebra
177
+ include_package "cern.colt.matrix.tdouble.algo"
178
+ include_package "cern.colt.matrix.tfloat.algo"
179
+
180
+ #------------------------------------------------------------------------------------
181
+ # Solves the upper triangular system U*x=b;
182
+ #------------------------------------------------------------------------------------
183
+
184
+ def backward_solve(matrix1D)
185
+ result = @colt_algebra.backwardSolve(@colt_matrix, matrix1D.colt_matrix)
186
+ MDMatrix.from_colt_matrix(result)
187
+ end
188
+
189
+ #------------------------------------------------------------------------------------
190
+ # Constructs and returns the cholesky-decomposition of the given matrix. For a
191
+ # symmetric, positive definite matrix A, the Cholesky decomposition is a lower
192
+ # triangular matrix L so that A = L*L'; If the matrix is not symmetric positive
193
+ # definite, the IllegalArgumentException is thrown.
194
+ #------------------------------------------------------------------------------------
195
+
196
+ def chol
197
+ result = @colt_algebra.chol(@colt_matrix).getL()
198
+ MDMatrix.from_colt_matrix(result)
199
+ end
200
+
201
+ #------------------------------------------------------------------------------------
202
+ # Returns the condition of matrix A, which is the ratio of largest to smallest
203
+ # singular value.
204
+ #------------------------------------------------------------------------------------
205
+
206
+ def cond
207
+ @colt_algebra.cond(@colt_matrix)
208
+ end
209
+
210
+ #------------------------------------------------------------------------------------
211
+ # Returns the determinant of matrix A.
212
+ #------------------------------------------------------------------------------------
213
+
214
+ def det
215
+ @colt_algebra.det(@colt_matrix)
216
+ end
217
+
218
+ #------------------------------------------------------------------------------------
219
+ #
220
+ #------------------------------------------------------------------------------------
221
+
222
+ def eig
223
+ eig = @colt_algebra.eig(@colt_matrix)
224
+ [MDMatrix.from_colt_matrix(eig.getD),
225
+ MDMatrix.from_colt_matrix(eig.getImagEigenvalues),
226
+ MDMatrix.from_colt_matrix(eig.getRealEigenvalues),
227
+ MDMatrix.from_colt_matrix(eig.getV)]
228
+ end
229
+
230
+ #------------------------------------------------------------------------------------
231
+ # Solves the lower triangular system L*x=b;
232
+ #------------------------------------------------------------------------------------
233
+
234
+ def forward_solve(matrix1D)
235
+ result = @colt_algebra.forwardSolve(@colt_matrix, matrix1D.colt_matrix)
236
+ MDMatrix.from_colt_matrix(result)
237
+ end
238
+
239
+ #------------------------------------------------------------------------------------
240
+ # Returns the inverse or pseudo-inverse of matrix A.
241
+ #------------------------------------------------------------------------------------
242
+
243
+ def inverse
244
+ result = @colt_algebra.inverse(@colt_matrix)
245
+ MDMatrix.from_colt_matrix(result)
246
+ end
247
+
248
+ #------------------------------------------------------------------------------------
249
+ # Constructs and returns the LU-decomposition of the given matrix.
250
+ #------------------------------------------------------------------------------------
251
+
252
+ def lu
253
+ result = @colt_algebra.lu(@colt_matrix)
254
+ [result.isNonsingular(), result.det(), result.getPivot.to_a(),
255
+ MDMatrix.from_colt_matrix(result.getL()),
256
+ MDMatrix.from_colt_matrix(result.getU())]
257
+ end
258
+
259
+ #------------------------------------------------------------------------------------
260
+ # Returns the effective numerical rank of matrix A, obtained from Singular Value
261
+ # Decomposition.
262
+ #------------------------------------------------------------------------------------
263
+
264
+ def numerical_rank
265
+ @colt_algebra.rank(@colt_matrix)
266
+ end
267
+
268
+ #------------------------------------------------------------------------------------
269
+ # Linear algebraic matrix power; B = A^k <==> B = A*A*...
270
+ #------------------------------------------------------------------------------------
271
+
272
+ def power(val)
273
+ result = @colt_algebra.pow(@colt_matrix, val)
274
+ MDMatrix.from_colt_matrix(result)
275
+ end
276
+
277
+ alias :** :power
278
+
279
+ #------------------------------------------------------------------------------------
280
+ # Solves A*X = B
281
+ #------------------------------------------------------------------------------------
282
+
283
+ def solve(matrix)
284
+ result = @colt_algebra.solve(@colt_matrix, matrix.colt_matrix)
285
+ MDMatris.from_colt_matrix(resul)
286
+ end
287
+
288
+ #------------------------------------------------------------------------------------
289
+ # Solves X*A = B, which is also A'*X' = B'.
290
+ #------------------------------------------------------------------------------------
291
+
292
+ def solve_transpose(matrix)
293
+ result = @colt_algebra.solveTranspose(@colt_matrix, matrix.colt_matrix)
294
+ MDMatris.from_colt_matrix(resul)
295
+ end
296
+
297
+ #------------------------------------------------------------------------------------
298
+ # Constructs and returns the SingularValue-decomposition of the given matrix.
299
+ #------------------------------------------------------------------------------------
300
+
301
+ def svd
302
+ result = @colt_algebra.svd(@colt_matrix)
303
+ [result.getInfo().val, result.cond(), result.norm2(), result.rank(),
304
+ result.getSingularValues().to_a(),
305
+ MDMatrix.from_colt_matrix(result.getS()),
306
+ MDMatrix.from_colt_matrix(result.getU()),
307
+ MDMatrix.from_colt_matrix(result.getV())]
308
+ end
309
+
310
+ #------------------------------------------------------------------------------------
311
+ # Returns the sum of the diagonal elements of matrix A; Sum(A[i,i]).
312
+ #------------------------------------------------------------------------------------
313
+
314
+ def trace
315
+ @colt_algebra.trace(@colt_matrix)
316
+ end
317
+
318
+ #------------------------------------------------------------------------------------
319
+ # Modifies the matrix to be a lower trapezoidal matrix.
320
+ #------------------------------------------------------------------------------------
321
+
322
+ def trapezoidal_lower
323
+ result = @colt_algebra.trapezoidalLower(@colt_matrix)
324
+ MDMatrix.from_colt_matrix(result)
325
+ end
326
+
327
+ #------------------------------------------------------------------------------------
328
+ # Returns the two-norm (aka euclidean norm) of vector X.vectorize();
329
+ #------------------------------------------------------------------------------------
330
+
331
+ def vector_norm2
332
+ @colt_algebra.vectorNorm2(@colt_matrix)
333
+ end
334
+
335
+ end # Matrix2dFloatingAlgebra
336
+
337
+ ##########################################################################################
338
+ #
339
+ ##########################################################################################
340
+
341
+ module Matrix2DDoubleAlgebra
342
+ include_package "cern.colt.matrix.tdouble.algo"
343
+
344
+ #------------------------------------------------------------------------------------
345
+ # Constructs and returns the QR-decomposition of the given matrix.
346
+ #------------------------------------------------------------------------------------
347
+
348
+ def qr(economy_size = true)
349
+ result = @colt_algebra.qr(@colt_matrix)
350
+ [result.hasFullRank(), MDMatrix.from_colt_matrix(result.getQ(economy_size)),
351
+ MDMatrix.from_colt_matrix(result.getR(economy_size))]
352
+ end
353
+
354
+ end
355
+
356
+ ##########################################################################################
357
+ #
358
+ ##########################################################################################
359
+
360
+ module Matrix2DFloatAlgebra
361
+ include_package "cern.colt.matrix.tfloat.algo"
362
+
363
+ #------------------------------------------------------------------------------------
364
+ # Constructs and returns the QR-decomposition of the given matrix.
365
+ #------------------------------------------------------------------------------------
366
+
367
+ def qr
368
+ result = @colt_algebra.qr(@colt_matrix)
369
+ [result.hasFullRank(),
370
+ MDMatrix.from_colt_matrix(result.getH()),
371
+ MDMatrix.from_colt_matrix(result.getQ()),
372
+ MDMatrix.from_colt_matrix(result.getR())]
373
+ end
374
+
375
+ end
376
+
377
+ end # Colt
378
+
379
+
380
+ ##########################################################################################
381
+ #
382
+ ##########################################################################################
383
+
384
+ class DoubleMDMatrix1D
385
+
386
+ include Colt::MatrixFloatingAlgebra
387
+ include Colt::Matrix1DAlgebra
388
+
389
+ end
390
+
391
+ ##########################################################################################
392
+ #
393
+ ##########################################################################################
394
+
395
+ class DoubleMDMatrix2D
396
+
397
+ include Colt::MatrixFloatingAlgebra
398
+ include Colt::Matrix2DAlgebra
399
+ include Colt::Matrix2DFloatingAlgebra
400
+ include Colt::Matrix2DDoubleAlgebra
401
+
402
+ end
403
+
404
+ ##########################################################################################
405
+ #
406
+ ##########################################################################################
407
+
408
+ class FloatMDMatrix1D
409
+
410
+ include Colt::MatrixFloatingAlgebra
411
+ include Colt::Matrix1DAlgebra
412
+
413
+ end
414
+
415
+ ##########################################################################################
416
+ #
417
+ ##########################################################################################
418
+
419
+ class FloatMDMatrix2D
420
+
421
+ include Colt::MatrixFloatingAlgebra
422
+ include Colt::Matrix2DAlgebra
423
+ include Colt::Matrix2DFloatingAlgebra
424
+ include Colt::Matrix2DFloatAlgebra
425
+
426
+ end
427
+
428
+ ##########################################################################################
429
+ #
430
+ ##########################################################################################
431
+
432
+ class LongMDMatrix1D
433
+
434
+ include Colt::Matrix1DAlgebra
435
+
436
+ end
437
+
438
+ ##########################################################################################
439
+ #
440
+ ##########################################################################################
441
+
442
+ class LongMDMatrix2D
443
+
444
+ include Colt::Matrix2DAlgebra
445
+
446
+ end
447
+
448
+ ##########################################################################################
449
+ #
450
+ ##########################################################################################
451
+
452
+ class IntMDMatrix1D
453
+
454
+ include Colt::Matrix1DAlgebra
455
+
456
+ end
457
+
458
+ ##########################################################################################
459
+ #
460
+ ##########################################################################################
461
+
462
+ class IntMDMatrix2D
463
+
464
+ include Colt::Matrix2DAlgebra
465
+
466
+ end