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/lib/carray/iterator.rb
CHANGED
|
@@ -1,367 +1,75 @@
|
|
|
1
1
|
# ----------------------------------------------------------------------------
|
|
2
2
|
#
|
|
3
|
-
#
|
|
3
|
+
# CAIterator -- the form-only base of the iterator family. It carries no
|
|
4
|
+
# engine: each family member (CASlabIterator / CAWindowIterator /
|
|
5
|
+
# CABlockIterator / CACategoricalIterator / CAGroupIterator) implements its own
|
|
6
|
+
# fast engine. The base declares two things: the shared form accessors over
|
|
7
|
+
# the @ndim / @shape ivars, and the common reduction surface every member must
|
|
8
|
+
# implement (surface uniformity is the value: "this is an iterator, so it must
|
|
9
|
+
# answer these").
|
|
4
10
|
#
|
|
5
|
-
#
|
|
11
|
+
# `shape` is canonical; `dim` is a legacy alias. A member exposes what it
|
|
12
|
+
# actually holds (source / reference / labels) and adds its own methods
|
|
13
|
+
# (min_index / max_index / map / correlate / convolve / sort_addr / ...);
|
|
14
|
+
# those are NOT part of the common contract because some members legitimately
|
|
15
|
+
# omit them (a window has no map, a group has no within-piece min_index).
|
|
6
16
|
#
|
|
7
|
-
#
|
|
17
|
+
# The retired 2.0 generic dispatch (calculate / filter / evaluate over a
|
|
18
|
+
# kernel_at_addr slot) is preserved at `samples/caiterator/iterator.{rb,c}`.
|
|
8
19
|
#
|
|
9
20
|
# ----------------------------------------------------------------------------
|
|
10
21
|
|
|
11
22
|
class CAIterator
|
|
12
23
|
|
|
13
|
-
include Enumerable
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
24
|
+
# No `include Enumerable`: the family surface is fully explicit per iterator,
|
|
25
|
+
# so Enumerable's reduction-like names (to_a / min / sum / count / ...) do not
|
|
26
|
+
# leak in and silently fold the pieces. A method outside the contract below
|
|
27
|
+
# that a member does not define is a clean NoMethodError, not a wrong answer.
|
|
28
|
+
|
|
29
|
+
attr_reader :ndim, :shape
|
|
30
|
+
alias dim shape
|
|
31
|
+
|
|
32
|
+
# The required reduction surface, modelled on the two reference members
|
|
33
|
+
# CASlabIterator and CACategoricalIterator (the surface they both provide).
|
|
34
|
+
# Declared abstract so a later member
|
|
35
|
+
# (window / block / group) that leaves one unimplemented fails loudly here
|
|
36
|
+
# rather than reading as "no such method" -- that gap is the member's to close.
|
|
37
|
+
# A member that genuinely cannot provide one overrides it to raise with its
|
|
38
|
+
# own reason.
|
|
21
39
|
[
|
|
22
|
-
:
|
|
23
|
-
:
|
|
24
|
-
:
|
|
25
|
-
:
|
|
26
|
-
:
|
|
27
|
-
:
|
|
28
|
-
:
|
|
29
|
-
:shift!,
|
|
30
|
-
:shuffle!,
|
|
31
|
-
:sort!,
|
|
32
|
-
:span!,
|
|
33
|
-
:transpose!,
|
|
40
|
+
:sum, :prod, :mean, :min, :max, :variance, :stddev, :all, :any, # tier 1
|
|
41
|
+
:variancep, :stddevp, :minmax, # tier 2
|
|
42
|
+
:min_index, :max_index, :min_addr, :max_addr, # position
|
|
43
|
+
:wsum, :wmean, # weighted
|
|
44
|
+
:median, :percentile, :quantile, # tier 3
|
|
45
|
+
:count, :count_not_masked, :count_masked, :elements, # count family
|
|
46
|
+
:each, :reduce, # generic iterate
|
|
34
47
|
].each do |name|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def self.define_filter_method (data_type, name)
|
|
39
|
-
define_method(name) { |*args|
|
|
40
|
-
_data_type = data_type || self.reference.data_type
|
|
41
|
-
self.filter(_data_type, name, *args)
|
|
42
|
-
}
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
[
|
|
46
|
-
[:axes ],
|
|
47
|
-
[:normalize ],
|
|
48
|
-
[:random ],
|
|
49
|
-
[:reverse ],
|
|
50
|
-
[:roll ],
|
|
51
|
-
[:scale ],
|
|
52
|
-
[:seq ],
|
|
53
|
-
[:shift ],
|
|
54
|
-
[:shuffle ],
|
|
55
|
-
[:sort ],
|
|
56
|
-
[:span ],
|
|
57
|
-
[:transpose ],
|
|
58
|
-
].each do |name, data_type|
|
|
59
|
-
define_filter_method(data_type, name)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def self.define_calculate_method (data_type, name)
|
|
63
|
-
define_method(name) { |*args|
|
|
64
|
-
_data_type = data_type || self.reference.data_type
|
|
65
|
-
self.calculate(_data_type, name, *args)
|
|
66
|
-
}
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
[
|
|
70
|
-
[:count_masked, CA_INT32],
|
|
71
|
-
[:count_not_masked, CA_INT32],
|
|
72
|
-
[:count_true, CA_INT32],
|
|
73
|
-
[:count_false, CA_INT32],
|
|
74
|
-
[:size, CA_INT32],
|
|
75
|
-
[:min, nil],
|
|
76
|
-
[:min_addr, CA_INT32],
|
|
77
|
-
[:max, nil],
|
|
78
|
-
[:max_addr, CA_INT32],
|
|
79
|
-
[:prod, CA_FLOAT64],
|
|
80
|
-
[:sum, CA_FLOAT64],
|
|
81
|
-
[:wsum, CA_FLOAT64],
|
|
82
|
-
[:mean, CA_FLOAT64],
|
|
83
|
-
[:wmean, CA_FLOAT64],
|
|
84
|
-
[:variancep, CA_FLOAT64],
|
|
85
|
-
[:variance, CA_FLOAT64],
|
|
86
|
-
[:stddevp, CA_FLOAT64],
|
|
87
|
-
[:stddev, CA_FLOAT64],
|
|
88
|
-
[:median, CA_FLOAT64],
|
|
89
|
-
[:accumulate, nil],
|
|
90
|
-
[:cummin, nil],
|
|
91
|
-
[:cummax, nil],
|
|
92
|
-
[:cumcount, CA_FLOAT64],
|
|
93
|
-
[:cumprod, CA_FLOAT64],
|
|
94
|
-
[:cumsum, CA_FLOAT64],
|
|
95
|
-
[:cumwsum, CA_FLOAT64],
|
|
96
|
-
[:count_equal, CA_INT32],
|
|
97
|
-
[:count_equiv, CA_INT32],
|
|
98
|
-
[:count_close, CA_INT32],
|
|
99
|
-
[:all_equal?, CA_BOOLEAN],
|
|
100
|
-
[:any_equal?, CA_BOOLEAN],
|
|
101
|
-
[:none_equal?, CA_BOOLEAN],
|
|
102
|
-
[:all_equiv?, CA_BOOLEAN],
|
|
103
|
-
[:any_equiv?, CA_BOOLEAN],
|
|
104
|
-
[:none_equiv?, CA_BOOLEAN],
|
|
105
|
-
[:all_close?, CA_BOOLEAN],
|
|
106
|
-
[:any_close?, CA_BOOLEAN],
|
|
107
|
-
[:none_close?, CA_BOOLEAN],
|
|
108
|
-
[:nearest_addr, CA_INT32],
|
|
109
|
-
[:mul_add, nil],
|
|
110
|
-
].each do |name, data_type|
|
|
111
|
-
define_calculate_method(data_type, name)
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
# -----------------------------------------------------------
|
|
115
|
-
|
|
116
|
-
def ca
|
|
117
|
-
@iterary ||= CAIteratorArray.new(self)
|
|
118
|
-
return @iterary
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
def to_a
|
|
122
|
-
return ca.to_a
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
def pick (*idx)
|
|
126
|
-
out = prepare_output(reference.data_type, :bytes=>reference.bytes)
|
|
127
|
-
elements.times do |addr|
|
|
128
|
-
blk = kernel_at_addr(addr)
|
|
129
|
-
out[addr] = blk[*idx]
|
|
130
|
-
end
|
|
131
|
-
return out
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
def asign! (val)
|
|
135
|
-
each do |elem|
|
|
136
|
-
elem[] = val
|
|
137
|
-
end
|
|
138
|
-
return self
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
def [] (*idx)
|
|
142
|
-
if idx.any?{|x| x.is_a?(Symbol) }
|
|
143
|
-
return ca[*idx]
|
|
144
|
-
else
|
|
145
|
-
case idx.size
|
|
146
|
-
when 0
|
|
147
|
-
return clone
|
|
148
|
-
when 1
|
|
149
|
-
return kernel_at_addr(idx[0])
|
|
150
|
-
else
|
|
151
|
-
return kernel_at_index(idx)
|
|
152
|
-
end
|
|
153
|
-
end
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
def []= (*idx)
|
|
157
|
-
val = idx.pop
|
|
158
|
-
if idx.any?{|x| x.is_a?(Symbol) }
|
|
159
|
-
ca[*idx] = [val]
|
|
160
|
-
else
|
|
161
|
-
case idx.size
|
|
162
|
-
when 0
|
|
163
|
-
asign!(val)
|
|
164
|
-
when 1
|
|
165
|
-
kernel_at_addr(idx[0])[] = val
|
|
166
|
-
else
|
|
167
|
-
kernel_at_index(idx)[] = val
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
def put (*idx)
|
|
173
|
-
val = idx.pop
|
|
174
|
-
elements.times do |addr|
|
|
175
|
-
blk = kernel_at_addr(addr)
|
|
176
|
-
blk[*idx] = val
|
|
177
|
-
end
|
|
178
|
-
return self
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
def convert (data_type, options={})
|
|
182
|
-
out = prepare_output(data_type, options)
|
|
183
|
-
out.map_addr!{ |addr|
|
|
184
|
-
blk = kernel_at_addr(addr)
|
|
185
|
-
yield(blk.clone)
|
|
186
|
-
}
|
|
187
|
-
return out
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
def each ()
|
|
191
|
-
retval = nil
|
|
192
|
-
if self.class::UNIFORM_KERNEL
|
|
193
|
-
reference.attach! {
|
|
194
|
-
blk = kernel_at_addr(0)
|
|
195
|
-
elements.times do |addr|
|
|
196
|
-
kernel_move_to_addr(addr, blk)
|
|
197
|
-
retval = yield(blk.clone)
|
|
198
|
-
end
|
|
199
|
-
}
|
|
200
|
-
else
|
|
201
|
-
elements.times do |addr|
|
|
202
|
-
retval = yield(kernel_at_addr(addr).clone)
|
|
203
|
-
end
|
|
48
|
+
define_method(name) do |*, **, &_blk|
|
|
49
|
+
raise NotImplementedError, "#{self.class} must implement ##{name}"
|
|
204
50
|
end
|
|
205
|
-
return retval
|
|
206
51
|
end
|
|
207
52
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
53
|
+
# Recommended (should) surface -- template methods. These are well-defined
|
|
54
|
+
# for some members and structurally impossible for others, so they are not
|
|
55
|
+
# required: `map` is a per-piece element-wise transform scattered back to the
|
|
56
|
+
# source, `sort_addr` is a per-piece sort returning source flat addresses, and
|
|
57
|
+
# the segment scans (cumsum / cumprod / cummax / cummin / cumcount) write a
|
|
58
|
+
# per-cell running statistic of each piece. A member implements each when it
|
|
59
|
+
# is well-defined and overrides it to raise with a reason when it is not. The
|
|
60
|
+
# scans belong here for the same reason as map: a running per-cell value is
|
|
61
|
+
# single-valued only when each cell belongs to exactly one piece, so the
|
|
62
|
+
# partition members (slab / block / categorical / group) provide them, while
|
|
63
|
+
# CAWindowIterator's overlapping padded windows put a cell in many windows --
|
|
64
|
+
# no single running value -- and it raises, exactly as it does for map /
|
|
65
|
+
# sort_addr. Un-overridden each is simply unavailable, not a contract
|
|
66
|
+
# violation. min_addr / max_addr stay required: a single winner address is
|
|
67
|
+
# well-defined even for an overlapping window.
|
|
68
|
+
[:map, :sort_addr,
|
|
69
|
+
:cumsum, :cumprod, :cummax, :cummin, :cumcount].each do |name|
|
|
70
|
+
define_method(name) do |*, **, &_blk|
|
|
71
|
+
raise NotImplementedError, "#{self.class} does not provide ##{name} (optional)"
|
|
221
72
|
end
|
|
222
|
-
return retval
|
|
223
73
|
end
|
|
224
74
|
|
|
225
|
-
def each_with_index ()
|
|
226
|
-
retval = nil
|
|
227
|
-
if self.class::UNIFORM_KERNEL
|
|
228
|
-
reference.attach! {
|
|
229
|
-
CArray.each_index(*dim) do |*idx|
|
|
230
|
-
blk = kernel_at_index(idx)
|
|
231
|
-
retval = yield(blk.clone, idx)
|
|
232
|
-
end
|
|
233
|
-
}
|
|
234
|
-
else
|
|
235
|
-
CArray.each_index(*dim) do |*idx|
|
|
236
|
-
retval = yield(kernel_at_index(idx).clone, idx)
|
|
237
|
-
end
|
|
238
|
-
end
|
|
239
|
-
return retval
|
|
240
|
-
end
|
|
241
|
-
|
|
242
|
-
def inject (*argv)
|
|
243
|
-
case argv.size
|
|
244
|
-
when 0
|
|
245
|
-
memo = nil
|
|
246
|
-
each_with_addr do |val, addr|
|
|
247
|
-
if addr == 0
|
|
248
|
-
memo = val
|
|
249
|
-
else
|
|
250
|
-
memo = yield(memo, val)
|
|
251
|
-
end
|
|
252
|
-
end
|
|
253
|
-
return memo
|
|
254
|
-
when 1
|
|
255
|
-
memo = argv.first
|
|
256
|
-
each do |val|
|
|
257
|
-
memo = yield(memo, val)
|
|
258
|
-
end
|
|
259
|
-
return memo
|
|
260
|
-
else
|
|
261
|
-
raise "invalid number of arguments (#{argv.size} for 0 or 1)"
|
|
262
|
-
end
|
|
263
|
-
end
|
|
264
|
-
|
|
265
|
-
def sort_by! (&block)
|
|
266
|
-
ia = self.ca
|
|
267
|
-
ia[] = ia.to_a.sort_by(&block).map{|x| x.to_ca }
|
|
268
|
-
return reference
|
|
269
|
-
end
|
|
270
|
-
|
|
271
|
-
def sort_by (&block)
|
|
272
|
-
out = reference.template
|
|
273
|
-
idx = ca.convert(:object, &block).sort_addr
|
|
274
|
-
ca[idx].each_with_addr do |blk, i|
|
|
275
|
-
kernel_at_addr(i, out)[] = blk
|
|
276
|
-
end
|
|
277
|
-
return out
|
|
278
|
-
end
|
|
279
|
-
|
|
280
|
-
def sort_with (&block)
|
|
281
|
-
warn "CAIterator#sort_with will be obsolete"
|
|
282
|
-
out = reference.template
|
|
283
|
-
idx = CA.sort_addr(*yield(self))
|
|
284
|
-
ca[idx].each_with_addr do |blk, i|
|
|
285
|
-
kernel_at_addr(i, out)[] = blk
|
|
286
|
-
end
|
|
287
|
-
return out
|
|
288
|
-
end
|
|
289
|
-
|
|
290
|
-
end
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
# -----------------------------------------------------------------
|
|
294
|
-
|
|
295
|
-
class CArray
|
|
296
|
-
def windows (*args, &block)
|
|
297
|
-
return CAWindowIterator.new(self.window(*args, &block))
|
|
298
|
-
end
|
|
299
75
|
end
|
|
300
|
-
|
|
301
|
-
# -----------------------------------------------------------------
|
|
302
|
-
|
|
303
|
-
class CArray
|
|
304
|
-
|
|
305
|
-
def classes (classifier=nil, &block)
|
|
306
|
-
return CAClassIterator.new(self, classifier).__build__(&block)
|
|
307
|
-
end
|
|
308
|
-
|
|
309
|
-
end
|
|
310
|
-
|
|
311
|
-
class CAClassIterator < CAIterator # :nodoc:
|
|
312
|
-
|
|
313
|
-
UNIFORM_KERNEL = false
|
|
314
|
-
|
|
315
|
-
def initialize (reference, classifier = nil)
|
|
316
|
-
@reference = reference
|
|
317
|
-
@classifier = classifier || @reference.uniq.sort
|
|
318
|
-
@null = CArray.new(@reference.data_type,[0])
|
|
319
|
-
@null.data_class = @reference.data_class if @reference.has_data_class?
|
|
320
|
-
@table = {}
|
|
321
|
-
@ndim = 1
|
|
322
|
-
@dim = [0]
|
|
323
|
-
if @classifier.all_masked? or @classifier.size == 0
|
|
324
|
-
@dim = [0]
|
|
325
|
-
else
|
|
326
|
-
# @dim = [@classifier.max+1]
|
|
327
|
-
@dim = [@classifier.size]
|
|
328
|
-
end
|
|
329
|
-
end
|
|
330
|
-
|
|
331
|
-
attr_reader :classifier, :table
|
|
332
|
-
|
|
333
|
-
def __build__ (&block)
|
|
334
|
-
if @block
|
|
335
|
-
@classifier.each_with_addr do |v, i|
|
|
336
|
-
@table[v] = block[v].where
|
|
337
|
-
end
|
|
338
|
-
else
|
|
339
|
-
@classifier.each_with_addr do |v, i|
|
|
340
|
-
@table[v] = @reference.eq(v).where
|
|
341
|
-
end
|
|
342
|
-
end
|
|
343
|
-
return self
|
|
344
|
-
end
|
|
345
|
-
|
|
346
|
-
def ndiming (&block)
|
|
347
|
-
block ||= lambda {|a| a.size }
|
|
348
|
-
values = self.to_a.map{|v| block[v] }.to_ca
|
|
349
|
-
addrs = values.sort_addr.reverse
|
|
350
|
-
return CArray.join([@classifier[addrs], values[addrs]])
|
|
351
|
-
end
|
|
352
|
-
|
|
353
|
-
def kernel_at_addr (addr, ref = nil)
|
|
354
|
-
ref ||= @reference
|
|
355
|
-
if @table[addr]
|
|
356
|
-
return ref[@table[addr]]
|
|
357
|
-
else
|
|
358
|
-
return @null
|
|
359
|
-
end
|
|
360
|
-
end
|
|
361
|
-
|
|
362
|
-
def kernel_at_index (idx, ref = nil)
|
|
363
|
-
kernel_at_addr(idx[0], ref)
|
|
364
|
-
end
|
|
365
|
-
|
|
366
|
-
end
|
|
367
|
-
|