narray 0.5.9.4 → 0.5.9.5
Sign up to get free protection for your applications and to get access to all the features.
- data/src/ChangeLog +29 -0
- data/src/MANIFEST +7 -36
- data/src/README.en +1 -5
- data/src/README.ja +1 -2
- data/src/SPEC.en +15 -8
- data/src/SPEC.ja +5 -2
- data/src/bench/all.rb +88 -0
- data/src/bench/bench.m +61 -0
- data/src/bench/bench.py +89 -0
- data/src/bench/bench.rb +59 -0
- data/src/bench/dummy.m +0 -0
- data/src/bench/dummy.py +13 -0
- data/src/bench/dummy.rb +0 -0
- data/src/lib/narray_ext.rb +36 -2
- data/src/mkmath.rb +4 -4
- data/src/mkop.rb +16 -16
- data/src/na_array.c +32 -32
- data/src/na_func.c +50 -50
- data/src/na_index.c +26 -32
- data/src/na_linalg.c +23 -26
- data/src/na_random.c +15 -18
- data/src/narray.c +22 -32
- data/src/narray.h +3 -3
- data/src/narray_local.h +1 -1
- metadata +10 -39
- data/src/nimage/README.en +0 -38
- data/src/nimage/demo/fits.rb +0 -97
- data/src/nimage/demo/fits_convol.rb +0 -28
- data/src/nimage/demo/fits_fftdemo.rb +0 -27
- data/src/nimage/demo/fitsdemo1.rb +0 -13
- data/src/nimage/demo/fitsdemo2.rb +0 -30
- data/src/nimage/demo/fitsdemo3.rb +0 -26
- data/src/nimage/demo/fitsmorph.rb +0 -39
- data/src/nimage/demo/life_na.rb +0 -57
- data/src/nimage/demo/mandel.rb +0 -41
- data/src/nimage/extconf.rb +0 -12
- data/src/nimage/lib/nimage.rb +0 -51
- data/src/nimage/nimage.c +0 -328
- data/src/speed/add.py +0 -12
- data/src/speed/add.rb +0 -8
- data/src/speed/add_int.py +0 -12
- data/src/speed/add_int.rb +0 -9
- data/src/speed/lu.m +0 -14
- data/src/speed/lu.rb +0 -22
- data/src/speed/mat.m +0 -23
- data/src/speed/mat.rb +0 -28
- data/src/speed/mul.py +0 -12
- data/src/speed/mul.rb +0 -9
- data/src/speed/mul2.py +0 -15
- data/src/speed/mul2.rb +0 -13
- data/src/speed/mul_comp.py +0 -12
- data/src/speed/mul_comp.rb +0 -9
- data/src/speed/mul_int.py +0 -12
- data/src/speed/mul_int.rb +0 -9
- data/src/speed/mybench.py +0 -15
- data/src/speed/mybench.rb +0 -31
- data/src/speed/solve.m +0 -18
- data/src/speed/solve.py +0 -16
- data/src/speed/solve.rb +0 -21
data/src/na_func.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
na_func.c
|
3
3
|
Numerical Array Extention for Ruby
|
4
|
-
(C) Copyright 1999-
|
4
|
+
(C) Copyright 1999-2008 by Masahiro TANAKA
|
5
5
|
|
6
6
|
This program is free software.
|
7
7
|
You can distribute/modify this program
|
@@ -32,7 +32,7 @@ void
|
|
32
32
|
{
|
33
33
|
int i;
|
34
34
|
|
35
|
-
for (i=0; i<ndim; i
|
35
|
+
for (i=0; i<ndim; ++i) {
|
36
36
|
max_shp[i] = na_max3(shp1[i], shp2[i], shp3[i]);
|
37
37
|
}
|
38
38
|
}
|
@@ -51,10 +51,10 @@ void na_init_slice( struct slice *s, int rank, int *shape, int elmsz )
|
|
51
51
|
|
52
52
|
/* set strides and clear index */
|
53
53
|
s[0].stride = 1;
|
54
|
-
for (r=1; r<rank; r
|
54
|
+
for (r=1; r<rank; ++r)
|
55
55
|
s[r].stride = s[r-1].stride * shape[r-1];
|
56
56
|
|
57
|
-
for (r=0; r<rank; r
|
57
|
+
for (r=0; r<rank; ++r) {
|
58
58
|
if ( s[r].idx == NULL )
|
59
59
|
/* regular interval */
|
60
60
|
s[r].pstep = s[r].step * s[r].stride * elmsz;
|
@@ -62,7 +62,7 @@ void na_init_slice( struct slice *s, int rank, int *shape, int elmsz )
|
|
62
62
|
/* index */
|
63
63
|
s[r].pstep = b = s[r].stride * elmsz;
|
64
64
|
/* convert index to byte-unit */
|
65
|
-
for (i=0; i<16; i
|
65
|
+
for (i=0; i<16; ++i)
|
66
66
|
if ( (1<<i) == b ) { b=i; break; }
|
67
67
|
if (i==16)
|
68
68
|
for (idx=s[r].idx,i=s[r].n; i-->0; ) { *(idx++)*=b; }
|
@@ -75,7 +75,7 @@ void na_init_slice( struct slice *s, int rank, int *shape, int elmsz )
|
|
75
75
|
s[rank].n = 0;
|
76
76
|
s[rank].idx = NULL;
|
77
77
|
|
78
|
-
for (r=rank-1;r>=0
|
78
|
+
for (r=rank-1;r>=0;--r) {
|
79
79
|
/* set beginning pointers */
|
80
80
|
if ( s[r].idx == NULL )
|
81
81
|
s[r].pbeg = s[r].stride * s[r].beg * elmsz;
|
@@ -102,7 +102,7 @@ static void
|
|
102
102
|
for(;;) {
|
103
103
|
/* set pointers */
|
104
104
|
while (i > 0) {
|
105
|
-
i
|
105
|
+
--i;
|
106
106
|
s2[i].p = s2[i].pbeg + s2[i+1].p;
|
107
107
|
s1[i].p = s1[i].pbeg + s1[i+1].p;
|
108
108
|
si[i] = s1[i].n;
|
@@ -139,7 +139,7 @@ static void
|
|
139
139
|
for(;;) {
|
140
140
|
/* set pointers */
|
141
141
|
while (i > 0) {
|
142
|
-
i
|
142
|
+
--i;
|
143
143
|
s3[i].p = s3[i].pbeg + s3[i+1].p;
|
144
144
|
s2[i].p = s2[i].pbeg + s2[i+1].p;
|
145
145
|
s1[i].p = s1[i].pbeg + s1[i+1].p;
|
@@ -187,7 +187,7 @@ void na_loop_index_ref( struct NARRAY *a1, struct NARRAY *a2,
|
|
187
187
|
for(;;) {
|
188
188
|
/* set pointers */
|
189
189
|
while (i > 0) {
|
190
|
-
i
|
190
|
+
--i;
|
191
191
|
s2[i].p = s2[i].pbeg + s2[i+1].p;
|
192
192
|
s1[i].p = s1[i].pbeg + s1[i+1].p;
|
193
193
|
si[i] = 0;
|
@@ -245,7 +245,7 @@ void na_loop_general( struct NARRAY *a1, struct NARRAY *a2,
|
|
245
245
|
for(;;) {
|
246
246
|
/* set pointers */
|
247
247
|
while (i > 0) {
|
248
|
-
i
|
248
|
+
--i;
|
249
249
|
s2[i].p = s2[i].pbeg + s2[i+1].p;
|
250
250
|
s1[i].p = s1[i].pbeg + s1[i+1].p;
|
251
251
|
si[i] = 0;
|
@@ -308,9 +308,9 @@ void
|
|
308
308
|
{
|
309
309
|
int i;
|
310
310
|
|
311
|
-
for (i=0; i<a->rank; i
|
311
|
+
for (i=0; i<a->rank; ++i)
|
312
312
|
shape[i] = a->shape[i];
|
313
|
-
for ( ; i<ndim; i
|
313
|
+
for ( ; i<ndim; ++i)
|
314
314
|
shape[i] = 1;
|
315
315
|
}
|
316
316
|
|
@@ -321,7 +321,7 @@ void
|
|
321
321
|
int i;
|
322
322
|
|
323
323
|
/* for normal access */
|
324
|
-
for (i=0; i<ndim; i
|
324
|
+
for (i=0; i<ndim; ++i) {
|
325
325
|
slc[i].n = shape[i];
|
326
326
|
slc[i].beg = 0;
|
327
327
|
slc[i].step = 1;
|
@@ -337,7 +337,7 @@ static int
|
|
337
337
|
{
|
338
338
|
int i, j;
|
339
339
|
|
340
|
-
for (i=j=0; i<ndim; i
|
340
|
+
for (i=j=0; i<ndim; ++i) {
|
341
341
|
|
342
342
|
if ( shp1[i]==1 && shp2[i]>1 ) {
|
343
343
|
s1[j].n =
|
@@ -378,7 +378,7 @@ static int
|
|
378
378
|
s2[j].beg = 0;
|
379
379
|
s1[j].idx =
|
380
380
|
s2[j].idx = NULL;
|
381
|
-
j
|
381
|
+
++j;
|
382
382
|
}
|
383
383
|
|
384
384
|
return j;
|
@@ -406,7 +406,7 @@ int
|
|
406
406
|
int i, j;
|
407
407
|
|
408
408
|
/* for repetitous access */
|
409
|
-
for (i=j=0; i<ndim; i
|
409
|
+
for (i=j=0; i<ndim; ++i) {
|
410
410
|
|
411
411
|
s1[j].step = na_set_slice_check(shp1[i],shape[i],i);
|
412
412
|
s2[j].step = na_set_slice_check(shp2[i],shape[i],i);
|
@@ -446,7 +446,7 @@ int
|
|
446
446
|
s2[j].idx =
|
447
447
|
s3[j].idx = NULL;
|
448
448
|
|
449
|
-
j
|
449
|
+
++j;
|
450
450
|
}
|
451
451
|
|
452
452
|
return j;
|
@@ -535,13 +535,13 @@ static void
|
|
535
535
|
NA_SWAP(a1,a2,tmp);
|
536
536
|
}
|
537
537
|
|
538
|
-
for (i=0; i<a2->rank; i
|
538
|
+
for (i=0; i<a2->rank; ++i) {
|
539
539
|
shape[i] = NA_MAX(a1->shape[i],a2->shape[i]);
|
540
540
|
}
|
541
|
-
for ( ; i<a1->rank; i
|
541
|
+
for ( ; i<a1->rank; ++i) {
|
542
542
|
shape[i] = a1->shape[i];
|
543
543
|
}
|
544
|
-
for ( ; i<ndim; i
|
544
|
+
for ( ; i<ndim; ++i) {
|
545
545
|
shape[i] = 1;
|
546
546
|
}
|
547
547
|
}
|
@@ -653,7 +653,6 @@ static VALUE
|
|
653
653
|
na_exec_binary( NA_STRUCT(obj3), a1, a2,
|
654
654
|
PowFuncs[a1->type][a2->type] );
|
655
655
|
|
656
|
-
//na_touch_object(obj1,obj2);
|
657
656
|
return obj3;
|
658
657
|
}
|
659
658
|
|
@@ -668,7 +667,6 @@ static VALUE
|
|
668
667
|
|
669
668
|
na_exec_unary( NA_STRUCT(obj1), NA_STRUCT(obj2), funcs[a1->type] );
|
670
669
|
|
671
|
-
//na_touch_object(obj2);
|
672
670
|
return obj1;
|
673
671
|
}
|
674
672
|
|
@@ -683,7 +681,6 @@ static VALUE
|
|
683
681
|
|
684
682
|
na_exec_unary( NA_STRUCT(obj1), NA_STRUCT(obj2), ImgSetFuncs[a1->type] );
|
685
683
|
|
686
|
-
//na_touch_object(obj2);
|
687
684
|
return obj1;
|
688
685
|
}
|
689
686
|
|
@@ -822,6 +819,10 @@ static VALUE na_div_bang(VALUE obj1, VALUE obj2)
|
|
822
819
|
static VALUE na_mul_bang(VALUE obj1, VALUE obj2)
|
823
820
|
{ return na_set_func( obj1, obj2, MulUFuncs ); }
|
824
821
|
|
822
|
+
/* method: self.conj! */
|
823
|
+
static VALUE na_conj_bang(VALUE self)
|
824
|
+
{ return na_set_func( self, self, ConjFuncs ); }
|
825
|
+
|
825
826
|
|
826
827
|
/* method: self.swap_byte */
|
827
828
|
static VALUE na_swap_byte(VALUE self)
|
@@ -932,7 +933,7 @@ static VALUE
|
|
932
933
|
p = a->ptr;
|
933
934
|
for( i=a->total; i-->0; ) {
|
934
935
|
*p = *p==0 ? 1 : 0;
|
935
|
-
p
|
936
|
+
++p;
|
936
937
|
}
|
937
938
|
return obj;
|
938
939
|
}
|
@@ -949,7 +950,7 @@ static VALUE
|
|
949
950
|
p = a->ptr;
|
950
951
|
for( i=a->total; i-->0; ) {
|
951
952
|
if (*p!=1) *p=0;
|
952
|
-
p
|
953
|
+
++p;
|
953
954
|
}
|
954
955
|
return self;
|
955
956
|
}
|
@@ -968,7 +969,7 @@ static VALUE
|
|
968
969
|
for( i=a->total; i-->0; ) {
|
969
970
|
if (*p==1 || *p==0) *p=1;
|
970
971
|
else *p=0;
|
971
|
-
p
|
972
|
+
++p;
|
972
973
|
}
|
973
974
|
return obj;
|
974
975
|
}
|
@@ -987,7 +988,7 @@ static VALUE
|
|
987
988
|
for( i=a->total; i-->0; ) {
|
988
989
|
if (*p==2) *p=1;
|
989
990
|
else *p=0;
|
990
|
-
p
|
991
|
+
++p;
|
991
992
|
}
|
992
993
|
return obj;
|
993
994
|
}
|
@@ -1006,7 +1007,7 @@ static VALUE
|
|
1006
1007
|
for( i=a->total; i-->0; ) {
|
1007
1008
|
if (*p==2 || *p==0) *p=1;
|
1008
1009
|
else *p=0;
|
1009
|
-
p
|
1010
|
+
++p;
|
1010
1011
|
}
|
1011
1012
|
return obj;
|
1012
1013
|
}
|
@@ -1036,7 +1037,7 @@ static int
|
|
1036
1037
|
if (flag==0)
|
1037
1038
|
MEMZERO(rankv,int,rankc);
|
1038
1039
|
|
1039
|
-
for (i=0;i<argc
|
1040
|
+
for (i=0;i<argc;++i) {
|
1040
1041
|
if ( c >= rankc )
|
1041
1042
|
rb_raise(rb_eArgError, "too many ranks");
|
1042
1043
|
|
@@ -1051,7 +1052,7 @@ static int
|
|
1051
1052
|
rankv[c] = r;
|
1052
1053
|
else
|
1053
1054
|
rankv[r] = 1;
|
1054
|
-
c
|
1055
|
+
++c;
|
1055
1056
|
}
|
1056
1057
|
else
|
1057
1058
|
if (CLASS_OF(v)==rb_cRange) {
|
@@ -1059,12 +1060,12 @@ static int
|
|
1059
1060
|
if ( c+n > rankc )
|
1060
1061
|
rb_raise(rb_eArgError, "too many ranks");
|
1061
1062
|
if (flag) {
|
1062
|
-
for(j=0; j<n; j
|
1063
|
+
for(j=0; j<n; ++j)
|
1063
1064
|
rankv[c++] = r++;
|
1064
1065
|
} else {
|
1065
|
-
for(j=0; j<n; j
|
1066
|
+
for(j=0; j<n; ++j) {
|
1066
1067
|
rankv[r++] = 1;
|
1067
|
-
c
|
1068
|
+
++c;
|
1068
1069
|
}
|
1069
1070
|
}
|
1070
1071
|
}
|
@@ -1091,7 +1092,7 @@ static struct NARRAY *
|
|
1091
1092
|
na_init_slice( s1, ndim, a2->shape, na_sizeof[a2->type] );
|
1092
1093
|
|
1093
1094
|
/* Transpose Slice */
|
1094
|
-
for (i=0; i<ndim; i
|
1095
|
+
for (i=0; i<ndim; ++i)
|
1095
1096
|
s2[i] = s1[trans[i]];
|
1096
1097
|
s2[ndim] = s1[ndim];
|
1097
1098
|
|
@@ -1123,18 +1124,18 @@ static VALUE
|
|
1123
1124
|
rankc = na_arg_to_rank( argc, argv, a2->rank, rankv, 1 );
|
1124
1125
|
if (rankc > a2->rank)
|
1125
1126
|
rb_raise(rb_eArgError, "too many args");
|
1126
|
-
for ( ;rankc<a2->rank; rankc
|
1127
|
+
for ( ;rankc<a2->rank; ++rankc)
|
1127
1128
|
rankv[rankc] = rankc;
|
1128
1129
|
|
1129
1130
|
/* Argument Check */
|
1130
1131
|
MEMZERO(shape,int,rankc);
|
1131
|
-
for (i=0; i<rankc; i
|
1132
|
+
for (i=0; i<rankc; ++i) {
|
1132
1133
|
if (shape[rankv[i]] != 0)
|
1133
1134
|
rb_raise(rb_eArgError,"rank doublebooking");
|
1134
1135
|
shape[rankv[i]] = 1;
|
1135
1136
|
}
|
1136
1137
|
|
1137
|
-
for (i=0; i<a2->rank; i
|
1138
|
+
for (i=0; i<a2->rank; ++i)
|
1138
1139
|
shape[i] = a2->shape[rankv[i]];
|
1139
1140
|
|
1140
1141
|
obj = na_make_object(a2->type, a2->rank, shape, CLASS_OF(self));
|
@@ -1155,13 +1156,13 @@ static void
|
|
1155
1156
|
|
1156
1157
|
if (rankc==0) {
|
1157
1158
|
/* Accumulate all elements */
|
1158
|
-
for (i=0; i<rank; i
|
1159
|
+
for (i=0; i<rank; ++i) {
|
1159
1160
|
itr_shape[i] = 1;
|
1160
1161
|
rankv[i] = 1;
|
1161
1162
|
}
|
1162
1163
|
} else {
|
1163
1164
|
/* Select Accumulate ranks */
|
1164
|
-
for (i=0; i<rank; i
|
1165
|
+
for (i=0; i<rank; ++i) {
|
1165
1166
|
if (rankv[i]==1)
|
1166
1167
|
itr_shape[i] = 1;
|
1167
1168
|
else
|
@@ -1178,7 +1179,7 @@ static void
|
|
1178
1179
|
VALUE zero = INT2FIX(0);
|
1179
1180
|
VALUE *v = (VALUE*)ary->ptr;
|
1180
1181
|
|
1181
|
-
for (i=ary->total; i>0; i
|
1182
|
+
for (i=ary->total; i>0; --i)
|
1182
1183
|
*(v++) = zero;
|
1183
1184
|
}
|
1184
1185
|
|
@@ -1281,7 +1282,6 @@ static VALUE
|
|
1281
1282
|
ans = na_shrink_rank(ans,cl_dim,rankv);
|
1282
1283
|
|
1283
1284
|
xfree(rankv);
|
1284
|
-
//na_touch_object(self,other);
|
1285
1285
|
return ans;
|
1286
1286
|
}
|
1287
1287
|
|
@@ -1358,7 +1358,7 @@ static void
|
|
1358
1358
|
s2 = &s1[ndim+1];
|
1359
1359
|
|
1360
1360
|
na_set_slice_1obj(a1->rank,s1,a1->shape);
|
1361
|
-
for (i=0; i<ndim; i
|
1361
|
+
for (i=0; i<ndim; ++i) {
|
1362
1362
|
s2[i].n = a1->shape[i]; /* no-repeat if a1->shape[i]==1 */
|
1363
1363
|
s2[i].beg = 0; /* copy idx=0 */
|
1364
1364
|
s2[i].step = 1;
|
@@ -1434,7 +1434,7 @@ static int
|
|
1434
1434
|
}
|
1435
1435
|
|
1436
1436
|
nsort = 1;
|
1437
|
-
for (i=0; i<=rank; i
|
1437
|
+
for (i=0; i<=rank; ++i)
|
1438
1438
|
nsort *= a1->shape[i];
|
1439
1439
|
return nsort;
|
1440
1440
|
}
|
@@ -1463,7 +1463,7 @@ static VALUE
|
|
1463
1463
|
ptr = a2->ptr;
|
1464
1464
|
step = size * nsort;
|
1465
1465
|
|
1466
|
-
for (i=0; i<nloop; i
|
1466
|
+
for (i=0; i<nloop; ++i) {
|
1467
1467
|
qsort( ptr, nsort, size, func );
|
1468
1468
|
ptr += step;
|
1469
1469
|
}
|
@@ -1490,7 +1490,7 @@ static VALUE
|
|
1490
1490
|
ptr = a1->ptr;
|
1491
1491
|
step = size * nsort;
|
1492
1492
|
|
1493
|
-
for (i=0; i<nloop; i
|
1493
|
+
for (i=0; i<nloop; ++i) {
|
1494
1494
|
qsort( ptr, nsort, size, func );
|
1495
1495
|
ptr += step;
|
1496
1496
|
}
|
@@ -1519,7 +1519,7 @@ static VALUE
|
|
1519
1519
|
ptr_p = ptr_ptr = ALLOC_N(char*, a1->total);
|
1520
1520
|
ptr_a = ptr_ary = a1->ptr;
|
1521
1521
|
|
1522
|
-
for (i=a1->total; i>0; i
|
1522
|
+
for (i=a1->total; i>0; --i) {
|
1523
1523
|
*(ptr_p++) = ptr_a;
|
1524
1524
|
ptr_a += size;
|
1525
1525
|
}
|
@@ -1527,7 +1527,7 @@ static VALUE
|
|
1527
1527
|
func = SortIdxFuncs[a1->type];
|
1528
1528
|
ptr_p = ptr_ptr;
|
1529
1529
|
|
1530
|
-
for (i=0; i<nloop; i
|
1530
|
+
for (i=0; i<nloop; ++i) {
|
1531
1531
|
qsort( ptr_p, nsort, sizeof(char*), func );
|
1532
1532
|
ptr_p += nsort;
|
1533
1533
|
}
|
@@ -1536,7 +1536,7 @@ static VALUE
|
|
1536
1536
|
GetNArray(obj,a2);
|
1537
1537
|
ptr_p = ptr_ptr;
|
1538
1538
|
ptr_i = (int32_t*)(a2->ptr);
|
1539
|
-
for (i=a2->total; i>0; i
|
1539
|
+
for (i=a2->total; i>0; --i) {
|
1540
1540
|
*(ptr_i++) = (int32_t)(*(ptr_p++)-ptr_ary)/size;
|
1541
1541
|
}
|
1542
1542
|
xfree(ptr_ptr);
|
@@ -1548,7 +1548,6 @@ static VALUE
|
|
1548
1548
|
void Init_na_funcs(void)
|
1549
1549
|
{
|
1550
1550
|
rb_define_method(cNArray, "+", na_add, 1);
|
1551
|
-
rb_define_method(cNArray, "*", na_mul, 1);
|
1552
1551
|
rb_define_method(cNArray, "-", na_sbt, 1);
|
1553
1552
|
rb_define_method(cNArray, "*", na_mul, 1);
|
1554
1553
|
rb_define_method(cNArray, "/", na_div, 1);
|
@@ -1559,7 +1558,6 @@ void Init_na_funcs(void)
|
|
1559
1558
|
rb_define_method(cNArray, "**", na_power, 1);
|
1560
1559
|
|
1561
1560
|
rb_define_method(cNArray, "add!", na_add_bang, 1);
|
1562
|
-
rb_define_method(cNArray, "mul!", na_mul_bang, 1);
|
1563
1561
|
rb_define_method(cNArray, "sbt!", na_sbt_bang, 1);
|
1564
1562
|
rb_define_method(cNArray, "mul!", na_mul_bang, 1);
|
1565
1563
|
rb_define_method(cNArray, "div!", na_div_bang, 1);
|
@@ -1580,6 +1578,8 @@ void Init_na_funcs(void)
|
|
1580
1578
|
rb_define_alias (cNArray, "arg", "angle");
|
1581
1579
|
rb_define_method(cNArray, "conj", na_conj, 0);
|
1582
1580
|
rb_define_alias (cNArray, "conjugate", "conj");
|
1581
|
+
rb_define_method(cNArray, "conj!", na_conj_bang, 0);
|
1582
|
+
rb_define_alias (cNArray, "conjugate!", "conj!");
|
1583
1583
|
rb_define_method(cNArray, "im", na_imag_mul, 0);
|
1584
1584
|
rb_define_method(cNArray, "floor",na_floor, 0);
|
1585
1585
|
rb_define_method(cNArray, "ceil", na_ceil, 0);
|
data/src/na_index.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
na_index.c
|
3
3
|
Numerical Array Extention for Ruby
|
4
|
-
(C) Copyright 1999-
|
4
|
+
(C) Copyright 1999-2008 by Masahiro TANAKA
|
5
5
|
|
6
6
|
This program is free software.
|
7
7
|
You can distribute/modify this program
|
@@ -47,18 +47,18 @@ static int
|
|
47
47
|
/* direction */
|
48
48
|
if (len>0) {
|
49
49
|
step = 1;
|
50
|
-
if (EXCL(obj)) end
|
50
|
+
if (EXCL(obj)) --end; else ++len;
|
51
51
|
}
|
52
52
|
else if (len<0) {
|
53
53
|
len = -len;
|
54
54
|
step = -1;
|
55
|
-
if (EXCL(obj)) end
|
55
|
+
if (EXCL(obj)) ++end; else ++len;
|
56
56
|
}
|
57
57
|
else /*if(len==0)*/ {
|
58
58
|
if (EXCL(obj))
|
59
59
|
rb_raise(rb_eIndexError, "empty range");
|
60
60
|
else {
|
61
|
-
len
|
61
|
+
++len;
|
62
62
|
step = 1; /* or 0 ? depend on whether removing rank */
|
63
63
|
}
|
64
64
|
}
|
@@ -120,11 +120,11 @@ static int
|
|
120
120
|
SetFuncs[NA_LINT][a1->type]( s->n,
|
121
121
|
s->idx, na_sizeof[NA_LINT],
|
122
122
|
a1->ptr, na_sizeof[a1->type] );
|
123
|
-
for ( i=a1->total; i>0; i
|
123
|
+
for ( i=a1->total; i>0; --i ) {
|
124
124
|
if ( *p<0 ) *p += size;
|
125
125
|
if ( *p<0 || *p>=size )
|
126
126
|
rb_raise(rb_eIndexError, "index %i out of range %i", *p, size);
|
127
|
-
p
|
127
|
+
++p;
|
128
128
|
}
|
129
129
|
s->beg = s->idx[0];
|
130
130
|
}
|
@@ -188,7 +188,6 @@ static int na_index_test(volatile VALUE idx, int shape, struct slice *sl)
|
|
188
188
|
idx = na_cast_object(idx,NA_LINT);
|
189
189
|
GetNArray(idx,na);
|
190
190
|
size = na_ary_to_index(na,shape,sl);
|
191
|
-
//na_touch_object(idx);
|
192
191
|
return size;
|
193
192
|
|
194
193
|
default:
|
@@ -220,11 +219,11 @@ static int
|
|
220
219
|
int i, j, k, total=1, size;
|
221
220
|
int multi_ellip=0;
|
222
221
|
|
223
|
-
for (i=j=0; i<nidx; i
|
222
|
+
for (i=j=0; i<nidx; ++i) {
|
224
223
|
if (TYPE(idx[i])==T_FALSE) {
|
225
224
|
if (multi_ellip!=0)
|
226
225
|
rb_raise(rb_eIndexError, "multiple ellipsis-dimension is not allowd");
|
227
|
-
for (k=ary->rank-nidx+1; k>0; k
|
226
|
+
for (k=ary->rank-nidx+1; k>0; --k,++j) {
|
228
227
|
size = na_index_test( Qtrue, ary->shape[j], &sl[j] );
|
229
228
|
if (size != 1)
|
230
229
|
total *= size;
|
@@ -234,7 +233,7 @@ static int
|
|
234
233
|
size = na_index_test( idx[i], ary->shape[j], &sl[j] );
|
235
234
|
if (size != 1)
|
236
235
|
total *= size;
|
237
|
-
j
|
236
|
+
++j;
|
238
237
|
}
|
239
238
|
}
|
240
239
|
if (j != ary->rank)
|
@@ -250,7 +249,7 @@ int
|
|
250
249
|
{
|
251
250
|
int i;
|
252
251
|
|
253
|
-
for (i=0; i<class_dim; i
|
252
|
+
for (i=0; i<class_dim; ++i) {
|
254
253
|
if (shrink[i]==0) /* non-trim dimention */
|
255
254
|
return 0;
|
256
255
|
}
|
@@ -270,19 +269,19 @@ VALUE
|
|
270
269
|
if (ary->rank < class_dim)
|
271
270
|
return obj;
|
272
271
|
|
273
|
-
for (j=i=0; i<class_dim; i
|
272
|
+
for (j=i=0; i<class_dim; ++i) {
|
274
273
|
if (ary->shape[i]!=1 || shrink[i]==0) /* not trim */
|
275
|
-
j
|
274
|
+
++j;
|
276
275
|
}
|
277
276
|
|
278
277
|
if (j>0) /* if non-trim dimensions exist, */
|
279
278
|
j = class_dim; /* then do not trim class_dimension. */
|
280
279
|
/* if (j==0) then all trim. */
|
281
280
|
|
282
|
-
for (i=class_dim; i<ary->rank; i
|
281
|
+
for (i=class_dim; i<ary->rank; ++i) {
|
283
282
|
if (ary->shape[i]!=1 || shrink[i]==0) { /* not trim */
|
284
283
|
if (i>j) ary->shape[j] = ary->shape[i];
|
285
|
-
j
|
284
|
+
++j;
|
286
285
|
}
|
287
286
|
}
|
288
287
|
ary->rank = j;
|
@@ -311,7 +310,7 @@ static VALUE
|
|
311
310
|
shape = ALLOCA_N(int,ndim);
|
312
311
|
shrink = ALLOCA_N(int,ndim);
|
313
312
|
|
314
|
-
for (i=0; i<ndim; i
|
313
|
+
for (i=0; i<ndim; ++i) {
|
315
314
|
shape[i] = s2[i].n;
|
316
315
|
if (shape[i]==1 && s2[i].step==0) /* shrink? */
|
317
316
|
shrink[i] = 1;
|
@@ -385,7 +384,6 @@ static VALUE
|
|
385
384
|
}
|
386
385
|
|
387
386
|
na_free_slice_index(s1,1);
|
388
|
-
//na_touch_object(vidx);
|
389
387
|
return v;
|
390
388
|
}
|
391
389
|
|
@@ -440,7 +438,7 @@ static VALUE
|
|
440
438
|
if (flag==0) {
|
441
439
|
rank = 0; /* [] */
|
442
440
|
for ( i=ary->rank; (i--)>0; ) {
|
443
|
-
if (sl[i].step!=0) rank
|
441
|
+
if (sl[i].step!=0) ++rank;
|
444
442
|
}
|
445
443
|
}
|
446
444
|
else {
|
@@ -460,7 +458,7 @@ static VALUE
|
|
460
458
|
class_dim = na_class_dim(klass);
|
461
459
|
if (rank < class_dim) rank = class_dim;
|
462
460
|
shape = ALLOCA_N(int, rank);
|
463
|
-
for (i=0;i<rank
|
461
|
+
for (i=0;i<rank;++i) shape[i]=1;
|
464
462
|
v = na_make_object(ary->type,rank,shape,klass);
|
465
463
|
GetNArray(v,arynew);
|
466
464
|
SetFuncs[ary->type][ary->type](1, arynew->ptr, 0, NA_PTR(ary,pos), 0);
|
@@ -515,7 +513,7 @@ static int
|
|
515
513
|
if ( ary->type == NA_BYTE ) {
|
516
514
|
ptr = (u_int8_t *)ary->ptr;
|
517
515
|
n = ary->total;
|
518
|
-
for (; n; n
|
516
|
+
for (; n; --n) {
|
519
517
|
if (*ptr++) ++count;
|
520
518
|
}
|
521
519
|
} else
|
@@ -541,7 +539,7 @@ static int
|
|
541
539
|
if ( ary->type == NA_BYTE ) {
|
542
540
|
ptr = (u_int8_t *)ary->ptr;
|
543
541
|
n = ary->total;
|
544
|
-
for (; n; n
|
542
|
+
for (; n; --n) {
|
545
543
|
if (!*ptr++) ++count;
|
546
544
|
}
|
547
545
|
} else
|
@@ -571,7 +569,7 @@ VALUE
|
|
571
569
|
if (a1->rank != am->rank)
|
572
570
|
rb_raise(rb_eTypeError,"self.rank(=%i) != mask.rank(=%i)",
|
573
571
|
a1->rank, am->rank);
|
574
|
-
for (i=0; i<a1->rank; i
|
572
|
+
for (i=0; i<a1->rank; ++i)
|
575
573
|
if (a1->shape[i] != am->shape[i])
|
576
574
|
rb_raise(rb_eTypeError,"self.shape[%i](=%i) != mask.shape[%i](=%i)",
|
577
575
|
i, a1->shape[i], i, am->shape[i]);
|
@@ -636,7 +634,7 @@ static void
|
|
636
634
|
{
|
637
635
|
int i;
|
638
636
|
|
639
|
-
for (i=0; i<rank; i
|
637
|
+
for (i=0; i<rank; ++i) {
|
640
638
|
src_shape[i] = 1; /* all 1 */
|
641
639
|
if ( (src_slc[i].n = dst_slc[i].n) < 1 )
|
642
640
|
rb_raise(rb_eIndexError, "dst_slice[%i].n=%i ???", i, dst_slc[i].n);
|
@@ -655,7 +653,7 @@ static void
|
|
655
653
|
int i, j, idx_end;
|
656
654
|
|
657
655
|
/* count range index */
|
658
|
-
for (j=i=0; i<dst->rank; i
|
656
|
+
for (j=i=0; i<dst->rank; ++i) {
|
659
657
|
|
660
658
|
if ( s1[i].step !=0 ) { /* Range index */
|
661
659
|
|
@@ -762,7 +760,7 @@ static void
|
|
762
760
|
rb_raise( rb_eIndexError, "idx.rank=%i != src.rank=%i",
|
763
761
|
aidx->rank, src->rank );
|
764
762
|
/* check shape */
|
765
|
-
for (i=0;i<src->rank
|
763
|
+
for (i=0;i<src->rank;++i)
|
766
764
|
if (aidx->shape[i] != src->shape[i] && src->shape[i] != 1)
|
767
765
|
rb_raise( rb_eIndexError, "idx.shape[%i]=%i != src.shape[%i]=%i",
|
768
766
|
i, aidx->shape[i], i, src->shape[i] );
|
@@ -781,7 +779,6 @@ static void
|
|
781
779
|
|
782
780
|
na_aset_slice( dst, src, sl );
|
783
781
|
na_free_slice_index( sl, 1 ); /* free index memory */
|
784
|
-
//na_touch_object(idx,val);
|
785
782
|
}
|
786
783
|
|
787
784
|
|
@@ -830,7 +827,6 @@ static void
|
|
830
827
|
na_aset_slice( dst, src, sl );
|
831
828
|
|
832
829
|
na_free_slice_index(sl,1); /* free index memory */
|
833
|
-
//na_touch_object(val);
|
834
830
|
}
|
835
831
|
|
836
832
|
|
@@ -858,7 +854,7 @@ static void
|
|
858
854
|
val = na_cast_unless_narray(val,dst->type);
|
859
855
|
GetNArray(val,src);
|
860
856
|
if (src->total > 1)
|
861
|
-
for( i=0; i<src->rank; i
|
857
|
+
for( i=0; i<src->rank; ++i ) {
|
862
858
|
sl[i].n = 0;
|
863
859
|
sl[i].step = 1;
|
864
860
|
}
|
@@ -886,7 +882,6 @@ static void
|
|
886
882
|
|
887
883
|
na_free_slice_index(sl,nidx); /* free index memory */
|
888
884
|
xfree(sl);
|
889
|
-
//na_touch_object(val);
|
890
885
|
}
|
891
886
|
|
892
887
|
|
@@ -913,7 +908,6 @@ static void
|
|
913
908
|
else {
|
914
909
|
na_fill( self, val ); /* Simple filling */
|
915
910
|
}
|
916
|
-
//na_touch_object(val);
|
917
911
|
}
|
918
912
|
|
919
913
|
|
@@ -933,7 +927,7 @@ void
|
|
933
927
|
if (a1->rank != am->rank)
|
934
928
|
rb_raise(rb_eTypeError,"self.rank(=%i) != mask.rank(=%i)",
|
935
929
|
a1->rank, am->rank);
|
936
|
-
for (i=0; i<a1->rank; i
|
930
|
+
for (i=0; i<a1->rank; ++i)
|
937
931
|
if (a1->shape[i] != am->shape[i])
|
938
932
|
rb_raise(rb_eTypeError,"self.shape[%i](=%i) != mask.shape[%i](=%i)",
|
939
933
|
i, a1->shape[i], i, am->shape[i]);
|
@@ -959,7 +953,7 @@ void
|
|
959
953
|
VALUE
|
960
954
|
na_aset(int nidx, VALUE *idx, VALUE self)
|
961
955
|
{
|
962
|
-
nidx
|
956
|
+
--nidx;
|
963
957
|
|
964
958
|
if (nidx==0) {
|
965
959
|
na_aset_fill( self, idx[0] );
|