carray 3.0.2 → 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 +568 -0
- data/README.md +6 -6
- data/carray.gemspec +1 -1
- data/ext/ca_axis_descriptor.h +27 -24
- data/ext/ca_axis_dispatch.c +220 -0
- data/ext/ca_axis_group.c +201 -123
- data/ext/ca_binop_dispatch.c +46 -52
- data/ext/ca_binop_dispatch.h +1 -1
- data/ext/ca_categorical_iterator.c +249 -183
- data/ext/ca_compare.c +7 -12
- data/ext/ca_for_buffer.h +21 -68
- data/ext/ca_group_iter.c +38 -23
- data/ext/ca_kernel_iterator.c +1765 -2076
- data/ext/ca_kernel_iterator.h +584 -566
- data/ext/ca_monop_dispatch.c +86 -63
- data/ext/ca_monop_dispatch.h +5 -0
- data/ext/ca_obj_array.c +223 -56
- data/ext/ca_obj_bincmp.c +172 -138
- data/ext/ca_obj_binop.c +116 -230
- data/ext/ca_obj_bitarray.c +40 -26
- data/ext/ca_obj_bitfield.c +100 -68
- data/ext/ca_obj_block.c +19 -9
- data/ext/ca_obj_byte_swap.c +45 -46
- data/ext/ca_obj_const_string.c +269 -44
- data/ext/ca_obj_face.c +612 -89
- data/ext/ca_obj_face.h +111 -47
- data/ext/ca_obj_fake.c +36 -79
- data/ext/ca_obj_farray.c +7 -3
- data/ext/ca_obj_field.c +33 -8
- data/ext/ca_obj_fixlen_string.c +23 -24
- data/ext/ca_obj_grid.c +541 -210
- data/ext/ca_obj_meld.c +331 -111
- data/ext/ca_obj_moncmp.c +80 -65
- data/ext/ca_obj_monop.c +177 -149
- data/ext/ca_obj_object.c +664 -248
- data/ext/ca_obj_record.c +63 -23
- data/ext/ca_obj_reduce.c +18 -16
- data/ext/ca_obj_refer.c +140 -58
- data/ext/ca_obj_remap.c +85 -24
- data/ext/ca_obj_repeat.c +24 -9
- data/ext/ca_obj_roll.c +121 -16
- data/ext/ca_obj_select.c +61 -58
- data/ext/ca_obj_select_axis.c +73 -107
- data/ext/ca_obj_shift.c +32 -102
- data/ext/ca_obj_stack.c +372 -122
- data/ext/ca_obj_stride.c +348 -140
- data/ext/ca_obj_string.c +88 -22
- data/ext/ca_obj_tile.c +38 -21
- data/ext/ca_obj_time.c +45 -31
- data/ext/ca_obj_timedelta.c +43 -29
- data/ext/ca_obj_transpose.c +17 -6
- data/ext/ca_obj_triop.c +125 -141
- data/ext/ca_obj_window.c +330 -44
- data/ext/ca_op_ipower.c +24 -11
- data/ext/ca_op_powi.h +57 -30
- data/ext/ca_pow5_table.h +656 -0
- data/ext/ca_sort_kernels.h +70 -0
- data/ext/ca_sweep_engine.c +104 -81
- data/ext/ca_sweep_engine.h +7 -20
- data/ext/ca_triop_dispatch.c +4 -1
- data/ext/ca_triop_dispatch.h +5 -2
- data/ext/caframe_csv_reader.c +542 -0
- data/ext/carray.h +241 -92
- data/ext/carray_access.c +608 -276
- data/ext/carray_address_basis.c +494 -97
- data/ext/carray_attribute.c +129 -4
- data/ext/carray_bincount.c +39 -7
- data/ext/carray_broadcast.c +56 -19
- data/ext/carray_build_flags.h +1 -1
- data/ext/carray_call_cfunc.c +108 -28
- data/ext/carray_cast.c +1576 -223
- data/ext/carray_cast_func.rb +77 -24
- data/ext/carray_class.c +4 -3
- data/ext/carray_conversion.c +208 -75
- data/ext/carray_copy.c +82 -24
- data/ext/carray_core.c +646 -162
- data/ext/carray_count.c +171 -88
- data/ext/carray_element.c +94 -60
- data/ext/carray_factorize.c +670 -324
- data/ext/carray_generate.c +260 -83
- data/ext/carray_histogram.c +209 -106
- data/ext/carray_hold.c +14 -16
- data/ext/carray_index_classifier.c +422 -243
- data/ext/carray_internal.h +692 -3
- data/ext/carray_kernels_bincmp.c +7 -0
- data/ext/carray_kernels_binop.c +487 -120
- data/ext/carray_kernels_init.c +653 -50
- data/ext/carray_kernels_moncmp.c +15 -8
- data/ext/carray_kernels_monop.c +99 -43
- data/ext/carray_kernels_reduce_aggregate.c +3925 -6112
- data/ext/carray_kernels_reduce_boolean.c +112 -36
- data/ext/carray_kernels_reduce_cumulative.c +2127 -6903
- data/ext/carray_kernels_reduce_extreme.c +3032 -2892
- data/ext/carray_kernels_reduce_variance.c +439 -500
- data/ext/carray_kernels_scan.c +1097 -488
- data/ext/carray_kernels_search.c +3787 -2176
- data/ext/carray_kernels_sort.c +1200 -920
- data/ext/carray_kernels_triop.c +479 -7
- data/ext/carray_key_windows.c +216 -0
- data/ext/carray_lazy.c +967 -153
- data/ext/carray_loop.c +81 -65
- data/ext/carray_mask.c +910 -324
- data/ext/carray_math_kernel.h +1 -0
- data/ext/carray_median_percentile.c +299 -100
- data/ext/carray_memory_view.c +872 -758
- data/ext/carray_operator.c +1171 -364
- data/ext/carray_order.c +505 -133
- data/ext/carray_partition.c +112 -65
- data/ext/carray_random.c +327 -239
- data/ext/carray_round.c +273 -0
- data/ext/carray_scatter.c +346 -78
- data/ext/carray_segment.c +257 -0
- data/ext/carray_slab.c +249 -86
- data/ext/carray_sort.c +224 -227
- data/ext/carray_sort_kernel.c +8 -1
- data/ext/carray_struct.c +118 -39
- data/ext/carray_test.c +193 -69
- data/ext/carray_time_text.c +1182 -0
- data/ext/carray_undef.c +4 -0
- data/ext/carray_utils.c +579 -113
- data/ext/extconf.rb +27 -2
- data/ext/mk_call_cfunc.rb +19 -4
- data/ext/mk_pow5_table.rb +35 -0
- data/ext/mkkernel.rb +1202 -1014
- data/ext/ruby_carray.c +17 -5
- data/ext/version.h +4 -4
- data/ext/version.rb +4 -2
- data/lib/carray/attribute.rb +160 -17
- data/lib/carray/autoload_carray.rb +23 -27
- data/lib/carray/autoload_method_extension.rb +20 -5
- data/lib/carray/axis_group.rb +360 -63
- data/lib/carray/basics.rb +162 -28
- data/lib/carray/bincount_nd.rb +18 -2
- data/lib/carray/block_iterator.rb +231 -58
- data/lib/carray/boolean_reduce.rb +34 -42
- data/lib/carray/categorical.rb +242 -52
- data/lib/carray/categorical_iterator.rb +437 -827
- data/lib/carray/complex.rb +41 -34
- data/lib/carray/conditional.rb +150 -14
- data/lib/carray/const_string.rb +59 -4
- 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/concat.rb +157 -6
- data/lib/carray/frame/convert.rb +82 -7
- data/lib/carray/frame/csv_parser.rb +688 -87
- data/lib/carray/frame/describe.rb +80 -0
- data/lib/carray/frame/frame.rb +369 -45
- data/lib/carray/frame/group.rb +631 -90
- data/lib/carray/frame/io.rb +506 -79
- data/lib/carray/frame/join.rb +411 -62
- data/lib/carray/frame/records.rb +116 -19
- data/lib/carray/frame/reshape.rb +455 -0
- data/lib/carray/frame/sort.rb +30 -18
- data/lib/carray/frame/verbs.rb +868 -61
- data/lib/carray/frame/windows.rb +117 -0
- data/lib/carray/frame.rb +4 -0
- data/lib/carray/fuse_source.rb +118 -2
- data/lib/carray/fusion.rb +257 -42
- data/lib/carray/histogram.rb +6 -1
- data/lib/carray/inspect.rb +54 -13
- data/lib/carray/iterator.rb +99 -9
- data/lib/carray/key_windows.rb +620 -0
- data/lib/carray/lazy.rb +216 -193
- data/lib/carray/mask_gap_fill.rb +112 -92
- data/lib/carray/math.rb +32 -19
- data/lib/carray/meld_reduce.rb +52 -21
- data/lib/carray/methods/align_addr.rb +8 -4
- data/lib/carray/methods/bin.rb +26 -18
- data/lib/carray/methods/bincount.rb +18 -2
- data/lib/carray/methods/bit_string.rb +15 -4
- data/lib/carray/methods/choose.rb +16 -3
- data/lib/carray/methods/composition.rb +18 -10
- data/lib/carray/methods/factorize.rb +2 -2
- data/lib/carray/methods/gather_nd.rb +25 -5
- data/lib/carray/methods/insert_block.rb +9 -14
- data/lib/carray/methods/is_between.rb +59 -0
- data/lib/carray/methods/is_in.rb +140 -10
- data/lib/carray/methods/join.rb +2 -7
- data/lib/carray/methods/lag.rb +49 -0
- data/lib/carray/methods/locate_addr.rb +182 -45
- data/lib/carray/methods/mode.rb +18 -1
- data/lib/carray/methods/nunique.rb +11 -6
- data/lib/carray/methods/repeat.rb +1 -20
- data/lib/carray/methods/resize.rb +21 -23
- data/lib/carray/methods/snap.rb +34 -12
- data/lib/carray/methods/unique.rb +11 -2
- data/lib/carray/methods/value_counts.rb +4 -11
- data/lib/carray/record_order.rb +208 -0
- data/lib/carray/rng.rb +3 -0
- data/lib/carray/runtime.rb +65 -17
- data/lib/carray/segment_iterator.rb +1221 -0
- data/lib/carray/serialize.rb +214 -30
- data/lib/carray/slab_iterator.rb +101 -27
- data/lib/carray/stack.rb +10 -4
- data/lib/carray/string.rb +105 -5
- data/lib/carray/string_operation_extension.rb +12 -4
- data/lib/carray/struct.rb +137 -58
- data/lib/carray/struct_builder.rb +124 -17
- data/lib/carray/time.rb +1222 -186
- data/lib/carray/window_iterator.rb +242 -81
- data/lib/carray.rb +9 -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_fake.rb +1 -1
- data/yard-stubs/ca_obj_field.rb +5 -1
- data/yard-stubs/ca_obj_grid.rb +21 -10
- data/yard-stubs/ca_obj_refer.rb +5 -4
- data/yard-stubs/ca_obj_roll.rb +2 -3
- data/yard-stubs/ca_obj_shift.rb +5 -1
- data/yard-stubs/ca_obj_stride.rb +10 -7
- data/yard-stubs/ca_obj_tile.rb +1 -1
- data/yard-stubs/ca_obj_transpose.rb +1 -1
- data/yard-stubs/ca_obj_window.rb +9 -5
- data/yard-stubs/carray_access.rb +11 -5
- data/yard-stubs/carray_attribute.rb +0 -5
- data/yard-stubs/carray_broadcast.rb +1 -1
- data/yard-stubs/carray_cast.rb +88 -43
- data/yard-stubs/carray_conversion.rb +15 -2
- data/yard-stubs/carray_copy.rb +12 -5
- data/yard-stubs/carray_core.rb +3 -3
- data/yard-stubs/carray_count.rb +9 -0
- data/yard-stubs/carray_element.rb +10 -4
- data/yard-stubs/carray_generate.rb +21 -1
- data/yard-stubs/carray_lazy.rb +5 -1
- data/yard-stubs/carray_loop.rb +4 -1
- data/yard-stubs/carray_mask.rb +60 -12
- data/yard-stubs/carray_math.rb +52 -14
- data/yard-stubs/carray_median_percentile.rb +15 -8
- data/yard-stubs/carray_memory_view.rb +40 -23
- data/yard-stubs/carray_order.rb +61 -29
- data/yard-stubs/carray_random.rb +13 -4
- data/yard-stubs/carray_scatter.rb +21 -9
- data/yard-stubs/carray_segment.rb +72 -0
- data/yard-stubs/carray_slab.rb +10 -2
- data/yard-stubs/carray_sort.rb +49 -8
- data/yard-stubs/carray_test.rb +15 -3
- data/yard-stubs/carray_utils.rb +0 -26
- metadata +19 -5
- data/ext/ca_for_each_element.h +0 -239
- data/ext/carray_kernels_map.c +0 -3467
- data/lib/carray/arrow_tensor.rb +0 -401
- data/lib/carray/table.rb +0 -108
data/ext/carray_kernels_moncmp.c
CHANGED
|
@@ -24,6 +24,13 @@
|
|
|
24
24
|
probed by operation-table function pointer (obj_type is runtime-
|
|
25
25
|
assigned, so no CA_OBJ_STACK compile-time constant exists). */
|
|
26
26
|
extern ca_operation_function_t ca_stack_func;
|
|
27
|
+
/* The square root of a variance: an ε-negative from rounding becomes 0,
|
|
28
|
+
a NaN stays NaN (fmax(NaN, 0.0) is 0.0). */
|
|
29
|
+
#ifndef CARRAY_SQRT_CLAMP_DEFINED
|
|
30
|
+
#define CARRAY_SQRT_CLAMP_DEFINED
|
|
31
|
+
static inline double ca_sqrt_clamp (double v) { return sqrt(v < 0.0 ? 0.0 : v); }
|
|
32
|
+
#endif
|
|
33
|
+
|
|
27
34
|
/* BOOL2VAL: bool -> Ruby (Qtrue/Qfalse). Used as ruby_scalar wrapper
|
|
28
35
|
for the all/any flat-reduction Ruby surface so `a.all` / `a.any`
|
|
29
36
|
return real true/false, not Integer 0/1. (BOOL2OBJ already exists
|
|
@@ -416,14 +423,14 @@ ca_moncmp_is_nan_VALUE (ca_size_t n, boolean8_t *m,
|
|
|
416
423
|
if ( ! *pm ) {
|
|
417
424
|
p1 = q1 + k*i1;
|
|
418
425
|
p2 = q2 + k*i2;
|
|
419
|
-
{ (*p2) = rb_funcall((*p1), rb_intern("nan?"), 0); }
|
|
426
|
+
{ (*p2) = RB_FLOAT_TYPE_P(*p1) ? isnan(RFLOAT_VALUE(*p1)) : (RB_INTEGER_TYPE_P(*p1) || RB_TYPE_P((*p1), T_RATIONAL)) ? 0 : RTEST(rb_funcall((*p1), rb_intern("nan?"), 0)); }
|
|
420
427
|
}
|
|
421
428
|
}
|
|
422
429
|
} else {
|
|
423
430
|
for (k=0; k<n; k++) {
|
|
424
431
|
p1 = q1 + k*i1;
|
|
425
432
|
p2 = q2 + k*i2;
|
|
426
|
-
{ (*p2) = rb_funcall((*p1), rb_intern("nan?"), 0); }
|
|
433
|
+
{ (*p2) = RB_FLOAT_TYPE_P(*p1) ? isnan(RFLOAT_VALUE(*p1)) : (RB_INTEGER_TYPE_P(*p1) || RB_TYPE_P((*p1), T_RATIONAL)) ? 0 : RTEST(rb_funcall((*p1), rb_intern("nan?"), 0)); }
|
|
427
434
|
}
|
|
428
435
|
}
|
|
429
436
|
}
|
|
@@ -832,14 +839,14 @@ ca_moncmp_is_inf_VALUE (ca_size_t n, boolean8_t *m,
|
|
|
832
839
|
if ( ! *pm ) {
|
|
833
840
|
p1 = q1 + k*i1;
|
|
834
841
|
p2 = q2 + k*i2;
|
|
835
|
-
{ (*p2) = rb_funcall((*p1), rb_intern("infinite?"), 0); }
|
|
842
|
+
{ (*p2) = RTEST(rb_funcall((*p1), rb_intern("infinite?"), 0)); }
|
|
836
843
|
}
|
|
837
844
|
}
|
|
838
845
|
} else {
|
|
839
846
|
for (k=0; k<n; k++) {
|
|
840
847
|
p1 = q1 + k*i1;
|
|
841
848
|
p2 = q2 + k*i2;
|
|
842
|
-
{ (*p2) = rb_funcall((*p1), rb_intern("infinite?"), 0); }
|
|
849
|
+
{ (*p2) = RTEST(rb_funcall((*p1), rb_intern("infinite?"), 0)); }
|
|
843
850
|
}
|
|
844
851
|
}
|
|
845
852
|
}
|
|
@@ -1248,14 +1255,14 @@ ca_moncmp_is_finite_VALUE (ca_size_t n, boolean8_t *m,
|
|
|
1248
1255
|
if ( ! *pm ) {
|
|
1249
1256
|
p1 = q1 + k*i1;
|
|
1250
1257
|
p2 = q2 + k*i2;
|
|
1251
|
-
{ (*p2) = rb_funcall((*p1), rb_intern("finite?"), 0); }
|
|
1258
|
+
{ (*p2) = RTEST(rb_funcall((*p1), rb_intern("finite?"), 0)); }
|
|
1252
1259
|
}
|
|
1253
1260
|
}
|
|
1254
1261
|
} else {
|
|
1255
1262
|
for (k=0; k<n; k++) {
|
|
1256
1263
|
p1 = q1 + k*i1;
|
|
1257
1264
|
p2 = q2 + k*i2;
|
|
1258
|
-
{ (*p2) = rb_funcall((*p1), rb_intern("finite?"), 0); }
|
|
1265
|
+
{ (*p2) = RTEST(rb_funcall((*p1), rb_intern("finite?"), 0)); }
|
|
1259
1266
|
}
|
|
1260
1267
|
}
|
|
1261
1268
|
}
|
|
@@ -2050,14 +2057,14 @@ ca_moncmp_signbit_VALUE (ca_size_t n, boolean8_t *m,
|
|
|
2050
2057
|
if ( ! *pm ) {
|
|
2051
2058
|
p1 = q1 + k*i1;
|
|
2052
2059
|
p2 = q2 + k*i2;
|
|
2053
|
-
{ (*p2) = (RTEST(rb_funcall((*p1), rb_intern("negative?"), 0)) ? 1 : 0); }
|
|
2060
|
+
{ (*p2) = RB_FLOAT_TYPE_P(*p1) ? (signbit(RFLOAT_VALUE(*p1)) != 0) : (RTEST(rb_funcall((*p1), rb_intern("negative?"), 0)) ? 1 : 0); }
|
|
2054
2061
|
}
|
|
2055
2062
|
}
|
|
2056
2063
|
} else {
|
|
2057
2064
|
for (k=0; k<n; k++) {
|
|
2058
2065
|
p1 = q1 + k*i1;
|
|
2059
2066
|
p2 = q2 + k*i2;
|
|
2060
|
-
{ (*p2) = (RTEST(rb_funcall((*p1), rb_intern("negative?"), 0)) ? 1 : 0); }
|
|
2067
|
+
{ (*p2) = RB_FLOAT_TYPE_P(*p1) ? (signbit(RFLOAT_VALUE(*p1)) != 0) : (RTEST(rb_funcall((*p1), rb_intern("negative?"), 0)) ? 1 : 0); }
|
|
2061
2068
|
}
|
|
2062
2069
|
}
|
|
2063
2070
|
}
|
data/ext/carray_kernels_monop.c
CHANGED
|
@@ -24,6 +24,13 @@
|
|
|
24
24
|
probed by operation-table function pointer (obj_type is runtime-
|
|
25
25
|
assigned, so no CA_OBJ_STACK compile-time constant exists). */
|
|
26
26
|
extern ca_operation_function_t ca_stack_func;
|
|
27
|
+
/* The square root of a variance: an ε-negative from rounding becomes 0,
|
|
28
|
+
a NaN stays NaN (fmax(NaN, 0.0) is 0.0). */
|
|
29
|
+
#ifndef CARRAY_SQRT_CLAMP_DEFINED
|
|
30
|
+
#define CARRAY_SQRT_CLAMP_DEFINED
|
|
31
|
+
static inline double ca_sqrt_clamp (double v) { return sqrt(v < 0.0 ? 0.0 : v); }
|
|
32
|
+
#endif
|
|
33
|
+
|
|
27
34
|
/* BOOL2VAL: bool -> Ruby (Qtrue/Qfalse). Used as ruby_scalar wrapper
|
|
28
35
|
for the all/any flat-reduction Ruby surface so `a.all` / `a.any`
|
|
29
36
|
return real true/false, not Integer 0/1. (BOOL2OBJ already exists
|
|
@@ -3857,6 +3864,51 @@ ca_monop_abs_cmplx128_t (ca_size_t n, boolean8_t *m,
|
|
|
3857
3864
|
}
|
|
3858
3865
|
}
|
|
3859
3866
|
|
|
3867
|
+
static void
|
|
3868
|
+
ca_monop_abs_VALUE (ca_size_t n, boolean8_t *m,
|
|
3869
|
+
char * __restrict__ ptr1, ca_size_t i1,
|
|
3870
|
+
char * __restrict__ ptr2, ca_size_t i2)
|
|
3871
|
+
{
|
|
3872
|
+
VALUE * __restrict__ q1 = (VALUE *) ptr1;
|
|
3873
|
+
VALUE * __restrict__ q2 = (VALUE *) ptr2;
|
|
3874
|
+
ca_size_t k;
|
|
3875
|
+
if ( m ) {
|
|
3876
|
+
VALUE *p1 = q1;
|
|
3877
|
+
VALUE *p2 = q2;
|
|
3878
|
+
boolean8_t *pm;
|
|
3879
|
+
for (k=0; k<n; k++) {
|
|
3880
|
+
pm = m + k;
|
|
3881
|
+
if ( ! *pm ) {
|
|
3882
|
+
p1 = q1 + k*i1;
|
|
3883
|
+
p2 = q2 + k*i2;
|
|
3884
|
+
{ (*p2) = rb_funcall((*p1), rb_intern("abs"), 0); }
|
|
3885
|
+
}
|
|
3886
|
+
}
|
|
3887
|
+
} else if ( i1 == 1 && i2 == 1 ) {
|
|
3888
|
+
/* contig branch: SIMD-friendly form. Index-form `q[k]` exposes
|
|
3889
|
+
the unit-stride access to the vectorizer; `__restrict__` on
|
|
3890
|
+
q1/q2 promises no aliasing so the omp simd pragma can license
|
|
3891
|
+
lane-parallel loads/stores. Element-wise monop has no
|
|
3892
|
+
reassoc, so ε-close numeric contract is unaffected. */
|
|
3893
|
+
VALUE *p1;
|
|
3894
|
+
VALUE *p2;
|
|
3895
|
+
(void)p1; (void)p2;
|
|
3896
|
+
#pragma omp simd
|
|
3897
|
+
for (k=0; k<n; k++) {
|
|
3898
|
+
p1 = q1 + k; p2 = q2 + k;
|
|
3899
|
+
{ (*p2) = rb_funcall((*p1), rb_intern("abs"), 0); }
|
|
3900
|
+
}
|
|
3901
|
+
} else {
|
|
3902
|
+
/* strided branch: numo-shape `p += s` increment form. */
|
|
3903
|
+
VALUE *p1 = q1;
|
|
3904
|
+
VALUE *p2 = q2;
|
|
3905
|
+
for (k=0; k<n; k++) {
|
|
3906
|
+
{ (*p2) = rb_funcall((*p1), rb_intern("abs"), 0); }
|
|
3907
|
+
p1 += i1; p2 += i2;
|
|
3908
|
+
}
|
|
3909
|
+
}
|
|
3910
|
+
}
|
|
3911
|
+
|
|
3860
3912
|
ca_monop_func_t
|
|
3861
3913
|
ca_monop_abs[CA_NTYPE] = {
|
|
3862
3914
|
ca_monop_not_implement,
|
|
@@ -3875,7 +3927,7 @@ ca_monop_abs[CA_NTYPE] = {
|
|
|
3875
3927
|
ca_monop_abs_cmplx64_t,
|
|
3876
3928
|
ca_monop_abs_cmplx128_t,
|
|
3877
3929
|
ca_monop_not_implement,
|
|
3878
|
-
|
|
3930
|
+
ca_monop_abs_VALUE,
|
|
3879
3931
|
};
|
|
3880
3932
|
|
|
3881
3933
|
int8_t ca_monop_abs_out_data_type[CA_NTYPE] = {
|
|
@@ -3895,7 +3947,7 @@ int8_t ca_monop_abs_out_data_type[CA_NTYPE] = {
|
|
|
3895
3947
|
CA_FLOAT32,
|
|
3896
3948
|
CA_FLOAT64,
|
|
3897
3949
|
-1,
|
|
3898
|
-
|
|
3950
|
+
CA_OBJECT,
|
|
3899
3951
|
};
|
|
3900
3952
|
|
|
3901
3953
|
VALUE rb_ca_abs (VALUE self)
|
|
@@ -3911,11 +3963,15 @@ VALUE rb_ca_abs_bang (VALUE self)
|
|
|
3911
3963
|
int8_t in_dt;
|
|
3912
3964
|
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
3913
3965
|
in_dt = ca->data_type;
|
|
3966
|
+
if ( ca_monop_abs_out_data_type[in_dt] <= CA_NONE ) {
|
|
3967
|
+
rb_raise(rb_eCADataTypeError,
|
|
3968
|
+
"abs!: source data_type :%s not supported", ca_type_name[in_dt]);
|
|
3969
|
+
}
|
|
3914
3970
|
if ( ca_monop_abs_out_data_type[in_dt] != in_dt ) {
|
|
3915
|
-
rb_raise(
|
|
3916
|
-
"abs!:
|
|
3917
|
-
"
|
|
3918
|
-
|
|
3971
|
+
rb_raise(rb_eCADataTypeError,
|
|
3972
|
+
"abs!: abs of :%s is :%s, which cannot be written back in place; "
|
|
3973
|
+
"use abs", ca_type_name[in_dt],
|
|
3974
|
+
ca_type_name[ca_monop_abs_out_data_type[in_dt]]);
|
|
3919
3975
|
}
|
|
3920
3976
|
return rb_ca_call_monop_bang(self, ca_monop_abs);
|
|
3921
3977
|
}
|
|
@@ -4519,11 +4575,15 @@ VALUE rb_ca_abs2_bang (VALUE self)
|
|
|
4519
4575
|
int8_t in_dt;
|
|
4520
4576
|
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
4521
4577
|
in_dt = ca->data_type;
|
|
4578
|
+
if ( ca_monop_abs2_out_data_type[in_dt] <= CA_NONE ) {
|
|
4579
|
+
rb_raise(rb_eCADataTypeError,
|
|
4580
|
+
"abs2!: source data_type :%s not supported", ca_type_name[in_dt]);
|
|
4581
|
+
}
|
|
4522
4582
|
if ( ca_monop_abs2_out_data_type[in_dt] != in_dt ) {
|
|
4523
|
-
rb_raise(
|
|
4524
|
-
"abs2!:
|
|
4525
|
-
"
|
|
4526
|
-
|
|
4583
|
+
rb_raise(rb_eCADataTypeError,
|
|
4584
|
+
"abs2!: abs2 of :%s is :%s, which cannot be written back in place; "
|
|
4585
|
+
"use abs2", ca_type_name[in_dt],
|
|
4586
|
+
ca_type_name[ca_monop_abs2_out_data_type[in_dt]]);
|
|
4527
4587
|
}
|
|
4528
4588
|
return rb_ca_call_monop_bang(self, ca_monop_abs2);
|
|
4529
4589
|
}
|
|
@@ -6361,11 +6421,15 @@ VALUE rb_ca_arg_bang (VALUE self)
|
|
|
6361
6421
|
int8_t in_dt;
|
|
6362
6422
|
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
6363
6423
|
in_dt = ca->data_type;
|
|
6424
|
+
if ( ca_monop_arg_out_data_type[in_dt] <= CA_NONE ) {
|
|
6425
|
+
rb_raise(rb_eCADataTypeError,
|
|
6426
|
+
"arg!: source data_type :%s not supported", ca_type_name[in_dt]);
|
|
6427
|
+
}
|
|
6364
6428
|
if ( ca_monop_arg_out_data_type[in_dt] != in_dt ) {
|
|
6365
|
-
rb_raise(
|
|
6366
|
-
"arg!:
|
|
6367
|
-
"
|
|
6368
|
-
|
|
6429
|
+
rb_raise(rb_eCADataTypeError,
|
|
6430
|
+
"arg!: arg of :%s is :%s, which cannot be written back in place; "
|
|
6431
|
+
"use arg", ca_type_name[in_dt],
|
|
6432
|
+
ca_type_name[ca_monop_arg_out_data_type[in_dt]]);
|
|
6369
6433
|
}
|
|
6370
6434
|
return rb_ca_call_monop_bang(self, ca_monop_arg);
|
|
6371
6435
|
}
|
|
@@ -6929,7 +6993,7 @@ ca_monop_arg_i_float32_t (ca_size_t n, boolean8_t *m,
|
|
|
6929
6993
|
if ( ! *pm ) {
|
|
6930
6994
|
p1 = q1 + k*i1;
|
|
6931
6995
|
p2 = q2 + k*i2;
|
|
6932
|
-
{ (*p2) =
|
|
6996
|
+
{ (*p2) = carg((cmplx128_t)(*p1)); }
|
|
6933
6997
|
}
|
|
6934
6998
|
}
|
|
6935
6999
|
} else if ( i1 == 1 && i2 == 1 ) {
|
|
@@ -6944,14 +7008,14 @@ ca_monop_arg_i_float32_t (ca_size_t n, boolean8_t *m,
|
|
|
6944
7008
|
#pragma omp simd
|
|
6945
7009
|
for (k=0; k<n; k++) {
|
|
6946
7010
|
p1 = q1 + k; p2 = q2 + k;
|
|
6947
|
-
{ (*p2) =
|
|
7011
|
+
{ (*p2) = carg((cmplx128_t)(*p1)); }
|
|
6948
7012
|
}
|
|
6949
7013
|
} else {
|
|
6950
7014
|
/* strided branch: numo-shape `p += s` increment form. */
|
|
6951
7015
|
float *p1 = q1;
|
|
6952
7016
|
float *p2 = q2;
|
|
6953
7017
|
for (k=0; k<n; k++) {
|
|
6954
|
-
{ (*p2) =
|
|
7018
|
+
{ (*p2) = carg((cmplx128_t)(*p1)); }
|
|
6955
7019
|
p1 += i1; p2 += i2;
|
|
6956
7020
|
}
|
|
6957
7021
|
}
|
|
@@ -9079,7 +9143,7 @@ ca_monop_round_float32_t (ca_size_t n, boolean8_t *m,
|
|
|
9079
9143
|
if ( ! *pm ) {
|
|
9080
9144
|
p1 = q1 + k*i1;
|
|
9081
9145
|
p2 = q2 + k*i2;
|
|
9082
|
-
{ (*p2) = (
|
|
9146
|
+
{ (*p2) = round(*p1); }
|
|
9083
9147
|
}
|
|
9084
9148
|
}
|
|
9085
9149
|
} else if ( i1 == 1 && i2 == 1 ) {
|
|
@@ -9094,14 +9158,14 @@ ca_monop_round_float32_t (ca_size_t n, boolean8_t *m,
|
|
|
9094
9158
|
#pragma omp simd
|
|
9095
9159
|
for (k=0; k<n; k++) {
|
|
9096
9160
|
p1 = q1 + k; p2 = q2 + k;
|
|
9097
|
-
{ (*p2) = (
|
|
9161
|
+
{ (*p2) = round(*p1); }
|
|
9098
9162
|
}
|
|
9099
9163
|
} else {
|
|
9100
9164
|
/* strided branch: numo-shape `p += s` increment form. */
|
|
9101
9165
|
float *p1 = q1;
|
|
9102
9166
|
float *p2 = q2;
|
|
9103
9167
|
for (k=0; k<n; k++) {
|
|
9104
|
-
{ (*p2) = (
|
|
9168
|
+
{ (*p2) = round(*p1); }
|
|
9105
9169
|
p1 += i1; p2 += i2;
|
|
9106
9170
|
}
|
|
9107
9171
|
}
|
|
@@ -9124,7 +9188,7 @@ ca_monop_round_float64_t (ca_size_t n, boolean8_t *m,
|
|
|
9124
9188
|
if ( ! *pm ) {
|
|
9125
9189
|
p1 = q1 + k*i1;
|
|
9126
9190
|
p2 = q2 + k*i2;
|
|
9127
|
-
{ (*p2) = (
|
|
9191
|
+
{ (*p2) = round(*p1); }
|
|
9128
9192
|
}
|
|
9129
9193
|
}
|
|
9130
9194
|
} else if ( i1 == 1 && i2 == 1 ) {
|
|
@@ -9139,14 +9203,14 @@ ca_monop_round_float64_t (ca_size_t n, boolean8_t *m,
|
|
|
9139
9203
|
#pragma omp simd
|
|
9140
9204
|
for (k=0; k<n; k++) {
|
|
9141
9205
|
p1 = q1 + k; p2 = q2 + k;
|
|
9142
|
-
{ (*p2) = (
|
|
9206
|
+
{ (*p2) = round(*p1); }
|
|
9143
9207
|
}
|
|
9144
9208
|
} else {
|
|
9145
9209
|
/* strided branch: numo-shape `p += s` increment form. */
|
|
9146
9210
|
double *p1 = q1;
|
|
9147
9211
|
double *p2 = q2;
|
|
9148
9212
|
for (k=0; k<n; k++) {
|
|
9149
|
-
{ (*p2) = (
|
|
9213
|
+
{ (*p2) = round(*p1); }
|
|
9150
9214
|
p1 += i1; p2 += i2;
|
|
9151
9215
|
}
|
|
9152
9216
|
}
|
|
@@ -9246,7 +9310,7 @@ ca_monop_rcp_int8_t (ca_size_t n, boolean8_t *m,
|
|
|
9246
9310
|
if ( ! *pm ) {
|
|
9247
9311
|
p1 = q1 + k*i1;
|
|
9248
9312
|
p2 = q2 + k*i2;
|
|
9249
|
-
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1
|
|
9313
|
+
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
|
|
9250
9314
|
}
|
|
9251
9315
|
}
|
|
9252
9316
|
} else if ( i1 == 1 && i2 == 1 ) {
|
|
@@ -9261,14 +9325,14 @@ ca_monop_rcp_int8_t (ca_size_t n, boolean8_t *m,
|
|
|
9261
9325
|
#pragma omp simd
|
|
9262
9326
|
for (k=0; k<n; k++) {
|
|
9263
9327
|
p1 = q1 + k; p2 = q2 + k;
|
|
9264
|
-
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1
|
|
9328
|
+
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
|
|
9265
9329
|
}
|
|
9266
9330
|
} else {
|
|
9267
9331
|
/* strided branch: numo-shape `p += s` increment form. */
|
|
9268
9332
|
int8_t *p1 = q1;
|
|
9269
9333
|
int8_t *p2 = q2;
|
|
9270
9334
|
for (k=0; k<n; k++) {
|
|
9271
|
-
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1
|
|
9335
|
+
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
|
|
9272
9336
|
p1 += i1; p2 += i2;
|
|
9273
9337
|
}
|
|
9274
9338
|
}
|
|
@@ -9336,7 +9400,7 @@ ca_monop_rcp_int16_t (ca_size_t n, boolean8_t *m,
|
|
|
9336
9400
|
if ( ! *pm ) {
|
|
9337
9401
|
p1 = q1 + k*i1;
|
|
9338
9402
|
p2 = q2 + k*i2;
|
|
9339
|
-
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1
|
|
9403
|
+
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
|
|
9340
9404
|
}
|
|
9341
9405
|
}
|
|
9342
9406
|
} else if ( i1 == 1 && i2 == 1 ) {
|
|
@@ -9351,14 +9415,14 @@ ca_monop_rcp_int16_t (ca_size_t n, boolean8_t *m,
|
|
|
9351
9415
|
#pragma omp simd
|
|
9352
9416
|
for (k=0; k<n; k++) {
|
|
9353
9417
|
p1 = q1 + k; p2 = q2 + k;
|
|
9354
|
-
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1
|
|
9418
|
+
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
|
|
9355
9419
|
}
|
|
9356
9420
|
} else {
|
|
9357
9421
|
/* strided branch: numo-shape `p += s` increment form. */
|
|
9358
9422
|
int16_t *p1 = q1;
|
|
9359
9423
|
int16_t *p2 = q2;
|
|
9360
9424
|
for (k=0; k<n; k++) {
|
|
9361
|
-
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1
|
|
9425
|
+
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
|
|
9362
9426
|
p1 += i1; p2 += i2;
|
|
9363
9427
|
}
|
|
9364
9428
|
}
|
|
@@ -9426,7 +9490,7 @@ ca_monop_rcp_int32_t (ca_size_t n, boolean8_t *m,
|
|
|
9426
9490
|
if ( ! *pm ) {
|
|
9427
9491
|
p1 = q1 + k*i1;
|
|
9428
9492
|
p2 = q2 + k*i2;
|
|
9429
|
-
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1
|
|
9493
|
+
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
|
|
9430
9494
|
}
|
|
9431
9495
|
}
|
|
9432
9496
|
} else if ( i1 == 1 && i2 == 1 ) {
|
|
@@ -9441,14 +9505,14 @@ ca_monop_rcp_int32_t (ca_size_t n, boolean8_t *m,
|
|
|
9441
9505
|
#pragma omp simd
|
|
9442
9506
|
for (k=0; k<n; k++) {
|
|
9443
9507
|
p1 = q1 + k; p2 = q2 + k;
|
|
9444
|
-
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1
|
|
9508
|
+
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
|
|
9445
9509
|
}
|
|
9446
9510
|
} else {
|
|
9447
9511
|
/* strided branch: numo-shape `p += s` increment form. */
|
|
9448
9512
|
int32_t *p1 = q1;
|
|
9449
9513
|
int32_t *p2 = q2;
|
|
9450
9514
|
for (k=0; k<n; k++) {
|
|
9451
|
-
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1
|
|
9515
|
+
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
|
|
9452
9516
|
p1 += i1; p2 += i2;
|
|
9453
9517
|
}
|
|
9454
9518
|
}
|
|
@@ -9516,7 +9580,7 @@ ca_monop_rcp_int64_t (ca_size_t n, boolean8_t *m,
|
|
|
9516
9580
|
if ( ! *pm ) {
|
|
9517
9581
|
p1 = q1 + k*i1;
|
|
9518
9582
|
p2 = q2 + k*i2;
|
|
9519
|
-
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1
|
|
9583
|
+
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
|
|
9520
9584
|
}
|
|
9521
9585
|
}
|
|
9522
9586
|
} else if ( i1 == 1 && i2 == 1 ) {
|
|
@@ -9531,14 +9595,14 @@ ca_monop_rcp_int64_t (ca_size_t n, boolean8_t *m,
|
|
|
9531
9595
|
#pragma omp simd
|
|
9532
9596
|
for (k=0; k<n; k++) {
|
|
9533
9597
|
p1 = q1 + k; p2 = q2 + k;
|
|
9534
|
-
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1
|
|
9598
|
+
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
|
|
9535
9599
|
}
|
|
9536
9600
|
} else {
|
|
9537
9601
|
/* strided branch: numo-shape `p += s` increment form. */
|
|
9538
9602
|
int64_t *p1 = q1;
|
|
9539
9603
|
int64_t *p2 = q2;
|
|
9540
9604
|
for (k=0; k<n; k++) {
|
|
9541
|
-
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = 1
|
|
9605
|
+
{ if ((*p1)==0) {ca_zerodiv();}; (*p2) = ((*p1)==1) ? 1 : ((*p1) < 0) ? -1 : 0; }
|
|
9542
9606
|
p1 += i1; p2 += i2;
|
|
9543
9607
|
}
|
|
9544
9608
|
}
|
|
@@ -15487,9 +15551,6 @@ VALUE rb_ca_expm1 (VALUE self)
|
|
|
15487
15551
|
VALUE rb_ca_expm1_bang (VALUE self)
|
|
15488
15552
|
{ return rb_ca_call_monop_bang(self, ca_monop_expm1); }
|
|
15489
15553
|
|
|
15490
|
-
VALUE rb_cmath_expm1 (VALUE mod, VALUE arg)
|
|
15491
|
-
{ return ca_math_call(mod, arg, rb_intern("expm1")); }
|
|
15492
|
-
|
|
15493
15554
|
/* ===== monop log1p ============================================ */
|
|
15494
15555
|
|
|
15495
15556
|
static void
|
|
@@ -15683,9 +15744,6 @@ VALUE rb_ca_log1p (VALUE self)
|
|
|
15683
15744
|
VALUE rb_ca_log1p_bang (VALUE self)
|
|
15684
15745
|
{ return rb_ca_call_monop_bang(self, ca_monop_log1p); }
|
|
15685
15746
|
|
|
15686
|
-
VALUE rb_cmath_log1p (VALUE mod, VALUE arg)
|
|
15687
|
-
{ return ca_math_call(mod, arg, rb_intern("log1p")); }
|
|
15688
|
-
|
|
15689
15747
|
/* ===== monop rsqrt ============================================ */
|
|
15690
15748
|
|
|
15691
15749
|
static void
|
|
@@ -18285,10 +18343,8 @@ Init_carray_kernels_monop (void)
|
|
|
18285
18343
|
rb_define_module_function(rb_mCAMath, "atanh", rb_cmath_atanh, 1);
|
|
18286
18344
|
rb_define_method(rb_cCArray, "expm1", rb_ca_expm1, 0);
|
|
18287
18345
|
rb_define_method(rb_cCArray, "expm1!", rb_ca_expm1_bang, 0);
|
|
18288
|
-
rb_define_module_function(rb_mCAMath, "expm1", rb_cmath_expm1, 1);
|
|
18289
18346
|
rb_define_method(rb_cCArray, "log1p", rb_ca_log1p, 0);
|
|
18290
18347
|
rb_define_method(rb_cCArray, "log1p!", rb_ca_log1p_bang, 0);
|
|
18291
|
-
rb_define_module_function(rb_mCAMath, "log1p", rb_cmath_log1p, 1);
|
|
18292
18348
|
rb_define_method(rb_cCArray, "rsqrt", rb_ca_rsqrt, 0);
|
|
18293
18349
|
rb_define_method(rb_cCArray, "rsqrt!", rb_ca_rsqrt_bang, 0);
|
|
18294
18350
|
rb_define_module_function(rb_mCAMath, "rsqrt", rb_cmath_rsqrt, 1);
|