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 
     | 
    
         |