nmatrix 0.2.3 → 0.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.
@@ -0,0 +1,840 @@
1
+ require 'java'
2
+ require_relative '../../../ext/nmatrix_java/vendor/commons-math3-3.6.1.jar'
3
+ require_relative '../../../ext/nmatrix_java/target/nmatrix.jar'
4
+
5
+ java_import 'org.apache.commons.math3.linear.ArrayRealVector'
6
+ java_import 'org.apache.commons.math3.linear.RealMatrix'
7
+ java_import 'org.apache.commons.math3.linear.MatrixUtils'
8
+ java_import 'org.apache.commons.math3.linear.DecompositionSolver'
9
+ java_import 'org.apache.commons.math3.linear.LUDecomposition'
10
+ java_import 'org.apache.commons.math3.linear.QRDecomposition'
11
+ java_import 'org.apache.commons.math3.linear.CholeskyDecomposition'
12
+ java_import 'MatrixGenerator'
13
+ java_import 'ArrayGenerator'
14
+ java_import 'MathHelper'
15
+ java_import 'ArrayComparator'
16
+
17
+ class NMatrix
18
+ include_package 'org.apache.commons.math3.analysis.function'
19
+ attr_accessor :shape, :dim, :dtype, :stype, :s
20
+
21
+ def initialize(*args)
22
+ if args[-1] == :copy
23
+ @shape = [2,2]
24
+ @s = [0,0,0,0]
25
+ @dim = shape.is_a?(Array) ? shape.length : 2
26
+ else
27
+ if (args.length <= 3)
28
+ @shape = args[0]
29
+ if args[1].is_a?(Array)
30
+ elements = args[1]
31
+ if args.length > 2
32
+ hash = args[2]
33
+ # puts hash
34
+ @dtype = hash[:dtype]
35
+ @stype = hash[:stype]
36
+ else
37
+ @dtype = :float64
38
+ @stype = :dense
39
+ end
40
+ else
41
+ # elements = Java::double[shape[0]*shape[1]].new{ Java::Double.NaN }
42
+ if args.length > 1
43
+ if args[1].is_a?(Symbol)
44
+ hash = args[1]
45
+ @dtype = hash[:dtype]
46
+ @stype = hash[:stype]
47
+ elements = Array.new(shape*shape) unless shape.is_a? Array
48
+ else
49
+ elements = Array.new(shape*shape) unless shape.is_a? Array
50
+ end
51
+ end
52
+ end
53
+ else
54
+
55
+ offset = 0
56
+ if (!args[0].is_a?(Symbol) && !args[0].is_a?(String))
57
+ @stype = :dense
58
+ else
59
+ offset = 1
60
+ @stype = :dense
61
+ @dtype = args[-1]
62
+ end
63
+
64
+ @shape = args[offset]
65
+ elements = args[offset+1]
66
+
67
+ end
68
+
69
+
70
+ @shape = [shape,shape] unless shape.is_a?(Array)
71
+ # @dtype = interpret_dtype(argc-1-offset, argv+offset+1, stype);
72
+ # @dtype = args[:dtype] if args[:dtype]
73
+ @dtype_sym = nil
74
+ @stype_sym = nil
75
+ @default_val_num = nil
76
+ @capacity_num = nil
77
+ @size = (0...@shape.size).inject(1) { |x,i| x * @shape[i] }
78
+
79
+ j=0
80
+
81
+ if (elements.is_a?(ArrayRealVector))
82
+ @s = elements
83
+ # elsif elements.java_class.to_s == "[D"
84
+ # @s = ArrayRealVector.new(elements)
85
+ else
86
+ storage = Array.new(size)
87
+ elements = [elements,elements] unless elements.is_a?(Array)
88
+ if size > elements.length
89
+ (0...size).each do |i|
90
+ j=0 unless j!=elements.length
91
+ storage[i] = elements[j]
92
+ j+=1
93
+ end
94
+ else
95
+ storage = elements
96
+ end
97
+ if @dtype == :object
98
+ @s = storage
99
+ else
100
+ @s = ArrayRealVector.new(storage.to_java Java::double)
101
+ end
102
+ end
103
+
104
+ @dim = @shape.is_a?(Array) ? @shape.length : 2
105
+
106
+ end
107
+ end
108
+
109
+ # Needs to be properly implemented
110
+ def self.min_dtype(alpha)
111
+ :int8
112
+ end
113
+
114
+ def self.upcast(alpha, beta)
115
+ false
116
+ end
117
+
118
+ def clone
119
+ result = create_dummy_nmatrix
120
+ # ArrayRealVector#clone is disable, hence use copy
121
+ # that returns a deep copy of the object.
122
+ result.s = @s.copy
123
+ return result
124
+ end
125
+
126
+ def entries
127
+ return @s.toArray.to_a
128
+ end
129
+
130
+ def twoDMat
131
+ return MatrixUtils.createRealMatrix MatrixGenerator.getMatrixDouble(self.s.toArray, @shape[0], @shape[1])
132
+ end
133
+
134
+ def dtype
135
+ return @dtype
136
+ end
137
+
138
+ #FIXME
139
+ def self.guess_dtype arg
140
+ :float32
141
+ end
142
+
143
+ def stype
144
+ @stype = :dense
145
+ end
146
+
147
+ def cast_full *args
148
+ if args.is_a? Hash
149
+ self.dtype = args[:dtype]
150
+ else
151
+ self.dtype = args[1]
152
+ end
153
+ return self
154
+ end
155
+
156
+ def default_value
157
+ return nil
158
+ end
159
+
160
+ def __list_default_value__
161
+ #not implemented currently
162
+ end
163
+
164
+ def __yale_default_value__
165
+ #not implemented currently
166
+ end
167
+
168
+ def [] *args
169
+ return xslice(args)
170
+ end
171
+
172
+ def slice(*args)
173
+ return xslice(args)
174
+ end
175
+
176
+ def []=(*args)
177
+ to_return = nil
178
+ if args.length > @dim+1
179
+ raise(ArgumentError, "wrong number of arguments (#{args.length} for #{effective_dim(dim+1)})" )
180
+ else
181
+ slice = get_slice(@dim, args, @shape)
182
+ dense_storage_set(slice, args[-1])
183
+ to_return = args[-1]
184
+ end
185
+ return to_return
186
+ end
187
+
188
+ def is_ref?
189
+
190
+ end
191
+
192
+ # def dim
193
+ # shape.is_a?(Array) ? shape.length : 2
194
+ # end
195
+
196
+ alias :dimensions :dim
197
+
198
+ def effective_dim(s)
199
+ d = 0
200
+ (0...@dim).each do |i|
201
+ d+=1 unless @shape[i] == 1
202
+ end
203
+ return d
204
+ end
205
+
206
+ alias :effective_dimensions :effective_dim
207
+
208
+
209
+
210
+ protected
211
+
212
+ def create_dummy_nmatrix
213
+ nmatrix = NMatrix.new(:copy)
214
+ nmatrix.shape = self.shape
215
+ nmatrix.dim = self.dim
216
+ nmatrix.dtype = self.dtype
217
+ nmatrix.stype = self.stype
218
+ return nmatrix
219
+ end
220
+
221
+ def __list_to_hash__
222
+
223
+ end
224
+
225
+ public
226
+
227
+ def shape
228
+ @shape
229
+ end
230
+
231
+ def supershape s
232
+ if (s[:src] == @s)
233
+ return shape
234
+ # easy case (not a slice)
235
+ else
236
+ @s = s[:src]
237
+ end
238
+
239
+ new_shape = Array.new(dim)
240
+ (0...dim).each do |index|
241
+ new_shape[index] = shape[index]
242
+ end
243
+
244
+ return new_shape
245
+ end
246
+
247
+ def offset
248
+ # ArrayRealVector takes care of the offset value when indexing a Vector.
249
+ # Hence, return 0.
250
+ 0
251
+ end
252
+
253
+ def det_exact
254
+ # if (:stype != :dense)
255
+ # raise Exception.new("can only calculate exact determinant for dense matrices")
256
+ # return nil
257
+ # end
258
+ raise(DataTypeError, "cannot call det_exact on unsigned type") if(self.dtype == :byte)
259
+ if (@dim != 2 || @shape[0] != @shape[1])
260
+ raise(ShapeError, "matrices must be square to have a determinant defined")
261
+ return nil
262
+ end
263
+ to_return = nil
264
+ if (dtype == :object)
265
+ # to_return = *reinterpret_cast<VALUE*>(result);
266
+ else
267
+ to_return = LUDecomposition.new(self.twoDMat).getDeterminant()
268
+ end
269
+
270
+ return to_return.round(3)
271
+ end
272
+
273
+ def det_exact2
274
+ if (@dim != 2 || @shape[0] != @shape[1])
275
+ raise(ShapeError, "matrices must be square to have a determinant defined")
276
+ return nil
277
+ end
278
+ to_return = nil
279
+ if (dtype == :object)
280
+ # to_return = *reinterpret_cast<VALUE*>(result);
281
+ else
282
+ to_return = LUDecomposition.new(self.twoDMat).getDeterminant()
283
+ end
284
+
285
+ return to_return.round(3)
286
+ end
287
+
288
+ def complex_conjugate!
289
+
290
+ end
291
+
292
+
293
+ protected
294
+
295
+ def count_max_elements
296
+ return size
297
+ end
298
+
299
+ def reshape_bang arg
300
+ if(@stype == :dense)
301
+ shape_ary = arg
302
+ size = count_max_elements
303
+ new_size = 1
304
+ shape = interpret_shape(shape_ary, dim)
305
+
306
+ (0...dim).each do |index|
307
+ new_size *= shape[index]
308
+ end
309
+
310
+ if (size == new_size)
311
+ self.shape = shape
312
+ self.dim = dim
313
+ return self
314
+ else
315
+ raise(ArgumentError, "reshape cannot resize; size of new and old matrices must match")
316
+ end
317
+ else
318
+ raise(NotImplementedError, "reshape in place only for dense stype")
319
+ end
320
+ end
321
+
322
+ def interpret_shape(shape_ary, dim)
323
+ shape = []
324
+
325
+ if shape_ary.is_a?(Array)
326
+ dim = shape_ary.length
327
+
328
+ (0...dim).each do |index|
329
+ shape[index] = shape_ary[index].to_i
330
+ end
331
+
332
+ elsif shape_ary.is_a?(FIXNUM)
333
+ dim = 2
334
+ shape = Array.new(dim)
335
+ shape[0] = shape_ary.to_i
336
+ shape[1] = shape_ary.to_i
337
+ else
338
+ raise(ArgumentError, "Expected an array of numbers or a single Fixnum for matrix shape")
339
+ end
340
+
341
+ return shape
342
+ end
343
+
344
+
345
+ public
346
+
347
+ def each_with_indices
348
+ nmatrix = create_dummy_nmatrix
349
+ stride = get_stride(self)
350
+ offset = 0
351
+ #Create indices and initialize them to zero
352
+ coords = Array.new(dim){ 0 }
353
+
354
+ shape_copy = Array.new(dim)
355
+ (0...size).each do |k|
356
+ dense_storage_coords(nmatrix, k, coords, stride, offset)
357
+ slice_index = dense_storage_pos(coords,stride)
358
+ ary = Array.new
359
+ if (@dtype == :object)
360
+ ary << self.s[slice_index]
361
+ else
362
+ ary << self.s.toArray.to_a[slice_index]
363
+ end
364
+ (0...dim).each do |p|
365
+ ary << coords[p]
366
+ end
367
+
368
+ # yield the array which now consists of the value and the indices
369
+ yield(ary)
370
+ end if block_given?
371
+
372
+ return nmatrix
373
+ end
374
+
375
+
376
+ def each_stored_with_indices
377
+ nmatrix = create_dummy_nmatrix
378
+ stride = get_stride(self)
379
+ offset = 0
380
+ #Create indices and initialize them to zero
381
+ coords = Array.new(dim){ 0 }
382
+
383
+ shape_copy = Array.new(dim)
384
+
385
+ (0...size).each do |k|
386
+ dense_storage_coords(nmatrix, k, coords, stride, offset)
387
+ slice_index = dense_storage_pos(coords,stride)
388
+ ary = Array.new
389
+ if (@dtype == :object)
390
+ ary << self.s[slice_index]
391
+ else
392
+ ary << self.s.toArray.to_a[slice_index]
393
+ end
394
+ (0...dim).each do |p|
395
+ ary << coords[p]
396
+ end
397
+ # yield the array which now consists of the value and the indices
398
+ yield(ary)
399
+ end if block_given?
400
+
401
+ return nmatrix
402
+ end
403
+
404
+ def map_stored
405
+
406
+ end
407
+
408
+ def each_ordered_stored_with_indices
409
+
410
+ end
411
+
412
+
413
+ protected
414
+
415
+ def __dense_each__
416
+ nmatrix = create_dummy_nmatrix
417
+ stride = get_stride(self)
418
+ offset = 0
419
+ #Create indices and initialize them to zero
420
+ coords = Array.new(dim){ 0 }
421
+
422
+ shape_copy = Array.new(dim)
423
+ (0...size).each do |k|
424
+ if (@dtype == :object)
425
+ dense_storage_coords(nmatrix, k, coords, stride, offset)
426
+ slice_index = dense_storage_pos(coords,stride)
427
+ yield self.s[slice_index]
428
+ else
429
+ dense_storage_coords(nmatrix, k, coords, stride, offset)
430
+ slice_index = dense_storage_pos(coords,stride)
431
+ yield self.s.toArray.to_a[slice_index]
432
+ end
433
+ end if block_given?
434
+ if (@dtype == :object)
435
+ return @s.to_enum
436
+ else
437
+ return @s.toArray().to_a.to_enum
438
+ end
439
+ end
440
+
441
+ def __dense_map__
442
+ nmatrix = create_dummy_nmatrix
443
+ stride = get_stride(self)
444
+ offset = 0
445
+ coords = Array.new(dim){ 0 }
446
+ shape_copy = Array.new(dim)
447
+
448
+ s= Java::double[size].new
449
+ (0...size).each do |k|
450
+ dense_storage_coords(nmatrix, k, coords, stride, offset)
451
+ slice_index = dense_storage_pos(coords,stride)
452
+
453
+ y = yield @s.getEntry(slice_index)
454
+ @s.setEntry(slice_index, y)
455
+ end
456
+ nmatrix.s = ArrayRealVector.new s
457
+
458
+ return nmatrix
459
+ end
460
+
461
+ def __dense_map_pair__
462
+
463
+ end
464
+
465
+ def __list_map_merged_stored__
466
+
467
+ end
468
+
469
+ def __list_map_stored__
470
+
471
+ end
472
+
473
+ def __yale_map_merged_stored__
474
+
475
+ end
476
+
477
+ def __yale_map_stored__
478
+
479
+ end
480
+
481
+ def __yale_stored_diagonal_each_with_indices__
482
+
483
+ end
484
+
485
+ def __yale_stored_nondiagonal_each_with_indices__
486
+
487
+ end
488
+
489
+
490
+ public
491
+
492
+ def ==(otherNmatrix)
493
+ result = false
494
+ if (otherNmatrix.is_a?(NMatrix))
495
+ #check dimension
496
+ if (@dim != otherNmatrix.dim)
497
+ raise(ShapeError, "cannot compare matrices with different dimension")
498
+ end
499
+ #check shape
500
+ (0...dim).each do |i|
501
+ if (@shape[i] != otherNmatrix.shape[i])
502
+ raise(ShapeError, "cannot compare matrices with different shapes");
503
+ end
504
+ end
505
+
506
+ #check the entries
507
+ if dtype == :object
508
+ result = @s == otherNmatrix.s
509
+ else
510
+ result = ArrayComparator.equals(@s.toArray, otherNmatrix.s.toArray)
511
+ end
512
+ end
513
+ result
514
+ end
515
+
516
+ def =~ (other)
517
+ lha = @s.toArray.to_a
518
+ rha = other.s.toArray.to_a
519
+ resultArray = Array.new(lha.length)
520
+ if (other.is_a?(NMatrix))
521
+ #check dimension
522
+ if (@dim != other.dim)
523
+ raise(ShapeError, "cannot compare matrices with different dimension")
524
+ return nil
525
+ end
526
+ #check shape
527
+ (0...dim).each do |i|
528
+ if (@shape[i] != other.shape[i])
529
+ raise(ShapeError, "cannot compare matrices with different shapes");
530
+ return nil
531
+ end
532
+ end
533
+ #check the entries
534
+ (0...lha.length).each do |i|
535
+ resultArray[i] = lha[i] == rha[i] ? true : false
536
+ end
537
+ result = NMatrix.new(:copy)
538
+ result.shape = @shape
539
+ result.dtype = :object
540
+ result.s = resultArray
541
+ end
542
+ result
543
+ end
544
+
545
+ def !~ (other)
546
+ lha = @s.toArray.to_a
547
+ rha = other.s.toArray.to_a
548
+ resultArray = Array.new(lha.length)
549
+ if (other.is_a?(NMatrix))
550
+ #check dimension
551
+ if (@dim != other.dim)
552
+ raise(ShapeError, "cannot compare matrices with different dimension")
553
+ return nil
554
+ end
555
+ #check shape
556
+ (0...dim).each do |i|
557
+ if (@shape[i] != other.shape[i])
558
+ raise(ShapeError, "cannot compare matrices with different shapes");
559
+ return nil
560
+ end
561
+ end
562
+ #check the entries
563
+ (0...lha.length).each do |i|
564
+ resultArray[i] = lha[i] != rha[i] ? true : false
565
+ end
566
+ result = NMatrix.new(:copy)
567
+ result.shape = @shape
568
+ result.dtype = :object
569
+ result.s = resultArray
570
+ end
571
+ result
572
+ end
573
+
574
+ def <= (other)
575
+ lha = @s.toArray.to_a
576
+ rha = other.s.toArray.to_a
577
+ resultArray = Array.new(lha.length)
578
+ if (other.is_a?(NMatrix))
579
+ #check dimension
580
+ if (@dim != other.dim)
581
+ raise(ShapeError, "cannot compare matrices with different dimension")
582
+ return nil
583
+ end
584
+ #check shape
585
+ (0...dim).each do |i|
586
+ if (@shape[i] != other.shape[i])
587
+ raise(ShapeError, "cannot compare matrices with different shapes");
588
+ return nil
589
+ end
590
+ end
591
+ #check the entries
592
+ (0...lha.length).each do |i|
593
+ resultArray[i] = lha[i] <= rha[i] ? true : false
594
+ end
595
+ result = NMatrix.new(:copy)
596
+ result.shape = @shape
597
+ result.dtype = :object
598
+ result.s = resultArray
599
+ end
600
+ result
601
+ end
602
+
603
+ def >= (other)
604
+ lha = @s.toArray.to_a
605
+ rha = other.s.toArray.to_a
606
+ resultArray = Array.new(lha.length)
607
+ if (other.is_a?(NMatrix))
608
+ #check dimension
609
+ if (@dim != other.dim)
610
+ raise(ShapeError, "cannot compare matrices with different dimension")
611
+ return nil
612
+ end
613
+ #check shape
614
+ (0...dim).each do |i|
615
+ if (@shape[i] != other.shape[i])
616
+ raise(ShapeError, "cannot compare matrices with different shapes");
617
+ return nil
618
+ end
619
+ end
620
+ #check the entries
621
+ (0...lha.length).each do |i|
622
+ resultArray[i] = lha[i] >= rha[i] ? true : false
623
+ end
624
+ result = NMatrix.new(:copy)
625
+ result.shape = @shape
626
+ result.dtype = :object
627
+ result.s = resultArray
628
+ end
629
+ result
630
+ end
631
+
632
+ def < (other)
633
+ lha = @s.toArray.to_a
634
+ rha = other.s.toArray.to_a
635
+ resultArray = Array.new(lha.length)
636
+ if (other.is_a?(NMatrix))
637
+ #check dimension
638
+ if (@dim != other.dim)
639
+ raise(ShapeError, "cannot compare matrices with different dimension")
640
+ return nil
641
+ end
642
+ #check shape
643
+ (0...dim).each do |i|
644
+ if (@shape[i] != other.shape[i])
645
+ raise(ShapeError, "cannot compare matrices with different shapes");
646
+ return nil
647
+ end
648
+ end
649
+ #check the entries
650
+ (0...lha.length).each do |i|
651
+ resultArray[i] = lha[i] < rha[i] ? true : false
652
+ end
653
+ result = NMatrix.new(:copy)
654
+ result.shape = @shape
655
+ result.dtype = :object
656
+ result.s = resultArray
657
+ end
658
+ result
659
+ end
660
+
661
+ def > (other)
662
+ lha = @s.toArray.to_a
663
+ rha = other.s.toArray.to_a
664
+ resultArray = Array.new(lha.length)
665
+ if (other.is_a?(NMatrix))
666
+ #check dimension
667
+ if (@dim != other.dim)
668
+ raise(ShapeError, "cannot compare matrices with different dimension")
669
+ return nil
670
+ end
671
+ #check shape
672
+ (0...dim).each do |i|
673
+ if (@shape[i] != other.shape[i])
674
+ raise(ShapeError, "cannot compare matrices with different shapes");
675
+ return nil
676
+ end
677
+ end
678
+ #check the entries
679
+ (0...lha.length).each do |i|
680
+ resultArray[i] = lha[i] > rha[i] ? true : false
681
+ end
682
+ result = NMatrix.new(:copy)
683
+ result.shape = @shape
684
+ result.dtype = :object
685
+ result.s = resultArray
686
+ end
687
+ result
688
+ end
689
+
690
+ # /////////////////////////
691
+ # // Matrix Math Methods //
692
+ # /////////////////////////
693
+
694
+ def dot(other)
695
+ result = nil
696
+ if (other.is_a?(NMatrix))
697
+ #check dimension
698
+ if (@shape.length!=2 || other.shape.length!=2)
699
+ raise(NotImplementedError, "please convert array to nx1 or 1xn NMatrix first")
700
+ return nil
701
+ end
702
+ #check shape
703
+ if (@shape[1] != other.shape[0])
704
+ raise(ArgumentError, "incompatible dimensions")
705
+ return nil
706
+ end
707
+
708
+ # if(@stype != other.stype)
709
+ # raise(NotImplementedError, "matrices must have same stype")
710
+ # end
711
+
712
+ result = create_dummy_nmatrix
713
+ result.shape = [@shape[0],other.shape[1]]
714
+ twoDMat = self.twoDMat.multiply(other.twoDMat)
715
+ result.s = ArrayRealVector.new(ArrayGenerator.getArrayDouble(twoDMat.getData, @shape[0],other.shape[1]))
716
+ else
717
+ raise(ArgumentError, "cannot have dot product with a scalar");
718
+ end
719
+ return result;
720
+ end
721
+
722
+ def symmetric?
723
+ return is_symmetric(false)
724
+ end
725
+
726
+ def is_symmetric(hermitian)
727
+ is_symmetric = true
728
+
729
+ if (@shape[0] == @shape[1] and @dim == 2)
730
+ if @stype == :dense
731
+ if (hermitian)
732
+ #Currently, we are not dealing with complex matrices.
733
+ eps = 0
734
+ is_symmetric = MatrixUtils.isSymmetric(self.twoDMat, eps)
735
+ else
736
+ eps = 0
737
+ is_symmetric = MatrixUtils.isSymmetric(self.twoDMat, eps)
738
+ end
739
+
740
+ else
741
+ #TODO: Implement, at the very least, yale_is_symmetric. Model it after yale/transp.template.c.
742
+ # raise Exception.new("symmetric? and hermitian? only implemented for dense currently")
743
+ end
744
+ end
745
+ return is_symmetric ? true : false
746
+ end
747
+
748
+ def hermitian?
749
+ return is_symmetric(true)
750
+ end
751
+
752
+ def capacity
753
+
754
+ end
755
+
756
+ # // protected methods
757
+
758
+ protected
759
+
760
+ def __inverse__(matrix, bool =true)
761
+ # if (:stype != :dense)
762
+ # raise Exception.new("needs exact determinant implementation for this matrix stype")
763
+ # return nil
764
+ # end
765
+
766
+ if (@dim != 2 || @shape[0] != @shape[1])
767
+ raise Exception.new("matrices must be square to have an inverse defined")
768
+ return nil
769
+ end
770
+ to_return = nil
771
+ if (dtype == :RUBYOBJ)
772
+ # to_return = *reinterpret_cast<VALUE*>(result);
773
+ else
774
+ to_return = create_dummy_nmatrix
775
+ twoDMat = MatrixUtils.inverse(matrix.twoDMat)
776
+ to_return.s = ArrayRealVector.new(ArrayGenerator.getArrayDouble(twoDMat.getData, @shape[0], @shape[1]))
777
+ end
778
+
779
+ return to_return
780
+ end
781
+
782
+ def __inverse__!
783
+ # if (:stype != :dense)
784
+ # raise Exception.new("needs exact determinant implementation for this matrix stype")
785
+ # return nil
786
+ # end
787
+
788
+ if (@dim != 2 || @shape[0] != @shape[1])
789
+ raise Exception.new("matrices must be square to have an inverse defined")
790
+ return nil
791
+ end
792
+ to_return = nil
793
+ if (dtype == :RUBYOBJ)
794
+ # to_return = *reinterpret_cast<VALUE*>(result);
795
+ else
796
+ twoDMat = MatrixUtils.inverse(self.twoDMat)
797
+ @s = ArrayRealVector.new(ArrayGenerator.getArrayDouble(twoDMat.getData, @shape[0], @shape[1]))
798
+ end
799
+
800
+ return self
801
+ end
802
+
803
+ def __inverse_exact__
804
+ # if (:stype != :dense)
805
+ # raise Exception.new("needs exact determinant implementation for this matrix stype")
806
+ # return nil
807
+ # end
808
+
809
+ if (@dim != 2 || @shape[0] != @shape[1])
810
+ raise Exception.new("matrices must be square to have an inverse defined")
811
+ return nil
812
+ end
813
+ to_return = nil
814
+ if (dtype == :RUBYOBJ)
815
+ # to_return = *reinterpret_cast<VALUE*>(result);
816
+ else
817
+ to_return = create_dummy_nmatrix
818
+ twoDMat = MatrixUtils.inverse(self.twoDMat)
819
+ to_return.s = ArrayRealVector.new(ArrayGenerator.getArrayDouble(twoDMat.getData, @shape[0], @shape[1]))
820
+ end
821
+
822
+ return to_return
823
+
824
+ end
825
+
826
+ private
827
+
828
+ # // private methods
829
+
830
+ def __hessenberg__(param)
831
+ raise(NotImplementedError, "Hessenberg Transformer not implemented for NMatrix-JRuby")
832
+ end
833
+ end
834
+
835
+ # load jruby implementation of operators.
836
+ require_relative './slice.rb'
837
+ require_relative './operators.rb'
838
+ require_relative './decomposition.rb'
839
+ require_relative './error.rb'
840
+ require_relative './enumerable.rb'