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/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
|