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_order.c
CHANGED
@@ -3,10 +3,8 @@
|
|
3
3
|
carray_order.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
|
|
@@ -140,26 +138,24 @@ ca_project (CArray *ca, CArray *ci, char *lfill, char *ufill)
|
|
140
138
|
return co;
|
141
139
|
}
|
142
140
|
|
143
|
-
/*
|
144
|
-
|
145
|
-
|
146
|
-
end
|
147
|
-
end
|
141
|
+
/* @overload project (idx, lval=nil, uval=nil)
|
142
|
+
|
143
|
+
[TBD]. Creates new array the element of the object as address.
|
148
144
|
*/
|
149
145
|
|
150
146
|
VALUE
|
151
147
|
rb_ca_project (int argc, VALUE *argv, VALUE self)
|
152
148
|
{
|
153
|
-
volatile VALUE obj,
|
149
|
+
volatile VALUE obj, ridx, vlfval, vufval;
|
154
150
|
CArray *ca, *ci, *co;
|
155
151
|
char *lfval, *ufval;
|
156
152
|
|
157
|
-
rb_scan_args(argc, argv, "12", (VALUE *)
|
153
|
+
rb_scan_args(argc, argv, "12", (VALUE *)&ridx, (VALUE *) &vlfval, (VALUE *) &vufval);
|
158
154
|
|
159
155
|
Data_Get_Struct(self, CArray, ca);
|
160
156
|
|
161
|
-
rb_check_carray_object(
|
162
|
-
ci = ca_wrap_readonly(
|
157
|
+
rb_check_carray_object(ridx);
|
158
|
+
ci = ca_wrap_readonly(ridx, CA_SIZE);
|
163
159
|
|
164
160
|
lfval = malloc_with_check(ca->bytes);
|
165
161
|
ufval = malloc_with_check(ca->bytes);
|
@@ -227,12 +223,9 @@ rb_ca_project (int argc, VALUE *argv, VALUE self)
|
|
227
223
|
free(v); \
|
228
224
|
}
|
229
225
|
|
230
|
-
/*
|
231
|
-
|
232
|
-
|
233
|
-
def reverse!
|
234
|
-
end
|
235
|
-
end
|
226
|
+
/* @overload reverse!
|
227
|
+
|
228
|
+
Reverses the elements of +ca+ in place.
|
236
229
|
*/
|
237
230
|
|
238
231
|
static VALUE
|
@@ -279,13 +272,10 @@ rb_ca_reverse_bang (VALUE self)
|
|
279
272
|
return self;
|
280
273
|
}
|
281
274
|
|
282
|
-
/*
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
def reverse
|
287
|
-
end
|
288
|
-
end
|
275
|
+
/* @overload reverse
|
276
|
+
|
277
|
+
Returns a new CArray object containing <i>ca</i>'s elements in
|
278
|
+
reverse order.
|
289
279
|
*/
|
290
280
|
|
291
281
|
static VALUE
|
@@ -384,12 +374,9 @@ ca_qsort_cmp[CA_NTYPE] = {
|
|
384
374
|
qcmp_VALUE,
|
385
375
|
};
|
386
376
|
|
387
|
-
/*
|
388
|
-
|
389
|
-
|
390
|
-
def sort!
|
391
|
-
end
|
392
|
-
end
|
377
|
+
/* @overload sort!
|
378
|
+
|
379
|
+
Sorts <i>ca</i>'s elements in place.
|
393
380
|
*/
|
394
381
|
|
395
382
|
static VALUE
|
@@ -433,12 +420,9 @@ rb_ca_sort_bang (VALUE self)
|
|
433
420
|
return self;
|
434
421
|
}
|
435
422
|
|
436
|
-
/*
|
437
|
-
|
438
|
-
|
439
|
-
def sort
|
440
|
-
end
|
441
|
-
end
|
423
|
+
/* @overload sort
|
424
|
+
|
425
|
+
Returns a new CArray object containing <i>ca</i>'s elements sorted.
|
442
426
|
*/
|
443
427
|
|
444
428
|
static VALUE
|
@@ -452,11 +436,9 @@ rb_ca_sorted_copy (VALUE self)
|
|
452
436
|
|
453
437
|
/* --------------------------------------------------------------- */
|
454
438
|
|
455
|
-
/*
|
456
|
-
|
457
|
-
|
458
|
-
end
|
459
|
-
end
|
439
|
+
/* @overload bsearch
|
440
|
+
|
441
|
+
Returns a new CArray object containing <i>ca</i>'s elements sorted.
|
460
442
|
*/
|
461
443
|
|
462
444
|
static VALUE
|
@@ -561,11 +543,9 @@ rb_ca_binary_search (VALUE self, volatile VALUE rval)
|
|
561
543
|
return out;
|
562
544
|
}
|
563
545
|
|
564
|
-
/*
|
565
|
-
|
566
|
-
|
567
|
-
end
|
568
|
-
end
|
546
|
+
/* @overload bsearch_index
|
547
|
+
|
548
|
+
[TBD].
|
569
549
|
*/
|
570
550
|
|
571
551
|
static VALUE
|
@@ -630,6 +610,33 @@ rb_ca_binary_search_index (VALUE self, volatile VALUE rval)
|
|
630
610
|
} \
|
631
611
|
}
|
632
612
|
|
613
|
+
#define proc_find_value_float128(type, defeps) \
|
614
|
+
{ \
|
615
|
+
type *ptr = (type *) ca->ptr; \
|
616
|
+
boolean8_t *m = (ca->mask) ? (boolean8_t*) ca->mask->ptr : NULL; \
|
617
|
+
type val = (type) NUM2DBL(value); \
|
618
|
+
float128_t eps = (NIL_P(veps)) ? defeps*fabsl(val) : NUM2DBL(veps); \
|
619
|
+
ca_size_t i; \
|
620
|
+
if ( m ) { \
|
621
|
+
for (i=0; i<ca->elements; i++, ptr++) { \
|
622
|
+
if ( ! *m++ ) { \
|
623
|
+
if ( fabsl(*ptr - val) <= eps ) { \
|
624
|
+
addr = i; \
|
625
|
+
break; \
|
626
|
+
} \
|
627
|
+
} \
|
628
|
+
} \
|
629
|
+
} \
|
630
|
+
else { \
|
631
|
+
for (i=0; i<ca->elements; i++, ptr++) { \
|
632
|
+
if ( fabsl(*ptr - val) <= eps ) { \
|
633
|
+
addr = i; \
|
634
|
+
break; \
|
635
|
+
} \
|
636
|
+
} \
|
637
|
+
} \
|
638
|
+
}
|
639
|
+
|
633
640
|
#define proc_find_value_cmplx(type, defeps) \
|
634
641
|
{ \
|
635
642
|
type *ptr = (type *) ca->ptr; \
|
@@ -683,11 +690,9 @@ rb_ca_binary_search_index (VALUE self, volatile VALUE rval)
|
|
683
690
|
}
|
684
691
|
|
685
692
|
|
686
|
-
/*
|
687
|
-
|
688
|
-
|
689
|
-
end
|
690
|
-
end
|
693
|
+
/* @overload search
|
694
|
+
|
695
|
+
[TBD].
|
691
696
|
*/
|
692
697
|
|
693
698
|
static VALUE
|
@@ -717,7 +722,7 @@ rb_ca_linear_search (int argc, VALUE *argv, VALUE self)
|
|
717
722
|
case CA_UINT64: proc_find_value(uint64_t); break;
|
718
723
|
case CA_FLOAT32: proc_find_value_float(float32_t, FLT_EPSILON); break;
|
719
724
|
case CA_FLOAT64: proc_find_value_float(float64_t, DBL_EPSILON); break;
|
720
|
-
case CA_FLOAT128:
|
725
|
+
case CA_FLOAT128: proc_find_value_float128(float128_t, DBL_EPSILON); break;
|
721
726
|
#ifdef HAVE_COMPLEX_H
|
722
727
|
case CA_CMPLX64: proc_find_value_cmplx(cmplx64_t, FLT_EPSILON); break;
|
723
728
|
case CA_CMPLX128: proc_find_value_cmplx(cmplx128_t, DBL_EPSILON); break;
|
@@ -733,11 +738,9 @@ rb_ca_linear_search (int argc, VALUE *argv, VALUE self)
|
|
733
738
|
return ( addr == -1 ) ? Qnil : SIZE2NUM(addr);
|
734
739
|
}
|
735
740
|
|
736
|
-
/*
|
737
|
-
|
738
|
-
|
739
|
-
end
|
740
|
-
end
|
741
|
+
/* @overload search_index
|
742
|
+
|
743
|
+
[TBD].
|
741
744
|
*/
|
742
745
|
|
743
746
|
static VALUE
|
@@ -811,11 +814,9 @@ rb_ca_linear_search_index (int argc, VALUE *argv, VALUE self)
|
|
811
814
|
} \
|
812
815
|
}
|
813
816
|
|
814
|
-
/*
|
815
|
-
|
816
|
-
|
817
|
-
end
|
818
|
-
end
|
817
|
+
/* @overload search_nearest
|
818
|
+
|
819
|
+
[TBD].
|
819
820
|
*/
|
820
821
|
|
821
822
|
static VALUE
|
@@ -856,6 +857,11 @@ rb_ca_linear_search_nearest (VALUE self, VALUE value)
|
|
856
857
|
return ( addr == -1 ) ? Qnil : SIZE2NUM(addr);
|
857
858
|
}
|
858
859
|
|
860
|
+
/* @overload search_nearest_index
|
861
|
+
|
862
|
+
[TBD].
|
863
|
+
*/
|
864
|
+
|
859
865
|
static VALUE
|
860
866
|
rb_ca_linear_search_nearest_index (VALUE self, VALUE value)
|
861
867
|
{
|
@@ -863,6 +869,162 @@ rb_ca_linear_search_nearest_index (VALUE self, VALUE value)
|
|
863
869
|
return ( NIL_P(raddr) ) ? Qnil : rb_ca_addr2index(self, raddr);
|
864
870
|
}
|
865
871
|
|
872
|
+
/* ----------------------------------------------------------------- */
|
873
|
+
|
874
|
+
static ca_size_t
|
875
|
+
linear_index (ca_size_t n, double *y, double yy, double *idx)
|
876
|
+
{
|
877
|
+
ca_size_t a, b, c, x1;
|
878
|
+
double ya, yb, yc;
|
879
|
+
double y1, y2;
|
880
|
+
double rest;
|
881
|
+
|
882
|
+
if ( yy <= y[0] ) {
|
883
|
+
x1 = 0;
|
884
|
+
goto found;
|
885
|
+
}
|
886
|
+
|
887
|
+
if ( yy >= y[n-1] ) {
|
888
|
+
x1 = n-2;
|
889
|
+
goto found;
|
890
|
+
}
|
891
|
+
|
892
|
+
/* check for equally spaced scale */
|
893
|
+
|
894
|
+
a = (ca_size_t)((yy-y[0])/(y[n-1]-y[0])*(n-1));
|
895
|
+
|
896
|
+
if ( a >= 0 && a < n-1 ) {
|
897
|
+
if ( (y[a] - yy) * (y[a+1] - yy) <= 0 ) { /* lucky case */
|
898
|
+
x1 = a;
|
899
|
+
goto found;
|
900
|
+
}
|
901
|
+
}
|
902
|
+
|
903
|
+
/* binary section method */
|
904
|
+
|
905
|
+
a = 0;
|
906
|
+
b = n-1;
|
907
|
+
|
908
|
+
ya = y[a];
|
909
|
+
yb = y[b];
|
910
|
+
|
911
|
+
if ( ya > yb ) {
|
912
|
+
return -1; /* input scale array should have accending order */
|
913
|
+
}
|
914
|
+
|
915
|
+
while ( (b - a) >= 1 ) {
|
916
|
+
|
917
|
+
c = (a + b)/2;
|
918
|
+
yc = y[c];
|
919
|
+
if ( a == c ) {
|
920
|
+
break;
|
921
|
+
}
|
922
|
+
|
923
|
+
if ( yc == yy ) {
|
924
|
+
a = c;
|
925
|
+
break;
|
926
|
+
}
|
927
|
+
else if ( (ya - yy) * (yc - yy) <= 0 ) {
|
928
|
+
b = c;
|
929
|
+
yb = yc;
|
930
|
+
}
|
931
|
+
else {
|
932
|
+
a = c;
|
933
|
+
ya = yc;
|
934
|
+
}
|
935
|
+
|
936
|
+
if ( ya > yb ) {
|
937
|
+
return -1; /* input scale array should have accending order */
|
938
|
+
}
|
939
|
+
}
|
940
|
+
|
941
|
+
x1 = a;
|
942
|
+
|
943
|
+
found:
|
944
|
+
|
945
|
+
y1 = y[x1];
|
946
|
+
y2 = y[x1+1];
|
947
|
+
rest = (yy-y1)/(y2-y1);
|
948
|
+
|
949
|
+
if ( fabs(y2-yy)/fabs(y2) < DBL_EPSILON*100 ) {
|
950
|
+
*idx = (double) (x1 + 1);
|
951
|
+
}
|
952
|
+
else if ( fabs(y1-yy)/fabs(y1) < DBL_EPSILON*100 ) {
|
953
|
+
*idx = (double) x1;
|
954
|
+
}
|
955
|
+
else {
|
956
|
+
*idx = rest + (double) x1;
|
957
|
+
}
|
958
|
+
|
959
|
+
return 0;
|
960
|
+
}
|
961
|
+
|
962
|
+
static VALUE
|
963
|
+
rb_ca_binary_search_linear_index (volatile VALUE self, volatile VALUE vx)
|
964
|
+
{
|
965
|
+
volatile VALUE out, out0;
|
966
|
+
CArray *ca, *sc, *cx, *co0, *co;
|
967
|
+
ca_size_t n;
|
968
|
+
double *x;
|
969
|
+
double *px;
|
970
|
+
double *po;
|
971
|
+
ca_size_t i;
|
972
|
+
|
973
|
+
Data_Get_Struct(self, CArray, ca);
|
974
|
+
|
975
|
+
if ( rb_ca_is_any_masked(self) ) {
|
976
|
+
rb_raise(rb_eRuntimeError, "self should not have any masked elements");
|
977
|
+
}
|
978
|
+
|
979
|
+
sc = ca_wrap_readonly(self, CA_FLOAT64);
|
980
|
+
cx = ca_wrap_readonly(vx, CA_FLOAT64);
|
981
|
+
|
982
|
+
co0 = carray_new(ca->data_type, cx->ndim, cx->dim, 0, NULL);
|
983
|
+
out = out0 = ca_wrap_struct(co0);
|
984
|
+
co = ca_wrap_writable(out, CA_FLOAT64);
|
985
|
+
|
986
|
+
ca_attach_n(3, sc, cx, co);
|
987
|
+
|
988
|
+
n = sc->elements;
|
989
|
+
x = (double*) sc->ptr;
|
990
|
+
px = (double*) cx->ptr;
|
991
|
+
po = (double*) co->ptr;
|
992
|
+
|
993
|
+
ca_update_mask(cx);
|
994
|
+
if ( cx->mask ) {
|
995
|
+
boolean8_t *mx, *mo;
|
996
|
+
ca_create_mask(co);
|
997
|
+
mx = (boolean8_t *) cx->mask->ptr;
|
998
|
+
mo = (boolean8_t *) co->mask->ptr;
|
999
|
+
for (i=0; i<cx->elements; i++) {
|
1000
|
+
if ( ! *mx ) {
|
1001
|
+
linear_index(n, x, *px, po);
|
1002
|
+
}
|
1003
|
+
else {
|
1004
|
+
*mo = 1;
|
1005
|
+
}
|
1006
|
+
mx++; mo++; px++, po++;
|
1007
|
+
}
|
1008
|
+
}
|
1009
|
+
else {
|
1010
|
+
for (i=0; i<cx->elements; i++) {
|
1011
|
+
linear_index(n, x, *px, po);
|
1012
|
+
px++, po++;
|
1013
|
+
}
|
1014
|
+
}
|
1015
|
+
|
1016
|
+
ca_sync(co);
|
1017
|
+
ca_detach_n(3, sc, cx, co);
|
1018
|
+
|
1019
|
+
if ( rb_ca_is_scalar(vx) ) {
|
1020
|
+
return rb_funcall(out0, rb_intern("[]"), 1, INT2NUM(0));
|
1021
|
+
}
|
1022
|
+
else {
|
1023
|
+
return out0;
|
1024
|
+
}
|
1025
|
+
}
|
1026
|
+
|
1027
|
+
|
866
1028
|
void
|
867
1029
|
Init_carray_order ()
|
868
1030
|
{
|
@@ -876,6 +1038,9 @@ Init_carray_order ()
|
|
876
1038
|
rb_define_method(rb_cCArray, "sort!", rb_ca_sort_bang, 0);
|
877
1039
|
rb_define_method(rb_cCArray, "sort", rb_ca_sorted_copy, 0);
|
878
1040
|
|
1041
|
+
rb_define_method(rb_cCArray, "bsearch", rb_ca_binary_search, 1);
|
1042
|
+
rb_define_method(rb_cCArray, "bsearch_index", rb_ca_binary_search_index, 1);
|
1043
|
+
|
879
1044
|
rb_define_method(rb_cCArray, "search", rb_ca_linear_search, -1);
|
880
1045
|
rb_define_method(rb_cCArray, "search_index", rb_ca_linear_search_index, -1);
|
881
1046
|
|
@@ -884,6 +1049,7 @@ Init_carray_order ()
|
|
884
1049
|
rb_define_method(rb_cCArray, "search_nearest_index",
|
885
1050
|
rb_ca_linear_search_nearest_index, 1);
|
886
1051
|
|
887
|
-
rb_define_method(rb_cCArray, "
|
888
|
-
|
1052
|
+
rb_define_method(rb_cCArray, "section",
|
1053
|
+
rb_ca_binary_search_linear_index, 1);
|
1054
|
+
|
889
1055
|
}
|
data/ext/carray_sort_addr.c
CHANGED
@@ -3,10 +3,8 @@
|
|
3
3
|
carray_sort_addr.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
|
|
@@ -151,16 +149,14 @@ qcmp_func (struct cmp_data *a, struct cmp_data *b)
|
|
151
149
|
return ( ia > ib ) ? 1 : -1; /* for stable sort */
|
152
150
|
}
|
153
151
|
|
154
|
-
/*
|
155
|
-
# returns index table for index sort
|
156
|
-
#
|
157
|
-
# idx = CA.sort_addr(a, b, c) ### priority a > b > c
|
158
|
-
# a[idx]
|
159
|
-
# b[idx]
|
160
|
-
# c[idx]
|
152
|
+
/* @overload sort_addr (*args)
|
161
153
|
|
162
|
-
|
163
|
-
|
154
|
+
(Sort) Returns index table for index sort
|
155
|
+
|
156
|
+
idx = CA.sort_addr(a, b, c) ### priority a > b > c
|
157
|
+
a[idx]
|
158
|
+
b[idx]
|
159
|
+
c[idx]
|
164
160
|
*/
|
165
161
|
|
166
162
|
static VALUE
|
@@ -234,15 +230,12 @@ rb_ca_s_sort_addr (int argc, VALUE *argv, VALUE self)
|
|
234
230
|
return out;
|
235
231
|
}
|
236
232
|
|
237
|
-
/*
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
def sort_addr (*args)
|
244
|
-
end
|
245
|
-
end
|
233
|
+
/* @overload sort_addr (*args)
|
234
|
+
|
235
|
+
(Sort) Returns index table for index sort
|
236
|
+
This method same as,
|
237
|
+
|
238
|
+
idx = CA.sort_addr(self, *args)
|
246
239
|
*/
|
247
240
|
|
248
241
|
static VALUE
|