multiarray 0.16.0 → 0.17.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 +57 -0
- data/lib/multiarray/gccvalue.rb +38 -0
- data/lib/multiarray/mask.rb +147 -0
- data/lib/multiarray/multiarray.rb +5 -3
- data/lib/multiarray/operations.rb +54 -1
- data/lib/multiarray/sequence.rb +10 -3
- data/lib/multiarray/unmask.rb +154 -0
- data/test/tc_multiarray.rb +27 -0
- data/test/tc_sequence.rb +23 -0
- metadata +5 -3
data/Rakefile
CHANGED
data/lib/multiarray.rb
CHANGED
@@ -176,6 +176,25 @@ class Object
|
|
176
176
|
a.is_a?( Proc ) ? a.call : a
|
177
177
|
end
|
178
178
|
|
179
|
+
# Conditional operation
|
180
|
+
#
|
181
|
+
# @param [Proc] action Action to perform if condition is +true+.
|
182
|
+
#
|
183
|
+
# @return [Object] The return value should be ignored.
|
184
|
+
def if( &action )
|
185
|
+
action.call
|
186
|
+
end
|
187
|
+
|
188
|
+
# Conditional operation
|
189
|
+
#
|
190
|
+
# @param [Proc] action1 Action to perform if condition is +true+.
|
191
|
+
# @param [Proc] action2 Action to perform if condition is +false+.
|
192
|
+
#
|
193
|
+
# @return [Object] The return value should be ignored.
|
194
|
+
def if_else( action1, action2 )
|
195
|
+
action1.call
|
196
|
+
end
|
197
|
+
|
179
198
|
end
|
180
199
|
|
181
200
|
# +NilClass+ is extended with a few methods
|
@@ -235,6 +254,24 @@ class NilClass
|
|
235
254
|
b.is_a?( Proc ) ? b.call : b
|
236
255
|
end
|
237
256
|
|
257
|
+
# Conditional operation
|
258
|
+
#
|
259
|
+
# @param [Proc] action Action to perform if condition is +true+.
|
260
|
+
#
|
261
|
+
# @return [Object] The return value should be ignored.
|
262
|
+
def if( &action )
|
263
|
+
end
|
264
|
+
|
265
|
+
# Conditional operation
|
266
|
+
#
|
267
|
+
# @param [Proc] action1 Action to perform if condition is +true+.
|
268
|
+
# @param [Proc] action2 Action to perform if condition is +false+.
|
269
|
+
#
|
270
|
+
# @return [Object] The return value should be ignored.
|
271
|
+
def if_else( action1, action2 )
|
272
|
+
action2.call
|
273
|
+
end
|
274
|
+
|
238
275
|
# Check whether this term is compilable
|
239
276
|
#
|
240
277
|
# @return [FalseClass,TrueClass] Returns +false+
|
@@ -305,6 +342,24 @@ class FalseClass
|
|
305
342
|
b.is_a?( Proc ) ? b.call : b
|
306
343
|
end
|
307
344
|
|
345
|
+
# Conditional operation
|
346
|
+
#
|
347
|
+
# @param [Proc] action Action to perform if condition is +true+.
|
348
|
+
#
|
349
|
+
# @return [Object] The return value should be ignored.
|
350
|
+
def if( &action )
|
351
|
+
end
|
352
|
+
|
353
|
+
# Conditional operation
|
354
|
+
#
|
355
|
+
# @param [Proc] action1 Action to perform if condition is +true+.
|
356
|
+
# @param [Proc] action2 Action to perform if condition is +false+.
|
357
|
+
#
|
358
|
+
# @return [Object] The return value should be ignored.
|
359
|
+
def if_else( action1, action2 )
|
360
|
+
action2.call
|
361
|
+
end
|
362
|
+
|
308
363
|
end
|
309
364
|
|
310
365
|
# Some methods of +Fixnum+ are modified
|
@@ -603,6 +658,8 @@ require 'multiarray/diagonal'
|
|
603
658
|
require 'multiarray/histogram'
|
604
659
|
require 'multiarray/lut'
|
605
660
|
require 'multiarray/integral'
|
661
|
+
require 'multiarray/mask'
|
662
|
+
require 'multiarray/unmask'
|
606
663
|
require 'multiarray/operations'
|
607
664
|
require 'multiarray/methods'
|
608
665
|
require 'multiarray/rgb'
|
data/lib/multiarray/gccvalue.rb
CHANGED
@@ -333,6 +333,44 @@ module Hornetseye
|
|
333
333
|
|
334
334
|
alias_method_chain :conditional, :complex
|
335
335
|
|
336
|
+
# Generate code for conditional statement
|
337
|
+
#
|
338
|
+
# @param [Proc] action Block of conditional.
|
339
|
+
#
|
340
|
+
# @return [Object] Returns +self+.
|
341
|
+
#
|
342
|
+
# @private
|
343
|
+
def if( &action )
|
344
|
+
@function << "#{@function.indent}if ( #{self} ) {\n"
|
345
|
+
@function.indent_offset +1
|
346
|
+
action.call
|
347
|
+
@function.indent_offset -1
|
348
|
+
@function << "#{@function.indent}};\n"
|
349
|
+
self
|
350
|
+
end
|
351
|
+
|
352
|
+
# Generate code for conditional statement
|
353
|
+
#
|
354
|
+
# @param [Proc] action1 Block to run when condition is fullfilled.
|
355
|
+
# @param [Proc] action2 Block to run otherwise.
|
356
|
+
#
|
357
|
+
# @return [Object] Returns +self+.
|
358
|
+
#
|
359
|
+
# @private
|
360
|
+
def if_else( action1, action2 )
|
361
|
+
@function << "#{@function.indent}if ( #{self} ) {\n"
|
362
|
+
@function.indent_offset +1
|
363
|
+
action1.call
|
364
|
+
@function.indent_offset -1
|
365
|
+
@function << "#{@function.indent}} else {\n"
|
366
|
+
@function.indent_offset +1
|
367
|
+
action2.call
|
368
|
+
@function.indent_offset -1
|
369
|
+
@function << "#{@function.indent}};\n"
|
370
|
+
self
|
371
|
+
end
|
372
|
+
|
373
|
+
|
336
374
|
define_unary_op :not, '!'
|
337
375
|
define_unary_op :~
|
338
376
|
define_unary_op :-@, :-
|
@@ -0,0 +1,147 @@
|
|
1
|
+
# multiarray - Lazy multi-dimensional arrays for Ruby
|
2
|
+
# Copyright (C) 2010 Jan Wedekind
|
3
|
+
#
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU General Public License
|
15
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
|
17
|
+
# Namespace of Hornetseye computer vision library
|
18
|
+
module Hornetseye
|
19
|
+
|
20
|
+
# Class for representing masking operations
|
21
|
+
class Mask < Node
|
22
|
+
|
23
|
+
class << self
|
24
|
+
|
25
|
+
# Check whether objects of this class are finalised computations
|
26
|
+
#
|
27
|
+
# @return [Boolean] Returns +false+.
|
28
|
+
#
|
29
|
+
# @private
|
30
|
+
def finalised?
|
31
|
+
false
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
# Constructor
|
37
|
+
#
|
38
|
+
# @param [Node] dest Target array to write histogram to.
|
39
|
+
# @param [Node] source Source array with values to apply mask to.
|
40
|
+
# @param [Node] m Boolean array with values of mask.
|
41
|
+
# @param [Node] index Counter for maintaining size of result.
|
42
|
+
#
|
43
|
+
# @private
|
44
|
+
def initialize( dest, source, m, index )
|
45
|
+
@dest, @source, @m, @index = dest, source, m, index
|
46
|
+
end
|
47
|
+
|
48
|
+
# Get unique descriptor of this object
|
49
|
+
#
|
50
|
+
# @param [Hash] hash Labels for any variables.
|
51
|
+
#
|
52
|
+
# @return [String] Descriptor of this object,
|
53
|
+
#
|
54
|
+
# @private
|
55
|
+
def descriptor( hash )
|
56
|
+
"Mask(#{@dest.descriptor( hash )},#{@source.descriptor( hash )}," +
|
57
|
+
"#{@m.descriptor( hash )},#{@index.descriptor( hash )})"
|
58
|
+
end
|
59
|
+
|
60
|
+
# Get type of result of delayed operation
|
61
|
+
#
|
62
|
+
# @return [Class] Type of result.
|
63
|
+
#
|
64
|
+
# @private
|
65
|
+
def array_type
|
66
|
+
@dest.array_type
|
67
|
+
end
|
68
|
+
|
69
|
+
# Perform masking operation
|
70
|
+
#
|
71
|
+
# @return [Node] Result of computation
|
72
|
+
#
|
73
|
+
# @private
|
74
|
+
def demand
|
75
|
+
if variables.empty?
|
76
|
+
index = @index.simplify
|
77
|
+
if @m.dimension > 0
|
78
|
+
@m.shape.last.times do |i|
|
79
|
+
m = @m.element INT.new( i )
|
80
|
+
source = @source.element INT.new( i )
|
81
|
+
Mask.new( @dest, source, m, index ).demand
|
82
|
+
end
|
83
|
+
else
|
84
|
+
@m.simplify.get.if do
|
85
|
+
Store.new( @dest.element( index ), @source ).demand
|
86
|
+
index.store index + 1
|
87
|
+
end
|
88
|
+
end
|
89
|
+
@index.store index
|
90
|
+
@dest
|
91
|
+
else
|
92
|
+
super
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
# Substitute variables
|
97
|
+
#
|
98
|
+
# Substitute the variables with the values given in the hash.
|
99
|
+
#
|
100
|
+
# @param [Hash] hash Substitutions to apply.
|
101
|
+
#
|
102
|
+
# @return [Node] Term with substitutions applied.
|
103
|
+
#
|
104
|
+
# @private
|
105
|
+
def subst( hash )
|
106
|
+
self.class.new @dest.subst( hash ), @source.subst( hash ), @m.subst( hash ),
|
107
|
+
@index.subst( hash )
|
108
|
+
end
|
109
|
+
|
110
|
+
# Get variables contained in this term
|
111
|
+
#
|
112
|
+
# @return [Set] Returns list of variables.
|
113
|
+
#
|
114
|
+
# @private
|
115
|
+
def variables
|
116
|
+
@dest.variables + @source.variables + @m.variables + @index.variables
|
117
|
+
end
|
118
|
+
|
119
|
+
# Strip of all values
|
120
|
+
#
|
121
|
+
# Split up into variables, values, and a term where all values have been
|
122
|
+
# replaced with variables.
|
123
|
+
#
|
124
|
+
# @return [Array<Array,Node>] Returns an array of variables, an array of
|
125
|
+
# values, and the term based on variables.
|
126
|
+
#
|
127
|
+
# @private
|
128
|
+
def strip
|
129
|
+
stripped = [ @dest, @source, @m, @index ].collect { |value| value.strip }
|
130
|
+
return stripped.inject( [] ) { |vars,elem| vars + elem[ 0 ] },
|
131
|
+
stripped.inject( [] ) { |values,elem| values + elem[ 1 ] },
|
132
|
+
self.class.new( *stripped.collect { |elem| elem[ 2 ] } )
|
133
|
+
end
|
134
|
+
|
135
|
+
# Check whether this term is compilable
|
136
|
+
#
|
137
|
+
# @return [Boolean] Returns whether this term is compilable.
|
138
|
+
#
|
139
|
+
# @private
|
140
|
+
def compilable?
|
141
|
+
[ @dest, @source, @m, @index ].all? { |value| value.compilable? }
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
147
|
+
|
@@ -24,11 +24,13 @@ module Hornetseye
|
|
24
24
|
|
25
25
|
# Create new multi-dimensional array
|
26
26
|
#
|
27
|
-
# @param [Class]
|
28
|
-
# @param [Array<Integer>] *
|
27
|
+
# @param [Class] element_type The type of the elements.
|
28
|
+
# @param [Array<Integer>] *array_shape The shape of the multi-dimensional array.
|
29
29
|
#
|
30
30
|
# @return [Node] Returns uninitialised native array.
|
31
|
-
def new(
|
31
|
+
def new( element_type, *array_shape )
|
32
|
+
typecode = element_type.typecode
|
33
|
+
shape = element_type.shape + array_shape
|
32
34
|
options = shape.last.is_a?( Hash ) ? shape.pop : {}
|
33
35
|
count = options[ :count ] || 1
|
34
36
|
if shape.empty?
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# multiarray - Lazy multi-dimensional arrays for Ruby
|
2
|
-
# Copyright (C) 2010 Jan Wedekind
|
2
|
+
# Copyright (C) 2010, 2011 Jan Wedekind
|
3
3
|
#
|
4
4
|
# This program is free software: you can redistribute it and/or modify
|
5
5
|
# it under the terms of the GNU General Public License as published by
|
@@ -569,6 +569,59 @@ module Hornetseye
|
|
569
569
|
left
|
570
570
|
end
|
571
571
|
|
572
|
+
# Select values from array using a mask
|
573
|
+
#
|
574
|
+
# @param [Node] m Mask to apply to this array.
|
575
|
+
#
|
576
|
+
# @return [Node] The masked array.
|
577
|
+
def mask( m )
|
578
|
+
check_shape m
|
579
|
+
left = MultiArray.new typecode, *( shape.first( dimension - m.dimension ) +
|
580
|
+
[ m.size ] )
|
581
|
+
index = Hornetseye::Pointer( INT ).new
|
582
|
+
index.store INT.new( 0 )
|
583
|
+
block = Mask.new left, self, m, index
|
584
|
+
if block.compilable?
|
585
|
+
GCCFunction.run block
|
586
|
+
else
|
587
|
+
block.demand
|
588
|
+
end
|
589
|
+
left[ 0 ... index[] ].roll
|
590
|
+
end
|
591
|
+
|
592
|
+
# Distribute values in a new array using a mask
|
593
|
+
#
|
594
|
+
# @param [Node] m Mask for inverse masking operation.
|
595
|
+
# @option options [Object] :default (typecode.default) Default value for elements
|
596
|
+
# where mask is +false+.
|
597
|
+
# @option options [Boolean] :safe (true) Ensure that the size of this size is
|
598
|
+
# sufficient.
|
599
|
+
#
|
600
|
+
# @return [Node] The result of the inverse masking operation.
|
601
|
+
def unmask( m, options = {} )
|
602
|
+
options = { :safe => true, :default => typecode.default }.merge options
|
603
|
+
default = options[ :default ]
|
604
|
+
default = typecode.new default unless default.is_a? Node
|
605
|
+
m.check_shape default
|
606
|
+
if options[ :safe ]
|
607
|
+
if m.to_ubyte.sum > shape.last
|
608
|
+
raise "#{m.to_ubyte.sum} value(s) of the mask are true but the last " +
|
609
|
+
"dimension of the array for unmasking only has #{shape.last} value(s)"
|
610
|
+
end
|
611
|
+
end
|
612
|
+
left = Hornetseye::MultiArray( array_type.element_type, *m.shape ).
|
613
|
+
coercion( default.array_type ).new
|
614
|
+
index = Hornetseye::Pointer( INT ).new
|
615
|
+
index.store INT.new( 0 )
|
616
|
+
block = Unmask.new left, self, m, index, default
|
617
|
+
if block.compilable?
|
618
|
+
GCCFunction.run block
|
619
|
+
else
|
620
|
+
block.demand
|
621
|
+
end
|
622
|
+
left
|
623
|
+
end
|
624
|
+
|
572
625
|
# Mirror the array
|
573
626
|
#
|
574
627
|
# @param [Array<Integer>] dimensions The dimensions which should be flipped.
|
data/lib/multiarray/sequence.rb
CHANGED
@@ -24,12 +24,12 @@ module Hornetseye
|
|
24
24
|
|
25
25
|
# Allocate new uniform array
|
26
26
|
#
|
27
|
-
# @param [Class]
|
27
|
+
# @param [Class] element_type Type of array elements.
|
28
28
|
# @param [Integer] size Number of elements.
|
29
29
|
#
|
30
30
|
# @return [Node] Returns uninitialised native array.
|
31
|
-
def new(
|
32
|
-
MultiArray.new
|
31
|
+
def new( element_type, size )
|
32
|
+
MultiArray.new element_type, size
|
33
33
|
end
|
34
34
|
|
35
35
|
# Import array from string
|
@@ -117,6 +117,13 @@ module Hornetseye
|
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
|
+
# Generate random number array
|
121
|
+
#
|
122
|
+
# Generate integer or floating point random numbers in the range 0 ... n.
|
123
|
+
#
|
124
|
+
# @param [Integer,Float] n Upper boundary for random numbers
|
125
|
+
#
|
126
|
+
# @return [Node] Array with random numbers.
|
120
127
|
def random( n = 1 )
|
121
128
|
n = typecode.maxint.new n unless n.is_a? Node
|
122
129
|
retval = new
|
@@ -0,0 +1,154 @@
|
|
1
|
+
# multiarray - Lazy multi-dimensional arrays for Ruby
|
2
|
+
# Copyright (C) 2011 Jan Wedekind
|
3
|
+
#
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU General Public License
|
15
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
|
17
|
+
# Namespace of Hornetseye computer vision library
|
18
|
+
module Hornetseye
|
19
|
+
|
20
|
+
# Class for representing inverse masking operations
|
21
|
+
class Unmask < Node
|
22
|
+
|
23
|
+
class << self
|
24
|
+
|
25
|
+
# Check whether objects of this class are finalised computations
|
26
|
+
#
|
27
|
+
# @return [Boolean] Returns +false+.
|
28
|
+
#
|
29
|
+
# @private
|
30
|
+
def finalised?
|
31
|
+
false
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
# Constructor
|
37
|
+
#
|
38
|
+
# @param [Node] dest Target array to write histogram to.
|
39
|
+
# @param [Node] source Source array with values to apply mask to.
|
40
|
+
# @param [Node] m Boolean array with values of mask.
|
41
|
+
# @param [Node] default Default value for unaffected elements.
|
42
|
+
#
|
43
|
+
# @private
|
44
|
+
def initialize( dest, source, m, index, default )
|
45
|
+
@dest, @source, @m, @index, @default = dest, source, m, index, default
|
46
|
+
end
|
47
|
+
|
48
|
+
# Get unique descriptor of this object
|
49
|
+
#
|
50
|
+
# @param [Hash] hash Labels for any variables.
|
51
|
+
#
|
52
|
+
# @return [String] Descriptor of this object,
|
53
|
+
#
|
54
|
+
# @private
|
55
|
+
def descriptor( hash )
|
56
|
+
"Unmask(#{@dest.descriptor( hash )},#{@source.descriptor( hash )}," +
|
57
|
+
"#{@m.descriptor( hash )},#{@index.descriptor( hash )}," +
|
58
|
+
"#{@default.descriptor( hash )})"
|
59
|
+
end
|
60
|
+
|
61
|
+
# Get type of result of delayed operation
|
62
|
+
#
|
63
|
+
# @return [Class] Type of result.
|
64
|
+
#
|
65
|
+
# @private
|
66
|
+
def array_type
|
67
|
+
@dest.array_type
|
68
|
+
end
|
69
|
+
|
70
|
+
# Perform masking operation
|
71
|
+
#
|
72
|
+
# @return [Node] Result of computation
|
73
|
+
#
|
74
|
+
# @private
|
75
|
+
def demand
|
76
|
+
if variables.empty?
|
77
|
+
index = @index.simplify
|
78
|
+
if @m.dimension > 0
|
79
|
+
@m.shape.last.times do |i|
|
80
|
+
m = @m.element INT.new( i )
|
81
|
+
dest = @dest.element INT.new( i )
|
82
|
+
default = @default.dimension > 0 ?
|
83
|
+
@default.element( INT.new( i ) ) : @default
|
84
|
+
Unmask.new( dest, @source, m, index, default ).demand
|
85
|
+
end
|
86
|
+
else
|
87
|
+
@m.simplify.get.if_else( proc do
|
88
|
+
Store.new( @dest, @source.element( index ) ).demand
|
89
|
+
index.store index + 1
|
90
|
+
end, proc do
|
91
|
+
Store.new( @dest, @default ).demand
|
92
|
+
end )
|
93
|
+
end
|
94
|
+
@index.store index
|
95
|
+
@dest
|
96
|
+
else
|
97
|
+
super
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Substitute variables
|
102
|
+
#
|
103
|
+
# Substitute the variables with the values given in the hash.
|
104
|
+
#
|
105
|
+
# @param [Hash] hash Substitutions to apply.
|
106
|
+
#
|
107
|
+
# @return [Node] Term with substitutions applied.
|
108
|
+
#
|
109
|
+
# @private
|
110
|
+
def subst( hash )
|
111
|
+
self.class.new @dest.subst( hash ), @source.subst( hash ), @m.subst( hash ),
|
112
|
+
@index.subst( hash ), @default.subst( hash )
|
113
|
+
end
|
114
|
+
|
115
|
+
# Get variables contained in this term
|
116
|
+
#
|
117
|
+
# @return [Set] Returns list of variables.
|
118
|
+
#
|
119
|
+
# @private
|
120
|
+
def variables
|
121
|
+
@dest.variables + @source.variables + @m.variables + @index.variables +
|
122
|
+
@default.variables
|
123
|
+
end
|
124
|
+
|
125
|
+
# Strip of all values
|
126
|
+
#
|
127
|
+
# Split up into variables, values, and a term where all values have been
|
128
|
+
# replaced with variables.
|
129
|
+
#
|
130
|
+
# @return [Array<Array,Node>] Returns an array of variables, an array of
|
131
|
+
# values, and the term based on variables.
|
132
|
+
#
|
133
|
+
# @private
|
134
|
+
def strip
|
135
|
+
stripped = [ @dest, @source, @m, @index, @default ].
|
136
|
+
collect { |value| value.strip }
|
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
|
+
end
|
141
|
+
|
142
|
+
# Check whether this term is compilable
|
143
|
+
#
|
144
|
+
# @return [Boolean] Returns whether this term is compilable.
|
145
|
+
#
|
146
|
+
# @private
|
147
|
+
def compilable?
|
148
|
+
[ @dest, @source, @m, @index, @default ].all? { |value| value.compilable? }
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
154
|
+
|
data/test/tc_multiarray.rb
CHANGED
@@ -705,4 +705,31 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
705
705
|
M( I, 3, 2 )[ [ 1, 2, 3 ], [ 4, 5, 6 ] ].integral
|
706
706
|
end
|
707
707
|
|
708
|
+
def test_mask
|
709
|
+
[ O, I ].each do |t|
|
710
|
+
assert_equal M( O, 2, 2 )[ [ 1, 2 ], [ 5, 7 ] ],
|
711
|
+
M( O, 2, 3 )[ [ 1, 2 ], [ 3, 4 ], [ 5, 7 ] ].
|
712
|
+
mask( S[ true, false, true ] )
|
713
|
+
assert_equal S( O, 3 )[ 2, 5, 7 ], M( O, 3, 2 )[ [ 1, 2, 3 ], [ 4, 5, 7 ] ].
|
714
|
+
mask( M[ [ false, true, false ], [ false, true, true ] ] )
|
715
|
+
assert_raise( RuntimeError ) do
|
716
|
+
M( O, 2, 3 )[ [ 1, 2 ], [ 3, 4 ], [ 5, 7 ] ].mask S[ false, true ]
|
717
|
+
end
|
718
|
+
end
|
719
|
+
end
|
720
|
+
|
721
|
+
def test_unmask
|
722
|
+
[ O, I ].each do |t|
|
723
|
+
assert_equal M( t, 2, 3 )[ [ 1, 2 ], [ 4, 4 ], [ 5, 7 ] ],
|
724
|
+
M( t, 2, 2 )[ [ 1, 2 ], [ 5, 7 ] ].
|
725
|
+
unmask( S[ true, false, true ], :default => S[ 3, 4, 5 ] )
|
726
|
+
assert_equal M( t, 3, 2 )[ [ 0, 2, 0 ], [ 0, 5, 7 ] ],
|
727
|
+
S( t, 3 )[ 2, 5, 7 ].
|
728
|
+
unmask( M[ [ false, true, false ], [ false, true, true ] ],
|
729
|
+
:default => 0 )
|
730
|
+
assert_raise( RuntimeError ) { S( t, 1 )[ 1 ].unmask M[ [ true, true ] ] }
|
731
|
+
end
|
732
|
+
end
|
733
|
+
|
708
734
|
end
|
735
|
+
|
data/test/tc_sequence.rb
CHANGED
@@ -893,4 +893,27 @@ class TC_Sequence < Test::Unit::TestCase
|
|
893
893
|
assert_equal S( I, 3 )[ 1, 3, 6 ], S( I, 3 )[ 1, 2, 3 ].integral
|
894
894
|
end
|
895
895
|
|
896
|
+
def test_mask
|
897
|
+
assert_equal S( O, 2 )[ 2, 5 ], S( O, 3 )[ 2, 3, 5 ].
|
898
|
+
mask( S[ true, false, true ] )
|
899
|
+
assert_equal S( I, 2 )[ 2, 5 ], S( I, 3 )[ 2, 3, 5 ].
|
900
|
+
mask( S[ true, false, true ] )
|
901
|
+
assert_raise( RuntimeError ) { S[ 1, 2 ].mask S[ true ] }
|
902
|
+
end
|
903
|
+
|
904
|
+
def test_unmask
|
905
|
+
[ O, I ].each do |t|
|
906
|
+
assert_equal S( t, 3 )[ 2, 3, 5 ],
|
907
|
+
S( t, 2 )[ 2, 5 ].unmask( S[ true, false, true ], :default => 3 )
|
908
|
+
assert_equal S( t, 3 )[ 2, 3, 5 ],
|
909
|
+
S( t, 2 )[ 2, 5 ].unmask( S[ true, false, true ],
|
910
|
+
:default => S[ 2, 3, 4 ] )
|
911
|
+
assert_raise( RuntimeError ) do
|
912
|
+
S( t, 1 )[ 1 ].unmask S[ true ], :default => S[ 1, 2 ]
|
913
|
+
end
|
914
|
+
assert_raise( RuntimeError ) { S( t, 1 )[ 1 ].unmask S[ true, true ] }
|
915
|
+
end
|
916
|
+
end
|
917
|
+
|
896
918
|
end
|
919
|
+
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 17
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.17.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:
|
17
|
+
date: 2011-01-02 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -77,8 +77,10 @@ files:
|
|
77
77
|
- lib/multiarray/methods.rb
|
78
78
|
- lib/multiarray/integral.rb
|
79
79
|
- lib/multiarray/multiarray.rb
|
80
|
+
- lib/multiarray/unmask.rb
|
80
81
|
- lib/multiarray/node.rb
|
81
82
|
- lib/multiarray/histogram.rb
|
83
|
+
- lib/multiarray/mask.rb
|
82
84
|
- lib/multiarray/malloc.rb
|
83
85
|
- lib/multiarray/index.rb
|
84
86
|
- lib/multiarray/rgb.rb
|