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.
Files changed (51) hide show
  1. data/Rakefile +1 -1
  2. data/lib/multiarray.rb +53 -16
  3. data/lib/multiarray/bool.rb +1 -1
  4. data/lib/multiarray/complex.rb +76 -68
  5. data/lib/multiarray/components.rb +11 -10
  6. data/lib/multiarray/composite.rb +1 -1
  7. data/lib/multiarray/diagonal.rb +11 -12
  8. data/lib/multiarray/element.rb +3 -3
  9. data/lib/multiarray/elementwise.rb +14 -14
  10. data/lib/multiarray/field.rb +380 -0
  11. data/lib/multiarray/float.rb +10 -10
  12. data/lib/multiarray/gcccache.rb +1 -1
  13. data/lib/multiarray/gcccontext.rb +35 -54
  14. data/lib/multiarray/gccfunction.rb +12 -19
  15. data/lib/multiarray/gcctype.rb +1 -1
  16. data/lib/multiarray/gccvalue.rb +63 -43
  17. data/lib/multiarray/histogram.rb +17 -19
  18. data/lib/multiarray/index.rb +7 -8
  19. data/lib/multiarray/inject.rb +11 -12
  20. data/lib/multiarray/int.rb +12 -11
  21. data/lib/multiarray/integral.rb +11 -12
  22. data/lib/multiarray/lambda.rb +23 -18
  23. data/lib/multiarray/list.rb +1 -1
  24. data/lib/multiarray/lookup.rb +18 -13
  25. data/lib/multiarray/lut.rb +13 -16
  26. data/lib/multiarray/malloc.rb +1 -1
  27. data/lib/multiarray/mask.rb +11 -8
  28. data/lib/multiarray/methods.rb +10 -10
  29. data/lib/multiarray/multiarray.rb +15 -44
  30. data/lib/multiarray/node.rb +64 -138
  31. data/lib/multiarray/object.rb +2 -6
  32. data/lib/multiarray/operations.rb +116 -134
  33. data/lib/multiarray/pointer.rb +7 -19
  34. data/lib/multiarray/random.rb +11 -8
  35. data/lib/multiarray/rgb.rb +53 -53
  36. data/lib/multiarray/sequence.rb +11 -496
  37. data/lib/multiarray/shortcuts.rb +4 -4
  38. data/lib/multiarray/store.rb +14 -11
  39. data/lib/multiarray/unmask.rb +10 -7
  40. data/lib/multiarray/variable.rb +11 -3
  41. data/test/tc_bool.rb +0 -8
  42. data/test/tc_compile.rb +72 -0
  43. data/test/tc_float.rb +0 -8
  44. data/test/tc_int.rb +0 -8
  45. data/test/tc_lazy.rb +22 -3
  46. data/test/tc_multiarray.rb +100 -126
  47. data/test/tc_object.rb +0 -16
  48. data/test/tc_rgb.rb +0 -16
  49. data/test/tc_sequence.rb +151 -165
  50. data/test/ts_multiarray.rb +2 -0
  51. metadata +7 -4
@@ -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
@@ -109,22 +109,6 @@ module Hornetseye
109
109
  target.basetype
110
110
  end
111
111
 
112
- # Get type of result of delayed operation
113
- #
114
- # @return [Class] Type of result.
115
- #
116
- # @private
117
- def array_type
118
- target
119
- end
120
-
121
- # Get corresponding pointer type
122
- #
123
- # @return [Class] Returns +self+.
124
- def pointer_type
125
- self
126
- end
127
-
128
112
  # Check whether objects of this class are finalised computations
129
113
  #
130
114
  # @return [Boolean] Returns +false+.
@@ -143,6 +127,10 @@ module Hornetseye
143
127
  @value = value
144
128
  end
145
129
 
130
+ def sexp?
131
+ true
132
+ end
133
+
146
134
  # Get access to storage object
147
135
  #
148
136
  # @return [Malloc,List] The object used to store the data.
@@ -209,7 +197,7 @@ module Hornetseye
209
197
  # @private
210
198
  def store( value )
