carray 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.yardopts +5 -25
- data/CHANGELOG.md +16 -0
- data/LICENSE +1 -1
- data/NEWS.md +3 -0
- data/README.md +128 -44
- data/carray.gemspec +22 -24
- data/ext/ca_array_pool.c +91 -0
- data/ext/ca_axis_descriptor.h +186 -0
- data/ext/ca_axis_dispatch.c +924 -0
- data/ext/ca_axis_group.c +1208 -0
- data/ext/ca_bincmp_dispatch.c +76 -0
- data/ext/ca_bincmp_dispatch.h +85 -0
- data/ext/ca_binop_dispatch.c +125 -0
- data/ext/ca_binop_dispatch.h +159 -0
- data/ext/ca_categorical_iterator.c +1375 -0
- data/ext/ca_compare.c +94 -0
- data/ext/ca_compare.h +26 -0
- data/ext/ca_composite_dispatch.c +414 -0
- data/ext/ca_composite_dispatch.h +116 -0
- data/ext/ca_for_buffer.h +96 -0
- data/ext/ca_for_each_element.h +241 -0
- data/ext/ca_group_iter.c +304 -0
- data/ext/ca_iter_substrate.h +325 -0
- data/ext/ca_kernel_iterator.c +4321 -0
- data/ext/ca_kernel_iterator.h +2603 -0
- data/ext/ca_moncmp_dispatch.c +37 -0
- data/ext/ca_moncmp_dispatch.h +62 -0
- data/ext/ca_monop_dispatch.c +200 -0
- data/ext/ca_monop_dispatch.h +235 -0
- data/ext/ca_obj_array.c +355 -359
- data/ext/ca_obj_bincmp.c +809 -0
- data/ext/ca_obj_binop.c +892 -0
- data/ext/ca_obj_bitarray.c +369 -164
- data/ext/ca_obj_bitfield.c +294 -234
- data/ext/ca_obj_block.c +189 -711
- data/ext/ca_obj_byte_swap.c +766 -0
- data/ext/ca_obj_const_string.c +965 -0
- data/ext/ca_obj_face.c +670 -0
- data/ext/ca_obj_face.h +247 -0
- data/ext/ca_obj_fake.c +228 -100
- data/ext/ca_obj_farray.c +54 -441
- data/ext/ca_obj_field.c +82 -529
- data/ext/ca_obj_fixlen_string.c +306 -0
- data/ext/ca_obj_grid.c +858 -440
- data/ext/ca_obj_meld.c +1034 -0
- data/ext/ca_obj_moncmp.c +569 -0
- data/ext/ca_obj_monop.c +1111 -0
- data/ext/ca_obj_object.c +774 -298
- data/ext/ca_obj_record.c +468 -0
- data/ext/ca_obj_reduce.c +97 -82
- data/ext/ca_obj_refer.c +569 -459
- data/ext/ca_obj_remap.c +475 -0
- data/ext/ca_obj_repeat.c +92 -477
- data/ext/ca_obj_roll.c +616 -0
- data/ext/ca_obj_select.c +344 -296
- data/ext/ca_obj_select_axis.c +1296 -0
- data/ext/ca_obj_shift.c +230 -792
- data/ext/ca_obj_source.c +78 -0
- data/ext/ca_obj_stack.c +1173 -0
- data/ext/ca_obj_stride.c +2501 -0
- data/ext/ca_obj_string.c +268 -0
- data/ext/ca_obj_tile.c +614 -0
- data/ext/ca_obj_time.c +546 -0
- data/ext/ca_obj_timedelta.c +435 -0
- data/ext/ca_obj_transpose.c +62 -516
- data/ext/ca_obj_triop.c +746 -0
- data/ext/ca_obj_unbound_repeat.c +208 -241
- data/ext/ca_obj_window.c +1131 -563
- data/ext/ca_op_byte_swap.c +175 -0
- data/ext/ca_op_ipower.c +319 -0
- data/ext/ca_op_powi.h +88 -0
- data/ext/ca_sort_kernels.h +132 -0
- data/ext/ca_sweep_engine.c +430 -0
- data/ext/ca_sweep_engine.h +157 -0
- data/ext/ca_transform_common.c +228 -0
- data/ext/ca_triop_dispatch.c +55 -0
- data/ext/ca_triop_dispatch.h +62 -0
- data/ext/carray.h +795 -402
- data/ext/carray_access.c +831 -711
- data/ext/carray_attribute.c +98 -330
- data/ext/carray_bincount.c +255 -0
- data/ext/carray_broadcast.c +283 -0
- data/ext/carray_call_cfunc.c +1360 -828
- data/ext/carray_call_cfunc.h +160 -0
- data/ext/carray_cast.c +1212 -301
- data/ext/carray_cast_func.rb +81 -40
- data/ext/carray_class.c +53 -63
- data/ext/carray_config.h +28 -0
- data/ext/carray_conversion.c +350 -346
- data/ext/carray_copy.c +156 -268
- data/ext/carray_core.c +1342 -199
- data/ext/carray_count.c +312 -0
- data/ext/carray_data_type.c +43 -19
- data/ext/carray_element.c +585 -213
- data/ext/carray_factorize.c +2542 -0
- data/ext/carray_generate.c +230 -559
- data/ext/carray_histogram.c +490 -0
- data/ext/carray_hold.c +228 -0
- data/ext/carray_index_classifier.c +1035 -0
- data/ext/carray_index_classifier.h +27 -0
- data/ext/carray_internal.h +120 -0
- data/ext/carray_kernels_bincmp.c +4445 -0
- data/ext/carray_kernels_binop.c +10979 -0
- data/ext/carray_kernels_init.c +36 -0
- data/ext/carray_kernels_map.c +3466 -0
- data/ext/carray_kernels_moncmp.c +2096 -0
- data/ext/carray_kernels_monop.c +18312 -0
- data/ext/carray_kernels_reduce_aggregate.c +25836 -0
- data/ext/carray_kernels_reduce_boolean.c +329 -0
- data/ext/carray_kernels_reduce_cumulative.c +14592 -0
- data/ext/carray_kernels_reduce_extreme.c +16947 -0
- data/ext/carray_kernels_reduce_variance.c +3909 -0
- data/ext/carray_kernels_scan.c +3692 -0
- data/ext/carray_kernels_search.c +32137 -0
- data/ext/carray_kernels_sort.c +10625 -0
- data/ext/carray_kernels_triop.c +1391 -0
- data/ext/carray_lazy.c +567 -0
- data/ext/carray_loop.c +88 -200
- data/ext/carray_mask.c +848 -154
- data/ext/carray_math_kernel.h +120 -0
- data/ext/carray_mathfunc.c +10 -241
- data/ext/carray_median_percentile.c +1257 -0
- data/ext/carray_memory_view.c +1625 -0
- data/ext/carray_operator.c +1526 -318
- data/ext/carray_order.c +664 -1394
- data/ext/carray_partition.c +416 -0
- data/ext/carray_random.c +518 -0
- data/ext/carray_scatter.c +357 -0
- data/ext/carray_slab.c +1219 -0
- data/ext/carray_slab.h +84 -0
- data/ext/carray_sort.c +829 -0
- data/ext/carray_sort_kernel.c +620 -0
- data/ext/carray_struct.c +695 -0
- data/ext/carray_test.c +343 -229
- data/ext/carray_undef.c +34 -17
- data/ext/carray_utils.c +175 -74
- data/ext/extconf.rb +216 -55
- data/ext/mk_call_cfunc.rb +480 -0
- data/ext/mkkernel.rb +8842 -0
- data/ext/ruby_carray.c +202 -101
- data/ext/version.h +4 -14
- data/ext/version.rb +5 -13
- data/lib/carray/arrow_tensor.rb +401 -0
- data/lib/carray/attribute.rb +166 -0
- data/lib/carray/autoload_carray.rb +220 -0
- data/lib/carray/autoload_method_extension.rb +44 -0
- data/lib/carray/axis_group.rb +711 -0
- data/lib/carray/basics.rb +481 -0
- data/lib/carray/bincount_nd.rb +358 -0
- data/lib/carray/block_iterator.rb +604 -0
- data/lib/carray/boolean_reduce.rb +109 -0
- data/lib/carray/categorical.rb +561 -0
- data/lib/carray/categorical_iterator.rb +1062 -0
- data/lib/carray/complex.rb +150 -0
- data/lib/carray/conditional.rb +216 -0
- data/lib/carray/const_string.rb +228 -0
- data/lib/carray/construct.rb +139 -328
- data/lib/carray/core_extensions.rb +240 -0
- data/lib/carray/data_type_extension.rb +233 -0
- data/lib/carray/fixlen_string.rb +95 -0
- data/lib/carray/frame/concat.rb +132 -0
- data/lib/carray/frame/convert.rb +95 -0
- data/lib/carray/frame/csv_parser.rb +211 -0
- data/lib/carray/frame/frame.rb +649 -0
- data/lib/carray/frame/group.rb +186 -0
- data/lib/carray/frame/io.rb +164 -0
- data/lib/carray/frame/join.rb +248 -0
- data/lib/carray/frame/records.rb +99 -0
- data/lib/carray/frame/sort.rb +113 -0
- data/lib/carray/frame/verbs.rb +299 -0
- data/lib/carray/frame.rb +16 -0
- data/lib/carray/histogram.rb +512 -0
- data/lib/carray/inspect.rb +37 -20
- data/lib/carray/iterator.rb +57 -349
- data/lib/carray/lazy.rb +889 -0
- data/lib/carray/mask_gap_fill.rb +200 -0
- data/lib/carray/math.rb +78 -342
- data/lib/carray/meld_reduce.rb +289 -0
- data/lib/carray/methods/align_addr.rb +116 -0
- data/lib/carray/methods/bin.rb +128 -0
- data/lib/carray/methods/bincount.rb +87 -0
- data/lib/carray/methods/bit_string.rb +92 -0
- data/lib/carray/methods/broadcast.rb +63 -0
- data/lib/carray/methods/choose.rb +39 -0
- data/lib/carray/methods/composition.rb +280 -0
- data/lib/carray/methods/gather_nd.rb +206 -0
- data/lib/carray/methods/index.rb +39 -0
- data/lib/carray/methods/insert_block.rb +99 -0
- data/lib/carray/methods/is_in.rb +141 -0
- data/lib/carray/methods/join.rb +90 -0
- data/lib/carray/methods/locate_addr.rb +47 -0
- data/lib/carray/methods/mask_duplicates.rb +41 -0
- data/lib/carray/methods/meshgrid.rb +91 -0
- data/lib/carray/methods/mode.rb +126 -0
- data/lib/carray/methods/nunique.rb +46 -0
- data/lib/carray/methods/resize.rb +56 -0
- data/lib/carray/methods/snap.rb +156 -0
- data/lib/carray/methods/string_format.rb +57 -0
- data/lib/carray/methods/unique.rb +47 -0
- data/lib/carray/methods/value_counts.rb +71 -0
- data/lib/carray/mkmf.rb +124 -101
- data/lib/carray/runtime.rb +108 -0
- data/lib/carray/serialize.rb +478 -167
- data/lib/carray/slab_iterator.rb +292 -0
- data/lib/carray/stack.rb +291 -0
- data/lib/carray/string.rb +56 -180
- data/lib/carray/string_operation_extension.rb +289 -0
- data/lib/carray/struct.rb +335 -323
- data/lib/carray/struct_builder.rb +697 -0
- data/lib/carray/table.rb +41 -2
- data/lib/carray/time.rb +2255 -38
- data/lib/carray/window_iterator.rb +655 -0
- data/lib/carray.rb +55 -57
- metadata +163 -130
- data/Rakefile +0 -51
- data/TODO.md +0 -18
- data/ext/ca_iter_block.c +0 -257
- data/ext/ca_iter_dimension.c +0 -299
- data/ext/ca_iter_window.c +0 -214
- data/ext/ca_obj_mapping.c +0 -644
- data/ext/carray_iterator.c +0 -641
- data/ext/carray_math.rb +0 -850
- data/ext/carray_numeric.c +0 -259
- data/ext/carray_sort_addr.c +0 -254
- data/ext/carray_stat.c +0 -2100
- data/ext/carray_stat_proc.rb +0 -1999
- data/ext/mkmath.rb +0 -741
- data/ext/ruby_ccomplex.c +0 -509
- data/ext/ruby_float_func.c +0 -86
- data/lib/carray/array.rb +0 -8
- data/lib/carray/autoload/autoload_base.rb +0 -19
- data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
- data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
- data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
- data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
- data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
- data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
- data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
- data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
- data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
- data/lib/carray/autoload/autoload_gem_random.rb +0 -8
- data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
- data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
- data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
- data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
- data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
- data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
- data/lib/carray/autoload/autoload_object_link.rb +0 -1
- data/lib/carray/autoload/autoload_object_pack.rb +0 -2
- data/lib/carray/autoload.rb +0 -141
- data/lib/carray/basic.rb +0 -191
- data/lib/carray/broadcast.rb +0 -101
- data/lib/carray/compose.rb +0 -315
- data/lib/carray/convert.rb +0 -115
- data/lib/carray/info.rb +0 -110
- data/lib/carray/io/imagemagick.rb +0 -235
- data/lib/carray/mask.rb +0 -102
- data/lib/carray/math/histogram.rb +0 -177
- data/lib/carray/math/recurrence.rb +0 -93
- data/lib/carray/object/ca_obj_iterator.rb +0 -50
- data/lib/carray/object/ca_obj_link.rb +0 -50
- data/lib/carray/object/ca_obj_pack.rb +0 -99
- data/lib/carray/obsolete.rb +0 -256
- data/lib/carray/ordering.rb +0 -181
- data/lib/carray/testing.rb +0 -51
- data/lib/carray/transform.rb +0 -109
- data/misc/Methods.ja.md +0 -182
- data/misc/NOTE +0 -51
- data/spec/Classes/CABitfield_spec.rb +0 -58
- data/spec/Classes/CABlockIterator_spec.rb +0 -114
- data/spec/Classes/CABlock_spec.rb +0 -205
- data/spec/Classes/CAField_spec.rb +0 -39
- data/spec/Classes/CAGrid_spec.rb +0 -75
- data/spec/Classes/CAMap_spec.rb +0 -0
- data/spec/Classes/CAMapping_spec.rb +0 -105
- data/spec/Classes/CAObject_attribute_spec.rb +0 -33
- data/spec/Classes/CAObject_spec.rb +0 -33
- data/spec/Classes/CARefer_spec.rb +0 -93
- data/spec/Classes/CARepeat_spec.rb +0 -65
- data/spec/Classes/CASelect_spec.rb +0 -22
- data/spec/Classes/CAShift_spec.rb +0 -16
- data/spec/Classes/CAStruct_spec.rb +0 -71
- data/spec/Classes/CATranspose_spec.rb +0 -60
- data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
- data/spec/Classes/CAWindow_spec.rb +0 -54
- data/spec/Classes/CAWrap_spec.rb +0 -8
- data/spec/Classes/CArray_spec.rb +0 -184
- data/spec/Classes/CScalar_spec.rb +0 -55
- data/spec/Classes/ex1.rb +0 -46
- data/spec/Features/feature_130_spec.rb +0 -19
- data/spec/Features/feature_attributes_spec.rb +0 -280
- data/spec/Features/feature_boolean_spec.rb +0 -98
- data/spec/Features/feature_broadcast.rb +0 -116
- data/spec/Features/feature_cast_function.rb +0 -19
- data/spec/Features/feature_cast_spec.rb +0 -33
- data/spec/Features/feature_class_spec.rb +0 -84
- data/spec/Features/feature_complex_spec.rb +0 -42
- data/spec/Features/feature_composite_spec.rb +0 -124
- data/spec/Features/feature_convert_spec.rb +0 -46
- data/spec/Features/feature_copy_spec.rb +0 -123
- data/spec/Features/feature_creation_spec.rb +0 -84
- data/spec/Features/feature_element_spec.rb +0 -144
- data/spec/Features/feature_extream_spec.rb +0 -54
- data/spec/Features/feature_generate_spec.rb +0 -74
- data/spec/Features/feature_index_spec.rb +0 -69
- data/spec/Features/feature_mask_spec.rb +0 -580
- data/spec/Features/feature_math_spec.rb +0 -97
- data/spec/Features/feature_order_spec.rb +0 -146
- data/spec/Features/feature_ref_store_spec.rb +0 -209
- data/spec/Features/feature_serialization_spec.rb +0 -125
- data/spec/Features/feature_stat_spec.rb +0 -397
- data/spec/Features/feature_virtual_spec.rb +0 -48
- data/spec/Features/method_eq_spec.rb +0 -81
- data/spec/Features/method_is_nan_spec.rb +0 -12
- data/spec/Features/method_map_spec.rb +0 -54
- data/spec/Features/method_max_with.rb +0 -20
- data/spec/Features/method_min_with.rb +0 -19
- data/spec/Features/method_ne_spec.rb +0 -18
- data/spec/Features/method_project_spec.rb +0 -188
- data/spec/Features/method_ref_spec.rb +0 -27
- data/spec/Features/method_round_spec.rb +0 -11
- data/spec/Features/method_s_linspace_spec.rb +0 -48
- data/spec/Features/method_s_span_spec.rb +0 -14
- data/spec/Features/method_seq_spec.rb +0 -47
- data/spec/Features/method_sort_with.rb +0 -43
- data/spec/Features/method_sorted_with.rb +0 -29
- data/spec/Features/method_span_spec.rb +0 -42
- data/spec/Features/method_wrap_readonly_spec.rb +0 -43
- data/spec/UnitTest/test_CAVirtual.rb +0 -214
- data/spec/spec_all.rb +0 -10
- data/utils/ca_ase.rb +0 -21
- data/utils/ca_methods.rb +0 -15
- data/utils/cast_checker.rb +0 -30
- data/utils/convert_test.rb +0 -73
- data/utils/extract_yard.rb +0 -22
- data/utils/guess_shape.rb +0 -76
- data/utils/monkey_patch_methods.rb +0 -62
- data/utils/remove_resource_fork.sh +0 -5
data/lib/carray/mkmf.rb
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
# ----------------------------------------------------------------------------
|
|
2
|
-
#
|
|
3
|
-
# carray/mkmf.rb
|
|
4
|
-
#
|
|
5
|
-
# This file is part of Ruby/CArray extension library.
|
|
6
|
-
#
|
|
7
|
-
# Copyright (C) 2005-2020 Hiroki Motoyoshi
|
|
8
|
-
#
|
|
9
|
-
# ----------------------------------------------------------------------------
|
|
10
|
-
|
|
11
1
|
require 'mkmf'
|
|
12
2
|
|
|
3
|
+
# Locates an installed Ruby/CArray and wires its header (and, on Windows,
|
|
4
|
+
# its import library) into the extension being configured. Call this at the
|
|
5
|
+
# top of a companion gem's `extconf.rb`.
|
|
6
|
+
#
|
|
7
|
+
# @return [Boolean] whether every required piece was found.
|
|
13
8
|
def have_carray
|
|
14
9
|
begin
|
|
15
10
|
require 'carray'
|
|
@@ -18,28 +13,10 @@ def have_carray
|
|
|
18
13
|
end
|
|
19
14
|
$LOAD_PATH.each do |path|
|
|
20
15
|
if File.exist? File.join(path, 'carray.h')
|
|
21
|
-
dir_config("carray", path, path)
|
|
16
|
+
dir_config("carray", path, path)
|
|
22
17
|
break
|
|
23
18
|
end
|
|
24
19
|
end
|
|
25
|
-
=begin
|
|
26
|
-
dir_config("carray", $sitearchdir, $sitearchdir)
|
|
27
|
-
if defined? Gem
|
|
28
|
-
if Gem::VERSION >= "1.7.0"
|
|
29
|
-
begin
|
|
30
|
-
Gem::Specification.find_all_by_name("carray").each do |spec|
|
|
31
|
-
dir = spec.full_gem_path
|
|
32
|
-
dir_config("carray", dir, dir)
|
|
33
|
-
end
|
|
34
|
-
rescue Gem::LoadError
|
|
35
|
-
end
|
|
36
|
-
else
|
|
37
|
-
Gem.all_load_paths.grep(/narray/).each do |dir|
|
|
38
|
-
dir_config("carray", dir, dir)
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
=end
|
|
43
20
|
status = true
|
|
44
21
|
status &= have_header("carray.h")
|
|
45
22
|
if /cygwin|mingw/ =~ RUBY_PLATFORM
|
|
@@ -48,79 +25,25 @@ def have_carray
|
|
|
48
25
|
status
|
|
49
26
|
end
|
|
50
27
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
SRC_EXT << "f" << "f90" << "f95"
|
|
54
|
-
|
|
55
|
-
fortran = with_config("fortran", "gfortran")
|
|
56
|
-
fflags = with_config("fflags", "")
|
|
57
|
-
|
|
58
|
-
case fortran
|
|
59
|
-
when /\Ag77/
|
|
60
|
-
libdir = File.dirname(`#{fortran} --print-file-name=libg2c.a`)
|
|
61
|
-
dir_config("g2c", possible_includes, [libdir]+possible_libs)
|
|
62
|
-
have_library("g2c")
|
|
63
|
-
fc = fortran
|
|
64
|
-
fflags << " -O2 -g "
|
|
65
|
-
when /\Agfortran/
|
|
66
|
-
libdir = File.dirname(`#{fortran} --print-file-name=libgfortran.a`)
|
|
67
|
-
dir_config("gfortran", possible_includes, [libdir]+possible_libs)
|
|
68
|
-
have_library("gfortran")
|
|
69
|
-
fc = fortran
|
|
70
|
-
fflags << " -O2 -g -fPIC "
|
|
71
|
-
when /\Aintel/, /\Aifort/, /\Aifc/
|
|
72
|
-
libdir = File.join(File.dirname(File.dirname(`which ifort`)), "lib")
|
|
73
|
-
dir_config("ifcore", possible_includes, [libdir]+possible_libs)
|
|
74
|
-
have_library("ifcore")
|
|
75
|
-
have_library("ifport")
|
|
76
|
-
have_library("imf")
|
|
77
|
-
have_library("irc")
|
|
78
|
-
have_library("svml")
|
|
79
|
-
have_library("unwind")
|
|
80
|
-
fc = "ifort"
|
|
81
|
-
fflags << " -O2 -fPIC "
|
|
82
|
-
when /\Afujitsu/, /\Afrt/
|
|
83
|
-
libdir = File.join(File.dirname(File.dirname(`which frt`)), "lib")
|
|
84
|
-
dir_config("fj9f6", nil, libdir)
|
|
85
|
-
$LIBS = " -lfj9i6 -lfj9f6"
|
|
86
|
-
fc = "frt"
|
|
87
|
-
fflags = " -O -fw "
|
|
88
|
-
else
|
|
89
|
-
puts "unknown fortran option <#{fortran}>"
|
|
90
|
-
exit(1)
|
|
91
|
-
end
|
|
92
|
-
at_exit {
|
|
93
|
-
if File.file?("Makefile")
|
|
94
|
-
makefile = File.read("Makefile")
|
|
95
|
-
unless makefile =~ /^FC=/
|
|
96
|
-
makefile.sub!(/^COPY =.*$/,
|
|
97
|
-
'\0' + "\n\n" +
|
|
98
|
-
"FC=#{fc}\n" +
|
|
99
|
-
"FFLAGS=#{fflags}\n")
|
|
100
|
-
end
|
|
101
|
-
open("Makefile", "w") { |io| io.write(makefile) }
|
|
102
|
-
end
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
return "--with-fortran='#{fortran}' --with-fflags='#{fflags}'"
|
|
106
|
-
|
|
107
|
-
end
|
|
108
|
-
|
|
28
|
+
# @!visibility private
|
|
109
29
|
def possible_prefix (*postfixes)
|
|
110
30
|
dirs = [
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
File.expand_path("
|
|
114
|
-
"
|
|
115
|
-
"
|
|
116
|
-
"
|
|
117
|
-
"/
|
|
118
|
-
"/
|
|
119
|
-
"/
|
|
120
|
-
"/
|
|
121
|
-
"/
|
|
122
|
-
"/"
|
|
123
|
-
|
|
31
|
+
ENV["CONDA_PREFIX"], ### active conda / mamba env
|
|
32
|
+
ENV["HOMEBREW_PREFIX"], ### Homebrew (non-standard install path)
|
|
33
|
+
File.expand_path("~/usr"), ### user's home / usr
|
|
34
|
+
File.expand_path("~/local"), ### user's home / local
|
|
35
|
+
File.expand_path("~/.local"), ### user's home / .local (XDG, pip --user)
|
|
36
|
+
File.expand_path("~"), ### user's home
|
|
37
|
+
"/opt/local", ### MacPorts
|
|
38
|
+
"/opt/homebrew", ### Homebrew (Apple Silicon)
|
|
39
|
+
"/opt", ### UNIX
|
|
40
|
+
"/sw/local", ### Mac Fink
|
|
41
|
+
"/sw/", ### Mac Fink
|
|
42
|
+
"/usr/X11R6", ### UNIX X11
|
|
43
|
+
"/usr/local", ### UNIX
|
|
44
|
+
"/usr", ### UNIX
|
|
45
|
+
"/" ### UNIX
|
|
46
|
+
].compact
|
|
124
47
|
if postfixes
|
|
125
48
|
dirs = postfixes.inject(dirs) { |list, postfix|
|
|
126
49
|
list + dirs.map{|d| File.join(d, postfix) }
|
|
@@ -129,8 +52,10 @@ def possible_prefix (*postfixes)
|
|
|
129
52
|
return dirs.select{|d| File.directory?(d)}
|
|
130
53
|
end
|
|
131
54
|
|
|
55
|
+
# @!visibility private
|
|
132
56
|
POSSIBLE_PREFIX = possible_prefix()
|
|
133
57
|
|
|
58
|
+
# @!visibility private
|
|
134
59
|
def possible_libs (*postfixes)
|
|
135
60
|
dirs = possible_prefix().map{|prefix| File.join(prefix, "lib") }
|
|
136
61
|
if postfixes
|
|
@@ -141,12 +66,110 @@ def possible_libs (*postfixes)
|
|
|
141
66
|
return dirs.select{|d| File.directory?(d)}
|
|
142
67
|
end
|
|
143
68
|
|
|
69
|
+
# @!visibility private
|
|
144
70
|
def possible_includes (*postfixes)
|
|
145
71
|
dirs = possible_prefix().map{|prefix| File.join(prefix, "include") }
|
|
146
72
|
if postfixes
|
|
147
73
|
dirs = postfixes.inject(dirs) { |list, postfix|
|
|
148
74
|
list + dirs.map{|d| File.join(d, postfix) }
|
|
149
75
|
}
|
|
150
|
-
end
|
|
76
|
+
end
|
|
151
77
|
return dirs.select{|d| File.directory?(d)}
|
|
152
78
|
end
|
|
79
|
+
|
|
80
|
+
# Configure include/library search for a dependency, preferring its own
|
|
81
|
+
# build description over brute-force prefix probing.
|
|
82
|
+
#
|
|
83
|
+
# If the dependency ships a pkg-config file (`<pkg>.pc`), use it to obtain
|
|
84
|
+
# cflags / libs and stop. Otherwise fall back to scanning possible_includes
|
|
85
|
+
# / possible_libs (the only option for hand-rolled scientific libraries
|
|
86
|
+
# that do not provide a `.pc` file, e.g. nn / ngmath / FITPACK).
|
|
87
|
+
#
|
|
88
|
+
# carray_dir_config("gsl") # gsl.pc -> done
|
|
89
|
+
# carray_dir_config("nn") # no .pc -> possible_* probe
|
|
90
|
+
# carray_dir_config("foo", "libfoo") # search foo.pc / libfoo.pc as "libfoo"
|
|
91
|
+
#
|
|
92
|
+
def carray_dir_config (name, pkg = name)
|
|
93
|
+
return true if pkg_config(pkg)
|
|
94
|
+
dir_config(name, possible_includes, possible_libs)
|
|
95
|
+
true
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# --- pluggable Fortran backend registry
|
|
99
|
+
#
|
|
100
|
+
# CArray no longer tries to enumerate every Fortran compiler. Only
|
|
101
|
+
# gfortran ships out of the box. A companion gem (or a user's extconf)
|
|
102
|
+
# that needs another compiler registers a backend *before* calling
|
|
103
|
+
# check_fortran:
|
|
104
|
+
#
|
|
105
|
+
# register_fortran_backend(/ifx|ifort/) do |fc|
|
|
106
|
+
# libdir = ... # locate the runtime
|
|
107
|
+
# dir_config("ifcore", possible_includes, [libdir] + possible_libs)
|
|
108
|
+
# have_library("ifcore")
|
|
109
|
+
# end
|
|
110
|
+
# check_fortran("--with-fortran=ifx")
|
|
111
|
+
#
|
|
112
|
+
# A backend receives the compiler command and is responsible only for
|
|
113
|
+
# linking that compiler's runtime library (dir_config + have_library).
|
|
114
|
+
#
|
|
115
|
+
# @!visibility private
|
|
116
|
+
FORTRAN_BACKENDS = {}
|
|
117
|
+
|
|
118
|
+
# Registers a Fortran runtime backend for {check_fortran} to pick up. Only
|
|
119
|
+
# gfortran ships out of the box; a companion gem that needs another compiler
|
|
120
|
+
# registers its own before calling {check_fortran}. The block receives the
|
|
121
|
+
# compiler command and is responsible only for linking that compiler's
|
|
122
|
+
# runtime library (`dir_config` + `have_library`).
|
|
123
|
+
#
|
|
124
|
+
# @param pattern [Regexp] matched against the configured compiler command.
|
|
125
|
+
# @yieldparam fc [String] the compiler command.
|
|
126
|
+
# @return [void]
|
|
127
|
+
def register_fortran_backend (pattern, &block)
|
|
128
|
+
FORTRAN_BACKENDS[pattern] = block
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# gfortran: the one compiler CArray supports out of the box.
|
|
132
|
+
register_fortran_backend(/gfortran/) do |fc|
|
|
133
|
+
libdir = File.dirname(`#{fc} --print-file-name=libgfortran.a`.strip)
|
|
134
|
+
dir_config("gfortran", possible_includes, [libdir] + possible_libs)
|
|
135
|
+
have_library("gfortran")
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Configures the extension to compile Fortran sources, selecting the compiler
|
|
139
|
+
# from `--with-fortran` (default `gfortran`) and its flags from
|
|
140
|
+
# `--with-fflags`. The matching backend registered by
|
|
141
|
+
# {register_fortran_backend} links that compiler's runtime; an unmatched
|
|
142
|
+
# compiler warns and leaves the runtime to `LIBS` / `--with-fflags`.
|
|
143
|
+
#
|
|
144
|
+
# @return [void]
|
|
145
|
+
def check_fortran
|
|
146
|
+
|
|
147
|
+
SRC_EXT << "f" << "f90" << "f95"
|
|
148
|
+
|
|
149
|
+
fc = with_config("fortran", "gfortran")
|
|
150
|
+
fflags = with_config("fflags", "-O2 -g -fPIC")
|
|
151
|
+
|
|
152
|
+
_pattern, backend = FORTRAN_BACKENDS.find { |pat, _| pat =~ fc }
|
|
153
|
+
if backend
|
|
154
|
+
backend.call(fc)
|
|
155
|
+
else
|
|
156
|
+
warn "carray/mkmf: no backend for fortran '#{fc}'; " \
|
|
157
|
+
"register one with register_fortran_backend or pass the " \
|
|
158
|
+
"runtime via LIBS / --with-fflags"
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
at_exit do
|
|
162
|
+
if File.file?("Makefile")
|
|
163
|
+
makefile = File.read("Makefile")
|
|
164
|
+
unless makefile =~ /^FC=/
|
|
165
|
+
makefile.sub!(/^COPY =.*$/,
|
|
166
|
+
'\0' + "\n\n" +
|
|
167
|
+
"FC=#{fc}\n" +
|
|
168
|
+
"FFLAGS=#{fflags}\n")
|
|
169
|
+
end
|
|
170
|
+
File.write("Makefile", makefile)
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
return fc
|
|
175
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Load-bearing Ruby support that the core depends on at run time. Unlike
|
|
2
|
+
# carray/basics.rb (convenience methods kept eager merely because they are
|
|
3
|
+
# frequent), the definitions here are NOT optional: removing or lazy-loading
|
|
4
|
+
# them breaks core behaviour. Keep this file eager-loaded.
|
|
5
|
+
|
|
6
|
+
class CArray
|
|
7
|
+
|
|
8
|
+
# String fallback for the global cast functions CA_INT32(data) etc. The C
|
|
9
|
+
# dispatcher (ext/carray_cast.c) handles every other input class in C and
|
|
10
|
+
# delegates only String here, because the whitespace / `,` / `;` /
|
|
11
|
+
# `_`->UNDEF parser is far more natural (and maintainable) in Ruby.
|
|
12
|
+
# +type+ arrives as the data_type Symbol. Required: without it
|
|
13
|
+
# +CA_INT32("1 2 3")+ and friends raise.
|
|
14
|
+
def self.__cast_string__ (type, v) # :nodoc:
|
|
15
|
+
if type == CA_OBJECT
|
|
16
|
+
return CScalar.new(CA_OBJECT) { v }
|
|
17
|
+
elsif type == CA_BOOLEAN
|
|
18
|
+
v = v.dup
|
|
19
|
+
v.tr!('^01',"1")
|
|
20
|
+
v.tr!('01',"\x0\x1")
|
|
21
|
+
return CArray.boolean(v.length).load_binary(v)
|
|
22
|
+
else
|
|
23
|
+
case v
|
|
24
|
+
when /;/
|
|
25
|
+
v = v.strip.split(/\s*;\s*/).
|
|
26
|
+
map{|s| s.split(/\s+|\s*,\s*/).map{|x| x=='_' ? UNDEF : x} }
|
|
27
|
+
else
|
|
28
|
+
v = v.strip.split(/\s+|\s*,\s*/).map{|x| x=='_' ? UNDEF : x}
|
|
29
|
+
end
|
|
30
|
+
return CArray.new(type, CArray.guess_array_shape(v)).tap { |a| a[] = v }
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
private_class_method :__cast_string__
|
|
34
|
+
|
|
35
|
+
# CA_OBJECT escape for the weighted-sum kernel (mkkernel object_escape:).
|
|
36
|
+
# The C dispatcher (carray_kernels.c rb_ca_wsum_ki) intercepts CA_OBJECT
|
|
37
|
+
# source and forwards here verbatim, because a per-cell object weighted sum
|
|
38
|
+
# is more naturally (and exactly, for Rational / BigDecimal weights) a
|
|
39
|
+
# +(self * weights).sum+ composition than a dedicated :object kernel branch.
|
|
40
|
+
#
|
|
41
|
+
# +weights+ is a Ruby Numeric scalar (W-A1) or a same-shape CArray; the 1-D
|
|
42
|
+
# axis-broadcast form (W-A2) is not supported for object weights (pass a
|
|
43
|
+
# scalar or a full-shape weight), matching CArray's explicit-broadcast rule.
|
|
44
|
+
# +opts+ is the trailing options Hash (axis:/keep_axis:/min_count:/
|
|
45
|
+
# fill_value:) forwarded verbatim by the C escape; it goes straight to +sum+.
|
|
46
|
+
def __wsum_object__ (weights, opts = {}) # :nodoc:
|
|
47
|
+
(self * weights).sum(**opts)
|
|
48
|
+
end
|
|
49
|
+
private :__wsum_object__
|
|
50
|
+
|
|
51
|
+
# CA_OBJECT escape for the weighted-mean kernel. Weighted mean is
|
|
52
|
+
# +Σ(w*v) / Σw+ over the cells valid after mask overlay (a masked value OR a
|
|
53
|
+
# masked weight drops the cell from BOTH sums). The denominator is guarded:
|
|
54
|
+
# an empty / all-masked slab or weights summing to zero yields UNDEF (the
|
|
55
|
+
# object analogue of the numeric kernel's 0/0 -> NaN, since objects have no
|
|
56
|
+
# NaN). Weight forms and +opts+ as in {#__wsum_object__}.
|
|
57
|
+
def __wmean_object__ (weights, opts = {}) # :nodoc:
|
|
58
|
+
axis = opts[:axis]
|
|
59
|
+
keep_axis = opts[:keep_axis]
|
|
60
|
+
prod = self * weights
|
|
61
|
+
wv = (weights.is_a?(CArray) ? weights : self * 0 + weights).copy
|
|
62
|
+
wv[prod.is_masked] = UNDEF if prod.has_mask?
|
|
63
|
+
nopt = { axis: axis, keep_axis: keep_axis }
|
|
64
|
+
nopt[:min_count] = opts[:min_count] unless opts[:min_count].nil?
|
|
65
|
+
num = prod.sum(**nopt)
|
|
66
|
+
den = wv.sum(axis: axis, keep_axis: keep_axis)
|
|
67
|
+
result =
|
|
68
|
+
if axis
|
|
69
|
+
den = den.copy
|
|
70
|
+
den[den.eq(0)] = UNDEF # zero / empty denominator -> undetermined
|
|
71
|
+
num / den # UNDEF propagates cell-wise
|
|
72
|
+
elsif den.equal?(UNDEF) || den == 0
|
|
73
|
+
UNDEF
|
|
74
|
+
else
|
|
75
|
+
num / den
|
|
76
|
+
end
|
|
77
|
+
fill_value = opts[:fill_value]
|
|
78
|
+
return result if fill_value.nil?
|
|
79
|
+
if result.is_a?(CArray)
|
|
80
|
+
result[result.is_masked] = fill_value if result.has_mask?
|
|
81
|
+
result
|
|
82
|
+
else
|
|
83
|
+
result.equal?(UNDEF) ? fill_value : result
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
private :__wmean_object__
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
class CAUnboundRepeat
|
|
91
|
+
# Overrides {CArray#template} for unbound-repeat views.
|
|
92
|
+
#
|
|
93
|
+
# The C-level `CArray#template` allocates an entity sized to `self.shape`,
|
|
94
|
+
# which for a CAUnboundRepeat would include the inflated unbound (`:*`)
|
|
95
|
+
# axes — semantically wrong (unbound axes are not yet bound to a size)
|
|
96
|
+
# and a memory bomb on broadcast patterns. Required for correctness.
|
|
97
|
+
#
|
|
98
|
+
# This override allocates at the **parent's compact shape** instead, then
|
|
99
|
+
# rewraps the result with the same `spec` so the returned view preserves
|
|
100
|
+
# the unbound broadcast pattern.
|
|
101
|
+
#
|
|
102
|
+
# @param argv [Array] forwarded to {CArray#template} (data_type, bytes:, ...)
|
|
103
|
+
# @yield forwarded to {CArray#template}
|
|
104
|
+
# @return [CAUnboundRepeat] new entity wrapped with the original unbound spec
|
|
105
|
+
def template (*argv, &block)
|
|
106
|
+
return parent.template(*argv,&block)[*spec.map{|x| x != :* ? nil : x}]
|
|
107
|
+
end
|
|
108
|
+
end
|