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 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