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
@@ -0,0 +1,588 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ CAMonCmp — lazy monadic element-wise comparison view: is_nan /
4
+ is_inf / is_finite / is_invalid / signbit. Output data_type =
5
+ CA_BOOLEAN (1 byte); operand keeps its native data_type (per-type
6
+ kernels cover integer as well, so is_nan / is_inf on integer parents
7
+ return const-false and is_finite const-true without a cast layer).
8
+
9
+ xfer_stride model:
10
+ Output data_type (boolean8_t) differs from the operand data_type,
11
+ so the in-place chain-eval trick used by CAMonOp does not apply.
12
+ The parent is pulled into an operand-data_type scratch slab, then
13
+ the moncmp kernel writes boolean8_t into `data`:
14
+ 1. acquire scratch (slab_n * parent_bytes) — or use the parent's
15
+ live ptr directly via ca_moncmp_try_leaf_inplace
16
+ 2. ca_xfer_stride pulls the parent slab into scratch
17
+ 3. kernel: fn(n, m, scratch, 1, data, 1)
18
+ 4. release scratch
19
+
20
+ Peak scratch: 1 operand-data_type slab.
21
+
22
+ Mask propagation:
23
+ Per-type moncmp kernels write only at non-masked positions, so
24
+ the standard create_mask = parent.mask machinery carries mask bits
25
+ to the caller-visible result. No in-flight mask handling in
26
+ xfer_stride.
27
+
28
+ ---------------------------------------------------------------------------- */
29
+
30
+ #include "carray.h"
31
+ #include "carray_internal.h" /* ca_lazy_arena_* */
32
+ #include "ca_moncmp_dispatch.h"
33
+
34
+ extern void *ca_lazy_arena_acquire (ca_size_t bytes);
35
+ extern void ca_lazy_arena_release (void *ptr);
36
+
37
+ int8_t CA_OBJ_MONCMP;
38
+ VALUE rb_cCAMonCmp;
39
+
40
+ extern int8_t CA_OBJ_LAZY_MARKER;
41
+
42
+ /* ------------------------------------------------------------------- */
43
+ /* CAMonCmp struct */
44
+ /* ------------------------------------------------------------------- */
45
+
46
+ typedef struct CAMonCmp {
47
+ int16_t obj_type;
48
+ int8_t data_type; /* always CA_BOOLEAN */
49
+ int8_t ndim;
50
+ int32_t flags;
51
+ ca_size_t bytes; /* always 1 */
52
+ ca_size_t elements;
53
+ ca_size_t *dim;
54
+ char *ptr;
55
+ CArray *mask;
56
+ char *_pool; /* framework-managed pool buffer (NULL = legacy ALLOC_N path). */
57
+ CArray *parent;
58
+ uint32_t attach;
59
+ uint8_t nosync;
60
+ /* CAMonCmp-specific tail */
61
+ uint16_t op_id;
62
+ } CAMonCmp;
63
+
64
+ static size_t
65
+ ca_moncmp_dsize (const void *ap)
66
+ {
67
+ const CAMonCmp *ca = (const CAMonCmp *) ap;
68
+ return sizeof(CAMonCmp) + ca->ndim * sizeof(ca_size_t);
69
+ }
70
+
71
+ /* Pool framework hooks: single ndim-sized tail (dim) in the _pool
72
+ buffer, uniform with the other pool-migrated views. */
73
+ static size_t
74
+ ca_moncmp_pool_bytes (int8_t ndim)
75
+ {
76
+ ca_size_t n = (ndim > 0) ? ndim : 1;
77
+ return (size_t) n * sizeof(ca_size_t);
78
+ }
79
+
80
+ static void
81
+ ca_moncmp_pool_init (void *ap, int8_t ndim)
82
+ {
83
+ CAMonCmp *ca = (CAMonCmp *) ap;
84
+ ca->dim = (ca_size_t *) ca->_pool;
85
+ }
86
+
87
+ const rb_data_type_t camoncmp_data_type = {
88
+ .parent = &caview_data_type,
89
+ .wrap_struct_name = "CAMonCmp",
90
+ .function = {
91
+ .dmark = ca_mark,
92
+ .dfree = ca_free,
93
+ .dsize = ca_moncmp_dsize,
94
+ .dcompact = NULL
95
+ },
96
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
97
+ };
98
+
99
+ /* ------------------------------------------------------------------- */
100
+ /* setup / new / free */
101
+ /* ------------------------------------------------------------------- */
102
+
103
+ static int
104
+ ca_moncmp_setup (CAMonCmp *ca, CArray *parent, uint16_t op_id)
105
+ {
106
+ ca->obj_type = CA_OBJ_MONCMP;
107
+ ca->data_type = CA_BOOLEAN;
108
+ ca->flags = CA_FLAG_READ_ONLY;
109
+ ca->ndim = parent->ndim;
110
+ ca->bytes = 1;
111
+ ca->elements = parent->elements;
112
+ ca->ptr = NULL;
113
+ ca->mask = NULL;
114
+ if ( ! ca->_pool ) {
115
+ ca->dim = ALLOC_N(ca_size_t, parent->ndim);
116
+ }
117
+ ca->parent = parent;
118
+ ca->attach = 0;
119
+ ca->nosync = 0;
120
+ ca->op_id = op_id;
121
+
122
+ memcpy(ca->dim, parent->dim, parent->ndim * sizeof(ca_size_t));
123
+
124
+ /* The mask is NOT built here: ca_has_mask creates a view's mask on
125
+ demand from its parent's. */
126
+ if ( ca_is_scalar(parent) ) {
127
+ ca_set_flag(ca, CA_FLAG_SCALAR);
128
+ }
129
+ return 0;
130
+ }
131
+
132
+ CAMonCmp *
133
+ ca_moncmp_new (CArray *parent, uint16_t op_id)
134
+ {
135
+ CAMonCmp *ca = (CAMonCmp *) ca_array_alloc(CA_OBJ_MONCMP, parent->ndim);
136
+ ca_moncmp_setup(ca, parent, op_id);
137
+ return ca;
138
+ }
139
+
140
+ static void
141
+ free_ca_moncmp (void *ap)
142
+ {
143
+ CAMonCmp *ca = (CAMonCmp *) ap;
144
+ if ( ca != NULL ) {
145
+ ca_free(ca->mask);
146
+ if ( ca->_pool ) {
147
+ ca_array_free(ca); /* dim lives in _pool */
148
+ }
149
+ else {
150
+ xfree(ca->dim);
151
+ xfree(ca);
152
+ }
153
+ }
154
+ }
155
+
156
+ /* ------------------------------------------------------------------- */
157
+ /* operation function table */
158
+ /* ------------------------------------------------------------------- */
159
+
160
+ static void ca_moncmp_func_xfer_stride (void *ap, ca_size_t *starts,
161
+ ca_size_t *counts,
162
+ ca_size_t *strides,
163
+ void *data, int dir);
164
+
165
+ static void *
166
+ ca_moncmp_func_clone (void *ap)
167
+ {
168
+ CAMonCmp *ca = (CAMonCmp *) ap;
169
+ return ca_moncmp_new(ca->parent, ca->op_id);
170
+ }
171
+
172
+ static void
173
+ ca_moncmp_func_xfer_index (void *ap, ca_size_t *idx, void *data, int dir)
174
+ {
175
+ CAMonCmp *ca = (CAMonCmp *) ap;
176
+ ca_size_t starts[CA_RANK_MAX];
177
+ ca_size_t counts[CA_RANK_MAX];
178
+ ca_size_t strides[CA_RANK_MAX];
179
+ int8_t k;
180
+
181
+ if ( dir != CA_XFER_GET ) {
182
+ rb_raise(rb_eRuntimeError, "CAMonCmp is read-only (xfer_index PUT)");
183
+ }
184
+ for ( k = ca->ndim - 1; k >= 0; k-- ) {
185
+ starts[k] = idx[k];
186
+ counts[k] = 1;
187
+ strides[k] = 1;
188
+ }
189
+ ca_moncmp_func_xfer_stride(ca, starts, counts, strides, data, CA_XFER_GET);
190
+ }
191
+
192
+ static void
193
+ ca_moncmp_func_xfer_addrs (void *ap, ca_size_t n, ca_size_t *addrs,
194
+ void *data, int dir)
195
+ {
196
+ CAMonCmp *ca = (CAMonCmp *) ap;
197
+ ca_size_t i;
198
+ char *out = (char *) data;
199
+
200
+ if ( dir != CA_XFER_GET ) {
201
+ rb_raise(rb_eRuntimeError, "CAMonCmp is read-only (xfer_addrs PUT)");
202
+ }
203
+ for ( i = 0; i < n; i++ ) {
204
+ ca_size_t idx[CA_RANK_MAX];
205
+ ca_addr2index((CArray *)ca, addrs[i], idx);
206
+ ca_moncmp_func_xfer_index(ca, idx, out + i, CA_XFER_GET);
207
+ }
208
+ }
209
+
210
+ ca_size_t ca_moncmp_scratch_acquire_count = 0;
211
+ ca_size_t ca_moncmp_materialise_call_count = 0;
212
+ ca_size_t ca_moncmp_leaf_inplace_count = 0;
213
+
214
+ /* Leaf-operand in-place read: when the parent is an entity-like
215
+ contig source, hand parent->ptr + byte_offset directly to the
216
+ kernel and skip the arena acquire + xfer_stride pull. Mirrors the
217
+ sibling helper in ca_obj_bincmp.c. */
218
+ static int
219
+ ca_moncmp_try_leaf_inplace (CArray *p,
220
+ ca_size_t *starts, ca_size_t *counts,
221
+ ca_size_t expected_inner_byte_stride,
222
+ char **out_ptr)
223
+ {
224
+ ca_size_t row_strides[CA_RANK_MAX];
225
+ ca_size_t s, byte_off;
226
+ int8_t k;
227
+
228
+ if ( p->ptr == NULL ) return 0;
229
+ if ( p->bytes != expected_inner_byte_stride ) return 0;
230
+
231
+ s = p->bytes;
232
+ for ( k = p->ndim - 1; k >= 0; k-- ) {
233
+ row_strides[k] = s;
234
+ s *= p->dim[k];
235
+ }
236
+ byte_off = 0;
237
+ for ( k = 0; k < p->ndim; k++ ) {
238
+ if ( starts[k] < 0 || starts[k] + counts[k] > p->dim[k] ) return 0;
239
+ byte_off += starts[k] * row_strides[k];
240
+ }
241
+ *out_ptr = p->ptr + byte_off;
242
+ return 1;
243
+ }
244
+
245
+ static void
246
+ ca_moncmp_func_xfer_stride (void *ap, ca_size_t *starts, ca_size_t *counts,
247
+ ca_size_t *strides, void *data, int dir)
248
+ {
249
+ CAMonCmp *mc = (CAMonCmp *) ap;
250
+ ca_size_t slab_n;
251
+ int8_t k;
252
+ void *scratch;
253
+ ca_size_t operand_bytes;
254
+ ca_size_t operand_strides[CA_RANK_MAX];
255
+ int is_contig;
256
+
257
+ if ( dir != CA_XFER_GET ) {
258
+ rb_raise(rb_eRuntimeError, "CAMonCmp is read-only (xfer_stride PUT)");
259
+ }
260
+ ca_moncmp_materialise_call_count++;
261
+
262
+ slab_n = 1;
263
+ for ( k = 0; k < mc->ndim; k++ ) slab_n *= counts[k];
264
+
265
+ operand_bytes = mc->parent->bytes;
266
+
267
+ /* The operand's cell is operand_bytes wide where this view's is one byte
268
+ (CA_BOOLEAN), so the caller's strides have to be restated at the
269
+ operand's cell size before the pull; strides[k] / bytes is the index
270
+ step, which is what the two spaces share.
271
+
272
+ is_contig says the caller asked for the row-major slab that xfer_all
273
+ and attach send. Only then does the parent's own buffer hold the
274
+ wanted cells in the packed order the kernel reads them in, so it is
275
+ also the only case the leaf in-place path is good for. */
276
+ {
277
+ ca_size_t native = mc->bytes;
278
+ is_contig = 1;
279
+ for ( k = mc->ndim - 1; k >= 0; k-- ) {
280
+ operand_strides[k] = strides[k] / mc->bytes * operand_bytes;
281
+ if ( strides[k] != native ) {
282
+ is_contig = 0;
283
+ }
284
+ native *= mc->dim[k];
285
+ }
286
+ }
287
+
288
+ /* === 1. pull parent (leaf-opt or scratch) === */
289
+ int scratch_is_inplace = 0;
290
+ {
291
+ char *inplace = NULL;
292
+ if ( is_contig &&
293
+ ca_moncmp_try_leaf_inplace(mc->parent, starts, counts,
294
+ operand_bytes, &inplace) ) {
295
+ scratch = inplace;
296
+ scratch_is_inplace = 1;
297
+ ca_moncmp_leaf_inplace_count++;
298
+ }
299
+ else {
300
+ scratch = ( mc->parent->data_type == CA_OBJECT )
301
+ ? ca_lazy_arena_acquire_object(slab_n)
302
+ : ca_lazy_arena_acquire(slab_n * operand_bytes);
303
+ ca_moncmp_scratch_acquire_count++;
304
+ ca_xfer_stride(mc->parent, starts, counts, operand_strides, scratch,
305
+ CA_XFER_GET);
306
+ }
307
+ }
308
+
309
+ /* === 2. apply moncmp kernel ===
310
+ *
311
+ * Kernel signature (ext/carray.h):
312
+ * fn(n, m, ptr1, i1, ptr2, i2)
313
+ * where ptr2 is boolean8_t*
314
+ *
315
+ * Non-trapping: m=NULL (= SIMD fast path). Per-data_type kernel handles
316
+ * integer is_nan etc. internally.
317
+ */
318
+ {
319
+ ca_moncmp_func_t fn = ca_moncmp_kernel_lookup(mc->op_id,
320
+ mc->parent->data_type);
321
+ if ( fn == NULL ) {
322
+ if ( ! scratch_is_inplace ) ca_lazy_arena_release(scratch);
323
+ rb_raise(rb_eNotImpError,
324
+ "CAMonCmp: kernel not implemented (op_id=%u data_type=%d)",
325
+ (unsigned) mc->op_id, (int) mc->parent->data_type);
326
+ }
327
+ fn(slab_n, NULL,
328
+ (char *) scratch, 1,
329
+ (boolean8_t *) data, 1);
330
+ }
331
+
332
+ if ( ! scratch_is_inplace ) ca_lazy_arena_release(scratch);
333
+ }
334
+
335
+ static void
336
+ ca_moncmp_func_xfer_all (void *ap, void *data, int dir)
337
+ {
338
+ CAMonCmp *ca = (CAMonCmp *) ap;
339
+ ca_size_t starts[CA_RANK_MAX];
340
+ ca_size_t native[CA_RANK_MAX];
341
+ int8_t k;
342
+ ca_size_t s = 1;
343
+ for ( k = ca->ndim - 1; k >= 0; k-- ) { native[k] = s; s *= ca->dim[k]; }
344
+ for ( k = 0; k < ca->ndim; k++ ) starts[k] = 0;
345
+ ca_xfer_stride(ca, starts, ca->dim, native, data, dir);
346
+ }
347
+
348
+ static void
349
+ ca_moncmp_func_allocate (void *ap)
350
+ {
351
+ CAMonCmp *ca = (CAMonCmp *) ap;
352
+ ca->ptr = xmalloc(ca_length(ca));
353
+ }
354
+
355
+ static void
356
+ ca_moncmp_func_attach (void *ap)
357
+ {
358
+ /* CAREFUL: self-fill through the public ca_xfer_stride dispatcher
359
+ hits its self-memcpy fast path (data == ca->ptr becomes a no-op
360
+ and the buffer stays as xmalloc garbage). Call the view's own
361
+ xfer_stride directly to force the actual gather+cast. */
362
+ CAMonCmp *ca = (CAMonCmp *) ap;
363
+ ca_size_t starts[CA_RANK_MAX];
364
+ ca_size_t native[CA_RANK_MAX];
365
+ int8_t k;
366
+ ca_size_t s;
367
+
368
+ ca->ptr = xmalloc(ca_length(ca));
369
+
370
+ s = ca->bytes;
371
+ for ( k = ca->ndim - 1; k >= 0; k-- ) { native[k] = s; s *= ca->dim[k]; }
372
+ for ( k = 0; k < ca->ndim; k++ ) starts[k] = 0;
373
+ ca_moncmp_func_xfer_stride(ca, starts, ca->dim, native, ca->ptr, CA_XFER_GET);
374
+ }
375
+
376
+ static void
377
+ ca_moncmp_func_sync (void *ap)
378
+ {
379
+ /* read-only */
380
+ }
381
+
382
+ static void
383
+ ca_moncmp_func_detach (void *ap)
384
+ {
385
+ CAMonCmp *ca = (CAMonCmp *) ap;
386
+ xfree(ca->ptr);
387
+ ca->ptr = NULL;
388
+ }
389
+
390
+ NORETURN(static void ca_moncmp_func_fill_data (void *ap, void *ptr));
391
+ static void
392
+ ca_moncmp_func_fill_data (void *ap, void *ptr)
393
+ {
394
+ rb_raise(rb_eRuntimeError, "CAMonCmp is read-only (fill_data)");
395
+ }
396
+
397
+ static void
398
+ ca_moncmp_func_create_mask (void *ap)
399
+ {
400
+ CAMonCmp *mc = (CAMonCmp *) ap;
401
+ CArray *p = mc->parent;
402
+ if ( ! ca_has_mask(p) ) return;
403
+
404
+ mc->mask = (CArray *) carray_new(CA_BOOLEAN, mc->ndim, mc->dim, 0, NULL);
405
+ ca_attach(p->mask);
406
+ memcpy(mc->mask->ptr, p->mask->ptr, mc->elements);
407
+ ca_detach(p->mask);
408
+ }
409
+
410
+ ca_operation_function_t ca_moncmp_func = {
411
+ -1,
412
+ CA_VIEW_ARRAY,
413
+ free_ca_moncmp,
414
+ ca_moncmp_func_clone,
415
+ ca_moncmp_func_allocate,
416
+ ca_moncmp_func_attach,
417
+ ca_moncmp_func_sync,
418
+ ca_moncmp_func_detach,
419
+ ca_moncmp_func_fill_data,
420
+ ca_moncmp_func_create_mask,
421
+ ca_moncmp_func_xfer_index,
422
+ ca_moncmp_func_xfer_addrs,
423
+ NULL,
424
+ ca_moncmp_func_xfer_stride,
425
+ ca_moncmp_func_xfer_all,
426
+ };
427
+
428
+ /* ------------------------------------------------------------------- */
429
+ /* Public builder */
430
+ /* ------------------------------------------------------------------- */
431
+
432
+ static VALUE
433
+ collapse_marker (VALUE cary)
434
+ {
435
+ CArray *ca;
436
+ if ( ! rb_obj_is_carray(cary) ) return cary;
437
+ TypedData_Get_Struct(cary, CArray, &carray_data_type, ca);
438
+ if ( ca->obj_type == CA_OBJ_LAZY_MARKER ) {
439
+ return rb_ca_parent(cary);
440
+ }
441
+ return cary;
442
+ }
443
+
444
+ static VALUE
445
+ rb_ca_moncmp_new (VALUE p_cary, uint16_t op_id)
446
+ {
447
+ volatile VALUE obj;
448
+ CArray *p;
449
+ CAMonCmp *ca;
450
+ rb_check_carray_object(p_cary);
451
+ TypedData_Get_Struct(p_cary, CArray, &carray_data_type, p);
452
+ ca = ca_moncmp_new(p, op_id);
453
+ obj = ca_wrap_struct(ca);
454
+ rb_ca_set_parent(obj, p_cary);
455
+ return obj;
456
+ }
457
+
458
+ VALUE
459
+ rb_ca_moncmp_build (VALUE p_cary, uint16_t op_id)
460
+ {
461
+ volatile VALUE p_resolved = collapse_marker(p_cary);
462
+ return rb_ca_moncmp_new(p_resolved, op_id);
463
+ }
464
+
465
+ static VALUE
466
+ rb_ca_moncmp_s_build (VALUE klass, VALUE p_cary, VALUE op_id_val)
467
+ {
468
+ uint16_t op_id = (uint16_t) NUM2UINT(op_id_val);
469
+ (void) klass;
470
+ return rb_ca_moncmp_build(p_cary, op_id);
471
+ }
472
+
473
+ static VALUE
474
+ rb_ca_moncmp_op_id (VALUE self)
475
+ {
476
+ CAMonCmp *mc;
477
+ TypedData_Get_Struct(self, CAMonCmp, &camoncmp_data_type, mc);
478
+ return UINT2NUM(mc->op_id);
479
+ }
480
+
481
+ static VALUE
482
+ rb_ca_moncmp_s_reset_scratch_counter (VALUE klass)
483
+ {
484
+ (void) klass;
485
+ ca_moncmp_scratch_acquire_count = 0;
486
+ return Qnil;
487
+ }
488
+
489
+ static VALUE
490
+ rb_ca_moncmp_s_scratch_count (VALUE klass)
491
+ {
492
+ (void) klass;
493
+ return SIZE2NUM(ca_moncmp_scratch_acquire_count);
494
+ }
495
+
496
+ static VALUE
497
+ rb_ca_moncmp_s_reset_materialise_counter (VALUE klass)
498
+ {
499
+ (void) klass;
500
+ ca_moncmp_materialise_call_count = 0;
501
+ return Qnil;
502
+ }
503
+
504
+ static VALUE
505
+ rb_ca_moncmp_s_materialise_count (VALUE klass)
506
+ {
507
+ (void) klass;
508
+ return SIZE2NUM(ca_moncmp_materialise_call_count);
509
+ }
510
+
511
+ static VALUE
512
+ rb_ca_moncmp_s_reset_leaf_inplace_counter (VALUE klass)
513
+ {
514
+ (void) klass;
515
+ ca_moncmp_leaf_inplace_count = 0;
516
+ return Qnil;
517
+ }
518
+
519
+ static VALUE
520
+ rb_ca_moncmp_s_leaf_inplace_count (VALUE klass)
521
+ {
522
+ (void) klass;
523
+ return SIZE2NUM(ca_moncmp_leaf_inplace_count);
524
+ }
525
+
526
+ static VALUE
527
+ rb_ca_moncmp_s_allocate (VALUE klass)
528
+ {
529
+ CAMonCmp *ca;
530
+ return TypedData_Make_Struct(klass, CAMonCmp, &camoncmp_data_type, ca);
531
+ }
532
+
533
+ static VALUE
534
+ rb_ca_moncmp_initialize_copy (VALUE self, VALUE other)
535
+ {
536
+ CAMonCmp *ca, *cs;
537
+ TypedData_Get_Struct(self, CAMonCmp, &camoncmp_data_type, ca);
538
+ TypedData_Get_Struct(other, CAMonCmp, &camoncmp_data_type, cs);
539
+ if ( ca_func[CA_OBJ_MONCMP].pool_init ) {
540
+ ca_array_pool_alloc(ca, CA_OBJ_MONCMP, cs->parent->ndim);
541
+ }
542
+ ca_moncmp_setup(ca, cs->parent, cs->op_id);
543
+ return self;
544
+ }
545
+
546
+ void
547
+ Init_ca_obj_moncmp (void)
548
+ {
549
+ rb_cCAMonCmp = rb_define_class("CAMonCmp", rb_cCAView);
550
+
551
+ ca_moncmp_func.struct_size = sizeof(CAMonCmp);
552
+ ca_moncmp_func.pool_bytes = ca_moncmp_pool_bytes;
553
+ ca_moncmp_func.pool_init = ca_moncmp_pool_init;
554
+
555
+ CA_OBJ_MONCMP = ca_install_obj_type(rb_cCAMonCmp,
556
+ &camoncmp_data_type,
557
+ rb_cCArrayMask,
558
+ &carray_mask_data_type, &ca_moncmp_func, sizeof(ca_moncmp_func));
559
+ rb_define_const(rb_cObject, "CA_OBJ_MONCMP", INT2NUM(CA_OBJ_MONCMP));
560
+
561
+ rb_define_const(rb_cCAMonCmp, "OP_IS_NAN", INT2NUM(CA_MONCMP_IS_NAN));
562
+ rb_define_const(rb_cCAMonCmp, "OP_IS_INF", INT2NUM(CA_MONCMP_IS_INF));
563
+ rb_define_const(rb_cCAMonCmp, "OP_IS_FINITE", INT2NUM(CA_MONCMP_IS_FINITE));
564
+ rb_define_const(rb_cCAMonCmp, "OP_IS_INVALID", INT2NUM(CA_MONCMP_IS_INVALID));
565
+ rb_define_const(rb_cCAMonCmp, "OP_SIGNBIT", INT2NUM(CA_MONCMP_SIGNBIT));
566
+
567
+ rb_define_alloc_func(rb_cCAMonCmp, rb_ca_moncmp_s_allocate);
568
+ rb_define_method(rb_cCAMonCmp, "initialize_copy",
569
+ rb_ca_moncmp_initialize_copy, 1);
570
+
571
+ rb_define_singleton_method(rb_cCAMonCmp, "__build__",
572
+ rb_ca_moncmp_s_build, 2);
573
+
574
+ rb_define_method(rb_cCAMonCmp, "__op_id__", rb_ca_moncmp_op_id, 0);
575
+
576
+ rb_define_singleton_method(rb_cCAMonCmp, "__reset_scratch_counter__",
577
+ rb_ca_moncmp_s_reset_scratch_counter, 0);
578
+ rb_define_singleton_method(rb_cCAMonCmp, "__scratch_count__",
579
+ rb_ca_moncmp_s_scratch_count, 0);
580
+ rb_define_singleton_method(rb_cCAMonCmp, "__reset_materialise_counter__",
581
+ rb_ca_moncmp_s_reset_materialise_counter, 0);
582
+ rb_define_singleton_method(rb_cCAMonCmp, "__materialise_count__",
583
+ rb_ca_moncmp_s_materialise_count, 0);
584
+ rb_define_singleton_method(rb_cCAMonCmp, "__reset_leaf_inplace_counter__",
585
+ rb_ca_moncmp_s_reset_leaf_inplace_counter, 0);
586
+ rb_define_singleton_method(rb_cCAMonCmp, "__leaf_inplace_count__",
587
+ rb_ca_moncmp_s_leaf_inplace_count, 0);
588
+ }