carray 3.0.3 → 3.0.4

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 (212) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +264 -0
  3. data/README.md +3 -2
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_descriptor.h +27 -24
  6. data/ext/ca_axis_dispatch.c +1 -6
  7. data/ext/ca_axis_group.c +27 -27
  8. data/ext/ca_binop_dispatch.c +1 -29
  9. data/ext/ca_binop_dispatch.h +0 -1
  10. data/ext/ca_categorical_iterator.c +205 -134
  11. data/ext/ca_compare.c +7 -18
  12. data/ext/ca_group_iter.c +16 -17
  13. data/ext/ca_kernel_iterator.c +1234 -1994
  14. data/ext/ca_kernel_iterator.h +391 -437
  15. data/ext/ca_monop_dispatch.c +82 -59
  16. data/ext/ca_monop_dispatch.h +1 -0
  17. data/ext/ca_obj_array.c +96 -39
  18. data/ext/ca_obj_bincmp.c +24 -21
  19. data/ext/ca_obj_binop.c +15 -26
  20. data/ext/ca_obj_bitarray.c +3 -2
  21. data/ext/ca_obj_bitfield.c +5 -6
  22. data/ext/ca_obj_block.c +18 -9
  23. data/ext/ca_obj_byte_swap.c +5 -6
  24. data/ext/ca_obj_const_string.c +173 -19
  25. data/ext/ca_obj_face.c +238 -57
  26. data/ext/ca_obj_face.h +19 -0
  27. data/ext/ca_obj_fake.c +15 -29
  28. data/ext/ca_obj_farray.c +6 -3
  29. data/ext/ca_obj_field.c +17 -5
  30. data/ext/ca_obj_fixlen_string.c +2 -3
  31. data/ext/ca_obj_grid.c +406 -132
  32. data/ext/ca_obj_meld.c +172 -34
  33. data/ext/ca_obj_moncmp.c +23 -8
  34. data/ext/ca_obj_monop.c +67 -57
  35. data/ext/ca_obj_object.c +157 -51
  36. data/ext/ca_obj_record.c +12 -7
  37. data/ext/ca_obj_reduce.c +13 -8
  38. data/ext/ca_obj_refer.c +25 -27
  39. data/ext/ca_obj_remap.c +30 -9
  40. data/ext/ca_obj_repeat.c +9 -10
  41. data/ext/ca_obj_roll.c +6 -5
  42. data/ext/ca_obj_select.c +14 -9
  43. data/ext/ca_obj_select_axis.c +15 -47
  44. data/ext/ca_obj_shift.c +11 -1
  45. data/ext/ca_obj_stack.c +179 -34
  46. data/ext/ca_obj_stride.c +162 -115
  47. data/ext/ca_obj_string.c +71 -4
  48. data/ext/ca_obj_tile.c +6 -5
  49. data/ext/ca_obj_time.c +22 -6
  50. data/ext/ca_obj_timedelta.c +22 -6
  51. data/ext/ca_obj_transpose.c +5 -3
  52. data/ext/ca_obj_triop.c +23 -32
  53. data/ext/ca_obj_window.c +190 -26
  54. data/ext/ca_sweep_engine.c +2 -2
  55. data/ext/caframe_csv_reader.c +80 -1
  56. data/ext/carray.h +181 -75
  57. data/ext/carray_access.c +184 -96
  58. data/ext/carray_address_basis.c +343 -87
  59. data/ext/carray_attribute.c +89 -6
  60. data/ext/carray_bincount.c +10 -8
  61. data/ext/carray_broadcast.c +13 -8
  62. data/ext/carray_build_flags.h +3 -0
  63. data/ext/carray_call_cfunc.c +108 -0
  64. data/ext/carray_cast.c +142 -24
  65. data/ext/carray_cast_func.rb +46 -6
  66. data/ext/carray_class.c +4 -3
  67. data/ext/carray_config.h +28 -0
  68. data/ext/carray_conversion.c +16 -7
  69. data/ext/carray_copy.c +51 -14
  70. data/ext/carray_core.c +147 -55
  71. data/ext/carray_count.c +50 -20
  72. data/ext/carray_element.c +76 -33
  73. data/ext/carray_factorize.c +118 -64
  74. data/ext/carray_generate.c +191 -50
  75. data/ext/carray_histogram.c +62 -17
  76. data/ext/carray_hold.c +12 -15
  77. data/ext/carray_index_classifier.c +388 -176
  78. data/ext/carray_internal.h +336 -29
  79. data/ext/carray_kernels_bincmp.c +4453 -0
  80. data/ext/carray_kernels_binop.c +11368 -0
  81. data/ext/carray_kernels_init.c +1734 -0
  82. data/ext/carray_kernels_moncmp.c +2104 -0
  83. data/ext/carray_kernels_monop.c +18369 -0
  84. data/ext/carray_kernels_reduce_aggregate.c +23818 -0
  85. data/ext/carray_kernels_reduce_boolean.c +406 -0
  86. data/ext/carray_kernels_reduce_cumulative.c +10086 -0
  87. data/ext/carray_kernels_reduce_extreme.c +17634 -0
  88. data/ext/carray_kernels_reduce_variance.c +3849 -0
  89. data/ext/carray_kernels_scan.c +4302 -0
  90. data/ext/carray_kernels_search.c +33829 -0
  91. data/ext/carray_kernels_sort.c +10906 -0
  92. data/ext/carray_kernels_triop.c +1864 -0
  93. data/ext/carray_key_windows.c +216 -0
  94. data/ext/carray_lazy.c +170 -111
  95. data/ext/carray_mask.c +292 -72
  96. data/ext/carray_median_percentile.c +82 -28
  97. data/ext/carray_memory_view.c +669 -561
  98. data/ext/carray_operator.c +124 -47
  99. data/ext/carray_order.c +384 -76
  100. data/ext/carray_partition.c +28 -27
  101. data/ext/carray_random.c +67 -13
  102. data/ext/carray_round.c +273 -0
  103. data/ext/carray_scatter.c +63 -38
  104. data/ext/carray_segment.c +3 -3
  105. data/ext/carray_slab.c +91 -28
  106. data/ext/carray_sort.c +35 -35
  107. data/ext/carray_struct.c +19 -18
  108. data/ext/carray_test.c +26 -5
  109. data/ext/carray_undef.c +4 -0
  110. data/ext/carray_utils.c +246 -45
  111. data/ext/mk_call_cfunc.rb +19 -2
  112. data/ext/mkkernel.rb +198 -240
  113. data/ext/ruby_carray.c +10 -4
  114. data/ext/version.h +4 -4
  115. data/lib/carray/attribute.rb +126 -22
  116. data/lib/carray/autoload_carray.rb +8 -31
  117. data/lib/carray/autoload_method_extension.rb +14 -5
  118. data/lib/carray/axis_group.rb +255 -106
  119. data/lib/carray/basics.rb +78 -10
  120. data/lib/carray/bincount_nd.rb +12 -2
  121. data/lib/carray/block_iterator.rb +126 -23
  122. data/lib/carray/boolean_reduce.rb +17 -17
  123. data/lib/carray/categorical.rb +165 -43
  124. data/lib/carray/categorical_iterator.rb +130 -27
  125. data/lib/carray/complex.rb +5 -5
  126. data/lib/carray/conditional.rb +67 -18
  127. data/lib/carray/const_string.rb +14 -5
  128. data/lib/carray/construct.rb +15 -11
  129. data/lib/carray/data_type_extension.rb +1 -0
  130. data/lib/carray/distance_limit.rb +77 -0
  131. data/lib/carray/fixlen_string.rb +7 -1
  132. data/lib/carray/frame/column_verbs.rb +70 -0
  133. data/lib/carray/frame/convert.rb +69 -0
  134. data/lib/carray/frame/csv_parser.rb +111 -17
  135. data/lib/carray/frame/describe.rb +3 -2
  136. data/lib/carray/frame/frame.rb +246 -21
  137. data/lib/carray/frame/group.rb +510 -95
  138. data/lib/carray/frame/io.rb +115 -28
  139. data/lib/carray/frame/join.rb +312 -51
  140. data/lib/carray/frame/records.rb +83 -7
  141. data/lib/carray/frame/reshape.rb +42 -35
  142. data/lib/carray/frame/sort.rb +7 -19
  143. data/lib/carray/frame/verbs.rb +188 -48
  144. data/lib/carray/frame/windows.rb +117 -0
  145. data/lib/carray/frame.rb +2 -0
  146. data/lib/carray/fuse_source.rb +11 -4
  147. data/lib/carray/fusion.rb +40 -16
  148. data/lib/carray/histogram.rb +6 -1
  149. data/lib/carray/inspect.rb +31 -8
  150. data/lib/carray/iterator.rb +85 -7
  151. data/lib/carray/key_windows.rb +620 -0
  152. data/lib/carray/lazy.rb +182 -183
  153. data/lib/carray/mask_gap_fill.rb +63 -57
  154. data/lib/carray/meld_reduce.rb +12 -14
  155. data/lib/carray/methods/bin.rb +26 -18
  156. data/lib/carray/methods/bincount.rb +16 -0
  157. data/lib/carray/methods/bit_string.rb +1 -1
  158. data/lib/carray/methods/choose.rb +16 -3
  159. data/lib/carray/methods/composition.rb +3 -1
  160. data/lib/carray/methods/gather_nd.rb +14 -5
  161. data/lib/carray/methods/insert_block.rb +2 -2
  162. data/lib/carray/methods/is_between.rb +59 -0
  163. data/lib/carray/methods/is_in.rb +53 -36
  164. data/lib/carray/methods/join.rb +1 -6
  165. data/lib/carray/methods/lag.rb +49 -0
  166. data/lib/carray/methods/locate_addr.rb +47 -51
  167. data/lib/carray/methods/mode.rb +1 -1
  168. data/lib/carray/methods/nunique.rb +11 -6
  169. data/lib/carray/methods/resize.rb +3 -3
  170. data/lib/carray/methods/value_counts.rb +4 -11
  171. data/lib/carray/record_order.rb +3 -3
  172. data/lib/carray/rng.rb +3 -0
  173. data/lib/carray/runtime.rb +53 -8
  174. data/lib/carray/segment_iterator.rb +313 -82
  175. data/lib/carray/serialize.rb +24 -10
  176. data/lib/carray/slab_iterator.rb +50 -0
  177. data/lib/carray/string.rb +105 -5
  178. data/lib/carray/string_operation_extension.rb +8 -1
  179. data/lib/carray/struct.rb +9 -21
  180. data/lib/carray/struct_builder.rb +19 -8
  181. data/lib/carray/time.rb +726 -104
  182. data/lib/carray/window_iterator.rb +122 -16
  183. data/lib/carray.rb +7 -0
  184. data/yard-stubs/ca_obj_bitfield.rb +1 -1
  185. data/yard-stubs/ca_obj_field.rb +4 -0
  186. data/yard-stubs/ca_obj_grid.rb +21 -10
  187. data/yard-stubs/ca_obj_refer.rb +2 -1
  188. data/yard-stubs/ca_obj_roll.rb +2 -2
  189. data/yard-stubs/ca_obj_shift.rb +5 -1
  190. data/yard-stubs/ca_obj_tile.rb +1 -1
  191. data/yard-stubs/ca_obj_window.rb +8 -3
  192. data/yard-stubs/carray_access.rb +6 -1
  193. data/yard-stubs/carray_attribute.rb +0 -5
  194. data/yard-stubs/carray_cast.rb +10 -0
  195. data/yard-stubs/carray_conversion.rb +2 -1
  196. data/yard-stubs/carray_copy.rb +4 -2
  197. data/yard-stubs/carray_count.rb +4 -4
  198. data/yard-stubs/carray_element.rb +10 -4
  199. data/yard-stubs/carray_generate.rb +21 -1
  200. data/yard-stubs/carray_mask.rb +26 -2
  201. data/yard-stubs/carray_math.rb +27 -1
  202. data/yard-stubs/carray_median_percentile.rb +5 -2
  203. data/yard-stubs/carray_memory_view.rb +40 -23
  204. data/yard-stubs/carray_order.rb +29 -18
  205. data/yard-stubs/carray_random.rb +13 -4
  206. data/yard-stubs/carray_scatter.rb +14 -9
  207. data/yard-stubs/carray_slab.rb +9 -2
  208. data/yard-stubs/carray_sort.rb +6 -5
  209. data/yard-stubs/carray_test.rb +5 -3
  210. metadata +25 -3
  211. data/lib/carray/arrow_tensor.rb +0 -401
  212. data/lib/carray/table.rb +0 -108
