numo-narray 0.9.0.6 → 0.9.0.7
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/Rakefile +1 -1
- data/ext/numo/narray/data.c +61 -19
- data/ext/numo/narray/gen/erbpp2.rb +2 -1
- data/ext/numo/narray/gen/spec.rb +10 -0
- data/ext/numo/narray/gen/tmpl/qsort.c +1 -1
- data/ext/numo/narray/gen/tmpl/set2.c +2 -2
- data/ext/numo/narray/narray.c +95 -58
- data/ext/numo/narray/ndloop.c +0 -5
- data/ext/numo/narray/numo/intern.h +4 -0
- data/ext/numo/narray/numo/narray.h +2 -2
- data/ext/numo/narray/numo/template.h +5 -4
- data/ext/numo/narray/numo/types/dcomplex.h +6 -0
- data/ext/numo/narray/numo/types/dfloat.h +6 -0
- data/ext/numo/narray/numo/types/int16.h +10 -0
- data/ext/numo/narray/numo/types/int32.h +10 -0
- data/ext/numo/narray/numo/types/int64.h +10 -0
- data/ext/numo/narray/numo/types/int8.h +10 -0
- data/ext/numo/narray/numo/types/scomplex.h +6 -0
- data/ext/numo/narray/numo/types/sfloat.h +7 -1
- data/ext/numo/narray/numo/types/uint16.h +7 -0
- data/ext/numo/narray/numo/types/uint32.h +7 -0
- data/ext/numo/narray/numo/types/uint64.h +7 -0
- data/ext/numo/narray/numo/types/uint8.h +7 -0
- data/lib/numo/narray/extra.rb +337 -9
- data/numo-narray.gemspec +1 -1
- metadata +3 -4
- data/ext/numo/narray/kwarg.c +0 -74
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 2d0790c23a92e44538dfd0978899cdf87ccb5a36
         | 
| 4 | 
            +
              data.tar.gz: c08e683349d0a8fad66c124f4fc687d79381a7bf
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 9f961ea396916fb91fc4e25cd93987786952397fbe75b9d7f11681e4abb3a764a8e12f9040ea2ed6a4164c4390535e01599ceba30351397617b4db39605b7bbe
         | 
| 7 | 
            +
              data.tar.gz: f269691e7a51587070e4b548272ce56aeb84c6f036e2f70482801d7b4d8a19dadc96bf13783b19302ff1f937f3436240f23ca680676d7d54ffa77ae1fe1d1b8a
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -7,7 +7,7 @@ task :doc do | |
| 7 7 | 
             
                map{|s| File.join(dir,s)} +
         | 
| 8 8 | 
             
                [File.join(dir,"types/*.c"), "lib/numo/narray/extra.rb"]
         | 
| 9 9 | 
             
              sh "cd ext/numo/narray; ruby extconf.rb; make src"
         | 
| 10 | 
            -
              sh "rm -rf yard .yardoc; yard doc -o yard -r README.md #{src.join(' ')}"
         | 
| 10 | 
            +
              sh "rm -rf yard .yardoc; yard doc -o yard -m markdown -r README.md #{src.join(' ')}"
         | 
| 11 11 | 
             
            end
         | 
| 12 12 |  | 
| 13 13 | 
             
            require "rake/extensiontask"
         | 
    
        data/ext/numo/narray/data.c
    CHANGED
    
    | @@ -335,18 +335,15 @@ na_transpose(int argc, VALUE *argv, VALUE self) | |
| 335 335 |  | 
| 336 336 | 
             
            //----------------------------------------------------------------------
         | 
| 337 337 |  | 
| 338 | 
            -
             | 
| 339 | 
            -
             | 
| 340 | 
            -
            na_reshape(int argc, VALUE *argv, VALUE self)
         | 
| 338 | 
            +
            static void
         | 
| 339 | 
            +
            na_check_reshape(int argc, VALUE *argv, VALUE self, size_t *shape)
         | 
| 341 340 | 
             
            {
         | 
| 342 341 | 
             
                int    i, unfixed=-1;
         | 
| 343 342 | 
             
                size_t total=1;
         | 
| 344 | 
            -
                size_t *shape; //, *shape_save;
         | 
| 345 343 | 
             
                narray_t *na;
         | 
| 346 | 
            -
                VALUE    copy;
         | 
| 347 344 |  | 
| 348 345 | 
             
                if (argc == 0) {
         | 
| 349 | 
            -
                    rb_raise( | 
| 346 | 
            +
                    rb_raise(rb_eArgError, "No argrument");
         | 
| 350 347 | 
             
                }
         | 
| 351 348 | 
             
                GetNArray(self,na);
         | 
| 352 349 | 
             
                if (NA_SIZE(na) == 0) {
         | 
| @@ -354,7 +351,6 @@ na_reshape(int argc, VALUE *argv, VALUE self) | |
| 354 351 | 
             
                }
         | 
| 355 352 |  | 
| 356 353 | 
             
                /* get shape from argument */
         | 
| 357 | 
            -
                shape = ALLOCA_N(size_t,argc);
         | 
| 358 354 | 
             
                for (i=0; i<argc; ++i) {
         | 
| 359 355 | 
             
                    switch(TYPE(argv[i])) {
         | 
| 360 356 | 
             
                    case T_FIXNUM:
         | 
| @@ -362,6 +358,9 @@ na_reshape(int argc, VALUE *argv, VALUE self) | |
| 362 358 | 
             
                        break;
         | 
| 363 359 | 
             
                    case T_NIL:
         | 
| 364 360 | 
             
                    case T_TRUE:
         | 
| 361 | 
            +
                        if (unfixed >= 0) {
         | 
| 362 | 
            +
                            rb_raise(rb_eArgError,"multiple unfixed dimension");
         | 
| 363 | 
            +
                        }
         | 
| 365 364 | 
             
                        unfixed = i;
         | 
| 366 365 | 
             
                        break;
         | 
| 367 366 | 
             
                    default:
         | 
| @@ -370,24 +369,66 @@ na_reshape(int argc, VALUE *argv, VALUE self) | |
| 370 369 | 
             
                }
         | 
| 371 370 |  | 
| 372 371 | 
             
                if (unfixed>=0) {
         | 
| 373 | 
            -
                    if (NA_SIZE(na) % total != 0)
         | 
| 372 | 
            +
                    if (NA_SIZE(na) % total != 0) {
         | 
| 374 373 | 
             
                        rb_raise(rb_eArgError, "Total size size must be divisor");
         | 
| 374 | 
            +
                    }
         | 
| 375 375 | 
             
                    shape[unfixed] = NA_SIZE(na) / total;
         | 
| 376 376 | 
             
                }
         | 
| 377 377 | 
             
                else if (total !=  NA_SIZE(na)) {
         | 
| 378 378 | 
             
                    rb_raise(rb_eArgError, "Total size must be same");
         | 
| 379 379 | 
             
                }
         | 
| 380 | 
            +
            }
         | 
| 380 381 |  | 
| 381 | 
            -
             | 
| 382 | 
            -
             | 
| 383 | 
            -
             | 
| 384 | 
            -
             | 
| 385 | 
            -
             | 
| 386 | 
            -
             | 
| 387 | 
            -
             | 
| 388 | 
            -
             | 
| 382 | 
            +
            /*
         | 
| 383 | 
            +
              Change the shape of self NArray without coping.
         | 
| 384 | 
            +
              Raise exception if self is non-contiguous.
         | 
| 385 | 
            +
             | 
| 386 | 
            +
              @overload  reshape!(size0,size1,...)
         | 
| 387 | 
            +
              @param sizeN [Integer] new shape
         | 
| 388 | 
            +
              @return [Numo::NArray] return self.
         | 
| 389 | 
            +
              @example
         | 
| 390 | 
            +
            */
         | 
| 391 | 
            +
            static VALUE
         | 
| 392 | 
            +
            na_reshape_bang(int argc, VALUE *argv, VALUE self)
         | 
| 393 | 
            +
            {
         | 
| 394 | 
            +
                size_t *shape;
         | 
| 395 | 
            +
                narray_t *na;
         | 
| 396 | 
            +
             | 
| 397 | 
            +
                if (na_check_contiguous(self)==Qfalse) {
         | 
| 398 | 
            +
                    rb_raise(rb_eStandardError, "cannot change shape of non-contiguous NArray");
         | 
| 399 | 
            +
                }
         | 
| 400 | 
            +
                shape = ALLOCA_N(size_t, argc);
         | 
| 401 | 
            +
                na_check_reshape(argc, argv, self, shape);
         | 
| 402 | 
            +
             | 
| 403 | 
            +
                GetNArray(self, na);
         | 
| 404 | 
            +
                na_setup_shape(na, argc, shape);
         | 
| 405 | 
            +
                return self;
         | 
| 389 406 | 
             
            }
         | 
| 390 407 |  | 
| 408 | 
            +
            /*
         | 
| 409 | 
            +
              Copy and change the shape of NArray.
         | 
| 410 | 
            +
              Returns a copied NArray.
         | 
| 411 | 
            +
             | 
| 412 | 
            +
              @overload  reshape(size0,size1,...)
         | 
| 413 | 
            +
              @param sizeN [Integer] new shape
         | 
| 414 | 
            +
              @return [Numo::NArray] return self.
         | 
| 415 | 
            +
              @example
         | 
| 416 | 
            +
            */
         | 
| 417 | 
            +
            static VALUE
         | 
| 418 | 
            +
            na_reshape(int argc, VALUE *argv, VALUE self)
         | 
| 419 | 
            +
            {
         | 
| 420 | 
            +
                size_t *shape;
         | 
| 421 | 
            +
                narray_t *na;
         | 
| 422 | 
            +
                VALUE    copy;
         | 
| 423 | 
            +
             | 
| 424 | 
            +
                shape = ALLOCA_N(size_t, argc);
         | 
| 425 | 
            +
                na_check_reshape(argc, argv, self, shape);
         | 
| 426 | 
            +
             | 
| 427 | 
            +
                copy = rb_funcall(self, rb_intern("dup"), 0);
         | 
| 428 | 
            +
                GetNArray(copy, na);
         | 
| 429 | 
            +
                na_setup_shape(na, argc, shape);
         | 
| 430 | 
            +
                return copy;
         | 
| 431 | 
            +
            }
         | 
| 391 432 |  | 
| 392 433 | 
             
            //----------------------------------------------------------------------
         | 
| 393 434 |  | 
| @@ -739,6 +780,7 @@ na_diagonal(int argc, VALUE *argv, VALUE self) | |
| 739 780 | 
             
            //----------------------------------------------------------------------
         | 
| 740 781 |  | 
| 741 782 |  | 
| 783 | 
            +
            #if 0
         | 
| 742 784 | 
             
            #ifdef SWAP
         | 
| 743 785 | 
             
            #undef SWAP
         | 
| 744 786 | 
             
            #endif
         | 
| @@ -880,7 +922,7 @@ numo_na_dot(VALUE self, VALUE other) | |
| 880 922 | 
             
                }
         | 
| 881 923 | 
             
                return rb_funcall(a1,id_mulsum,2,a2,INT2FIX(-1));
         | 
| 882 924 | 
             
            }
         | 
