numo-narray 0.9.0.1-x86-mingw32 → 0.9.0.3-x86-mingw32
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 +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
|
|