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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +264 -0
- data/README.md +3 -2
- data/carray.gemspec +1 -1
- data/ext/ca_axis_descriptor.h +27 -24
- data/ext/ca_axis_dispatch.c +1 -6
- data/ext/ca_axis_group.c +27 -27
- data/ext/ca_binop_dispatch.c +1 -29
- data/ext/ca_binop_dispatch.h +0 -1
- data/ext/ca_categorical_iterator.c +205 -134
- data/ext/ca_compare.c +7 -18
- data/ext/ca_group_iter.c +16 -17
- data/ext/ca_kernel_iterator.c +1234 -1994
- data/ext/ca_kernel_iterator.h +391 -437
- data/ext/ca_monop_dispatch.c +82 -59
- data/ext/ca_monop_dispatch.h +1 -0
- data/ext/ca_obj_array.c +96 -39
- data/ext/ca_obj_bincmp.c +24 -21
- data/ext/ca_obj_binop.c +15 -26
- data/ext/ca_obj_bitarray.c +3 -2
- data/ext/ca_obj_bitfield.c +5 -6
- data/ext/ca_obj_block.c +18 -9
- data/ext/ca_obj_byte_swap.c +5 -6
- data/ext/ca_obj_const_string.c +173 -19
- data/ext/ca_obj_face.c +238 -57
- data/ext/ca_obj_face.h +19 -0
- data/ext/ca_obj_fake.c +15 -29
- data/ext/ca_obj_farray.c +6 -3
- data/ext/ca_obj_field.c +17 -5
- data/ext/ca_obj_fixlen_string.c +2 -3
- data/ext/ca_obj_grid.c +406 -132
- data/ext/ca_obj_meld.c +172 -34
- data/ext/ca_obj_moncmp.c +23 -8
- data/ext/ca_obj_monop.c +67 -57
- data/ext/ca_obj_object.c +157 -51
- data/ext/ca_obj_record.c +12 -7
- data/ext/ca_obj_reduce.c +13 -8
- data/ext/ca_obj_refer.c +25 -27
- data/ext/ca_obj_remap.c +30 -9
- data/ext/ca_obj_repeat.c +9 -10
- data/ext/ca_obj_roll.c +6 -5
- data/ext/ca_obj_select.c +14 -9
- data/ext/ca_obj_select_axis.c +15 -47
- data/ext/ca_obj_shift.c +11 -1
- data/ext/ca_obj_stack.c +179 -34
- data/ext/ca_obj_stride.c +162 -115
- data/ext/ca_obj_string.c +71 -4
- data/ext/ca_obj_tile.c +6 -5
- data/ext/ca_obj_time.c +22 -6
- data/ext/ca_obj_timedelta.c +22 -6
- data/ext/ca_obj_transpose.c +5 -3
- data/ext/ca_obj_triop.c +23 -32
- data/ext/ca_obj_window.c +190 -26
- data/ext/ca_sweep_engine.c +2 -2
- data/ext/caframe_csv_reader.c +80 -1
- data/ext/carray.h +181 -75
- data/ext/carray_access.c +184 -96
- data/ext/carray_address_basis.c +343 -87
- data/ext/carray_attribute.c +89 -6
- data/ext/carray_bincount.c +10 -8
- data/ext/carray_broadcast.c +13 -8
- data/ext/carray_build_flags.h +3 -0
- data/ext/carray_call_cfunc.c +108 -0
- data/ext/carray_cast.c +142 -24
- data/ext/carray_cast_func.rb +46 -6
- data/ext/carray_class.c +4 -3
- data/ext/carray_config.h +28 -0
- data/ext/carray_conversion.c +16 -7
- data/ext/carray_copy.c +51 -14
- data/ext/carray_core.c +147 -55
- data/ext/carray_count.c +50 -20
- data/ext/carray_element.c +76 -33
- data/ext/carray_factorize.c +118 -64
- data/ext/carray_generate.c +191 -50
- data/ext/carray_histogram.c +62 -17
- data/ext/carray_hold.c +12 -15
- data/ext/carray_index_classifier.c +388 -176
- data/ext/carray_internal.h +336 -29
- data/ext/carray_kernels_bincmp.c +4453 -0
- data/ext/carray_kernels_binop.c +11368 -0
- data/ext/carray_kernels_init.c +1734 -0
- data/ext/carray_kernels_moncmp.c +2104 -0
- data/ext/carray_kernels_monop.c +18369 -0
- data/ext/carray_kernels_reduce_aggregate.c +23818 -0
- data/ext/carray_kernels_reduce_boolean.c +406 -0
- data/ext/carray_kernels_reduce_cumulative.c +10086 -0
- data/ext/carray_kernels_reduce_extreme.c +17634 -0
- data/ext/carray_kernels_reduce_variance.c +3849 -0
- data/ext/carray_kernels_scan.c +4302 -0
- data/ext/carray_kernels_search.c +33829 -0
- data/ext/carray_kernels_sort.c +10906 -0
- data/ext/carray_kernels_triop.c +1864 -0
- data/ext/carray_key_windows.c +216 -0
- data/ext/carray_lazy.c +170 -111
- data/ext/carray_mask.c +292 -72
- data/ext/carray_median_percentile.c +82 -28
- data/ext/carray_memory_view.c +669 -561
- data/ext/carray_operator.c +124 -47
- data/ext/carray_order.c +384 -76
- data/ext/carray_partition.c +28 -27
- data/ext/carray_random.c +67 -13
- data/ext/carray_round.c +273 -0
- data/ext/carray_scatter.c +63 -38
- data/ext/carray_segment.c +3 -3
- data/ext/carray_slab.c +91 -28
- data/ext/carray_sort.c +35 -35
- data/ext/carray_struct.c +19 -18
- data/ext/carray_test.c +26 -5
- data/ext/carray_undef.c +4 -0
- data/ext/carray_utils.c +246 -45
- data/ext/mk_call_cfunc.rb +19 -2
- data/ext/mkkernel.rb +198 -240
- data/ext/ruby_carray.c +10 -4
- data/ext/version.h +4 -4
- data/lib/carray/attribute.rb +126 -22
- data/lib/carray/autoload_carray.rb +8 -31
- data/lib/carray/autoload_method_extension.rb +14 -5
- data/lib/carray/axis_group.rb +255 -106
- data/lib/carray/basics.rb +78 -10
- data/lib/carray/bincount_nd.rb +12 -2
- data/lib/carray/block_iterator.rb +126 -23
- data/lib/carray/boolean_reduce.rb +17 -17
- data/lib/carray/categorical.rb +165 -43
- data/lib/carray/categorical_iterator.rb +130 -27
- data/lib/carray/complex.rb +5 -5
- data/lib/carray/conditional.rb +67 -18
- data/lib/carray/const_string.rb +14 -5
- data/lib/carray/construct.rb +15 -11
- data/lib/carray/data_type_extension.rb +1 -0
- data/lib/carray/distance_limit.rb +77 -0
- data/lib/carray/fixlen_string.rb +7 -1
- data/lib/carray/frame/column_verbs.rb +70 -0
- data/lib/carray/frame/convert.rb +69 -0
- data/lib/carray/frame/csv_parser.rb +111 -17
- data/lib/carray/frame/describe.rb +3 -2
- data/lib/carray/frame/frame.rb +246 -21
- data/lib/carray/frame/group.rb +510 -95
- data/lib/carray/frame/io.rb +115 -28
- data/lib/carray/frame/join.rb +312 -51
- data/lib/carray/frame/records.rb +83 -7
- data/lib/carray/frame/reshape.rb +42 -35
- data/lib/carray/frame/sort.rb +7 -19
- data/lib/carray/frame/verbs.rb +188 -48
- data/lib/carray/frame/windows.rb +117 -0
- data/lib/carray/frame.rb +2 -0
- data/lib/carray/fuse_source.rb +11 -4
- data/lib/carray/fusion.rb +40 -16
- data/lib/carray/histogram.rb +6 -1
- data/lib/carray/inspect.rb +31 -8
- data/lib/carray/iterator.rb +85 -7
- data/lib/carray/key_windows.rb +620 -0
- data/lib/carray/lazy.rb +182 -183
- data/lib/carray/mask_gap_fill.rb +63 -57
- data/lib/carray/meld_reduce.rb +12 -14
- data/lib/carray/methods/bin.rb +26 -18
- data/lib/carray/methods/bincount.rb +16 -0
- data/lib/carray/methods/bit_string.rb +1 -1
- data/lib/carray/methods/choose.rb +16 -3
- data/lib/carray/methods/composition.rb +3 -1
- data/lib/carray/methods/gather_nd.rb +14 -5
- data/lib/carray/methods/insert_block.rb +2 -2
- data/lib/carray/methods/is_between.rb +59 -0
- data/lib/carray/methods/is_in.rb +53 -36
- data/lib/carray/methods/join.rb +1 -6
- data/lib/carray/methods/lag.rb +49 -0
- data/lib/carray/methods/locate_addr.rb +47 -51
- data/lib/carray/methods/mode.rb +1 -1
- data/lib/carray/methods/nunique.rb +11 -6
- data/lib/carray/methods/resize.rb +3 -3
- data/lib/carray/methods/value_counts.rb +4 -11
- data/lib/carray/record_order.rb +3 -3
- data/lib/carray/rng.rb +3 -0
- data/lib/carray/runtime.rb +53 -8
- data/lib/carray/segment_iterator.rb +313 -82
- data/lib/carray/serialize.rb +24 -10
- data/lib/carray/slab_iterator.rb +50 -0
- data/lib/carray/string.rb +105 -5
- data/lib/carray/string_operation_extension.rb +8 -1
- data/lib/carray/struct.rb +9 -21
- data/lib/carray/struct_builder.rb +19 -8
- data/lib/carray/time.rb +726 -104
- data/lib/carray/window_iterator.rb +122 -16
- data/lib/carray.rb +7 -0
- data/yard-stubs/ca_obj_bitfield.rb +1 -1
- data/yard-stubs/ca_obj_field.rb +4 -0
- data/yard-stubs/ca_obj_grid.rb +21 -10
- data/yard-stubs/ca_obj_refer.rb +2 -1
- data/yard-stubs/ca_obj_roll.rb +2 -2
- data/yard-stubs/ca_obj_shift.rb +5 -1
- data/yard-stubs/ca_obj_tile.rb +1 -1
- data/yard-stubs/ca_obj_window.rb +8 -3
- data/yard-stubs/carray_access.rb +6 -1
- data/yard-stubs/carray_attribute.rb +0 -5
- data/yard-stubs/carray_cast.rb +10 -0
- data/yard-stubs/carray_conversion.rb +2 -1
- data/yard-stubs/carray_copy.rb +4 -2
- data/yard-stubs/carray_count.rb +4 -4
- data/yard-stubs/carray_element.rb +10 -4
- data/yard-stubs/carray_generate.rb +21 -1
- data/yard-stubs/carray_mask.rb +26 -2
- data/yard-stubs/carray_math.rb +27 -1
- data/yard-stubs/carray_median_percentile.rb +5 -2
- data/yard-stubs/carray_memory_view.rb +40 -23
- data/yard-stubs/carray_order.rb +29 -18
- data/yard-stubs/carray_random.rb +13 -4
- data/yard-stubs/carray_scatter.rb +14 -9
- data/yard-stubs/carray_slab.rb +9 -2
- data/yard-stubs/carray_sort.rb +6 -5
- data/yard-stubs/carray_test.rb +5 -3
- metadata +25 -3
- data/lib/carray/arrow_tensor.rb +0 -401
- data/lib/carray/table.rb +0 -108
data/ext/ca_monop_dispatch.c
CHANGED
|
@@ -45,67 +45,67 @@
|
|
|
45
45
|
/* op_id -> kernel table lookup */
|
|
46
46
|
/* ------------------------------------------------------------------- */
|
|
47
47
|
|
|
48
|
-
/*
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
ca_monop_func_t
|
|
52
|
-
|
|
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
|
|
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
|
|
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
|
/* ------------------------------------------------------------------- */
|
data/ext/ca_monop_dispatch.h
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
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
|
-
|
|
199
|
-
ca->ptr = xmalloc(elements * bytes);
|
|
203
|
+
ca->ptr = xmalloc(elements * bytes); /* cells: set to 0 below */
|
|
200
204
|
}
|
|
201
205
|
|
|
202
|
-
/*
|
|
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) && (
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
310
|
-
ca_wrap_setup(
|
|
311
|
-
|
|
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
|
|
319
|
-
ca_wrap_setup_null(
|
|
320
|
-
|
|
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
|
-
|
|
364
|
-
|
|
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
|
|
402
|
-
cscalar_setup(
|
|
403
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
}
|