multiarray 0.5.1 → 0.5.2

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