carray 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.yardopts +5 -25
- data/CHANGELOG.md +16 -0
- data/LICENSE +1 -1
- data/NEWS.md +3 -0
- data/README.md +128 -44
- data/carray.gemspec +22 -24
- data/ext/ca_array_pool.c +91 -0
- data/ext/ca_axis_descriptor.h +186 -0
- data/ext/ca_axis_dispatch.c +924 -0
- data/ext/ca_axis_group.c +1208 -0
- data/ext/ca_bincmp_dispatch.c +76 -0
- data/ext/ca_bincmp_dispatch.h +85 -0
- data/ext/ca_binop_dispatch.c +125 -0
- data/ext/ca_binop_dispatch.h +159 -0
- data/ext/ca_categorical_iterator.c +1375 -0
- data/ext/ca_compare.c +94 -0
- data/ext/ca_compare.h +26 -0
- data/ext/ca_composite_dispatch.c +414 -0
- data/ext/ca_composite_dispatch.h +116 -0
- data/ext/ca_for_buffer.h +96 -0
- data/ext/ca_for_each_element.h +241 -0
- data/ext/ca_group_iter.c +304 -0
- data/ext/ca_iter_substrate.h +325 -0
- data/ext/ca_kernel_iterator.c +4321 -0
- data/ext/ca_kernel_iterator.h +2603 -0
- data/ext/ca_moncmp_dispatch.c +37 -0
- data/ext/ca_moncmp_dispatch.h +62 -0
- data/ext/ca_monop_dispatch.c +200 -0
- data/ext/ca_monop_dispatch.h +235 -0
- data/ext/ca_obj_array.c +355 -359
- data/ext/ca_obj_bincmp.c +809 -0
- data/ext/ca_obj_binop.c +892 -0
- data/ext/ca_obj_bitarray.c +369 -164
- data/ext/ca_obj_bitfield.c +294 -234
- data/ext/ca_obj_block.c +189 -711
- data/ext/ca_obj_byte_swap.c +766 -0
- data/ext/ca_obj_const_string.c +965 -0
- data/ext/ca_obj_face.c +670 -0
- data/ext/ca_obj_face.h +247 -0
- data/ext/ca_obj_fake.c +228 -100
- data/ext/ca_obj_farray.c +54 -441
- data/ext/ca_obj_field.c +82 -529
- data/ext/ca_obj_fixlen_string.c +306 -0
- data/ext/ca_obj_grid.c +858 -440
- data/ext/ca_obj_meld.c +1034 -0
- data/ext/ca_obj_moncmp.c +569 -0
- data/ext/ca_obj_monop.c +1111 -0
- data/ext/ca_obj_object.c +774 -298
- data/ext/ca_obj_record.c +468 -0
- data/ext/ca_obj_reduce.c +97 -82
- data/ext/ca_obj_refer.c +569 -459
- data/ext/ca_obj_remap.c +475 -0
- data/ext/ca_obj_repeat.c +92 -477
- data/ext/ca_obj_roll.c +616 -0
- data/ext/ca_obj_select.c +344 -296
- data/ext/ca_obj_select_axis.c +1296 -0
- data/ext/ca_obj_shift.c +230 -792
- data/ext/ca_obj_source.c +78 -0
- data/ext/ca_obj_stack.c +1173 -0
- data/ext/ca_obj_stride.c +2501 -0
- data/ext/ca_obj_string.c +268 -0
- data/ext/ca_obj_tile.c +614 -0
- data/ext/ca_obj_time.c +546 -0
- data/ext/ca_obj_timedelta.c +435 -0
- data/ext/ca_obj_transpose.c +62 -516
- data/ext/ca_obj_triop.c +746 -0
- data/ext/ca_obj_unbound_repeat.c +208 -241
- data/ext/ca_obj_window.c +1131 -563
- data/ext/ca_op_byte_swap.c +175 -0
- data/ext/ca_op_ipower.c +319 -0
- data/ext/ca_op_powi.h +88 -0
- data/ext/ca_sort_kernels.h +132 -0
- data/ext/ca_sweep_engine.c +430 -0
- data/ext/ca_sweep_engine.h +157 -0
- data/ext/ca_transform_common.c +228 -0
- data/ext/ca_triop_dispatch.c +55 -0
- data/ext/ca_triop_dispatch.h +62 -0
- data/ext/carray.h +795 -402
- data/ext/carray_access.c +831 -711
- data/ext/carray_attribute.c +98 -330
- data/ext/carray_bincount.c +255 -0
- data/ext/carray_broadcast.c +283 -0
- data/ext/carray_call_cfunc.c +1360 -828
- data/ext/carray_call_cfunc.h +160 -0
- data/ext/carray_cast.c +1212 -301
- data/ext/carray_cast_func.rb +81 -40
- data/ext/carray_class.c +53 -63
- data/ext/carray_config.h +28 -0
- data/ext/carray_conversion.c +350 -346
- data/ext/carray_copy.c +156 -268
- data/ext/carray_core.c +1342 -199
- data/ext/carray_count.c +312 -0
- data/ext/carray_data_type.c +43 -19
- data/ext/carray_element.c +585 -213
- data/ext/carray_factorize.c +2542 -0
- data/ext/carray_generate.c +230 -559
- data/ext/carray_histogram.c +490 -0
- data/ext/carray_hold.c +228 -0
- data/ext/carray_index_classifier.c +1035 -0
- data/ext/carray_index_classifier.h +27 -0
- data/ext/carray_internal.h +120 -0
- data/ext/carray_kernels_bincmp.c +4445 -0
- data/ext/carray_kernels_binop.c +10979 -0
- data/ext/carray_kernels_init.c +36 -0
- data/ext/carray_kernels_map.c +3466 -0
- data/ext/carray_kernels_moncmp.c +2096 -0
- data/ext/carray_kernels_monop.c +18312 -0
- data/ext/carray_kernels_reduce_aggregate.c +25836 -0
- data/ext/carray_kernels_reduce_boolean.c +329 -0
- data/ext/carray_kernels_reduce_cumulative.c +14592 -0
- data/ext/carray_kernels_reduce_extreme.c +16947 -0
- data/ext/carray_kernels_reduce_variance.c +3909 -0
- data/ext/carray_kernels_scan.c +3692 -0
- data/ext/carray_kernels_search.c +32137 -0
- data/ext/carray_kernels_sort.c +10625 -0
- data/ext/carray_kernels_triop.c +1391 -0
- data/ext/carray_lazy.c +567 -0
- data/ext/carray_loop.c +88 -200
- data/ext/carray_mask.c +848 -154
- data/ext/carray_math_kernel.h +120 -0
- data/ext/carray_mathfunc.c +10 -241
- data/ext/carray_median_percentile.c +1257 -0
- data/ext/carray_memory_view.c +1625 -0
- data/ext/carray_operator.c +1526 -318
- data/ext/carray_order.c +664 -1394
- data/ext/carray_partition.c +416 -0
- data/ext/carray_random.c +518 -0
- data/ext/carray_scatter.c +357 -0
- data/ext/carray_slab.c +1219 -0
- data/ext/carray_slab.h +84 -0
- data/ext/carray_sort.c +829 -0
- data/ext/carray_sort_kernel.c +620 -0
- data/ext/carray_struct.c +695 -0
- data/ext/carray_test.c +343 -229
- data/ext/carray_undef.c +34 -17
- data/ext/carray_utils.c +175 -74
- data/ext/extconf.rb +216 -55
- data/ext/mk_call_cfunc.rb +480 -0
- data/ext/mkkernel.rb +8842 -0
- data/ext/ruby_carray.c +202 -101
- data/ext/version.h +4 -14
- data/ext/version.rb +5 -13
- data/lib/carray/arrow_tensor.rb +401 -0
- data/lib/carray/attribute.rb +166 -0
- data/lib/carray/autoload_carray.rb +220 -0
- data/lib/carray/autoload_method_extension.rb +44 -0
- data/lib/carray/axis_group.rb +711 -0
- data/lib/carray/basics.rb +481 -0
- data/lib/carray/bincount_nd.rb +358 -0
- data/lib/carray/block_iterator.rb +604 -0
- data/lib/carray/boolean_reduce.rb +109 -0
- data/lib/carray/categorical.rb +561 -0
- data/lib/carray/categorical_iterator.rb +1062 -0
- data/lib/carray/complex.rb +150 -0
- data/lib/carray/conditional.rb +216 -0
- data/lib/carray/const_string.rb +228 -0
- data/lib/carray/construct.rb +139 -328
- data/lib/carray/core_extensions.rb +240 -0
- data/lib/carray/data_type_extension.rb +233 -0
- data/lib/carray/fixlen_string.rb +95 -0
- data/lib/carray/frame/concat.rb +132 -0
- data/lib/carray/frame/convert.rb +95 -0
- data/lib/carray/frame/csv_parser.rb +211 -0
- data/lib/carray/frame/frame.rb +649 -0
- data/lib/carray/frame/group.rb +186 -0
- data/lib/carray/frame/io.rb +164 -0
- data/lib/carray/frame/join.rb +248 -0
- data/lib/carray/frame/records.rb +99 -0
- data/lib/carray/frame/sort.rb +113 -0
- data/lib/carray/frame/verbs.rb +299 -0
- data/lib/carray/frame.rb +16 -0
- data/lib/carray/histogram.rb +512 -0
- data/lib/carray/inspect.rb +37 -20
- data/lib/carray/iterator.rb +57 -349
- data/lib/carray/lazy.rb +889 -0
- data/lib/carray/mask_gap_fill.rb +200 -0
- data/lib/carray/math.rb +78 -342
- data/lib/carray/meld_reduce.rb +289 -0
- data/lib/carray/methods/align_addr.rb +116 -0
- data/lib/carray/methods/bin.rb +128 -0
- data/lib/carray/methods/bincount.rb +87 -0
- data/lib/carray/methods/bit_string.rb +92 -0
- data/lib/carray/methods/broadcast.rb +63 -0
- data/lib/carray/methods/choose.rb +39 -0
- data/lib/carray/methods/composition.rb +280 -0
- data/lib/carray/methods/gather_nd.rb +206 -0
- data/lib/carray/methods/index.rb +39 -0
- data/lib/carray/methods/insert_block.rb +99 -0
- data/lib/carray/methods/is_in.rb +141 -0
- data/lib/carray/methods/join.rb +90 -0
- data/lib/carray/methods/locate_addr.rb +47 -0
- data/lib/carray/methods/mask_duplicates.rb +41 -0
- data/lib/carray/methods/meshgrid.rb +91 -0
- data/lib/carray/methods/mode.rb +126 -0
- data/lib/carray/methods/nunique.rb +46 -0
- data/lib/carray/methods/resize.rb +56 -0
- data/lib/carray/methods/snap.rb +156 -0
- data/lib/carray/methods/string_format.rb +57 -0
- data/lib/carray/methods/unique.rb +47 -0
- data/lib/carray/methods/value_counts.rb +71 -0
- data/lib/carray/mkmf.rb +124 -101
- data/lib/carray/runtime.rb +108 -0
- data/lib/carray/serialize.rb +478 -167
- data/lib/carray/slab_iterator.rb +292 -0
- data/lib/carray/stack.rb +291 -0
- data/lib/carray/string.rb +56 -180
- data/lib/carray/string_operation_extension.rb +289 -0
- data/lib/carray/struct.rb +335 -323
- data/lib/carray/struct_builder.rb +697 -0
- data/lib/carray/table.rb +41 -2
- data/lib/carray/time.rb +2255 -38
- data/lib/carray/window_iterator.rb +655 -0
- data/lib/carray.rb +55 -57
- metadata +163 -130
- data/Rakefile +0 -51
- data/TODO.md +0 -18
- data/ext/ca_iter_block.c +0 -257
- data/ext/ca_iter_dimension.c +0 -299
- data/ext/ca_iter_window.c +0 -214
- data/ext/ca_obj_mapping.c +0 -644
- data/ext/carray_iterator.c +0 -641
- data/ext/carray_math.rb +0 -850
- data/ext/carray_numeric.c +0 -259
- data/ext/carray_sort_addr.c +0 -254
- data/ext/carray_stat.c +0 -2100
- data/ext/carray_stat_proc.rb +0 -1999
- data/ext/mkmath.rb +0 -741
- data/ext/ruby_ccomplex.c +0 -509
- data/ext/ruby_float_func.c +0 -86
- data/lib/carray/array.rb +0 -8
- data/lib/carray/autoload/autoload_base.rb +0 -19
- data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
- data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
- data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
- data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
- data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
- data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
- data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
- data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
- data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
- data/lib/carray/autoload/autoload_gem_random.rb +0 -8
- data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
- data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
- data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
- data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
- data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
- data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
- data/lib/carray/autoload/autoload_object_link.rb +0 -1
- data/lib/carray/autoload/autoload_object_pack.rb +0 -2
- data/lib/carray/autoload.rb +0 -141
- data/lib/carray/basic.rb +0 -191
- data/lib/carray/broadcast.rb +0 -101
- data/lib/carray/compose.rb +0 -315
- data/lib/carray/convert.rb +0 -115
- data/lib/carray/info.rb +0 -110
- data/lib/carray/io/imagemagick.rb +0 -235
- data/lib/carray/mask.rb +0 -102
- data/lib/carray/math/histogram.rb +0 -177
- data/lib/carray/math/recurrence.rb +0 -93
- data/lib/carray/object/ca_obj_iterator.rb +0 -50
- data/lib/carray/object/ca_obj_link.rb +0 -50
- data/lib/carray/object/ca_obj_pack.rb +0 -99
- data/lib/carray/obsolete.rb +0 -256
- data/lib/carray/ordering.rb +0 -181
- data/lib/carray/testing.rb +0 -51
- data/lib/carray/transform.rb +0 -109
- data/misc/Methods.ja.md +0 -182
- data/misc/NOTE +0 -51
- data/spec/Classes/CABitfield_spec.rb +0 -58
- data/spec/Classes/CABlockIterator_spec.rb +0 -114
- data/spec/Classes/CABlock_spec.rb +0 -205
- data/spec/Classes/CAField_spec.rb +0 -39
- data/spec/Classes/CAGrid_spec.rb +0 -75
- data/spec/Classes/CAMap_spec.rb +0 -0
- data/spec/Classes/CAMapping_spec.rb +0 -105
- data/spec/Classes/CAObject_attribute_spec.rb +0 -33
- data/spec/Classes/CAObject_spec.rb +0 -33
- data/spec/Classes/CARefer_spec.rb +0 -93
- data/spec/Classes/CARepeat_spec.rb +0 -65
- data/spec/Classes/CASelect_spec.rb +0 -22
- data/spec/Classes/CAShift_spec.rb +0 -16
- data/spec/Classes/CAStruct_spec.rb +0 -71
- data/spec/Classes/CATranspose_spec.rb +0 -60
- data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
- data/spec/Classes/CAWindow_spec.rb +0 -54
- data/spec/Classes/CAWrap_spec.rb +0 -8
- data/spec/Classes/CArray_spec.rb +0 -184
- data/spec/Classes/CScalar_spec.rb +0 -55
- data/spec/Classes/ex1.rb +0 -46
- data/spec/Features/feature_130_spec.rb +0 -19
- data/spec/Features/feature_attributes_spec.rb +0 -280
- data/spec/Features/feature_boolean_spec.rb +0 -98
- data/spec/Features/feature_broadcast.rb +0 -116
- data/spec/Features/feature_cast_function.rb +0 -19
- data/spec/Features/feature_cast_spec.rb +0 -33
- data/spec/Features/feature_class_spec.rb +0 -84
- data/spec/Features/feature_complex_spec.rb +0 -42
- data/spec/Features/feature_composite_spec.rb +0 -124
- data/spec/Features/feature_convert_spec.rb +0 -46
- data/spec/Features/feature_copy_spec.rb +0 -123
- data/spec/Features/feature_creation_spec.rb +0 -84
- data/spec/Features/feature_element_spec.rb +0 -144
- data/spec/Features/feature_extream_spec.rb +0 -54
- data/spec/Features/feature_generate_spec.rb +0 -74
- data/spec/Features/feature_index_spec.rb +0 -69
- data/spec/Features/feature_mask_spec.rb +0 -580
- data/spec/Features/feature_math_spec.rb +0 -97
- data/spec/Features/feature_order_spec.rb +0 -146
- data/spec/Features/feature_ref_store_spec.rb +0 -209
- data/spec/Features/feature_serialization_spec.rb +0 -125
- data/spec/Features/feature_stat_spec.rb +0 -397
- data/spec/Features/feature_virtual_spec.rb +0 -48
- data/spec/Features/method_eq_spec.rb +0 -81
- data/spec/Features/method_is_nan_spec.rb +0 -12
- data/spec/Features/method_map_spec.rb +0 -54
- data/spec/Features/method_max_with.rb +0 -20
- data/spec/Features/method_min_with.rb +0 -19
- data/spec/Features/method_ne_spec.rb +0 -18
- data/spec/Features/method_project_spec.rb +0 -188
- data/spec/Features/method_ref_spec.rb +0 -27
- data/spec/Features/method_round_spec.rb +0 -11
- data/spec/Features/method_s_linspace_spec.rb +0 -48
- data/spec/Features/method_s_span_spec.rb +0 -14
- data/spec/Features/method_seq_spec.rb +0 -47
- data/spec/Features/method_sort_with.rb +0 -43
- data/spec/Features/method_sorted_with.rb +0 -29
- data/spec/Features/method_span_spec.rb +0 -42
- data/spec/Features/method_wrap_readonly_spec.rb +0 -43
- data/spec/UnitTest/test_CAVirtual.rb +0 -214
- data/spec/spec_all.rb +0 -10
- data/utils/ca_ase.rb +0 -21
- data/utils/ca_methods.rb +0 -15
- data/utils/cast_checker.rb +0 -30
- data/utils/convert_test.rb +0 -73
- data/utils/extract_yard.rb +0 -22
- data/utils/guess_shape.rb +0 -76
- data/utils/monkey_patch_methods.rb +0 -62
- data/utils/remove_resource_fork.sh +0 -5
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/* ---------------------------------------------------------------------------
|
|
2
|
+
|
|
3
|
+
---------------------------------------------------------------------------
|
|
4
|
+
|
|
5
|
+
PROPOSAL_CARRAY_H_REORG (H.3): the ext-author / math-backend surface.
|
|
6
|
+
|
|
7
|
+
This header carries the element-wise kernel calling-convention typedefs
|
|
8
|
+
(ca_monop_func_t / ca_binop_func_t / ...), the rb_ca_call_* drivers, and
|
|
9
|
+
(via the per-family dispatch headers it pulls in) the per-data_type kernel
|
|
10
|
+
dispatch tables (ca_monop_sin[CA_NTYPE], ...).
|
|
11
|
+
|
|
12
|
+
It is included by carray.h (the public umbrella), so an external gem that
|
|
13
|
+
does `#include "carray.h"` reaches the whole math-kernel surface with no
|
|
14
|
+
hand-declared externs — e.g. a vector-math backend gem can swap
|
|
15
|
+
`ca_monop_sin[CA_FLOAT64] = my_vector_sin;`.
|
|
16
|
+
|
|
17
|
+
Ordering invariant: the func typedefs below MUST precede the dispatch-header
|
|
18
|
+
includes (the tables are typed with them).
|
|
19
|
+
|
|
20
|
+
---------------------------------------------------------------------------- */
|
|
21
|
+
|
|
22
|
+
#ifndef CARRAY_MATH_KERNEL_H
|
|
23
|
+
#define CARRAY_MATH_KERNEL_H
|
|
24
|
+
|
|
25
|
+
#include "carray.h"
|
|
26
|
+
|
|
27
|
+
/* -------------------------------------------------------------------- */
|
|
28
|
+
/* Element-wise kernel calling-convention typedefs */
|
|
29
|
+
/* -------------------------------------------------------------------- */
|
|
30
|
+
|
|
31
|
+
typedef void (*ca_monop_func_t)(ca_size_t n, boolean8_t *m,
|
|
32
|
+
char *ptr1, ca_size_t i1,
|
|
33
|
+
char *ptr2, ca_size_t i2);
|
|
34
|
+
typedef void (*ca_binop_func_t)(ca_size_t n, boolean8_t *m,
|
|
35
|
+
char *ptr1, ca_size_t i1,
|
|
36
|
+
char *ptr2, ca_size_t i2,
|
|
37
|
+
char *ptr3, ca_size_t i3);
|
|
38
|
+
typedef void (*ca_triop_func_t)(ca_size_t n, boolean8_t *m,
|
|
39
|
+
char *ptr1, ca_size_t i1,
|
|
40
|
+
char *ptr2, ca_size_t i2,
|
|
41
|
+
char *ptr3, ca_size_t i3,
|
|
42
|
+
char *ptr4, ca_size_t i4);
|
|
43
|
+
typedef void (*ca_moncmp_func_t)(ca_size_t n, boolean8_t *m,
|
|
44
|
+
char *ptr1, ca_size_t i1,
|
|
45
|
+
boolean8_t *ptr2, ca_size_t i2);
|
|
46
|
+
/* IC.1 (PROPOSAL_IS_CLOSE_BINCMP_MIGRATION rev1): runtime `double tol`
|
|
47
|
+
slot added uniformly. Non-tolerance ops (eq/ne/lt/gt/le/ge/feq, etc.)
|
|
48
|
+
ignore it via `(void) tol;`. Tolerance ops (is_close, is_equiv) read
|
|
49
|
+
it in the comparison expression. See PROPOSAL §3.1 Option A. */
|
|
50
|
+
typedef void (*ca_bincmp_func_t)(ca_size_t n, boolean8_t *m,
|
|
51
|
+
char *ptr1, ca_size_t b1, ca_size_t i1,
|
|
52
|
+
char *ptr2, ca_size_t b2, ca_size_t i2,
|
|
53
|
+
char *ptr3, ca_size_t b3, ca_size_t i3,
|
|
54
|
+
double tol);
|
|
55
|
+
|
|
56
|
+
/* -------------------------------------------------------------------- */
|
|
57
|
+
/* Kernel drivers (attach / cast / mask / output-alloc are handled here, */
|
|
58
|
+
/* so a kernel receives a contig stride-resolved buffer + element count) */
|
|
59
|
+
/* -------------------------------------------------------------------- */
|
|
60
|
+
|
|
61
|
+
VALUE rb_ca_call_monop (VALUE self, ca_monop_func_t func[]);
|
|
62
|
+
VALUE rb_ca_call_monop_bang (VALUE self, ca_monop_func_t func[]);
|
|
63
|
+
/* Dtype-changing monop dispatch: out_data_types[in_data_type] gives the output
|
|
64
|
+
data_type for each input data_type (= -1 if not implemented). Used by
|
|
65
|
+
monops with output: { numeric: ..., complex: ... } Hash form (e.g. abs
|
|
66
|
+
cmplx128 -> f64). Allocates output array of out_data_types[in_data_type]. */
|
|
67
|
+
VALUE rb_ca_call_monop_typed (VALUE self, ca_monop_func_t func[], int8_t out_data_types[]);
|
|
68
|
+
VALUE rb_ca_call_binop (VALUE self, VALUE other, ca_binop_func_t func[]);
|
|
69
|
+
VALUE rb_ca_call_binop_bang (VALUE self, VALUE other, ca_binop_func_t func[]);
|
|
70
|
+
|
|
71
|
+
/* Kleene three-valued mask fixup for boolean AND (is_or=0) / OR (is_or=1),
|
|
72
|
+
applied by the generated `&`/`|` wrappers after rb_ca_call_binop. No-op
|
|
73
|
+
unless the output is boolean with a mask. */
|
|
74
|
+
VALUE ca_kleene_bool_fixup (VALUE vout, VALUE vself, VALUE vother, int is_or);
|
|
75
|
+
|
|
76
|
+
/* Triop driver: applies a 3-input / 1-output kernel. Operand 1 = self,
|
|
77
|
+
operands 2/3 are passed in. Common data_type promotion via
|
|
78
|
+
rb_ca_cast_self_or_other applied pairwise. Scalar / array
|
|
79
|
+
combinations (= 2^3 = 8 cases) are handled uniformly via
|
|
80
|
+
ca_set_iterator(3, ...) which collapses scalar operands to stride 0. */
|
|
81
|
+
VALUE rb_ca_call_triop (VALUE self, VALUE other2, VALUE other3,
|
|
82
|
+
ca_triop_func_t func[]);
|
|
83
|
+
VALUE rb_ca_call_triop_bang (VALUE self, VALUE other2, VALUE other3,
|
|
84
|
+
ca_triop_func_t func[]);
|
|
85
|
+
VALUE rb_ca_call_moncmp (VALUE self, ca_moncmp_func_t func[]);
|
|
86
|
+
VALUE rb_ca_call_bincmp (VALUE self, VALUE other, ca_bincmp_func_t func[], double tol);
|
|
87
|
+
void ca_monop_not_implement(ca_size_t n, boolean8_t *m,
|
|
88
|
+
char *ptr1, ca_size_t i1,
|
|
89
|
+
char *ptr2, ca_size_t i2) __attribute__((noreturn));
|
|
90
|
+
void ca_binop_not_implement(ca_size_t n, boolean8_t *m,
|
|
91
|
+
char *ptr1, ca_size_t i1,
|
|
92
|
+
char *ptr2, ca_size_t i2,
|
|
93
|
+
char *ptr3, ca_size_t i3) __attribute__((noreturn));
|
|
94
|
+
void ca_triop_not_implement(ca_size_t n, boolean8_t *m,
|
|
95
|
+
char *ptr1, ca_size_t i1,
|
|
96
|
+
char *ptr2, ca_size_t i2,
|
|
97
|
+
char *ptr3, ca_size_t i3,
|
|
98
|
+
char *ptr4, ca_size_t i4) __attribute__((noreturn));
|
|
99
|
+
void ca_moncmp_not_implement(ca_size_t n, boolean8_t *m,
|
|
100
|
+
char *ptr1, ca_size_t i1,
|
|
101
|
+
boolean8_t *ptr2, ca_size_t i2) __attribute__((noreturn));
|
|
102
|
+
void ca_bincmp_not_implement(ca_size_t n, boolean8_t *m,
|
|
103
|
+
char *ptr1, ca_size_t b1, ca_size_t i1,
|
|
104
|
+
char *ptr2, ca_size_t b2, ca_size_t i2,
|
|
105
|
+
char *ptr3, ca_size_t b3, ca_size_t i3,
|
|
106
|
+
double tol) __attribute__((noreturn));
|
|
107
|
+
VALUE ca_math_call (VALUE mod, VALUE arg, ID id);
|
|
108
|
+
|
|
109
|
+
/* -------------------------------------------------------------------- */
|
|
110
|
+
/* Per-data_type kernel dispatch tables + op_id enums + lookup APIs */
|
|
111
|
+
/* (must come after the func typedefs above — the tables are typed */
|
|
112
|
+
/* with them). */
|
|
113
|
+
/* -------------------------------------------------------------------- */
|
|
114
|
+
|
|
115
|
+
#include "ca_monop_dispatch.h"
|
|
116
|
+
#include "ca_binop_dispatch.h"
|
|
117
|
+
#include "ca_bincmp_dispatch.h"
|
|
118
|
+
#include "ca_moncmp_dispatch.h"
|
|
119
|
+
|
|
120
|
+
#endif /* CARRAY_MATH_KERNEL_H */
|
data/ext/carray_mathfunc.c
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/* ---------------------------------------------------------------------------
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
CAMath module functions whose semantics are not a 1-arg/1-arg
|
|
4
|
+
numeric kernel (= multi-input / multi-output cartesian conversions,
|
|
5
|
+
hand-written lgamma). Single-arg numeric ops (deg_360 / rad_pi /
|
|
6
|
+
atan2 / hypot / expm1 / etc.) live in ext/mkkernel.rb and are
|
|
7
|
+
registered via Init_carray_kernels.
|
|
8
8
|
|
|
9
9
|
---------------------------------------------------------------------------- */
|
|
10
10
|
|
|
@@ -18,166 +18,6 @@
|
|
|
18
18
|
|
|
19
19
|
/* ----------------------------------------------------------------------- */
|
|
20
20
|
|
|
21
|
-
static void
|
|
22
|
-
mathfunc_deg_360 (void *p0, void *p1)
|
|
23
|
-
{
|
|
24
|
-
double a = *(double*) p1;
|
|
25
|
-
double fa = a / 360.0;
|
|
26
|
-
if ( a >= 0 ) {
|
|
27
|
-
*(double*) p0 = (fa - floor(fa)) * 360.0;
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
*(double*) p0 = (fa - ceil(fa) + 1) * 360.0;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
static VALUE
|
|
35
|
-
rb_ca_deg_360 (VALUE self)
|
|
36
|
-
{
|
|
37
|
-
return ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_deg_360, self);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
static VALUE
|
|
41
|
-
rb_ca_deg_360_bang (VALUE self)
|
|
42
|
-
{
|
|
43
|
-
volatile VALUE out;
|
|
44
|
-
out = ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_deg_360, self);
|
|
45
|
-
rb_funcall(self, rb_intern("[]="), 1, out);
|
|
46
|
-
return self;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
static VALUE
|
|
50
|
-
rb_num_deg_360 (VALUE self)
|
|
51
|
-
{
|
|
52
|
-
double v0, v1 = NUM2DBL(self);
|
|
53
|
-
mathfunc_deg_360(&v0, &v1);
|
|
54
|
-
return rb_float_new(v0);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/* ----------------------------------------------------------------------- */
|
|
58
|
-
|
|
59
|
-
static void
|
|
60
|
-
mathfunc_deg_180 (void *p0, void *p1)
|
|
61
|
-
{
|
|
62
|
-
double a = *(double*) p1, b;
|
|
63
|
-
double fa = (a+180.0) / 360.0;
|
|
64
|
-
if ( a >= 0 ) {
|
|
65
|
-
b = (fa - floor(fa)) * 360.0 - 180;
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
b = (fa - ceil(fa)) * 360.0 - 180;
|
|
69
|
-
}
|
|
70
|
-
if ( b <= -180 ) {
|
|
71
|
-
b += 360.0;
|
|
72
|
-
}
|
|
73
|
-
*(double*) p0 = b;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
static VALUE
|
|
77
|
-
rb_ca_deg_180 (VALUE self)
|
|
78
|
-
{
|
|
79
|
-
return ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_deg_180, self);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
static VALUE
|
|
83
|
-
rb_ca_deg_180_bang (VALUE self)
|
|
84
|
-
{
|
|
85
|
-
volatile VALUE out;
|
|
86
|
-
out = ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_deg_180, self);
|
|
87
|
-
rb_funcall(self, rb_intern("[]="), 1, out);
|
|
88
|
-
return self;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
static VALUE
|
|
92
|
-
rb_num_deg_180 (VALUE self)
|
|
93
|
-
{
|
|
94
|
-
double v0, v1 = NUM2DBL(self);
|
|
95
|
-
mathfunc_deg_180(&v0, &v1);
|
|
96
|
-
return rb_float_new(v0);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/* ----------------------------------------------------------------------- */
|
|
100
|
-
|
|
101
|
-
static void
|
|
102
|
-
mathfunc_rad_2pi (void *p0, void *p1)
|
|
103
|
-
{
|
|
104
|
-
double a = *(double*) p1;
|
|
105
|
-
double fa = a / (2*M_PI);
|
|
106
|
-
if ( a >= 0 ) {
|
|
107
|
-
*(double*) p0 = (fa - floor(fa)) * 2*M_PI;
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
*(double*) p0 = (fa - ceil(fa) + 1) * 2*M_PI;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
static VALUE
|
|
115
|
-
rb_ca_rad_2pi (VALUE self)
|
|
116
|
-
{
|
|
117
|
-
return ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_rad_2pi, self);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
static VALUE
|
|
121
|
-
rb_ca_rad_2pi_bang (VALUE self)
|
|
122
|
-
{
|
|
123
|
-
volatile VALUE out;
|
|
124
|
-
out = ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_rad_2pi, self);
|
|
125
|
-
rb_funcall(self, rb_intern("[]="), 1, out);
|
|
126
|
-
return self;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
static VALUE
|
|
130
|
-
rb_num_rad_2pi (VALUE self)
|
|
131
|
-
{
|
|
132
|
-
double v0, v1 = NUM2DBL(self);
|
|
133
|
-
mathfunc_rad_2pi(&v0, &v1);
|
|
134
|
-
return rb_float_new(v0);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/* ----------------------------------------------------------------------- */
|
|
138
|
-
|
|
139
|
-
static void
|
|
140
|
-
mathfunc_rad_pi (void *p0, void *p1)
|
|
141
|
-
{
|
|
142
|
-
double a = *(double*) p1, b;
|
|
143
|
-
double fa = (a+M_PI) / (2*M_PI);
|
|
144
|
-
if ( a >= 0 ) {
|
|
145
|
-
b = (fa - floor(fa)) * 2*M_PI - M_PI;
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
b = (fa - ceil(fa)) * 2*M_PI - M_PI;
|
|
149
|
-
}
|
|
150
|
-
if ( b <= -M_PI ) {
|
|
151
|
-
b += 2*M_PI;
|
|
152
|
-
}
|
|
153
|
-
*(double*) p0 = b;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
static VALUE
|
|
157
|
-
rb_ca_rad_pi (VALUE self)
|
|
158
|
-
{
|
|
159
|
-
return ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_rad_pi, self);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
static VALUE
|
|
163
|
-
rb_ca_rad_pi_bang (VALUE self)
|
|
164
|
-
{
|
|
165
|
-
volatile VALUE out;
|
|
166
|
-
out = ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_rad_pi, self);
|
|
167
|
-
rb_funcall(self, rb_intern("[]="), 1, out);
|
|
168
|
-
return self;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
static VALUE
|
|
172
|
-
rb_num_rad_pi (VALUE self)
|
|
173
|
-
{
|
|
174
|
-
double v0, v1 = NUM2DBL(self);
|
|
175
|
-
mathfunc_rad_pi(&v0, &v1);
|
|
176
|
-
return rb_float_new(v0);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/* ----------------------------------------------------------------------- */
|
|
180
|
-
|
|
181
21
|
static void
|
|
182
22
|
mathfunc_sph_to_xyz (void *p0, void *p1, void *p2, void *p3, void *p4, void *p5)
|
|
183
23
|
{
|
|
@@ -219,43 +59,9 @@ rb_camath_xyz_to_sph (VALUE mod, VALUE rx1, VALUE rx2, VALUE rx3)
|
|
|
219
59
|
|
|
220
60
|
/* ----------------------------------------------------------------------- */
|
|
221
61
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
#ifdef HAVE_ATAN2
|
|
226
|
-
*(double*)p0 = atan2(*(double*)p1, *(double*)p2);
|
|
227
|
-
#else
|
|
228
|
-
rb_raise(rb_eRuntimeError, "atan2 is not defined");
|
|
229
|
-
#endif
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
static VALUE
|
|
233
|
-
rb_camath_atan2 (VALUE mod, VALUE rx1, VALUE rx2)
|
|
234
|
-
{
|
|
235
|
-
return ca_call_cfunc_1_2(CA_DOUBLE, CA_DOUBLE, CA_DOUBLE,
|
|
236
|
-
mathfunc_atan2, rx1, rx2);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/* ----------------------------------------------------------------------- */
|
|
240
|
-
|
|
241
|
-
static void
|
|
242
|
-
mathfunc_hypot (void *p0, void *p1, void *p2)
|
|
243
|
-
{
|
|
244
|
-
#ifdef HAVE_HYPOT
|
|
245
|
-
*(double *)p0 = hypot(*(double*)p1, *(double*)p2);
|
|
246
|
-
#else
|
|
247
|
-
rb_raise(rb_eRuntimeError, "hypot is not defined");
|
|
248
|
-
#endif
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
static VALUE
|
|
252
|
-
rb_camath_hypot (VALUE mod, VALUE rx1, VALUE rx2)
|
|
253
|
-
{
|
|
254
|
-
return ca_call_cfunc_1_2(CA_DOUBLE, CA_DOUBLE, CA_DOUBLE,
|
|
255
|
-
mathfunc_hypot, rx1, rx2);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/* ----------------------------------------------------------------------- */
|
|
62
|
+
/* [MOVED] atan2 / hypot / expm1 -> ext/mkkernel.rb (binop / monfunc
|
|
63
|
+
tables); their CAMath wrappers live in lib/carray/math.rb. lgamma
|
|
64
|
+
stays hand-written here because no mkkernel slot exists for it. */
|
|
259
65
|
|
|
260
66
|
static void
|
|
261
67
|
mathfunc_lgamma (void *p0, void *p1)
|
|
@@ -273,47 +79,10 @@ rb_camath_lgamma (VALUE mod, VALUE rx1)
|
|
|
273
79
|
return ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_lgamma, rx1);
|
|
274
80
|
}
|
|
275
81
|
|
|
276
|
-
/* ----------------------------------------------------------------------- */
|
|
277
|
-
|
|
278
|
-
static void
|
|
279
|
-
mathfunc_expm1 (void *p0, void *p1)
|
|
280
|
-
{
|
|
281
|
-
#ifdef HAVE_EXP1M
|
|
282
|
-
*(double *)p0 = expm1(*(double*)p1);
|
|
283
|
-
#else
|
|
284
|
-
rb_raise(rb_eRuntimeError, "expm1 is not defined ");
|
|
285
|
-
#endif
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
static VALUE
|
|
289
|
-
rb_camath_expm1 (VALUE mod, VALUE rx1)
|
|
290
|
-
{
|
|
291
|
-
return ca_call_cfunc_1_1(CA_DOUBLE, CA_DOUBLE, mathfunc_expm1, rx1);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
82
|
void
|
|
295
|
-
Init_carray_mathfunc ()
|
|
83
|
+
Init_carray_mathfunc (void)
|
|
296
84
|
{
|
|
297
|
-
rb_define_method(rb_cCArray, "deg_360", rb_ca_deg_360, 0);
|
|
298
|
-
rb_define_method(rb_cCArray, "deg_360!", rb_ca_deg_360_bang, 0);
|
|
299
|
-
rb_define_method(rb_cCArray, "deg_180", rb_ca_deg_180, 0);
|
|
300
|
-
rb_define_method(rb_cCArray, "deg_180!", rb_ca_deg_180_bang, 0);
|
|
301
|
-
rb_define_method(rb_cCArray, "rad_2pi", rb_ca_rad_2pi, 0);
|
|
302
|
-
rb_define_method(rb_cCArray, "rad_2pi!", rb_ca_rad_2pi_bang, 0);
|
|
303
|
-
rb_define_method(rb_cCArray, "rad_pi", rb_ca_rad_pi, 0);
|
|
304
|
-
rb_define_method(rb_cCArray, "rad_pi!", rb_ca_rad_pi_bang, 0);
|
|
305
|
-
|
|
306
85
|
rb_define_module_function(rb_mCAMath, "spherical_to_xyz", rb_camath_sph_to_xyz, 3);
|
|
307
86
|
rb_define_module_function(rb_mCAMath, "xyz_to_spherical", rb_camath_xyz_to_sph, 3);
|
|
308
|
-
|
|
309
|
-
rb_define_module_function(rb_mCAMath, "atan2", rb_camath_atan2, 2);
|
|
310
|
-
rb_define_module_function(rb_mCAMath, "hypot", rb_camath_hypot, 2);
|
|
311
|
-
|
|
312
|
-
rb_define_module_function(rb_mCAMath, "lgamma", rb_camath_lgamma, 1);
|
|
313
|
-
rb_define_module_function(rb_mCAMath, "expm1", rb_camath_expm1, 1);
|
|
314
|
-
|
|
315
|
-
rb_define_method(rb_cNumeric, "deg_360", rb_num_deg_360, 0);
|
|
316
|
-
rb_define_method(rb_cNumeric, "deg_180", rb_num_deg_180, 0);
|
|
317
|
-
rb_define_method(rb_cNumeric, "rad_2pi", rb_num_rad_2pi, 0);
|
|
318
|
-
rb_define_method(rb_cNumeric, "rad_pi", rb_num_rad_pi, 0);
|
|
87
|
+
rb_define_module_function(rb_mCAMath, "lgamma", rb_camath_lgamma, 1);
|
|
319
88
|
}
|