numo-narray 0.9.0.1-x64-mingw32 → 0.9.0.3-x64-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 +20 -5
 - 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
 
| 
         @@ -0,0 +1,32 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            /*
         
     | 
| 
      
 2 
     | 
    
         
            +
              Store elements to Numo::<%=class_name%> from other.
         
     | 
| 
      
 3 
     | 
    
         
            +
              @overload store(other)
         
     | 
| 
      
 4 
     | 
    
         
            +
              @param [Object] other
         
     | 
| 
      
 5 
     | 
    
         
            +
              @return [Numo::<%=class_name%>] self
         
     | 
| 
      
 6 
     | 
    
         
            +
            */
         
     | 
| 
      
 7 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 8 
     | 
    
         
            +
            <%=c_func%>(VALUE self, VALUE obj)
         
     | 
| 
      
 9 
     | 
    
         
            +
            {
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                VALUE r;
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                <% Store.definitions.each do |x| %>
         
     | 
| 
      
 14 
     | 
    
         
            +
                if (<%=x.condition%>) {
         
     | 
| 
      
 15 
     | 
    
         
            +
                    <%=x.c_func%>(self,obj);
         
     | 
| 
      
 16 
     | 
    
         
            +
                    return self;
         
     | 
| 
      
 17 
     | 
    
         
            +
                }
         
     | 
| 
      
 18 
     | 
    
         
            +
                <% end %>
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                if (IsNArray(obj)) {
         
     | 
| 
      
 21 
     | 
    
         
            +
                    r = rb_funcall(obj, rb_intern("coerce_cast"), 1, cT);
         
     | 
| 
      
 22 
     | 
    
         
            +
                    if (CLASS_OF(r)==cT) {
         
     | 
| 
      
 23 
     | 
    
         
            +
                        <%=c_func%>(self,r);
         
     | 
| 
      
 24 
     | 
    
         
            +
                        return self;
         
     | 
| 
      
 25 
     | 
    
         
            +
                    }
         
     | 
| 
      
 26 
     | 
    
         
            +
                }
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                rb_raise(nary_eCastError, "unknown conversion from %s to %s",
         
     | 
| 
      
 29 
     | 
    
         
            +
                         rb_class2name(CLASS_OF(obj)),
         
     | 
| 
      
 30 
     | 
    
         
            +
                         rb_class2name(CLASS_OF(self)));
         
     | 
| 
      
 31 
     | 
    
         
            +
                return self;
         
     | 
| 
      
 32 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -0,0 +1,66 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            static void
         
     | 
| 
      
 2 
     | 
    
         
            +
            <%=c_iter%>(na_loop_t *const lp)
         
     | 
| 
      
 3 
     | 
    
         
            +
            {
         
     | 
| 
      
 4 
     | 
    
         
            +
                size_t  n;
         
     | 
| 
      
 5 
     | 
    
         
            +
                size_t  p1, p3;
         
     | 
| 
      
 6 
     | 
    
         
            +
                ssize_t s1, s3;
         
     | 
| 
      
 7 
     | 
    
         
            +
                size_t *idx1, *idx3;
         
     | 
| 
      
 8 
     | 
    
         
            +
                int     o1, l1, r1, len;
         
     | 
| 
      
 9 
     | 
    
         
            +
                BIT_DIGIT *a1, *a3;
         
     | 
| 
      
 10 
     | 
    
         
            +
                BIT_DIGIT  x;
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                INIT_COUNTER(lp, n);
         
     | 
| 
      
 13 
     | 
    
         
            +
                INIT_PTR_BIT_IDX(lp, 0, a3, p3, s3, idx3);
         
     | 
| 
      
 14 
     | 
    
         
            +
                INIT_PTR_BIT_IDX(lp, 1, a1, p1, s1, idx1);
         
     | 
| 
      
 15 
     | 
    
         
            +
                if (s1!=1 || s3!=1 || idx1 || idx3) {
         
     | 
| 
      
 16 
     | 
    
         
            +
                    for (; n--;) {
         
     | 
| 
      
 17 
     | 
    
         
            +
                        LOAD_BIT_STEP(a1, p1, s1, idx1, x);
         
     | 
| 
      
 18 
     | 
    
         
            +
                        STORE_BIT_STEP(a3, p3, s3, idx3, x);
         
     | 
| 
      
 19 
     | 
    
         
            +
                    }
         
     | 
| 
      
 20 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 21 
     | 
    
         
            +
                    o1 =  p1 % NB;
         
     | 
| 
      
 22 
     | 
    
         
            +
                    o1 -= p3;
         
     | 
| 
      
 23 
     | 
    
         
            +
                    l1 =  NB+o1;
         
     | 
| 
      
 24 
     | 
    
         
            +
                    r1 =  NB-o1;
         
     | 
| 
      
 25 
     | 
    
         
            +
                    if (p3>0 || n<NB) {
         
     | 
| 
      
 26 
     | 
    
         
            +
                        len = NB - p3;
         
     | 
| 
      
 27 
     | 
    
         
            +
                        if ((int)n<len) len=n;
         
     | 
| 
      
 28 
     | 
    
         
            +
                        if (o1>=0) x = *a1>>o1;
         
     | 
| 
      
 29 
     | 
    
         
            +
                        else       x = *a1<<-o1;
         
     | 
| 
      
 30 
     | 
    
         
            +
                        if (p1+len>NB)  x |= *(a1+1)<<r1;
         
     | 
| 
      
 31 
     | 
    
         
            +
                        a1++;
         
     | 
| 
      
 32 
     | 
    
         
            +
                        *a3 = (x & (SLB(len)<<p3)) | (*a3 & ~(SLB(len)<<p3));
         
     | 
| 
      
 33 
     | 
    
         
            +
                        a3++;
         
     | 
| 
      
 34 
     | 
    
         
            +
                        n -= len;
         
     | 
| 
      
 35 
     | 
    
         
            +
                    }
         
     | 
| 
      
 36 
     | 
    
         
            +
                    if (o1==0) {
         
     | 
| 
      
 37 
     | 
    
         
            +
                        for (; n>=NB; n-=NB) {
         
     | 
| 
      
 38 
     | 
    
         
            +
                            x = *(a1++);
         
     | 
| 
      
 39 
     | 
    
         
            +
                            *(a3++) = x;
         
     | 
| 
      
 40 
     | 
    
         
            +
                        }
         
     | 
| 
      
 41 
     | 
    
         
            +
                    } else {
         
     | 
| 
      
 42 
     | 
    
         
            +
                        for (; n>=NB; n-=NB) {
         
     | 
| 
      
 43 
     | 
    
         
            +
                            x = *a1>>o1;
         
     | 
| 
      
 44 
     | 
    
         
            +
                            if (o1<0)  x |= *(a1-1)>>l1;
         
     | 
| 
      
 45 
     | 
    
         
            +
                            if (o1>0)  x |= *(a1+1)<<r1;
         
     | 
| 
      
 46 
     | 
    
         
            +
                            a1++;
         
     | 
| 
      
 47 
     | 
    
         
            +
                            *(a3++) = x;
         
     | 
| 
      
 48 
     | 
    
         
            +
                        }
         
     | 
| 
      
 49 
     | 
    
         
            +
                    }
         
     | 
| 
      
 50 
     | 
    
         
            +
                    if (n>0) {
         
     | 
| 
      
 51 
     | 
    
         
            +
                        x = *a1>>o1;
         
     | 
| 
      
 52 
     | 
    
         
            +
                        if (o1<0)  x |= *(a1-1)>>l1;
         
     | 
| 
      
 53 
     | 
    
         
            +
                        *a3 = (x & SLB(n)) | (*a3 & BALL<<n);
         
     | 
| 
      
 54 
     | 
    
         
            +
                    }
         
     | 
| 
      
 55 
     | 
    
         
            +
                }
         
     | 
| 
      
 56 
     | 
    
         
            +
            }
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 59 
     | 
    
         
            +
            <%=c_func%>(VALUE self, VALUE obj)
         
     | 
| 
      
 60 
     | 
    
         
            +
            {
         
     | 
| 
      
 61 
     | 
    
         
            +
                ndfunc_arg_in_t ain[2] = {{OVERWRITE,0},{Qnil,0}};
         
     | 
| 
      
 62 
     | 
    
         
            +
                ndfunc_t ndf = {<%=c_iter%>, FULL_LOOP, 2,0, ain,0};
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                na_ndloop(&ndf, 2, self, obj);
         
     | 
| 
      
 65 
     | 
    
         
            +
                return self;
         
     | 
| 
      
 66 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -0,0 +1,56 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            static void
         
     | 
| 
      
 2 
     | 
    
         
            +
            <%=c_iter%>(na_loop_t *const lp)
         
     | 
| 
      
 3 
     | 
    
         
            +
            {
         
     | 
| 
      
 4 
     | 
    
         
            +
                ssize_t  i, s1, s2;
         
     | 
| 
      
 5 
     | 
    
         
            +
                size_t   p1;
         
     | 
| 
      
 6 
     | 
    
         
            +
                char    *p2;
         
     | 
| 
      
 7 
     | 
    
         
            +
                size_t  *idx1, *idx2;
         
     | 
| 
      
 8 
     | 
    
         
            +
                <%=dtype%> x;
         
     | 
| 
      
 9 
     | 
    
         
            +
                BIT_DIGIT *a1;
         
     | 
| 
      
 10 
     | 
    
         
            +
                BIT_DIGIT  y;
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                INIT_COUNTER(lp, i);
         
     | 
| 
      
 13 
     | 
    
         
            +
                INIT_PTR_BIT_IDX(lp, 0, a1, p1, s1, idx1);
         
     | 
| 
      
 14 
     | 
    
         
            +
                INIT_PTR_IDX(lp, 1, p2, s2, idx2);
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                if (idx2) {
         
     | 
| 
      
 17 
     | 
    
         
            +
                    if (idx1) {
         
     | 
| 
      
 18 
     | 
    
         
            +
                        for (; i--;) {
         
     | 
| 
      
 19 
     | 
    
         
            +
                            GET_DATA_INDEX(p2,idx2,<%=dtype%>,x);
         
     | 
| 
      
 20 
     | 
    
         
            +
                            y = <%=macro%>(x);
         
     | 
| 
      
 21 
     | 
    
         
            +
                            STORE_BIT(a1, p1+*idx1, y); idx1++;
         
     | 
| 
      
 22 
     | 
    
         
            +
                        }
         
     | 
| 
      
 23 
     | 
    
         
            +
                    } else {
         
     | 
| 
      
 24 
     | 
    
         
            +
                        for (; i--;) {
         
     | 
| 
      
 25 
     | 
    
         
            +
                            GET_DATA_INDEX(p2,idx2,<%=dtype%>,x);
         
     | 
| 
      
 26 
     | 
    
         
            +
                            y = <%=macro%>(x);
         
     | 
| 
      
 27 
     | 
    
         
            +
                            STORE_BIT(a1, p1, y); p1+=s1;
         
     | 
| 
      
 28 
     | 
    
         
            +
                        }
         
     | 
| 
      
 29 
     | 
    
         
            +
                    }
         
     | 
| 
      
 30 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 31 
     | 
    
         
            +
                    if (idx1) {
         
     | 
| 
      
 32 
     | 
    
         
            +
                        for (; i--;) {
         
     | 
| 
      
 33 
     | 
    
         
            +
                            GET_DATA_STRIDE(p2,s2,<%=dtype%>,x);
         
     | 
| 
      
 34 
     | 
    
         
            +
                            y = <%=macro%>(x);
         
     | 
| 
      
 35 
     | 
    
         
            +
                            STORE_BIT(a1, p1+*idx1, y); idx1++;
         
     | 
| 
      
 36 
     | 
    
         
            +
                        }
         
     | 
| 
      
 37 
     | 
    
         
            +
                    } else {
         
     | 
| 
      
 38 
     | 
    
         
            +
                        for (; i--;) {
         
     | 
| 
      
 39 
     | 
    
         
            +
                            GET_DATA_STRIDE(p2,s2,<%=dtype%>,x);
         
     | 
| 
      
 40 
     | 
    
         
            +
                            y = <%=macro%>(x);
         
     | 
| 
      
 41 
     | 
    
         
            +
                            STORE_BIT(a1, p1, y); p1+=s1;
         
     | 
| 
      
 42 
     | 
    
         
            +
                        }
         
     | 
| 
      
 43 
     | 
    
         
            +
                    }
         
     | 
| 
      
 44 
     | 
    
         
            +
                }
         
     | 
| 
      
 45 
     | 
    
         
            +
            }
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 49 
     | 
    
         
            +
            <%=c_func%>(VALUE self, VALUE obj)
         
     | 
| 
      
 50 
     | 
    
         
            +
            {
         
     | 
| 
      
 51 
     | 
    
         
            +
                ndfunc_arg_in_t ain[2] = {{OVERWRITE,0},{Qnil,0}};
         
     | 
| 
      
 52 
     | 
    
         
            +
                ndfunc_t ndf = {<%=c_iter%>, FULL_LOOP, 2,0, ain,0};
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                na_ndloop(&ndf, 2, self, obj);
         
     | 
| 
      
 55 
     | 
    
         
            +
                return self;
         
     | 
| 
      
 56 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -0,0 +1,22 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 2 
     | 
    
         
            +
            numo_<%=tp%>_new_dim0(dtype x)
         
     | 
| 
      
 3 
     | 
    
         
            +
            {
         
     | 
| 
      
 4 
     | 
    
         
            +
                VALUE v;
         
     | 
| 
      
 5 
     | 
    
         
            +
                dtype *ptr;
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                v = rb_narray_new(cT, 0, NULL);
         
     | 
| 
      
 8 
     | 
    
         
            +
                ptr = (dtype*)(char*)na_get_pointer_for_write(v);
         
     | 
| 
      
 9 
     | 
    
         
            +
                *ptr = x;
         
     | 
| 
      
 10 
     | 
    
         
            +
                na_release_lock(v);
         
     | 
| 
      
 11 
     | 
    
         
            +
                return v;
         
     | 
| 
      
 12 
     | 
    
         
            +
            }
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 15 
     | 
    
         
            +
            <%=c_func%>(VALUE self, VALUE obj)
         
     | 
| 
      
 16 
     | 
    
         
            +
            {
         
     | 
| 
      
 17 
     | 
    
         
            +
                dtype x;
         
     | 
| 
      
 18 
     | 
    
         
            +
                x = m_num_to_data(obj);
         
     | 
| 
      
 19 
     | 
    
         
            +
                obj = numo_<%=tp%>_new_dim0(x);
         
     | 
| 
      
 20 
     | 
    
         
            +
                <%=find_tmpl("store").c_func%>(self,obj);
         
     | 
| 
      
 21 
     | 
    
         
            +
                return self;
         
     | 
| 
      
 22 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -0,0 +1,43 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            void
         
     | 
| 
      
 2 
     | 
    
         
            +
            <%=c_iter%>(na_loop_t *const lp)
         
     | 
| 
      
 3 
     | 
    
         
            +
            {
         
     | 
| 
      
 4 
     | 
    
         
            +
                size_t     i;
         
     | 
| 
      
 5 
     | 
    
         
            +
                BIT_DIGIT *a1;
         
     | 
| 
      
 6 
     | 
    
         
            +
                size_t     p1;
         
     | 
| 
      
 7 
     | 
    
         
            +
                ssize_t    s1;
         
     | 
| 
      
 8 
     | 
    
         
            +
                size_t    *idx1;
         
     | 
| 
      
 9 
     | 
    
         
            +
                BIT_DIGIT  x=0;
         
     | 
| 
      
 10 
     | 
    
         
            +
                VALUE      a, y;
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                INIT_COUNTER(lp, i);
         
     | 
| 
      
 13 
     | 
    
         
            +
                INIT_PTR_BIT_IDX(lp, 0, a1, p1, s1, idx1);
         
     | 
| 
      
 14 
     | 
    
         
            +
                a = rb_ary_new2(i);
         
     | 
| 
      
 15 
     | 
    
         
            +
                rb_ary_push(lp->args[1].value, a);
         
     | 
| 
      
 16 
     | 
    
         
            +
                if (idx1) {
         
     | 
| 
      
 17 
     | 
    
         
            +
                    for (; i--;) {
         
     | 
| 
      
 18 
     | 
    
         
            +
                        LOAD_BIT(a1,p1+*idx1,x); idx1++;
         
     | 
| 
      
 19 
     | 
    
         
            +
                        y = m_data_to_num(x);
         
     | 
| 
      
 20 
     | 
    
         
            +
                        rb_ary_push(a,y);
         
     | 
| 
      
 21 
     | 
    
         
            +
                    }
         
     | 
| 
      
 22 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 23 
     | 
    
         
            +
                    for (; i--;) {
         
     | 
| 
      
 24 
     | 
    
         
            +
                        LOAD_BIT(a1,p1,x); p1+=s1;
         
     | 
| 
      
 25 
     | 
    
         
            +
                        y = m_data_to_num(x);
         
     | 
| 
      
 26 
     | 
    
         
            +
                        rb_ary_push(a,y);
         
     | 
| 
      
 27 
     | 
    
         
            +
                    }
         
     | 
| 
      
 28 
     | 
    
         
            +
                }
         
     | 
| 
      
 29 
     | 
    
         
            +
            }
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            /*
         
     | 
| 
      
 32 
     | 
    
         
            +
              Convert self to Array.
         
     | 
| 
      
 33 
     | 
    
         
            +
              @overload <%=method%>
         
     | 
| 
      
 34 
     | 
    
         
            +
              @return [Array]
         
     | 
| 
      
 35 
     | 
    
         
            +
            */
         
     | 
| 
      
 36 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 37 
     | 
    
         
            +
            <%=c_func%>(VALUE self)
         
     | 
| 
      
 38 
     | 
    
         
            +
            {
         
     | 
| 
      
 39 
     | 
    
         
            +
                ndfunc_arg_in_t ain[3] = {{Qnil,0},{sym_loop_opt},{sym_option}};
         
     | 
| 
      
 40 
     | 
    
         
            +
                ndfunc_arg_out_t aout[1] = {{rb_cArray,0}}; // dummy?
         
     | 
| 
      
 41 
     | 
    
         
            +
                ndfunc_t ndf = {<%=c_iter%>, FULL_LOOP_NIP, 3,1, ain,aout};
         
     | 
| 
      
 42 
     | 
    
         
            +
                return na_ndloop_cast_narray_to_rarray(&ndf, self, Qnil);
         
     | 
| 
      
 43 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -71,7 +71,7 @@ static VALUE 
     | 
|
| 
       71 
71 
     | 
    
         
             
            {
         
     | 
| 
       72 
72 
     | 
    
         
             
                ndfunc_arg_in_t ain[1] = {{cT,0}};
         
     | 
| 
       73 
73 
     | 
    
         
             
                ndfunc_arg_out_t aout[1] = {{cT,0}};
         
     | 
| 
       74 
     | 
    
         
            -
                ndfunc_t ndf = { 
     | 
| 
      
 74 
     | 
    
         
            +
                ndfunc_t ndf = {<%=c_iter%>, FULL_LOOP, 1,1, ain,aout};
         
     | 
| 
       75 
75 
     | 
    
         | 
| 
       76 
76 
     | 
    
         
             
                return na_ndloop(&ndf, 1, self);
         
     | 
| 
       77 
77 
     | 
    
         
             
            }
         
     | 
| 
         @@ -0,0 +1,102 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            typedef struct {
         
     | 
| 
      
 2 
     | 
    
         
            +
                size_t count;
         
     | 
| 
      
 3 
     | 
    
         
            +
                char  *idx0;
         
     | 
| 
      
 4 
     | 
    
         
            +
                char  *idx1;
         
     | 
| 
      
 5 
     | 
    
         
            +
                size_t elmsz;
         
     | 
| 
      
 6 
     | 
    
         
            +
            } where_opt_t;
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            #define STORE_INT(ptr, esz, x) memcpy(ptr,&(x),esz)
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            static void
         
     | 
| 
      
 11 
     | 
    
         
            +
            iter_bit_where(na_loop_t *const lp)
         
     | 
| 
      
 12 
     | 
    
         
            +
            {
         
     | 
| 
      
 13 
     | 
    
         
            +
                size_t  i;
         
     | 
| 
      
 14 
     | 
    
         
            +
                BIT_DIGIT *a;
         
     | 
| 
      
 15 
     | 
    
         
            +
                size_t  p;
         
     | 
| 
      
 16 
     | 
    
         
            +
                ssize_t s;
         
     | 
| 
      
 17 
     | 
    
         
            +
                size_t *idx;
         
     | 
| 
      
 18 
     | 
    
         
            +
                BIT_DIGIT x=0;
         
     | 
| 
      
 19 
     | 
    
         
            +
                char   *idx0, *idx1;
         
     | 
| 
      
 20 
     | 
    
         
            +
                size_t  count;
         
     | 
| 
      
 21 
     | 
    
         
            +
                size_t  e;
         
     | 
| 
      
 22 
     | 
    
         
            +
                where_opt_t *g;
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                g = (where_opt_t*)(lp->opt_ptr);
         
     | 
| 
      
 25 
     | 
    
         
            +
                count = g->count;
         
     | 
| 
      
 26 
     | 
    
         
            +
                idx0  = g->idx0;
         
     | 
| 
      
 27 
     | 
    
         
            +
                idx1  = g->idx1;
         
     | 
| 
      
 28 
     | 
    
         
            +
                e     = g->elmsz;
         
     | 
| 
      
 29 
     | 
    
         
            +
                INIT_COUNTER(lp, i);
         
     | 
| 
      
 30 
     | 
    
         
            +
                INIT_PTR_BIT_IDX(lp, 0, a, p, s, idx);
         
     | 
| 
      
 31 
     | 
    
         
            +
                if (idx) {
         
     | 
| 
      
 32 
     | 
    
         
            +
                    for (; i--;) {
         
     | 
| 
      
 33 
     | 
    
         
            +
                        LOAD_BIT(a, p+*idx, x);
         
     | 
| 
      
 34 
     | 
    
         
            +
                        idx++;
         
     | 
| 
      
 35 
     | 
    
         
            +
                        if (x==0) {
         
     | 
| 
      
 36 
     | 
    
         
            +
                            if (idx0) {
         
     | 
| 
      
 37 
     | 
    
         
            +
                                STORE_INT(idx0,e,count);
         
     | 
| 
      
 38 
     | 
    
         
            +
                                idx0 += e;
         
     | 
| 
      
 39 
     | 
    
         
            +
                            }
         
     | 
| 
      
 40 
     | 
    
         
            +
                        } else {
         
     | 
| 
      
 41 
     | 
    
         
            +
                            if (idx1) {
         
     | 
| 
      
 42 
     | 
    
         
            +
                                STORE_INT(idx1,e,count);
         
     | 
| 
      
 43 
     | 
    
         
            +
                                idx1 += e;
         
     | 
| 
      
 44 
     | 
    
         
            +
                            }
         
     | 
| 
      
 45 
     | 
    
         
            +
                        }
         
     | 
| 
      
 46 
     | 
    
         
            +
                        count++;
         
     | 
| 
      
 47 
     | 
    
         
            +
                    }
         
     | 
| 
      
 48 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 49 
     | 
    
         
            +
                    for (; i--;) {
         
     | 
| 
      
 50 
     | 
    
         
            +
                        LOAD_BIT(a, p, x);
         
     | 
| 
      
 51 
     | 
    
         
            +
                        p+=s;
         
     | 
| 
      
 52 
     | 
    
         
            +
                        if (x==0) {
         
     | 
| 
      
 53 
     | 
    
         
            +
                            if (idx0) {
         
     | 
| 
      
 54 
     | 
    
         
            +
                                STORE_INT(idx0,e,count);
         
     | 
| 
      
 55 
     | 
    
         
            +
                                idx0 += e;
         
     | 
| 
      
 56 
     | 
    
         
            +
                            }
         
     | 
| 
      
 57 
     | 
    
         
            +
                        } else {
         
     | 
| 
      
 58 
     | 
    
         
            +
                            if (idx1) {
         
     | 
| 
      
 59 
     | 
    
         
            +
                                STORE_INT(idx1,e,count);
         
     | 
| 
      
 60 
     | 
    
         
            +
                                idx1 += e;
         
     | 
| 
      
 61 
     | 
    
         
            +
                            }
         
     | 
| 
      
 62 
     | 
    
         
            +
                        }
         
     | 
| 
      
 63 
     | 
    
         
            +
                        count++;
         
     | 
| 
      
 64 
     | 
    
         
            +
                    }
         
     | 
| 
      
 65 
     | 
    
         
            +
                }
         
     | 
| 
      
 66 
     | 
    
         
            +
                g->count = count;
         
     | 
| 
      
 67 
     | 
    
         
            +
                g->idx0  = idx0;
         
     | 
| 
      
 68 
     | 
    
         
            +
                g->idx1  = idx1;
         
     | 
| 
      
 69 
     | 
    
         
            +
            }
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
            /*
         
     | 
| 
      
 72 
     | 
    
         
            +
              Returns the array of index where the bit is one (true).
         
     | 
| 
      
 73 
     | 
    
         
            +
              @overload <%=op_map%>
         
     | 
| 
      
 74 
     | 
    
         
            +
              @return [Numo::Int32,Numo::Int64]
         
     | 
| 
      
 75 
     | 
    
         
            +
            */
         
     | 
| 
      
 76 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 77 
     | 
    
         
            +
             numo_bit_where(VALUE self)
         
     | 
| 
      
 78 
     | 
    
         
            +
            {
         
     | 
| 
      
 79 
     | 
    
         
            +
                volatile VALUE idx_1;
         
     | 
| 
      
 80 
     | 
    
         
            +
                size_t size, n_1;
         
     | 
| 
      
 81 
     | 
    
         
            +
                where_opt_t *g;
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
                ndfunc_arg_in_t ain[1] = {{cT,0}};
         
     | 
| 
      
 84 
     | 
    
         
            +
                ndfunc_t ndf = { iter_bit_where, FULL_LOOP, 1, 0, ain, 0 };
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
                size = RNARRAY_SIZE(self);
         
     | 
| 
      
 87 
     | 
    
         
            +
                n_1 = NUM2SIZET(numo_bit_count_true(0, NULL, self));
         
     | 
| 
      
 88 
     | 
    
         
            +
                g = ALLOCA_N(where_opt_t,1);
         
     | 
| 
      
 89 
     | 
    
         
            +
                g->count = 0;
         
     | 
| 
      
 90 
     | 
    
         
            +
                if (size>4294967295ul) {
         
     | 
| 
      
 91 
     | 
    
         
            +
                    idx_1 = rb_narray_new(numo_cInt64, 1, &n_1);
         
     | 
| 
      
 92 
     | 
    
         
            +
                    g->elmsz = 8;
         
     | 
| 
      
 93 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 94 
     | 
    
         
            +
                    idx_1 = rb_narray_new(numo_cInt32, 1, &n_1);
         
     | 
| 
      
 95 
     | 
    
         
            +
                    g->elmsz = 4;
         
     | 
| 
      
 96 
     | 
    
         
            +
                }
         
     | 
| 
      
 97 
     | 
    
         
            +
                g->idx1 = na_get_pointer_for_write(idx_1);
         
     | 
| 
      
 98 
     | 
    
         
            +
                g->idx0 = NULL;
         
     | 
| 
      
 99 
     | 
    
         
            +
                na_ndloop3(&ndf, g, 1, self);
         
     | 
| 
      
 100 
     | 
    
         
            +
                na_release_lock(idx_1);
         
     | 
| 
      
 101 
     | 
    
         
            +
                return idx_1;
         
     | 
| 
      
 102 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -0,0 +1,37 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            /*
         
     | 
| 
      
 2 
     | 
    
         
            +
              Returns two index arrays.
         
     | 
| 
      
 3 
     | 
    
         
            +
              The first array contains index where the bit is one (true).
         
     | 
| 
      
 4 
     | 
    
         
            +
              The second array contains index where the bit is zero (false).
         
     | 
| 
      
 5 
     | 
    
         
            +
              @overload <%=op_map%>
         
     | 
| 
      
 6 
     | 
    
         
            +
              @return [Numo::Int32,Numo::Int64]*2
         
     | 
| 
      
 7 
     | 
    
         
            +
            */
         
     | 
| 
      
 8 
     | 
    
         
            +
            static VALUE
         
     | 
| 
      
 9 
     | 
    
         
            +
            numo_bit_where2(VALUE self)
         
     | 
| 
      
 10 
     | 
    
         
            +
            {
         
     | 
| 
      
 11 
     | 
    
         
            +
                VALUE idx_1, idx_0;
         
     | 
| 
      
 12 
     | 
    
         
            +
                size_t size, n_1;
         
     | 
| 
      
 13 
     | 
    
         
            +
                where_opt_t *g;
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                ndfunc_arg_in_t ain[1] = {{cT,0}};
         
     | 
| 
      
 16 
     | 
    
         
            +
                ndfunc_t ndf = { iter_bit_where, FULL_LOOP, 1, 0, ain, 0 };
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                size = RNARRAY_SIZE(self);
         
     | 
| 
      
 19 
     | 
    
         
            +
                n_1 = NUM2SIZET(numo_bit_count_true(0, NULL, self));
         
     | 
| 
      
 20 
     | 
    
         
            +
                g = ALLOCA_N(where_opt_t,1);
         
     | 
| 
      
 21 
     | 
    
         
            +
                g->count = 0;
         
     | 
| 
      
 22 
     | 
    
         
            +
                if (size>4294967295ul) {
         
     | 
| 
      
 23 
     | 
    
         
            +
                    idx_1 = rb_narray_new(numo_cInt64, 1, &n_1);
         
     | 
| 
      
 24 
     | 
    
         
            +
                    idx_0 = rb_narray_new(numo_cInt64, 1, &n_1);
         
     | 
| 
      
 25 
     | 
    
         
            +
                    g->elmsz = 8;
         
     | 
| 
      
 26 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 27 
     | 
    
         
            +
                    idx_1 = rb_narray_new(numo_cInt32, 1, &n_1);
         
     | 
| 
      
 28 
     | 
    
         
            +
                    idx_0 = rb_narray_new(numo_cInt32, 1, &n_1);
         
     | 
| 
      
 29 
     | 
    
         
            +
                    g->elmsz = 4;
         
     | 
| 
      
 30 
     | 
    
         
            +
                }
         
     | 
| 
      
 31 
     | 
    
         
            +
                g->idx1 = na_get_pointer_for_write(idx_1);
         
     | 
| 
      
 32 
     | 
    
         
            +
                g->idx0 = na_get_pointer_for_write(idx_0);
         
     | 
| 
      
 33 
     | 
    
         
            +
                na_ndloop3(&ndf, g, 1, self);
         
     | 
| 
      
 34 
     | 
    
         
            +
                na_release_lock(idx_0);
         
     | 
| 
      
 35 
     | 
    
         
            +
                na_release_lock(idx_1);
         
     | 
| 
      
 36 
     | 
    
         
            +
                return rb_assoc_new(idx_1,idx_0);
         
     | 
| 
      
 37 
     | 
    
         
            +
            }
         
     | 
    
        data/ext/numo/narray/index.c
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            /*
         
     | 
| 
       2 
2 
     | 
    
         
             
              index.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
         
     | 
| 
         @@ -152,7 +152,7 @@ na_parse_array(VALUE ary, int orig_dim, ssize_t size, na_index_arg_t *q) 
     | 
|
| 
       152 
152 
     | 
    
         
             
                int n = RARRAY_LEN(ary);
         
     | 
| 
       153 
153 
     | 
    
         
             
                q->idx = ALLOC_N(size_t, n);
         
     | 
| 
       154 
154 
     | 
    
         
             
                for (k=0; k<n; k++) {
         
     | 
| 
       155 
     | 
    
         
            -
                    q->idx[k] = na_range_check( 
     | 
| 
      
 155 
     | 
    
         
            +
                    q->idx[k] = na_range_check(NUM2SSIZET(RARRAY_AREF(ary,k)), size, orig_dim);
         
     | 
| 
       156 
156 
     | 
    
         
             
                }
         
     | 
| 
       157 
157 
     | 
    
         
             
                q->n    = n;
         
     | 
| 
       158 
158 
     | 
    
         
             
                q->beg  = 0;
         
     | 
| 
         @@ -207,7 +207,7 @@ na_parse_range(VALUE range, int orig_dim, ssize_t size, na_index_arg_t *q) 
     | 
|
| 
       207 
207 
     | 
    
         
             
                if (beg < -size || beg >= size ||
         
     | 
| 
       208 
208 
     | 
    
         
             
                    end < -size || end >= size) {
         
     | 
| 
       209 
209 
     | 
    
         
             
                    rb_raise(rb_eRangeError,
         
     | 
| 
       210 
     | 
    
         
            -
                             "beg=% 
     | 
| 
      
 210 
     | 
    
         
            +
                             "beg=%"SZF"d,end=%"SZF"d is out of array size (%"SZF"d)",
         
     | 
| 
       211 
211 
     | 
    
         
             
                             beg, end, size);
         
     | 
| 
       212 
212 
     | 
    
         
             
                }
         
     | 
| 
       213 
213 
     | 
    
         
             
                n = end-beg+1;
         
     | 
| 
         @@ -232,11 +232,11 @@ na_index_parse_each(volatile VALUE a, ssize_t size, int i, na_index_arg_t *q) 
     | 
|
| 
       232 
232 
     | 
    
         
             
                    break;
         
     | 
| 
       233 
233 
     | 
    
         | 
| 
       234 
234 
     | 
    
         
             
                case T_BIGNUM:
         
     | 
| 
       235 
     | 
    
         
            -
                    na_index_set_scalar(q,i,size, 
     | 
| 
      
 235 
     | 
    
         
            +
                    na_index_set_scalar(q,i,size,NUM2SSIZET(a));
         
     | 
| 
       236 
236 
     | 
    
         
             
                    break;
         
     | 
| 
       237 
237 
     | 
    
         | 
| 
       238 
238 
     | 
    
         
             
                case T_FLOAT:
         
     | 
| 
       239 
     | 
    
         
            -
                    na_index_set_scalar(q,i,size, 
     | 
| 
      
 239 
     | 
    
         
            +
                    na_index_set_scalar(q,i,size,NUM2SSIZET(a));
         
     | 
| 
       240 
240 
     | 
    
         
             
                    break;
         
     | 
| 
       241 
241 
     | 
    
         | 
| 
       242 
242 
     | 
    
         
             
                case T_NIL:
         
     | 
| 
         @@ -257,6 +257,8 @@ na_index_parse_each(volatile VALUE a, ssize_t size, int i, na_index_arg_t *q) 
     | 
|
| 
       257 
257 
     | 
    
         
             
                    else if (a==sym_reduce || a==sym_sum || a==sym_plus) {
         
     | 
| 
       258 
258 
     | 
    
         
             
                        na_index_set_step(q,i,size,0,1);
         
     | 
| 
       259 
259 
     | 
    
         
             
                        q->reduce = 1;
         
     | 
| 
      
 260 
     | 
    
         
            +
                    } else {
         
     | 
| 
      
 261 
     | 
    
         
            +
                        rb_raise(rb_eIndexError, "invalid symbol for index");
         
     | 
| 
       260 
262 
     | 
    
         
             
                    }
         
     | 
| 
       261 
263 
     | 
    
         
             
                    break;
         
     | 
| 
       262 
264 
     | 
    
         | 
| 
         @@ -636,7 +638,7 @@ na_aref_main(int nidx, VALUE *idx, VALUE self, int keep_dim) 
     | 
|
| 
       636 
638 
     | 
    
         
             
                na_index_arg_to_internal_order(nidx, idx, self);
         
     | 
| 
       637 
639 
     | 
    
         | 
| 
       638 
640 
     | 
    
         
             
                if (nidx==0) {
         
     | 
| 
       639 
     | 
    
         
            -
                    return  
     | 
| 
      
 641 
     | 
    
         
            +
                    return rb_funcall(self,rb_intern("copy"),0);
         
     | 
| 
       640 
642 
     | 
    
         
             
                }
         
     | 
| 
       641 
643 
     | 
    
         
             
                if (nidx==1) {
         
     | 
| 
       642 
644 
     | 
    
         
             
                    if (CLASS_OF(*idx)==numo_cBit) {
         
     | 
| 
         @@ -744,7 +746,7 @@ na_get_scalar_position(VALUE self, int argc, VALUE *argv, ssize_t stride) 
     | 
|
| 
       744 
746 
     | 
    
         
             
                        break;
         
     | 
| 
       745 
747 
     | 
    
         
             
                    case T_BIGNUM:
         
     | 
| 
       746 
748 
     | 
    
         
             
                    case T_FLOAT:
         
     | 
| 
       747 
     | 
    
         
            -
                        idx[i] =  
     | 
| 
      
 749 
     | 
    
         
            +
                        idx[i] = NUM2SSIZET(argv[i]);
         
     | 
| 
       748 
750 
     | 
    
         
             
                        break;
         
     | 
| 
       749 
751 
     | 
    
         
             
                    default:
         
     | 
| 
       750 
752 
     | 
    
         
             
                        return -1;
         
     |