@@ -45,67 +45,67 @@
45
45
  /* op_id -> kernel table lookup */
46
46
  /* ------------------------------------------------------------------- */
47
47
 
48
- /* Returns the kernel for the given input data_type. Returns NULL for
49
- cast ops (op_id >= CA_MONOP_CAST_BASE) and unknown op_ids; cast is
50
- handled specially in xfer_stride via ca_cast_block. */
51
- ca_monop_func_t
52
- ca_monop_kernel_lookup (uint16_t op_id, int8_t in_data_type)
48
+ /* The kernel table of an op, or NULL for cast ops (op_id >=
49
+ CA_MONOP_CAST_BASE) and unknown op_ids; cast is handled specially in
50
+ xfer_stride via ca_cast_block. */
51
+ static ca_monop_func_t *
52
+ ca_monop_table_of (uint16_t op_id)
53
53
  {
54
54
  switch (op_id) {
55
- case CA_MONOP_ZERO: return ca_monop_zero[in_data_type];
56
- case CA_MONOP_ONE: return ca_monop_one[in_data_type];
57
- case CA_MONOP_FRAC: return ca_monop_frac[in_data_type];
58
- case CA_MONOP_NEG: return ca_monop_neg[in_data_type];
59
- case CA_MONOP_BIT_NEG: return ca_monop_bit_neg[in_data_type];
60
- case CA_MONOP_ABS_I: return ca_monop_abs_i[in_data_type];
61
- case CA_MONOP_CONJ: return ca_monop_conj[in_data_type];
62
- case CA_MONOP_NOT: return ca_monop_not[in_data_type];
63
-
64
- case CA_MONOP_CEIL: return ca_monop_ceil[in_data_type];
65
- case CA_MONOP_FLOOR: return ca_monop_floor[in_data_type];
66
- case CA_MONOP_ROUND: return ca_monop_round[in_data_type];
67
- case CA_MONOP_RCP: return ca_monop_rcp[in_data_type];
68
-
69
- case CA_MONOP_RAD: return ca_monop_rad[in_data_type];
70
- case CA_MONOP_DEG: return ca_monop_deg[in_data_type];
71
- case CA_MONOP_SQRT: return ca_monop_sqrt[in_data_type];
72
- case CA_MONOP_EXP: return ca_monop_exp[in_data_type];
73
- case CA_MONOP_EXP2: return ca_monop_exp2[in_data_type];
74
- case CA_MONOP_EXP10: return ca_monop_exp10[in_data_type];
75
- case CA_MONOP_LOG: return ca_monop_log[in_data_type];
76
- case CA_MONOP_LOG10: return ca_monop_log10[in_data_type];
77
- case CA_MONOP_LOG2: return ca_monop_log2[in_data_type];
78
- case CA_MONOP_LOGB: return ca_monop_logb[in_data_type];
79
- case CA_MONOP_SIN: return ca_monop_sin[in_data_type];
80
- case CA_MONOP_COS: return ca_monop_cos[in_data_type];
81
- case CA_MONOP_TAN: return ca_monop_tan[in_data_type];
82
- case CA_MONOP_ASIN: return ca_monop_asin[in_data_type];
83
- case CA_MONOP_ACOS: return ca_monop_acos[in_data_type];
84
- case CA_MONOP_ATAN: return ca_monop_atan[in_data_type];
85
- case CA_MONOP_SINH: return ca_monop_sinh[in_data_type];
86
- case CA_MONOP_COSH: return ca_monop_cosh[in_data_type];
87
- case CA_MONOP_TANH: return ca_monop_tanh[in_data_type];
88
- case CA_MONOP_ASINH: return ca_monop_asinh[in_data_type];
89
- case CA_MONOP_ACOSH: return ca_monop_acosh[in_data_type];
90
- case CA_MONOP_ATANH: return ca_monop_atanh[in_data_type];
91
-
92
- case CA_MONOP_BYTE_SWAP: return ca_monop_byte_swap[in_data_type];
93
-
94
- case CA_MONOP_IMAG_I: return ca_monop_imag_i[in_data_type];
95
-
96
- case CA_MONOP_EXPM1: return ca_monop_expm1 [in_data_type];
97
- case CA_MONOP_LOG1P: return ca_monop_log1p [in_data_type];
98
- case CA_MONOP_RSQRT: return ca_monop_rsqrt [in_data_type];
99
- case CA_MONOP_TRUNC: return ca_monop_trunc [in_data_type];
100
- case CA_MONOP_SQUARE: return ca_monop_square[in_data_type];
101
-
102
- case CA_MONOP_DEG_360: return ca_monop_deg_360[in_data_type];
103
- case CA_MONOP_DEG_180: return ca_monop_deg_180[in_data_type];
104
- case CA_MONOP_RAD_2PI: return ca_monop_rad_2pi[in_data_type];
105
- case CA_MONOP_RAD_PI: return ca_monop_rad_pi [in_data_type];
106
-
107
- case CA_MONOP_SIGN: return ca_monop_sign [in_data_type];
108
- case CA_MONOP_ARG_I: return ca_monop_arg_i [in_data_type];
55
+ case CA_MONOP_ZERO: return ca_monop_zero;
56
+ case CA_MONOP_ONE: return ca_monop_one;
57
+ case CA_MONOP_FRAC: return ca_monop_frac;
58
+ case CA_MONOP_NEG: return ca_monop_neg;
59
+ case CA_MONOP_BIT_NEG: return ca_monop_bit_neg;
60
+ case CA_MONOP_ABS_I: return ca_monop_abs_i;
61
+ case CA_MONOP_CONJ: return ca_monop_conj;
62
+ case CA_MONOP_NOT: return ca_monop_not;
63
+
64
+ case CA_MONOP_CEIL: return ca_monop_ceil;
65
+ case CA_MONOP_FLOOR: return ca_monop_floor;
66
+ case CA_MONOP_ROUND: return ca_monop_round;
67
+ case CA_MONOP_RCP: return ca_monop_rcp;
68
+
69
+ case CA_MONOP_RAD: return ca_monop_rad;
70
+ case CA_MONOP_DEG: return ca_monop_deg;
71
+ case CA_MONOP_SQRT: return ca_monop_sqrt;
72
+ case CA_MONOP_EXP: return ca_monop_exp;
73
+ case CA_MONOP_EXP2: return ca_monop_exp2;
74
+ case CA_MONOP_EXP10: return ca_monop_exp10;
75
+ case CA_MONOP_LOG: return ca_monop_log;
76
+ case CA_MONOP_LOG10: return ca_monop_log10;
77
+ case CA_MONOP_LOG2: return ca_monop_log2;
78
+ case CA_MONOP_LOGB: return ca_monop_logb;
79
+ case CA_MONOP_SIN: return ca_monop_sin;
80
+ case CA_MONOP_COS: return ca_monop_cos;
81
+ case CA_MONOP_TAN: return ca_monop_tan;
82
+ case CA_MONOP_ASIN: return ca_monop_asin;
83
+ case CA_MONOP_ACOS: return ca_monop_acos;
84
+ case CA_MONOP_ATAN: return ca_monop_atan;
85
+ case CA_MONOP_SINH: return ca_monop_sinh;
86
+ case CA_MONOP_COSH: return ca_monop_cosh;
87
+ case CA_MONOP_TANH: return ca_monop_tanh;
88
+ case CA_MONOP_ASINH: return ca_monop_asinh;
89
+ case CA_MONOP_ACOSH: return ca_monop_acosh;
90
+ case CA_MONOP_ATANH: return ca_monop_atanh;
91
+
92
+ case CA_MONOP_BYTE_SWAP: return ca_monop_byte_swap;
93
+
94
+ case CA_MONOP_IMAG_I: return ca_monop_imag_i;
95
+
96
+ case CA_MONOP_EXPM1: return ca_monop_expm1;
97
+ case CA_MONOP_LOG1P: return ca_monop_log1p;
98
+ case CA_MONOP_RSQRT: return ca_monop_rsqrt;
99
+ case CA_MONOP_TRUNC: return ca_monop_trunc;
100
+ case CA_MONOP_SQUARE: return ca_monop_square;
101
+
102
+ case CA_MONOP_DEG_360: return ca_monop_deg_360;
103
+ case CA_MONOP_DEG_180: return ca_monop_deg_180;
104
+ case CA_MONOP_RAD_2PI: return ca_monop_rad_2pi;
105
+ case CA_MONOP_RAD_PI: return ca_monop_rad_pi;
106
+
107
+ case CA_MONOP_SIGN: return ca_monop_sign;
108
+ case CA_MONOP_ARG_I: return ca_monop_arg_i;
109
109
 
110
110
  default:
111
111
  /* Cast ops or unknown — caller handles cast specially. */
@@ -113,6 +113,29 @@ ca_monop_kernel_lookup (uint16_t op_id, int8_t in_data_type)
113
113
  }
114
114
  }
