carray 2.0.1 → 3.0.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 (386) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +6 -25
  3. data/CHANGELOG.md +338 -0
  4. data/{NEWS.md → CHANGELOG.v1.md} +3 -0
  5. data/LICENSE +1 -1
  6. data/README.md +120 -36
  7. data/carray.gemspec +32 -30
  8. data/ext/ca_array_pool.c +91 -0
  9. data/ext/ca_axis_descriptor.h +186 -0
  10. data/ext/ca_axis_dispatch.c +924 -0
  11. data/ext/ca_axis_group.c +1244 -0
  12. data/ext/ca_bincmp_dispatch.c +76 -0
  13. data/ext/ca_bincmp_dispatch.h +85 -0
  14. data/ext/ca_binop_dispatch.c +124 -0
  15. data/ext/ca_binop_dispatch.h +152 -0
  16. data/ext/ca_categorical_iterator.c +1375 -0
  17. data/ext/ca_compare.c +94 -0
  18. data/ext/ca_compare.h +26 -0
  19. data/ext/ca_composite_dispatch.c +414 -0
  20. data/ext/ca_composite_dispatch.h +116 -0
  21. data/ext/ca_for_buffer.h +96 -0
  22. data/ext/ca_for_each_element.h +239 -0
  23. data/ext/ca_group_iter.c +304 -0
  24. data/ext/ca_iter_substrate.h +325 -0
  25. data/ext/ca_kernel_iterator.c +4367 -0
  26. data/ext/ca_kernel_iterator.h +2596 -0
  27. data/ext/ca_moncmp_dispatch.c +37 -0
  28. data/ext/ca_moncmp_dispatch.h +62 -0
  29. data/ext/ca_monop_dispatch.c +200 -0
  30. data/ext/ca_monop_dispatch.h +235 -0
  31. data/ext/ca_obj_array.c +355 -359
  32. data/ext/ca_obj_bincmp.c +839 -0
  33. data/ext/ca_obj_binop.c +948 -0
  34. data/ext/ca_obj_bitarray.c +369 -164
  35. data/ext/ca_obj_bitfield.c +294 -234
  36. data/ext/ca_obj_block.c +189 -711
  37. data/ext/ca_obj_byte_swap.c +766 -0
  38. data/ext/ca_obj_const_string.c +967 -0
  39. data/ext/ca_obj_face.c +750 -0
  40. data/ext/ca_obj_face.h +279 -0
  41. data/ext/ca_obj_fake.c +239 -100
  42. data/ext/ca_obj_farray.c +54 -441
  43. data/ext/ca_obj_field.c +82 -529
  44. data/ext/ca_obj_fixlen_string.c +308 -0
  45. data/ext/ca_obj_grid.c +866 -440
  46. data/ext/ca_obj_meld.c +1039 -0
  47. data/ext/ca_obj_moncmp.c +588 -0
  48. data/ext/ca_obj_monop.c +1123 -0
  49. data/ext/ca_obj_object.c +866 -296
  50. data/ext/ca_obj_record.c +470 -0
  51. data/ext/ca_obj_reduce.c +97 -82
  52. data/ext/ca_obj_refer.c +593 -459
  53. data/ext/ca_obj_remap.c +475 -0
  54. data/ext/ca_obj_repeat.c +92 -477
  55. data/ext/ca_obj_roll.c +624 -0
  56. data/ext/ca_obj_select.c +344 -296
  57. data/ext/ca_obj_select_axis.c +1306 -0
  58. data/ext/ca_obj_shift.c +231 -793
  59. data/ext/ca_obj_source.c +78 -0
  60. data/ext/ca_obj_stack.c +1173 -0
  61. data/ext/ca_obj_stride.c +2584 -0
  62. data/ext/ca_obj_string.c +270 -0
  63. data/ext/ca_obj_tile.c +622 -0
  64. data/ext/ca_obj_time.c +548 -0
  65. data/ext/ca_obj_timedelta.c +437 -0
  66. data/ext/ca_obj_transpose.c +62 -516
  67. data/ext/ca_obj_triop.c +785 -0
  68. data/ext/ca_obj_window.c +1202 -565
  69. data/ext/ca_op_byte_swap.c +175 -0
  70. data/ext/ca_op_cmplx64.h +123 -0
  71. data/ext/ca_op_ipower.c +316 -0
  72. data/ext/ca_op_powi.h +88 -0
  73. data/ext/ca_sort_kernels.h +132 -0
  74. data/ext/ca_sweep_engine.c +473 -0
  75. data/ext/ca_sweep_engine.h +166 -0
  76. data/ext/ca_transform_common.c +235 -0
  77. data/ext/ca_triop_dispatch.c +55 -0
  78. data/ext/ca_triop_dispatch.h +62 -0
  79. data/ext/carray.h +810 -420
  80. data/ext/carray_access.c +873 -731
  81. data/ext/carray_attribute.c +98 -329
  82. data/ext/carray_bincount.c +255 -0
  83. data/ext/carray_broadcast.c +376 -0
  84. data/ext/carray_build_flags.h +3 -0
  85. data/ext/carray_call_cfunc.c +2897 -874
  86. data/ext/carray_call_cfunc.h +313 -0
  87. data/ext/carray_cast.c +1264 -315
  88. data/ext/carray_cast_func.rb +81 -40
  89. data/ext/carray_class.c +53 -63
  90. data/ext/carray_config.h +28 -0
  91. data/ext/carray_conversion.c +350 -346
  92. data/ext/carray_copy.c +168 -270
  93. data/ext/carray_core.c +1396 -206
  94. data/ext/carray_count.c +312 -0
  95. data/ext/carray_data_type.c +43 -19
  96. data/ext/carray_element.c +585 -213
  97. data/ext/carray_factorize.c +2542 -0
  98. data/ext/carray_generate.c +230 -559
  99. data/ext/carray_histogram.c +490 -0
  100. data/ext/carray_hold.c +228 -0
  101. data/ext/carray_index_classifier.c +1021 -0
  102. data/ext/carray_index_classifier.h +27 -0
  103. data/ext/carray_internal.h +136 -0
  104. data/ext/carray_kernels_bincmp.c +4446 -0
  105. data/ext/carray_kernels_binop.c +11001 -0
  106. data/ext/carray_kernels_init.c +1131 -0
  107. data/ext/carray_kernels_map.c +3467 -0
  108. data/ext/carray_kernels_moncmp.c +2097 -0
  109. data/ext/carray_kernels_monop.c +18313 -0
  110. data/ext/carray_kernels_reduce_aggregate.c +25837 -0
  111. data/ext/carray_kernels_reduce_boolean.c +330 -0
  112. data/ext/carray_kernels_reduce_cumulative.c +14593 -0
  113. data/ext/carray_kernels_reduce_extreme.c +16948 -0
  114. data/ext/carray_kernels_reduce_variance.c +3910 -0
  115. data/ext/carray_kernels_scan.c +3693 -0
  116. data/ext/carray_kernels_search.c +32138 -0
  117. data/ext/carray_kernels_sort.c +10626 -0
  118. data/ext/carray_kernels_triop.c +1392 -0
  119. data/ext/carray_lazy.c +737 -0
  120. data/ext/carray_loop.c +88 -200
  121. data/ext/carray_mask.c +853 -158
  122. data/ext/carray_math_kernel.h +120 -0
  123. data/ext/carray_mathfunc.c +10 -241
  124. data/ext/carray_median_percentile.c +1257 -0
  125. data/ext/carray_memory_view.c +1650 -0
  126. data/ext/carray_operator.c +1525 -320
  127. data/ext/carray_order.c +664 -1394
  128. data/ext/carray_partition.c +416 -0
  129. data/ext/carray_random.c +518 -0
  130. data/ext/carray_scatter.c +357 -0
  131. data/ext/carray_slab.c +1219 -0
  132. data/ext/carray_slab.h +84 -0
  133. data/ext/carray_sort.c +829 -0
  134. data/ext/carray_sort_kernel.c +620 -0
  135. data/ext/carray_struct.c +695 -0
  136. data/ext/carray_test.c +343 -229
  137. data/ext/carray_undef.c +34 -17
  138. data/ext/carray_utils.c +175 -74
  139. data/ext/extconf.rb +234 -55
  140. data/ext/mk_call_cfunc.rb +671 -0
  141. data/ext/mkkernel.rb +9096 -0
  142. data/ext/ruby_carray.c +211 -108
  143. data/ext/version.h +4 -14
  144. data/ext/version.rb +5 -13
  145. data/lib/carray/arrow_tensor.rb +401 -0
  146. data/lib/carray/attribute.rb +166 -0
  147. data/lib/carray/autoload_carray.rb +239 -0
  148. data/lib/carray/autoload_method_extension.rb +45 -0
  149. data/lib/carray/axis_group.rb +711 -0
  150. data/lib/carray/basics.rb +481 -0
  151. data/lib/carray/bincount_nd.rb +358 -0
  152. data/lib/carray/block_iterator.rb +614 -0
  153. data/lib/carray/boolean_reduce.rb +109 -0
  154. data/lib/carray/categorical.rb +561 -0
  155. data/lib/carray/categorical_iterator.rb +1084 -0
  156. data/lib/carray/complex.rb +150 -0
  157. data/lib/carray/conditional.rb +216 -0
  158. data/lib/carray/const_string.rb +228 -0
  159. data/lib/carray/construct.rb +160 -328
  160. data/lib/carray/core_extensions.rb +297 -0
  161. data/lib/carray/data_type_extension.rb +250 -0
  162. data/lib/carray/fixlen_string.rb +95 -0
  163. data/lib/carray/frame/concat.rb +132 -0
  164. data/lib/carray/frame/convert.rb +95 -0
  165. data/lib/carray/frame/csv_parser.rb +211 -0
  166. data/lib/carray/frame/frame.rb +642 -0
  167. data/lib/carray/frame/group.rb +186 -0
  168. data/lib/carray/frame/io.rb +321 -0
  169. data/lib/carray/frame/join.rb +248 -0
  170. data/lib/carray/frame/records.rb +99 -0
  171. data/lib/carray/frame/sort.rb +113 -0
  172. data/lib/carray/frame/verbs.rb +316 -0
  173. data/lib/carray/frame.rb +16 -0
  174. data/lib/carray/fuse_source.rb +123 -0
  175. data/lib/carray/fusion.rb +218 -0
  176. data/lib/carray/histogram.rb +512 -0
  177. data/lib/carray/inspect.rb +37 -26
  178. data/lib/carray/iterator.rb +58 -349
  179. data/lib/carray/lazy.rb +941 -0
  180. data/lib/carray/mask_gap_fill.rb +200 -0
  181. data/lib/carray/math.rb +78 -342
  182. data/lib/carray/meld_reduce.rb +289 -0
  183. data/lib/carray/methods/align_addr.rb +116 -0
  184. data/lib/carray/methods/bin.rb +128 -0
  185. data/lib/carray/methods/bincount.rb +87 -0
  186. data/lib/carray/methods/bit_string.rb +92 -0
  187. data/lib/carray/methods/broadcast.rb +63 -0
  188. data/lib/carray/methods/choose.rb +39 -0
  189. data/lib/carray/methods/composition.rb +280 -0
  190. data/lib/carray/methods/gather_nd.rb +206 -0
  191. data/lib/carray/methods/index.rb +39 -0
  192. data/lib/carray/methods/insert_block.rb +99 -0
  193. data/lib/carray/methods/is_in.rb +141 -0
  194. data/lib/carray/methods/join.rb +90 -0
  195. data/lib/carray/methods/locate_addr.rb +52 -0
  196. data/lib/carray/methods/mask_duplicates.rb +41 -0
  197. data/lib/carray/methods/meshgrid.rb +90 -0
  198. data/lib/carray/methods/mode.rb +126 -0
  199. data/lib/carray/methods/nunique.rb +46 -0
  200. data/lib/carray/methods/resize.rb +56 -0
  201. data/lib/carray/methods/snap.rb +161 -0
  202. data/lib/carray/methods/string_format.rb +57 -0
  203. data/lib/carray/methods/unique.rb +47 -0
  204. data/lib/carray/methods/value_counts.rb +71 -0
  205. data/lib/carray/mkmf.rb +124 -101
  206. data/lib/carray/runtime.rb +89 -0
  207. data/lib/carray/serialize.rb +478 -167
  208. data/lib/carray/slab_iterator.rb +305 -0
  209. data/lib/carray/stack.rb +291 -0
  210. data/lib/carray/string.rb +56 -180
  211. data/lib/carray/string_operation_extension.rb +289 -0
  212. data/lib/carray/struct.rb +335 -323
  213. data/lib/carray/struct_builder.rb +697 -0
  214. data/lib/carray/table.rb +41 -2
  215. data/lib/carray/time.rb +2654 -38
  216. data/lib/carray/window_iterator.rb +927 -0
  217. data/lib/carray.rb +55 -57
  218. data/yard-stubs/ca_obj_array.rb +385 -0
  219. data/yard-stubs/ca_obj_bitarray.rb +38 -0
  220. data/yard-stubs/ca_obj_bitfield.rb +43 -0
  221. data/yard-stubs/ca_obj_block.rb +73 -0
  222. data/yard-stubs/ca_obj_byte_swap.rb +56 -0
  223. data/yard-stubs/ca_obj_fake.rb +31 -0
  224. data/yard-stubs/ca_obj_farray.rb +32 -0
  225. data/yard-stubs/ca_obj_field.rb +45 -0
  226. data/yard-stubs/ca_obj_grid.rb +35 -0
  227. data/yard-stubs/ca_obj_refer.rb +72 -0
  228. data/yard-stubs/ca_obj_roll.rb +45 -0
  229. data/yard-stubs/ca_obj_shift.rb +43 -0
  230. data/yard-stubs/ca_obj_stride.rb +181 -0
  231. data/yard-stubs/ca_obj_tile.rb +29 -0
  232. data/yard-stubs/ca_obj_transpose.rb +40 -0
  233. data/yard-stubs/ca_obj_window.rb +49 -0
  234. data/yard-stubs/carray_access.rb +131 -0
  235. data/yard-stubs/carray_attribute.rb +246 -0
  236. data/yard-stubs/carray_broadcast.rb +37 -0
  237. data/yard-stubs/carray_cast.rb +489 -0
  238. data/yard-stubs/carray_class.rb +65 -0
  239. data/yard-stubs/carray_conversion.rb +76 -0
  240. data/yard-stubs/carray_copy.rb +79 -0
  241. data/yard-stubs/carray_core.rb +114 -0
  242. data/yard-stubs/carray_count.rb +79 -0
  243. data/yard-stubs/carray_element.rb +108 -0
  244. data/yard-stubs/carray_generate.rb +66 -0
  245. data/yard-stubs/carray_lazy.rb +23 -0
  246. data/yard-stubs/carray_loop.rb +140 -0
  247. data/yard-stubs/carray_mask.rb +259 -0
  248. data/yard-stubs/carray_math.rb +132 -0
  249. data/yard-stubs/carray_mathfunc.rb +45 -0
  250. data/yard-stubs/carray_median_percentile.rb +89 -0
  251. data/yard-stubs/carray_memory_view.rb +163 -0
  252. data/yard-stubs/carray_order.rb +312 -0
  253. data/yard-stubs/carray_random.rb +89 -0
  254. data/yard-stubs/carray_scatter.rb +106 -0
  255. data/yard-stubs/carray_slab.rb +57 -0
  256. data/yard-stubs/carray_sort.rb +163 -0
  257. data/yard-stubs/carray_test.rb +85 -0
  258. data/yard-stubs/carray_undef.rb +64 -0
  259. data/yard-stubs/carray_utils.rb +97 -0
  260. data/yard-stubs/ruby_carray.rb +193 -0
  261. metadata +220 -138
  262. data/Rakefile +0 -51
  263. data/TODO.md +0 -18
  264. data/ext/ca_iter_block.c +0 -257
  265. data/ext/ca_iter_dimension.c +0 -299
  266. data/ext/ca_iter_window.c +0 -214
  267. data/ext/ca_obj_mapping.c +0 -644
  268. data/ext/ca_obj_unbound_repeat.c +0 -529
  269. data/ext/carray_iterator.c +0 -641
  270. data/ext/carray_math.rb +0 -850
  271. data/ext/carray_numeric.c +0 -259
  272. data/ext/carray_sort_addr.c +0 -254
  273. data/ext/carray_stat.c +0 -2100
  274. data/ext/carray_stat_proc.rb +0 -1999
  275. data/ext/mkmath.rb +0 -741
  276. data/ext/ruby_ccomplex.c +0 -509
  277. data/ext/ruby_float_func.c +0 -86
  278. data/lib/carray/array.rb +0 -8
  279. data/lib/carray/autoload/autoload_base.rb +0 -19
  280. data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
  281. data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
  282. data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
  283. data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
  284. data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
  285. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
  286. data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
  287. data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
  288. data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
  289. data/lib/carray/autoload/autoload_gem_random.rb +0 -8
  290. data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
  291. data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
  292. data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
  293. data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
  294. data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
  295. data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
  296. data/lib/carray/autoload/autoload_object_link.rb +0 -1
  297. data/lib/carray/autoload/autoload_object_pack.rb +0 -2
  298. data/lib/carray/autoload.rb +0 -141
  299. data/lib/carray/basic.rb +0 -191
  300. data/lib/carray/broadcast.rb +0 -101
  301. data/lib/carray/compose.rb +0 -315
  302. data/lib/carray/convert.rb +0 -115
  303. data/lib/carray/info.rb +0 -110
  304. data/lib/carray/io/imagemagick.rb +0 -235
  305. data/lib/carray/mask.rb +0 -102
  306. data/lib/carray/math/histogram.rb +0 -177
  307. data/lib/carray/math/recurrence.rb +0 -93
  308. data/lib/carray/object/ca_obj_iterator.rb +0 -50
  309. data/lib/carray/object/ca_obj_link.rb +0 -50
  310. data/lib/carray/object/ca_obj_pack.rb +0 -99
  311. data/lib/carray/obsolete.rb +0 -256
  312. data/lib/carray/ordering.rb +0 -181
  313. data/lib/carray/testing.rb +0 -51
  314. data/lib/carray/transform.rb +0 -109
  315. data/mailmap +0 -1
  316. data/misc/Methods.ja.md +0 -182
  317. data/misc/NOTE +0 -51
  318. data/spec/Classes/CABitfield_spec.rb +0 -58
  319. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  320. data/spec/Classes/CABlock_spec.rb +0 -205
  321. data/spec/Classes/CAField_spec.rb +0 -39
  322. data/spec/Classes/CAGrid_spec.rb +0 -75
  323. data/spec/Classes/CAMap_spec.rb +0 -0
  324. data/spec/Classes/CAMapping_spec.rb +0 -105
  325. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  326. data/spec/Classes/CAObject_spec.rb +0 -33
  327. data/spec/Classes/CARefer_spec.rb +0 -93
  328. data/spec/Classes/CARepeat_spec.rb +0 -65
  329. data/spec/Classes/CASelect_spec.rb +0 -22
  330. data/spec/Classes/CAShift_spec.rb +0 -16
  331. data/spec/Classes/CAStruct_spec.rb +0 -71
  332. data/spec/Classes/CATranspose_spec.rb +0 -60
  333. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  334. data/spec/Classes/CAWindow_spec.rb +0 -54
  335. data/spec/Classes/CAWrap_spec.rb +0 -8
  336. data/spec/Classes/CArray_spec.rb +0 -184
  337. data/spec/Classes/CScalar_spec.rb +0 -55
  338. data/spec/Features/feature_130_spec.rb +0 -19
  339. data/spec/Features/feature_attributes_spec.rb +0 -280
  340. data/spec/Features/feature_boolean_spec.rb +0 -98
  341. data/spec/Features/feature_broadcast.rb +0 -116
  342. data/spec/Features/feature_cast_function.rb +0 -19
  343. data/spec/Features/feature_cast_spec.rb +0 -33
  344. data/spec/Features/feature_class_spec.rb +0 -84
  345. data/spec/Features/feature_complex_spec.rb +0 -42
  346. data/spec/Features/feature_composite_spec.rb +0 -124
  347. data/spec/Features/feature_convert_spec.rb +0 -46
  348. data/spec/Features/feature_copy_spec.rb +0 -123
  349. data/spec/Features/feature_creation_spec.rb +0 -84
  350. data/spec/Features/feature_element_spec.rb +0 -144
  351. data/spec/Features/feature_extream_spec.rb +0 -54
  352. data/spec/Features/feature_generate_spec.rb +0 -74
  353. data/spec/Features/feature_index_spec.rb +0 -69
  354. data/spec/Features/feature_mask_spec.rb +0 -580
  355. data/spec/Features/feature_math_spec.rb +0 -97
  356. data/spec/Features/feature_order_spec.rb +0 -146
  357. data/spec/Features/feature_ref_store_spec.rb +0 -209
  358. data/spec/Features/feature_serialization_spec.rb +0 -125
  359. data/spec/Features/feature_stat_spec.rb +0 -397
  360. data/spec/Features/feature_virtual_spec.rb +0 -48
  361. data/spec/Features/method_eq_spec.rb +0 -81
  362. data/spec/Features/method_is_nan_spec.rb +0 -12
  363. data/spec/Features/method_map_spec.rb +0 -54
  364. data/spec/Features/method_max_with.rb +0 -20
  365. data/spec/Features/method_min_with.rb +0 -19
  366. data/spec/Features/method_ne_spec.rb +0 -18
  367. data/spec/Features/method_project_spec.rb +0 -188
  368. data/spec/Features/method_ref_spec.rb +0 -27
  369. data/spec/Features/method_round_spec.rb +0 -11
  370. data/spec/Features/method_s_linspace_spec.rb +0 -48
  371. data/spec/Features/method_s_span_spec.rb +0 -14
  372. data/spec/Features/method_seq_spec.rb +0 -47
  373. data/spec/Features/method_sort_with.rb +0 -43
  374. data/spec/Features/method_sorted_with.rb +0 -29
  375. data/spec/Features/method_span_spec.rb +0 -42
  376. data/spec/Features/method_wrap_readonly_spec.rb +0 -43
  377. data/spec/UnitTest/test_CAVirtual.rb +0 -214
  378. data/spec/spec_all.rb +0 -10
  379. data/utils/ca_ase.rb +0 -21
  380. data/utils/ca_methods.rb +0 -15
  381. data/utils/cast_checker.rb +0 -30
  382. data/utils/convert_test.rb +0 -73
  383. data/utils/extract_yard.rb +0 -22
  384. data/utils/guess_shape.rb +0 -76
  385. data/utils/monkey_patch_methods.rb +0 -62
  386. data/utils/remove_resource_fork.sh +0 -5
