multiarray 0.14.2 → 0.15.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/bool.rb +1 -1
- data/lib/multiarray/composite.rb +3 -3
- data/lib/multiarray/elementwise.rb +1 -1
- data/lib/multiarray/float.rb +1 -1
- data/lib/multiarray/int.rb +1 -1
- data/lib/multiarray/lambda.rb +19 -0
- data/lib/multiarray/lookup.rb +18 -3
- data/lib/multiarray/methods.rb +1 -1
- data/lib/multiarray/multiarray.rb +1 -1
- data/lib/multiarray/node.rb +38 -2
- data/lib/multiarray/object.rb +1 -1
- data/lib/multiarray/operations.rb +24 -3
- data/lib/multiarray/pointer.rb +10 -1
- data/lib/multiarray/sequence.rb +2 -2
- data/test/tc_multiarray.rb +10 -0
- data/test/tc_sequence.rb +17 -0
- metadata +4 -4
data/Rakefile
CHANGED
data/lib/multiarray/bool.rb
CHANGED
data/lib/multiarray/composite.rb
CHANGED
@@ -34,11 +34,11 @@ module Hornetseye
|
|
34
34
|
|
35
35
|
# Memory type required to store elements of this type
|
36
36
|
#
|
37
|
-
# @return [Class] Returns +element_type.
|
37
|
+
# @return [Class] Returns +element_type.memory_type+.
|
38
38
|
#
|
39
39
|
# @private
|
40
|
-
def
|
41
|
-
element_type.
|
40
|
+
def memory_type
|
41
|
+
element_type.memory_type
|
42
42
|
end
|
43
43
|
|
44
44
|
# Get storage size to store an element of this type
|
@@ -227,7 +227,7 @@ module Hornetseye
|
|
227
227
|
# @see ElementWise_.conversion
|
228
228
|
#
|
229
229
|
# @private
|
230
|
-
def ElementWise( operation, key, conversion = lambda { |t| t.send :
|
230
|
+
def ElementWise( operation, key, conversion = lambda { |t| t.send :identity } )
|
231
231
|
retval = Class.new ElementWise_
|
232
232
|
retval.operation = operation
|
233
233
|
retval.key = key
|
data/lib/multiarray/float.rb
CHANGED
data/lib/multiarray/int.rb
CHANGED
data/lib/multiarray/lambda.rb
CHANGED
@@ -38,6 +38,25 @@ module Hornetseye
|
|
38
38
|
@term.memory
|
39
39
|
end
|
40
40
|
|
41
|
+
# Get strides of array
|
42
|
+
#
|
43
|
+
# @return [Array<Integer>,NilClass] Array strides of this type.
|
44
|
+
#
|
45
|
+
# @private
|
46
|
+
def strides
|
47
|
+
other = @term.strides
|
48
|
+
other ? other + [ stride( @index ) ] : nil
|
49
|
+
end
|
50
|
+
|
51
|
+
# Get stride for specific index
|
52
|
+
#
|
53
|
+
# @return [Integer,NilClass] Array stride of this index.
|
54
|
+
#
|
55
|
+
# @private
|
56
|
+
def stride( index )
|
57
|
+
@term.stride index
|
58
|
+
end
|
59
|
+
|
41
60
|
# Get unique descriptor of this object
|
42
61
|
#
|
43
62
|
# @param [Hash] hash Labels for any variables.
|
data/lib/multiarray/lookup.rb
CHANGED
@@ -33,12 +33,27 @@ module Hornetseye
|
|
33
33
|
#
|
34
34
|
# @return [Malloc,List,NilClass] Object storing the data.
|
35
35
|
def memory
|
36
|
-
#if array_type.storage_size != @stride.get * typecode.storage_size
|
37
|
-
# raise 'Memory is not contiguous'
|
38
|
-
#end
|
39
36
|
@p.memory
|
40
37
|
end
|
41
38
|
|
39
|
+
# Get strides of array
|
40
|
+
#
|
41
|
+
# @return [Array<Integer>,NilClass] Array strides of this type.
|
42
|
+
#
|
43
|
+
# @private
|
44
|
+
def strides
|
45
|
+
@p.strides
|
46
|
+
end
|
47
|
+
|
48
|
+
# Get stride for specific index
|
49
|
+
#
|
50
|
+
# @return [Integer,NilClass] Array stride of this index.
|
51
|
+
#
|
52
|
+
# @private
|
53
|
+
def stride( index )
|
54
|
+
@index == index ? @stride.get : @p.stride( index )
|
55
|
+
end
|
56
|
+
|
42
57
|
# Get unique descriptor of this object
|
43
58
|
#
|
44
59
|
# @param [Hash] hash Labels for any variables.
|
data/lib/multiarray/methods.rb
CHANGED
@@ -55,7 +55,7 @@ module Hornetseye
|
|
55
55
|
# @return [Proc] The new method.
|
56
56
|
#
|
57
57
|
# @private
|
58
|
-
def define_unary_method( mod, op, conversion = :
|
58
|
+
def define_unary_method( mod, op, conversion = :identity )
|
59
59
|
mod.module_eval do
|
60
60
|
define_method( "#{op}_with_hornetseye" ) do |a|
|
61
61
|
if a.is_a? Node
|
@@ -33,7 +33,7 @@ module Hornetseye
|
|
33
33
|
count = options[ :count ] || 1
|
34
34
|
if shape.empty?
|
35
35
|
memory = options[ :memory ] ||
|
36
|
-
typecode.
|
36
|
+
typecode.memory_type.new( typecode.storage_size * count )
|
37
37
|
Hornetseye::Pointer( typecode ).new memory
|
38
38
|
else
|
39
39
|
size = shape.pop
|
data/lib/multiarray/node.rb
CHANGED
@@ -152,12 +152,12 @@ module Hornetseye
|
|
152
152
|
0
|
153
153
|
end
|
154
154
|
|
155
|
-
# Get
|
155
|
+
# Get this data type
|
156
156
|
#
|
157
157
|
# @return [Class] Returns +self+.
|
158
158
|
#
|
159
159
|
# @private
|
160
|
-
def
|
160
|
+
def identity
|
161
161
|
self
|
162
162
|
end
|
163
163
|
|
@@ -418,6 +418,24 @@ module Hornetseye
|
|
418
418
|
array_type.storage_size
|
419
419
|
end
|
420
420
|
|
421
|
+
# Duplicate array expression if it is not in row-major format
|
422
|
+
#
|
423
|
+
# @return [Node] Duplicate of array or +self+.
|
424
|
+
def memorise
|
425
|
+
if memory
|
426
|
+
contiguous_strides = ( 0 ... dimension ).collect do |i|
|
427
|
+
shape[ 0 ... i ].inject( 1 ) { |a,b| a * b }
|
428
|
+
end
|
429
|
+
if strides == contiguous_strides
|
430
|
+
self
|
431
|
+
else
|
432
|
+
dup
|
433
|
+
end
|
434
|
+
else
|
435
|
+
dup
|
436
|
+
end
|
437
|
+
end
|
438
|
+
|
421
439
|
# Get memory object
|
422
440
|
#
|
423
441
|
# @return [Malloc,List,NilClass] This method will return +nil+.
|
@@ -425,6 +443,24 @@ module Hornetseye
|
|
425
443
|
nil
|
426
444
|
end
|
427
445
|
|
446
|
+
# Get strides of array
|
447
|
+
#
|
448
|
+
# @return [Array<Integer>,NilClass] Array strides of this type.
|
449
|
+
#
|
450
|
+
# @private
|
451
|
+
def strides
|
452
|
+
nil
|
453
|
+
end
|
454
|
+
|
455
|
+
# Get stride for specific index
|
456
|
+
#
|
457
|
+
# @return [Integer,NilClass] Array stride of this index.
|
458
|
+
#
|
459
|
+
# @private
|
460
|
+
def stride( index )
|
461
|
+
nil
|
462
|
+
end
|
463
|
+
|
428
464
|
# Check whether this object is an empty array
|
429
465
|
#
|
430
466
|
# @return [Boolean] Returns whether this object is an empty array.
|
data/lib/multiarray/object.rb
CHANGED
@@ -28,7 +28,7 @@ module Hornetseye
|
|
28
28
|
# @return [Proc] The new method.
|
29
29
|
#
|
30
30
|
# @private
|
31
|
-
def define_unary_op( op, conversion = :
|
31
|
+
def define_unary_op( op, conversion = :identity )
|
32
32
|
define_method( op ) do
|
33
33
|
if dimension == 0 and variables.empty?
|
34
34
|
target = typecode.send conversion
|
@@ -550,9 +550,9 @@ module Hornetseye
|
|
550
550
|
end
|
551
551
|
|
552
552
|
def shift( *offset )
|
553
|
-
if offset.size !=
|
553
|
+
if offset.size != dimension
|
554
554
|
raise "#{offset.size} offset(s) were given but array has " +
|
555
|
-
"#{
|
555
|
+
"#{dimension} dimension(s)"
|
556
556
|
end
|
557
557
|
retval = array_type.new
|
558
558
|
target, source, open, close = [], [], [], []
|
@@ -584,6 +584,27 @@ module Hornetseye
|
|
584
584
|
retval
|
585
585
|
end
|
586
586
|
|
587
|
+
def downsample( *rate )
|
588
|
+
options = rate.last.is_a?( Hash ) ? rate.pop : {}
|
589
|
+
options = { :offset => rate.collect { |r| r - 1 } }.merge options
|
590
|
+
offset = options[ :offset ]
|
591
|
+
if rate.size != dimension
|
592
|
+
raise "#{rate.size} sampling rate(s) given but array has " +
|
593
|
+
"#{dimension} dimension(s)"
|
594
|
+
end
|
595
|
+
if offset.size != dimension
|
596
|
+
raise "#{offset.size} sampling offset(s) given but array has " +
|
597
|
+
"#{dimension} dimension(s)"
|
598
|
+
end
|
599
|
+
ret_shape = ( 0 ... dimension ).collect do |i|
|
600
|
+
( shape[i] + rate[i] - 1 - offset[i] ).div rate[i]
|
601
|
+
end
|
602
|
+
field = ( 0 ... dimension ).collect do |i|
|
603
|
+
Hornetseye::lazy( *ret_shape ) { |*args| args[i] * rate[i] + offset[i] }
|
604
|
+
end
|
605
|
+
warp *field
|
606
|
+
end
|
607
|
+
|
587
608
|
end
|
588
609
|
|
589
610
|
class Node
|
data/lib/multiarray/pointer.rb
CHANGED
@@ -60,7 +60,7 @@ module Hornetseye
|
|
60
60
|
#
|
61
61
|
# @return [Memory,List] Memory for storing one object of type +target+.
|
62
62
|
def default
|
63
|
-
target.
|
63
|
+
target.memory_type.new target.storage_size
|
64
64
|
end
|
65
65
|
|
66
66
|
# Test equality of classes
|
@@ -150,6 +150,15 @@ module Hornetseye
|
|
150
150
|
@value
|
151
151
|
end
|
152
152
|
|
153
|
+
# Get strides of array
|
154
|
+
#
|
155
|
+
# @return [Array<Integer>,NilClass] Array strides of this type.
|
156
|
+
#
|
157
|
+
# @private
|
158
|
+
def strides
|
159
|
+
[]
|
160
|
+
end
|
161
|
+
|
153
162
|
# Strip of all values
|
154
163
|
#
|
155
164
|
# Split up into variables, values, and a term where all values have been
|
data/lib/multiarray/sequence.rb
CHANGED
@@ -253,12 +253,12 @@ module Hornetseye
|
|
253
253
|
element_type.rgb?
|
254
254
|
end
|
255
255
|
|
256
|
-
# Get
|
256
|
+
# Get this type
|
257
257
|
#
|
258
258
|
# @return [Class] Returns +self+.
|
259
259
|
#
|
260
260
|
# @private
|
261
|
-
def
|
261
|
+
def identity
|
262
262
|
self
|
263
263
|
end
|
264
264
|
|
data/test/tc_multiarray.rb
CHANGED
@@ -497,6 +497,16 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
497
497
|
end
|
498
498
|
end
|
499
499
|
|
500
|
+
def test_downsample
|
501
|
+
[ O, I ].each do |t|
|
502
|
+
assert_equal M( t, 1, 2 )[ [ 2 ], [ 6 ] ],
|
503
|
+
M( t, 3, 2 )[ [ 1, 2, 3 ], [ 5, 6, 7 ] ].downsample( 2, 1 )
|
504
|
+
assert_equal M( t, 2, 2 )[ [ 1, 3 ], [ 5, 7 ] ],
|
505
|
+
M( t, 3, 2 )[ [ 1, 2, 3 ], [ 5, 6, 7 ] ].
|
506
|
+
downsample( 2, 1, :offset => [ 0, 0 ] )
|
507
|
+
end
|
508
|
+
end
|
509
|
+
|
500
510
|
def test_zero
|
501
511
|
assert_equal M[ [ false, true ], [ true, false ] ],
|
502
512
|
M[ [ -1, 0 ], [ 0, 1 ] ].zero?
|
data/test/tc_sequence.rb
CHANGED
@@ -386,6 +386,23 @@ class TC_Sequence < Test::Unit::TestCase
|
|
386
386
|
end
|
387
387
|
end
|
388
388
|
|
389
|
+
def test_shift
|
390
|
+
[ O, I ].each do |t|
|
391
|
+
assert_equal S( t, 3 )[ 1, 2, 3 ], S( t, 3 )[ 1, 2, 3 ].shift( 0 )
|
392
|
+
assert_equal S( t, 3 )[ 3, 1, 2 ], S( t, 3 )[ 1, 2, 3 ].shift( 1 )
|
393
|
+
assert_equal S( t, 3 )[ 2, 3, 1 ], S( t, 3 )[ 1, 2, 3 ].shift( 2 )
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
def test_downsample
|
398
|
+
[ O, I ].each do |t|
|
399
|
+
assert_equal S( t, 2 )[ 2, 4 ],
|
400
|
+
S( t, 4 )[ 1, 2, 3, 4 ].downsample( 2 )
|
401
|
+
assert_equal S( t, 2 )[ 1, 3 ],
|
402
|
+
S( t, 4 )[ 1, 2, 3, 4 ].downsample( 2, :offset => [ 0 ] )
|
403
|
+
end
|
404
|
+
end
|
405
|
+
|
389
406
|
def test_zero
|
390
407
|
[ S( O, 3 ), S( I, 3 ) ].each do |t|
|
391
408
|
assert_equal [ false, true, false ], t[ -1, 0, 1 ].zero?.to_a
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 15
|
8
|
+
- 0
|
9
|
+
version: 0.15.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jan Wedekind
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-20 00:00:00 +00:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|