115
115
 
116
+ /* Returns the kernel for the given input data_type. Returns NULL for
117
+ cast ops and unknown op_ids. */
118
+ ca_monop_func_t
119
+ ca_monop_kernel_lookup (uint16_t op_id, int8_t in_data_type)
120
+ {
121
+ ca_monop_func_t *table = ca_monop_table_of(op_id);
122
+ return table ? table[in_data_type] : NULL;
123
+ }
124
+
125
+ /* The op id whose kernel table is `table`, or -1 for a table no op id
126
+ names. */
127
+ int
128
+ ca_monop_op_id_of_table (ca_monop_func_t table[])
129
+ {
130
+ int op_id;
131
+ for ( op_id = 0; op_id < CA_MONOP_CAST_BASE; op_id++ ) {
132
+ if ( ca_monop_table_of((uint16_t) op_id) == table ) return op_id;
133
+ }
134
+ return -1;
135
+ }
136
+
137
+
138
+
116
139
  /* ------------------------------------------------------------------- */
117
140
  /* op category predicates */
118
141
  /* ------------------------------------------------------------------- */
@@ -190,6 +190,7 @@ extern ca_monop_func_t ca_monop_arg_i [CA_NTYPE];
190
190
  /* Look up the per-data_type kernel for a normal monop op_id. Returns NULL
191
191
  for cast op_ids (caller handles cast via ca_cast_block). */
