carray 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.yardopts +5 -25
- data/CHANGELOG.md +16 -0
- data/LICENSE +1 -1
- data/NEWS.md +3 -0
- data/README.md +128 -44
- data/carray.gemspec +22 -24
- data/ext/ca_array_pool.c +91 -0
- data/ext/ca_axis_descriptor.h +186 -0
- data/ext/ca_axis_dispatch.c +924 -0
- data/ext/ca_axis_group.c +1208 -0
- data/ext/ca_bincmp_dispatch.c +76 -0
- data/ext/ca_bincmp_dispatch.h +85 -0
- data/ext/ca_binop_dispatch.c +125 -0
- data/ext/ca_binop_dispatch.h +159 -0
- data/ext/ca_categorical_iterator.c +1375 -0
- data/ext/ca_compare.c +94 -0
- data/ext/ca_compare.h +26 -0
- data/ext/ca_composite_dispatch.c +414 -0
- data/ext/ca_composite_dispatch.h +116 -0
- data/ext/ca_for_buffer.h +96 -0
- data/ext/ca_for_each_element.h +241 -0
- data/ext/ca_group_iter.c +304 -0
- data/ext/ca_iter_substrate.h +325 -0
- data/ext/ca_kernel_iterator.c +4321 -0
- data/ext/ca_kernel_iterator.h +2603 -0
- data/ext/ca_moncmp_dispatch.c +37 -0
- data/ext/ca_moncmp_dispatch.h +62 -0
- data/ext/ca_monop_dispatch.c +200 -0
- data/ext/ca_monop_dispatch.h +235 -0
- data/ext/ca_obj_array.c +355 -359
- data/ext/ca_obj_bincmp.c +809 -0
- data/ext/ca_obj_binop.c +892 -0
- data/ext/ca_obj_bitarray.c +369 -164
- data/ext/ca_obj_bitfield.c +294 -234
- data/ext/ca_obj_block.c +189 -711
- data/ext/ca_obj_byte_swap.c +766 -0
- data/ext/ca_obj_const_string.c +965 -0
- data/ext/ca_obj_face.c +670 -0
- data/ext/ca_obj_face.h +247 -0
- data/ext/ca_obj_fake.c +228 -100
- data/ext/ca_obj_farray.c +54 -441
- data/ext/ca_obj_field.c +82 -529
- data/ext/ca_obj_fixlen_string.c +306 -0
- data/ext/ca_obj_grid.c +858 -440
- data/ext/ca_obj_meld.c +1034 -0
- data/ext/ca_obj_moncmp.c +569 -0
- data/ext/ca_obj_monop.c +1111 -0
- data/ext/ca_obj_object.c +774 -298
- data/ext/ca_obj_record.c +468 -0
- data/ext/ca_obj_reduce.c +97 -82
- data/ext/ca_obj_refer.c +569 -459
- data/ext/ca_obj_remap.c +475 -0
- data/ext/ca_obj_repeat.c +92 -477
- data/ext/ca_obj_roll.c +616 -0
- data/ext/ca_obj_select.c +344 -296
- data/ext/ca_obj_select_axis.c +1296 -0
- data/ext/ca_obj_shift.c +230 -792
- data/ext/ca_obj_source.c +78 -0
- data/ext/ca_obj_stack.c +1173 -0
- data/ext/ca_obj_stride.c +2501 -0
- data/ext/ca_obj_string.c +268 -0
- data/ext/ca_obj_tile.c +614 -0
- data/ext/ca_obj_time.c +546 -0
- data/ext/ca_obj_timedelta.c +435 -0
- data/ext/ca_obj_transpose.c +62 -516
- data/ext/ca_obj_triop.c +746 -0
- data/ext/ca_obj_unbound_repeat.c +208 -241
- data/ext/ca_obj_window.c +1131 -563
- data/ext/ca_op_byte_swap.c +175 -0
- data/ext/ca_op_ipower.c +319 -0
- data/ext/ca_op_powi.h +88 -0
- data/ext/ca_sort_kernels.h +132 -0
- data/ext/ca_sweep_engine.c +430 -0
- data/ext/ca_sweep_engine.h +157 -0
- data/ext/ca_transform_common.c +228 -0
- data/ext/ca_triop_dispatch.c +55 -0
- data/ext/ca_triop_dispatch.h +62 -0
- data/ext/carray.h +795 -402
- data/ext/carray_access.c +831 -711
- data/ext/carray_attribute.c +98 -330
- data/ext/carray_bincount.c +255 -0
- data/ext/carray_broadcast.c +283 -0
- data/ext/carray_call_cfunc.c +1360 -828
- data/ext/carray_call_cfunc.h +160 -0
- data/ext/carray_cast.c +1212 -301
- data/ext/carray_cast_func.rb +81 -40
- data/ext/carray_class.c +53 -63
- data/ext/carray_config.h +28 -0
- data/ext/carray_conversion.c +350 -346
- data/ext/carray_copy.c +156 -268
- data/ext/carray_core.c +1342 -199
- data/ext/carray_count.c +312 -0
- data/ext/carray_data_type.c +43 -19
- data/ext/carray_element.c +585 -213
- data/ext/carray_factorize.c +2542 -0
- data/ext/carray_generate.c +230 -559
- data/ext/carray_histogram.c +490 -0
- data/ext/carray_hold.c +228 -0
- data/ext/carray_index_classifier.c +1035 -0
- data/ext/carray_index_classifier.h +27 -0
- data/ext/carray_internal.h +120 -0
- data/ext/carray_kernels_bincmp.c +4445 -0
- data/ext/carray_kernels_binop.c +10979 -0
- data/ext/carray_kernels_init.c +36 -0
- data/ext/carray_kernels_map.c +3466 -0
- data/ext/carray_kernels_moncmp.c +2096 -0
- data/ext/carray_kernels_monop.c +18312 -0
- data/ext/carray_kernels_reduce_aggregate.c +25836 -0
- data/ext/carray_kernels_reduce_boolean.c +329 -0
- data/ext/carray_kernels_reduce_cumulative.c +14592 -0
- data/ext/carray_kernels_reduce_extreme.c +16947 -0
- data/ext/carray_kernels_reduce_variance.c +3909 -0
- data/ext/carray_kernels_scan.c +3692 -0
- data/ext/carray_kernels_search.c +32137 -0
- data/ext/carray_kernels_sort.c +10625 -0
- data/ext/carray_kernels_triop.c +1391 -0
- data/ext/carray_lazy.c +567 -0
- data/ext/carray_loop.c +88 -200
- data/ext/carray_mask.c +848 -154
- data/ext/carray_math_kernel.h +120 -0
- data/ext/carray_mathfunc.c +10 -241
- data/ext/carray_median_percentile.c +1257 -0
- data/ext/carray_memory_view.c +1625 -0
- data/ext/carray_operator.c +1526 -318
- data/ext/carray_order.c +664 -1394
- data/ext/carray_partition.c +416 -0
- data/ext/carray_random.c +518 -0
- data/ext/carray_scatter.c +357 -0
- data/ext/carray_slab.c +1219 -0
- data/ext/carray_slab.h +84 -0
- data/ext/carray_sort.c +829 -0
- data/ext/carray_sort_kernel.c +620 -0
- data/ext/carray_struct.c +695 -0
- data/ext/carray_test.c +343 -229
- data/ext/carray_undef.c +34 -17
- data/ext/carray_utils.c +175 -74
- data/ext/extconf.rb +216 -55
- data/ext/mk_call_cfunc.rb +480 -0
- data/ext/mkkernel.rb +8842 -0
- data/ext/ruby_carray.c +202 -101
- data/ext/version.h +4 -14
- data/ext/version.rb +5 -13
- data/lib/carray/arrow_tensor.rb +401 -0
- data/lib/carray/attribute.rb +166 -0
- data/lib/carray/autoload_carray.rb +220 -0
- data/lib/carray/autoload_method_extension.rb +44 -0
- data/lib/carray/axis_group.rb +711 -0
- data/lib/carray/basics.rb +481 -0
- data/lib/carray/bincount_nd.rb +358 -0
- data/lib/carray/block_iterator.rb +604 -0
- data/lib/carray/boolean_reduce.rb +109 -0
- data/lib/carray/categorical.rb +561 -0
- data/lib/carray/categorical_iterator.rb +1062 -0
- data/lib/carray/complex.rb +150 -0
- data/lib/carray/conditional.rb +216 -0
- data/lib/carray/const_string.rb +228 -0
- data/lib/carray/construct.rb +139 -328
- data/lib/carray/core_extensions.rb +240 -0
- data/lib/carray/data_type_extension.rb +233 -0
- data/lib/carray/fixlen_string.rb +95 -0
- data/lib/carray/frame/concat.rb +132 -0
- data/lib/carray/frame/convert.rb +95 -0
- data/lib/carray/frame/csv_parser.rb +211 -0
- data/lib/carray/frame/frame.rb +649 -0
- data/lib/carray/frame/group.rb +186 -0
- data/lib/carray/frame/io.rb +164 -0
- data/lib/carray/frame/join.rb +248 -0
- data/lib/carray/frame/records.rb +99 -0
- data/lib/carray/frame/sort.rb +113 -0
- data/lib/carray/frame/verbs.rb +299 -0
- data/lib/carray/frame.rb +16 -0
- data/lib/carray/histogram.rb +512 -0
- data/lib/carray/inspect.rb +37 -20
- data/lib/carray/iterator.rb +57 -349
- data/lib/carray/lazy.rb +889 -0
- data/lib/carray/mask_gap_fill.rb +200 -0
- data/lib/carray/math.rb +78 -342
- data/lib/carray/meld_reduce.rb +289 -0
- data/lib/carray/methods/align_addr.rb +116 -0
- data/lib/carray/methods/bin.rb +128 -0
- data/lib/carray/methods/bincount.rb +87 -0
- data/lib/carray/methods/bit_string.rb +92 -0
- data/lib/carray/methods/broadcast.rb +63 -0
- data/lib/carray/methods/choose.rb +39 -0
- data/lib/carray/methods/composition.rb +280 -0
- data/lib/carray/methods/gather_nd.rb +206 -0
- data/lib/carray/methods/index.rb +39 -0
- data/lib/carray/methods/insert_block.rb +99 -0
- data/lib/carray/methods/is_in.rb +141 -0
- data/lib/carray/methods/join.rb +90 -0
- data/lib/carray/methods/locate_addr.rb +47 -0
- data/lib/carray/methods/mask_duplicates.rb +41 -0
- data/lib/carray/methods/meshgrid.rb +91 -0
- data/lib/carray/methods/mode.rb +126 -0
- data/lib/carray/methods/nunique.rb +46 -0
- data/lib/carray/methods/resize.rb +56 -0
- data/lib/carray/methods/snap.rb +156 -0
- data/lib/carray/methods/string_format.rb +57 -0
- data/lib/carray/methods/unique.rb +47 -0
- data/lib/carray/methods/value_counts.rb +71 -0
- data/lib/carray/mkmf.rb +124 -101
- data/lib/carray/runtime.rb +108 -0
- data/lib/carray/serialize.rb +478 -167
- data/lib/carray/slab_iterator.rb +292 -0
- data/lib/carray/stack.rb +291 -0
- data/lib/carray/string.rb +56 -180
- data/lib/carray/string_operation_extension.rb +289 -0
- data/lib/carray/struct.rb +335 -323
- data/lib/carray/struct_builder.rb +697 -0
- data/lib/carray/table.rb +41 -2
- data/lib/carray/time.rb +2255 -38
- data/lib/carray/window_iterator.rb +655 -0
- data/lib/carray.rb +55 -57
- metadata +163 -130
- data/Rakefile +0 -51
- data/TODO.md +0 -18
- data/ext/ca_iter_block.c +0 -257
- data/ext/ca_iter_dimension.c +0 -299
- data/ext/ca_iter_window.c +0 -214
- data/ext/ca_obj_mapping.c +0 -644
- data/ext/carray_iterator.c +0 -641
- data/ext/carray_math.rb +0 -850
- data/ext/carray_numeric.c +0 -259
- data/ext/carray_sort_addr.c +0 -254
- data/ext/carray_stat.c +0 -2100
- data/ext/carray_stat_proc.rb +0 -1999
- data/ext/mkmath.rb +0 -741
- data/ext/ruby_ccomplex.c +0 -509
- data/ext/ruby_float_func.c +0 -86
- data/lib/carray/array.rb +0 -8
- data/lib/carray/autoload/autoload_base.rb +0 -19
- data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
- data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
- data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
- data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
- data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
- data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
- data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
- data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
- data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
- data/lib/carray/autoload/autoload_gem_random.rb +0 -8
- data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
- data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
- data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
- data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
- data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
- data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
- data/lib/carray/autoload/autoload_object_link.rb +0 -1
- data/lib/carray/autoload/autoload_object_pack.rb +0 -2
- data/lib/carray/autoload.rb +0 -141
- data/lib/carray/basic.rb +0 -191
- data/lib/carray/broadcast.rb +0 -101
- data/lib/carray/compose.rb +0 -315
- data/lib/carray/convert.rb +0 -115
- data/lib/carray/info.rb +0 -110
- data/lib/carray/io/imagemagick.rb +0 -235
- data/lib/carray/mask.rb +0 -102
- data/lib/carray/math/histogram.rb +0 -177
- data/lib/carray/math/recurrence.rb +0 -93
- data/lib/carray/object/ca_obj_iterator.rb +0 -50
- data/lib/carray/object/ca_obj_link.rb +0 -50
- data/lib/carray/object/ca_obj_pack.rb +0 -99
- data/lib/carray/obsolete.rb +0 -256
- data/lib/carray/ordering.rb +0 -181
- data/lib/carray/testing.rb +0 -51
- data/lib/carray/transform.rb +0 -109
- data/misc/Methods.ja.md +0 -182
- data/misc/NOTE +0 -51
- data/spec/Classes/CABitfield_spec.rb +0 -58
- data/spec/Classes/CABlockIterator_spec.rb +0 -114
- data/spec/Classes/CABlock_spec.rb +0 -205
- data/spec/Classes/CAField_spec.rb +0 -39
- data/spec/Classes/CAGrid_spec.rb +0 -75
- data/spec/Classes/CAMap_spec.rb +0 -0
- data/spec/Classes/CAMapping_spec.rb +0 -105
- data/spec/Classes/CAObject_attribute_spec.rb +0 -33
- data/spec/Classes/CAObject_spec.rb +0 -33
- data/spec/Classes/CARefer_spec.rb +0 -93
- data/spec/Classes/CARepeat_spec.rb +0 -65
- data/spec/Classes/CASelect_spec.rb +0 -22
- data/spec/Classes/CAShift_spec.rb +0 -16
- data/spec/Classes/CAStruct_spec.rb +0 -71
- data/spec/Classes/CATranspose_spec.rb +0 -60
- data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
- data/spec/Classes/CAWindow_spec.rb +0 -54
- data/spec/Classes/CAWrap_spec.rb +0 -8
- data/spec/Classes/CArray_spec.rb +0 -184
- data/spec/Classes/CScalar_spec.rb +0 -55
- data/spec/Classes/ex1.rb +0 -46
- data/spec/Features/feature_130_spec.rb +0 -19
- data/spec/Features/feature_attributes_spec.rb +0 -280
- data/spec/Features/feature_boolean_spec.rb +0 -98
- data/spec/Features/feature_broadcast.rb +0 -116
- data/spec/Features/feature_cast_function.rb +0 -19
- data/spec/Features/feature_cast_spec.rb +0 -33
- data/spec/Features/feature_class_spec.rb +0 -84
- data/spec/Features/feature_complex_spec.rb +0 -42
- data/spec/Features/feature_composite_spec.rb +0 -124
- data/spec/Features/feature_convert_spec.rb +0 -46
- data/spec/Features/feature_copy_spec.rb +0 -123
- data/spec/Features/feature_creation_spec.rb +0 -84
- data/spec/Features/feature_element_spec.rb +0 -144
- data/spec/Features/feature_extream_spec.rb +0 -54
- data/spec/Features/feature_generate_spec.rb +0 -74
- data/spec/Features/feature_index_spec.rb +0 -69
- data/spec/Features/feature_mask_spec.rb +0 -580
- data/spec/Features/feature_math_spec.rb +0 -97
- data/spec/Features/feature_order_spec.rb +0 -146
- data/spec/Features/feature_ref_store_spec.rb +0 -209
- data/spec/Features/feature_serialization_spec.rb +0 -125
- data/spec/Features/feature_stat_spec.rb +0 -397
- data/spec/Features/feature_virtual_spec.rb +0 -48
- data/spec/Features/method_eq_spec.rb +0 -81
- data/spec/Features/method_is_nan_spec.rb +0 -12
- data/spec/Features/method_map_spec.rb +0 -54
- data/spec/Features/method_max_with.rb +0 -20
- data/spec/Features/method_min_with.rb +0 -19
- data/spec/Features/method_ne_spec.rb +0 -18
- data/spec/Features/method_project_spec.rb +0 -188
- data/spec/Features/method_ref_spec.rb +0 -27
- data/spec/Features/method_round_spec.rb +0 -11
- data/spec/Features/method_s_linspace_spec.rb +0 -48
- data/spec/Features/method_s_span_spec.rb +0 -14
- data/spec/Features/method_seq_spec.rb +0 -47
- data/spec/Features/method_sort_with.rb +0 -43
- data/spec/Features/method_sorted_with.rb +0 -29
- data/spec/Features/method_span_spec.rb +0 -42
- data/spec/Features/method_wrap_readonly_spec.rb +0 -43
- data/spec/UnitTest/test_CAVirtual.rb +0 -214
- data/spec/spec_all.rb +0 -10
- data/utils/ca_ase.rb +0 -21
- data/utils/ca_methods.rb +0 -15
- data/utils/cast_checker.rb +0 -30
- data/utils/convert_test.rb +0 -73
- data/utils/extract_yard.rb +0 -22
- data/utils/guess_shape.rb +0 -76
- data/utils/monkey_patch_methods.rb +0 -62
- data/utils/remove_resource_fork.sh +0 -5
data/ext/carray_count.c
ADDED
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/* ---------------------------------------------------------------------------
|
|
2
|
+
|
|
3
|
+
CArray#count dispatcher (= value-comparison family entry point).
|
|
4
|
+
Hand-routed because the dispatch decision depends on (self.data_type,
|
|
5
|
+
v's runtime class), which the per-dtype mkkernel kernels can't see;
|
|
6
|
+
the actual counting is delegated to the kernel-iterator helpers
|
|
7
|
+
listed below.
|
|
8
|
+
|
|
9
|
+
Future count_axis / count_where extensions belong here.
|
|
10
|
+
|
|
11
|
+
---------------------------------------------------------------------------- */
|
|
12
|
+
|
|
13
|
+
#include "ruby.h"
|
|
14
|
+
#include "carray.h"
|
|
15
|
+
#include "ca_obj_face.h"
|
|
16
|
+
#include <math.h>
|
|
17
|
+
#include <float.h>
|
|
18
|
+
#include <stdarg.h>
|
|
19
|
+
|
|
20
|
+
/* Forwardees from carray_kernels.c (mkkernel-generated). rb_ca_count
|
|
21
|
+
below picks one based on (self.data_type, v). */
|
|
22
|
+
VALUE rb_ca_count_equal_ki (int argc, VALUE *argv, VALUE self);
|
|
23
|
+
VALUE rb_ca_count_true_ki (int argc, VALUE *argv, VALUE self);
|
|
24
|
+
VALUE rb_ca_count_false_ki (int argc, VALUE *argv, VALUE self);
|
|
25
|
+
|
|
26
|
+
/* Forwardees from carray_mask.c. Public linkage for cross-TU dispatch:
|
|
27
|
+
count(UNDEF) is mask-state vocabulary, not value vocabulary, so it
|
|
28
|
+
routes through the mask-family entry; count with no value argument is
|
|
29
|
+
present-cell cardinality, which routes through count_not_masked. */
|
|
30
|
+
VALUE rb_ca_count_masked (int argc, VALUE *argv, VALUE self);
|
|
31
|
+
VALUE rb_ca_count_not_masked (int argc, VALUE *argv, VALUE self);
|
|
32
|
+
|
|
33
|
+
/* CArray#count(v, axis: nil, min_count: K, fill_value: x) -- count
|
|
34
|
+
cells of self that equal v, with mask-aware reduction along axis.
|
|
35
|
+
|
|
36
|
+
Dispatch:
|
|
37
|
+
- no argument -> count_not_masked (present-cell count)
|
|
38
|
+
- v == UNDEF -> count_masked (mask-state count)
|
|
39
|
+
- v is a CArray -> broadcast: count each v[k] and stack
|
|
40
|
+
(rejected for boolean self; see below)
|
|
41
|
+
- self is boolean, v scalar -> v must be true/false literal
|
|
42
|
+
- self is numeric, v scalar -> count_equal_ki (numeric equality)
|
|
43
|
+
|
|
44
|
+
FIXLEN and OBJECT data_types raise CArray::DataTypeError (the
|
|
45
|
+
kernel-iterator helpers do not implement them). Extend
|
|
46
|
+
count_equal_ki if demand returns. */
|
|
47
|
+
|
|
48
|
+
static VALUE
|
|
49
|
+
rb_ca_count (int argc, VALUE *argv, VALUE self)
|
|
50
|
+
{
|
|
51
|
+
CArray *src;
|
|
52
|
+
GetCArray(self, src);
|
|
53
|
+
|
|
54
|
+
/* count (no value argument) == count_not_masked: present-cell
|
|
55
|
+
cardinality ("how many are there"), the arity-0 rung of the dispatch
|
|
56
|
+
ladder. kwargs reach a -1 C method as a trailing options hash, so a
|
|
57
|
+
bare `count(axis: k)` arrives as argc==1 with argv[0] a Hash; discount
|
|
58
|
+
that trailing hash (same convention as the CArray-broadcast branch
|
|
59
|
+
below) before deciding there is no positional value. argv is forwarded
|
|
60
|
+
verbatim so the axis: kwarg passes through. */
|
|
61
|
+
{
|
|
62
|
+
int has_opts = ( argc >= 1 &&
|
|
63
|
+
rb_obj_is_kind_of(argv[argc - 1], rb_cHash) );
|
|
64
|
+
if ( argc - (has_opts ? 1 : 0) < 1 ) {
|
|
65
|
+
return rb_ca_count_not_masked(argc, argv, self);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
volatile VALUE rval = argv[0];
|
|
70
|
+
|
|
71
|
+
/* count(UNDEF) == count_masked: UNDEF is mask-state vocabulary, not a
|
|
72
|
+
value to compare against. Forward, dropping the UNDEF from argv. */
|
|
73
|
+
if ( rval == CA_UNDEF ) {
|
|
74
|
+
return rb_ca_count_masked(argc - 1, argv + 1, self);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/* Face gate, mirroring the search / linear family (ext/carray_order.c):
|
|
78
|
+
descend an ORDERABLE Face to its storage so the equality runs on the
|
|
79
|
+
numeric storage, and let the reference reconcile the query into its own
|
|
80
|
+
space -- a COMPARABLE Face compares directly (strip a Face query, take a
|
|
81
|
+
plain one as-is), a unit-bearing one calls its own to_comparable for any
|
|
82
|
+
query type (Face CArray, Element, Time, DateTime). A Face that counts
|
|
83
|
+
by other means never arrives here: CACategorical / CAConstString define
|
|
84
|
+
their own #count in Ruby. Placed after the mask-state branches above,
|
|
85
|
+
which read the mask the Face already shares with its storage, and before
|
|
86
|
+
the broadcast branch, so a reconciled query array recurses as storage. */
|
|
87
|
+
if ( ca_is_face(src) ) {
|
|
88
|
+
volatile VALUE self_ref = self;
|
|
89
|
+
int query_was_scalar = ! rb_obj_is_carray(rval);
|
|
90
|
+
if ( ! ca_test_flag(src, CA_FLAG_FACE_ORDERABLE_STORAGE) ) {
|
|
91
|
+
rb_raise(rb_eArgError,
|
|
92
|
+
"count(v): Face-typed input (%s) is not orderable by storage; "
|
|
93
|
+
"use ca.parent to count the raw storage",
|
|
94
|
+
rb_obj_classname(self));
|
|
95
|
+
}
|
|
96
|
+
if ( ca_test_flag(src, CA_FLAG_FACE_COMPARABLE_STORAGE) ) {
|
|
97
|
+
if ( ! query_was_scalar ) {
|
|
98
|
+
CArray *cv;
|
|
99
|
+
GetCArray(rval, cv);
|
|
100
|
+
if ( ca_is_face(cv) ) {
|
|
101
|
+
rval = rb_ca_strip_face_value(rval);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else if ( rb_respond_to(self_ref, rb_intern("to_comparable")) ) {
|
|
106
|
+
rval = rb_ca_strip_face_value(rb_funcall(self_ref,
|
|
107
|
+
rb_intern("to_comparable"),
|
|
108
|
+
1, rval));
|
|
109
|
+
/* to_comparable lifts a scalar query to a length-1 array; unwrap it so a
|
|
110
|
+
scalar query still answers with a count rather than a length-1 array
|
|
111
|
+
from the broadcast branch below. */
|
|
112
|
+
if ( query_was_scalar && rb_obj_is_carray(rval) ) {
|
|
113
|
+
rval = rb_ca_fetch_addr(rval, 0);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
rb_raise(rb_eArgError,
|
|
118
|
+
"count(v): non-comparable Face (%s) has no to_comparable to "
|
|
119
|
+
"reconcile the query; use ca.parent to count the raw storage",
|
|
120
|
+
rb_obj_classname(self));
|
|
121
|
+
}
|
|
122
|
+
self = rb_ca_strip_face_value(self);
|
|
123
|
+
GetCArray(self, src);
|
|
124
|
+
/* Hand the reconciled query down in argv (count_equal_ki pops argv[0],
|
|
125
|
+
the broadcast branch reads rval). */
|
|
126
|
+
{
|
|
127
|
+
VALUE *nargv = ALLOCA_N(VALUE, argc);
|
|
128
|
+
MEMCPY(nargv, argv, VALUE, argc);
|
|
129
|
+
nargv[0] = rval;
|
|
130
|
+
argv = nargv;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/* count(v: CArray) -- broadcast: v.shape is appended to the trailing
|
|
135
|
+
axes of the output (same shape rule as SEARCH_AXIS / LINEAR_INTERP).
|
|
136
|
+
Each v[k] is counted independently and stacked. Boolean self is
|
|
137
|
+
rejected here because the per-scalar dispatch below requires v to
|
|
138
|
+
be a true/false literal, which an array cannot guarantee per-cell.
|
|
139
|
+
Implementation iterates v in flat order and recursively calls
|
|
140
|
+
self.count(vk, *axes, **opts) for each v[k]. */
|
|
141
|
+
if ( rb_obj_is_kind_of(rval, rb_cCArray) ) {
|
|
142
|
+
if ( src->data_type == CA_BOOLEAN ) {
|
|
143
|
+
rb_raise(rb_eTypeError,
|
|
144
|
+
"count(v: CArray) on boolean array: not supported "
|
|
145
|
+
"(use scalar true/false; broadcast is numeric-only)");
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
CArray *cv;
|
|
149
|
+
GetCArray(rval, cv);
|
|
150
|
+
|
|
151
|
+
/* Pop trailing options hash (min_count / fill_value) before axes
|
|
152
|
+
parsing so parse_reduce_axes only sees Integer axes. The opts
|
|
153
|
+
are forwarded verbatim via inner_argv to the recursive count(). */
|
|
154
|
+
int inner_argc = argc - 1;
|
|
155
|
+
VALUE *inner_axes = argv + 1;
|
|
156
|
+
volatile VALUE opt_hash = Qnil;
|
|
157
|
+
if ( inner_argc > 0 && rb_obj_is_kind_of(inner_axes[inner_argc - 1],
|
|
158
|
+
rb_cHash) ) {
|
|
159
|
+
opt_hash = inner_axes[inner_argc - 1];
|
|
160
|
+
inner_argc--;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* axis comes via kwarg (axis:) in opt_hash, not positional;
|
|
164
|
+
extract before computing slab_axes. */
|
|
165
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
166
|
+
int8_t naxes;
|
|
167
|
+
VALUE axis_val = Qnil;
|
|
168
|
+
if ( ! NIL_P(opt_hash) ) {
|
|
169
|
+
axis_val = rb_hash_lookup2(opt_hash, ID2SYM(rb_intern("axis")), Qnil);
|
|
170
|
+
}
|
|
171
|
+
naxes = rb_ca_parse_reduce_axes_kw(axis_val, src, slab_axes);
|
|
172
|
+
(void) inner_axes; /* axes no longer parsed from inner_axes */
|
|
173
|
+
int out_ndim;
|
|
174
|
+
ca_size_t out_dim[CA_RANK_MAX];
|
|
175
|
+
ca_size_t base_elements = 1;
|
|
176
|
+
{
|
|
177
|
+
/* base_reduced: self.shape minus slab_axes */
|
|
178
|
+
int8_t is_slab[CA_RANK_MAX] = {0};
|
|
179
|
+
for (int k = 0; k < naxes; k++) is_slab[slab_axes[k]] = 1;
|
|
180
|
+
out_ndim = 0;
|
|
181
|
+
for (int k = 0; k < src->ndim; k++) {
|
|
182
|
+
if ( ! is_slab[k] ) {
|
|
183
|
+
out_dim[out_ndim++] = src->dim[k];
|
|
184
|
+
base_elements *= src->dim[k];
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/* Full reduction (naxes == ndim): base_elements = 1, no base axes. */
|
|
188
|
+
/* Append v.shape. */
|
|
189
|
+
for (int k = 0; k < cv->ndim; k++) {
|
|
190
|
+
out_dim[out_ndim++] = cv->dim[k];
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* Allocate output i64 CArray. */
|
|
195
|
+
VALUE vout = rb_funcall(rb_cCArray, rb_intern("new"), 2,
|
|
196
|
+
INT2NUM(CA_INT64),
|
|
197
|
+
rb_ary_new4(out_ndim,
|
|
198
|
+
({ VALUE *tmp = ALLOCA_N(VALUE, out_ndim);
|
|
199
|
+
for (int k = 0; k < out_ndim; k++)
|
|
200
|
+
tmp[k] = SIZE2NUM(out_dim[k]);
|
|
201
|
+
tmp; })));
|
|
202
|
+
CArray *cout;
|
|
203
|
+
GetCArray(vout, cout);
|
|
204
|
+
|
|
205
|
+
/* Iterate v in flat order, call self.count(vk, *axes, **opts)
|
|
206
|
+
recursively, place result at output[..., k]. */
|
|
207
|
+
ca_attach(cv);
|
|
208
|
+
int64_t *out_ptr = (int64_t *) cout->ptr;
|
|
209
|
+
boolean8_t *out_mask = NULL;
|
|
210
|
+
ca_size_t v_elements = cv->elements;
|
|
211
|
+
/* inner_argv layout: [vk_scalar, axis..., axis..., [opt_hash]]
|
|
212
|
+
inner_call_argc = 1 (vk) + inner_argc (axes) + (opt_hash ? 1 : 0). */
|
|
213
|
+
int inner_call_argc = 1 + inner_argc + (NIL_P(opt_hash) ? 0 : 1);
|
|
214
|
+
VALUE inner_argv[CA_RANK_MAX + 2];
|
|
215
|
+
for (int j = 0; j < inner_argc; j++) inner_argv[1 + j] = inner_axes[j];
|
|
216
|
+
if ( ! NIL_P(opt_hash) ) inner_argv[1 + inner_argc] = opt_hash;
|
|
217
|
+
|
|
218
|
+
for (ca_size_t k = 0; k < v_elements; k++) {
|
|
219
|
+
/* Extract vk as a scalar VALUE via flat addr. rb_ca_fetch_addr
|
|
220
|
+
takes a ca_size_t addr (not a Ruby VALUE). */
|
|
221
|
+
VALUE vk = rb_ca_fetch_addr(rval, k);
|
|
222
|
+
inner_argv[0] = vk;
|
|
223
|
+
VALUE sub = rb_ca_count(inner_call_argc, inner_argv, self);
|
|
224
|
+
|
|
225
|
+
/* Place sub into output[..., k] slot.
|
|
226
|
+
Output stride for v-axis = 1, base stride = v_elements. */
|
|
227
|
+
if ( sub == CA_UNDEF ) {
|
|
228
|
+
if ( ! out_mask ) {
|
|
229
|
+
ca_create_mask(cout);
|
|
230
|
+
out_mask = (boolean8_t *) cout->mask->ptr;
|
|
231
|
+
}
|
|
232
|
+
for (ca_size_t i = 0; i < base_elements; i++) {
|
|
233
|
+
out_ptr[i * v_elements + k] = 0;
|
|
234
|
+
out_mask[i * v_elements + k] = 1;
|
|
235
|
+
}
|
|
236
|
+
} else if ( rb_obj_is_kind_of(sub, rb_cInteger) ) {
|
|
237
|
+
/* Full reduction: sub is a single integer. */
|
|
238
|
+
out_ptr[k] = NUM2LL(sub);
|
|
239
|
+
} else if ( rb_obj_is_kind_of(sub, rb_cCArray) ) {
|
|
240
|
+
CArray *csub;
|
|
241
|
+
GetCArray(sub, csub);
|
|
242
|
+
ca_attach(csub);
|
|
243
|
+
int64_t *sub_ptr = (int64_t *) csub->ptr;
|
|
244
|
+
boolean8_t *sub_mask = (csub->mask) ? (boolean8_t *) csub->mask->ptr : NULL;
|
|
245
|
+
for (ca_size_t i = 0; i < base_elements; i++) {
|
|
246
|
+
out_ptr[i * v_elements + k] = sub_ptr[i];
|
|
247
|
+
if ( sub_mask && sub_mask[i] ) {
|
|
248
|
+
if ( ! out_mask ) {
|
|
249
|
+
ca_create_mask(cout);
|
|
250
|
+
out_mask = (boolean8_t *) cout->mask->ptr;
|
|
251
|
+
}
|
|
252
|
+
out_mask[i * v_elements + k] = 1;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
ca_detach(csub);
|
|
256
|
+
} else {
|
|
257
|
+
ca_detach(cv);
|
|
258
|
+
rb_raise(rb_eRuntimeError,
|
|
259
|
+
"count(v: CArray): unexpected sub-result type");
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
ca_detach(cv);
|
|
263
|
+
return vout;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/* Scalar v: strict (self.data_type, v) validation, then forward. */
|
|
267
|
+
if ( src->data_type == CA_BOOLEAN ) {
|
|
268
|
+
if ( rval == Qtrue ) {
|
|
269
|
+
return rb_ca_count_true_ki(argc - 1, argv + 1, self);
|
|
270
|
+
} else if ( rval == Qfalse ) {
|
|
271
|
+
return rb_ca_count_false_ki(argc - 1, argv + 1, self);
|
|
272
|
+
} else if ( FIXNUM_P(rval) ) {
|
|
273
|
+
/* Boolean stores 0/1; accept the integer literals 1 (= true) and
|
|
274
|
+
0 (= false) as the query, matching boolean-as-0/1-numeric. Any
|
|
275
|
+
other integer is outside the boolean domain and rejected. (A
|
|
276
|
+
Bignum / Float / other type falls through to the raise below --
|
|
277
|
+
only true / false / 1 / 0 are accepted.) */
|
|
278
|
+
long iv = FIX2LONG(rval);
|
|
279
|
+
if ( iv == 1 ) {
|
|
280
|
+
return rb_ca_count_true_ki(argc - 1, argv + 1, self);
|
|
281
|
+
} else if ( iv == 0 ) {
|
|
282
|
+
return rb_ca_count_false_ki(argc - 1, argv + 1, self);
|
|
283
|
+
}
|
|
284
|
+
rb_raise(rb_eTypeError,
|
|
285
|
+
"count(v) on boolean array: v must be true / false / 1 / 0, got %ld",
|
|
286
|
+
iv);
|
|
287
|
+
} else {
|
|
288
|
+
rb_raise(rb_eTypeError,
|
|
289
|
+
"count(v) on boolean array: v must be true / false / 1 / 0, got %s",
|
|
290
|
+
rb_obj_classname(rval));
|
|
291
|
+
}
|
|
292
|
+
} else {
|
|
293
|
+
if ( rval == Qtrue || rval == Qfalse ) {
|
|
294
|
+
rb_raise(rb_eTypeError,
|
|
295
|
+
"count(v) on numeric array: v must be numeric, got %s",
|
|
296
|
+
rb_obj_classname(rval));
|
|
297
|
+
}
|
|
298
|
+
/* Pass full argv; count_equal_ki pops argv[0] as value_arg. */
|
|
299
|
+
return rb_ca_count_equal_ki(argc, argv, self);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
void
|
|
304
|
+
Init_carray_count (void)
|
|
305
|
+
{
|
|
306
|
+
/* CArray#count is the sole value-comparison entry. Replaces the
|
|
307
|
+
pre-3.0 count_equal / count_equiv / count_close / count_true /
|
|
308
|
+
count_false (no aliases retained; see NEWS for migration). */
|
|
309
|
+
rb_define_method(rb_cCArray, "count", rb_ca_count, -1);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
|
data/ext/carray_data_type.c
CHANGED
|
@@ -1,3 +1,28 @@
|
|
|
1
|
+
/* ---------------------------------------------------------------------------
|
|
2
|
+
|
|
3
|
+
Per-data_type Ruby class shells: registers `CArray::Boolean`,
|
|
4
|
+
`CArray::Int8`, ..., `CArray::Object`, `CArray::Fixlen` (= the
|
|
5
|
+
15 type-tag classes) and exposes `ca_data_type_class` which maps
|
|
6
|
+
a data_type id back to its class.
|
|
7
|
+
|
|
8
|
+
The classes themselves are bare shells at the C level (no methods
|
|
9
|
+
defined here). Three companion files complete the surface:
|
|
10
|
+
|
|
11
|
+
lib/carray/construct.rb reopens each typed class to
|
|
12
|
+
add the `TypeSymbol` / `DataType` constants and extends them
|
|
13
|
+
with `DataTypeNewConstructor` (`.new(*shape)`,
|
|
14
|
+
`.from_memory_view`, `.wrap_memory_view`).
|
|
15
|
+
lib/carray/data_type_extension.rb fills in the
|
|
16
|
+
`DataTypeExtension` module with Numo-style constructor
|
|
17
|
+
methods (`.zeros`, `.full`, `.ones`, `.linspace`, ...)
|
|
18
|
+
that get attached onto every typed class.
|
|
19
|
+
ext/carray_cast.c defines the paired
|
|
20
|
+
polymorphic cast functions (`CA_INT8(data)`,
|
|
21
|
+
`CA_FLOAT64(data)`, ..., `CA_OBJECT(data)`,
|
|
22
|
+
`CA_FIXLEN(...)`) as global functions.
|
|
23
|
+
|
|
24
|
+
---------------------------------------------------------------------------- */
|
|
25
|
+
|
|
1
26
|
#include "carray.h"
|
|
2
27
|
|
|
3
28
|
VALUE rb_cCArrayBoolean;
|
|
@@ -11,40 +36,41 @@ VALUE rb_cCArrayInt32;
|
|
|
11
36
|
VALUE rb_cCArrayInt64;
|
|
12
37
|
VALUE rb_cCArrayFloat32;
|
|
13
38
|
VALUE rb_cCArrayFloat64;
|
|
14
|
-
VALUE rb_cCArrayFloat128;
|
|
15
39
|
VALUE rb_cCArrayCmplx64;
|
|
16
40
|
VALUE rb_cCArrayCmplx128;
|
|
17
|
-
VALUE rb_cCArrayCmplx256;
|
|
18
41
|
VALUE rb_cCArrayObject;
|
|
19
42
|
VALUE rb_cCArrayFixlen;
|
|
20
43
|
|
|
44
|
+
/* Returns the type class for a given data_type id. CA_FIXLEN is
|
|
45
|
+
* intentionally omitted because Fixlen requires a `bytes:` parameter
|
|
46
|
+
* and cannot be identified by data_type alone.
|
|
47
|
+
*
|
|
48
|
+
* Called from rb_ca_s_body macro (ca_obj_array.c), which dispatches
|
|
49
|
+
* `CArray.<type>()` no-arg calls to the corresponding type class. */
|
|
21
50
|
VALUE
|
|
22
51
|
ca_data_type_class (int8_t data_type)
|
|
23
52
|
{
|
|
24
53
|
switch ( data_type ) {
|
|
25
|
-
case CA_BOOLEAN: return rb_cCArrayBoolean;
|
|
26
|
-
case CA_INT8: return rb_cCArrayInt8;
|
|
27
|
-
case CA_UINT8: return rb_cCArrayUInt8;
|
|
28
|
-
case CA_INT16: return rb_cCArrayInt16;
|
|
29
|
-
case CA_UINT16: return rb_cCArrayUInt16;
|
|
30
|
-
case CA_INT32: return rb_cCArrayInt32;
|
|
31
|
-
case CA_UINT32: return rb_cCArrayUInt32;
|
|
32
|
-
case CA_INT64: return rb_cCArrayInt64;
|
|
33
|
-
case CA_UINT64: return rb_cCArrayUInt64;
|
|
54
|
+
case CA_BOOLEAN: return rb_cCArrayBoolean; break;
|
|
55
|
+
case CA_INT8: return rb_cCArrayInt8; break;
|
|
56
|
+
case CA_UINT8: return rb_cCArrayUInt8; break;
|
|
57
|
+
case CA_INT16: return rb_cCArrayInt16; break;
|
|
58
|
+
case CA_UINT16: return rb_cCArrayUInt16; break;
|
|
59
|
+
case CA_INT32: return rb_cCArrayInt32; break;
|
|
60
|
+
case CA_UINT32: return rb_cCArrayUInt32; break;
|
|
61
|
+
case CA_INT64: return rb_cCArrayInt64; break;
|
|
62
|
+
case CA_UINT64: return rb_cCArrayUInt64; break;
|
|
34
63
|
case CA_FLOAT32: return rb_cCArrayFloat32; break;
|
|
35
64
|
case CA_FLOAT64: return rb_cCArrayFloat64; break;
|
|
36
|
-
case CA_FLOAT128: return rb_cCArrayFloat128; break;
|
|
37
65
|
case CA_CMPLX64: return rb_cCArrayCmplx64; break;
|
|
38
|
-
case CA_CMPLX128: return rb_cCArrayCmplx128;
|
|
39
|
-
case
|
|
40
|
-
case CA_OBJECT: return rb_cCArrayObject; break;
|
|
66
|
+
case CA_CMPLX128: return rb_cCArrayCmplx128; break;
|
|
67
|
+
case CA_OBJECT: return rb_cCArrayObject; break;
|
|
41
68
|
default: rb_raise(rb_eRuntimeError, "invalid data type");
|
|
42
69
|
}
|
|
43
|
-
|
|
44
70
|
}
|
|
45
71
|
|
|
46
72
|
void
|
|
47
|
-
Init_carray_data_type ()
|
|
73
|
+
Init_carray_data_type (void)
|
|
48
74
|
{
|
|
49
75
|
rb_cCArrayBoolean = rb_define_class_under(rb_cCArray, "Boolean", rb_cObject);
|
|
50
76
|
rb_cCArrayUInt8 = rb_define_class_under(rb_cCArray, "UInt8", rb_cObject);
|
|
@@ -57,10 +83,8 @@ Init_carray_data_type ()
|
|
|
57
83
|
rb_cCArrayInt64 = rb_define_class_under(rb_cCArray, "Int64", rb_cObject);
|
|
58
84
|
rb_cCArrayFloat32 = rb_define_class_under(rb_cCArray, "Float32", rb_cObject);
|
|
59
85
|
rb_cCArrayFloat64 = rb_define_class_under(rb_cCArray, "Float64", rb_cObject);
|
|
60
|
-
rb_cCArrayFloat128 = rb_define_class_under(rb_cCArray, "Float128", rb_cObject);
|
|
61
86
|
rb_cCArrayCmplx64 = rb_define_class_under(rb_cCArray, "Cmplx64", rb_cObject);
|
|
62
87
|
rb_cCArrayCmplx128 = rb_define_class_under(rb_cCArray, "Cmplx128", rb_cObject);
|
|
63
|
-
rb_cCArrayCmplx256 = rb_define_class_under(rb_cCArray, "Cmplx256", rb_cObject);
|
|
64
88
|
rb_cCArrayObject = rb_define_class_under(rb_cCArray, "Object", rb_cObject);
|
|
65
89
|
rb_cCArrayFixlen = rb_define_class_under(rb_cCArray, "Fixlen", rb_cObject);
|
|
66
90
|
}
|