numo-narray 0.9.0.3 → 0.9.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|