numo-narray 0.9.0.3 → 0.9.0.4
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/README.md +12 -6
- data/Rakefile +2 -10
- data/ext/numo/narray/array.c +1 -6
- data/ext/numo/narray/data.c +3 -9
- data/ext/numo/narray/depend.erb +1 -1
- data/ext/numo/narray/extconf.rb +0 -1
- data/ext/numo/narray/gen/def/bit.rb +2 -0
- data/ext/numo/narray/gen/def/dcomplex.rb +2 -0
- data/ext/numo/narray/gen/def/dfloat.rb +2 -0
- data/ext/numo/narray/gen/def/int16.rb +2 -0
- data/ext/numo/narray/gen/def/int32.rb +2 -0
- data/ext/numo/narray/gen/def/int64.rb +2 -0
- data/ext/numo/narray/gen/def/int8.rb +2 -0
- data/ext/numo/narray/gen/def/robject.rb +2 -0
- data/ext/numo/narray/gen/def/scomplex.rb +2 -0
- data/ext/numo/narray/gen/def/sfloat.rb +2 -0
- data/ext/numo/narray/gen/def/uint16.rb +2 -0
- data/ext/numo/narray/gen/def/uint32.rb +2 -0
- data/ext/numo/narray/gen/def/uint64.rb +2 -0
- data/ext/numo/narray/gen/def/uint8.rb +2 -0
- data/ext/numo/narray/gen/dtype.erb.c +7 -7
- data/ext/numo/narray/gen/spec.rb +24 -2
- data/ext/numo/narray/gen/tmpl/accum_binary.c +6 -0
- data/ext/numo/narray/gen/tmpl/aref.c +6 -4
- data/ext/numo/narray/gen/tmpl/aset.c +6 -4
- data/ext/numo/narray/gen/tmpl/binary.c +4 -0
- data/ext/numo/narray/gen/tmpl/binary2.c +4 -0
- data/ext/numo/narray/gen/tmpl/bincount.c +180 -0
- data/ext/numo/narray/gen/tmpl/cast.c +4 -0
- data/ext/numo/narray/gen/tmpl/cast_array.c +3 -64
- data/ext/numo/narray/gen/tmpl/cond_binary.c +4 -0
- data/ext/numo/narray/gen/tmpl/inspect.c +4 -0
- data/ext/numo/narray/gen/tmpl/pow.c +4 -0
- data/ext/numo/narray/gen/tmpl/qsort.c +1 -7
- data/ext/numo/narray/gen/tmpl/rand.c +13 -2
- data/ext/numo/narray/gen/tmpl/rand_norm.c +89 -16
- data/ext/numo/narray/gen/tmpl/store.c +4 -0
- data/ext/numo/narray/gen/tmpl/store_array.c +99 -2
- data/ext/numo/narray/gen/tmpl_bit/allocate.c +1 -1
- data/ext/numo/narray/gen/tmpl_bit/aref.c +6 -4
- data/ext/numo/narray/gen/tmpl_bit/aset.c +6 -4
- data/ext/numo/narray/gen/tmpl_bit/cast_array.c +3 -65
- data/ext/numo/narray/gen/tmpl_bit/mask.c +16 -1
- data/ext/numo/narray/gen/tmpl_bit/store_array.c +101 -2
- data/ext/numo/narray/gen/tmpl_bit/where.c +7 -23
- data/ext/numo/narray/gen/tmpl_bit/where2.c +58 -4
- data/ext/numo/narray/index.c +168 -166
- data/ext/numo/narray/kwarg.c +1 -6
- data/ext/numo/narray/math.c +8 -12
- data/ext/numo/narray/narray.c +231 -71
- data/ext/numo/narray/ndloop.c +86 -26
- data/ext/numo/narray/numo/intern.h +6 -10
- data/ext/numo/narray/numo/narray.h +83 -54
- data/ext/numo/narray/numo/ndloop.h +0 -5
- data/ext/numo/narray/numo/template.h +0 -5
- data/ext/numo/narray/numo/types/complex.h +1 -6
- data/ext/numo/narray/numo/types/complex_macro.h +30 -3
- data/ext/numo/narray/numo/types/dcomplex.h +18 -0
- data/ext/numo/narray/numo/types/dfloat.h +18 -0
- data/ext/numo/narray/numo/types/float_macro.h +25 -2
- data/ext/numo/narray/numo/types/robj_macro.h +2 -4
- data/ext/numo/narray/numo/types/scomplex.h +18 -0
- data/ext/numo/narray/numo/types/sfloat.h +18 -0
- data/ext/numo/narray/rand.c +0 -15
- data/ext/numo/narray/step.c +0 -5
- data/ext/numo/narray/struct.c +7 -12
- data/lib/erbpp/line_number.rb +4 -4
- data/lib/erbpp/narray_def.rb +16 -7
- data/lib/numo/narray.rb +2 -0
- data/lib/numo/narray/extra.rb +465 -0
- data/numo-narray.gemspec +2 -2
- data/spec/narray_spec.rb +4 -3
- metadata +13 -7
- data/ext/numo/narray/gen/tmpl/head.c +0 -25
data/ext/numo/narray/kwarg.c
CHANGED
@@ -1,12 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
kwarg.c : Process keyword arguments for Ruby
|
3
3
|
|
4
|
-
Copyright (c) 2001 Masahiro TANAKA
|
5
|
-
|
6
|
-
This program is free software.
|
7
|
-
You can distribute/modify this program
|
8
|
-
under the same terms as Ruby itself.
|
9
|
-
NO WARRANTY.
|
4
|
+
Copyright (c) 2001 Masahiro TANAKA
|
10
5
|
*/
|
11
6
|
#include <ruby.h>
|
12
7
|
#include "numo/compat.h"
|
data/ext/numo/narray/math.c
CHANGED
@@ -2,11 +2,6 @@
|
|
2
2
|
math.c
|
3
3
|
Numerical Array Extension for Ruby
|
4
4
|
(C) Copyright 1999-2016 by Masahiro TANAKA
|
5
|
-
|
6
|
-
This program is free software.
|
7
|
-
You can distribute/modify this program
|
8
|
-
under the same terms as Ruby itself.
|
9
|
-
NO WARRANTY.
|
10
5
|
*/
|
11
6
|
#include <ruby.h>
|
12
7
|
#include "numo/narray.h"
|
@@ -63,14 +58,14 @@ VALUE nary_mathcast(int argc, VALUE *argv)
|
|
63
58
|
{
|
64
59
|
VALUE type, type2;
|
65
60
|
int i;
|
61
|
+
|
66
62
|
type = na_ary_composition_dtype(argv[0]);
|
67
63
|
for (i=1; i<argc; i++) {
|
68
64
|
type2 = na_ary_composition_dtype(argv[i]);
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
}
|
65
|
+
type = nary_math_cast2(type, type2);
|
66
|
+
if (NIL_P(type)) {
|
67
|
+
rb_raise(rb_eTypeError,"includes unknown DataType for upcast");
|
68
|
+
}
|
74
69
|
}
|
75
70
|
return type;
|
76
71
|
}
|
@@ -133,11 +128,12 @@ Init_nary_math()
|
|
133
128
|
rb_hash_aset(hCast, numo_cDComplex, numo_mDComplexMath);
|
134
129
|
rb_hash_aset(hCast, numo_cSFloat, numo_mSFloatMath);
|
135
130
|
rb_hash_aset(hCast, numo_cSComplex, numo_mSComplexMath);
|
136
|
-
#ifdef
|
131
|
+
#ifdef RUBY_INTEGER_UNIFICATION
|
132
|
+
rb_hash_aset(hCast, rb_cInteger, rb_mMath);
|
133
|
+
#else
|
137
134
|
rb_hash_aset(hCast, rb_cFixnum, rb_mMath);
|
138
135
|
rb_hash_aset(hCast, rb_cBignum, rb_mMath);
|
139
136
|
#endif
|
140
|
-
rb_hash_aset(hCast, rb_cInteger, rb_mMath);
|
141
137
|
rb_hash_aset(hCast, rb_cFloat, rb_mMath);
|
142
138
|
rb_hash_aset(hCast, rb_cComplex, numo_mDComplexMath);
|
143
139
|
|
data/ext/numo/narray/narray.c
CHANGED
@@ -2,11 +2,6 @@
|
|
2
2
|
narray.c
|
3
3
|
Numerical Array Extension for Ruby
|
4
4
|
(C) Copyright 1999-2016 by Masahiro TANAKA
|
5
|
-
|
6
|
-
This program is free software.
|
7
|
-
You can distribute/modify this program
|
8
|
-
under the same terms as Ruby itself.
|
9
|
-
NO WARRANTY.
|
10
5
|
*/
|
11
6
|
#define NARRAY_C
|
12
7
|
#include <ruby.h>
|
@@ -193,8 +188,8 @@ na_s_allocate(VALUE klass)
|
|
193
188
|
|
194
189
|
na->base.ndim = 0;
|
195
190
|
na->base.type = NARRAY_DATA_T;
|
196
|
-
na->base.flag[0] =
|
197
|
-
na->base.flag[1] =
|
191
|
+
na->base.flag[0] = NA_FL0_INIT;
|
192
|
+
na->base.flag[1] = NA_FL1_INIT;
|
198
193
|
na->base.size = 0;
|
199
194
|
na->base.shape = NULL;
|
200
195
|
na->base.reduce = INT2FIX(0);
|
@@ -210,8 +205,8 @@ na_s_allocate_view(VALUE klass)
|
|
210
205
|
|
211
206
|
na->base.ndim = 0;
|
212
207
|
na->base.type = NARRAY_VIEW_T;
|
213
|
-
na->base.flag[0] =
|
214
|
-
na->base.flag[1] =
|
208
|
+
na->base.flag[0] = NA_FL0_INIT;
|
209
|
+
na->base.flag[1] = NA_FL1_INIT;
|
215
210
|
na->base.size = 0;
|
216
211
|
na->base.shape = NULL;
|
217
212
|
na->base.reduce = INT2FIX(0);
|
@@ -230,14 +225,12 @@ na_array_to_internal_shape(VALUE self, VALUE ary, size_t *shape)
|
|
230
225
|
size_t i, n, c, s;
|
231
226
|
ssize_t x;
|
232
227
|
VALUE v;
|
233
|
-
narray_t *na;
|
234
228
|
int flag = 0;
|
235
229
|
|
236
230
|
n = RARRAY_LEN(ary);
|
237
231
|
|
238
232
|
if (RTEST(self)) {
|
239
|
-
|
240
|
-
flag = TEST_COLUMN_MAJOR(na);
|
233
|
+
flag = TEST_COLUMN_MAJOR(self);
|
241
234
|
}
|
242
235
|
if (flag) {
|
243
236
|
c = n-1;
|
@@ -642,9 +635,9 @@ void
|
|
642
635
|
na_release_lock(VALUE self)
|
643
636
|
{
|
644
637
|
narray_t *na;
|
645
|
-
GetNArray(self,na);
|
646
638
|
|
647
|
-
|
639
|
+
UNSET_LOCK(self);
|
640
|
+
GetNArray(self,na);
|
648
641
|
|
649
642
|
switch(NA_TYPE(na)) {
|
650
643
|
case NARRAY_VIEW_T:
|
@@ -653,51 +646,6 @@ na_release_lock(VALUE self)
|
|
653
646
|
}
|
654
647
|
}
|
655
648
|
|
656
|
-
// fix name, ex, allow_stride_for_flatten_view
|
657
|
-
VALUE
|
658
|
-
na_check_ladder(VALUE self, int start_dim)
|
659
|
-
{
|
660
|
-
int i;
|
661
|
-
ssize_t st0, st1;
|
662
|
-
narray_t *na1;
|
663
|
-
narray_view_t *na;
|
664
|
-
GetNArray(self,na1);
|
665
|
-
|
666
|
-
//puts("pass ladder");
|
667
|
-
|
668
|
-
if (start_dim < -na1->ndim || start_dim >= na1->ndim) {
|
669
|
-
rb_bug("start_dim (%d) out of range",start_dim);
|
670
|
-
}
|
671
|
-
|
672
|
-
switch(na1->type) {
|
673
|
-
case NARRAY_DATA_T:
|
674
|
-
case NARRAY_FILEMAP_T:
|
675
|
-
return Qtrue;
|
676
|
-
case NARRAY_VIEW_T:
|
677
|
-
GetNArrayView(self,na);
|
678
|
-
// negative dim -> position from last dim
|
679
|
-
if (start_dim < 0) {
|
680
|
-
start_dim += na->base.ndim;
|
681
|
-
}
|
682
|
-
// not ladder if it has index
|
683
|
-
for (i=start_dim; i<na->base.ndim; i++) {
|
684
|
-
if (SDX_IS_INDEX(na->stridx[i]))
|
685
|
-
return Qfalse;
|
686
|
-
}
|
687
|
-
// check stride
|
688
|
-
i = start_dim;
|
689
|
-
st0 = SDX_GET_STRIDE(na->stridx[i]);
|
690
|
-
for (i++; i<na->base.ndim; i++) {
|
691
|
-
st1 = SDX_GET_STRIDE(na->stridx[i]);
|
692
|
-
if (st0 != (ssize_t)(st1*na->base.shape[i])) {
|
693
|
-
return Qfalse;
|
694
|
-
}
|
695
|
-
st0 = st1;
|
696
|
-
}
|
697
|
-
return Qtrue;
|
698
|
-
}
|
699
|
-
return Qtrue;
|
700
|
-
}
|
701
649
|
|
702
650
|
|
703
651
|
/*
|
@@ -786,7 +734,7 @@ static VALUE
|
|
786
734
|
|
787
735
|
GetNArray(self,na);
|
788
736
|
n = NA_NDIM(na);
|
789
|
-
if (TEST_COLUMN_MAJOR(
|
737
|
+
if (TEST_COLUMN_MAJOR(self)) {
|
790
738
|
c = n-1;
|
791
739
|
s = -1;
|
792
740
|
} else {
|
@@ -855,7 +803,7 @@ na_copy_flags(VALUE src, VALUE dst)
|
|
855
803
|
GetNArray(dst,na2);
|
856
804
|
|
857
805
|
na2->flag[0] = na1->flag[0];
|
858
|
-
na2->flag[1] =
|
806
|
+
//na2->flag[1] = NA_FL1_INIT;
|
859
807
|
|
860
808
|
RBASIC(dst)->flags |= (RBASIC(src)->flags) &
|
861
809
|
(FL_USER1|FL_USER2|FL_USER3|FL_USER4|FL_USER5|FL_USER6|FL_USER7);
|
@@ -877,6 +825,70 @@ na_original_data(VALUE self)
|
|
877
825
|
return self;
|
878
826
|
}
|
879
827
|
|
828
|
+
// fix name, ex, allow_stride_for_flatten_view
|
829
|
+
VALUE
|
830
|
+
na_check_ladder(VALUE self, int start_dim)
|
831
|
+
{
|
832
|
+
int i;
|
833
|
+
ssize_t st0, st1;
|
834
|
+
narray_t *na;
|
835
|
+
GetNArray(self,na);
|
836
|
+
|
837
|
+
if (start_dim < -na->ndim || start_dim >= na->ndim) {
|
838
|
+
rb_bug("start_dim (%d) out of range",start_dim);
|
839
|
+
}
|
840
|
+
|
841
|
+
switch(na->type) {
|
842
|
+
case NARRAY_DATA_T:
|
843
|
+
case NARRAY_FILEMAP_T:
|
844
|
+
return Qtrue;
|
845
|
+
case NARRAY_VIEW_T:
|
846
|
+
// negative dim -> position from last dim
|
847
|
+
if (start_dim < 0) {
|
848
|
+
start_dim += NA_NDIM(na);
|
849
|
+
}
|
850
|
+
// not ladder if it has index
|
851
|
+
for (i=start_dim; i<NA_NDIM(na); i++) {
|
852
|
+
if (NA_IS_INDEX_AT(na,i))
|
853
|
+
return Qfalse;
|
854
|
+
}
|
855
|
+
// check stride
|
856
|
+
st0 = NA_STRIDE_AT(na,start_dim);
|
857
|
+
for (i=start_dim+1; i<NA_NDIM(na); i++) {
|
858
|
+
st1 = NA_STRIDE_AT(na,i);
|
859
|
+
if (st0 != (ssize_t)(st1 * NA_SHAPE(na)[i])) {
|
860
|
+
return Qfalse;
|
861
|
+
}
|
862
|
+
st0 = st1;
|
863
|
+
}
|
864
|
+
}
|
865
|
+
return Qtrue;
|
866
|
+
}
|
867
|
+
|
868
|
+
VALUE
|
869
|
+
na_check_contiguous(VALUE self)
|
870
|
+
{
|
871
|
+
ssize_t elmsz;
|
872
|
+
narray_t *na;
|
873
|
+
GetNArray(self,na);
|
874
|
+
|
875
|
+
switch(na->type) {
|
876
|
+
case NARRAY_DATA_T:
|
877
|
+
case NARRAY_FILEMAP_T:
|
878
|
+
return Qtrue;
|
879
|
+
case NARRAY_VIEW_T:
|
880
|
+
if (NA_VIEW_STRIDX(na)==0) {
|
881
|
+
return Qtrue;
|
882
|
+
}
|
883
|
+
if (na_check_ladder(self,0)==Qtrue) {
|
884
|
+
elmsz = na_get_elmsz(self);
|
885
|
+
if (elmsz == NA_STRIDE_AT(na,NA_NDIM(na)-1)) {
|
886
|
+
return Qtrue;
|
887
|
+
}
|
888
|
+
}
|
889
|
+
}
|
890
|
+
return Qfalse;
|
891
|
+
}
|
880
892
|
|
881
893
|
//----------------------------------------------------------------------
|
882
894
|
|
@@ -1168,13 +1180,13 @@ nary_s_byte_size(VALUE type)
|
|
1168
1180
|
|
1169
1181
|
/*
|
1170
1182
|
Returns a new 1-D array initialized from binary raw data in a string.
|
1171
|
-
@overload
|
1183
|
+
@overload from_binary(string,[shape])
|
1172
1184
|
@param [String] string Binary raw data.
|
1173
1185
|
@param [Array] shape array of integers representing array shape.
|
1174
1186
|
@return [Numo::NArray] NArray containing binary data.
|
1175
1187
|
*/
|
1176
1188
|
static VALUE
|
1177
|
-
|
1189
|
+
nary_s_from_binary(int argc, VALUE *argv, VALUE type)
|
1178
1190
|
{
|
1179
1191
|
size_t len, str_len, byte_size;
|
1180
1192
|
size_t *shape;
|
@@ -1184,6 +1196,7 @@ nary_s_from_string(int argc, VALUE *argv, VALUE type)
|
|
1184
1196
|
VALUE velmsz;
|
1185
1197
|
|
1186
1198
|
narg = rb_scan_args(argc,argv,"11",&vstr,&vshape);
|
1199
|
+
Check_Type(vstr,T_STRING);
|
1187
1200
|
str_len = RSTRING_LEN(vstr);
|
1188
1201
|
velmsz = rb_const_get(type, rb_intern(ELEMENT_BYTE_SIZE));
|
1189
1202
|
if (narg==2) {
|
@@ -1239,30 +1252,164 @@ nary_s_from_string(int argc, VALUE *argv, VALUE type)
|
|
1239
1252
|
return vna;
|
1240
1253
|
}
|
1241
1254
|
|
1255
|
+
/*
|
1256
|
+
Returns a new 1-D array initialized from binary raw data in a string.
|
1257
|
+
@overload store_binary(string,[offset])
|
1258
|
+
@param [String] string Binary raw data.
|
1259
|
+
@param [Integer] (optional) offset Byte offset in string.
|
1260
|
+
@return [Integer] stored length.
|
1261
|
+
*/
|
1262
|
+
static VALUE
|
1263
|
+
nary_store_binary(int argc, VALUE *argv, VALUE self)
|
1264
|
+
{
|
1265
|
+
size_t size, str_len, byte_size, offset;
|
1266
|
+
char *ptr;
|
1267
|
+
int narg;
|
1268
|
+
VALUE vstr, voffset;
|
1269
|
+
VALUE velmsz;
|
1270
|
+
narray_t *na;
|
1271
|
+
|
1272
|
+
narg = rb_scan_args(argc,argv,"11",&vstr,&voffset);
|
1273
|
+
str_len = RSTRING_LEN(vstr);
|
1274
|
+
if (narg==2) {
|
1275
|
+
offset = NUM2SIZET(voffset);
|
1276
|
+
if (str_len < offset) {
|
1277
|
+
rb_raise(rb_eArgError, "offset is larger than string length");
|
1278
|
+
}
|
1279
|
+
str_len -= offset;
|
1280
|
+
} else {
|
1281
|
+
offset = 0;
|
1282
|
+
}
|
1283
|
+
|
1284
|
+
GetNArray(self,na);
|
1285
|
+
size = NA_SIZE(na);
|
1286
|
+
velmsz = rb_const_get(CLASS_OF(self), rb_intern(ELEMENT_BYTE_SIZE));
|
1287
|
+
if (FIXNUM_P(velmsz)) {
|
1288
|
+
byte_size = size * NUM2SIZET(velmsz);
|
1289
|
+
} else {
|
1290
|
+
byte_size = ceil(size * NUM2DBL(velmsz));
|
1291
|
+
}
|
1292
|
+
if (byte_size > str_len) {
|
1293
|
+
rb_raise(rb_eArgError, "string is too short to store");
|
1294
|
+
}
|
1295
|
+
|
1296
|
+
ptr = na_get_pointer_for_write(self);
|
1297
|
+
memcpy(ptr, RSTRING_PTR(vstr)+offset, byte_size);
|
1298
|
+
|
1299
|
+
return SIZET2NUM(byte_size);
|
1300
|
+
}
|
1301
|
+
|
1242
1302
|
/*
|
1243
1303
|
Returns string containing the raw data bytes in NArray.
|
1244
|
-
@overload
|
1304
|
+
@overload to_binary()
|
1245
1305
|
@return [String] String object containing binary raw data.
|
1246
1306
|
*/
|
1247
1307
|
static VALUE
|
1248
|
-
|
1308
|
+
nary_to_binary(VALUE self)
|
1249
1309
|
{
|
1250
|
-
size_t len;
|
1310
|
+
size_t len, offset=0;
|
1251
1311
|
char *ptr;
|
1252
1312
|
VALUE str;
|
1253
1313
|
narray_t *na;
|
1254
1314
|
|
1255
1315
|
GetNArray(self,na);
|
1256
1316
|
if (na->type == NARRAY_VIEW_T) {
|
1257
|
-
|
1317
|
+
if (na_check_contiguous(self)==Qtrue) {
|
1318
|
+
offset = NA_VIEW_OFFSET(na);
|
1319
|
+
} else {
|
1320
|
+
self = rb_funcall(self,rb_intern("copy"),0);
|
1321
|
+
}
|
1258
1322
|
}
|
1259
1323
|
len = NUM2SIZET(nary_byte_size(self));
|
1260
1324
|
ptr = na_get_pointer_for_read(self);
|
1261
|
-
str = rb_usascii_str_new(ptr,len);
|
1325
|
+
str = rb_usascii_str_new(ptr+offset,len);
|
1262
1326
|
RB_GC_GUARD(self);
|
1263
1327
|
return str;
|
1264
1328
|
}
|
1265
1329
|
|
1330
|
+
/*
|
1331
|
+
Dump marshal data.
|
1332
|
+
@overload marshal_dump()
|
1333
|
+
@return [Array] Array containing marshal data.
|
1334
|
+
*/
|
1335
|
+
static VALUE
|
1336
|
+
nary_marshal_dump(VALUE self)
|
1337
|
+
{
|
1338
|
+
VALUE a;
|
1339
|
+
|
1340
|
+
a = rb_ary_new();
|
1341
|
+
rb_ary_push(a, INT2FIX(1)); // version
|
1342
|
+
rb_ary_push(a, na_shape(self));
|
1343
|
+
rb_ary_push(a, INT2FIX(NA_FLAG0(self)));
|
1344
|
+
if (CLASS_OF(self) == numo_cRObject) {
|
1345
|
+
narray_t *na;
|
1346
|
+
VALUE *ptr;
|
1347
|
+
size_t offset=0;
|
1348
|
+
GetNArray(self,na);
|
1349
|
+
if (na->type == NARRAY_VIEW_T) {
|
1350
|
+
if (na_check_contiguous(self)==Qtrue) {
|
1351
|
+
offset = NA_VIEW_OFFSET(na);
|
1352
|
+
} else {
|
1353
|
+
self = rb_funcall(self,rb_intern("copy"),0);
|
1354
|
+
}
|
1355
|
+
}
|
1356
|
+
ptr = (VALUE*)na_get_pointer_for_read(self);
|
1357
|
+
rb_ary_push(a, rb_ary_new4(NA_SIZE(na), ptr+offset));
|
1358
|
+
} else {
|
1359
|
+
rb_ary_push(a, nary_to_binary(self));
|
1360
|
+
}
|
1361
|
+
RB_GC_GUARD(self);
|
1362
|
+
return a;
|
1363
|
+
}
|
1364
|
+
|
1365
|
+
VALUE na_inplace( VALUE self );
|
1366
|
+
/*
|
1367
|
+
Load marshal data.
|
1368
|
+
@overload marshal_load(data)
|
1369
|
+
@params [Array] Array containing marshal data.
|
1370
|
+
@return [nil]
|
1371
|
+
*/
|
1372
|
+
static VALUE
|
1373
|
+
nary_marshal_load(VALUE self, VALUE a)
|
1374
|
+
{
|
1375
|
+
VALUE v;
|
1376
|
+
|
1377
|
+
if (TYPE(a) != T_ARRAY) {
|
1378
|
+
rb_raise(rb_eArgError,"marshal argument should be array");
|
1379
|
+
}
|
1380
|
+
if (RARRAY_LEN(a) != 4) {
|
1381
|
+
rb_raise(rb_eArgError,"marshal array size should be 4");
|
1382
|
+
}
|
1383
|
+
if (RARRAY_AREF(a,0) != INT2FIX(1)) {
|
1384
|
+
rb_raise(rb_eArgError,"NArray marshal version %d is not supported "
|
1385
|
+
"(only version 1)", NUM2INT(RARRAY_AREF(a,0)));
|
1386
|
+
}
|
1387
|
+
na_initialize(self,RARRAY_AREF(a,1));
|
1388
|
+
NA_FL0_SET(self,FIX2INT(RARRAY_AREF(a,2)));
|
1389
|
+
v = RARRAY_AREF(a,3);
|
1390
|
+
if (CLASS_OF(self) == numo_cRObject) {
|
1391
|
+
narray_t *na;
|
1392
|
+
char *ptr;
|
1393
|
+
if (TYPE(v) != T_ARRAY) {
|
1394
|
+
rb_raise(rb_eArgError,"RObject content should be array");
|
1395
|
+
}
|
1396
|
+
GetNArray(self,na);
|
1397
|
+
if (RARRAY_LEN(v) != (long)NA_SIZE(na)) {
|
1398
|
+
rb_raise(rb_eArgError,"RObject content size mismatch");
|
1399
|
+
}
|
1400
|
+
ptr = na_get_pointer_for_write(self);
|
1401
|
+
memcpy(ptr, RARRAY_PTR(v), NA_SIZE(na)*sizeof(VALUE));
|
1402
|
+
} else {
|
1403
|
+
nary_store_binary(1,&v,self);
|
1404
|
+
if (TEST_BYTE_SWAPPED(self)) {
|
1405
|
+
rb_funcall(na_inplace(self),rb_intern("to_host"),0);
|
1406
|
+
REVERSE_ENDIAN(self); // correct behavior??
|
1407
|
+
}
|
1408
|
+
}
|
1409
|
+
RB_GC_GUARD(a);
|
1410
|
+
return self;
|
1411
|
+
}
|
1412
|
+
|
1266
1413
|
|
1267
1414
|
/*
|
1268
1415
|
Cast self to another NArray datatype.
|
@@ -1314,6 +1461,9 @@ na_reduce_dimension(int argc, VALUE *argv, int naryc, VALUE *naryv)
|
|
1314
1461
|
rb_raise(rb_eRuntimeError,"must be positive: naryc=%d", naryc);
|
1315
1462
|
}
|
1316
1463
|
GetNArray(naryv[0],na);
|
1464
|
+
if (na->size==0) {
|
1465
|
+
rb_raise(nary_eShapeError,"cannot reduce empty NArray");
|
1466
|
+
}
|
1317
1467
|
reduce = na->reduce;
|
1318
1468
|
if (argc==0) {
|
1319
1469
|
//printf("pass argc=0 reduce=%d\n",NUM2INT(reduce));
|
@@ -1323,6 +1473,9 @@ na_reduce_dimension(int argc, VALUE *argv, int naryc, VALUE *naryv)
|
|
1323
1473
|
row_major = TEST_COLUMN_MAJOR(naryv[0]);
|
1324
1474
|
for (i=1; i<naryc; i++) {
|
1325
1475
|
GetNArray(naryv[i],na);
|
1476
|
+
if (na->size==0) {
|
1477
|
+
rb_raise(nary_eShapeError,"cannot reduce empty NArray");
|
1478
|
+
}
|
1326
1479
|
if (TEST_COLUMN_MAJOR(naryv[i]) != row_major) {
|
1327
1480
|
rb_raise(nary_eDimensionError,"dimension order is different");
|
1328
1481
|
}
|
@@ -1462,7 +1615,7 @@ VALUE na_host_order_p( VALUE self )
|
|
1462
1615
|
VALUE na_inplace( VALUE self )
|
1463
1616
|
{
|
1464
1617
|
VALUE view = self;
|
1465
|
-
|
1618
|
+
view = na_make_view(self);
|
1466
1619
|
SET_INPLACE(view);
|
1467
1620
|
return view;
|
1468
1621
|
}
|
@@ -1675,6 +1828,8 @@ Init_narray()
|
|
1675
1828
|
|
1676
1829
|
rb_define_method(cNArray, "debug_info", rb_narray_debug_info, 0);
|
1677
1830
|
|
1831
|
+
rb_define_method(cNArray, "contiguous?", na_check_contiguous, 0);
|
1832
|
+
|
1678
1833
|
rb_define_method(cNArray, "view", na_make_view, 0);
|
1679
1834
|
rb_define_method(cNArray, "expand_dims", na_expand_dims, 1);
|
1680
1835
|
rb_define_method(cNArray, "reverse", nary_reverse, -1);
|
@@ -1682,8 +1837,13 @@ Init_narray()
|
|
1682
1837
|
rb_define_singleton_method(cNArray, "upcast", numo_na_upcast, 1);
|
1683
1838
|
rb_define_singleton_method(cNArray, "byte_size", nary_s_byte_size, 0);
|
1684
1839
|
|
1685
|
-
rb_define_singleton_method(cNArray, "
|
1686
|
-
|
1840
|
+
rb_define_singleton_method(cNArray, "from_binary", nary_s_from_binary, -1);
|
1841
|
+
rb_define_alias (rb_singleton_class(cNArray), "from_string", "from_binary");
|
1842
|
+
rb_define_method(cNArray, "store_binary", nary_store_binary, -1);
|
1843
|
+
rb_define_method(cNArray, "to_binary", nary_to_binary, 0);
|
1844
|
+
rb_define_alias (cNArray, "to_string", "to_binary");
|
1845
|
+
rb_define_method(cNArray, "marshal_dump", nary_marshal_dump, 0);
|
1846
|
+
rb_define_method(cNArray, "marshal_load", nary_marshal_load, 1);
|
1687
1847
|
|
1688
1848
|
rb_define_method(cNArray, "byte_size", nary_byte_size, 0);
|
1689
1849
|
|