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
data/ext/carray_stat.c DELETED
@@ -1,2100 +0,0 @@
1
- /* ---------------------------------------------------------------------------
2
-
3
- carray_stat.c
4
-
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2025 Hiroki Motoyoshi
8
-
9
- ---------------------------------------------------------------------------- */
10
-
11
- #include "ruby.h"
12
- #include "carray.h"
13
- #include <math.h>
14
- #include <float.h>
15
- #include <stdarg.h>
16
-
17
- #define MIN(x,y) ((x) < (y) ? (x) : (y))
18
- #define MAX(x,y) ((x) > (y) ? (x) : (y))
19
-
20
- /* ----------------------------------------------------------------- */
21
-
22
- #define proc_cummin(type, from, conv) \
23
- { \
24
- type *ptr = (type *) ca->ptr; \
25
- type *q = (type *) co->ptr; \
26
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
27
- boolean8_t *n = NULL; \
28
- type fval = ( ! NIL_P(rfval) ) ? (type) from(rfval) : (type)(0.0); \
29
- type min = *ptr; \
30
- type val; \
31
- ca_size_t count = 0; \
32
- ca_size_t i; \
33
- if ( m ) { \
34
- count = 0; \
35
- ca_create_mask(co); \
36
- n = (boolean8_t*) co->mask->ptr; \
37
- for (i=ca->elements; i; i--, ptr++) { \
38
- if ( ! *m++ ) { \
39
- min = *ptr; \
40
- break; \
41
- } \
42
- } \
43
- ptr = (type *) ca->ptr; \
44
- m = (boolean8_t*) ca->mask->ptr; \
45
- count = 0; \
46
- for (i=ca->elements; i; i--, ptr++, q++, m++, n++) { \
47
- if ( ! *m ) { \
48
- val = *ptr; \
49
- if ( min > val ) { \
50
- min = val; \
51
- } \
52
- } \
53
- else { \
54
- count++; \
55
- } \
56
- if ( ( ! NIL_P(rmin_count) ) && count > min_count ) { \
57
- if ( NIL_P(rfval) ) { \
58
- *n = 1; \
59
- } \
60
- else {\
61
- *q = fval; \
62
- }\
63
- } \
64
- else { \
65
- *q = min; \
66
- } \
67
- } \
68
- } \
69
- else { \
70
- for (i=ca->elements; i; i--, ptr++, q++) {\
71
- val = *ptr; \
72
- if ( min > val ) { \
73
- min = val; \
74
- } \
75
- *q = min; \
76
- } \
77
- } \
78
- }
79
-
80
-
81
- static VALUE
82
- rb_ca_cummin (int argc, VALUE *argv, VALUE self)
83
- {
84
- volatile VALUE rmin_count = Qnil, rfval = Qnil, obj;
85
- CArray *ca, *co;
86
- ca_size_t min_count;
87
-
88
- if ( argc > 0 ) {
89
- rb_scan_args(argc, argv, "02", (VALUE *) &rmin_count, (VALUE *) &rfval);
90
- }
91
-
92
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
93
-
94
- co = ca_template(ca);
95
- obj = ca_wrap_struct(co);
96
-
97
- min_count = ( NIL_P(rmin_count) || ! ca_has_mask(ca) ) ?
98
- ca->elements - 1 : NUM2SIZE(rmin_count);
99
-
100
- if ( min_count < 0 ) {
101
- min_count += ca->elements;
102
- }
103
-
104
- ca_attach(ca);
105
-
106
- switch ( ca->data_type ) {
107
- case CA_BOOLEAN:
108
- case CA_INT8: proc_cummin(int8_t, NUM2LONG,); break;
109
- case CA_UINT8: proc_cummin(uint8_t, NUM2ULONG,); break;
110
- case CA_INT16: proc_cummin(int16_t, NUM2LONG,); break;
111
- case CA_UINT16: proc_cummin(uint16_t, NUM2ULONG,); break;
112
- case CA_INT32: proc_cummin(int32_t, NUM2LONG,); break;
113
- case CA_UINT32: proc_cummin(uint32_t, NUM2ULONG,); break;
114
- case CA_INT64: proc_cummin(int64_t, NUM2LL,); break;
115
- case CA_UINT64: proc_cummin(uint64_t, NUM2ULL,); break;
116
- case CA_FLOAT32: proc_cummin(float32_t, NUM2DBL,); break;
117
- case CA_FLOAT64: proc_cummin(float64_t, NUM2DBL,); break;
118
- case CA_FLOAT128: proc_cummin(float128_t, NUM2DBL,); break;
119
- case CA_OBJECT: proc_cummin(VALUE, NUM2DBL, NUM2DBL); break;
120
- default: rb_raise(rb_eRuntimeError, "invalid data type");
121
- }
122
-
123
- ca_detach(ca);
124
-
125
- return obj;
126
- }
127
-
128
- /* ------------------------------------------------------------------- */
129
-
130
- #define proc_cummax(type, from, conv) \
131
- { \
132
- type *ptr = (type *) ca->ptr; \
133
- type *q = (type *) co->ptr; \
134
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
135
- boolean8_t *n = NULL; \
136
- type fval = ( ! NIL_P(rfval) ) ? (type) from(rfval) : (type)(0.0); \
137
- type max = *ptr; \
138
- type val; \
139
- ca_size_t count = 0; \
140
- ca_size_t i; \
141
- if ( m ) { \
142
- count = 0; \
143
- ca_create_mask(co); \
144
- n = (boolean8_t*) co->mask->ptr; \
145
- for (i=ca->elements; i; i--, ptr++) { \
146
- if ( ! *m++ ) { \
147
- max = *ptr; \
148
- break; \
149
- } \
150
- } \
151
- ptr = (type *) ca->ptr; \
152
- m = (boolean8_t*) ca->mask->ptr; \
153
- count = 0; \
154
- for (i=ca->elements; i; i--, ptr++, q++, m++, n++) { \
155
- if ( ! *m ) { \
156
- val = *ptr; \
157
- if ( max < val ) { \
158
- max = val; \
159
- } \
160
- } \
161
- else { \
162
- count++; \
163
- } \
164
- if ( ( ! NIL_P(rmin_count) ) && count > min_count ) { \
165
- if ( NIL_P(rfval) ) { \
166
- *n = 1; \
167
- } \
168
- else {\
169
- *q = fval; \
170
- }\
171
- } \
172
- else { \
173
- *q = max; \
174
- } \
175
- } \
176
- } \
177
- else { \
178
- for (i=ca->elements; i; i--, ptr++, q++) {\
179
- val = *ptr; \
180
- if ( max < val ) { \
181
- max = val; \
182
- } \
183
- *q = max; \
184
- } \
185
- } \
186
- }
187
-
188
- static VALUE
189
- rb_ca_cummax (int argc, VALUE *argv, VALUE self)
190
- {
191
- volatile VALUE rmin_count = Qnil, rfval = Qnil, obj;
192
- CArray *ca, *co;
193
- ca_size_t min_count;
194
-
195
- if ( argc > 0 ) {
196
- rb_scan_args(argc, argv, "02", (VALUE *) &rmin_count, (VALUE *) &rfval);
197
- }
198
-
199
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
200
-
201
- co = ca_template(ca);
202
- obj = ca_wrap_struct(co);
203
-
204
- min_count = ( NIL_P(rmin_count) || ! ca_has_mask(ca) ) ?
205
- ca->elements - 1 : NUM2SIZE(rmin_count);
206
-
207
- if ( min_count < 0 ) {
208
- min_count += ca->elements;
209
- }
210
-
211
- ca_attach(ca);
212
-
213
- switch ( ca->data_type ) {
214
- case CA_BOOLEAN:
215
- case CA_INT8: proc_cummax(int8_t, NUM2LONG,); break;
216
- case CA_UINT8: proc_cummax(uint8_t, NUM2ULONG,); break;
217
- case CA_INT16: proc_cummax(int16_t, NUM2LONG,); break;
218
- case CA_UINT16: proc_cummax(uint16_t, NUM2ULONG,); break;
219
- case CA_INT32: proc_cummax(int32_t, NUM2LONG,); break;
220
- case CA_UINT32: proc_cummax(uint32_t, NUM2ULONG,); break;
221
- case CA_INT64: proc_cummax(int64_t, NUM2LL,); break;
222
- case CA_UINT64: proc_cummax(uint64_t, NUM2ULL,); break;
223
- case CA_FLOAT32: proc_cummax(float32_t, NUM2DBL,); break;
224
- case CA_FLOAT64: proc_cummax(float64_t, NUM2DBL,); break;
225
- case CA_FLOAT128: proc_cummax(float128_t, NUM2DBL,); break;
226
- case CA_OBJECT: proc_cummax(VALUE, NUM2DBL, NUM2DBL); break;
227
- default: rb_raise(rb_eRuntimeError, "invalid data type");
228
- }
229
-
230
- ca_detach(ca);
231
-
232
- return obj;
233
- }
234
-
235
-
236
- /* ------------------------------------------------------------------- */
237
-
238
- #define proc_cumprod(type, atype, from, conv) \
239
- { \
240
- type *ptr = (type *) ca->ptr; \
241
- atype *q = (atype *) co->ptr; \
242
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
243
- boolean8_t *n = NULL; \
244
- atype fval = ( ! NIL_P(rfval) ) ? (type) from(rfval) : (atype)(0.0); \
245
- atype prod = (atype)(1.0); \
246
- ca_size_t count = 0; \
247
- ca_size_t i; \
248
- if ( m ) { \
249
- count = 0; \
250
- ca_create_mask(co); \
251
- n = (boolean8_t*) co->mask->ptr; \
252
- for (i=ca->elements; i; i--, ptr++, q++, m++, n++) { \
253
- if ( ! *m ) { \
254
- prod *= (atype)conv(*ptr); \
255
- } \
256
- else { \
257
- count++; \
258
- } \
259
- if ( ( ! NIL_P(rmin_count) ) && count > min_count ) { \
260
- if ( NIL_P(rfval) ) { \
261
- *n = 1; \
262
- } \
263
- else {\
264
- *q = fval; \
265
- }\
266
- } \
267
- else { \
268
- *q = prod; \
269
- } \
270
- } \
271
- } \
272
- else { \
273
- for (i=ca->elements; i; i--, ptr++, q++) {\
274
- prod *= (atype)conv(*ptr); \
275
- *q = prod; \
276
- } \
277
- } \
278
- }
279
-
280
- static VALUE
281
- rb_ca_cumprod (int argc, VALUE *argv, VALUE self)
282
- {
283
- volatile VALUE rmin_count = Qnil, rfval = Qnil;
284
- CArray *ca, *co;
285
- ca_size_t min_count;
286
-
287
- if ( argc > 0 ) {
288
- rb_scan_args(argc, argv, "02", (VALUE *) &rmin_count, (VALUE *) &rfval);
289
- }
290
-
291
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
292
-
293
- if ( ca_is_complex_type(ca) ) {
294
- co = carray_new(CA_CMPLX128, ca->ndim, ca->dim, 0, NULL);
295
- }
296
- else {
297
- co = carray_new(CA_FLOAT64, ca->ndim, ca->dim, 0, NULL);
298
- }
299
-
300
- min_count = ( NIL_P(rmin_count) || ! ca_has_mask(ca) ) ?
301
- ca->elements - 1 : NUM2SIZE(rmin_count);
302
-
303
- if ( min_count < 0 ) {
304
- min_count += ca->elements;
305
- }
306
-
307
- ca_attach(ca);
308
-
309
- switch ( ca->data_type ) {
310
- case CA_BOOLEAN:
311
- case CA_INT8: proc_cumprod(int8_t, double, NUM2DBL,); break;
312
- case CA_UINT8: proc_cumprod(uint8_t, double, NUM2DBL,); break;
313
- case CA_INT16: proc_cumprod(int16_t, double, NUM2DBL,); break;
314
- case CA_UINT16: proc_cumprod(uint16_t, double, NUM2DBL,); break;
315
- case CA_INT32: proc_cumprod(int32_t, double, NUM2DBL,); break;
316
- case CA_UINT32: proc_cumprod(uint32_t, double, NUM2DBL,); break;
317
- case CA_INT64: proc_cumprod(int64_t, double, NUM2DBL,); break;
318
- case CA_UINT64: proc_cumprod(uint64_t, double, NUM2DBL,); break;
319
- case CA_FLOAT32: proc_cumprod(float32_t, double, NUM2DBL,); break;
320
- case CA_FLOAT64: proc_cumprod(float64_t, double, NUM2DBL,); break;
321
- case CA_FLOAT128: proc_cumprod(float128_t, double, NUM2DBL,); break;
322
- #ifdef HAVE_COMPLEX_H
323
- case CA_CMPLX64: proc_cumprod(cmplx64_t, cmplx128_t, NUM2CC,); break;
324
- case CA_CMPLX128: proc_cumprod(cmplx128_t, cmplx128_t, NUM2CC,); break;
325
- case CA_CMPLX256: proc_cumprod(cmplx256_t, cmplx128_t, NUM2CC,); break;
326
- #endif
327
- case CA_OBJECT: proc_cumprod(VALUE, double, NUM2DBL, NUM2DBL); break;
328
- default: rb_raise(rb_eRuntimeError, "invalid data type");
329
- }
330
-
331
- ca_detach(ca);
332
-
333
- return ca_wrap_struct(co);
334
- }
335
-
336
-
337
- /* ----------------------------------------------------------------- */
338
-
339
- #define proc_wsum(type, atype, conv, to) \
340
- { \
341
- type *p1 = (type*)ca->ptr; \
342
- type *p2; \
343
- ca_size_t s2; \
344
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
345
- atype sum = 0.0; \
346
- ca_size_t count = 0; \
347
- ca_size_t i; \
348
- ca_set_iterator(1, cw, &p2, &s2); \
349
- if ( m ) { \
350
- count = 0; \
351
- for (i=ca->elements; i; i--, p1++, p2+=s2) { \
352
- if ( ! *m++ ) { \
353
- sum += (atype)conv(*p1) * (atype)conv(*p2); \
354
- } \
355
- else { \
356
- count++; \
357
- } \
358
- } \
359
- } \
360
- else { \
361
- for (i=ca->elements; i; i--, p1++, p2+=s2) { \
362
- sum += (atype)conv(*p1) * (atype)conv(*p2); \
363
- } \
364
- } \
365
- if ( ( ! NIL_P(rmin_count) ) && count > min_count ) { \
366
- out = ( NIL_P(rfval) ) ? CA_UNDEF : rfval;\
367
- } \
368
- else { \
369
- out = to(sum); \
370
- } \
371
- }
372
-
373
- static VALUE
374
- rb_ca_wsum (int argc, VALUE *argv, VALUE self)
375
- {
376
- volatile VALUE out, weight = argv[0], rmin_count = Qnil, rfval = Qnil, tmp;
377
- CArray *ca, *cw;
378
- ca_size_t min_count;
379
-
380
- if ( argc > 1 ) {
381
- rb_scan_args(argc, argv, "12", (VALUE *) &weight, (VALUE *) &rmin_count, (VALUE *) &rfval);
382
- }
383
-
384
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
385
- cw = ca_wrap_readonly(weight, ca->data_type);
386
-
387
- ca_check_same_elements(ca, cw);
388
-
389
- if ( ca->elements == 0 ) {
390
- return ( NIL_P(rfval) ) ? CA_UNDEF : rfval;
391
- }
392
-
393
- if ( ca_has_mask(cw) ) {
394
- ca = ca_copy(ca);
395
- tmp = ca_wrap_struct(ca);
396
- ca_copy_mask_overlay(ca, ca->elements, 1, cw);
397
- }
398
-
399
- min_count = ( NIL_P(rmin_count) || ( ! ca_has_mask(ca) ) ) ?
400
- ca->elements - 1 : NUM2SIZE(rmin_count);
401
-
402
- if ( min_count < 0 ) {
403
- min_count += ca->elements;
404
- }
405
-
406
- ca_attach_n(2, ca, cw);
407
-
408
- switch ( ca->data_type ) {
409
- case CA_BOOLEAN:
410
- case CA_INT8: proc_wsum(int8_t, double,,rb_float_new); break;
411
- case CA_UINT8: proc_wsum(uint8_t,double,,rb_float_new); break;
412
- case CA_INT16: proc_wsum(int16_t,double,,rb_float_new); break;
413
- case CA_UINT16: proc_wsum(uint16_t,double,,rb_float_new); break;
414
- case CA_INT32: proc_wsum(int32_t,double,,rb_float_new); break;
415
- case CA_UINT32: proc_wsum(uint32_t,double,,rb_float_new); break;
416
- case CA_INT64: proc_wsum(int64_t,double,,rb_float_new); break;
417
- case CA_UINT64: proc_wsum(uint64_t,double,,rb_float_new); break;
418
- case CA_FLOAT32: proc_wsum(float32_t,double,,rb_float_new); break;
419
- case CA_FLOAT64: proc_wsum(float64_t,double,,rb_float_new); break;
420
- case CA_FLOAT128: proc_wsum(float128_t,double,,rb_float_new); break;
421
- #ifdef HAVE_COMPLEX_H
422
- case CA_CMPLX64: proc_wsum(cmplx64_t,cmplx128_t,,rb_ccomplex_new); break;
423
- case CA_CMPLX128: proc_wsum(cmplx128_t,cmplx128_t,,rb_ccomplex_new); break;
424
- case CA_CMPLX256: proc_wsum(cmplx256_t,cmplx128_t,,rb_ccomplex_new); break;
425
- #endif
426
- case CA_OBJECT: proc_wsum(VALUE,double,NUM2DBL,rb_float_new); break;
427
- default: rb_raise(rb_eRuntimeError, "invalid data type");
428
- }
429
-
430
- ca_detach_n(2, ca, cw);
431
-
432
- return out;
433
- }
434
-
435
- /* ------------------------------------------------------------------- */
436
-
437
- #define proc_cumwsum(type, atype, from, conv) \
438
- { \
439
- type *p1 = (type *) ca->ptr; \
440
- type *p2; \
441
- ca_size_t s2; \
442
- atype *q = (atype *) co->ptr; \
443
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
444
- boolean8_t *n = NULL; \
445
- atype fval = ( ! NIL_P(rfval) ) ? (type) from(rfval) : (atype)(0.0); \
446
- atype sum = 0.0; \
447
- ca_size_t count = 0; \
448
- ca_size_t i; \
449
- ca_set_iterator(1, cw, &p2, &s2); \
450
- if ( m ) { \
451
- count = 0; \
452
- ca_create_mask(co); \
453
- n = (boolean8_t*) co->mask->ptr; \
454
- for (i=ca->elements; i; i--, p1++, p2+=s2, q++, m++, n++) {\
455
- if ( ! *m ) { \
456
- sum += (atype)conv(*p1) * (atype)conv(*p2); \
457
- } \
458
- else { \
459
- count++; \
460
- } \
461
- if ( ( ! NIL_P(rmin_count) ) && count > min_count ) { \
462
- if ( NIL_P(rfval) ) { \
463
- *n = 1; \
464
- } \
465
- else {\
466
- *q = fval; \
467
- }\
468
- } \
469
- else { \
470
- *q = sum; \
471
- } \
472
- } \
473
- } \
474
- else { \
475
- for (i=ca->elements; i; i--, p1++, p2+=s2, q++) { \
476
- sum += (atype)conv(*p1) * (atype)conv(*p2); \
477
- *q = sum; \
478
- } \
479
- } \
480
- }
481
-
482
- static VALUE
483
- rb_ca_cumwsum (int argc, VALUE *argv, VALUE self)
484
- {
485
- volatile VALUE weight = argv[0], rmin_count = Qnil, rfval = Qnil, tmp;
486
- CArray *ca, *cw, *co;
487
- ca_size_t min_count;
488
-
489
- if ( argc > 1 ) {
490
- rb_scan_args(argc, argv, "12", (VALUE *) &weight, (VALUE *) &rmin_count, (VALUE *) &rfval);
491
- }
492
-
493
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
494
- cw = ca_wrap_readonly(weight, ca->data_type);
495
-
496
- ca_check_same_elements(ca, cw);
497
-
498
- if ( ca_has_mask(cw) ) {
499
- ca = ca_copy(ca);
500
- tmp = ca_wrap_struct(ca);
501
- ca_copy_mask_overlay(ca, ca->elements, 1, cw);
502
- }
503
-
504
- if ( ca_is_complex_type(ca) ) {
505
- co = carray_new(CA_CMPLX128, ca->ndim, ca->dim, 0, NULL);
506
- }
507
- else {
508
- co = carray_new(CA_FLOAT64, ca->ndim, ca->dim, 0, NULL);
509
- }
510
-
511
- min_count = ( NIL_P(rmin_count) || ( ! ca_has_mask(ca) ) ) ?
512
- ca->elements - 1 : NUM2SIZE(rmin_count);
513
-
514
- if ( min_count < 0 ) {
515
- min_count += ca->elements;
516
- }
517
-
518
- ca_attach(ca);
519
-
520
- switch ( ca->data_type ) {
521
- case CA_BOOLEAN:
522
- case CA_INT8: proc_cumwsum(int8_t, double, NUM2DBL,); break;
523
- case CA_UINT8: proc_cumwsum(uint8_t, double, NUM2DBL,); break;
524
- case CA_INT16: proc_cumwsum(int16_t, double, NUM2DBL,); break;
525
- case CA_UINT16: proc_cumwsum(uint16_t, double, NUM2DBL,); break;
526
- case CA_INT32: proc_cumwsum(int32_t, double, NUM2DBL,); break;
527
- case CA_UINT32: proc_cumwsum(uint32_t, double, NUM2DBL,); break;
528
- case CA_INT64: proc_cumwsum(int64_t, double, NUM2DBL,); break;
529
- case CA_UINT64: proc_cumwsum(uint64_t, double, NUM2DBL,); break;
530
- case CA_FLOAT32: proc_cumwsum(float32_t, double, NUM2DBL,); break;
531
- case CA_FLOAT64: proc_cumwsum(float64_t, double, NUM2DBL,); break;
532
- case CA_FLOAT128: proc_cumwsum(float128_t, double, NUM2DBL,); break;
533
- #ifdef HAVE_COMPLEX_H
534
- case CA_CMPLX64: proc_cumwsum(cmplx64_t, cmplx128_t, NUM2CC,); break;
535
- case CA_CMPLX128: proc_cumwsum(cmplx128_t, cmplx128_t, NUM2CC,); break;
536
- case CA_CMPLX256: proc_cumwsum(cmplx256_t, cmplx128_t, NUM2CC,); break;
537
- #endif
538
- case CA_OBJECT: proc_cumwsum(VALUE, double, NUM2DBL, NUM2DBL); break;
539
- default: rb_raise(rb_eRuntimeError, "invalid data type");
540
- }
541
-
542
- ca_detach(ca);
543
-
544
- return ca_wrap_struct(co);
545
- }
546
-
547
- /* ----------------------------------------------------------------- */
548
-
549
- #define proc_wmean(type, atype, conv, to) \
550
- { \
551
- type *p1 = (type*)ca->ptr; \
552
- type *p2 = (type*)cw->ptr; \
553
- ca_size_t s2; \
554
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
555
- atype sum = 0.0; \
556
- atype den = 0.0; \
557
- atype ave; \
558
- ca_size_t count = 0; \
559
- ca_size_t i; \
560
- ca_set_iterator(1, cw, &p2, &s2); \
561
- if ( m ) { \
562
- count = 0; \
563
- for (i=ca->elements; i; i--, p1++, p2+=s2) { \
564
- if ( ! *m++ ) { \
565
- sum += (atype)conv(*p1) * (atype)conv(*p2); \
566
- den += (atype)conv(*p2); \
567
- } \
568
- else { \
569
- count++; \
570
- } \
571
- } \
572
- } \
573
- else { \
574
- for (i=ca->elements; i; i--, p1++, p2+=s2) { \
575
- sum += (atype)conv(*p1) * (atype)conv(*p2); \
576
- den += (atype)conv(*p2); \
577
- } \
578
- } \
579
- if ( ( ! NIL_P(rmin_count) ) && count > min_count ) \
580
- out = ( NIL_P(rfval) ) ? CA_UNDEF : rfval; \
581
- else { \
582
- ave = sum / den; \
583
- out = to(ave); \
584
- } \
585
- }
586
-
587
- static VALUE
588
- rb_ca_wmean (int argc, VALUE *argv, VALUE self)
589
- {
590
- volatile VALUE out, weight = argv[0], rmin_count = Qnil, rfval = Qnil, tmp;
591
- CArray *ca, *cw;
592
- ca_size_t min_count;
593
-
594
- if ( argc > 1 ) {
595
- rb_scan_args(argc, argv, "12", (VALUE *) &weight, (VALUE *) &rmin_count, (VALUE *) &rfval);
596
- }
597
-
598
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
599
- cw = ca_wrap_readonly(weight, ca->data_type);
600
-
601
- ca_check_same_elements(ca, cw);
602
-
603
- if ( ca->elements == 0 ) {
604
- return ( NIL_P(rfval) ) ? CA_UNDEF : rfval;
605
- }
606
-
607
- if ( ca_has_mask(cw) ) {
608
- ca = ca_copy(ca);
609
- tmp = ca_wrap_struct(ca);
610
- ca_copy_mask_overlay(ca, ca->elements, 1, cw);
611
- }
612
-
613
- min_count = ( NIL_P(rmin_count) || ( ! ca_has_mask(ca) ) ) ?
614
- ca->elements - 1 : NUM2SIZE(rmin_count);
615
-
616
- if ( min_count < 0 ) {
617
- min_count += ca->elements;
618
- }
619
-
620
- ca_attach_n(2, ca, cw);
621
-
622
- switch ( ca->data_type ) {
623
- case CA_BOOLEAN:
624
- case CA_INT8: proc_wmean(int8_t, double,,rb_float_new); break;
625
- case CA_UINT8: proc_wmean(uint8_t,double,,rb_float_new); break;
626
- case CA_INT16: proc_wmean(int16_t,double,,rb_float_new); break;
627
- case CA_UINT16: proc_wmean(uint16_t,double,,rb_float_new); break;
628
- case CA_INT32: proc_wmean(int32_t,double,,rb_float_new); break;
629
- case CA_UINT32: proc_wmean(uint32_t,double,,rb_float_new); break;
630
- case CA_INT64: proc_wmean(int64_t,double,,rb_float_new); break;
631
- case CA_UINT64: proc_wmean(uint64_t,double,,rb_float_new); break;
632
- case CA_FLOAT32: proc_wmean(float32_t,double,,rb_float_new); break;
633
- case CA_FLOAT64: proc_wmean(float64_t,double,,rb_float_new); break;
634
- case CA_FLOAT128: proc_wmean(float128_t,double,,rb_float_new); break;
635
- #ifdef HAVE_COMPLEX_H
636
- case CA_CMPLX64: proc_wmean(cmplx64_t,cmplx128_t,,rb_ccomplex_new); break;
637
- case CA_CMPLX128: proc_wmean(cmplx128_t,cmplx128_t,,rb_ccomplex_new); break;
638
- case CA_CMPLX256: proc_wmean(cmplx256_t,cmplx128_t,,rb_ccomplex_new); break;
639
- #endif
640
- case CA_OBJECT: proc_wmean(VALUE,double,NUM2DBL,rb_float_new); break;
641
- default: rb_raise(rb_eRuntimeError, "invalid data type");
642
- }
643
-
644
- ca_detach_n(2, ca, cw);
645
-
646
- return out;
647
- }
648
-
649
- /* ----------------------------------------------------------------- */
650
-
651
- #define proc_variancep(type,from) \
652
- { \
653
- type *ptr = (type *) ca->ptr; \
654
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
655
- double sum = 0.0; \
656
- double sum2 = 0.0; \
657
- double del, var, ave; \
658
- ca_size_t count = 0; \
659
- ca_size_t nvalid; \
660
- ca_size_t i; \
661
- if ( m ) { \
662
- count = 0; \
663
- for (i=ca->elements; i; i--, ptr++) { \
664
- if ( ! *m++ ) { \
665
- sum += (double)from(*ptr); \
666
- } \
667
- else { \
668
- count++; \
669
- } \
670
- } \
671
- nvalid = ca->elements - count; \
672
- } \
673
- else { \
674
- for (i=ca->elements; i; i--, ptr++) { \
675
- sum += (double)from(*ptr); \
676
- } \
677
- nvalid = ca->elements; \
678
- } \
679
- if ( ( ! NIL_P(rmin_count) ) && count > min_count ) { \
680
- out = ( NIL_P(rfval) ) ? CA_UNDEF : rfval; \
681
- break; \
682
- } \
683
- ave = sum / ((double) nvalid); \
684
- ptr = (type *) ca->ptr; \
685
- m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
686
- if ( m ) { \
687
- for (i=ca->elements; i; i--, ptr++) { \
688
- if ( ! *m++ ) { \
689
- del = ((double)from(*ptr)) - ave; \
690
- sum2 += del*del; \
691
- } \
692
- } \
693
- } \
694
- else { \
695
- for (i=ca->elements; i; i--, ptr++) { \
696
- del = ((double)from(*ptr)) - ave; \
697
- sum2 += del*del; \
698
- } \
699
- } \
700
- var = sum2 / ((double) nvalid); \
701
- out = rb_float_new(var); \
702
- }
703
-
704
- static VALUE
705
- rb_ca_variancep (int argc, VALUE *argv, VALUE self)
706
- {
707
- volatile VALUE out, rmin_count = Qnil, rfval = Qnil;
708
- CArray *ca;
709
- ca_size_t min_count;
710
-
711
- if ( argc > 0 ) {
712
- rb_scan_args(argc, argv, "02", (VALUE *) &rmin_count, (VALUE *) &rfval);
713
- }
714
-
715
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
716
-
717
- if ( ca->elements == 0 ) {
718
- return ( NIL_P(rfval) ) ? CA_UNDEF : rfval;
719
- }
720
-
721
- min_count = ( NIL_P(rmin_count) || ! ca_has_mask(ca) ) ?
722
- ca->elements - 1 : NUM2SIZE(rmin_count);
723
-
724
- if ( min_count < 0 ) {
725
- min_count += ca->elements;
726
- }
727
-
728
- ca_attach(ca);
729
-
730
- switch ( ca->data_type ) {
731
- case CA_BOOLEAN:
732
- case CA_INT8: proc_variancep(int8_t,); break;
733
- case CA_UINT8: proc_variancep(uint8_t,); break;
734
- case CA_INT16: proc_variancep(int16_t,); break;
735
- case CA_UINT16: proc_variancep(uint16_t,); break;
736
- case CA_INT32: proc_variancep(int32_t,); break;
737
- case CA_UINT32: proc_variancep(uint32_t,); break;
738
- case CA_INT64: proc_variancep(int64_t,); break;
739
- case CA_UINT64: proc_variancep(uint64_t,); break;
740
- case CA_FLOAT32: proc_variancep(float32_t,); break;
741
- case CA_FLOAT64: proc_variancep(float64_t,); break;
742
- case CA_FLOAT128: proc_variancep(float128_t,); break;
743
- case CA_OBJECT: proc_variancep(VALUE,NUM2DBL); break;
744
- default: rb_raise(rb_eRuntimeError, "invalid data type");
745
- }
746
-
747
- ca_detach(ca);
748
-
749
- return out;
750
- }
751
-
752
- /* ----------------------------------------------------------------- */
753
-
754
- #define proc_variance(type,from) \
755
- { \
756
- type *ptr = (type *) ca->ptr; \
757
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
758
- double sum = 0.0; \
759
- double sum2 = 0.0; \
760
- double del, var, ave; \
761
- ca_size_t count = 0; \
762
- ca_size_t nvalid; \
763
- ca_size_t i; \
764
- if ( m ) { \
765
- count = 0; \
766
- for (i=ca->elements; i; i--, ptr++) { \
767
- if ( ! *m++ ) { \
768
- sum += (double)from(*ptr); \
769
- } \
770
- else { \
771
- count++; \
772
- } \
773
- } \
774
- nvalid = ca->elements - count; \
775
- } \
776
- else { \
777
- for (i=ca->elements; i; i--, ptr++) { \
778
- sum += (double)from(*ptr); \
779
- } \
780
- nvalid = ca->elements; \
781
- } \
782
- if ( ( ! NIL_P(rmin_count) ) && count > min_count ) { \
783
- out = ( NIL_P(rfval) ) ? CA_UNDEF : rfval; \
784
- break; \
785
- } \
786
- ave = sum / ((double) nvalid); \
787
- ptr = (type *) ca->ptr; \
788
- m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
789
- if ( m ) { \
790
- for (i=ca->elements; i; i--, ptr++) { \
791
- if ( ! *m++ ) { \
792
- del = ((double)from(*ptr)) - ave; \
793
- sum2 += del*del; \
794
- } \
795
- } \
796
- } \
797
- else { \
798
- for (i=ca->elements; i; i--, ptr++) { \
799
- del = ((double)from(*ptr)) - ave; \
800
- sum2 += del*del; \
801
- } \
802
- } \
803
- var = sum2 / ((double) nvalid - 1); \
804
- out = rb_float_new(var); \
805
- }
806
-
807
- static VALUE
808
- rb_ca_variance (int argc, VALUE *argv, VALUE self)
809
- {
810
- volatile VALUE out, rmin_count = Qnil, rfval = Qnil;
811
- CArray *ca;
812
- ca_size_t min_count;
813
-
814
- if ( argc > 0 ) {
815
- rb_scan_args(argc, argv, "02", (VALUE *) &rmin_count, (VALUE *) &rfval);
816
- }
817
-
818
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
819
-
820
- if ( ca->elements == 0 ) {
821
- return ( NIL_P(rfval) ) ? CA_UNDEF : rfval;
822
- }
823
-
824
- min_count = ( NIL_P(rmin_count) || ! ca_has_mask(ca) ) ?
825
- ca->elements - 1 : NUM2SIZE(rmin_count);
826
-
827
- if ( min_count < 0 ) {
828
- min_count += ca->elements;
829
- }
830
-
831
- ca_attach(ca);
832
-
833
- switch ( ca->data_type ) {
834
- case CA_BOOLEAN:
835
- case CA_INT8: proc_variance(int8_t,); break;
836
- case CA_UINT8: proc_variance(uint8_t,); break;
837
- case CA_INT16: proc_variance(int16_t,); break;
838
- case CA_UINT16: proc_variance(uint16_t,); break;
839
- case CA_INT32: proc_variance(int32_t,); break;
840
- case CA_UINT32: proc_variance(uint32_t,); break;
841
- case CA_INT64: proc_variance(int64_t,); break;
842
- case CA_UINT64: proc_variance(uint64_t,); break;
843
- case CA_FLOAT32: proc_variance(float32_t,); break;
844
- case CA_FLOAT64: proc_variance(float64_t,); break;
845
- case CA_FLOAT128: proc_variance(float128_t,); break;
846
- case CA_OBJECT: proc_variance(VALUE,NUM2DBL); break;
847
- default: rb_raise(rb_eRuntimeError, "invalid data type");
848
- }
849
-
850
- ca_detach(ca);
851
-
852
- return out;
853
- }
854
-
855
- static VALUE
856
- rb_ca_count_true (int argc, VALUE *argv, VALUE self)
857
- {
858
- volatile VALUE out, rmin_count = Qnil, rfval = Qnil;
859
- CArray *ca;
860
- ca_size_t min_count;
861
-
862
- if ( argc > 1 ) {
863
- rb_scan_args(argc, argv, "02", (VALUE *) &rmin_count, (VALUE *) &rfval);
864
- }
865
-
866
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
867
-
868
- if ( ! ca_is_boolean_type(ca) ) {
869
- rb_raise(rb_eCADataTypeError,
870
- "data_type should be CA_BOOLEAN for this method");
871
- }
872
-
873
- if ( ca->elements == 0 ) {
874
- return INT2NUM(0);
875
- }
876
-
877
- min_count = ( NIL_P(rmin_count) || ! ca_has_mask(ca) ) ?
878
- ca->elements - 1 : NUM2SIZE(rmin_count);
879
-
880
- if ( min_count < 0 ) {
881
- min_count += ca->elements;
882
- }
883
-
884
- ca_attach(ca);
885
-
886
- {
887
- boolean8_t *ptr = (boolean8_t *) ca->ptr;
888
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL;
889
- ca_size_t count = 0;
890
- ca_size_t value_count = 0;
891
- ca_size_t i;
892
- if ( m ) {
893
- for (i=0; i<ca->elements; i++) {
894
- if ( *m ) {
895
- count++;
896
- }
897
- else if ( *ptr ) {
898
- value_count++;
899
- }
900
- ptr++; m++;
901
- }
902
- }
903
- else {
904
- for (i=0; i<ca->elements; i++) {
905
- if ( *ptr ) {
906
- value_count++;
907
- }
908
- ptr++;
909
- }
910
- }
911
- if ( ( ! NIL_P(rmin_count) ) && count > min_count ) {
912
- out = ( NIL_P(rfval) ) ? CA_UNDEF : rfval;
913
- }
914
- else {
915
- out = SIZE2NUM(value_count);
916
- }
917
- }
918
-
919
- ca_detach(ca);
920
-
921
- return out;
922
- }
923
-
924
- static VALUE
925
- rb_ca_count_false (int argc, VALUE *argv, VALUE self)
926
- {
927
- volatile VALUE out, rmin_count = Qnil, rfval = Qnil;
928
- CArray *ca;
929
- ca_size_t min_count;
930
-
931
- if ( argc > 1 ) {
932
- rb_scan_args(argc, argv, "02", (VALUE *) &rmin_count, (VALUE *) &rfval);
933
- }
934
-
935
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
936
-
937
- if ( ! ca_is_boolean_type(ca) ) {
938
- rb_raise(rb_eCADataTypeError,
939
- "data_type should be CA_BOOLEAN for this method");
940
- }
941
-
942
- if ( ca->elements == 0 ) {
943
- return INT2NUM(0);
944
- }
945
-
946
- min_count = ( NIL_P(rmin_count) || ! ca_has_mask(ca) ) ?
947
- ca->elements - 1 : NUM2SIZE(rmin_count);
948
-
949
- if ( min_count < 0 ) {
950
- min_count += ca->elements;
951
- }
952
-
953
- ca_attach(ca);
954
-
955
- {
956
- boolean8_t *ptr = (boolean8_t *) ca->ptr;
957
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL;
958
- ca_size_t count = 0;
959
- ca_size_t value_count = 0;
960
- ca_size_t i;
961
- if ( m ) {
962
- for (i=0; i<ca->elements; i++) {
963
- if ( *m ) {
964
- count++;
965
- }
966
- else if ( !(*ptr) ) {
967
- value_count++;
968
- }
969
- ptr++; m++;
970
- }
971
- }
972
- else {
973
- for (i=0; i<ca->elements; i++) {
974
- if ( !(*ptr) ) {
975
- value_count++;
976
- }
977
- ptr++;
978
- }
979
- }
980
- if ( ( ! NIL_P(rmin_count) ) && count > min_count ) {
981
- out = ( NIL_P(rfval) ) ? CA_UNDEF : rfval;
982
- }
983
- else {
984
- out = SIZE2NUM(value_count);
985
- }
986
- }
987
-
988
- ca_detach(ca);
989
-
990
- return out;
991
- }
992
-
993
- /* ----------------------------------------------------------------- */
994
-
995
- #define proc_count_equal(type,from) \
996
- { \
997
- type *ptr = (type *) ca->ptr; \
998
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
999
- type val = (type) from(value); \
1000
- ca_size_t count = 0; \
1001
- ca_size_t value_count = 0; \
1002
- ca_size_t i; \
1003
- if ( m ) { \
1004
- for (i=ca->elements; i; i--, ptr++) { \
1005
- if ( ! *m++ ) { \
1006
- if (*ptr == val ) { \
1007
- value_count++; \
1008
- } \
1009
- } \
1010
- else { \
1011
- count++; \
1012
- } \
1013
- } \
1014
- } \
1015
- else { \
1016
- for (i=ca->elements; i; i--, ptr++) { \
1017
- if ( *ptr == val ) { \
1018
- value_count++; \
1019
- } \
1020
- } \
1021
- } \
1022
- if ( ( ! NIL_P(rmin_count) ) && count > min_count ) { \
1023
- out = ( NIL_P(rfval) ) ? CA_UNDEF : rfval; \
1024
- } \
1025
- else { \
1026
- out = SIZE2NUM(value_count); \
1027
- } \
1028
- }
1029
-
1030
- #define proc_count_equal_data() \
1031
- { \
1032
- char *ptr = ca->ptr; \
1033
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
1034
- char *val = ALLOCA_N(char, ca->bytes); \
1035
- ca_size_t count = 0; \
1036
- ca_size_t value_count = 0; \
1037
- ca_size_t i; \
1038
- rb_ca_obj2ptr(self, value, val); \
1039
- if ( m ) { \
1040
- for (i=ca->elements; i; i--, ptr+=ca->bytes) {\
1041
- if ( ! *m++ ) { \
1042
- if ( !memcmp(ptr, val, ca->bytes) ) { \
1043
- value_count++; \
1044
- } \
1045
- } \
1046
- else { \
1047
- count++; \
1048
- } \
1049
- } \
1050
- } \
1051
- else { \
1052
- for (i=ca->elements; i; i--, ptr+=ca->bytes) { \
1053
- if ( !memcmp(ptr, val, ca->bytes) ) { \
1054
- value_count++; \
1055
- } \
1056
- } \
1057
- } \
1058
- if ( ( ! NIL_P(rmin_count) ) && count > min_count ) { \
1059
- out = ( NIL_P(rfval) ) ? CA_UNDEF : rfval; \
1060
- } \
1061
- else { \
1062
- out = SIZE2NUM(value_count); \
1063
- } \
1064
- }
1065
-
1066
- #define proc_count_equal_object() \
1067
- { \
1068
- VALUE *ptr = (VALUE *)ca->ptr; \
1069
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
1070
- VALUE val = value; \
1071
- ca_size_t count = 0; \
1072
- ca_size_t value_count = 0; \
1073
- ca_size_t i; \
1074
- if ( m ) { \
1075
- for (i=ca->elements; i; i--) {\
1076
- if ( ! *m++ ) { \
1077
- if ( rb_equal(*ptr, val) ) { \
1078
- value_count++; \
1079
- } \
1080
- } \
1081
- else { \
1082
- count++; \
1083
- } \
1084
- ptr++; \
1085
- } \
1086
- } \
1087
- else { \
1088
- for (i=ca->elements; i; i--) { \
1089
- if ( rb_equal(*ptr, val) ) { \
1090
- value_count++; \
1091
- } \
1092
- ptr++; \
1093
- } \
1094
- } \
1095
- if ( ( ! NIL_P(rmin_count) ) && count > min_count ) { \
1096
- out = ( NIL_P(rfval) ) ? CA_UNDEF : rfval; \
1097
- } \
1098
- else { \
1099
- out = SIZE2NUM(value_count); \
1100
- } \
1101
- }
1102
-
1103
- static VALUE
1104
- rb_ca_count_equal (int argc, VALUE *argv, VALUE self)
1105
- {
1106
- volatile VALUE out, value, rmin_count = Qnil, rfval = Qnil;
1107
- CArray *ca;
1108
- ca_size_t min_count;
1109
-
1110
- rb_scan_args(argc, argv, "12", (VALUE *) &value, (VALUE *) &rmin_count, (VALUE *) &rfval);
1111
-
1112
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1113
-
1114
- if ( ca->elements == 0 ) {
1115
- return ( NIL_P(rfval) ) ? CA_UNDEF : rfval;
1116
- }
1117
-
1118
- min_count = ( NIL_P(rmin_count) || ! ca_has_mask(ca) ) ?
1119
- ca->elements - 1 : NUM2SIZE(rmin_count);
1120
-
1121
- if ( min_count < 0 ) {
1122
- min_count += ca->elements;
1123
- }
1124
-
1125
- ca_attach(ca);
1126
-
1127
- switch ( ca->data_type ) {
1128
- case CA_FIXLEN: proc_count_equal_data(); break;
1129
- case CA_BOOLEAN:
1130
- case CA_INT8: proc_count_equal(int8_t,NUM2LONG); break;
1131
- case CA_UINT8: proc_count_equal(uint8_t,NUM2ULONG); break;
1132
- case CA_INT16: proc_count_equal(int16_t,NUM2LONG); break;
1133
- case CA_UINT16: proc_count_equal(uint16_t,NUM2ULONG); break;
1134
- case CA_INT32: proc_count_equal(int32_t,NUM2LONG); break;
1135
- case CA_UINT32: proc_count_equal(uint32_t,NUM2LONG); break;
1136
- case CA_INT64: proc_count_equal(int64_t,NUM2LL); break;
1137
- case CA_UINT64: proc_count_equal(uint64_t,NUM2LL); break;
1138
- case CA_FLOAT32: proc_count_equal(float32_t,NUM2DBL); break;
1139
- case CA_FLOAT64: proc_count_equal(float64_t,NUM2DBL); break;
1140
- case CA_FLOAT128: proc_count_equal(float128_t,NUM2DBL); break;
1141
- #ifdef HAVE_COMPLEX_H
1142
- case CA_CMPLX64: proc_count_equal(cmplx64_t,NUM2CC); break;
1143
- case CA_CMPLX128: proc_count_equal(cmplx128_t,NUM2CC); break;
1144
- case CA_CMPLX256: proc_count_equal(cmplx256_t,NUM2CC); break;
1145
- #endif
1146
- case CA_OBJECT: proc_count_equal_object(); break;
1147
- default: rb_raise(rb_eCADataTypeError, "invalid data type");
1148
- }
1149
-
1150
- ca_detach(ca);
1151
-
1152
- return out;
1153
- }
1154
-
1155
- /* ----------------------------------------------------------------- */
1156
-
1157
- #define proc_count_equiv(type,from,nabs) \
1158
- { \
1159
- type *ptr = (type *) ca->ptr; \
1160
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
1161
- type val = (type) from(value); \
1162
- double rtol = fabs(NUM2DBL(reps)); \
1163
- double vabs = nabs(val); \
1164
- ca_size_t count = 0; \
1165
- ca_size_t value_count = 0; \
1166
- ca_size_t i; \
1167
- if ( m ) { \
1168
- for (i=ca->elements; i; i--, ptr++) { \
1169
- if ( ! *m++ ) { \
1170
- if ( *ptr == val || \
1171
- nabs(*ptr - val)/(MAX(nabs(*ptr), vabs)) <= rtol )\
1172
- value_count++; \
1173
- } \
1174
- else { \
1175
- count++; \
1176
- } \
1177
- } \
1178
- } \
1179
- else { \
1180
- for (i=ca->elements; i; i--, ptr++) { \
1181
- if ( *ptr == val || \
1182
- nabs(*ptr - val)/MAX(nabs(*ptr), vabs) <= rtol ) { \
1183
- value_count++; \
1184
- } \
1185
- } \
1186
- } \
1187
- if ( ( ! NIL_P(rmin_count) ) && count > min_count ) { \
1188
- out = ( NIL_P(rfval) ) ? CA_UNDEF : rfval; \
1189
- } \
1190
- else { \
1191
- out = SIZE2NUM(value_count); \
1192
- } \
1193
- }
1194
-
1195
- static VALUE
1196
- rb_ca_count_equiv (int argc, VALUE *argv, VALUE self)
1197
- {
1198
- volatile VALUE out, value = argv[0], reps = argv[1],
1199
- rmin_count = Qnil, rfval = Qnil;
1200
- CArray *ca;
1201
- ca_size_t min_count;
1202
-
1203
- if ( argc > 2 ) {
1204
- rb_scan_args(argc, argv, "22", (VALUE *) &value, (VALUE *) &reps, (VALUE *) &rmin_count, (VALUE *) &rfval);
1205
- }
1206
-
1207
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1208
-
1209
- if ( ca->elements == 0 ) {
1210
- return ( NIL_P(rfval) ) ? CA_UNDEF : rfval;
1211
- }
1212
-
1213
- min_count = ( NIL_P(rmin_count) || ! ca_has_mask(ca) ) ?
1214
- ca->elements - 1 : NUM2SIZE(rmin_count);
1215
-
1216
- if ( min_count < 0 ) {
1217
- min_count += ca->elements;
1218
- }
1219
-
1220
- ca_attach(ca);
1221
-
1222
- switch ( ca->data_type ) {
1223
- case CA_BOOLEAN:
1224
- case CA_INT8: proc_count_equiv(int8_t,NUM2LONG,fabs); break;
1225
- case CA_UINT8: proc_count_equiv(uint8_t,NUM2ULONG,fabs); break;
1226
- case CA_INT16: proc_count_equiv(int16_t,NUM2LONG,fabs); break;
1227
- case CA_UINT16: proc_count_equiv(uint16_t,NUM2ULONG,fabs); break;
1228
- case CA_INT32: proc_count_equiv(int32_t,NUM2LONG,fabs); break;
1229
- case CA_UINT32: proc_count_equiv(uint32_t,NUM2LONG,fabs); break;
1230
- case CA_INT64: proc_count_equiv(int64_t,NUM2LL,fabs); break;
1231
- case CA_UINT64: proc_count_equiv(uint64_t,NUM2LL,fabs); break;
1232
- case CA_FLOAT32: proc_count_equiv(float32_t,NUM2DBL,fabs); break;
1233
- case CA_FLOAT64: proc_count_equiv(float64_t,NUM2DBL,fabs); break;
1234
- case CA_FLOAT128: proc_count_equiv(float128_t,NUM2DBL,fabs); break;
1235
- #ifdef HAVE_COMPLEX_H
1236
- case CA_CMPLX64: proc_count_equiv(cmplx64_t,NUM2CC,cabs); break;
1237
- case CA_CMPLX128: proc_count_equiv(cmplx128_t,NUM2CC,cabs); break;
1238
- case CA_CMPLX256: proc_count_equiv(cmplx256_t,NUM2CC,cabs); break;
1239
- #endif
1240
- default: rb_raise(rb_eCADataTypeError, "invalid data type");
1241
- }
1242
-
1243
- ca_detach(ca);
1244
-
1245
- return out;
1246
- }
1247
-
1248
- /* ----------------------------------------------------------------- */
1249
-
1250
- #define proc_count_close(type,from,nabs) \
1251
- { \
1252
- type *ptr = (type *) ca->ptr; \
1253
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
1254
- type val = (type) from(value); \
1255
- double atol = fabs(NUM2DBL(aeps)); \
1256
- ca_size_t count = 0; \
1257
- ca_size_t value_count = 0; \
1258
- ca_size_t i; \
1259
- if ( m ) { \
1260
- for (i=ca->elements; i; i--, ptr++) { \
1261
- if ( ! *m++ ) { \
1262
- if ( nabs(*ptr - val) <= atol ) { \
1263
- value_count++; \
1264
- } \
1265
- } \
1266
- else { \
1267
- count++; \
1268
- } \
1269
- } \
1270
- } \
1271
- else { \
1272
- for (i=ca->elements; i; i--, ptr++) { \
1273
- if ( nabs(*ptr - val) <= atol ) { \
1274
- value_count++; \
1275
- } \
1276
- } \
1277
- } \
1278
- if ( ( ! NIL_P(rmin_count) ) && count > min_count ) { \
1279
- out = ( NIL_P(rfval) ) ? CA_UNDEF : rfval; \
1280
- } \
1281
- else { \
1282
- out = SIZE2NUM(value_count); \
1283
- } \
1284
- }
1285
-
1286
- static VALUE
1287
- rb_ca_count_close (int argc, VALUE *argv, VALUE self)
1288
- {
1289
- volatile VALUE out, value = argv[0], aeps = argv[1],
1290
- rmin_count = Qnil, rfval = Qnil;
1291
- CArray *ca;
1292
- ca_size_t min_count;
1293
-
1294
- if ( argc > 2 ) {
1295
- rb_scan_args(argc, argv, "22", (VALUE *) &value, (VALUE *) &aeps, (VALUE *) &rmin_count, (VALUE *) &rfval);
1296
- }
1297
-
1298
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1299
-
1300
- if ( ca->elements == 0 ) {
1301
- return ( NIL_P(rfval) ) ? CA_UNDEF : rfval;
1302
- }
1303
-
1304
- min_count = ( NIL_P(rmin_count) || ! ca_has_mask(ca) ) ?
1305
- ca->elements - 1 : NUM2SIZE(rmin_count);
1306
-
1307
- if ( min_count < 0 ) {
1308
- min_count += ca->elements;
1309
- }
1310
-
1311
- ca_attach(ca);
1312
-
1313
- switch ( ca->data_type ) {
1314
- case CA_BOOLEAN:
1315
- case CA_INT8: proc_count_close(int8_t,NUM2LONG,fabs); break;
1316
- case CA_UINT8: proc_count_close(uint8_t,NUM2ULONG,fabs); break;
1317
- case CA_INT16: proc_count_close(int16_t,NUM2LONG,fabs); break;
1318
- case CA_UINT16: proc_count_close(uint16_t,NUM2ULONG,fabs); break;
1319
- case CA_INT32: proc_count_close(int32_t,NUM2LONG,fabs); break;
1320
- case CA_UINT32: proc_count_close(uint32_t,NUM2LONG,fabs); break;
1321
- case CA_INT64: proc_count_close(int64_t,NUM2LL,fabs); break;
1322
- case CA_UINT64: proc_count_close(uint64_t,NUM2LL,fabs); break;
1323
- case CA_FLOAT32: proc_count_close(float32_t,NUM2DBL,fabs); break;
1324
- case CA_FLOAT64: proc_count_close(float64_t,NUM2DBL,fabs); break;
1325
- case CA_FLOAT128: proc_count_close(float128_t,NUM2DBL,fabs); break;
1326
- #ifdef HAVE_COMPLEX_H
1327
- case CA_CMPLX64: proc_count_close(cmplx64_t,NUM2CC,cabs); break;
1328
- case CA_CMPLX128: proc_count_close(cmplx128_t,NUM2CC,cabs); break;
1329
- case CA_CMPLX256: proc_count_close(cmplx256_t,NUM2CC,cabs); break;
1330
- #endif
1331
- default: rb_raise(rb_eCADataTypeError, "invalid data type");
1332
- }
1333
-
1334
- ca_detach(ca);
1335
-
1336
- return out;
1337
- }
1338
-
1339
- /* ----------------------------------------------------------------- */
1340
-
1341
- #define proc_all_equal(type,from) \
1342
- { \
1343
- type *ptr = (type *) ca->ptr; \
1344
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
1345
- type val = (type) from(value); \
1346
- ca_size_t i; \
1347
- if ( m ) { \
1348
- for (i=ca->elements; i; i--, ptr++) { \
1349
- if ( ( ! *m++ ) && *ptr != val ) { \
1350
- flag = Qfalse; \
1351
- break; \
1352
- } \
1353
- } \
1354
- } \
1355
- else { \
1356
- for (i=ca->elements; i; i--, ptr++) { \
1357
- if ( *ptr != val ) { \
1358
- flag = Qfalse; \
1359
- break; \
1360
- } \
1361
- } \
1362
- } \
1363
- }
1364
-
1365
- #define proc_all_equal_object() \
1366
- { \
1367
- VALUE *ptr = (VALUE *) ca->ptr; \
1368
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
1369
- VALUE val = value; \
1370
- ca_size_t i; \
1371
- if ( m ) { \
1372
- for (i=ca->elements; i; i--, ptr++) { \
1373
- if ( ( ! *m++ ) && ! rb_equal(*ptr,val) ) { \
1374
- flag = Qfalse; \
1375
- break; \
1376
- } \
1377
- } \
1378
- } \
1379
- else { \
1380
- for (i=ca->elements; i; i--, ptr++) { \
1381
- if ( ! rb_equal(*ptr, val) ) { \
1382
- flag = Qfalse; \
1383
- break; \
1384
- } \
1385
- } \
1386
- } \
1387
- }
1388
-
1389
- #define proc_all_equal_data() \
1390
- { \
1391
- char *ptr = ca->ptr; \
1392
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
1393
- char *val = ALLOCA_N(char, ca->bytes); \
1394
- ca_size_t i; \
1395
- rb_ca_obj2ptr(self, value, val); \
1396
- if ( m ) { \
1397
- for (i=ca->elements; i; i--, ptr+=ca->bytes) { \
1398
- if ( ( ! *m++ ) && memcmp(ptr, val, ca->bytes) ) { \
1399
- flag = Qfalse; \
1400
- break; \
1401
- } \
1402
- } \
1403
- } \
1404
- else { \
1405
- for (i=ca->elements; i; i--, ptr+=ca->bytes) { \
1406
- if ( memcmp(ptr, val, ca->bytes) ) { \
1407
- flag = Qfalse; \
1408
- break; \
1409
- } \
1410
- } \
1411
- } \
1412
- }
1413
-
1414
- static VALUE
1415
- rb_ca_all_equal_p (int argc, VALUE *argv, VALUE self)
1416
- {
1417
- volatile VALUE value;
1418
- volatile VALUE flag = Qtrue;
1419
- CArray *ca;
1420
-
1421
- rb_scan_args(argc, argv, "1", (VALUE *) &value);
1422
-
1423
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1424
-
1425
- ca_attach(ca);
1426
-
1427
- switch ( ca->data_type ) {
1428
- case CA_FIXLEN: proc_all_equal_data(); break;
1429
- case CA_BOOLEAN:
1430
- case CA_INT8: proc_all_equal(int8_t,NUM2LONG); break;
1431
- case CA_UINT8: proc_all_equal(uint8_t,NUM2ULONG); break;
1432
- case CA_INT16: proc_all_equal(int16_t,NUM2LONG); break;
1433
- case CA_UINT16: proc_all_equal(uint16_t,NUM2ULONG); break;
1434
- case CA_INT32: proc_all_equal(int32_t,NUM2LONG); break;
1435
- case CA_UINT32: proc_all_equal(uint32_t,NUM2ULONG); break;
1436
- case CA_INT64: proc_all_equal(int64_t,NUM2LL); break;
1437
- case CA_UINT64: proc_all_equal(uint64_t,NUM2ULL); break;
1438
- case CA_FLOAT32: proc_all_equal(float32_t,NUM2DBL); break;
1439
- case CA_FLOAT64: proc_all_equal(float64_t,NUM2DBL); break;
1440
- case CA_FLOAT128: proc_all_equal(float128_t,NUM2DBL); break;
1441
- #ifdef HAVE_COMPLEX_H
1442
- case CA_CMPLX64: proc_all_equal(cmplx64_t,NUM2CC); break;
1443
- case CA_CMPLX128: proc_all_equal(cmplx128_t,NUM2CC); break;
1444
- case CA_CMPLX256: proc_all_equal(cmplx256_t,NUM2CC); break;
1445
- #endif
1446
- case CA_OBJECT: proc_all_equal_object(); break;
1447
- default: rb_raise(rb_eCADataTypeError, "invalid data type");
1448
- }
1449
-
1450
- ca_detach(ca);
1451
-
1452
- return flag;
1453
- }
1454
-
1455
- /* ----------------------------------------------------------------- */
1456
-
1457
- #define proc_all_equiv(type,from,nabs) \
1458
- { \
1459
- type *ptr = (type *) ca->ptr; \
1460
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
1461
- type val = (type) from(value); \
1462
- double rtol = fabs(NUM2DBL(reps)); \
1463
- double vabs = nabs(val); \
1464
- ca_size_t i; \
1465
- if ( m ) { \
1466
- for (i=ca->elements; i; i--, ptr++) { \
1467
- if ( ! *m++ ) { \
1468
- if ( *ptr != val && \
1469
- nabs(*ptr - val)/MAX(nabs(*ptr), vabs) > rtol ) {\
1470
- flag = Qfalse; \
1471
- break; \
1472
- } \
1473
- } \
1474
- } \
1475
- } \
1476
- else { \
1477
- for (i=ca->elements; i; i--, ptr++) { \
1478
- if ( *ptr != val && \
1479
- nabs(*ptr - val)/MAX(nabs(*ptr), vabs) > rtol ) {\
1480
- flag = Qfalse; \
1481
- break; \
1482
- } \
1483
- } \
1484
- } \
1485
- }
1486
-
1487
- static VALUE
1488
- rb_ca_all_equiv_p (int argc, VALUE *argv, VALUE self)
1489
- {
1490
- volatile VALUE value, reps;
1491
- volatile VALUE flag = Qtrue;
1492
- CArray *ca;
1493
-
1494
- rb_scan_args(argc, argv, "2", (VALUE *) &value, (VALUE *) &reps);
1495
-
1496
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1497
-
1498
- ca_attach(ca);
1499
-
1500
- switch ( ca->data_type ) {
1501
- case CA_BOOLEAN:
1502
- case CA_INT8: proc_all_equiv(int8_t,NUM2LONG,fabs); break;
1503
- case CA_UINT8: proc_all_equiv(uint8_t,NUM2ULONG,fabs); break;
1504
- case CA_INT16: proc_all_equiv(int16_t,NUM2LONG,fabs); break;
1505
- case CA_UINT16: proc_all_equiv(uint16_t,NUM2ULONG,fabs); break;
1506
- case CA_INT32: proc_all_equiv(int32_t,NUM2LONG,fabs); break;
1507
- case CA_UINT32: proc_all_equiv(uint32_t,NUM2ULONG,fabs); break;
1508
- case CA_INT64: proc_all_equiv(int64_t,NUM2LL,fabs); break;
1509
- case CA_UINT64: proc_all_equiv(uint64_t,NUM2ULL,fabs); break;
1510
- case CA_FLOAT32: proc_all_equiv(float32_t,NUM2DBL,fabs); break;
1511
- case CA_FLOAT64: proc_all_equiv(float64_t,NUM2DBL,fabs); break;
1512
- case CA_FLOAT128: proc_all_equiv(float128_t,NUM2DBL,fabs); break;
1513
- #ifdef HAVE_COMPLEX_H
1514
- case CA_CMPLX64: proc_all_equiv(cmplx64_t,NUM2CC,cabs); break;
1515
- case CA_CMPLX128: proc_all_equiv(cmplx128_t,NUM2CC,cabs); break;
1516
- case CA_CMPLX256: proc_all_equiv(cmplx256_t,NUM2CC,cabs); break;
1517
- #endif
1518
- default: rb_raise(rb_eCADataTypeError, "invalid data type");
1519
- }
1520
-
1521
- ca_detach(ca);
1522
-
1523
- return flag;
1524
- }
1525
-
1526
- /* ----------------------------------------------------------------- */
1527
-
1528
- #define proc_all_close(type,from,nabs) \
1529
- { \
1530
- type *ptr = (type *) ca->ptr; \
1531
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
1532
- type val = (type) from(value); \
1533
- double atol = fabs(NUM2DBL(aeps)); \
1534
- ca_size_t i; \
1535
- if ( m ) { \
1536
- for (i=ca->elements; i; i--, ptr++) { \
1537
- if ( ! *m++ ) { \
1538
- if ( nabs(*ptr - val) > atol ) {\
1539
- flag = Qfalse; \
1540
- break; \
1541
- } \
1542
- } \
1543
- } \
1544
- } \
1545
- else { \
1546
- for (i=ca->elements; i; i--, ptr++) { \
1547
- if ( nabs(*ptr - val) > atol ) {\
1548
- flag = Qfalse; \
1549
- break; \
1550
- } \
1551
- } \
1552
- } \
1553
- }
1554
-
1555
- static VALUE
1556
- rb_ca_all_close_p (int argc, VALUE *argv, VALUE self)
1557
- {
1558
- volatile VALUE value, aeps;
1559
- volatile VALUE flag = Qtrue;
1560
- CArray *ca;
1561
-
1562
- rb_scan_args(argc, argv, "2", (VALUE *) &value, (VALUE *) &aeps);
1563
-
1564
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1565
-
1566
- ca_attach(ca);
1567
-
1568
- switch ( ca->data_type ) {
1569
- case CA_BOOLEAN:
1570
- case CA_INT8: proc_all_close(int8_t,NUM2LONG,fabs); break;
1571
- case CA_UINT8: proc_all_close(uint8_t,NUM2ULONG,fabs); break;
1572
- case CA_INT16: proc_all_close(int16_t,NUM2LONG,fabs); break;
1573
- case CA_UINT16: proc_all_close(uint16_t,NUM2ULONG,fabs); break;
1574
- case CA_INT32: proc_all_close(int32_t,NUM2LONG,fabs); break;
1575
- case CA_UINT32: proc_all_close(uint32_t,NUM2ULONG,fabs); break;
1576
- case CA_INT64: proc_all_close(int64_t,NUM2LL,fabs); break;
1577
- case CA_UINT64: proc_all_close(uint64_t,NUM2ULL,fabs); break;
1578
- case CA_FLOAT32: proc_all_close(float32_t,NUM2DBL,fabs); break;
1579
- case CA_FLOAT64: proc_all_close(float64_t,NUM2DBL,fabs); break;
1580
- case CA_FLOAT128: proc_all_close(float128_t,NUM2DBL,fabs); break;
1581
- #ifdef HAVE_COMPLEX_H
1582
- case CA_CMPLX64: proc_all_close(cmplx64_t,NUM2CC,cabs); break;
1583
- case CA_CMPLX128: proc_all_close(cmplx128_t,NUM2CC,cabs); break;
1584
- case CA_CMPLX256: proc_all_close(cmplx256_t,NUM2CC,cabs); break;
1585
- #endif
1586
- default: rb_raise(rb_eCADataTypeError, "invalid data type");
1587
- }
1588
-
1589
- ca_detach(ca);
1590
-
1591
- return flag;
1592
- }
1593
-
1594
- /* ----------------------------------------------------------------- */
1595
-
1596
- #define proc_any_equal(type,from) \
1597
- { \
1598
- type *ptr = (type *) ca->ptr; \
1599
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
1600
- type val = (type) from(value); \
1601
- ca_size_t i; \
1602
- if ( m ) { \
1603
- for (i=ca->elements; i; i--, ptr++) { \
1604
- if ( ( ! *m++ ) && *ptr == val ) { \
1605
- flag = Qtrue; \
1606
- break; \
1607
- } \
1608
- } \
1609
- } \
1610
- else { \
1611
- for (i=ca->elements; i; i--, ptr++) { \
1612
- if ( *ptr == val ) { \
1613
- flag = Qtrue; \
1614
- break; \
1615
- } \
1616
- } \
1617
- } \
1618
- }
1619
-
1620
- #define proc_any_equal_object() \
1621
- { \
1622
- VALUE *ptr = (VALUE *) ca->ptr; \
1623
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
1624
- VALUE val = value; \
1625
- ca_size_t i; \
1626
- if ( m ) { \
1627
- for (i=ca->elements; i; i--, ptr++) { \
1628
- if ( ( ! *m++ ) && rb_equal(*ptr,val) ) { \
1629
- flag = Qtrue; \
1630
- break; \
1631
- } \
1632
- } \
1633
- } \
1634
- else { \
1635
- for (i=ca->elements; i; i--, ptr++) { \
1636
- if ( rb_equal(*ptr, val) ) { \
1637
- flag = Qtrue; \
1638
- break; \
1639
- } \
1640
- } \
1641
- } \
1642
- }
1643
-
1644
- #define proc_any_equal_data() \
1645
- { \
1646
- char *ptr = ca->ptr; \
1647
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
1648
- char *val = ALLOCA_N(char, ca->bytes); \
1649
- ca_size_t i; \
1650
- rb_ca_obj2ptr(self, value, val); \
1651
- if ( m ) { \
1652
- for (i=ca->elements; i; i--, ptr+=ca->bytes) \
1653
- if ( ( ! *m++ ) && ! memcmp(ptr, val, ca->bytes) ) { \
1654
- flag = Qtrue; \
1655
- break; \
1656
- } \
1657
- } \
1658
- else { \
1659
- for (i=ca->elements; i; i--, ptr+=ca->bytes) \
1660
- if ( ! memcmp(ptr, val, ca->bytes) ) { \
1661
- flag = Qtrue; \
1662
- break; \
1663
- } \
1664
- } \
1665
- }
1666
-
1667
- static VALUE
1668
- rb_ca_any_equal_p (int argc, VALUE *argv, VALUE self)
1669
- {
1670
- volatile VALUE value;
1671
- volatile VALUE flag = Qfalse;
1672
- CArray *ca;
1673
-
1674
- rb_scan_args(argc, argv, "1", (VALUE *) &value);
1675
-
1676
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1677
-
1678
- ca_attach(ca);
1679
-
1680
- switch ( ca->data_type ) {
1681
- case CA_FIXLEN: proc_any_equal_data(); break;
1682
- case CA_BOOLEAN:
1683
- case CA_INT8: proc_any_equal(int8_t,NUM2LONG); break;
1684
- case CA_UINT8: proc_any_equal(uint8_t,NUM2ULONG); break;
1685
- case CA_INT16: proc_any_equal(int16_t,NUM2LONG); break;
1686
- case CA_UINT16: proc_any_equal(uint16_t,NUM2ULONG); break;
1687
- case CA_INT32: proc_any_equal(int32_t,NUM2LONG); break;
1688
- case CA_UINT32: proc_any_equal(uint32_t,NUM2ULONG); break;
1689
- case CA_INT64: proc_any_equal(int64_t,NUM2LL); break;
1690
- case CA_UINT64: proc_any_equal(uint64_t,NUM2ULL); break;
1691
- case CA_FLOAT32: proc_any_equal(float32_t,NUM2DBL); break;
1692
- case CA_FLOAT64: proc_any_equal(float64_t,NUM2DBL); break;
1693
- case CA_FLOAT128: proc_any_equal(float128_t,NUM2DBL); break;
1694
- #ifdef HAVE_COMPLEX_H
1695
- case CA_CMPLX64: proc_any_equal(cmplx64_t,NUM2CC); break;
1696
- case CA_CMPLX128: proc_any_equal(cmplx128_t,NUM2CC); break;
1697
- case CA_CMPLX256: proc_any_equal(cmplx256_t,NUM2CC); break;
1698
- #endif
1699
- case CA_OBJECT: proc_any_equal_object(); break;
1700
- default: rb_raise(rb_eCADataTypeError, "invalid data type");
1701
- }
1702
-
1703
- ca_detach(ca);
1704
-
1705
- return flag;
1706
- }
1707
-
1708
- /* ----------------------------------------------------------------- */
1709
-
1710
- #define proc_any_equiv(type,from,nabs) \
1711
- { \
1712
- type *ptr = (type *) ca->ptr; \
1713
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
1714
- type val = (type) from(value); \
1715
- double rtol = fabs(NUM2DBL(reps)); \
1716
- double vabs = nabs(val); \
1717
- ca_size_t i; \
1718
- if ( m ) { \
1719
- for (i=ca->elements; i; i--, ptr++) { \
1720
- if ( ! *m++ ) { \
1721
- if ( *ptr == val || \
1722
- nabs(*ptr - val)/MAX(nabs(*ptr), vabs) <= rtol ) {\
1723
- flag = Qtrue; \
1724
- break; \
1725
- } \
1726
- } \
1727
- } \
1728
- } \
1729
- else { \
1730
- for (i=ca->elements; i; i--, ptr++) { \
1731
- if ( *ptr == val || \
1732
- nabs(*ptr - val)/MAX(nabs(*ptr), vabs) <= rtol ) {\
1733
- flag = Qtrue; \
1734
- break; \
1735
- } \
1736
- } \
1737
- } \
1738
- }
1739
-
1740
- static VALUE
1741
- rb_ca_any_equiv_p (int argc, VALUE *argv, VALUE self)
1742
- {
1743
- volatile VALUE value, reps;
1744
- volatile VALUE flag = Qfalse;
1745
- CArray *ca;
1746
-
1747
- rb_scan_args(argc, argv, "2", (VALUE *) &value, (VALUE *) &reps);
1748
-
1749
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1750
-
1751
- ca_attach(ca);
1752
-
1753
- switch ( ca->data_type ) {
1754
- case CA_BOOLEAN:
1755
- case CA_INT8: proc_any_equiv(int8_t,NUM2LONG,fabs); break;
1756
- case CA_UINT8: proc_any_equiv(uint8_t,NUM2ULONG,fabs); break;
1757
- case CA_INT16: proc_any_equiv(int16_t,NUM2LONG,fabs); break;
1758
- case CA_UINT16: proc_any_equiv(uint16_t,NUM2ULONG,fabs); break;
1759
- case CA_INT32: proc_any_equiv(int32_t,NUM2LONG,fabs); break;
1760
- case CA_UINT32: proc_any_equiv(uint32_t,NUM2ULONG,fabs); break;
1761
- case CA_INT64: proc_any_equiv(int64_t,NUM2LL,fabs); break;
1762
- case CA_UINT64: proc_any_equiv(uint64_t,NUM2ULL,fabs); break;
1763
- case CA_FLOAT32: proc_any_equiv(float32_t,NUM2DBL,fabs); break;
1764
- case CA_FLOAT64: proc_any_equiv(float64_t,NUM2DBL,fabs); break;
1765
- case CA_FLOAT128: proc_any_equiv(float128_t,NUM2DBL,fabs); break;
1766
- #ifdef HAVE_COMPLEX_H
1767
- case CA_CMPLX64: proc_any_equiv(cmplx64_t,NUM2CC,cabs); break;
1768
- case CA_CMPLX128: proc_any_equiv(cmplx128_t,NUM2CC,cabs); break;
1769
- case CA_CMPLX256: proc_any_equiv(cmplx256_t,NUM2CC,cabs); break;
1770
- #endif
1771
- default: rb_raise(rb_eCADataTypeError, "invalid data type");
1772
- }
1773
-
1774
- ca_detach(ca);
1775
-
1776
- return flag;
1777
- }
1778
-
1779
- /* ----------------------------------------------------------------- */
1780
-
1781
- #define proc_any_close(type,from,nabs) \
1782
- { \
1783
- type *ptr = (type *) ca->ptr; \
1784
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
1785
- type val = (type) from(value); \
1786
- double atol = fabs(NUM2DBL(aeps)); \
1787
- ca_size_t i; \
1788
- if ( m ) { \
1789
- for (i=ca->elements; i; i--, ptr++) { \
1790
- if ( ! *m++ ) { \
1791
- if ( nabs(*ptr - val) <= atol ) {\
1792
- flag = Qtrue; \
1793
- break; \
1794
- } \
1795
- } \
1796
- } \
1797
- } \
1798
- else { \
1799
- for (i=ca->elements; i; i--, ptr++) { \
1800
- if ( nabs(*ptr - val) <= atol ) {\
1801
- flag = Qtrue; \
1802
- break; \
1803
- } \
1804
- } \
1805
- } \
1806
- }
1807
-
1808
- static VALUE
1809
- rb_ca_any_close_p (int argc, VALUE *argv, VALUE self)
1810
- {
1811
- volatile VALUE value, aeps;
1812
- volatile VALUE flag = Qfalse;
1813
- CArray *ca;
1814
-
1815
- rb_scan_args(argc, argv, "2", (VALUE *) &value, (VALUE *) &aeps);
1816
-
1817
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1818
-
1819
- ca_attach(ca);
1820
-
1821
- switch ( ca->data_type ) {
1822
- case CA_BOOLEAN:
1823
- case CA_INT8: proc_any_close(int8_t,NUM2LONG,fabs); break;
1824
- case CA_UINT8: proc_any_close(uint8_t,NUM2ULONG,fabs); break;
1825
- case CA_INT16: proc_any_close(int16_t,NUM2LONG,fabs); break;
1826
- case CA_UINT16: proc_any_close(uint16_t,NUM2ULONG,fabs); break;
1827
- case CA_INT32: proc_any_close(int32_t,NUM2LONG,fabs); break;
1828
- case CA_UINT32: proc_any_close(uint32_t,NUM2ULONG,fabs); break;
1829
- case CA_INT64: proc_any_close(int64_t,NUM2LL,fabs); break;
1830
- case CA_UINT64: proc_any_close(uint64_t,NUM2ULL,fabs); break;
1831
- case CA_FLOAT32: proc_any_close(float32_t,NUM2DBL,fabs); break;
1832
- case CA_FLOAT64: proc_any_close(float64_t,NUM2DBL,fabs); break;
1833
- case CA_FLOAT128: proc_any_close(float128_t,NUM2DBL,fabsl); break;
1834
- #ifdef HAVE_COMPLEX_H
1835
- case CA_CMPLX64: proc_any_close(cmplx64_t,NUM2CC,cabs); break;
1836
- case CA_CMPLX128: proc_any_close(cmplx128_t,NUM2CC,cabs); break;
1837
- case CA_CMPLX256: proc_any_close(cmplx256_t,NUM2CC,cabsl); break;
1838
- #endif
1839
- default: rb_raise(rb_eCADataTypeError, "invalid data type");
1840
- }
1841
-
1842
- ca_detach(ca);
1843
-
1844
- return flag;
1845
- }
1846
-
1847
- static VALUE
1848
- rb_ca_none_equal_p (int argc, VALUE *argv, VALUE self)
1849
- {
1850
- return rb_ca_any_equal_p(argc, argv, self) ? Qfalse : Qtrue;
1851
- }
1852
-
1853
- static VALUE
1854
- rb_ca_none_equiv_p (int argc, VALUE *argv, VALUE self)
1855
- {
1856
- return rb_ca_any_equiv_p(argc, argv, self) ? Qfalse : Qtrue;
1857
- }
1858
-
1859
- static VALUE
1860
- rb_ca_none_close_p (int argc, VALUE *argv, VALUE self)
1861
- {
1862
- return rb_ca_any_close_p(argc, argv, self) ? Qfalse : Qtrue;
1863
- }
1864
-
1865
- /* ----------------------------------------------------------------- */
1866
-
1867
- #define proc_histogram(type, from) \
1868
- { \
1869
- type *ptr = (type *) ca->ptr; \
1870
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
1871
- double min = NUM2DBL(vmin); \
1872
- double max = NUM2DBL(vmax); \
1873
- double diff = (max - min)/icls; \
1874
- double trial; \
1875
- ca_size_t i; \
1876
- for (i=0; i<=icls+1; i++) \
1877
- cls[i] = diff*i + min; \
1878
- for (i=0; i<ca->elements; i++, ptr++) { \
1879
- if ( m && *m++ ) continue; \
1880
- trial = (double)from(*ptr); \
1881
- if ( diff > 0 && trial >= min && trial <= max ) { \
1882
- idx = (ca_size_t) ( (trial - min)/diff ); \
1883
- hist[idx]++; \
1884
- } \
1885
- else if ( diff < 0 && trial >= max && trial <= min ) { \
1886
- idx = (ca_size_t) ( (trial - min)/diff ); \
1887
- hist[idx]++; \
1888
- } \
1889
- } \
1890
- }
1891
-
1892
- /*
1893
- static VALUE
1894
- rb_ca_histogram (int argc, VALUE *argv, VALUE self)
1895
- {
1896
- volatile VALUE vnum, vmin, vmax;
1897
- CArray *ca, *co;
1898
- ca_size_t i, idx, icls;
1899
- ca_size_t *hist;
1900
- ca_size_t dim[2] = {0, 3};
1901
- double *cls, *p;
1902
-
1903
- rb_scan_args(argc, argv, "3", &vnum, &vmin, &vmax);
1904
-
1905
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1906
-
1907
- icls = NUM2SIZE(vnum);
1908
-
1909
- if ( icls < 1 ) {
1910
- rb_raise(rb_eArgError, "bin number must be larger than 1");
1911
- }
1912
-
1913
- hist = ALLOC_N(ca_size_t, icls+1);
1914
- cls = ALLOC_N(double, icls+2);
1915
-
1916
- MEMZERO(hist, ca_size_t, icls+1);
1917
- MEMZERO(cls, double, icls+2);
1918
-
1919
- ca_attach(ca);
1920
-
1921
- switch ( ca->data_type ) {
1922
- case CA_BOOLEAN:
1923
- case CA_INT8: proc_histogram(int8_t,); break;
1924
- case CA_UINT8: proc_histogram(uint8_t,); break;
1925
- case CA_INT16: proc_histogram(int16_t,); break;
1926
- case CA_UINT16: proc_histogram(uint16_t,); break;
1927
- case CA_INT32: proc_histogram(int32_t,); break;
1928
- case CA_UINT32: proc_histogram(uint32_t,); break;
1929
- case CA_INT64: proc_histogram(int64_t,); break;
1930
- case CA_UINT64: proc_histogram(uint64_t,); break;
1931
- case CA_FLOAT32: proc_histogram(float32_t,); break;
1932
- case CA_FLOAT64: proc_histogram(float64_t,); break;
1933
- case CA_FLOAT128: proc_histogram(float128_t,); break;
1934
- case CA_OBJECT: proc_histogram(VALUE,NUM2DBL); break;
1935
- default: rb_raise(rb_eCADataTypeError, "invalid data type");
1936
- }
1937
-
1938
- ca_detach(ca);
1939
-
1940
- dim[0] = icls+1;
1941
-
1942
- co = carray_new(CA_FLOAT64, 2, dim, 0, NULL);
1943
-
1944
- p = (double *) co->ptr;
1945
-
1946
- for (i=0; i<icls+1; i++) {
1947
- *p++ = cls[i];
1948
- *p++ = cls[i+1];
1949
- *p++ = (double) hist[i];
1950
- }
1951
-
1952
- free(hist);
1953
- free(cls);
1954
-
1955
- return ca_wrap_struct(co);
1956
- }
1957
- */
1958
-
1959
- /* ----------------------------------------------------------------- */
1960
-
1961
- #define proc_grade(type, from) \
1962
- { \
1963
- ca_size_t *dst = (ca_size_t *) sa->ptr; \
1964
- boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
1965
- boolean8_t *dm = (sa->mask) ? (boolean8_t*) sa->mask->ptr : NULL; \
1966
- type *ptr = (type *) ca->ptr; \
1967
- double min = NUM2DBL(vmin); \
1968
- double max = min + (NUM2DBL(vmax)-min)*(((double)icls)/(icls-1)); \
1969
- type miss = 0; \
1970
- double diff = max - min; \
1971
- double trial; \
1972
- ca_size_t i; \
1973
- if ( min > max ) { \
1974
- rb_raise(rb_eRuntimeError, "invalid (min, max) range"); \
1975
- } \
1976
- if ( min != max ) { \
1977
- for (i=0; i<ca->elements; i++, ptr++) { \
1978
- if ( m ) { \
1979
- miss = *m++; \
1980
- } \
1981
- trial = from(*ptr); \
1982
- if ( miss ) { \
1983
- *dm = 1; \
1984
- } \
1985
- else if ( isnan(trial) ) { \
1986
- if ( ! dm ) { \
1987
- ca_create_mask(sa); \
1988
- dm = (boolean8_t*) sa->mask->ptr; \
1989
- dm += i; \
1990
- *dm = 1; \
1991
- } \
1992
- *dm = 1; \
1993
- } \
1994
- else { \
1995
- *dst = (ca_size_t) floor( ((trial-min)/diff) * icls ); \
1996
- } \
1997
- dst++; \
1998
- if ( dm ) { \
1999
- dm++; \
2000
- } \
2001
- } \
2002
- } \
2003
- }
2004
-
2005
- static VALUE
2006
- rb_ca_grade (int argc, VALUE *argv, VALUE self)
2007
- {
2008
- volatile VALUE out, vnum, vmin, vmax;
2009
- CArray *ca, *sa;
2010
- ca_size_t icls;
2011
-
2012
- rb_scan_args(argc, argv, "12", (VALUE *) &vnum, (VALUE *) &vmin, (VALUE *) &vmax);
2013
-
2014
- if ( NIL_P(vmin) ) {
2015
- vmin = rb_funcall(self, rb_intern("min"), 0);
2016
- }
2017
-
2018
- if ( NIL_P(vmax) ) {
2019
- vmax = rb_funcall(self, rb_intern("max"), 0);
2020
- }
2021
-
2022
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
2023
-
2024
- icls = NUM2LONG(vnum);
2025
-
2026
- if ( icls < 1 ) {
2027
- rb_raise(rb_eArgError, "bin number must be larger than 1");
2028
- }
2029
-
2030
- out = rb_carray_new_safe(CA_SIZE, ca->ndim, ca->dim, 0, NULL);
2031
- TypedData_Get_Struct(out, CArray, &carray_data_type, sa);
2032
-
2033
- ca_attach(ca);
2034
-
2035
- if ( ca_has_mask(ca) ) {
2036
- ca_create_mask(sa);
2037
- ca_setup_mask(sa, ca->mask);
2038
- }
2039
-
2040
- switch ( ca->data_type ) {
2041
- case CA_BOOLEAN:
2042
- case CA_INT8: proc_grade(int8_t, ); break;
2043
- case CA_UINT8: proc_grade(uint8_t, ); break;
2044
- case CA_INT16: proc_grade(int16_t, ); break;
2045
- case CA_UINT16: proc_grade(uint16_t, ); break;
2046
- case CA_INT32: proc_grade(int32_t, ); break;
2047
- case CA_UINT32: proc_grade(uint32_t, ); break;
2048
- case CA_INT64: proc_grade(int64_t, ); break;
2049
- case CA_UINT64: proc_grade(uint64_t, ); break;
2050
- case CA_FLOAT32: proc_grade(float32_t, ); break;
2051
- case CA_FLOAT64: proc_grade(float64_t, ); break;
2052
- case CA_FLOAT128: proc_grade(float128_t, ); break;
2053
- case CA_OBJECT: proc_grade(VALUE,NUM2DBL); break;
2054
- default: rb_raise(rb_eCADataTypeError, "invalid data type");
2055
- }
2056
-
2057
- ca_detach(ca);
2058
-
2059
- return out;
2060
- }
2061
-
2062
- void
2063
- Init_carray_stat ()
2064
- {
2065
- rb_define_method(rb_cCArray, "wsum", rb_ca_wsum, -1);
2066
- rb_define_method(rb_cCArray, "wmean", rb_ca_wmean, -1);
2067
- rb_define_method(rb_cCArray, "variancep", rb_ca_variancep, -1);
2068
- rb_define_method(rb_cCArray, "variance", rb_ca_variance, -1);
2069
-
2070
- rb_define_method(rb_cCArray, "cummin", rb_ca_cummin, -1);
2071
- rb_define_method(rb_cCArray, "cummax", rb_ca_cummax, -1);
2072
- rb_define_method(rb_cCArray, "cumprod", rb_ca_cumprod, -1);
2073
- rb_define_method(rb_cCArray, "cumwsum", rb_ca_cumwsum, -1);
2074
-
2075
- rb_define_method(rb_cCArray, "count_true", rb_ca_count_true, -1);
2076
- rb_define_method(rb_cCArray, "count_false", rb_ca_count_false, -1);
2077
- rb_define_method(rb_cCArray, "count", rb_ca_count_equal, -1);
2078
- rb_define_method(rb_cCArray, "count_equal", rb_ca_count_equal, -1);
2079
- rb_define_method(rb_cCArray, "count_equiv", rb_ca_count_equiv, -1);
2080
- rb_define_method(rb_cCArray, "count_close", rb_ca_count_close, -1);
2081
-
2082
- rb_define_method(rb_cCArray, "all_equal?", rb_ca_all_equal_p, -1);
2083
- rb_define_method(rb_cCArray, "all_equiv?", rb_ca_all_equiv_p, -1);
2084
- rb_define_method(rb_cCArray, "all_close?", rb_ca_all_close_p, -1);
2085
-
2086
- rb_define_method(rb_cCArray, "any_equal?", rb_ca_any_equal_p, -1);
2087
- rb_define_method(rb_cCArray, "any_equiv?", rb_ca_any_equiv_p, -1);
2088
- rb_define_method(rb_cCArray, "any_close?", rb_ca_any_close_p, -1);
2089
- rb_define_method(rb_cCArray, "none_equal?", rb_ca_none_equal_p, -1);
2090
- rb_define_method(rb_cCArray, "none_equiv?", rb_ca_none_equiv_p, -1);
2091
- rb_define_method(rb_cCArray, "none_close?", rb_ca_none_close_p, -1);
2092
-
2093
- /* rb_define_method(rb_cCArray, "histogram", rb_ca_histogram, -1); */
2094
- rb_define_method(rb_cCArray, "grade", rb_ca_grade, -1);
2095
- rb_define_method(rb_cCArray, "gradate", rb_ca_grade, -1);
2096
- rb_define_method(rb_cCArray, "quantize", rb_ca_grade, -1);
2097
-
2098
- }
2099
-
2100
-