multiarray 0.23.1 → 0.23.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/lib/multiarray/complex.rb +1 -1
- data/lib/multiarray/components.rb +3 -3
- data/lib/multiarray/elementwise.rb +5 -5
- data/lib/multiarray/gcctype.rb +4 -4
- data/lib/multiarray/histogram.rb +4 -4
- data/lib/multiarray/lut.rb +4 -4
- data/lib/multiarray/mask.rb +3 -3
- data/lib/multiarray/methods.rb +4 -4
- data/lib/multiarray/node.rb +2 -2
- data/lib/multiarray/operations.rb +39 -24
- data/lib/multiarray/rgb.rb +1 -1
- data/lib/multiarray/unmask.rb +3 -3
- data/test/tc_multiarray.rb +2 -0
- data/test/tc_sequence.rb +3 -1
- metadata +4 -19
data/Rakefile
CHANGED
data/lib/multiarray/complex.rb
CHANGED
@@ -933,7 +933,7 @@ module Hornetseye
|
|
933
933
|
if values.all? { |value| value.is_a? InternalComplex or value.is_a? Complex or
|
934
934
|
value.is_a? Float or value.is_a? Integer }
|
935
935
|
if values.any? { |value| value.is_a? InternalComplex or value.is_a? Complex }
|
936
|
-
elements = values.inject(
|
936
|
+
elements = values.inject([]) do |arr,value|
|
937
937
|
if value.is_a? InternalComplex or value.is_a? Complex
|
938
938
|
arr + [ value.real, value.imag ]
|
939
939
|
else
|
@@ -215,9 +215,9 @@ module Hornetseye
|
|
215
215
|
def strip
|
216
216
|
stripped = [ @dest, @source, @default, @zero, @labels, @rank, @n ].
|
217
217
|
collect { |value| value.strip }
|
218
|
-
return stripped.inject(
|
219
|
-
stripped.inject(
|
220
|
-
self.class.new(
|
218
|
+
return stripped.inject([]) { |vars,elem| vars + elem[0] },
|
219
|
+
stripped.inject([]) { |values,elem| values + elem[1] },
|
220
|
+
self.class.new(*stripped.collect { |elem| elem[2] })
|
221
221
|
end
|
222
222
|
|
223
223
|
# Get variables contained in this term
|
@@ -130,7 +130,7 @@ module Hornetseye
|
|
130
130
|
#
|
131
131
|
# @private
|
132
132
|
def variables
|
133
|
-
@values.inject(
|
133
|
+
@values.inject(Set[]) { |vars,value| vars + value.variables }
|
134
134
|
end
|
135
135
|
|
136
136
|
# Strip of all values
|
@@ -144,9 +144,9 @@ module Hornetseye
|
|
144
144
|
# @private
|
145
145
|
def strip
|
146
146
|
stripped = @values.collect { |value| value.strip }
|
147
|
-
return stripped.inject(
|
148
|
-
stripped.inject(
|
149
|
-
self.class.new(
|
147
|
+
return stripped.inject([]) { |vars,elem| vars + elem[0] },
|
148
|
+
stripped.inject([]) { |values,elem| values + elem[1] },
|
149
|
+
self.class.new(*stripped.collect { |elem| elem[2] })
|
150
150
|
end
|
151
151
|
|
152
152
|
# Skip elements of an array
|
@@ -227,7 +227,7 @@ module Hornetseye
|
|
227
227
|
# @see ElementWise_.conversion
|
228
228
|
#
|
229
229
|
# @private
|
230
|
-
def ElementWise( operation, key, conversion =
|
230
|
+
def ElementWise( operation, key, conversion = proc { |t| t.send :identity } )
|
231
231
|
retval = Class.new ElementWise_
|
232
232
|
retval.operation = operation
|
233
233
|
retval.key = key
|
data/lib/multiarray/gcctype.rb
CHANGED
@@ -93,14 +93,14 @@ module Hornetseye
|
|
93
93
|
def r2c
|
94
94
|
case @typecode
|
95
95
|
when BOOL
|
96
|
-
[
|
96
|
+
[ proc { |expr| "( #{expr} ) != Qfalse" } ]
|
97
97
|
when BYTE, UBYTE, SINT, USINT, INT, UINT
|
98
|
-
[
|
98
|
+
[ proc { |expr| "NUM2INT( #{expr} )" } ]
|
99
99
|
when SFLOAT, DFLOAT
|
100
|
-
[
|
100
|
+
[ proc { |expr| "NUM2DBL( #{expr} )" } ]
|
101
101
|
else
|
102
102
|
if @typecode < Pointer_
|
103
|
-
[
|
103
|
+
[ proc { |expr| "(#{identifier})mallocToPtr( #{expr} )" } ]
|
104
104
|
elsif @typecode < Composite
|
105
105
|
GCCType.new( @typecode.element_type ).r2c * @typecode.num_elements
|
106
106
|
else
|
data/lib/multiarray/histogram.rb
CHANGED
@@ -120,7 +120,7 @@ module Hornetseye
|
|
120
120
|
#
|
121
121
|
# @private
|
122
122
|
def variables
|
123
|
-
@sources.inject(
|
123
|
+
@sources.inject(@dest.variables + @weight.variables) { |a,b| a + b.variables }
|
124
124
|
end
|
125
125
|
|
126
126
|
# Strip of all values
|
@@ -134,9 +134,9 @@ module Hornetseye
|
|
134
134
|
# @private
|
135
135
|
def strip
|
136
136
|
stripped = ( [ @dest, @weight ] + @sources ).collect { |source| source.strip }
|
137
|
-
return stripped.inject(
|
138
|
-
stripped.inject(
|
139
|
-
self.class.new( *stripped.collect { |elem| elem[
|
137
|
+
return stripped.inject([]) { |vars,elem| vars + elem[0] },
|
138
|
+
stripped.inject([]) { |values,elem| values + elem[1] },
|
139
|
+
self.class.new( *stripped.collect { |elem| elem[2] } )
|
140
140
|
end
|
141
141
|
|
142
142
|
# Check whether this term is compilable
|
data/lib/multiarray/lut.rb
CHANGED
@@ -101,7 +101,7 @@ module Hornetseye
|
|
101
101
|
#
|
102
102
|
# @private
|
103
103
|
def variables
|
104
|
-
@sources.inject(
|
104
|
+
@sources.inject(@table.variables) { |a,b| a + b.variables }
|
105
105
|
end
|
106
106
|
|
107
107
|
# Strip of all values
|
@@ -115,9 +115,9 @@ module Hornetseye
|
|
115
115
|
# @private
|
116
116
|
def strip
|
117
117
|
stripped = ( @sources + [ @table ] ).collect { |source| source.strip }
|
118
|
-
return stripped.inject(
|
119
|
-
stripped.inject(
|
120
|
-
self.class.new( *stripped.collect { |elem| elem[
|
118
|
+
return stripped.inject([]) { |vars,elem| vars + elem[0] },
|
119
|
+
stripped.inject([]) { |values,elem| values + elem[1] },
|
120
|
+
self.class.new( *stripped.collect { |elem| elem[2] } )
|
121
121
|
end
|
122
122
|
|
123
123
|
# Skip elements of an array
|
data/lib/multiarray/mask.rb
CHANGED
@@ -134,9 +134,9 @@ module Hornetseye
|
|
134
134
|
# @private
|
135
135
|
def strip
|
136
136
|
stripped = [ @dest, @source, @m, @index ].collect { |value| value.strip }
|
137
|
-
return stripped.inject(
|
138
|
-
stripped.inject(
|
139
|
-
self.class.new( *stripped.collect { |elem| elem[
|
137
|
+
return stripped.inject([]) { |vars,elem| vars + elem[0] },
|
138
|
+
stripped.inject([]) { |values,elem| values + elem[1] },
|
139
|
+
self.class.new( *stripped.collect { |elem| elem[2] } )
|
140
140
|
end
|
141
141
|
|
142
142
|
# Check whether this term is compilable
|
data/lib/multiarray/methods.rb
CHANGED
@@ -63,9 +63,9 @@ module Hornetseye
|
|
63
63
|
target = a.typecode.send conversion
|
64
64
|
target.new mod.send( op, a.simplify.get )
|
65
65
|
else
|
66
|
-
Hornetseye::ElementWise(
|
66
|
+
Hornetseye::ElementWise( proc { |x| mod.send op, x },
|
67
67
|
"#{mod}.#{op}",
|
68
|
-
|
68
|
+
proc { |x| x.send conversion } ).
|
69
69
|
new(a.sexp).force
|
70
70
|
end
|
71
71
|
else
|
@@ -99,9 +99,9 @@ module Hornetseye
|
|
99
99
|
target = a.typecode.send coercion, b.typecode
|
100
100
|
target.new mod.send(op, a.simplify.get, b.simplify.get)
|
101
101
|
else
|
102
|
-
Hornetseye::ElementWise(
|
102
|
+
Hornetseye::ElementWise( proc { |x,y| mod.send op, x, y },
|
103
103
|
"#{mod}.#{op}",
|
104
|
-
|
104
|
+
proc { |t,u| t.send coercion, u } ).
|
105
105
|
new(a.sexp, b.sexp).force
|
106
106
|
end
|
107
107
|
else
|
data/lib/multiarray/node.rb
CHANGED
@@ -320,7 +320,7 @@ module Hornetseye
|
|
320
320
|
#
|
321
321
|
# @return [Integer] Returns number of elements of this value.
|
322
322
|
def size
|
323
|
-
shape.inject
|
323
|
+
shape.inject 1, :*
|
324
324
|
end
|
325
325
|
|
326
326
|
# Duplicate array expression if it is not in row-major format
|
@@ -329,7 +329,7 @@ module Hornetseye
|
|
329
329
|
def memorise
|
330
330
|
if memory
|
331
331
|
contiguous_strides = (0 ... dimension).collect do |i|
|
332
|
-
shape[0 ... i].inject
|
332
|
+
shape[0 ... i].inject 1, :*
|
333
333
|
end
|
334
334
|
if strides == contiguous_strides
|
335
335
|
self
|
@@ -37,8 +37,8 @@ module Hornetseye
|
|
37
37
|
target = typecode.send conversion
|
38
38
|
target.new simplify.get.send(op)
|
39
39
|
else
|
40
|
-
Hornetseye::ElementWise(
|
41
|
-
|
40
|
+
Hornetseye::ElementWise(proc { |x| x.send op }, op,
|
41
|
+
proc { |t| t.send conversion }).
|
42
42
|
new(self).force
|
43
43
|
end
|
44
44
|
end
|
@@ -61,8 +61,8 @@ module Hornetseye
|
|
61
61
|
target = typecode.send coercion, other.typecode
|
62
62
|
target.new simplify.get.send(op, other.simplify.get)
|
63
63
|
else
|
64
|
-
Hornetseye::ElementWise(
|
65
|
-
|
64
|
+
Hornetseye::ElementWise(proc { |x,y| x.send op, y }, op,
|
65
|
+
proc { |t,u| t.send coercion, u } ).
|
66
66
|
new(sexp, other.sexp).force
|
67
67
|
end
|
68
68
|
end
|
@@ -141,8 +141,8 @@ module Hornetseye
|
|
141
141
|
target.new(simplify.get).simplify
|
142
142
|
else
|
143
143
|
key = "to_#{dest.to_s.downcase}"
|
144
|
-
Hornetseye::ElementWise(
|
145
|
-
|
144
|
+
Hornetseye::ElementWise( proc { |x| x.to_type dest }, key,
|
145
|
+
proc { |t| t.to_type dest } ).new(self).force
|
146
146
|
end
|
147
147
|
end
|
148
148
|
|
@@ -195,7 +195,7 @@ module Hornetseye
|
|
195
195
|
#
|
196
196
|
# @return [Node] Array with desired shape.
|
197
197
|
def reshape(*ret_shape)
|
198
|
-
target_size = ret_shape.inject
|
198
|
+
target_size = ret_shape.inject 1, :*
|
199
199
|
if target_size != size
|
200
200
|
raise "Target is of size #{target_size} but should be of size #{size}"
|
201
201
|
end
|
@@ -219,8 +219,8 @@ module Hornetseye
|
|
219
219
|
target.new simplify.get.conditional(proc { a.simplify.get },
|
220
220
|
proc { b.simplify.get })
|
221
221
|
else
|
222
|
-
Hornetseye::ElementWise(
|
223
|
-
|
222
|
+
Hornetseye::ElementWise(proc { |x,y,z| x.conditional y, z }, :conditional,
|
223
|
+
proc { |t,u,v| t.cond u, v }).
|
224
224
|
new(self, a.sexp, b.sexp).force
|
225
225
|
end
|
226
226
|
end
|
@@ -280,7 +280,7 @@ module Hornetseye
|
|
280
280
|
var
|
281
281
|
end.reverse
|
282
282
|
order.collect { |o| variables[o] }.
|
283
|
-
inject(
|
283
|
+
inject(term) { |retval,var| Lambda.new var, retval }
|
284
284
|
end
|
285
285
|
|
286
286
|
# Cycle indices of array
|
@@ -318,10 +318,10 @@ module Hornetseye
|
|
318
318
|
# @param [Proc] action Operation(s) to perform on elements.
|
319
319
|
#
|
320
320
|
# @return [Node] The resulting array.
|
321
|
-
def collect(
|
321
|
+
def collect(&action)
|
322
322
|
var = Variable.new typecode
|
323
323
|
block = action.call var
|
324
|
-
conversion =
|
324
|
+
conversion = proc { |t| t.to_type action.call(Variable.new(t.typecode)).typecode }
|
325
325
|
Hornetseye::ElementWise( action, block.to_s, conversion ).new( self ).force
|
326
326
|
end
|
327
327
|
|
@@ -334,14 +334,29 @@ module Hornetseye
|
|
334
334
|
|
335
335
|
# Perform cummulative operation on array
|
336
336
|
#
|
337
|
-
# @
|
338
|
-
#
|
339
|
-
#
|
340
|
-
#
|
341
|
-
#
|
337
|
+
# @overload inject(initial = nil, options = {}, &action)
|
338
|
+
# @param [Object] initial Initial value for cummulative operation.
|
339
|
+
# @option options [Variable] :var1 First variable defining operation.
|
340
|
+
# @option options [Variable] :var1 Second variable defining operation.
|
341
|
+
# @option options [Variable] :block (action.call(var1, var2)) The operation to apply.
|
342
|
+
#
|
343
|
+
# @overload inject(initial = nil, symbol)
|
344
|
+
# @param [Object] initial Initial value for cummulative operation.
|
345
|
+
# @param [Symbol,String] symbol The operation to apply.
|
342
346
|
#
|
343
347
|
# @return [Object] Result of injection.
|
344
|
-
def inject(
|
348
|
+
def inject(*args, &action)
|
349
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
350
|
+
unless action or options[:block]
|
351
|
+
unless [1, 2].member? args.size
|
352
|
+
raise "Inject expected 1 or 2 arguments but got #{args.size}"
|
353
|
+
end
|
354
|
+
initial, symbol = args[-2], args[-1]
|
355
|
+
action = proc { |a,b| a.send symbol, b }
|
356
|
+
else
|
357
|
+
raise "Inject expected 0 or 1 arguments but got #{args.size}" if args.size > 1
|
358
|
+
initial = args.empty? ? nil : args.first
|
359
|
+
end
|
345
360
|
unless initial.nil?
|
346
361
|
initial = Node.match( initial ).new initial unless initial.matched?
|
347
362
|
initial_typecode = initial.typecode
|
@@ -350,7 +365,7 @@ module Hornetseye
|
|
350
365
|
end
|
351
366
|
var1 = options[ :var1 ] || Variable.new( initial_typecode )
|
352
367
|
var2 = options[ :var2 ] || Variable.new( typecode )
|
353
|
-
block = options[ :block ] ||
|
368
|
+
block = options[ :block ] || action.call( var1, var2 )
|
354
369
|
if dimension == 0
|
355
370
|
if initial
|
356
371
|
block.subst( var1 => initial, var2 => self ).simplify
|
@@ -384,7 +399,7 @@ module Hornetseye
|
|
384
399
|
if other.matched?
|
385
400
|
if variables.empty?
|
386
401
|
if other.typecode == typecode and other.shape == shape
|
387
|
-
Hornetseye::finalise { eq(other).inject
|
402
|
+
Hornetseye::finalise { eq(other).inject true, :and }
|
388
403
|
else
|
389
404
|
false
|
390
405
|
end
|
@@ -404,7 +419,7 @@ module Hornetseye
|
|
404
419
|
#
|
405
420
|
# @return [Object] Minimum value of array.
|
406
421
|
def min( initial = nil )
|
407
|
-
inject
|
422
|
+
inject initial, :minor
|
408
423
|
end
|
409
424
|
|
410
425
|
# Find maximum value of array
|
@@ -413,14 +428,14 @@ module Hornetseye
|
|
413
428
|
#
|
414
429
|
# @return [Object] Maximum value of array.
|
415
430
|
def max( initial = nil )
|
416
|
-
inject
|
431
|
+
inject initial, :major
|
417
432
|
end
|
418
433
|
|
419
434
|
# Compute sum of array
|
420
435
|
#
|
421
436
|
# @return [Object] Sum of array.
|
422
437
|
def sum
|
423
|
-
Hornetseye::lazy { to_type typecode.maxint }.inject
|
438
|
+
Hornetseye::lazy { to_type typecode.maxint }.inject :+
|
424
439
|
end
|
425
440
|
|
426
441
|
# Find range of values of array
|
@@ -696,7 +711,7 @@ module Hornetseye
|
|
696
711
|
Hornetseye::lazy do
|
697
712
|
( 0 ... field.size ).
|
698
713
|
collect { |i| ( field[i] >= 0 ).and( field[i] < shape[i] ) }.
|
699
|
-
inject
|
714
|
+
inject :and
|
700
715
|
end.conditional Lut.new( *( field + [ self ] ) ), options[ :default ]
|
701
716
|
else
|
702
717
|
field.lut self, :safe => false
|
data/lib/multiarray/rgb.rb
CHANGED
@@ -475,7 +475,7 @@ module Hornetseye
|
|
475
475
|
if values.all? { |value| value.is_a? RGB or value.is_a? Float or
|
476
476
|
value.is_a? Integer }
|
477
477
|
if values.any? { |value| value.is_a? RGB }
|
478
|
-
elements = values.inject(
|
478
|
+
elements = values.inject([]) do |arr,value|
|
479
479
|
if value.is_a? RGB
|
480
480
|
arr + [ value.r, value.g, value.b ]
|
481
481
|
else
|
data/lib/multiarray/unmask.rb
CHANGED
@@ -141,9 +141,9 @@ module Hornetseye
|
|
141
141
|
def strip
|
142
142
|
stripped = [ @dest, @source, @m, @index, @default ].
|
143
143
|
collect { |value| value.strip }
|
144
|
-
return stripped.inject(
|
145
|
-
stripped.inject(
|
146
|
-
self.class.new(
|
144
|
+
return stripped.inject([]) { |vars,elem| vars + elem[0] },
|
145
|
+
stripped.inject([]) { |values,elem| values + elem[1] },
|
146
|
+
self.class.new(*stripped.collect { |elem| elem[2] })
|
147
147
|
end
|
148
148
|
|
149
149
|
# Check whether this term is compilable
|
data/test/tc_multiarray.rb
CHANGED
@@ -336,7 +336,9 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
336
336
|
|
337
337
|
def test_inject
|
338
338
|
assert_equal 21, M[[1, 2, 3], [4, 5, 6]].inject { |a,b| a + b }
|
339
|
+
assert_equal 21, M[[1, 2, 3], [4, 5, 6]].inject(:+)
|
339
340
|
assert_equal 28, M[[1, 2, 3], [4, 5, 6]].inject(7) { |a,b| a + b }
|
341
|
+
assert_equal 28, M[[1, 2, 3], [4, 5, 6]].inject(7, :+)
|
340
342
|
end
|
341
343
|
|
342
344
|
def test_collect
|
data/test/tc_sequence.rb
CHANGED
@@ -265,7 +265,9 @@ class TC_Sequence < Test::Unit::TestCase
|
|
265
265
|
|
266
266
|
def test_inject
|
267
267
|
assert_equal 6, S[ 1, 2, 3 ].inject { |a,b| a + b }
|
268
|
-
assert_equal
|
268
|
+
assert_equal 6, S[ 1, 2, 3 ].inject(:+)
|
269
|
+
assert_equal 10, S[ 1, 2, 3 ].inject(4) { |a,b| a + b }
|
270
|
+
assert_equal 10, S[ 1, 2, 3 ].inject(4, :+)
|
269
271
|
assert_equal 'abc', S[ 'a', 'b', 'c' ].inject { |a,b| a + b }
|
270
272
|
assert_equal 'abcd', S[ 'b', 'c', 'd' ].inject( 'a' ) { |a,b| a + b }
|
271
273
|
assert_equal C( 3, 5, 8 ), S[ C( 1, 2, 3 ), C( 2, 3, 5 ) ].inject { |a,b| a + b }
|
metadata
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: multiarray
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 23
|
8
|
-
- 1
|
9
|
-
version: 0.23.1
|
4
|
+
prerelease:
|
5
|
+
version: 0.23.2
|
10
6
|
platform: ruby
|
11
7
|
authors:
|
12
8
|
- Jan Wedekind
|
@@ -14,8 +10,7 @@ autorequire:
|
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
12
|
|
17
|
-
date: 2011-06-29 00:00:00
|
18
|
-
default_executable:
|
13
|
+
date: 2011-06-29 00:00:00 Z
|
19
14
|
dependencies:
|
20
15
|
- !ruby/object:Gem::Dependency
|
21
16
|
name: malloc
|
@@ -25,9 +20,6 @@ dependencies:
|
|
25
20
|
requirements:
|
26
21
|
- - ~>
|
27
22
|
- !ruby/object:Gem::Version
|
28
|
-
segments:
|
29
|
-
- 1
|
30
|
-
- 1
|
31
23
|
version: "1.1"
|
32
24
|
type: :runtime
|
33
25
|
version_requirements: *id001
|
@@ -39,8 +31,6 @@ dependencies:
|
|
39
31
|
requirements:
|
40
32
|
- - ">="
|
41
33
|
- !ruby/object:Gem::Version
|
42
|
-
segments:
|
43
|
-
- 0
|
44
34
|
version: "0"
|
45
35
|
type: :development
|
46
36
|
version_requirements: *id002
|
@@ -106,7 +96,6 @@ files:
|
|
106
96
|
- test/tc_bool.rb
|
107
97
|
- test/tc_rgb.rb
|
108
98
|
- test/tc_sequence.rb
|
109
|
-
has_rdoc: yard
|
110
99
|
homepage: http://wedesoft.github.com/multiarray/
|
111
100
|
licenses: []
|
112
101
|
|
@@ -120,21 +109,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
120
109
|
requirements:
|
121
110
|
- - ">="
|
122
111
|
- !ruby/object:Gem::Version
|
123
|
-
segments:
|
124
|
-
- 0
|
125
112
|
version: "0"
|
126
113
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
114
|
none: false
|
128
115
|
requirements:
|
129
116
|
- - ">="
|
130
117
|
- !ruby/object:Gem::Version
|
131
|
-
segments:
|
132
|
-
- 0
|
133
118
|
version: "0"
|
134
119
|
requirements: []
|
135
120
|
|
136
121
|
rubyforge_project: hornetseye
|
137
|
-
rubygems_version: 1.
|
122
|
+
rubygems_version: 1.8.5
|
138
123
|
signing_key:
|
139
124
|
specification_version: 3
|
140
125
|
summary: Multi-dimensional and uniform Ruby arrays
|