numo-narray 0.9.0.1-x86-mingw32 → 0.9.0.3-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -7
- data/Rakefile +21 -6
- data/ext/numo/narray/array.c +3 -3
- data/ext/numo/narray/data.c +102 -81
- data/ext/numo/narray/depend.erb +9 -7
- data/ext/numo/narray/extconf.rb +5 -24
- data/ext/numo/narray/gen/cogen.rb +19 -4
- data/ext/numo/narray/gen/def/bit.rb +31 -0
- data/ext/numo/narray/gen/def/robject.rb +1 -1
- data/ext/numo/narray/gen/dtype.erb.c +11 -257
- data/ext/numo/narray/gen/spec.rb +294 -0
- data/ext/numo/narray/gen/tmpl/aset.c +1 -1
- data/ext/numo/narray/gen/tmpl/each_with_index.c +1 -1
- data/ext/numo/narray/gen/tmpl/eye.c +5 -5
- data/ext/numo/narray/gen/tmpl/logseq.c +82 -0
- data/ext/numo/narray/gen/tmpl/map_with_index.c +1 -1
- data/ext/numo/narray/gen/tmpl/rand.c +126 -5
- data/ext/numo/narray/gen/tmpl/seq.c +43 -12
- data/ext/numo/narray/gen/tmpl/store_bit.c +55 -0
- data/ext/numo/narray/gen/tmpl_bit/allocate.c +28 -0
- data/ext/numo/narray/gen/tmpl_bit/aref.c +53 -0
- data/ext/numo/narray/gen/tmpl_bit/aset.c +63 -0
- data/ext/numo/narray/gen/{tmpl/bit_binary.c → tmpl_bit/binary.c} +1 -1
- data/ext/numo/narray/gen/{tmpl → tmpl_bit}/bit_count.c +5 -3
- data/ext/numo/narray/gen/tmpl_bit/bit_reduce.c +128 -0
- data/ext/numo/narray/gen/tmpl_bit/cast.c +37 -0
- data/ext/numo/narray/gen/tmpl_bit/cast_array.c +80 -0
- data/ext/numo/narray/gen/tmpl_bit/cast_numeric.c +22 -0
- data/ext/numo/narray/gen/tmpl_bit/coerce_cast.c +8 -0
- data/ext/numo/narray/gen/tmpl_bit/each.c +44 -0
- data/ext/numo/narray/gen/tmpl_bit/each_with_index.c +66 -0
- data/ext/numo/narray/gen/tmpl_bit/extract.c +25 -0
- data/ext/numo/narray/gen/tmpl_bit/fill.c +65 -0
- data/ext/numo/narray/gen/tmpl_bit/format.c +61 -0
- data/ext/numo/narray/gen/tmpl_bit/format_to_a.c +48 -0
- data/ext/numo/narray/gen/tmpl_bit/inspect.c +18 -0
- data/ext/numo/narray/gen/tmpl_bit/map_with_index.c +94 -0
- data/ext/numo/narray/gen/tmpl_bit/mask.c +117 -0
- data/ext/numo/narray/gen/tmpl_bit/none_p.c +14 -0
- data/ext/numo/narray/gen/tmpl_bit/store.c +32 -0
- data/ext/numo/narray/gen/tmpl_bit/store_array.c +5 -0
- data/ext/numo/narray/gen/tmpl_bit/store_bit.c +66 -0
- data/ext/numo/narray/gen/tmpl_bit/store_from.c +56 -0
- data/ext/numo/narray/gen/tmpl_bit/store_numeric.c +22 -0
- data/ext/numo/narray/gen/tmpl_bit/to_a.c +43 -0
- data/ext/numo/narray/gen/{tmpl/bit_unary.c → tmpl_bit/unary.c} +1 -1
- data/ext/numo/narray/gen/tmpl_bit/where.c +102 -0
- data/ext/numo/narray/gen/tmpl_bit/where2.c +37 -0
- data/ext/numo/narray/index.c +9 -7
- data/ext/numo/narray/math.c +6 -1
- data/ext/numo/narray/narray.c +307 -103
- data/ext/numo/narray/ndloop.c +21 -36
- data/ext/numo/narray/numo/intern.h +3 -3
- data/ext/numo/narray/numo/narray.h +5 -41
- data/ext/numo/narray/numo/template.h +2 -2
- data/ext/numo/narray/numo/types/bit.h +27 -13
- data/ext/numo/narray/numo/types/complex.h +2 -2
- data/ext/numo/narray/numo/types/complex_macro.h +19 -7
- data/ext/numo/narray/numo/types/dcomplex.h +9 -0
- data/ext/numo/narray/numo/types/dfloat.h +6 -0
- data/ext/numo/narray/numo/types/float_macro.h +9 -2
- data/ext/numo/narray/numo/types/int16.h +0 -1
- data/ext/numo/narray/numo/types/int32.h +0 -1
- data/ext/numo/narray/numo/types/int64.h +0 -1
- data/ext/numo/narray/numo/types/int8.h +0 -1
- data/ext/numo/narray/numo/types/int_macro.h +2 -1
- data/ext/numo/narray/numo/types/robj_macro.h +9 -2
- data/ext/numo/narray/numo/types/robject.h +6 -0
- data/ext/numo/narray/numo/types/scomplex.h +9 -0
- data/ext/numo/narray/numo/types/sfloat.h +6 -0
- data/ext/numo/narray/numo/types/uint16.h +0 -1
- data/ext/numo/narray/numo/types/uint32.h +0 -1
- data/ext/numo/narray/numo/types/uint64.h +0 -1
- data/ext/numo/narray/numo/types/uint8.h +0 -1
- data/ext/numo/narray/numo/types/uint_macro.h +2 -1
- data/ext/numo/narray/numo/types/xint_macro.h +6 -1
- data/ext/numo/narray/rand.c +2 -2
- data/ext/numo/narray/step.c +7 -7
- data/ext/numo/narray/struct.c +11 -12
- data/lib/2.0/numo/narray.so +0 -0
- data/lib/2.1/numo/narray.so +0 -0
- data/lib/2.2/numo/narray.so +0 -0
- data/lib/2.3/numo/narray.so +0 -0
- data/lib/2.4/numo/narray.so +0 -0
- data/lib/erbpp.rb +6 -2
- data/lib/erbpp/line_number.rb +1 -1
- data/lib/erbpp/narray_def.rb +23 -19
- data/numo-narray.gemspec +2 -2
- metadata +45 -10
- data/ext/numo/narray/gen/bit.erb.c +0 -811
data/ext/numo/narray/math.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
math.c
|
3
3
|
Numerical Array Extension for Ruby
|
4
|
-
(C) Copyright 1999-
|
4
|
+
(C) Copyright 1999-2016 by Masahiro TANAKA
|
5
5
|
|
6
6
|
This program is free software.
|
7
7
|
You can distribute/modify this program
|
@@ -13,6 +13,7 @@
|
|
13
13
|
|
14
14
|
VALUE numo_mNMath;
|
15
15
|
EXTERN VALUE numo_mDFloatMath, numo_mDComplexMath;
|
16
|
+
EXTERN VALUE numo_mSFloatMath, numo_mSComplexMath;
|
16
17
|
static ID id_send;
|
17
18
|
|
18
19
|
VALUE
|
@@ -130,8 +131,12 @@ Init_nary_math()
|
|
130
131
|
rb_hash_aset(hCast, numo_cDFloat, numo_mDFloatMath);
|
131
132
|
rb_hash_aset(hCast, numo_cDFloat, numo_mDFloatMath);
|
132
133
|
rb_hash_aset(hCast, numo_cDComplex, numo_mDComplexMath);
|
134
|
+
rb_hash_aset(hCast, numo_cSFloat, numo_mSFloatMath);
|
135
|
+
rb_hash_aset(hCast, numo_cSComplex, numo_mSComplexMath);
|
136
|
+
#ifdef HAVE_RB_CFIXNUM
|
133
137
|
rb_hash_aset(hCast, rb_cFixnum, rb_mMath);
|
134
138
|
rb_hash_aset(hCast, rb_cBignum, rb_mMath);
|
139
|
+
#endif
|
135
140
|
rb_hash_aset(hCast, rb_cInteger, rb_mMath);
|
136
141
|
rb_hash_aset(hCast, rb_cFloat, rb_mMath);
|
137
142
|
rb_hash_aset(hCast, rb_cComplex, numo_mDComplexMath);
|
data/ext/numo/narray/narray.c
CHANGED
@@ -11,7 +11,6 @@
|
|
11
11
|
#define NARRAY_C
|
12
12
|
#include <ruby.h>
|
13
13
|
#include "numo/narray.h"
|
14
|
-
#include "extconf.h"
|
15
14
|
#include <assert.h>
|
16
15
|
|
17
16
|
/* global variables within this module */
|
@@ -40,6 +39,9 @@ VALUE na_cStep;
|
|
40
39
|
VALUE rb_cComplex;
|
41
40
|
#endif
|
42
41
|
|
42
|
+
int numo_na_inspect_rows=20;
|
43
|
+
int numo_na_inspect_cols=80;
|
44
|
+
|
43
45
|
void Init_nary_data();
|
44
46
|
void Init_nary_step();
|
45
47
|
void Init_nary_index();
|
@@ -116,7 +118,7 @@ rb_narray_debug_info(VALUE self)
|
|
116
118
|
GetNArray(self,na);
|
117
119
|
|
118
120
|
printf("%s:\n",rb_class2name(CLASS_OF(self)));
|
119
|
-
printf(" id = 0x%"
|
121
|
+
printf(" id = 0x%"PRI_VALUE_PREFIX"x\n", self);
|
120
122
|
printf(" type = %d\n", na->type);
|
121
123
|
printf(" flag = [%d,%d]\n", na->flag[0], na->flag[1]);
|
122
124
|
printf(" size = %"SZF"d\n", na->size);
|
@@ -226,6 +228,7 @@ void
|
|
226
228
|
na_array_to_internal_shape(VALUE self, VALUE ary, size_t *shape)
|
227
229
|
{
|
228
230
|
size_t i, n, c, s;
|
231
|
+
ssize_t x;
|
229
232
|
VALUE v;
|
230
233
|
narray_t *na;
|
231
234
|
int flag = 0;
|
@@ -245,13 +248,11 @@ na_array_to_internal_shape(VALUE self, VALUE ary, size_t *shape)
|
|
245
248
|
}
|
246
249
|
for (i=0; i<n; i++) {
|
247
250
|
v = RARRAY_AREF(ary,i);
|
248
|
-
|
249
|
-
|
250
|
-
}
|
251
|
-
if (RTEST(rb_funcall(v, rb_intern("<"), 1, INT2FIX(0)))) {
|
251
|
+
x = NUM2SSIZET(v);
|
252
|
+
if (x < 0) {
|
252
253
|
rb_raise(rb_eArgError,"size must be non-negative");
|
253
254
|
}
|
254
|
-
shape[c] =
|
255
|
+
shape[c] = x;
|
255
256
|
c += s;
|
256
257
|
}
|
257
258
|
}
|
@@ -334,13 +335,13 @@ na_initialize(VALUE self, VALUE args)
|
|
334
335
|
} else {
|
335
336
|
v = args;
|
336
337
|
}
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
338
|
+
ndim = RARRAY_LEN(v);
|
339
|
+
if (ndim > NA_MAX_DIMENSION) {
|
340
|
+
rb_raise(rb_eArgError,"ndim=%d exceeds maximum dimension",ndim);
|
341
|
+
}
|
342
|
+
shape = ALLOCA_N(size_t, ndim);
|
343
|
+
// setup size_t shape[] from VALUE shape argument
|
344
|
+
na_array_to_internal_shape(self, v, shape);
|
344
345
|
na_setup(self, ndim, shape);
|
345
346
|
|
346
347
|
return self;
|
@@ -405,7 +406,7 @@ na_initialize_copy(VALUE self, VALUE orig)
|
|
405
406
|
* [0, 0, 0, 0, 0]]
|
406
407
|
*/
|
407
408
|
static VALUE
|
408
|
-
na_s_zeros(int argc,
|
409
|
+
na_s_zeros(int argc, VALUE *argv, VALUE klass)
|
409
410
|
{
|
410
411
|
VALUE obj;
|
411
412
|
obj = rb_class_new_instance(argc, argv, klass);
|
@@ -429,7 +430,7 @@ na_s_zeros(int argc, const VALUE *argv, VALUE klass)
|
|
429
430
|
* [1, 1, 1, 1, 1]]
|
430
431
|
*/
|
431
432
|
static VALUE
|
432
|
-
na_s_ones(int argc,
|
433
|
+
na_s_ones(int argc, VALUE *argv, VALUE klass)
|
433
434
|
{
|
434
435
|
VALUE obj;
|
435
436
|
obj = rb_class_new_instance(argc, argv, klass);
|
@@ -437,6 +438,89 @@ na_s_ones(int argc, const VALUE *argv, VALUE klass)
|
|
437
438
|
}
|
438
439
|
|
439
440
|
|
441
|
+
/*
|
442
|
+
Returns an array of N linearly spaced points between x1 and x2.
|
443
|
+
This singleton method is valid not for NArray class itself
|
444
|
+
but for typed NArray subclasses, e.g., DFloat, Int64.
|
445
|
+
|
446
|
+
@overload linspace(x1, x2, [n])
|
447
|
+
@param [Numeric] x1 The start value
|
448
|
+
@param [Numeric] x2 The end value
|
449
|
+
@param [Integer] n The number of elements. (default is 100).
|
450
|
+
@return [Numo::NArray] result array.
|
451
|
+
|
452
|
+
@example
|
453
|
+
a = Numo::DFloat.linspace(-5,5,7)
|
454
|
+
=> Numo::DFloat#shape=[7]
|
455
|
+
[-5, -3.33333, -1.66667, 0, 1.66667, 3.33333, 5]
|
456
|
+
*/
|
457
|
+
static VALUE
|
458
|
+
na_s_linspace(int argc, VALUE *argv, VALUE klass)
|
459
|
+
{
|
460
|
+
VALUE obj, vx1, vx2, vstep, vsize;
|
461
|
+
double n;
|
462
|
+
int narg;
|
463
|
+
|
464
|
+
narg = rb_scan_args(argc,argv,"21",&vx1,&vx2,&vsize);
|
465
|
+
if (narg==3) {
|
466
|
+
n = NUM2DBL(vsize);
|
467
|
+
} else {
|
468
|
+
n = 100;
|
469
|
+
vsize = INT2FIX(100);
|
470
|
+
}
|
471
|
+
|
472
|
+
obj = rb_funcall(vx2, '-', 1, vx1);
|
473
|
+
vstep = rb_funcall(obj, '/', 1, DBL2NUM(n-1));
|
474
|
+
|
475
|
+
obj = rb_class_new_instance(1, &vsize, klass);
|
476
|
+
return rb_funcall(obj, rb_intern("seq"), 2, vx1, vstep);
|
477
|
+
}
|
478
|
+
|
479
|
+
/*
|
480
|
+
Returns an array of N logarithmically spaced points between 10^a and 10^b.
|
481
|
+
This singleton method is valid not for NArray having +logseq+ method,
|
482
|
+
i.e., DFloat, SFloat, DComplex, and SComplex.
|
483
|
+
|
484
|
+
@overload logspace(a, b, [n, base])
|
485
|
+
@param [Numeric] a The start value
|
486
|
+
@param [Numeric] b The end value
|
487
|
+
@param [Integer] n The number of elements. (default is 50)
|
488
|
+
@param [Numeric] base The base of log space. (default is 10)
|
489
|
+
@return [Numo::NArray] result array.
|
490
|
+
|
491
|
+
@example
|
492
|
+
Numo::DFloat.logspace(4,0,5,2)
|
493
|
+
=> Numo::DFloat#shape=[5]
|
494
|
+
[16, 8, 4, 2, 1]
|
495
|
+
Numo::DComplex.logspace(0,1i*Math::PI,5,Math::E)
|
496
|
+
=> Numo::DComplex#shape=[5]
|
497
|
+
[1+4.44659e-323i, 0.707107+0.707107i, 6.12323e-17+1i, -0.707107+0.707107i, ...]
|
498
|
+
*/
|
499
|
+
static VALUE
|
500
|
+
na_s_logspace(int argc, VALUE *argv, VALUE klass)
|
501
|
+
{
|
502
|
+
VALUE obj, vx1, vx2, vstep, vsize, vbase;
|
503
|
+
double n;
|
504
|
+
|
505
|
+
rb_scan_args(argc,argv,"22",&vx1,&vx2,&vsize,&vbase);
|
506
|
+
if (vsize == Qnil) {
|
507
|
+
vsize = INT2FIX(50);
|
508
|
+
n = 50;
|
509
|
+
} else {
|
510
|
+
n = NUM2DBL(vsize);
|
511
|
+
}
|
512
|
+
if (vbase == Qnil) {
|
513
|
+
vbase = DBL2NUM(10);
|
514
|
+
}
|
515
|
+
|
516
|
+
obj = rb_funcall(vx2, '-', 1, vx1);
|
517
|
+
vstep = rb_funcall(obj, '/', 1, DBL2NUM(n-1));
|
518
|
+
|
519
|
+
obj = rb_class_new_instance(1, &vsize, klass);
|
520
|
+
return rb_funcall(obj, rb_intern("logseq"), 3, vx1, vstep, vbase);
|
521
|
+
}
|
522
|
+
|
523
|
+
|
440
524
|
/*
|
441
525
|
Returns a NArray with shape=(n,n) whose diagonal elements are 1, otherwise 0.
|
442
526
|
@overload eye(n)
|
@@ -450,7 +534,7 @@ na_s_ones(int argc, const VALUE *argv, VALUE klass)
|
|
450
534
|
[0, 0, 1]]
|
451
535
|
*/
|
452
536
|
static VALUE
|
453
|
-
na_s_eye(int argc,
|
537
|
+
na_s_eye(int argc, VALUE *argv, VALUE klass)
|
454
538
|
{
|
455
539
|
VALUE obj;
|
456
540
|
VALUE tmp[2];
|
@@ -468,82 +552,89 @@ na_s_eye(int argc, const VALUE *argv, VALUE klass)
|
|
468
552
|
}
|
469
553
|
|
470
554
|
|
471
|
-
char *
|
472
|
-
na_get_pointer(VALUE self)
|
473
|
-
{
|
474
|
-
narray_t *na;
|
475
|
-
GetNArray(self,na);
|
476
555
|
|
477
|
-
|
478
|
-
|
479
|
-
return NA_DATA_PTR(na);
|
480
|
-
case NARRAY_FILEMAP_T:
|
481
|
-
return ((narray_filemap_t*)na)->ptr;
|
482
|
-
case NARRAY_VIEW_T:
|
483
|
-
return na_get_pointer(NA_VIEW_DATA(na));
|
484
|
-
//puts("pass NARRAY_VIEW_T in na_get_pointer_for_write");
|
485
|
-
//ptr += ((narray_view_t*)na)->offset;
|
486
|
-
//ptr += NA_VIEW_OFFSET(na);
|
487
|
-
break;
|
488
|
-
default:
|
489
|
-
rb_raise(rb_eRuntimeError,"invalid NA_TYPE");
|
490
|
-
}
|
491
|
-
return NULL;
|
492
|
-
}
|
556
|
+
#define READ 1
|
557
|
+
#define WRITE 2
|
493
558
|
|
494
|
-
char *
|
495
|
-
|
559
|
+
static char *
|
560
|
+
na_get_pointer_for_rw(VALUE self, int flag)
|
496
561
|
{
|
497
562
|
char *ptr;
|
563
|
+
VALUE obj;
|
498
564
|
narray_t *na;
|
499
|
-
GetNArray(self,na);
|
500
565
|
|
501
|
-
if (OBJ_FROZEN(self)) {
|
566
|
+
if ((flag & WRITE) && OBJ_FROZEN(self)) {
|
502
567
|
rb_raise(rb_eRuntimeError, "cannot write to frozen NArray.");
|
503
568
|
}
|
504
569
|
|
505
|
-
|
570
|
+
GetNArray(self,na);
|
571
|
+
|
572
|
+
switch(NA_TYPE(na)) {
|
573
|
+
case NARRAY_DATA_T:
|
506
574
|
ptr = NA_DATA_PTR(na);
|
507
|
-
if (na->size > 0 && ptr == NULL) {
|
508
|
-
rb_funcall(self, id_allocate, 0);
|
509
|
-
ptr = NA_DATA_PTR(na);
|
510
|
-
}
|
511
|
-
} else {
|
512
|
-
ptr = na_get_pointer(self);
|
513
575
|
if (NA_SIZE(na) > 0 && ptr == NULL) {
|
514
|
-
|
576
|
+
if (flag & READ) {
|
577
|
+
rb_raise(rb_eRuntimeError,"cannot read unallocated NArray");
|
578
|
+
}
|
579
|
+
if (flag & WRITE) {
|
580
|
+
rb_funcall(self, id_allocate, 0);
|
581
|
+
ptr = NA_DATA_PTR(na);
|
582
|
+
}
|
583
|
+
}
|
584
|
+
return ptr;
|
585
|
+
case NARRAY_VIEW_T:
|
586
|
+
obj = NA_VIEW_DATA(na);
|
587
|
+
if ((flag & WRITE) && OBJ_FROZEN(obj)) {
|
588
|
+
rb_raise(rb_eRuntimeError, "cannot write to frozen NArray.");
|
515
589
|
}
|
516
|
-
}
|
517
590
|
|
518
|
-
|
591
|
+
if (flag & WRITE) {
|
592
|
+
if (OBJ_FROZEN(obj)) {
|
593
|
+
rb_raise(rb_eRuntimeError, "cannot write to frozen NArray.");
|
594
|
+
}
|
595
|
+
}
|
596
|
+
GetNArray(obj,na);
|
597
|
+
switch(NA_TYPE(na)) {
|
598
|
+
case NARRAY_DATA_T:
|
599
|
+
ptr = NA_DATA_PTR(na);
|
600
|
+
if (flag & (READ|WRITE)) {
|
601
|
+
if (NA_SIZE(na) > 0 && ptr == NULL) {
|
602
|
+
rb_raise(rb_eRuntimeError,"cannot read/write unallocated NArray");
|
603
|
+
}
|
604
|
+
}
|
605
|
+
return ptr;
|
606
|
+
default:
|
607
|
+
rb_raise(rb_eRuntimeError,"invalid NA_TYPE of view: %d",NA_TYPE(na));
|
608
|
+
}
|
609
|
+
default:
|
610
|
+
rb_raise(rb_eRuntimeError,"invalid NA_TYPE: %d",NA_TYPE(na));
|
611
|
+
}
|
519
612
|
|
520
|
-
return
|
613
|
+
return NULL;
|
521
614
|
}
|
522
615
|
|
523
616
|
char *
|
524
617
|
na_get_pointer_for_read(VALUE self)
|
525
618
|
{
|
526
|
-
|
527
|
-
|
528
|
-
GetNArray(self,na);
|
529
|
-
|
530
|
-
//if (NA_TEST_LOCK(na)) {
|
531
|
-
// rb_raise(rb_eRuntimeError, "cannot read locked NArray.");
|
532
|
-
//}
|
533
|
-
|
534
|
-
if (NA_TYPE(na) == NARRAY_DATA_T) {
|
535
|
-
ptr = NA_DATA_PTR(na);
|
536
|
-
} else {
|
537
|
-
ptr = na_get_pointer(self);
|
538
|
-
}
|
619
|
+
return na_get_pointer_for_rw(self, READ);
|
620
|
+
}
|
539
621
|
|
540
|
-
|
541
|
-
|
542
|
-
|
622
|
+
char *
|
623
|
+
na_get_pointer_for_write(VALUE self)
|
624
|
+
{
|
625
|
+
return na_get_pointer_for_rw(self, WRITE);
|
626
|
+
}
|
543
627
|
|
544
|
-
|
628
|
+
char *
|
629
|
+
na_get_pointer_for_read_write(VALUE self)
|
630
|
+
{
|
631
|
+
return na_get_pointer_for_rw(self, READ|WRITE);
|
632
|
+
}
|
545
633
|
|
546
|
-
|
634
|
+
char *
|
635
|
+
na_get_pointer(VALUE self)
|
636
|
+
{
|
637
|
+
return na_get_pointer_for_rw(self, 0);
|
547
638
|
}
|
548
639
|
|
549
640
|
|
@@ -636,7 +727,7 @@ na_get_stride(VALUE v)
|
|
636
727
|
|
637
728
|
if (!stridx) {
|
638
729
|
stridx = ALLOC_N(stridx_t, na->ndim);
|
639
|
-
st =
|
730
|
+
st = NUM2SIZET(rb_const_get(CLASS_OF(v), id_contiguous_stride));
|
640
731
|
//printf("step_unit=%ld, CLASS_OF(v)=%lx\n",st, CLASS_OF(v));
|
641
732
|
for (i=na->ndim; i>0;) {
|
642
733
|
SDX_SET_STRIDE(stridx[--i],st);
|
@@ -655,7 +746,7 @@ na_size(VALUE self)
|
|
655
746
|
{
|
656
747
|
narray_t *na;
|
657
748
|
GetNArray(self,na);
|
658
|
-
return
|
749
|
+
return SIZET2NUM(na->size);
|
659
750
|
}
|
660
751
|
|
661
752
|
|
@@ -669,6 +760,22 @@ na_ndim(VALUE self)
|
|
669
760
|
}
|
670
761
|
|
671
762
|
|
763
|
+
/*
|
764
|
+
Returns true if self.size == 0.
|
765
|
+
@overload empty?
|
766
|
+
*/
|
767
|
+
static VALUE
|
768
|
+
na_empty_p(VALUE self)
|
769
|
+
{
|
770
|
+
narray_t *na;
|
771
|
+
GetNArray(self,na);
|
772
|
+
if (NA_SIZE(na)==0) {
|
773
|
+
return Qtrue;
|
774
|
+
}
|
775
|
+
return Qfalse;
|
776
|
+
}
|
777
|
+
|
778
|
+
|
672
779
|
/* method: shape() -- returns shape, array of the size of dimensions */
|
673
780
|
static VALUE
|
674
781
|
na_shape(VALUE self)
|
@@ -688,7 +795,7 @@ static VALUE
|
|
688
795
|
}
|
689
796
|
v = rb_ary_new2(n);
|
690
797
|
for (i=0; i<n; i++) {
|
691
|
-
rb_ary_push(v,
|
798
|
+
rb_ary_push(v, SIZET2NUM(na->shape[c]));
|
692
799
|
c += s;
|
693
800
|
}
|
694
801
|
return v;
|
@@ -698,13 +805,13 @@ static VALUE
|
|
698
805
|
size_t
|
699
806
|
na_get_elmsz(VALUE vna)
|
700
807
|
{
|
701
|
-
return
|
808
|
+
return NUM2SIZET(rb_const_get(CLASS_OF(vna), id_contiguous_stride));
|
702
809
|
}
|
703
810
|
|
704
811
|
size_t
|
705
812
|
na_dtype_elmsz(VALUE klass)
|
706
813
|
{
|
707
|
-
return
|
814
|
+
return NUM2SIZET(rb_const_get(klass, id_contiguous_stride));
|
708
815
|
}
|
709
816
|
|
710
817
|
size_t
|
@@ -890,7 +997,9 @@ na_expand_dims(VALUE self, VALUE vdim)
|
|
890
997
|
na2->stridx = stridx;
|
891
998
|
xfree(na_stridx);
|
892
999
|
na2->base.shape = shape;
|
893
|
-
|
1000
|
+
if (na_shape != &(na2->base.size)) {
|
1001
|
+
xfree(na_shape);
|
1002
|
+
}
|
894
1003
|
na2->base.ndim++;
|
895
1004
|
return view;
|
896
1005
|
}
|
@@ -1035,14 +1144,15 @@ nary_coerce(VALUE x, VALUE y)
|
|
1035
1144
|
static VALUE
|
1036
1145
|
nary_byte_size(VALUE self)
|
1037
1146
|
{
|
1038
|
-
VALUE velmsz;
|
1147
|
+
VALUE velmsz;
|
1039
1148
|
narray_t *na;
|
1040
|
-
size_t sz;
|
1041
1149
|
|
1042
1150
|
GetNArray(self,na);
|
1043
1151
|
velmsz = rb_const_get(CLASS_OF(self), rb_intern(ELEMENT_BYTE_SIZE));
|
1044
|
-
|
1045
|
-
|
1152
|
+
if (FIXNUM_P(velmsz)) {
|
1153
|
+
return SIZET2NUM(NUM2SIZET(velmsz) * na->size);
|
1154
|
+
}
|
1155
|
+
return SIZET2NUM(ceil(NUM2DBL(velmsz) * na->size));
|
1046
1156
|
}
|
1047
1157
|
|
1048
1158
|
/*
|
@@ -1066,41 +1176,65 @@ nary_s_byte_size(VALUE type)
|
|
1066
1176
|
static VALUE
|
1067
1177
|
nary_s_from_string(int argc, VALUE *argv, VALUE type)
|
1068
1178
|
{
|
1069
|
-
size_t len, str_len,
|
1179
|
+
size_t len, str_len, byte_size;
|
1070
1180
|
size_t *shape;
|
1071
1181
|
char *ptr;
|
1072
|
-
int
|
1073
|
-
VALUE vstr,vshape,vna;
|
1182
|
+
int i, nd, narg;
|
1183
|
+
VALUE vstr, vshape, vna;
|
1184
|
+
VALUE velmsz;
|
1074
1185
|
|
1075
1186
|
narg = rb_scan_args(argc,argv,"11",&vstr,&vshape);
|
1076
1187
|
str_len = RSTRING_LEN(vstr);
|
1077
|
-
|
1188
|
+
velmsz = rb_const_get(type, rb_intern(ELEMENT_BYTE_SIZE));
|
1078
1189
|
if (narg==2) {
|
1079
|
-
|
1080
|
-
|
1081
|
-
|
1190
|
+
switch(TYPE(vshape)) {
|
1191
|
+
case T_FIXNUM:
|
1192
|
+
nd = 1;
|
1193
|
+
len = NUM2SIZET(vshape);
|
1194
|
+
shape = &len;
|
1195
|
+
break;
|
1196
|
+
case T_ARRAY:
|
1197
|
+
nd = RARRAY_LEN(vshape);
|
1198
|
+
if (nd == 0 || nd > NA_MAX_DIMENSION) {
|
1199
|
+
rb_raise(nary_eDimensionError,"too long or empty shape (%d)", nd);
|
1200
|
+
}
|
1201
|
+
shape = ALLOCA_N(size_t,nd);
|
1202
|
+
len = 1;
|
1203
|
+
for (i=0; i<nd; ++i) {
|
1204
|
+
len *= shape[i] = NUM2SIZET(RARRAY_AREF(vshape,i));
|
1205
|
+
}
|
1206
|
+
break;
|
1207
|
+
default:
|
1208
|
+
rb_raise(rb_eArgError,"second argument must be size or shape");
|
1082
1209
|
}
|
1083
|
-
|
1084
|
-
|
1085
|
-
|
1086
|
-
|
1210
|
+
if (FIXNUM_P(velmsz)) {
|
1211
|
+
byte_size = len * NUM2SIZET(velmsz);
|
1212
|
+
} else {
|
1213
|
+
byte_size = ceil(len * NUM2DBL(velmsz));
|
1087
1214
|
}
|
1088
|
-
if (
|
1089
|
-
rb_raise(rb_eArgError, "size
|
1215
|
+
if (byte_size > str_len) {
|
1216
|
+
rb_raise(rb_eArgError, "specified size is too large");
|
1090
1217
|
}
|
1091
1218
|
} else {
|
1092
1219
|
nd = 1;
|
1093
|
-
|
1094
|
-
|
1220
|
+
if (FIXNUM_P(velmsz)) {
|
1221
|
+
len = str_len / NUM2SIZET(velmsz);
|
1222
|
+
byte_size = len * NUM2SIZET(velmsz);
|
1223
|
+
} else {
|
1224
|
+
len = floor(str_len / NUM2DBL(velmsz));
|
1225
|
+
byte_size = str_len;
|
1226
|
+
}
|
1095
1227
|
if (len == 0) {
|
1096
1228
|
rb_raise(rb_eArgError, "string is empty or too short");
|
1097
1229
|
}
|
1230
|
+
shape = ALLOCA_N(size_t,nd);
|
1231
|
+
shape[0] = len;
|
1098
1232
|
}
|
1099
1233
|
|
1100
1234
|
vna = rb_narray_new(type, nd, shape);
|
1101
1235
|
ptr = na_get_pointer_for_write(vna);
|
1102
1236
|
|
1103
|
-
memcpy(ptr, RSTRING_PTR(vstr),
|
1237
|
+
memcpy(ptr, RSTRING_PTR(vstr), byte_size);
|
1104
1238
|
|
1105
1239
|
return vna;
|
1106
1240
|
}
|
@@ -1113,17 +1247,16 @@ nary_s_from_string(int argc, VALUE *argv, VALUE type)
|
|
1113
1247
|
static VALUE
|
1114
1248
|
nary_to_string(VALUE self)
|
1115
1249
|
{
|
1116
|
-
size_t len
|
1250
|
+
size_t len;
|
1117
1251
|
char *ptr;
|
1118
1252
|
VALUE str;
|
1119
1253
|
narray_t *na;
|
1120
1254
|
|
1121
1255
|
GetNArray(self,na);
|
1122
1256
|
if (na->type == NARRAY_VIEW_T) {
|
1123
|
-
self =
|
1257
|
+
self = rb_funcall(self,rb_intern("copy"),0);
|
1124
1258
|
}
|
1125
|
-
|
1126
|
-
len = na->size * esz;
|
1259
|
+
len = NUM2SIZET(nary_byte_size(self));
|
1127
1260
|
ptr = na_get_pointer_for_read(self);
|
1128
1261
|
str = rb_usascii_str_new(ptr,len);
|
1129
1262
|
RB_GC_GUARD(self);
|
@@ -1236,14 +1369,14 @@ na_reduce_dimension(int argc, VALUE *argv, int naryc, VALUE *naryv)
|
|
1236
1369
|
m |= ((size_t)1) << r;
|
1237
1370
|
continue;
|
1238
1371
|
} else {
|
1239
|
-
reduce =
|
1372
|
+
reduce = SIZET2NUM(m);
|
1240
1373
|
}
|
1241
1374
|
}
|
1242
1375
|
v = rb_funcall( INT2FIX(1), rb_intern("<<"), 1, INT2FIX(r) );
|
1243
1376
|
reduce = rb_funcall( reduce, rb_intern("|"), 1, v );
|
1244
1377
|
}
|
1245
1378
|
}
|
1246
|
-
if (reduce==Qnil) reduce =
|
1379
|
+
if (reduce==Qnil) reduce = SIZET2NUM(m);
|
1247
1380
|
return reduce;
|
1248
1381
|
}
|
1249
1382
|
|
@@ -1395,6 +1528,67 @@ VALUE na_profile_set(VALUE mod, VALUE val)
|
|
1395
1528
|
}
|
1396
1529
|
|
1397
1530
|
|
1531
|
+
/*
|
1532
|
+
Returns the number of rows used for NArray#inspect
|
1533
|
+
@overload inspect_rows
|
1534
|
+
@return [Integer or nil] the number of rows.
|
1535
|
+
*/
|
1536
|
+
static VALUE na_inspect_rows(VALUE mod)
|
1537
|
+
{
|
1538
|
+
if (numo_na_inspect_rows > 0) {
|
1539
|
+
return INT2NUM(numo_na_inspect_rows);
|
1540
|
+
} else {
|
1541
|
+
return Qnil;
|
1542
|
+
}
|
1543
|
+
}
|
1544
|
+
|
1545
|
+
/*
|
1546
|
+
Set the number of rows used for NArray#inspect
|
1547
|
+
@overload inspect_rows=(rows)
|
1548
|
+
@param [Integer or nil] rows the number of rows
|
1549
|
+
@return [nil]
|
1550
|
+
*/
|
1551
|
+
static VALUE na_inspect_rows_set(VALUE mod, VALUE num)
|
1552
|
+
{
|
1553
|
+
if (RTEST(num)) {
|
1554
|
+
numo_na_inspect_rows = NUM2INT(num);
|
1555
|
+
} else {
|
1556
|
+
numo_na_inspect_rows = 0;
|
1557
|
+
}
|
1558
|
+
return Qnil;
|
1559
|
+
}
|
1560
|
+
|
1561
|
+
/*
|
1562
|
+
Returns the number of cols used for NArray#inspect
|
1563
|
+
@overload inspect_cols
|
1564
|
+
@return [Integer or nil] the number of cols.
|
1565
|
+
*/
|
1566
|
+
static VALUE na_inspect_cols(VALUE mod)
|
1567
|
+
{
|
1568
|
+
if (numo_na_inspect_cols > 0) {
|
1569
|
+
return INT2NUM(numo_na_inspect_cols);
|
1570
|
+
} else {
|
1571
|
+
return Qnil;
|
1572
|
+
}
|
1573
|
+
}
|
1574
|
+
|
1575
|
+
/*
|
1576
|
+
Set the number of cols used for NArray#inspect
|
1577
|
+
@overload inspect_cols=(cols)
|
1578
|
+
@param [Integer or nil] cols the number of cols
|
1579
|
+
@return [nil]
|
1580
|
+
*/
|
1581
|
+
static VALUE na_inspect_cols_set(VALUE mod, VALUE num)
|
1582
|
+
{
|
1583
|
+
if (RTEST(num)) {
|
1584
|
+
numo_na_inspect_cols = NUM2INT(num);
|
1585
|
+
} else {
|
1586
|
+
numo_na_inspect_cols = 0;
|
1587
|
+
}
|
1588
|
+
return Qnil;
|
1589
|
+
}
|
1590
|
+
|
1591
|
+
|
1398
1592
|
/*
|
1399
1593
|
Equality of self and other in view of numerical array.
|
1400
1594
|
i.e., both arrays have same shape and corresponding elements are equal.
|
@@ -1444,6 +1638,8 @@ Init_narray()
|
|
1444
1638
|
rb_cComplex = rb_const_get(rb_cObject, rb_intern("Complex"));
|
1445
1639
|
#endif
|
1446
1640
|
|
1641
|
+
rb_define_const(cNArray, "VERSION", rb_str_new2(NARRAY_VERSION));
|
1642
|
+
|
1447
1643
|
nary_eCastError = rb_define_class_under(cNArray, "CastError", rb_eStandardError);
|
1448
1644
|
nary_eShapeError = rb_define_class_under(cNArray, "ShapeError", rb_eStandardError);
|
1449
1645
|
nary_eOperationError = rb_define_class_under(cNArray, "OperationError", rb_eStandardError);
|
@@ -1453,6 +1649,11 @@ Init_narray()
|
|
1453
1649
|
rb_define_singleton_method(cNArray, "profile", na_profile, 0);
|
1454
1650
|
rb_define_singleton_method(cNArray, "profile=", na_profile_set, 1);
|
1455
1651
|
|
1652
|
+
rb_define_singleton_method(cNArray, "inspect_rows", na_inspect_rows, 0);
|
1653
|
+
rb_define_singleton_method(cNArray, "inspect_rows=", na_inspect_rows_set, 1);
|
1654
|
+
rb_define_singleton_method(cNArray, "inspect_cols", na_inspect_cols, 0);
|
1655
|
+
rb_define_singleton_method(cNArray, "inspect_cols=", na_inspect_cols_set, 1);
|
1656
|
+
|
1456
1657
|
/* Ruby allocation framework */
|
1457
1658
|
rb_define_alloc_func(cNArray, na_s_allocate);
|
1458
1659
|
rb_define_method(cNArray, "initialize", na_initialize, -2);
|
@@ -1460,6 +1661,8 @@ Init_narray()
|
|
1460
1661
|
|
1461
1662
|
rb_define_singleton_method(cNArray, "zeros", na_s_zeros, -1);
|
1462
1663
|
rb_define_singleton_method(cNArray, "ones", na_s_ones, -1);
|
1664
|
+
rb_define_singleton_method(cNArray, "linspace", na_s_linspace, -1);
|
1665
|
+
rb_define_singleton_method(cNArray, "logspace", na_s_logspace, -1);
|
1463
1666
|
rb_define_singleton_method(cNArray, "eye", na_s_eye, -1);
|
1464
1667
|
|
1465
1668
|
rb_define_method(cNArray, "size", na_size, 0);
|
@@ -1468,6 +1671,7 @@ Init_narray()
|
|
1468
1671
|
rb_define_method(cNArray, "shape", na_shape, 0);
|
1469
1672
|
rb_define_method(cNArray, "ndim", na_ndim,0);
|
1470
1673
|
rb_define_alias (cNArray, "rank","ndim");
|
1674
|
+
rb_define_method(cNArray, "empty?", na_empty_p, 0);
|
1471
1675
|
|
1472
1676
|
rb_define_method(cNArray, "debug_info", rb_narray_debug_info, 0);
|
1473
1677
|
|