carray 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (231) hide show
  1. checksums.yaml +4 -4
  2. data/COPYING +56 -0
  3. data/GPL +340 -0
  4. data/Gemfile +9 -0
  5. data/Gemfile.lock +33 -0
  6. data/LEGAL +50 -0
  7. data/NOTE +73 -0
  8. data/Rakefile +20 -0
  9. data/TODO +5 -0
  10. data/ca_iter_block.c +242 -0
  11. data/ca_iter_dimension.c +287 -0
  12. data/ca_iter_window.c +202 -0
  13. data/ca_obj_array.c +1189 -0
  14. data/ca_obj_bitarray.c +523 -0
  15. data/ca_obj_bitfield.c +636 -0
  16. data/ca_obj_block.c +885 -0
  17. data/ca_obj_fake.c +405 -0
  18. data/ca_obj_farray.c +482 -0
  19. data/ca_obj_field.c +625 -0
  20. data/ca_obj_grid.c +738 -0
  21. data/ca_obj_mapping.c +614 -0
  22. data/ca_obj_object.c +777 -0
  23. data/ca_obj_reduce.c +299 -0
  24. data/ca_obj_refer.c +627 -0
  25. data/ca_obj_repeat.c +640 -0
  26. data/ca_obj_select.c +558 -0
  27. data/ca_obj_shift.c +952 -0
  28. data/ca_obj_transpose.c +582 -0
  29. data/ca_obj_unbound_repeat.c +557 -0
  30. data/ca_obj_window.c +1023 -0
  31. data/carray.h +1381 -0
  32. data/carray_access.c +1798 -0
  33. data/carray_attribute.c +903 -0
  34. data/carray_call_cfunc.c +1107 -0
  35. data/carray_cast.c +1155 -0
  36. data/carray_cast_func.rb +498 -0
  37. data/carray_class.c +132 -0
  38. data/carray_conversion.c +518 -0
  39. data/carray_copy.c +453 -0
  40. data/carray_core.c +1307 -0
  41. data/carray_element.c +572 -0
  42. data/carray_generate.c +681 -0
  43. data/carray_iterator.c +630 -0
  44. data/carray_loop.c +462 -0
  45. data/carray_mask.c +1174 -0
  46. data/carray_math.rb +834 -0
  47. data/carray_numeric.c +257 -0
  48. data/carray_operator.c +582 -0
  49. data/carray_order.c +1040 -0
  50. data/carray_random.c +529 -0
  51. data/carray_sort_addr.c +261 -0
  52. data/carray_stat.c +2102 -0
  53. data/carray_stat_proc.rb +1990 -0
  54. data/carray_test.c +602 -0
  55. data/carray_undef.c +69 -0
  56. data/carray_utils.c +740 -0
  57. data/ext/calculus/carray_calculus.c +792 -0
  58. data/ext/calculus/carray_interp.c +355 -0
  59. data/ext/calculus/extconf.rb +12 -0
  60. data/ext/calculus/lib/autoload/autoload_math_calculus.rb +2 -0
  61. data/ext/calculus/lib/math/calculus.rb +119 -0
  62. data/ext/calculus/lib/math/interp/adapter_interp1d.rb +31 -0
  63. data/ext/dataframe/API.txt +11 -0
  64. data/ext/dataframe/extconf.rb +3 -0
  65. data/ext/dataframe/lib/carray/autoload/autoload_dataframe_dataframe.rb +14 -0
  66. data/ext/dataframe/lib/carray/dataframe/dataframe.rb +1104 -0
  67. data/ext/dataframe/sample/test_uniq_sort.rb +5 -0
  68. data/ext/fortio/extconf.rb +3 -0
  69. data/ext/fortio/lib/carray/autoload/autoload_fortran_format.rb +5 -0
  70. data/ext/fortio/lib/carray/io/fortran_format.rb +43 -0
  71. data/ext/fortio/lib/fortio.rb +3 -0
  72. data/ext/fortio/lib/fortio/fortran_format.rb +603 -0
  73. data/ext/fortio/lib/fortio/fortran_format.tab.rb +536 -0
  74. data/ext/fortio/lib/fortio/fortran_format.y +215 -0
  75. data/ext/fortio/lib/fortio/fortran_namelist.rb +151 -0
  76. data/ext/fortio/lib/fortio/fortran_namelist.tab.rb +470 -0
  77. data/ext/fortio/lib/fortio/fortran_namelist.y +213 -0
  78. data/ext/fortio/lib/fortio/fortran_sequential.rb +345 -0
  79. data/ext/fortio/ruby_fortio.c +182 -0
  80. data/ext/fortio/test/test_H.rb +5 -0
  81. data/ext/fortio/test/test_T.rb +7 -0
  82. data/ext/fortio/test/test_fortran_format.rb +86 -0
  83. data/ext/fortio/test/test_namelist.rb +25 -0
  84. data/ext/fortio/test/test_sequential.rb +13 -0
  85. data/ext/fortio/test/test_sequential2.rb +13 -0
  86. data/ext/fortio/work/test.rb +10 -0
  87. data/ext/fortio/work/test_e.rb +19 -0
  88. data/ext/fortio/work/test_ep.rb +10 -0
  89. data/ext/fortio/work/test_parse.rb +12 -0
  90. data/ext/imagemap/carray_imagemap.c +495 -0
  91. data/ext/imagemap/doc/call_graph.dot +28 -0
  92. data/ext/imagemap/draw.c +567 -0
  93. data/ext/imagemap/extconf.rb +13 -0
  94. data/ext/imagemap/lib/autoload/autoload_graphics_imagemap.rb +1 -0
  95. data/ext/imagemap/lib/graphics/imagemap.rb +273 -0
  96. data/ext/imagemap/lib/image_map.rb +4 -0
  97. data/ext/imagemap/test/swath_index.rb +83 -0
  98. data/ext/imagemap/test/swath_warp.rb +99 -0
  99. data/ext/imagemap/test/test.rb +23 -0
  100. data/ext/imagemap/test/test_image.rb +42 -0
  101. data/ext/imagemap/test/test_line.rb +14 -0
  102. data/ext/imagemap/test/test_rotate.rb +17 -0
  103. data/ext/imagemap/test/test_triangle.rb +20 -0
  104. data/ext/imagemap/test/test_warp.rb +26 -0
  105. data/ext/mathfunc/carray_mathfunc.c +321 -0
  106. data/ext/mathfunc/extconf.rb +18 -0
  107. data/ext/mathfunc/lib/autoload/autoload_math_mathfunc.rb +1 -0
  108. data/ext/mathfunc/lib/math/mathfunc.rb +15 -0
  109. data/ext/mathfunc/test/test_hypot.rb +5 -0
  110. data/ext/mathfunc/test/test_j0.rb +22 -0
  111. data/ext/mathfunc/test/test_jn.rb +8 -0
  112. data/ext/mathfunc/test/test_sph.rb +9 -0
  113. data/ext/narray/README +22 -0
  114. data/ext/narray/ca_wrap_narray.c +491 -0
  115. data/ext/narray/carray_narray.c +21 -0
  116. data/ext/narray/extconf.rb +57 -0
  117. data/ext/narray/lib/autoload/autoload_math_narray.rb +1 -0
  118. data/ext/narray/lib/autoload/autoload_math_narray_miss.rb +11 -0
  119. data/ext/narray/lib/math/narray.rb +17 -0
  120. data/ext/narray/lib/math/narray_miss.rb +45 -0
  121. data/extconf.rb +3 -25
  122. data/lib/carray.rb +28 -0
  123. data/lib/carray/autoload/autoload_base.rb +23 -0
  124. data/lib/carray/autoload/autoload_graphics_gnuplot.rb +2 -0
  125. data/lib/carray/autoload/autoload_io_csv.rb +14 -0
  126. data/lib/carray/autoload/autoload_io_excel.rb +5 -0
  127. data/lib/carray/autoload/autoload_io_imagemagick.rb +6 -0
  128. data/lib/carray/autoload/autoload_io_pg.rb +6 -0
  129. data/lib/carray/autoload/autoload_io_sqlite3.rb +12 -0
  130. data/lib/carray/autoload/autoload_io_table.rb +1 -0
  131. data/lib/carray/autoload/autoload_math_histogram.rb +5 -0
  132. data/lib/carray/autoload/autoload_math_interp.rb +4 -0
  133. data/lib/carray/autoload/autoload_math_recurrence.rb +6 -0
  134. data/lib/carray/autoload/autoload_object_iterator.rb +1 -0
  135. data/lib/carray/autoload/autoload_object_link.rb +1 -0
  136. data/lib/carray/autoload/autoload_object_pack.rb +2 -0
  137. data/lib/carray/base/autoload.rb +94 -0
  138. data/lib/carray/base/basic.rb +1051 -0
  139. data/lib/carray/base/inspect.rb +252 -0
  140. data/lib/carray/base/iterator.rb +367 -0
  141. data/lib/carray/base/math.rb +403 -0
  142. data/lib/carray/base/obsolete.rb +93 -0
  143. data/lib/carray/base/serialize.rb +260 -0
  144. data/lib/carray/base/struct.rb +634 -0
  145. data/lib/carray/graphics/gnuplot.rb +2116 -0
  146. data/lib/carray/info.rb +112 -0
  147. data/lib/carray/io/csv.rb +560 -0
  148. data/lib/carray/io/excel.rb +26 -0
  149. data/lib/carray/io/imagemagick.rb +231 -0
  150. data/lib/carray/io/pg.rb +101 -0
  151. data/lib/carray/io/sqlite3.rb +202 -0
  152. data/lib/carray/io/table.rb +77 -0
  153. data/lib/carray/math/histogram.rb +179 -0
  154. data/lib/carray/math/interp.rb +57 -0
  155. data/lib/carray/math/interp/adapter_gsl_spline.rb +47 -0
  156. data/lib/carray/math/recurrence.rb +95 -0
  157. data/lib/carray/mkmf.rb +145 -0
  158. data/lib/carray/object/ca_obj_iterator.rb +52 -0
  159. data/lib/carray/object/ca_obj_link.rb +52 -0
  160. data/lib/carray/object/ca_obj_pack.rb +101 -0
  161. data/mkmath.rb +731 -0
  162. data/mt19937ar.c +182 -0
  163. data/mt19937ar.h +86 -0
  164. data/rdoc_main.rb +27 -0
  165. data/rdoc_math.rb +5 -0
  166. data/rdoc_stat.rb +31 -0
  167. data/ruby_carray.c +242 -0
  168. data/ruby_ccomplex.c +497 -0
  169. data/ruby_float_func.c +83 -0
  170. data/spec/CABlockIterator/CABlockIterator_spec.rb +113 -0
  171. data/spec/CArray/bug/store_spec.rb +27 -0
  172. data/spec/CArray/index/repeat_spec.rb +10 -0
  173. data/spec/CArray/method/eq_spec.rb +80 -0
  174. data/spec/CArray/method/is_nan_spec.rb +12 -0
  175. data/spec/CArray/method/ne_spec.rb +18 -0
  176. data/spec/CArray/method/round_spec.rb +11 -0
  177. data/spec/CArray/object/_attribute_spec.rb +32 -0
  178. data/spec/CArray/object/s_new_spec.rb +31 -0
  179. data/spec/CArray/serialize/Serialization_spec.rb +89 -0
  180. data/spec/spec_all.rb +11 -0
  181. data/test/test_ALL.rb +50 -0
  182. data/test/test_CABitfield.rb +59 -0
  183. data/test/test_CABlock.rb +208 -0
  184. data/test/test_CAField.rb +40 -0
  185. data/test/test_CAGrid.rb +76 -0
  186. data/test/test_CAMapping.rb +106 -0
  187. data/test/test_CAMmap.rb +11 -0
  188. data/test/test_CARefer.rb +94 -0
  189. data/test/test_CARepeat.rb +66 -0
  190. data/test/test_CASelect.rb +23 -0
  191. data/test/test_CAShift.rb +17 -0
  192. data/test/test_CATranspose.rb +61 -0
  193. data/test/test_CAVirtual.rb +214 -0
  194. data/test/test_CAWindow.rb +55 -0
  195. data/test/test_CAWrap.rb +9 -0
  196. data/test/test_CArray.rb +228 -0
  197. data/test/test_CComplex.rb +83 -0
  198. data/test/test_CScalar.rb +91 -0
  199. data/test/test_attribute.rb +281 -0
  200. data/test/test_block_iterator.rb +17 -0
  201. data/test/test_boolean.rb +99 -0
  202. data/test/test_cast.rb +33 -0
  203. data/test/test_class.rb +85 -0
  204. data/test/test_complex.rb +43 -0
  205. data/test/test_composite.rb +125 -0
  206. data/test/test_convert.rb +79 -0
  207. data/test/test_copy.rb +141 -0
  208. data/test/test_creation.rb +85 -0
  209. data/test/test_element.rb +146 -0
  210. data/test/test_extream.rb +55 -0
  211. data/test/test_generate.rb +75 -0
  212. data/test/test_index.rb +71 -0
  213. data/test/test_mask.rb +578 -0
  214. data/test/test_math.rb +98 -0
  215. data/test/test_narray.rb +64 -0
  216. data/test/test_order.rb +147 -0
  217. data/test/test_random.rb +15 -0
  218. data/test/test_ref_store.rb +211 -0
  219. data/test/test_stat.rb +414 -0
  220. data/test/test_struct.rb +72 -0
  221. data/test/test_virtual.rb +49 -0
  222. data/utils/ca_ase.rb +21 -0
  223. data/utils/ca_methods.rb +15 -0
  224. data/utils/cast_checker.rb +30 -0
  225. data/utils/create_rdoc.sh +9 -0
  226. data/utils/diff_method.rb +52 -0
  227. data/utils/extract_rdoc.rb +27 -0
  228. data/utils/make_tgz.sh +3 -0
  229. data/utils/remove_resource_fork.sh +5 -0
  230. data/version.h +3 -3
  231. metadata +266 -1
