multiarray 0.14.2 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ require 'rake/packagetask'
6
6
  require 'rbconfig'
7
7
 
8
8
  PKG_NAME = 'multiarray'
9
- PKG_VERSION = '0.14.2'
9
+ PKG_VERSION = '0.15.0'
10
10
  RB_FILES = FileList[ 'lib/**/*.rb' ]
11
11
  TC_FILES = FileList[ 'test/tc_*.rb' ]
12
12
  TS_FILES = FileList[ 'test/ts_*.rb' ]
@@ -58,7 +58,7 @@ module Hornetseye
58
58
  # @return [Class] Returns +Malloc+.
59
59
  #
60
60
  # @private
61
- def memory
61
+ def memory_type
62
62
  Malloc
63
63
  end
64
64
 
@@ -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.memory+.
37
+ # @return [Class] Returns +element_type.memory_type+.
38
38
  #
39
39
  # @private
40
- def memory
41
- element_type.memory
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 :contiguous } )
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
@@ -34,7 +34,7 @@ module Hornetseye
34
34
  # @return [Class] Returns +Malloc+.
35
35
  #
36
36
  # @private
37
- def memory
37
+ def memory_type
38
38
  Malloc
39
39
  end
40
40
 
@@ -38,7 +38,7 @@ module Hornetseye
38
38
  # @return [Class] Returns +Malloc+.
39
39
  #
40
40
  # @private
41
- def memory
41
+ def memory_type
42
42
  Malloc
43
43
  end
44
44
 
@@ -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.
@@ -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.
@@ -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 = :contiguous )
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.memory.new( typecode.storage_size * count )
36
+ typecode.memory_type.new( typecode.storage_size * count )
37
37
  Hornetseye::Pointer( typecode ).new memory
38
38
  else
39
39
  size = shape.pop
@@ -152,12 +152,12 @@ module Hornetseye
152
152
  0
153
153
  end
154
154
 
155
- # Get corresponding contiguous datatype
155
+ # Get this data type
156
156
  #
157
157
  # @return [Class] Returns +self+.
158
158
  #
159
159
  # @private
160
- def contiguous
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.
@@ -47,7 +47,7 @@ module Hornetseye
47
47
  # @see List
48
48
  #
49
49
  # @private
50
- def memory
50
+ def memory_type
51
51
  List
52
52
  end
53
53
 
@@ -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 = :contiguous )
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 != shape.size
553
+ if offset.size != dimension
554
554
  raise "#{offset.size} offset(s) were given but array has " +
555
- "#{shape.size} dimensions"
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
@@ -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.memory.new target.storage_size
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
@@ -253,12 +253,12 @@ module Hornetseye
253
253
  element_type.rgb?
254
254
  end
255
255
 
256
- # Get corresponding contiguous type
256
+ # Get this type
257
257
  #
258
258
  # @return [Class] Returns +self+.
259
259
  #
260
260
  # @private
261
- def contiguous
261
+ def identity
262
262
  self
263
263
  end
264
264
 
@@ -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
- - 14
8
- - 2
9
- version: 0.14.2
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 00:00:00 +00:00
17
+ date: 2010-12-20 00:00:00 +00:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency