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,738 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ ca_obj_grid.c
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
+ #include "carray.h"
14
+
15
+ typedef struct {
16
+ int16_t obj_type;
17
+ int8_t data_type;
18
+ int8_t rank;
19
+ int32_t flags;
20
+ int32_t bytes;
21
+ int32_t elements;
22
+ int32_t *dim;
23
+ char *ptr;
24
+ CArray *mask;
25
+ CArray *parent;
26
+ uint32_t attach;
27
+ uint8_t nosync;
28
+ /* -------------*/
29
+ CArray **grid;
30
+ int8_t *contig;
31
+ } CAGrid;
32
+
33
+ static VALUE rb_cCAGrid;
34
+
35
+ /* rdoc:
36
+ class CAGrid < CAVirtual # :nodoc:
37
+ end
38
+ */
39
+
40
+ static int8_t CA_OBJ_GRID;
41
+
42
+ int
43
+ ca_grid_setup (CAGrid *ca, CArray *parent, int32_t *dim,
44
+ CArray **grid, int8_t *contig, int share)
45
+ {
46
+ int8_t rank, data_type;
47
+ int32_t *dim0;
48
+ int32_t elements, bytes;
49
+ double length;
50
+ int i, j, k;
51
+
52
+ data_type = parent->data_type;
53
+ rank = parent->rank;
54
+ bytes = parent->bytes;
55
+ dim0 = parent->dim;
56
+
57
+ elements = 1;
58
+ length = bytes;
59
+ for (i=0; i<rank; i++) {
60
+ if ( dim[i] < 0 ) {
61
+ rb_raise(rb_eRuntimeError, "negative size for %i-th dimension", i);
62
+ }
63
+ elements *= dim[i];
64
+ length *= dim[i];
65
+ }
66
+
67
+ if ( length > CA_LENGTH_MAX ) {
68
+ rb_raise(rb_eRuntimeError, "too large byte length");
69
+ }
70
+
71
+ ca->obj_type = CA_OBJ_GRID;
72
+ ca->data_type = data_type;
73
+ ca->flags = 0;
74
+ ca->rank = rank;
75
+ ca->bytes = bytes;
76
+ ca->elements = elements;
77
+ ca->ptr = NULL;
78
+ ca->mask = NULL;
79
+ ca->dim = ALLOC_N(int32_t, rank);
80
+
81
+ ca->parent = parent;
82
+ ca->attach = 0;
83
+ ca->nosync = 0;
84
+
85
+ if ( share ) {
86
+ ca_set_flag(ca, CA_FLAG_SHARE_INDEX);
87
+ ca->grid = grid;
88
+ ca->contig = contig;
89
+ }
90
+ else {
91
+ ca->grid = ALLOC_N(CArray *, rank);
92
+ ca->contig = ALLOC_N(int8_t, rank);
93
+ }
94
+
95
+ memcpy(ca->dim, dim, rank * sizeof(int32_t));
96
+
97
+ if ( ! share ) {
98
+ for (i=0; i<rank; i++) {
99
+ if ( grid[i] ) {
100
+ if ( ca_is_any_masked(grid[i]) ) {
101
+ int32_t gsize = grid[i]->elements - ca_count_masked(grid[i]);
102
+ boolean8_t *m;
103
+ int32_t n;
104
+ ca->grid[i] = carray_new(CA_INT32, 1, &gsize, 0, NULL);
105
+ m = (boolean8_t *)grid[i]->mask->ptr;
106
+ n = 0;
107
+ for (j=0; j<grid[i]->elements; j++) {
108
+ if ( ! *m ) {
109
+ k = ((int32_t*)grid[i]->ptr)[j];
110
+ CA_CHECK_INDEX(k, dim0[i]);
111
+ ((int32_t*)ca->grid[i]->ptr)[n] = k;
112
+ n++;
113
+ }
114
+ m++;
115
+ }
116
+ ca->contig[i] = 0;
117
+ }
118
+ else {
119
+ ca->grid[i] = ca_template(grid[i]);
120
+ for (j=0; j<grid[i]->elements; j++) {
121
+ k = ((int32_t*)grid[i]->ptr)[j];
122
+ CA_CHECK_INDEX(k, dim0[i]);
123
+ ((int32_t*)ca->grid[i]->ptr)[j] = k;
124
+ }
125
+ ca->contig[i] = 0;
126
+ }
127
+ }
128
+ else {
129
+ int32_t *p;
130
+ ca->grid[i] = carray_new(CA_INT32, 1, &dim[i], 0, NULL);
131
+ p = (int32_t *)ca->grid[i]->ptr;
132
+ for (j=0; j<dim[i]; j++) {
133
+ *p++ = j;
134
+ }
135
+ ca->contig[i] = 1;
136
+ }
137
+ }
138
+ }
139
+
140
+ if ( ca->rank == 1 && ca_is_scalar(grid[0]) ) {
141
+ ca_set_flag(ca, CA_FLAG_SCALAR);
142
+ }
143
+
144
+ return 0;
145
+ }
146
+
147
+ CAGrid *
148
+ ca_grid_new (CArray *parent, int32_t *dim, CArray **grid)
149
+ {
150
+ CAGrid *ca = ALLOC(CAGrid);
151
+ ca_grid_setup(ca, parent, dim, grid, NULL, 0);
152
+ return ca;
153
+ }
154
+
155
+ CAGrid *
156
+ ca_grid_new_share (CArray *parent, int32_t *dim, CArray **grid, int8_t *contig)
157
+ {
158
+ CAGrid *ca = ALLOC(CAGrid);
159
+ ca_grid_setup(ca, parent, dim, grid, contig, 1);
160
+ return ca;
161
+ }
162
+
163
+ static void
164
+ free_ca_grid (void *ap)
165
+ {
166
+ CAGrid *ca = (CAGrid *) ap;
167
+ int32_t i;
168
+ if ( ca != NULL ) {
169
+ ca_free(ca->mask);
170
+ if ( ! (ca->flags & CA_FLAG_SHARE_INDEX)) {
171
+ xfree(ca->contig);
172
+ for (i=0; i<ca->rank; i++) {
173
+ ca_free(ca->grid[i]);
174
+ }
175
+ xfree(ca->grid);
176
+ }
177
+ xfree(ca->dim);
178
+ xfree(ca);
179
+ }
180
+ }
181
+
182
+ /* ------------------------------------------------------------------- */
183
+
184
+ static void ca_grid_attach (CAGrid *ca);
185
+ static void ca_grid_sync (CAGrid *ca);
186
+ static void ca_grid_fill (CAGrid *ca, char *ptr);
187
+
188
+ static void *
189
+ ca_grid_func_clone (void *ap)
190
+ {
191
+ CAGrid *ca = (CAGrid *) ap;
192
+ return ca_grid_new_share(ca->parent, ca->dim, ca->grid, ca->contig);
193
+ }
194
+
195
+ static char *
196
+ ca_grid_func_ptr_at_addr (void *ap, int32_t addr)
197
+ {
198
+ CAGrid *ca = (CAGrid *) ap;
199
+ if ( ! ca->ptr ) {
200
+ int32_t idx[CA_RANK_MAX];
201
+ ca_addr2index((CArray *)ca, addr, idx);
202
+ return ca_ptr_at_index(ca, idx);
203
+ }
204
+ else {
205
+ return ca->ptr + ca->bytes * addr;
206
+ }
207
+ }
208
+
209
+ static char *
210
+ ca_grid_func_ptr_at_index (void *ap, int32_t *idx)
211
+ {
212
+ CAGrid *ca = (CAGrid *) ap;
213
+ if ( ! ca->ptr ) {
214
+ CArray **grid = ca->grid;
215
+ int32_t *dim0 = ca->parent->dim;
216
+ int32_t n, i;
217
+
218
+ n = 0;
219
+ for (i=0; i<ca->rank; i++) {
220
+ n = dim0[i]*n + *(int32_t*) ca_ptr_at_addr(grid[i], idx[i]);
221
+ }
222
+
223
+ if ( ca->parent->ptr == NULL ) {
224
+ return ca_ptr_at_addr(ca->parent, n);
225
+ }
226
+ else {
227
+ return ca->parent->ptr + ca->bytes * n;
228
+ }
229
+ }
230
+ else {
231
+ return ca_func[CA_OBJ_ARRAY].ptr_at_index(ca, idx);
232
+ }
233
+ }
234
+
235
+ static void
236
+ ca_grid_func_fetch_index (void *ap, int32_t *idx, void *ptr)
237
+ {
238
+ CAGrid *ca = (CAGrid *) ap;
239
+ CArray **grid = ca->grid;
240
+ int32_t idx0[CA_RANK_MAX];
241
+ int32_t i;
242
+ for (i=0; i<ca->rank; i++) {
243
+ ca_fetch_addr(grid[i], idx[i], &idx0[i]);
244
+ }
245
+ ca_fetch_index(ca->parent, idx0, ptr);
246
+ }
247
+
248
+ static void
249
+ ca_grid_func_store_index (void *ap, int32_t *idx, void *ptr)
250
+ {
251
+ CAGrid *ca = (CAGrid *) ap;
252
+ CArray **grid = ca->grid;
253
+ int32_t idx0[CA_RANK_MAX];
254
+ int32_t i;
255
+ for (i=0; i<ca->rank; i++) {
256
+ ca_fetch_addr(grid[i], idx[i], &idx0[i]);
257
+ }
258
+ ca_store_index(ca->parent, idx0, ptr);
259
+ }
260
+
261
+ static void
262
+ ca_grid_func_allocate (void *ap)
263
+ {
264
+ CAGrid *ca = (CAGrid *) ap;
265
+ ca_attach(ca->parent);
266
+ /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
267
+ ca->ptr = malloc_with_check(ca_length(ca));
268
+ }
269
+
270
+ static void
271
+ ca_grid_func_attach (void *ap)
272
+ {
273
+ void ca_grid_attach (CAGrid *cb);
274
+
275
+ CAGrid *ca = (CAGrid *) ap;
276
+ ca_attach(ca->parent);
277
+ /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
278
+ ca->ptr = malloc_with_check(ca_length(ca));
279
+ ca_grid_attach(ca);
280
+ }
281
+
282
+ static void
283
+ ca_grid_func_sync (void *ap)
284
+ {
285
+ CAGrid *ca = (CAGrid *) ap;
286
+ ca_grid_sync(ca);
287
+ ca_sync(ca->parent);
288
+ }
289
+
290
+ static void
291
+ ca_grid_func_detach (void *ap)
292
+ {
293
+ CAGrid *ca = (CAGrid *) ap;
294
+ free(ca->ptr);
295
+ ca->ptr = NULL;
296
+ ca_detach(ca->parent);
297
+ }
298
+
299
+ static void
300
+ ca_grid_func_copy_data (void *ap, void *ptr)
301
+ {
302
+ CAGrid *ca = (CAGrid *) ap;
303
+ char *ptr0 = ca->ptr;
304
+ ca_attach(ca->parent);
305
+ ca->ptr = ptr;
306
+ ca_grid_attach(ca);
307
+ ca->ptr = ptr0;
308
+ ca_detach(ca->parent);
309
+ }
310
+
311
+ static void
312
+ ca_grid_func_sync_data (void *ap, void *ptr)
313
+ {
314
+ CAGrid *ca = (CAGrid *) ap;
315
+ char *ptr0 = ca->ptr;
316
+ ca_attach(ca->parent);
317
+ ca->ptr = ptr;
318
+ ca_grid_sync(ca);
319
+ ca->ptr = ptr0;
320
+ ca_sync(ca->parent);
321
+ ca_detach(ca->parent);
322
+ }
323
+
324
+ static void
325
+ ca_grid_func_fill_data (void *ap, void *ptr)
326
+ {
327
+ CAGrid *ca = (CAGrid *) ap;
328
+ ca_attach(ca->parent);
329
+ ca_grid_fill(ca, ptr);
330
+ ca_sync(ca->parent);
331
+ ca_detach(ca->parent);
332
+ }
333
+
334
+ static void
335
+ ca_grid_func_create_mask (void *ap)
336
+ {
337
+ CAGrid *ca = (CAGrid *) ap;
338
+
339
+ ca_update_mask(ca->parent);
340
+ if ( ! ca->parent->mask ) {
341
+ ca_create_mask(ca->parent);
342
+ }
343
+
344
+ ca->mask = (CArray *) ca_grid_new_share(ca->parent->mask,
345
+ ca->dim, ca->grid, ca->contig);
346
+ }
347
+
348
+ ca_operation_function_t ca_grid_func = {
349
+ -1, /* CA_OBJ_GRID */
350
+ CA_VIRTUAL_ARRAY,
351
+ free_ca_grid,
352
+ ca_grid_func_clone,
353
+ ca_grid_func_ptr_at_addr,
354
+ ca_grid_func_ptr_at_index,
355
+ NULL,
356
+ ca_grid_func_fetch_index,
357
+ NULL,
358
+ ca_grid_func_store_index,
359
+ ca_grid_func_allocate,
360
+ ca_grid_func_attach,
361
+ ca_grid_func_sync,
362
+ ca_grid_func_detach,
363
+ ca_grid_func_copy_data,
364
+ ca_grid_func_sync_data,
365
+ ca_grid_func_fill_data,
366
+ ca_grid_func_create_mask,
367
+ };
368
+
369
+ /* ------------------------------------------------------------------- */
370
+
371
+ #define proc_grid_attach(type) \
372
+ { \
373
+ int32_t *pi = (int32_t*) ca_ptr_at_addr(grid[level], 0); \
374
+ type *p = (type*) ca_ptr_at_index(ca, idx); \
375
+ type *q = (type*) ca_ptr_at_index(ca->parent, idx0); \
376
+ for (i=0; i<ca->dim[level]; i++, pi++, p++) { \
377
+ k = *pi; \
378
+ *p = *(q+k); \
379
+ } \
380
+ }
381
+
382
+ static void
383
+ ca_grid_attach_loop (CAGrid *ca, int16_t level, int32_t *idx, int32_t *idx0)
384
+ {
385
+ CArray **grid = ca->grid;
386
+ int32_t i, k;
387
+
388
+ if ( level == ca->rank - 1 ) {
389
+ idx[level] = 0;
390
+ idx0[level] = 0;
391
+ if ( ca->contig[level] ) {
392
+ memcpy(ca_ptr_at_index(ca, idx), ca_ptr_at_index(ca->parent, idx0),
393
+ ca->bytes * ca->dim[level]);
394
+ }
395
+ else {
396
+ switch ( ca->bytes ) {
397
+ case 1: proc_grid_attach(int8_t); break;
398
+ case 2: proc_grid_attach(int16_t); break;
399
+ case 4: proc_grid_attach(int32_t); break;
400
+ case 8: proc_grid_attach(float64_t); break;
401
+ default:
402
+ {
403
+ int32_t *pi = (int32_t*) ca_ptr_at_addr(grid[level], 0);
404
+ char *p = ca_ptr_at_index(ca, idx);
405
+ char *q;
406
+ idx0[level] = 0;
407
+ q = ca_ptr_at_index(ca->parent, idx0);
408
+ for (i=0; i<ca->dim[level]; i++, pi++, p+=ca->bytes) {
409
+ k = *pi;
410
+ memcpy(p, q + ca->bytes * k, ca->bytes);
411
+ }
412
+ }
413
+ }
414
+ }
415
+ }
416
+ else {
417
+ if ( ca->contig[level] ) {
418
+ for (i=0; i<ca->dim[level]; i++) {
419
+ idx[level] = i;
420
+ idx0[level] = i;
421
+ ca_grid_attach_loop(ca, level+1, idx, idx0);
422
+ }
423
+ }
424
+ else {
425
+ int32_t *pi;
426
+ pi = (int32_t*) ca_ptr_at_addr(grid[level], 0);
427
+ for (i=0; i<ca->dim[level]; i++, pi++) {
428
+ k = *pi;
429
+ idx[level] = i;
430
+ idx0[level] = k;
431
+ ca_grid_attach_loop(ca, level+1, idx, idx0);
432
+ }
433
+ }
434
+ }
435
+ }
436
+
437
+ static void
438
+ ca_grid_attach (CAGrid *ca)
439
+ {
440
+ int32_t idx[CA_RANK_MAX];
441
+ int32_t idx0[CA_RANK_MAX];
442
+ ca_grid_attach_loop(ca, (int16_t) 0, idx, idx0);
443
+ }
444
+
445
+ #define proc_grid_sync(type) \
446
+ { \
447
+ int32_t *pi = (int32_t*) ca_ptr_at_addr(grid[level], 0); \
448
+ type *p = (type*) ca_ptr_at_index(ca, idx); \
449
+ type *q = (type*) ca_ptr_at_index(ca->parent, idx0); \
450
+ for (i=0; i<ca->dim[level]; i++, pi++, p++) { \
451
+ k = *pi; \
452
+ *(q+k) = *p; \
453
+ } \
454
+ }
455
+
456
+ static void
457
+ ca_grid_sync_loop (CAGrid *ca, int16_t level, int32_t *idx, int32_t *idx0)
458
+ {
459
+ CArray **grid = ca->grid;
460
+ int32_t i, k;
461
+
462
+ if ( level == ca->rank - 1 ) {
463
+ idx[level] = 0;
464
+ idx0[level] = 0;
465
+ if ( ca->contig[level] ) {
466
+ memcpy(ca_ptr_at_index(ca->parent, idx0), ca_ptr_at_index(ca, idx),
467
+ ca->bytes * ca->dim[level]);
468
+ }
469
+ else {
470
+ switch ( ca->bytes ) {
471
+ case 1: proc_grid_sync(int8_t); break;
472
+ case 2: proc_grid_sync(int16_t); break;
473
+ case 4: proc_grid_sync(int32_t); break;
474
+ case 8: proc_grid_sync(float64_t); break;
475
+ default:
476
+ {
477
+ int32_t *pi = (int32_t*) ca_ptr_at_addr(grid[level], 0);
478
+ char *p = ca_ptr_at_index(ca, idx);
479
+ char *q;
480
+ idx0[level] = 0;
481
+ q = ca_ptr_at_index(ca->parent, idx0);
482
+ for (i=0; i<ca->dim[level]; i++, pi++, p+=ca->bytes) {
483
+ k = *pi;
484
+ memcpy(q + ca->bytes * k, p, ca->bytes);
485
+ }
486
+ }
487
+ }
488
+ }
489
+ }
490
+ else {
491
+ if ( ca->contig[level] ) {
492
+ for (i=0; i<ca->dim[level]; i++) {
493
+ idx[level] = i;
494
+ idx0[level] = i;
495
+ ca_grid_sync_loop(ca, level+1, idx, idx0);
496
+ }
497
+ }
498
+ else {
499
+ for (i=0; i<ca->dim[level]; i++) {
500
+ k = *(int32_t*) ca_ptr_at_addr(grid[level], i);
501
+ idx[level] = i;
502
+ idx0[level] = k;
503
+ ca_grid_sync_loop(ca, level+1, idx, idx0);
504
+ }
505
+ }
506
+ }
507
+ }
508
+
509
+ static void
510
+ ca_grid_sync (CAGrid *ca)
511
+ {
512
+ int32_t idx[CA_RANK_MAX];
513
+ int32_t idx0[CA_RANK_MAX];
514
+ ca_grid_sync_loop(ca, (int16_t) 0, idx, idx0);
515
+ }
516
+
517
+ #define proc_grid_fill(type) \
518
+ { \
519
+ int32_t *pi = (int32_t*) ca_ptr_at_addr(grid[level], 0); \
520
+ type fval = *(type*)ptr; \
521
+ type *q = (type*) ca_ptr_at_index(ca->parent, idx0); \
522
+ for (i=0; i<ca->dim[level]; i++, pi++) { \
523
+ k = *pi; \
524
+ *(q+k) = fval; \
525
+ } \
526
+ }
527
+
528
+ static void
529
+ ca_grid_fill_loop (CAGrid *ca, char *ptr,
530
+ int16_t level, int32_t *idx0)
531
+ {
532
+ CArray **grid = ca->grid;
533
+ int32_t i, k;
534
+ if ( level == ca->rank - 1 ) {
535
+ idx0[level] = 0;
536
+ if ( ca->contig[level] ) {
537
+ char *p = ca_ptr_at_index(ca->parent, idx0);
538
+ for (i=0; i<ca->dim[level]; i++) {
539
+ memcpy(p, ptr, ca->bytes);
540
+ p += ca->bytes;
541
+ }
542
+ }
543
+ else {
544
+ switch ( ca->bytes ) {
545
+ case 1: proc_grid_fill(int8_t); break;
546
+ case 2: proc_grid_fill(int16_t); break;
547
+ case 4: proc_grid_fill(int32_t); break;
548
+ case 8: proc_grid_fill(float64_t); break;
549
+ default:
550
+ {
551
+ int32_t *pi = (int32_t*) ca_ptr_at_addr(grid[level], 0);
552
+ char *q;
553
+ idx0[level] = 0;
554
+ q = ca_ptr_at_index(ca->parent, idx0);
555
+ for (i=0; i<ca->dim[level]; i++, pi++) {
556
+ k = *pi;
557
+ memcpy(q + ca->bytes * k, ptr, ca->bytes);
558
+ }
559
+ }
560
+ }
561
+ }
562
+ }
563
+ else {
564
+ if ( ca->contig[level] ) {
565
+ for (i=0; i<ca->dim[level]; i++) {
566
+ idx0[level] = i;
567
+ ca_grid_fill_loop(ca, ptr, level+1, idx0);
568
+ }
569
+ }
570
+ else {
571
+ for (i=0; i<ca->dim[level]; i++) {
572
+ k = *(int32_t*) ca_ptr_at_addr(grid[level], i);
573
+ idx0[level] = k;
574
+ ca_grid_fill_loop(ca, ptr, level+1, idx0);
575
+ }
576
+ }
577
+ }
578
+ }
579
+
580
+ static void
581
+ ca_grid_fill (CAGrid *ca, char *ptr)
582
+ {
583
+ int32_t idx0[CA_RANK_MAX];
584
+ ca_grid_fill_loop(ca, ptr, (int16_t) 0, idx0);
585
+ }
586
+
587
+ /* ------------------------------------------------------------------- */
588
+
589
+ VALUE
590
+ rb_ca_grid_new (VALUE cary, int32_t *dim, CArray **grid)
591
+ {
592
+ volatile VALUE obj;
593
+ CArray *parent;
594
+ CAGrid *ca;
595
+ rb_check_carray_object(cary);
596
+ Data_Get_Struct(cary, CArray, parent);
597
+ ca = ca_grid_new(parent, dim, grid);
598
+ obj = ca_wrap_struct(ca);
599
+ rb_ca_set_parent(obj, cary);
600
+ rb_ca_data_type_inherit(obj, cary);
601
+ return obj;
602
+ }
603
+
604
+ /* rdoc:
605
+ class CArray
606
+ def grid
607
+ end
608
+ end
609
+ */
610
+
611
+ VALUE
612
+ rb_ca_grid (int argc, VALUE *argv, VALUE self)
613
+ {
614
+ volatile VALUE obj, ridx, rval;
615
+ volatile VALUE list = rb_ary_new();
616
+ CArray *ca;
617
+ CArray *ci[CA_RANK_MAX];
618
+ int32_t dim[CA_RANK_MAX];
619
+ CArray *grid[CA_RANK_MAX];
620
+ int32_t i;
621
+
622
+ Data_Get_Struct(self, CArray, ca);
623
+
624
+ ridx = rb_ary_new4(argc, argv);
625
+
626
+ if ( RARRAY_LEN(ridx) > ca->rank ) {
627
+ rb_raise(rb_eArgError, "# of arguments doesn't equal to the rank");
628
+ }
629
+ else if ( RARRAY_LEN(ridx) < ca->rank ) {
630
+ volatile VALUE ref;
631
+ CArray *cv;
632
+ int32_t rdim[CA_RANK_MAX];
633
+ int32_t rrank = RARRAY_LEN(ridx);
634
+ int32_t j = 0, k;
635
+ for (i=0; i<rrank; i++) {
636
+ rval = rb_ary_entry(ridx, i);
637
+ if ( rb_obj_is_carray(rval) ) {
638
+ Data_Get_Struct(rval, CArray, cv);
639
+ rdim[i] = 1;
640
+ for (k=0; k<cv->rank; k++) {
641
+ rdim[i] *= ca->dim[j];
642
+ j += 1;
643
+ }
644
+ }
645
+ else {
646
+ rdim[i] = ca->dim[j];
647
+ j += 1;
648
+ }
649
+ }
650
+ if ( j != ca->rank ) {
651
+ rb_raise(rb_eArgError, "invalid total rank of args");
652
+ }
653
+ ref = rb_ca_refer_new(self, ca->data_type, rrank, rdim, ca->bytes, 0);
654
+ return rb_ca_grid(argc, argv, ref);
655
+ }
656
+
657
+ for (i=0; i<RARRAY_LEN(ridx); i++) {
658
+ rval = rb_ary_entry(ridx, i);
659
+ if ( NIL_P(rval) ) {
660
+ ci[i] = NULL;
661
+ dim[i] = ca->dim[i];
662
+ grid[i] = NULL;
663
+ }
664
+ else {
665
+ if ( rb_obj_is_carray(rval) ) {
666
+ if ( rb_ca_is_boolean_type(rval) ) {
667
+ rval = rb_ca_where(rval);
668
+ }
669
+ }
670
+ else if ( rb_obj_is_kind_of(rval, rb_cRange) ) {
671
+ rval = rb_funcall(rb_mKernel, rb_intern("CA_INT32"), 1, rval);
672
+ }
673
+ else if ( TYPE(rval) == T_ARRAY ) {
674
+ rb_raise(rb_eRuntimeError, "not implemented for this index");
675
+ }
676
+ ci[i] = ca_wrap_readonly(rval, CA_INT32);
677
+ rb_ary_push(list, rval);
678
+ ca_attach(ci[i]);
679
+
680
+ if ( ca_is_any_masked(ci[i]) ) {
681
+ dim[i] = ci[i]->elements - ca_count_masked(ci[i]);
682
+ }
683
+ else {
684
+ dim[i] = ci[i]->elements;
685
+ }
686
+ grid[i] = ci[i];
687
+ }
688
+ }
689
+
690
+ obj = rb_ca_grid_new(self, dim, grid);
691
+
692
+ for (i=0; i<RARRAY_LEN(ridx); i++) {
693
+ if ( ci[i] ) {
694
+ ca_detach(ci[i]);
695
+ }
696
+ }
697
+
698
+ return obj;
699
+ }
700
+
701
+ static VALUE
702
+ rb_ca_grid_s_allocate (VALUE klass)
703
+ {
704
+ CAGrid *ca;
705
+ return Data_Make_Struct(klass, CAGrid, ca_mark, ca_free, ca);
706
+ }
707
+
708
+ static VALUE
709
+ rb_ca_grid_initialize_copy (VALUE self, VALUE other)
710
+ {
711
+ CAGrid *ca, *cs;
712
+
713
+ Data_Get_Struct(self, CAGrid, ca);
714
+ Data_Get_Struct(other, CAGrid, cs);
715
+
716
+ /* share grid info */
717
+ ca_grid_setup(ca, cs->parent, cs->dim, cs->grid, cs->contig, 1);
718
+
719
+ return self;
720
+ }
721
+
722
+
723
+
724
+ void
725
+ Init_ca_obj_grid ()
726
+ {
727
+ rb_cCAGrid = rb_define_class("CAGrid", rb_cCAVirtual);
728
+
729
+ CA_OBJ_GRID = ca_install_obj_type(rb_cCAGrid, ca_grid_func);
730
+ rb_define_const(rb_cObject, "CA_OBJ_GRID", INT2NUM(CA_OBJ_GRID));
731
+
732
+ rb_define_method(rb_cCArray, "grid", rb_ca_grid, -1);
733
+
734
+ rb_define_alloc_func(rb_cCAGrid, rb_ca_grid_s_allocate);
735
+ rb_define_method(rb_cCAGrid, "initialize_copy",
736
+ rb_ca_grid_initialize_copy, 1);
737
+ }
738
+