192
192
  ca_monop_func_t ca_monop_kernel_lookup (uint16_t op_id, int8_t in_data_type);
193
+ int ca_monop_op_id_of_table (ca_monop_func_t table[]);
193
194
 
194
195
  /* Returns true iff op_id encodes a cast operation. */
195
196
  int ca_monop_is_cast (uint16_t op_id);
data/ext/ca_obj_array.c CHANGED
@@ -61,7 +61,10 @@ const rb_data_type_t carray_data_type = {
61
61
  .dsize = ca_dsize,
62
62
  .dcompact = NULL
63
63
  },
64
- .flags = RUBY_TYPED_FREE_IMMEDIATELY,
64
+ /* A frozen entity is shared between Ractors: reading it writes nothing
65
+ to its struct (an entity takes no attach count), so each Ractor makes
66
+ its own views of it. */
67
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_FROZEN_SHAREABLE,
65
68
  };
66
69
 
67
70
  const rb_data_type_t cawrap_data_type = {
@@ -85,7 +88,10 @@ const rb_data_type_t cscalar_data_type = {
85
88
  .dsize = ca_dsize,
86
89
  .dcompact = NULL
87
90
  },
88
- .flags = RUBY_TYPED_FREE_IMMEDIATELY
91
+ /* A frozen entity is shared between Ractors: reading it writes nothing
92
+ to its struct (an entity takes no attach count), so each Ractor makes
93
+ its own views of it. */
94
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_FROZEN_SHAREABLE
89
95
  };
90
96
 
