carray 1.5.1 → 1.5.6
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 +32 -0
- data/{LICENSES → LICENSE} +0 -0
- data/NEWS.md +83 -0
- data/README.md +34 -18
- data/Rakefile +1 -1
- data/TODO.md +17 -0
- data/carray.gemspec +10 -7
- data/ext/ca_iter_block.c +3 -5
- data/ext/ca_iter_dimension.c +4 -5
- data/ext/ca_iter_window.c +2 -4
- data/ext/ca_obj_array.c +394 -124
- data/ext/ca_obj_bitarray.c +6 -11
- data/ext/ca_obj_bitfield.c +5 -9
- data/ext/ca_obj_block.c +5 -12
- data/ext/ca_obj_fake.c +3 -5
- data/ext/ca_obj_farray.c +3 -5
- data/ext/ca_obj_field.c +15 -17
- data/ext/ca_obj_grid.c +5 -6
- data/ext/ca_obj_mapping.c +2 -4
- data/ext/ca_obj_object.c +3 -5
- data/ext/ca_obj_reduce.c +2 -4
- data/ext/ca_obj_refer.c +11 -15
- data/ext/ca_obj_repeat.c +2 -4
- data/ext/ca_obj_select.c +2 -4
- data/ext/ca_obj_shift.c +3 -5
- data/ext/ca_obj_transpose.c +3 -5
- data/ext/ca_obj_unbound_repeat.c +68 -122
- data/ext/ca_obj_window.c +7 -9
- data/ext/carray.h +17 -8
- data/ext/carray_access.c +183 -58
- data/ext/carray_attribute.c +151 -197
- data/ext/carray_call_cfunc.c +1 -3
- data/ext/carray_cast.c +345 -144
- data/ext/carray_cast_func.rb +1 -2
- data/ext/carray_class.c +28 -36
- data/ext/carray_conversion.c +56 -59
- data/ext/carray_copy.c +16 -32
- data/ext/carray_core.c +73 -60
- data/ext/carray_element.c +25 -44
- data/ext/carray_generate.c +74 -53
- data/ext/carray_iterator.c +13 -15
- data/ext/carray_loop.c +53 -82
- data/ext/carray_mask.c +99 -119
- data/ext/carray_math.rb +28 -12
- data/ext/carray_mathfunc.c +1 -3
- data/ext/carray_numeric.c +42 -45
- data/ext/carray_operator.c +45 -32
- data/ext/carray_order.c +231 -65
- data/ext/carray_sort_addr.c +14 -21
- data/ext/carray_stat.c +1 -3
- data/ext/carray_stat_proc.rb +2 -4
- data/ext/carray_test.c +41 -30
- data/ext/carray_undef.c +1 -11
- data/ext/carray_utils.c +138 -51
- data/ext/extconf.rb +14 -2
- data/ext/mkmath.rb +2 -2
- data/ext/ruby_carray.c +15 -7
- data/ext/ruby_ccomplex.c +2 -4
- data/ext/ruby_float_func.c +1 -3
- data/ext/version.h +5 -7
- data/lib/carray.rb +9 -9
- data/lib/carray/autoload.rb +0 -2
- data/lib/carray/autoload/autoload_gem_numo_narray.rb +6 -6
- data/lib/carray/basic.rb +1 -3
- data/lib/carray/broadcast.rb +101 -0
- data/lib/carray/compose.rb +34 -10
- data/lib/carray/construct.rb +57 -18
- data/lib/carray/info.rb +1 -3
- data/lib/carray/inspect.rb +3 -5
- data/lib/carray/io/imagemagick.rb +1 -3
- data/lib/carray/iterator.rb +3 -3
- data/lib/carray/mask.rb +18 -7
- data/lib/carray/math.rb +4 -6
- data/lib/carray/math/histogram.rb +1 -3
- data/lib/carray/math/recurrence.rb +1 -3
- data/lib/carray/mkmf.rb +1 -3
- data/lib/carray/object/ca_obj_iterator.rb +1 -3
- data/lib/carray/object/ca_obj_link.rb +1 -3
- data/lib/carray/object/ca_obj_pack.rb +1 -3
- data/lib/carray/obsolete.rb +1 -17
- data/lib/carray/ordering.rb +29 -5
- data/lib/carray/serialize.rb +34 -25
- data/lib/carray/string.rb +1 -3
- data/lib/carray/struct.rb +3 -5
- data/lib/carray/testing.rb +5 -10
- data/lib/carray/time.rb +1 -3
- data/lib/carray/transform.rb +12 -3
- data/misc/NOTE +16 -38
- data/spec/Classes/CABitfield_spec.rb +58 -0
- data/spec/Classes/CABlockIterator_spec.rb +114 -0
- data/spec/Classes/CABlock_spec.rb +205 -0
- data/spec/Classes/CAField_spec.rb +39 -0
- data/spec/Classes/CAGrid_spec.rb +75 -0
- data/spec/Classes/CAMap_spec.rb +0 -0
- data/{test/test_CAMapping.rb → spec/Classes/CAMapping_spec.rb} +35 -36
- data/spec/Classes/CAObject_attribute_spec.rb +33 -0
- data/spec/Classes/CAObject_spec.rb +33 -0
- data/spec/Classes/CARefer_spec.rb +93 -0
- data/spec/Classes/CARepeat_spec.rb +65 -0
- data/spec/Classes/CASelect_spec.rb +22 -0
- data/spec/Classes/CAShift_spec.rb +16 -0
- data/spec/Classes/CAStruct_spec.rb +71 -0
- data/{test/test_CATranspose.rb → spec/Classes/CATranspose_spec.rb} +20 -21
- data/spec/Classes/CAUnboudRepeat_spec.rb +102 -0
- data/spec/Classes/CAWindow_spec.rb +54 -0
- data/spec/Classes/CAWrap_spec.rb +8 -0
- data/{test/test_CArray.rb → spec/Classes/CArray_spec.rb} +48 -92
- data/spec/Classes/CScalar_spec.rb +55 -0
- data/spec/Features/feature_130_spec.rb +19 -0
- data/spec/Features/feature_attributes_spec.rb +280 -0
- data/spec/Features/feature_boolean_spec.rb +98 -0
- data/spec/Features/feature_broadcast.rb +116 -0
- data/spec/Features/feature_cast_function.rb +19 -0
- data/spec/Features/feature_cast_spec.rb +33 -0
- data/spec/Features/feature_class_spec.rb +84 -0
- data/spec/Features/feature_complex_spec.rb +42 -0
- data/{test/test_composite.rb → spec/Features/feature_composite_spec.rb} +17 -18
- data/spec/Features/feature_convert_spec.rb +46 -0
- data/spec/Features/feature_copy_spec.rb +123 -0
- data/spec/Features/feature_creation_spec.rb +84 -0
- data/spec/Features/feature_element_spec.rb +144 -0
- data/spec/Features/feature_extream_spec.rb +54 -0
- data/spec/Features/feature_generate_spec.rb +74 -0
- data/spec/Features/feature_index_spec.rb +69 -0
- data/spec/Features/feature_mask_spec.rb +580 -0
- data/spec/Features/feature_math_spec.rb +97 -0
- data/spec/Features/feature_order_spec.rb +146 -0
- data/spec/Features/feature_ref_store_spec.rb +209 -0
- data/spec/Features/feature_serialization_spec.rb +125 -0
- data/spec/Features/feature_stat_spec.rb +397 -0
- data/spec/Features/feature_virtual_spec.rb +48 -0
- data/spec/Features/method_eq_spec.rb +81 -0
- data/spec/Features/method_is_nan_spec.rb +12 -0
- data/spec/Features/method_map_spec.rb +54 -0
- data/spec/Features/method_max_with.rb +20 -0
- data/spec/Features/method_min_with.rb +19 -0
- data/spec/Features/method_ne_spec.rb +18 -0
- data/spec/Features/method_project_spec.rb +188 -0
- data/spec/Features/method_ref_spec.rb +27 -0
- data/spec/Features/method_round_spec.rb +11 -0
- data/spec/Features/method_s_linspace_spec.rb +48 -0
- data/spec/Features/method_s_span_spec.rb +14 -0
- data/spec/Features/method_seq_spec.rb +47 -0
- data/spec/Features/method_sort_with.rb +43 -0
- data/spec/Features/method_sorted_with.rb +29 -0
- data/spec/Features/method_span_spec.rb +42 -0
- data/spec/Features/method_wrap_readonly_spec.rb +43 -0
- data/{test → spec/UnitTest}/test_CAVirtual.rb +0 -0
- data/spec/spec_all.rb +0 -1
- data/utils/convert_test.rb +73 -0
- data/utils/{extract_rdoc.rb → extract_yard.rb} +7 -12
- metadata +74 -58
- data/spec/CABlockIterator/CABlockIterator_spec.rb +0 -113
- data/spec/CArray/bug/store_spec.rb +0 -27
- data/spec/CArray/index/repeat_spec.rb +0 -10
- data/spec/CArray/method/eq_spec.rb +0 -80
- data/spec/CArray/method/is_nan_spec.rb +0 -12
- data/spec/CArray/method/ne_spec.rb +0 -18
- data/spec/CArray/method/round_spec.rb +0 -11
- data/spec/CArray/object/_attribute_spec.rb +0 -32
- data/spec/CArray/object/s_new_spec.rb +0 -31
- data/spec/CArray/serialize/Serialization_spec.rb +0 -89
- data/test/test_130.rb +0 -23
- data/test/test_ALL.rb +0 -49
- data/test/test_CABitfield.rb +0 -59
- data/test/test_CABlock.rb +0 -208
- data/test/test_CAField.rb +0 -40
- data/test/test_CAGrid.rb +0 -76
- data/test/test_CAMmap.rb +0 -11
- data/test/test_CARefer.rb +0 -94
- data/test/test_CARepeat.rb +0 -66
- data/test/test_CASelect.rb +0 -23
- data/test/test_CAShift.rb +0 -17
- data/test/test_CAWindow.rb +0 -55
- data/test/test_CAWrap.rb +0 -9
- data/test/test_CComplex.rb +0 -83
- data/test/test_CScalar.rb +0 -91
- data/test/test_attribute.rb +0 -281
- data/test/test_block_iterator.rb +0 -17
- data/test/test_boolean.rb +0 -99
- data/test/test_cast.rb +0 -33
- data/test/test_class.rb +0 -85
- data/test/test_complex.rb +0 -43
- data/test/test_convert.rb +0 -79
- data/test/test_copy.rb +0 -141
- data/test/test_creation.rb +0 -85
- data/test/test_element.rb +0 -146
- data/test/test_extream.rb +0 -55
- data/test/test_generate.rb +0 -75
- data/test/test_index.rb +0 -71
- data/test/test_mask.rb +0 -578
- data/test/test_math.rb +0 -98
- data/test/test_order.rb +0 -147
- data/test/test_ref_store.rb +0 -211
- data/test/test_stat.rb +0 -406
- data/test/test_struct.rb +0 -72
- data/test/test_virtual.rb +0 -49
data/ext/carray_math.rb
CHANGED
@@ -18,12 +18,10 @@ HEADERS << <<HERE_END
|
|
18
18
|
carray_math.c
|
19
19
|
|
20
20
|
This file is part of Ruby/CArray extension library.
|
21
|
-
You can redistribute it and/or modify it under the terms of
|
22
|
-
the Ruby Licence.
|
23
21
|
|
24
|
-
This file is automatically generated from carray_math.rb.
|
25
22
|
|
26
|
-
|
23
|
+
This file is automatically generated from carray_math.rb.
|
24
|
+
Copyright (C) 2005-2020 Hiroki Motoyoshi
|
27
25
|
|
28
26
|
---------------------------------------------------------------------------- */
|
29
27
|
|
@@ -157,6 +155,10 @@ monfunc("exp", "exp",
|
|
157
155
|
FLOAT_TYPES => "(#2) = exp(#1);",
|
158
156
|
CMPLX_TYPES => HAVE_COMPLEX ? "(#2) = cexp(#1);" : nil,
|
159
157
|
OBJ_TYPES => '(#2) = rb_funcall((#1), rb_intern("exp"), 0);')
|
158
|
+
monfunc("exp2", "exp2",
|
159
|
+
FLOAT_TYPES => "(#2) = exp2(#1);",
|
160
|
+
CMPLX_TYPES => HAVE_COMPLEX ? "(#2) = cpow(2, (#1));" : nil,
|
161
|
+
OBJ_TYPES => '(#2) = rb_funcall((#1), rb_intern("exp2"), 0);')
|
160
162
|
monfunc("exp10", "exp10",
|
161
163
|
FLOAT_TYPES => "(#2) = pow(10, (#1));",
|
162
164
|
CMPLX_TYPES => HAVE_COMPLEX ? "(#2) = cpow(10, (#1));" : nil,
|
@@ -168,6 +170,12 @@ monfunc("log", "log",
|
|
168
170
|
monfunc("log10", "log10",
|
169
171
|
FLOAT_TYPES => "(#2) = log10(#1);",
|
170
172
|
OBJ_TYPES => '(#2) = rb_funcall((#1), rb_intern("log10"), 0);')
|
173
|
+
monfunc("log2", "log2",
|
174
|
+
FLOAT_TYPES => "(#2) = log2(#1);",
|
175
|
+
OBJ_TYPES => '(#2) = rb_funcall((#1), rb_intern("log2"), 0);')
|
176
|
+
monfunc("logb", "logb",
|
177
|
+
FLOAT_TYPES => "(#2) = logb(#1);",
|
178
|
+
OBJ_TYPES => '(#2) = rb_funcall((#1), rb_intern("logb"), 0);')
|
171
179
|
monfunc("sin", "sin",
|
172
180
|
FLOAT_TYPES => "(#2) = sin(#1);",
|
173
181
|
CMPLX_TYPES => HAVE_COMPLEX ? "(#2) = csin(#1);" : nil,
|
@@ -219,12 +227,14 @@ monfunc("atanh", "atanh",
|
|
219
227
|
|
220
228
|
|
221
229
|
binop("pmax", "pmax",
|
222
|
-
|
230
|
+
INT_TYPES =>"(#3) = (#1) > (#2) ? (#1) : (#2);",
|
231
|
+
FLOAT_TYPES =>"(#3) = fmax(#1, #2);",
|
223
232
|
CMPLX_TYPES => nil,
|
224
233
|
OBJ_TYPES =>'(#3) = rb_funcall(rb_assoc_new((#1),(#2)), rb_intern("max"), 0);')
|
225
234
|
|
226
235
|
binop("pmin", "pmin",
|
227
|
-
|
236
|
+
INT_TYPES =>"(#3) = (#1) < (#2) ? (#1) : (#2);",
|
237
|
+
FLOAT_TYPES =>"(#3) = fmin(#1, #2);",
|
228
238
|
CMPLX_TYPES => nil,
|
229
239
|
OBJ_TYPES =>'(#3) = rb_funcall(rb_assoc_new((#1),(#2)), rb_intern("min"), 0);')
|
230
240
|
|
@@ -249,7 +259,7 @@ binop("/", "div",
|
|
249
259
|
CMPLX_TYPES => HAVE_COMPLEX ? "(#3) = (#1) / (#2);" : nil,
|
250
260
|
OBJ_TYPES => '(#3) = rb_funcall((#1), id_slash, 1, (#2));')
|
251
261
|
|
252
|
-
binop("quo_i",
|
262
|
+
binop("quo_i", "quo_i",
|
253
263
|
OBJ_TYPES => '(#3) = rb_funcall((#1), rb_intern("quo"), 1, (#2));')
|
254
264
|
|
255
265
|
binop("rcp_mul", "rcp_mul",
|
@@ -260,6 +270,12 @@ binop("rcp_mul", "rcp_mul",
|
|
260
270
|
|
261
271
|
binop("%", "mod",
|
262
272
|
INT_TYPES => "if ((#2)==0) {ca_zerodiv();}; (#3) = (#1) % (#2);",
|
273
|
+
FLOAT_TYPES => "(#3) = fmod(#1, #2);",
|
274
|
+
OBJ_TYPES => '(#3) = rb_funcall((#1), id_percent, 1, (#2));')
|
275
|
+
|
276
|
+
binop("reminder", "reminder",
|
277
|
+
INT_TYPES => "if ((#2)==0) {ca_zerodiv();}; (#3) = (#1) % (#2);",
|
278
|
+
FLOAT_TYPES => "(#3) = remainder(#1, #2);",
|
263
279
|
OBJ_TYPES => '(#3) = rb_funcall((#1), id_percent, 1, (#2));')
|
264
280
|
|
265
281
|
binop("&", "bit_and_i",
|
@@ -697,7 +713,7 @@ rb_ca_ipower (VALUE self, VALUE other)
|
|
697
713
|
/* unresolved unbound repeat array generates unbound repeat array again */
|
698
714
|
if ( ca->obj_type == CA_OBJ_UNBOUND_REPEAT ) {
|
699
715
|
CAUnboundRepeat *cx = (CAUnboundRepeat *) ca;
|
700
|
-
obj = rb_ca_ubrep_new(obj, cx->rep_ndim, cx->rep_dim);
|
716
|
+
obj = rb_ca_ubrep_new(rb_ca_ubrep_shave(self, obj), cx->rep_ndim, cx->rep_dim);
|
701
717
|
}
|
702
718
|
|
703
719
|
return obj;
|
@@ -752,7 +768,7 @@ rb_ca_ipower_bang (VALUE self, VALUE other)
|
|
752
768
|
|
753
769
|
}
|
754
770
|
|
755
|
-
binop("
|
771
|
+
binop("power", "power",
|
756
772
|
INT_TYPES => "(#3) = op_powi_<type>((#1), (#2));",
|
757
773
|
FLOAT_TYPES => "(#3) = pow((#1), (#2));",
|
758
774
|
CMPLX_TYPES => HAVE_COMPLEX ? "(#3) = cpow((#1), (#2));" : nil,
|
@@ -775,8 +791,8 @@ static VALUE rb_ca_pow (VALUE self, VALUE other)
|
|
775
791
|
|
776
792
|
/* unresolved unbound repeat array generates unbound repeat array again */
|
777
793
|
if ( ca->obj_type == CA_OBJ_UNBOUND_REPEAT ) {
|
778
|
-
CAUnboundRepeat *cx = (CAUnboundRepeat *) ca;
|
779
|
-
obj = rb_ca_ubrep_new(obj, cx->rep_ndim, cx->rep_dim);
|
794
|
+
CAUnboundRepeat *cx = (CAUnboundRepeat *) ca;
|
795
|
+
obj = rb_ca_ubrep_new(rb_ca_ubrep_shave(self, obj), cx->rep_ndim, cx->rep_dim);
|
780
796
|
}
|
781
797
|
|
782
798
|
return obj;
|
@@ -803,7 +819,7 @@ METHODS << %{
|
|
803
819
|
rb_define_method(rb_cCArray, "pow!", rb_ca_pow_bang, 1);
|
804
820
|
}
|
805
821
|
|
806
|
-
alias_op("
|
822
|
+
alias_op("**", "pow")
|
807
823
|
|
808
824
|
METHODS << %{
|
809
825
|
id_equal = rb_intern("==");
|
data/ext/carray_mathfunc.c
CHANGED
@@ -3,10 +3,8 @@
|
|
3
3
|
carray/mathfunc/carray_mathfunc.c
|
4
4
|
|
5
5
|
This file is part of Ruby/CArray extension library.
|
6
|
-
You can redistribute it and/or modify it under the terms of
|
7
|
-
the Ruby Licence.
|
8
6
|
|
9
|
-
Copyright (C) 2005 Hiroki Motoyoshi
|
7
|
+
Copyright (C) 2005-2020 Hiroki Motoyoshi
|
10
8
|
|
11
9
|
---------------------------------------------------------------------------- */
|
12
10
|
|
data/ext/carray_numeric.c
CHANGED
@@ -3,21 +3,14 @@
|
|
3
3
|
carray_numeric.c
|
4
4
|
|
5
5
|
This file is part of Ruby/CArray extension library.
|
6
|
-
You can redistribute it and/or modify it under the terms of
|
7
|
-
the Ruby Licence.
|
8
6
|
|
9
|
-
Copyright (C) 2005 Hiroki Motoyoshi
|
7
|
+
Copyright (C) 2005-2020 Hiroki Motoyoshi
|
10
8
|
|
11
9
|
---------------------------------------------------------------------------- */
|
12
10
|
|
13
11
|
#include "ruby.h"
|
14
12
|
#include "carray.h"
|
15
13
|
|
16
|
-
#if RUBY_VERSION_CODE >= 240
|
17
|
-
# define rb_cFixnum rb_cInteger
|
18
|
-
# define rb_cBignum rb_cInteger
|
19
|
-
#endif
|
20
|
-
|
21
14
|
VALUE CA_NAN, CA_INF;
|
22
15
|
|
23
16
|
static ID id___or__;
|
@@ -26,24 +19,18 @@ static ID id___xor__;
|
|
26
19
|
static ID id___rshift__;
|
27
20
|
static ID id___lshift__;
|
28
21
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
VALUE
|
36
|
-
rb_num_inf (VALUE self)
|
37
|
-
{
|
38
|
-
return CA_INF;
|
39
|
-
}
|
22
|
+
static ID id_bit_or;
|
23
|
+
static ID id_bit_and;
|
24
|
+
static ID id_bit_xor;
|
25
|
+
static ID id_lshift;
|
26
|
+
static ID id_rshift;
|
40
27
|
|
41
28
|
static VALUE
|
42
29
|
rb_hack_or(VALUE x, VALUE y)
|
43
30
|
{
|
44
31
|
if ( rb_obj_is_carray(y) ) {
|
45
32
|
if ( rb_ca_is_boolean_type(y) ) {
|
46
|
-
return rb_funcall(y,
|
33
|
+
return rb_funcall(y, id_bit_or, 1, x);
|
47
34
|
}
|
48
35
|
else {
|
49
36
|
#if RUBY_VERSION_CODE >= 190
|
@@ -63,7 +50,7 @@ rb_hack_and (VALUE x, VALUE y)
|
|
63
50
|
{
|
64
51
|
if ( rb_obj_is_carray(y) ) {
|
65
52
|
if ( rb_ca_is_boolean_type(y) ) {
|
66
|
-
return rb_funcall(y,
|
53
|
+
return rb_funcall(y, id_bit_and, 1, x);
|
67
54
|
}
|
68
55
|
else {
|
69
56
|
#if RUBY_VERSION_CODE >= 190
|
@@ -83,7 +70,7 @@ rb_hack_xor (VALUE x, VALUE y)
|
|
83
70
|
{
|
84
71
|
if ( rb_obj_is_carray(y) ) {
|
85
72
|
if ( rb_ca_is_boolean_type(y) ) {
|
86
|
-
return rb_funcall(y,
|
73
|
+
return rb_funcall(y, id_bit_xor, 1, x);
|
87
74
|
}
|
88
75
|
else {
|
89
76
|
#if RUBY_VERSION_CODE >= 190
|
@@ -103,7 +90,7 @@ rb_hack_lshift (VALUE x, VALUE y)
|
|
103
90
|
{
|
104
91
|
if ( rb_obj_is_carray(y) ) {
|
105
92
|
#if RUBY_VERSION_CODE >= 190
|
106
|
-
return rb_num_coerce_bin(x, y,
|
93
|
+
return rb_num_coerce_bin(x, y, id_lshift);
|
107
94
|
#else
|
108
95
|
return rb_num_coerce_bin(x, y);
|
109
96
|
#endif
|
@@ -118,7 +105,7 @@ rb_hack_rshift (VALUE x, VALUE y)
|
|
118
105
|
{
|
119
106
|
if ( rb_obj_is_carray(y) ) {
|
120
107
|
#if RUBY_VERSION_CODE >= 190
|
121
|
-
return rb_num_coerce_bin(x, y,
|
108
|
+
return rb_num_coerce_bin(x, y, id_rshift);
|
122
109
|
#else
|
123
110
|
return rb_num_coerce_bin(x, y);
|
124
111
|
#endif
|
@@ -128,12 +115,6 @@ rb_hack_rshift (VALUE x, VALUE y)
|
|
128
115
|
}
|
129
116
|
}
|
130
117
|
|
131
|
-
static VALUE
|
132
|
-
rb_hack_star (VALUE x, VALUE y)
|
133
|
-
{
|
134
|
-
return rb_funcall(y, rb_intern("*"), 1, x);
|
135
|
-
}
|
136
|
-
|
137
118
|
/* ------------------------------------------------------------------- */
|
138
119
|
|
139
120
|
#ifdef HAVE_COMPLEX_H
|
@@ -199,27 +180,52 @@ Init_carray_numeric ()
|
|
199
180
|
{
|
200
181
|
/* hack Fixnum and Bignum's "|", "&", "^", "<<", ">>" */
|
201
182
|
|
202
|
-
id___or__
|
203
|
-
id___and__
|
204
|
-
id___xor__
|
183
|
+
id___or__ = rb_intern("__or__");
|
184
|
+
id___and__ = rb_intern("__and__");
|
185
|
+
id___xor__ = rb_intern("__xor__");
|
205
186
|
id___rshift__ = rb_intern("__rshift__");
|
206
187
|
id___lshift__ = rb_intern("__lshift__");
|
207
188
|
|
189
|
+
id_bit_or = rb_intern("bit_or");
|
190
|
+
id_bit_and = rb_intern("bit_and");
|
191
|
+
id_bit_xor = rb_intern("bit_xor");
|
192
|
+
id_lshift = rb_intern("<<");
|
193
|
+
id_rshift = rb_intern(">>");
|
194
|
+
|
208
195
|
CA_NAN = rb_float_new(0.0/0.0);
|
209
196
|
CA_INF = rb_float_new(1.0/0.0);
|
210
197
|
rb_define_const(rb_cObject, "CA_NAN", CA_NAN);
|
211
198
|
rb_define_const(rb_cObject, "CA_INF", CA_INF);
|
212
|
-
rb_define_global_function("nan", rb_num_nan, 0);
|
213
|
-
rb_define_global_function("inf", rb_num_inf, 0);
|
214
199
|
|
215
200
|
rb_define_alias(rb_cTrueClass, "__or__", "|");
|
216
201
|
rb_define_alias(rb_cTrueClass, "__and__", "&");
|
217
202
|
rb_define_alias(rb_cTrueClass, "__xor__", "^");
|
218
203
|
|
204
|
+
rb_define_method(rb_cTrueClass, "|", rb_hack_or, 1);
|
205
|
+
rb_define_method(rb_cTrueClass, "&", rb_hack_and, 1);
|
206
|
+
rb_define_method(rb_cTrueClass, "^", rb_hack_xor, 1);
|
207
|
+
|
219
208
|
rb_define_alias(rb_cFalseClass, "__or__", "|");
|
220
209
|
rb_define_alias(rb_cFalseClass, "__and__", "&");
|
221
210
|
rb_define_alias(rb_cFalseClass, "__xor__", "^");
|
222
211
|
|
212
|
+
rb_define_method(rb_cFalseClass, "|", rb_hack_or, 1);
|
213
|
+
rb_define_method(rb_cFalseClass, "&", rb_hack_and, 1);
|
214
|
+
rb_define_method(rb_cFalseClass, "^", rb_hack_xor, 1);
|
215
|
+
|
216
|
+
#if RUBY_VERSION_CODE >= 240
|
217
|
+
rb_define_alias(rb_cInteger, "__or__", "|");
|
218
|
+
rb_define_alias(rb_cInteger, "__and__", "&");
|
219
|
+
rb_define_alias(rb_cInteger, "__xor__", "^");
|
220
|
+
rb_define_alias(rb_cInteger, "__lshift__", "<<");
|
221
|
+
rb_define_alias(rb_cInteger, "__rshift__", ">>");
|
222
|
+
|
223
|
+
rb_define_method(rb_cInteger, "|", rb_hack_or, 1);
|
224
|
+
rb_define_method(rb_cInteger, "&", rb_hack_and, 1);
|
225
|
+
rb_define_method(rb_cInteger, "^", rb_hack_xor, 1);
|
226
|
+
rb_define_method(rb_cInteger, "<<", rb_hack_lshift, 1);
|
227
|
+
rb_define_method(rb_cInteger, ">>", rb_hack_rshift, 1);
|
228
|
+
#else
|
223
229
|
rb_define_alias(rb_cFixnum, "__or__", "|");
|
224
230
|
rb_define_alias(rb_cFixnum, "__and__", "&");
|
225
231
|
rb_define_alias(rb_cFixnum, "__xor__", "^");
|
@@ -232,16 +238,6 @@ Init_carray_numeric ()
|
|
232
238
|
rb_define_alias(rb_cBignum, "__lshift__", "<<");
|
233
239
|
rb_define_alias(rb_cBignum, "__rshift__", ">>");
|
234
240
|
|
235
|
-
rb_define_method(rb_cTrueClass, "|", rb_hack_or, 1);
|
236
|
-
rb_define_method(rb_cTrueClass, "&", rb_hack_and, 1);
|
237
|
-
rb_define_method(rb_cTrueClass, "^", rb_hack_xor, 1);
|
238
|
-
rb_define_method(rb_cTrueClass, "*", rb_hack_star, 1);
|
239
|
-
|
240
|
-
rb_define_method(rb_cFalseClass, "|", rb_hack_or, 1);
|
241
|
-
rb_define_method(rb_cFalseClass, "&", rb_hack_and, 1);
|
242
|
-
rb_define_method(rb_cFalseClass, "^", rb_hack_xor, 1);
|
243
|
-
rb_define_method(rb_cFalseClass, "*", rb_hack_star, 1);
|
244
|
-
|
245
241
|
rb_define_method(rb_cFixnum, "|", rb_hack_or, 1);
|
246
242
|
rb_define_method(rb_cFixnum, "&", rb_hack_and, 1);
|
247
243
|
rb_define_method(rb_cFixnum, "^", rb_hack_xor, 1);
|
@@ -253,6 +249,7 @@ Init_carray_numeric ()
|
|
253
249
|
rb_define_method(rb_cBignum, "^", rb_hack_xor, 1);
|
254
250
|
rb_define_method(rb_cBignum, "<<", rb_hack_lshift, 1);
|
255
251
|
rb_define_method(rb_cBignum, ">>", rb_hack_rshift, 1);
|
252
|
+
#endif
|
256
253
|
|
257
254
|
#ifdef HAVE_COMPLEX_H
|
258
255
|
rb_define_method(rb_cCArray, "arg", rb_ca_arg, 0);
|
data/ext/carray_operator.c
CHANGED
@@ -3,10 +3,8 @@
|
|
3
3
|
carray_operator.c
|
4
4
|
|
5
5
|
This file is part of Ruby/CArray extension library.
|
6
|
-
You can redistribute it and/or modify it under the terms of
|
7
|
-
the Ruby Licence.
|
8
6
|
|
9
|
-
Copyright (C) 2005 Hiroki Motoyoshi
|
7
|
+
Copyright (C) 2005-2020 Hiroki Motoyoshi
|
10
8
|
|
11
9
|
---------------------------------------------------------------------------- */
|
12
10
|
|
@@ -28,7 +26,6 @@ ca_zerodiv ()
|
|
28
26
|
rb_raise(rb_eZeroDivError, "divided by 0");
|
29
27
|
}
|
30
28
|
|
31
|
-
|
32
29
|
VALUE
|
33
30
|
rb_ca_call_monop (VALUE self, ca_monop_func_t func[])
|
34
31
|
{
|
@@ -50,7 +47,7 @@ rb_ca_call_monop (VALUE self, ca_monop_func_t func[])
|
|
50
47
|
ca_attach(ca1);
|
51
48
|
ca_copy_mask_overlay(ca2, ca2->elements, 1, ca1);
|
52
49
|
func[ca1->data_type](ca1->elements,
|
53
|
-
( ca2->mask ) ? ca2->mask->ptr : NULL,
|
50
|
+
( ca2->mask ) ? (boolean8_t *)ca2->mask->ptr : NULL,
|
54
51
|
ca1->ptr, 1,
|
55
52
|
ca2->ptr, 1);
|
56
53
|
ca_detach(ca1);
|
@@ -58,7 +55,7 @@ rb_ca_call_monop (VALUE self, ca_monop_func_t func[])
|
|
58
55
|
/* unresolved unbound repeat array generates unbound repeat array again */
|
59
56
|
if ( ca1->obj_type == CA_OBJ_UNBOUND_REPEAT ) {
|
60
57
|
CAUnboundRepeat *cx = (CAUnboundRepeat *) ca1;
|
61
|
-
out = rb_ca_ubrep_new(out, cx->rep_ndim, cx->rep_dim);
|
58
|
+
out = rb_ca_ubrep_new(rb_ca_ubrep_shave(self, out), cx->rep_ndim, cx->rep_dim);
|
62
59
|
}
|
63
60
|
|
64
61
|
return out;
|
@@ -75,7 +72,7 @@ rb_ca_call_monop_bang (VALUE self, ca_monop_func_t func[])
|
|
75
72
|
|
76
73
|
ca_attach(ca1);
|
77
74
|
func[ca1->data_type](ca1->elements,
|
78
|
-
( ca1->mask ) ? ca1->mask->ptr : NULL,
|
75
|
+
( ca1->mask ) ? (boolean8_t *)ca1->mask->ptr : NULL,
|
79
76
|
ca1->ptr, 1,
|
80
77
|
ca1->ptr, 1);
|
81
78
|
ca_sync(ca1);
|
@@ -134,7 +131,8 @@ rb_ca_call_binop (volatile VALUE self, volatile VALUE other,
|
|
134
131
|
out = ca_wrap_struct(ca3);
|
135
132
|
|
136
133
|
ca_copy_mask_overlay(ca3, ca3->elements, 2, ca1, ca2);
|
137
|
-
func[ca1->data_type](ca1->elements,
|
134
|
+
func[ca1->data_type](ca1->elements,
|
135
|
+
( ca3->mask ) ? (boolean8_t *) ca3->mask->ptr : NULL,
|
138
136
|
ca1->ptr, 0,
|
139
137
|
ca2->ptr, 0,
|
140
138
|
ca3->ptr, 0);
|
@@ -149,7 +147,8 @@ rb_ca_call_binop (volatile VALUE self, volatile VALUE other,
|
|
149
147
|
out = ca_wrap_struct(ca3);
|
150
148
|
|
151
149
|
ca_copy_mask_overlay(ca3, ca3->elements, 2, ca1, ca2);
|
152
|
-
func[ca1->data_type](ca2->elements,
|
150
|
+
func[ca1->data_type](ca2->elements,
|
151
|
+
( ca3->mask ) ? (boolean8_t *) ca3->mask->ptr : NULL,
|
153
152
|
ca1->ptr, 0,
|
154
153
|
ca2->ptr, 1,
|
155
154
|
ca3->ptr, 1);
|
@@ -166,7 +165,8 @@ rb_ca_call_binop (volatile VALUE self, volatile VALUE other,
|
|
166
165
|
out = ca_wrap_struct(ca3);
|
167
166
|
|
168
167
|
ca_copy_mask_overlay(ca3, ca3->elements, 2, ca1, ca2);
|
169
|
-
func[ca1->data_type](ca1->elements,
|
168
|
+
func[ca1->data_type](ca1->elements,
|
169
|
+
( ca3->mask ) ? (boolean8_t *) ca3->mask->ptr : NULL,
|
170
170
|
ca1->ptr, 1,
|
171
171
|
ca2->ptr, 0,
|
172
172
|
ca3->ptr, 1);
|
@@ -185,7 +185,8 @@ rb_ca_call_binop (volatile VALUE self, volatile VALUE other,
|
|
185
185
|
out = ca_wrap_struct(ca3);
|
186
186
|
|
187
187
|
ca_copy_mask_overlay(ca3, ca3->elements, 2, ca1, ca2);
|
188
|
-
func[ca1->data_type](ca1->elements,
|
188
|
+
func[ca1->data_type](ca1->elements,
|
189
|
+
( ca3->mask ) ? (boolean8_t *) ca3->mask->ptr : NULL,
|
189
190
|
ca1->ptr, 1,
|
190
191
|
ca2->ptr, 1,
|
191
192
|
ca3->ptr, 1);
|
@@ -197,13 +198,13 @@ rb_ca_call_binop (volatile VALUE self, volatile VALUE other,
|
|
197
198
|
/* unresolved unbound repeat array generates unbound repeat array again */
|
198
199
|
if ( ca1->obj_type == CA_OBJ_UNBOUND_REPEAT ) {
|
199
200
|
CAUnboundRepeat *cx = (CAUnboundRepeat *) ca1;
|
200
|
-
out = rb_ca_ubrep_new(out, cx->rep_ndim, cx->rep_dim);
|
201
|
+
out = rb_ca_ubrep_new(rb_ca_ubrep_shave(self, out), cx->rep_ndim, cx->rep_dim);
|
201
202
|
}
|
202
203
|
|
203
204
|
/* unresolved unbound repeat array generates unbound repeat array again */
|
204
205
|
if ( ca2->obj_type == CA_OBJ_UNBOUND_REPEAT ) {
|
205
206
|
CAUnboundRepeat *cx = (CAUnboundRepeat *) ca2;
|
206
|
-
out = rb_ca_ubrep_new(out, cx->rep_ndim, cx->rep_dim);
|
207
|
+
out = rb_ca_ubrep_new(rb_ca_ubrep_shave(other, out), cx->rep_ndim, cx->rep_dim);
|
207
208
|
}
|
208
209
|
|
209
210
|
return out;
|
@@ -228,7 +229,8 @@ rb_ca_call_binop_bang (VALUE self, VALUE other, ca_binop_func_t func[])
|
|
228
229
|
if ( rb_obj_is_cscalar(self) ) {
|
229
230
|
if ( rb_obj_is_cscalar(other) ) { /* scalar vs scalar */
|
230
231
|
ca_copy_mask_overlay(ca1, ca1->elements, 2, ca1, ca2);
|
231
|
-
func[ca1->data_type](ca1->elements,
|
232
|
+
func[ca1->data_type](ca1->elements,
|
233
|
+
( ca1->mask ) ? (boolean8_t *) ca1->mask->ptr : NULL,
|
232
234
|
ca1->ptr, 0,
|
233
235
|
ca2->ptr, 0,
|
234
236
|
ca1->ptr, 0);
|
@@ -240,7 +242,8 @@ rb_ca_call_binop_bang (VALUE self, VALUE other, ca_binop_func_t func[])
|
|
240
242
|
}
|
241
243
|
|
242
244
|
ca_copy_mask_overlay(ca1, ca1->elements, 2, ca1, ca2);
|
243
|
-
func[ca1->data_type](ca1->elements,
|
245
|
+
func[ca1->data_type](ca1->elements,
|
246
|
+
( ca1->mask ) ? (boolean8_t *) ca1->mask->ptr : NULL,
|
244
247
|
ca1->ptr, 0,
|
245
248
|
ca2->ptr, 0,
|
246
249
|
ca1->ptr, 0);
|
@@ -249,7 +252,8 @@ rb_ca_call_binop_bang (VALUE self, VALUE other, ca_binop_func_t func[])
|
|
249
252
|
else {
|
250
253
|
if ( rb_obj_is_cscalar(other) ) { /* array vs scalar */
|
251
254
|
ca_copy_mask_overlay(ca1, ca1->elements, 2, ca1, ca2);
|
252
|
-
func[ca1->data_type](ca1->elements,
|
255
|
+
func[ca1->data_type](ca1->elements,
|
256
|
+
( ca1->mask ) ? (boolean8_t *) ca1->mask->ptr : NULL,
|
253
257
|
ca1->ptr, 1,
|
254
258
|
ca2->ptr, 0,
|
255
259
|
ca1->ptr, 1);
|
@@ -261,7 +265,8 @@ rb_ca_call_binop_bang (VALUE self, VALUE other, ca_binop_func_t func[])
|
|
261
265
|
}
|
262
266
|
|
263
267
|
ca_copy_mask_overlay(ca1, ca1->elements, 2, ca1, ca2);
|
264
|
-
func[ca1->data_type](ca1->elements,
|
268
|
+
func[ca1->data_type](ca1->elements,
|
269
|
+
( ca1->mask ) ? (boolean8_t *) ca1->mask->ptr : NULL,
|
265
270
|
ca1->ptr, 1,
|
266
271
|
ca2->ptr, 1,
|
267
272
|
ca1->ptr, 1);
|
@@ -294,15 +299,16 @@ rb_ca_call_moncmp (VALUE self, ca_moncmp_func_t func[])
|
|
294
299
|
|
295
300
|
ca_attach(ca1);
|
296
301
|
ca_copy_mask_overlay(ca2, ca2->elements, 1, ca1);
|
297
|
-
func[ca1->data_type](ca1->elements,
|
302
|
+
func[ca1->data_type](ca1->elements,
|
303
|
+
( ca2->mask ) ? (boolean8_t *) ca2->mask->ptr : NULL,
|
298
304
|
ca1->ptr, 1,
|
299
|
-
ca2->ptr, 1);
|
305
|
+
(boolean8_t *) ca2->ptr, 1);
|
300
306
|
ca_detach(ca1);
|
301
307
|
|
302
308
|
/* unresolved unbound repeat array generates unbound repeat array again */
|
303
309
|
if ( ca1->obj_type == CA_OBJ_UNBOUND_REPEAT ) {
|
304
310
|
CAUnboundRepeat *cx = (CAUnboundRepeat *) ca1;
|
305
|
-
out = rb_ca_ubrep_new(out, cx->rep_ndim, cx->rep_dim);
|
311
|
+
out = rb_ca_ubrep_new(rb_ca_ubrep_shave(self, out), cx->rep_ndim, cx->rep_dim);
|
306
312
|
}
|
307
313
|
|
308
314
|
return out;
|
@@ -321,10 +327,10 @@ rb_ca_call_bincmp (volatile VALUE self, volatile VALUE other,
|
|
321
327
|
|
322
328
|
/* check for comparison with CA_UNDEF */
|
323
329
|
if ( other == CA_UNDEF ) {
|
324
|
-
if ( func == ca_bincmp_eq ) {
|
330
|
+
if ( (ca_bincmp_func_t) func == (ca_bincmp_func_t) ca_bincmp_eq ) { /* a.eq(UNDEF) -> a.is_masked */
|
325
331
|
return rb_ca_is_masked(self);
|
326
332
|
}
|
327
|
-
else if ( func == ca_bincmp_ne ) { /* a.ne(UNDEF) -> a.is_not_masked */
|
333
|
+
else if ( (ca_bincmp_func_t) func == (ca_bincmp_func_t) ca_bincmp_ne ) { /* a.ne(UNDEF) -> a.is_not_masked */
|
328
334
|
return rb_ca_is_not_masked(self);
|
329
335
|
}
|
330
336
|
else {
|
@@ -347,7 +353,8 @@ rb_ca_call_bincmp (volatile VALUE self, volatile VALUE other,
|
|
347
353
|
Data_Get_Struct(out, CArray, ca3);
|
348
354
|
|
349
355
|
ca_copy_mask_overlay(ca3, ca3->elements, 2, ca1, ca2);
|
350
|
-
func[ca1->data_type](ca1->elements,
|
356
|
+
func[ca1->data_type](ca1->elements,
|
357
|
+
( ca3->mask ) ? (boolean8_t *) ca3->mask->ptr : NULL,
|
351
358
|
ca1->ptr, ca1->bytes, 0,
|
352
359
|
ca2->ptr, ca2->bytes, 0,
|
353
360
|
ca3->ptr, ca3->bytes, 0);
|
@@ -357,7 +364,8 @@ rb_ca_call_bincmp (volatile VALUE self, volatile VALUE other,
|
|
357
364
|
Data_Get_Struct(out, CArray, ca3);
|
358
365
|
|
359
366
|
ca_copy_mask_overlay(ca3, ca3->elements, 2, ca1, ca2);
|
360
|
-
func[ca1->data_type](ca2->elements,
|
367
|
+
func[ca1->data_type](ca2->elements,
|
368
|
+
( ca3->mask ) ? (boolean8_t *) ca3->mask->ptr : NULL,
|
361
369
|
ca1->ptr, ca1->bytes, 0,
|
362
370
|
ca2->ptr, ca2->bytes, 1,
|
363
371
|
ca3->ptr, ca3->bytes, 1);
|
@@ -369,7 +377,8 @@ rb_ca_call_bincmp (volatile VALUE self, volatile VALUE other,
|
|
369
377
|
Data_Get_Struct(out, CArray, ca3);
|
370
378
|
|
371
379
|
ca_copy_mask_overlay(ca3, ca3->elements, 2, ca1, ca2);
|
372
|
-
func[ca1->data_type](ca1->elements,
|
380
|
+
func[ca1->data_type](ca1->elements,
|
381
|
+
( ca3->mask ) ? (boolean8_t *) ca3->mask->ptr : NULL,
|
373
382
|
ca1->ptr, ca1->bytes, 1,
|
374
383
|
ca2->ptr, ca2->bytes, 0,
|
375
384
|
ca3->ptr, ca3->bytes, 1);
|
@@ -383,7 +392,8 @@ rb_ca_call_bincmp (volatile VALUE self, volatile VALUE other,
|
|
383
392
|
Data_Get_Struct(out, CArray, ca3);
|
384
393
|
|
385
394
|
ca_copy_mask_overlay(ca3, ca3->elements, 2, ca1, ca2);
|
386
|
-
func[ca1->data_type](ca1->elements,
|
395
|
+
func[ca1->data_type](ca1->elements,
|
396
|
+
( ca3->mask ) ? (boolean8_t *) ca3->mask->ptr : NULL,
|
387
397
|
ca1->ptr, ca1->bytes, 1,
|
388
398
|
ca2->ptr, ca2->bytes, 1,
|
389
399
|
ca3->ptr, ca3->bytes, 1);
|
@@ -395,7 +405,7 @@ rb_ca_call_bincmp (volatile VALUE self, volatile VALUE other,
|
|
395
405
|
/* unresolved unbound repeat array generates unbound repeat array again */
|
396
406
|
if ( ca1->obj_type == CA_OBJ_UNBOUND_REPEAT ) {
|
397
407
|
CAUnboundRepeat *cx = (CAUnboundRepeat *) ca1;
|
398
|
-
out = rb_ca_ubrep_new(out, cx->rep_ndim, cx->rep_dim);
|
408
|
+
out = rb_ca_ubrep_new(rb_ca_ubrep_shave(self, out), cx->rep_ndim, cx->rep_dim);
|
399
409
|
}
|
400
410
|
|
401
411
|
return out;
|
@@ -458,11 +468,9 @@ ca_math_call (VALUE mod, VALUE arg, ID id)
|
|
458
468
|
}
|
459
469
|
}
|
460
470
|
|
461
|
-
/*
|
462
|
-
|
463
|
-
|
464
|
-
end
|
465
|
-
end
|
471
|
+
/* @overload coerece (other)
|
472
|
+
|
473
|
+
[TBD]
|
466
474
|
*/
|
467
475
|
|
468
476
|
static VALUE
|
@@ -524,6 +532,11 @@ rb_ca_coerce (VALUE self, VALUE other)
|
|
524
532
|
} \
|
525
533
|
}
|
526
534
|
|
535
|
+
/* @overload mul_add (weight, min_count=nil, fill_value=nil)
|
536
|
+
|
537
|
+
[TBD]
|
538
|
+
*/
|
539
|
+
|
527
540
|
static VALUE
|
528
541
|
rb_ca_mul_add (int argc, VALUE *argv, volatile VALUE self)
|
529
542
|
{
|