| 883 | 
            -
             | 
| 925 | 
            +
            #endif
         | 
| 884 926 |  | 
| 885 927 | 
             
            void
         | 
| 886 928 | 
             
            Init_nary_data()
         | 
| @@ -892,8 +934,8 @@ Init_nary_data() | |
| 892 934 | 
             
                rb_define_method(cNArray, "transpose", na_transpose, -1);
         | 
| 893 935 |  | 
| 894 936 | 
             
                rb_define_method(cNArray, "reshape", na_reshape,-1);
         | 
| 895 | 
            -
                /*
         | 
| 896 937 | 
             
                rb_define_method(cNArray, "reshape!", na_reshape_bang,-1);
         | 
| 938 | 
            +
                /*
         | 
| 897 939 | 
             
                rb_define_alias(cNArray,  "shape=","reshape!");
         | 
| 898 940 | 
             
                */
         | 
| 899 941 | 
             
                rb_define_method(cNArray, "diagonal", na_diagonal,-1);
         | 
| @@ -914,7 +956,7 @@ Init_nary_data() | |
| 914 956 | 
             
                rb_define_method(cNArray, "to_host", nary_to_host, 0);
         | 
| 915 957 | 
             
                rb_define_method(cNArray, "to_swapped", nary_to_swapped, 0);
         | 
| 916 958 |  | 
| 917 | 
            -
                rb_define_method(cNArray, "dot", numo_na_dot, 1);
         | 
| 959 | 
            +
                //rb_define_method(cNArray, "dot", numo_na_dot, 1);
         | 
| 918 960 |  | 
| 919 961 | 
             
                id_mulsum       = rb_intern("mulsum");
         | 
| 920 962 | 
             
                sym_mulsum      = ID2SYM(id_mulsum);
         | 
| @@ -109,6 +109,7 @@ end | |
| 109 109 | 
             
            class DefLib < ErbPP
         | 
| 110 110 | 
             
              def initialize(parent=nil, **opts, &block)
         | 
| 111 111 | 
             
                opts[:erb_base] ||= 'lib'
         | 
| 112 | 
            +
                opts[:include_files] ||= []
         | 
| 112 113 | 
             
                super(parent, **opts, &block)
         | 
| 113 114 | 
             
              end
         | 
| 114 115 | 
             
              def id_assign
         | 
| @@ -222,7 +223,7 @@ class DefMethod < ErbPP | |
| 222 223 | 
             
              end
         | 
| 223 224 |  | 
| 224 225 | 
             
              def c_name
         | 
| 225 | 
            -
                @opts[:name].gsub(/\?/,"_p").gsub(/\!/,"_bang")
         | 
| 226 | 
            +
                @opts[:name].gsub(/\?/,"_p").gsub(/\!/,"_bang").gsub(/=/,"_set")
         | 
| 226 227 | 
             
              end
         | 
| 227 228 |  | 
| 228 229 | 
             
              def op_map
         | 
    
        data/ext/numo/narray/gen/spec.rb
    CHANGED
    
    | @@ -64,6 +64,16 @@ else | |
| 64 64 | 
             
              def_const "CONTIGUOUS_STRIDE", "INT2FIX(sizeof(dtype))"
         | 
| 65 65 | 
             
            end
         | 
| 66 66 |  | 
| 67 | 
            +
            if !is_object
         | 
| 68 | 
            +
              if is_float
         | 
| 69 | 
            +
                def_const "EPSILON", "M_EPSILON"
         | 
| 70 | 
            +
              end
         | 
| 71 | 
            +
              if is_float || is_int
         | 
| 72 | 
            +
                def_const "MAX", "M_MAX"
         | 
| 73 | 
            +
                def_const "MIN", "M_MIN"
         | 
| 74 | 
            +
              end
         | 
| 75 | 
            +
            end
         | 
| 76 | 
            +
             | 
| 67 77 | 
             
            # Un-define
         | 
| 68 78 |  | 
| 69 79 | 
             
            if is_object
         | 