@@ -0,0 +1,252 @@
1
+ # ----------------------------------------------------------------------------
2
+ #
3
+ # carray/base/inspect.rb
4
+ #
5
+ # This file is part of Ruby/CArray extension library.
6
+ # You can redistribute it and/or modify it under the terms of
7
+ # the Ruby Licence.
8
+ #
9
+ # Copyright (C) 2005 Hiroki Motoyoshi
10
+ #
11
+ # ----------------------------------------------------------------------------
12
+
13
+ class CArray::Inspector # :nodoc:
14
+
15
+ def initialize (carray)
16
+ @carray = carray
17
+ end
18
+
19
+ def inspect_string
20
+ if @carray.rank == 0
21
+ raise "can't inspect CArray of rank == 0"
22
+ end
23
+ formatter = get_formatter()
24
+ class_name = get_class_name()
25
+ type_name = get_type_name()
26
+ shape = get_shape()
27
+ data_spec = get_data_spec(0, Array.new(@carray.rank){0}, formatter)
28
+ info_list = get_info_list()
29
+ output = ["<",
30
+ format("%s.%s(%s)", class_name, type_name, shape.join(",")),
31
+ ": ",
32
+ info_list.join(" "),
33
+ "\n",
34
+ data_spec,
35
+ ">"
36
+ ].join
37
+ if @carray.tainted?
38
+ output.taint
39
+ end
40
+ return output
41
+ end
42
+
43
+ private
44
+
45
+ def get_class_name
46
+ return @carray.class.to_s
47
+ end
48
+
49
+ def get_type_name
50
+ type_name = CArray.data_type_name(@carray.data_type)
51
+ @carray.instance_exec {
52
+ case data_type
53
+ when CA_FIXLEN
54
+ return format("%s[%i]", type_name, bytes)
55
+ else
56
+ return type_name
57
+ end
58
+ }
59
+ end
60
+
61
+ def get_shape
62
+ case @carray.obj_type
63
+ when CA_OBJ_UNBOUND_REPEAT
64
+ dim = @carray.spec
65
+ else
66
+ dim = @carray.dim
67
+ end
68
+ return dim
69
+ end
70
+
71
+ def get_info_list
72
+ list = []
73
+ @carray.instance_exec {
74
+ # ---
75
+ if data_class
76
+ list << "data_class=%s" % data_class.inspect
77
+ end
78
+ # ---
79
+ if scalar?
80
+ list << "scalar"
81
+ end
82
+ # ---
83
+ unless kind_of?(CScalar)
84
+ list << "elem=%i" % elements
85
+ end
86
+ # ---
87
+ if has_mask?
88
+ list << "mask=%i" % count_masked
89
+ end
90
+ # ---
91
+ memsize = elements * bytes
92
+ case true
93
+ when memsize < 1024
94
+ list << "mem=%ib" % memsize
95
+ when memsize < 1024*1024
96
+ list << "mem=%.1fkb" % (memsize/1024.0)
97
+ else
98
+ list << "mem=%.1fmb" % (memsize/1024.0/1024.0)
99
+ end
100
+ # ---
101
+ if mask_array?
102
+ list << "mask_array"
103
+ end
104
+ if value_array?
105
+ list << "value_array"
106
+ end
107
+ # ---
108
+ if read_only?
109
+ list << "ro"
110
+ end
111
+ # ---
112
+ if virtual? and attached?
113
+ list << "attached"
114
+ end
115
+ # ---
116
+ if has_attribute?
117
+ list << "attrs={" + attribute.keys.join(",") + "}"
118
+ end
119
+ }
120
+ return list
121
+ end
122
+
123
+ def get_formatter
124
+ case @carray.data_type
125
+ when CA_BOOLEAN, CA_INT8, CA_INT16, CA_INT32, CA_INT64
126
+ lambda{|x| "%i" % x }
127
+ when CA_UINT8, CA_UINT16, CA_UINT32, CA_UINT64
128
+ lambda{|x| "%u" % x }
129
+ when CA_FLOAT32
130
+ lambda{|x| "%.5g" % x }
131
+ when CA_FLOAT64, CA_FLOAT128
132
+ lambda{|x| "%.8g" % x }
133
+ when CA_CMPLX64, CA_CMPLX128, CA_CMPLX256
134
+ lambda{|x| format("%.5g%s%.5gi",
135
+ x.real, (x.imag >= 0) ? "+" : "-", x.imag.abs) }
136
+ when CA_FIXLEN
137
+ if @carray.data_class
138
+ if @carray.bytes <= 6
139
+ lambda{|x| "%s" % x.encode.dump }
140
+ else
141
+ lambda{|x| "%s" % (x.encode.chomp[0, 5]+"...").dump }
142
+ end
143
+ else
144
+ if @carray.bytes <= 6
145
+ lambda{|x| "%s" % x.dump }
146
+ else
147
+ lambda{|x| "%s" % (x.chomp[0, 5]+"...").dump }
148
+ end
149
+ end
150
+ when CA_OBJECT
151
+ lambda { |x| x.inspect }
152
+ end
153
+ end
154
+
155
+ def get_data_spec (level, idx, formatter)
156
+ io = "[ "
157
+ rank = @carray.rank
158
+ dim = @carray.dim
159
+ if level == rank - 1
160
+ over = false
161
+ dim[level].times do |i|
162
+ idx[level] = i
163
+ v = @carray[*idx]
164
+ if v.undef?
165
+ io << '_'
166
+ else
167
+ io << formatter[v]
168
+ end
169
+ if i != dim[level] - 1
170
+ io << ", "
171
+ end
172
+ if io.length > 48 - 2*level
173
+ if i < dim[level] - 1
174
+ io << "..."
175
+ over = true
176
+ end
177
+ break
178
+ end
179
+ end
180
+ if over
181
+ idx[level] = dim[level] - 1
182
+ v = @carray[*idx]
183
+ if v.undef?
184
+ io << ", _"
185
+ else
186
+ io << ", " + formatter[v]
187
+ end
188
+ end
189
+ else
190
+ over = false
191
+ show = [dim[level], 5].min
192
+ show.times do |i|
193
+ idx[level] = i
194
+ io << get_data_spec(level+1, idx, formatter)
195
+ if i < show - 1
196
+ io << ",\n" + " " * (level+1)
197
+ end
198
+ if i >= 2 and dim[level] > 5
199
+ break
200
+ end
201
+ end
202
+ if dim[level] > 5
203
+ io << "... ... ..."
204
+ over = true
205
+ end
206
+ if over
207
+ idx[level] = dim[level] - 1
208
+ io << "\n"+ " " * (level+1) + get_data_spec(level+1, idx, formatter)
209
+ end
210
+ end
211
+ io << " ]"
212
+ return io
213
+ end
214
+
215
+ end
216
+
217
+ class CArray
218
+
219
+ def inspect
220
+ return CArray::Inspector.new(self).inspect_string
221
+ end
222
+
223
+ private
224
+
225
+ def desc
226
+ output = ""
227
+ case data_type
228
+ when CA_FIXLEN
229
+ output << sprintf("CArray.%s(%s, :bytes=>%i)",
230
+ data_type_name, dim.inspect[1..-2], bytes)
231
+ else
232
+ output << sprintf("CArray.%s(%s)",
233
+ data_type_name, dim.inspect[1..-2])
234
+ end
235
+ return output
236
+ end
237
+
238
+ public
239
+
240
+ def code
241
+ text = [
242
+ desc,
243
+ " { ",
244
+ self.to_a.pretty_inspect.split("\n").map{|s|
245
+ " " * (desc.length+3) + s
246
+ }.join("\n").lstrip,
247
+ " }"
248
+ ].join
249
+ return text
250
+ end
251
+
252
+ end
@@ -0,0 +1,367 @@
1
+ # ----------------------------------------------------------------------------
2
+ #
3
+ # carray/base/iterator.rb
4
+ #
5
+ # This file is part of Ruby/CArray extension library.
6
+ # You can redistribute it and/or modify it under the terms of
7
+ # the Ruby Licence.
8
+ #
9
+ # Copyright (C) 2005 Hiroki Motoyoshi
10
+ #
11
+ # ----------------------------------------------------------------------------
12
+
13
+ class CAIterator
14
+
15
+ include Enumerable
16
+
17
+ def self.define_evaluate_method (name)
18
+ define_method(name) { |*args|
19
+ self.evaluate(name, *args)
20
+ }
21
+ end
22
+
23
+ [
24
+ :axes!,
25
+ :normalize!,
26
+ :random!,
27
+ :reverse!,
28
+ :roll!,
29
+ :scale!,
30
+ :seq!,
31
+ :shift!,
32
+ :shuffle!,
33
+ :sort!,
34
+ :span!,
35
+ :transpose!,
36
+ ].each do |name|
37
+ define_evaluate_method(name)
38
+ end
39
+
40
+ def self.define_filter_method (data_type, name)
41
+ define_method(name) { |*args|
42
+ _data_type = data_type || self.reference.data_type
43
+ self.filter(_data_type, name, *args)
44
+ }
45
+ end
46
+
47
+ [
48
+ [:axes ],
49
+ [:normalize ],
50
+ [:random ],
51
+ [:reverse ],
52
+ [:roll ],
53
+ [:scale ],
54
+ [:seq ],
55
+ [:shift ],
56
+ [:shuffle ],
57
+ [:sort ],
58
+ [:span ],
59
+ [:transpose ],
60
+ ].each do |name, data_type|
61
+ define_filter_method(data_type, name)
62
+ end
63
+
64
+ def self.define_calculate_method (data_type, name)
65
+ define_method(name) { |*args|
66
+ _data_type = data_type || self.reference.data_type
67
+ self.calculate(_data_type, name, *args)
68
+ }
69
+ end
70
+
71
+ [
72
+ [:count_masked, CA_INT32],
73
+ [:count_not_masked, CA_INT32],
74
+ [:count_true, CA_INT32],
75
+ [:count_false, CA_INT32],
76
+ [:size, CA_INT32],
77
+ [:min, nil],
78
+ [:min_addr, CA_INT32],
79
+ [:max, nil],
80
+ [:max_addr, CA_INT32],
81
+ [:prod, CA_FLOAT64],
82
+ [:sum, CA_FLOAT64],
83
+ [:wsum, CA_FLOAT64],
84
+ [:mean, CA_FLOAT64],
85
+ [:wmean, CA_FLOAT64],
86
+ [:variancep, CA_FLOAT64],
87
+ [:variance, CA_FLOAT64],
88
+ [:stddevp, CA_FLOAT64],
89
+ [:stddev, CA_FLOAT64],
90
+ [:median, CA_FLOAT64],
91
+ [:accumulate, nil],
92
+ [:cummin, nil],
93
+ [:cummax, nil],
94
+ [:cumcount, CA_FLOAT64],
95
+ [:cumprod, CA_FLOAT64],
96
+ [:cumsum, CA_FLOAT64],
97
+ [:cumwsum, CA_FLOAT64],
98
+ [:count_equal, CA_INT32],
99
+ [:count_equiv, CA_INT32],
100
+ [:count_close, CA_INT32],
101
+ [:all_equal?, CA_BOOLEAN],
102
+ [:any_equal?, CA_BOOLEAN],
103
+ [:none_equal?, CA_BOOLEAN],
104
+ [:all_equiv?, CA_BOOLEAN],
105
+ [:any_equiv?, CA_BOOLEAN],
106
+ [:none_equiv?, CA_BOOLEAN],
107
+ [:all_close?, CA_BOOLEAN],
108
+ [:any_close?, CA_BOOLEAN],
109
+ [:none_close?, CA_BOOLEAN],
110
+ [:nearest_addr, CA_INT32],
111
+ [:mul_add, nil],
112
+ ].each do |name, data_type|
113
+ define_calculate_method(data_type, name)
114
+ end
115
+
116
+ # -----------------------------------------------------------
117
+
118
+ def ca
119
+ @iterary ||= CAIteratorArray.new(self)
120
+ return @iterary
121
+ end
122
+
123
+ def to_a
124
+ return ca.to_a
125
+ end
126
+
127
+ def pick (*idx)
128
+ out = prepare_output(reference.data_type, :bytes=>reference.bytes)
129
+ elements.times do |addr|
130
+ blk = kernel_at_addr(addr)
131
+ out[addr] = blk[*idx]
132
+ end
133
+ return out
134
+ end
135
+
136
+ def asign! (val)
137
+ each do |elem|
138
+ elem[] = val
139
+ end
140
+ return self
141
+ end
142
+
143
+ def [] (*idx)
144
+ if idx.any?{|x| x.is_a?(Symbol) }
145
+ return ca[*idx]
146
+ else
147
+ case idx.size
148
+ when 0
149
+ return clone
150
+ when 1
151
+ return kernel_at_addr(idx[0])
152
+ else
153
+ return kernel_at_index(idx)
154
+ end
155
+ end
156
+ end
157
+
158
+ def []= (*idx)
159
+ val = idx.pop
160
+ if idx.any?{|x| x.is_a?(Symbol) }
161
+ ca[*idx] = [val]
162
+ else
163
+ case idx.size
164
+ when 0
165
+ asign!(val)
166
+ when 1
167
+ kernel_at_addr(idx[0])[] = val
168
+ else
169
+ kernel_at_index(idx)[] = val
170
+ end
171
+ end
172
+ end
173
+
174
+ def put (*idx)
175
+ val = idx.pop
176
+ elements.times do |addr|
177
+ blk = kernel_at_addr(addr)
178
+ blk[*idx] = val
179
+ end
180
+ return self
181
+ end
182
+
183
+ def convert (data_type, options={})
184
+ out = prepare_output(data_type, options)
185
+ out.map_addr!{ |addr|
186
+ blk = kernel_at_addr(addr)
187
+ yield(blk.clone)
188
+ }
189
+ return out
190
+ end
191
+
192
+ def each ()
193
+ retval = nil
194
+ if self.class::UNIFORM_KERNEL
195
+ reference.attach! {
196
+ blk = kernel_at_addr(0)
197
+ elements.times do |addr|
198
+ kernel_move_to_addr(addr, blk)
199
+ retval = yield(blk.clone)
200
+ end
201
+ }
202
+ else
203
+ elements.times do |addr|
204
+ retval = yield(kernel_at_addr(addr).clone)
205
+ end
206
+ end
207
+ return retval
208
+ end
209
+
210
+ def each_with_addr ()
211
+ retval = nil
212
+ if self.class::UNIFORM_KERNEL
213
+ reference.attach! {
214
+ elements.times do |addr|
215
+ blk = kernel_at_addr(addr)
216
+ retval = yield(blk.clone, addr)
217
+ end
218
+ }
219
+ else
220
+ elements.times do |addr|
221
+ retval = yield(kernel_at_addr(addr).clone, addr)
222
+ end
223
+ end
224
+ return retval
225
+ end
226
+
227
+ def each_with_index ()
228
+ retval = nil
229
+ if self.class::UNIFORM_KERNEL
230
+ reference.attach! {
231
+ CArray.each_index(*dim) do |*idx|
232
+ blk = kernel_at_index(idx)
233
+ retval = yield(blk.clone, idx)
234
+ end
235
+ }
236
+ else
237
+ CArray.each_index(*dim) do |*idx|
238
+ retval = yield(kernel_at_index(idx).clone, idx)
239
+ end
240
+ end
241
+ return retval
242
+ end
243
+
244
+ def inject (*argv)
245
+ case argv.size
246
+ when 0
247
+ memo = nil
248
+ each_with_addr do |val, addr|
249
+ if addr == 0
250
+ memo = val
251
+ else
252
+ memo = yield(memo, val)
253
+ end
254
+ end
255
+ return memo
256
+ when 1
257
+ memo = argv.first
258
+ each do |val|
259
+ memo = yield(memo, val)
260
+ end
261
+ return memo
262
+ else
263
+ raise "invalid number of arguments (#{argv.size} for 0 or 1)"
264
+ end
265
+ end
266
+
267
+ def sort_by! (&block)
268
+ ia = self.ca
269
+ ia[] = ia.to_a.sort_by(&block).map{|x| x.to_ca }
270
+ return reference
271
+ end
272
+
273
+ def sort_by (&block)
274
+ out = reference.template
275
+ idx = ca.convert(:object, &block).sort_addr
276
+ ca[idx].each_with_addr do |blk, i|
277
+ kernel_at_addr(i, out)[] = blk
278
+ end
279
+ return out
280
+ end
281
+
282
+ def sort_with (&block)
283
+ out = reference.template
284
+ idx = CA.sort_addr(*yield(self))
285
+ ca[idx].each_with_addr do |blk, i|
286
+ kernel_at_addr(i, out)[] = blk
287
+ end
288
+ return out
289
+ end
290
+
291
+ end
292
+
293
+
294
+ # -----------------------------------------------------------------
295
+
296
+ class CArray
297
+ def windows (*args, &block)
298
+ return CAWindowIterator.new(self.window(*args, &block))
299
+ end
300
+ end
301
+
302
+ # -----------------------------------------------------------------
303
+
304
+ class CArray
305
+
306
+ def classes (classifier=nil, &block)
307
+ return CAClassIterator.new(self, classifier).__build__(&block)
308
+ end
309
+
310
+ end
311
+
312
+ class CAClassIterator < CAIterator # :nodoc:
313
+
314
+ UNIFORM_KERNEL = false
315
+
316
+ def initialize (reference, classifier = nil)
317
+ @reference = reference
318
+ @classifier = classifier || @reference.uniq.sort
319
+ @null = CArray.new(@reference.data_type,[0])
320
+ @table = {}
321
+ @rank = 1
322
+ @dim = [0]
323
+ if @classifier.all_masked? or @classifier.size == 0
324
+ @dim = [0]
325
+ else
326
+ # @dim = [@classifier.max+1]
327
+ @dim = [@classifier.size]
328
+ end
329
+ end
330
+
331
+ attr_reader :classifier, :table
332
+
333
+ def __build__ (&block)
334
+ if @block
335
+ @classifier.each_with_addr do |v, i|
336
+ @table[v] = block[v].where
337
+ end
338
+ else
339
+ @classifier.each_with_addr do |v, i|
340
+ @table[v] = @reference.eq(v).where
341
+ end
342
+ end
343
+ return self
344
+ end
345
+
346
+ def ranking (&block)
347
+ block ||= lambda {|a| a.size }
348
+ values = self.to_a.map{|v| block[v] }.to_ca
349
+ addrs = values.sort_addr.reverse
350
+ return CArray.join([@classifier[addrs], values[addrs]])
351
+ end
352
+
353
+ def kernel_at_addr (addr, ref = nil)
354
+ ref ||= @reference
355
+ if @table[addr]
356
+ return ref[@table[addr]]
357
+ else
358
+ return @null
359
+ end
360
+ end
361
+
362
+ def kernel_at_index (idx, ref = nil)
363
+ kernel_at_addr(idx[0], ref)
364
+ end
365
+
366
+ end
367
+