@@ -1,1999 +0,0 @@
1
- # -*- Mode: C; tab-width: 2; -*-
2
- # ----------------------------------------------------------------------------
3
- #
4
- # carray_stat_proc.rb
5
- #
6
- # This file is part of Ruby/CArray extension library.
7
- # You can redistribute it and/or modify it under the terms of
8
- # the Ruby Licence.
9
- #
10
- # Copyright (C) 2005 Hiroki Motoyoshi
11
- #
12
- # ----------------------------------------------------------------------------
13
-
14
- have_type_long_double = false
15
-
16
- open("carray_config.h") { |io|
17
- while line = io.gets
18
- case line
19
- when /HAVE_TYPE_LONG_DOUBLE *1/
20
- have_type_long_double = true
21
- end
22
- end
23
- }
24
-
25
- def macro_expand (text, values)
26
- text = text.clone
27
- values.each do |key, val|
28
- text.gsub!("<"+key+">", val)
29
- end
30
- return text
31
- end
32
-
33
- TYPEINFO = {
34
- 'boolean8_t' => {
35
- 'type' => "boolean8_t",
36
- 'zero' => '0',
37
- 'dat2type' => '',
38
- 'obj2type' => 'NUM2LONG',
39
- 'type2obj' => 'LONG2NUM',
40
- 'type2dbl' => '(float64_t)',
41
- 'int2type' => '',
42
- 'atype' => have_type_long_double ? 'long double' : 'double',
43
- 'azero' => '0.0',
44
- 'aone' => '1.0',
45
- 'atype2obj' => 'rb_float_new',
46
- 'eql' => "GEQ",
47
- 'op_type' => "c",
48
- },
49
- 'int8_t' => {
50
- 'type' => "int8_t",
51
- 'zero' => '0',
52
- 'dat2type' => '',
53
- 'obj2type' => 'NUM2LONG',
54
- 'type2obj' => 'LONG2NUM',
55
- 'type2dbl' => '(float64_t)',
56
- 'int2type' => '',
57
- 'atype' => have_type_long_double ? 'long double' : 'double',
58
- 'azero' => '0.0',
59
- 'aone' => '1.0',
60
- 'atype2obj' => 'rb_float_new',
61
- 'eql' => "GEQ",
62
- 'op_type' => "c",
63
- },
64
- 'uint8_t' => {
65
- 'type' => "uint8_t",
66
- 'zero' => '0',
67
- 'dat2type' => '',
68
- 'obj2type' => 'NUM2ULONG',
69
- 'type2obj' => 'ULONG2NUM',
70
- 'type2dbl' => '(float64_t)',
71
- 'int2type' => '',
72
- 'atype' => have_type_long_double ? 'long double' : 'double',
73
- 'azero' => '0.0',
74
- 'aone' => '1.0',
75
- 'atype2obj' => 'rb_float_new',
76
- 'eql' => "GEQ",
77
- 'op_type' => "c",
78
- },
79
- 'int16_t' => {
80
- 'type' => "int16_t",
81
- 'zero' => '0',
82
- 'dat2type' => '',
83
- 'obj2type' => 'NUM2LONG',
84
- 'type2obj' => 'LONG2NUM',
85
- 'type2dbl' => '(float64_t)',
86
- 'int2type' => '',
87
- 'atype' => have_type_long_double ? 'long double' : 'double',
88
- 'azero' => '0.0',
89
- 'aone' => '1.0',
90
- 'atype2obj' => 'rb_float_new',
91
- 'eql' => "GEQ",
92
- 'op_type' => "c",
93
- },
94
- 'uint16_t' => {
95
- 'type' => "uint16_t",
96
- 'zero' => '0',
97
- 'dat2type' => '',
98
- 'obj2type' => 'NUM2ULONG',
99
- 'type2obj' => 'ULONG2NUM',
100
- 'type2dbl' => '(float64_t)',
101
- 'int2type' => '',
102
- 'atype' => have_type_long_double ? 'long double' : 'double',
103
- 'azero' => '0.0',
104
- 'aone' => '1.0',
105
- 'atype2obj' => 'rb_float_new',
106
- 'eql' => "GEQ",
107
- 'op_type' => "c",
108
- },
109
- 'int32_t' => {
110
- 'type' => "int32_t",
111
- 'zero' => '0',
112
- 'dat2type' => '',
113
- 'obj2type' => 'NUM2LONG',
114
- 'type2obj' => 'LONG2NUM',
115
- 'type2dbl' => '(float64_t)',
116
- 'int2type' => '',
117
- 'atype' => have_type_long_double ? 'long double' : 'double',
118
- 'azero' => '0.0',
119
- 'aone' => '1.0',
120
- 'atype2obj' => 'rb_float_new',
121
- 'eql' => "GEQ",
122
- 'op_type' => "c",
123
- },
124
- 'uint32_t' => {
125
- 'type' => "uint32_t",
126
- 'zero' => '0',
127
- 'dat2type' => '',
128
- 'obj2type' => 'NUM2ULONG',
129
- 'type2obj' => 'ULONG2NUM',
130
- 'type2dbl' => '(float64_t)',
131
- 'int2type' => '',
132
- 'atype' => have_type_long_double ? 'long double' : 'double',
133
- 'azero' => '0.0',
134
- 'aone' => '1.0',
135
- 'atype2obj' => 'rb_float_new',
136
- 'eql' => "GEQ",
137
- 'op_type' => "c",
138
- },
139
- 'int64_t' => {
140
- 'type' => "int64_t",
141
- 'zero' => '0',
142
- 'dat2type' => '',
143
- 'obj2type' => 'NUM2LL',
144
- 'type2obj' => 'LL2NUM',
145
- 'type2dbl' => '(float64_t)',
146
- 'int2type' => '',
147
- 'atype' => have_type_long_double ? 'long double' : 'double',
148
- 'azero' => '0.0',
149
- 'aone' => '1.0',
150
- 'atype2obj' => 'rb_float_new',
151
- 'eql' => "GEQ",
152
- 'op_type' => "c",
153
- },
154
- 'uint64_t' => {
155
- 'type' => "uint64_t",
156
- 'zero' => '0',
157
- 'dat2type' => '',
158
- 'obj2type' => 'NUM2ULL',
159
- 'type2obj' => 'ULL2NUM',
160
- 'type2dbl' => '(float64_t)',
161
- 'int2type' => '',
162
- 'atype' => have_type_long_double ? 'long double' : 'double',
163
- 'azero' => '0.0',
164
- 'aone' => '1.0',
165
- 'atype2obj' => 'rb_float_new',
166
- 'eql' => "GEQ",
167
- 'op_type' => "c",
168
- },
169
- 'float32_t' => {
170
- 'type' => "float32_t",
171
- 'zero' => '0.0',
172
- 'dat2type' => '',
173
- 'obj2type' => 'NUM2DBL',
174
- 'type2obj' => 'rb_float_new',
175
- 'type2dbl' => '(float64_t)',
176
- 'int2type' => '',
177
- 'atype' => have_type_long_double ? 'long double' : 'double',
178
- 'azero' => '0.0',
179
- 'aone' => '1.0',
180
- 'atype2obj' => 'rb_float_new',
181
- 'eql' => "GEQ",
182
- 'op_type' => "c",
183
- },
184
- 'float64_t' => {
185
- 'type' => "float64_t",
186
- 'zero' => '0.0',
187
- 'dat2type' => '',
188
- 'obj2type' => 'NUM2DBL',
189
- 'type2obj' => 'rb_float_new',
190
- 'type2dbl' => '',
191
- 'int2type' => '',
192
- 'atype' => have_type_long_double ? 'long double' : 'double',
193
- 'azero' => '0.0',
194
- 'aone' => '1.0',
195
- 'atype2obj' => 'rb_float_new',
196
- 'eql' => "GEQ",
197
- 'op_type' => "c",
198
- },
199
- 'float128_t' => {
200
- 'type' => "float128_t",
201
- 'zero' => '0.0',
202
- 'dat2type' => '',
203
- 'obj2type' => 'NUM2DBL',
204
- 'type2obj' => 'rb_float_new',
205
- 'type2dbl' => '',
206
- 'int2type' => '',
207
- 'atype' => have_type_long_double ? 'long double' : 'double',
208
- 'azero' => '0.0',
209
- 'aone' => '1.0',
210
- 'atype2obj' => 'rb_float_new',
211
- 'eql' => "GEQ",
212
- 'op_type' => "c",
213
- },
214
- 'cmplx64_t' => {
215
- 'type' => "cmplx64_t",
216
- 'zero' => '0.0',
217
- 'dat2type' => '',
218
- 'obj2type' => 'NUM2CC',
219
- 'type2obj' => 'rb_ccomplex_new',
220
- 'type2dbl' => '',
221
- 'int2type' => '',
222
- 'atype' => 'cmplx128_t',
223
- 'azero' => '0.0',
224
- 'aone' => '1.0',
225
- 'atype2obj' => 'rb_ccomplex_new',
226
- 'eql' => "GEQ",
227
- 'op_type' => "c",
228
- },
229
- 'cmplx128_t' => {
230
- 'type' => "cmplx128_t",
231
- 'zero' => '0.0',
232
- 'dat2type' => '',
233
- 'obj2type' => 'NUM2CC',
234
- 'type2obj' => 'rb_ccomplex_new',
235
- 'type2dbl' => '',
236
- 'int2type' => '',
237
- 'atype' => 'cmplx128_t',
238
- 'azero' => '0.0',
239
- 'aone' => '1.0',
240
- 'atype2obj' => 'rb_ccomplex_new',
241
- 'eql' => "GEQ",
242
- 'op_type' => "c",
243
- },
244
- 'cmplx256_t' => {
245
- 'type' => "cmplx256_t",
246
- 'zero' => '0.0',
247
- 'dat2type' => '',
248
- 'obj2type' => 'NUM2CC',
249
- 'type2obj' => 'rb_ccomplex_new',
250
- 'type2dbl' => '',
251
- 'int2type' => '',
252
- 'atype' => 'cmplx128_t',
253
- 'azero' => '0.0',
254
- 'aone' => '1.0',
255
- 'atype2obj' => 'rb_ccomplex_new',
256
- 'eql' => "GEQ",
257
- 'op_type' => "c",
258
- },
259
- 'VALUE' => {
260
- 'type' => "VALUE",
261
- 'zero' => 'INT2NUM(0)',
262
- 'dat2type' => '',
263
- 'obj2type' => '',
264
- 'type2obj' => '',
265
- 'type2dbl' => 'NUM2DBL',
266
- 'int2type' => 'INT2NUM',
267
- 'atype' => 'VALUE',
268
- 'azero' => 'rb_float_new(0.0)',
269
- 'aone' => 'rb_float_new(1.0)',
270
- 'atype2obj' => '',
271
- 'eql' => "OEQ",
272
- 'op_type' => "VALUE",
273
- },
274
-
275
- }
276
-
277
- # --------------------------------------------------------------------------
278
- #
279
- # HEADER
280
- #
281
- # --------------------------------------------------------------------------
282
-
283
- header = <<HERE_END
284
- /* ---------------------------------------------------------------------------
285
-
286
- carray_stat_proc.c
287
-
288
- This file is part of Ruby/CArray extension library.
289
-
290
-
291
- This file is automatically generated from carray_stat_proc.rb
292
- Copyright (C) 2005-2025 Hiroki Motoyoshi
293
-
294
- ---------------------------------------------------------------------------- */
295
-
296
- #include <math.h>
297
- #include "ruby.h"
298
- #include "carray.h"
299
-
300
- typedef struct {
301
- ca_size_t offset;
302
- ca_size_t count;
303
- ca_size_t step;
304
- ca_size_t *addr;
305
- } CAStatIterator;
306
-
307
- typedef void (*ca_stat_proc_t)();
308
-
309
- #define iterator_rewind(it) \
310
- { \
311
- if ( (it)->step ) { \
312
- (it)->count = 0; \
313
- (it)->offset = (it)->addr[((it)->count)++]; \
314
- } \
315
- else { \
316
- (it)->offset = 0; \
317
- } \
318
- }
319
-
320
- #define iterator_succ(it) \
321
- { \
322
- if ( (it)->step ) { \
323
- (it)->offset = (it)->addr[((it)->count)++]; \
324
- } \
325
- else { \
326
- ((it)->offset)++; \
327
- } \
328
- }
329
-
330
- static ID id_lt, id_gt, id_plus, id_minus, id_star, id_quo;
331
-
332
- #define GEQ(x,y) ( (x) == (y) )
333
- #define OEQ(x,y) rb_equal((x),(y))
334
-
335
- #define lt_c(x, y) ( (x) < (y) )
336
- #define lt_VALUE(x, y) rb_funcall((x), id_lt, 1, (y))
337
-
338
- #define gt_c(x, y) ( (x) > (y) )
339
- #define gt_VALUE(x, y) rb_funcall((x), id_gt, 1, (y))
340
-
341
- #define add_c(x, y) ( (x) + (y) )
342
- #define add_VALUE(x, y) rb_funcall((x), id_plus, 1, (y))
343
-
344
- #define sub_c(x, y) ( (x) - (y) )
345
- #define sub_VALUE(x, y) rb_funcall((x), id_minus, 1, (y))
346
-
347
- #define mul_c(x, y) ( (x) * (y) )
348
- #define mul_VALUE(x, y) rb_funcall((x), id_star, 1, (y))
349
-
350
- #define div_c(x, y) ( (x) / (y) )
351
- #define div_VALUE(x, y) rb_funcall((x), id_quo, 1, (y))
352
-
353
- #define sqrt_c(x) sqrt(x)
354
- #define sqrt_VALUE(x) rb_funcall((x), rb_intern("sqrt"), 0)
355
-
356
- HERE_END
357
-
358
- puts header
359
-
360
-
361
- # --------------------------------------------------------------------------
362
- #
363
- # STAT Part 1
364
- #
365
- # --------------------------------------------------------------------------
366
-
367
-
368
- text = <<'HERE_END'
369
-
370
- /* ============================= */
371
- /* ca_proc_prod */
372
- /* ============================= */
373
-
374
- static void
375
- ca_proc_prod_<type> (ca_size_t elements, ca_size_t min_count,
376
- boolean8_t *m, void *ptr, CAStatIterator *it,
377
- int return_object, VALUE *retobj,
378
- boolean8_t *retmask, float64_t *retval)
379
- {
380
- volatile <atype> prod = <aone>;
381
- <type> *p = (<type> *) ptr;
382
- ca_size_t *a = (ca_size_t *) it;
383
- ca_size_t count = 0;
384
- ca_size_t i;
385
- iterator_rewind(it);
386
- if ( m ) {
387
- for (i=0; i<elements; i++) {
388
- if ( *(m + *a) ) {
389
- count++;
390
- }
391
- else {
392
- prod = mul_<op_type>(prod, (<atype>)<dat2type>(*(p + *a)));
393
- }
394
- iterator_succ(it);
395
- }
396
- }
397
- else {
398
- for (i=0; i<elements; i++) {
399
- prod = mul_<op_type>(prod, (<atype>)<dat2type>(*(p + *a)));
400
- iterator_succ(it);
401
- }
402
- }
403
- if ( return_object ) {
404
- *retobj = ( count > min_count ) ? CA_UNDEF : <atype2obj>(prod);
405
- }
406
- else {
407
- if ( retmask ) {
408
- *retmask = ( count > min_count ) ? 1 : 0;
409
- }
410
- *retval = <type2dbl>(prod);
411
- }
412
- }
413
-
414
- /* ============================= */
415
- /* ca_proc_count */
416
- /* ============================= */
417
-
418
- static void
419
- ca_proc_count_<type> (ca_size_t elements, ca_size_t min_count,
420
- boolean8_t *m, void *ptr, CAStatIterator *it,
421
- int return_object, VALUE *retobj,
422
- boolean8_t *retmask, ca_size_t *retval)
423
- {
424
- ca_size_t *a = (ca_size_t *) it;
425
- ca_size_t count = 0;
426
- ca_size_t i;
427
- iterator_rewind(it);
428
- if ( m ) {
429
- for (i=0; i<elements; i++) {
430
- if ( *(m + *a) ) {
431
- count++;
432
- }
433
- iterator_succ(it);
434
- }
435
- }
436
- if ( return_object ) {
437
- *retobj = ( count > min_count ) ? CA_UNDEF : SIZE2NUM(elements - count);
438
- }
439
- else {
440
- if ( retmask ) {
441
- *retmask = ( count > min_count ) ? 1 : 0;
442
- }
443
- *retval = elements - count;
444
- }
445
- }
446
-
447
- static void
448
- ca_proc_sum_<type> (ca_size_t elements, ca_size_t min_count,
449
- boolean8_t *m, void *ptr, CAStatIterator *it,
450
- int return_object, VALUE *retobj,
451
- boolean8_t *retmask, float64_t *retval)
452
- {
453
- volatile <atype> sum = <azero>;
454
- <type> *p = (<type> *) ptr;
455
- ca_size_t *a = (ca_size_t *)it;
456
- ca_size_t count = 0;
457
- ca_size_t i;
458
- iterator_rewind(it);
459
- if ( m ) {
460
- for (i=0; i<elements; i++) {
461
- if ( *(m + *a) ) {
462
- count++;
463
- }
464
- else {
465
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
466
- }
467
- iterator_succ(it);
468
- }
469
- }
470
- else {
471
- for (i=0; i<elements; i++) {
472
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
473
- iterator_succ(it);
474
- }
475
- }
476
- if ( return_object ) {
477
- *retobj = ( count > min_count ) ? CA_UNDEF : <atype2obj>(sum);
478
- }
479
- else {
480
- if ( retmask ) {
481
- *retmask = ( count > min_count ) ? 1 : 0;
482
- }
483
- *retval = <type2dbl>(sum);
484
- }
485
- }
486
-
487
-
488
- /* ============================= */
489
- /* ca_proc_mean */
490
- /* ============================= */
491
-
492
- static void
493
- ca_proc_mean_<type> (ca_size_t elements, ca_size_t min_count,
494
- boolean8_t *m, void *ptr, CAStatIterator *it,
495
- int return_object, VALUE *retobj,
496
- boolean8_t *retmask, float64_t *retval)
497
- {
498
- volatile <atype> sum = <azero>, ave;
499
- <type> *p = (<type> *) ptr;
500
- ca_size_t *a = (ca_size_t *) it;
501
- ca_size_t count = 0;
502
- ca_size_t i;
503
- iterator_rewind(it);
504
- if ( m ) {
505
- for (i=0; i<elements; i++) {
506
- if ( *(m + *a) ) {
507
- count++;
508
- }
509
- else {
510
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
511
- }
512
- iterator_succ(it);
513
- }
514
- }
515
- else {
516
- for (i=0; i<elements; i++) {
517
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
518
- iterator_succ(it);
519
- }
520
- }
521
- ave = div_<op_type>(sum, (<atype>)<int2type>(elements-count));
522
- if ( return_object ) {
523
- *retobj = ( count > min_count ) ? CA_UNDEF : <atype2obj>(ave);
524
- }
525
- else {
526
- if ( retmask ) {
527
- *retmask = ( count > min_count ) ? 1 : 0;
528
- }
529
- *retval = <type2dbl>(ave);
530
- }
531
- }
532
-
533
- /* ============================= */
534
- /* ca_proc_variancep */
535
- /* ============================= */
536
-
537
- static void
538
- ca_proc_variancep_<type> (ca_size_t elements, ca_size_t min_count,
539
- boolean8_t *m, void *ptr, CAStatIterator *it,
540
- int return_object, VALUE *retobj,
541
- boolean8_t *retmask, float64_t *retval)
542
- {
543
- volatile <atype> sum = <azero>, sum2 = <azero>, ave, var, diff;
544
- <type> *p = (<type> *) ptr;
545
- ca_size_t *a = (ca_size_t *) it;
546
- ca_size_t count = 0;
547
- ca_size_t i;
548
- iterator_rewind(it);
549
- if ( m ) {
550
- for (i=0; i<elements; i++) {
551
- if ( *(m + *a) ) {
552
- count++;
553
- }
554
- else {
555
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
556
- }
557
- iterator_succ(it);
558
- }
559
- }
560
- else {
561
- for (i=0; i<elements; i++) {
562
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
563
- iterator_succ(it);
564
- }
565
- }
566
- ave = div_<op_type>(sum, (<atype>)<int2type>(elements-count));
567
-
568
- iterator_rewind(it);
569
- if ( m ) {
570
- for (i=0; i<elements; i++) {
571
- if ( *(m + *a) ) {
572
- ;
573
- }
574
- else {
575
- diff = sub_<op_type>((<atype>)<dat2type>(*(p + *a)), ave);
576
- sum2 = add_<op_type>(sum2, mul_<op_type>(diff,diff));
577
- }
578
- iterator_succ(it);
579
- }
580
- }
581
- else {
582
- for (i=0; i<elements; i++) {
583
- diff = sub_<op_type>((<atype>)<dat2type>(*(p + *a)), ave);
584
- sum2 = add_<op_type>(sum2, mul_<op_type>(diff,diff));
585
- iterator_succ(it);
586
- }
587
- }
588
-
589
- var = div_<op_type>(sum2, (<atype>)<int2type>(elements-count));
590
-
591
- if ( return_object ) {
592
- *retobj = ( count > min_count ) ? CA_UNDEF : <atype2obj>(var);
593
- }
594
- else {
595
- if ( retmask ) {
596
- *retmask = ( count > min_count ) ? 1 : 0;
597
- }
598
- *retval = <type2dbl>(var);
599
- }
600
- }
601
-
602
- /* ============================= */
603
- /* ca_proc_stddevp */
604
- /* ============================= */
605
-
606
- static void
607
- ca_proc_stddevp_<type> (ca_size_t elements, ca_size_t min_count,
608
- boolean8_t *m, void *ptr, CAStatIterator *it,
609
- int return_object, VALUE *retobj,
610
- boolean8_t *retmask, float64_t *retval)
611
- {
612
- volatile <atype> sum = <azero>, sum2 = <azero>, ave, var, diff;
613
- <type> *p = (<type> *) ptr;
614
- ca_size_t *a = (ca_size_t *) it;
615
- ca_size_t count = 0;
616
- ca_size_t i;
617
- iterator_rewind(it);
618
- if ( m ) {
619
- for (i=0; i<elements; i++) {
620
- if ( *(m + *a) ) {
621
- count++;
622
- }
623
- else {
624
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
625
- }
626
- iterator_succ(it);
627
- }
628
- }
629
- else {
630
- for (i=0; i<elements; i++) {
631
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
632
- iterator_succ(it);
633
- }
634
- }
635
- ave = div_<op_type>(sum, (<atype>)<int2type>(elements-count));
636
-
637
- iterator_rewind(it);
638
- if ( m ) {
639
- for (i=0; i<elements; i++) {
640
- if ( *(m + *a) ) {
641
- ;
642
- }
643
- else {
644
- diff = sub_<op_type>((<atype>)<dat2type>(*(p + *a)), ave);
645
- sum2 = add_<op_type>(sum2, mul_<op_type>(diff,diff));
646
- }
647
- iterator_succ(it);
648
- }
649
- }
650
- else {
651
- for (i=0; i<elements; i++) {
652
- diff = sub_<op_type>((<atype>)<dat2type>(*(p + *a)), ave);
653
- sum2 = add_<op_type>(sum2, mul_<op_type>(diff,diff));
654
- iterator_succ(it);
655
- }
656
- }
657
-
658
- var = div_<op_type>(sum2, (<atype>)<int2type>(elements-count));
659
-
660
- if ( return_object ) {
661
- *retobj = ( count > min_count ) ? CA_UNDEF : <atype2obj>(sqrt_<op_type>(var));
662
- }
663
- else {
664
- if ( retmask ) {
665
- *retmask = ( count > min_count ) ? 1 : 0;
666
- }
667
- *retval = <type2dbl>(sqrt_<op_type>(var));
668
- }
669
- }
670
-
671
- /* ============================= */
672
- /* ca_proc_variance */
673
- /* ============================= */
674
-
675
- static void
676
- ca_proc_variance_<type> (ca_size_t elements, ca_size_t min_count,
677
- boolean8_t *m, void *ptr, CAStatIterator *it,
678
- int return_object, VALUE *retobj,
679
- boolean8_t *retmask, float64_t *retval)
680
- {
681
- volatile <atype> sum = <azero>, sum2 = <azero>, ave, var, diff;
682
- <type> *p = (<type> *) ptr;
683
- ca_size_t *a = (ca_size_t *) it;
684
- ca_size_t count = 0;
685
- ca_size_t i;
686
- iterator_rewind(it);
687
- if ( m ) {
688
- for (i=0; i<elements; i++) {
689
- if ( *(m + *a) ) {
690
- count++;
691
- }
692
- else {
693
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
694
- }
695
- iterator_succ(it);
696
- }
697
- }
698
- else {
699
- for (i=0; i<elements; i++) {
700
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
701
- iterator_succ(it);
702
- }
703
- }
704
- ave = div_<op_type>(sum, (<atype>)<int2type>(elements-count));
705
-
706
- iterator_rewind(it);
707
- if ( m ) {
708
- for (i=0; i<elements; i++) {
709
- if ( *(m + *a) ) {
710
- ;
711
- }
712
- else {
713
- diff = sub_<op_type>((<atype>)<dat2type>(*(p + *a)), ave);
714
- sum2 = add_<op_type>(sum2, mul_<op_type>(diff,diff));
715
- }
716
- iterator_succ(it);
717
- }
718
- }
719
- else {
720
- for (i=0; i<elements; i++) {
721
- diff = sub_<op_type>((<atype>)<dat2type>(*(p + *a)), ave);
722
- sum2 = add_<op_type>(sum2, mul_<op_type>(diff,diff));
723
- iterator_succ(it);
724
- }
725
- }
726
-
727
- var = div_<op_type>(sum2, (<atype>)<int2type>(elements-count-1));
728
-
729
- if ( return_object ) {
730
- *retobj = ( count > min_count ) ? CA_UNDEF : <atype2obj>(var);
731
- }
732
- else {
733
- if ( retmask ) {
734
- *retmask = ( count > min_count ) ? 1 : 0;
735
- }
736
- *retval = <type2dbl>(var);
737
- }
738
- }
739
-
740
- /* ============================= */
741
- /* ca_proc_stddev */
742
- /* ============================= */
743
-
744
- static void
745
- ca_proc_stddev_<type> (ca_size_t elements, ca_size_t min_count,
746
- boolean8_t *m, void *ptr, CAStatIterator *it,
747
- int return_object, VALUE *retobj,
748
- boolean8_t *retmask, float64_t *retval)
749
- {
750
- volatile <atype> sum = <azero>, sum2 = <azero>, ave, var, diff;
751
- <type> *p = (<type> *) ptr;
752
- ca_size_t *a = (ca_size_t *) it;
753
- ca_size_t count = 0;
754
- ca_size_t i;
755
- iterator_rewind(it);
756
- if ( m ) {
757
- for (i=0; i<elements; i++) {
758
- if ( *(m + *a) ) {
759
- count++;
760
- }
761
- else {
762
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
763
- }
764
- iterator_succ(it);
765
- }
766
- }
767
- else {
768
- for (i=0; i<elements; i++) {
769
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
770
- iterator_succ(it);
771
- }
772
- }
773
- ave = div_<op_type>(sum, (<atype>)<int2type>(elements-count));
774
-
775
- iterator_rewind(it);
776
- if ( m ) {
777
- for (i=0; i<elements; i++) {
778
- if ( *(m + *a) ) {
779
- ;
780
- }
781
- else {
782
- diff = sub_<op_type>((<atype>)<dat2type>(*(p + *a)), ave);
783
- sum2 = add_<op_type>(sum2, mul_<op_type>(diff,diff));
784
- }
785
- iterator_succ(it);
786
- }
787
- }
788
- else {
789
- for (i=0; i<elements; i++) {
790
- diff = sub_<op_type>((<atype>)<dat2type>(*(p + *a)), ave);
791
- sum2 = add_<op_type>(sum2, mul_<op_type>(diff,diff));
792
- iterator_succ(it);
793
- }
794
- }
795
-
796
- var = div_<op_type>(sum2, (<atype>)<int2type>(elements-count-1));
797
-
798
- if ( return_object ) {
799
- *retobj = ( count > min_count ) ? CA_UNDEF : <atype2obj>(sqrt_<op_type>(var));
800
- }
801
- else {
802
- if ( retmask ) {
803
- *retmask = ( count > min_count ) ? 1 : 0;
804
- }
805
- *retval = <type2dbl>(sqrt_<op_type>(var));
806
- }
807
- }
808
-
809
- /* ============================= */
810
- /* ca_proc_min */
811
- /* ============================= */
812
-
813
- static void
814
- ca_proc_min_<type> (ca_size_t elements, ca_size_t min_count,
815
- boolean8_t *m, void *ptr, CAStatIterator *it,
816
- int return_object, VALUE *retobj,
817
- boolean8_t *retmask, <type> *retval)
818
- {
819
- <type> min = <zero>;
820
- <type> *p = (<type> *) ptr;
821
- ca_size_t *a = (ca_size_t *) it;
822
- ca_size_t count = 0;
823
- ca_size_t addr;
824
- ca_size_t i;
825
- iterator_rewind(it);
826
- if ( m ) {
827
- addr = -1;
828
- for (i=0; i<elements; i++) {
829
- if ( *(m + *a) ) {
830
- count++;
831
- }
832
- else {
833
- min = *(p + *a);
834
- addr = i;
835
- break;
836
- }
837
- iterator_succ(it);
838
- }
839
- iterator_succ(it);
840
- if ( addr >= 0 ) {
841
- for (i=addr+1; i<elements; i++) {
842
- if ( *(m + *a) ) {
843
- count++;
844
- }
845
- else {
846
- if ( lt_<op_type>(*(p + *a), min) ) {
847
- min = *(p + *a);
848
- addr = i;
849
- }
850
- }
851
- iterator_succ(it);
852
- }
853
- }
854
- }
855
- else {
856
- min = *(p + *a);
857
- addr = 0;
858
- for (i=addr; i<elements; i++) {
859
- if ( lt_<op_type>(*(p + *a), min) ) {
860
- min = *(p + *a);
861
- addr = i;
862
- }
863
- iterator_succ(it);
864
- }
865
- }
866
- if ( return_object ) {
867
- *retobj = ( count > min_count ) ? CA_UNDEF : <type2obj>(min);
868
- }
869
- else {
870
- if ( retmask ) {
871
- *retmask = ( count > min_count ) ? 1 : 0;
872
- }
873
- *retval = min;
874
- }
875
- }
876
-
877
- /* ============================= */
878
- /* ca_proc_min_addr */
879
- /* ============================= */
880
-
881
- static void
882
- ca_proc_min_addr_<type> (ca_size_t elements, ca_size_t min_count,
883
- boolean8_t *m, void *ptr, CAStatIterator *it,
884
- int return_object, VALUE *retobj,
885
- boolean8_t *retmask, ca_size_t *retval)
886
- {
887
- <type> min = <zero>;
888
- <type> *p = (<type> *) ptr;
889
- ca_size_t *a = (ca_size_t *) it;
890
- ca_size_t count = 0;
891
- ca_size_t addr;
892
- ca_size_t i;
893
- iterator_rewind(it);
894
- if ( m ) {
895
- addr = -1;
896
- for (i=0; i<elements; i++) {
897
- if ( *(m + *a) ) {
898
- count++;
899
- }
900
- else {
901
- min = *(p + *a);
902
- addr = i;
903
- break;
904
- }
905
- iterator_succ(it);
906
- }
907
- iterator_succ(it);
908
- if ( addr >= 0 ) {
909
- for (i=addr+1; i<elements; i++) {
910
- if ( *(m + *a) ) {
911
- count++;
912
- }
913
- else {
914
- if ( lt_<op_type>(*(p + *a), min) ) {
915
- min = *(p + *a);
916
- addr = i;
917
- }
918
- }
919
- iterator_succ(it);
920
- }
921
- }
922
- }
923
- else {
924
- min = *(p + *a);
925
- addr = 0;
926
- for (i=addr; i<elements; i++) {
927
- if ( lt_<op_type>(*(p + *a), min) ) {
928
- min = *(p + *a);
929
- addr = i;
930
- }
931
- iterator_succ(it);
932
- }
933
- }
934
- if ( return_object ) {
935
- *retobj = ( count > min_count ) ? CA_UNDEF
936
- : ( addr < 0 ) ? Qnil : SIZE2NUM(addr);
937
- }
938
- else {
939
- if ( retmask ) {
940
- *retmask = ( count > min_count ) ? 1 : 0;
941
- }
942
- *retval = addr;
943
- }
944
- }
945
-
946
- /* ============================= */
947
- /* ca_proc_max */
948
- /* ============================= */
949
-
950
- static void
951
- ca_proc_max_<type> (ca_size_t elements, ca_size_t min_count,
952
- boolean8_t *m, void *ptr, CAStatIterator *it,
953
- int return_object, VALUE *retobj,
954
- boolean8_t *retmask, <type> *retval)
955
- {
956
- <type> max = 0;
957
- <type> *p = (<type> *) ptr;
958
- ca_size_t *a = (ca_size_t *) it;
959
- ca_size_t count = 0;
960
- ca_size_t addr;
961
- ca_size_t i;
962
- iterator_rewind(it);
963
- if ( m ) {
964
- addr = -1;
965
- for (i=0; i<elements; i++) {
966
- if ( *(m + *a) ) {
967
- count++;
968
- }
969
- else {
970
- max = *(p + *a);
971
- addr = i;
972
- break;
973
- }
974
- iterator_succ(it);
975
- }
976
- iterator_succ(it);
977
- if ( addr >= 0 ) {
978
- for (i=addr+1; i<elements; i++) {
979
- if ( *(m + *a) ) {
980
- count++;
981
- }
982
- else {
983
- if ( gt_<op_type>(*(p + *a), max) ) {
984
- max = *(p + *a);
985
- addr = i;
986
- }
987
- }
988
- iterator_succ(it);
989
- }
990
- }
991
- }
992
- else {
993
- max = *(p + *a);
994
- addr = 0;
995
- for (i=addr; i<elements; i++) {
996
- if ( gt_<op_type>(*(p + *a), max) ) {
997
- max = *(p + *a);
998
- addr = i;
999
- }
1000
- iterator_succ(it);
1001
- }
1002
- }
1003
- if ( return_object ) {
1004
- *retobj = ( count > min_count ) ? CA_UNDEF : <type2obj>(max);
1005
- }
1006
- else {
1007
- if ( retmask ) {
1008
- *retmask = ( count > min_count ) ? 1 : 0;
1009
- }
1010
- *retval = max;
1011
- }
1012
- }
1013
-
1014
- /* ============================= */
1015
- /* ca_proc_max_addr */
1016
- /* ============================= */
1017
-
1018
- static void
1019
- ca_proc_max_addr_<type> (ca_size_t elements, ca_size_t min_count,
1020
- boolean8_t *m, void *ptr, CAStatIterator *it,
1021
- int return_object, VALUE *retobj,
1022
- boolean8_t *retmask, ca_size_t *retval)
1023
- {
1024
- <type> max = 0;
1025
- <type> *p = (<type> *) ptr;
1026
- ca_size_t *a = (ca_size_t *) it;
1027
- ca_size_t count = 0;
1028
- ca_size_t addr;
1029
- ca_size_t i;
1030
- iterator_rewind(it);
1031
- if ( m ) {
1032
- addr = -1;
1033
- for (i=0; i<elements; i++) {
1034
- if ( *(m + *a) ) {
1035
- count++;
1036
- }
1037
- else {
1038
- max = *(p + *a);
1039
- addr = i;
1040
- break;
1041
- }
1042
- iterator_succ(it);
1043
- }
1044
- iterator_succ(it);
1045
- if ( addr >= 0 ) {
1046
- for (i=addr+1; i<elements; i++) {
1047
- if ( *(m + *a) ) {
1048
- count++;
1049
- }
1050
- else {
1051
- if ( gt_<op_type>(*(p + *a), max) ) {
1052
- max = *(p + *a);
1053
- addr = i;
1054
- }
1055
- }
1056
- iterator_succ(it);
1057
- }
1058
- }
1059
- }
1060
- else {
1061
- max = *(p + *a);
1062
- addr = 0;
1063
- for (i=addr; i<elements; i++) {
1064
- if ( gt_<op_type>(*(p + *a), max) ) {
1065
- max = *(p + *a);
1066
- addr = i;
1067
- }
1068
- iterator_succ(it);
1069
- }
1070
- }
1071
- if ( return_object ) {
1072
- *retobj = ( count > min_count ) ? CA_UNDEF
1073
- : ( addr < 0 ) ? Qnil : SIZE2NUM(addr);
1074
- }
1075
- else {
1076
- if ( retmask ) {
1077
- *retmask = ( count > min_count ) ? 1 : 0;
1078
- }
1079
- *retval = addr;
1080
- }
1081
- }
1082
-
1083
-
1084
- /* ============================= */
1085
- /* ca_proc_cumcount */
1086
- /* ============================= */
1087
-
1088
- static void
1089
- ca_proc_cumcount_<type> (ca_size_t elements, ca_size_t min_count,
1090
- boolean8_t *m, void *ptr, CAStatIterator *it,
1091
- boolean8_t *retmask, ca_size_t *retval)
1092
- {
1093
- ca_size_t *a = (ca_size_t *) it;
1094
- ca_size_t count = 0;
1095
- ca_size_t i;
1096
- iterator_rewind(it);
1097
- if ( m ) {
1098
- for (i=0; i<elements; i++) {
1099
- if ( *(m + *a) ) {
1100
- count++;
1101
- }
1102
- if ( retmask ) {
1103
- if ( count > min_count ) {
1104
- *retmask = 1;
1105
- }
1106
- else {
1107
- *retmask = 0;
1108
- }
1109
- }
1110
- *retval = i + 1 - count;
1111
- retmask++; retval++;
1112
- iterator_succ(it);
1113
- }
1114
- }
1115
- else {
1116
- for (i=0; i<elements; i++) {
1117
- *retval = i+1;
1118
- retval++;
1119
- }
1120
- }
1121
- }
1122
-
1123
-
1124
- /* ============================= */
1125
- /* ca_proc_cumsum */
1126
- /* ============================= */
1127
-
1128
- static void
1129
- ca_proc_cumsum_<type> (ca_size_t elements, ca_size_t min_count,
1130
- boolean8_t *m, void *ptr, CAStatIterator *it,
1131
- boolean8_t *retmask, float64_t *retval)
1132
- {
1133
- volatile <atype> sum = <azero>;
1134
- <type> *p = (<type> *) ptr;
1135
- ca_size_t *a = (ca_size_t *) it;
1136
- ca_size_t count = 0;
1137
- ca_size_t i;
1138
- iterator_rewind(it);
1139
- if ( m ) {
1140
- for (i=0; i<elements; i++) {
1141
- if ( *(m + *a) ) {
1142
- count++;
1143
- }
1144
- else {
1145
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
1146
- }
1147
- if ( retmask ) {
1148
- if ( count > min_count ) {
1149
- *retmask = 1;
1150
- }
1151
- else {
1152
- *retmask = 0;
1153
- }
1154
- }
1155
- *retval = <type2dbl>(sum);
1156
- retmask++; retval++;
1157
- iterator_succ(it);
1158
- }
1159
- }
1160
- else {
1161
- for (i=0; i<elements; i++) {
1162
- sum = add_<op_type>(sum, (<atype>)<dat2type>(*(p + *a)));
1163
- *retval = <type2dbl>(sum);
1164
- retval++;
1165
- iterator_succ(it);
1166
- }
1167
- }
1168
- }
1169
-
1170
- HERE_END
1171
-
1172
- puts macro_expand(text, TYPEINFO['boolean8_t'])
1173
- puts macro_expand(text, TYPEINFO['int8_t'])
1174
- puts macro_expand(text, TYPEINFO['uint8_t'])
1175
- puts macro_expand(text, TYPEINFO['int16_t'])
1176
- puts macro_expand(text, TYPEINFO['uint16_t'])
1177
- puts macro_expand(text, TYPEINFO['int32_t'])
1178
- puts macro_expand(text, TYPEINFO['uint32_t'])
1179
- puts macro_expand(text, TYPEINFO['int64_t'])
1180
- puts macro_expand(text, TYPEINFO['uint64_t'])
1181
- puts macro_expand(text, TYPEINFO['float32_t'])
1182
- puts macro_expand(text, TYPEINFO['float64_t'])
1183
- puts macro_expand(text, TYPEINFO['float128_t'])
1184
- # puts macro_expand(text, TYPEINFO['cmplx64_t'])
1185
- # puts macro_expand(text, TYPEINFO['cmplx128_t'])
1186
- # puts macro_expand(text, TYPEINFO['cmplx256_t'])
1187
- puts macro_expand(text, TYPEINFO['VALUE'])
1188
-
1189
- text = <<'HERE_END'
1190
- static ca_stat_proc_t
1191
- ca_proc_<name>[CA_NTYPE] = {
1192
- NULL,
1193
- ca_proc_<name>_boolean8_t,
1194
- ca_proc_<name>_int8_t,
1195
- ca_proc_<name>_uint8_t,
1196
- ca_proc_<name>_int16_t,
1197
- ca_proc_<name>_uint16_t,
1198
- ca_proc_<name>_int32_t,
1199
- ca_proc_<name>_uint32_t,
1200
- ca_proc_<name>_int64_t,
1201
- ca_proc_<name>_uint64_t,
1202
- ca_proc_<name>_float32_t,
1203
- ca_proc_<name>_float64_t,
1204
- ca_proc_<name>_float128_t,
1205
- NULL, /* ca_proc_<name>_cmplx64_t, */
1206
- NULL, /* ca_proc_<name>_cmplx128_t, */
1207
- NULL, /* ca_proc_<name>_cmplx256_t, */
1208
- ca_proc_<name>_VALUE,
1209
- };
1210
-
1211
- HERE_END
1212
-
1213
- puts macro_expand(text, "name" => "count")
1214
- puts macro_expand(text, "name" => "sum")
1215
- puts macro_expand(text, "name" => "mean")
1216
- puts macro_expand(text, "name" => "variancep")
1217
- puts macro_expand(text, "name" => "stddevp")
1218
- puts macro_expand(text, "name" => "variance")
1219
- puts macro_expand(text, "name" => "stddev")
1220
- puts macro_expand(text, "name" => "prod")
1221
- puts macro_expand(text, "name" => "min")
1222
- puts macro_expand(text, "name" => "min_addr")
1223
- puts macro_expand(text, "name" => "max")
1224
- puts macro_expand(text, "name" => "max_addr")
1225
-
1226
- puts macro_expand(text, "name" => "cumcount")
1227
- puts macro_expand(text, "name" => "cumsum")
1228
-
1229
- # --------------------------------------------------------------------------
1230
- #
1231
- # STAT Part 2
1232
- #
1233
- # --------------------------------------------------------------------------
1234
-
1235
- text = <<'HERE_END'
1236
-
1237
- /* ============================= */
1238
- /* ca_proc_accum */
1239
- /* ============================= */
1240
-
1241
- static void
1242
- ca_proc_accum_<type> (ca_size_t elements, ca_size_t min_count,
1243
- boolean8_t *m, void *ptr, CAStatIterator *it,
1244
- int return_object, VALUE *retobj,
1245
- boolean8_t *retmask, <type> *retval)
1246
- {
1247
- <type> sum = <zero>;
1248
- <type> *p = (<type> *) ptr;
1249
- ca_size_t *a = (ca_size_t *) it;
1250
- ca_size_t count = 0;
1251
- ca_size_t i;
1252
- iterator_rewind(it);
1253
- if ( m ) {
1254
- for (i=0; i<elements; i++) {
1255
- if ( *(m + *a) ) {
1256
- count++;
1257
- }
1258
- else {
1259
- sum = add_<op_type>(sum, (<type>)<dat2type>(*(p + *a)));
1260
- }
1261
- iterator_succ(it);
1262
- }
1263
- }
1264
- else {
1265
- for (i=0; i<elements; i++) {
1266
- sum = add_<op_type>(sum, (<type>)<dat2type>(*(p + *a)));
1267
- iterator_succ(it);
1268
- }
1269
- }
1270
- if ( return_object ) {
1271
- *retobj = ( count > min_count ) ? CA_UNDEF : <type2obj>(sum);
1272
- }
1273
- else {
1274
- if ( retmask ) {
1275
- *retmask = ( count > min_count ) ? 1 : 0;
1276
- }
1277
- *retval = sum;
1278
- }
1279
- }
1280
-
1281
- HERE_END
1282
-
1283
- puts macro_expand(text, TYPEINFO['boolean8_t'])
1284
- puts macro_expand(text, TYPEINFO['int8_t'])
1285
- puts macro_expand(text, TYPEINFO['uint8_t'])
1286
- puts macro_expand(text, TYPEINFO['int16_t'])
1287
- puts macro_expand(text, TYPEINFO['uint16_t'])
1288
- puts macro_expand(text, TYPEINFO['int32_t'])
1289
- puts macro_expand(text, TYPEINFO['uint32_t'])
1290
- puts macro_expand(text, TYPEINFO['int64_t'])
1291
- puts macro_expand(text, TYPEINFO['uint64_t'])
1292
- puts macro_expand(text, TYPEINFO['float32_t'])
1293
- puts macro_expand(text, TYPEINFO['float64_t'])
1294
- puts macro_expand(text, TYPEINFO['float128_t'])
1295
- puts macro_expand(text, TYPEINFO['cmplx64_t'])
1296
- puts macro_expand(text, TYPEINFO['cmplx128_t'])
1297
- puts macro_expand(text, TYPEINFO['cmplx256_t'])
1298
- puts macro_expand(text, TYPEINFO['VALUE'])
1299
-
1300
- text = <<'HERE_END'
1301
- static ca_stat_proc_t
1302
- ca_proc_<name>[CA_NTYPE] = {
1303
- NULL,
1304
- ca_proc_<name>_boolean8_t,
1305
- ca_proc_<name>_int8_t,
1306
- ca_proc_<name>_uint8_t,
1307
- ca_proc_<name>_int16_t,
1308
- ca_proc_<name>_uint16_t,
1309
- ca_proc_<name>_int32_t,
1310
- ca_proc_<name>_uint32_t,
1311
- ca_proc_<name>_int64_t,
1312
- ca_proc_<name>_uint64_t,
1313
- ca_proc_<name>_float32_t,
1314
- ca_proc_<name>_float64_t,
1315
- ca_proc_<name>_float128_t,
1316
- ca_proc_<name>_cmplx64_t,
1317
- ca_proc_<name>_cmplx128_t,
1318
- ca_proc_<name>_cmplx256_t,
1319
- ca_proc_<name>_VALUE,
1320
- };
1321
-
1322
- HERE_END
1323
-
1324
- puts macro_expand(text, "name" => "accum")
1325
-
1326
- # --------------------------------------------------------------------------
1327
- #
1328
- # METHOD DEFINITIONS (after __END__)
1329
- #
1330
- # --------------------------------------------------------------------------
1331
-
1332
- puts DATA.read
1333
-
1334
- __END__
1335
-
1336
- static VALUE
1337
- rb_ca_stat_1d (VALUE self, VALUE rmc, VALUE vfval,
1338
- ca_stat_proc_t *ca_proc)
1339
- {
1340
- volatile VALUE out;
1341
- CArray *ca;
1342
- CAStatIterator it;
1343
- boolean8_t *m;
1344
- ca_size_t mc;
1345
-
1346
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1347
-
1348
- if ( ! ca_proc[ca->data_type] ) {
1349
- rb_raise(rb_eCADataTypeError,
1350
- "this method is not implemented for data_type %s",
1351
- ca_type_name[ca->data_type]);
1352
- }
1353
-
1354
- if ( ca->elements == 0 ) {
1355
- out = CA_UNDEF;
1356
- }
1357
- else {
1358
- ca_attach(ca);
1359
- m = ( ca->mask ) ? (boolean8_t *)ca->mask->ptr : NULL;
1360
- mc = ( ( ! ca_has_mask(ca) ) || NIL_P(rmc)) ? ca->elements - 1 : NUM2SIZE(rmc);
1361
- if ( mc < 0 ) {
1362
- mc += ca->elements;
1363
- }
1364
- it.step = 0;
1365
- ca_proc[ca->data_type](ca->elements, mc, m, ca->ptr, &it, 1, &out, NULL, NULL);
1366
- ca_detach(ca);
1367
- }
1368
-
1369
- if ( out == CA_UNDEF && ( vfval != CA_NIL ) ) {
1370
- out = vfval;
1371
- }
1372
-
1373
- return out;
1374
- }
1375
-
1376
- static void
1377
- ca_stat_nd_contig_loop (CArray *ca, CArray *co, ca_size_t mc,
1378
- ca_stat_proc_t *ca_proc,
1379
- int level, ca_size_t *idx, char **op, boolean8_t **om)
1380
- {
1381
- void *p;
1382
- boolean8_t *m;
1383
- ca_size_t i, n;
1384
- if ( level == co->ndim ) {
1385
- CAStatIterator it;
1386
- n = ca->elements/co->elements;
1387
- idx[level] = 0;
1388
- p = ca_ptr_at_index(ca, idx);
1389
- m = ( ca->mask && ca->mask->ptr ) ?
1390
- (boolean8_t *)ca_ptr_at_index(ca->mask, idx) : NULL;
1391
- it.step = 0;
1392
- ca_proc[ca->data_type](n, mc, m, p, &it, 0, NULL, *om, *op);
1393
- if ( *om ) {
1394
- *om += 1;
1395
- }
1396
- *op += co->bytes;
1397
- }
1398
- else {
1399
- for (i=0; i<ca->dim[level]; i++) {
1400
- idx[level] = i;
1401
- ca_stat_nd_contig_loop(ca, co, mc, ca_proc, level+1, idx, op, om);
1402
- }
1403
- }
1404
- }
1405
-
1406
- static VALUE
1407
- rb_ca_stat_nd_contig (VALUE self, VALUE vaxis, VALUE rmc, VALUE vfval,
1408
- int8_t data_type, ca_stat_proc_t *ca_proc)
1409
- {
1410
- volatile VALUE out;
1411
- CArray *ca, *co;
1412
- ca_size_t mc, ndim;
1413
-
1414
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1415
-
1416
- if ( ! ca_proc[ca->data_type] ) {
1417
- rb_raise(rb_eCADataTypeError,
1418
- "this method is not implemented for data_type %s",
1419
- ca_type_name[ca->data_type]);
1420
- }
1421
-
1422
- ndim = ca->ndim - RARRAY_LEN(vaxis);
1423
- if ( ndim <= 0 || ndim > ca->ndim ) {
1424
- rb_raise(rb_eRuntimeError, "invalid dimension specified");
1425
- }
1426
-
1427
- out = rb_carray_new(data_type, ndim, ca->dim, 0, NULL);
1428
- TypedData_Get_Struct(out, CArray, &carray_data_type, co);
1429
-
1430
- if ( ca_has_mask(ca) ) {
1431
- ca_create_mask(co);
1432
- }
1433
-
1434
- if ( NIL_P(rmc) ) {
1435
- mc = ca->elements/co->elements - 1;
1436
- }
1437
- else {
1438
- mc = NUM2SIZE(rmc);
1439
- }
1440
-
1441
- if ( mc < 0 ) {
1442
- mc += ca->elements;
1443
- }
1444
-
1445
- {
1446
- ca_size_t idx[CA_RANK_MAX];
1447
- char *op;
1448
- boolean8_t *om;
1449
- int8_t i;
1450
- for (i=0; i<ca->ndim; i++) {
1451
- idx[i] = 0;
1452
- }
1453
- ca_attach_n(2, ca, co);
1454
- op = co->ptr;
1455
- om = ( co->mask && co->mask->ptr ) ? (boolean8_t *)co->mask->ptr : NULL;
1456
- ca_stat_nd_contig_loop(ca, co, mc, ca_proc, 0, idx, &op, &om);
1457
- ca_sync(co);
1458
- ca_detach_n(2, ca, co);
1459
- }
1460
-
1461
- if ( ca_has_mask(co) && ( vfval != CA_NIL ) ) {
1462
- out = rb_ca_mask_fill_copy(out, vfval);
1463
- }
1464
-
1465
- return out;
1466
- }
1467
-
1468
- static void
1469
- ca_stat_get_offset_loop (CArray *ca, ca_size_t *dm,
1470
- int level, ca_size_t *idx,
1471
- int level1, ca_size_t *idx1,
1472
- CArray *offset)
1473
- {
1474
- ca_size_t i;
1475
- if ( level == ca->ndim - 1 ) {
1476
- if ( dm[level] == 0 ) {
1477
- idx[level] = 0;
1478
- *(ca_size_t *)ca_ptr_at_index(offset, idx1) = ca_index2addr(ca, idx);
1479
- }
1480
- else {
1481
- for (i=0; i<ca->dim[level]; i++) {
1482
- idx[level] = i;
1483
- idx1[level1] = i;
1484
- *(ca_size_t *)ca_ptr_at_index(offset, idx1) = ca_index2addr(ca, idx);
1485
- }
1486
- }
1487
- }
1488
- else {
1489
- if ( dm[level] == 0 ) {
1490
- idx[level] = 0;
1491
- ca_stat_get_offset_loop(ca, dm, level+1, idx, level1, idx1, offset);
1492
- }
1493
- else {
1494
- for (i=0; i<ca->dim[level]; i++) {
1495
- idx[level] = i;
1496
- idx1[level1] = i;
1497
- ca_stat_get_offset_loop(ca, dm, level+1, idx, level1+1, idx1, offset);
1498
- }
1499
- }
1500
- }
1501
- }
1502
-
1503
- static VALUE
1504
- rb_ca_stat_nd_discrete (VALUE self, VALUE vaxis, VALUE rmc, VALUE vfval,
1505
- int8_t data_type, ca_stat_proc_t *ca_proc)
1506
- {
1507
- volatile VALUE out;
1508
- ca_size_t idx[CA_RANK_MAX];
1509
- ca_size_t idx1[CA_RANK_MAX];
1510
- ca_size_t out_dim[CA_RANK_MAX];
1511
- ca_size_t loop_dim[CA_RANK_MAX];
1512
- ca_size_t dm[CA_RANK_MAX], dn[CA_RANK_MAX];
1513
- CArray *ca, *co, *first, *offset;
1514
- ca_size_t out_ndim, loop_ndim;
1515
- ca_size_t mc;
1516
- ca_size_t i, k;
1517
-
1518
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1519
-
1520
- for (i=0; i<ca->ndim; i++) {
1521
- dm[i] = 0;
1522
- dn[i] = 1;
1523
- }
1524
-
1525
- for (i=0; i<RARRAY_LEN(vaxis); i++) {
1526
- k = NUM2SIZE(rb_ary_entry(vaxis, i));
1527
- dm[k] = 1;
1528
- dn[k] = 0;
1529
- }
1530
-
1531
- out_ndim = 0;
1532
- loop_ndim = 0;
1533
- for (i=0; i<ca->ndim; i++) {
1534
- if ( dm[i] ) {
1535
- loop_dim[loop_ndim] = ca->dim[i];
1536
- loop_ndim += 1;
1537
- }
1538
- else {
1539
- out_dim[out_ndim] = ca->dim[i];
1540
- out_ndim += 1;
1541
- }
1542
- }
1543
-
1544
- out = rb_carray_new(data_type, out_ndim, out_dim, 0, NULL);
1545
- TypedData_Get_Struct(out, CArray, &carray_data_type, co);
1546
-
1547
- first = carray_new(CA_SIZE, out_ndim, out_dim, 0, NULL);
1548
- first->ptr = realloc(first->ptr, first->bytes*(first->elements+1));
1549
-
1550
- offset = carray_new(CA_SIZE, loop_ndim, loop_dim, 0, NULL);
1551
- offset->ptr = realloc(offset->ptr, offset->bytes*(offset->elements+1));
1552
-
1553
- ca_stat_get_offset_loop(ca, dn, 0, idx, 0, idx1, first);
1554
- ca_stat_get_offset_loop(ca, dm, 0, idx, 0, idx1, offset);
1555
-
1556
- if ( ca_has_mask(ca) ) {
1557
- ca_create_mask(co);
1558
- }
1559
-
1560
- if ( NIL_P(rmc) ) {
1561
- mc = offset->elements - 1;
1562
- }
1563
- else {
1564
- mc = NUM2SIZE(rmc);
1565
- }
1566
-
1567
- if ( mc < 0 ) {
1568
- mc += offset->elements;
1569
- }
1570
-
1571
- ca_attach_n(2, ca, co);
1572
-
1573
- {
1574
- CAStatIterator it, jt;
1575
- ca_size_t *a = (ca_size_t *) (&it);
1576
- boolean8_t *m0, *m, *om;
1577
- char *p, *op;
1578
-
1579
- it.step = 1;
1580
- it.addr = (ca_size_t *)first->ptr;
1581
- jt.step = 1;
1582
- jt.addr = (ca_size_t *)offset->ptr;
1583
-
1584
- m0 = ( ca->mask && ca->mask->ptr ) ? (boolean8_t *)ca->mask->ptr : NULL;
1585
- om = ( co->mask && co->mask->ptr ) ? (boolean8_t *)co->mask->ptr : NULL;
1586
- op = co->ptr;
1587
-
1588
- iterator_rewind(&it);
1589
- for (i=0; i<co->elements; i++) {
1590
- m = ( m0 ) ? m0 + (*a) : NULL;
1591
- p = ca->ptr + (*a) * ca->bytes;
1592
- ca_proc[ca->data_type](offset->elements, mc, m, p, &jt, 0, NULL, om, op);
1593
- if ( om ) {
1594
- om += 1;
1595
- }
1596
- op += co->bytes;
1597
- iterator_succ(&it);
1598
- }
1599
- }
1600
-
1601
- ca_sync(co);
1602
- ca_detach_n(2, ca, co);
1603
-
1604
- if ( ca_has_mask(co) && ( vfval != CA_NIL ) ) {
1605
- out = rb_ca_mask_fill_copy(out, vfval);
1606
- }
1607
-
1608
- ca_free(first);
1609
- ca_free(offset);
1610
-
1611
- return out;
1612
- }
1613
-
1614
- static VALUE
1615
- rb_ca_stat_general (int argc, VALUE *argv, VALUE self,
1616
- int8_t data_type, ca_stat_proc_t *ca_proc)
1617
- {
1618
- volatile VALUE ropt, rmc = Qnil, rmask_limit = Qnil, rmin_count = Qnil,
1619
- vfval = CA_NIL, vaxis;
1620
- CArray *ca;
1621
-
1622
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1623
-
1624
- ropt = rb_pop_options(&argc, &argv);
1625
- rb_scan_options(ropt,
1626
- "mask_limit,fill_value,min_count",
1627
- &rmask_limit, &vfval, &rmin_count);
1628
-
1629
- if ( ( ! NIL_P(rmask_limit) ) && ( ! NIL_P(rmin_count) ) ) {
1630
- rb_raise(rb_eArgError,
1631
- "don't specify mask_limit and min_count simaltaniously");
1632
- }
1633
- else if ( ! NIL_P(rmin_count) ) {
1634
- ca_size_t min_count = NUM2SIZE(rmin_count);
1635
- if ( min_count == 0 ) {
1636
- rmc = Qnil;
1637
- }
1638
- else {
1639
- rmc = SIZE2NUM(-min_count);
1640
- }
1641
- }
1642
- else if ( ! NIL_P(rmask_limit) ) {
1643
- ca_size_t mask_limit = NUM2SIZE(rmask_limit);
1644
- if ( mask_limit == 0 ) {
1645
- rmc = Qnil;
1646
- }
1647
- else {
1648
- rmc = SIZE2NUM(mask_limit-1);
1649
- }
1650
- }
1651
- else {
1652
- rmc = Qnil;
1653
- }
1654
-
1655
- if ( argc > 0 ) {
1656
- vaxis = rb_ary_new4(argc, argv);
1657
- }
1658
- else {
1659
- vaxis = Qnil;
1660
- }
1661
-
1662
- if ( NIL_P(vaxis) ) {
1663
- return rb_ca_stat_1d(self, rmc, vfval, ca_proc);
1664
- }
1665
- else {
1666
- int is_contig = 1;
1667
- ca_size_t i, k;
1668
-
1669
- vaxis = rb_funcall(vaxis, rb_intern("sort"), 0);
1670
- vaxis = rb_funcall(vaxis, rb_intern("uniq"), 0);
1671
-
1672
- for (i=0; i<RARRAY_LEN(vaxis); i++) {
1673
- k = NUM2SIZE(rb_ary_entry(vaxis, RARRAY_LEN(vaxis)-1-i));
1674
- CA_CHECK_INDEX(k, ca->ndim);
1675
- if ( k != ca->ndim-1-i ) {
1676
- is_contig = 0;
1677
- }
1678
- }
1679
-
1680
- if ( is_contig ) {
1681
- if ( RARRAY_LEN(vaxis) == ca->ndim ) {
1682
- return rb_ca_stat_1d(self, rmc, vfval, ca_proc);
1683
- }
1684
- else {
1685
- return rb_ca_stat_nd_contig(self, vaxis, rmc, vfval,
1686
- data_type, ca_proc);
1687
- }
1688
- }
1689
- else {
1690
- return rb_ca_stat_nd_discrete(self, vaxis, rmc, vfval,
1691
- data_type, ca_proc);
1692
- }
1693
- }
1694
- }
1695
-
1696
-
1697
- static VALUE
1698
- rb_ca_prod (int argc, VALUE *argv, VALUE self)
1699
- {
1700
- return rb_ca_stat_general(argc, argv, self, CA_FLOAT64, ca_proc_prod);
1701
- }
1702
-
1703
- static VALUE
1704
- rb_ca_count (int argc, VALUE *argv, VALUE self)
1705
- {
1706
- return rb_ca_stat_general(argc, argv, self, CA_INT32, ca_proc_count);
1707
- }
1708
-
1709
- static VALUE
1710
- rb_ca_sum (int argc, VALUE *argv, VALUE self)
1711
- {
1712
- return rb_ca_stat_general(argc, argv, self, CA_FLOAT64, ca_proc_sum);
1713
- }
1714
-
1715
- static VALUE
1716
- rb_ca_mean (int argc, VALUE *argv, VALUE self)
1717
- {
1718
- return rb_ca_stat_general(argc, argv, self, CA_FLOAT64, ca_proc_mean);
1719
- }
1720
-
1721
- static VALUE
1722
- rb_ca_variancep (int argc, VALUE *argv, VALUE self)
1723
- {
1724
- return rb_ca_stat_general(argc, argv, self, CA_FLOAT64, ca_proc_variancep);
1725
- }
1726
-
1727
- static VALUE
1728
- rb_ca_stddevp (int argc, VALUE *argv, VALUE self)
1729
- {
1730
- return rb_ca_stat_general(argc, argv, self, CA_FLOAT64, ca_proc_stddevp);
1731
- }
1732
-
1733
- static VALUE
1734
- rb_ca_variance (int argc, VALUE *argv, VALUE self)
1735
- {
1736
- return rb_ca_stat_general(argc, argv, self, CA_FLOAT64, ca_proc_variance);
1737
- }
1738
-
1739
- static VALUE
1740
- rb_ca_stddev (int argc, VALUE *argv, VALUE self)
1741
- {
1742
- return rb_ca_stat_general(argc, argv, self, CA_FLOAT64, ca_proc_stddev);
1743
- }
1744
-
1745
- static VALUE
1746
- rb_ca_min (int argc, VALUE *argv, VALUE self)
1747
- {
1748
- CArray *ca;
1749
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1750
- return rb_ca_stat_general(argc, argv, self, ca->data_type, ca_proc_min);
1751
- }
1752
-
1753
- static VALUE
1754
- rb_ca_min_addr (int argc, VALUE *argv, VALUE self)
1755
- {
1756
- return rb_ca_stat_general(argc, argv, self, CA_INT32, ca_proc_min_addr);
1757
- }
1758
-
1759
- static VALUE
1760
- rb_ca_max (int argc, VALUE *argv, VALUE self)
1761
- {
1762
- CArray *ca;
1763
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1764
- return rb_ca_stat_general(argc, argv, self, ca->data_type, ca_proc_max);
1765
- }
1766
-
1767
- static VALUE
1768
- rb_ca_max_addr (int argc, VALUE *argv, VALUE self)
1769
- {
1770
- return rb_ca_stat_general(argc, argv, self, CA_INT32, ca_proc_max_addr);
1771
- }
1772
-
1773
- static VALUE
1774
- rb_ca_accum (int argc, VALUE *argv, VALUE self)
1775
- {
1776
- CArray *ca;
1777
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1778
- return rb_ca_stat_general(argc, argv, self, ca->data_type, ca_proc_accum);
1779
- }
1780
-
1781
- static VALUE
1782
- rb_ca_stat_type2 (int argc, VALUE *argv, VALUE self,
1783
- int8_t data_type, ca_stat_proc_t *ca_proc)
1784
- {
1785
- volatile VALUE out, rmc, rfval;
1786
- CArray *ca, *co;
1787
- ca_size_t mc;
1788
-
1789
- rb_scan_args(argc, argv, "02", (VALUE *) &rmc, (VALUE *) &rfval);
1790
-
1791
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1792
-
1793
- if ( ! ca_proc[ca->data_type] ) {
1794
- rb_raise(rb_eCADataTypeError,
1795
- "this method is not implemented for data_type %s",
1796
- ca_type_name[ca->data_type]);
1797
- }
1798
-
1799
- out = rb_carray_new(data_type, 1, &ca->elements, 0, NULL);
1800
- TypedData_Get_Struct(out, CArray, &carray_data_type, co);
1801
-
1802
- if ( ca->elements == 0 ) {
1803
- ;
1804
- }
1805
- else {
1806
- CAStatIterator it;
1807
- boolean8_t *m = NULL;
1808
- boolean8_t *om = NULL;
1809
- ca_attach(ca);
1810
- if ( ca->mask ) {
1811
- m = (boolean8_t *)ca->mask->ptr;
1812
- }
1813
- mc = ( (! ca->mask) || NIL_P(rmc) ) ? ca->elements - 1 : NUM2SIZE(rmc);
1814
- if ( mc < 0 ) {
1815
- mc += ca->elements;
1816
- }
1817
- if ( m ) {
1818
- ca_create_mask(co);
1819
- om = (boolean8_t *) co->mask->ptr;
1820
- }
1821
- it.step = 0;
1822
- ca_proc[ca->data_type](ca->elements, mc, m, ca->ptr, &it,
1823
- om, co->ptr);
1824
- ca_detach(ca);
1825
- }
1826
-
1827
- if ( ca_has_mask(co) && ( ! NIL_P(rfval) ) ) {
1828
- out = rb_ca_mask_fill_copy(out, rfval);
1829
- }
1830
-
1831
- return out;
1832
- }
1833
-
1834
- static void
1835
- ca_dimstat_type2_loop (CArray *ca, CArray *co, ca_size_t mc,
1836
- ca_stat_proc_t *ca_proc,
1837
- int level, ca_size_t *idx, char **op, boolean8_t **om)
1838
- {
1839
- void *p;
1840
- boolean8_t *m;
1841
- ca_size_t i, n;
1842
- if ( level == co->ndim ) {
1843
- CAStatIterator it;
1844
- n = ca->elements/co->elements;
1845
- idx[level] = 0;
1846
- p = ca_ptr_at_index(ca, idx);
1847
- m = ( ca->mask && ca->mask->ptr ) ?
1848
- (boolean8_t *)ca_ptr_at_index(ca->mask, idx) : NULL;
1849
- it.step = 0;
1850
- ca_proc[ca->data_type](n, mc, m, p, &it, 0, NULL, *om, *op);
1851
- printf("world\n");
1852
- if ( *om ) {
1853
- *om += n;
1854
- }
1855
- *op += n*co->bytes;
1856
- }
1857
- else {
1858
- for (i=0; i<ca->dim[level]; i++) {
1859
- idx[level] = i;
1860
- ca_dimstat_type2_loop(ca, co, mc, ca_proc, level+1, idx, op, om);
1861
- }
1862
- }
1863
- }
1864
-
1865
- static void
1866
- ca_dimstat_type2 (CArray *ca, CArray *co, ca_size_t mc, ca_stat_proc_t *ca_proc)
1867
- {
1868
- ca_size_t idx[CA_RANK_MAX];
1869
- char *op;
1870
- boolean8_t *om;
1871
- int8_t i;
1872
- for (i=0; i<ca->ndim; i++) {
1873
- idx[i] = 0;
1874
- }
1875
- ca_attach_n(2, ca, co);
1876
- op = co->ptr;
1877
- om = ( co->mask && co->mask->ptr ) ? (boolean8_t *)co->mask->ptr : NULL;
1878
- ca_dimstat_type2_loop(ca, co, mc, ca_proc, 0, idx, &op, &om);
1879
- ca_sync(co);
1880
- ca_detach_n(2, ca, co);
1881
- }
1882
-
1883
- static VALUE
1884
- rb_ca_dimstat_type2 (int argc, VALUE *argv, VALUE self,
1885
- int8_t data_type, ca_stat_proc_t *ca_proc)
1886
- {
1887
- volatile VALUE rndim, rmc, rfval;
1888
- volatile VALUE out;
1889
- CArray *ca, *co;
1890
- ca_size_t odim[CA_RANK_MAX], n;
1891
- ca_size_t mc, ndim;
1892
- int32_t i;
1893
-
1894
- rb_scan_args(argc, argv, "12", (VALUE *) &rndim, (VALUE *) &rmc, (VALUE *) &rfval);
1895
-
1896
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1897
-
1898
- if ( ! ca_proc[ca->data_type] ) {
1899
- rb_raise(rb_eCADataTypeError,
1900
- "this method is not implemented for data_type %s",
1901
- ca_type_name[ca->data_type]);
1902
- }
1903
-
1904
- ndim = NUM2SIZE(rndim);
1905
- if ( ndim <= 0 || ndim > ca->ndim ) {
1906
- rb_raise(rb_eRuntimeError, "invalid dimension specified");
1907
- }
1908
-
1909
- n = 1;
1910
- for (i=0; i<ndim; i++) {
1911
- odim[i] = ca->dim[i];
1912
- n *= odim[i];
1913
- }
1914
- odim[ndim] = ca->elements/n;
1915
-
1916
- out = rb_carray_new(data_type, ndim+1, odim, 0, NULL);
1917
- TypedData_Get_Struct(out, CArray, &carray_data_type, co);
1918
-
1919
- if ( ca_has_mask(ca) ) {
1920
- ca_create_mask(co);
1921
- }
1922
-
1923
- if ( NIL_P(rmc) ) {
1924
- mc = ca->elements/co->elements - 1;
1925
- }
1926
- else {
1927
- mc = NUM2SIZE(rmc);
1928
- }
1929
-
1930
- if ( mc < 0 ) {
1931
- mc += ca->elements;
1932
- }
1933
-
1934
- ca_dimstat_type2(ca, co, mc, ca_proc);
1935
-
1936
- if ( ca_has_mask(co) && ( ! NIL_P(rfval) ) ) {
1937
- out = rb_ca_mask_fill_copy(out, rfval);
1938
- }
1939
-
1940
- return out;
1941
- }
1942
-
1943
- static VALUE
1944
- rb_ca_cumcount (int argc, VALUE *argv, VALUE self)
1945
- {
1946
- return rb_ca_stat_type2(argc, argv, self, CA_INT32, ca_proc_cumcount);
1947
- }
1948
-
1949
- static VALUE
1950
- rb_ca_dimcumcount (int argc, VALUE *argv, VALUE self)
1951
- {
1952
- return rb_ca_dimstat_type2(argc, argv, self, CA_INT32, ca_proc_cumcount);
1953
- }
1954
-
1955
- static VALUE
1956
- rb_ca_cumsum (int argc, VALUE *argv, VALUE self)
1957
- {
1958
- return rb_ca_stat_type2(argc, argv, self, CA_FLOAT64, ca_proc_cumsum);
1959
- }
1960
-
1961
- static VALUE
1962
- rb_ca_dimcumsum (int argc, VALUE *argv, VALUE self)
1963
- {
1964
- return rb_ca_dimstat_type2(argc, argv, self, CA_FLOAT64, ca_proc_cumsum);
1965
- }
1966
-
1967
- void
1968
- Init_carray_stat_proc ()
1969
- {
1970
- id_lt = rb_intern("<");
1971
- id_gt = rb_intern(">");
1972
- id_plus = rb_intern("+");
1973
- id_minus = rb_intern("-");
1974
- id_star = rb_intern("*");
1975
- id_quo = rb_intern("quo");
1976
-
1977
- rb_define_method(rb_cCArray, "prod", rb_ca_prod, -1);
1978
- rb_define_method(rb_cCArray, "count_valid", rb_ca_count, -1);
1979
- rb_define_method(rb_cCArray, "sum", rb_ca_sum, -1);
1980
- rb_define_method(rb_cCArray, "mean", rb_ca_mean, -1);
1981
- rb_define_method(rb_cCArray, "variancep", rb_ca_variancep, -1);
1982
- rb_define_method(rb_cCArray, "stddevp", rb_ca_stddevp, -1);
1983
- rb_define_method(rb_cCArray, "variance", rb_ca_variance, -1);
1984
- rb_define_method(rb_cCArray, "stddev", rb_ca_stddev, -1);
1985
- rb_define_method(rb_cCArray, "min", rb_ca_min, -1);
1986
- rb_define_method(rb_cCArray, "max", rb_ca_max, -1);
1987
- rb_define_method(rb_cCArray, "min_addr", rb_ca_min_addr, -1);
1988
- rb_define_method(rb_cCArray, "max_addr", rb_ca_max_addr, -1);
1989
-
1990
- rb_define_method(rb_cCArray, "accumulate", rb_ca_accum, -1);
1991
-
1992
- rb_define_method(rb_cCArray, "cumcount", rb_ca_cumcount, -1);
1993
- rb_define_method(rb_cCArray, "dimcumcount", rb_ca_dimcumcount, -1);
1994
- rb_define_method(rb_cCArray, "cumsum", rb_ca_cumsum, -1);
1995
- rb_define_method(rb_cCArray, "dimcumsum", rb_ca_dimcumsum, -1);
1996
- }
1997
-
1998
-
1999
-