multiarray 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -68,6 +68,10 @@ module Hornetseye
68
68
  target
69
69
  end
70
70
 
71
+ def basetype
72
+ target.basetype
73
+ end
74
+
71
75
  def array_type
72
76
  target
73
77
  end
@@ -76,6 +80,10 @@ module Hornetseye
76
80
  self
77
81
  end
78
82
 
83
+ def finalised?
84
+ false
85
+ end
86
+
79
87
  end
80
88
 
81
89
  def initialize( value = self.class.default )
@@ -132,6 +140,17 @@ module Hornetseye
132
140
  end
133
141
  end
134
142
 
143
+ def decompose
144
+ if self.class.target < Composite
145
+ pointer = Hornetseye::Pointer( self.class.target.element_type ).new @value
146
+ num_elements = self.class.target.num_elements
147
+ var = Variable.new Hornetseye::INDEX( INT.new( num_elements ) )
148
+ Lambda.new var, Lookup.new( pointer, var, INT.new( 1 ) )
149
+ else
150
+ super
151
+ end
152
+ end
153
+
135
154
  def values
136
155
  [ @value ]
137
156
  end
@@ -111,36 +111,26 @@ module Hornetseye
111
111
  end
112
112
  end
113
113
 
114
+ def decompose
115
+ Hornetseye::Sequence[ @r, @g, @b ]
116
+ end
117
+
114
118
  end
115
119
 
116
- class RGB_ < Element
120
+ class RGB_ < Composite
117
121
 
118
122
  class << self
119
123
 
120
- attr_accessor :element_type
121
-
122
- def fetch( ptr )
123
- construct *ptr.load( self )
124
+ def inherited( subclass )
125
+ subclass.num_elements = 3
124
126
  end
125
127
 
126
128
  def construct( r, g, b )
127
- new Hornetseye::RGB( r, g, b )
128
- end
129
-
130
- def memory
131
- element_type.memory
132
- end
133
-
134
- def storage_size
135
- element_type.storage_size * 3
129
+ new RGB.new( r, g, b )
136
130
  end
137
131
 
138
132
  def default
139
- Hornetseye::RGB 0, 0, 0
140
- end
141
-
142
- def directive
143
- element_type.directive * 3
133
+ RGB.new 0, 0, 0
144
134
  end
145
135
 
146
136
  def inspect
@@ -161,22 +151,6 @@ module Hornetseye
161
151
  end
162
152
  end
163
153
 
164
- def descriptor( hash )
165
- unless element_type.nil?
166
- inspect
167
- else
168
- super
169
- end
170
- end
171
-
172
- def basetype
173
- element_type
174
- end
175
-
176
- def typecodes
177
- [ element_type ] * 3
178
- end
179
-
180
154
  def maxint
181
155
  Hornetseye::RGB element_type.maxint
182
156
  end
@@ -218,10 +192,6 @@ module Hornetseye
218
192
  self == other
219
193
  end
220
194
 
221
- #def compilable?
222
- # false # !!!
223
- #end
224
-
225
195
  end
226
196
 
227
197
  def initialize( value = self.class.default )
@@ -230,8 +200,8 @@ module Hornetseye
230
200
  @value = value
231
201
  else
232
202
  r = GCCValue.new Thread.current[ :function ], value.r.to_s
233
- g = GCCValue.new Thread.current[ :function ], value.r.to_s
234
- b = GCCValue.new Thread.current[ :function ], value.r.to_s
203
+ g = GCCValue.new Thread.current[ :function ], value.g.to_s
204
+ b = GCCValue.new Thread.current[ :function ], value.b.to_s
235
205
  @value = RGB.new r, g, b
236
206
  end
237
207
  end
@@ -241,10 +211,10 @@ module Hornetseye
241
211
  r = Thread.current[ :function ].variable self.class.element_type, 'v'
242
212
  g = Thread.current[ :function ].variable self.class.element_type, 'v'
243
213
  b = Thread.current[ :function ].variable self.class.element_type, 'v'
244
- r.get.store @value.r
245
- g.get.store @value.g
246
- b.get.store @value.b
247
- self.class.new RGB.new( r.get, g.get, b.get )
214
+ r.store @value.r
215
+ g.store @value.g
216
+ b.store @value.b
217
+ self.class.new RGB.new( r, g, b )
248
218
  else
249
219
  self.class.new get
250
220
  end
@@ -81,14 +81,14 @@ module Hornetseye
81
81
 
82
82
  def indgen( offset = 0, increment = 1 )
83
83
  Hornetseye::lazy( num_elements ) do |i|