| @@ -13,14 +13,14 @@ static void | |
| 13 13 | 
             
                if (idx1) {
         | 
| 14 14 | 
             
                    if (idx2) {
         | 
| 15 15 | 
             
                        for (; i--;) {
         | 
| 16 | 
            -
                             | 
| 16 | 
            +
                            GET_DATA(p1+*idx1,dtype,x);
         | 
| 17 17 | 
             
                            GET_DATA_INDEX(p2,idx2,<%=dtype%>,y);
         | 
| 18 18 | 
             
                            x = m_<%=name%>(x,y);
         | 
| 19 19 | 
             
                            SET_DATA_INDEX(p1,idx1,dtype,x);
         | 
| 20 20 | 
             
                        }
         | 
| 21 21 | 
             
                    } else {
         | 
| 22 22 | 
             
                        for (; i--;) {
         | 
| 23 | 
            -
                             | 
| 23 | 
            +
                            GET_DATA(p1+*idx1,dtype,x);
         | 
| 24 24 | 
             
                            GET_DATA_STRIDE(p2,s2,<%=dtype%>,y);
         | 
| 25 25 | 
             
                            x = m_<%=name%>(x,y);
         | 
| 26 26 | 
             
                            SET_DATA_INDEX(p1,idx1,dtype,x);
         | 
    
        data/ext/numo/narray/narray.c
    CHANGED
    
    | @@ -1448,52 +1448,15 @@ na_test_reduce(VALUE reduce, int dim) | |
| 1448 1448 | 
             
            }
         | 
| 1449 1449 |  | 
| 1450 1450 |  | 
| 1451 | 
            -
            VALUE
         | 
| 1452 | 
            -
             | 
| 1453 | 
            -
                                ndfunc_t *ndf, na_iter_func_t iter_nan)
         | 
| 1451 | 
            +
            static VALUE
         | 
| 1452 | 
            +
            na_get_reduce_flag_from_narray(int naryc, VALUE *naryv, int *max_arg)
         | 
| 1454 1453 | 
             
            {
         | 
| 1455 1454 | 
             
                int ndim, ndim0;
         | 
| 1456 | 
            -
                int  | 
| 1457 | 
            -
                int i | 
| 1458 | 
            -
                long narg;
         | 
| 1455 | 
            +
                int rowmaj;
         | 
| 1456 | 
            +
                int i;
         | 
| 1459 1457 | 
             
                size_t j;
         | 
| 1460 | 
            -
                size_t len;
         | 
| 1461 | 
            -
                ssize_t beg, step;
         | 
| 1462 | 
            -
                VALUE v;
         | 
| 1463 1458 | 
             
                narray_t *na;
         | 
| 1464 | 
            -
                size_t m;
         | 
| 1465 1459 | 
             
                VALUE reduce;
         | 
| 1466 | 
            -
                VALUE kw_hash = Qnil;
         | 
| 1467 | 
            -
                ID kw_table[3] = {id_axis,id_nan,id_keepdims};
         | 
| 1468 | 
            -
                VALUE opts[3] = {Qundef,Qundef,Qundef};
         | 
| 1469 | 
            -
                VALUE axes;
         | 
| 1470 | 
            -
             | 
| 1471 | 
            -
                narg = rb_scan_args(argc, argv, "*:", &axes, &kw_hash);
         | 
| 1472 | 
            -
                rb_get_kwargs(kw_hash, kw_table, 0, 3, opts);
         | 
| 1473 | 
            -
             | 
| 1474 | 
            -
                // option: axis
         | 
| 1475 | 
            -
                if (opts[0] != Qundef && RTEST(opts[0])) {
         | 
| 1476 | 
            -
                    if (narg > 0) {
         | 
| 1477 | 
            -
                        rb_raise(rb_eArgError,"both axis-arguments and axis-keyword are given");
         | 
| 1478 | 
            -
                    }
         | 
| 1479 | 
            -
                    if (TYPE(opts[0]) == T_ARRAY) {
         | 
| 1480 | 
            -
                        axes = opts[0];
         | 
| 1481 | 
            -
                    } else {
         | 
| 1482 | 
            -
                        axes = rb_ary_new3(1,opts[0]);
         | 
| 1483 | 
            -
                    }
         | 
| 1484 | 
            -
                }
         | 
| 1485 | 
            -
                if (ndf) {
         | 
| 1486 | 
            -
                    // option: nan
         | 
| 1487 | 
            -
                    if (iter_nan && opts[1] != Qundef) {
         | 
| 1488 | 
            -
                        if (RTEST(opts[1]))
         | 
| 1489 | 
            -
                            ndf->func = iter_nan; // replace to nan-aware iterator function
         | 
| 1490 | 
            -
                    }
         | 
| 1491 | 
            -
                    // option: keepdims
         | 
| 1492 | 
            -
                    if (opts[2] != Qundef) {
         | 
| 1493 | 
            -
                        if (RTEST(opts[2]))
         | 
| 1494 | 
            -
                            ndf->flag |= NDF_KEEP_DIM;
         | 
| 1495 | 
            -
                    }
         | 
| 1496 | 
            -
                }
         | 
| 1497 1460 |  | 
| 1498 1461 | 
             
                if (naryc<1) {
         | 
| 1499 1462 | 
             
                    rb_raise(rb_eRuntimeError,"must be positive: naryc=%d", naryc);
         | 
| @@ -1503,32 +1466,47 @@ na_reduce_dimension(int argc, VALUE *argv, int naryc, VALUE *naryv, | |
| 1503 1466 | 
             
                    rb_raise(nary_eShapeError,"cannot reduce empty NArray");
         | 
| 1504 1467 | 
             
                }
         | 
| 1505 1468 | 
             
                reduce = na->reduce;
         | 
| 1506 | 
            -
                if (argc==0) {
         | 
| 1507 | 
            -
                    //printf("pass argc=0 reduce=%d\n",NUM2INT(reduce));
         | 
| 1508 | 
            -
                    return reduce;
         | 
| 1509 | 
            -
                }
         | 
| 1510 1469 | 
             
                ndim = ndim0 = na->ndim;
         | 
| 1511 | 
            -
                 | 
| 1512 | 
            -
                 | 
| 1470 | 
            +
                if (max_arg) *max_arg = 0;
         | 
| 1471 | 
            +
                rowmaj = TEST_COLUMN_MAJOR(naryv[0]);
         | 
| 1472 | 
            +
                for (i=0; i<naryc; i++) {
         | 
| 1513 1473 | 
             
                    GetNArray(naryv[i],na);
         | 
| 1514 1474 | 
             
                    if (na->size==0) {
         | 
| 1515 1475 | 
             
                        rb_raise(nary_eShapeError,"cannot reduce empty NArray");
         | 
| 1516 1476 | 
             
                    }
         | 
| 1517 | 
            -
                    if (TEST_COLUMN_MAJOR(naryv[i]) !=  | 
| 1477 | 
            +
                    if (TEST_COLUMN_MAJOR(naryv[i]) != rowmaj) {
         | 
| 1518 1478 | 
             
                        rb_raise(nary_eDimensionError,"dimension order is different");
         | 
| 1519 1479 | 
             
                    }
         | 
| 1520 | 
            -
                    if (na->ndim > ndim) {
         | 
| 1480 | 
            +
                    if (na->ndim > ndim) { // maximum dimension
         | 
| 1521 1481 | 
             
                        ndim = na->ndim;
         | 
| 1482 | 
            +
                        if (max_arg) *max_arg = i;
         | 
| 1522 1483 | 
             
                    }
         | 
| 1523 1484 | 
             
                }
         | 
| 1524 1485 | 
             
                if (ndim != ndim0) {
         | 
| 1525 | 
            -
                    j =  | 
| 1526 | 
            -
                    reduce =  | 
| 1527 | 
            -
                    if (!FIXNUM_P(reduce)) {
         | 
| 1528 | 
            -
                        rb_raise(nary_eDimensionError,"reduce has too many bits");
         | 
| 1529 | 
            -
                    }
         | 
| 1486 | 
            +
                    j = NUM2SIZET(reduce) << (ndim-ndim0);
         | 
| 1487 | 
            +
                    reduce = SIZET2NUM(j);
         | 
| 1530 1488 | 
             
                }
         | 
| 1531 | 
            -
                 | 
| 1489 | 
            +
                return reduce;
         | 
| 1490 | 
            +
            }
         | 
| 1491 | 
            +
             | 
| 1492 | 
            +
             | 
| 1493 | 
            +
            static VALUE
         | 
| 1494 | 
            +
            na_get_reduce_flag_from_axes(VALUE na_obj, VALUE axes)
         | 
| 1495 | 
            +
            {
         | 
| 1496 | 
            +
                int i, r;
         | 
| 1497 | 
            +
                int ndim, rowmaj;
         | 
| 1498 | 
            +
                long narg;
         | 
| 1499 | 
            +
                size_t j;
         | 
| 1500 | 
            +
                size_t len;
         | 
| 1501 | 
            +
                ssize_t beg, step;
         | 
| 1502 | 
            +
                VALUE v;
         | 
| 1503 | 
            +
                size_t m;
         | 
| 1504 | 
            +
                VALUE reduce;
         | 
| 1505 | 
            +
                narray_t *na;
         | 
| 1506 | 
            +
             | 
| 1507 | 
            +
                GetNArray(na_obj,na);
         | 
| 1508 | 
            +
                ndim = na->ndim;
         | 
| 1509 | 
            +
                rowmaj = TEST_COLUMN_MAJOR(na_obj);
         | 
| 1532 1510 |  | 
| 1533 1511 | 
             
                m = 0;
         | 
| 1534 1512 | 
             
                reduce = Qnil;
         | 
| @@ -1554,8 +1532,9 @@ na_reduce_dimension(int argc, VALUE *argv, int naryc, VALUE *naryv, | |
| 1554 1532 | 
             
                    }
         | 
| 1555 1533 | 
             
                    for (j=0; j<len; j++) {
         | 
| 1556 1534 | 
             
                        r = beg + step*j;
         | 
| 1557 | 
            -
                        if ( | 
| 1535 | 
            +
                        if (rowmaj) {
         | 
| 1558 1536 | 
             
                            r = ndim-1-r;
         | 
| 1537 | 
            +
                        }
         | 
| 1559 1538 | 
             
                        if (reduce==Qnil) {
         | 
| 1560 1539 | 
             
                          if ( r < (ssize_t)sizeof(size_t) ) {
         | 
| 1561 1540 | 
             
                                m |= ((size_t)1) << r;
         | 
| @@ -1568,12 +1547,70 @@ na_reduce_dimension(int argc, VALUE *argv, int naryc, VALUE *naryv, | |
| 1568 1547 | 
             
                        reduce = rb_funcall( reduce, '|', 1, v );
         | 
| 1569 1548 | 
             
                    }
         | 
| 1570 1549 | 
             
                }
         | 
| 1571 | 
            -
                 | 
| 1572 | 
            -
                if (reduce==Qnil) reduce = SIZET2NUM(m);
         | 
| 1550 | 
            +
                if (NIL_P(reduce)) reduce = SIZET2NUM(m);
         | 
| 1573 1551 | 
             
                return reduce;
         | 
| 1574 1552 | 
             
            }
         | 
| 1575 1553 |  | 
| 1576 1554 |  | 
| 1555 | 
            +
            VALUE
         | 
| 1556 | 
            +
            nary_reduce_options(VALUE axes, VALUE *opts, int naryc, VALUE *naryv,
         | 
| 1557 | 
            +
                                ndfunc_t *ndf)
         | 
| 1558 | 
            +
            {
         | 
| 1559 | 
            +
                int  max_arg;
         | 
| 1560 | 
            +
                VALUE reduce;
         | 
| 1561 | 
            +
             | 
| 1562 | 
            +
                // option: axis
         | 
| 1563 | 
            +
                if (opts[0] != Qundef && RTEST(opts[0])) {
         | 
| 1564 | 
            +
                    if (!NIL_P(axes)) {
         | 
| 1565 | 
            +
                        rb_raise(rb_eArgError,
         | 
| 1566 | 
            +
                          "cannot specify axis-arguments and axis-keyword simultaneously");
         | 
| 1567 | 
            +
                    }
         | 
| 1568 | 
            +
                    if (TYPE(opts[0]) == T_ARRAY) {
         | 
| 1569 | 
            +
                        axes = opts[0];
         | 
| 1570 | 
            +
                    } else {
         | 
| 1571 | 
            +
                        axes = rb_ary_new3(1,opts[0]);
         | 
| 1572 | 
            +
                    }
         | 
| 1573 | 
            +
                }
         | 
| 1574 | 
            +
                if (ndf) {
         | 
| 1575 | 
            +
                    // option: keepdims
         | 
| 1576 | 
            +
                    if (opts[1] != Qundef) {
         | 
| 1577 | 
            +
                        if (RTEST(opts[1]))
         | 
| 1578 | 
            +
                            ndf->flag |= NDF_KEEP_DIM;
         | 
| 1579 | 
            +
                    }
         | 
| 1580 | 
            +
                }
         | 
| 1581 | 
            +
             | 
| 1582 | 
            +
                reduce = na_get_reduce_flag_from_narray(naryc, naryv, &max_arg);
         | 
| 1583 | 
            +
             | 
| 1584 | 
            +
                if (NIL_P(axes)) return reduce;
         | 
| 1585 | 
            +
             | 
| 1586 | 
            +
                return na_get_reduce_flag_from_axes(naryv[max_arg], axes);
         | 
| 1587 | 
            +
            }
         | 
| 1588 | 
            +
             | 
| 1589 | 
            +
             | 
| 1590 | 
            +
            VALUE
         | 
| 1591 | 
            +
            nary_reduce_dimension(int argc, VALUE *argv, int naryc, VALUE *naryv,
         | 
| 1592 | 
            +
                                  ndfunc_t *ndf, na_iter_func_t iter_nan)
         | 
| 1593 | 
            +
            {
         | 
| 1594 | 
            +
                long narg;
         | 
| 1595 | 
            +
                VALUE axes;
         | 
| 1596 | 
            +
                VALUE kw_hash = Qnil;
         | 
| 1597 | 
            +
                ID kw_table[3] = {id_axis,id_keepdims,id_nan};
         | 
| 1598 | 
            +
                VALUE opts[3] = {Qundef,Qundef,Qundef};
         | 
| 1599 | 
            +
             | 
| 1600 | 
            +
                narg = rb_scan_args(argc, argv, "*:", &axes, &kw_hash);
         | 
| 1601 | 
            +
                rb_get_kwargs(kw_hash, kw_table, 0, 3, opts);
         | 
| 1602 | 
            +
             | 
| 1603 | 
            +
                if (ndf) {
         | 
| 1604 | 
            +
                    // option: nan
         | 
| 1605 | 
            +
                    if (iter_nan && opts[2] != Qundef) {
         | 
| 1606 | 
            +
                        if (RTEST(opts[2]))
         | 
| 1607 | 
            +
                            ndf->func = iter_nan; // replace to nan-aware iterator function
         | 
| 1608 | 
            +
                    }
         | 
| 1609 | 
            +
                }
         | 
| 1610 | 
            +
             | 
| 1611 | 
            +
                return na_reduce_options((narg)?axes:Qnil, opts, naryc, naryv, ndf);
         | 
| 1612 | 
            +
            }
         | 
| 1613 | 
            +
             | 
| 1577 1614 | 
             
            /*
         | 
| 1578 1615 | 
             
              Return true if column major.
         | 
| 1579 1616 | 
             
            */
         | 
    
        data/ext/numo/narray/ndloop.c
    CHANGED
    
    | @@ -1205,15 +1205,10 @@ ndfunc_write_back(ndfunc_t *nf, na_md_loop_t *lp, VALUE orig_args, VALUE results | |
| 1205 1205 | 
             
            static VALUE
         | 
| 1206 1206 | 
             
            ndloop_extract(VALUE results, ndfunc_t *nf)
         | 
| 1207 1207 | 
             
            {
         | 
| 1208 | 
            -
                static ID id_extract = 0;
         | 
| 1209 1208 | 
             
                long n, i;
         | 
| 1210 1209 | 
             
                VALUE x, y;
         | 
| 1211 1210 | 
             
                narray_t *na;
         | 
| 1212 1211 |  | 
| 1213 | 
            -
                if (id_extract==0) {
         | 
| 1214 | 
            -
                    id_extract = id_extract;
         | 
| 1215 | 
            -
                }
         | 
| 1216 | 
            -
             | 
| 1217 1212 | 
             
                // extract result objects
         | 
| 1218 1213 | 
             
                switch(nf->nout) {
         | 
| 1219 1214 | 
             
                case 0:
         | 
| @@ -75,6 +75,10 @@ void na_release_lock(VALUE); // currently do nothing | |
| 75 75 | 
             
            VALUE nary_reduce_dimension(int argc, VALUE *argv, int naryc, VALUE *naryv,
         | 
| 76 76 | 
             
                                        ndfunc_t *ndf, na_iter_func_t nan_iter);
         | 
| 77 77 |  | 
| 78 | 
            +
            #define na_reduce_options nary_reduce_options
         | 
| 79 | 
            +
            VALUE nary_reduce_options(VALUE axes, VALUE *opts, int naryc, VALUE *naryv,
         | 
| 80 | 
            +
                                      ndfunc_t *ndf);
         | 
| 81 | 
            +
             | 
| 78 82 | 
             
            // ndloop
         | 
| 79 83 | 
             
            VALUE na_ndloop(ndfunc_t *nf, int argc, ...);
         | 
| 80 84 | 
             
            VALUE na_ndloop2(ndfunc_t *nf, VALUE args);
         | 
| @@ -10,10 +10,11 @@ | |
| 10 10 | 
             
                {   c = (lp)->n[0]; }
         | 
| 11 11 |  | 
| 12 12 | 
             
            #define NDL_CNT(lp) ((lp)->n[0])
         | 
| 13 | 
            -
            #define NDL_PTR(lp,i) (( | 
| 14 | 
            -
            #define  | 
| 15 | 
            -
            #define NDL_IDX(lp,i) (( | 
| 16 | 
            -
            #define NDL_ESZ(lp,i) (( | 
| 13 | 
            +
            #define NDL_PTR(lp,i) ((lp)->args[i].ptr + (lp)->args[i].iter[0].pos)
         | 
| 14 | 
            +
            #define NDL_STEP(lp,i) ((lp)->args[i].iter[0].step)
         | 
| 15 | 
            +
            #define NDL_IDX(lp,i) ((lp)->args[i].iter[0].idx)
         | 
| 16 | 
            +
            #define NDL_ESZ(lp,i) ((lp)->args[i].elmsz)
         | 
| 17 | 
            +
            #define NDL_SHAPE(lp,i) ((lp)->args[i].shape)
         | 
| 17 18 |  | 
| 18 19 | 
             
            #define INIT_PTR( lp, i, pt, st )                               \
         | 
| 19 20 | 
             
                {                                                           \
         | 
| @@ -10,6 +10,7 @@ static inline bool c_nearly_eq(dtype x, dtype y) { | |
| 10 10 | 
             
                return c_abs(c_sub(x,y)) <= (c_abs(x)+c_abs(y))*DBL_EPSILON*2;
         | 
| 11 11 | 
             
            }
         | 
| 12 12 |  | 
| 13 | 
            +
            #ifdef SFMT_H
         | 
| 13 14 | 
             
            /* generates a random number on [0,1)-real-interval */
         | 
| 14 15 | 
             
            inline static dtype m_rand(dtype max)
         | 
| 15 16 | 
             
            {
         | 
| @@ -36,3 +37,8 @@ inline static void m_rand_norm(dtype mu, rtype sigma, dtype *a0) | |
| 36 37 | 
             
                REAL(*a0) = x1*w * sigma + REAL(mu);
         | 
| 37 38 | 
             
                IMAG(*a0) = x2*w * sigma + IMAG(mu);
         | 
| 38 39 | 
             
            }
         | 
| 40 | 
            +
            #endif
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            #define M_EPSILON rb_float_new(2.2204460492503131e-16)
         | 
| 43 | 
            +
            #define M_MIN     rb_float_new(2.2250738585072014e-308)
         | 
| 44 | 
            +
            #define M_MAX     rb_float_new(1.7976931348623157e+308)
         | 
| @@ -6,6 +6,7 @@ typedef double rtype; | |
| 6 6 |  | 
| 7 7 | 
             
            #include "float_macro.h"
         | 
| 8 8 |  | 
| 9 | 
            +
            #ifdef SFMT_H
         | 
| 9 10 | 
             
            /* generates a random number on [0,1)-real-interval */
         | 
| 10 11 | 
             
            inline static dtype m_rand(dtype max)
         | 
| 11 12 | 
             
            {
         | 
| @@ -29,8 +30,13 @@ inline static void m_rand_norm(dtype mu, dtype sigma, dtype *a0, dtype *a1) | |
| 29 30 | 
             
                if (a0) {*a0 = x1*w * sigma + mu;}
         | 
| 30 31 | 
             
                if (a1) {*a1 = x2*w * sigma + mu;}
         | 
| 31 32 | 
             
            }
         | 
| 33 | 
            +
            #endif
         | 
| 32 34 |  | 
| 33 35 | 
             
            #define m_min_init numo_dfloat_new_dim0(0.0/0.0)
         | 
| 34 36 | 
             
            #define m_max_init numo_dfloat_new_dim0(0.0/0.0)
         | 
| 35 37 | 
             
            #define m_extract(x) rb_float_new(*(double*)x)
         | 
| 36 38 | 
             
            #define m_nearly_eq(x,y) (fabs(x-y)<=(fabs(x)+fabs(y))*DBL_EPSILON*2)
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            #define M_EPSILON rb_float_new(2.2204460492503131e-16)
         | 
| 41 | 
            +
            #define M_MIN     rb_float_new(2.2250738585072014e-308)
         | 
| 42 | 
            +
            #define M_MAX     rb_float_new(1.7976931348623157e+308)
         | 
| @@ -9,3 +9,13 @@ typedef int16_t rtype; | |
| 9 9 | 
             
            #define m_sprintf(s,x)   sprintf(s,"%d",(int)(x))
         | 
| 10 10 |  | 
| 11 11 | 
             
            #include "int_macro.h"
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            #ifndef INT16_MIN
         | 
| 14 | 
            +
            #define INT16_MIN (-32767-1)
         | 
| 15 | 
            +
            #endif
         | 
| 16 | 
            +
            #ifndef INT16_MAX
         | 
| 17 | 
            +
            #define INT16_MAX (32767)
         | 
| 18 | 
            +
            #endif
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            #define M_MIN  m_data_to_num(INT16_MIN)
         | 
| 21 | 
            +
            #define M_MAX  m_data_to_num(INT16_MAX)
         | 
| @@ -9,3 +9,13 @@ typedef int32_t rtype; | |
| 9 9 | 
             
            #define m_sprintf(s,x)   sprintf(s,"%"PRId32,(int32_t)(x))
         | 
| 10 10 |  | 
| 11 11 | 
             
            #include "int_macro.h"
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            #ifndef INT32_MIN
         | 
| 14 | 
            +
            #define INT32_MIN (-2147483647-1)
         | 
| 15 | 
            +
            #endif
         | 
| 16 | 
            +
            #ifndef INT32_MAX
         | 
| 17 | 
            +
            #define INT32_MAX (2147483647)
         | 
| 18 | 
            +
            #endif
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            #define M_MIN  m_data_to_num(INT32_MIN)
         | 
| 21 | 
            +
            #define M_MAX  m_data_to_num(INT32_MAX)
         | 
| @@ -9,3 +9,13 @@ typedef int64_t rtype; | |
| 9 9 | 
             
            #define m_sprintf(s,x)   sprintf(s,"%"PRId64,(int64_t)(x))
         | 
| 10 10 |  | 
| 11 11 | 
             
            #include "int_macro.h"
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            #ifndef INT64_MIN
         | 
| 14 | 
            +
            #define INT64_MIN (-9223372036854775807l-1)
         | 
| 15 | 
            +
            #endif
         | 
| 16 | 
            +
            #ifndef INT64_MAX
         | 
| 17 | 
            +
            #define INT64_MAX (9223372036854775807l)
         | 
| 18 | 
            +
            #endif
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            #define M_MIN  m_data_to_num(INT64_MIN)
         | 
| 21 | 
            +
            #define M_MAX  m_data_to_num(INT64_MAX)
         | 
| @@ -9,3 +9,13 @@ typedef int8_t rtype; | |
| 9 9 | 
             
            #define m_sprintf(s,x)   sprintf(s,"%d",(int)(x))
         | 
| 10 10 |  | 
| 11 11 | 
             
            #include "int_macro.h"
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            #ifndef INT8_MIN
         | 
| 14 | 
            +
            #define INT8_MIN (-127-1)
         | 
| 15 | 
            +
            #endif
         | 
| 16 | 
            +
            #ifndef INT8_MAX
         | 
| 17 | 
            +
            #define INT8_MAX (127)
         | 
| 18 | 
            +
            #endif
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            #define M_MIN  INT2FIX(INT8_MIN)
         | 
| 21 | 
            +
            #define M_MAX  INT2FIX(INT8_MAX)
         | 
| @@ -10,6 +10,7 @@ static inline bool c_nearly_eq(dtype x, dtype y) { | |
| 10 10 | 
             
                return c_abs(c_sub(x,y)) <= (c_abs(x)+c_abs(y))*FLT_EPSILON*2;
         | 
| 11 11 | 
             
            }
         | 
| 12 12 |  | 
| 13 | 
            +
            #ifdef SFMT_H
         | 
| 13 14 | 
             
            /* generates a random number on [0,1)-real-interval */
         | 
| 14 15 | 
             
            inline static dtype m_rand(dtype max)
         | 
| 15 16 | 
             
            {
         | 
| @@ -36,3 +37,8 @@ inline static void m_rand_norm(dtype mu, rtype sigma, dtype *a0) | |
| 36 37 | 
             
                REAL(*a0) = x1*w * sigma + REAL(mu);
         | 
| 37 38 | 
             
                IMAG(*a0) = x2*w * sigma + IMAG(mu);
         | 
| 38 39 | 
             
            }
         | 
| 40 | 
            +
            #endif
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            #define M_EPSILON rb_float_new(1.1920928955078125e-07)
         | 
| 43 | 
            +
            #define M_MIN     rb_float_new(1.1754943508222875e-38)
         | 
| 44 | 
            +
            #define M_MAX     rb_float_new(3.4028234663852886e+38)
         | 
| @@ -1,11 +1,12 @@ | |
| 1 1 | 
             
            typedef float dtype;
         | 
| 2 2 | 
             
            typedef float rtype;
         | 
| 3 3 | 
             
            #define cT  numo_cSFloat
         | 
| 4 | 
            -
            #define cRT  | 
| 4 | 
            +
            #define cRT numo_cSFloat
         | 
| 5 5 | 
             
            #define mTM numo_mSFloatMath
         | 
| 6 6 |  | 
| 7 7 | 
             
            #include "float_macro.h"
         | 
| 8 8 |  | 
| 9 | 
            +
            #ifdef SFMT_H
         | 
| 9 10 | 
             
            /* generates a random number on [0,1)-real-interval */
         | 
| 10 11 | 
             
            inline static dtype m_rand(dtype max)
         | 
| 11 12 | 
             
            {
         | 
| @@ -29,9 +30,14 @@ inline static void m_rand_norm(dtype mu, dtype sigma, dtype *a0, dtype *a1) | |
| 29 30 | 
             
                if (a0) {*a0 = x1*w * sigma + mu;}
         | 
| 30 31 | 
             
                if (a1) {*a1 = x2*w * sigma + mu;}
         | 
| 31 32 | 
             
            }
         | 
| 33 | 
            +
            #endif
         | 
| 32 34 |  | 
| 33 35 | 
             
            #define m_min_init numo_sfloat_new_dim0(0.0/0.0)
         | 
| 34 36 | 
             
            #define m_max_init numo_sfloat_new_dim0(0.0/0.0)
         | 
| 35 37 |  | 
| 36 38 | 
             
            #define m_extract(x) rb_float_new(*(float*)x)
         | 
| 37 39 | 
             
            #define m_nearly_eq(x,y) (fabs(x-y)<=(fabs(x)+fabs(y))*FLT_EPSILON*2)
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            #define M_EPSILON rb_float_new(1.1920928955078125e-07)
         | 
| 42 | 
            +
            #define M_MIN     rb_float_new(1.1754943508222875e-38)
         | 
| 43 | 
            +
            #define M_MAX     rb_float_new(3.4028234663852886e+38)
         | 
| @@ -9,3 +9,10 @@ typedef u_int64_t rtype; | |
| 9 9 | 
             
            #define m_sprintf(s,x)   sprintf(s,"%"PRIu64,(u_int64_t)(x))
         | 
| 10 10 |  | 
| 11 11 | 
             
            #include "uint_macro.h"
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            #ifndef UINT64_MAX
         | 
| 14 | 
            +
            #define UINT64_MAX (18446744073709551615ul)
         | 
| 15 | 
            +
            #endif
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            #define M_MIN  INT2FIX(0)
         | 
| 18 | 
            +
            #define M_MAX  m_data_to_num(UINT64_MAX)
         | 
    
        data/lib/numo/narray/extra.rb
    CHANGED
    
    | @@ -32,20 +32,20 @@ module Numo | |
| 32 32 | 
             
                end
         | 
| 33 33 |  | 
| 34 34 | 
             
                # Flip each row in the left/right direction.
         | 
| 35 | 
            -
                # Same as a[true, (-1..0).step(-1), ...] | 
| 35 | 
            +
                # Same as `a[true, (-1..0).step(-1), ...]`.
         | 
| 36 36 | 
             
                def fliplr
         | 
| 37 37 | 
             
                  reverse(1)
         | 
| 38 38 | 
             
                end
         | 
| 39 39 |  | 
| 40 40 | 
             
                # Flip each column in the up/down direction.
         | 
| 41 | 
            -
                # Same as a[(-1..0).step(-1), ...] | 
| 41 | 
            +
                # Same as `a[(-1..0).step(-1), ...]`.
         | 
| 42 42 | 
             
                def flipud
         | 
| 43 43 | 
             
                  reverse(0)
         | 
| 44 44 | 
             
                end
         | 
| 45 45 |  | 
| 46 46 | 
             
                # Multi-dimensional array indexing.
         | 
| 47 47 | 
             
                # Same as [] for one-dimensional NArray.
         | 
| 48 | 
            -
                # Similar to numpy's tuple indexing, i.e., a[[1,2,..],[3,4,..]]
         | 
| 48 | 
            +
                # Similar to numpy's tuple indexing, i.e., `a[[1,2,..],[3,4,..]]`
         | 
| 49 49 | 
             
                # (This method will be rewritten in C)
         | 
| 50 50 | 
             
                # @return [Numo::NArray] one-dimensional view of self.
         | 
| 51 51 | 
             
                # @example
         | 
| @@ -162,7 +162,7 @@ module Numo | |
| 162 162 | 
             
                def self.asarray(a)
         | 
| 163 163 | 
             
                  case a
         | 
| 164 164 | 
             
                  when NArray
         | 
| 165 | 
            -
                    a
         | 
| 165 | 
            +
                    (a.ndim == 0) ? a[:new] : a
         | 
| 166 166 | 
             
                  when Numeric,Range
         | 
| 167 167 | 
             
                    self[a]
         | 
| 168 168 | 
             
                  else
         | 
| @@ -170,6 +170,44 @@ module Numo | |
| 170 170 | 
             
                  end
         | 
| 171 171 | 
             
                end
         | 
| 172 172 |  | 
| 173 | 
            +
                # parse matrix like matlab, octave
         | 
| 174 | 
            +
                # @example
         | 
| 175 | 
            +
                #   a = Numo::DFloat.parse %[
         | 
| 176 | 
            +
                #    2 -3 5
         | 
| 177 | 
            +
                #    4 9 7
         | 
| 178 | 
            +
                #    2 -1 6
         | 
| 179 | 
            +
                #   ]
         | 
| 180 | 
            +
                #   => Numo::DFloat#shape=[3,3]
         | 
| 181 | 
            +
                #   [[2, -3, 5],
         | 
| 182 | 
            +
                #    [4, 9, 7],
         | 
| 183 | 
            +
                #    [2, -1, 6]]
         | 
| 184 | 
            +
             | 
| 185 | 
            +
                def self.parse(str, split1d:/\s+/, split2d:/;?$|;/,
         | 
| 186 | 
            +
                               split3d:/\s*\n(\s*\n)+/m)
         | 
| 187 | 
            +
                  a = []
         | 
| 188 | 
            +
                  str.split(split3d).each do |block|
         | 
| 189 | 
            +
                    b = []
         | 
| 190 | 
            +
                    #print "b"; p block
         | 
| 191 | 
            +
                    block.split(split2d).each do |line|
         | 
| 192 | 
            +
                      #p line
         | 
| 193 | 
            +
                      line.strip!
         | 
| 194 | 
            +
                      if !line.empty?
         | 
| 195 | 
            +
                        c = []
         | 
| 196 | 
            +
                        line.split(split1d).each do |item|
         | 
| 197 | 
            +
                          c << eval(item.strip) if !item.empty?
         | 
| 198 | 
            +
                        end
         | 
| 199 | 
            +
                        b << c if !c.empty?
         | 
| 200 | 
            +
                      end
         | 
| 201 | 
            +
                    end
         | 
| 202 | 
            +
                    a << b if !b.empty?
         | 
| 203 | 
            +
                  end
         | 
| 204 | 
            +
                  if a.size==1
         | 
| 205 | 
            +
                    self.cast(a[0])
         | 
| 206 | 
            +
                  else
         | 
| 207 | 
            +
                    self.cast(a)
         | 
| 208 | 
            +
                  end
         | 
| 209 | 
            +
                end
         | 
| 210 | 
            +
             | 
| 173 211 | 
             
                # Append values to the end of an narray.
         | 
| 174 212 | 
             
                # @example
         | 
| 175 213 | 
             
                #   a = Numo::DFloat[1, 2, 3]
         | 
| @@ -919,15 +957,305 @@ module Numo | |
| 919 957 | 
             
                  return result
         | 
| 920 958 | 
             
                end
         | 
| 921 959 |  | 
| 960 | 
            +
             | 
| 961 | 
            +
                # Upper triangular matrix.
         | 
| 962 | 
            +
                # Return a copy with the elements below the k-th diagonal filled with zero.
         | 
| 963 | 
            +
                def triu(k=0)
         | 
| 964 | 
            +
                  dup.triu!(k)
         | 
| 965 | 
            +
                end
         | 
| 966 | 
            +
             | 
| 967 | 
            +
                # Upper triangular matrix.
         | 
| 968 | 
            +
                # Fill the self elements below the k-th diagonal with zero.
         | 
| 969 | 
            +
                def triu!(k=0)
         | 
| 970 | 
            +
                  if ndim < 2
         | 
| 971 | 
            +
                    raise NArray::ShapeError, "must be >= 2-dimensional array"
         | 
| 972 | 
            +
                  end
         | 
| 973 | 
            +
                  if contiguous?
         | 
| 974 | 
            +
                    *shp,m,n = shape
         | 
| 975 | 
            +
                    idx = tril_indices(k-1)
         | 
| 976 | 
            +
                    reshape!(*shp,m*n)
         | 
| 977 | 
            +
                    self[false,idx] = 0
         | 
| 978 | 
            +
                    reshape!(*shp,m,n)
         | 
| 979 | 
            +
                  else
         | 
| 980 | 
            +
                    store(triu(k))
         | 
| 981 | 
            +
                  end
         | 
| 982 | 
            +
                end
         | 
| 983 | 
            +
             | 
| 984 | 
            +
                # Return the indices for the uppler-triangle on and above the k-th diagonal.
         | 
| 985 | 
            +
                def triu_indices(k=0)
         | 
| 986 | 
            +
                  if ndim < 2
         | 
| 987 | 
            +
                    raise NArray::ShapeError, "must be >= 2-dimensional array"
         | 
| 988 | 
            +
                  end
         | 
| 989 | 
            +
                  m,n = shape[-2..-1]
         | 
| 990 | 
            +
                  NArray.triu_indices(m,n,k=0)
         | 
| 991 | 
            +
                end
         | 
| 992 | 
            +
             | 
| 993 | 
            +
                # Return the indices for the uppler-triangle on and above the k-th diagonal.
         | 
| 994 | 
            +
                def self.triu_indices(m,n,k=0)
         | 
| 995 | 
            +
                  x = Numo::Int64.new(m,1).seq + k
         | 
| 996 | 
            +
                  y = Numo::Int64.new(1,n).seq
         | 
| 997 | 
            +
                  (x<=y).where
         | 
| 998 | 
            +
                end
         | 
| 999 | 
            +
             | 
| 1000 | 
            +
                # Lower triangular matrix.
         | 
| 1001 | 
            +
                # Return a copy with the elements above the k-th diagonal filled with zero.
         | 
| 1002 | 
            +
                def tril(k=0)
         | 
| 1003 | 
            +
                  dup.tril!(k)
         | 
| 1004 | 
            +
                end
         | 
| 1005 | 
            +
             | 
| 1006 | 
            +
                # Lower triangular matrix.
         | 
| 1007 | 
            +
                # Fill the self elements above the k-th diagonal with zero.
         | 
| 1008 | 
            +
                def tril!(k=0)
         | 
| 1009 | 
            +
                  if ndim < 2
         | 
| 1010 | 
            +
                    raise NArray::ShapeError, "must be >= 2-dimensional array"
         | 
| 1011 | 
            +
                  end
         | 
| 1012 | 
            +
                  if contiguous?
         | 
| 1013 | 
            +
                    idx = triu_indices(k+1)
         | 
| 1014 | 
            +
                    *shp,m,n = shape
         | 
| 1015 | 
            +
                    reshape!(*shp,m*n)
         | 
| 1016 | 
            +
                    self[false,idx] = 0
         | 
| 1017 | 
            +
                    reshape!(*shp,m,n)
         | 
| 1018 | 
            +
                  else
         | 
| 1019 | 
            +
                    store(tril(k))
         | 
| 1020 | 
            +
                  end
         | 
| 1021 | 
            +
                end
         | 
| 1022 | 
            +
             | 
| 1023 | 
            +
                # Return the indices for the lower-triangle on and below the k-th diagonal.
         | 
| 1024 | 
            +
                def tril_indices(k=0)
         | 
| 1025 | 
            +
                  if ndim < 2
         | 
| 1026 | 
            +
                    raise NArray::ShapeError, "must be >= 2-dimensional array"
         | 
| 1027 | 
            +
                  end
         | 
| 1028 | 
            +
                  m,n = shape[-2..-1]
         | 
| 1029 | 
            +
                  NArray.tril_indices(m,n,k)
         | 
| 1030 | 
            +
                end
         | 
| 1031 | 
            +
             | 
| 1032 | 
            +
                # Return the indices for the lower-triangle on and below the k-th diagonal.
         | 
| 1033 | 
            +
                def self.tril_indices(m,n,k=0)
         | 
| 1034 | 
            +
                  x = Numo::Int64.new(m,1).seq + k
         | 
| 1035 | 
            +
                  y = Numo::Int64.new(1,n).seq
         | 
| 1036 | 
            +
                  (x>=y).where
         | 
| 1037 | 
            +
                end
         | 
| 1038 | 
            +
             | 
| 1039 | 
            +
                # Return the k-th diagonal indices.
         | 
| 1040 | 
            +
                def diag_indices(k=0)
         | 
| 1041 | 
            +
                  if ndim < 2
         | 
| 1042 | 
            +
                    raise NArray::ShapeError, "must be >= 2-dimensional array"
         | 
| 1043 | 
            +
                  end
         | 
| 1044 | 
            +
                  m,n = shape[-2..-1]
         | 
| 1045 | 
            +
                  NArray.diag_indices(m,n,k)
         | 
| 1046 | 
            +
                end
         | 
| 1047 | 
            +
             | 
| 1048 | 
            +
                # Return the k-th diagonal indices.
         | 
| 1049 | 
            +
                def self.diag_indices(m,n,k=0)
         | 
| 1050 | 
            +
                  x = Numo::Int64.new(m,1).seq + k
         | 
| 1051 | 
            +
                  y = Numo::Int64.new(1,n).seq
         | 
| 1052 | 
            +
                  (x.eq y).where
         | 
| 1053 | 
            +
                end
         | 
| 1054 | 
            +
             | 
| 1055 | 
            +
                # Return a matrix whose diagonal is constructed by self along the last axis.
         | 
| 1056 | 
            +
                def diag(k=0)
         | 
| 1057 | 
            +
                  *shp,n = shape
         | 
| 1058 | 
            +
                  n += k.abs
         | 
| 1059 | 
            +
                  a = self.class.zeros(*shp,n,n)
         | 
| 1060 | 
            +
                  a.diagonal(k).store(self)
         | 
| 1061 | 
            +
                  a
         | 
| 1062 | 
            +
                end
         | 
| 1063 | 
            +
             | 
| 1064 | 
            +
                # Return the sum along diagonals of the array.
         | 
| 1065 | 
            +
                #
         | 
| 1066 | 
            +
                # If 2-D array, computes the summation along its diagonal with the
         | 
| 1067 | 
            +
                # given offset, i.e., sum of `a[i,i+offset]`.
         | 
| 1068 | 
            +
                # If more than 2-D array, the diagonal is determined from the axes
         | 
| 1069 | 
            +
                # specified by axis argument. The default is axis=[-2,-1].
         | 
| 1070 | 
            +
                # @param offset [Integer] (optional, default=0) diagonal offset
         | 
| 1071 | 
            +
                # @param axis [Array] (optional, default=[-2,-1]) diagonal axis
         | 
| 1072 | 
            +
                # @param nan [Bool] (optional, default=false) nan-aware algorithm, i.e., if true then it ignores nan.
         | 
| 1073 | 
            +
             | 
| 1074 | 
            +
                def trace(offset=nil,axis=nil,nan:false)
         | 
| 1075 | 
            +
                  diagonal(offset,axis).sum(nan:nan,axis:-1)
         | 
| 1076 | 
            +
                end
         | 
| 1077 | 
            +
             | 
| 1078 | 
            +
             | 
| 1079 | 
            +
                @@warn_slow_dot = false
         | 
| 1080 | 
            +
             | 
| 1081 | 
            +
                # Dot product of two arrays.
         | 
| 1082 | 
            +
                # @param b [Numo::NArray]
         | 
| 1083 | 
            +
                # @return [Numo::NArray]  return dot product
         | 
| 1084 | 
            +
             | 
| 1085 | 
            +
                def dot(b)
         | 
| 1086 | 
            +
                  t = self.class::UPCAST[b.class]
         | 
| 1087 | 
            +
                  if defined?(Linalg) && [SFloat,DFloat,SComplex,DComplex].include?(t)
         | 
| 1088 | 
            +
                    Linalg.dot(self,b)
         | 
| 1089 | 
            +
                  else
         | 
| 1090 | 
            +
                    b = self.class.asarray(b)
         | 
| 1091 | 
            +
                    case b.ndim
         | 
| 1092 | 
            +
                    when 1
         | 
| 1093 | 
            +
                      mulsum(b, axis:-1)
         | 
| 1094 | 
            +
                    else
         | 
| 1095 | 
            +
                      case ndim
         | 
| 1096 | 
            +
                      when 0
         | 
| 1097 | 
            +
                        b.mulsum(self, axis:-2)
         | 
| 1098 | 
            +
                      when 1
         | 
| 1099 | 
            +
                        self[true,:new].mulsum(b, axis:-2)
         | 
| 1100 | 
            +
                      else
         | 
| 1101 | 
            +
                        unless @@warn_slow_dot
         | 
| 1102 | 
            +
                          nx = 200
         | 
| 1103 | 
            +
                          ns = 200000
         | 
| 1104 | 
            +
                          am,an = shape[-2..-1]
         | 
| 1105 | 
            +
                          bm,bn = b.shape[-2..-1]
         | 
| 1106 | 
            +
                          if am > nx && an > nx && bm > nx && bn > nx &&
         | 
| 1107 | 
            +
                              size > ns && b.size > ns
         | 
| 1108 | 
            +
                            @@warn_slow_dot = true
         | 
| 1109 | 
            +
                            warn "\nwarning: Built-in matrix dot is slow. Consider installing Numo::Linalg.\n\n"
         | 
| 1110 | 
            +
                          end
         | 
| 1111 | 
            +
                        end
         | 
| 1112 | 
            +
                        self[false,:new].mulsum(b[false,:new,true,true], axis:-2)
         | 
| 1113 | 
            +
                      end
         | 
| 1114 | 
            +
                    end
         | 
| 1115 | 
            +
                  end
         | 
| 1116 | 
            +
                end
         | 
| 1117 | 
            +
             | 
| 1118 | 
            +
                # Inner product of two arrays.
         | 
| 1119 | 
            +
                # Same as `(a*b).sum(axis:-1)`.
         | 
| 1120 | 
            +
                # @param b [Numo::NArray]
         | 
| 1121 | 
            +
                # @param axis [Integer] applied axis
         | 
| 1122 | 
            +
                # @return [Numo::NArray]  return (a*b).sum(axis:axis)
         | 
| 1123 | 
            +
             | 
| 1124 | 
            +
                def inner(b, axis:-1)
         | 
| 1125 | 
            +
                  mulsum(b, axis:axis)
         | 
| 1126 | 
            +
                end
         | 
| 1127 | 
            +
             | 
| 1128 | 
            +
                # Outer product of two arrays.
         | 
| 1129 | 
            +
                # Same as `self[false,:new] * b[false,:new,true]`.
         | 
| 1130 | 
            +
                #
         | 
| 1131 | 
            +
                # @param b [Numo::NArray]
         | 
| 1132 | 
            +
                # @param axis [Integer] applied axis (default=-1)
         | 
| 1133 | 
            +
                # @return [Numo::NArray]  return outer product
         | 
| 1134 | 
            +
                # @example
         | 
| 1135 | 
            +
                #   a = Numo::DFloat.ones(5)
         | 
| 1136 | 
            +
                #   => Numo::DFloat#shape=[5]
         | 
| 1137 | 
            +
                #   [1, 1, 1, 1, 1]
         | 
| 1138 | 
            +
                #   b = Numo::DFloat.linspace(-2,2,5)
         | 
| 1139 | 
            +
                #   => Numo::DFloat#shape=[5]
         | 
| 1140 | 
            +
                #   [-2, -1, 0, 1, 2]
         | 
| 1141 | 
            +
                #   a.outer(b)
         | 
| 1142 | 
            +
                #   => Numo::DFloat#shape=[5,5]
         | 
| 1143 | 
            +
                #   [[-2, -1, 0, 1, 2],
         | 
| 1144 | 
            +
                #    [-2, -1, 0, 1, 2],
         | 
| 1145 | 
            +
                #    [-2, -1, 0, 1, 2],
         | 
| 1146 | 
            +
                #    [-2, -1, 0, 1, 2],
         | 
| 1147 | 
            +
                #    [-2, -1, 0, 1, 2]]
         | 
| 1148 | 
            +
             | 
| 1149 | 
            +
                def outer(b, axis:nil)
         | 
| 1150 | 
            +
                  b = NArray.cast(b)
         | 
| 1151 | 
            +
                  if axis.nil?
         | 
| 1152 | 
            +
                    self[false,:new] * ((b.ndim==0) ? b : b[false,:new,true])
         | 
| 1153 | 
            +
                  else
         | 
| 1154 | 
            +
                    md,nd = [ndim,b.ndim].minmax
         | 
| 1155 | 
            +
                    axis = check_axis(axis) - nd
         | 
| 1156 | 
            +
                    if axis < -md
         | 
| 1157 | 
            +
                      raise ArgumentError,"axis=#{axis} is out of range"
         | 
| 1158 | 
            +
                    end
         | 
| 1159 | 
            +
                    adim = [true]*ndim
         | 
| 1160 | 
            +
                    adim[axis+ndim+1,0] = :new
         | 
| 1161 | 
            +
                    bdim = [true]*b.ndim
         | 
| 1162 | 
            +
                    bdim[axis+b.ndim,0] = :new
         | 
| 1163 | 
            +
                    self[*adim] * b[*bdim]
         | 
| 1164 | 
            +
                  end
         | 
| 1165 | 
            +
                end
         | 
| 1166 | 
            +
             | 
| 1167 | 
            +
                # Kronecker product of two arrays.
         | 
| 1168 | 
            +
                #
         | 
| 1169 | 
            +
                #     kron(a,b)[k_0, k_1, ...] = a[i_0, i_1, ...] * b[j_0, j_1, ...]
         | 
| 1170 | 
            +
                #        where:  k_n = i_n * b.shape[n] + j_n
         | 
| 1171 | 
            +
                #
         | 
| 1172 | 
            +
                # @param b [Numo::NArray]
         | 
| 1173 | 
            +
                # @return [Numo::NArray]  return Kronecker product
         | 
| 1174 | 
            +
                # @example
         | 
| 1175 | 
            +
                #   Numo::DFloat[1,10,100].kron([5,6,7])
         | 
| 1176 | 
            +
                #   => Numo::DFloat#shape=[9]
         | 
| 1177 | 
            +
                #   [5, 6, 7, 50, 60, 70, 500, 600, 700]
         | 
| 1178 | 
            +
                #   Numo::DFloat[5,6,7].kron([1,10,100])
         | 
| 1179 | 
            +
                #   => Numo::DFloat#shape=[9]
         | 
| 1180 | 
            +
                #   [5, 50, 500, 6, 60, 600, 7, 70, 700]
         | 
| 1181 | 
            +
                #   Numo::DFloat.eye(2).kron(Numo::DFloat.ones(2,2))
         | 
| 1182 | 
            +
                #   => Numo::DFloat#shape=[4,4]
         | 
| 1183 | 
            +
                #   [[1, 1, 0, 0],
         | 
| 1184 | 
            +
                #    [1, 1, 0, 0],
         | 
| 1185 | 
            +
                #    [0, 0, 1, 1],
         | 
| 1186 | 
            +
                #    [0, 0, 1, 1]]
         | 
| 1187 | 
            +
             | 
| 1188 | 
            +
                def kron(b)
         | 
| 1189 | 
            +
                  b = NArray.cast(b)
         | 
| 1190 | 
            +
                  nda = ndim
         | 
| 1191 | 
            +
                  ndb = b.ndim
         | 
| 1192 | 
            +
                  shpa = shape
         | 
| 1193 | 
            +
                  shpb = b.shape
         | 
| 1194 | 
            +
                  adim = [:new]*(2*[ndb-nda,0].max) + [true,:new]*nda
         | 
| 1195 | 
            +
                  bdim = [:new]*(2*[nda-ndb,0].max) + [:new,true]*ndb
         | 
| 1196 | 
            +
                  shpr = (-[nda,ndb].max..-1).map{|i| (shpa[i]||1) * (shpb[i]||1)}
         | 
| 1197 | 
            +
                  (self[*adim] * b[*bdim]).reshape(*shpr)
         | 
| 1198 | 
            +
                end
         | 
| 1199 | 
            +
             | 
| 1200 | 
            +
             | 
| 1201 | 
            +
                # under construction
         | 
| 1202 | 
            +
                def cov(y=nil, ddof:1, fweights:nil, aweights:nil)
         | 
| 1203 | 
            +
                  if y
         | 
| 1204 | 
            +
                    m = NArray.vstack([self,y])
         | 
| 1205 | 
            +
                  else
         | 
| 1206 | 
            +
                    m = self
         | 
| 1207 | 
            +
                  end
         | 
| 1208 | 
            +
                  w = nil
         | 
| 1209 | 
            +
                  if fweights
         | 
| 1210 | 
            +
                    f = fweights
         | 
| 1211 | 
            +
                    w = f
         | 
| 1212 | 
            +
                  end
         | 
| 1213 | 
            +
                  if aweights
         | 
| 1214 | 
            +
                    a = aweights
         | 
| 1215 | 
            +
                    w = w ? w*a : a
         | 
| 1216 | 
            +
                  end
         | 
| 1217 | 
            +
                  if w
         | 
| 1218 | 
            +
                    w_sum = w.sum(axis:-1, keepdims:true)
         | 
| 1219 | 
            +
                    if ddof == 0
         | 
| 1220 | 
            +
                      fact = w_sum
         | 
| 1221 | 
            +
                    elsif aweights.nil?
         | 
| 1222 | 
            +
                      fact = w_sum - ddof
         | 
| 1223 | 
            +
                    else
         | 
| 1224 | 
            +
                      wa_sum = (w*a).sum(axis:-1, keepdims:true)
         | 
| 1225 | 
            +
                      fact = w_sum - ddof * wa_sum / w_sum
         | 
| 1226 | 
            +
                    end
         | 
| 1227 | 
            +
                    if (fact <= 0).any?
         | 
| 1228 | 
            +
                      raise StandardError,"Degrees of freedom <= 0 for slice"
         | 
| 1229 | 
            +
                    end
         | 
| 1230 | 
            +
                  else
         | 
| 1231 | 
            +
                    fact = m.shape[-1] - ddof
         | 
| 1232 | 
            +
                  end
         | 
| 1233 | 
            +
                  if w
         | 
| 1234 | 
            +
                    m -= (m*w).sum(axis:-1, keepdims:true) / w_sum
         | 
| 1235 | 
            +
                    mw = m*w
         | 
| 1236 | 
            +
                  else
         | 
| 1237 | 
            +
                    m -= m.mean(axis:-1, keepdims:true)
         | 
| 1238 | 
            +
                    mw = m
         | 
| 1239 | 
            +
                  end
         | 
| 1240 | 
            +
                  mt = (m.ndim < 2) ? m : m.swapaxes(-2,-1)
         | 
| 1241 | 
            +
                  mw.dot(mt.conj) / fact
         | 
| 1242 | 
            +
                end
         | 
| 1243 | 
            +
             | 
| 922 1244 | 
             
                private
         | 
| 1245 | 
            +
             | 
| 1246 | 
            +
                # @!visibility private
         | 
| 923 1247 | 
             
                def check_axis(axis)
         | 
| 924 | 
            -
                   | 
| 925 | 
            -
                    axis  | 
| 1248 | 
            +
                  unless Integer===axis
         | 
| 1249 | 
            +
                    raise ArgumentError,"axis=#{axis} must be Integer"
         | 
| 926 1250 | 
             
                  end
         | 
| 927 | 
            -
                   | 
| 928 | 
            -
             | 
| 1251 | 
            +
                  a = axis
         | 
| 1252 | 
            +
                  if a < 0
         | 
| 1253 | 
            +
                    a += ndim
         | 
| 1254 | 
            +
                  end
         | 
| 1255 | 
            +
                  if a < 0 || a >= ndim
         | 
| 1256 | 
            +
                    raise ArgumentError,"axis=#{axis} is invalid"
         | 
| 929 1257 | 
             
                  end
         | 
| 930 | 
            -
                   | 
| 1258 | 
            +
                  a
         | 
| 931 1259 | 
             
                end
         | 
| 932 1260 |  | 
| 933 1261 | 
             
              end
         | 
    
        data/numo-narray.gemspec
    CHANGED
    
    | @@ -19,7 +19,7 @@ Gem::Specification.new do |spec| | |
| 19 19 | 
             
              spec.description   = %q{Numo::NArray - New NArray class library in Ruby/Numo.}
         | 
| 20 20 | 
             
              spec.summary       = %q{alpha release of Numo::NArray - New NArray class library in Ruby/Numo (NUmerical MOdule)}
         | 
| 21 21 | 
             
              spec.homepage      = "https://github.com/ruby-numo/narray"
         | 
| 22 | 
            -
              spec.license       = " | 
| 22 | 
            +
              spec.license       = "BSD-3-Clause"
         | 
| 23 23 | 
             
              spec.required_ruby_version = '~> 2.1'
         | 
| 24 24 |  | 
| 25 25 | 
             
              spec.files         = `git ls-files Gemfile README.md Rakefile lib ext numo-narray.gemspec spec`.split($/)
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: numo-narray
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.9.0. | 
| 4 | 
            +
              version: 0.9.0.7
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Masahiro TANAKA
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2017- | 
| 11 | 
            +
            date: 2017-05-28 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -204,7 +204,6 @@ files: | |
| 204 204 | 
             
            - ext/numo/narray/gen/tmpl_bit/where.c
         | 
| 205 205 | 
             
            - ext/numo/narray/gen/tmpl_bit/where2.c
         | 
| 206 206 | 
             
            - ext/numo/narray/index.c
         | 
| 207 | 
            -
            - ext/numo/narray/kwarg.c
         | 
| 208 207 | 
             
            - ext/numo/narray/math.c
         | 
| 209 208 | 
             
            - ext/numo/narray/narray.c
         | 
| 210 209 | 
             
            - ext/numo/narray/ndloop.c
         | 
| @@ -249,7 +248,7 @@ files: | |
| 249 248 | 
             
            - spec/narray_spec.rb
         | 
| 250 249 | 
             
            homepage: https://github.com/ruby-numo/narray
         | 
| 251 250 | 
             
            licenses:
         | 
| 252 | 
            -
            -  | 
| 251 | 
            +
            - BSD-3-Clause
         | 
| 253 252 | 
             
            metadata: {}
         | 
| 254 253 | 
             
            post_install_message: 
         | 
| 255 254 | 
             
            rdoc_options: []
         | 
    
        data/ext/numo/narray/kwarg.c
    DELETED
    
    | @@ -1,74 +0,0 @@ | |
| 1 | 
            -
            /*
         | 
| 2 | 
            -
               kwarg.c : Process keyword arguments for Ruby
         | 
| 3 | 
            -
             | 
| 4 | 
            -
               Copyright (c) 2001 Masahiro TANAKA
         | 
| 5 | 
            -
            */
         | 
| 6 | 
            -
            #include <ruby.h>
         | 
| 7 | 
            -
            #include "numo/compat.h"
         | 
| 8 | 
            -
             | 
| 9 | 
            -
            /* void rb_scan_kw_args __((VALUE, ...)); */
         | 
| 10 | 
            -
             | 
| 11 | 
            -
            static VALUE
         | 
| 12 | 
            -
            kw_hash_i(i, tmp)
         | 
| 13 | 
            -
                 VALUE i, tmp;
         | 
| 14 | 
            -
            {
         | 
| 15 | 
            -
                VALUE key;
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                key = RARRAY_AREF(i,0);
         | 
| 18 | 
            -
                if (TYPE(key)==T_SYMBOL) {
         | 
| 19 | 
            -
            	key = rb_funcall(key, rb_intern("id2name"), 0);
         | 
| 20 | 
            -
                } else
         | 
| 21 | 
            -
            	if (TYPE(key)!=T_STRING) {
         | 
| 22 | 
            -
            	    rb_raise(rb_eArgError, "keywords must be String or Symbol");
         | 
| 23 | 
            -
            	}
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                rb_hash_aset(tmp, key, RARRAY_AREF(i,1));
         | 
| 26 | 
            -
                return Qnil;
         | 
| 27 | 
            -
            }
         | 
| 28 | 
            -
             | 
| 29 | 
            -
            #ifdef HAVE_STDARG_PROTOTYPES
         | 
| 30 | 
            -
            #include <stdarg.h>
         | 
| 31 | 
            -
            #define va_init_list(a,b) va_start(a,b)
         | 
| 32 | 
            -
            #else
         | 
| 33 | 
            -
            #include <varargs.h>
         | 
| 34 | 
            -
            #define va_init_list(a,b) va_start(a)
         | 
| 35 | 
            -
            #endif
         | 
| 36 | 
            -
             | 
| 37 | 
            -
            void
         | 
| 38 | 
            -
            #ifdef HAVE_STDARG_PROTOTYPES
         | 
| 39 | 
            -
            rb_scan_kw_args(VALUE hash, ...)
         | 
| 40 | 
            -
            #else
         | 
| 41 | 
            -
            rb_scan_kw_args(hash, va_alist)
         | 
| 42 | 
            -
                VALUE hash;
         | 
| 43 | 
            -
                va_dcl
         | 
| 44 | 
            -
            #endif
         | 
| 45 | 
            -
            {
         | 
| 46 | 
            -
                va_list vargs;
         | 
| 47 | 
            -
                va_init_list(vargs, hash);
         | 
| 48 | 
            -
             | 
| 49 | 
            -
                char *key;
         | 
| 50 | 
            -
                VALUE *var, val, str, tmp;
         | 
| 51 | 
            -
             | 
| 52 | 
            -
                tmp = rb_hash_new();
         | 
| 53 | 
            -
                if (TYPE(hash) == T_HASH)
         | 
| 54 | 
            -
            	rb_iterate(rb_each, hash, kw_hash_i, tmp);
         | 
| 55 | 
            -
                else if (hash != Qnil)
         | 
| 56 | 
            -
            	rb_fatal("rb_san_kw_args: non-hash arg passed");
         | 
| 57 | 
            -
             | 
| 58 | 
            -
                for (;;) {
         | 
| 59 | 
            -
            	key = va_arg(vargs, char*);
         | 
| 60 | 
            -
            	if (!key) break;
         | 
| 61 | 
            -
            	var = va_arg(vargs, VALUE*);
         | 
| 62 | 
            -
            	//printf("i=%d key=%x, val=%x\n",i,key,val);
         | 
| 63 | 
            -
            	str = rb_str_new2(key);
         | 
| 64 | 
            -
            	val = rb_funcall(tmp, rb_intern("delete"), 1, str);
         | 
| 65 | 
            -
            	if (var) *var = val;
         | 
| 66 | 
            -
                }
         | 
| 67 | 
            -
                va_end(vargs);
         | 
| 68 | 
            -
             | 
| 69 | 
            -
                if (rb_funcall(tmp, rb_intern("empty?"), 0)==Qfalse) {
         | 
| 70 | 
            -
            	val = rb_funcall(tmp, rb_intern("keys"), 0);
         | 
| 71 | 
            -
            	val = rb_funcall(val, rb_intern("join"), 1, rb_str_new2(","));
         | 
| 72 | 
            -
            	rb_raise(rb_eArgError, "unknown keywords: %s",StringValueCStr(val));
         | 
| 73 | 
            -
                }
         | 
| 74 | 
            -
            }
         |