multiarray 0.22.0 → 0.23.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/Rakefile +1 -1
- data/lib/multiarray.rb +53 -16
- data/lib/multiarray/bool.rb +1 -1
- data/lib/multiarray/complex.rb +76 -68
- data/lib/multiarray/components.rb +11 -10
- data/lib/multiarray/composite.rb +1 -1
- data/lib/multiarray/diagonal.rb +11 -12
- data/lib/multiarray/element.rb +3 -3
- data/lib/multiarray/elementwise.rb +14 -14
- data/lib/multiarray/field.rb +380 -0
- data/lib/multiarray/float.rb +10 -10
- data/lib/multiarray/gcccache.rb +1 -1
- data/lib/multiarray/gcccontext.rb +35 -54
- data/lib/multiarray/gccfunction.rb +12 -19
- data/lib/multiarray/gcctype.rb +1 -1
- data/lib/multiarray/gccvalue.rb +63 -43
- data/lib/multiarray/histogram.rb +17 -19
- data/lib/multiarray/index.rb +7 -8
- data/lib/multiarray/inject.rb +11 -12
- data/lib/multiarray/int.rb +12 -11
- data/lib/multiarray/integral.rb +11 -12
- data/lib/multiarray/lambda.rb +23 -18
- data/lib/multiarray/list.rb +1 -1
- data/lib/multiarray/lookup.rb +18 -13
- data/lib/multiarray/lut.rb +13 -16
- data/lib/multiarray/malloc.rb +1 -1
- data/lib/multiarray/mask.rb +11 -8
- data/lib/multiarray/methods.rb +10 -10
- data/lib/multiarray/multiarray.rb +15 -44
- data/lib/multiarray/node.rb +64 -138
- data/lib/multiarray/object.rb +2 -6
- data/lib/multiarray/operations.rb +116 -134
- data/lib/multiarray/pointer.rb +7 -19
- data/lib/multiarray/random.rb +11 -8
- data/lib/multiarray/rgb.rb +53 -53
- data/lib/multiarray/sequence.rb +11 -496
- data/lib/multiarray/shortcuts.rb +4 -4
- data/lib/multiarray/store.rb +14 -11
- data/lib/multiarray/unmask.rb +10 -7
- data/lib/multiarray/variable.rb +11 -3
- data/test/tc_bool.rb +0 -8
- data/test/tc_compile.rb +72 -0
- data/test/tc_float.rb +0 -8
- data/test/tc_int.rb +0 -8
- data/test/tc_lazy.rb +22 -3
- data/test/tc_multiarray.rb +100 -126
- data/test/tc_object.rb +0 -16
- data/test/tc_rgb.rb +0 -16
- data/test/tc_sequence.rb +151 -165
- data/test/ts_multiarray.rb +2 -0
- metadata +7 -4
data/Rakefile
CHANGED
data/lib/multiarray.rb
CHANGED
@@ -98,6 +98,18 @@ class Object
|
|
98
98
|
|
99
99
|
end
|
100
100
|
|
101
|
+
def sexp
|
102
|
+
self
|
103
|
+
end
|
104
|
+
|
105
|
+
def sexp?
|
106
|
+
false
|
107
|
+
end
|
108
|
+
|
109
|
+
def matched?
|
110
|
+
false
|
111
|
+
end
|
112
|
+
|
101
113
|
# Boolean negation
|
102
114
|
#
|
103
115
|
# @return [FalseClass] Returns +false+.
|
@@ -105,7 +117,7 @@ class Object
|
|
105
117
|
# @see NilClass#not
|
106
118
|
# @see FalseClass#not
|
107
119
|
def not
|
108
|
-
|
120
|
+
false
|
109
121
|
end
|
110
122
|
|
111
123
|
# Boolean 'and' operation
|
@@ -116,7 +128,7 @@ class Object
|
|
116
128
|
# @see FalseClass#and
|
117
129
|
# @see NilClass#and
|
118
130
|
def and( other )
|
119
|
-
unless other.
|
131
|
+
unless other.matched?
|
120
132
|
other
|
121
133
|
else
|
122
134
|
x, y = other.coerce self
|
@@ -132,7 +144,7 @@ class Object
|
|
132
144
|
# @see FalseClass#or
|
133
145
|
# @see NilClass#or
|
134
146
|
def or( other )
|
135
|
-
unless other.
|
147
|
+
unless other.matched?
|
136
148
|
self
|
137
149
|
else
|
138
150
|
x, y = other.coerce self
|
@@ -150,7 +162,7 @@ class Object
|
|
150
162
|
# @see Hornetseye::Node
|
151
163
|
# @see Hornetseye::Binary_
|
152
164
|
def eq( other )
|
153
|
-
unless other.
|
165
|
+
unless other.matched?
|
154
166
|
self == other
|
155
167
|
else
|
156
168
|
x, y = other.coerce self
|
@@ -168,7 +180,7 @@ class Object
|
|
168
180
|
# @see Hornetseye::Node
|
169
181
|
# @see Hornetseye::Binary_
|
170
182
|
def ne( other )
|
171
|
-
unless other.
|
183
|
+
unless other.matched?
|
172
184
|
( self == other ).not
|
173
185
|
else
|
174
186
|
x, y = other.coerce self
|
@@ -230,7 +242,7 @@ class NilClass
|
|
230
242
|
# @see Object#and
|
231
243
|
# @see FalseClass#and
|
232
244
|
def and( other )
|
233
|
-
unless other.
|
245
|
+
unless other.matched?
|
234
246
|
self
|
235
247
|
else
|
236
248
|
x, y = other.coerce self
|
@@ -246,7 +258,7 @@ class NilClass
|
|
246
258
|
# @see Object#or
|
247
259
|
# @see FalseClass#or
|
248
260
|
def or( other )
|
249
|
-
unless other.
|
261
|
+
unless other.matched?
|
250
262
|
other
|
251
263
|
else
|
252
264
|
x, y = other.coerce self
|
@@ -318,7 +330,7 @@ class FalseClass
|
|
318
330
|
# @see Object#and
|
319
331
|
# @see NilClass#and
|
320
332
|
def and( other )
|
321
|
-
unless other.
|
333
|
+
unless other.matched?
|
322
334
|
self
|
323
335
|
else
|
324
336
|
x, y = other.coerce self
|
@@ -334,7 +346,7 @@ class FalseClass
|
|
334
346
|
# @see Object#or
|
335
347
|
# @see NilClass#or
|
336
348
|
def or( other )
|
337
|
-
unless other.
|
349
|
+
unless other.matched?
|
338
350
|
other
|
339
351
|
else
|
340
352
|
x, y = other.coerce self
|
@@ -473,7 +485,7 @@ class Fixnum
|
|
473
485
|
#
|
474
486
|
# @private
|
475
487
|
def power_with_hornetseye( other )
|
476
|
-
if other.
|
488
|
+
if other.matched?
|
477
489
|
x, y = other.coerce self
|
478
490
|
x ** y
|
479
491
|
else
|
@@ -609,7 +621,13 @@ class Array
|
|
609
621
|
#
|
610
622
|
# @return [Array] An array with the filter elements.
|
611
623
|
def gauss_blur_filter( sigma, max_error = 1.0 / 0x100 )
|
612
|
-
|
624
|
+
# Error function
|
625
|
+
#
|
626
|
+
# @param [Float] x Function argument
|
627
|
+
# @param [Float] sigma Function parameter
|
628
|
+
#
|
629
|
+
# @private
|
630
|
+
def erf(x, sigma)
|
613
631
|
0.5 * Math.erf( x / ( Math.sqrt( 2.0 ) * sigma.abs ) )
|
614
632
|
end
|
615
633
|
raise 'Sigma must be greater than zero.' if sigma <= 0
|
@@ -639,7 +657,13 @@ class Array
|
|
639
657
|
#
|
640
658
|
# @return [Array] An array with the filter elements.
|
641
659
|
def gauss_gradient_filter( sigma, max_error = 1.0 / 0x100 )
|
642
|
-
|
660
|
+
# Gaussian function
|
661
|
+
#
|
662
|
+
# @param [Float] x Function argument
|
663
|
+
# @param [Float] sigma Function parameter
|
664
|
+
#
|
665
|
+
# @private
|
666
|
+
def gauss(x, sigma)
|
643
667
|
1.0 / ( Math.sqrt( 2.0 * Math::PI ) * sigma.abs ) *
|
644
668
|
Math.exp( -x**2 / ( 2.0 * sigma**2 ) )
|
645
669
|
end
|
@@ -674,6 +698,18 @@ class Array
|
|
674
698
|
zip( ( 0 ... size ).to_a ).collect &action
|
675
699
|
end
|
676
700
|
|
701
|
+
def strip
|
702
|
+
collect { |arg| arg.strip }.inject [[], [], []] do |retval,s|
|
703
|
+
[retval[0] + s[0], retval[1] + s[1], retval[2] + [s[2]]]
|
704
|
+
end
|
705
|
+
end
|
706
|
+
|
707
|
+
end
|
708
|
+
|
709
|
+
class String
|
710
|
+
def method_name
|
711
|
+
tr '(),+\-*/%.@?~&|^<=>', '0123\456789ABCDEFGH'
|
712
|
+
end
|
677
713
|
end
|
678
714
|
|
679
715
|
begin
|
@@ -711,6 +747,7 @@ require 'multiarray/integral'
|
|
711
747
|
require 'multiarray/mask'
|
712
748
|
require 'multiarray/unmask'
|
713
749
|
require 'multiarray/components'
|
750
|
+
require 'multiarray/field'
|
714
751
|
require 'multiarray/operations'
|
715
752
|
require 'multiarray/methods'
|
716
753
|
require 'multiarray/rgb'
|
@@ -748,8 +785,8 @@ module Hornetseye
|
|
748
785
|
term = lazy *( shape + [ :arity => arity - 1 ] ) do |*args|
|
749
786
|
action.call *( args + [ index ] )
|
750
787
|
end
|
751
|
-
term = Node.match(
|
752
|
-
Lambda.new index, term
|
788
|
+
term = Node.match(term).new term unless term.matched?
|
789
|
+
Lambda.new index, term.sexp
|
753
790
|
end
|
754
791
|
ensure
|
755
792
|
Thread.current[ :lazy ] = previous
|
@@ -770,7 +807,7 @@ module Hornetseye
|
|
770
807
|
Thread.current[ :lazy ] = false
|
771
808
|
begin
|
772
809
|
retval = lazy *shape, &action
|
773
|
-
retval.
|
810
|
+
retval.matched? ? retval.force : retval
|
774
811
|
ensure
|
775
812
|
Thread.current[ :lazy ] = previous
|
776
813
|
end
|
@@ -790,7 +827,7 @@ module Hornetseye
|
|
790
827
|
arity = options[ :arity ] || [ action.arity, shape.size ].max
|
791
828
|
if arity <= 0
|
792
829
|
term = action.call
|
793
|
-
term.
|
830
|
+
term.matched? ? term.to_type(term.typecode.maxint) : term
|
794
831
|
else
|
795
832
|
index = Variable.new shape.empty? ? Hornetseye::INDEX( nil ) :
|
796
833
|
Hornetseye::INDEX( shape.pop )
|
data/lib/multiarray/bool.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# multiarray - Lazy multi-dimensional arrays for Ruby
|
2
|
-
# Copyright (C) 2010 Jan Wedekind
|
2
|
+
# Copyright (C) 2010, 2011 Jan Wedekind
|
3
3
|
#
|
4
4
|
# This program is free software: you can redistribute it and/or modify
|
5
5
|
# it under the terms of the GNU General Public License as published by
|
data/lib/multiarray/complex.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# multiarray - Lazy multi-dimensional arrays for Ruby
|
2
|
-
# Copyright (C) 2010 Jan Wedekind
|
2
|
+
# Copyright (C) 2010, 2011 Jan Wedekind
|
3
3
|
#
|
4
4
|
# This program is free software: you can redistribute it and/or modify
|
5
5
|
# it under the terms of the GNU General Public License as published by
|
@@ -14,6 +14,14 @@
|
|
14
14
|
# You should have received a copy of the GNU General Public License
|
15
15
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
16
|
|
17
|
+
class Complex
|
18
|
+
|
19
|
+
def decompose(i)
|
20
|
+
[real, imag][i]
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
17
25
|
# Namespace of Hornetseye computer vision library
|
18
26
|
module Hornetseye
|
19
27
|
|
@@ -35,8 +43,8 @@ module Hornetseye
|
|
35
43
|
# coercion.
|
36
44
|
#
|
37
45
|
# @private
|
38
|
-
def generic?(
|
39
|
-
value.is_a?(
|
46
|
+
def generic?(value)
|
47
|
+
value.is_a?(Numeric) or value.is_a?(GCCValue)
|
40
48
|
end
|
41
49
|
|
42
50
|
# Construct complex number using polar coordinates
|
@@ -48,7 +56,7 @@ module Hornetseye
|
|
48
56
|
#
|
49
57
|
# @private
|
50
58
|
def polar( r, theta )
|
51
|
-
new r * Math.cos(
|
59
|
+
new r * Math.cos(theta), r * Math.sin(theta)
|
52
60
|
end
|
53
61
|
|
54
62
|
end
|
@@ -98,7 +106,7 @@ module Hornetseye
|
|
98
106
|
# @return [Object] Returns +value+.
|
99
107
|
#
|
100
108
|
# @private
|
101
|
-
def assign(
|
109
|
+
def assign(value)
|
102
110
|
@real, @imag = value.real, value.imag
|
103
111
|
end
|
104
112
|
|
@@ -109,7 +117,7 @@ module Hornetseye
|
|
109
117
|
# @return [Array<InternalComplex>] Result of coercion.
|
110
118
|
#
|
111
119
|
# @private
|
112
|
-
def coerce(
|
120
|
+
def coerce(other)
|
113
121
|
if other.is_a? InternalComplex
|
114
122
|
return other, self
|
115
123
|
elsif other.is_a? Complex
|
@@ -180,8 +188,8 @@ module Hornetseye
|
|
180
188
|
# @return [InternalComplex] The result
|
181
189
|
#
|
182
190
|
# @private
|
183
|
-
def +(
|
184
|
-
if other.is_a?(
|
191
|
+
def +(other)
|
192
|
+
if other.is_a?(InternalComplex) or other.is_a?(Complex)
|
185
193
|
InternalComplex.new @real + other.real, @imag + other.imag
|
186
194
|
elsif InternalComplex.generic? other
|
187
195
|
InternalComplex.new @real + other, @imag
|
@@ -198,8 +206,8 @@ module Hornetseye
|
|
198
206
|
# @return [InternalComplex] The result
|
199
207
|
#
|
200
208
|
# @private
|
201
|
-
def -(
|
202
|
-
if other.is_a?(
|
209
|
+
def -(other)
|
210
|
+
if other.is_a?(InternalComplex) or other.is_a?(Complex)
|
203
211
|
InternalComplex.new @real - other.real, @imag - other.imag
|
204
212
|
elsif InternalComplex.generic? other
|
205
213
|
InternalComplex.new @real - other, @imag
|
@@ -216,8 +224,8 @@ module Hornetseye
|
|
216
224
|
# @return [InternalComplex] The result
|
217
225
|
#
|
218
226
|
# @private
|
219
|
-
def *(
|
220
|
-
if other.is_a?(
|
227
|
+
def *(other)
|
228
|
+
if other.is_a?(InternalComplex) or other.is_a?(Complex)
|
221
229
|
InternalComplex.new @real * other.real - @imag * other.imag,
|
222
230
|
@real * other.imag + @imag * other.real
|
223
231
|
elsif InternalComplex.generic? other
|
@@ -235,8 +243,8 @@ module Hornetseye
|
|
235
243
|
# @return [InternalComplex] The result
|
236
244
|
#
|
237
245
|
# @private
|
238
|
-
def /(
|
239
|
-
if other.is_a?(
|
246
|
+
def /(other)
|
247
|
+
if other.is_a?(InternalComplex) or other.is_a?(Complex)
|
240
248
|
self * other.conj / other.abs2
|
241
249
|
elsif InternalComplex.generic? other
|
242
250
|
InternalComplex.new @real / other, @imag / other
|
@@ -254,13 +262,13 @@ module Hornetseye
|
|
254
262
|
# @return [InternalComplex] The result
|
255
263
|
#
|
256
264
|
# @private
|
257
|
-
def **(
|
258
|
-
if other.is_a?(
|
265
|
+
def **(other)
|
266
|
+
if other.is_a?(InternalComplex) or other.is_a?(Complex)
|
259
267
|
r, theta = polar
|
260
268
|
ore = other.real
|
261
269
|
oim = other.imag
|
262
|
-
nr = Math.exp ore * Math.log(
|
263
|
-
ntheta = theta * ore + oim * Math.log(
|
270
|
+
nr = Math.exp ore * Math.log(r) - oim * theta
|
271
|
+
ntheta = theta * ore + oim * Math.log(r)
|
264
272
|
InternalComplex.polar nr, ntheta
|
265
273
|
elsif InternalComplex.generic? other
|
266
274
|
r, theta = polar
|
@@ -306,11 +314,11 @@ module Hornetseye
|
|
306
314
|
# equal or not.
|
307
315
|
#
|
308
316
|
# @private
|
309
|
-
def ==(
|
310
|
-
if other.is_a?(
|
317
|
+
def ==(other)
|
318
|
+
if other.is_a?(InternalComplex) or other.is_a?(Complex)
|
311
319
|
@real.eq( other.real ).and( @imag.eq( other.imag ) )
|
312
320
|
elsif InternalComplex.generic? other
|
313
|
-
@real.eq(
|
321
|
+
@real.eq(other).and( @imag.eq( 0 ) )
|
314
322
|
else
|
315
323
|
false
|
316
324
|
end
|
@@ -323,8 +331,8 @@ module Hornetseye
|
|
323
331
|
# @return [Numeric,GCCValue] Returns the requested component.
|
324
332
|
#
|
325
333
|
# @private
|
326
|
-
def decompose(
|
327
|
-
[
|
334
|
+
def decompose(i)
|
335
|
+
[@real, @imag][i]
|
328
336
|
end
|
329
337
|
|
330
338
|
end
|
@@ -341,7 +349,7 @@ module Math
|
|
341
349
|
# @return [Object,Hornetseye::InternalComplex] Result of method call.
|
342
350
|
#
|
343
351
|
# @private
|
344
|
-
def sqrt_with_internalcomplex(
|
352
|
+
def sqrt_with_internalcomplex(z)
|
345
353
|
if z.is_a? Hornetseye::InternalComplex
|
346
354
|
real = sqrt( ( z.abs + z.real ) / 2 )
|
347
355
|
imag = ( z.imag < 0 ).conditional -sqrt( ( z.abs - z.real ) / 2 ),
|
@@ -363,7 +371,7 @@ module Math
|
|
363
371
|
# @return [Object,Hornetseye::InternalComplex] Result of method call.
|
364
372
|
#
|
365
373
|
# @private
|
366
|
-
def exp_with_internalcomplex(
|
374
|
+
def exp_with_internalcomplex(z)
|
367
375
|
if z.is_a? Hornetseye::InternalComplex
|
368
376
|
real = exp( z.real ) * cos( z.imag )
|
369
377
|
imag = exp( z.real ) * sin( z.imag )
|
@@ -384,7 +392,7 @@ module Math
|
|
384
392
|
# @return [Object,Hornetseye::InternalComplex] Result of method call.
|
385
393
|
#
|
386
394
|
# @private
|
387
|
-
def cos_with_internalcomplex(
|
395
|
+
def cos_with_internalcomplex(z)
|
388
396
|
if z.is_a? Hornetseye::InternalComplex
|
389
397
|
real = cos( z.real ) * cosh( z.imag )
|
390
398
|
imag = -sin( z.real ) * sinh( z.imag )
|
@@ -405,7 +413,7 @@ module Math
|
|
405
413
|
# @return [Object,Hornetseye::InternalComplex] Result of method call.
|
406
414
|
#
|
407
415
|
# @private
|
408
|
-
def sin_with_internalcomplex(
|
416
|
+
def sin_with_internalcomplex(z)
|
409
417
|
if z.is_a? Hornetseye::InternalComplex
|
410
418
|
real = sin( z.real ) * cosh( z.imag )
|
411
419
|
imag = cos( z.real ) * sinh( z.imag )
|
@@ -426,9 +434,9 @@ module Math
|
|
426
434
|
# @return [Object,Hornetseye::InternalComplex] Result of method call.
|
427
435
|
#
|
428
436
|
# @private
|
429
|
-
def tan_with_internalcomplex(
|
437
|
+
def tan_with_internalcomplex(z)
|
430
438
|
if z.is_a? Hornetseye::InternalComplex
|
431
|
-
sin(
|
439
|
+
sin(z) / cos(z)
|
432
440
|
else
|
433
441
|
tan_without_internalcomplex z
|
434
442
|
end
|
@@ -445,7 +453,7 @@ module Math
|
|
445
453
|
# @return [Object,Hornetseye::InternalComplex] Result of method call.
|
446
454
|
#
|
447
455
|
# @private
|
448
|
-
def cosh_with_internalcomplex(
|
456
|
+
def cosh_with_internalcomplex(z)
|
449
457
|
if z.is_a? Hornetseye::InternalComplex
|
450
458
|
real = cosh( z.real ) * cos( z.imag )
|
451
459
|
imag = sinh( z.real ) * sin( z.imag )
|
@@ -466,7 +474,7 @@ module Math
|
|
466
474
|
# @return [Object,Hornetseye::InternalComplex] Result of method call.
|
467
475
|
#
|
468
476
|
# @private
|
469
|
-
def sinh_with_internalcomplex(
|
477
|
+
def sinh_with_internalcomplex(z)
|
470
478
|
if z.is_a? Hornetseye::InternalComplex
|
471
479
|
real = sinh( z.real ) * cos( z.imag )
|
472
480
|
imag = cosh( z.real ) * sin( z.imag )
|
@@ -487,9 +495,9 @@ module Math
|
|
487
495
|
# @return [Object,Hornetseye::InternalComplex] Result of method call.
|
488
496
|
#
|
489
497
|
# @private
|
490
|
-
def tanh_with_internalcomplex(
|
498
|
+
def tanh_with_internalcomplex(z)
|
491
499
|
if z.is_a? Hornetseye::InternalComplex
|
492
|
-
sinh(
|
500
|
+
sinh(z) / cosh(z)
|
493
501
|
else
|
494
502
|
tanh_without_internalcomplex z
|
495
503
|
end
|
@@ -506,7 +514,7 @@ module Math
|
|
506
514
|
# @return [Object,Hornetseye::InternalComplex] Result of method call.
|
507
515
|
#
|
508
516
|
# @private
|
509
|
-
def log_with_internalcomplex(
|
517
|
+
def log_with_internalcomplex(z)
|
510
518
|
if z.is_a? Hornetseye::InternalComplex
|
511
519
|
r, theta = z.polar
|
512
520
|
Hornetseye::InternalComplex.new log( r.abs ), theta
|
@@ -526,9 +534,9 @@ module Math
|
|
526
534
|
# @return [Object,Hornetseye::InternalComplex] Result of method call.
|
527
535
|
#
|
528
536
|
# @private
|
529
|
-
def log10_with_internalcomplex(
|
537
|
+
def log10_with_internalcomplex(z)
|
530
538
|
if z.is_a? Hornetseye::InternalComplex
|
531
|
-
log(
|
539
|
+
log(z) / log( 10 )
|
532
540
|
else
|
533
541
|
log10_without_internalcomplex z
|
534
542
|
end
|
@@ -545,7 +553,7 @@ module Math
|
|
545
553
|
# @return [Object,Hornetseye::InternalComplex] Result of method call.
|
546
554
|
#
|
547
555
|
# @private
|
548
|
-
def acos_with_internalcomplex(
|
556
|
+
def acos_with_internalcomplex(z)
|
549
557
|
if z.is_a? Hornetseye::InternalComplex
|
550
558
|
-1.0.im * log( z + 1.0.im * sqrt( 1.0 - z * z ) )
|
551
559
|
else
|
@@ -564,7 +572,7 @@ module Math
|
|
564
572
|
# @return [Object,Hornetseye::InternalComplex] Result of method call.
|
565
573
|
#
|
566
574
|
# @private
|
567
|
-
def asin_with_internalcomplex(
|
575
|
+
def asin_with_internalcomplex(z)
|
568
576
|
if z.is_a? Hornetseye::InternalComplex
|
569
577
|
-1.0.im * log( 1.0.im * z + sqrt( 1.0 - z * z ) )
|
570
578
|
else
|
@@ -583,7 +591,7 @@ module Math
|
|
583
591
|
# @return [Object,Hornetseye::InternalComplex] Result of method call.
|
584
592
|
#
|
585
593
|
# @private
|
586
|
-
def atan_with_internalcomplex(
|
594
|
+
def atan_with_internalcomplex(z)
|
587
595
|
if z.is_a? Hornetseye::InternalComplex
|
588
596
|
1.0.im * log( ( 1.0.im + z ) / ( 1.0.im - z ) ) / 2.0
|
589
597
|
else
|
@@ -602,7 +610,7 @@ module Math
|
|
602
610
|
# @return [Object,Hornetseye::InternalComplex] Result of method call.
|
603
611
|
#
|
604
612
|
# @private
|
605
|
-
def acosh_with_internalcomplex(
|
613
|
+
def acosh_with_internalcomplex(z)
|
606
614
|
if z.is_a? Hornetseye::InternalComplex
|
607
615
|
log( z + sqrt( z * z - 1.0 ) )
|
608
616
|
else
|
@@ -621,7 +629,7 @@ module Math
|
|
621
629
|
# @return [Object,Hornetseye::InternalComplex] Result of method call.
|
622
630
|
#
|
623
631
|
# @private
|
624
|
-
def asinh_with_internalcomplex(
|
632
|
+
def asinh_with_internalcomplex(z)
|
625
633
|
if z.is_a? Hornetseye::InternalComplex
|
626
634
|
log( z + sqrt( 1.0 + z * z ) )
|
627
635
|
else
|
@@ -640,7 +648,7 @@ module Math
|
|
640
648
|
# @return [Object,Hornetseye::InternalComplex] Result of method call.
|
641
649
|
#
|
642
650
|
# @private
|
643
|
-
def atanh_with_internalcomplex(
|
651
|
+
def atanh_with_internalcomplex(z)
|
644
652
|
if z.is_a? Hornetseye::InternalComplex
|
645
653
|
log( ( 1.0 + z ) / ( 1.0 - z ) ) / 2.0
|
646
654
|
else
|
@@ -701,10 +709,16 @@ module Hornetseye
|
|
701
709
|
# @return The return value should be ignored.
|
702
710
|
#
|
703
711
|
# @private
|
704
|
-
def inherited(
|
712
|
+
def inherited(subclass)
|
705
713
|
subclass.num_elements = 2
|
706
714
|
end
|
707
715
|
|
716
|
+
def inherit(element_type)
|
717
|
+
retval = Class.new self
|
718
|
+
retval.element_type = element_type
|
719
|
+
retval
|
720
|
+
end
|
721
|
+
|
708
722
|
# Construct new object from arguments
|
709
723
|
#
|
710
724
|
# @param [Object] real Real component of complex number.
|
@@ -747,11 +761,7 @@ module Hornetseye
|
|
747
761
|
# "SCOMPLEX").
|
748
762
|
def inspect
|
749
763
|
unless element_type.nil?
|
750
|
-
|
751
|
-
( class << self; self; end ).instance_eval do
|
752
|
-
define_method( :inspect ) { retval }
|
753
|
-
end
|
754
|
-
retval
|
764
|
+
IDENTIFIER[ element_type ] || "COMPLEX(#{element_type.inspect})"
|
755
765
|
else
|
756
766
|
super
|
757
767
|
end
|
@@ -782,11 +792,11 @@ module Hornetseye
|
|
782
792
|
# @return [Class] Result of coercion.
|
783
793
|
#
|
784
794
|
# @private
|
785
|
-
def coercion(
|
795
|
+
def coercion(other)
|
786
796
|
if other < COMPLEX_
|
787
797
|
Hornetseye::COMPLEX element_type.coercion( other.element_type )
|
788
798
|
elsif other < INT_ or other < FLOAT_
|
789
|
-
Hornetseye::COMPLEX element_type.coercion(
|
799
|
+
Hornetseye::COMPLEX element_type.coercion(other)
|
790
800
|
else
|
791
801
|
super other
|
792
802
|
end
|
@@ -799,11 +809,11 @@ module Hornetseye
|
|
799
809
|
# @return [Array<Class>] Result of coercion.
|
800
810
|
#
|
801
811
|
# @private
|
802
|
-
def coerce(
|
812
|
+
def coerce(other)
|
803
813
|
if other < COMPLEX_
|
804
814
|
return other, self
|
805
815
|
elsif other < INT_ or other < FLOAT_
|
806
|
-
return Hornetseye::COMPLEX(
|
816
|
+
return Hornetseye::COMPLEX(other), self
|
807
817
|
else
|
808
818
|
super other
|
809
819
|
end
|
@@ -814,7 +824,7 @@ module Hornetseye
|
|
814
824
|
# @param [Object] other Object to compare with.
|
815
825
|
#
|
816
826
|
# @return [Boolean] Boolean indicating whether classes are equal.
|
817
|
-
def ==(
|
827
|
+
def ==(other)
|
818
828
|
other.is_a? Class and other < COMPLEX_ and
|
819
829
|
element_type == other.element_type
|
820
830
|
end
|
@@ -835,7 +845,7 @@ module Hornetseye
|
|
835
845
|
# @return [Boolean] Returns +true+ if objects are equal.
|
836
846
|
#
|
837
847
|
# @private
|
838
|
-
def eql?(
|
848
|
+
def eql?(other)
|
839
849
|
self == other
|
840
850
|
end
|
841
851
|
|
@@ -877,7 +887,7 @@ module Hornetseye
|
|
877
887
|
# @return [Object] Returns +value+.
|
878
888
|
#
|
879
889
|
# @private
|
880
|
-
def assign(
|
890
|
+
def assign(value)
|
881
891
|
value = value.simplify
|
882
892
|
if @value.real.respond_to? :assign
|
883
893
|
@value.real.assign value.get.real
|
@@ -954,9 +964,9 @@ module Hornetseye
|
|
954
964
|
# @return [Class] Result of type alignment.
|
955
965
|
#
|
956
966
|
# @private
|
957
|
-
def align(
|
967
|
+
def align(context)
|
958
968
|
if self < COMPLEX_
|
959
|
-
Hornetseye::COMPLEX element_type.align(
|
969
|
+
Hornetseye::COMPLEX element_type.align(context)
|
960
970
|
else
|
961
971
|
super context
|
962
972
|
end
|
@@ -969,7 +979,7 @@ module Hornetseye
|
|
969
979
|
end
|
970
980
|
|
971
981
|
# Module providing the operations to manipulate array expressions
|
972
|
-
|
982
|
+
class Node
|
973
983
|
|
974
984
|
define_unary_op :real, :scalar
|
975
985
|
define_unary_op :imag, :scalar
|
@@ -978,7 +988,7 @@ module Hornetseye
|
|
978
988
|
#
|
979
989
|
# @return [Node] Array with real values.
|
980
990
|
def real_with_decompose
|
981
|
-
if typecode == OBJECT or is_a?(
|
991
|
+
if typecode == OBJECT or is_a?(Variable) or Thread.current[:lazy]
|
982
992
|
real_without_decompose
|
983
993
|
elsif typecode < COMPLEX_
|
984
994
|
decompose 0
|
@@ -994,7 +1004,7 @@ module Hornetseye
|
|
994
1004
|
# @param [Object] Value or array of values to assign to real components.
|
995
1005
|
#
|
996
1006
|
# @return [Object] Returns +value+.
|
997
|
-
def real=(
|
1007
|
+
def real=(value)
|
998
1008
|
if typecode < COMPLEX_
|
999
1009
|
decompose( 0 )[] = value
|
1000
1010
|
elsif typecode == OBJECT
|
@@ -1010,7 +1020,7 @@ module Hornetseye
|
|
1010
1020
|
#
|
1011
1021
|
# @return [Node] Array with imaginary values.
|
1012
1022
|
def imag_with_decompose
|
1013
|
-
if typecode == OBJECT or is_a?(
|
1023
|
+
if typecode == OBJECT or is_a?(Variable) or Thread.current[:lazy]
|
1014
1024
|
imag_without_decompose
|
1015
1025
|
elsif typecode < COMPLEX_
|
1016
1026
|
decompose 1
|
@@ -1026,7 +1036,7 @@ module Hornetseye
|
|
1026
1036
|
# @param [Object] Value or array of values to assign to imaginary components.
|
1027
1037
|
#
|
1028
1038
|
# @return [Object] Returns +value+.
|
1029
|
-
def imag=(
|
1039
|
+
def imag=(value)
|
1030
1040
|
if typecode < COMPLEX_
|
1031
1041
|
decompose( 1 )[] = value
|
1032
1042
|
elsif typecode == OBJECT
|
@@ -1034,7 +1044,7 @@ module Hornetseye
|
|
1034
1044
|
real + value * Complex::I
|
1035
1045
|
end
|
1036
1046
|
else
|
1037
|
-
raise "Cannot assign imaginary values to
|
1047
|
+
raise "Cannot assign imaginary values to elements of type #{typecode.inspect}"
|
1038
1048
|
end
|
1039
1049
|
end
|
1040
1050
|
|
@@ -1052,9 +1062,7 @@ module Hornetseye
|
|
1052
1062
|
# @see COMPLEX_
|
1053
1063
|
# @see COMPLEX_.element_type
|
1054
1064
|
def COMPLEX( element_type )
|
1055
|
-
|
1056
|
-
retval.element_type = element_type
|
1057
|
-
retval
|
1065
|
+
COMPLEX_.inherit element_type
|
1058
1066
|
end
|
1059
1067
|
|
1060
1068
|
module_function :COMPLEX
|
@@ -1074,7 +1082,7 @@ module Hornetseye
|
|
1074
1082
|
# @return [SCOMPLEX] The wrapped Complex value.
|
1075
1083
|
#
|
1076
1084
|
# @private
|
1077
|
-
def SCOMPLEX(
|
1085
|
+
def SCOMPLEX(value)
|
1078
1086
|
SCOMPLEX.new value
|
1079
1087
|
end
|
1080
1088
|
|
@@ -1087,7 +1095,7 @@ module Hornetseye
|
|
1087
1095
|
# @return [DCOMPLEX] The wrapped Complex value.
|
1088
1096
|
#
|
1089
1097
|
# @private
|
1090
|
-
def DCOMPLEX(
|
1098
|
+
def DCOMPLEX(value)
|
1091
1099
|
DCOMPLEX.new value
|
1092
1100
|
end
|
1093
1101
|
|