211
199
  result = value.simplify
212
- self.class.target.new( result.get ).write @value
200
+ self.class.target.new(result.get).write @value
213
201
  result
214
202
  end
215
203
 
@@ -221,7 +209,7 @@ module Hornetseye
221
209
  #
222
210
  # @private
223
211
  def demand
224
- self.class.target.fetch( @value ).simplify
212
+ self.class.target.fetch(@value).simplify
225
213
  end
226
214
 
227
215
  # Lookup element of an array
@@ -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
  @dest, @n = dest, n
30
30
  end
31
31
 
32
+ def sexp?
33
+ true
34
+ end
35
+
32
36
  # Get unique descriptor of this object
33
37
  #
34
38
  # @param [Hash] hash Labels for any variables.
@@ -40,13 +44,12 @@ module Hornetseye
40
44
  "Random(#{@dest.descriptor( hash )},#{@n.descriptor( hash )})"
41
45
  end
42
46
 
43
- # Get type of result of delayed operation
44
- #
45
- # @return [Class] Type of result.
46
- #
47
- # @private
48
- def array_type
49
- @dest.array_type
47
+ def typecode
48
+ @dest.typecode
49
+ end
50
+
51
+ def shape
52
+ @dest.shape
50
53
  end
51
54
 
52
55
  # Reevaluate computation
@@ -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,8 +33,8 @@ module Hornetseye
33
33
  # coercion.
34
34
  #
35
35
  # @private
36
- def generic?( value )
37
- value.is_a?( Numeric ) or value.is_a?( GCCValue )
36
+ def generic?(value)
37
+ value.is_a?(Numeric) or value.is_a?(GCCValue)
38
38
  end
39
39
 
40
40
  # Defines a unary operation
@@ -46,9 +46,9 @@ module Hornetseye
46
46
  # @return [Proc] The new method.
47
47
  #
48
48
  # @private
49
- def define_unary_op( op )
50
- define_method( op ) do
51
- RGB.new r.send( op ), g.send( op ), b.send( op )
49
+ def define_unary_op(op)
50
+ define_method op do
51
+ RGB.new r.send(op), g.send(op), b.send(op)
52
52
  end
53
53
  end
54
54
 
@@ -61,8 +61,8 @@ module Hornetseye
61
61
  # @return [Proc] The new method.
62
62
  #
63
63
  # @private
64
- def define_binary_op( op )
65
- define_method( op ) do |other|
64
+ def define_binary_op(op)
65
+ define_method op do |other|
66
66
  if other.is_a? RGB
67
67
  RGB.new r.send( op, other.r ), g.send( op, other.g ),
68
68
  b.send( op, other.b )
@@ -125,7 +125,7 @@ module Hornetseye
125
125
  # @return [Object] Returns +value+.
126
126
  #
127
127
  # @private
128
- def assign( value )
128
+ def assign(value)
129
129
  @r, @g, @b = value.r, value.g, value.b
130
130
  end
131
131
 
@@ -136,7 +136,7 @@ module Hornetseye
136
136
  # @return [Array<RGB>] Result of coercion.
137
137
  #
138
138
  # @private
139
- def coerce( other )
139
+ def coerce(other)
140
140
  if other.is_a? RGB
141
141
  return other, self
142
142
  else
@@ -197,11 +197,11 @@ module Hornetseye
197
197
  #
198
198
  # @return [Boolean] Returns boolean indicating whether objects are
199
199
  # equal or not.
200
- def ==( other )
200
+ def ==(other)
201
201
  if other.is_a? RGB
202
202
  @r.eq( other.r ).and( @g.eq( other.g ) ).and( @b.eq( other.b ) )
203
203
  elsif RGB.generic? other
204
- @r.eq( other ).and( @g.eq( other ) ).and( @b.eq( other ) )
204
+ @r.eq(other).and( @g.eq(other) ).and( @b.eq(other) )
205
205
  else
206
206
  false
207
207
  end
@@ -214,7 +214,7 @@ module Hornetseye
214
214
  # @return [Node] An array with the three channel values as elements.