84
- element_type.size * increment * i +
85
- element_type.indgen( offset, increment )
84
+ ( element_type.size * increment * i +
85
+ element_type.indgen( offset, increment ) ).to_type typecode
86
86
  end
87
87
  end
88
88
 
89
89
  def []( *args )
90
90
  retval = new
91
- recursion = proc do |element,args|
91
+ recursion = lambda do |element,args|
92
92
  if element.dimension > 0
93
93
  args.each_with_index do |arg,i|
94
94
  recursion.call element.element( i ), arg
@@ -141,18 +141,34 @@ module Hornetseye
141
141
  Hornetseye::Sequence element_type.bool, num_elements
142
142
  end
143
143
 
144
- def bool_binary( other )
144
+ def coercion_bool( other )
145
145
  coercion( other ).bool
146
146
  end
147
147
 
148
+ def scalar
149
+ Hornetseye::Sequence element_type.scalar, num_elements
150
+ end
151
+
152
+ def float_scalar
153
+ Hornetseye::Sequence element_type.float_scalar, num_elements
154
+ end
155
+
148
156
  def maxint
149
157
  Hornetseye::Sequence element_type.maxint, num_elements
150
158
  end
151
159
 
152
- def largeint( other )
160
+ def coercion_maxint( other )
153
161
  coercion( other ).maxint
154
162
  end
155
163
 
164
+ def byte
165
+ Hornetseye::Sequence element_type.byte, num_elements
166
+ end
167
+
168
+ def coercion_byte( other )
169
+ coercion( other ).byte
170
+ end
171
+
156
172
  def float
157
173
  Hornetseye::Sequence element_type.float, num_elements
158
174
  end
@@ -161,6 +177,15 @@ module Hornetseye
161
177
  coercion( other ).float
162
178
  end
163
179
 
180
+ def cond( a, b )
181
+ t = a.coercion b
182
+ Hornetseye::MultiArray( t.typecode, *shape ).coercion t
183
+ end
184
+
185
+ def to_type( dest )
186
+ Hornetseye::Sequence element_type.to_type( dest ), num_elements
187
+ end
188
+
164
189
  def inspect
165
190
  if dimension == 1
166
191
  "Sequence(#{typecode.inspect},#{num_elements.inspect})"
@@ -216,6 +241,10 @@ module Hornetseye
216
241
  MultiArray.new typecode, *shape
217
242
  end
218
243
 
244
+ def compilable?
245
+ element_type.compilable?
246
+ end
247
+
219
248
  end
220
249
 
221
250
  # Namespace containing method for matching elements of type Sequence_
data/test/tc_float.rb CHANGED
@@ -118,75 +118,54 @@ class TC_Float < Test::Unit::TestCase
118
118
  assert_equal D( 3.0 ), D( 3.0 )
119
119
  end
120
120
 
121
- if false
121
+ def test_r_g_b
122
+ assert_equal D( 3.5 ), D( 3.5 ).r
123
+ assert_equal D( 3.5 ), D( 3.5 ).g
124
+ assert_equal D( 3.5 ), D( 3.5 ).b
125
+ end
122
126
 
123
127
  def test_inject
124
- assert_equal 2, I( 2 ).inject { |a,b| a + b }[]
125
- assert_equal 3, I( 2 ).inject( 1 ) { |a,b| a + b }[]
128
+ assert_equal 2.5, D( 2.5 ).inject { |a,b| a + b }[]
129
+ assert_equal 4.0, D( 2.5 ).inject( 1.5 ) { |a,b| a + b }[]
126
130
  end
127
131
 
128
132
  def test_not
129
- assert !I( 0 ).not[]
130
- assert !I( 3 ).not[]
133
+ assert !D( 0.0 ).not[]
134
+ assert !D( 3.0 ).not[]
131
135
  end
132
136
 
133
137
  def test_sum
134
- assert_equal 3, sum { || 3 }
138
+ assert_equal 3.5, sum { || 3.5 }
135
139
  end
136
140
 
137
141
  def test_zero
138
- assert I( 0 ).zero?[]
139
- assert !I( 3 ).zero?[]
142
+ assert D( 0.0 ).zero?[]
143
+ assert !D( 3.0 ).zero?[]
140
144
  end
141
145
 
142
146
  def test_nonzero
143
- assert !I( 0 ).nonzero?[]
144
- assert I( 3 ).nonzero?[]
145
- end
146
-
147
- def test_bitwise_not
148
- assert_equal I( -3 ), ~I( 2 )
149
- end
150
-
151
- def test_bitwise_and
152
- assert_equal I( 2 ), I( 3 ) & I( 6 )
153
- end
154
-
155
- def test_bitwise_or
156
- assert_equal I( 7 ), I( 3 ) | I( 6 )
147
+ assert !D( 0.0 ).nonzero?[]
148
+ assert D( 3.0 ).nonzero?[]
157
149
  end
