multiarray 0.22.0 → 0.23.1
Sign up to get free protection for your applications and to get access to all the features.
- 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/index.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
|
@@ -46,15 +46,14 @@ module Hornetseye
|
|
46
46
|
"INDEX(#{size.descriptor( hash )})"
|
47
47
|
end
|
48
48
|
|
49
|
-
|
50
|
-
#
|
51
|
-
# @return [Class] Type of result.
|
52
|
-
#
|
53
|
-
# @private
|
54
|
-
def array_type
|
49
|
+
def typecode
|
55
50
|
INT
|
56
51
|
end
|
57
52
|
|
53
|
+
def shape
|
54
|
+
[]
|
55
|
+
end
|
56
|
+
|
58
57
|
# Strip of all values
|
59
58
|
#
|
60
59
|
# Split up into variables, values, and a term where all values have been
|
@@ -115,7 +114,7 @@ module Hornetseye
|
|
115
114
|
# @return [Class] Returns a class deriving from +INDEX_+.
|
116
115
|
def INDEX( size )
|
117
116
|
retval = Class.new INDEX_
|
118
|
-
size = INT.new(
|
117
|
+
size = INT.new(size) unless size.matched?
|
119
118
|
retval.size = size
|
120
119
|
retval
|
121
120
|
end
|
data/lib/multiarray/inject.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
|
@@ -50,6 +50,10 @@ module Hornetseye
|
|
50
50
|
value, index, initial, block, var1, var2
|
51
51
|
end
|
52
52
|
|
53
|
+
def sexp?
|
54
|
+
true
|
55
|
+
end
|
56
|
+
|
53
57
|
# Get unique descriptor of this object
|
54
58
|
#
|
55
59
|
# @param [Hash] hash Labels for any variables.
|
@@ -66,17 +70,12 @@ module Hornetseye
|
|
66
70
|
"#{@index.descriptor( hash )},#{@block.descriptor( hash )})"
|
67
71
|
end
|
68
72
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
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
|
73
|
+
def typecode
|
74
|
+
@block.typecode
|
75
|
+
end
|
76
|
+
|
77
|
+
def shape
|
78
|
+
@value.to_type(@block.typecode).shape
|
80
79
|
end
|
81
80
|
|
82
81
|
# Reevaluate computation
|
data/lib/multiarray/int.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
|
@@ -33,6 +33,13 @@ module Hornetseye
|
|
33
33
|
# signed integer or not.
|
34
34
|
attr_accessor :signed
|
35
35
|
|
36
|
+
def inherit(bits, signed)
|
37
|
+
retval = Class.new self
|
38
|
+
retval.bits = bits
|
39
|
+
retval.signed = signed
|
40
|
+
retval
|
41
|
+
end
|
42
|
+
|
36
43
|
# Memory type required to store elements of this type
|
37
44
|
#
|
38
45
|
# @return [Class] Returns +Malloc+.
|
@@ -138,12 +145,8 @@ module Hornetseye
|
|
138
145
|
# "BYTE").
|
139
146
|
def inspect
|
140
147
|
unless bits.nil? or signed.nil?
|
141
|
-
|
142
|
-
|
143
|
-
( class << self; self; end ).instance_eval do
|
144
|
-
define_method( :inspect ) { retval }
|
145
|
-
end
|
146
|
-
retval
|
148
|
+
IDENTIFIER[ [ bits, signed ] ] ||
|
149
|
+
"INT(#{bits.inspect},#{ signed ? 'SIGNED' : 'UNSIGNED' })"
|
147
150
|
else
|
148
151
|
super
|
149
152
|
end
|
@@ -305,10 +308,7 @@ module Hornetseye
|
|
305
308
|
if signed.nil?
|
306
309
|
INT.new arg
|
307
310
|
else
|
308
|
-
|
309
|
-
retval.bits = arg
|
310
|
-
retval.signed = signed
|
311
|
-
retval
|
311
|
+
INT_.inherit arg, signed
|
312
312
|
end
|
313
313
|
end
|
314
314
|
|
@@ -439,3 +439,4 @@ module Hornetseye
|
|
439
439
|
|
440
440
|
|
441
441
|
end
|
442
|
+
|
data/lib/multiarray/integral.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
|
@@ -43,6 +43,10 @@ module Hornetseye
|
|
43
43
|
@dest, @source = dest, source
|
44
44
|
end
|
45
45
|
|
46
|
+
def sexp?
|
47
|
+
true
|
48
|
+
end
|
49
|
+
|
46
50
|
# Get unique descriptor of this object
|
47
51
|
#
|
48
52
|
# @param [Hash] hash Labels for any variables.
|
@@ -54,17 +58,12 @@ module Hornetseye
|
|
54
58
|
"Integral(#{@dest.descriptor( hash )},#{@source.descriptor( hash )})"
|
55
59
|
end
|
56
60
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
retval = @dest.array_type
|
64
|
-
( class << self; self; end ).instance_eval do
|
65
|
-
define_method( :array_type ) { retval }
|
66
|
-
end
|
67
|
-
retval
|
61
|
+
def typecode
|
62
|
+
@dest.typecode
|
63
|
+
end
|
64
|
+
|
65
|
+
def shape
|
66
|
+
@dest.shape
|
68
67
|
end
|
69
68
|
|
70
69
|
# Reevaluate computation
|
data/lib/multiarray/lambda.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
|
@@ -26,11 +26,15 @@ module Hornetseye
|
|
26
26
|
# @param [Node] term The term based on that variable.
|
27
27
|
#
|
28
28
|
# @return [Lambda] Lambda object.
|
29
|
-
def initialize(
|
29
|
+
def initialize(index, term)
|
30
30
|
@index = index
|
31
31
|
@term = term
|
32
32
|
end
|
33
33
|
|
34
|
+
def sexp?
|
35
|
+
true
|
36
|
+
end
|
37
|
+
|
34
38
|
# Get storage object if there is any
|
35
39
|
#
|
36
40
|
# @return [Malloc,List,NilClass] Object storing the data.
|
@@ -69,17 +73,18 @@ module Hornetseye
|
|
69
73
|
"Lambda(#{@index.descriptor( hash )},#{@term.descriptor( hash )})"
|
70
74
|
end
|
71
75
|
|
72
|
-
#
|
76
|
+
# Element-type of this term
|
73
77
|
#
|
74
|
-
# @return [Class]
|
78
|
+
# @return [Class] Element-type of this datatype.
|
79
|
+
def typecode
|
80
|
+
@term.typecode
|
81
|
+
end
|
82
|
+
|
83
|
+
# Get shape of this term
|
75
84
|
#
|
76
|
-
# @
|
77
|
-
def
|
78
|
-
|
79
|
-
( class << self; self; end ).instance_eval do
|
80
|
-
define_method( :array_type ) { retval }
|
81
|
-
end
|
82
|
-
retval
|
85
|
+
# @return [Array<Integer>] Returns shape of array.
|
86
|
+
def shape
|
87
|
+
@term.shape + [@index.size.get]
|
83
88
|
end
|
84
89
|
|
85
90
|
# Get variables contained in this term
|
@@ -159,14 +164,14 @@ module Hornetseye
|
|
159
164
|
# @return [Node,Object] Result of inserting +i+ for lambda argument.
|
160
165
|
#
|
161
166
|
# @private
|
162
|
-
def element(
|
163
|
-
unless i.
|
164
|
-
unless (
|
167
|
+
def element(i)
|
168
|
+
unless i.matched?
|
169
|
+
unless (0 ... shape.last).member? i
|
165
170
|
raise "Index must be in 0 ... #{shape.last} (was #{i})"
|
166
171
|
end
|
167
172
|
i = INT.new i
|
168
173
|
end
|
169
|
-
i.size = @index.size if i.is_a?(
|
174
|
+
i.size = @index.size if i.is_a?(Variable) and @index.size.get
|
170
175
|
@term.subst @index => i
|
171
176
|
end
|
172
177
|
|
@@ -179,14 +184,14 @@ module Hornetseye
|
|
179
184
|
#
|
180
185
|
# @private
|
181
186
|
def slice( start, length )
|
182
|
-
unless start.
|
187
|
+
unless start.matched? or length.matched?
|
183
188
|
if start < 0 or start + length > shape.last
|
184
189
|
raise "Range must be in 0 ... #{shape.last} " +
|
185
190
|
"(was #{start} ... #{start + length})"
|
186
191
|
end
|
187
192
|
end
|
188
|
-
start = INT.new start unless start.
|
189
|
-
length = INT.new length unless length.
|
193
|
+
start = INT.new start unless start.matched?
|
194
|
+
length = INT.new length unless length.matched?
|
190
195
|
index = Variable.new Hornetseye::INDEX( length )
|
191
196
|
Lambda.new( index, @term.subst( @index => index ).
|
192
197
|
skip( index, start ) ).unroll
|
data/lib/multiarray/list.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/lookup.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,10 @@ module Hornetseye
|
|
29
29
|
@p, @index, @stride = p, index, stride
|
30
30
|
end
|
31
31
|
|
32
|
+
def sexp?
|
33
|
+
true
|
34
|
+
end
|
35
|
+
|
32
36
|
# Get storage object if there is any
|
33
37
|
#
|
34
38
|
# @return [Malloc,List,NilClass] Object storing the data.
|
@@ -36,6 +40,13 @@ module Hornetseye
|
|
36
40
|
@p.memory
|
37
41
|
end
|
38
42
|
|
43
|
+
# Get shape of this term
|
44
|
+
#
|
45
|
+
# @return [Array<Integer>] Returns shape of array.
|
46
|
+
def shape
|
47
|
+
@p.shape
|
48
|
+
end
|
49
|
+
|
39
50
|
# Get strides of array
|
40
51
|
#
|
41
52
|
# @return [Array<Integer>,NilClass] Array strides of this type.
|
@@ -66,17 +77,11 @@ module Hornetseye
|
|
66
77
|
"#{@stride.descriptor( hash )})"
|
67
78
|
end
|
68
79
|
|
69
|
-
#
|
80
|
+
# Element-type of this term
|
70
81
|
#
|
71
|
-
# @return [Class]
|
72
|
-
|
73
|
-
|
74
|
-
def array_type
|
75
|
-
retval = @p.array_type
|
76
|
-
( class << self; self; end ).instance_eval do
|
77
|
-
define_method( :array_type ) { retval }
|
78
|
-
end
|
79
|
-
retval
|
82
|
+
# @return [Class] Element-type of this datatype.
|
83
|
+
def typecode
|
84
|
+
@p.typecode
|
80
85
|
end
|
81
86
|
|
82
87
|
# Substitute variables
|
@@ -154,8 +159,8 @@ module Hornetseye
|
|
154
159
|
# @return [Node,Object] Element of lookup term.
|
155
160
|
#
|
156
161
|
# @private
|
157
|
-
def element(
|
158
|
-
Lookup.new @p.element(
|
162
|
+
def element(i)
|
163
|
+
Lookup.new @p.element(i), @index, @stride
|
159
164
|
end
|
160
165
|
|
161
166
|
# Extract array view with part of array
|
data/lib/multiarray/lut.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
|
@sources, @table = args[ 0 ... -1 ], args.last
|
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.
|
@@ -56,21 +60,14 @@ module Hornetseye
|
|
56
60
|
"#{@table.descriptor( hash )})"
|
57
61
|
end
|
58
62
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
shape = @table.shape.first( @table.dimension - @sources.size ) +
|
68
|
-
source_type.shape
|
69
|
-
retval = Hornetseye::MultiArray @table.typecode, *shape
|
70
|
-
( class << self; self; end ).instance_eval do
|
71
|
-
define_method( :array_type ) { retval }
|
72
|
-
end
|
73
|
-
retval
|
63
|
+
def typecode
|
64
|
+
@table.typecode
|
65
|
+
end
|
66
|
+
|
67
|
+
def shape
|
68
|
+
source_shape = @sources.collect { |source| source.shape }.
|
69
|
+
inject { |a,b| a.size > b.size ? a : b }
|
70
|
+
@table.shape.first(@table.dimension - @sources.size) + source_shape
|
74
71
|
end
|
75
72
|
|
76
73
|
# Reevaluate computation
|
data/lib/multiarray/malloc.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/mask.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
|
@@ -45,6 +45,10 @@ module Hornetseye
|
|
45
45
|
@dest, @source, @m, @index = dest, source, m, index
|
46
46
|
end
|
47
47
|
|
48
|
+
def sexp?
|
49
|
+
true
|
50
|
+
end
|
51
|
+
|
48
52
|
# Get unique descriptor of this object
|
49
53
|
#
|
50
54
|
# @param [Hash] hash Labels for any variables.
|
@@ -57,13 +61,12 @@ module Hornetseye
|
|
57
61
|
"#{@m.descriptor( hash )},#{@index.descriptor( hash )})"
|
58
62
|
end
|
59
63
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
@dest.array_type
|
64
|
+
def typecode
|
65
|
+
@dest.typecode
|
66
|
+
end
|
67
|
+
|
68
|
+
def shape
|
69
|
+
@dest.shape
|
67
70
|
end
|
68
71
|
|
69
72
|
# Perform masking operation
|
data/lib/multiarray/methods.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
|
@@ -57,8 +57,8 @@ module Hornetseye
|
|
57
57
|
# @private
|
58
58
|
def define_unary_method( mod, op, conversion = :identity )
|
59
59
|
mod.module_eval do
|
60
|
-
define_method
|
61
|
-
if a.
|
60
|
+
define_method "#{op}_with_hornetseye" do |a|
|
61
|
+
if a.matched?
|
62
62
|
if a.dimension == 0 and a.variables.empty?
|
63
63
|
target = a.typecode.send conversion
|
64
64
|
target.new mod.send( op, a.simplify.get )
|
@@ -66,7 +66,7 @@ module Hornetseye
|
|
66
66
|
Hornetseye::ElementWise( lambda { |x| mod.send op, x },
|
67
67
|
"#{mod}.#{op}",
|
68
68
|
lambda { |x| x.send conversion } ).
|
69
|
-
new(
|
69
|
+
new(a.sexp).force
|
70
70
|
end
|
71
71
|
else
|
72
72
|
send "#{op}_without_hornetseye", a
|
@@ -90,19 +90,19 @@ module Hornetseye
|
|
90
90
|
# @private
|
91
91
|
def define_binary_method( mod, op, coercion = :coercion )
|
92
92
|
mod.module_eval do
|
93
|
-
define_method
|
94
|
-
if a.
|
95
|
-
a = Node.match(
|
96
|
-
b = Node.match(
|
93
|
+
define_method "#{op}_with_hornetseye" do |a,b|
|
94
|
+
if a.matched? or b.matched?
|
95
|
+
a = Node.match(a, b).new a unless a.matched?
|
96
|
+
b = Node.match(b, a).new b unless b.matched?
|
97
97
|
if a.dimension == 0 and a.variables.empty? and
|
98
98
|
b.dimension == 0 and b.variables.empty?
|
99
99
|
target = a.typecode.send coercion, b.typecode
|
100
|
-
target.new mod.send(
|
100
|
+
target.new mod.send(op, a.simplify.get, b.simplify.get)
|
101
101
|
else
|
102
102
|
Hornetseye::ElementWise( lambda { |x,y| mod.send op, x, y },
|
103
103
|
"#{mod}.#{op}",
|
104
104
|
lambda { |t,u| t.send coercion, u } ).
|
105
|
-
new(
|
105
|
+
new(a.sexp, b.sexp).force
|
106
106
|
end
|
107
107
|
else
|
108
108
|
send "#{op}_without_hornetseye", a, b
|