215
215
  #
216
216
  # @private
217
- def decompose( i )
217
+ def decompose(i)
218
218
  [ @r, @g, @b ][ i ]
219
219
  end
220
220
 
@@ -238,10 +238,16 @@ module Hornetseye
238
238
  # @return The return value should be ignored.
239
239
  #
240
240
  # @private
241
- def inherited( subclass )
241
+ def inherited(subclass)
242
242
  subclass.num_elements = 3
243
243
  end
244
244
 
245
+ def inherit(element_type)
246
+ retval = Class.new self
247
+ retval.element_type = element_type
248
+ retval
249
+ end
250
+
245
251
  # Construct new object from arguments
246
252
  #
247
253
  # @param [Object] r Value for red channel.
@@ -283,11 +289,7 @@ module Hornetseye
283
289
  # @return [String] Text with information about this class (e.g. "DFLOATRGB").
284
290
  def inspect
285
291
  unless element_type.nil?
286
- retval = IDENTIFIER[ element_type ] || "RGB(#{element_type.inspect})"
287
- ( class << self; self; end ).instance_eval do
288
- define_method( :inspect ) { retval }
289
- end
290
- retval
292
+ IDENTIFIER[ element_type ] || "RGB(#{element_type.inspect})"
291
293
  else
292
294
  super
293
295
  end
@@ -318,11 +320,11 @@ module Hornetseye
318
320
  # @return [Class] Result of coercion.
319
321
  #
320
322
  # @private
321
- def coercion( other )
323
+ def coercion(other)
322
324
  if other < RGB_
323
325
  Hornetseye::RGB element_type.coercion( other.element_type )
324
326
  elsif other < INT_ or other < FLOAT_
325
- Hornetseye::RGB element_type.coercion( other )
327
+ Hornetseye::RGB element_type.coercion(other)
326
328
  else
327
329
  super other
328
330
  end
@@ -335,11 +337,11 @@ module Hornetseye
335
337
  # @return [Array<Class>] Result of coercion.
336
338
  #
337
339
  # @private
338
- def coerce( other )
340
+ def coerce(other)
339
341
  if other < RGB_
340
342
  return other, self
341
343
  elsif other < INT_ or other < FLOAT_
342
- return Hornetseye::RGB( other ), self
344
+ return Hornetseye::RGB(other), self
343
345
  else
344
346
  super other
345
347
  end
@@ -350,7 +352,7 @@ module Hornetseye
350
352
  # @param [Object] other Object to compare with.
351
353
  #
352
354
  # @return [Boolean] Boolean indicating whether classes are equal.
353
- def ==( other )
355
+ def ==(other)
354
356
  other.is_a? Class and other < RGB_ and
355
357
  element_type == other.element_type
356
358
  end
@@ -371,7 +373,7 @@ module Hornetseye
371
373
  # @return [Boolean] Returns +true+ if objects are equal.
372
374
  #
373
375
  # @private
374
- def eql?( other )
376
+ def eql?(other)
375
377
  self == other
376
378
  end
377
379
 
@@ -423,7 +425,7 @@ module Hornetseye
423
425
  # @return [Object] Returns +value+.
424
426
  #
425
427
  # @private
426
- def assign( value )
428
+ def assign(value)
427
429
  value = value.simplify
428
430
  if @value.r.respond_to? :assign
429
431
  @value.r.assign value.get.r
@@ -502,9 +504,9 @@ module Hornetseye
502
504
  # @param [Class] context Other type to align with.
503
505
  #
504
506
  # @private
505
- def align( context )
507
+ def align(context)
506
508
  if self < RGB_
507
- Hornetseye::RGB element_type.align( context )
509
+ Hornetseye::RGB element_type.align(context)
508
510
  else
509
511
  super context
510
512
  end
@@ -516,7 +518,7 @@ module Hornetseye
516
518
 
517
519
  end
518
520
 
519
- module Operations
521
+ class Node
520
522
 
521
523
  define_unary_op :r, :scalar
522
524
  define_unary_op :g, :scalar
