carray 2.0.1 → 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 +772 -297
- 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 +229 -791
- 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 +207 -240
- 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 -329
- 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 +1341 -198
- 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 +5 -15
- 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/mailmap +0 -1
- 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/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
|
@@ -0,0 +1,3466 @@
|
|
|
1
|
+
/* ---------------------------------------------------------------------------
|
|
2
|
+
|
|
3
|
+
carray_kernels.c -- GENERATED by ext/mkkernel.rb -- DO NOT EDIT
|
|
4
|
+
|
|
5
|
+
Kernel definitions live in mkkernel.rb (search for `MkKernel.reduce`).
|
|
6
|
+
Regenerate by running:
|
|
7
|
+
|
|
8
|
+
cd ext && ruby mkkernel.rb > carray_kernels.c
|
|
9
|
+
|
|
10
|
+
extconf.rb regenerates automatically when mkkernel.rb is touched.
|
|
11
|
+
|
|
12
|
+
--------------------------------------------------------------------------- */
|
|
13
|
+
|
|
14
|
+
#include "carray.h"
|
|
15
|
+
#include "ca_kernel_iterator.h"
|
|
16
|
+
#include "ca_sort_kernels.h" /* sort kernels: internal, not via the carray.h umbrella */
|
|
17
|
+
#include "carray_internal.h" /* ca_lazy_arena_*, ca_is_lazy_view (streaming reduce) */
|
|
18
|
+
#include "ca_obj_face.h" /* rb_ca_strip_face_value (Face ordering gate) */
|
|
19
|
+
#include <math.h>
|
|
20
|
+
#include <stdint.h>
|
|
21
|
+
#include <stdlib.h> /* qsort, mergesort (HAVE_MERGESORT) -- for :sort kind */
|
|
22
|
+
|
|
23
|
+
/* MEMO_REDUCTION_FASTPATH_ENTITY_ONLY_GUARD Tier 2: CAStack identity is
|
|
24
|
+
probed by operation-table function pointer (obj_type is runtime-
|
|
25
|
+
assigned, so no CA_OBJ_STACK compile-time constant exists). */
|
|
26
|
+
extern ca_operation_function_t ca_stack_func;
|
|
27
|
+
/* BOOL2VAL: bool -> Ruby (Qtrue/Qfalse). Used as ruby_scalar wrapper
|
|
28
|
+
for the all/any flat-reduction Ruby surface so `a.all` / `a.any`
|
|
29
|
+
return real true/false, not Integer 0/1. (BOOL2OBJ already exists
|
|
30
|
+
but returns Integer per CArray's boolean-as-int convention.) */
|
|
31
|
+
#ifndef CARRAY_BOOL2VAL_DEFINED
|
|
32
|
+
#define CARRAY_BOOL2VAL_DEFINED
|
|
33
|
+
static inline VALUE BOOL2VAL (boolean8_t x) { return x ? Qtrue : Qfalse; }
|
|
34
|
+
#endif
|
|
35
|
+
|
|
36
|
+
#include "ca_op_powi.h"
|
|
37
|
+
|
|
38
|
+
/* ===== sqrt_ki ============================================ */
|
|
39
|
+
|
|
40
|
+
static VALUE
|
|
41
|
+
sqrt_ki_native_i8 (VALUE self, CArray *ca)
|
|
42
|
+
{
|
|
43
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
44
|
+
INT2NUM(sizeof(double)));
|
|
45
|
+
CArray *co;
|
|
46
|
+
GetCArray(vout, co);
|
|
47
|
+
|
|
48
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
49
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
50
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
51
|
+
K-D-walkable form. */
|
|
52
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
53
|
+
int8_t naxes = ca->ndim;
|
|
54
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
55
|
+
|
|
56
|
+
ca_iter_state st_in, st_out;
|
|
57
|
+
int rc;
|
|
58
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
59
|
+
slab_axes, naxes, 0);
|
|
60
|
+
if ( rc != CA_ITER_OK ) {
|
|
61
|
+
rb_raise(rb_eRuntimeError,
|
|
62
|
+
"sqrt_ki: input init failed rc=%d", rc);
|
|
63
|
+
}
|
|
64
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
65
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
66
|
+
if ( rc != CA_ITER_OK ) {
|
|
67
|
+
ca_iter_state_finish(&st_in);
|
|
68
|
+
rb_raise(rb_eRuntimeError,
|
|
69
|
+
"sqrt_ki: output init failed rc=%d", rc);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
char *pi, *po;
|
|
73
|
+
boolean8_t *mi, *mo;
|
|
74
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
75
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
76
|
+
CA_SLAB_MAP_T(int8_t, double, st_in, pi, st_out, po, r = sqrt((double) v));
|
|
77
|
+
ca_iter_state_sync_slab(&st_out);
|
|
78
|
+
}
|
|
79
|
+
ca_iter_state_finish(&st_in);
|
|
80
|
+
ca_iter_state_finish(&st_out);
|
|
81
|
+
return vout;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
static VALUE
|
|
85
|
+
sqrt_ki_native_u8 (VALUE self, CArray *ca)
|
|
86
|
+
{
|
|
87
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
88
|
+
INT2NUM(sizeof(double)));
|
|
89
|
+
CArray *co;
|
|
90
|
+
GetCArray(vout, co);
|
|
91
|
+
|
|
92
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
93
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
94
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
95
|
+
K-D-walkable form. */
|
|
96
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
97
|
+
int8_t naxes = ca->ndim;
|
|
98
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
99
|
+
|
|
100
|
+
ca_iter_state st_in, st_out;
|
|
101
|
+
int rc;
|
|
102
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
103
|
+
slab_axes, naxes, 0);
|
|
104
|
+
if ( rc != CA_ITER_OK ) {
|
|
105
|
+
rb_raise(rb_eRuntimeError,
|
|
106
|
+
"sqrt_ki: input init failed rc=%d", rc);
|
|
107
|
+
}
|
|
108
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
109
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
110
|
+
if ( rc != CA_ITER_OK ) {
|
|
111
|
+
ca_iter_state_finish(&st_in);
|
|
112
|
+
rb_raise(rb_eRuntimeError,
|
|
113
|
+
"sqrt_ki: output init failed rc=%d", rc);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
char *pi, *po;
|
|
117
|
+
boolean8_t *mi, *mo;
|
|
118
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
119
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
120
|
+
CA_SLAB_MAP_T(uint8_t, double, st_in, pi, st_out, po, r = sqrt((double) v));
|
|
121
|
+
ca_iter_state_sync_slab(&st_out);
|
|
122
|
+
}
|
|
123
|
+
ca_iter_state_finish(&st_in);
|
|
124
|
+
ca_iter_state_finish(&st_out);
|
|
125
|
+
return vout;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
static VALUE
|
|
129
|
+
sqrt_ki_native_i16 (VALUE self, CArray *ca)
|
|
130
|
+
{
|
|
131
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
132
|
+
INT2NUM(sizeof(double)));
|
|
133
|
+
CArray *co;
|
|
134
|
+
GetCArray(vout, co);
|
|
135
|
+
|
|
136
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
137
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
138
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
139
|
+
K-D-walkable form. */
|
|
140
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
141
|
+
int8_t naxes = ca->ndim;
|
|
142
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
143
|
+
|
|
144
|
+
ca_iter_state st_in, st_out;
|
|
145
|
+
int rc;
|
|
146
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
147
|
+
slab_axes, naxes, 0);
|
|
148
|
+
if ( rc != CA_ITER_OK ) {
|
|
149
|
+
rb_raise(rb_eRuntimeError,
|
|
150
|
+
"sqrt_ki: input init failed rc=%d", rc);
|
|
151
|
+
}
|
|
152
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
153
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
154
|
+
if ( rc != CA_ITER_OK ) {
|
|
155
|
+
ca_iter_state_finish(&st_in);
|
|
156
|
+
rb_raise(rb_eRuntimeError,
|
|
157
|
+
"sqrt_ki: output init failed rc=%d", rc);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
char *pi, *po;
|
|
161
|
+
boolean8_t *mi, *mo;
|
|
162
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
163
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
164
|
+
CA_SLAB_MAP_T(int16_t, double, st_in, pi, st_out, po, r = sqrt((double) v));
|
|
165
|
+
ca_iter_state_sync_slab(&st_out);
|
|
166
|
+
}
|
|
167
|
+
ca_iter_state_finish(&st_in);
|
|
168
|
+
ca_iter_state_finish(&st_out);
|
|
169
|
+
return vout;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
static VALUE
|
|
173
|
+
sqrt_ki_native_u16 (VALUE self, CArray *ca)
|
|
174
|
+
{
|
|
175
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
176
|
+
INT2NUM(sizeof(double)));
|
|
177
|
+
CArray *co;
|
|
178
|
+
GetCArray(vout, co);
|
|
179
|
+
|
|
180
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
181
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
182
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
183
|
+
K-D-walkable form. */
|
|
184
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
185
|
+
int8_t naxes = ca->ndim;
|
|
186
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
187
|
+
|
|
188
|
+
ca_iter_state st_in, st_out;
|
|
189
|
+
int rc;
|
|
190
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
191
|
+
slab_axes, naxes, 0);
|
|
192
|
+
if ( rc != CA_ITER_OK ) {
|
|
193
|
+
rb_raise(rb_eRuntimeError,
|
|
194
|
+
"sqrt_ki: input init failed rc=%d", rc);
|
|
195
|
+
}
|
|
196
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
197
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
198
|
+
if ( rc != CA_ITER_OK ) {
|
|
199
|
+
ca_iter_state_finish(&st_in);
|
|
200
|
+
rb_raise(rb_eRuntimeError,
|
|
201
|
+
"sqrt_ki: output init failed rc=%d", rc);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
char *pi, *po;
|
|
205
|
+
boolean8_t *mi, *mo;
|
|
206
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
207
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
208
|
+
CA_SLAB_MAP_T(uint16_t, double, st_in, pi, st_out, po, r = sqrt((double) v));
|
|
209
|
+
ca_iter_state_sync_slab(&st_out);
|
|
210
|
+
}
|
|
211
|
+
ca_iter_state_finish(&st_in);
|
|
212
|
+
ca_iter_state_finish(&st_out);
|
|
213
|
+
return vout;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
static VALUE
|
|
217
|
+
sqrt_ki_native_i32 (VALUE self, CArray *ca)
|
|
218
|
+
{
|
|
219
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
220
|
+
INT2NUM(sizeof(double)));
|
|
221
|
+
CArray *co;
|
|
222
|
+
GetCArray(vout, co);
|
|
223
|
+
|
|
224
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
225
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
226
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
227
|
+
K-D-walkable form. */
|
|
228
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
229
|
+
int8_t naxes = ca->ndim;
|
|
230
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
231
|
+
|
|
232
|
+
ca_iter_state st_in, st_out;
|
|
233
|
+
int rc;
|
|
234
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
235
|
+
slab_axes, naxes, 0);
|
|
236
|
+
if ( rc != CA_ITER_OK ) {
|
|
237
|
+
rb_raise(rb_eRuntimeError,
|
|
238
|
+
"sqrt_ki: input init failed rc=%d", rc);
|
|
239
|
+
}
|
|
240
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
241
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
242
|
+
if ( rc != CA_ITER_OK ) {
|
|
243
|
+
ca_iter_state_finish(&st_in);
|
|
244
|
+
rb_raise(rb_eRuntimeError,
|
|
245
|
+
"sqrt_ki: output init failed rc=%d", rc);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
char *pi, *po;
|
|
249
|
+
boolean8_t *mi, *mo;
|
|
250
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
251
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
252
|
+
CA_SLAB_MAP_T(int32_t, double, st_in, pi, st_out, po, r = sqrt((double) v));
|
|
253
|
+
ca_iter_state_sync_slab(&st_out);
|
|
254
|
+
}
|
|
255
|
+
ca_iter_state_finish(&st_in);
|
|
256
|
+
ca_iter_state_finish(&st_out);
|
|
257
|
+
return vout;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
static VALUE
|
|
261
|
+
sqrt_ki_native_u32 (VALUE self, CArray *ca)
|
|
262
|
+
{
|
|
263
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
264
|
+
INT2NUM(sizeof(double)));
|
|
265
|
+
CArray *co;
|
|
266
|
+
GetCArray(vout, co);
|
|
267
|
+
|
|
268
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
269
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
270
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
271
|
+
K-D-walkable form. */
|
|
272
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
273
|
+
int8_t naxes = ca->ndim;
|
|
274
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
275
|
+
|
|
276
|
+
ca_iter_state st_in, st_out;
|
|
277
|
+
int rc;
|
|
278
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
279
|
+
slab_axes, naxes, 0);
|
|
280
|
+
if ( rc != CA_ITER_OK ) {
|
|
281
|
+
rb_raise(rb_eRuntimeError,
|
|
282
|
+
"sqrt_ki: input init failed rc=%d", rc);
|
|
283
|
+
}
|
|
284
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
285
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
286
|
+
if ( rc != CA_ITER_OK ) {
|
|
287
|
+
ca_iter_state_finish(&st_in);
|
|
288
|
+
rb_raise(rb_eRuntimeError,
|
|
289
|
+
"sqrt_ki: output init failed rc=%d", rc);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
char *pi, *po;
|
|
293
|
+
boolean8_t *mi, *mo;
|
|
294
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
295
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
296
|
+
CA_SLAB_MAP_T(uint32_t, double, st_in, pi, st_out, po, r = sqrt((double) v));
|
|
297
|
+
ca_iter_state_sync_slab(&st_out);
|
|
298
|
+
}
|
|
299
|
+
ca_iter_state_finish(&st_in);
|
|
300
|
+
ca_iter_state_finish(&st_out);
|
|
301
|
+
return vout;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
static VALUE
|
|
305
|
+
sqrt_ki_native_i64 (VALUE self, CArray *ca)
|
|
306
|
+
{
|
|
307
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
308
|
+
INT2NUM(sizeof(double)));
|
|
309
|
+
CArray *co;
|
|
310
|
+
GetCArray(vout, co);
|
|
311
|
+
|
|
312
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
313
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
314
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
315
|
+
K-D-walkable form. */
|
|
316
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
317
|
+
int8_t naxes = ca->ndim;
|
|
318
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
319
|
+
|
|
320
|
+
ca_iter_state st_in, st_out;
|
|
321
|
+
int rc;
|
|
322
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
323
|
+
slab_axes, naxes, 0);
|
|
324
|
+
if ( rc != CA_ITER_OK ) {
|
|
325
|
+
rb_raise(rb_eRuntimeError,
|
|
326
|
+
"sqrt_ki: input init failed rc=%d", rc);
|
|
327
|
+
}
|
|
328
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
329
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
330
|
+
if ( rc != CA_ITER_OK ) {
|
|
331
|
+
ca_iter_state_finish(&st_in);
|
|
332
|
+
rb_raise(rb_eRuntimeError,
|
|
333
|
+
"sqrt_ki: output init failed rc=%d", rc);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
char *pi, *po;
|
|
337
|
+
boolean8_t *mi, *mo;
|
|
338
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
339
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
340
|
+
CA_SLAB_MAP_T(int64_t, double, st_in, pi, st_out, po, r = sqrt((double) v));
|
|
341
|
+
ca_iter_state_sync_slab(&st_out);
|
|
342
|
+
}
|
|
343
|
+
ca_iter_state_finish(&st_in);
|
|
344
|
+
ca_iter_state_finish(&st_out);
|
|
345
|
+
return vout;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
static VALUE
|
|
349
|
+
sqrt_ki_native_u64 (VALUE self, CArray *ca)
|
|
350
|
+
{
|
|
351
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
352
|
+
INT2NUM(sizeof(double)));
|
|
353
|
+
CArray *co;
|
|
354
|
+
GetCArray(vout, co);
|
|
355
|
+
|
|
356
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
357
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
358
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
359
|
+
K-D-walkable form. */
|
|
360
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
361
|
+
int8_t naxes = ca->ndim;
|
|
362
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
363
|
+
|
|
364
|
+
ca_iter_state st_in, st_out;
|
|
365
|
+
int rc;
|
|
366
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
367
|
+
slab_axes, naxes, 0);
|
|
368
|
+
if ( rc != CA_ITER_OK ) {
|
|
369
|
+
rb_raise(rb_eRuntimeError,
|
|
370
|
+
"sqrt_ki: input init failed rc=%d", rc);
|
|
371
|
+
}
|
|
372
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
373
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
374
|
+
if ( rc != CA_ITER_OK ) {
|
|
375
|
+
ca_iter_state_finish(&st_in);
|
|
376
|
+
rb_raise(rb_eRuntimeError,
|
|
377
|
+
"sqrt_ki: output init failed rc=%d", rc);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
char *pi, *po;
|
|
381
|
+
boolean8_t *mi, *mo;
|
|
382
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
383
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
384
|
+
CA_SLAB_MAP_T(uint64_t, double, st_in, pi, st_out, po, r = sqrt((double) v));
|
|
385
|
+
ca_iter_state_sync_slab(&st_out);
|
|
386
|
+
}
|
|
387
|
+
ca_iter_state_finish(&st_in);
|
|
388
|
+
ca_iter_state_finish(&st_out);
|
|
389
|
+
return vout;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
static VALUE
|
|
393
|
+
sqrt_ki_native_f32 (VALUE self, CArray *ca)
|
|
394
|
+
{
|
|
395
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
396
|
+
INT2NUM(sizeof(double)));
|
|
397
|
+
CArray *co;
|
|
398
|
+
GetCArray(vout, co);
|
|
399
|
+
|
|
400
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
401
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
402
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
403
|
+
K-D-walkable form. */
|
|
404
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
405
|
+
int8_t naxes = ca->ndim;
|
|
406
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
407
|
+
|
|
408
|
+
ca_iter_state st_in, st_out;
|
|
409
|
+
int rc;
|
|
410
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
411
|
+
slab_axes, naxes, 0);
|
|
412
|
+
if ( rc != CA_ITER_OK ) {
|
|
413
|
+
rb_raise(rb_eRuntimeError,
|
|
414
|
+
"sqrt_ki: input init failed rc=%d", rc);
|
|
415
|
+
}
|
|
416
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
417
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
418
|
+
if ( rc != CA_ITER_OK ) {
|
|
419
|
+
ca_iter_state_finish(&st_in);
|
|
420
|
+
rb_raise(rb_eRuntimeError,
|
|
421
|
+
"sqrt_ki: output init failed rc=%d", rc);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
char *pi, *po;
|
|
425
|
+
boolean8_t *mi, *mo;
|
|
426
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
427
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
428
|
+
CA_SLAB_MAP_T(float, double, st_in, pi, st_out, po, r = sqrt((double) v));
|
|
429
|
+
ca_iter_state_sync_slab(&st_out);
|
|
430
|
+
}
|
|
431
|
+
ca_iter_state_finish(&st_in);
|
|
432
|
+
ca_iter_state_finish(&st_out);
|
|
433
|
+
return vout;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
static VALUE
|
|
437
|
+
sqrt_ki_native_f64 (VALUE self, CArray *ca)
|
|
438
|
+
{
|
|
439
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
440
|
+
INT2NUM(sizeof(double)));
|
|
441
|
+
CArray *co;
|
|
442
|
+
GetCArray(vout, co);
|
|
443
|
+
|
|
444
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
445
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
446
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
447
|
+
K-D-walkable form. */
|
|
448
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
449
|
+
int8_t naxes = ca->ndim;
|
|
450
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
451
|
+
|
|
452
|
+
ca_iter_state st_in, st_out;
|
|
453
|
+
int rc;
|
|
454
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
455
|
+
slab_axes, naxes, 0);
|
|
456
|
+
if ( rc != CA_ITER_OK ) {
|
|
457
|
+
rb_raise(rb_eRuntimeError,
|
|
458
|
+
"sqrt_ki: input init failed rc=%d", rc);
|
|
459
|
+
}
|
|
460
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
461
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
462
|
+
if ( rc != CA_ITER_OK ) {
|
|
463
|
+
ca_iter_state_finish(&st_in);
|
|
464
|
+
rb_raise(rb_eRuntimeError,
|
|
465
|
+
"sqrt_ki: output init failed rc=%d", rc);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
char *pi, *po;
|
|
469
|
+
boolean8_t *mi, *mo;
|
|
470
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
471
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
472
|
+
CA_SLAB_MAP_T(double, double, st_in, pi, st_out, po, r = sqrt((double) v));
|
|
473
|
+
ca_iter_state_sync_slab(&st_out);
|
|
474
|
+
}
|
|
475
|
+
ca_iter_state_finish(&st_in);
|
|
476
|
+
ca_iter_state_finish(&st_out);
|
|
477
|
+
return vout;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
static VALUE
|
|
481
|
+
rb_ca_sqrt_ki (VALUE self)
|
|
482
|
+
{
|
|
483
|
+
CArray *src;
|
|
484
|
+
GetCArray(self, src);
|
|
485
|
+
switch ( src->data_type ) {
|
|
486
|
+
case CA_INT8: return sqrt_ki_native_i8(self, src);
|
|
487
|
+
case CA_UINT8: return sqrt_ki_native_u8(self, src);
|
|
488
|
+
case CA_INT16: return sqrt_ki_native_i16(self, src);
|
|
489
|
+
case CA_UINT16: return sqrt_ki_native_u16(self, src);
|
|
490
|
+
case CA_INT32: return sqrt_ki_native_i32(self, src);
|
|
491
|
+
case CA_UINT32: return sqrt_ki_native_u32(self, src);
|
|
492
|
+
case CA_INT64: return sqrt_ki_native_i64(self, src);
|
|
493
|
+
case CA_UINT64: return sqrt_ki_native_u64(self, src);
|
|
494
|
+
case CA_FLOAT32: return sqrt_ki_native_f32(self, src);
|
|
495
|
+
case CA_FLOAT64: return sqrt_ki_native_f64(self, src);
|
|
496
|
+
default: {
|
|
497
|
+
/* Phase E: only wrap data_types that have a meaningful float64
|
|
498
|
+
representation. Complex / fixlen / object would lose
|
|
499
|
+
structure (e.g. complex -> float strips imaginary part)
|
|
500
|
+
so reject explicitly, matching legacy DataTypeError. */
|
|
501
|
+
switch ( src->data_type ) {
|
|
502
|
+
case CA_BOOLEAN: break; /* wrap: count-of-trues semantic */
|
|
503
|
+
default:
|
|
504
|
+
rb_raise(rb_eCADataTypeError, "sqrt_ki: source data_type :%s not supported (expected one of: i8, u8, i16, u16, i32, u32, i64, u64, f32, f64, or boolean)", ca_type_name[src->data_type]);
|
|
505
|
+
}
|
|
506
|
+
VALUE vsrc = rb_ca_wrap_readonly(self, INT2NUM(CA_FLOAT64));
|
|
507
|
+
CArray *casted;
|
|
508
|
+
GetCArray(vsrc, casted);
|
|
509
|
+
return sqrt_ki_native_f64(vsrc, casted);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
return Qnil; /* unreachable */
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/* ===== sin_ki ============================================ */
|
|
516
|
+
|
|
517
|
+
static VALUE
|
|
518
|
+
sin_ki_native_i8 (VALUE self, CArray *ca)
|
|
519
|
+
{
|
|
520
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
521
|
+
INT2NUM(sizeof(double)));
|
|
522
|
+
CArray *co;
|
|
523
|
+
GetCArray(vout, co);
|
|
524
|
+
|
|
525
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
526
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
527
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
528
|
+
K-D-walkable form. */
|
|
529
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
530
|
+
int8_t naxes = ca->ndim;
|
|
531
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
532
|
+
|
|
533
|
+
ca_iter_state st_in, st_out;
|
|
534
|
+
int rc;
|
|
535
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
536
|
+
slab_axes, naxes, 0);
|
|
537
|
+
if ( rc != CA_ITER_OK ) {
|
|
538
|
+
rb_raise(rb_eRuntimeError,
|
|
539
|
+
"sin_ki: input init failed rc=%d", rc);
|
|
540
|
+
}
|
|
541
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
542
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
543
|
+
if ( rc != CA_ITER_OK ) {
|
|
544
|
+
ca_iter_state_finish(&st_in);
|
|
545
|
+
rb_raise(rb_eRuntimeError,
|
|
546
|
+
"sin_ki: output init failed rc=%d", rc);
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
char *pi, *po;
|
|
550
|
+
boolean8_t *mi, *mo;
|
|
551
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
552
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
553
|
+
CA_SLAB_MAP_T(int8_t, double, st_in, pi, st_out, po, r = sin((double) v));
|
|
554
|
+
ca_iter_state_sync_slab(&st_out);
|
|
555
|
+
}
|
|
556
|
+
ca_iter_state_finish(&st_in);
|
|
557
|
+
ca_iter_state_finish(&st_out);
|
|
558
|
+
return vout;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
static VALUE
|
|
562
|
+
sin_ki_native_u8 (VALUE self, CArray *ca)
|
|
563
|
+
{
|
|
564
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
565
|
+
INT2NUM(sizeof(double)));
|
|
566
|
+
CArray *co;
|
|
567
|
+
GetCArray(vout, co);
|
|
568
|
+
|
|
569
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
570
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
571
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
572
|
+
K-D-walkable form. */
|
|
573
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
574
|
+
int8_t naxes = ca->ndim;
|
|
575
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
576
|
+
|
|
577
|
+
ca_iter_state st_in, st_out;
|
|
578
|
+
int rc;
|
|
579
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
580
|
+
slab_axes, naxes, 0);
|
|
581
|
+
if ( rc != CA_ITER_OK ) {
|
|
582
|
+
rb_raise(rb_eRuntimeError,
|
|
583
|
+
"sin_ki: input init failed rc=%d", rc);
|
|
584
|
+
}
|
|
585
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
586
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
587
|
+
if ( rc != CA_ITER_OK ) {
|
|
588
|
+
ca_iter_state_finish(&st_in);
|
|
589
|
+
rb_raise(rb_eRuntimeError,
|
|
590
|
+
"sin_ki: output init failed rc=%d", rc);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
char *pi, *po;
|
|
594
|
+
boolean8_t *mi, *mo;
|
|
595
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
596
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
597
|
+
CA_SLAB_MAP_T(uint8_t, double, st_in, pi, st_out, po, r = sin((double) v));
|
|
598
|
+
ca_iter_state_sync_slab(&st_out);
|
|
599
|
+
}
|
|
600
|
+
ca_iter_state_finish(&st_in);
|
|
601
|
+
ca_iter_state_finish(&st_out);
|
|
602
|
+
return vout;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
static VALUE
|
|
606
|
+
sin_ki_native_i16 (VALUE self, CArray *ca)
|
|
607
|
+
{
|
|
608
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
609
|
+
INT2NUM(sizeof(double)));
|
|
610
|
+
CArray *co;
|
|
611
|
+
GetCArray(vout, co);
|
|
612
|
+
|
|
613
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
614
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
615
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
616
|
+
K-D-walkable form. */
|
|
617
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
618
|
+
int8_t naxes = ca->ndim;
|
|
619
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
620
|
+
|
|
621
|
+
ca_iter_state st_in, st_out;
|
|
622
|
+
int rc;
|
|
623
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
624
|
+
slab_axes, naxes, 0);
|
|
625
|
+
if ( rc != CA_ITER_OK ) {
|
|
626
|
+
rb_raise(rb_eRuntimeError,
|
|
627
|
+
"sin_ki: input init failed rc=%d", rc);
|
|
628
|
+
}
|
|
629
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
630
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
631
|
+
if ( rc != CA_ITER_OK ) {
|
|
632
|
+
ca_iter_state_finish(&st_in);
|
|
633
|
+
rb_raise(rb_eRuntimeError,
|
|
634
|
+
"sin_ki: output init failed rc=%d", rc);
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
char *pi, *po;
|
|
638
|
+
boolean8_t *mi, *mo;
|
|
639
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
640
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
641
|
+
CA_SLAB_MAP_T(int16_t, double, st_in, pi, st_out, po, r = sin((double) v));
|
|
642
|
+
ca_iter_state_sync_slab(&st_out);
|
|
643
|
+
}
|
|
644
|
+
ca_iter_state_finish(&st_in);
|
|
645
|
+
ca_iter_state_finish(&st_out);
|
|
646
|
+
return vout;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
static VALUE
|
|
650
|
+
sin_ki_native_u16 (VALUE self, CArray *ca)
|
|
651
|
+
{
|
|
652
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
653
|
+
INT2NUM(sizeof(double)));
|
|
654
|
+
CArray *co;
|
|
655
|
+
GetCArray(vout, co);
|
|
656
|
+
|
|
657
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
658
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
659
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
660
|
+
K-D-walkable form. */
|
|
661
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
662
|
+
int8_t naxes = ca->ndim;
|
|
663
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
664
|
+
|
|
665
|
+
ca_iter_state st_in, st_out;
|
|
666
|
+
int rc;
|
|
667
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
668
|
+
slab_axes, naxes, 0);
|
|
669
|
+
if ( rc != CA_ITER_OK ) {
|
|
670
|
+
rb_raise(rb_eRuntimeError,
|
|
671
|
+
"sin_ki: input init failed rc=%d", rc);
|
|
672
|
+
}
|
|
673
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
674
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
675
|
+
if ( rc != CA_ITER_OK ) {
|
|
676
|
+
ca_iter_state_finish(&st_in);
|
|
677
|
+
rb_raise(rb_eRuntimeError,
|
|
678
|
+
"sin_ki: output init failed rc=%d", rc);
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
char *pi, *po;
|
|
682
|
+
boolean8_t *mi, *mo;
|
|
683
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
684
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
685
|
+
CA_SLAB_MAP_T(uint16_t, double, st_in, pi, st_out, po, r = sin((double) v));
|
|
686
|
+
ca_iter_state_sync_slab(&st_out);
|
|
687
|
+
}
|
|
688
|
+
ca_iter_state_finish(&st_in);
|
|
689
|
+
ca_iter_state_finish(&st_out);
|
|
690
|
+
return vout;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
static VALUE
|
|
694
|
+
sin_ki_native_i32 (VALUE self, CArray *ca)
|
|
695
|
+
{
|
|
696
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
697
|
+
INT2NUM(sizeof(double)));
|
|
698
|
+
CArray *co;
|
|
699
|
+
GetCArray(vout, co);
|
|
700
|
+
|
|
701
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
702
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
703
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
704
|
+
K-D-walkable form. */
|
|
705
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
706
|
+
int8_t naxes = ca->ndim;
|
|
707
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
708
|
+
|
|
709
|
+
ca_iter_state st_in, st_out;
|
|
710
|
+
int rc;
|
|
711
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
712
|
+
slab_axes, naxes, 0);
|
|
713
|
+
if ( rc != CA_ITER_OK ) {
|
|
714
|
+
rb_raise(rb_eRuntimeError,
|
|
715
|
+
"sin_ki: input init failed rc=%d", rc);
|
|
716
|
+
}
|
|
717
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
718
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
719
|
+
if ( rc != CA_ITER_OK ) {
|
|
720
|
+
ca_iter_state_finish(&st_in);
|
|
721
|
+
rb_raise(rb_eRuntimeError,
|
|
722
|
+
"sin_ki: output init failed rc=%d", rc);
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
char *pi, *po;
|
|
726
|
+
boolean8_t *mi, *mo;
|
|
727
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
728
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
729
|
+
CA_SLAB_MAP_T(int32_t, double, st_in, pi, st_out, po, r = sin((double) v));
|
|
730
|
+
ca_iter_state_sync_slab(&st_out);
|
|
731
|
+
}
|
|
732
|
+
ca_iter_state_finish(&st_in);
|
|
733
|
+
ca_iter_state_finish(&st_out);
|
|
734
|
+
return vout;
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
static VALUE
|
|
738
|
+
sin_ki_native_u32 (VALUE self, CArray *ca)
|
|
739
|
+
{
|
|
740
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
741
|
+
INT2NUM(sizeof(double)));
|
|
742
|
+
CArray *co;
|
|
743
|
+
GetCArray(vout, co);
|
|
744
|
+
|
|
745
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
746
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
747
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
748
|
+
K-D-walkable form. */
|
|
749
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
750
|
+
int8_t naxes = ca->ndim;
|
|
751
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
752
|
+
|
|
753
|
+
ca_iter_state st_in, st_out;
|
|
754
|
+
int rc;
|
|
755
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
756
|
+
slab_axes, naxes, 0);
|
|
757
|
+
if ( rc != CA_ITER_OK ) {
|
|
758
|
+
rb_raise(rb_eRuntimeError,
|
|
759
|
+
"sin_ki: input init failed rc=%d", rc);
|
|
760
|
+
}
|
|
761
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
762
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
763
|
+
if ( rc != CA_ITER_OK ) {
|
|
764
|
+
ca_iter_state_finish(&st_in);
|
|
765
|
+
rb_raise(rb_eRuntimeError,
|
|
766
|
+
"sin_ki: output init failed rc=%d", rc);
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
char *pi, *po;
|
|
770
|
+
boolean8_t *mi, *mo;
|
|
771
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
772
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
773
|
+
CA_SLAB_MAP_T(uint32_t, double, st_in, pi, st_out, po, r = sin((double) v));
|
|
774
|
+
ca_iter_state_sync_slab(&st_out);
|
|
775
|
+
}
|
|
776
|
+
ca_iter_state_finish(&st_in);
|
|
777
|
+
ca_iter_state_finish(&st_out);
|
|
778
|
+
return vout;
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
static VALUE
|
|
782
|
+
sin_ki_native_i64 (VALUE self, CArray *ca)
|
|
783
|
+
{
|
|
784
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
785
|
+
INT2NUM(sizeof(double)));
|
|
786
|
+
CArray *co;
|
|
787
|
+
GetCArray(vout, co);
|
|
788
|
+
|
|
789
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
790
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
791
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
792
|
+
K-D-walkable form. */
|
|
793
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
794
|
+
int8_t naxes = ca->ndim;
|
|
795
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
796
|
+
|
|
797
|
+
ca_iter_state st_in, st_out;
|
|
798
|
+
int rc;
|
|
799
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
800
|
+
slab_axes, naxes, 0);
|
|
801
|
+
if ( rc != CA_ITER_OK ) {
|
|
802
|
+
rb_raise(rb_eRuntimeError,
|
|
803
|
+
"sin_ki: input init failed rc=%d", rc);
|
|
804
|
+
}
|
|
805
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
806
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
807
|
+
if ( rc != CA_ITER_OK ) {
|
|
808
|
+
ca_iter_state_finish(&st_in);
|
|
809
|
+
rb_raise(rb_eRuntimeError,
|
|
810
|
+
"sin_ki: output init failed rc=%d", rc);
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
char *pi, *po;
|
|
814
|
+
boolean8_t *mi, *mo;
|
|
815
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
816
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
817
|
+
CA_SLAB_MAP_T(int64_t, double, st_in, pi, st_out, po, r = sin((double) v));
|
|
818
|
+
ca_iter_state_sync_slab(&st_out);
|
|
819
|
+
}
|
|
820
|
+
ca_iter_state_finish(&st_in);
|
|
821
|
+
ca_iter_state_finish(&st_out);
|
|
822
|
+
return vout;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
static VALUE
|
|
826
|
+
sin_ki_native_u64 (VALUE self, CArray *ca)
|
|
827
|
+
{
|
|
828
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
829
|
+
INT2NUM(sizeof(double)));
|
|
830
|
+
CArray *co;
|
|
831
|
+
GetCArray(vout, co);
|
|
832
|
+
|
|
833
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
834
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
835
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
836
|
+
K-D-walkable form. */
|
|
837
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
838
|
+
int8_t naxes = ca->ndim;
|
|
839
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
840
|
+
|
|
841
|
+
ca_iter_state st_in, st_out;
|
|
842
|
+
int rc;
|
|
843
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
844
|
+
slab_axes, naxes, 0);
|
|
845
|
+
if ( rc != CA_ITER_OK ) {
|
|
846
|
+
rb_raise(rb_eRuntimeError,
|
|
847
|
+
"sin_ki: input init failed rc=%d", rc);
|
|
848
|
+
}
|
|
849
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
850
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
851
|
+
if ( rc != CA_ITER_OK ) {
|
|
852
|
+
ca_iter_state_finish(&st_in);
|
|
853
|
+
rb_raise(rb_eRuntimeError,
|
|
854
|
+
"sin_ki: output init failed rc=%d", rc);
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
char *pi, *po;
|
|
858
|
+
boolean8_t *mi, *mo;
|
|
859
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
860
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
861
|
+
CA_SLAB_MAP_T(uint64_t, double, st_in, pi, st_out, po, r = sin((double) v));
|
|
862
|
+
ca_iter_state_sync_slab(&st_out);
|
|
863
|
+
}
|
|
864
|
+
ca_iter_state_finish(&st_in);
|
|
865
|
+
ca_iter_state_finish(&st_out);
|
|
866
|
+
return vout;
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
static VALUE
|
|
870
|
+
sin_ki_native_f32 (VALUE self, CArray *ca)
|
|
871
|
+
{
|
|
872
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
873
|
+
INT2NUM(sizeof(double)));
|
|
874
|
+
CArray *co;
|
|
875
|
+
GetCArray(vout, co);
|
|
876
|
+
|
|
877
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
878
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
879
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
880
|
+
K-D-walkable form. */
|
|
881
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
882
|
+
int8_t naxes = ca->ndim;
|
|
883
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
884
|
+
|
|
885
|
+
ca_iter_state st_in, st_out;
|
|
886
|
+
int rc;
|
|
887
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
888
|
+
slab_axes, naxes, 0);
|
|
889
|
+
if ( rc != CA_ITER_OK ) {
|
|
890
|
+
rb_raise(rb_eRuntimeError,
|
|
891
|
+
"sin_ki: input init failed rc=%d", rc);
|
|
892
|
+
}
|
|
893
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
894
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
895
|
+
if ( rc != CA_ITER_OK ) {
|
|
896
|
+
ca_iter_state_finish(&st_in);
|
|
897
|
+
rb_raise(rb_eRuntimeError,
|
|
898
|
+
"sin_ki: output init failed rc=%d", rc);
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
char *pi, *po;
|
|
902
|
+
boolean8_t *mi, *mo;
|
|
903
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
904
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
905
|
+
CA_SLAB_MAP_T(float, double, st_in, pi, st_out, po, r = sin((double) v));
|
|
906
|
+
ca_iter_state_sync_slab(&st_out);
|
|
907
|
+
}
|
|
908
|
+
ca_iter_state_finish(&st_in);
|
|
909
|
+
ca_iter_state_finish(&st_out);
|
|
910
|
+
return vout;
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
static VALUE
|
|
914
|
+
sin_ki_native_f64 (VALUE self, CArray *ca)
|
|
915
|
+
{
|
|
916
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
917
|
+
INT2NUM(sizeof(double)));
|
|
918
|
+
CArray *co;
|
|
919
|
+
GetCArray(vout, co);
|
|
920
|
+
|
|
921
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
922
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
923
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
924
|
+
K-D-walkable form. */
|
|
925
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
926
|
+
int8_t naxes = ca->ndim;
|
|
927
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
928
|
+
|
|
929
|
+
ca_iter_state st_in, st_out;
|
|
930
|
+
int rc;
|
|
931
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
932
|
+
slab_axes, naxes, 0);
|
|
933
|
+
if ( rc != CA_ITER_OK ) {
|
|
934
|
+
rb_raise(rb_eRuntimeError,
|
|
935
|
+
"sin_ki: input init failed rc=%d", rc);
|
|
936
|
+
}
|
|
937
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
938
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
939
|
+
if ( rc != CA_ITER_OK ) {
|
|
940
|
+
ca_iter_state_finish(&st_in);
|
|
941
|
+
rb_raise(rb_eRuntimeError,
|
|
942
|
+
"sin_ki: output init failed rc=%d", rc);
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
char *pi, *po;
|
|
946
|
+
boolean8_t *mi, *mo;
|
|
947
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
948
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
949
|
+
CA_SLAB_MAP_T(double, double, st_in, pi, st_out, po, r = sin((double) v));
|
|
950
|
+
ca_iter_state_sync_slab(&st_out);
|
|
951
|
+
}
|
|
952
|
+
ca_iter_state_finish(&st_in);
|
|
953
|
+
ca_iter_state_finish(&st_out);
|
|
954
|
+
return vout;
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
static VALUE
|
|
958
|
+
rb_ca_sin_ki (VALUE self)
|
|
959
|
+
{
|
|
960
|
+
CArray *src;
|
|
961
|
+
GetCArray(self, src);
|
|
962
|
+
switch ( src->data_type ) {
|
|
963
|
+
case CA_INT8: return sin_ki_native_i8(self, src);
|
|
964
|
+
case CA_UINT8: return sin_ki_native_u8(self, src);
|
|
965
|
+
case CA_INT16: return sin_ki_native_i16(self, src);
|
|
966
|
+
case CA_UINT16: return sin_ki_native_u16(self, src);
|
|
967
|
+
case CA_INT32: return sin_ki_native_i32(self, src);
|
|
968
|
+
case CA_UINT32: return sin_ki_native_u32(self, src);
|
|
969
|
+
case CA_INT64: return sin_ki_native_i64(self, src);
|
|
970
|
+
case CA_UINT64: return sin_ki_native_u64(self, src);
|
|
971
|
+
case CA_FLOAT32: return sin_ki_native_f32(self, src);
|
|
972
|
+
case CA_FLOAT64: return sin_ki_native_f64(self, src);
|
|
973
|
+
default: {
|
|
974
|
+
/* Phase E: only wrap data_types that have a meaningful float64
|
|
975
|
+
representation. Complex / fixlen / object would lose
|
|
976
|
+
structure (e.g. complex -> float strips imaginary part)
|
|
977
|
+
so reject explicitly, matching legacy DataTypeError. */
|
|
978
|
+
switch ( src->data_type ) {
|
|
979
|
+
case CA_BOOLEAN: break; /* wrap: count-of-trues semantic */
|
|
980
|
+
default:
|
|
981
|
+
rb_raise(rb_eCADataTypeError, "sin_ki: source data_type :%s not supported (expected one of: i8, u8, i16, u16, i32, u32, i64, u64, f32, f64, or boolean)", ca_type_name[src->data_type]);
|
|
982
|
+
}
|
|
983
|
+
VALUE vsrc = rb_ca_wrap_readonly(self, INT2NUM(CA_FLOAT64));
|
|
984
|
+
CArray *casted;
|
|
985
|
+
GetCArray(vsrc, casted);
|
|
986
|
+
return sin_ki_native_f64(vsrc, casted);
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
return Qnil; /* unreachable */
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
/* ===== cos_ki ============================================ */
|
|
993
|
+
|
|
994
|
+
static VALUE
|
|
995
|
+
cos_ki_native_i8 (VALUE self, CArray *ca)
|
|
996
|
+
{
|
|
997
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
998
|
+
INT2NUM(sizeof(double)));
|
|
999
|
+
CArray *co;
|
|
1000
|
+
GetCArray(vout, co);
|
|
1001
|
+
|
|
1002
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1003
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1004
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1005
|
+
K-D-walkable form. */
|
|
1006
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1007
|
+
int8_t naxes = ca->ndim;
|
|
1008
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1009
|
+
|
|
1010
|
+
ca_iter_state st_in, st_out;
|
|
1011
|
+
int rc;
|
|
1012
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1013
|
+
slab_axes, naxes, 0);
|
|
1014
|
+
if ( rc != CA_ITER_OK ) {
|
|
1015
|
+
rb_raise(rb_eRuntimeError,
|
|
1016
|
+
"cos_ki: input init failed rc=%d", rc);
|
|
1017
|
+
}
|
|
1018
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1019
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1020
|
+
if ( rc != CA_ITER_OK ) {
|
|
1021
|
+
ca_iter_state_finish(&st_in);
|
|
1022
|
+
rb_raise(rb_eRuntimeError,
|
|
1023
|
+
"cos_ki: output init failed rc=%d", rc);
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
char *pi, *po;
|
|
1027
|
+
boolean8_t *mi, *mo;
|
|
1028
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1029
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1030
|
+
CA_SLAB_MAP_T(int8_t, double, st_in, pi, st_out, po, r = cos((double) v));
|
|
1031
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1032
|
+
}
|
|
1033
|
+
ca_iter_state_finish(&st_in);
|
|
1034
|
+
ca_iter_state_finish(&st_out);
|
|
1035
|
+
return vout;
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
static VALUE
|
|
1039
|
+
cos_ki_native_u8 (VALUE self, CArray *ca)
|
|
1040
|
+
{
|
|
1041
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1042
|
+
INT2NUM(sizeof(double)));
|
|
1043
|
+
CArray *co;
|
|
1044
|
+
GetCArray(vout, co);
|
|
1045
|
+
|
|
1046
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1047
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1048
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1049
|
+
K-D-walkable form. */
|
|
1050
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1051
|
+
int8_t naxes = ca->ndim;
|
|
1052
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1053
|
+
|
|
1054
|
+
ca_iter_state st_in, st_out;
|
|
1055
|
+
int rc;
|
|
1056
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1057
|
+
slab_axes, naxes, 0);
|
|
1058
|
+
if ( rc != CA_ITER_OK ) {
|
|
1059
|
+
rb_raise(rb_eRuntimeError,
|
|
1060
|
+
"cos_ki: input init failed rc=%d", rc);
|
|
1061
|
+
}
|
|
1062
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1063
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1064
|
+
if ( rc != CA_ITER_OK ) {
|
|
1065
|
+
ca_iter_state_finish(&st_in);
|
|
1066
|
+
rb_raise(rb_eRuntimeError,
|
|
1067
|
+
"cos_ki: output init failed rc=%d", rc);
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1070
|
+
char *pi, *po;
|
|
1071
|
+
boolean8_t *mi, *mo;
|
|
1072
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1073
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1074
|
+
CA_SLAB_MAP_T(uint8_t, double, st_in, pi, st_out, po, r = cos((double) v));
|
|
1075
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1076
|
+
}
|
|
1077
|
+
ca_iter_state_finish(&st_in);
|
|
1078
|
+
ca_iter_state_finish(&st_out);
|
|
1079
|
+
return vout;
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
static VALUE
|
|
1083
|
+
cos_ki_native_i16 (VALUE self, CArray *ca)
|
|
1084
|
+
{
|
|
1085
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1086
|
+
INT2NUM(sizeof(double)));
|
|
1087
|
+
CArray *co;
|
|
1088
|
+
GetCArray(vout, co);
|
|
1089
|
+
|
|
1090
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1091
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1092
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1093
|
+
K-D-walkable form. */
|
|
1094
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1095
|
+
int8_t naxes = ca->ndim;
|
|
1096
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1097
|
+
|
|
1098
|
+
ca_iter_state st_in, st_out;
|
|
1099
|
+
int rc;
|
|
1100
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1101
|
+
slab_axes, naxes, 0);
|
|
1102
|
+
if ( rc != CA_ITER_OK ) {
|
|
1103
|
+
rb_raise(rb_eRuntimeError,
|
|
1104
|
+
"cos_ki: input init failed rc=%d", rc);
|
|
1105
|
+
}
|
|
1106
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1107
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1108
|
+
if ( rc != CA_ITER_OK ) {
|
|
1109
|
+
ca_iter_state_finish(&st_in);
|
|
1110
|
+
rb_raise(rb_eRuntimeError,
|
|
1111
|
+
"cos_ki: output init failed rc=%d", rc);
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
char *pi, *po;
|
|
1115
|
+
boolean8_t *mi, *mo;
|
|
1116
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1117
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1118
|
+
CA_SLAB_MAP_T(int16_t, double, st_in, pi, st_out, po, r = cos((double) v));
|
|
1119
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1120
|
+
}
|
|
1121
|
+
ca_iter_state_finish(&st_in);
|
|
1122
|
+
ca_iter_state_finish(&st_out);
|
|
1123
|
+
return vout;
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
static VALUE
|
|
1127
|
+
cos_ki_native_u16 (VALUE self, CArray *ca)
|
|
1128
|
+
{
|
|
1129
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1130
|
+
INT2NUM(sizeof(double)));
|
|
1131
|
+
CArray *co;
|
|
1132
|
+
GetCArray(vout, co);
|
|
1133
|
+
|
|
1134
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1135
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1136
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1137
|
+
K-D-walkable form. */
|
|
1138
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1139
|
+
int8_t naxes = ca->ndim;
|
|
1140
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1141
|
+
|
|
1142
|
+
ca_iter_state st_in, st_out;
|
|
1143
|
+
int rc;
|
|
1144
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1145
|
+
slab_axes, naxes, 0);
|
|
1146
|
+
if ( rc != CA_ITER_OK ) {
|
|
1147
|
+
rb_raise(rb_eRuntimeError,
|
|
1148
|
+
"cos_ki: input init failed rc=%d", rc);
|
|
1149
|
+
}
|
|
1150
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1151
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1152
|
+
if ( rc != CA_ITER_OK ) {
|
|
1153
|
+
ca_iter_state_finish(&st_in);
|
|
1154
|
+
rb_raise(rb_eRuntimeError,
|
|
1155
|
+
"cos_ki: output init failed rc=%d", rc);
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
char *pi, *po;
|
|
1159
|
+
boolean8_t *mi, *mo;
|
|
1160
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1161
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1162
|
+
CA_SLAB_MAP_T(uint16_t, double, st_in, pi, st_out, po, r = cos((double) v));
|
|
1163
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1164
|
+
}
|
|
1165
|
+
ca_iter_state_finish(&st_in);
|
|
1166
|
+
ca_iter_state_finish(&st_out);
|
|
1167
|
+
return vout;
|
|
1168
|
+
}
|
|
1169
|
+
|
|
1170
|
+
static VALUE
|
|
1171
|
+
cos_ki_native_i32 (VALUE self, CArray *ca)
|
|
1172
|
+
{
|
|
1173
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1174
|
+
INT2NUM(sizeof(double)));
|
|
1175
|
+
CArray *co;
|
|
1176
|
+
GetCArray(vout, co);
|
|
1177
|
+
|
|
1178
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1179
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1180
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1181
|
+
K-D-walkable form. */
|
|
1182
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1183
|
+
int8_t naxes = ca->ndim;
|
|
1184
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1185
|
+
|
|
1186
|
+
ca_iter_state st_in, st_out;
|
|
1187
|
+
int rc;
|
|
1188
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1189
|
+
slab_axes, naxes, 0);
|
|
1190
|
+
if ( rc != CA_ITER_OK ) {
|
|
1191
|
+
rb_raise(rb_eRuntimeError,
|
|
1192
|
+
"cos_ki: input init failed rc=%d", rc);
|
|
1193
|
+
}
|
|
1194
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1195
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1196
|
+
if ( rc != CA_ITER_OK ) {
|
|
1197
|
+
ca_iter_state_finish(&st_in);
|
|
1198
|
+
rb_raise(rb_eRuntimeError,
|
|
1199
|
+
"cos_ki: output init failed rc=%d", rc);
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
char *pi, *po;
|
|
1203
|
+
boolean8_t *mi, *mo;
|
|
1204
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1205
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1206
|
+
CA_SLAB_MAP_T(int32_t, double, st_in, pi, st_out, po, r = cos((double) v));
|
|
1207
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1208
|
+
}
|
|
1209
|
+
ca_iter_state_finish(&st_in);
|
|
1210
|
+
ca_iter_state_finish(&st_out);
|
|
1211
|
+
return vout;
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1214
|
+
static VALUE
|
|
1215
|
+
cos_ki_native_u32 (VALUE self, CArray *ca)
|
|
1216
|
+
{
|
|
1217
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1218
|
+
INT2NUM(sizeof(double)));
|
|
1219
|
+
CArray *co;
|
|
1220
|
+
GetCArray(vout, co);
|
|
1221
|
+
|
|
1222
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1223
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1224
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1225
|
+
K-D-walkable form. */
|
|
1226
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1227
|
+
int8_t naxes = ca->ndim;
|
|
1228
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1229
|
+
|
|
1230
|
+
ca_iter_state st_in, st_out;
|
|
1231
|
+
int rc;
|
|
1232
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1233
|
+
slab_axes, naxes, 0);
|
|
1234
|
+
if ( rc != CA_ITER_OK ) {
|
|
1235
|
+
rb_raise(rb_eRuntimeError,
|
|
1236
|
+
"cos_ki: input init failed rc=%d", rc);
|
|
1237
|
+
}
|
|
1238
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1239
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1240
|
+
if ( rc != CA_ITER_OK ) {
|
|
1241
|
+
ca_iter_state_finish(&st_in);
|
|
1242
|
+
rb_raise(rb_eRuntimeError,
|
|
1243
|
+
"cos_ki: output init failed rc=%d", rc);
|
|
1244
|
+
}
|
|
1245
|
+
|
|
1246
|
+
char *pi, *po;
|
|
1247
|
+
boolean8_t *mi, *mo;
|
|
1248
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1249
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1250
|
+
CA_SLAB_MAP_T(uint32_t, double, st_in, pi, st_out, po, r = cos((double) v));
|
|
1251
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1252
|
+
}
|
|
1253
|
+
ca_iter_state_finish(&st_in);
|
|
1254
|
+
ca_iter_state_finish(&st_out);
|
|
1255
|
+
return vout;
|
|
1256
|
+
}
|
|
1257
|
+
|
|
1258
|
+
static VALUE
|
|
1259
|
+
cos_ki_native_i64 (VALUE self, CArray *ca)
|
|
1260
|
+
{
|
|
1261
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1262
|
+
INT2NUM(sizeof(double)));
|
|
1263
|
+
CArray *co;
|
|
1264
|
+
GetCArray(vout, co);
|
|
1265
|
+
|
|
1266
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1267
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1268
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1269
|
+
K-D-walkable form. */
|
|
1270
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1271
|
+
int8_t naxes = ca->ndim;
|
|
1272
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1273
|
+
|
|
1274
|
+
ca_iter_state st_in, st_out;
|
|
1275
|
+
int rc;
|
|
1276
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1277
|
+
slab_axes, naxes, 0);
|
|
1278
|
+
if ( rc != CA_ITER_OK ) {
|
|
1279
|
+
rb_raise(rb_eRuntimeError,
|
|
1280
|
+
"cos_ki: input init failed rc=%d", rc);
|
|
1281
|
+
}
|
|
1282
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1283
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1284
|
+
if ( rc != CA_ITER_OK ) {
|
|
1285
|
+
ca_iter_state_finish(&st_in);
|
|
1286
|
+
rb_raise(rb_eRuntimeError,
|
|
1287
|
+
"cos_ki: output init failed rc=%d", rc);
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
char *pi, *po;
|
|
1291
|
+
boolean8_t *mi, *mo;
|
|
1292
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1293
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1294
|
+
CA_SLAB_MAP_T(int64_t, double, st_in, pi, st_out, po, r = cos((double) v));
|
|
1295
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1296
|
+
}
|
|
1297
|
+
ca_iter_state_finish(&st_in);
|
|
1298
|
+
ca_iter_state_finish(&st_out);
|
|
1299
|
+
return vout;
|
|
1300
|
+
}
|
|
1301
|
+
|
|
1302
|
+
static VALUE
|
|
1303
|
+
cos_ki_native_u64 (VALUE self, CArray *ca)
|
|
1304
|
+
{
|
|
1305
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1306
|
+
INT2NUM(sizeof(double)));
|
|
1307
|
+
CArray *co;
|
|
1308
|
+
GetCArray(vout, co);
|
|
1309
|
+
|
|
1310
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1311
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1312
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1313
|
+
K-D-walkable form. */
|
|
1314
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1315
|
+
int8_t naxes = ca->ndim;
|
|
1316
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1317
|
+
|
|
1318
|
+
ca_iter_state st_in, st_out;
|
|
1319
|
+
int rc;
|
|
1320
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1321
|
+
slab_axes, naxes, 0);
|
|
1322
|
+
if ( rc != CA_ITER_OK ) {
|
|
1323
|
+
rb_raise(rb_eRuntimeError,
|
|
1324
|
+
"cos_ki: input init failed rc=%d", rc);
|
|
1325
|
+
}
|
|
1326
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1327
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1328
|
+
if ( rc != CA_ITER_OK ) {
|
|
1329
|
+
ca_iter_state_finish(&st_in);
|
|
1330
|
+
rb_raise(rb_eRuntimeError,
|
|
1331
|
+
"cos_ki: output init failed rc=%d", rc);
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
char *pi, *po;
|
|
1335
|
+
boolean8_t *mi, *mo;
|
|
1336
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1337
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1338
|
+
CA_SLAB_MAP_T(uint64_t, double, st_in, pi, st_out, po, r = cos((double) v));
|
|
1339
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1340
|
+
}
|
|
1341
|
+
ca_iter_state_finish(&st_in);
|
|
1342
|
+
ca_iter_state_finish(&st_out);
|
|
1343
|
+
return vout;
|
|
1344
|
+
}
|
|
1345
|
+
|
|
1346
|
+
static VALUE
|
|
1347
|
+
cos_ki_native_f32 (VALUE self, CArray *ca)
|
|
1348
|
+
{
|
|
1349
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1350
|
+
INT2NUM(sizeof(double)));
|
|
1351
|
+
CArray *co;
|
|
1352
|
+
GetCArray(vout, co);
|
|
1353
|
+
|
|
1354
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1355
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1356
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1357
|
+
K-D-walkable form. */
|
|
1358
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1359
|
+
int8_t naxes = ca->ndim;
|
|
1360
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1361
|
+
|
|
1362
|
+
ca_iter_state st_in, st_out;
|
|
1363
|
+
int rc;
|
|
1364
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1365
|
+
slab_axes, naxes, 0);
|
|
1366
|
+
if ( rc != CA_ITER_OK ) {
|
|
1367
|
+
rb_raise(rb_eRuntimeError,
|
|
1368
|
+
"cos_ki: input init failed rc=%d", rc);
|
|
1369
|
+
}
|
|
1370
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1371
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1372
|
+
if ( rc != CA_ITER_OK ) {
|
|
1373
|
+
ca_iter_state_finish(&st_in);
|
|
1374
|
+
rb_raise(rb_eRuntimeError,
|
|
1375
|
+
"cos_ki: output init failed rc=%d", rc);
|
|
1376
|
+
}
|
|
1377
|
+
|
|
1378
|
+
char *pi, *po;
|
|
1379
|
+
boolean8_t *mi, *mo;
|
|
1380
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1381
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1382
|
+
CA_SLAB_MAP_T(float, double, st_in, pi, st_out, po, r = cos((double) v));
|
|
1383
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1384
|
+
}
|
|
1385
|
+
ca_iter_state_finish(&st_in);
|
|
1386
|
+
ca_iter_state_finish(&st_out);
|
|
1387
|
+
return vout;
|
|
1388
|
+
}
|
|
1389
|
+
|
|
1390
|
+
static VALUE
|
|
1391
|
+
cos_ki_native_f64 (VALUE self, CArray *ca)
|
|
1392
|
+
{
|
|
1393
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1394
|
+
INT2NUM(sizeof(double)));
|
|
1395
|
+
CArray *co;
|
|
1396
|
+
GetCArray(vout, co);
|
|
1397
|
+
|
|
1398
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1399
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1400
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1401
|
+
K-D-walkable form. */
|
|
1402
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1403
|
+
int8_t naxes = ca->ndim;
|
|
1404
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1405
|
+
|
|
1406
|
+
ca_iter_state st_in, st_out;
|
|
1407
|
+
int rc;
|
|
1408
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1409
|
+
slab_axes, naxes, 0);
|
|
1410
|
+
if ( rc != CA_ITER_OK ) {
|
|
1411
|
+
rb_raise(rb_eRuntimeError,
|
|
1412
|
+
"cos_ki: input init failed rc=%d", rc);
|
|
1413
|
+
}
|
|
1414
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1415
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1416
|
+
if ( rc != CA_ITER_OK ) {
|
|
1417
|
+
ca_iter_state_finish(&st_in);
|
|
1418
|
+
rb_raise(rb_eRuntimeError,
|
|
1419
|
+
"cos_ki: output init failed rc=%d", rc);
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1422
|
+
char *pi, *po;
|
|
1423
|
+
boolean8_t *mi, *mo;
|
|
1424
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1425
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1426
|
+
CA_SLAB_MAP_T(double, double, st_in, pi, st_out, po, r = cos((double) v));
|
|
1427
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1428
|
+
}
|
|
1429
|
+
ca_iter_state_finish(&st_in);
|
|
1430
|
+
ca_iter_state_finish(&st_out);
|
|
1431
|
+
return vout;
|
|
1432
|
+
}
|
|
1433
|
+
|
|
1434
|
+
static VALUE
|
|
1435
|
+
rb_ca_cos_ki (VALUE self)
|
|
1436
|
+
{
|
|
1437
|
+
CArray *src;
|
|
1438
|
+
GetCArray(self, src);
|
|
1439
|
+
switch ( src->data_type ) {
|
|
1440
|
+
case CA_INT8: return cos_ki_native_i8(self, src);
|
|
1441
|
+
case CA_UINT8: return cos_ki_native_u8(self, src);
|
|
1442
|
+
case CA_INT16: return cos_ki_native_i16(self, src);
|
|
1443
|
+
case CA_UINT16: return cos_ki_native_u16(self, src);
|
|
1444
|
+
case CA_INT32: return cos_ki_native_i32(self, src);
|
|
1445
|
+
case CA_UINT32: return cos_ki_native_u32(self, src);
|
|
1446
|
+
case CA_INT64: return cos_ki_native_i64(self, src);
|
|
1447
|
+
case CA_UINT64: return cos_ki_native_u64(self, src);
|
|
1448
|
+
case CA_FLOAT32: return cos_ki_native_f32(self, src);
|
|
1449
|
+
case CA_FLOAT64: return cos_ki_native_f64(self, src);
|
|
1450
|
+
default: {
|
|
1451
|
+
/* Phase E: only wrap data_types that have a meaningful float64
|
|
1452
|
+
representation. Complex / fixlen / object would lose
|
|
1453
|
+
structure (e.g. complex -> float strips imaginary part)
|
|
1454
|
+
so reject explicitly, matching legacy DataTypeError. */
|
|
1455
|
+
switch ( src->data_type ) {
|
|
1456
|
+
case CA_BOOLEAN: break; /* wrap: count-of-trues semantic */
|
|
1457
|
+
default:
|
|
1458
|
+
rb_raise(rb_eCADataTypeError, "cos_ki: source data_type :%s not supported (expected one of: i8, u8, i16, u16, i32, u32, i64, u64, f32, f64, or boolean)", ca_type_name[src->data_type]);
|
|
1459
|
+
}
|
|
1460
|
+
VALUE vsrc = rb_ca_wrap_readonly(self, INT2NUM(CA_FLOAT64));
|
|
1461
|
+
CArray *casted;
|
|
1462
|
+
GetCArray(vsrc, casted);
|
|
1463
|
+
return cos_ki_native_f64(vsrc, casted);
|
|
1464
|
+
}
|
|
1465
|
+
}
|
|
1466
|
+
return Qnil; /* unreachable */
|
|
1467
|
+
}
|
|
1468
|
+
|
|
1469
|
+
/* ===== exp_ki ============================================ */
|
|
1470
|
+
|
|
1471
|
+
static VALUE
|
|
1472
|
+
exp_ki_native_i8 (VALUE self, CArray *ca)
|
|
1473
|
+
{
|
|
1474
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1475
|
+
INT2NUM(sizeof(double)));
|
|
1476
|
+
CArray *co;
|
|
1477
|
+
GetCArray(vout, co);
|
|
1478
|
+
|
|
1479
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1480
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1481
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1482
|
+
K-D-walkable form. */
|
|
1483
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1484
|
+
int8_t naxes = ca->ndim;
|
|
1485
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1486
|
+
|
|
1487
|
+
ca_iter_state st_in, st_out;
|
|
1488
|
+
int rc;
|
|
1489
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1490
|
+
slab_axes, naxes, 0);
|
|
1491
|
+
if ( rc != CA_ITER_OK ) {
|
|
1492
|
+
rb_raise(rb_eRuntimeError,
|
|
1493
|
+
"exp_ki: input init failed rc=%d", rc);
|
|
1494
|
+
}
|
|
1495
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1496
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1497
|
+
if ( rc != CA_ITER_OK ) {
|
|
1498
|
+
ca_iter_state_finish(&st_in);
|
|
1499
|
+
rb_raise(rb_eRuntimeError,
|
|
1500
|
+
"exp_ki: output init failed rc=%d", rc);
|
|
1501
|
+
}
|
|
1502
|
+
|
|
1503
|
+
char *pi, *po;
|
|
1504
|
+
boolean8_t *mi, *mo;
|
|
1505
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1506
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1507
|
+
CA_SLAB_MAP_T(int8_t, double, st_in, pi, st_out, po, r = exp((double) v));
|
|
1508
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1509
|
+
}
|
|
1510
|
+
ca_iter_state_finish(&st_in);
|
|
1511
|
+
ca_iter_state_finish(&st_out);
|
|
1512
|
+
return vout;
|
|
1513
|
+
}
|
|
1514
|
+
|
|
1515
|
+
static VALUE
|
|
1516
|
+
exp_ki_native_u8 (VALUE self, CArray *ca)
|
|
1517
|
+
{
|
|
1518
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1519
|
+
INT2NUM(sizeof(double)));
|
|
1520
|
+
CArray *co;
|
|
1521
|
+
GetCArray(vout, co);
|
|
1522
|
+
|
|
1523
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1524
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1525
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1526
|
+
K-D-walkable form. */
|
|
1527
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1528
|
+
int8_t naxes = ca->ndim;
|
|
1529
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1530
|
+
|
|
1531
|
+
ca_iter_state st_in, st_out;
|
|
1532
|
+
int rc;
|
|
1533
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1534
|
+
slab_axes, naxes, 0);
|
|
1535
|
+
if ( rc != CA_ITER_OK ) {
|
|
1536
|
+
rb_raise(rb_eRuntimeError,
|
|
1537
|
+
"exp_ki: input init failed rc=%d", rc);
|
|
1538
|
+
}
|
|
1539
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1540
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1541
|
+
if ( rc != CA_ITER_OK ) {
|
|
1542
|
+
ca_iter_state_finish(&st_in);
|
|
1543
|
+
rb_raise(rb_eRuntimeError,
|
|
1544
|
+
"exp_ki: output init failed rc=%d", rc);
|
|
1545
|
+
}
|
|
1546
|
+
|
|
1547
|
+
char *pi, *po;
|
|
1548
|
+
boolean8_t *mi, *mo;
|
|
1549
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1550
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1551
|
+
CA_SLAB_MAP_T(uint8_t, double, st_in, pi, st_out, po, r = exp((double) v));
|
|
1552
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1553
|
+
}
|
|
1554
|
+
ca_iter_state_finish(&st_in);
|
|
1555
|
+
ca_iter_state_finish(&st_out);
|
|
1556
|
+
return vout;
|
|
1557
|
+
}
|
|
1558
|
+
|
|
1559
|
+
static VALUE
|
|
1560
|
+
exp_ki_native_i16 (VALUE self, CArray *ca)
|
|
1561
|
+
{
|
|
1562
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1563
|
+
INT2NUM(sizeof(double)));
|
|
1564
|
+
CArray *co;
|
|
1565
|
+
GetCArray(vout, co);
|
|
1566
|
+
|
|
1567
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1568
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1569
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1570
|
+
K-D-walkable form. */
|
|
1571
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1572
|
+
int8_t naxes = ca->ndim;
|
|
1573
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1574
|
+
|
|
1575
|
+
ca_iter_state st_in, st_out;
|
|
1576
|
+
int rc;
|
|
1577
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1578
|
+
slab_axes, naxes, 0);
|
|
1579
|
+
if ( rc != CA_ITER_OK ) {
|
|
1580
|
+
rb_raise(rb_eRuntimeError,
|
|
1581
|
+
"exp_ki: input init failed rc=%d", rc);
|
|
1582
|
+
}
|
|
1583
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1584
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1585
|
+
if ( rc != CA_ITER_OK ) {
|
|
1586
|
+
ca_iter_state_finish(&st_in);
|
|
1587
|
+
rb_raise(rb_eRuntimeError,
|
|
1588
|
+
"exp_ki: output init failed rc=%d", rc);
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1591
|
+
char *pi, *po;
|
|
1592
|
+
boolean8_t *mi, *mo;
|
|
1593
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1594
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1595
|
+
CA_SLAB_MAP_T(int16_t, double, st_in, pi, st_out, po, r = exp((double) v));
|
|
1596
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1597
|
+
}
|
|
1598
|
+
ca_iter_state_finish(&st_in);
|
|
1599
|
+
ca_iter_state_finish(&st_out);
|
|
1600
|
+
return vout;
|
|
1601
|
+
}
|
|
1602
|
+
|
|
1603
|
+
static VALUE
|
|
1604
|
+
exp_ki_native_u16 (VALUE self, CArray *ca)
|
|
1605
|
+
{
|
|
1606
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1607
|
+
INT2NUM(sizeof(double)));
|
|
1608
|
+
CArray *co;
|
|
1609
|
+
GetCArray(vout, co);
|
|
1610
|
+
|
|
1611
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1612
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1613
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1614
|
+
K-D-walkable form. */
|
|
1615
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1616
|
+
int8_t naxes = ca->ndim;
|
|
1617
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1618
|
+
|
|
1619
|
+
ca_iter_state st_in, st_out;
|
|
1620
|
+
int rc;
|
|
1621
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1622
|
+
slab_axes, naxes, 0);
|
|
1623
|
+
if ( rc != CA_ITER_OK ) {
|
|
1624
|
+
rb_raise(rb_eRuntimeError,
|
|
1625
|
+
"exp_ki: input init failed rc=%d", rc);
|
|
1626
|
+
}
|
|
1627
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1628
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1629
|
+
if ( rc != CA_ITER_OK ) {
|
|
1630
|
+
ca_iter_state_finish(&st_in);
|
|
1631
|
+
rb_raise(rb_eRuntimeError,
|
|
1632
|
+
"exp_ki: output init failed rc=%d", rc);
|
|
1633
|
+
}
|
|
1634
|
+
|
|
1635
|
+
char *pi, *po;
|
|
1636
|
+
boolean8_t *mi, *mo;
|
|
1637
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1638
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1639
|
+
CA_SLAB_MAP_T(uint16_t, double, st_in, pi, st_out, po, r = exp((double) v));
|
|
1640
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1641
|
+
}
|
|
1642
|
+
ca_iter_state_finish(&st_in);
|
|
1643
|
+
ca_iter_state_finish(&st_out);
|
|
1644
|
+
return vout;
|
|
1645
|
+
}
|
|
1646
|
+
|
|
1647
|
+
static VALUE
|
|
1648
|
+
exp_ki_native_i32 (VALUE self, CArray *ca)
|
|
1649
|
+
{
|
|
1650
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1651
|
+
INT2NUM(sizeof(double)));
|
|
1652
|
+
CArray *co;
|
|
1653
|
+
GetCArray(vout, co);
|
|
1654
|
+
|
|
1655
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1656
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1657
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1658
|
+
K-D-walkable form. */
|
|
1659
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1660
|
+
int8_t naxes = ca->ndim;
|
|
1661
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1662
|
+
|
|
1663
|
+
ca_iter_state st_in, st_out;
|
|
1664
|
+
int rc;
|
|
1665
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1666
|
+
slab_axes, naxes, 0);
|
|
1667
|
+
if ( rc != CA_ITER_OK ) {
|
|
1668
|
+
rb_raise(rb_eRuntimeError,
|
|
1669
|
+
"exp_ki: input init failed rc=%d", rc);
|
|
1670
|
+
}
|
|
1671
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1672
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1673
|
+
if ( rc != CA_ITER_OK ) {
|
|
1674
|
+
ca_iter_state_finish(&st_in);
|
|
1675
|
+
rb_raise(rb_eRuntimeError,
|
|
1676
|
+
"exp_ki: output init failed rc=%d", rc);
|
|
1677
|
+
}
|
|
1678
|
+
|
|
1679
|
+
char *pi, *po;
|
|
1680
|
+
boolean8_t *mi, *mo;
|
|
1681
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1682
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1683
|
+
CA_SLAB_MAP_T(int32_t, double, st_in, pi, st_out, po, r = exp((double) v));
|
|
1684
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1685
|
+
}
|
|
1686
|
+
ca_iter_state_finish(&st_in);
|
|
1687
|
+
ca_iter_state_finish(&st_out);
|
|
1688
|
+
return vout;
|
|
1689
|
+
}
|
|
1690
|
+
|
|
1691
|
+
static VALUE
|
|
1692
|
+
exp_ki_native_u32 (VALUE self, CArray *ca)
|
|
1693
|
+
{
|
|
1694
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1695
|
+
INT2NUM(sizeof(double)));
|
|
1696
|
+
CArray *co;
|
|
1697
|
+
GetCArray(vout, co);
|
|
1698
|
+
|
|
1699
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1700
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1701
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1702
|
+
K-D-walkable form. */
|
|
1703
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1704
|
+
int8_t naxes = ca->ndim;
|
|
1705
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1706
|
+
|
|
1707
|
+
ca_iter_state st_in, st_out;
|
|
1708
|
+
int rc;
|
|
1709
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1710
|
+
slab_axes, naxes, 0);
|
|
1711
|
+
if ( rc != CA_ITER_OK ) {
|
|
1712
|
+
rb_raise(rb_eRuntimeError,
|
|
1713
|
+
"exp_ki: input init failed rc=%d", rc);
|
|
1714
|
+
}
|
|
1715
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1716
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1717
|
+
if ( rc != CA_ITER_OK ) {
|
|
1718
|
+
ca_iter_state_finish(&st_in);
|
|
1719
|
+
rb_raise(rb_eRuntimeError,
|
|
1720
|
+
"exp_ki: output init failed rc=%d", rc);
|
|
1721
|
+
}
|
|
1722
|
+
|
|
1723
|
+
char *pi, *po;
|
|
1724
|
+
boolean8_t *mi, *mo;
|
|
1725
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1726
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1727
|
+
CA_SLAB_MAP_T(uint32_t, double, st_in, pi, st_out, po, r = exp((double) v));
|
|
1728
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1729
|
+
}
|
|
1730
|
+
ca_iter_state_finish(&st_in);
|
|
1731
|
+
ca_iter_state_finish(&st_out);
|
|
1732
|
+
return vout;
|
|
1733
|
+
}
|
|
1734
|
+
|
|
1735
|
+
static VALUE
|
|
1736
|
+
exp_ki_native_i64 (VALUE self, CArray *ca)
|
|
1737
|
+
{
|
|
1738
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1739
|
+
INT2NUM(sizeof(double)));
|
|
1740
|
+
CArray *co;
|
|
1741
|
+
GetCArray(vout, co);
|
|
1742
|
+
|
|
1743
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1744
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1745
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1746
|
+
K-D-walkable form. */
|
|
1747
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1748
|
+
int8_t naxes = ca->ndim;
|
|
1749
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1750
|
+
|
|
1751
|
+
ca_iter_state st_in, st_out;
|
|
1752
|
+
int rc;
|
|
1753
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1754
|
+
slab_axes, naxes, 0);
|
|
1755
|
+
if ( rc != CA_ITER_OK ) {
|
|
1756
|
+
rb_raise(rb_eRuntimeError,
|
|
1757
|
+
"exp_ki: input init failed rc=%d", rc);
|
|
1758
|
+
}
|
|
1759
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1760
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1761
|
+
if ( rc != CA_ITER_OK ) {
|
|
1762
|
+
ca_iter_state_finish(&st_in);
|
|
1763
|
+
rb_raise(rb_eRuntimeError,
|
|
1764
|
+
"exp_ki: output init failed rc=%d", rc);
|
|
1765
|
+
}
|
|
1766
|
+
|
|
1767
|
+
char *pi, *po;
|
|
1768
|
+
boolean8_t *mi, *mo;
|
|
1769
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1770
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1771
|
+
CA_SLAB_MAP_T(int64_t, double, st_in, pi, st_out, po, r = exp((double) v));
|
|
1772
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1773
|
+
}
|
|
1774
|
+
ca_iter_state_finish(&st_in);
|
|
1775
|
+
ca_iter_state_finish(&st_out);
|
|
1776
|
+
return vout;
|
|
1777
|
+
}
|
|
1778
|
+
|
|
1779
|
+
static VALUE
|
|
1780
|
+
exp_ki_native_u64 (VALUE self, CArray *ca)
|
|
1781
|
+
{
|
|
1782
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1783
|
+
INT2NUM(sizeof(double)));
|
|
1784
|
+
CArray *co;
|
|
1785
|
+
GetCArray(vout, co);
|
|
1786
|
+
|
|
1787
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1788
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1789
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1790
|
+
K-D-walkable form. */
|
|
1791
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1792
|
+
int8_t naxes = ca->ndim;
|
|
1793
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1794
|
+
|
|
1795
|
+
ca_iter_state st_in, st_out;
|
|
1796
|
+
int rc;
|
|
1797
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1798
|
+
slab_axes, naxes, 0);
|
|
1799
|
+
if ( rc != CA_ITER_OK ) {
|
|
1800
|
+
rb_raise(rb_eRuntimeError,
|
|
1801
|
+
"exp_ki: input init failed rc=%d", rc);
|
|
1802
|
+
}
|
|
1803
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1804
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1805
|
+
if ( rc != CA_ITER_OK ) {
|
|
1806
|
+
ca_iter_state_finish(&st_in);
|
|
1807
|
+
rb_raise(rb_eRuntimeError,
|
|
1808
|
+
"exp_ki: output init failed rc=%d", rc);
|
|
1809
|
+
}
|
|
1810
|
+
|
|
1811
|
+
char *pi, *po;
|
|
1812
|
+
boolean8_t *mi, *mo;
|
|
1813
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1814
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1815
|
+
CA_SLAB_MAP_T(uint64_t, double, st_in, pi, st_out, po, r = exp((double) v));
|
|
1816
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1817
|
+
}
|
|
1818
|
+
ca_iter_state_finish(&st_in);
|
|
1819
|
+
ca_iter_state_finish(&st_out);
|
|
1820
|
+
return vout;
|
|
1821
|
+
}
|
|
1822
|
+
|
|
1823
|
+
static VALUE
|
|
1824
|
+
exp_ki_native_f32 (VALUE self, CArray *ca)
|
|
1825
|
+
{
|
|
1826
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1827
|
+
INT2NUM(sizeof(double)));
|
|
1828
|
+
CArray *co;
|
|
1829
|
+
GetCArray(vout, co);
|
|
1830
|
+
|
|
1831
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1832
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1833
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1834
|
+
K-D-walkable form. */
|
|
1835
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1836
|
+
int8_t naxes = ca->ndim;
|
|
1837
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1838
|
+
|
|
1839
|
+
ca_iter_state st_in, st_out;
|
|
1840
|
+
int rc;
|
|
1841
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1842
|
+
slab_axes, naxes, 0);
|
|
1843
|
+
if ( rc != CA_ITER_OK ) {
|
|
1844
|
+
rb_raise(rb_eRuntimeError,
|
|
1845
|
+
"exp_ki: input init failed rc=%d", rc);
|
|
1846
|
+
}
|
|
1847
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1848
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1849
|
+
if ( rc != CA_ITER_OK ) {
|
|
1850
|
+
ca_iter_state_finish(&st_in);
|
|
1851
|
+
rb_raise(rb_eRuntimeError,
|
|
1852
|
+
"exp_ki: output init failed rc=%d", rc);
|
|
1853
|
+
}
|
|
1854
|
+
|
|
1855
|
+
char *pi, *po;
|
|
1856
|
+
boolean8_t *mi, *mo;
|
|
1857
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1858
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1859
|
+
CA_SLAB_MAP_T(float, double, st_in, pi, st_out, po, r = exp((double) v));
|
|
1860
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1861
|
+
}
|
|
1862
|
+
ca_iter_state_finish(&st_in);
|
|
1863
|
+
ca_iter_state_finish(&st_out);
|
|
1864
|
+
return vout;
|
|
1865
|
+
}
|
|
1866
|
+
|
|
1867
|
+
static VALUE
|
|
1868
|
+
exp_ki_native_f64 (VALUE self, CArray *ca)
|
|
1869
|
+
{
|
|
1870
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1871
|
+
INT2NUM(sizeof(double)));
|
|
1872
|
+
CArray *co;
|
|
1873
|
+
GetCArray(vout, co);
|
|
1874
|
+
|
|
1875
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1876
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1877
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1878
|
+
K-D-walkable form. */
|
|
1879
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1880
|
+
int8_t naxes = ca->ndim;
|
|
1881
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1882
|
+
|
|
1883
|
+
ca_iter_state st_in, st_out;
|
|
1884
|
+
int rc;
|
|
1885
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1886
|
+
slab_axes, naxes, 0);
|
|
1887
|
+
if ( rc != CA_ITER_OK ) {
|
|
1888
|
+
rb_raise(rb_eRuntimeError,
|
|
1889
|
+
"exp_ki: input init failed rc=%d", rc);
|
|
1890
|
+
}
|
|
1891
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1892
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1893
|
+
if ( rc != CA_ITER_OK ) {
|
|
1894
|
+
ca_iter_state_finish(&st_in);
|
|
1895
|
+
rb_raise(rb_eRuntimeError,
|
|
1896
|
+
"exp_ki: output init failed rc=%d", rc);
|
|
1897
|
+
}
|
|
1898
|
+
|
|
1899
|
+
char *pi, *po;
|
|
1900
|
+
boolean8_t *mi, *mo;
|
|
1901
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1902
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1903
|
+
CA_SLAB_MAP_T(double, double, st_in, pi, st_out, po, r = exp((double) v));
|
|
1904
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1905
|
+
}
|
|
1906
|
+
ca_iter_state_finish(&st_in);
|
|
1907
|
+
ca_iter_state_finish(&st_out);
|
|
1908
|
+
return vout;
|
|
1909
|
+
}
|
|
1910
|
+
|
|
1911
|
+
static VALUE
|
|
1912
|
+
rb_ca_exp_ki (VALUE self)
|
|
1913
|
+
{
|
|
1914
|
+
CArray *src;
|
|
1915
|
+
GetCArray(self, src);
|
|
1916
|
+
switch ( src->data_type ) {
|
|
1917
|
+
case CA_INT8: return exp_ki_native_i8(self, src);
|
|
1918
|
+
case CA_UINT8: return exp_ki_native_u8(self, src);
|
|
1919
|
+
case CA_INT16: return exp_ki_native_i16(self, src);
|
|
1920
|
+
case CA_UINT16: return exp_ki_native_u16(self, src);
|
|
1921
|
+
case CA_INT32: return exp_ki_native_i32(self, src);
|
|
1922
|
+
case CA_UINT32: return exp_ki_native_u32(self, src);
|
|
1923
|
+
case CA_INT64: return exp_ki_native_i64(self, src);
|
|
1924
|
+
case CA_UINT64: return exp_ki_native_u64(self, src);
|
|
1925
|
+
case CA_FLOAT32: return exp_ki_native_f32(self, src);
|
|
1926
|
+
case CA_FLOAT64: return exp_ki_native_f64(self, src);
|
|
1927
|
+
default: {
|
|
1928
|
+
/* Phase E: only wrap data_types that have a meaningful float64
|
|
1929
|
+
representation. Complex / fixlen / object would lose
|
|
1930
|
+
structure (e.g. complex -> float strips imaginary part)
|
|
1931
|
+
so reject explicitly, matching legacy DataTypeError. */
|
|
1932
|
+
switch ( src->data_type ) {
|
|
1933
|
+
case CA_BOOLEAN: break; /* wrap: count-of-trues semantic */
|
|
1934
|
+
default:
|
|
1935
|
+
rb_raise(rb_eCADataTypeError, "exp_ki: source data_type :%s not supported (expected one of: i8, u8, i16, u16, i32, u32, i64, u64, f32, f64, or boolean)", ca_type_name[src->data_type]);
|
|
1936
|
+
}
|
|
1937
|
+
VALUE vsrc = rb_ca_wrap_readonly(self, INT2NUM(CA_FLOAT64));
|
|
1938
|
+
CArray *casted;
|
|
1939
|
+
GetCArray(vsrc, casted);
|
|
1940
|
+
return exp_ki_native_f64(vsrc, casted);
|
|
1941
|
+
}
|
|
1942
|
+
}
|
|
1943
|
+
return Qnil; /* unreachable */
|
|
1944
|
+
}
|
|
1945
|
+
|
|
1946
|
+
/* ===== log_ki ============================================ */
|
|
1947
|
+
|
|
1948
|
+
static VALUE
|
|
1949
|
+
log_ki_native_i8 (VALUE self, CArray *ca)
|
|
1950
|
+
{
|
|
1951
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1952
|
+
INT2NUM(sizeof(double)));
|
|
1953
|
+
CArray *co;
|
|
1954
|
+
GetCArray(vout, co);
|
|
1955
|
+
|
|
1956
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
1957
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
1958
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
1959
|
+
K-D-walkable form. */
|
|
1960
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
1961
|
+
int8_t naxes = ca->ndim;
|
|
1962
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
1963
|
+
|
|
1964
|
+
ca_iter_state st_in, st_out;
|
|
1965
|
+
int rc;
|
|
1966
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
1967
|
+
slab_axes, naxes, 0);
|
|
1968
|
+
if ( rc != CA_ITER_OK ) {
|
|
1969
|
+
rb_raise(rb_eRuntimeError,
|
|
1970
|
+
"log_ki: input init failed rc=%d", rc);
|
|
1971
|
+
}
|
|
1972
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
1973
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
1974
|
+
if ( rc != CA_ITER_OK ) {
|
|
1975
|
+
ca_iter_state_finish(&st_in);
|
|
1976
|
+
rb_raise(rb_eRuntimeError,
|
|
1977
|
+
"log_ki: output init failed rc=%d", rc);
|
|
1978
|
+
}
|
|
1979
|
+
|
|
1980
|
+
char *pi, *po;
|
|
1981
|
+
boolean8_t *mi, *mo;
|
|
1982
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
1983
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
1984
|
+
CA_SLAB_MAP_T(int8_t, double, st_in, pi, st_out, po, r = log((double) v));
|
|
1985
|
+
ca_iter_state_sync_slab(&st_out);
|
|
1986
|
+
}
|
|
1987
|
+
ca_iter_state_finish(&st_in);
|
|
1988
|
+
ca_iter_state_finish(&st_out);
|
|
1989
|
+
return vout;
|
|
1990
|
+
}
|
|
1991
|
+
|
|
1992
|
+
static VALUE
|
|
1993
|
+
log_ki_native_u8 (VALUE self, CArray *ca)
|
|
1994
|
+
{
|
|
1995
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
1996
|
+
INT2NUM(sizeof(double)));
|
|
1997
|
+
CArray *co;
|
|
1998
|
+
GetCArray(vout, co);
|
|
1999
|
+
|
|
2000
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2001
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2002
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2003
|
+
K-D-walkable form. */
|
|
2004
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2005
|
+
int8_t naxes = ca->ndim;
|
|
2006
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2007
|
+
|
|
2008
|
+
ca_iter_state st_in, st_out;
|
|
2009
|
+
int rc;
|
|
2010
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2011
|
+
slab_axes, naxes, 0);
|
|
2012
|
+
if ( rc != CA_ITER_OK ) {
|
|
2013
|
+
rb_raise(rb_eRuntimeError,
|
|
2014
|
+
"log_ki: input init failed rc=%d", rc);
|
|
2015
|
+
}
|
|
2016
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2017
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2018
|
+
if ( rc != CA_ITER_OK ) {
|
|
2019
|
+
ca_iter_state_finish(&st_in);
|
|
2020
|
+
rb_raise(rb_eRuntimeError,
|
|
2021
|
+
"log_ki: output init failed rc=%d", rc);
|
|
2022
|
+
}
|
|
2023
|
+
|
|
2024
|
+
char *pi, *po;
|
|
2025
|
+
boolean8_t *mi, *mo;
|
|
2026
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2027
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2028
|
+
CA_SLAB_MAP_T(uint8_t, double, st_in, pi, st_out, po, r = log((double) v));
|
|
2029
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2030
|
+
}
|
|
2031
|
+
ca_iter_state_finish(&st_in);
|
|
2032
|
+
ca_iter_state_finish(&st_out);
|
|
2033
|
+
return vout;
|
|
2034
|
+
}
|
|
2035
|
+
|
|
2036
|
+
static VALUE
|
|
2037
|
+
log_ki_native_i16 (VALUE self, CArray *ca)
|
|
2038
|
+
{
|
|
2039
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
2040
|
+
INT2NUM(sizeof(double)));
|
|
2041
|
+
CArray *co;
|
|
2042
|
+
GetCArray(vout, co);
|
|
2043
|
+
|
|
2044
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2045
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2046
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2047
|
+
K-D-walkable form. */
|
|
2048
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2049
|
+
int8_t naxes = ca->ndim;
|
|
2050
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2051
|
+
|
|
2052
|
+
ca_iter_state st_in, st_out;
|
|
2053
|
+
int rc;
|
|
2054
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2055
|
+
slab_axes, naxes, 0);
|
|
2056
|
+
if ( rc != CA_ITER_OK ) {
|
|
2057
|
+
rb_raise(rb_eRuntimeError,
|
|
2058
|
+
"log_ki: input init failed rc=%d", rc);
|
|
2059
|
+
}
|
|
2060
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2061
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2062
|
+
if ( rc != CA_ITER_OK ) {
|
|
2063
|
+
ca_iter_state_finish(&st_in);
|
|
2064
|
+
rb_raise(rb_eRuntimeError,
|
|
2065
|
+
"log_ki: output init failed rc=%d", rc);
|
|
2066
|
+
}
|
|
2067
|
+
|
|
2068
|
+
char *pi, *po;
|
|
2069
|
+
boolean8_t *mi, *mo;
|
|
2070
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2071
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2072
|
+
CA_SLAB_MAP_T(int16_t, double, st_in, pi, st_out, po, r = log((double) v));
|
|
2073
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2074
|
+
}
|
|
2075
|
+
ca_iter_state_finish(&st_in);
|
|
2076
|
+
ca_iter_state_finish(&st_out);
|
|
2077
|
+
return vout;
|
|
2078
|
+
}
|
|
2079
|
+
|
|
2080
|
+
static VALUE
|
|
2081
|
+
log_ki_native_u16 (VALUE self, CArray *ca)
|
|
2082
|
+
{
|
|
2083
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
2084
|
+
INT2NUM(sizeof(double)));
|
|
2085
|
+
CArray *co;
|
|
2086
|
+
GetCArray(vout, co);
|
|
2087
|
+
|
|
2088
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2089
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2090
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2091
|
+
K-D-walkable form. */
|
|
2092
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2093
|
+
int8_t naxes = ca->ndim;
|
|
2094
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2095
|
+
|
|
2096
|
+
ca_iter_state st_in, st_out;
|
|
2097
|
+
int rc;
|
|
2098
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2099
|
+
slab_axes, naxes, 0);
|
|
2100
|
+
if ( rc != CA_ITER_OK ) {
|
|
2101
|
+
rb_raise(rb_eRuntimeError,
|
|
2102
|
+
"log_ki: input init failed rc=%d", rc);
|
|
2103
|
+
}
|
|
2104
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2105
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2106
|
+
if ( rc != CA_ITER_OK ) {
|
|
2107
|
+
ca_iter_state_finish(&st_in);
|
|
2108
|
+
rb_raise(rb_eRuntimeError,
|
|
2109
|
+
"log_ki: output init failed rc=%d", rc);
|
|
2110
|
+
}
|
|
2111
|
+
|
|
2112
|
+
char *pi, *po;
|
|
2113
|
+
boolean8_t *mi, *mo;
|
|
2114
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2115
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2116
|
+
CA_SLAB_MAP_T(uint16_t, double, st_in, pi, st_out, po, r = log((double) v));
|
|
2117
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2118
|
+
}
|
|
2119
|
+
ca_iter_state_finish(&st_in);
|
|
2120
|
+
ca_iter_state_finish(&st_out);
|
|
2121
|
+
return vout;
|
|
2122
|
+
}
|
|
2123
|
+
|
|
2124
|
+
static VALUE
|
|
2125
|
+
log_ki_native_i32 (VALUE self, CArray *ca)
|
|
2126
|
+
{
|
|
2127
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
2128
|
+
INT2NUM(sizeof(double)));
|
|
2129
|
+
CArray *co;
|
|
2130
|
+
GetCArray(vout, co);
|
|
2131
|
+
|
|
2132
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2133
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2134
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2135
|
+
K-D-walkable form. */
|
|
2136
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2137
|
+
int8_t naxes = ca->ndim;
|
|
2138
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2139
|
+
|
|
2140
|
+
ca_iter_state st_in, st_out;
|
|
2141
|
+
int rc;
|
|
2142
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2143
|
+
slab_axes, naxes, 0);
|
|
2144
|
+
if ( rc != CA_ITER_OK ) {
|
|
2145
|
+
rb_raise(rb_eRuntimeError,
|
|
2146
|
+
"log_ki: input init failed rc=%d", rc);
|
|
2147
|
+
}
|
|
2148
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2149
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2150
|
+
if ( rc != CA_ITER_OK ) {
|
|
2151
|
+
ca_iter_state_finish(&st_in);
|
|
2152
|
+
rb_raise(rb_eRuntimeError,
|
|
2153
|
+
"log_ki: output init failed rc=%d", rc);
|
|
2154
|
+
}
|
|
2155
|
+
|
|
2156
|
+
char *pi, *po;
|
|
2157
|
+
boolean8_t *mi, *mo;
|
|
2158
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2159
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2160
|
+
CA_SLAB_MAP_T(int32_t, double, st_in, pi, st_out, po, r = log((double) v));
|
|
2161
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2162
|
+
}
|
|
2163
|
+
ca_iter_state_finish(&st_in);
|
|
2164
|
+
ca_iter_state_finish(&st_out);
|
|
2165
|
+
return vout;
|
|
2166
|
+
}
|
|
2167
|
+
|
|
2168
|
+
static VALUE
|
|
2169
|
+
log_ki_native_u32 (VALUE self, CArray *ca)
|
|
2170
|
+
{
|
|
2171
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
2172
|
+
INT2NUM(sizeof(double)));
|
|
2173
|
+
CArray *co;
|
|
2174
|
+
GetCArray(vout, co);
|
|
2175
|
+
|
|
2176
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2177
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2178
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2179
|
+
K-D-walkable form. */
|
|
2180
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2181
|
+
int8_t naxes = ca->ndim;
|
|
2182
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2183
|
+
|
|
2184
|
+
ca_iter_state st_in, st_out;
|
|
2185
|
+
int rc;
|
|
2186
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2187
|
+
slab_axes, naxes, 0);
|
|
2188
|
+
if ( rc != CA_ITER_OK ) {
|
|
2189
|
+
rb_raise(rb_eRuntimeError,
|
|
2190
|
+
"log_ki: input init failed rc=%d", rc);
|
|
2191
|
+
}
|
|
2192
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2193
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2194
|
+
if ( rc != CA_ITER_OK ) {
|
|
2195
|
+
ca_iter_state_finish(&st_in);
|
|
2196
|
+
rb_raise(rb_eRuntimeError,
|
|
2197
|
+
"log_ki: output init failed rc=%d", rc);
|
|
2198
|
+
}
|
|
2199
|
+
|
|
2200
|
+
char *pi, *po;
|
|
2201
|
+
boolean8_t *mi, *mo;
|
|
2202
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2203
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2204
|
+
CA_SLAB_MAP_T(uint32_t, double, st_in, pi, st_out, po, r = log((double) v));
|
|
2205
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2206
|
+
}
|
|
2207
|
+
ca_iter_state_finish(&st_in);
|
|
2208
|
+
ca_iter_state_finish(&st_out);
|
|
2209
|
+
return vout;
|
|
2210
|
+
}
|
|
2211
|
+
|
|
2212
|
+
static VALUE
|
|
2213
|
+
log_ki_native_i64 (VALUE self, CArray *ca)
|
|
2214
|
+
{
|
|
2215
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
2216
|
+
INT2NUM(sizeof(double)));
|
|
2217
|
+
CArray *co;
|
|
2218
|
+
GetCArray(vout, co);
|
|
2219
|
+
|
|
2220
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2221
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2222
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2223
|
+
K-D-walkable form. */
|
|
2224
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2225
|
+
int8_t naxes = ca->ndim;
|
|
2226
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2227
|
+
|
|
2228
|
+
ca_iter_state st_in, st_out;
|
|
2229
|
+
int rc;
|
|
2230
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2231
|
+
slab_axes, naxes, 0);
|
|
2232
|
+
if ( rc != CA_ITER_OK ) {
|
|
2233
|
+
rb_raise(rb_eRuntimeError,
|
|
2234
|
+
"log_ki: input init failed rc=%d", rc);
|
|
2235
|
+
}
|
|
2236
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2237
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2238
|
+
if ( rc != CA_ITER_OK ) {
|
|
2239
|
+
ca_iter_state_finish(&st_in);
|
|
2240
|
+
rb_raise(rb_eRuntimeError,
|
|
2241
|
+
"log_ki: output init failed rc=%d", rc);
|
|
2242
|
+
}
|
|
2243
|
+
|
|
2244
|
+
char *pi, *po;
|
|
2245
|
+
boolean8_t *mi, *mo;
|
|
2246
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2247
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2248
|
+
CA_SLAB_MAP_T(int64_t, double, st_in, pi, st_out, po, r = log((double) v));
|
|
2249
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2250
|
+
}
|
|
2251
|
+
ca_iter_state_finish(&st_in);
|
|
2252
|
+
ca_iter_state_finish(&st_out);
|
|
2253
|
+
return vout;
|
|
2254
|
+
}
|
|
2255
|
+
|
|
2256
|
+
static VALUE
|
|
2257
|
+
log_ki_native_u64 (VALUE self, CArray *ca)
|
|
2258
|
+
{
|
|
2259
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
2260
|
+
INT2NUM(sizeof(double)));
|
|
2261
|
+
CArray *co;
|
|
2262
|
+
GetCArray(vout, co);
|
|
2263
|
+
|
|
2264
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2265
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2266
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2267
|
+
K-D-walkable form. */
|
|
2268
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2269
|
+
int8_t naxes = ca->ndim;
|
|
2270
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2271
|
+
|
|
2272
|
+
ca_iter_state st_in, st_out;
|
|
2273
|
+
int rc;
|
|
2274
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2275
|
+
slab_axes, naxes, 0);
|
|
2276
|
+
if ( rc != CA_ITER_OK ) {
|
|
2277
|
+
rb_raise(rb_eRuntimeError,
|
|
2278
|
+
"log_ki: input init failed rc=%d", rc);
|
|
2279
|
+
}
|
|
2280
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2281
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2282
|
+
if ( rc != CA_ITER_OK ) {
|
|
2283
|
+
ca_iter_state_finish(&st_in);
|
|
2284
|
+
rb_raise(rb_eRuntimeError,
|
|
2285
|
+
"log_ki: output init failed rc=%d", rc);
|
|
2286
|
+
}
|
|
2287
|
+
|
|
2288
|
+
char *pi, *po;
|
|
2289
|
+
boolean8_t *mi, *mo;
|
|
2290
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2291
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2292
|
+
CA_SLAB_MAP_T(uint64_t, double, st_in, pi, st_out, po, r = log((double) v));
|
|
2293
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2294
|
+
}
|
|
2295
|
+
ca_iter_state_finish(&st_in);
|
|
2296
|
+
ca_iter_state_finish(&st_out);
|
|
2297
|
+
return vout;
|
|
2298
|
+
}
|
|
2299
|
+
|
|
2300
|
+
static VALUE
|
|
2301
|
+
log_ki_native_f32 (VALUE self, CArray *ca)
|
|
2302
|
+
{
|
|
2303
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
2304
|
+
INT2NUM(sizeof(double)));
|
|
2305
|
+
CArray *co;
|
|
2306
|
+
GetCArray(vout, co);
|
|
2307
|
+
|
|
2308
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2309
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2310
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2311
|
+
K-D-walkable form. */
|
|
2312
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2313
|
+
int8_t naxes = ca->ndim;
|
|
2314
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2315
|
+
|
|
2316
|
+
ca_iter_state st_in, st_out;
|
|
2317
|
+
int rc;
|
|
2318
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2319
|
+
slab_axes, naxes, 0);
|
|
2320
|
+
if ( rc != CA_ITER_OK ) {
|
|
2321
|
+
rb_raise(rb_eRuntimeError,
|
|
2322
|
+
"log_ki: input init failed rc=%d", rc);
|
|
2323
|
+
}
|
|
2324
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2325
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2326
|
+
if ( rc != CA_ITER_OK ) {
|
|
2327
|
+
ca_iter_state_finish(&st_in);
|
|
2328
|
+
rb_raise(rb_eRuntimeError,
|
|
2329
|
+
"log_ki: output init failed rc=%d", rc);
|
|
2330
|
+
}
|
|
2331
|
+
|
|
2332
|
+
char *pi, *po;
|
|
2333
|
+
boolean8_t *mi, *mo;
|
|
2334
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2335
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2336
|
+
CA_SLAB_MAP_T(float, double, st_in, pi, st_out, po, r = log((double) v));
|
|
2337
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2338
|
+
}
|
|
2339
|
+
ca_iter_state_finish(&st_in);
|
|
2340
|
+
ca_iter_state_finish(&st_out);
|
|
2341
|
+
return vout;
|
|
2342
|
+
}
|
|
2343
|
+
|
|
2344
|
+
static VALUE
|
|
2345
|
+
log_ki_native_f64 (VALUE self, CArray *ca)
|
|
2346
|
+
{
|
|
2347
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
2348
|
+
INT2NUM(sizeof(double)));
|
|
2349
|
+
CArray *co;
|
|
2350
|
+
GetCArray(vout, co);
|
|
2351
|
+
|
|
2352
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2353
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2354
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2355
|
+
K-D-walkable form. */
|
|
2356
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2357
|
+
int8_t naxes = ca->ndim;
|
|
2358
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2359
|
+
|
|
2360
|
+
ca_iter_state st_in, st_out;
|
|
2361
|
+
int rc;
|
|
2362
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2363
|
+
slab_axes, naxes, 0);
|
|
2364
|
+
if ( rc != CA_ITER_OK ) {
|
|
2365
|
+
rb_raise(rb_eRuntimeError,
|
|
2366
|
+
"log_ki: input init failed rc=%d", rc);
|
|
2367
|
+
}
|
|
2368
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2369
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2370
|
+
if ( rc != CA_ITER_OK ) {
|
|
2371
|
+
ca_iter_state_finish(&st_in);
|
|
2372
|
+
rb_raise(rb_eRuntimeError,
|
|
2373
|
+
"log_ki: output init failed rc=%d", rc);
|
|
2374
|
+
}
|
|
2375
|
+
|
|
2376
|
+
char *pi, *po;
|
|
2377
|
+
boolean8_t *mi, *mo;
|
|
2378
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2379
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2380
|
+
CA_SLAB_MAP_T(double, double, st_in, pi, st_out, po, r = log((double) v));
|
|
2381
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2382
|
+
}
|
|
2383
|
+
ca_iter_state_finish(&st_in);
|
|
2384
|
+
ca_iter_state_finish(&st_out);
|
|
2385
|
+
return vout;
|
|
2386
|
+
}
|
|
2387
|
+
|
|
2388
|
+
static VALUE
|
|
2389
|
+
rb_ca_log_ki (VALUE self)
|
|
2390
|
+
{
|
|
2391
|
+
CArray *src;
|
|
2392
|
+
GetCArray(self, src);
|
|
2393
|
+
switch ( src->data_type ) {
|
|
2394
|
+
case CA_INT8: return log_ki_native_i8(self, src);
|
|
2395
|
+
case CA_UINT8: return log_ki_native_u8(self, src);
|
|
2396
|
+
case CA_INT16: return log_ki_native_i16(self, src);
|
|
2397
|
+
case CA_UINT16: return log_ki_native_u16(self, src);
|
|
2398
|
+
case CA_INT32: return log_ki_native_i32(self, src);
|
|
2399
|
+
case CA_UINT32: return log_ki_native_u32(self, src);
|
|
2400
|
+
case CA_INT64: return log_ki_native_i64(self, src);
|
|
2401
|
+
case CA_UINT64: return log_ki_native_u64(self, src);
|
|
2402
|
+
case CA_FLOAT32: return log_ki_native_f32(self, src);
|
|
2403
|
+
case CA_FLOAT64: return log_ki_native_f64(self, src);
|
|
2404
|
+
default: {
|
|
2405
|
+
/* Phase E: only wrap data_types that have a meaningful float64
|
|
2406
|
+
representation. Complex / fixlen / object would lose
|
|
2407
|
+
structure (e.g. complex -> float strips imaginary part)
|
|
2408
|
+
so reject explicitly, matching legacy DataTypeError. */
|
|
2409
|
+
switch ( src->data_type ) {
|
|
2410
|
+
case CA_BOOLEAN: break; /* wrap: count-of-trues semantic */
|
|
2411
|
+
default:
|
|
2412
|
+
rb_raise(rb_eCADataTypeError, "log_ki: source data_type :%s not supported (expected one of: i8, u8, i16, u16, i32, u32, i64, u64, f32, f64, or boolean)", ca_type_name[src->data_type]);
|
|
2413
|
+
}
|
|
2414
|
+
VALUE vsrc = rb_ca_wrap_readonly(self, INT2NUM(CA_FLOAT64));
|
|
2415
|
+
CArray *casted;
|
|
2416
|
+
GetCArray(vsrc, casted);
|
|
2417
|
+
return log_ki_native_f64(vsrc, casted);
|
|
2418
|
+
}
|
|
2419
|
+
}
|
|
2420
|
+
return Qnil; /* unreachable */
|
|
2421
|
+
}
|
|
2422
|
+
|
|
2423
|
+
/* ===== square_ki ============================================ */
|
|
2424
|
+
|
|
2425
|
+
static VALUE
|
|
2426
|
+
square_ki_native_i8 (VALUE self, CArray *ca)
|
|
2427
|
+
{
|
|
2428
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT8),
|
|
2429
|
+
INT2NUM(sizeof(int8_t)));
|
|
2430
|
+
CArray *co;
|
|
2431
|
+
GetCArray(vout, co);
|
|
2432
|
+
|
|
2433
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2434
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2435
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2436
|
+
K-D-walkable form. */
|
|
2437
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2438
|
+
int8_t naxes = ca->ndim;
|
|
2439
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2440
|
+
|
|
2441
|
+
ca_iter_state st_in, st_out;
|
|
2442
|
+
int rc;
|
|
2443
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2444
|
+
slab_axes, naxes, 0);
|
|
2445
|
+
if ( rc != CA_ITER_OK ) {
|
|
2446
|
+
rb_raise(rb_eRuntimeError,
|
|
2447
|
+
"square_ki: input init failed rc=%d", rc);
|
|
2448
|
+
}
|
|
2449
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2450
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2451
|
+
if ( rc != CA_ITER_OK ) {
|
|
2452
|
+
ca_iter_state_finish(&st_in);
|
|
2453
|
+
rb_raise(rb_eRuntimeError,
|
|
2454
|
+
"square_ki: output init failed rc=%d", rc);
|
|
2455
|
+
}
|
|
2456
|
+
|
|
2457
|
+
char *pi, *po;
|
|
2458
|
+
boolean8_t *mi, *mo;
|
|
2459
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2460
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2461
|
+
CA_SLAB_MAP_T(int8_t, int8_t, st_in, pi, st_out, po, r = v * v);
|
|
2462
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2463
|
+
}
|
|
2464
|
+
ca_iter_state_finish(&st_in);
|
|
2465
|
+
ca_iter_state_finish(&st_out);
|
|
2466
|
+
return vout;
|
|
2467
|
+
}
|
|
2468
|
+
|
|
2469
|
+
static VALUE
|
|
2470
|
+
square_ki_native_u8 (VALUE self, CArray *ca)
|
|
2471
|
+
{
|
|
2472
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_UINT8),
|
|
2473
|
+
INT2NUM(sizeof(uint8_t)));
|
|
2474
|
+
CArray *co;
|
|
2475
|
+
GetCArray(vout, co);
|
|
2476
|
+
|
|
2477
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2478
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2479
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2480
|
+
K-D-walkable form. */
|
|
2481
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2482
|
+
int8_t naxes = ca->ndim;
|
|
2483
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2484
|
+
|
|
2485
|
+
ca_iter_state st_in, st_out;
|
|
2486
|
+
int rc;
|
|
2487
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2488
|
+
slab_axes, naxes, 0);
|
|
2489
|
+
if ( rc != CA_ITER_OK ) {
|
|
2490
|
+
rb_raise(rb_eRuntimeError,
|
|
2491
|
+
"square_ki: input init failed rc=%d", rc);
|
|
2492
|
+
}
|
|
2493
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2494
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2495
|
+
if ( rc != CA_ITER_OK ) {
|
|
2496
|
+
ca_iter_state_finish(&st_in);
|
|
2497
|
+
rb_raise(rb_eRuntimeError,
|
|
2498
|
+
"square_ki: output init failed rc=%d", rc);
|
|
2499
|
+
}
|
|
2500
|
+
|
|
2501
|
+
char *pi, *po;
|
|
2502
|
+
boolean8_t *mi, *mo;
|
|
2503
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2504
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2505
|
+
CA_SLAB_MAP_T(uint8_t, uint8_t, st_in, pi, st_out, po, r = v * v);
|
|
2506
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2507
|
+
}
|
|
2508
|
+
ca_iter_state_finish(&st_in);
|
|
2509
|
+
ca_iter_state_finish(&st_out);
|
|
2510
|
+
return vout;
|
|
2511
|
+
}
|
|
2512
|
+
|
|
2513
|
+
static VALUE
|
|
2514
|
+
square_ki_native_i16 (VALUE self, CArray *ca)
|
|
2515
|
+
{
|
|
2516
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT16),
|
|
2517
|
+
INT2NUM(sizeof(int16_t)));
|
|
2518
|
+
CArray *co;
|
|
2519
|
+
GetCArray(vout, co);
|
|
2520
|
+
|
|
2521
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2522
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2523
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2524
|
+
K-D-walkable form. */
|
|
2525
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2526
|
+
int8_t naxes = ca->ndim;
|
|
2527
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2528
|
+
|
|
2529
|
+
ca_iter_state st_in, st_out;
|
|
2530
|
+
int rc;
|
|
2531
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2532
|
+
slab_axes, naxes, 0);
|
|
2533
|
+
if ( rc != CA_ITER_OK ) {
|
|
2534
|
+
rb_raise(rb_eRuntimeError,
|
|
2535
|
+
"square_ki: input init failed rc=%d", rc);
|
|
2536
|
+
}
|
|
2537
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2538
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2539
|
+
if ( rc != CA_ITER_OK ) {
|
|
2540
|
+
ca_iter_state_finish(&st_in);
|
|
2541
|
+
rb_raise(rb_eRuntimeError,
|
|
2542
|
+
"square_ki: output init failed rc=%d", rc);
|
|
2543
|
+
}
|
|
2544
|
+
|
|
2545
|
+
char *pi, *po;
|
|
2546
|
+
boolean8_t *mi, *mo;
|
|
2547
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2548
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2549
|
+
CA_SLAB_MAP_T(int16_t, int16_t, st_in, pi, st_out, po, r = v * v);
|
|
2550
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2551
|
+
}
|
|
2552
|
+
ca_iter_state_finish(&st_in);
|
|
2553
|
+
ca_iter_state_finish(&st_out);
|
|
2554
|
+
return vout;
|
|
2555
|
+
}
|
|
2556
|
+
|
|
2557
|
+
static VALUE
|
|
2558
|
+
square_ki_native_u16 (VALUE self, CArray *ca)
|
|
2559
|
+
{
|
|
2560
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_UINT16),
|
|
2561
|
+
INT2NUM(sizeof(uint16_t)));
|
|
2562
|
+
CArray *co;
|
|
2563
|
+
GetCArray(vout, co);
|
|
2564
|
+
|
|
2565
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2566
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2567
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2568
|
+
K-D-walkable form. */
|
|
2569
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2570
|
+
int8_t naxes = ca->ndim;
|
|
2571
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2572
|
+
|
|
2573
|
+
ca_iter_state st_in, st_out;
|
|
2574
|
+
int rc;
|
|
2575
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2576
|
+
slab_axes, naxes, 0);
|
|
2577
|
+
if ( rc != CA_ITER_OK ) {
|
|
2578
|
+
rb_raise(rb_eRuntimeError,
|
|
2579
|
+
"square_ki: input init failed rc=%d", rc);
|
|
2580
|
+
}
|
|
2581
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2582
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2583
|
+
if ( rc != CA_ITER_OK ) {
|
|
2584
|
+
ca_iter_state_finish(&st_in);
|
|
2585
|
+
rb_raise(rb_eRuntimeError,
|
|
2586
|
+
"square_ki: output init failed rc=%d", rc);
|
|
2587
|
+
}
|
|
2588
|
+
|
|
2589
|
+
char *pi, *po;
|
|
2590
|
+
boolean8_t *mi, *mo;
|
|
2591
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2592
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2593
|
+
CA_SLAB_MAP_T(uint16_t, uint16_t, st_in, pi, st_out, po, r = v * v);
|
|
2594
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2595
|
+
}
|
|
2596
|
+
ca_iter_state_finish(&st_in);
|
|
2597
|
+
ca_iter_state_finish(&st_out);
|
|
2598
|
+
return vout;
|
|
2599
|
+
}
|
|
2600
|
+
|
|
2601
|
+
static VALUE
|
|
2602
|
+
square_ki_native_i32 (VALUE self, CArray *ca)
|
|
2603
|
+
{
|
|
2604
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT32),
|
|
2605
|
+
INT2NUM(sizeof(int32_t)));
|
|
2606
|
+
CArray *co;
|
|
2607
|
+
GetCArray(vout, co);
|
|
2608
|
+
|
|
2609
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2610
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2611
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2612
|
+
K-D-walkable form. */
|
|
2613
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2614
|
+
int8_t naxes = ca->ndim;
|
|
2615
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2616
|
+
|
|
2617
|
+
ca_iter_state st_in, st_out;
|
|
2618
|
+
int rc;
|
|
2619
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2620
|
+
slab_axes, naxes, 0);
|
|
2621
|
+
if ( rc != CA_ITER_OK ) {
|
|
2622
|
+
rb_raise(rb_eRuntimeError,
|
|
2623
|
+
"square_ki: input init failed rc=%d", rc);
|
|
2624
|
+
}
|
|
2625
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2626
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2627
|
+
if ( rc != CA_ITER_OK ) {
|
|
2628
|
+
ca_iter_state_finish(&st_in);
|
|
2629
|
+
rb_raise(rb_eRuntimeError,
|
|
2630
|
+
"square_ki: output init failed rc=%d", rc);
|
|
2631
|
+
}
|
|
2632
|
+
|
|
2633
|
+
char *pi, *po;
|
|
2634
|
+
boolean8_t *mi, *mo;
|
|
2635
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2636
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2637
|
+
CA_SLAB_MAP_T(int32_t, int32_t, st_in, pi, st_out, po, r = v * v);
|
|
2638
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2639
|
+
}
|
|
2640
|
+
ca_iter_state_finish(&st_in);
|
|
2641
|
+
ca_iter_state_finish(&st_out);
|
|
2642
|
+
return vout;
|
|
2643
|
+
}
|
|
2644
|
+
|
|
2645
|
+
static VALUE
|
|
2646
|
+
square_ki_native_u32 (VALUE self, CArray *ca)
|
|
2647
|
+
{
|
|
2648
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_UINT32),
|
|
2649
|
+
INT2NUM(sizeof(uint32_t)));
|
|
2650
|
+
CArray *co;
|
|
2651
|
+
GetCArray(vout, co);
|
|
2652
|
+
|
|
2653
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2654
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2655
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2656
|
+
K-D-walkable form. */
|
|
2657
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2658
|
+
int8_t naxes = ca->ndim;
|
|
2659
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2660
|
+
|
|
2661
|
+
ca_iter_state st_in, st_out;
|
|
2662
|
+
int rc;
|
|
2663
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2664
|
+
slab_axes, naxes, 0);
|
|
2665
|
+
if ( rc != CA_ITER_OK ) {
|
|
2666
|
+
rb_raise(rb_eRuntimeError,
|
|
2667
|
+
"square_ki: input init failed rc=%d", rc);
|
|
2668
|
+
}
|
|
2669
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2670
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2671
|
+
if ( rc != CA_ITER_OK ) {
|
|
2672
|
+
ca_iter_state_finish(&st_in);
|
|
2673
|
+
rb_raise(rb_eRuntimeError,
|
|
2674
|
+
"square_ki: output init failed rc=%d", rc);
|
|
2675
|
+
}
|
|
2676
|
+
|
|
2677
|
+
char *pi, *po;
|
|
2678
|
+
boolean8_t *mi, *mo;
|
|
2679
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2680
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2681
|
+
CA_SLAB_MAP_T(uint32_t, uint32_t, st_in, pi, st_out, po, r = v * v);
|
|
2682
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2683
|
+
}
|
|
2684
|
+
ca_iter_state_finish(&st_in);
|
|
2685
|
+
ca_iter_state_finish(&st_out);
|
|
2686
|
+
return vout;
|
|
2687
|
+
}
|
|
2688
|
+
|
|
2689
|
+
static VALUE
|
|
2690
|
+
square_ki_native_i64 (VALUE self, CArray *ca)
|
|
2691
|
+
{
|
|
2692
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT64),
|
|
2693
|
+
INT2NUM(sizeof(int64_t)));
|
|
2694
|
+
CArray *co;
|
|
2695
|
+
GetCArray(vout, co);
|
|
2696
|
+
|
|
2697
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2698
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2699
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2700
|
+
K-D-walkable form. */
|
|
2701
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2702
|
+
int8_t naxes = ca->ndim;
|
|
2703
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2704
|
+
|
|
2705
|
+
ca_iter_state st_in, st_out;
|
|
2706
|
+
int rc;
|
|
2707
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2708
|
+
slab_axes, naxes, 0);
|
|
2709
|
+
if ( rc != CA_ITER_OK ) {
|
|
2710
|
+
rb_raise(rb_eRuntimeError,
|
|
2711
|
+
"square_ki: input init failed rc=%d", rc);
|
|
2712
|
+
}
|
|
2713
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2714
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2715
|
+
if ( rc != CA_ITER_OK ) {
|
|
2716
|
+
ca_iter_state_finish(&st_in);
|
|
2717
|
+
rb_raise(rb_eRuntimeError,
|
|
2718
|
+
"square_ki: output init failed rc=%d", rc);
|
|
2719
|
+
}
|
|
2720
|
+
|
|
2721
|
+
char *pi, *po;
|
|
2722
|
+
boolean8_t *mi, *mo;
|
|
2723
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2724
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2725
|
+
CA_SLAB_MAP_T(int64_t, int64_t, st_in, pi, st_out, po, r = v * v);
|
|
2726
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2727
|
+
}
|
|
2728
|
+
ca_iter_state_finish(&st_in);
|
|
2729
|
+
ca_iter_state_finish(&st_out);
|
|
2730
|
+
return vout;
|
|
2731
|
+
}
|
|
2732
|
+
|
|
2733
|
+
static VALUE
|
|
2734
|
+
square_ki_native_u64 (VALUE self, CArray *ca)
|
|
2735
|
+
{
|
|
2736
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_UINT64),
|
|
2737
|
+
INT2NUM(sizeof(uint64_t)));
|
|
2738
|
+
CArray *co;
|
|
2739
|
+
GetCArray(vout, co);
|
|
2740
|
+
|
|
2741
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2742
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2743
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2744
|
+
K-D-walkable form. */
|
|
2745
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2746
|
+
int8_t naxes = ca->ndim;
|
|
2747
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2748
|
+
|
|
2749
|
+
ca_iter_state st_in, st_out;
|
|
2750
|
+
int rc;
|
|
2751
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2752
|
+
slab_axes, naxes, 0);
|
|
2753
|
+
if ( rc != CA_ITER_OK ) {
|
|
2754
|
+
rb_raise(rb_eRuntimeError,
|
|
2755
|
+
"square_ki: input init failed rc=%d", rc);
|
|
2756
|
+
}
|
|
2757
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2758
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2759
|
+
if ( rc != CA_ITER_OK ) {
|
|
2760
|
+
ca_iter_state_finish(&st_in);
|
|
2761
|
+
rb_raise(rb_eRuntimeError,
|
|
2762
|
+
"square_ki: output init failed rc=%d", rc);
|
|
2763
|
+
}
|
|
2764
|
+
|
|
2765
|
+
char *pi, *po;
|
|
2766
|
+
boolean8_t *mi, *mo;
|
|
2767
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2768
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2769
|
+
CA_SLAB_MAP_T(uint64_t, uint64_t, st_in, pi, st_out, po, r = v * v);
|
|
2770
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2771
|
+
}
|
|
2772
|
+
ca_iter_state_finish(&st_in);
|
|
2773
|
+
ca_iter_state_finish(&st_out);
|
|
2774
|
+
return vout;
|
|
2775
|
+
}
|
|
2776
|
+
|
|
2777
|
+
static VALUE
|
|
2778
|
+
square_ki_native_f32 (VALUE self, CArray *ca)
|
|
2779
|
+
{
|
|
2780
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT32),
|
|
2781
|
+
INT2NUM(sizeof(float)));
|
|
2782
|
+
CArray *co;
|
|
2783
|
+
GetCArray(vout, co);
|
|
2784
|
+
|
|
2785
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2786
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2787
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2788
|
+
K-D-walkable form. */
|
|
2789
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2790
|
+
int8_t naxes = ca->ndim;
|
|
2791
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2792
|
+
|
|
2793
|
+
ca_iter_state st_in, st_out;
|
|
2794
|
+
int rc;
|
|
2795
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2796
|
+
slab_axes, naxes, 0);
|
|
2797
|
+
if ( rc != CA_ITER_OK ) {
|
|
2798
|
+
rb_raise(rb_eRuntimeError,
|
|
2799
|
+
"square_ki: input init failed rc=%d", rc);
|
|
2800
|
+
}
|
|
2801
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2802
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2803
|
+
if ( rc != CA_ITER_OK ) {
|
|
2804
|
+
ca_iter_state_finish(&st_in);
|
|
2805
|
+
rb_raise(rb_eRuntimeError,
|
|
2806
|
+
"square_ki: output init failed rc=%d", rc);
|
|
2807
|
+
}
|
|
2808
|
+
|
|
2809
|
+
char *pi, *po;
|
|
2810
|
+
boolean8_t *mi, *mo;
|
|
2811
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2812
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2813
|
+
CA_SLAB_MAP_T(float, float, st_in, pi, st_out, po, r = v * v);
|
|
2814
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2815
|
+
}
|
|
2816
|
+
ca_iter_state_finish(&st_in);
|
|
2817
|
+
ca_iter_state_finish(&st_out);
|
|
2818
|
+
return vout;
|
|
2819
|
+
}
|
|
2820
|
+
|
|
2821
|
+
static VALUE
|
|
2822
|
+
square_ki_native_f64 (VALUE self, CArray *ca)
|
|
2823
|
+
{
|
|
2824
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
2825
|
+
INT2NUM(sizeof(double)));
|
|
2826
|
+
CArray *co;
|
|
2827
|
+
GetCArray(vout, co);
|
|
2828
|
+
|
|
2829
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2830
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2831
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2832
|
+
K-D-walkable form. */
|
|
2833
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2834
|
+
int8_t naxes = ca->ndim;
|
|
2835
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2836
|
+
|
|
2837
|
+
ca_iter_state st_in, st_out;
|
|
2838
|
+
int rc;
|
|
2839
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2840
|
+
slab_axes, naxes, 0);
|
|
2841
|
+
if ( rc != CA_ITER_OK ) {
|
|
2842
|
+
rb_raise(rb_eRuntimeError,
|
|
2843
|
+
"square_ki: input init failed rc=%d", rc);
|
|
2844
|
+
}
|
|
2845
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2846
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2847
|
+
if ( rc != CA_ITER_OK ) {
|
|
2848
|
+
ca_iter_state_finish(&st_in);
|
|
2849
|
+
rb_raise(rb_eRuntimeError,
|
|
2850
|
+
"square_ki: output init failed rc=%d", rc);
|
|
2851
|
+
}
|
|
2852
|
+
|
|
2853
|
+
char *pi, *po;
|
|
2854
|
+
boolean8_t *mi, *mo;
|
|
2855
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2856
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2857
|
+
CA_SLAB_MAP_T(double, double, st_in, pi, st_out, po, r = v * v);
|
|
2858
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2859
|
+
}
|
|
2860
|
+
ca_iter_state_finish(&st_in);
|
|
2861
|
+
ca_iter_state_finish(&st_out);
|
|
2862
|
+
return vout;
|
|
2863
|
+
}
|
|
2864
|
+
|
|
2865
|
+
static VALUE
|
|
2866
|
+
rb_ca_square_ki (VALUE self)
|
|
2867
|
+
{
|
|
2868
|
+
CArray *src;
|
|
2869
|
+
GetCArray(self, src);
|
|
2870
|
+
switch ( src->data_type ) {
|
|
2871
|
+
case CA_INT8: return square_ki_native_i8(self, src);
|
|
2872
|
+
case CA_UINT8: return square_ki_native_u8(self, src);
|
|
2873
|
+
case CA_INT16: return square_ki_native_i16(self, src);
|
|
2874
|
+
case CA_UINT16: return square_ki_native_u16(self, src);
|
|
2875
|
+
case CA_INT32: return square_ki_native_i32(self, src);
|
|
2876
|
+
case CA_UINT32: return square_ki_native_u32(self, src);
|
|
2877
|
+
case CA_INT64: return square_ki_native_i64(self, src);
|
|
2878
|
+
case CA_UINT64: return square_ki_native_u64(self, src);
|
|
2879
|
+
case CA_FLOAT32: return square_ki_native_f32(self, src);
|
|
2880
|
+
case CA_FLOAT64: return square_ki_native_f64(self, src);
|
|
2881
|
+
default:
|
|
2882
|
+
rb_raise(rb_eCADataTypeError, "square_ki: source data_type :%s not supported (expected one of: i8, u8, i16, u16, i32, u32, i64, u64, f32, f64)", ca_type_name[src->data_type]);
|
|
2883
|
+
}
|
|
2884
|
+
return Qnil; /* unreachable */
|
|
2885
|
+
}
|
|
2886
|
+
|
|
2887
|
+
/* ===== abs_ki ============================================ */
|
|
2888
|
+
|
|
2889
|
+
static VALUE
|
|
2890
|
+
abs_ki_native_i8 (VALUE self, CArray *ca)
|
|
2891
|
+
{
|
|
2892
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT8),
|
|
2893
|
+
INT2NUM(sizeof(int8_t)));
|
|
2894
|
+
CArray *co;
|
|
2895
|
+
GetCArray(vout, co);
|
|
2896
|
+
|
|
2897
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2898
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2899
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2900
|
+
K-D-walkable form. */
|
|
2901
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2902
|
+
int8_t naxes = ca->ndim;
|
|
2903
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2904
|
+
|
|
2905
|
+
ca_iter_state st_in, st_out;
|
|
2906
|
+
int rc;
|
|
2907
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2908
|
+
slab_axes, naxes, 0);
|
|
2909
|
+
if ( rc != CA_ITER_OK ) {
|
|
2910
|
+
rb_raise(rb_eRuntimeError,
|
|
2911
|
+
"abs_ki: input init failed rc=%d", rc);
|
|
2912
|
+
}
|
|
2913
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2914
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2915
|
+
if ( rc != CA_ITER_OK ) {
|
|
2916
|
+
ca_iter_state_finish(&st_in);
|
|
2917
|
+
rb_raise(rb_eRuntimeError,
|
|
2918
|
+
"abs_ki: output init failed rc=%d", rc);
|
|
2919
|
+
}
|
|
2920
|
+
|
|
2921
|
+
char *pi, *po;
|
|
2922
|
+
boolean8_t *mi, *mo;
|
|
2923
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2924
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2925
|
+
CA_SLAB_MAP_T(int8_t, int8_t, st_in, pi, st_out, po, r = (v < 0) ? -v : v);
|
|
2926
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2927
|
+
}
|
|
2928
|
+
ca_iter_state_finish(&st_in);
|
|
2929
|
+
ca_iter_state_finish(&st_out);
|
|
2930
|
+
return vout;
|
|
2931
|
+
}
|
|
2932
|
+
|
|
2933
|
+
static VALUE
|
|
2934
|
+
abs_ki_native_i16 (VALUE self, CArray *ca)
|
|
2935
|
+
{
|
|
2936
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT16),
|
|
2937
|
+
INT2NUM(sizeof(int16_t)));
|
|
2938
|
+
CArray *co;
|
|
2939
|
+
GetCArray(vout, co);
|
|
2940
|
+
|
|
2941
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2942
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2943
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2944
|
+
K-D-walkable form. */
|
|
2945
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2946
|
+
int8_t naxes = ca->ndim;
|
|
2947
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2948
|
+
|
|
2949
|
+
ca_iter_state st_in, st_out;
|
|
2950
|
+
int rc;
|
|
2951
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2952
|
+
slab_axes, naxes, 0);
|
|
2953
|
+
if ( rc != CA_ITER_OK ) {
|
|
2954
|
+
rb_raise(rb_eRuntimeError,
|
|
2955
|
+
"abs_ki: input init failed rc=%d", rc);
|
|
2956
|
+
}
|
|
2957
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
2958
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
2959
|
+
if ( rc != CA_ITER_OK ) {
|
|
2960
|
+
ca_iter_state_finish(&st_in);
|
|
2961
|
+
rb_raise(rb_eRuntimeError,
|
|
2962
|
+
"abs_ki: output init failed rc=%d", rc);
|
|
2963
|
+
}
|
|
2964
|
+
|
|
2965
|
+
char *pi, *po;
|
|
2966
|
+
boolean8_t *mi, *mo;
|
|
2967
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
2968
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
2969
|
+
CA_SLAB_MAP_T(int16_t, int16_t, st_in, pi, st_out, po, r = (v < 0) ? -v : v);
|
|
2970
|
+
ca_iter_state_sync_slab(&st_out);
|
|
2971
|
+
}
|
|
2972
|
+
ca_iter_state_finish(&st_in);
|
|
2973
|
+
ca_iter_state_finish(&st_out);
|
|
2974
|
+
return vout;
|
|
2975
|
+
}
|
|
2976
|
+
|
|
2977
|
+
static VALUE
|
|
2978
|
+
abs_ki_native_i32 (VALUE self, CArray *ca)
|
|
2979
|
+
{
|
|
2980
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT32),
|
|
2981
|
+
INT2NUM(sizeof(int32_t)));
|
|
2982
|
+
CArray *co;
|
|
2983
|
+
GetCArray(vout, co);
|
|
2984
|
+
|
|
2985
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
2986
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
2987
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
2988
|
+
K-D-walkable form. */
|
|
2989
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
2990
|
+
int8_t naxes = ca->ndim;
|
|
2991
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
2992
|
+
|
|
2993
|
+
ca_iter_state st_in, st_out;
|
|
2994
|
+
int rc;
|
|
2995
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
2996
|
+
slab_axes, naxes, 0);
|
|
2997
|
+
if ( rc != CA_ITER_OK ) {
|
|
2998
|
+
rb_raise(rb_eRuntimeError,
|
|
2999
|
+
"abs_ki: input init failed rc=%d", rc);
|
|
3000
|
+
}
|
|
3001
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
3002
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
3003
|
+
if ( rc != CA_ITER_OK ) {
|
|
3004
|
+
ca_iter_state_finish(&st_in);
|
|
3005
|
+
rb_raise(rb_eRuntimeError,
|
|
3006
|
+
"abs_ki: output init failed rc=%d", rc);
|
|
3007
|
+
}
|
|
3008
|
+
|
|
3009
|
+
char *pi, *po;
|
|
3010
|
+
boolean8_t *mi, *mo;
|
|
3011
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
3012
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
3013
|
+
CA_SLAB_MAP_T(int32_t, int32_t, st_in, pi, st_out, po, r = (v < 0) ? -v : v);
|
|
3014
|
+
ca_iter_state_sync_slab(&st_out);
|
|
3015
|
+
}
|
|
3016
|
+
ca_iter_state_finish(&st_in);
|
|
3017
|
+
ca_iter_state_finish(&st_out);
|
|
3018
|
+
return vout;
|
|
3019
|
+
}
|
|
3020
|
+
|
|
3021
|
+
static VALUE
|
|
3022
|
+
abs_ki_native_i64 (VALUE self, CArray *ca)
|
|
3023
|
+
{
|
|
3024
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT64),
|
|
3025
|
+
INT2NUM(sizeof(int64_t)));
|
|
3026
|
+
CArray *co;
|
|
3027
|
+
GetCArray(vout, co);
|
|
3028
|
+
|
|
3029
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
3030
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
3031
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
3032
|
+
K-D-walkable form. */
|
|
3033
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
3034
|
+
int8_t naxes = ca->ndim;
|
|
3035
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
3036
|
+
|
|
3037
|
+
ca_iter_state st_in, st_out;
|
|
3038
|
+
int rc;
|
|
3039
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
3040
|
+
slab_axes, naxes, 0);
|
|
3041
|
+
if ( rc != CA_ITER_OK ) {
|
|
3042
|
+
rb_raise(rb_eRuntimeError,
|
|
3043
|
+
"abs_ki: input init failed rc=%d", rc);
|
|
3044
|
+
}
|
|
3045
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
3046
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
3047
|
+
if ( rc != CA_ITER_OK ) {
|
|
3048
|
+
ca_iter_state_finish(&st_in);
|
|
3049
|
+
rb_raise(rb_eRuntimeError,
|
|
3050
|
+
"abs_ki: output init failed rc=%d", rc);
|
|
3051
|
+
}
|
|
3052
|
+
|
|
3053
|
+
char *pi, *po;
|
|
3054
|
+
boolean8_t *mi, *mo;
|
|
3055
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
3056
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
3057
|
+
CA_SLAB_MAP_T(int64_t, int64_t, st_in, pi, st_out, po, r = (v < 0) ? -v : v);
|
|
3058
|
+
ca_iter_state_sync_slab(&st_out);
|
|
3059
|
+
}
|
|
3060
|
+
ca_iter_state_finish(&st_in);
|
|
3061
|
+
ca_iter_state_finish(&st_out);
|
|
3062
|
+
return vout;
|
|
3063
|
+
}
|
|
3064
|
+
|
|
3065
|
+
static VALUE
|
|
3066
|
+
abs_ki_native_f32 (VALUE self, CArray *ca)
|
|
3067
|
+
{
|
|
3068
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT32),
|
|
3069
|
+
INT2NUM(sizeof(float)));
|
|
3070
|
+
CArray *co;
|
|
3071
|
+
GetCArray(vout, co);
|
|
3072
|
+
|
|
3073
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
3074
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
3075
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
3076
|
+
K-D-walkable form. */
|
|
3077
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
3078
|
+
int8_t naxes = ca->ndim;
|
|
3079
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
3080
|
+
|
|
3081
|
+
ca_iter_state st_in, st_out;
|
|
3082
|
+
int rc;
|
|
3083
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
3084
|
+
slab_axes, naxes, 0);
|
|
3085
|
+
if ( rc != CA_ITER_OK ) {
|
|
3086
|
+
rb_raise(rb_eRuntimeError,
|
|
3087
|
+
"abs_ki: input init failed rc=%d", rc);
|
|
3088
|
+
}
|
|
3089
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
3090
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
3091
|
+
if ( rc != CA_ITER_OK ) {
|
|
3092
|
+
ca_iter_state_finish(&st_in);
|
|
3093
|
+
rb_raise(rb_eRuntimeError,
|
|
3094
|
+
"abs_ki: output init failed rc=%d", rc);
|
|
3095
|
+
}
|
|
3096
|
+
|
|
3097
|
+
char *pi, *po;
|
|
3098
|
+
boolean8_t *mi, *mo;
|
|
3099
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
3100
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
3101
|
+
CA_SLAB_MAP_T(float, float, st_in, pi, st_out, po, r = (v < 0) ? -v : v);
|
|
3102
|
+
ca_iter_state_sync_slab(&st_out);
|
|
3103
|
+
}
|
|
3104
|
+
ca_iter_state_finish(&st_in);
|
|
3105
|
+
ca_iter_state_finish(&st_out);
|
|
3106
|
+
return vout;
|
|
3107
|
+
}
|
|
3108
|
+
|
|
3109
|
+
static VALUE
|
|
3110
|
+
abs_ki_native_f64 (VALUE self, CArray *ca)
|
|
3111
|
+
{
|
|
3112
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
3113
|
+
INT2NUM(sizeof(double)));
|
|
3114
|
+
CArray *co;
|
|
3115
|
+
GetCArray(vout, co);
|
|
3116
|
+
|
|
3117
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
3118
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
3119
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
3120
|
+
K-D-walkable form. */
|
|
3121
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
3122
|
+
int8_t naxes = ca->ndim;
|
|
3123
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
3124
|
+
|
|
3125
|
+
ca_iter_state st_in, st_out;
|
|
3126
|
+
int rc;
|
|
3127
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
3128
|
+
slab_axes, naxes, 0);
|
|
3129
|
+
if ( rc != CA_ITER_OK ) {
|
|
3130
|
+
rb_raise(rb_eRuntimeError,
|
|
3131
|
+
"abs_ki: input init failed rc=%d", rc);
|
|
3132
|
+
}
|
|
3133
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
3134
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
3135
|
+
if ( rc != CA_ITER_OK ) {
|
|
3136
|
+
ca_iter_state_finish(&st_in);
|
|
3137
|
+
rb_raise(rb_eRuntimeError,
|
|
3138
|
+
"abs_ki: output init failed rc=%d", rc);
|
|
3139
|
+
}
|
|
3140
|
+
|
|
3141
|
+
char *pi, *po;
|
|
3142
|
+
boolean8_t *mi, *mo;
|
|
3143
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
3144
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
3145
|
+
CA_SLAB_MAP_T(double, double, st_in, pi, st_out, po, r = (v < 0) ? -v : v);
|
|
3146
|
+
ca_iter_state_sync_slab(&st_out);
|
|
3147
|
+
}
|
|
3148
|
+
ca_iter_state_finish(&st_in);
|
|
3149
|
+
ca_iter_state_finish(&st_out);
|
|
3150
|
+
return vout;
|
|
3151
|
+
}
|
|
3152
|
+
|
|
3153
|
+
static VALUE
|
|
3154
|
+
rb_ca_abs_ki (VALUE self)
|
|
3155
|
+
{
|
|
3156
|
+
CArray *src;
|
|
3157
|
+
GetCArray(self, src);
|
|
3158
|
+
switch ( src->data_type ) {
|
|
3159
|
+
case CA_INT8: return abs_ki_native_i8(self, src);
|
|
3160
|
+
case CA_INT16: return abs_ki_native_i16(self, src);
|
|
3161
|
+
case CA_INT32: return abs_ki_native_i32(self, src);
|
|
3162
|
+
case CA_INT64: return abs_ki_native_i64(self, src);
|
|
3163
|
+
case CA_FLOAT32: return abs_ki_native_f32(self, src);
|
|
3164
|
+
case CA_FLOAT64: return abs_ki_native_f64(self, src);
|
|
3165
|
+
default:
|
|
3166
|
+
rb_raise(rb_eCADataTypeError, "abs_ki: source data_type :%s not supported (expected one of: i8, i16, i32, i64, f32, f64)", ca_type_name[src->data_type]);
|
|
3167
|
+
}
|
|
3168
|
+
return Qnil; /* unreachable */
|
|
3169
|
+
}
|
|
3170
|
+
|
|
3171
|
+
/* ===== negate_ki ============================================ */
|
|
3172
|
+
|
|
3173
|
+
static VALUE
|
|
3174
|
+
negate_ki_native_i8 (VALUE self, CArray *ca)
|
|
3175
|
+
{
|
|
3176
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT8),
|
|
3177
|
+
INT2NUM(sizeof(int8_t)));
|
|
3178
|
+
CArray *co;
|
|
3179
|
+
GetCArray(vout, co);
|
|
3180
|
+
|
|
3181
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
3182
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
3183
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
3184
|
+
K-D-walkable form. */
|
|
3185
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
3186
|
+
int8_t naxes = ca->ndim;
|
|
3187
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
3188
|
+
|
|
3189
|
+
ca_iter_state st_in, st_out;
|
|
3190
|
+
int rc;
|
|
3191
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
3192
|
+
slab_axes, naxes, 0);
|
|
3193
|
+
if ( rc != CA_ITER_OK ) {
|
|
3194
|
+
rb_raise(rb_eRuntimeError,
|
|
3195
|
+
"negate_ki: input init failed rc=%d", rc);
|
|
3196
|
+
}
|
|
3197
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
3198
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
3199
|
+
if ( rc != CA_ITER_OK ) {
|
|
3200
|
+
ca_iter_state_finish(&st_in);
|
|
3201
|
+
rb_raise(rb_eRuntimeError,
|
|
3202
|
+
"negate_ki: output init failed rc=%d", rc);
|
|
3203
|
+
}
|
|
3204
|
+
|
|
3205
|
+
char *pi, *po;
|
|
3206
|
+
boolean8_t *mi, *mo;
|
|
3207
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
3208
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
3209
|
+
CA_SLAB_MAP_T(int8_t, int8_t, st_in, pi, st_out, po, r = -v);
|
|
3210
|
+
ca_iter_state_sync_slab(&st_out);
|
|
3211
|
+
}
|
|
3212
|
+
ca_iter_state_finish(&st_in);
|
|
3213
|
+
ca_iter_state_finish(&st_out);
|
|
3214
|
+
return vout;
|
|
3215
|
+
}
|
|
3216
|
+
|
|
3217
|
+
static VALUE
|
|
3218
|
+
negate_ki_native_i16 (VALUE self, CArray *ca)
|
|
3219
|
+
{
|
|
3220
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT16),
|
|
3221
|
+
INT2NUM(sizeof(int16_t)));
|
|
3222
|
+
CArray *co;
|
|
3223
|
+
GetCArray(vout, co);
|
|
3224
|
+
|
|
3225
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
3226
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
3227
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
3228
|
+
K-D-walkable form. */
|
|
3229
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
3230
|
+
int8_t naxes = ca->ndim;
|
|
3231
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
3232
|
+
|
|
3233
|
+
ca_iter_state st_in, st_out;
|
|
3234
|
+
int rc;
|
|
3235
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
3236
|
+
slab_axes, naxes, 0);
|
|
3237
|
+
if ( rc != CA_ITER_OK ) {
|
|
3238
|
+
rb_raise(rb_eRuntimeError,
|
|
3239
|
+
"negate_ki: input init failed rc=%d", rc);
|
|
3240
|
+
}
|
|
3241
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
3242
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
3243
|
+
if ( rc != CA_ITER_OK ) {
|
|
3244
|
+
ca_iter_state_finish(&st_in);
|
|
3245
|
+
rb_raise(rb_eRuntimeError,
|
|
3246
|
+
"negate_ki: output init failed rc=%d", rc);
|
|
3247
|
+
}
|
|
3248
|
+
|
|
3249
|
+
char *pi, *po;
|
|
3250
|
+
boolean8_t *mi, *mo;
|
|
3251
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
3252
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
3253
|
+
CA_SLAB_MAP_T(int16_t, int16_t, st_in, pi, st_out, po, r = -v);
|
|
3254
|
+
ca_iter_state_sync_slab(&st_out);
|
|
3255
|
+
}
|
|
3256
|
+
ca_iter_state_finish(&st_in);
|
|
3257
|
+
ca_iter_state_finish(&st_out);
|
|
3258
|
+
return vout;
|
|
3259
|
+
}
|
|
3260
|
+
|
|
3261
|
+
static VALUE
|
|
3262
|
+
negate_ki_native_i32 (VALUE self, CArray *ca)
|
|
3263
|
+
{
|
|
3264
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT32),
|
|
3265
|
+
INT2NUM(sizeof(int32_t)));
|
|
3266
|
+
CArray *co;
|
|
3267
|
+
GetCArray(vout, co);
|
|
3268
|
+
|
|
3269
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
3270
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
3271
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
3272
|
+
K-D-walkable form. */
|
|
3273
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
3274
|
+
int8_t naxes = ca->ndim;
|
|
3275
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
3276
|
+
|
|
3277
|
+
ca_iter_state st_in, st_out;
|
|
3278
|
+
int rc;
|
|
3279
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
3280
|
+
slab_axes, naxes, 0);
|
|
3281
|
+
if ( rc != CA_ITER_OK ) {
|
|
3282
|
+
rb_raise(rb_eRuntimeError,
|
|
3283
|
+
"negate_ki: input init failed rc=%d", rc);
|
|
3284
|
+
}
|
|
3285
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
3286
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
3287
|
+
if ( rc != CA_ITER_OK ) {
|
|
3288
|
+
ca_iter_state_finish(&st_in);
|
|
3289
|
+
rb_raise(rb_eRuntimeError,
|
|
3290
|
+
"negate_ki: output init failed rc=%d", rc);
|
|
3291
|
+
}
|
|
3292
|
+
|
|
3293
|
+
char *pi, *po;
|
|
3294
|
+
boolean8_t *mi, *mo;
|
|
3295
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
3296
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
3297
|
+
CA_SLAB_MAP_T(int32_t, int32_t, st_in, pi, st_out, po, r = -v);
|
|
3298
|
+
ca_iter_state_sync_slab(&st_out);
|
|
3299
|
+
}
|
|
3300
|
+
ca_iter_state_finish(&st_in);
|
|
3301
|
+
ca_iter_state_finish(&st_out);
|
|
3302
|
+
return vout;
|
|
3303
|
+
}
|
|
3304
|
+
|
|
3305
|
+
static VALUE
|
|
3306
|
+
negate_ki_native_i64 (VALUE self, CArray *ca)
|
|
3307
|
+
{
|
|
3308
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_INT64),
|
|
3309
|
+
INT2NUM(sizeof(int64_t)));
|
|
3310
|
+
CArray *co;
|
|
3311
|
+
GetCArray(vout, co);
|
|
3312
|
+
|
|
3313
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
3314
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
3315
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
3316
|
+
K-D-walkable form. */
|
|
3317
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
3318
|
+
int8_t naxes = ca->ndim;
|
|
3319
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
3320
|
+
|
|
3321
|
+
ca_iter_state st_in, st_out;
|
|
3322
|
+
int rc;
|
|
3323
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
3324
|
+
slab_axes, naxes, 0);
|
|
3325
|
+
if ( rc != CA_ITER_OK ) {
|
|
3326
|
+
rb_raise(rb_eRuntimeError,
|
|
3327
|
+
"negate_ki: input init failed rc=%d", rc);
|
|
3328
|
+
}
|
|
3329
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
3330
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
3331
|
+
if ( rc != CA_ITER_OK ) {
|
|
3332
|
+
ca_iter_state_finish(&st_in);
|
|
3333
|
+
rb_raise(rb_eRuntimeError,
|
|
3334
|
+
"negate_ki: output init failed rc=%d", rc);
|
|
3335
|
+
}
|
|
3336
|
+
|
|
3337
|
+
char *pi, *po;
|
|
3338
|
+
boolean8_t *mi, *mo;
|
|
3339
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
3340
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
3341
|
+
CA_SLAB_MAP_T(int64_t, int64_t, st_in, pi, st_out, po, r = -v);
|
|
3342
|
+
ca_iter_state_sync_slab(&st_out);
|
|
3343
|
+
}
|
|
3344
|
+
ca_iter_state_finish(&st_in);
|
|
3345
|
+
ca_iter_state_finish(&st_out);
|
|
3346
|
+
return vout;
|
|
3347
|
+
}
|
|
3348
|
+
|
|
3349
|
+
static VALUE
|
|
3350
|
+
negate_ki_native_f32 (VALUE self, CArray *ca)
|
|
3351
|
+
{
|
|
3352
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT32),
|
|
3353
|
+
INT2NUM(sizeof(float)));
|
|
3354
|
+
CArray *co;
|
|
3355
|
+
GetCArray(vout, co);
|
|
3356
|
+
|
|
3357
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
3358
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
3359
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
3360
|
+
K-D-walkable form. */
|
|
3361
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
3362
|
+
int8_t naxes = ca->ndim;
|
|
3363
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
3364
|
+
|
|
3365
|
+
ca_iter_state st_in, st_out;
|
|
3366
|
+
int rc;
|
|
3367
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
3368
|
+
slab_axes, naxes, 0);
|
|
3369
|
+
if ( rc != CA_ITER_OK ) {
|
|
3370
|
+
rb_raise(rb_eRuntimeError,
|
|
3371
|
+
"negate_ki: input init failed rc=%d", rc);
|
|
3372
|
+
}
|
|
3373
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
3374
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
3375
|
+
if ( rc != CA_ITER_OK ) {
|
|
3376
|
+
ca_iter_state_finish(&st_in);
|
|
3377
|
+
rb_raise(rb_eRuntimeError,
|
|
3378
|
+
"negate_ki: output init failed rc=%d", rc);
|
|
3379
|
+
}
|
|
3380
|
+
|
|
3381
|
+
char *pi, *po;
|
|
3382
|
+
boolean8_t *mi, *mo;
|
|
3383
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
3384
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
3385
|
+
CA_SLAB_MAP_T(float, float, st_in, pi, st_out, po, r = -v);
|
|
3386
|
+
ca_iter_state_sync_slab(&st_out);
|
|
3387
|
+
}
|
|
3388
|
+
ca_iter_state_finish(&st_in);
|
|
3389
|
+
ca_iter_state_finish(&st_out);
|
|
3390
|
+
return vout;
|
|
3391
|
+
}
|
|
3392
|
+
|
|
3393
|
+
static VALUE
|
|
3394
|
+
negate_ki_native_f64 (VALUE self, CArray *ca)
|
|
3395
|
+
{
|
|
3396
|
+
VALUE vout = rb_ca_template_with_type(self, INT2NUM(CA_FLOAT64),
|
|
3397
|
+
INT2NUM(sizeof(double)));
|
|
3398
|
+
CArray *co;
|
|
3399
|
+
GetCArray(vout, co);
|
|
3400
|
+
|
|
3401
|
+
/* All-axes slab = whole array as one K-D walk via CA_SLAB_AXES.
|
|
3402
|
+
CA_SLAB_WHOLE uses the flat next_slab path, which doesn't
|
|
3403
|
+
populate slab_dims; CA_SLAB_AXES with naxes == ndim is the
|
|
3404
|
+
K-D-walkable form. */
|
|
3405
|
+
int8_t slab_axes[CA_RANK_MAX];
|
|
3406
|
+
int8_t naxes = ca->ndim;
|
|
3407
|
+
for ( int8_t k = 0; k < naxes; k++ ) slab_axes[k] = k;
|
|
3408
|
+
|
|
3409
|
+
ca_iter_state st_in, st_out;
|
|
3410
|
+
int rc;
|
|
3411
|
+
rc = ca_iter_state_init_l2(&st_in, ca, CA_SLAB_AXES,
|
|
3412
|
+
slab_axes, naxes, 0);
|
|
3413
|
+
if ( rc != CA_ITER_OK ) {
|
|
3414
|
+
rb_raise(rb_eRuntimeError,
|
|
3415
|
+
"negate_ki: input init failed rc=%d", rc);
|
|
3416
|
+
}
|
|
3417
|
+
rc = ca_iter_state_init_l2(&st_out, co, CA_SLAB_AXES,
|
|
3418
|
+
slab_axes, naxes, CA_KERNEL_WRITE);
|
|
3419
|
+
if ( rc != CA_ITER_OK ) {
|
|
3420
|
+
ca_iter_state_finish(&st_in);
|
|
3421
|
+
rb_raise(rb_eRuntimeError,
|
|
3422
|
+
"negate_ki: output init failed rc=%d", rc);
|
|
3423
|
+
}
|
|
3424
|
+
|
|
3425
|
+
char *pi, *po;
|
|
3426
|
+
boolean8_t *mi, *mo;
|
|
3427
|
+
while ( ca_iter_state_next_slab_axes(&st_in, &pi, &mi) &&
|
|
3428
|
+
ca_iter_state_next_slab_axes(&st_out, &po, &mo) ) {
|
|
3429
|
+
CA_SLAB_MAP_T(double, double, st_in, pi, st_out, po, r = -v);
|
|
3430
|
+
ca_iter_state_sync_slab(&st_out);
|
|
3431
|
+
}
|
|
3432
|
+
ca_iter_state_finish(&st_in);
|
|
3433
|
+
ca_iter_state_finish(&st_out);
|
|
3434
|
+
return vout;
|
|
3435
|
+
}
|
|
3436
|
+
|
|
3437
|
+
static VALUE
|
|
3438
|
+
rb_ca_negate_ki (VALUE self)
|
|
3439
|
+
{
|
|
3440
|
+
CArray *src;
|
|
3441
|
+
GetCArray(self, src);
|
|
3442
|
+
switch ( src->data_type ) {
|
|
3443
|
+
case CA_INT8: return negate_ki_native_i8(self, src);
|
|
3444
|
+
case CA_INT16: return negate_ki_native_i16(self, src);
|
|
3445
|
+
case CA_INT32: return negate_ki_native_i32(self, src);
|
|
3446
|
+
case CA_INT64: return negate_ki_native_i64(self, src);
|
|
3447
|
+
case CA_FLOAT32: return negate_ki_native_f32(self, src);
|
|
3448
|
+
case CA_FLOAT64: return negate_ki_native_f64(self, src);
|
|
3449
|
+
default:
|
|
3450
|
+
rb_raise(rb_eCADataTypeError, "negate_ki: source data_type :%s not supported (expected one of: i8, i16, i32, i64, f32, f64)", ca_type_name[src->data_type]);
|
|
3451
|
+
}
|
|
3452
|
+
return Qnil; /* unreachable */
|
|
3453
|
+
}
|
|
3454
|
+
|
|
3455
|
+
void
|
|
3456
|
+
Init_carray_kernels_map (void)
|
|
3457
|
+
{
|
|
3458
|
+
rb_define_method(rb_cCArray, "sqrt_ki", rb_ca_sqrt_ki, 0);
|
|
3459
|
+
rb_define_method(rb_cCArray, "sin_ki", rb_ca_sin_ki, 0);
|
|
3460
|
+
rb_define_method(rb_cCArray, "cos_ki", rb_ca_cos_ki, 0);
|
|
3461
|
+
rb_define_method(rb_cCArray, "exp_ki", rb_ca_exp_ki, 0);
|
|
3462
|
+
rb_define_method(rb_cCArray, "log_ki", rb_ca_log_ki, 0);
|
|
3463
|
+
rb_define_method(rb_cCArray, "square_ki", rb_ca_square_ki, 0);
|
|
3464
|
+
rb_define_method(rb_cCArray, "abs_ki", rb_ca_abs_ki, 0);
|
|
3465
|
+
rb_define_method(rb_cCArray, "negate_ki", rb_ca_negate_ki, 0);
|
|
3466
|
+
}
|