158
150
 
159
- def test_bitwise_xor
160
- assert_equal I( 1 ), I( 3 ) ^ I( 2 )
161
- end
162
-
163
- def test_shl
164
- assert_equal I( 4 ), I( 2 ) << I( 1 )
165
- end
166
-
167
- def test_shr
168
- assert_equal I( 2 ), I( 4 ) >> I( 1 )
169
- end
170
151
 
171
152
  def test_negate
172
- assert_equal I( -5 ), -I( 5 )
153
+ assert_equal D( -3.5 ), -D( 3.5 )
173
154
  end
174
155
 
175
156
  def test_plus
176
- assert_equal I( 3 + 5 ), I( 3 ) + I( 5 )
157
+ assert_equal D( 3.5 + 1.5 ), D( 3.5 ) + D( 1.5 )
177
158
  end
178
159
 
179
160
  def test_major
180
- assert_equal I( 4 ), I( 3 ).major( I( 4 ) )
181
- assert_equal I( 5 ), I( 5 ).major( I( 3 ) )
161
+ assert_equal D( 4.3 ), D( 3.1 ).major( D( 4.3 ) )
162
+ assert_equal D( 5.1 ), D( 5.1 ).major( D( 3.5 ) )
182
163
  end
183
164
 
184
165
  def test_minor
185
- assert_equal I( 3 ), I( 3 ).minor( I( 4 ) )
186
- assert_equal I( 4 ), I( 5 ).minor( I( 4 ) )
166
+ assert_equal D( 3.1 ), D( 3.1 ).minor( D( 4.3 ) )
167
+ assert_equal D( 3.5 ), D( 5.1 ).minor( D( 3.5 ) )
187
168
  end
188
169
 
189
170
  end
190
171
 
191
- end
192
-
data/test/tc_int.rb CHANGED
@@ -133,11 +133,21 @@ class TC_Int < Test::Unit::TestCase
133
133
  assert_equal I( 3 ), I( 3 )
134
134
  end
135
135
 
136
+ def test_r_g_b
137
+ assert_equal I( 3 ), I( 3 ).r
138
+ assert_equal I( 3 ), I( 3 ).g
139
+ assert_equal I( 3 ), I( 3 ).b
140
+ end
141
+
136
142
  def test_inject
137
143
  assert_equal 2, I( 2 ).inject { |a,b| a + b }[]
138
144
  assert_equal 3, I( 2 ).inject( 1 ) { |a,b| a + b }[]
139
145
  end
140
146
 
147
+ def test_collect
148
+ assert_equal 3, I( 2 ).collect { |x| x + 1 }
149
+ end
150
+
141
151
  def test_not
142
152
  assert !I( 0 ).not[]
143
153
  assert !I( 3 ).not[]
@@ -27,6 +27,7 @@ class TC_MultiArray < Test::Unit::TestCase
27
27
  B = Hornetseye::BOOL
28
28
  I = Hornetseye::INT
29
29
  C = Hornetseye::INTRGB
30
+ X = Hornetseye::DCOMPLEX
30
31
  S = Hornetseye::Sequence
31
32
  M = Hornetseye::MultiArray
32
33
 
@@ -34,6 +35,10 @@ class TC_MultiArray < Test::Unit::TestCase
34
35
  Hornetseye::RGB *args
35
36
  end
36
37
 
38
+ def X( *args )
39
+ Complex *args
40
+ end
41
+
37
42
  def S( *args )
38
43
  Hornetseye::Sequence *args
39
44
  end
@@ -58,10 +63,12 @@ class TC_MultiArray < Test::Unit::TestCase
58
63
 
59
64
  def test_multiarray_inspect
60
65
  assert_equal 'MultiArray(OBJECT,3,2)', M( O, 3, 2 ).inspect
66
+ assert_equal 'MultiArray(OBJECT,3,2)', S( S( O, 3 ), 2 ).inspect
61
67
  end
62
68
 
63
69
  def test_multiarray_to_s
64
70
  assert_equal 'MultiArray(OBJECT,3,2)', M( O, 3, 2 ).to_s
71
+ assert_equal 'MultiArray(OBJECT,3,2)', S( S( O, 3 ), 2 ).to_s
65
72
  end
66
73
 
67
74
  def test_multiarray_default
@@ -81,17 +88,17 @@ class TC_MultiArray < Test::Unit::TestCase
81
88
  end
82
89
 
83
90
  def test_multiarray_indgen
