multiarray 0.11.3 → 0.11.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +61 -0
- data/Rakefile +1 -1
- data/lib/multiarray.rb +28 -0
- data/lib/multiarray/complex.rb +310 -13
- data/lib/multiarray/composite.rb +7 -0
- data/lib/multiarray/diagonal.rb +18 -3
- data/lib/multiarray/elementwise.rb +7 -2
- data/lib/multiarray/float.rb +43 -3
- data/lib/multiarray/gcccache.rb +4 -1
- data/lib/multiarray/gcccontext.rb +119 -21
- data/lib/multiarray/gccfunction.rb +92 -3
- data/lib/multiarray/gcctype.rb +26 -0
- data/lib/multiarray/gccvalue.rb +204 -2
- data/lib/multiarray/histogram.rb +65 -1
- data/lib/multiarray/index.rb +11 -0
- data/lib/multiarray/inject.rb +18 -1
- data/lib/multiarray/int.rb +49 -18
- data/lib/multiarray/integral.rb +65 -1
- data/lib/multiarray/lambda.rb +19 -5
- data/lib/multiarray/list.rb +8 -0
- data/lib/multiarray/lookup.rb +8 -1
- data/lib/multiarray/lut.rb +96 -2
- data/lib/multiarray/methods.rb +13 -3
- data/lib/multiarray/multiarray.rb +11 -0
- data/lib/multiarray/node.rb +52 -9
- data/lib/multiarray/operations.rb +118 -15
- data/lib/multiarray/pointer.rb +35 -1
- data/lib/multiarray/rgb.rb +139 -14
- data/lib/multiarray/sequence.rb +140 -2
- data/lib/multiarray/shortcuts.rb +76 -30
- data/lib/multiarray/store.rb +54 -0
- data/lib/multiarray/variable.rb +19 -0
- data/test/tc_lazy.rb +9 -0
- metadata +3 -3
data/lib/multiarray/index.rb
CHANGED
@@ -17,6 +17,7 @@
|
|
17
17
|
# Namespace of Hornetseye computer vision library
|
18
18
|
module Hornetseye
|
19
19
|
|
20
|
+
# Class for representing native array index types
|
20
21
|
class INDEX_ < Element
|
21
22
|
|
22
23
|
class << self
|
@@ -96,12 +97,22 @@ module Hornetseye
|
|
96
97
|
|
97
98
|
end
|
98
99
|
|
100
|
+
# This value must not be instantiated
|
101
|
+
#
|
102
|
+
# The method throws an exception.
|
103
|
+
#
|
104
|
+
# @private
|
99
105
|
def initialize
|
100
106
|
raise "#{self.class.inspect} must not be instantiated"
|
101
107
|
end
|
102
108
|
|
103
109
|
end
|
104
110
|
|
111
|
+
# Instantiate the type of an array index
|
112
|
+
#
|
113
|
+
# @param [INT_,Variable] size Dimension of array.
|
114
|
+
#
|
115
|
+
# @return [Class] Returns a class deriving from +INDEX_+.
|
105
116
|
def INDEX( size )
|
106
117
|
retval = Class.new INDEX_
|
107
118
|
size = INT.new( size ) unless size.is_a? Node
|
data/lib/multiarray/inject.rb
CHANGED
@@ -17,6 +17,7 @@
|
|
17
17
|
# Namespace of Hornetseye computer vision library
|
18
18
|
module Hornetseye
|
19
19
|
|
20
|
+
# Class for representing injections
|
20
21
|
class Inject < Node
|
21
22
|
|
22
23
|
class << self
|
@@ -32,6 +33,18 @@ module Hornetseye
|
|
32
33
|
|
33
34
|
end
|
34
35
|
|
36
|
+
# Constructor
|
37
|
+
#
|
38
|
+
# @param [Node] value Initial value of injection.
|
39
|
+
# @param [Node] index Index to iterate over +value+.
|
40
|
+
# @param [Node,NilClass] initial Initial value for injection.
|
41
|
+
# @param [Node] block Expression with body of injection.
|
42
|
+
# @param [Variable] var1 Variable for performing substitutions on body of
|
43
|
+
# injection.
|
44
|
+
# @param [Variable] var2 Variable for performing substitutions on body of
|
45
|
+
# injection.
|
46
|
+
#
|
47
|
+
# @private
|
35
48
|
def initialize( value, index, initial, block, var1, var2 )
|
36
49
|
@value, @index, @initial, @block, @var1, @var2 =
|
37
50
|
value, index, initial, block, var1, var2
|
@@ -59,7 +72,11 @@ module Hornetseye
|
|
59
72
|
#
|
60
73
|
# @private
|
61
74
|
def array_type
|
62
|
-
@value.to_type( @block.typecode ).array_type
|
75
|
+
retval = @value.to_type( @block.typecode ).array_type
|
76
|
+
( class << self; self; end ).instance_eval do
|
77
|
+
define_method( :array_type ) { retval }
|
78
|
+
end
|
79
|
+
retval
|
63
80
|
end
|
64
81
|
|
65
82
|
# Reevaluate computation
|
data/lib/multiarray/int.rb
CHANGED
@@ -60,7 +60,7 @@ module Hornetseye
|
|
60
60
|
0
|
61
61
|
end
|
62
62
|
|
63
|
-
# Get corresponding maximal integer type
|
63
|
+
# Get corresponding maximal integer type
|
64
64
|
#
|
65
65
|
# @return [Class] Returns 32 bit integer or self whichever has more bits.
|
66
66
|
#
|
@@ -99,37 +99,51 @@ module Hornetseye
|
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
|
+
# Hash table used internally
|
103
|
+
#
|
104
|
+
# @private
|
105
|
+
DIRECTIVES = { [ 8, true ] => 'c',
|
106
|
+
[ 8, false ] => 'C',
|
107
|
+
[ 16, true ] => 's',
|
108
|
+
[ 16, false ] => 'S',
|
109
|
+
[ 32, true ] => 'i',
|
110
|
+
[ 32, false ] => 'I',
|
111
|
+
[ 64, true ] => 'q',
|
112
|
+
[ 64, false ] => 'Q' }
|
113
|
+
|
102
114
|
# Directive for packing/unpacking elements of this type
|
103
115
|
#
|
104
116
|
# @private
|
105
117
|
def directive
|
106
|
-
retval =
|
107
|
-
[ 8, false ] => 'C',
|
108
|
-
[ 16, true ] => 's',
|
109
|
-
[ 16, false ] => 'S',
|
110
|
-
[ 32, true ] => 'i',
|
111
|
-
[ 32, false ] => 'I',
|
112
|
-
[ 64, true ] => 'q',
|
113
|
-
[ 64, false ] => 'Q' }[ [ bits, signed ] ]
|
118
|
+
retval = DIRECTIVES[ [ bits, signed ] ]
|
114
119
|
raise "No directive for packing/unpacking #{inspect}" unless retval
|
115
120
|
retval
|
116
121
|
end
|
117
122
|
|
118
|
-
#
|
123
|
+
# Hash table used internally
|
119
124
|
#
|
120
|
-
# @
|
121
|
-
|
122
|
-
def inspect
|
123
|
-
unless bits.nil? or signed.nil?
|
124
|
-
retval = { [ 8, true ] => 'BYTE',
|
125
|
+
# @private
|
126
|
+
IDENTIFIER = { [ 8, true ] => 'BYTE',
|
125
127
|
[ 8, false ] => 'UBYTE',
|
126
128
|
[ 16, true ] => 'SINT',
|
127
129
|
[ 16, false ] => 'USINT',
|
128
130
|
[ 32, true ] => 'INT',
|
129
131
|
[ 32, false ] => 'UINT',
|
130
132
|
[ 64, true ] => 'LONG',
|
131
|
-
[ 64, false ] => 'ULONG' }
|
133
|
+
[ 64, false ] => 'ULONG' }
|
134
|
+
|
135
|
+
# Get string with information about this class
|
136
|
+
#
|
137
|
+
# @return [String] Returns string with information about this class (e.g.
|
138
|
+
# "BYTE").
|
139
|
+
def inspect
|
140
|
+
unless bits.nil? or signed.nil?
|
141
|
+
retval = IDENTIFIER[ [ bits, signed ] ] ||
|
132
142
|
"INT(#{bits.inspect},#{ signed ? 'SIGNED' : 'UNSIGNED' })"
|
143
|
+
( class << self; self; end ).instance_eval do
|
144
|
+
define_method( :inspect ) { retval }
|
145
|
+
end
|
146
|
+
retval
|
133
147
|
else
|
134
148
|
super
|
135
149
|
end
|
@@ -160,7 +174,7 @@ module Hornetseye
|
|
160
174
|
bits == other.bits and signed == other.signed
|
161
175
|
end
|
162
176
|
|
163
|
-
# Compute hash value for this class
|
177
|
+
# Compute hash value for this class
|
164
178
|
#
|
165
179
|
# @return [Fixnum] Hash value
|
166
180
|
#
|
@@ -182,11 +196,26 @@ module Hornetseye
|
|
182
196
|
|
183
197
|
end
|
184
198
|
|
199
|
+
# Loop statement
|
200
|
+
#
|
201
|
+
# @param [Proc] action Loop body.
|
202
|
+
#
|
203
|
+
# @return [GCCValue] Returns +self+.
|
204
|
+
#
|
205
|
+
# @private
|
185
206
|
def times( &action )
|
186
207
|
get.times &action
|
187
208
|
self
|
188
209
|
end
|
189
210
|
|
211
|
+
# Loop statement
|
212
|
+
#
|
213
|
+
# @param [Node] other Upper limit for loop.
|
214
|
+
# @param [Proc] action Loop body.
|
215
|
+
#
|
216
|
+
# @return [GCCValue] Returns +self+.
|
217
|
+
#
|
218
|
+
# @private
|
190
219
|
def upto( other, &action )
|
191
220
|
get.upto other.get, &action
|
192
221
|
self
|
@@ -256,7 +285,7 @@ module Hornetseye
|
|
256
285
|
# Create a class deriving from +INT_+ or instantiate an +INT+ object
|
257
286
|
#
|
258
287
|
# @overload INT( bits, signed )
|
259
|
-
# Create a class deriving from +INT_+. The
|
288
|
+
# Create a class deriving from +INT_+. The parameters +bits+ and +signed+
|
260
289
|
# are assigned to the corresponding attributes of the resulting class.
|
261
290
|
# @param [Integer] bits Number of bits of native integer.
|
262
291
|
# @param [Boolean] signed Specify +UNSIGNED+ or +SIGNED+ here.
|
@@ -267,6 +296,8 @@ module Hornetseye
|
|
267
296
|
# @param [Integer] value Initial value for integer object.
|
268
297
|
# @return [INT] Wrapped integer value.
|
269
298
|
#
|
299
|
+
# @return [Class,INT] A class deriving from +INT_+ or a wrapped integer value.
|
300
|
+
#
|
270
301
|
# @see INT_
|
271
302
|
# @see INT_.bits
|
272
303
|
# @see INT_.signed
|
data/lib/multiarray/integral.rb
CHANGED
@@ -14,30 +14,66 @@
|
|
14
14
|
# You should have received a copy of the GNU General Public License
|
15
15
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
16
|
|
17
|
+
# Namespace of Hornetseye computer vision library
|
17
18
|
module Hornetseye
|
18
19
|
|
20
|
+
# Class for representing integral image computations
|
19
21
|
class Integral < Node
|
20
22
|
|
21
23
|
class << self
|
22
24
|
|
25
|
+
# Check whether objects of this class are finalised computations
|
26
|
+
#
|
27
|
+
# @return [Boolean] Returns +false+.
|
28
|
+
#
|
29
|
+
# @private
|
23
30
|
def finalised?
|
24
31
|
false
|
25
32
|
end
|
26
33
|
|
27
34
|
end
|
28
35
|
|
36
|
+
# Constructor
|
37
|
+
#
|
38
|
+
# @param [Node] dest Target array to write histogram to.
|
39
|
+
# @param [Node] source Expression to compute histogram of.
|
40
|
+
#
|
41
|
+
# @private
|
29
42
|
def initialize( dest, source )
|
30
43
|
@dest, @source = dest, source
|
31
44
|
end
|
32
45
|
|
46
|
+
# Get unique descriptor of this object
|
47
|
+
#
|
48
|
+
# @param [Hash] hash Labels for any variables.
|
49
|
+
#
|
50
|
+
# @return [String] Descriptor of this object,
|
51
|
+
#
|
52
|
+
# @private
|
33
53
|
def descriptor( hash )
|
34
54
|
"Integral(#{@dest.descriptor( hash )},#{@source.descriptor( hash )})"
|
35
55
|
end
|
36
56
|
|
57
|
+
# Get type of result of delayed operation
|
58
|
+
#
|
59
|
+
# @return [Class] Type of result.
|
60
|
+
#
|
61
|
+
# @private
|
37
62
|
def array_type
|
38
|
-
@dest.array_type
|
63
|
+
retval = @dest.array_type
|
64
|
+
( class << self; self; end ).instance_eval do
|
65
|
+
define_method( :array_type ) { retval }
|
66
|
+
end
|
67
|
+
retval
|
39
68
|
end
|
40
69
|
|
70
|
+
# Reevaluate computation
|
71
|
+
#
|
72
|
+
# @return [Node,Object] Result of computation
|
73
|
+
#
|
74
|
+
# @see #force
|
75
|
+
#
|
76
|
+
# @private
|
41
77
|
def demand
|
42
78
|
if variables.empty?
|
43
79
|
if @source.dimension > 0
|
@@ -58,20 +94,48 @@ module Hornetseye
|
|
58
94
|
end
|
59
95
|
end
|
60
96
|
|
97
|
+
# Substitute variables
|
98
|
+
#
|
99
|
+
# Substitute the variables with the values given in the hash.
|
100
|
+
#
|
101
|
+
# @param [Hash] hash Substitutions to apply.
|
102
|
+
#
|
103
|
+
# @return [Node] Term with substitutions applied.
|
104
|
+
#
|
105
|
+
# @private
|
61
106
|
def subst( hash )
|
62
107
|
self.class.new @dest.subst( hash ), @source.subst( hash )
|
63
108
|
end
|
64
109
|
|
110
|
+
# Get variables contained in this term
|
111
|
+
#
|
112
|
+
# @return [Set] Returns list of variables.
|
113
|
+
#
|
114
|
+
# @private
|
65
115
|
def variables
|
66
116
|
@dest.variables + @source.variables
|
67
117
|
end
|
68
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
|
69
128
|
def strip
|
70
129
|
vars1, values1, term1 = @dest.strip
|
71
130
|
vars2, values2, term2 = @source.strip
|
72
131
|
return vars1 + vars2, values1 + values2, self.class.new( term1, term2 )
|
73
132
|
end
|
74
133
|
|
134
|
+
# Check whether this term is compilable
|
135
|
+
#
|
136
|
+
# @return [Boolean] Returns whether this term is compilable.
|
137
|
+
#
|
138
|
+
# @private
|
75
139
|
def compilable?
|
76
140
|
@dest.compilable? and @source.compilable?
|
77
141
|
end
|
data/lib/multiarray/lambda.rb
CHANGED
@@ -17,13 +17,23 @@
|
|
17
17
|
# Namespace of Hornetseye computer vision library
|
18
18
|
module Hornetseye
|
19
19
|
|
20
|
+
# Class for representing lambda expressions
|
20
21
|
class Lambda < Node
|
21
22
|
|
23
|
+
# Construct lambda term
|
24
|
+
#
|
25
|
+
# @param [Variable] index Variable to bind.
|
26
|
+
# @param [Node] term The term based on that variable.
|
27
|
+
#
|
28
|
+
# @return [Lambda] Lambda object.
|
22
29
|
def initialize( index, term )
|
23
30
|
@index = index
|
24
31
|
@term = term
|
25
32
|
end
|
26
33
|
|
34
|
+
# Get storage object if there is any
|
35
|
+
#
|
36
|
+
# @return [Malloc,List,NilClass] Object storing the data.
|
27
37
|
def memory
|
28
38
|
@term.memory
|
29
39
|
end
|
@@ -46,7 +56,11 @@ module Hornetseye
|
|
46
56
|
#
|
47
57
|
# @private
|
48
58
|
def array_type
|
49
|
-
Hornetseye::Sequence @term.array_type, @index.size.get
|
59
|
+
retval = Hornetseye::Sequence @term.array_type, @index.size.get
|
60
|
+
( class << self; self; end ).instance_eval do
|
61
|
+
define_method( :array_type ) { retval }
|
62
|
+
end
|
63
|
+
retval
|
50
64
|
end
|
51
65
|
|
52
66
|
# Get variables contained in this term
|
@@ -131,9 +145,9 @@ module Hornetseye
|
|
131
145
|
unless ( 0 ... shape.last ).member? i
|
132
146
|
raise "Index must be in 0 ... #{shape.last} (was #{i})"
|
133
147
|
end
|
134
|
-
i =
|
148
|
+
i = INT.new i
|
135
149
|
end
|
136
|
-
i.size
|
150
|
+
i.size = @index.size if @index.size.get and i.is_a? Variable
|
137
151
|
@term.subst @index => i
|
138
152
|
end
|
139
153
|
|
@@ -152,8 +166,8 @@ module Hornetseye
|
|
152
166
|
"(was #{start} ... #{start + length})"
|
153
167
|
end
|
154
168
|
end
|
155
|
-
start =
|
156
|
-
length =
|
169
|
+
start = INT.new start unless start.is_a? Node
|
170
|
+
length = INT.new length unless length.is_a? Node
|
157
171
|
index = Variable.new Hornetseye::INDEX( length )
|
158
172
|
Lambda.new( index, @term.subst( @index => index ).
|
159
173
|
skip( index, start ) ).unroll
|
data/lib/multiarray/list.rb
CHANGED
@@ -59,6 +59,10 @@ module Hornetseye
|
|
59
59
|
# Retrieve value of specified typecode
|
60
60
|
#
|
61
61
|
# @param [Class] typecode The type of the value.
|
62
|
+
#
|
63
|
+
# @return [Object] The referenced value.
|
64
|
+
#
|
65
|
+
# @private
|
62
66
|
def load( typecode )
|
63
67
|
@array[ @offset ]
|
64
68
|
end
|
@@ -66,6 +70,10 @@ module Hornetseye
|
|
66
70
|
# Store value
|
67
71
|
#
|
68
72
|
# @param [Node] value Value to store.
|
73
|
+
#
|
74
|
+
# @return [Object] Returns +value+.
|
75
|
+
#
|
76
|
+
# @private
|
69
77
|
def save( value )
|
70
78
|
@array[ @offset ] = value.get
|
71
79
|
value
|
data/lib/multiarray/lookup.rb
CHANGED
@@ -29,6 +29,9 @@ module Hornetseye
|
|
29
29
|
@p, @index, @stride = p, index, stride
|
30
30
|
end
|
31
31
|
|
32
|
+
# Get storage object if there is any
|
33
|
+
#
|
34
|
+
# @return [Malloc,List,NilClass] Object storing the data.
|
32
35
|
def memory
|
33
36
|
#if array_type.storage_size != @stride.get * typecode.storage_size
|
34
37
|
# raise 'Memory is not contiguous'
|
@@ -54,7 +57,11 @@ module Hornetseye
|
|
54
57
|
#
|
55
58
|
# @private
|
56
59
|
def array_type
|
57
|
-
@p.array_type
|
60
|
+
retval = @p.array_type
|
61
|
+
( class << self; self; end ).instance_eval do
|
62
|
+
define_method( :array_type ) { retval }
|
63
|
+
end
|
64
|
+
retval
|
58
65
|
end
|
59
66
|
|
60
67
|
# Substitute variables
|
data/lib/multiarray/lut.rb
CHANGED
@@ -14,54 +14,130 @@
|
|
14
14
|
# You should have received a copy of the GNU General Public License
|
15
15
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
16
|
|
17
|
+
# Namespace of Hornetseye computer vision library
|
17
18
|
module Hornetseye
|
18
19
|
|
20
|
+
# Class for representing lookup operations
|
19
21
|
class Lut < Node
|
20
22
|
|
21
23
|
class << self
|
22
24
|
|
25
|
+
# Check whether objects of this class are finalised computations
|
26
|
+
#
|
27
|
+
# @return [Boolean] Returns +false+.
|
28
|
+
#
|
29
|
+
# @private
|
23
30
|
def finalised?
|
24
31
|
false
|
25
32
|
end
|
26
33
|
|
27
34
|
end
|
28
35
|
|
29
|
-
|
36
|
+
# Constructor
|
37
|
+
#
|
38
|
+
# @param [Node] dest Target array to write histogram to.
|
39
|
+
# @param [Node] source Expression to compute histogram of.
|
40
|
+
# @param [Integer] n Number of dimensions of lookup.
|
41
|
+
#
|
42
|
+
# @private
|
43
|
+
def initialize( source, table, n = nil )
|
30
44
|
@source, @table = source, table
|
31
45
|
@n = n || @source.shape.first
|
32
46
|
end
|
33
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
|
34
55
|
def descriptor( hash )
|
35
56
|
"Lut(#{@source.descriptor( hash )},#{@table.descriptor( hash )},#{@n})"
|
36
57
|
end
|
37
58
|
|
59
|
+
# Get type of result of delayed operation
|
60
|
+
#
|
61
|
+
# @return [Class] Type of result.
|
62
|
+
#
|
63
|
+
# @private
|
38
64
|
def array_type
|
39
65
|
shape = @table.shape.first( @table.dimension - @n ) + @source.shape[ 1 .. -1 ]
|
40
|
-
Hornetseye::MultiArray @table.typecode, *shape
|
66
|
+
retval = Hornetseye::MultiArray @table.typecode, *shape
|
67
|
+
( class << self; self; end ).instance_eval do
|
68
|
+
define_method( :array_type ) { retval }
|
69
|
+
end
|
70
|
+
retval
|
41
71
|
end
|
42
72
|
|
73
|
+
# Reevaluate computation
|
74
|
+
#
|
75
|
+
# @return [Node,Object] Result of computation
|
76
|
+
#
|
77
|
+
# @see #force
|
78
|
+
#
|
79
|
+
# @private
|
43
80
|
def demand
|
44
81
|
@source.lut @table, :n => @n, :safe => false
|
45
82
|
end
|
46
83
|
|
84
|
+
# Substitute variables
|
85
|
+
#
|
86
|
+
# Substitute the variables with the values given in the hash.
|
87
|
+
#
|
88
|
+
# @param [Hash] hash Substitutions to apply.
|
89
|
+
#
|
90
|
+
# @return [Node] Term with substitutions applied.
|
91
|
+
#
|
92
|
+
# @private
|
47
93
|
def subst( hash )
|
48
94
|
self.class.new @source.subst( hash ), @table.subst( hash ), @n
|
49
95
|
end
|
50
96
|
|
97
|
+
# Get variables contained in this term
|
98
|
+
#
|
99
|
+
# @return [Set] Returns list of variables.
|
100
|
+
#
|
101
|
+
# @private
|
51
102
|
def variables
|
52
103
|
@source.variables + @table.variables
|
53
104
|
end
|
54
105
|
|
106
|
+
# Strip of all values
|
107
|
+
#
|
108
|
+
# Split up into variables, values, and a term where all values have been
|
109
|
+
# replaced with variables.
|
110
|
+
#
|
111
|
+
# @return [Array<Array,Node>] Returns an array of variables, an array of
|
112
|
+
# values, and the term based on variables.
|
113
|
+
#
|
114
|
+
# @private
|
55
115
|
def strip
|
56
116
|
vars1, values1, term1 = @source.strip
|
57
117
|
vars2, values2, term2 = @table.strip
|
58
118
|
return vars1 + vars2, values1 + values2, self.class.new( term1, term2, @n )
|
59
119
|
end
|
60
120
|
|
121
|
+
# Skip elements of an array
|
122
|
+
#
|
123
|
+
# @param [Variable] index Variable identifying index of array.
|
124
|
+
# @param [Node] start Wrapped integer with number of elements to skip.
|
125
|
+
#
|
126
|
+
# @return [Node] Returns element-wise operation with elements skipped on each
|
127
|
+
# operand.
|
128
|
+
#
|
129
|
+
# @private
|
61
130
|
def skip( index, start )
|
62
131
|
self.class.new @source.skip( index, start ), @table.skip( index, start ), @n
|
63
132
|
end
|
64
133
|
|
134
|
+
# Get element of unary operation
|
135
|
+
#
|
136
|
+
# @param [Integer,Node] i Index of desired element.
|
137
|
+
#
|
138
|
+
# @return [Node,Object] Element of unary operation.
|
139
|
+
#
|
140
|
+
# @private
|
65
141
|
def element( i )
|
66
142
|
source, table = @source, @table
|
67
143
|
if source.dimension > 1
|
@@ -74,6 +150,14 @@ module Hornetseye
|
|
74
150
|
end
|
75
151
|
end
|
76
152
|
|
153
|
+
# Extract array view with part of array
|
154
|
+
#
|
155
|
+
# @param [Integer,Node] start Number of elements to skip.
|
156
|
+
# @param [Integer,Node] length Size of array view.
|
157
|
+
#
|
158
|
+
# @return [Node] Array view with the specified elements.
|
159
|
+
#
|
160
|
+
# @private
|
77
161
|
def slice( start, length )
|
78
162
|
source, table = @source, @table
|
79
163
|
if source.dimension > 1
|
@@ -88,10 +172,20 @@ module Hornetseye
|
|
88
172
|
end
|
89
173
|
end
|
90
174
|
|
175
|
+
# Decompose composite elements
|
176
|
+
#
|
177
|
+
# This method decomposes composite elements into array.
|
178
|
+
#
|
179
|
+
# @return [Node] Result of decomposition.
|
91
180
|
def decompose( i )
|
92
181
|
self.class.new @source, @table.decompose( i ), @n
|
93
182
|
end
|
94
183
|
|
184
|
+
# Check whether this term is compilable
|
185
|
+
#
|
186
|
+
# @return [Boolean] Returns whether this term is compilable.
|
187
|
+
#
|
188
|
+
# @private
|
95
189
|
def compilable?
|
96
190
|
@source.compilable? and @table.compilable?
|
97
191
|
end
|