91
97
  const rb_data_type_t caview_data_type = {
@@ -142,10 +148,10 @@ carray_setup_i (CArray *ca,
142
148
  ca_size_t k;
143
149
 
144
150
  /* check arguments */
145
- CA_CHECK_DATA_TYPE(data_type);
146
- CA_CHECK_RANK(ndim);
147
- CA_CHECK_DIM(ndim, dim);
148
- CA_CHECK_BYTES(data_type, bytes);
151
+ CA_CHECK_DATA_TYPE_GIVEN(data_type);
152
+ CA_CHECK_RANK_GIVEN(ndim);
153
+ CA_CHECK_DIM_GIVEN(ndim, dim);
154
+ CA_CHECK_BYTES_GIVEN(data_type, bytes);
149
155
 
150
156
  elements = ca_shape_elements(ndim, dim, bytes);
151
157
 
@@ -190,16 +196,14 @@ carray_setup_i (CArray *ca,
190
196
 
191
197
  /* allocate memory for entity */
192
198
  if ( use_calloc ) {
193
- /* ca->ptr = ALLOC_N(char, elements * bytes); */
194
- ca->ptr = xmalloc(elements * bytes);
199
+ ca->ptr = xmalloc(elements * bytes); /* cells: set to 0 below */
195
200
  MEMZERO(ca->ptr, char, elements * bytes);
196
201
  }
197
202
  else {
198
- /* ca->ptr = ALLOC_N(char, elements * bytes); */
199
- ca->ptr = xmalloc(elements * bytes);
203
+ ca->ptr = xmalloc(elements * bytes); /* cells: set to 0 below */
200
204
  }
201
205
 
202
- /* initialize elements with Qnil for CA_OBJECT data_type */
206
+ /* an object array starts with every cell 0 */
203
207
  if ( allocate && data_type == CA_OBJECT ) {
204
208
  volatile VALUE zero = SIZE2NUM(0);
205
209
  VALUE *p = (VALUE *) ca->ptr;
@@ -215,6 +219,7 @@ carray_setup_i (CArray *ca,
215
219
 
216
220
  ca->mask = NULL;
217
221
  if ( mask ) {
222
+ /* mask: only initialize_copy passes one, on a struct Ruby owns */
218
223
  ca_setup_mask(ca, mask);
219
224
  }
220
225
 
@@ -243,9 +248,12 @@ ca_wrap_setup (CArray *ca,
243
248
  int ret;
244
249
 
245
250
  ret = carray_setup_i(ca, data_type, ndim, dim, bytes, mask, 0, 0, NULL);
246
- if ( (!ptr) && (ca->elements != 0) ) {
251
+ if ( (!ptr) && ca_shape_elements(ndim, dim, bytes) != 0 ) {
247
252
  rb_raise(rb_eRuntimeError, "wrapping NULL pointer with an non-empty array");
248
253
  }
254
+ if ( ca == NULL ) { /* checks only */
255
+ return ret;
256
+ }
249
257
  ca->ptr = ptr;
250
258
  return ret;
251
259
  }
@@ -258,19 +266,44 @@ ca_wrap_setup_null (CArray *ca,
258
266
  int ret;
259
267
 
260
268
  ret = carray_setup_i(ca, data_type, ndim, dim, bytes, mask, 0, 0, NULL);
261
- ca->ptr = NULL;
269
+ if ( ca != NULL ) {
270
+ ca->ptr = NULL;
271
+ }
262
272
  return ret;
263
273
  }
264
274
 
275
+ static VALUE
276
+ carray_new_copy_mask (VALUE arg)
277
+ {
278
+ void **a = (void **) arg;
279
+ ca_setup_mask((CArray *) a[0], (CArray *) a[1]);
280
+ return Qnil;
281
+ }
282
+
283
+ /* Reading the mask to copy can call Ruby (a CAObject's mask hooks) and
284
+ raise, while the new array belongs to no Ruby object yet. The array is
285
+ built without it, and the mask is copied in under ca_fill_or_free. */
286
+ static CArray *
287
+ carray_new_with_mask (CArray *ca, CArray *mask)
288
+ {
289
+ if ( mask ) {
290
+ void *a[2];
291
+ a[0] = ca;
292
+ a[1] = mask;
293
+ ca_fill_or_free(ca, carray_new_copy_mask, (VALUE) a);
294
+ }
295
+ return ca;
296
+ }
297
+
265
298
  CArray *
266
299
  carray_new (int8_t data_type, int8_t ndim, ca_size_t *dim, ca_size_t bytes,
267
300
  CArray *mask)
268
301
  {
269
302
  CArray *ca;
270
- carray_setup(NULL, data_type, ndim, dim, bytes, mask);
303
+ carray_setup(NULL, data_type, ndim, dim, bytes, NULL);
271
304
  ca = (CArray *) ca_array_alloc(CA_OBJ_ARRAY, ndim);
272
- carray_setup(ca, data_type, ndim, dim, bytes, mask);
273
- return ca;
305
+ carray_setup(ca, data_type, ndim, dim, bytes, NULL);
306
+ return carray_new_with_mask(ca, mask);
274
307
  }
275
308
 
276
309
  CArray *
@@ -278,10 +311,10 @@ carray_new_safe (int8_t data_type, int8_t ndim, ca_size_t *dim, ca_size_t bytes,
278
311
  CArray *mask)
279
312
  {
280
313
  CArray *ca;
281
- carray_safe_setup(NULL, data_type, ndim, dim, bytes, mask);
314
+ carray_safe_setup(NULL, data_type, ndim, dim, bytes, NULL);
282
315
  ca = (CArray *) ca_array_alloc(CA_OBJ_ARRAY, ndim);
283
- carray_safe_setup(ca, data_type, ndim, dim, bytes, mask);
284
- return ca;
316
+ carray_safe_setup(ca, data_type, ndim, dim, bytes, NULL);
317
+ return carray_new_with_mask(ca, mask);
285
318
  }
286
319
 
287
320
  /* Create an entity that adopts a caller-provided data buffer instead of
@@ -297,6 +330,7 @@ carray_new_adopt (int8_t data_type, int8_t ndim, ca_size_t *dim, ca_size_t bytes
297
330
  if ( ! ptr ) {
298
331
  rb_raise(rb_eRuntimeError, "carray_new_adopt: NULL data pointer");
299
332
  }
333
+ carray_setup_i(NULL, data_type, ndim, dim, bytes, NULL, 0, 0, ptr);
300
334
  ca = (CArray *) ca_array_alloc(CA_OBJ_ARRAY, ndim);
301
335
  carray_setup_i(ca, data_type, ndim, dim, bytes, NULL, 0, 0, ptr);
302
336
  return ca;
@@ -306,18 +340,22 @@ CAWrap *
306
340
  ca_wrap_new (int8_t data_type, int8_t ndim, ca_size_t *dim, ca_size_t bytes,
307
341
  CArray *mask, char *ptr)
308
342
  {
309
- CAWrap *ca = (CAWrap *) ca_array_alloc(CA_OBJ_ARRAY_WRAP, ndim);
310
- ca_wrap_setup(ca, data_type, ndim, dim, bytes, mask, ptr);
311
- return ca;
343
+ CAWrap *ca;
344
+ ca_wrap_setup(NULL, data_type, ndim, dim, bytes, NULL, ptr);
345
+ ca = (CAWrap *) ca_array_alloc(CA_OBJ_ARRAY_WRAP, ndim);
346
+ ca_wrap_setup(ca, data_type, ndim, dim, bytes, NULL, ptr);
347
+ return (CAWrap *) carray_new_with_mask((CArray *) ca, mask);
312
348
  }
313
349
 
314
350
  CAWrap *
315
351
  ca_wrap_new_null (int8_t data_type, int8_t ndim, ca_size_t *dim, ca_size_t bytes,
316
352
  CArray *mask)
317
353
  {
318
- CAWrap *ca = (CAWrap *) ca_array_alloc(CA_OBJ_ARRAY_WRAP, ndim);
319
- ca_wrap_setup_null(ca, data_type, ndim, dim, bytes, mask);
320
- return ca;
354
+ CAWrap *ca;
355
+ ca_wrap_setup_null(NULL, data_type, ndim, dim, bytes, NULL);
356
+ ca = (CAWrap *) ca_array_alloc(CA_OBJ_ARRAY_WRAP, ndim);
357
+ ca_wrap_setup_null(ca, data_type, ndim, dim, bytes, NULL);
358
+ return (CAWrap *) carray_new_with_mask((CArray *) ca, mask);
321
359
  }
322
360
 
323
361
  void
@@ -360,8 +398,14 @@ static int
360
398
  cscalar_setup (CScalar *ca,
361
399
  int8_t data_type, ca_size_t bytes, CArray *mask)
362
400
  {
363
- CA_CHECK_DATA_TYPE(data_type);
364
- CA_CHECK_BYTES(data_type, bytes);
401
+ CA_CHECK_DATA_TYPE_GIVEN(data_type);
402
+ CA_CHECK_BYTES_GIVEN(data_type, bytes);
403
+
404
+ /* ca == NULL asks for the checks above only, so that a constructor can
405
+ run them before it allocates. */
406
+ if ( ca == NULL ) {
407
+ return 0;
408
+ }
365
409
 
366
410
  ca->obj_type = CA_OBJ_SCALAR;
367
411
  ca->data_type = data_type;
@@ -370,7 +414,7 @@ cscalar_setup (CScalar *ca,
370
414
  ca->bytes = bytes;
371
415
  ca->elements = 1;
372
416
  ca->dim = &(ca->_dim);
373
- ca->ptr = xmalloc(bytes);
417
+ ca->ptr = xmalloc(bytes); /* cells: the one cell is set to 0 below */
374
418
  ca->mask = NULL;
375
419
 
376
420
  ca->dim[0] = 1;
@@ -383,6 +427,7 @@ cscalar_setup (CScalar *ca,
383
427
  }
384
428
 
385
429
  if ( mask ) {
430
+ /* mask: the constructors pass none (carray_new_with_mask copies it) */
386
431
  ca_setup_mask((CArray *)ca, mask);
387
432
  }
388
433
 
@@ -398,9 +443,11 @@ cscalar_setup (CScalar *ca,
398
443
  CScalar *
399
444
  cscalar_new (int8_t data_type, ca_size_t bytes, CArray *mask)
400
445
  {
401
- CScalar *ca = ALLOC(CScalar);
402
- cscalar_setup(ca, data_type, bytes, mask);
403
- return ca;
446
+ CScalar *ca;
447
+ cscalar_setup(NULL, data_type, bytes, NULL);
448
+ ca = ALLOC(CScalar);
449
+ cscalar_setup(ca, data_type, bytes, NULL);
450
+ return (CScalar *) carray_new_with_mask((CArray *) ca, mask);
404
451
  }
405
452
 
406
453
  /*
@@ -410,7 +457,9 @@ cscalar_new (int8_t data_type, ca_size_t bytes, CArray *mask)
410
457
  CScalar *
411
458
  cscalar_new2 (int8_t data_type, ca_size_t bytes, char *val)
412
459
  {
413
- CScalar *ca = ALLOC(CScalar);
460
+ CScalar *ca;
461
+ cscalar_setup(NULL, data_type, bytes, NULL);
462
+ ca = ALLOC(CScalar);
414
463
  cscalar_setup(ca, data_type, bytes, NULL);
415
464
  memcpy(ca->ptr, val, ca->bytes);
416
465
  return ca;
@@ -591,6 +640,7 @@ ca_fill_stride_buffer (char *dst, ca_size_t bytes, ca_size_t base, int8_t ndim,
591
640
  outer_ndim = ndim - 1;
592
641
 
593
642
  for ( k = 0; k < outer_ndim; k++ ) idx[k] = 0;
643
+ /* empty: the function returns on an empty region at its entry */
594
644
  while ( 1 ) {
595
645
  ca_size_t addr = base;
596
646
  char *p;
@@ -824,7 +874,7 @@ rb_ca_s_allocate (VALUE klass)
824
874
  }
825
875
 
826
876
  /* Reads the (data_type, dim, bytes: nil) argument list that CArray.new
827
- and CArray.__empty__ share. The two differ only in whether the buffer
877
+ and CArray.empty_of_data_type share. The two differ only in whether the buffer
828
878
  is filled, so the rule for reading their arguments -- the optional
829
879
  bytes for a fixlen, the refusal of a Class, the guess of the data type,
830
880
  the demand that dim be an Array -- is written once here. */
@@ -855,7 +905,7 @@ ca_scan_construct_args (int argc, VALUE *argv, int8_t *data_type,
855
905
  rb_ca_guess_type_and_bytes(rtype, rbytes, data_type, bytes);
856
906
 
857
907
  Check_Type(rdim, T_ARRAY);
858
- CA_CHECK_RANK(RARRAY_LEN(rdim)); /* before dim[] is filled */
908
+ CA_CHECK_RANK_GIVEN(RARRAY_LEN(rdim)); /* before dim[] is filled */
859
909
  *ndim = RARRAY_LEN(rdim);
860
910
  for (i=0; i<*ndim; i++) {
861
911
  dim[i] = NUM2SIZE(rb_ary_entry(rdim, i));
@@ -907,8 +957,13 @@ rb_ca_initialize (int argc, VALUE *argv, VALUE self)
907
957
  with the multi-dimensional subscript yielded as individual
908
958
  integer arguments, so |i|, |i,j|, |i,j,k| all work uniformly
909
959
  across ranks. Block forms that want the whole subscript as
910
- an Array should write |*idx|. */
911
- if ( rb_proc_arity(rb_block_proc()) == 0 ) {
960
+ an Array should write |*idx|.
961
+ An array of no cells calls neither, as Array.new(0) { ... } does
962
+ not. */
963
+ if ( ca->elements == 0 ) {
964
+ ;
965
+ }
966
+ else if ( rb_proc_arity(rb_block_proc()) == 0 ) {
912
967
  volatile VALUE rval = rb_yield_values2(0, NULL);
913
968
  rb_ca_store_all(self, rval);
914
969
  }
@@ -1160,6 +1215,7 @@ rb_ca_initialize_dup (VALUE self, VALUE other)
1160
1215
  {
1161
1216
  rb_call_super(1, &other);
1162
1217
  ca_dup_keep_state(self, other);
1218
+ rb_ca_own_attr(self);
1163
1219
  return self;
1164
1220
  }
1165
1221
 
@@ -1177,6 +1233,7 @@ rb_ca_initialize_clone (int argc, VALUE *argv, VALUE self)
1177
1233
  rb_call_super_kw(argc, argv, RB_PASS_CALLED_KEYWORDS);
1178
1234
  rb_scan_args(argc, argv, "1:", &orig, &opts);
1179
1235
  ca_dup_keep_state(self, orig);
1236
+ rb_ca_own_attr(self);
1180
1237
 
1181
1238
  if ( ! NIL_P(opts) ) {
1182
1239
  vfreeze = rb_hash_lookup2(opts, ID2SYM(rb_intern("freeze")), Qnil);
@@ -1246,7 +1303,7 @@ rb_ca_s_wrap (int argc, VALUE *argv, VALUE self)
1246
1303
  rb_ca_guess_type_and_bytes(rtype, rbytes, &data_type, &bytes);
1247
1304
 
1248
1305
  Check_Type(rdim, T_ARRAY);
1249
- CA_CHECK_RANK(RARRAY_LEN(rdim)); /* before dim[] is filled */
1306
+ CA_CHECK_RANK_GIVEN(RARRAY_LEN(rdim)); /* before dim[] is filled */
1250
1307
  ndim = RARRAY_LEN(rdim);
1251
1308
  for (i=0; i<ndim; i++) {
1252
1309
  dim[i] = NUM2SIZE(rb_ary_entry(rdim, i));
@@ -1552,7 +1609,7 @@ rb_ca_s_alloc_uninit (VALUE klass, VALUE rtype, VALUE rshape)
1552
1609
  int8_t i;
1553
1610
  rb_ca_guess_type_and_bytes(rtype, Qnil, &data_type, &bytes);
1554
1611
  Check_Type(rshape, T_ARRAY);
1555
- CA_CHECK_RANK(RARRAY_LEN(rshape)); /* before dim[] is filled */
1612
+ CA_CHECK_RANK_GIVEN(RARRAY_LEN(rshape)); /* before dim[] is filled */
1556
1613
  ndim = (int8_t) RARRAY_LEN(rshape);
1557
1614
  for (i = 0; i < ndim; i++) dim[i] = NUM2SIZE(rb_ary_entry(rshape, i));
1558
1615
  return rb_carray_new(data_type, ndim, dim, bytes, NULL);
@@ -1596,7 +1653,7 @@ Init_ca_obj_array (void)
1596
1653
  rb_define_method(rb_cCArray, "initialize", rb_ca_initialize, -1);
1597
1654
  rb_define_singleton_method(rb_cCArray, "__alloc_uninit__",
1598
1655
  rb_ca_s_alloc_uninit, 2);
1599
- rb_define_singleton_method(rb_cCArray, "__empty__", rb_ca_s_empty, -1);
1656
+ rb_define_private_method(rb_singleton_class(rb_cCArray), "empty_of_data_type", rb_ca_s_empty, -1);
1600
1657
 
1601
1658
  rb_define_singleton_method(rb_cCArray, "fixlen", rb_ca_s_fixlen, -1);
1602
1659
  rb_define_singleton_method(rb_cCArray, "boolean", rb_ca_s_boolean, -1);
data/ext/ca_obj_bincmp.c CHANGED
@@ -74,10 +74,7 @@ typedef struct CABinCmp {
74
74
  target of both left & right, also the
75
75
  kernel lookup key) */
76
76
  double eps; /* Runtime tolerance slot for IS_CLOSE /
77
- IS_EQUIV; ignored for other ops. The
78
- `eps` name is retained to keep the
79
- `__eps__` Ruby accessor stable across
80
- the dual purpose. */
77
+ IS_EQUIV; ignored for other ops. */
81
78
  int8_t sign_fix; /* 0, or the side (1 left, 2 right) of an
82
79
  int64 operand compared with a uint64 one:
83
80
  the kernel compares both as uint64 and
@@ -179,6 +176,7 @@ ca_bincmp_setup (CABinCmp *ca, CArray *left, CArray *right, uint16_t op_id,
179
176
  CABinCmp *
180
177
  ca_bincmp_new (CArray *left, CArray *right, uint16_t op_id, double eps)
181
178
  {
179
+ /* check: the setup checks nothing */
182
180
  CABinCmp *ca = (CABinCmp *) ca_array_alloc(CA_OBJ_BINCMP, left->ndim);
183
181
  ca_bincmp_setup(ca, left, right, op_id, eps);
184
182
  return ca;
@@ -226,7 +224,7 @@ ca_bincmp_func_xfer_index (void *ap, ca_size_t *idx, void *data, int dir)
226
224
  int8_t k;
227
225
 
228
226
  if ( dir != CA_XFER_GET ) {
229
- rb_raise(rb_eRuntimeError, "CABinCmp is read-only (xfer_index PUT)");
227
+ ca_refuse_read_only();
230
228
  }
231
229
 
232
230
  for ( k = ca->ndim - 1; k >= 0; k-- ) {
@@ -412,7 +410,7 @@ ca_bincmp_eval (CABinCmp *bc, const ca_lazy_req_t *req, void *data)
412
410
  "CABinCmp: kernel not implemented (op_id=%u data_type=%d)",
413
411
  (unsigned) bc->op_id, (int) bc->common_dt);
414
412
  }
415
- if ( bc->common_dt == CA_OBJECT ) {
413
+ if ( ca_op_raises_on_cell(CA_OP_KIND_BINCMP, bc->op_id, bc->common_dt) ) {
416
414
  slab_mask = ca_lazy_req_mask(req, 2, bc->operands);
417
415
  }
418
416
  fn(slab_n, slab_mask,
@@ -446,7 +444,7 @@ ca_bincmp_func_xfer_stride (void *ap, ca_size_t *starts, ca_size_t *counts,
446
444
  if ( ca_region_is_empty(((CArray *) ap)->ndim, counts) ) return;
447
445
  ca_lazy_req_t req;
448
446
  if ( dir != CA_XFER_GET ) {
449
- rb_raise(rb_eRuntimeError, "CABinCmp is read-only (xfer_stride PUT)");
447
+ ca_refuse_read_only();
450
448
  }
451
449
  ca_lazy_req_region(&req, ap, starts, counts, strides);
452
450
  ca_bincmp_eval((CABinCmp *) ap, &req, data);
@@ -459,7 +457,7 @@ ca_bincmp_func_xfer_addrs (void *ap, ca_size_t n, ca_size_t *addrs,
459
457
  {
460
458
  ca_lazy_req_t req;
461
459
  if ( dir != CA_XFER_GET ) {
462
- rb_raise(rb_eRuntimeError, "CABinCmp is read-only (xfer_addrs PUT)");
460
+ ca_refuse_read_only();
463
461
  }
464
462
  ca_lazy_req_addrs(&req, n, addrs);
465
463
  ca_bincmp_eval((CABinCmp *) ap, &req, data);
@@ -482,7 +480,7 @@ static void
482
480
  ca_bincmp_func_allocate (void *ap)
483
481
  {
484
482
  CABinCmp *ca = (CABinCmp *) ap;
485
- ca->ptr = xmalloc(ca_length(ca));
483
+ ca->ptr = ca_alloc_cells((CArray *) ca);
486
484
  }
487
485
 
488
486
  static void
@@ -499,7 +497,7 @@ ca_bincmp_func_attach (void *ap)
499
497
  int8_t k;
500
498
  ca_size_t s;
501
499
 
502
- ca->ptr = xmalloc(ca_length(ca));
500
+ ca->ptr = ca_alloc_cells((CArray *) ca);
503
501
 
504
502
  s = ca->bytes;
505
503
  for ( k = ca->ndim - 1; k >= 0; k-- ) { native[k] = s; s *= ca->dim[k]; }
@@ -525,7 +523,7 @@ NORETURN(static void ca_bincmp_func_fill_data (void *ap, void *ptr));
525
523
  static void
526
524
  ca_bincmp_func_fill_data (void *ap, void *ptr)
527
525
  {
528
- rb_raise(rb_eRuntimeError, "CABinCmp is read-only (fill_data)");
526
+ ca_refuse_read_only();
529
527
  }
530
528
 
531
529
  /* mask = left.mask | right.mask, computed on each read (CAMaskOfOperands). */
@@ -580,6 +578,14 @@ rb_ca_bincmp_new (VALUE l_cary, VALUE r_cary, uint16_t op_id, double eps)
580
578
  rb_check_carray_object(r_cary);
581
579
  TypedData_Get_Struct(l_cary, CArray, &carray_data_type, l);
582
580
  TypedData_Get_Struct(r_cary, CArray, &carray_data_type, r);
581
+ /* No kernel for the type the builder cast to: refuse as the eager
582
+ comparison does, before anything is allocated. */
583
+ {
584
+ ca_bincmp_func_t fn = ca_bincmp_kernel_lookup(op_id, l->data_type);
585
+ if ( fn == NULL || fn == ca_bincmp_not_implement ) {
586
+ ca_op_refuse_unimplemented(l_cary, l->data_type, rb_eTypeError);
587
+ }
588
+ }
583
589
  ca = ca_bincmp_new(l, r, op_id, eps);
584
590
  obj = ca_wrap_struct(ca);
585
591
  rb_ca_set_parent(obj, l_cary);
@@ -711,6 +717,7 @@ rb_ca_bincmp_s_build (int argc, VALUE *argv, VALUE klass)
711
717
  double eps = 0.0;
712
718
  (void) klass;
713
719
  rb_scan_args(argc, argv, "31", &l_cary, &r_cary, &op_id_val, &eps_val);
720
+ /* fits: an operation number from the library's own table */
714
721
  op_id = (uint16_t) NUM2UINT(op_id_val);
715
722
  if ( argc >= 4 ) eps = NUM2DBL(eps_val);
716
723
  return rb_ca_bincmp_build(l_cary, r_cary, op_id, eps);
@@ -724,7 +731,8 @@ rb_ca_bincmp_trapping (VALUE self)
724
731
  {
725
732
  CABinCmp *bc;
726
733
  TypedData_Get_Struct(self, CABinCmp, &cabincmp_data_type, bc);
727
- return ( bc->common_dt == CA_OBJECT ) ? Qtrue : Qfalse;
734
+ return ca_op_raises_on_cell(CA_OP_KIND_BINCMP, bc->op_id, bc->common_dt)
735
+ ? Qtrue : Qfalse;
728
736
  }
729
737
 
730
738
  static VALUE
@@ -741,14 +749,7 @@ rb_ca_bincmp_right (VALUE self)
741
749
  return rb_ivar_get(self, rb_intern("__bincmp_right__"));
742
750
  }
743
751
 
744
- static VALUE
745
- rb_ca_bincmp_eps (VALUE self)
746
- {
747
- CABinCmp *bc;
748
- TypedData_Get_Struct(self, CABinCmp, &cabincmp_data_type, bc);
749
- return rb_float_new(bc->eps);
750
- }
751
-
752
+ #ifdef CARRAY_DEV_BUILD
752
753
  static VALUE
753
754
  rb_ca_bincmp_s_reset_scratch_counter (VALUE klass)
754
755
  {
@@ -793,6 +794,7 @@ rb_ca_bincmp_s_leaf_inplace_count (VALUE klass)
793
794
  (void) klass;
794
795
  return SIZE2NUM(ca_bincmp_leaf_inplace_count);
795
796
  }
797
+ #endif /* CARRAY_DEV_BUILD */
796
798
 
797
799
  static VALUE
798
800
  rb_ca_bincmp_s_allocate (VALUE klass)
@@ -853,8 +855,8 @@ Init_ca_obj_bincmp (void)
853
855
  rb_define_method(rb_cCABinCmp, "__trapping__", rb_ca_bincmp_trapping, 0);
854
856
  rb_define_method(rb_cCABinCmp, "__bincmp_right__",
855
857
  rb_ca_bincmp_right, 0);
856
- rb_define_method(rb_cCABinCmp, "__eps__", rb_ca_bincmp_eps, 0);
857
858
 
859
+ #ifdef CARRAY_DEV_BUILD
858
860
  rb_define_singleton_method(rb_cCABinCmp, "__reset_scratch_counter__",
859
861
  rb_ca_bincmp_s_reset_scratch_counter, 0);
860
862
  rb_define_singleton_method(rb_cCABinCmp, "__scratch_count__",
@@ -867,4 +869,5 @@ Init_ca_obj_bincmp (void)
867
869
  rb_ca_bincmp_s_reset_leaf_inplace_counter, 0);
868
870
  rb_define_singleton_method(rb_cCABinCmp, "__leaf_inplace_count__",
869
871
  rb_ca_bincmp_s_leaf_inplace_count, 0);
872
+ #endif
870
873
  }