multiarray 0.22.0 → 0.23.1
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 +53 -16
- data/lib/multiarray/bool.rb +1 -1
- data/lib/multiarray/complex.rb +76 -68
- data/lib/multiarray/components.rb +11 -10
- data/lib/multiarray/composite.rb +1 -1
- data/lib/multiarray/diagonal.rb +11 -12
- data/lib/multiarray/element.rb +3 -3
- data/lib/multiarray/elementwise.rb +14 -14
- data/lib/multiarray/field.rb +380 -0
- data/lib/multiarray/float.rb +10 -10
- data/lib/multiarray/gcccache.rb +1 -1
- data/lib/multiarray/gcccontext.rb +35 -54
- data/lib/multiarray/gccfunction.rb +12 -19
- data/lib/multiarray/gcctype.rb +1 -1
- data/lib/multiarray/gccvalue.rb +63 -43
- data/lib/multiarray/histogram.rb +17 -19
- data/lib/multiarray/index.rb +7 -8
- data/lib/multiarray/inject.rb +11 -12
- data/lib/multiarray/int.rb +12 -11
- data/lib/multiarray/integral.rb +11 -12
- data/lib/multiarray/lambda.rb +23 -18
- data/lib/multiarray/list.rb +1 -1
- data/lib/multiarray/lookup.rb +18 -13
- data/lib/multiarray/lut.rb +13 -16
- data/lib/multiarray/malloc.rb +1 -1
- data/lib/multiarray/mask.rb +11 -8
- data/lib/multiarray/methods.rb +10 -10
- data/lib/multiarray/multiarray.rb +15 -44
- data/lib/multiarray/node.rb +64 -138
- data/lib/multiarray/object.rb +2 -6
- data/lib/multiarray/operations.rb +116 -134
- data/lib/multiarray/pointer.rb +7 -19
- data/lib/multiarray/random.rb +11 -8
- data/lib/multiarray/rgb.rb +53 -53
- data/lib/multiarray/sequence.rb +11 -496
- data/lib/multiarray/shortcuts.rb +4 -4
- data/lib/multiarray/store.rb +14 -11
- data/lib/multiarray/unmask.rb +10 -7
- data/lib/multiarray/variable.rb +11 -3
- data/test/tc_bool.rb +0 -8
- data/test/tc_compile.rb +72 -0
- data/test/tc_float.rb +0 -8
- data/test/tc_int.rb +0 -8
- data/test/tc_lazy.rb +22 -3
- data/test/tc_multiarray.rb +100 -126
- data/test/tc_object.rb +0 -16
- data/test/tc_rgb.rb +0 -16
- data/test/tc_sequence.rb +151 -165
- data/test/ts_multiarray.rb +2 -0
- metadata +7 -4
data/lib/multiarray/float.rb
CHANGED
@@ -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
|
@@ -29,6 +29,12 @@ module Hornetseye
|
|
29
29
|
# @private
|
30
30
|
attr_accessor :double
|
31
31
|
|
32
|
+
def inherit(double)
|
33
|
+
retval = Class.new self
|
34
|
+
retval.double = double
|
35
|
+
retval
|
36
|
+
end
|
37
|
+
|
32
38
|
# Memory type required to store elements of this type
|
33
39
|
#
|
34
40
|
# @return [Class] Returns +Malloc+.
|
@@ -112,11 +118,7 @@ module Hornetseye
|
|
112
118
|
#
|
113
119
|
# @return [String] Returns a string (e.g. "SFLOAT").
|
114
120
|
def inspect
|
115
|
-
|
116
|
-
( class << self; self; end ).instance_eval do
|
117
|
-
define_method( :inspect ) { retval }
|
118
|
-
end
|
119
|
-
retval
|
121
|
+
"#{ double ? 'D' : 'S' }FLOAT"
|
120
122
|
end
|
121
123
|
|
122
124
|
# Get unique descriptor of this class
|
@@ -237,10 +239,8 @@ module Hornetseye
|
|
237
239
|
#
|
238
240
|
# @see FLOAT_
|
239
241
|
# @see FLOAT_.double
|
240
|
-
def FLOAT(
|
241
|
-
|
242
|
-
retval.double = double
|
243
|
-
retval
|
242
|
+
def FLOAT(double)
|
243
|
+
FLOAT_.inherit double
|
244
244
|
end
|
245
245
|
|
246
246
|
module_function :FLOAT
|
data/lib/multiarray/gcccache.rb
CHANGED
@@ -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
|
@@ -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
|
@@ -112,9 +112,9 @@ module Hornetseye
|
|
112
112
|
# @private
|
113
113
|
def initialize( lib_name )
|
114
114
|
@lib_name = lib_name
|
115
|
-
@
|
116
|
-
@
|
117
|
-
@
|
115
|
+
@c_instructions = ''
|
116
|
+
@c_wrappers = ''
|
117
|
+
@c_registrations = ''
|
118
118
|
end
|
119
119
|
|
120
120
|
# Create Ruby extension
|
@@ -137,54 +137,34 @@ module Hornetseye
|
|
137
137
|
#
|
138
138
|
# @private
|
139
139
|
def function( descriptor, *param_types )
|
140
|
-
@
|
141
|
-
|
142
|
-
{
|
143
|
-
#{
|
140
|
+
@c_instructions << <<EOS
|
141
|
+
VALUE #{descriptor}( #{
|
144
142
|
param_types.collect do |t|
|
145
143
|
t.identifiers
|
146
144
|
end.flatten.collect_with_index do |ident,i|
|
147
|
-
"
|
148
|
-
end.join
|
149
|
-
}
|
150
|
-
};
|
151
|
-
|
152
|
-
VALUE #{descriptor}( void *args )
|
145
|
+
"#{ident} param#{i}"
|
146
|
+
end.join ', '
|
147
|
+
} )
|
153
148
|
{
|
154
|
-
#{
|
155
|
-
param_types.collect do |t|
|
156
|
-
t.identifiers
|
157
|
-
end.flatten.collect_with_index do |ident,i|
|
158
|
-
" #{ident} param#{i} = ((struct Arguments *)args)->param#{i};"
|
159
|
-
end.join( "\n" )
|
160
|
-
}
|
161
149
|
EOS
|
162
150
|
|
163
|
-
@
|
151
|
+
@c_wrappers << <<EOS
|
164
152
|
VALUE wrap#{descriptor.capitalize}( int argc, VALUE *argv, VALUE rbSelf )
|
165
153
|
{
|
166
|
-
|
167
|
-
#{
|
154
|
+
#{descriptor}( #{
|
168
155
|
param_types.collect do |t|
|
169
156
|
t.r2c
|
170
157
|
end.flatten.collect_with_index do |conv,i|
|
171
|
-
"
|
172
|
-
end.join
|
173
|
-
}
|
174
|
-
#{
|
175
|
-
if RUBY_VERSION < '1.9.0'
|
176
|
-
" #{descriptor}( &args );"
|
177
|
-
else
|
178
|
-
" rb_thread_blocking_region( &#{descriptor}, &args, RUBY_UBF_PROCESS, NULL );"
|
179
|
-
end
|
180
|
-
}
|
158
|
+
"#{conv.call "argv[#{i}]"}"
|
159
|
+
end.join ', '
|
160
|
+
} );
|
181
161
|
return Qnil;
|
182
162
|
}
|
183
163
|
EOS
|
184
164
|
|
185
|
-
@
|
186
|
-
rb_define_singleton_method(
|
187
|
-
|
165
|
+
@c_registrations << <<EOS
|
166
|
+
rb_define_singleton_method(cGCCCache, "#{descriptor}",
|
167
|
+
RUBY_METHOD_FUNC( wrap#{descriptor.capitalize} ), -1);
|
188
168
|
EOS
|
189
169
|
end
|
190
170
|
|
@@ -197,7 +177,8 @@ EOS
|
|
197
177
|
#
|
198
178
|
# @private
|
199
179
|
def compile
|
200
|
-
|
180
|
+
c_template = <<EOS
|
181
|
+
/* This file is generated automatically. It is pointless to edit this file. */
|
201
182
|
#include <ruby.h>
|
202
183
|
#include <math.h>
|
203
184
|
|
@@ -220,43 +201,43 @@ static unsigned long make_mask( unsigned long x )
|
|
220
201
|
return x;
|
221
202
|
}
|
222
203
|
|
223
|
-
static unsigned long limited_rand(
|
204
|
+
static unsigned long limited_rand(unsigned long limit)
|
224
205
|
{
|
225
206
|
int i;
|
226
207
|
unsigned long mask, val;
|
227
|
-
if (
|
228
|
-
mask = make_mask(
|
208
|
+
if (limit < 2) return 0;
|
209
|
+
mask = make_mask(limit - 1);
|
229
210
|
retry:
|
230
211
|
val = 0;
|
231
|
-
for (
|
232
|
-
if (
|
233
|
-
val |= (unsigned long)rb_genrand_int32() << (
|
212
|
+
for (i = SIZEOF_LONG / 4 - 1; 0 <= i; i--) {
|
213
|
+
if ((mask >> (i * 32)) & 0xffffffff) {
|
214
|
+
val |= (unsigned long)rb_genrand_int32() << (i * 32);
|
234
215
|
val &= mask;
|
235
|
-
if (
|
216
|
+
if (limit <= val)
|
236
217
|
goto retry;
|
237
218
|
};
|
238
219
|
};
|
239
220
|
return val;
|
240
221
|
}
|
241
222
|
|
242
|
-
#{@
|
223
|
+
#{@c_instructions}
|
243
224
|
|
244
|
-
#{@
|
225
|
+
#{@c_wrappers}
|
245
226
|
void Init_#{@lib_name}(void)
|
246
227
|
{
|
247
|
-
VALUE mHornetseye = rb_define_module(
|
248
|
-
VALUE cGCCCache = rb_define_class_under(
|
249
|
-
|
250
|
-
#{@registrations}
|
228
|
+
VALUE mHornetseye = rb_define_module("Hornetseye");
|
229
|
+
VALUE cGCCCache = rb_define_class_under(mHornetseye, "GCCCache", rb_cObject);
|
230
|
+
#{@c_registrations}
|
251
231
|
}
|
252
232
|
EOS
|
253
233
|
# File::EXCL no overwrite
|
254
234
|
File.open "#{DIRNAME}/#{@lib_name}.c", 'w', 0600 do |f|
|
255
|
-
f <<
|
235
|
+
f << c_template
|
256
236
|
end
|
257
237
|
gcc = "#{LDSHARED} #{CFLAGS} -o #{DIRNAME}/#{@lib_name}.#{DLEXT} " +
|
258
238
|
"#{DIRNAME}/#{@lib_name}.c #{LIBRUBYARG}"
|
259
|
-
# puts
|
239
|
+
# puts c_template
|
240
|
+
# puts gcc
|
260
241
|
raise "The following command failed: #{gcc}" unless system gcc
|
261
242
|
require "#{DIRNAME}/#{@lib_name}"
|
262
243
|
end
|
@@ -271,7 +252,7 @@ EOS
|
|
271
252
|
#
|
272
253
|
# @private
|
273
254
|
def <<( str )
|
274
|
-
@
|
255
|
+
@c_instructions << str
|
275
256
|
self
|
276
257
|
end
|
277
258
|
|
@@ -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
|
@@ -31,40 +31,33 @@ module Hornetseye
|
|
31
31
|
# @private
|
32
32
|
def run( block )
|
33
33
|
keys, values, term = block.strip
|
34
|
-
|
35
|
-
method_name = ( '_' + term.descriptor( labels ) ).
|
36
|
-
tr( '(),+\-*/%.@?~&|^<=>',
|
37
|
-
'0123\456789ABCDEFGH' )
|
38
|
-
compile method_name, term, *keys
|
39
|
-
args = values.collect { |arg| arg.values }.flatten
|
40
|
-
GCCCache.send method_name, *args
|
34
|
+
GCCCache.send compile(term, *keys), *values.collect { |arg| arg.values }.flatten
|
41
35
|
end
|
42
36
|
|
43
37
|
# Compile a block of Ruby code if not compiled already
|
44
38
|
#
|
45
|
-
# @param [String] method_name Unique method name of function.
|
46
39
|
# @param [Node] term Stripped expression to compile.
|
47
|
-
# @param [Array<Variable>] keys Variables for performing substitutions on
|
48
|
-
# +term+.
|
40
|
+
# @param [Array<Variable>] keys Variables for performing substitutions on +term+.
|
49
41
|
#
|
50
|
-
# @return [
|
42
|
+
# @return [String] Unique method name of compiled function.
|
51
43
|
#
|
52
44
|
# @private
|
53
|
-
def compile(
|
45
|
+
def compile(term, *keys)
|
46
|
+
labels = Hash[*keys.zip((0 ... keys.size).to_a).flatten]
|
47
|
+
method_name = ('_' + term.descriptor(labels)).method_name
|
54
48
|
unless GCCCache.respond_to? method_name
|
55
49
|
GCCContext.build do |context|
|
56
50
|
function = GCCFunction.new context, method_name,
|
57
51
|
*keys.collect { |var| var.meta }
|
58
|
-
Thread.current[
|
59
|
-
term_subst = Hash[ *keys.zip(
|
60
|
-
Hornetseye::lazy
|
61
|
-
|
62
|
-
end
|
63
|
-
Thread.current[ :function ] = nil
|
52
|
+
Thread.current[:function] = function
|
53
|
+
term_subst = Hash[ *keys.zip(function.params).flatten ]
|
54
|
+
Hornetseye::lazy { term.subst(term_subst).demand }
|
55
|
+
Thread.current[:function] = nil
|
64
56
|
function.insn_return
|
65
57
|
function.compile
|
66
58
|
end
|
67
59
|
end
|
60
|
+
method_name
|
68
61
|
end
|
69
62
|
|
70
63
|
end
|
data/lib/multiarray/gcctype.rb
CHANGED
@@ -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
|
data/lib/multiarray/gccvalue.rb
CHANGED
@@ -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
|
@@ -47,7 +47,7 @@ module Hornetseye
|
|
47
47
|
#
|
48
48
|
# @private
|
49
49
|
def define_unary_op( op, opcode = op )
|
50
|
-
define_method
|
50
|
+
define_method op do
|
51
51
|
GCCValue.new @function, "#{opcode}( #{self} )"
|
52
52
|
end
|
53
53
|
end
|
@@ -62,7 +62,7 @@ module Hornetseye
|
|
62
62
|
# @private
|
63
63
|
def define_unary_method( mod, op, opcode = op )
|
64
64
|
mod.module_eval do
|
65
|
-
define_method
|
65
|
+
define_method "#{op}_with_gcc" do |a|
|
66
66
|
if a.is_a? GCCValue
|
67
67
|
GCCValue.new a.function, "#{opcode}( #{a} )"
|
68
68
|
else
|
@@ -84,7 +84,7 @@ module Hornetseye
|
|
84
84
|
#
|
85
85
|
# @private
|
86
86
|
def define_binary_op( op, opcode = op )
|
87
|
-
define_method
|
87
|
+
define_method op do |other|
|
88
88
|
if GCCValue.generic? other
|
89
89
|
GCCValue.new @function, "( #{self} ) #{opcode} ( #{other} )"
|
90
90
|
else
|
@@ -104,7 +104,7 @@ module Hornetseye
|
|
104
104
|
# @private
|
105
105
|
def define_binary_method( mod, op, opcode = op )
|
106
106
|
mod.module_eval do
|
107
|
-
define_method
|
107
|
+
define_method "#{op}_with_gcc" do |a,b|
|
108
108
|
if a.is_a? GCCValue or b.is_a? GCCValue
|
109
109
|
function = a.is_a?( GCCValue ) ? a.function : b.function
|
110
110
|
GCCValue.new function, "#{opcode}( #{a}, #{b} )"
|
@@ -304,44 +304,6 @@ module Hornetseye
|
|
304
304
|
end
|
305
305
|
end
|
306
306
|
|
307
|
-
# Create code for conditional selection of RGB value
|
308
|
-
#
|
309
|
-
# @param [GCCValue,Object] a First value.
|
310
|
-
# @param [GCCValue,Object] b Second value.
|
311
|
-
#
|
312
|
-
# @return [GCCValue] C value referring to result.
|
313
|
-
#
|
314
|
-
# @private
|
315
|
-
def conditional_with_rgb( a, b )
|
316
|
-
if a.is_a?( RGB ) or b.is_a?( RGB )
|
317
|
-
Hornetseye::RGB( conditional( a.r, b.r ), conditional( a.g, b.g ),
|
318
|
-
conditional( a.b, b.b ) )
|
319
|
-
else
|
320
|
-
conditional_without_rgb a, b
|
321
|
-
end
|
322
|
-
end
|
323
|
-
|
324
|
-
alias_method_chain :conditional, :rgb
|
325
|
-
|
326
|
-
# Create code for conditional selection of complex value
|
327
|
-
#
|
328
|
-
# @param [GCCValue,Object] a First value.
|
329
|
-
# @param [GCCValue,Object] b Second value.
|
330
|
-
#
|
331
|
-
# @return [GCCValue] C value referring to result.
|
332
|
-
#
|
333
|
-
# @private
|
334
|
-
def conditional_with_complex( a, b )
|
335
|
-
if a.is_a?( InternalComplex ) or b.is_a?( InternalComplex )
|
336
|
-
InternalComplex.new conditional( a.real, b.real ),
|
337
|
-
conditional( a.imag, b.imag )
|
338
|
-
else
|
339
|
-
conditional_without_complex a, b
|
340
|
-
end
|
341
|
-
end
|
342
|
-
|
343
|
-
alias_method_chain :conditional, :complex
|
344
|
-
|
345
307
|
# Generate code for conditional statement
|
346
308
|
#
|
347
309
|
# @param [Proc] action Block of conditional.
|
@@ -400,6 +362,7 @@ module Hornetseye
|
|
400
362
|
define_binary_op :<=
|
401
363
|
define_binary_op :>
|
402
364
|
define_binary_op :>=
|
365
|
+
define_binary_op :>=
|
403
366
|
define_unary_method Math, :sqrt
|
404
367
|
define_unary_method Math, :log
|
405
368
|
define_unary_method Math, :log10
|
@@ -522,6 +485,63 @@ module Hornetseye
|
|
522
485
|
"( ( #{self} ) <= ( #{other} ) ) ? ( #{self} ) : ( #{other} )"
|
523
486
|
end
|
524
487
|
|
488
|
+
# Create code for conditional selection of RGB value
|
489
|
+
#
|
490
|
+
# @param [GCCValue,Object] a First value.
|
491
|
+
# @param [GCCValue,Object] b Second value.
|
492
|
+
#
|
493
|
+
# @return [GCCValue] C value referring to result.
|
494
|
+
#
|
495
|
+
# @private
|
496
|
+
def conditional_with_rgb( a, b )
|
497
|
+
if a.is_a?(RGB) or b.is_a?(RGB)
|
498
|
+
Hornetseye::RGB conditional(a.r, b.r), conditional(a.g, b.g), conditional(a.b, b.b)
|
499
|
+
else
|
500
|
+
conditional_without_rgb a, b
|
501
|
+
end
|
502
|
+
end
|
503
|
+
|
504
|
+
alias_method_chain :conditional, :rgb
|
505
|
+
|
506
|
+
# Create code for conditional selection of complex value
|
507
|
+
#
|
508
|
+
# @param [GCCValue,Object] a First value.
|
509
|
+
# @param [GCCValue,Object] b Second value.
|
510
|
+
#
|
511
|
+
# @return [GCCValue] C value referring to result.
|
512
|
+
#
|
513
|
+
# @private
|
514
|
+
def conditional_with_complex( a, b )
|
515
|
+
if a.is_a?( InternalComplex ) or b.is_a?( InternalComplex )
|
516
|
+
InternalComplex.new conditional( a.real, b.real ),
|
517
|
+
conditional( a.imag, b.imag )
|
518
|
+
else
|
519
|
+
conditional_without_complex a, b
|
520
|
+
end
|
521
|
+
end
|
522
|
+
|
523
|
+
alias_method_chain :conditional, :complex
|
524
|
+
|
525
|
+
def major_with_rgb(other)
|
526
|
+
if other.is_a?(RGB)
|
527
|
+
Hornetseye::RGB r.major(other.r), g.major(other.g), b.major(other.b)
|
528
|
+
else
|
529
|
+
major_without_rgb other
|
530
|
+
end
|
531
|
+
end
|
532
|
+
|
533
|
+
alias_method_chain :major, :rgb
|
534
|
+
|
535
|
+
def minor_with_rgb(other)
|
536
|
+
if other.is_a?(RGB)
|
537
|
+
Hornetseye::RGB r.minor(other.r), g.minor(other.g), b.minor(other.b)
|
538
|
+
else
|
539
|
+
minor_without_rgb other
|
540
|
+
end
|
541
|
+
end
|
542
|
+
|
543
|
+
alias_method_chain :minor, :rgb
|
544
|
+
|
525
545
|
# Generate a +for+ loop in C
|
526
546
|
#
|
527
547
|
# @param [Proc] action Code for generating loop body.
|
data/lib/multiarray/histogram.rb
CHANGED
@@ -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
|
@@ -44,6 +44,10 @@ module Hornetseye
|
|
44
44
|
@dest, @weight, @sources = dest, weight, sources
|
45
45
|
end
|
46
46
|
|
47
|
+
def sexp?
|
48
|
+
true
|
49
|
+
end
|
50
|
+
|
47
51
|
# Get unique descriptor of this object
|
48
52
|
#
|
49
53
|
# @param [Hash] hash Labels for any variables.
|
@@ -57,17 +61,12 @@ module Hornetseye
|
|
57
61
|
"#{@sources.collect { |source| source.descriptor( hash ) }.join ','})"
|
58
62
|
end
|
59
63
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
retval = @dest.array_type
|
67
|
-
( class << self; self; end ).instance_eval do
|
68
|
-
define_method( :array_type ) { retval }
|
69
|
-
end
|
70
|
-
retval
|
64
|
+
def typecode
|
65
|
+
@dest.typecode
|
66
|
+
end
|
67
|
+
|
68
|
+
def shape
|
69
|
+
@dest.shape
|
71
70
|
end
|
72
71
|
|
73
72
|
# Reevaluate computation
|
@@ -80,19 +79,18 @@ module Hornetseye
|
|
80
79
|
def demand
|
81
80
|
if variables.empty?
|
82
81
|
if @sources.any? { |source| source.dimension > 0 }
|
83
|
-
source_type = @sources.
|
84
|
-
collect { |source| source.array_type }.inject { |a,b| a.coercion b }
|
82
|
+
source_type = @sources.inject { |a,b| a.dimension > b.dimension ? a : b }
|
85
83
|
source_type.shape.last.times do |i|
|
86
84
|
sources = @sources.collect do |source|
|
87
|
-
source.dimension > 0 ? source.element(
|
85
|
+
source.dimension > 0 ? source.element(INT.new(i)) : source
|
88
86
|
end
|
89
|
-
weight = @weight.dimension > 0 ? @weight.element(
|
90
|
-
Histogram.new(
|
87
|
+
weight = @weight.dimension > 0 ? @weight.element(INT.new(i)) : @weight
|
88
|
+
Histogram.new(@dest, weight, *sources).demand
|
91
89
|
end
|
92
90
|
else
|
93
91
|
dest = @dest
|
94
|
-
(
|
95
|
-
dest = dest.element @sources[
|
92
|
+
(@dest.dimension - 1).downto(0) do |i|
|
93
|
+
dest = dest.element @sources[i].demand
|
96
94
|
end
|
97
95
|
dest.store dest + @weight
|
98
96
|
end
|