numo-narray 0.9.0.1-x64-mingw32 → 0.9.0.3-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -7
  3. data/Rakefile +20 -5
  4. data/ext/numo/narray/array.c +3 -3
  5. data/ext/numo/narray/data.c +102 -81
  6. data/ext/numo/narray/depend.erb +9 -7
  7. data/ext/numo/narray/extconf.rb +5 -24
  8. data/ext/numo/narray/gen/cogen.rb +19 -4
  9. data/ext/numo/narray/gen/def/bit.rb +31 -0
  10. data/ext/numo/narray/gen/def/robject.rb +1 -1
  11. data/ext/numo/narray/gen/dtype.erb.c +11 -257
  12. data/ext/numo/narray/gen/spec.rb +294 -0
  13. data/ext/numo/narray/gen/tmpl/aset.c +1 -1
  14. data/ext/numo/narray/gen/tmpl/each_with_index.c +1 -1
  15. data/ext/numo/narray/gen/tmpl/eye.c +5 -5
  16. data/ext/numo/narray/gen/tmpl/logseq.c +82 -0
  17. data/ext/numo/narray/gen/tmpl/map_with_index.c +1 -1
  18. data/ext/numo/narray/gen/tmpl/rand.c +126 -5
  19. data/ext/numo/narray/gen/tmpl/seq.c +43 -12
  20. data/ext/numo/narray/gen/tmpl/store_bit.c +55 -0
  21. data/ext/numo/narray/gen/tmpl_bit/allocate.c +28 -0
  22. data/ext/numo/narray/gen/tmpl_bit/aref.c +53 -0
  23. data/ext/numo/narray/gen/tmpl_bit/aset.c +63 -0
  24. data/ext/numo/narray/gen/{tmpl/bit_binary.c → tmpl_bit/binary.c} +1 -1
  25. data/ext/numo/narray/gen/{tmpl → tmpl_bit}/bit_count.c +5 -3
  26. data/ext/numo/narray/gen/tmpl_bit/bit_reduce.c +128 -0
  27. data/ext/numo/narray/gen/tmpl_bit/cast.c +37 -0
  28. data/ext/numo/narray/gen/tmpl_bit/cast_array.c +80 -0
  29. data/ext/numo/narray/gen/tmpl_bit/cast_numeric.c +22 -0
  30. data/ext/numo/narray/gen/tmpl_bit/coerce_cast.c +8 -0
  31. data/ext/numo/narray/gen/tmpl_bit/each.c +44 -0
  32. data/ext/numo/narray/gen/tmpl_bit/each_with_index.c +66 -0
  33. data/ext/numo/narray/gen/tmpl_bit/extract.c +25 -0
  34. data/ext/numo/narray/gen/tmpl_bit/fill.c +65 -0
  35. data/ext/numo/narray/gen/tmpl_bit/format.c +61 -0
  36. data/ext/numo/narray/gen/tmpl_bit/format_to_a.c +48 -0
  37. data/ext/numo/narray/gen/tmpl_bit/inspect.c +18 -0
  38. data/ext/numo/narray/gen/tmpl_bit/map_with_index.c +94 -0
  39. data/ext/numo/narray/gen/tmpl_bit/mask.c +117 -0
  40. data/ext/numo/narray/gen/tmpl_bit/none_p.c +14 -0
  41. data/ext/numo/narray/gen/tmpl_bit/store.c +32 -0
  42. data/ext/numo/narray/gen/tmpl_bit/store_array.c +5 -0
  43. data/ext/numo/narray/gen/tmpl_bit/store_bit.c +66 -0
  44. data/ext/numo/narray/gen/tmpl_bit/store_from.c +56 -0
  45. data/ext/numo/narray/gen/tmpl_bit/store_numeric.c +22 -0
  46. data/ext/numo/narray/gen/tmpl_bit/to_a.c +43 -0
  47. data/ext/numo/narray/gen/{tmpl/bit_unary.c → tmpl_bit/unary.c} +1 -1
  48. data/ext/numo/narray/gen/tmpl_bit/where.c +102 -0
  49. data/ext/numo/narray/gen/tmpl_bit/where2.c +37 -0
  50. data/ext/numo/narray/index.c +9 -7
  51. data/ext/numo/narray/math.c +6 -1
  52. data/ext/numo/narray/narray.c +307 -103
  53. data/ext/numo/narray/ndloop.c +21 -36
  54. data/ext/numo/narray/numo/intern.h +3 -3
  55. data/ext/numo/narray/numo/narray.h +5 -41
  56. data/ext/numo/narray/numo/template.h +2 -2
  57. data/ext/numo/narray/numo/types/bit.h +27 -13
  58. data/ext/numo/narray/numo/types/complex.h +2 -2
  59. data/ext/numo/narray/numo/types/complex_macro.h +19 -7
  60. data/ext/numo/narray/numo/types/dcomplex.h +9 -0
  61. data/ext/numo/narray/numo/types/dfloat.h +6 -0
  62. data/ext/numo/narray/numo/types/float_macro.h +9 -2
  63. data/ext/numo/narray/numo/types/int16.h +0 -1
  64. data/ext/numo/narray/numo/types/int32.h +0 -1
  65. data/ext/numo/narray/numo/types/int64.h +0 -1
  66. data/ext/numo/narray/numo/types/int8.h +0 -1
  67. data/ext/numo/narray/numo/types/int_macro.h +2 -1
  68. data/ext/numo/narray/numo/types/robj_macro.h +9 -2
  69. data/ext/numo/narray/numo/types/robject.h +6 -0
  70. data/ext/numo/narray/numo/types/scomplex.h +9 -0
  71. data/ext/numo/narray/numo/types/sfloat.h +6 -0
  72. data/ext/numo/narray/numo/types/uint16.h +0 -1
  73. data/ext/numo/narray/numo/types/uint32.h +0 -1
  74. data/ext/numo/narray/numo/types/uint64.h +0 -1
  75. data/ext/numo/narray/numo/types/uint8.h +0 -1
  76. data/ext/numo/narray/numo/types/uint_macro.h +2 -1
  77. data/ext/numo/narray/numo/types/xint_macro.h +6 -1
  78. data/ext/numo/narray/rand.c +2 -2
  79. data/ext/numo/narray/step.c +7 -7
  80. data/ext/numo/narray/struct.c +11 -12
  81. data/lib/2.0/numo/narray.so +0 -0
  82. data/lib/2.1/numo/narray.so +0 -0
  83. data/lib/2.2/numo/narray.so +0 -0
  84. data/lib/2.3/numo/narray.so +0 -0
  85. data/lib/2.4/numo/narray.so +0 -0
  86. data/lib/erbpp.rb +6 -2
  87. data/lib/erbpp/line_number.rb +1 -1
  88. data/lib/erbpp/narray_def.rb +23 -19
  89. data/numo-narray.gemspec +2 -2
  90. metadata +45 -10
  91. data/ext/numo/narray/gen/bit.erb.c +0 -811