@@ -527,7 +529,7 @@ module Hornetseye
527
529
  #
528
530
  # @return [Node] Array with red channel.
529
531
  def r_with_decompose
530
- if typecode == OBJECT or is_a?( Variable )
532
+ if typecode == OBJECT or is_a?(Variable) or Thread.current[:lazy]
531
533
  r_without_decompose
532
534
  elsif typecode < RGB_
533
535
  decompose 0
@@ -543,7 +545,7 @@ module Hornetseye
543
545
  # @param [Object] Value or array of values to assign to red channel.
544
546
  #
545
547
  # @return [Object] Returns +value+.
546
- def r=( value )
548
+ def r=(value)
547
549
  if typecode < RGB_
548
550
  decompose( 0 )[] = value
549
551
  elsif typecode == OBJECT
@@ -551,7 +553,7 @@ module Hornetseye
551
553
  value * RGB.new( 1, 0, 0 ) + g * RGB.new( 0, 1, 0 ) + b * RGB.new( 0, 0, 1 )
552
554
  end
553
555
  else
554
- raise "Cannot assign red channel to object of type #{array_type.inspect}"
556
+ raise "Cannot assign red channel to elements of type #{typecode.inspect}"
555
557
  end
556
558
  end
557
559
 
@@ -559,7 +561,7 @@ module Hornetseye
559
561
  #
560
562
  # @return [Node] Array with green channel.
561
563
  def g_with_decompose
562
- if typecode == OBJECT or is_a?( Variable )
564
+ if typecode == OBJECT or is_a?(Variable) or Thread.current[:lazy]
563
565
  g_without_decompose
564
566
  elsif typecode < RGB_
565
567
  decompose 1
@@ -575,7 +577,7 @@ module Hornetseye
575
577
  # @param [Object] Value or array of values to assign to green channel.
576
578
  #
577
579
  # @return [Object] Returns +value+.
578
- def g=( value )
580
+ def g=(value)
579
581
  if typecode < RGB_
580
582
  decompose( 1 )[] = value
581
583
  elsif typecode == OBJECT
@@ -583,7 +585,7 @@ module Hornetseye
583
585
  r * RGB.new( 1, 0, 0 ) + value * RGB.new( 0, 1, 0 ) + b * RGB.new( 0, 0, 1 )
584
586
  end
585
587
  else
586
- raise "Cannot assign green channel to object of type #{array_type.inspect}"
588
+ raise "Cannot assign green channel to elements of type #{typecode.inspect}"
587
589
  end
588
590
  end
589
591
 
@@ -591,7 +593,7 @@ module Hornetseye
591
593
  #
592
594
  # @return [Node] Array with blue channel.
593
595
  def b_with_decompose
594
- if typecode == OBJECT or is_a?( Variable )
596
+ if typecode == OBJECT or is_a?(Variable) or Thread.current[:lazy]
595
597
  b_without_decompose
596
598
  elsif typecode < RGB_
597
599
  decompose 2
@@ -607,7 +609,7 @@ module Hornetseye
607
609
  # @param [Object] Value or array of values to assign to blue channel.
608
610
  #
609
611
  # @return [Object] Returns +value+.
610
- def b=( value )
612
+ def b=(value)
611
613
  if typecode < RGB_
612
614
  decompose( 2 )[] = value
613
615
  elsif typecode == OBJECT
@@ -615,7 +617,7 @@ module Hornetseye
615
617
  r * RGB.new( 1, 0, 0 ) + g * RGB.new( 0, 1, 0 ) + value * RGB.new( 0, 0, 1 )
616
618
  end
617
619
  else
618
- raise "Cannot assign blue channel to object of type #{array_type.inspect}"
620
+ raise "Cannot assign blue channel to elements of type #{typecode.inspect}"
619
621
  end
620
622
  end
621
623
 
@@ -694,9 +696,7 @@ module Hornetseye
694
696
  # @see RGB_.element_type
695
697
  def RGB( arg, g = nil, b = nil )
696
698
  if g.nil? and b.nil?
