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
@@ -2,11 +2,6 @@
|
|
2
2
|
ndloop.h
|
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
|
#ifndef NDLOOP_H
|
12
7
|
#define NDLOOP_H
|
@@ -2,11 +2,6 @@
|
|
2
2
|
template.h
|
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
|
#ifndef TEMPLATE_H
|
12
7
|
#define TEMPLATE_H
|
@@ -1,12 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
complex.h
|
3
3
|
Numerical Array Extension for Ruby
|
4
|
-
(C) Copyright 1999-
|
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
|
+
(C) Copyright 1999-2016 by Masahiro TANAKA
|
10
5
|
*/
|
11
6
|
|
12
7
|
|
@@ -5,7 +5,7 @@ EXTERN double log2(double);
|
|
5
5
|
EXTERN double exp2(double);
|
6
6
|
EXTERN double exp10(double);
|
7
7
|
|
8
|
-
#define r_abs(x)
|
8
|
+
#define r_abs(x) fabs(x)
|
9
9
|
#define r_sqrt(x) sqrt(x)
|
10
10
|
#define r_exp(x) exp(x)
|
11
11
|
#define r_log(x) log(x)
|
@@ -73,6 +73,7 @@ static inline dtype c_from_dcomplex(dcomplex x) {
|
|
73
73
|
#define m_sign(x) c_new( \
|
74
74
|
((REAL(x)==0) ? 0.0:((REAL(x)>0) ? 1.0:((REAL(x)<0) ? -1.0:REAL(x)))), \
|
75
75
|
((IMAG(x)==0) ? 0.0:((IMAG(x)>0) ? 1.0:((IMAG(x)<0) ? -1.0:IMAG(x)))))
|
76
|
+
#define m_copysign(x,y) c_new(copysign(REAL(x),REAL(y)),copysign(IMAG(x),IMAG(y)))
|
76
77
|
|
77
78
|
#define m_im(x) c_im(x)
|
78
79
|
#define m_conj(x) c_new(REAL(x),-IMAG(x))
|
@@ -92,8 +93,6 @@ static inline dtype c_from_dcomplex(dcomplex x) {
|
|
92
93
|
#define m_mulsum(x,y,z) {z = c_add(c_mul(x,y),z);}
|
93
94
|
#define m_mulsum_init INT2FIX(0)
|
94
95
|
|
95
|
-
#define m_rand_norm(a) rand_norm(a)
|
96
|
-
|
97
96
|
#define m_sprintf(s,x) sprintf(s,"%g%+gi",REAL(x),IMAG(x))
|
98
97
|
|
99
98
|
#define m_sqrt(x) c_sqrt(x)
|
@@ -134,6 +133,34 @@ static inline dtype f_sum(size_t n, char *p, ssize_t stride)
|
|
134
133
|
return y;
|
135
134
|
}
|
136
135
|
|
136
|
+
static inline dtype f_kahan_sum(size_t n, char *p, ssize_t stride)
|
137
|
+
{
|
138
|
+
size_t i=n;
|
139
|
+
dtype x;
|
140
|
+
volatile dtype y,t,r;
|
141
|
+
|
142
|
+
y = c_zero();
|
143
|
+
r = c_zero();
|
144
|
+
for (; i--;) {
|
145
|
+
x = *(dtype*)p;
|
146
|
+
if (!c_isnan(x)) {
|
147
|
+
if (fabs(REAL(x)) > fabs(REAL(y))) {
|
148
|
+
double z=REAL(x); REAL(x)=REAL(y); REAL(y)=z;
|
149
|
+
}
|
150
|
+
if (fabs(IMAG(x)) > fabs(IMAG(y))) {
|
151
|
+
double z=IMAG(x); IMAG(x)=IMAG(y); IMAG(y)=z;
|
152
|
+
}
|
153
|
+
r = c_add(x, r);
|
154
|
+
t = y;
|
155
|
+
y = c_add(r, y);
|
156
|
+
t = c_sub(y, t);
|
157
|
+
r = c_sub(r, t);
|
158
|
+
}
|
159
|
+
p += stride;
|
160
|
+
}
|
161
|
+
return y;
|
162
|
+
}
|
163
|
+
|
137
164
|
static inline dtype f_prod(size_t n, char *p, ssize_t stride)
|
138
165
|
{
|
139
166
|
size_t i=n;
|
@@ -18,3 +18,21 @@ inline static dtype m_rand(dtype max)
|
|
18
18
|
IMAG(z) = genrand_res53_mix() * IMAG(max);
|
19
19
|
return z;
|
20
20
|
}
|
21
|
+
|
22
|
+
/* generates random numbers from the normal distribution
|
23
|
+
using Box-Muller Transformation.
|
24
|
+
*/
|
25
|
+
inline static void m_rand_norm(dtype mu, rtype sigma, dtype *a0)
|
26
|
+
{
|
27
|
+
rtype x1, x2, w;
|
28
|
+
do {
|
29
|
+
x1 = genrand_res53_mix();
|
30
|
+
x1 = x1*2-1;
|
31
|
+
x2 = genrand_res53_mix();
|
32
|
+
x2 = x2*2-1;
|
33
|
+
w = x1 * x1 + x2 * x2;
|
34
|
+
} while (w>=1);
|
35
|
+
w = sqrt( (-2*log(w)) / w );
|
36
|
+
REAL(*a0) = x1*w * sigma + REAL(mu);
|
37
|
+
IMAG(*a0) = x2*w * sigma + IMAG(mu);
|
38
|
+
}
|
@@ -12,6 +12,24 @@ inline static dtype m_rand(dtype max)
|
|
12
12
|
return genrand_res53_mix() * max;
|
13
13
|
}
|
14
14
|
|
15
|
+
/* generates random numbers from the normal distribution
|
16
|
+
using Box-Muller Transformation.
|
17
|
+
*/
|
18
|
+
inline static void m_rand_norm(dtype mu, dtype sigma, dtype *a0, dtype *a1)
|
19
|
+
{
|
20
|
+
dtype x1, x2, w;
|
21
|
+
do {
|
22
|
+
x1 = genrand_res53_mix();
|
23
|
+
x1 = x1*2-1;
|
24
|
+
x2 = genrand_res53_mix();
|
25
|
+
x2 = x2*2-1;
|
26
|
+
w = x1 * x1 + x2 * x2;
|
27
|
+
} while (w>=1);
|
28
|
+
w = sqrt( (-2*log(w)) / w );
|
29
|
+
if (a0) {*a0 = x1*w * sigma + mu;}
|
30
|
+
if (a1) {*a1 = x2*w * sigma + mu;}
|
31
|
+
}
|
32
|
+
|
15
33
|
#define m_min_init numo_dfloat_new_dim0(0.0/0.0)
|
16
34
|
#define m_max_init numo_dfloat_new_dim0(0.0/0.0)
|
17
35
|
#define m_extract(x) rb_float_new(*(double*)x)
|
@@ -38,6 +38,7 @@ EXTERN double pow(double, double);
|
|
38
38
|
#define m_trunc(x) trunc(x)
|
39
39
|
#define m_rint(x) rint(x)
|
40
40
|
#define m_sign(x) (((x)==0) ? 0.0:(((x)>0) ? 1.0:(((x)<0) ? -1.0:(x))))
|
41
|
+
#define m_copysign(x,y) copysign(x,y)
|
41
42
|
|
42
43
|
#define m_eq(x,y) ((x)==(y))
|
43
44
|
#define m_ne(x,y) ((x)!=(y))
|
@@ -53,8 +54,6 @@ EXTERN double pow(double, double);
|
|
53
54
|
#define m_mulsum(x,y,z) {z += x*y;}
|
54
55
|
#define m_mulsum_init INT2FIX(0)
|
55
56
|
|
56
|
-
#define m_rand_norm(a) rand_norm(a)
|
57
|
-
|
58
57
|
#define m_sprintf(s,x) sprintf(s,"%g",x)
|
59
58
|
|
60
59
|
#define cmp(a,b) \
|
@@ -135,6 +134,30 @@ static inline dtype f_sum(size_t n, char *p, ssize_t stride)
|
|
135
134
|
return y;
|
136
135
|
}
|
137
136
|
|
137
|
+
static inline dtype f_kahan_sum(size_t n, char *p, ssize_t stride)
|
138
|
+
{
|
139
|
+
size_t i=n;
|
140
|
+
dtype x;
|
141
|
+
volatile dtype y=0;
|
142
|
+
volatile dtype t,r=0;
|
143
|
+
|
144
|
+
for (; i--;) {
|
145
|
+
x = *(dtype*)p;
|
146
|
+
if (!m_isnan(x)) {
|
147
|
+
if (fabs(x) > fabs(y)) {
|
148
|
+
dtype z=x; x=y; y=z;
|
149
|
+
}
|
150
|
+
r += x;
|
151
|
+
t = y;
|
152
|
+
y += r;
|
153
|
+
t = y-t;
|
154
|
+
r -= t;
|
155
|
+
}
|
156
|
+
p += stride;
|
157
|
+
}
|
158
|
+
return y;
|
159
|
+
}
|
160
|
+
|
138
161
|
static inline dtype f_prod(size_t n, char *p, ssize_t stride)
|
139
162
|
{
|
140
163
|
size_t i=n;
|
@@ -28,8 +28,8 @@
|
|
28
28
|
#define m_trunc(x) rb_funcall(x,id_truncate,0)
|
29
29
|
#define m_sign(x) rb_funcall(x,id_op_ufo,1,INT2FIX(0))
|
30
30
|
|
31
|
-
#define m_eq(x,y) RTEST(rb_funcall(x,
|
32
|
-
#define m_ne(x,y) RTEST(rb_funcall(x,
|
31
|
+
#define m_eq(x,y) RTEST(rb_funcall(x,id_op_eq,1,y))
|
32
|
+
#define m_ne(x,y) RTEST(rb_funcall(x,id_op_ne,1,y))
|
33
33
|
#define m_gt(x,y) RTEST(rb_funcall(x,id_op_gt,1,y))
|
34
34
|
#define m_ge(x,y) RTEST(rb_funcall(x,id_op_ge,1,y))
|
35
35
|
#define m_lt(x,y) RTEST(rb_funcall(x,id_op_lt,1,y))
|
@@ -47,8 +47,6 @@
|
|
47
47
|
#define m_mulsum(x,y,z) {z = m_add(m_mul(x,y),z);}
|
48
48
|
#define m_mulsum_init INT2FIX(0)
|
49
49
|
|
50
|
-
#define m_rand_norm(a) rand_norm(a)
|
51
|
-
|
52
50
|
#define m_sprintf(s,x) robj_sprintf(s,x)
|
53
51
|
|
54
52
|
static inline int robj_sprintf(char *s, VALUE x) {
|
@@ -18,3 +18,21 @@ inline static dtype m_rand(dtype max)
|
|
18
18
|
IMAG(z) = to_real2(gen_rand32()) * IMAG(max);
|
19
19
|
return z;
|
20
20
|
}
|
21
|
+
|
22
|
+
/* generates random numbers from the normal distribution
|
23
|
+
using Box-Muller Transformation.
|
24
|
+
*/
|
25
|
+
inline static void m_rand_norm(dtype mu, rtype sigma, dtype *a0)
|
26
|
+
{
|
27
|
+
rtype x1, x2, w;
|
28
|
+
do {
|
29
|
+
x1 = to_real2(gen_rand32());
|
30
|
+
x1 = x1*2-1;
|
31
|
+
x2 = to_real2(gen_rand32());
|
32
|
+
x2 = x2*2-1;
|
33
|
+
w = x1 * x1 + x2 * x2;
|
34
|
+
} while (w>=1);
|
35
|
+
w = sqrt( (-2*log(w)) / w );
|
36
|
+
REAL(*a0) = x1*w * sigma + REAL(mu);
|
37
|
+
IMAG(*a0) = x2*w * sigma + IMAG(mu);
|
38
|
+
}
|
@@ -12,6 +12,24 @@ inline static dtype m_rand(dtype max)
|
|
12
12
|
return to_real2(gen_rand32()) * max;
|
13
13
|
}
|
14
14
|
|
15
|
+
/* generates random numbers from the normal distribution
|
16
|
+
using Box-Muller Transformation.
|
17
|
+
*/
|
18
|
+
inline static void m_rand_norm(dtype mu, dtype sigma, dtype *a0, dtype *a1)
|
19
|
+
{
|
20
|
+
dtype x1, x2, w;
|
21
|
+
do {
|
22
|
+
x1 = to_real2(gen_rand32());
|
23
|
+
x1 = x1*2-1;
|
24
|
+
x2 = to_real2(gen_rand32());
|
25
|
+
x2 = x2*2-1;
|
26
|
+
w = x1 * x1 + x2 * x2;
|
27
|
+
} while (w>=1);
|
28
|
+
w = sqrt( (-2*log(w)) / w );
|
29
|
+
if (a0) {*a0 = x1*w * sigma + mu;}
|
30
|
+
if (a1) {*a1 = x2*w * sigma + mu;}
|
31
|
+
}
|
32
|
+
|
15
33
|
#define m_min_init numo_sfloat_new_dim0(0.0/0.0)
|
16
34
|
#define m_max_init numo_sfloat_new_dim0(0.0/0.0)
|
17
35
|
|
data/ext/numo/narray/rand.c
CHANGED
@@ -37,21 +37,6 @@ int n_bits(u_int64_t a)
|
|
37
37
|
return xl;
|
38
38
|
}
|
39
39
|
|
40
|
-
void rand_norm(double *a)
|
41
|
-
{
|
42
|
-
double x1, x2, w;
|
43
|
-
do {
|
44
|
-
x1 = genrand_res53_mix();
|
45
|
-
x1 = x1*2-1;
|
46
|
-
x2 = genrand_res53_mix();
|
47
|
-
x2 = x2*2-1;
|
48
|
-
w = x1 * x1 + x2 * x2;
|
49
|
-
} while (w>=1);
|
50
|
-
w = sqrt( (-2*log(w)) / w );
|
51
|
-
a[0] = x1*w;
|
52
|
-
a[1] = x2*w;
|
53
|
-
}
|
54
|
-
|
55
40
|
static u_int64_t
|
56
41
|
random_seed()
|
57
42
|
{
|
data/ext/numo/narray/step.c
CHANGED
@@ -2,11 +2,6 @@
|
|
2
2
|
step.c
|
3
3
|
Numerical Array Extension for Ruby
|
4
4
|
(C) Copyright 2007,2013 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 <math.h>
|
data/ext/numo/narray/struct.c
CHANGED
@@ -2,11 +2,6 @@
|
|
2
2
|
nstrut.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"
|
@@ -454,7 +449,7 @@ nary_struct_to_a(VALUE self)
|
|
454
449
|
volatile VALUE opt;
|
455
450
|
ndfunc_arg_in_t ain[3] = {{Qnil,0},{sym_loop_opt},{sym_option}};
|
456
451
|
ndfunc_arg_out_t aout[1] = {{rb_cArray,0}}; // dummy?
|
457
|
-
ndfunc_t ndf = {
|
452
|
+
ndfunc_t ndf = {iter_nstruct_to_a, NO_LOOP, 3, 1, ain, aout};
|
458
453
|
|
459
454
|
opt = nst_create_member_views(self);
|
460
455
|
return na_ndloop_cast_narray_to_rarray(&ndf, self, opt);
|
@@ -587,7 +582,7 @@ iter_nstruct_from_a(na_loop_t *const lp)
|
|
587
582
|
defs = RARRAY_AREF(lp->option,1);
|
588
583
|
|
589
584
|
len = RARRAY_LEN(types);
|
590
|
-
ary = lp->args[
|
585
|
+
ary = lp->args[1].value;
|
591
586
|
//rb_p(CLASS_OF(ary));rb_p(ary);
|
592
587
|
|
593
588
|
for (i=0; i<len; i++) {
|
@@ -595,7 +590,7 @@ iter_nstruct_from_a(na_loop_t *const lp)
|
|
595
590
|
ofs = NUM2SIZET(RARRAY_AREF(def,2));
|
596
591
|
elmt = RARRAY_AREF(types,i);
|
597
592
|
GetNArrayView(elmt,ne);
|
598
|
-
ne->offset = lp->args[
|
593
|
+
ne->offset = lp->args[0].iter[0].pos + ofs;
|
599
594
|
item = RARRAY_AREF(ary,i);
|
600
595
|
//rb_p(ary);
|
601
596
|
//rb_p(item);
|
@@ -612,8 +607,8 @@ nary_struct_cast_array(VALUE klass, VALUE rary)
|
|
612
607
|
narray_t *na;
|
613
608
|
na_compose_t *nc;
|
614
609
|
VALUE opt;
|
615
|
-
ndfunc_arg_in_t ain[3] = {{
|
616
|
-
ndfunc_t ndf = {
|
610
|
+
ndfunc_arg_in_t ain[3] = {{OVERWRITE,0},{rb_cArray,0},{sym_option}};
|
611
|
+
ndfunc_t ndf = {iter_nstruct_from_a, NO_LOOP, 3, 0, ain, 0};
|
617
612
|
|
618
613
|
//fprintf(stderr,"rary:");rb_p(rary);
|
619
614
|
//fprintf(stderr,"class_of(rary):");rb_p(CLASS_OF(rary));
|
@@ -627,7 +622,7 @@ nary_struct_cast_array(VALUE klass, VALUE rary)
|
|
627
622
|
if (na->size>0) {
|
628
623
|
opt = nst_create_member_views(nary);
|
629
624
|
rb_funcall(nary, rb_intern("allocate"), 0);
|
630
|
-
|
625
|
+
na_ndloop_store_rarray2(&ndf, nary, rary, opt);
|
631
626
|
}
|
632
627
|
return nary;
|
633
628
|
}
|
@@ -689,7 +684,7 @@ static VALUE
|
|
689
684
|
nary_struct_store_struct(VALUE self, VALUE obj)
|
690
685
|
{
|
691
686
|
ndfunc_arg_in_t ain[2] = {{OVERWRITE,0},{Qnil,0}};
|
692
|
-
ndfunc_t ndf = {
|
687
|
+
ndfunc_t ndf = {iter_struct_store_struct, FULL_LOOP, 2, 0, ain, 0};
|
693
688
|
|
694
689
|
na_ndloop(&ndf, 2, self, obj);
|
695
690
|
return self;
|
data/lib/erbpp/line_number.rb
CHANGED
@@ -34,7 +34,7 @@ class CountLnString < String
|
|
34
34
|
end
|
35
35
|
return if n == @current
|
36
36
|
if @current != @countln || @postpone
|
37
|
-
if
|
37
|
+
if /\A\s*\z/ =~ @str || /\A#line / =~ @buf || /\n\z/ !~ self
|
38
38
|
@postpone = true
|
39
39
|
elsif @in_comment
|
40
40
|
@postpone = false
|
@@ -79,9 +79,9 @@ class CountLnString < String
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def d(s)
|
82
|
-
|
83
|
-
|
84
|
-
end
|
82
|
+
p [s, [x,y], r]
|
83
|
+
r
|
84
|
+
end
|
85
85
|
|
86
86
|
end
|
87
87
|
|
data/lib/erbpp/narray_def.rb
CHANGED
@@ -178,11 +178,13 @@ class DataType < ErbPP
|
|
178
178
|
has_math
|
179
179
|
is_bit
|
180
180
|
is_int
|
181
|
+
is_unsigned
|
181
182
|
is_float
|
182
183
|
is_real
|
183
184
|
is_complex
|
184
185
|
is_object
|
185
186
|
is_comparable
|
187
|
+
is_double_precision
|
186
188
|
mod_var
|
187
189
|
]
|
188
190
|
define_attrs attrs
|
@@ -248,13 +250,12 @@ class DataType < ErbPP
|
|
248
250
|
t = "cT"
|
249
251
|
end
|
250
252
|
if c=="Integer"
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
end
|
253
|
+
@upcast << "#ifdef RUBY_INTEGER_UNIFICATION"
|
254
|
+
@upcast << "rb_hash_aset(hCast, rb_cInteger, #{t});"
|
255
|
+
@upcast << "#else"
|
256
|
+
@upcast << "rb_hash_aset(hCast, rb_cFixnum, #{t});"
|
257
|
+
@upcast << "rb_hash_aset(hCast, rb_cBignum, #{t});"
|
258
|
+
@upcast << "#endif"
|
258
259
|
else
|
259
260
|
@upcast << "rb_hash_aset(hCast, rb_c#{c}, #{t});"
|
260
261
|
end
|
@@ -339,4 +340,12 @@ class CastArray < StoreArray
|
|
339
340
|
def condition
|
340
341
|
nil
|
341
342
|
end
|
343
|
+
|
344
|
+
def c_func
|
345
|
+
"numo_#{tp}_cast_#{tpname}"
|
346
|
+
end
|
347
|
+
|
348
|
+
def c_iter
|
349
|
+
"iter_#{tp}_cast_#{tpname}"
|
350
|
+
end
|
342
351
|
end
|
data/lib/numo/narray.rb
CHANGED
@@ -0,0 +1,465 @@
|
|
1
|
+
module Numo
|
2
|
+
class NArray
|
3
|
+
|
4
|
+
# p a = Numo::DFloat[[1, 2], [3, 4]]
|
5
|
+
# # Numo::DFloat#shape=[2,2]
|
6
|
+
# # [[1, 2],
|
7
|
+
# # [3, 4]]
|
8
|
+
#
|
9
|
+
# p b = Numo::DFloat[[5, 6]]
|
10
|
+
# # Numo::DFloat#shape=[1,2]
|
11
|
+
# # [[5, 6]]
|
12
|
+
#
|
13
|
+
# p Numo::NArray.concatenate([a,b],axis:0)
|
14
|
+
# # Numo::DFloat#shape=[3,2]
|
15
|
+
# # [[1, 2],
|
16
|
+
# # [3, 4],
|
17
|
+
# # [5, 6]]
|
18
|
+
#
|
19
|
+
# p Numo::NArray.concatenate([a,b.transpose], axis:1)
|
20
|
+
# # Numo::DFloat#shape=[2,3]
|
21
|
+
# # [[1, 2, 5],
|
22
|
+
# # [3, 4, 6]]
|
23
|
+
|
24
|
+
def self.concatenate(arrays,axis:0)
|
25
|
+
klass = (self==NArray) ? NArray.array_type(arrays) : self
|
26
|
+
nd = 0
|
27
|
+
arrays.map! do |a|
|
28
|
+
case a
|
29
|
+
when NArray
|
30
|
+
# ok
|
31
|
+
when Numeric
|
32
|
+
a = klass.new(1).store(a)
|
33
|
+
when Array
|
34
|
+
a = klass.cast(a)
|
35
|
+
else
|
36
|
+
raise TypeError,"not Numo::NArray"
|
37
|
+
end
|
38
|
+
if a.ndim > nd
|
39
|
+
nd = a.ndim
|
40
|
+
end
|
41
|
+
a
|
42
|
+
end
|
43
|
+
if axis < 0
|
44
|
+
axis += nd
|
45
|
+
end
|
46
|
+
if axis < 0 || axis >= nd
|
47
|
+
raise ArgumentError,"axis is out of range"
|
48
|
+
end
|
49
|
+
new_shape = nil
|
50
|
+
sum_size = 0
|
51
|
+
arrays.each do |a|
|
52
|
+
a_shape = a.shape
|
53
|
+
if nd != a_shape.size
|
54
|
+
a_shape = [1]*(nd-a_shape.size) + a_shape
|
55
|
+
end
|
56
|
+
sum_size += a_shape.delete_at(axis)
|
57
|
+
if new_shape
|
58
|
+
if new_shape != a_shape
|
59
|
+
raise ShapeError,"shape mismatch"
|
60
|
+
end
|
61
|
+
else
|
62
|
+
new_shape = a_shape
|
63
|
+
end
|
64
|
+
end
|
65
|
+
new_shape.insert(axis,sum_size)
|
66
|
+
result = klass.zeros(*new_shape)
|
67
|
+
lst = 0
|
68
|
+
refs = [true] * nd
|
69
|
+
arrays.each do |a|
|
70
|
+
fst = lst
|
71
|
+
lst = fst + (a.shape[axis-nd]||1)
|
72
|
+
refs[axis] = fst...lst
|
73
|
+
result[*refs] = a
|
74
|
+
end
|
75
|
+
result
|
76
|
+
end
|
77
|
+
=begin
|
78
|
+
# arrays = 10.times.map{Numo::DFloat.new(3,4).rand(10)}
|
79
|
+
# p Numo::NArray.stack(arrays, axis:0).shape
|
80
|
+
# # [10, 3, 4]
|
81
|
+
# p Numo::NArray.stack(arrays, axis:1).shape
|
82
|
+
# # [3, 10, 4]
|
83
|
+
# p Numo::NArray.stack(arrays, axis:2).shape
|
84
|
+
# # [3, 4, 10]
|
85
|
+
# a = Numo::NArray[1,2,3]
|
86
|
+
# b = Numo::NArray[2,3,4]
|
87
|
+
# p Numo::NArray.stack([a,b])
|
88
|
+
# # Numo::Int32#shape=[2,3]
|
89
|
+
# # [[1, 2, 3],
|
90
|
+
# # [2, 3, 4]]
|
91
|
+
# p Numo::NArray.stack([a,b],axis:-1)
|
92
|
+
# # Numo::Int32#shape=[3,2]
|
93
|
+
# # [[1, 2],
|
94
|
+
# # [2, 3],
|
95
|
+
# # [3, 4]]
|
96
|
+
|
97
|
+
def self.stack(arrays,axis:0)
|
98
|
+
if !arrays.kind_of?(Array)
|
99
|
+
raise TypeError, "argument should be array"
|
100
|
+
end
|
101
|
+
if self == NArray
|
102
|
+
klass = self.array_type(arrays)
|
103
|
+
else
|
104
|
+
klass = self
|
105
|
+
end
|
106
|
+
new_shape = self.array_shape(arrays)[1..-1]
|
107
|
+
nd = new_shape.length + 1
|
108
|
+
if axis < 0
|
109
|
+
axis += nd
|
110
|
+
end
|
111
|
+
if axis < 0 || axis >= nd
|
112
|
+
raise ArgumentError,"axis is out of range"
|
113
|
+
end
|
114
|
+
new_shape.insert(axis, arrays.length)
|
115
|
+
result = klass.zeros(*new_shape)
|
116
|
+
refs = [true] * nd
|
117
|
+
arrays.each_with_index do |a,i|
|
118
|
+
refs[axis] = i
|
119
|
+
result[*refs] = a
|
120
|
+
end
|
121
|
+
result
|
122
|
+
end
|
123
|
+
|
124
|
+
def self.vstack(arrays)
|
125
|
+
self.stack(arrays,axis:0)
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.hstack(arrays)
|
129
|
+
self.stack(arrays,axis:1)
|
130
|
+
end
|
131
|
+
|
132
|
+
def self.dstack(arrays)
|
133
|
+
self.stack(arrays,axis:2)
|
134
|
+
end
|
135
|
+
=end
|
136
|
+
|
137
|
+
def self.vstack(arrays)
|
138
|
+
self.concatenate(arrays,axis:0)
|
139
|
+
end
|
140
|
+
|
141
|
+
def self.hstack(arrays)
|
142
|
+
self.concatenate(arrays,axis:1)
|
143
|
+
end
|
144
|
+
|
145
|
+
def self.dstack(arrays)
|
146
|
+
self.concatenate(arrays,axis:2)
|
147
|
+
end
|
148
|
+
|
149
|
+
# p a = Numo::DFloat[[1, 2], [3, 4]]
|
150
|
+
# # Numo::DFloat#shape=[2,2]
|
151
|
+
# # [[1, 2],
|
152
|
+
# # [3, 4]]
|
153
|
+
#
|
154
|
+
# p b = Numo::DFloat[[5, 6]]
|
155
|
+
# # Numo::DFloat#shape=[1,2]
|
156
|
+
# # [[5, 6]]
|
157
|
+
#
|
158
|
+
# p a.concatenate(b,axis:0)
|
159
|
+
# # Numo::DFloat#shape=[3,2]
|
160
|
+
# # [[1, 2],
|
161
|
+
# # [3, 4],
|
162
|
+
# # [5, 6]]
|
163
|
+
#
|
164
|
+
# p a.concatenate(b.transpose, axis:1)
|
165
|
+
# # Numo::DFloat#shape=[2,3]
|
166
|
+
# # [[1, 2, 5],
|
167
|
+
# # [3, 4, 6]]
|
168
|
+
|
169
|
+
def concatenate(*arrays,axis:0)
|
170
|
+
axis = check_axis(axis)
|
171
|
+
self_shape = shape
|
172
|
+
self_shape.delete_at(axis)
|
173
|
+
sum_size = shape[axis]
|
174
|
+
arrays.map! do |a|
|
175
|
+
case a
|
176
|
+
when NArray
|
177
|
+
# ok
|
178
|
+
when Numeric
|
179
|
+
a = self.class.new(1).store(a)
|
180
|
+
when Array
|
181
|
+
a = self.class.cast(a)
|
182
|
+
else
|
183
|
+
raise TypeError,"not Numo::NArray"
|
184
|
+
end
|
185
|
+
if a.ndim > ndim
|
186
|
+
raise ShapeError,"dimension mismatch"
|
187
|
+
end
|
188
|
+
a_shape = a.shape
|
189
|
+
sum_size += a_shape.delete_at(axis-ndim) || 1
|
190
|
+
if self_shape != a_shape
|
191
|
+
raise ShapeError,"shape mismatch"
|
192
|
+
end
|
193
|
+
a
|
194
|
+
end
|
195
|
+
self_shape.insert(axis,sum_size)
|
196
|
+
result = self.class.zeros(*self_shape)
|
197
|
+
lst = shape[axis]
|
198
|
+
refs = [true] * ndim
|
199
|
+
refs[axis] = 0...lst
|
200
|
+
result[*refs] = self
|
201
|
+
arrays.each do |a|
|
202
|
+
fst = lst
|
203
|
+
lst = fst + (a.shape[axis-ndim] || 1)
|
204
|
+
refs[axis] = fst...lst
|
205
|
+
result[*refs] = a
|
206
|
+
end
|
207
|
+
result
|
208
|
+
end
|
209
|
+
|
210
|
+
# p x = Numo::DFloat.new(9).seq
|
211
|
+
# # Numo::DFloat#shape=[9]
|
212
|
+
# # [0, 1, 2, 3, 4, 5, 6, 7, 8]
|
213
|
+
#
|
214
|
+
# pp x.split(3)
|
215
|
+
# # [Numo::DFloat(view)#shape=[3]
|
216
|
+
# # [0, 1, 2],
|
217
|
+
# # Numo::DFloat(view)#shape=[3]
|
218
|
+
# # [3, 4, 5],
|
219
|
+
# # Numo::DFloat(view)#shape=[3]
|
220
|
+
# # [6, 7, 8]]
|
221
|
+
#
|
222
|
+
# p x = Numo::DFloat.new(8).seq
|
223
|
+
# # Numo::DFloat#shape=[8]
|
224
|
+
# # [0, 1, 2, 3, 4, 5, 6, 7]
|
225
|
+
#
|
226
|
+
# pp x.split([3, 5, 6, 10])
|
227
|
+
# # [Numo::DFloat(view)#shape=[3]
|
228
|
+
# # [0, 1, 2],
|
229
|
+
# # Numo::DFloat(view)#shape=[2]
|
230
|
+
# # [3, 4],
|
231
|
+
# # Numo::DFloat(view)#shape=[1]
|
232
|
+
# # [5],
|
233
|
+
# # Numo::DFloat(view)#shape=[2]
|
234
|
+
# # [6, 7],
|
235
|
+
# # Numo::DFloat(view)#shape=[0][]]
|
236
|
+
|
237
|
+
def split(indices_or_sections, axis:0)
|
238
|
+
axis = check_axis(axis)
|
239
|
+
size_axis = shape[axis]
|
240
|
+
case indices_or_sections
|
241
|
+
when Integer
|
242
|
+
div_axis, mod_axis = size_axis.divmod(indices_or_sections)
|
243
|
+
if mod_axis != 0
|
244
|
+
raise "not equally divide the axis"
|
245
|
+
end
|
246
|
+
refs = [true]*ndim
|
247
|
+
indices_or_sections.times.map do |i|
|
248
|
+
refs[axis] = i*div_axis ... (i+1)*div_axis
|
249
|
+
self[*refs]
|
250
|
+
end
|
251
|
+
when NArray
|
252
|
+
split(indices_or_sections.to_a,axis:axis)
|
253
|
+
when Array
|
254
|
+
refs = [true]*ndim
|
255
|
+
fst = 0
|
256
|
+
(indices_or_sections + [size_axis]).map do |lst|
|
257
|
+
lst = size_axis if lst > size_axis
|
258
|
+
refs[axis] = (fst < size_axis) ? fst...lst : -1...-1
|
259
|
+
fst = lst
|
260
|
+
self[*refs]
|
261
|
+
end
|
262
|
+
else
|
263
|
+
raise TypeError,"argument must be Integer or Array"
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
# p x = Numo::DFloat.new(4,4).seq
|
268
|
+
# # Numo::DFloat#shape=[4,4]
|
269
|
+
# # [[0, 1, 2, 3],
|
270
|
+
# # [4, 5, 6, 7],
|
271
|
+
# # [8, 9, 10, 11],
|
272
|
+
# # [12, 13, 14, 15]]
|
273
|
+
#
|
274
|
+
# pp x.hsplit(2)
|
275
|
+
# # [Numo::DFloat(view)#shape=[4,2]
|
276
|
+
# # [[0, 1],
|
277
|
+
# # [4, 5],
|
278
|
+
# # [8, 9],
|
279
|
+
# # [12, 13]],
|
280
|
+
# # Numo::DFloat(view)#shape=[4,2]
|
281
|
+
# # [[2, 3],
|
282
|
+
# # [6, 7],
|
283
|
+
# # [10, 11],
|
284
|
+
# # [14, 15]]]
|
285
|
+
#
|
286
|
+
# pp x.hsplit([3, 6])
|
287
|
+
# # [Numo::DFloat(view)#shape=[4,3]
|
288
|
+
# # [[0, 1, 2],
|
289
|
+
# # [4, 5, 6],
|
290
|
+
# # [8, 9, 10],
|
291
|
+
# # [12, 13, 14]],
|
292
|
+
# # Numo::DFloat(view)#shape=[4,1]
|
293
|
+
# # [[3],
|
294
|
+
# # [7],
|
295
|
+
# # [11],
|
296
|
+
# # [15]],
|
297
|
+
# # Numo::DFloat(view)#shape=[4,0][]]
|
298
|
+
|
299
|
+
def vsplit(indices_or_sections)
|
300
|
+
split(indices_or_sections, axis:0)
|
301
|
+
end
|
302
|
+
|
303
|
+
def hsplit(indices_or_sections)
|
304
|
+
split(indices_or_sections, axis:1)
|
305
|
+
end
|
306
|
+
|
307
|
+
def dsplit(indices_or_sections)
|
308
|
+
split(indices_or_sections, axis:2)
|
309
|
+
end
|
310
|
+
|
311
|
+
|
312
|
+
# p a = Numo::NArray[0,1,2]
|
313
|
+
# # Numo::Int32#shape=[3]
|
314
|
+
# # [0, 1, 2]
|
315
|
+
#
|
316
|
+
# p a.tile(2)
|
317
|
+
# # Numo::Int32#shape=[6]
|
318
|
+
# # [0, 1, 2, 0, 1, 2]
|
319
|
+
#
|
320
|
+
# p a.tile(2,2)
|
321
|
+
# # Numo::Int32#shape=[2,6]
|
322
|
+
# # [[0, 1, 2, 0, 1, 2],
|
323
|
+
# # [0, 1, 2, 0, 1, 2]]
|
324
|
+
#
|
325
|
+
# p a.tile(2,1,2)
|
326
|
+
# # Numo::Int32#shape=[2,1,6]
|
327
|
+
# # [[[0, 1, 2, 0, 1, 2]],
|
328
|
+
# # [[0, 1, 2, 0, 1, 2]]]
|
329
|
+
#
|
330
|
+
# p b = Numo::NArray[[1, 2], [3, 4]]
|
331
|
+
# # Numo::Int32#shape=[2,2]
|
332
|
+
# # [[1, 2],
|
333
|
+
# # [3, 4]]
|
334
|
+
#
|
335
|
+
# p b.tile(2)
|
336
|
+
# # Numo::Int32#shape=[2,4]
|
337
|
+
# # [[1, 2, 1, 2],
|
338
|
+
# # [3, 4, 3, 4]]
|
339
|
+
#
|
340
|
+
# p b.tile(2,1)
|
341
|
+
# # Numo::Int32#shape=[4,2]
|
342
|
+
# # [[1, 2],
|
343
|
+
# # [3, 4],
|
344
|
+
# # [1, 2],
|
345
|
+
# # [3, 4]]
|
346
|
+
#
|
347
|
+
# p c = Numo::NArray[1,2,3,4]
|
348
|
+
# # Numo::Int32#shape=[4]
|
349
|
+
# # [1, 2, 3, 4]
|
350
|
+
#
|
351
|
+
# p c.tile(4,1)
|
352
|
+
# # Numo::Int32#shape=[4,4]
|
353
|
+
# # [[1, 2, 3, 4],
|
354
|
+
# # [1, 2, 3, 4],
|
355
|
+
# # [1, 2, 3, 4],
|
356
|
+
# # [1, 2, 3, 4]]
|
357
|
+
|
358
|
+
def tile(*arg)
|
359
|
+
arg.each do |i|
|
360
|
+
if !i.kind_of?(Integer) || i<1
|
361
|
+
raise ArgumentError,"argument should be positive integer"
|
362
|
+
end
|
363
|
+
end
|
364
|
+
ns = arg.size
|
365
|
+
nd = self.ndim
|
366
|
+
shp = self.shape
|
367
|
+
new_shp = []
|
368
|
+
src_shp = []
|
369
|
+
res_shp = []
|
370
|
+
(nd-ns).times do
|
371
|
+
new_shp << 1
|
372
|
+
new_shp << (n = shp.shift)
|
373
|
+
src_shp << :new
|
374
|
+
src_shp << true
|
375
|
+
res_shp << n
|
376
|
+
end
|
377
|
+
(ns-nd).times do
|
378
|
+
new_shp << (m = arg.shift)
|
379
|
+
new_shp << 1
|
380
|
+
src_shp << :new
|
381
|
+
src_shp << :new
|
382
|
+
res_shp << m
|
383
|
+
end
|
384
|
+
[nd,ns].min.times do
|
385
|
+
new_shp << (m = arg.shift)
|
386
|
+
new_shp << (n = shp.shift)
|
387
|
+
src_shp << :new
|
388
|
+
src_shp << true
|
389
|
+
res_shp << n*m
|
390
|
+
end
|
391
|
+
self.class.new(*new_shp).store(self[*src_shp]).reshape(*res_shp)
|
392
|
+
end
|
393
|
+
|
394
|
+
|
395
|
+
# p Numo::NArray[3].repeat(4)
|
396
|
+
# # Numo::Int32#shape=[4]
|
397
|
+
# # [3, 3, 3, 3]
|
398
|
+
#
|
399
|
+
# p x = Numo::NArray[[1,2],[3,4]]
|
400
|
+
# # Numo::Int32#shape=[2,2]
|
401
|
+
# # [[1, 2],
|
402
|
+
# # [3, 4]]
|
403
|
+
#
|
404
|
+
# p x.repeat(2)
|
405
|
+
# # Numo::Int32#shape=[8]
|
406
|
+
# # [1, 1, 2, 2, 3, 3, 4, 4]
|
407
|
+
#
|
408
|
+
# p x.repeat(3,axis:1)
|
409
|
+
# # Numo::Int32#shape=[2,6]
|
410
|
+
# # [[1, 1, 1, 2, 2, 2],
|
411
|
+
# # [3, 3, 3, 4, 4, 4]]
|
412
|
+
#
|
413
|
+
# p x.repeat([1,2],axis:0)
|
414
|
+
# # Numo::Int32#shape=[3,2]
|
415
|
+
# # [[1, 2],
|
416
|
+
# # [3, 4],
|
417
|
+
# # [3, 4]]
|
418
|
+
|
419
|
+
def repeat(arg,axis:nil)
|
420
|
+
case axis
|
421
|
+
when Integer
|
422
|
+
axis = check_axis(axis)
|
423
|
+
c = self
|
424
|
+
when NilClass
|
425
|
+
c = self.flatten
|
426
|
+
axis = 0
|
427
|
+
else
|
428
|
+
raise ArgumentError,"invalid axis"
|
429
|
+
end
|
430
|
+
case arg
|
431
|
+
when Integer
|
432
|
+
if !arg.kind_of?(Integer) || arg<1
|
433
|
+
raise ArgumentError,"argument should be positive integer"
|
434
|
+
end
|
435
|
+
idx = c.shape[axis].times.map{|i| [i]*arg}.flatten
|
436
|
+
else
|
437
|
+
arg = arg.to_a
|
438
|
+
if arg.size != c.shape[axis]
|
439
|
+
raise ArgumentError,"repeat size shoud be equal to size along axis"
|
440
|
+
end
|
441
|
+
arg.each do |i|
|
442
|
+
if !i.kind_of?(Integer) || i<0
|
443
|
+
raise ArgumentError,"argument should be non-negative integer"
|
444
|
+
end
|
445
|
+
end
|
446
|
+
idx = arg.each_with_index.map{|a,i| [i]*a}.flatten
|
447
|
+
end
|
448
|
+
ref = [true] * c.ndim
|
449
|
+
ref[axis] = idx
|
450
|
+
c[*ref].copy
|
451
|
+
end
|
452
|
+
|
453
|
+
|
454
|
+
def check_axis(axis)
|
455
|
+
if axis < 0
|
456
|
+
axis += ndim
|
457
|
+
end
|
458
|
+
if axis < 0 || axis >= ndim
|
459
|
+
raise ArgumentError,"invalid axis"
|
460
|
+
end
|
461
|
+
axis
|
462
|
+
end
|
463
|
+
|
464
|
+
end
|
465
|
+
end
|