multiarray 0.24.0 → 0.25.0
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 +68 -14
- data/lib/multiarray/operations.rb +37 -0
- data/lib/multiarray/rgb.rb +12 -0
- data/test/tc_multiarray.rb +9 -9
- data/test/tc_sequence.rb +38 -0
- metadata +2 -2
data/Rakefile
CHANGED
data/lib/multiarray.rb
CHANGED
@@ -808,33 +808,85 @@ module Hornetseye
|
|
808
808
|
|
809
809
|
module_function :finalise
|
810
810
|
|
811
|
-
# Method for
|
811
|
+
# Method for specifying injections in a different way
|
812
812
|
#
|
813
|
-
# @
|
814
|
-
#
|
815
|
-
#
|
813
|
+
# @overload inject(*shape, op, &action)
|
814
|
+
# @param [Array<Integer>] *shape Optional shape of result.
|
815
|
+
# @param [Proc] op Block of injection.
|
816
|
+
# @yield Operation returning array elements.
|
816
817
|
#
|
817
818
|
# @return [Object,Node] Sum of values.
|
818
|
-
|
819
|
-
|
820
|
-
|
819
|
+
#
|
820
|
+
# @private
|
821
|
+
def inject(*shape, &action)
|
822
|
+
op = shape.pop
|
823
|
+
options = shape.last.is_a?(Hash) ? shape.pop : {}
|
824
|
+
arity = options[:arity] || [action.arity, shape.size].max
|
821
825
|
if arity <= 0
|
822
826
|
term = action.call
|
823
827
|
term.matched? ? term.to_type(term.typecode.maxint) : term
|
824
828
|
else
|
825
|
-
index = Variable.new shape.empty? ? Hornetseye::INDEX(
|
826
|
-
Hornetseye::INDEX(
|
827
|
-
term =
|
828
|
-
action.call *(
|
829
|
+
index = Variable.new shape.empty? ? Hornetseye::INDEX(nil) :
|
830
|
+
Hornetseye::INDEX(shape.pop)
|
831
|
+
term = inject *(shape + [:arity => arity - 1] + [op]) do |*args|
|
832
|
+
action.call *(args + [index])
|
829
833
|
end
|
830
834
|
var1 = Variable.new term.typecode
|
831
835
|
var2 = Variable.new term.typecode
|
832
|
-
Inject.new(
|
836
|
+
Inject.new(term, index, nil, op.call(var1, var2), var1, var2).force
|
833
837
|
end
|
834
838
|
end
|
835
839
|
|
840
|
+
module_function :inject
|
841
|
+
|
842
|
+
# Method for summing values
|
843
|
+
#
|
844
|
+
# @param [Array<Integer>] *shape Optional shape of result.
|
845
|
+
# @yield Operation returning array elements.
|
846
|
+
#
|
847
|
+
# @return [Object,Node] Sum of values.
|
848
|
+
def sum(*shape, &action)
|
849
|
+
inject *(shape + [proc { |a,b| a + b }]), &action
|
850
|
+
end
|
851
|
+
|
836
852
|
module_function :sum
|
837
853
|
|
854
|
+
# Method for computing product of values
|
855
|
+
#
|
856
|
+
# @param [Array<Integer>] *shape Optional shape of result.
|
857
|
+
# @yield Operation returning array elements.
|
858
|
+
#
|
859
|
+
# @return [Object,Node] Product of values.
|
860
|
+
def prod(*shape, &action)
|
861
|
+
inject *(shape + [proc { |a,b| a * b }]), &action
|
862
|
+
end
|
863
|
+
|
864
|
+
module_function :prod
|
865
|
+
|
866
|
+
# Method for computing minimum of values
|
867
|
+
#
|
868
|
+
# @param [Array<Integer>] *shape Optional shape of result.
|
869
|
+
# @yield Operation returning array elements.
|
870
|
+
#
|
871
|
+
# @return [Object,Node] Minimum of values.
|
872
|
+
def min(*shape, &action)
|
873
|
+
inject *(shape + [proc { |a,b| a.minor b }]), &action
|
874
|
+
end
|
875
|
+
|
876
|
+
module_function :min
|
877
|
+
|
878
|
+
# Method for computing maximum of values
|
879
|
+
#
|
880
|
+
# @param [Array<Integer>] *shape Optional shape of result.
|
881
|
+
# @yield Operation returning array elements.
|
882
|
+
#
|
883
|
+
# @return [Object,Node] Maximum of values.
|
884
|
+
def max(*shape, &action)
|
885
|
+
inject *(shape + [proc { |a,b| a.major b }]), &action
|
886
|
+
end
|
887
|
+
|
888
|
+
module_function :max
|
889
|
+
|
838
890
|
def argument(block, options = {}, &action)
|
839
891
|
arity = options[:arity] || action.arity
|
840
892
|
if arity > 0
|
@@ -859,8 +911,10 @@ module Hornetseye
|
|
859
911
|
elsif sub_arg.first.is_a? Integer
|
860
912
|
sub_arg + [lut[*sub_arg]]
|
861
913
|
else
|
862
|
-
id =
|
863
|
-
|
914
|
+
id = (sub_arg.size ... lut.dimension).collect do |i|
|
915
|
+
lazy(*sub_arg.first.shape) { |*j| j[i - lut.dimension + sub_arg.first.dimension] }
|
916
|
+
end
|
917
|
+
sub_arg + [lut.warp(*(sub_arg + id))]
|
864
918
|
end
|
865
919
|
else
|
866
920
|
[]
|
@@ -438,6 +438,20 @@ module Hornetseye
|
|
438
438
|
Hornetseye::lazy { to_type typecode.maxint }.inject :+
|
439
439
|
end
|
440
440
|
|
441
|
+
# Compute product of array
|
442
|
+
#
|
443
|
+
# @return [Object] Product of array.
|
444
|
+
def prod
|
445
|
+
Hornetseye::lazy { to_type typecode.maxint }.inject :*
|
446
|
+
end
|
447
|
+
|
448
|
+
# Compute average of array
|
449
|
+
#
|
450
|
+
# @return [Object] Mean of array.
|
451
|
+
def mean
|
452
|
+
sum / size
|
453
|
+
end
|
454
|
+
|
441
455
|
# Find range of values of array
|
442
456
|
#
|
443
457
|
# @return [Object] Range of values of array.
|
@@ -491,6 +505,29 @@ module Hornetseye
|
|
491
505
|
collect { |x| x.major( range.begin ).minor range.end }
|
492
506
|
end
|
493
507
|
|
508
|
+
# Stretch values from one range to another
|
509
|
+
#
|
510
|
+
# @param [Range] from Target range of values.
|
511
|
+
# @param [Range] to Source range of values.
|
512
|
+
#
|
513
|
+
# @return [Node] Array with stretched values.
|
514
|
+
def stretch(from = 0 .. 0xFF, to = 0 .. 0xFF)
|
515
|
+
if from.exclude_end?
|
516
|
+
raise "Stretching does not support ranges with end value " +
|
517
|
+
"excluded (such as #{from})"
|
518
|
+
end
|
519
|
+
if to.exclude_end?
|
520
|
+
raise "Stretching does not support ranges with end value " +
|
521
|
+
"excluded (such as #{to})"
|
522
|
+
end
|
523
|
+
if from.last != from.first
|
524
|
+
factor = (to.last - to.first).to_f / (from.last - from.first)
|
525
|
+
collect { |x| ((x - from.first) * factor).major(to.first).minor to.last }
|
526
|
+
else
|
527
|
+
(self <= from.first).conditional to.first, to.last
|
528
|
+
end
|
529
|
+
end
|
530
|
+
|
494
531
|
# Fill array with a value
|
495
532
|
#
|
496
533
|
# @param [Object] value Value to fill array with.
|
data/lib/multiarray/rgb.rb
CHANGED
@@ -949,5 +949,17 @@ module Math
|
|
949
949
|
module_function :sqrt_without_rgb
|
950
950
|
module_function :sqrt
|
951
951
|
|
952
|
+
def log_with_rgb(c)
|
953
|
+
if c.is_a? Hornetseye::RGB
|
954
|
+
Hornetseye::RGB.new log( c.r ), log( c.g ), log( c.b )
|
955
|
+
else
|
956
|
+
log_without_rgb c
|
957
|
+
end
|
958
|
+
end
|
959
|
+
|
960
|
+
alias_method_chain :log, :rgb
|
961
|
+
module_function :log_without_rgb
|
962
|
+
module_function :log
|
963
|
+
|
952
964
|
end
|
953
965
|
|
data/test/tc_multiarray.rb
CHANGED
@@ -369,16 +369,16 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
369
369
|
assert_equal [ [ 1, 2, 3 ] , [ 4, 5, 6 ] ], sum { || m }.to_a
|
370
370
|
end
|
371
371
|
|
372
|
-
def
|
373
|
-
assert_equal [[
|
374
|
-
|
375
|
-
assert_equal [
|
372
|
+
def test_argmax
|
373
|
+
assert_equal [[1, 1, 0]],
|
374
|
+
argmax { |i| M[[1, 2, 3], [4, 3, 2]][i] }.collect { |x| x.to_a }
|
375
|
+
assert_equal [0, 1], argmax { |i,j| M[[1, 2, 3], [4, 3, 0]][i,j] }
|
376
376
|
m = M[[[1,0,3,4],[5,4,3,2],[1,2,1,0]],[[3,2,4,1],[7,4,8,2],[2,1,9,1]]]
|
377
|
-
assert_equal [[[
|
378
|
-
|
379
|
-
assert_equal [[
|
380
|
-
|
381
|
-
assert_equal [
|
377
|
+
assert_equal [[[1, 1, 1, 0], [1, 0, 1, 0], [1, 0, 1, 1]]],
|
378
|
+
argmax { |i| m[i] }.collect { |x| x.to_a }
|
379
|
+
assert_equal [[1, 1, 2, 0], [1, 0, 1, 0]],
|
380
|
+
argmax { |i,j| m[i,j] }.collect { |x| x.to_a }
|
381
|
+
assert_equal [2, 2, 1], argmax { |i,j,k| m[i,j,k] }
|
382
382
|
end
|
383
383
|
|
384
384
|
def test_min
|
data/test/tc_sequence.rb
CHANGED
@@ -48,6 +48,18 @@ class TC_Sequence < Test::Unit::TestCase
|
|
48
48
|
Hornetseye::sum *args, &action
|
49
49
|
end
|
50
50
|
|
51
|
+
def prod( *args, &action )
|
52
|
+
Hornetseye::prod *args, &action
|
53
|
+
end
|
54
|
+
|
55
|
+
def min( *args, &action )
|
56
|
+
Hornetseye::min *args, &action
|
57
|
+
end
|
58
|
+
|
59
|
+
def max( *args, &action )
|
60
|
+
Hornetseye::max *args, &action
|
61
|
+
end
|
62
|
+
|
51
63
|
def argmin( *args, &action )
|
52
64
|
Hornetseye::argmin *args, &action
|
53
65
|
end
|
@@ -315,6 +327,17 @@ class TC_Sequence < Test::Unit::TestCase
|
|
315
327
|
assert_equal 384, sum { |i| S[ 128, 128, 128 ][i] }
|
316
328
|
end
|
317
329
|
|
330
|
+
def test_prod
|
331
|
+
[ S(O), S(I) ].each do |t|
|
332
|
+
assert_equal 6, t[ 1, 2, 3 ].prod
|
333
|
+
assert_equal 6, prod { |i| t[ 1, 2, 3 ][ i ] }
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
def test_mean
|
338
|
+
assert_equal 2, S(I)[1, 2, 3].mean
|
339
|
+
end
|
340
|
+
|
318
341
|
def test_argmin
|
319
342
|
[S(O), S(I)].each do |t|
|
320
343
|
assert_equal [], argmin { t[1, 0, 2] }
|
@@ -334,6 +357,7 @@ class TC_Sequence < Test::Unit::TestCase
|
|
334
357
|
def test_min
|
335
358
|
[O, I].each do |t|
|
336
359
|
assert_equal 2, S(t)[4, 2, 3].min
|
360
|
+
assert_equal 2, min { |i| S(t)[4, 2, 3][i] }
|
337
361
|
end
|
338
362
|
assert_equal C(1, 2, 1), S[C(1, 2, 3), C(3, 2, 1)].min
|
339
363
|
end
|
@@ -341,6 +365,7 @@ class TC_Sequence < Test::Unit::TestCase
|
|
341
365
|
def test_max
|
342
366
|
[O, I].each do |t|
|
343
367
|
assert_equal 4, S(t)[4, 2, 3].max
|
368
|
+
assert_equal 4, max { |i| S(t)[4, 2, 3][i] }
|
344
369
|
end
|
345
370
|
assert_equal C(3, 2, 3), S[C(1, 2, 3), C(3, 2, 1)].max
|
346
371
|
end
|
@@ -359,6 +384,13 @@ class TC_Sequence < Test::Unit::TestCase
|
|
359
384
|
assert_equal [ C( 3, 4, 5 ) ], S[ C( 2, 4, 6 ) ].clip( 3 .. 5 ).to_a
|
360
385
|
end
|
361
386
|
|
387
|
+
def test_stretch
|
388
|
+
assert_equal [0.0, 127.5, 255.0], S[1, 2, 3].stretch(1 .. 3).to_a
|
389
|
+
assert_equal [0, 0, 255], S[1, 2, 3].stretch(2 .. 2).to_a
|
390
|
+
assert_equal [0.0, 0.5, 1.0], S[1, 2, 3].stretch(1 .. 3, 0 .. 1).to_a
|
391
|
+
assert_equal [0, 0, 1], S[1, 2, 3].stretch(2 .. 2, 0 .. 1).to_a
|
392
|
+
end
|
393
|
+
|
362
394
|
def test_sum
|
363
395
|
[ S(O), S(I) ].each do |t|
|
364
396
|
assert_equal 9, t[ 4, 2, 3 ].sum
|
@@ -823,6 +855,12 @@ class TC_Sequence < Test::Unit::TestCase
|
|
823
855
|
assert_in_delta x.real, y.real, 1.0e-5
|
824
856
|
assert_in_delta x.imag, y.imag, 1.0e-5
|
825
857
|
end
|
858
|
+
[ Math.log( C( 1, 2, 3 ) ), Math.log( C( 2, 4, 6 ) ) ].
|
859
|
+
zip( Math.log( S[ C( 1, 2, 3 ), C( 2, 4, 6 ) ] ).to_a ).each do |x,y|
|
860
|
+
assert_in_delta x.r, y.r, 1.0e-5
|
861
|
+
assert_in_delta x.g, y.g, 1.0e-5
|
862
|
+
assert_in_delta x.b, y.b, 1.0e-5
|
863
|
+
end
|
826
864
|
end
|
827
865
|
|
828
866
|
def test_log10
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: multiarray
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.25.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jan Wedekind
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-09-06 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: malloc
|