numo-narray 0.9.0.5 → 0.9.0.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/Rakefile +10 -9
- data/ext/numo/narray/array.c +278 -287
- data/ext/numo/narray/gen/narray_def.rb +6 -6
- data/ext/numo/narray/gen/tmpl/accum.c +14 -15
- data/ext/numo/narray/gen/tmpl/accum_binary.c +11 -12
- data/ext/numo/narray/gen/tmpl/accum_index.c +11 -20
- data/ext/numo/narray/gen/tmpl/cum.c +6 -8
- data/ext/numo/narray/gen/tmpl/median.c +11 -14
- data/ext/numo/narray/gen/tmpl/minmax.c +10 -11
- data/ext/numo/narray/gen/tmpl/set2.c +1 -1
- data/ext/numo/narray/gen/tmpl/sort.c +6 -10
- data/ext/numo/narray/gen/tmpl/sort_index.c +16 -21
- data/ext/numo/narray/gen/tmpl/unary2.c +1 -1
- data/ext/numo/narray/gen/tmpl_bit/bit_count.c +4 -3
- data/ext/numo/narray/gen/tmpl_bit/bit_reduce.c +4 -3
- data/ext/numo/narray/narray.c +19 -8
- data/ext/numo/narray/numo/intern.h +2 -1
- data/ext/numo/narray/numo/narray.h +2 -2
- data/ext/numo/narray/numo/types/complex_macro.h +25 -11
- data/ext/numo/narray/numo/types/float_macro.h +7 -405
- data/ext/numo/narray/numo/types/real_accum.h +440 -0
- data/ext/numo/narray/numo/types/robj_macro.h +5 -405
- data/lib/numo/narray/extra.rb +50 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc2454fb169ad87ab4cb44c775c52906cb7636e8
|
4
|
+
data.tar.gz: f81cd5ccc97b7fec259329021fce9ed896871670
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c0e17e85b64041604643c9dfec270466dcf298cb794059f62f203eb82eb0b001d7a60a1b992c4bba7e0c286b03f508aaab0181187c9dff983f78b1c1f860c2f5
|
7
|
+
data.tar.gz: 3a37fe344a33dd64effe30eb531300ef0144d250ad9223198bb4cbc016cbff7a312f3f39fdc4ad2bc83314dfc2de708d842c64740494690f79c62acfd58ef277
|
data/Rakefile
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
begin
|
3
|
+
|
4
|
+
task :doc do
|
5
|
+
dir = "ext/numo/narray"
|
6
|
+
src = %w[array.c data.c index.c math.c narray.c rand.c struct.c].
|
7
|
+
map{|s| File.join(dir,s)} +
|
8
|
+
[File.join(dir,"types/*.c"), "lib/numo/narray/extra.rb"]
|
9
|
+
sh "cd ext/numo/narray; ruby extconf.rb; make src"
|
10
|
+
sh "rm -rf yard .yardoc; yard doc -o yard -r README.md #{src.join(' ')}"
|
11
|
+
end
|
12
|
+
|
3
13
|
require "rake/extensiontask"
|
4
14
|
require "rake_compiler_dock"
|
5
15
|
require "shellwords"
|
@@ -52,14 +62,5 @@ namespace :release do
|
|
52
62
|
end
|
53
63
|
end
|
54
64
|
|
55
|
-
task :doc do
|
56
|
-
dir = "ext/numo/narray"
|
57
|
-
src = %w[array.c data.c index.c math.c narray.c rand.c struct.c].
|
58
|
-
map{|s| File.join(dir,s)} +
|
59
|
-
[File.join(dir,"types/*.c"), "lib/numo/narray/extra.rb"]
|
60
|
-
sh "cd ext/numo/narray; ruby extconf.rb; make src"
|
61
|
-
sh "rm -rf yard .yardoc; yard doc -o yard -r README.md #{src.join(' ')}"
|
62
|
-
end
|
63
|
-
|
64
65
|
rescue LoadError
|
65
66
|
end
|
data/ext/numo/narray/array.c
CHANGED
@@ -32,147 +32,104 @@ static ID id_cast;
|
|
32
32
|
static ID id_le;
|
33
33
|
static ID id_Complex;
|
34
34
|
|
35
|
-
typedef struct {
|
36
|
-
int ndim;
|
37
|
-
size_t *shape;
|
38
|
-
VALUE dtype;
|
39
|
-
} na_compose_t;
|
40
|
-
|
41
|
-
static size_t
|
42
|
-
na_compose_memsize(const void *ptr)
|
43
|
-
{
|
44
|
-
const na_compose_t *nc = (const na_compose_t*)ptr;
|
45
|
-
|
46
|
-
return sizeof(na_compose_t) + nc->ndim * sizeof(size_t);
|
47
|
-
}
|
48
|
-
|
49
|
-
static void
|
50
|
-
na_compose_free(void *ptr)
|
51
|
-
{
|
52
|
-
na_compose_t *nc = (na_compose_t*)ptr;
|
53
|
-
|
54
|
-
if (nc->shape)
|
55
|
-
xfree(nc->shape);
|
56
|
-
xfree(nc);
|
57
|
-
}
|
58
|
-
|
59
|
-
static void
|
60
|
-
na_compose_gc_mark(void* nc)
|
61
|
-
{
|
62
|
-
rb_gc_mark(((na_compose_t*)nc)->dtype);
|
63
|
-
}
|
64
|
-
|
65
|
-
static const rb_data_type_t compose_data_type = {
|
66
|
-
"Numo::NArray/compose",
|
67
|
-
{na_compose_gc_mark, na_compose_free, na_compose_memsize,},
|
68
|
-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY|RUBY_TYPED_WB_PROTECTED
|
69
|
-
};
|
70
|
-
|
71
|
-
#define WrapCompose(p) TypedData_Wrap_Struct(rb_cData, &compose_data_type, (void*)(p));
|
72
|
-
#define GetCompose(v,p) TypedData_Get_Struct(v, na_compose_t, &compose_data_type, p)
|
73
35
|
|
74
36
|
static VALUE
|
75
37
|
na_object_type(int type, VALUE v)
|
76
38
|
{
|
77
39
|
static VALUE int32_max = Qnil;
|
78
40
|
if (NIL_P(int32_max))
|
79
|
-
|
41
|
+
int32_max = ULONG2NUM(2147483647);
|
80
42
|
|
81
43
|
switch(TYPE(v)) {
|
82
44
|
|
83
45
|
case T_TRUE:
|
84
46
|
case T_FALSE:
|
85
|
-
|
86
|
-
|
87
|
-
|
47
|
+
if (type<NA_BIT)
|
48
|
+
return NA_BIT;
|
49
|
+
return type;
|
88
50
|
|
89
51
|
#if SIZEOF_LONG == 4
|
90
52
|
case T_FIXNUM:
|
91
|
-
|
92
|
-
|
93
|
-
|
53
|
+
if (type<NA_INT32)
|
54
|
+
return NA_INT32;
|
55
|
+
return type;
|
94
56
|
case T_BIGNUM:
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
57
|
+
if (type<NA_INT64) {
|
58
|
+
v = rb_funcall(v,id_abs,0);
|
59
|
+
if (RTEST(rb_funcall(v,id_le,1,int32_max))) {
|
60
|
+
if (type<NA_INT32)
|
61
|
+
return NA_INT32;
|
62
|
+
} else {
|
63
|
+
return NA_INT64;
|
64
|
+
}
|
65
|
+
}
|
66
|
+
return type;
|
105
67
|
|
106
68
|
#elif SIZEOF_LONG == 8
|
107
69
|
case T_FIXNUM:
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
70
|
+
if (type<NA_INT64) {
|
71
|
+
long x = NUM2LONG(v);
|
72
|
+
if (x<0) x=-x;
|
73
|
+
if (x<=2147483647) {
|
74
|
+
if (type<NA_INT32)
|
75
|
+
return NA_INT32;
|
76
|
+
} else {
|
77
|
+
return NA_INT64;
|
78
|
+
}
|
79
|
+
}
|
80
|
+
return type;
|
119
81
|
case T_BIGNUM:
|
120
|
-
|
121
|
-
|
122
|
-
|
82
|
+
if (type<NA_INT64)
|
83
|
+
return NA_INT64;
|
84
|
+
return type;
|
123
85
|
#else
|
124
86
|
case T_FIXNUM:
|
125
87
|
case T_BIGNUM:
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
88
|
+
if (type<NA_INT64) {
|
89
|
+
v = rb_funcall(v,id_abs,0);
|
90
|
+
if (RTEST(rb_funcall(v,id_le,1,int32_max))) {
|
91
|
+
if (type<NA_INT32)
|
92
|
+
return NA_INT32;
|
93
|
+
} else {
|
94
|
+
return NA_INT64;
|
95
|
+
}
|
96
|
+
}
|
97
|
+
return type;
|
136
98
|
#endif
|
137
99
|
|
138
100
|
case T_FLOAT:
|
139
|
-
|
140
|
-
|
141
|
-
|
101
|
+
if (type<NA_DFLOAT)
|
102
|
+
return NA_DFLOAT;
|
103
|
+
return type;
|
142
104
|
|
143
105
|
case T_NIL:
|
144
|
-
|
106
|
+
return type;
|
145
107
|
|
146
108
|
default:
|
147
|
-
|
148
|
-
|
149
|
-
|
109
|
+
if (CLASS_OF(v) == rb_const_get( rb_cObject, id_Complex )) {
|
110
|
+
return NA_DCOMPLEX;
|
111
|
+
}
|
150
112
|
}
|
151
113
|
return NA_ROBJ;
|
152
114
|
}
|
153
115
|
|
154
116
|
|
155
|
-
#define MDAI_ATTR_TYPE(tp,v,attr)
|
156
|
-
|
117
|
+
#define MDAI_ATTR_TYPE(tp,v,attr) \
|
118
|
+
{tp = na_object_type(tp,rb_funcall(v,id_##attr,0));}
|
157
119
|
|
158
|
-
|
120
|
+
static int na_mdai_object_type(int type, VALUE v)
|
159
121
|
{
|
160
|
-
if (
|
161
|
-
|
162
|
-
|
163
|
-
} else {
|
164
|
-
mdai->na_type = na_upcast(CLASS_OF(v), mdai->na_type);
|
165
|
-
}
|
166
|
-
} else if (rb_obj_is_kind_of(v, rb_cRange)) {
|
167
|
-
MDAI_ATTR_TYPE(mdai->type,v,begin);
|
168
|
-
MDAI_ATTR_TYPE(mdai->type,v,end);
|
122
|
+
if (rb_obj_is_kind_of(v, rb_cRange)) {
|
123
|
+
MDAI_ATTR_TYPE(type,v,begin);
|
124
|
+
MDAI_ATTR_TYPE(type,v,end);
|
169
125
|
} else if (rb_obj_is_kind_of(v, na_cStep)) {
|
170
|
-
MDAI_ATTR_TYPE(
|
171
|
-
MDAI_ATTR_TYPE(
|
172
|
-
MDAI_ATTR_TYPE(
|
126
|
+
MDAI_ATTR_TYPE(type,v,begin);
|
127
|
+
MDAI_ATTR_TYPE(type,v,end);
|
128
|
+
MDAI_ATTR_TYPE(type,v,step);
|
173
129
|
} else {
|
174
|
-
|
130
|
+
type = na_object_type(type,v);
|
175
131
|
}
|
132
|
+
return type;
|
176
133
|
}
|
177
134
|
|
178
135
|
|
@@ -186,8 +143,8 @@ na_mdai_alloc(VALUE ary)
|
|
186
143
|
mdai->capa = n;
|
187
144
|
mdai->item = ALLOC_N( na_mdai_item_t, n );
|
188
145
|
for (i=0; i<n; i++) {
|
189
|
-
|
190
|
-
|
146
|
+
mdai->item[i].shape = 0;
|
147
|
+
mdai->item[i].val = Qnil;
|
191
148
|
}
|
192
149
|
mdai->item[0].val = ary;
|
193
150
|
mdai->type = NA_NONE;
|
@@ -206,8 +163,8 @@ na_mdai_realloc(na_mdai_t *mdai, int n_extra)
|
|
206
163
|
n = mdai->capa;
|
207
164
|
REALLOC_N( mdai->item, na_mdai_item_t, n );
|
208
165
|
for (; i<n; i++) {
|
209
|
-
|
210
|
-
|
166
|
+
mdai->item[i].shape = 0;
|
167
|
+
mdai->item[i].val = Qnil;
|
211
168
|
}
|
212
169
|
}
|
213
170
|
|
@@ -237,108 +194,149 @@ na_mdai_investigate(na_mdai_t *mdai, int ndim)
|
|
237
194
|
for (i=0; i < RARRAY_LEN(val); i++) {
|
238
195
|
v = RARRAY_AREF(val,i);
|
239
196
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
197
|
+
if (TYPE(v) == T_ARRAY) {
|
198
|
+
/* check recursive array */
|
199
|
+
for (j=0; j<ndim; j++) {
|
200
|
+
if (mdai->item[j].val == v)
|
201
|
+
rb_raise(rb_eStandardError,
|
202
|
+
"cannot convert from a recursive Array to NArray");
|
203
|
+
}
|
204
|
+
if ( ndim >= mdai->capa ) {
|
205
|
+
na_mdai_realloc(mdai,4);
|
206
|
+
}
|
207
|
+
mdai->item[ndim].val = v;
|
208
|
+
if ( na_mdai_investigate(mdai,ndim+1) ) {
|
209
|
+
len--; /* Array is empty */
|
210
|
+
}
|
211
|
+
}
|
212
|
+
else
|
256
213
|
if (rb_obj_is_kind_of(v, rb_cRange) || rb_obj_is_kind_of(v, na_cStep)) {
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
214
|
+
nary_step_sequence(v,&length,&dbeg,&dstep);
|
215
|
+
len += length-1;
|
216
|
+
mdai->type = na_mdai_object_type(mdai->type, v);
|
217
|
+
}
|
218
|
+
else if (IsNArray(v)) {
|
219
|
+
int r;
|
220
|
+
narray_t *na;
|
221
|
+
GetNArray(v,na);
|
222
|
+
if ( na->ndim == 0 ) {
|
223
|
+
len--; /* NArray is empty */
|
224
|
+
} else {
|
225
|
+
if ( ndim+na->ndim > mdai->capa ) {
|
226
|
+
na_mdai_realloc(mdai,((na->ndim-1)/4+1)*4);
|
227
|
+
}
|
228
|
+
for ( j=0,r=ndim; j < na->ndim ; j++,r++ ) {
|
229
|
+
if ( mdai->item[r].shape < na->shape[j] )
|
230
|
+
mdai->item[r].shape = na->shape[j];
|
231
|
+
}
|
232
|
+
}
|
233
|
+
// type
|
234
|
+
if (NIL_P(mdai->na_type)) {
|
235
|
+
mdai->na_type = CLASS_OF(v);
|
236
|
+
} else {
|
237
|
+
mdai->na_type = na_upcast(CLASS_OF(v), mdai->na_type);
|
238
|
+
}
|
239
|
+
} else {
|
240
|
+
mdai->type = na_mdai_object_type(mdai->type, v);
|
241
|
+
}
|
281
242
|
}
|
282
243
|
|
283
244
|
if (len==0) return 1; /* this array is empty */
|
284
245
|
if (mdai->item[ndim-1].shape < len) {
|
285
|
-
|
246
|
+
mdai->item[ndim-1].shape = len;
|
286
247
|
}
|
287
248
|
return 0;
|
288
249
|
}
|
289
250
|
|
290
|
-
static void
|
291
|
-
na_mdai_result(na_mdai_t *mdai, na_compose_t *nc)
|
292
|
-
{
|
293
|
-
int i, ndim;
|
294
|
-
VALUE tp;
|
295
|
-
size_t *shape;
|
296
251
|
|
252
|
+
static inline int
|
253
|
+
na_mdai_ndim(na_mdai_t *mdai)
|
254
|
+
{
|
255
|
+
int i;
|
297
256
|
// Dimension
|
298
257
|
for (i=0; i < mdai->capa && mdai->item[i].shape > 0; i++) ;
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
258
|
+
return i;
|
259
|
+
}
|
260
|
+
|
261
|
+
static inline void
|
262
|
+
na_mdai_shape(na_mdai_t *mdai, int ndim, size_t *shape)
|
263
|
+
{
|
264
|
+
int i;
|
265
|
+
for (i=0; i<ndim; i++) {
|
266
|
+
shape[i] = mdai->item[i].shape;
|
267
|
+
}
|
268
|
+
}
|
269
|
+
|
270
|
+
static VALUE
|
271
|
+
na_mdai_dtype_numeric(int type)
|
272
|
+
{
|
273
|
+
VALUE tp;
|
274
|
+
// DataType
|
275
|
+
switch(type) {
|
276
|
+
case NA_BIT:
|
277
|
+
tp = numo_cBit;
|
278
|
+
break;
|
279
|
+
case NA_INT32:
|
280
|
+
tp = numo_cInt32;
|
281
|
+
break;
|
282
|
+
case NA_INT64:
|
283
|
+
tp = numo_cInt64;
|
284
|
+
break;
|
285
|
+
case NA_DFLOAT:
|
286
|
+
tp = numo_cDFloat;
|
287
|
+
break;
|
288
|
+
case NA_DCOMPLEX:
|
289
|
+
tp = numo_cDComplex;
|
290
|
+
break;
|
291
|
+
case NA_ROBJ:
|
292
|
+
tp = numo_cRObject;
|
293
|
+
break;
|
294
|
+
default:
|
295
|
+
tp = Qnil;
|
296
|
+
}
|
297
|
+
return tp;
|
298
|
+
}
|
299
|
+
|
300
|
+
static VALUE
|
301
|
+
na_mdai_dtype(na_mdai_t *mdai)
|
302
|
+
{
|
303
|
+
VALUE tp;
|
304
|
+
|
305
|
+
tp = na_mdai_dtype_numeric(mdai->type);
|
306
|
+
|
307
|
+
if (!NIL_P(mdai->na_type)) {
|
308
|
+
if (NIL_P(tp)) {
|
309
|
+
tp = mdai->na_type;
|
310
|
+
} else {
|
311
|
+
tp = na_upcast(mdai->na_type,tp);
|
308
312
|
}
|
313
|
+
}
|
314
|
+
return tp;
|
315
|
+
}
|
316
|
+
|
309
317
|
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
tp = numo_cInt64;
|
320
|
-
break;
|
321
|
-
case NA_DFLOAT:
|
322
|
-
tp = numo_cDFloat;
|
323
|
-
break;
|
324
|
-
case NA_DCOMPLEX:
|
325
|
-
tp = numo_cDComplex;
|
326
|
-
break;
|
327
|
-
case NA_ROBJ:
|
328
|
-
tp = numo_cRObject;
|
329
|
-
break;
|
330
|
-
default:
|
331
|
-
tp = Qnil;
|
332
|
-
}
|
333
|
-
if (!NIL_P(mdai->na_type)) {
|
334
|
-
if (NIL_P(tp)) {
|
335
|
-
tp = mdai->na_type;
|
336
|
-
} else {
|
337
|
-
tp = na_upcast(mdai->na_type,tp);
|
338
|
-
}
|
339
|
-
}
|
340
|
-
nc->dtype = tp;
|
318
|
+
static inline VALUE
|
319
|
+
update_type(VALUE *ptype, VALUE dtype)
|
320
|
+
{
|
321
|
+
if (ptype) {
|
322
|
+
if (*ptype == cNArray || !RTEST(*ptype)) {
|
323
|
+
*ptype = dtype;
|
324
|
+
} else {
|
325
|
+
dtype = *ptype;
|
326
|
+
}
|
341
327
|
}
|
328
|
+
return dtype;
|
329
|
+
}
|
330
|
+
|
331
|
+
static inline void
|
332
|
+
check_subclass_of_narray(VALUE dtype)
|
333
|
+
{
|
334
|
+
if (RTEST(rb_obj_is_kind_of(dtype, rb_cClass))) {
|
335
|
+
if (RTEST(rb_funcall(dtype, id_le, 1, cNArray))) {
|
336
|
+
return;
|
337
|
+
}
|
338
|
+
}
|
339
|
+
rb_raise(nary_eCastError, "cannot convert to NArray");
|
342
340
|
}
|
343
341
|
|
344
342
|
|
@@ -356,87 +354,105 @@ static const rb_data_type_t mdai_data_type = {
|
|
356
354
|
0, 0, RUBY_TYPED_FREE_IMMEDIATELY|RUBY_TYPED_WB_PROTECTED
|
357
355
|
};
|
358
356
|
|
359
|
-
|
360
|
-
|
357
|
+
|
358
|
+
static void
|
359
|
+
na_composition3_ary(VALUE ary, VALUE *ptype, VALUE *pshape, VALUE *pnary)
|
361
360
|
{
|
362
|
-
|
361
|
+
VALUE vmdai;
|
363
362
|
na_mdai_t *mdai;
|
364
|
-
|
365
|
-
|
363
|
+
int i, ndim;
|
364
|
+
size_t *shape;
|
365
|
+
VALUE dtype, dshape;
|
366
366
|
|
367
|
-
|
368
|
-
|
369
|
-
if (
|
370
|
-
|
371
|
-
|
372
|
-
if (
|
373
|
-
|
374
|
-
nc->ndim = 1;
|
375
|
-
nc->shape = ALLOC_N(size_t, 1);
|
376
|
-
nc->shape[0] = 0;
|
377
|
-
nc->dtype = Qnil;
|
378
|
-
} else {
|
379
|
-
na_mdai_result(mdai, nc);
|
367
|
+
mdai = na_mdai_alloc(ary);
|
368
|
+
vmdai = TypedData_Wrap_Struct(rb_cData, &mdai_data_type, (void*)mdai);
|
369
|
+
if ( na_mdai_investigate(mdai, 1) ) {
|
370
|
+
// empty
|
371
|
+
dtype = update_type(ptype, numo_cInt32);
|
372
|
+
if (pshape) {
|
373
|
+
*pshape = rb_ary_new3(1, INT2FIX(0));
|
380
374
|
}
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
nc->shape = ALLOC_N(size_t, na->ndim);
|
387
|
-
for (j=0; j<na->ndim; j++) {
|
388
|
-
nc->shape[j] = na->shape[j];
|
375
|
+
if (pnary) {
|
376
|
+
check_subclass_of_narray(dtype);
|
377
|
+
shape = ALLOCA_N(size_t, 1);
|
378
|
+
shape[0] = 0;
|
379
|
+
*pnary = nary_new(dtype, 1, shape);
|
389
380
|
}
|
390
|
-
nc->dtype = CLASS_OF(ary);
|
391
381
|
} else {
|
392
|
-
|
382
|
+
ndim = na_mdai_ndim(mdai);
|
383
|
+
shape = ALLOCA_N(size_t, ndim);
|
384
|
+
na_mdai_shape(mdai, ndim, shape);
|
385
|
+
dtype = update_type(ptype, na_mdai_dtype(mdai));
|
386
|
+
if (pshape) {
|
387
|
+
dshape = rb_ary_new2(ndim);
|
388
|
+
for (i=0; i<ndim; i++) {
|
389
|
+
rb_ary_push(dshape, SIZET2NUM(shape[i]));
|
390
|
+
}
|
391
|
+
*pshape = dshape;
|
392
|
+
}
|
393
|
+
if (pnary) {
|
394
|
+
check_subclass_of_narray(dtype);
|
395
|
+
*pnary = nary_new(dtype, ndim, shape);
|
396
|
+
}
|
393
397
|
}
|
394
|
-
|
398
|
+
RB_GC_GUARD(vmdai);
|
395
399
|
}
|
396
400
|
|
397
401
|
|
398
402
|
static void
|
399
|
-
|
403
|
+
na_composition3(VALUE obj, VALUE *ptype, VALUE *pshape, VALUE *pnary)
|
400
404
|
{
|
401
|
-
VALUE
|
402
|
-
na_compose_t *nc;
|
403
|
-
int i;
|
405
|
+
VALUE dtype, dshape;
|
404
406
|
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
407
|
+
if (TYPE(obj) == T_ARRAY) {
|
408
|
+
na_composition3_ary(obj, ptype, pshape, pnary);
|
409
|
+
}
|
410
|
+
else if (RTEST(rb_obj_is_kind_of(obj,rb_cNumeric))) {
|
411
|
+
dtype = na_mdai_dtype_numeric(na_mdai_object_type(NA_NONE, obj));
|
412
|
+
dtype = update_type(ptype, dtype);
|
413
|
+
if (pshape) {
|
414
|
+
*pshape = rb_ary_new();
|
415
|
+
}
|
416
|
+
if (pnary) {
|
417
|
+
check_subclass_of_narray(dtype);
|
418
|
+
*pnary = nary_new(dtype, 0, 0);
|
419
|
+
}
|
420
|
+
}
|
421
|
+
else if (IsNArray(obj)) {
|
422
|
+
int i, ndim;
|
423
|
+
narray_t *na;
|
424
|
+
GetNArray(obj,na);
|
425
|
+
ndim = na->ndim;
|
426
|
+
dtype = update_type(ptype, CLASS_OF(obj));
|
427
|
+
if (pshape) {
|
428
|
+
dshape = rb_ary_new2(ndim);
|
429
|
+
for (i=0; i<ndim; i++) {
|
430
|
+
rb_ary_push(dshape, SIZET2NUM(na->shape[i]));
|
431
|
+
}
|
432
|
+
*pshape = dshape;
|
433
|
+
}
|
434
|
+
if (pnary) {
|
435
|
+
*pnary = nary_new(dtype, ndim, na->shape);
|
436
|
+
}
|
437
|
+
} else {
|
438
|
+
rb_bug("invalid type for md-array: %s", rb_class2name(CLASS_OF(obj)));
|
411
439
|
}
|
412
|
-
if (shape) {*shape = dshape;}
|
413
|
-
if (type) {*type = nc->dtype;}
|
414
|
-
RB_GC_GUARD(vnc);
|
415
440
|
}
|
416
441
|
|
442
|
+
|
417
443
|
static VALUE
|
418
444
|
na_s_array_shape(VALUE mod, VALUE ary)
|
419
445
|
{
|
420
446
|
VALUE shape;
|
421
447
|
|
422
|
-
if (TYPE(ary)!=T_ARRAY) {
|
423
|
-
|
424
|
-
|
448
|
+
if (TYPE(ary) != T_ARRAY) {
|
449
|
+
// 0-dimension
|
450
|
+
return rb_ary_new();
|
425
451
|
}
|
426
|
-
|
452
|
+
na_composition3(ary, 0, &shape, 0);
|
427
453
|
return shape;
|
428
454
|
}
|
429
455
|
|
430
|
-
static inline void
|
431
|
-
check_subclass_of_narray(VALUE dtype) {
|
432
|
-
if (RTEST(rb_obj_is_kind_of(dtype, rb_cClass))) {
|
433
|
-
if (RTEST(rb_funcall(dtype, id_le, 1, cNArray))) {
|
434
|
-
return;
|
435
|
-
}
|
436
|
-
}
|
437
|
-
rb_raise(nary_eCastError, "cannot convert to NArray");
|
438
|
-
}
|
439
|
-
|
440
456
|
|
441
457
|
/*
|
442
458
|
Generate new unallocated NArray instance with shape and type defined from obj.
|
@@ -457,29 +473,9 @@ check_subclass_of_narray(VALUE dtype) {
|
|
457
473
|
VALUE
|
458
474
|
na_s_new_like(VALUE type, VALUE obj)
|
459
475
|
{
|
460
|
-
VALUE
|
461
|
-
na_compose_t *nc;
|
476
|
+
VALUE newary;
|
462
477
|
|
463
|
-
|
464
|
-
// investigate type
|
465
|
-
if (type == cNArray) {
|
466
|
-
vnc = na_ary_composition(rb_ary_new3(1,obj));
|
467
|
-
GetCompose(vnc,nc);
|
468
|
-
type = nc->dtype;
|
469
|
-
}
|
470
|
-
check_subclass_of_narray(type);
|
471
|
-
newary = nary_new(type, 0, 0);
|
472
|
-
} else {
|
473
|
-
// investigate MD-Array
|
474
|
-
vnc = na_ary_composition(obj);
|
475
|
-
GetCompose(vnc,nc);
|
476
|
-
if (type == cNArray) {
|
477
|
-
type = nc->dtype;
|
478
|
-
}
|
479
|
-
check_subclass_of_narray(type);
|
480
|
-
newary = nary_new(type, nc->ndim, nc->shape);
|
481
|
-
}
|
482
|
-
RB_GC_GUARD(vnc);
|
478
|
+
na_composition3(obj, &type, 0, &newary);
|
483
479
|
return newary;
|
484
480
|
}
|
485
481
|
|
@@ -487,16 +483,10 @@ na_s_new_like(VALUE type, VALUE obj)
|
|
487
483
|
VALUE
|
488
484
|
na_ary_composition_dtype(VALUE ary)
|
489
485
|
{
|
490
|
-
|
491
|
-
na_compose_t *nc;
|
486
|
+
VALUE type = Qnil;
|
492
487
|
|
493
|
-
|
494
|
-
|
495
|
-
vnc = na_ary_composition(ary);
|
496
|
-
GetCompose(vnc,nc);
|
497
|
-
return nc->dtype;
|
498
|
-
}
|
499
|
-
return CLASS_OF(ary);
|
488
|
+
na_composition3(ary, &type, 0, 0);
|
489
|
+
return type;
|
500
490
|
}
|
501
491
|
|
502
492
|
static VALUE
|
@@ -506,8 +496,6 @@ na_s_array_type(VALUE mod, VALUE ary)
|
|
506
496
|
}
|
507
497
|
|
508
498
|
|
509
|
-
|
510
|
-
|
511
499
|
/*
|
512
500
|
Generate NArray object. NArray datatype is automatically selected.
|
513
501
|
@overload [](elements)
|
@@ -528,11 +516,12 @@ nary_s_bracket(VALUE klass, VALUE ary)
|
|
528
516
|
}
|
529
517
|
|
530
518
|
|
531
|
-
VALUE
|
532
|
-
nst_check_compatibility(VALUE self, VALUE ary);
|
519
|
+
//VALUE
|
520
|
+
//nst_check_compatibility(VALUE self, VALUE ary);
|
533
521
|
|
534
522
|
|
535
523
|
/* investigate ndim, shape, type of Array */
|
524
|
+
/*
|
536
525
|
static int
|
537
526
|
na_mdai_for_struct(na_mdai_t *mdai, int ndim)
|
538
527
|
{
|
@@ -563,7 +552,7 @@ na_mdai_for_struct(na_mdai_t *mdai, int ndim)
|
|
563
552
|
}
|
564
553
|
|
565
554
|
if (TYPE(val) == T_ARRAY) {
|
566
|
-
|
555
|
+
// check recursive array
|
567
556
|
for (j=0; j<ndim-1; j++) {
|
568
557
|
if (mdai->item[j].val == val)
|
569
558
|
rb_raise(rb_eStandardError,
|
@@ -608,8 +597,10 @@ na_mdai_for_struct(na_mdai_t *mdai, int ndim)
|
|
608
597
|
//fprintf(stderr,"invalid for struct:"); rb_p(val); abort();
|
609
598
|
return 0;
|
610
599
|
}
|
600
|
+
*/
|
611
601
|
|
612
602
|
|
603
|
+
/*
|
613
604
|
VALUE
|
614
605
|
na_ary_composition_for_struct(VALUE nstruct, VALUE ary)
|
615
606
|
{
|
@@ -621,20 +612,20 @@ na_ary_composition_for_struct(VALUE nstruct, VALUE ary)
|
|
621
612
|
mdai->na_type = nstruct;
|
622
613
|
vmdai = TypedData_Wrap_Struct(rb_cData, &mdai_data_type, (void*)mdai);
|
623
614
|
na_mdai_for_struct(mdai, 0);
|
624
|
-
nc =
|
615
|
+
nc = na_compose_alloc();
|
625
616
|
vnc = WrapCompose(nc);
|
626
617
|
na_mdai_result(mdai, nc);
|
627
618
|
//fprintf(stderr,"nc->ndim=%d\n",nc->ndim);
|
628
619
|
rb_gc_force_recycle(vmdai);
|
629
620
|
return vnc;
|
630
621
|
}
|
622
|
+
*/
|
631
623
|
|
632
624
|
|
633
625
|
|
634
626
|
void
|
635
627
|
Init_nary_array()
|
636
628
|
{
|
637
|
-
//rb_define_singleton_method(cNArray, "mdai", na_mdai, 1);
|
638
629
|
rb_define_singleton_method(cNArray, "array_shape", na_s_array_shape, 1);
|
639
630
|
rb_define_singleton_method(cNArray, "array_type", na_s_array_type, 1);
|
640
631
|
rb_define_singleton_method(cNArray, "new_like", na_s_new_like, 1);
|