84
- assert_equal [ [ 0, 1, 2 ], [ 3, 4, 5 ] ],
85
- M( I, 3, 2 ).indgen.to_a
86
- assert_equal [ [ 1, 2, 3 ], [ 4, 5, 6 ] ],
87
- M( I, 3, 2 ).indgen( 1 ).to_a
88
- assert_equal [ [ 0, 2, 4 ], [ 6, 8, 10 ] ],
89
- M( I, 3, 2 ).indgen( 0, 2 ).to_a
90
- assert_equal [ [ 1, 3, 5 ], [ 7, 9, 11 ] ],
91
- M( I, 3, 2 ).indgen( 1, 2 ).to_a
92
- assert_equal [ [ C( 1, 2, 3 ), C( 2, 2, 2 ) ],
93
- [ C( 3, 2, 1 ), C( 4, 2, 0 ) ] ],
94
- M( C, 2, 2 ).indgen( C( 1, 2, 3 ), C( 1, 0, -1 ) ).to_a
91
+ assert_equal M( I, 3, 2 )[ [ 0, 1, 2 ], [ 3, 4, 5 ] ],
92
+ M( I, 3, 2 ).indgen
93
+ assert_equal M( I, 3, 2 )[ [ 1, 2, 3 ], [ 4, 5, 6 ] ],
94
+ M( I, 3, 2 ).indgen( 1 )
95
+ assert_equal M( I, 3, 2 )[ [ 0, 2, 4 ], [ 6, 8, 10 ] ],
96
+ M( I, 3, 2 ).indgen( 0, 2 )
97
+ assert_equal M( I, 3, 2 )[ [ 1, 3, 5 ], [ 7, 9, 11 ] ],
98
+ M( I, 3, 2 ).indgen( 1, 2 )
99
+ assert_equal M( C, 2, 2 )[ [ C( 1, 2, 3 ), C( 2, 2, 2 ) ],
100
+ [ C( 3, 2, 1 ), C( 4, 2, 0 ) ] ],
101
+ M( C, 2, 2 ).indgen( C( 1, 2, 3 ), C( 1, 0, -1 ) )
95
102
  end
96
103
 
97
104
  def test_multiarray_typecode
@@ -132,6 +139,13 @@ class TC_MultiArray < Test::Unit::TestCase
132
139
  [ 20, 21, 22, 23 ] ] ].inspect
133
140
  end
134
141
 
142
+ def test_dup
143
+ m = M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
144
+ v = m.dup
145
+ v[ 2, 1 ] = 0
146
+ assert_equal M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ], m
147
+ end
148
+
135
149
  def test_typecode
136
150
  assert_equal O, M( O, 3, 2 ).new.typecode
137
151
  assert_equal I, M( I, 3, 2 ).new.typecode
@@ -153,50 +167,144 @@ class TC_MultiArray < Test::Unit::TestCase
153
167
  end
154
168
 
155
169
  def test_at_assign
156
- m = M.new O, 3, 2
157
- for j in 0 ... 2
158
- for i in 0 ... 3
159
- assert_equal j * 3 + i + 1, m[ j ][ i ] = j * 3 + i + 1
160
- assert_equal j * 3 + i + 1, m[ i, j ] = j * 3 + i + 1
170
+ [ M( O, 3, 2 ), M( I, 3, 2 ) ].each do |t|
171
+ m = t.new
172
+ for j in 0 ... 2
173
+ for i in 0 ... 3
174
+ assert_equal j * 3 + i + 1, m[ j ][ i ] = j * 3 + i + 1
175
+ assert_equal j * 3 + i + 1, m[ i, j ] = j * 3 + i + 1
176
+ end
161
177
  end
162
- end
163
- for j in 0 ... 2
164
- for i in 0 ... 3
165
- assert_equal j * 3 + i + 1, m[ j ][ i ]
166
- assert_equal j * 3 + i + 1, m[ i, j ]
178
+ for j in 0 ... 2
179
+ for i in 0 ... 3
180
+ assert_equal j * 3 + i + 1, m[ j ][ i ]
181
+ assert_equal j * 3 + i + 1, m[ i, j ]
182
+ end
167
183
  end