@@ -52,7 +52,7 @@ static VALUE
52
52
  a = na_aref_main(argc, argv, self, 0);
53
53
  <%=c_func.sub(/_aset/,"_store")%>(a, argv[argc]);
54
54
  } else {
55
- ptr = na_get_pointer_for_read(self) + pos;
55
+ ptr = na_get_pointer_for_read_write(self) + pos;
56
56
  *(dtype*)ptr = m_num_to_data(argv[argc]);
57
57
  }
58
58
 
@@ -5,7 +5,7 @@ yield_each_with_index(dtype x, size_t *c, VALUE *a, int nd, int md)
5
5
 
6
6
  a[0] = m_data_to_num(x);
7
7
  for (j=0; j<=nd; j++) {
8
- a[j+1] = SIZE2NUM(c[j]);
8
+ a[j+1] = SIZET2NUM(c[j]);
9
9
  }
10
10
  rb_yield(rb_ary_new4(md,a));
11
11
  }
@@ -54,7 +54,7 @@ static VALUE
54
54
  rb_raise(rb_eArgError,"too many arguments (%d for 0..2)",argc);
55
55
  } else if (argc == 2) {
56
56
  data = m_num_to_data(argv[0]);
57
- kofs = NUM2SSIZE(argv[1]);
57
+ kofs = NUM2SSIZET(argv[1]);
58
58
  } else if (argc == 1) {
59
59
  data = m_num_to_data(argv[0]);
60
60
  kofs = 0;
@@ -72,13 +72,13 @@ static VALUE
72
72
  // Diagonal offset from the main diagonal.
73
73
  if (kofs >= 0) {
74
74
  if ((size_t)(kofs) >= na->shape[nd-1]) {
75
- rb_raise(rb_eArgError,"invalid diagonal offset(%ld) for "
76
- "last dimension size(%ld)",kofs,na->shape[nd-1]);
75
+ rb_raise(rb_eArgError,"invalid diagonal offset(%"SZF"d) for "
76
+ "last dimension size(%"SZF"d)",kofs,na->shape[nd-1]);
77
77
  }
78
78
  } else {
79
79
  if ((size_t)(-kofs) >= na->shape[nd-2]) {
80
- rb_raise(rb_eArgError,"invalid diagonal offset(%ld) for "
81
- "last-1 dimension size(%ld)",kofs,na->shape[nd-2]);
80
+ rb_raise(rb_eArgError,"invalid diagonal offset(%"SZF"d) for "
81
+ "last-1 dimension size(%"SZF"d)",kofs,na->shape[nd-2]);
82
82
  }
83
83
  }
84
84
 
@@ -0,0 +1,82 @@
1
+ typedef struct {
2
+ seq_data_t beg;
3
+ seq_data_t step;
4
+ seq_data_t base;
5
+ seq_count_t count;
6
+ } logseq_opt_t;
7
+
8
+ static void
9
+ <%=c_iter%>(na_loop_t *const lp)
10
+ {
11
+ size_t i;
12
+ char *p1;
13
+ ssize_t s1;
14
+ size_t *idx1;
15
+ dtype x;
16
+ seq_data_t beg, step, base;
17
+ seq_count_t c;
18
+ logseq_opt_t *g;
19
+
20
+ INIT_COUNTER(lp, i);
21
+ INIT_PTR_IDX(lp, 0, p1, s1, idx1);
22
+ g = (logseq_opt_t*)(lp->opt_ptr);
23
+ beg = g->beg;
24
+ step = g->step;
25
+ base = g->base;
26
+ c = g->count;
27
+ if (idx1) {
28
+ for (; i--;) {
29
+ x = f_seq(beg,step,c++);
30
+ *(dtype*)(p1+*idx1) = m_pow(base,x);
31
+ idx1++;
32
+ }
33
+ } else {
34
+ for (; i--;) {
35
+ x = f_seq(beg,step,c++);
36
+ *(dtype*)(p1) = m_pow(base,x);
37
+ p1 += s1;
38
+ }
39
+ }
40
+ g->count = c;
41
+ }
42
+
43
+ /*
44
+ Set logarithmic sequence of numbers to self. The sequence is obtained from
45
+ base**(beg+i*step)
46
+ where i is 1-dimensional index.
47
+ Applicable classes: DFloat, SFloat, DComplex, SCopmplex.
48
+
49
+ @overload logseq(beg,step,[base])
50
+ @param [Numeric] beg The begining of sequence.
51
+ @param [Numeric] step The step of sequence.
52
+ @param [Numeric] base The base of log space. (default=10)
53
+ @return [Numo::<%=class_name%>] self.
54
+
55
+ @example
56
+ Numo::DFloat.new(5).logseq(4,-1,2)
57
+ => Numo::DFloat#shape=[5]
58
+ [16, 8, 4, 2, 1]
59
+ Numo::DComplex.new(5).logseq(0,1i*Math::PI/3,Math::E)
60
+ => Numo::DComplex#shape=[5]
61
+ [1+7.26156e-310i, 0.5+0.866025i, -0.5+0.866025i, -1+1.22465e-16i, ...]
62
+ */
63
+ static VALUE
64
+ <%=c_func%>(int argc, VALUE *args, VALUE self)
65
+ {
66
+ logseq_opt_t *g;
67
+ VALUE vbeg, vstep, vbase;
68
+ ndfunc_arg_in_t ain[1] = {{OVERWRITE,0}};
69
+ ndfunc_t ndf = {<%=c_iter%>, FULL_LOOP, 1,0, ain,0};
70
+
71
+ g = ALLOCA_N(logseq_opt_t,1);
72
+ rb_scan_args(argc, args, "21", &vbeg, &vstep, &vbase);
73
+ g->beg = m_num_to_data(vbeg);
74
+ g->step = m_num_to_data(vstep);
75
+ if (vbase==Qnil) {
76
+ g->base = m_from_real(10);
77
+ } else {
78
+ g->base = m_num_to_data(vbase);
79
+ }
80
+ na_ndloop3(&ndf, g, 1, self);
81
+ return self;
82
+ }
@@ -6,7 +6,7 @@ yield_map_with_index(dtype x, size_t *c, VALUE *a, int nd, int md)
6
6
 
7
7
  a[0] = m_data_to_num(x);
8
8
  for (j=0; j<=nd; j++) {
9
- a[j+1] = SIZE2NUM(c[j]);
9
+ a[j+1] = SIZET2NUM(c[j]);
10
10
  }
11
11
  y = rb_yield(rb_ary_new4(md,a));
12
12
  return m_num_to_data(y);
@@ -1,3 +1,76 @@
1
+ <%
2
+ if is_int && !is_object
3
+ if /Int64$/ =~ class_name
4
+ rand_bit = 64
5
+ else
6
+ rand_bit = 32
7
+ end
8
+ m_rand = "m_rand(max,shift)"
9
+ shift_def = "int shift;"
10
+ shift_set = "shift = #{rand_bit-1} - msb_pos(max);"
11
+ rand_type = "uint#{rand_bit}_t"
12
+ %>
13
+
14
+ #define HWID (sizeof(dtype)>>1)
15
+
16
+ static int msb_pos(<%=rand_type%> a)
17
+ {
18
+ int width = HWID;
19
+ int pos = 0;
20
+ <%=rand_type%> mask = (((dtype)1 << HWID)-1) << HWID;
21
+
22
+ if (a==0) {return -1;}
23
+
24
+ while (width) {
25
+ if (a & mask) {
26
+ pos += width;
27
+ } else {
28
+ mask >>= width;
29
+ }
30
+ width >>= 1;
31
+ mask &= mask << width;
32
+ }
33
+ return pos;
34
+ }
35
+
36
+ /* generates a random number on [0,max) */
37
+ <% if rand_bit == 64 %>
38
+ inline static dtype m_rand(uint64_t max, int shift)
39
+ {
40
+ uint64_t x;
41
+ do {
42
+ x = gen_rand32();
43
+ x <<= 32;
44
+ x |= gen_rand32();
45
+ x >>= shift;
46
+ } while (x >= max);
47
+ return x;
48
+ }
49
+ <% else %>
50
+ inline static dtype m_rand(uint32_t max, int shift)
51
+ {
52
+ uint32_t x;
53
+ do {
54
+ x = gen_rand32();
55
+ x >>= shift;
56
+ } while (x >= max);
57
+ return x;
58
+ }
59
+ <% end %>
60
+ <%
61
+ else
62
+ m_rand = "m_rand(max)"
63
+ shift_def = ""
64
+ shift_set = ""
65
+ rand_type = "dtype"
66
+ end
67
+ %>
68
+
69
+ typedef struct {
70
+ dtype low;
71
+ <%=rand_type%> max;
72
+ } rand_opt_t;
73
+
1
74
  static void
2
75
  <%=c_iter%>(na_loop_t *const lp)
3
76
  {
@@ -6,28 +79,76 @@ static void
6
79
  ssize_t s1;
7
80
  size_t *idx1;
8
81
  dtype x;
82
+ rand_opt_t *g;
83
+ dtype low;
84
+ <%=rand_type%> max;
85
+ <%=shift_def%>
9
86
 
10
87
  INIT_COUNTER(lp, i);
11
88
  INIT_PTR_IDX(lp, 0, p1, s1, idx1);
89
+ g = (rand_opt_t*)(lp->opt_ptr);
90
+ low = g->low;
91
+ max = g->max;
92
+ <%=shift_set%>
93
+
12
94
  if (idx1) {
13
95
  for (; i--;) {
14
- x = m_rand;
96
+ x = m_add(<%=m_rand%>,low);
15
97
  SET_DATA_INDEX(p1,idx1,dtype,x);
16
98
  }
17
99
  } else {
18
100
  for (; i--;) {
19
- x = m_rand;
101
+ x = m_add(<%=m_rand%>,low);
20
102
  SET_DATA_STRIDE(p1,s1,dtype,x);
21
103
  }
22
104
  }
23
105
  }
24
106
 
107
+
108
+ /*
109
+ Generate uniformly distributed random numbers on self narray.
110
+ @overload rand([[low],high])
111
+ @param [Numeric] low lower inclusive boundary of random numbers. (default=0)
112
+ @param [Numeric] high upper exclusive boundary of random numbers. (default=1)
113
+ @return [Numo::<%=class_name%>] self.
114
+ @example
115
+ Numo::DFloat.new(6).rand
116
+ => Numo::DFloat#shape=[6]
117
+ [0.0617545, 0.373067, 0.794815, 0.201042, 0.116041, 0.344032]
118
+ Numo::DComplex.new(6).rand(5+5i)
119
+ => Numo::DComplex#shape=[6]
120
+ [2.69974+3.68908i, 0.825443+0.254414i, 0.540323+0.34354i, 4.52061+2.39322i, ...]
121
+ Numo::Int32.new(6).rand(2,5)
122
+ => Numo::Int32#shape=[6]
123
+ [4, 3, 3, 2, 4, 2]
124
+ */
25
125
  static VALUE
26
- <%=c_func%>(VALUE self)
126
+ <%=c_func%>(int argc, VALUE *args, VALUE self)
27
127
  {
128
+ rand_opt_t g;
129
+ VALUE v1=Qnil, v2=Qnil;
130
+ dtype high;
28
131
  ndfunc_arg_in_t ain[1] = {{OVERWRITE,0}};
29
- ndfunc_t ndf = { <%=c_iter%>, FULL_LOOP, 1, 0, ain, 0 };
132
+ ndfunc_t ndf = {<%=c_iter%>, FULL_LOOP, 1,0, ain,0};
30
133
 
31
- na_ndloop(&ndf, 1, self);
134
+ rb_scan_args(argc, args, "02", &v1, &v2);
135
+ if (v2==Qnil) {
136
+ g.low = m_zero;
137
+ if (v1==Qnil) {
138
+ g.max = high = m_one;
139
+ } else {
140
+ g.max = high = m_num_to_data(v1);
141
+ }
142
+ } else {
143
+ g.low = m_num_to_data(v1);
144
+ high = m_num_to_data(v2);
145
+ g.max = m_sub(high,g.low);
146
+ }
147
+ <% if is_int && !is_object %>
148
+ if (high <= g.low) {
149
+ rb_raise(rb_eArgError,"high must be larger than low");
150
+ }
151
+ <% end %>
152
+ na_ndloop3(&ndf, &g, 1, self);
32
153
  return self;
33
154
  }
@@ -1,3 +1,21 @@
1
+ <% if is_int && !is_object %>
2
+ typedef double seq_data_t;
3
+ <% else %>
4
+ typedef dtype seq_data_t;
5
+ <% end %>
6
+
7
+ <% if is_object %>
8
+ typedef size_t seq_count_t;
9
+ <% else %>
10
+ typedef double seq_count_t;
11
+ <% end %>
12
+
13
+ typedef struct {
14
+ seq_data_t beg;
15
+ seq_data_t step;
16
+ seq_count_t count;
17
+ } seq_opt_t;
18
+
1
19
  static void
2
20
  <%=c_iter%>(na_loop_t *const lp)
3
21
  {
@@ -5,8 +23,9 @@ static void
5
23
  char *p1;
6
24
  ssize_t s1;
7
25
  size_t *idx1;
8
- double x, beg, step, c;
9
- dtype y;
26
+ dtype x;
27
+ seq_data_t beg, step;
28
+ seq_count_t c;
10
29
  seq_opt_t *g;
11
30
 
12
31
  INIT_COUNTER(lp, i);
@@ -17,16 +36,14 @@ static void
17
36
  c = g->count;
18
37
  if (idx1) {
19
38
  for (; i--;) {
20
- x = beg + step * c++;
21
- y = m_from_double(x);
22
- *(dtype*)(p1+*idx1) = y;
39
+ x = f_seq(beg,step,c++);
40
+ *(dtype*)(p1+*idx1) = x;
23
41
  idx1++;
24
42
  }
25
43
  } else {
26
44
  for (; i--;) {
27
- x = beg + step * c++;
28
- y = m_from_double(x);
29
- *(dtype*)(p1) = y;
45
+ x = f_seq(beg,step,c++);
46
+ *(dtype*)(p1) = x;
30
47
  p1 += s1;
31
48
  }
32
49
  }
@@ -34,11 +51,20 @@ static void
34
51
  }
35
52
 
36
53
  /*
37
- Set Sequence of numbers to self NArray.
54
+ Set linear sequence of numbers to self. The sequence is obtained from
55
+ beg+i*step
56
+ where i is 1-dimensional index.
38
57
  @overload seq([beg,[step]])
39
58
  @param [Numeric] beg begining of sequence. (default=0)
40
59
  @param [Numeric] step step of sequence. (default=1)
41
60
  @return [Numo::<%=class_name%>] self.
61
+ @example
62
+ Numo::DFloat.new(6).seq(1,-0.2)
63
+ => Numo::DFloat#shape=[6]
64
+ [1, 0.8, 0.6, 0.4, 0.2, 0]
65
+ Numo::DComplex.new(6).seq(1,-0.2+0.2i)
66
+ => Numo::DComplex#shape=[6]
67
+ [1+0i, 0.8+0.2i, 0.6+0.4i, 0.4+0.6i, 0.2+0.8i, 0+1i]
42
68
  */
43
69
  static VALUE
44
70
  <%=c_func%>(int argc, VALUE *args, VALUE self)
@@ -46,15 +72,20 @@ static VALUE
46
72
  seq_opt_t *g;
47
73
  VALUE vbeg=Qnil, vstep=Qnil;
48
74
  ndfunc_arg_in_t ain[1] = {{OVERWRITE,0}};
49
- ndfunc_t ndf = { <%=c_iter%>, FULL_LOOP, 1, 0, ain, 0 };
75
+ ndfunc_t ndf = {<%=c_iter%>, FULL_LOOP, 1,0, ain,0};
50
76
 
51
77
  g = ALLOCA_N(seq_opt_t,1);
52
- g->beg = 0;
53
- g->step = 1;
78
+ g->beg = m_zero;
79
+ g->step = m_one;
54
80
  g->count = 0;
55
81
  rb_scan_args(argc, args, "02", &vbeg, &vstep);
82
+ <% if is_int && !is_object %>
56
83
  if (vbeg!=Qnil) {g->beg = NUM2DBL(vbeg);}
57
84
  if (vstep!=Qnil) {g->step = NUM2DBL(vstep);}
85
+ <% else %>
86
+ if (vbeg!=Qnil) {g->beg = m_num_to_data(vbeg);}
87
+ if (vstep!=Qnil) {g->step = m_num_to_data(vstep);}
88
+ <% end %>
58
89
 
59
90
  na_ndloop3(&ndf, g, 1, self);
60
91
  return self;
@@ -0,0 +1,55 @@
1
+ static void
2
+ <%=c_iter%>(na_loop_t *const lp)
3
+ {
4
+ size_t i;
5
+ char *p1;
6
+ size_t p2;
7
+ ssize_t s1, s2;
8
+ size_t *idx1, *idx2;
9
+ BIT_DIGIT *a2, x;
10
+ dtype y;
11
+
12
+ INIT_COUNTER(lp, i);
13
+ INIT_PTR_IDX(lp, 0, p1, s1, idx1);
14
+ INIT_PTR_BIT_IDX(lp, 1, a2, p2, s2, idx2);
15
+ if (idx2) {
16
+ if (idx1) {
17
+ for (; i--;) {
18
+ LOAD_BIT(a2, p2+*idx2, x); idx2++;
19
+ y = m_from_real(x);
20
+ SET_DATA_INDEX(p1,idx1,dtype,y);
21
+ }
22
+ } else {
23
+ for (; i--;) {
24
+ LOAD_BIT(a2, p2+*idx2, x); idx2++;
25
+ y = m_from_real(x);
26
+ SET_DATA_STRIDE(p1,s1,dtype,y);
27
+ }
28
+ }
29
+ } else {
30
+ if (idx1) {
31
+ for (; i--;) {
32
+ LOAD_BIT(a2, p2, x); p2 += s2;
33
+ y = m_from_real(x);
34
+ SET_DATA_INDEX(p1,idx1,dtype,y);
35
+ }
36
+ } else {
37
+ for (; i--;) {
38
+ LOAD_BIT(a2, p2, x); p2 += s2;
39
+ y = m_from_real(x);
40
+ SET_DATA_STRIDE(p1,s1,dtype,y);
41
+ }
42
+ }
43
+ }
44
+ }
45
+
46
+
47
+ static VALUE
48
+ <%=c_func%>(VALUE self, VALUE obj)
49
+ {
50
+ ndfunc_arg_in_t ain[2] = {{OVERWRITE,0},{Qnil,0}};
51
+ ndfunc_t ndf = {<%=c_iter%>, FULL_LOOP, 2,0, ain,0};
52
+
53
+ na_ndloop(&ndf, 2, self, obj);
54
+ return self;
55
+ }