carray 3.0.1 → 3.0.3
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 +824 -0
- data/README.md +5 -6
- data/carray.gemspec +1 -1
- data/ext/ca_axis_dispatch.c +258 -4
- data/ext/ca_axis_group.c +368 -184
- data/ext/ca_binop_dispatch.c +54 -32
- data/ext/ca_binop_dispatch.h +1 -0
- data/ext/ca_categorical_iterator.c +90 -41
- data/ext/ca_compare.c +8 -2
- data/ext/ca_for_buffer.h +21 -68
- data/ext/ca_group_iter.c +27 -11
- data/ext/ca_kernel_iterator.c +960 -245
- data/ext/ca_kernel_iterator.h +352 -181
- data/ext/ca_monop_dispatch.c +4 -4
- data/ext/ca_monop_dispatch.h +4 -0
- data/ext/ca_obj_array.c +194 -42
- data/ext/ca_obj_bincmp.c +152 -121
- data/ext/ca_obj_binop.c +107 -210
- data/ext/ca_obj_bitarray.c +37 -24
- data/ext/ca_obj_bitfield.c +95 -62
- data/ext/ca_obj_block.c +5 -4
- data/ext/ca_obj_byte_swap.c +40 -40
- data/ext/ca_obj_const_string.c +180 -50
- data/ext/ca_obj_face.c +428 -62
- data/ext/ca_obj_face.h +107 -47
- data/ext/ca_obj_fake.c +21 -50
- data/ext/ca_obj_farray.c +1 -0
- data/ext/ca_obj_field.c +16 -3
- data/ext/ca_obj_fixlen_string.c +39 -26
- data/ext/ca_obj_grid.c +181 -124
- data/ext/ca_obj_meld.c +235 -55
- data/ext/ca_obj_moncmp.c +61 -61
- data/ext/ca_obj_monop.c +125 -107
- data/ext/ca_obj_object.c +551 -233
- data/ext/ca_obj_record.c +51 -16
- data/ext/ca_obj_reduce.c +5 -8
- data/ext/ca_obj_refer.c +117 -33
- data/ext/ca_obj_remap.c +57 -17
- data/ext/ca_obj_repeat.c +21 -5
- data/ext/ca_obj_roll.c +115 -11
- data/ext/ca_obj_select.c +88 -75
- data/ext/ca_obj_select_axis.c +58 -60
- data/ext/ca_obj_shift.c +22 -102
- data/ext/ca_obj_stack.c +223 -123
- data/ext/ca_obj_stride.c +267 -35
- data/ext/ca_obj_string.c +25 -22
- data/ext/ca_obj_tile.c +32 -16
- data/ext/ca_obj_time.c +23 -25
- data/ext/ca_obj_timedelta.c +21 -23
- data/ext/ca_obj_transpose.c +12 -3
- data/ext/ca_obj_triop.c +110 -117
- data/ext/ca_obj_window.c +157 -29
- data/ext/ca_op_ipower.c +25 -13
- data/ext/ca_op_powi.h +57 -30
- data/ext/ca_pow5_table.h +656 -0
- data/ext/ca_rng_normal.h +42 -0
- data/ext/ca_rng_xoshiro256pp.h +105 -0
- data/ext/ca_sort_kernels.h +70 -0
- data/ext/ca_sweep_engine.c +385 -198
- data/ext/ca_sweep_engine.h +31 -23
- data/ext/ca_triop_dispatch.c +4 -1
- data/ext/ca_triop_dispatch.h +5 -2
- data/ext/caframe_csv_reader.c +463 -0
- data/ext/carray.h +90 -28
- data/ext/carray_access.c +487 -231
- data/ext/carray_address_basis.c +731 -0
- data/ext/carray_attribute.c +45 -3
- data/ext/carray_bincount.c +32 -2
- data/ext/carray_broadcast.c +49 -17
- data/ext/carray_call_cfunc.c +667 -511
- data/ext/carray_cast.c +1556 -247
- data/ext/carray_cast_func.rb +34 -21
- data/ext/carray_conversion.c +197 -73
- data/ext/carray_copy.c +84 -38
- data/ext/carray_core.c +591 -119
- data/ext/carray_count.c +148 -96
- data/ext/carray_element.c +18 -27
- data/ext/carray_factorize.c +604 -291
- data/ext/carray_generate.c +76 -40
- data/ext/carray_histogram.c +152 -94
- data/ext/carray_hold.c +2 -1
- data/ext/carray_index_classifier.c +63 -96
- data/ext/carray_internal.h +400 -1
- data/ext/carray_lazy.c +834 -79
- data/ext/carray_loop.c +88 -66
- data/ext/carray_mask.c +705 -324
- data/ext/carray_math_kernel.h +1 -0
- data/ext/carray_median_percentile.c +263 -63
- data/ext/carray_memory_view.c +254 -248
- data/ext/carray_operator.c +1093 -363
- data/ext/carray_order.c +133 -69
- data/ext/carray_partition.c +102 -56
- data/ext/carray_random.c +582 -204
- data/ext/carray_scatter.c +308 -65
- data/ext/carray_segment.c +257 -0
- data/ext/carray_slab.c +183 -70
- data/ext/carray_sort.c +235 -240
- data/ext/carray_sort_kernel.c +8 -1
- data/ext/carray_struct.c +99 -21
- data/ext/carray_test.c +167 -64
- data/ext/carray_time_text.c +1182 -0
- data/ext/carray_utils.c +363 -98
- data/ext/extconf.rb +27 -2
- data/ext/mk_call_cfunc.rb +103 -118
- data/ext/mk_pow5_table.rb +35 -0
- data/ext/mkkernel.rb +1349 -851
- data/ext/ruby_carray.c +17 -2
- data/ext/version.h +4 -4
- data/ext/version.rb +4 -2
- data/lib/carray/attribute.rb +39 -0
- data/lib/carray/autoload_carray.rb +24 -3
- data/lib/carray/autoload_method_extension.rb +18 -0
- data/lib/carray/axis_group.rb +245 -20
- data/lib/carray/basics.rb +95 -25
- data/lib/carray/bincount_nd.rb +6 -0
- data/lib/carray/block_iterator.rb +200 -54
- data/lib/carray/boolean_reduce.rb +21 -29
- data/lib/carray/categorical.rb +244 -59
- data/lib/carray/categorical_iterator.rb +391 -757
- data/lib/carray/complex.rb +36 -29
- data/lib/carray/conditional.rb +94 -7
- data/lib/carray/const_string.rb +177 -27
- data/lib/carray/construct.rb +40 -0
- data/lib/carray/data_type_extension.rb +3 -0
- data/lib/carray/data_type_limits.rb +91 -0
- data/lib/carray/fixlen_string.rb +1 -1
- data/lib/carray/frame/concat.rb +157 -6
- data/lib/carray/frame/convert.rb +13 -7
- data/lib/carray/frame/csv_parser.rb +590 -76
- data/lib/carray/frame/describe.rb +79 -0
- data/lib/carray/frame/frame.rb +205 -35
- data/lib/carray/frame/group.rb +199 -40
- data/lib/carray/frame/io.rb +452 -60
- data/lib/carray/frame/join.rb +134 -46
- data/lib/carray/frame/records.rb +54 -19
- data/lib/carray/frame/reshape.rb +448 -0
- data/lib/carray/frame/sort.rb +26 -2
- data/lib/carray/frame/verbs.rb +726 -56
- data/lib/carray/frame.rb +2 -0
- data/lib/carray/fuse_source.rb +111 -2
- data/lib/carray/fusion.rb +229 -38
- data/lib/carray/inspect.rb +71 -20
- data/lib/carray/iterator.rb +157 -2
- data/lib/carray/lazy.rb +54 -67
- data/lib/carray/mask_gap_fill.rb +66 -50
- data/lib/carray/math.rb +32 -19
- data/lib/carray/meld_reduce.rb +40 -7
- data/lib/carray/methods/align_addr.rb +8 -4
- data/lib/carray/methods/bincount.rb +2 -2
- data/lib/carray/methods/bit_string.rb +14 -3
- data/lib/carray/methods/composition.rb +16 -10
- data/lib/carray/methods/discovery_along.rb +74 -0
- data/lib/carray/methods/factorize.rb +50 -0
- data/lib/carray/methods/gather_nd.rb +13 -2
- data/lib/carray/methods/insert_block.rb +9 -14
- data/lib/carray/methods/is_in.rb +130 -6
- data/lib/carray/methods/join.rb +1 -1
- data/lib/carray/methods/locate_addr.rb +235 -21
- data/lib/carray/methods/mask_duplicates.rb +35 -1
- data/lib/carray/methods/mode.rb +18 -1
- data/lib/carray/methods/nunique.rb +22 -1
- data/lib/carray/methods/repeat.rb +91 -0
- data/lib/carray/methods/resize.rb +21 -23
- data/lib/carray/methods/snap.rb +34 -12
- data/lib/carray/methods/unique.rb +52 -3
- data/lib/carray/record_order.rb +208 -0
- data/lib/carray/rng.rb +86 -0
- data/lib/carray/runtime.rb +14 -11
- data/lib/carray/segment_iterator.rb +990 -0
- data/lib/carray/serialize.rb +197 -27
- data/lib/carray/slab_iterator.rb +109 -40
- data/lib/carray/stack.rb +10 -4
- data/lib/carray/string_operation_extension.rb +9 -4
- data/lib/carray/struct.rb +142 -51
- data/lib/carray/struct_builder.rb +110 -14
- data/lib/carray/table.rb +2 -2
- data/lib/carray/time.rb +535 -105
- data/lib/carray/window_iterator.rb +259 -82
- data/lib/carray.rb +4 -2
- data/yard-stubs/ca_obj_array.rb +4 -4
- data/yard-stubs/ca_obj_bitarray.rb +7 -0
- data/yard-stubs/ca_obj_bitfield.rb +23 -12
- data/yard-stubs/ca_obj_block.rb +2 -7
- data/yard-stubs/ca_obj_fake.rb +1 -1
- data/yard-stubs/ca_obj_field.rb +1 -1
- data/yard-stubs/ca_obj_refer.rb +3 -3
- data/yard-stubs/ca_obj_roll.rb +0 -1
- data/yard-stubs/ca_obj_stride.rb +10 -7
- data/yard-stubs/ca_obj_transpose.rb +1 -1
- data/yard-stubs/ca_obj_window.rb +11 -4
- data/yard-stubs/carray_access.rb +6 -5
- data/yard-stubs/carray_broadcast.rb +2 -2
- data/yard-stubs/carray_cast.rb +78 -43
- data/yard-stubs/carray_conversion.rb +13 -1
- data/yard-stubs/carray_copy.rb +8 -3
- data/yard-stubs/carray_core.rb +3 -83
- data/yard-stubs/carray_count.rb +16 -2
- data/yard-stubs/carray_lazy.rb +210 -1
- data/yard-stubs/carray_loop.rb +4 -1
- data/yard-stubs/carray_mask.rb +34 -10
- data/yard-stubs/carray_math.rb +1499 -4
- data/yard-stubs/carray_median_percentile.rb +26 -8
- data/yard-stubs/carray_order.rb +43 -82
- data/yard-stubs/carray_scatter.rb +10 -3
- data/yard-stubs/carray_segment.rb +72 -0
- data/yard-stubs/carray_slab.rb +11 -8
- data/yard-stubs/carray_sort.rb +50 -8
- data/yard-stubs/carray_test.rb +10 -0
- data/yard-stubs/carray_utils.rb +0 -26
- metadata +19 -19
- data/ext/ca_for_each_element.h +0 -239
- data/ext/carray_build_flags.h +0 -3
- data/ext/carray_config.h +0 -28
- data/ext/carray_kernels_bincmp.c +0 -4446
- data/ext/carray_kernels_binop.c +0 -11001
- data/ext/carray_kernels_init.c +0 -1131
- data/ext/carray_kernels_map.c +0 -3467
- data/ext/carray_kernels_moncmp.c +0 -2097
- data/ext/carray_kernels_monop.c +0 -18313
- data/ext/carray_kernels_reduce_aggregate.c +0 -25837
- data/ext/carray_kernels_reduce_boolean.c +0 -330
- data/ext/carray_kernels_reduce_cumulative.c +0 -14593
- data/ext/carray_kernels_reduce_extreme.c +0 -16948
- data/ext/carray_kernels_reduce_variance.c +0 -3910
- data/ext/carray_kernels_scan.c +0 -3693
- data/ext/carray_kernels_search.c +0 -32138
- data/ext/carray_kernels_sort.c +0 -10626
- data/ext/carray_kernels_triop.c +0 -1392
data/ext/carray.h
CHANGED
|
@@ -716,6 +716,12 @@ typedef struct {
|
|
|
716
716
|
0 = outer-axis stack (legacy default).
|
|
717
717
|
parent_ndim = K innermost (= old merge at=-1).
|
|
718
718
|
Set by ca_stack_setup_with_axis / preserved on clone. */
|
|
719
|
+
CArray **mask_standins; /* NULL, or ALLOC_N(CArray*, n_parents) once the mask is
|
|
720
|
+
built: the all-false masks standing in for parents that
|
|
721
|
+
have none (owned, freed with the view) */
|
|
722
|
+
CArray *mask_owner; /* on the mask of a CAStack: that CAStack, whose stand-ins
|
|
723
|
+
this mask reads until they give way to the parents'
|
|
724
|
+
own masks (ca_multi_parent_mask_refresh); else NULL */
|
|
719
725
|
} CAStack;
|
|
720
726
|
|
|
721
727
|
/* CAMeld (ragged concatenate view along an existing axis). Unlike CAStack
|
|
@@ -749,6 +755,8 @@ typedef struct {
|
|
|
749
755
|
ca_size_t *seg_offset; /* ALLOC_N(ca_size_t, K+1); prefix sum along meld_axis.
|
|
750
756
|
seg_offset[0]=0, seg_offset[k+1]=seg_offset[k]+parents[k]->dim[meld_axis],
|
|
751
757
|
seg_offset[K]=dim[meld_axis]. */
|
|
758
|
+
CArray **mask_standins; /* as CAStack's: stand-in masks this view owns, or NULL */
|
|
759
|
+
CArray *mask_owner; /* as CAStack's */
|
|
752
760
|
} CAMeld;
|
|
753
761
|
|
|
754
762
|
/* Multi-parent view layout convention (CA_FLAG_MULTI_PARENTS). A view that
|
|
@@ -786,9 +794,14 @@ typedef struct {
|
|
|
786
794
|
VALUE self;
|
|
787
795
|
} CAObject; /* 48 + 4*(ndim) (bytes) */
|
|
788
796
|
|
|
789
|
-
/*
|
|
790
|
-
CAObjectMask is an internal class
|
|
791
|
-
|
|
797
|
+
/*
|
|
798
|
+
CAObjectMask is an internal class used only as the mask array of a
|
|
799
|
+
CAObject. Its bits live in the CAObject's mask hooks (mask_copy_data,
|
|
800
|
+
mask_fetch_addr, ...) when it has them, and in `cache` -- the mask
|
|
801
|
+
buffer of the CAObject's internal data array -- always. Like the mask
|
|
802
|
+
of any view it is cold at rest: ptr is NULL, and every read and write
|
|
803
|
+
goes through its slots to the hooks. An attach publishes the cache in
|
|
804
|
+
ptr, and `holds` counts the attaches not yet detached.
|
|
792
805
|
*/
|
|
793
806
|
|
|
794
807
|
typedef struct {
|
|
@@ -807,6 +820,8 @@ typedef struct {
|
|
|
807
820
|
ext/ca_array_pool.c. */
|
|
808
821
|
/* -------------*/
|
|
809
822
|
VALUE array;
|
|
823
|
+
char *cache;
|
|
824
|
+
long holds;
|
|
810
825
|
} CAObjectMask;
|
|
811
826
|
|
|
812
827
|
/* CARepeat (Phase R migration): structurally identical to CAStride.
|
|
@@ -862,7 +877,7 @@ int8_t ca_promote_type (int8_t a, int8_t b);
|
|
|
862
877
|
/* Infer a data_type code from a Ruby *value* (literal Numeric, true/false,
|
|
863
878
|
Complex, etc.) — distinct from rb_ca_guess_type which interprets the
|
|
864
879
|
object as a data_type *representation* (e.g. T_FIXNUM as a data_type code).
|
|
865
|
-
Used by
|
|
880
|
+
Used by rb_ca_cast_self_or_other.
|
|
866
881
|
CArray is not accepted (callers should use ca->data_type directly). */
|
|
867
882
|
int8_t ca_value_to_data_type (VALUE obj);
|
|
868
883
|
|
|
@@ -922,7 +937,6 @@ extern const rb_data_type_t careduce_data_type;
|
|
|
922
937
|
extern const rb_data_type_t carefer_data_type;
|
|
923
938
|
extern const rb_data_type_t caselect_data_type;
|
|
924
939
|
extern const rb_data_type_t cashift_data_type;
|
|
925
|
-
extern const rb_data_type_t caunboundrepeat_data_type;
|
|
926
940
|
extern const rb_data_type_t cawindow_data_type;
|
|
927
941
|
|
|
928
942
|
extern const rb_data_type_t carray_mask_data_type;
|
|
@@ -933,7 +947,6 @@ extern const rb_data_type_t careduce_mask_data_type;
|
|
|
933
947
|
extern const rb_data_type_t carefer_mask_data_type;
|
|
934
948
|
extern const rb_data_type_t caselect_mask_data_type;
|
|
935
949
|
extern const rb_data_type_t cashift_mask_data_type;
|
|
936
|
-
extern const rb_data_type_t caunboundrepeat_mask_data_type;
|
|
937
950
|
extern const rb_data_type_t cawindow_mask_data_type;
|
|
938
951
|
|
|
939
952
|
/* -------------------------------------------------------------------- */
|
|
@@ -987,21 +1000,21 @@ extern VALUE rb_cCArrayObject;
|
|
|
987
1000
|
#define CA_CHECK_DATA_TYPE(data_type) \
|
|
988
1001
|
do { \
|
|
989
1002
|
if ( data_type <= CA_NONE || data_type >= CA_NTYPE ) { \
|
|
990
|
-
rb_raise(
|
|
1003
|
+
rb_raise(rb_eArgError, "invalid data_type id %i", data_type); \
|
|
991
1004
|
} \
|
|
992
1005
|
if ( ! ca_valid[data_type] ) { \
|
|
993
|
-
rb_raise(
|
|
1006
|
+
rb_raise(rb_eCADataTypeError, "data_type %s is disabled", ca_type_name[data_type]); \
|
|
994
1007
|
} \
|
|
995
1008
|
} while (0)
|
|
996
1009
|
|
|
997
1010
|
#define CA_CHECK_DATA_TYPE_NUMERIC(data_type) \
|
|
998
1011
|
if ( data_type <= CA_NONE || data_type >= CA_NTYPE || !ca_valid[data_type] || data_type == CA_FIXLEN || data_type == CA_OBJECT ) { \
|
|
999
|
-
rb_raise(
|
|
1012
|
+
rb_raise(rb_eCADataTypeError, "invalid numeric data type"); \
|
|
1000
1013
|
}
|
|
1001
1014
|
|
|
1002
1015
|
#define CA_CHECK_RANK(ndim) \
|
|
1003
1016
|
if ( ndim <= 0 || ndim > CA_RANK_MAX ) { \
|
|
1004
|
-
rb_raise(
|
|
1017
|
+
rb_raise(rb_eArgError, "invalid ndim"); \
|
|
1005
1018
|
}
|
|
1006
1019
|
|
|
1007
1020
|
#define CA_CHECK_DIM(ndim, dim) \
|
|
@@ -1009,44 +1022,46 @@ extern VALUE rb_cCArrayObject;
|
|
|
1009
1022
|
int8_t i_; \
|
|
1010
1023
|
for (i_=0; i_<ndim; i_++) { \
|
|
1011
1024
|
if ( dim[i_] < 0 ) { \
|
|
1012
|
-
rb_raise(
|
|
1025
|
+
rb_raise(rb_eArgError, "negative size dimension at %i-dim", i_); \
|
|
1013
1026
|
} \
|
|
1014
1027
|
} \
|
|
1015
1028
|
}
|
|
1016
1029
|
|
|
1030
|
+
/* A fixlen cell is at least one byte wide. A zero-width cell has one
|
|
1031
|
+
possible value, and a strided view of it cannot say which cell is which:
|
|
1032
|
+
its byte strides are all zero. */
|
|
1017
1033
|
#define CA_CHECK_BYTES(data_type, bytes) \
|
|
1018
1034
|
if ( data_type == CA_FIXLEN ) { \
|
|
1019
|
-
if ( bytes
|
|
1020
|
-
rb_raise(
|
|
1035
|
+
if ( bytes <= 0 ) { \
|
|
1036
|
+
rb_raise(rb_eArgError, \
|
|
1037
|
+
"invalid bytes (a fixlen needs bytes: of 1 or more)"); \
|
|
1021
1038
|
} \
|
|
1022
1039
|
} \
|
|
1023
1040
|
else { \
|
|
1024
1041
|
bytes = ca_sizeof[data_type]; \
|
|
1025
1042
|
if ( bytes <= 0 ) { \
|
|
1026
|
-
rb_raise(
|
|
1043
|
+
rb_raise(rb_eArgError, "invalid bytes"); \
|
|
1027
1044
|
} \
|
|
1028
1045
|
}
|
|
1029
1046
|
|
|
1047
|
+
/* An index into `n` places, counted from the end when negative, outside of
|
|
1048
|
+
which IndexError is raised naming the method the user called, `what` the
|
|
1049
|
+
index is ("index", "address") and the value given. */
|
|
1050
|
+
NORETURN(void ca_index_out_of_range (ca_size_t idx, ca_size_t n, const char *what));
|
|
1051
|
+
|
|
1052
|
+
/* Normalise `index` in place against `dim` (a negative one counts from the
|
|
1053
|
+
end) and raise through ca_index_out_of_range when it falls outside. */
|
|
1030
1054
|
#define CA_CHECK_INDEX(index, dim) \
|
|
1031
1055
|
do { \
|
|
1032
|
-
|
|
1033
|
-
|
|
1056
|
+
ca_size_t ca_check_index_given_ = (index); \
|
|
1057
|
+
if ( (index) < 0 ) { \
|
|
1058
|
+
(index) += (dim); \
|
|
1034
1059
|
} \
|
|
1035
|
-
if ( index < 0 || index >= (dim) ) { \
|
|
1036
|
-
|
|
1060
|
+
if ( (index) < 0 || (index) >= (dim) ) { \
|
|
1061
|
+
ca_index_out_of_range(ca_check_index_given_, (dim), "index"); \
|
|
1037
1062
|
} \
|
|
1038
1063
|
} while (0)
|
|
1039
1064
|
|
|
1040
|
-
#define CA_CHECK_BOUND(ca, idx) \
|
|
1041
|
-
{ \
|
|
1042
|
-
int8_t i; \
|
|
1043
|
-
for (i=0; i<ca->ndim; i++) { \
|
|
1044
|
-
if ( idx[i] < 0 || idx[i] >= ca->dim[i] ) { \
|
|
1045
|
-
rb_raise(rb_eRuntimeError, "index out of range at %i-dim ( %i <=> 0..%i )", i, idx[i], ca->dim[i]-1); \
|
|
1046
|
-
} \
|
|
1047
|
-
} \
|
|
1048
|
-
}
|
|
1049
|
-
|
|
1050
1065
|
/* -------------------------------------------------------------------- */
|
|
1051
1066
|
|
|
1052
1067
|
/* complex <-> Ruby Complex conversion
|
|
@@ -1072,6 +1087,10 @@ extern VALUE rb_cCArrayObject;
|
|
|
1072
1087
|
# endif
|
|
1073
1088
|
#endif
|
|
1074
1089
|
|
|
1090
|
+
/* A string as a complex cell: a real number read as Float() reads it
|
|
1091
|
+
(nan / inf included), else as Complex() does; anything else raises. */
|
|
1092
|
+
double complex ca_str_to_cmplx (VALUE str);
|
|
1093
|
+
|
|
1075
1094
|
static inline double complex
|
|
1076
1095
|
rb_carray_num2cmplx (VALUE num)
|
|
1077
1096
|
{
|
|
@@ -1081,6 +1100,12 @@ rb_carray_num2cmplx (VALUE num)
|
|
|
1081
1100
|
if ( RB_FLOAT_TYPE_P(num) || RB_INTEGER_TYPE_P(num) ) {
|
|
1082
1101
|
return (double complex) NUM2DBL(num);
|
|
1083
1102
|
}
|
|
1103
|
+
if ( RB_TYPE_P(num, T_STRING) ) {
|
|
1104
|
+
return ca_str_to_cmplx(num);
|
|
1105
|
+
}
|
|
1106
|
+
if ( NIL_P(num) ) {
|
|
1107
|
+
rb_raise(rb_eTypeError, "can't convert nil into Complex");
|
|
1108
|
+
}
|
|
1084
1109
|
if ( rb_respond_to(num, rb_intern("to_c")) ) {
|
|
1085
1110
|
VALUE c = rb_funcall(num, rb_intern("to_c"), 0);
|
|
1086
1111
|
return CMPLX(NUM2DBL(rb_complex_real(c)), NUM2DBL(rb_complex_imag(c)));
|
|
@@ -1127,6 +1152,7 @@ double OBJ2DBL (VALUE v);
|
|
|
1127
1152
|
object->int/float cast loop so an unparseable cell becomes UNDEF instead
|
|
1128
1153
|
of a silent 0.0 (float) or a raise (int). See ext/carray_cast.c. */
|
|
1129
1154
|
int ca_obj2dbl_ok (VALUE v, double *out);
|
|
1155
|
+
int ca_obj2cmplx_ok (VALUE v, double complex *out);
|
|
1130
1156
|
int rb_obj2long_ok (VALUE v, long *out);
|
|
1131
1157
|
int rb_obj2ulong_ok (VALUE v, unsigned long *out);
|
|
1132
1158
|
int rb_obj2ll_ok (VALUE v, long long *out);
|
|
@@ -1295,6 +1321,10 @@ VALUE rb_ca_farray (VALUE self);
|
|
|
1295
1321
|
|
|
1296
1322
|
/* --- ca_obj_stride.c --- */
|
|
1297
1323
|
|
|
1324
|
+
/* ca_stride_setup with ca == NULL runs its checks and returns 0 without
|
|
1325
|
+
writing. ca_stride_new calls it that way before it allocates, so a
|
|
1326
|
+
rejected argument leaves no struct behind; a subclass constructor can
|
|
1327
|
+
do the same through its own setup function. */
|
|
1298
1328
|
int ca_stride_setup (CAStride *ca, int8_t obj_type, CArray *parent,
|
|
1299
1329
|
int8_t data_type, ca_size_t bytes,
|
|
1300
1330
|
int8_t ndim, ca_size_t *dim,
|
|
@@ -1461,6 +1491,7 @@ int ca_is_object_type (void *ap);
|
|
|
1461
1491
|
|
|
1462
1492
|
void ca_check_type (void *ap, int8_t data_type);
|
|
1463
1493
|
#define ca_check_data_type(ap, data_type) ca_check_type(ap, data_type)
|
|
1494
|
+
void ca_check_uninitialized (void *ap); /* initialize / initialize_copy entry */
|
|
1464
1495
|
void ca_check_ndim (void *ap, int ndim);
|
|
1465
1496
|
void ca_check_shape (void *ap, int ndim, ca_size_t *dim);
|
|
1466
1497
|
void ca_check_same_data_type (void *ap1, void *ap2);
|
|
@@ -1476,11 +1507,41 @@ int ca_is_valid_index (void *ap, ca_size_t *idx);
|
|
|
1476
1507
|
|
|
1477
1508
|
/* API : allocate, attach, update, sync, detach */
|
|
1478
1509
|
|
|
1510
|
+
/* Attach lifecycle contract (R1-R6). Ownership-based, and NOT transitive.
|
|
1511
|
+
This block is the canonical statement of the contract; the other documents
|
|
1512
|
+
copy it. guides/devel/04_attach_lifecycle.md discusses it at length.
|
|
1513
|
+
|
|
1514
|
+
R1 (validity) ca_attach(x) makes x->ptr only valid. It says nothing
|
|
1515
|
+
about any other array.
|
|
1516
|
+
R2 (no transit) Attaching a child does not attach its parent. An
|
|
1517
|
+
implementation may do so as an internal optimisation;
|
|
1518
|
+
never rely on it.
|
|
1519
|
+
R3 (necessity) To touch ca->parent->ptr, call ca_attach(ca->parent)
|
|
1520
|
+
yourself.
|
|
1521
|
+
R4 (ordering) Attaching both parent and child: open parent -> child,
|
|
1522
|
+
close child -> parent, sync in attach order. Symmetric
|
|
1523
|
+
nesting stays correct when a view double-attaches
|
|
1524
|
+
internally (views carry an attach refcount; entities do
|
|
1525
|
+
not).
|
|
1526
|
+
R5 (traffic) Attach hands you a buffer, not a live array. Use x->ptr;
|
|
1527
|
+
a view derived from x composes past the buffer to the
|
|
1528
|
+
root.
|
|
1529
|
+
R6 (raising) ca_allocate and ca_attach that raise have taken
|
|
1530
|
+
nothing; ca_allocate_n and ca_attach_n take all of
|
|
1531
|
+
their arrays or none. Close a window with
|
|
1532
|
+
ca_sync_detach, which detaches even when the sync
|
|
1533
|
+
raises -- ca_sync then ca_detach leaves the window open
|
|
1534
|
+
on a raise. Anything between that can raise (Ruby
|
|
1535
|
+
called from inside the window) needs an ensure of its
|
|
1536
|
+
own.
|
|
1537
|
+
*/
|
|
1538
|
+
|
|
1479
1539
|
void ca_allocate (void *ap);
|
|
1480
1540
|
void ca_attach (void *ca);
|
|
1481
1541
|
void ca_update (void *ca);
|
|
1482
1542
|
void ca_sync (void *ca);
|
|
1483
1543
|
void ca_detach (void *ca);
|
|
1544
|
+
void ca_sync_detach (void *ca);
|
|
1484
1545
|
|
|
1485
1546
|
void ca_allocate_n (int n, ...);
|
|
1486
1547
|
void ca_attach_n (int n, ...);
|
|
@@ -1653,6 +1714,7 @@ void ca_parse_range_without_check (VALUE arg, ca_size_t size,
|
|
|
1653
1714
|
ca_size_t *offset, ca_size_t *count, ca_size_t *step);
|
|
1654
1715
|
|
|
1655
1716
|
int ca_equal (void *ap, void *bp);
|
|
1717
|
+
int ca_eql_storage (void *ap, void *bp);
|
|
1656
1718
|
void ca_zerodiv(void) __attribute__((noreturn));
|
|
1657
1719
|
/* ca_rand removed in 3.0; use rb_random_real/rb_random_ulong_limited instead */
|
|
1658
1720
|
ca_size_t ca_bounds_normalize_index (int8_t bounds, ca_size_t size0, ca_size_t k);
|