184
+ assert_raise( RuntimeError ) { m[ -1 ] }
185
+ assert_raise( RuntimeError ) { m[ 2 ] }
186
+ assert_nothing_raised { m[ 0 ] }
187
+ assert_nothing_raised { m[ 1 ] }
188
+ assert_raise( RuntimeError ) { m[ -1 ] = 0 }
189
+ assert_raise( RuntimeError ) { m[ 2 ] = 0 }
190
+ assert_raise( RuntimeError ) { m[ 3, 1 ] }
191
+ assert_raise( RuntimeError ) { m[ 3, 1 ] = 0 }
192
+ assert_raise( RuntimeError ) { m[ -1, 1 ] }
193
+ assert_raise( RuntimeError ) { m[ -1, 1 ] = 0 }
194
+ assert_raise( RuntimeError ) { m[ 2, -1 ] }
195
+ assert_raise( RuntimeError ) { m[ 2, -1 ] = 0 }
196
+ assert_raise( RuntimeError ) { m[ 2, 2 ] }
197
+ assert_raise( RuntimeError ) { m[ 2, 2 ] = 0 }
198
+ assert_nothing_raised { m[ 0, 0 ] }
199
+ assert_nothing_raised { m[ 2, 1 ] }
200
+ assert_raise( RuntimeError ) { m[ 0 ] = m }
201
+ assert_raise( RuntimeError ) { m[ 0 ] = S[ 0, 1 ] }
202
+ assert_nothing_raised { m[ 0 ] = 0 }
203
+ assert_nothing_raised { m[ 1 ] = 0 }
204
+ assert_nothing_raised { m[ 0 ] = m[ 1 ] }
168
205
  end
169
206
  end
170
207
 
171
208
  def test_slice