697
- retval = Class.new RGB_
698
- retval.element_type = arg
699
- retval
699
+ RGB_.inherit arg
700
700
  else
701
701
  RGB.new arg, g, b
702
702
  end
@@ -743,7 +743,7 @@ module Hornetseye
743
743
  # @return [BYTERGB] The wrapped RGB value.
744
744
  #
745
745
  # @private
746
- def BYTERGB( value )
746
+ def BYTERGB(value)
747
747
  BYTERGB.new value
748
748
  end
749
749
 
@@ -756,7 +756,7 @@ module Hornetseye
756
756
  # @return [UBYTERGB] The wrapped RGB value.
757
757
  #
758
758
  # @private
759
- def UBYTERGB( value )
759
+ def UBYTERGB(value)
760
760
  UBYTERGB.new value
761
761
  end
762
762
 
@@ -769,7 +769,7 @@ module Hornetseye
769
769
  # @return [SINTRGB] The wrapped RGB value.
770
770
  #
771
771
  # @private
772
- def SINTRGB( value )
772
+ def SINTRGB(value)
773
773
  SINTRGB.new value
774
774
  end
775
775
 
@@ -782,7 +782,7 @@ module Hornetseye
782
782
  # @return [USINTRGB] The wrapped RGB value.
783
783
  #
784
784
  # @private
785
- def USINTRGB( value )
785
+ def USINTRGB(value)
786
786
  USINTRGB.new value
787
787
  end
788
788
 
@@ -795,7 +795,7 @@ module Hornetseye
795
795
  # @return [INTRGB] The wrapped RGB value.
796
796
  #
797
797
  # @private
798
- def INTRGB( value )
798
+ def INTRGB(value)
799
799
  INTRGB.new value
800
800
  end
801
801
 
@@ -808,7 +808,7 @@ module Hornetseye
808
808
  # @return [UINTRGB] The wrapped RGB value.
809
809
  #
810
810
  # @private
811
- def UINTRGB( value )
811
+ def UINTRGB(value)
812
812
  UINTRGB.new value
813
813
  end
814
814
 
@@ -821,7 +821,7 @@ module Hornetseye
821
821
  # @return [LONGRGB] The wrapped RGB value.
822
822
  #
823
823
  # @private
824
- def LONGRGB( value )
824
+ def LONGRGB(value)
825
825
  LONGRGB.new value
826
826
  end
827
827
 
@@ -834,7 +834,7 @@ module Hornetseye
834
834
  # @return [ULONGRGB] The wrapped RGB value.
835
835
  #
836
836
  # @private
837
- def ULONGRGB( value )
837
+ def ULONGRGB(value)
838
838
  ULONGRGB.new value
839
839
  end
840
840
 
@@ -847,7 +847,7 @@ module Hornetseye
847
847
  # @return [SFLOATRGB] The wrapped RGB value.
848
848
  #
849
849
  # @private
850
- def SFLOATRGB( value )
850
+ def SFLOATRGB(value)
851
851
  SFLOATRGB.new value
852
852
  end
853
853
 
@@ -860,7 +860,7 @@ module Hornetseye
860
860
  # @return [DFLOATRGB] The wrapped RGB value.
861
861
  #
862
862
  # @private
863
- def DFLOATRGB( value )
863
+ def DFLOATRGB(value)
864
864
  DFLOATRGB.new value
865
865
  end
866
866
 
@@ -920,7 +920,7 @@ class Fixnum
920
920
  # @return [Object] Result of binary operation.
921
921
  #
922
922
  # @private
923
- def power_with_rgb( other )
923
+ def power_with_rgb(other)
924
924
  if other.is_a? Hornetseye::RGB
925
925
  x, y = other.coerce self
926
926
  x ** y
@@ -937,7 +937,7 @@ end
937
937
 
938
938
  module Math
939
939
 
940
- def sqrt_with_rgb( c )
940
+ def sqrt_with_rgb(c)
941
941
  if c.is_a? Hornetseye::RGB
942
942
  Hornetseye::RGB.new sqrt( c.r ), sqrt( c.g ), sqrt( c.b )
943
943
  else