carray 2.0.0 → 3.0.0

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 (339) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +5 -25
  3. data/CHANGELOG.md +16 -0
  4. data/LICENSE +1 -1
  5. data/NEWS.md +3 -0
  6. data/README.md +128 -44
  7. data/carray.gemspec +22 -24
  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 +1208 -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 +125 -0
  15. data/ext/ca_binop_dispatch.h +159 -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 +241 -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 +4321 -0
  26. data/ext/ca_kernel_iterator.h +2603 -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 +809 -0
  33. data/ext/ca_obj_binop.c +892 -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 +965 -0
  39. data/ext/ca_obj_face.c +670 -0
  40. data/ext/ca_obj_face.h +247 -0
  41. data/ext/ca_obj_fake.c +228 -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 +306 -0
  45. data/ext/ca_obj_grid.c +858 -440
  46. data/ext/ca_obj_meld.c +1034 -0
  47. data/ext/ca_obj_moncmp.c +569 -0
  48. data/ext/ca_obj_monop.c +1111 -0
  49. data/ext/ca_obj_object.c +774 -298
  50. data/ext/ca_obj_record.c +468 -0
  51. data/ext/ca_obj_reduce.c +97 -82
  52. data/ext/ca_obj_refer.c +569 -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 +616 -0
  56. data/ext/ca_obj_select.c +344 -296
  57. data/ext/ca_obj_select_axis.c +1296 -0
  58. data/ext/ca_obj_shift.c +230 -792
  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 +2501 -0
  62. data/ext/ca_obj_string.c +268 -0
  63. data/ext/ca_obj_tile.c +614 -0
  64. data/ext/ca_obj_time.c +546 -0
  65. data/ext/ca_obj_timedelta.c +435 -0
  66. data/ext/ca_obj_transpose.c +62 -516
  67. data/ext/ca_obj_triop.c +746 -0
  68. data/ext/ca_obj_unbound_repeat.c +208 -241
  69. data/ext/ca_obj_window.c +1131 -563
  70. data/ext/ca_op_byte_swap.c +175 -0
  71. data/ext/ca_op_ipower.c +319 -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 +430 -0
  75. data/ext/ca_sweep_engine.h +157 -0
  76. data/ext/ca_transform_common.c +228 -0
  77. data/ext/ca_triop_dispatch.c +55 -0
  78. data/ext/ca_triop_dispatch.h +62 -0
  79. data/ext/carray.h +795 -402
  80. data/ext/carray_access.c +831 -711
  81. data/ext/carray_attribute.c +98 -330
  82. data/ext/carray_bincount.c +255 -0
  83. data/ext/carray_broadcast.c +283 -0
  84. data/ext/carray_call_cfunc.c +1360 -828
  85. data/ext/carray_call_cfunc.h +160 -0
  86. data/ext/carray_cast.c +1212 -301
  87. data/ext/carray_cast_func.rb +81 -40
  88. data/ext/carray_class.c +53 -63
  89. data/ext/carray_config.h +28 -0
  90. data/ext/carray_conversion.c +350 -346
  91. data/ext/carray_copy.c +156 -268
  92. data/ext/carray_core.c +1342 -199
  93. data/ext/carray_count.c +312 -0
  94. data/ext/carray_data_type.c +43 -19
  95. data/ext/carray_element.c +585 -213
  96. data/ext/carray_factorize.c +2542 -0
  97. data/ext/carray_generate.c +230 -559
  98. data/ext/carray_histogram.c +490 -0
  99. data/ext/carray_hold.c +228 -0
  100. data/ext/carray_index_classifier.c +1035 -0
  101. data/ext/carray_index_classifier.h +27 -0
  102. data/ext/carray_internal.h +120 -0
  103. data/ext/carray_kernels_bincmp.c +4445 -0
  104. data/ext/carray_kernels_binop.c +10979 -0
  105. data/ext/carray_kernels_init.c +36 -0
  106. data/ext/carray_kernels_map.c +3466 -0
  107. data/ext/carray_kernels_moncmp.c +2096 -0
  108. data/ext/carray_kernels_monop.c +18312 -0
  109. data/ext/carray_kernels_reduce_aggregate.c +25836 -0
  110. data/ext/carray_kernels_reduce_boolean.c +329 -0
  111. data/ext/carray_kernels_reduce_cumulative.c +14592 -0
  112. data/ext/carray_kernels_reduce_extreme.c +16947 -0
  113. data/ext/carray_kernels_reduce_variance.c +3909 -0
  114. data/ext/carray_kernels_scan.c +3692 -0
  115. data/ext/carray_kernels_search.c +32137 -0
  116. data/ext/carray_kernels_sort.c +10625 -0
  117. data/ext/carray_kernels_triop.c +1391 -0
  118. data/ext/carray_lazy.c +567 -0
  119. data/ext/carray_loop.c +88 -200
  120. data/ext/carray_mask.c +848 -154
  121. data/ext/carray_math_kernel.h +120 -0
  122. data/ext/carray_mathfunc.c +10 -241
  123. data/ext/carray_median_percentile.c +1257 -0
  124. data/ext/carray_memory_view.c +1625 -0
  125. data/ext/carray_operator.c +1526 -318
  126. data/ext/carray_order.c +664 -1394
  127. data/ext/carray_partition.c +416 -0
  128. data/ext/carray_random.c +518 -0
  129. data/ext/carray_scatter.c +357 -0
  130. data/ext/carray_slab.c +1219 -0
  131. data/ext/carray_slab.h +84 -0
  132. data/ext/carray_sort.c +829 -0
  133. data/ext/carray_sort_kernel.c +620 -0
  134. data/ext/carray_struct.c +695 -0
  135. data/ext/carray_test.c +343 -229
  136. data/ext/carray_undef.c +34 -17
  137. data/ext/carray_utils.c +175 -74
  138. data/ext/extconf.rb +216 -55
  139. data/ext/mk_call_cfunc.rb +480 -0
  140. data/ext/mkkernel.rb +8842 -0
  141. data/ext/ruby_carray.c +202 -101
  142. data/ext/version.h +4 -14
  143. data/ext/version.rb +5 -13
  144. data/lib/carray/arrow_tensor.rb +401 -0
  145. data/lib/carray/attribute.rb +166 -0
  146. data/lib/carray/autoload_carray.rb +220 -0
  147. data/lib/carray/autoload_method_extension.rb +44 -0
  148. data/lib/carray/axis_group.rb +711 -0
  149. data/lib/carray/basics.rb +481 -0
  150. data/lib/carray/bincount_nd.rb +358 -0
  151. data/lib/carray/block_iterator.rb +604 -0
  152. data/lib/carray/boolean_reduce.rb +109 -0
  153. data/lib/carray/categorical.rb +561 -0
  154. data/lib/carray/categorical_iterator.rb +1062 -0
  155. data/lib/carray/complex.rb +150 -0
  156. data/lib/carray/conditional.rb +216 -0
  157. data/lib/carray/const_string.rb +228 -0
  158. data/lib/carray/construct.rb +139 -328
  159. data/lib/carray/core_extensions.rb +240 -0
  160. data/lib/carray/data_type_extension.rb +233 -0
  161. data/lib/carray/fixlen_string.rb +95 -0
  162. data/lib/carray/frame/concat.rb +132 -0
  163. data/lib/carray/frame/convert.rb +95 -0
  164. data/lib/carray/frame/csv_parser.rb +211 -0
  165. data/lib/carray/frame/frame.rb +649 -0
  166. data/lib/carray/frame/group.rb +186 -0
  167. data/lib/carray/frame/io.rb +164 -0
  168. data/lib/carray/frame/join.rb +248 -0
  169. data/lib/carray/frame/records.rb +99 -0
  170. data/lib/carray/frame/sort.rb +113 -0
  171. data/lib/carray/frame/verbs.rb +299 -0
  172. data/lib/carray/frame.rb +16 -0
  173. data/lib/carray/histogram.rb +512 -0
  174. data/lib/carray/inspect.rb +37 -20
  175. data/lib/carray/iterator.rb +57 -349
  176. data/lib/carray/lazy.rb +889 -0
  177. data/lib/carray/mask_gap_fill.rb +200 -0
  178. data/lib/carray/math.rb +78 -342
  179. data/lib/carray/meld_reduce.rb +289 -0
  180. data/lib/carray/methods/align_addr.rb +116 -0
  181. data/lib/carray/methods/bin.rb +128 -0
  182. data/lib/carray/methods/bincount.rb +87 -0
  183. data/lib/carray/methods/bit_string.rb +92 -0
  184. data/lib/carray/methods/broadcast.rb +63 -0
  185. data/lib/carray/methods/choose.rb +39 -0
  186. data/lib/carray/methods/composition.rb +280 -0
  187. data/lib/carray/methods/gather_nd.rb +206 -0
  188. data/lib/carray/methods/index.rb +39 -0
  189. data/lib/carray/methods/insert_block.rb +99 -0
  190. data/lib/carray/methods/is_in.rb +141 -0
  191. data/lib/carray/methods/join.rb +90 -0
  192. data/lib/carray/methods/locate_addr.rb +47 -0
  193. data/lib/carray/methods/mask_duplicates.rb +41 -0
  194. data/lib/carray/methods/meshgrid.rb +91 -0
  195. data/lib/carray/methods/mode.rb +126 -0
  196. data/lib/carray/methods/nunique.rb +46 -0
  197. data/lib/carray/methods/resize.rb +56 -0
  198. data/lib/carray/methods/snap.rb +156 -0
  199. data/lib/carray/methods/string_format.rb +57 -0
  200. data/lib/carray/methods/unique.rb +47 -0
  201. data/lib/carray/methods/value_counts.rb +71 -0
  202. data/lib/carray/mkmf.rb +124 -101
  203. data/lib/carray/runtime.rb +108 -0
  204. data/lib/carray/serialize.rb +478 -167
  205. data/lib/carray/slab_iterator.rb +292 -0
  206. data/lib/carray/stack.rb +291 -0
  207. data/lib/carray/string.rb +56 -180
  208. data/lib/carray/string_operation_extension.rb +289 -0
  209. data/lib/carray/struct.rb +335 -323
  210. data/lib/carray/struct_builder.rb +697 -0
  211. data/lib/carray/table.rb +41 -2
  212. data/lib/carray/time.rb +2255 -38
  213. data/lib/carray/window_iterator.rb +655 -0
  214. data/lib/carray.rb +55 -57
  215. metadata +163 -130
  216. data/Rakefile +0 -51
  217. data/TODO.md +0 -18
  218. data/ext/ca_iter_block.c +0 -257
  219. data/ext/ca_iter_dimension.c +0 -299
  220. data/ext/ca_iter_window.c +0 -214
  221. data/ext/ca_obj_mapping.c +0 -644
  222. data/ext/carray_iterator.c +0 -641
  223. data/ext/carray_math.rb +0 -850
  224. data/ext/carray_numeric.c +0 -259
  225. data/ext/carray_sort_addr.c +0 -254
  226. data/ext/carray_stat.c +0 -2100
  227. data/ext/carray_stat_proc.rb +0 -1999
  228. data/ext/mkmath.rb +0 -741
  229. data/ext/ruby_ccomplex.c +0 -509
  230. data/ext/ruby_float_func.c +0 -86
  231. data/lib/carray/array.rb +0 -8
  232. data/lib/carray/autoload/autoload_base.rb +0 -19
  233. data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
  234. data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
  235. data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
  236. data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
  237. data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
  238. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
  239. data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
  240. data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
  241. data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
  242. data/lib/carray/autoload/autoload_gem_random.rb +0 -8
  243. data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
  244. data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
  245. data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
  246. data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
  247. data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
  248. data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
  249. data/lib/carray/autoload/autoload_object_link.rb +0 -1
  250. data/lib/carray/autoload/autoload_object_pack.rb +0 -2
  251. data/lib/carray/autoload.rb +0 -141
  252. data/lib/carray/basic.rb +0 -191
  253. data/lib/carray/broadcast.rb +0 -101
  254. data/lib/carray/compose.rb +0 -315
  255. data/lib/carray/convert.rb +0 -115
  256. data/lib/carray/info.rb +0 -110
  257. data/lib/carray/io/imagemagick.rb +0 -235
  258. data/lib/carray/mask.rb +0 -102
  259. data/lib/carray/math/histogram.rb +0 -177
  260. data/lib/carray/math/recurrence.rb +0 -93
  261. data/lib/carray/object/ca_obj_iterator.rb +0 -50
  262. data/lib/carray/object/ca_obj_link.rb +0 -50
  263. data/lib/carray/object/ca_obj_pack.rb +0 -99
  264. data/lib/carray/obsolete.rb +0 -256
  265. data/lib/carray/ordering.rb +0 -181
  266. data/lib/carray/testing.rb +0 -51
  267. data/lib/carray/transform.rb +0 -109
  268. data/misc/Methods.ja.md +0 -182
  269. data/misc/NOTE +0 -51
  270. data/spec/Classes/CABitfield_spec.rb +0 -58
  271. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  272. data/spec/Classes/CABlock_spec.rb +0 -205
  273. data/spec/Classes/CAField_spec.rb +0 -39
  274. data/spec/Classes/CAGrid_spec.rb +0 -75
  275. data/spec/Classes/CAMap_spec.rb +0 -0
  276. data/spec/Classes/CAMapping_spec.rb +0 -105
  277. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  278. data/spec/Classes/CAObject_spec.rb +0 -33
  279. data/spec/Classes/CARefer_spec.rb +0 -93
  280. data/spec/Classes/CARepeat_spec.rb +0 -65
  281. data/spec/Classes/CASelect_spec.rb +0 -22
  282. data/spec/Classes/CAShift_spec.rb +0 -16
  283. data/spec/Classes/CAStruct_spec.rb +0 -71
  284. data/spec/Classes/CATranspose_spec.rb +0 -60
  285. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  286. data/spec/Classes/CAWindow_spec.rb +0 -54
  287. data/spec/Classes/CAWrap_spec.rb +0 -8
  288. data/spec/Classes/CArray_spec.rb +0 -184
  289. data/spec/Classes/CScalar_spec.rb +0 -55
  290. data/spec/Classes/ex1.rb +0 -46
  291. data/spec/Features/feature_130_spec.rb +0 -19
  292. data/spec/Features/feature_attributes_spec.rb +0 -280
  293. data/spec/Features/feature_boolean_spec.rb +0 -98
  294. data/spec/Features/feature_broadcast.rb +0 -116
  295. data/spec/Features/feature_cast_function.rb +0 -19
  296. data/spec/Features/feature_cast_spec.rb +0 -33
  297. data/spec/Features/feature_class_spec.rb +0 -84
  298. data/spec/Features/feature_complex_spec.rb +0 -42
  299. data/spec/Features/feature_composite_spec.rb +0 -124
  300. data/spec/Features/feature_convert_spec.rb +0 -46
  301. data/spec/Features/feature_copy_spec.rb +0 -123
  302. data/spec/Features/feature_creation_spec.rb +0 -84
  303. data/spec/Features/feature_element_spec.rb +0 -144
  304. data/spec/Features/feature_extream_spec.rb +0 -54
  305. data/spec/Features/feature_generate_spec.rb +0 -74
  306. data/spec/Features/feature_index_spec.rb +0 -69
  307. data/spec/Features/feature_mask_spec.rb +0 -580
  308. data/spec/Features/feature_math_spec.rb +0 -97
  309. data/spec/Features/feature_order_spec.rb +0 -146
  310. data/spec/Features/feature_ref_store_spec.rb +0 -209
  311. data/spec/Features/feature_serialization_spec.rb +0 -125
  312. data/spec/Features/feature_stat_spec.rb +0 -397
  313. data/spec/Features/feature_virtual_spec.rb +0 -48
  314. data/spec/Features/method_eq_spec.rb +0 -81
  315. data/spec/Features/method_is_nan_spec.rb +0 -12
  316. data/spec/Features/method_map_spec.rb +0 -54
  317. data/spec/Features/method_max_with.rb +0 -20
  318. data/spec/Features/method_min_with.rb +0 -19
  319. data/spec/Features/method_ne_spec.rb +0 -18
  320. data/spec/Features/method_project_spec.rb +0 -188
  321. data/spec/Features/method_ref_spec.rb +0 -27
  322. data/spec/Features/method_round_spec.rb +0 -11
  323. data/spec/Features/method_s_linspace_spec.rb +0 -48
  324. data/spec/Features/method_s_span_spec.rb +0 -14
  325. data/spec/Features/method_seq_spec.rb +0 -47
  326. data/spec/Features/method_sort_with.rb +0 -43
  327. data/spec/Features/method_sorted_with.rb +0 -29
  328. data/spec/Features/method_span_spec.rb +0 -42
  329. data/spec/Features/method_wrap_readonly_spec.rb +0 -43
  330. data/spec/UnitTest/test_CAVirtual.rb +0 -214
  331. data/spec/spec_all.rb +0 -10
  332. data/utils/ca_ase.rb +0 -21
  333. data/utils/ca_methods.rb +0 -15
  334. data/utils/cast_checker.rb +0 -30
  335. data/utils/convert_test.rb +0 -73
  336. data/utils/extract_yard.rb +0 -22
  337. data/utils/guess_shape.rb +0 -76
  338. data/utils/monkey_patch_methods.rb +0 -62
  339. 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-2020 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
-