172
- m = M( I, 5, 4 ).indgen[]
173
- assert_equal [ [ 5, 10 ], [ 6, 11 ], [ 7, 12 ], [ 8, 13 ], [ 9, 14 ] ],
174
- m[ 1 .. 2 ].to_a
175
- assert_equal [ [ 6, 7, 8 ], [ 11, 12, 13 ] ],
176
- m[ 1 .. 2 ][ 1 .. 3 ].to_a
177
- assert_equal [ [ 6, 7, 8 ], [ 11, 12, 13 ] ],
178
- m[ 1 .. 3, 1 .. 2 ].to_a
179
- m[ 1 .. 2 ] = 0
180
- assert_equal [ [ 0, 1, 2, 3, 4 ], [ 0, 0, 0, 0, 0 ],
181
- [ 0, 0, 0, 0, 0 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
182
- m[ 1 ... 3 ] = 1
183
- assert_equal [ [ 0, 1, 2, 3, 4 ], [ 1, 1, 1, 1, 1 ],
184
- [ 1, 1, 1, 1, 1 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
185
- m[ 1 .. 2 ] = S[ 2, 3, 4, 5, 6 ]
186
- assert_equal [ [ 0, 1, 2, 3, 4 ], [ 2, 3, 4, 5, 6 ],
187
- [ 2, 3, 4, 5, 6 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
188
- m[ 1 ... 3 ] = S[ 3, 4, 5, 6, 7 ]
189
- assert_equal [ [ 0, 1, 2, 3, 4 ], [ 3, 4, 5, 6, 7 ],
190
- [ 3, 4, 5, 6, 7 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
191
- m[ 1 .. 3, 1 .. 2 ] = 0
192
- assert_equal [ [ 0, 1, 2, 3, 4 ], [ 3, 0, 0, 0, 7 ],
193
- [ 3, 0, 0, 0, 7 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
194
- m[ 1 ... 4, 1 ... 3 ] = 1
195
- assert_equal [ [ 0, 1, 2, 3, 4 ], [ 3, 1, 1, 1, 7 ],
196
- [ 3, 1, 1, 1, 7 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
197
- end
198
-
199
- def test_transpose
209
+ [ M( O, 5, 4 ), M( I, 5, 4 ) ].each do |t|
210
+ m = t.indgen[]
211
+ assert_equal [ [ 5, 10 ], [ 6, 11 ], [ 7, 12 ], [ 8, 13 ], [ 9, 14 ] ],
212
+ m[ 1 .. 2 ].to_a
213
+ assert_equal [ [ 6, 7, 8 ], [ 11, 12, 13 ] ],
214
+ m[ 1 .. 2 ][ 1 .. 3 ].to_a
215
+ assert_equal [ [ 6, 7, 8 ], [ 11, 12, 13 ] ],
216
+ m[ 1 .. 3, 1 .. 2 ].to_a
217
+ m[ 1 .. 2 ] = 0
218
+ assert_equal [ [ 0, 1, 2, 3, 4 ], [ 0, 0, 0, 0, 0 ],
219
+ [ 0, 0, 0, 0, 0 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
220
+ m[ 1 ... 3 ] = 1
221
+ assert_equal [ [ 0, 1, 2, 3, 4 ], [ 1, 1, 1, 1, 1 ],
222
+ [ 1, 1, 1, 1, 1 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
223
+ m[ 1 .. 2 ] = S[ 2, 3, 4, 5, 6 ]
224
+ assert_equal [ [ 0, 1, 2, 3, 4 ], [ 2, 3, 4, 5, 6 ],
225
+ [ 2, 3, 4, 5, 6 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
226
+ m[ 1 ... 3 ] = S[ 3, 4, 5, 6, 7 ]
227
+ assert_equal [ [ 0, 1, 2, 3, 4 ], [ 3, 4, 5, 6, 7 ],
228
+ [ 3, 4, 5, 6, 7 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
229
+ m[ 1 .. 3, 1 .. 2 ] = 0
230
+ assert_equal [ [ 0, 1, 2, 3, 4 ], [ 3, 0, 0, 0, 7 ],
231
+ [ 3, 0, 0, 0, 7 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
232
+ m[ 1 ... 4, 1 ... 3 ] = 1
233
+ assert_equal [ [ 0, 1, 2, 3, 4 ], [ 3, 1, 1, 1, 7 ],
234
+ [ 3, 1, 1, 1, 7 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
235
+ assert_raise( RuntimeError ) { m[ 2 .. 4 ] }
236
+ assert_raise( RuntimeError ) { m[ 2 .. 4 ] = 0 }
237
+ assert_raise( RuntimeError ) { m[ 2 .. 4 ] = m[ 1 .. 3 ] }
238
+ assert_raise( RuntimeError ) { m[ 2 .. 3 ] = m[ 1 .. 3 ] }
239
+ assert_raise( RuntimeError ) { m[ 2 ... 5 ] }
240
+ assert_raise( RuntimeError ) { m[ 2 ... 5 ] = 0 }
241
+ assert_raise( RuntimeError ) { m[ 2 ... 5 ] = m[ 1 ... 4 ] }
242
+ assert_raise( RuntimeError ) { m[ 2 ... 4 ] = m[ 1 ... 4 ] }
243
+ assert_raise( RuntimeError ) { m[ -1 .. 0 ] }
244
+ assert_raise( RuntimeError ) { m[ -1 .. 0 ] = 0 }
245
+ assert_raise( RuntimeError ) { m[ -1 .. 0 ] = m[ 0 .. 1 ] }
246
+ assert_raise( RuntimeError ) { m[ -1 ... 1 ] }
247
+ assert_raise( RuntimeError ) { m[ -1 ... 1 ] = 0 }
248
+ assert_raise( RuntimeError ) { m[ -1 ... 1 ] = m[ 0 ... 2 ] }
249
+ assert_nothing_raised { m[ 0 .. 3 ] }
250
+ assert_nothing_raised { m[ 0 .. 3 ] = 0 }
251
+ assert_nothing_raised { m[ 0 .. 3 ] = m[ 0 .. 3 ] }
252
+ assert_nothing_raised { m[ 0 ... 4 ] }
253
+ assert_nothing_raised { m[ 0 ... 4 ] = 0 }
254
+ assert_nothing_raised { m[ 0 ... 4 ] = m[ 0 ... 4 ] }
255
+ assert_raise( RuntimeError ) { m[ 1 .. 5, 1 ] }
256
+ assert_raise( RuntimeError ) { m[ 1 .. 5, 1 ] = 0 }
257
+ assert_raise( RuntimeError ) { m[ 1 .. 5, 1 ] = m[ 0 .. 4, 1 ] }
258
+ assert_raise( RuntimeError ) { m[ 1 .. 4, 1 ] = m[ 0 .. 4, 1 ] }
259
+ assert_raise( RuntimeError ) { m[ 1 ... 6, 1 ] }
260
+ assert_raise( RuntimeError ) { m[ 1 ... 6, 1 ] = 0 }
261
+ assert_raise( RuntimeError ) { m[ 1 ... 6, 1 ] = m[ 0 ... 5, 1 ] }
262
+ assert_raise( RuntimeError ) { m[ 1 ... 5, 1 ] = m[ 0 ... 5, 1 ] }
263
+ assert_raise( RuntimeError ) { m[ -1 .. 3, 1 ] }
264
+ assert_raise( RuntimeError ) { m[ -1 .. 3, 1 ] = 0 }
265
+ assert_raise( RuntimeError ) { m[ -1 .. 3, 1 ] = m[ 0 .. 4, 1 ] }
266
+ assert_raise( RuntimeError ) { m[ -1 ... 3, 1 ] }
267
+ assert_raise( RuntimeError ) { m[ -1 ... 3, 1 ] = 0 }
268
+ assert_raise( RuntimeError ) { m[ -1 ... 3, 1 ] = m[ 0 ... 4, 1 ] }
269
+ assert_nothing_raised { m[ 0 .. 4, 1 ] }
270
+ assert_nothing_raised { m[ 0 .. 4, 1 ] = 0 }
271
+ assert_nothing_raised { m[ 0 .. 4, 1 ] = m[ 0 .. 4, 0 ] }
272
+ assert_nothing_raised { m[ 0 ... 5, 1 ] }
273
+ assert_nothing_raised { m[ 0 ... 5, 1 ] = 0 }
274
+ assert_nothing_raised { m[ 0 ... 5, 1 ] = m[ 0 ... 5, 0 ] }
275
+ assert_raise( RuntimeError ) { m[ 1, 1 .. 4 ] }
276
+ assert_raise( RuntimeError ) { m[ 1, 1 .. 4 ] = 0 }
277
+ assert_raise( RuntimeError ) { m[ 1, 1 .. 4 ] = m[ 1, 0 .. 3 ] }
278
+ assert_raise( RuntimeError ) { m[ 1, 1 .. 3 ] = m[ 1, 0 .. 3 ] }
279
+ assert_raise( RuntimeError ) { m[ 1, 1 ... 5 ] }
280
+ assert_raise( RuntimeError ) { m[ 1, 1 ... 5 ] = 0 }
281
+ assert_raise( RuntimeError ) { m[ 1, 1 ... 5 ] = m[ 1, 0 ... 4 ] }
282
+ assert_raise( RuntimeError ) { m[ 1, 1 ... 4 ] = m[ 1, 0 ... 4 ] }
283
+ assert_raise( RuntimeError ) { m[ 1, -1 .. 2 ] }
284
+ assert_raise( RuntimeError ) { m[ 1, -1 .. 2 ] = 0 }
285
+ assert_raise( RuntimeError ) { m[ 1, -1 .. 2 ] = m[ 1, 0 .. 3 ] }
286
+ assert_raise( RuntimeError ) { m[ 1, -1 ... 2 ] }
287
+ assert_raise( RuntimeError ) { m[ 1, -1 ... 2 ] = 0 }
288
+ assert_raise( RuntimeError ) { m[ 1, -1 ... 2 ] = m[ 1, 0 ... 3 ] }
289
+ assert_nothing_raised { m[ 1, 0 .. 3 ] }
290
+ assert_nothing_raised { m[ 1, 0 .. 3 ] = 0 }
291
+ assert_nothing_raised { m[ 1, 0 .. 3 ] = m[ 0, 0 .. 3 ] }
292
+ assert_nothing_raised { m[ 1, 0 ... 4 ] }
293
+ assert_nothing_raised { m[ 1, 0 ... 4 ] = 0 }
294
+ assert_nothing_raised { m[ 1, 0 ... 4 ] = m[ 0, 0 ... 4 ] }
295
+ end
296
+ end
297
+
298
+ def test_view
299
+ [ M( O, 3, 2 ), M( I, 3, 2 ) ].each do |t|
300
+ m = t[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
301
+ v = m[ 1, 0 ... 2 ]
302
+ v[] = 0
303
+ assert_equal [ [ 1, 0, 3 ], [ 4, 0, 6 ] ], m.to_a
304
+ end
305
+ end
306
+
307
+ def test_transpose
200
308
  assert_equal [ [ 1, 4 ], [ 2, 5 ], [ 3, 6 ] ],
201
309
  M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ].transpose( 1, 0 ).to_a
202
310
  assert_equal [ [ [ 0, 3 ], [ 1, 4 ], [ 2, 5 ] ] ],
@@ -219,11 +327,27 @@ class TC_MultiArray < Test::Unit::TestCase
219
327
  assert_not_equal M[ [ 1, 1 ], [ 1, 1 ] ], S[ 1, 1 ]
220
328
  end
221
329
 
330
+ def test_r_g_b
331
+ assert_equal M[ [ 1, 4 ], [ 5, 6 ] ], M[ [ C( 1, 2, 3 ), 4 ], [ 5, 6 ] ].r
332
+ assert_equal M[ [ 2, 4 ], [ 5, 6 ] ], M[ [ C( 1, 2, 3 ), 4 ], [ 5, 6 ] ].g
333
+ assert_equal M[ [ 3, 4 ], [ 5, 6 ] ], M[ [ C( 1, 2, 3 ), 4 ], [ 5, 6 ] ].b
334
+ end
335
+
336
+ def test_real_imag
337
+ assert_equal M[ [ 1, 3 ], [ 4, 5 ] ], M[ [ X( 1, 2 ), 3 ], [ 4, 5 ] ].real
338
+ assert_equal M[ [ 2, 0 ], [ 0, 0 ] ], M[ [ X( 1, 2 ), 3 ], [ 4, 5 ] ].imag
339
+ end
340
+
222
341
  def test_inject
223
342
  assert_equal 21, M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ].inject { |a,b| a + b }
224
343
  assert_equal 28, M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ].inject( 7 ) { |a,b| a + b }
225
344
  end
226
345
 
346
+ def test_collect
347
+ assert_equal M[ [ 2, 3, 4 ], [ 5, 6, 7 ] ],
348
+ M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ].collect { |x| x + 1 }
349
+ end
350
+
227
351
  def test_sum
228
352
  m = M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
229
353
  assert_equal 21, sum { |i,j| m[ i, j ] }
@@ -270,6 +394,8 @@ class TC_MultiArray < Test::Unit::TestCase
270
394
  M[ [ 0, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 0 ] ].convolve( f )
271
395
  assert_equal M[ [ 0, 0, 0 ], [ 1, 2, 3 ], [ 4, 5, 6 ] ],
272
396
  M[ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 1, 0 ] ].convolve( f )
397
+ assert_raise( RuntimeError ) { S[ 1, 2, 3 ].convolve f }
398
+ assert_raise( RuntimeError ) { M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ].convolve S[ 1, 2 ] }
273
399
  end
274
400
 
275
401
  def test_zero
@@ -372,6 +498,28 @@ class TC_MultiArray < Test::Unit::TestCase
372
498
  assert_equal M[ [ -3, 2, 1 ], [ 8, 6, 4 ] ] +
373
499
  M[ [ 2, 0, 2 ], [ -4, -1, 2 ] ],
374
500
  M[ [ -1, 2, 3 ], [ 4, 5, 6 ] ]
501
+ assert_equal M[ [ 2, 3, 4 ], [ 6, 7, 8 ] ],
502
+ M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ] + S[ 1, 2 ]
503
+ assert_equal M[ [ 2, 3, 4 ], [ 6, 7, 8 ] ],
504
+ S[ 1, 2 ] + M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
505
+ assert_raise( RuntimeError ) do
506
+ M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ] + M[ [ 1, 2 ], [ 3, 4 ] ]
507
+ end
508
+ assert_raise( RuntimeError ) do
509
+ M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ] + M[ [ 1, 2, 3 ] ]
510
+ end
511
+ assert_raise( RuntimeError ) do
512
+ M[ [ 1, 2 ], [ 3, 4 ] ] + M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
513
+ end
514
+ assert_raise( RuntimeError ) do
515
+ M[ [ 1, 2, 3 ] ] + M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
516
+ end
517
+ assert_raise( RuntimeError ) do
518
+ M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ] + S[ 1, 2, 3 ]
519
+ end
520
+ assert_raise( RuntimeError ) do
521
+ S[ 1, 2, 3 ] + M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
522
+ end
375
523
  end
376
524
 
377
525
  def test_major
@@ -384,4 +532,32 @@ class TC_MultiArray < Test::Unit::TestCase
384
532
  M[ [ 1, 2 ], [ 3, 4 ] ].minor( M[ [ 4, 1 ], [ 3, 2 ] ] )
385
533
  end
386
534
 
535
+ def test_cond
536
+ assert_equal M[ [ -1, 2 ], [ 3, -4 ] ],
537
+ M[ [ false, true ], [ true, false ] ].
538
+ conditional( M[ [ 1, 2 ], [ 3, 4 ] ],
539
+ M[ [ -1, -2 ], [ -3, -4 ] ] )
540
+ assert_equal M[ [ -1, -2 ], [ 3, 4 ] ],
541
+ S[ false, true ].
542
+ conditional( M[ [ 1, 2 ], [ 3, 4 ] ],
543
+ M[ [ -1, -2 ], [ -3, -4 ] ] )
544
+ assert_equal M[ [ -1, -1 ], [ 3, 4 ] ],
545
+ S[ false, true ].
546
+ conditional( M[ [ 1, 2 ], [ 3, 4 ] ], -1 )
547
+ assert_equal M[ [ -1, -1 ], [ 3, 4 ] ],
548
+ S[ false, true ].
549
+ conditional( M[ [ 1, 2 ], [ 3, 4 ] ], S[ -1, -2 ] )
550
+ end
551
+
552
+ def test_cmp
553
+ assert_equal M[ [ -1, -1 ], [ 0, 1 ] ], M[ [ 1, 2 ], [ 3, 4 ] ] <=> 3
554
+ assert_equal M[ [ 1, 1 ], [ 0, -1 ] ], 3 <=> M[ [ 1, 2 ], [ 3, 4 ] ]
555
+ end
556
+
557
+ def test_to_type
558
+ assert_equal M( C, 2, 2 )[ [ 1, 2 ], [ 3, 4 ] ],
559
+ M( I, 2, 2 )[ [ 1, 2 ], [ 3, 4 ] ].to_type( C )
560
+ end
561
+
562
+
387
563
  end