numo-narray 0.9.0.1-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.
Files changed (124) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/README.md +47 -0
  4. data/Rakefile +41 -0
  5. data/ext/numo/narray/SFMT-params.h +97 -0
  6. data/ext/numo/narray/SFMT-params19937.h +46 -0
  7. data/ext/numo/narray/SFMT.c +620 -0
  8. data/ext/numo/narray/SFMT.h +157 -0
  9. data/ext/numo/narray/array.c +525 -0
  10. data/ext/numo/narray/data.c +901 -0
  11. data/ext/numo/narray/depend.erb +33 -0
  12. data/ext/numo/narray/extconf.rb +117 -0
  13. data/ext/numo/narray/gen/bit.erb.c +811 -0
  14. data/ext/numo/narray/gen/cogen.rb +18 -0
  15. data/ext/numo/narray/gen/def/dcomplex.rb +32 -0
  16. data/ext/numo/narray/gen/def/dfloat.rb +30 -0
  17. data/ext/numo/narray/gen/def/int16.rb +29 -0
  18. data/ext/numo/narray/gen/def/int32.rb +29 -0
  19. data/ext/numo/narray/gen/def/int64.rb +29 -0
  20. data/ext/numo/narray/gen/def/int8.rb +29 -0
  21. data/ext/numo/narray/gen/def/robject.rb +30 -0
  22. data/ext/numo/narray/gen/def/scomplex.rb +32 -0
  23. data/ext/numo/narray/gen/def/sfloat.rb +30 -0
  24. data/ext/numo/narray/gen/def/uint16.rb +29 -0
  25. data/ext/numo/narray/gen/def/uint32.rb +29 -0
  26. data/ext/numo/narray/gen/def/uint64.rb +29 -0
  27. data/ext/numo/narray/gen/def/uint8.rb +29 -0
  28. data/ext/numo/narray/gen/dtype.erb.c +328 -0
  29. data/ext/numo/narray/gen/tmpl/accum.c +36 -0
  30. data/ext/numo/narray/gen/tmpl/accum_binary.c +75 -0
  31. data/ext/numo/narray/gen/tmpl/accum_index.c +58 -0
  32. data/ext/numo/narray/gen/tmpl/allocate.c +35 -0
  33. data/ext/numo/narray/gen/tmpl/aref.c +51 -0
  34. data/ext/numo/narray/gen/tmpl/aset.c +61 -0
  35. data/ext/numo/narray/gen/tmpl/binary.c +53 -0
  36. data/ext/numo/narray/gen/tmpl/binary2.c +55 -0
  37. data/ext/numo/narray/gen/tmpl/binary_s.c +34 -0
  38. data/ext/numo/narray/gen/tmpl/bit_binary.c +94 -0
  39. data/ext/numo/narray/gen/tmpl/bit_count.c +82 -0
  40. data/ext/numo/narray/gen/tmpl/bit_unary.c +77 -0
  41. data/ext/numo/narray/gen/tmpl/cast.c +37 -0
  42. data/ext/numo/narray/gen/tmpl/cast_array.c +79 -0
  43. data/ext/numo/narray/gen/tmpl/cast_numeric.c +22 -0
  44. data/ext/numo/narray/gen/tmpl/coerce_cast.c +8 -0
  45. data/ext/numo/narray/gen/tmpl/cond_binary.c +51 -0
  46. data/ext/numo/narray/gen/tmpl/cond_unary.c +45 -0
  47. data/ext/numo/narray/gen/tmpl/cum.c +42 -0
  48. data/ext/numo/narray/gen/tmpl/each.c +43 -0
  49. data/ext/numo/narray/gen/tmpl/each_with_index.c +64 -0
  50. data/ext/numo/narray/gen/tmpl/extract.c +23 -0
  51. data/ext/numo/narray/gen/tmpl/eye.c +91 -0
  52. data/ext/numo/narray/gen/tmpl/fill.c +38 -0
  53. data/ext/numo/narray/gen/tmpl/format.c +60 -0
  54. data/ext/numo/narray/gen/tmpl/format_to_a.c +47 -0
  55. data/ext/numo/narray/gen/tmpl/head.c +25 -0
  56. data/ext/numo/narray/gen/tmpl/inspect.c +16 -0
  57. data/ext/numo/narray/gen/tmpl/map_with_index.c +94 -0
  58. data/ext/numo/narray/gen/tmpl/median.c +44 -0
  59. data/ext/numo/narray/gen/tmpl/minmax.c +47 -0
  60. data/ext/numo/narray/gen/tmpl/poly.c +49 -0
  61. data/ext/numo/narray/gen/tmpl/pow.c +74 -0
  62. data/ext/numo/narray/gen/tmpl/powint.c +17 -0
  63. data/ext/numo/narray/gen/tmpl/qsort.c +149 -0
  64. data/ext/numo/narray/gen/tmpl/rand.c +33 -0
  65. data/ext/numo/narray/gen/tmpl/rand_norm.c +46 -0
  66. data/ext/numo/narray/gen/tmpl/robj_allocate.c +32 -0
  67. data/ext/numo/narray/gen/tmpl/seq.c +61 -0
  68. data/ext/numo/narray/gen/tmpl/set2.c +56 -0
  69. data/ext/numo/narray/gen/tmpl/sort.c +36 -0
  70. data/ext/numo/narray/gen/tmpl/sort_index.c +86 -0
  71. data/ext/numo/narray/gen/tmpl/store.c +31 -0
  72. data/ext/numo/narray/gen/tmpl/store_array.c +5 -0
  73. data/ext/numo/narray/gen/tmpl/store_from.c +53 -0
  74. data/ext/numo/narray/gen/tmpl/store_numeric.c +22 -0
  75. data/ext/numo/narray/gen/tmpl/to_a.c +41 -0
  76. data/ext/numo/narray/gen/tmpl/unary.c +58 -0
  77. data/ext/numo/narray/gen/tmpl/unary2.c +58 -0
  78. data/ext/numo/narray/gen/tmpl/unary_s.c +57 -0
  79. data/ext/numo/narray/index.c +822 -0
  80. data/ext/numo/narray/kwarg.c +79 -0
  81. data/ext/numo/narray/math.c +140 -0
  82. data/ext/numo/narray/narray.c +1539 -0
  83. data/ext/numo/narray/ndloop.c +1928 -0
  84. data/ext/numo/narray/numo/compat.h +23 -0
  85. data/ext/numo/narray/numo/intern.h +112 -0
  86. data/ext/numo/narray/numo/narray.h +411 -0
  87. data/ext/numo/narray/numo/ndloop.h +99 -0
  88. data/ext/numo/narray/numo/template.h +140 -0
  89. data/ext/numo/narray/numo/types/bit.h +19 -0
  90. data/ext/numo/narray/numo/types/complex.h +410 -0
  91. data/ext/numo/narray/numo/types/complex_macro.h +205 -0
  92. data/ext/numo/narray/numo/types/dcomplex.h +11 -0
  93. data/ext/numo/narray/numo/types/dfloat.h +12 -0
  94. data/ext/numo/narray/numo/types/float_def.h +34 -0
  95. data/ext/numo/narray/numo/types/float_macro.h +277 -0
  96. data/ext/numo/narray/numo/types/int16.h +12 -0
  97. data/ext/numo/narray/numo/types/int32.h +12 -0
  98. data/ext/numo/narray/numo/types/int64.h +12 -0
  99. data/ext/numo/narray/numo/types/int8.h +12 -0
  100. data/ext/numo/narray/numo/types/int_macro.h +34 -0
  101. data/ext/numo/narray/numo/types/robj_macro.h +218 -0
  102. data/ext/numo/narray/numo/types/robject.h +21 -0
  103. data/ext/numo/narray/numo/types/scomplex.h +11 -0
  104. data/ext/numo/narray/numo/types/sfloat.h +13 -0
  105. data/ext/numo/narray/numo/types/uint16.h +12 -0
  106. data/ext/numo/narray/numo/types/uint32.h +12 -0
  107. data/ext/numo/narray/numo/types/uint64.h +12 -0
  108. data/ext/numo/narray/numo/types/uint8.h +12 -0
  109. data/ext/numo/narray/numo/types/uint_macro.h +31 -0
  110. data/ext/numo/narray/numo/types/xint_macro.h +133 -0
  111. data/ext/numo/narray/rand.c +87 -0
  112. data/ext/numo/narray/step.c +506 -0
  113. data/ext/numo/narray/struct.c +872 -0
  114. data/lib/2.1/numo/narray.so +0 -0
  115. data/lib/2.2/numo/narray.so +0 -0
  116. data/lib/2.3/numo/narray.so +0 -0
  117. data/lib/erbpp.rb +286 -0
  118. data/lib/erbpp/line_number.rb +126 -0
  119. data/lib/erbpp/narray_def.rb +338 -0
  120. data/lib/numo/narray.rb +6 -0
  121. data/numo-narray.gemspec +35 -0
  122. data/spec/bit_spec.rb +93 -0
  123. data/spec/narray_spec.rb +249 -0
  124. metadata +238 -0
@@ -0,0 +1,36 @@
1
+ static void
2
+ <%=c_iter%>(na_loop_t *const lp)
3
+ {
4
+ size_t n;
5
+ char *p1, *p2;
6
+ ssize_t s1;
7
+
8
+ INIT_COUNTER(lp, n);
9
+ INIT_PTR(lp, 0, p1, s1);
10
+ p2 = lp->args[1].ptr + lp->args[1].iter[0].pos;
11
+
12
+ *(<%=dtype%>*)p2 = f_<%=method%>(n,p1,s1);
13
+ }
14
+
15
+ /*
16
+ <%=method.capitalize%> of self.
17
+ @overload <%=method%>(*args)
18
+ @param [Array of Numeric,Range] args Affected dimensions.
19
+ @return [Numo::<%=class_name%>] <%=method%> of self.
20
+ */
21
+ static VALUE
22
+ <%=c_func%>(int argc, VALUE *argv, VALUE self)
23
+ {
24
+ VALUE v, reduce;
25
+ ndfunc_arg_in_t ain[2] = {{cT,0},{sym_reduce,0}};
26
+ ndfunc_arg_out_t aout[1] = {{<%=tpclass%>,0}};
27
+ ndfunc_t ndf = { <%=c_iter%>, STRIDE_LOOP_NIP|NDF_FLAT_REDUCE, 2, 1, ain, aout };
28
+
29
+ reduce = na_reduce_dimension(argc, argv, 1, &self);
30
+ v = na_ndloop(&ndf, 2, self, reduce);
31
+ <% if tpclass == "cT" %>
32
+ return numo_<%=tp%>_extract(v);
33
+ <% else %>
34
+ return rb_funcall(v,rb_intern("extract"),0);
35
+ <% end %>
36
+ }
@@ -0,0 +1,75 @@
1
+ static void
2
+ <%=c_iter%>(na_loop_t *const lp)
3
+ {
4
+ size_t i;
5
+ char *p1, *p2, *p3;
6
+ ssize_t s1, s2, s3;
7
+ dtype x, y, z;
8
+
9
+ INIT_COUNTER(lp, i);
10
+ INIT_PTR(lp, 0, p1, s1);
11
+ INIT_PTR(lp, 1, p2, s2);
12
+ INIT_PTR(lp, 2, p3, s3);
13
+ if (s3==0) {
14
+ // Reduce loop
15
+ GET_DATA(p3,dtype,z);
16
+ for (; i--;) {
17
+ GET_DATA_STRIDE(p1,s1,dtype,x);
18
+ GET_DATA_STRIDE(p2,s2,dtype,y);
19
+ m_<%=method%>(x,y,z);
20
+ }
21
+ SET_DATA(p3,dtype,z);
22
+ } else {
23
+ for (; i--;) {
24
+ GET_DATA_STRIDE(p1,s1,dtype,x);
25
+ GET_DATA_STRIDE(p2,s2,dtype,y);
26
+ GET_DATA(p3,dtype,z);
27
+ m_<%=method%>(x,y,z);
28
+ SET_DATA_STRIDE(p3,s3,dtype,z);
29
+ }
30
+ }
31
+ }
32
+
33
+
34
+ static VALUE
35
+ <%=c_func%>_self(int argc, VALUE *argv, VALUE self)
36
+ {
37
+ VALUE v, reduce;
38
+ VALUE naryv[2];
39
+ ndfunc_arg_in_t ain[4] = {{cT,0},{cT,0},{sym_reduce,0},{sym_init,0}};
40
+ ndfunc_arg_out_t aout[1] = {{cT,0}};
41
+ ndfunc_t ndf = { <%=c_iter%>, STRIDE_LOOP_NIP, 4, 1, ain, aout };
42
+
43
+ if (argc < 1) {
44
+ rb_raise(rb_eArgError,"wrong number of arguments (%d for >=1)",argc);
45
+ }
46
+ // should fix below: [self.ndim,other.ndim].max or?
47
+ naryv[0] = self;
48
+ naryv[1] = argv[0];
49
+ reduce = na_reduce_dimension(argc-1, argv+1, 2, naryv);
50
+ v = na_ndloop(&ndf, 4, self, argv[0], reduce, m_<%=method%>_init);
51
+ return numo_<%=tp%>_extract(v);
52
+ }
53
+
54
+
55
+ /*
56
+ Binary <%=method%>.
57
+ @overload <%=op_map%> other
58
+ @param [Numo::NArray,Numeric] other
59
+ @return [Numo::NArray] <%=method%> of self and other.
60
+ */
61
+ static VALUE
62
+ <%=c_func%>(int argc, VALUE *argv, VALUE self)
63
+ {
64
+ VALUE klass, v;
65
+ if (argc < 1) {
66
+ rb_raise(rb_eArgError,"wrong number of arguments (%d for >=1)",argc);
67
+ }
68
+ klass = na_upcast(CLASS_OF(self),CLASS_OF(argv[0]));
69
+ if (klass==cT) {
70
+ return <%=c_func%>_self(argc, argv, self);
71
+ } else {
72
+ v = rb_funcall(klass, id_cast, 1, self);
73
+ return rb_funcall2(v, rb_intern("<%=method%>"), argc, argv);
74
+ }
75
+ }
@@ -0,0 +1,58 @@
1
+ <% [64,32].each do |i| %>
2
+ #define idx_t int<%=i%>_t
3
+ static void
4
+ <%=c_iter%>_index<%=i%>(na_loop_t *const lp)
5
+ {
6
+ size_t n, idx;
7
+ char *d_ptr, *i_ptr, *o_ptr;
8
+ ssize_t d_step, i_step;
9
+
10
+ INIT_COUNTER(lp, n);
11
+ INIT_PTR(lp, 0, d_ptr, d_step);
12
+
13
+ idx = f_<%=method%>(n,d_ptr,d_step);
14
+
15
+ INIT_PTR(lp, 1, i_ptr, i_step);
16
+ o_ptr = NDL_PTR(lp,2);
17
+ *(idx_t*)o_ptr = *(idx_t*)(i_ptr + i_step * idx);
18
+ }
19
+ #undef idx_t
20
+ <% end %>
21
+
22
+ /*
23
+ * call-seq:
24
+ * narray.<%=method%>() => Integer
25
+ * narray.<%=method%>(dim0,dim1,..) => Integer or Numo::Int32/64
26
+ *
27
+ * Return an index of result.
28
+ *
29
+ * Numo::NArray[3,4,1,2].min_index => 3
30
+ */
31
+ static VALUE
32
+ <%=c_func%>(int argc, VALUE *argv, VALUE self)
33
+ {
34
+ narray_t *na;
35
+ VALUE idx, reduce;
36
+ ndfunc_arg_in_t ain[3] = {{Qnil,0},{Qnil,0},{sym_reduce,0}};
37
+ ndfunc_arg_out_t aout[1] = {{0,0,0}};
38
+ ndfunc_t ndf = {0, STRIDE_LOOP_NIP|NDF_FLAT_REDUCE|NDF_EXTRACT, 3,1, ain,aout};
39
+
40
+ GetNArray(self,na);
41
+ if (na->ndim==0) {
42
+ return INT2FIX(0);
43
+ }
44
+ if (na->size > (~(u_int32_t)0)) {
45
+ aout[0].type = numo_cInt64;
46
+ idx = rb_narray_new(numo_cInt64, na->ndim, na->shape);
47
+ ndf.func = <%=c_iter%>_index64;
48
+ } else {
49
+ aout[0].type = numo_cInt32;
50
+ idx = rb_narray_new(numo_cInt32, na->ndim, na->shape);
51
+ ndf.func = <%=c_iter%>_index32;
52
+ }
53
+ rb_funcall(idx, rb_intern("seq"), 0);
54
+
55
+ reduce = na_reduce_dimension(argc, argv, 1, &self);
56
+
57
+ return na_ndloop(&ndf, 3, self, idx, reduce);
58
+ }
@@ -0,0 +1,35 @@
1
+ static VALUE
2
+ <%=c_func%>(VALUE self)
3
+ {
4
+ narray_t *na;
5
+ char *ptr;
6
+
7
+ GetNArray(self,na);
8
+
9
+ switch(NA_TYPE(na)) {
10
+ case NARRAY_DATA_T:
11
+ ptr = NA_DATA_PTR(na);
12
+ if (na->size > 0 && ptr == NULL) {
13
+ ptr = xmalloc(sizeof(dtype) * na->size);
14
+ <% if is_object %>
15
+ { size_t i;
16
+ VALUE *a = (VALUE*)ptr;
17
+ for (i=na->size; i--;) {
18
+ *a++ = Qnil;
19
+ }
20
+ }
21
+ <% end %>
22
+ NA_DATA_PTR(na) = ptr;
23
+ }
24
+ break;
25
+ case NARRAY_VIEW_T:
26
+ rb_funcall(NA_VIEW_DATA(na), rb_intern("allocate"), 0);
27
+ break;
28
+ case NARRAY_FILEMAP_T:
29
+ //ptr = ((narray_filemap_t*)na)->ptr;
30
+ // to be implemented
31
+ default:
32
+ rb_bug("invalid narray type : %d",NA_TYPE(na));
33
+ }
34
+ return self;
35
+ }
@@ -0,0 +1,51 @@
1
+ /*
2
+ Array element referenece or slice view.
3
+ @overload [](dim0,...,dimL)
4
+ @param [Numeric,Range,etc] dim0,...,dimL Multi-dimensional Index.
5
+ @return [Numeric,NArray::<%=class_name%>] Element object or NArray view.
6
+
7
+ --- Returns the element at +dim0+, +dim1+, ... are Numeric indices
8
+ for each dimension, or returns a NArray View as a sliced subarray if
9
+ +dim0+, +dim1+, ... includes other than Numeric index, e.g., Range
10
+ or Array or true.
11
+
12
+ a = Numo::DFloat.new(4,5).seq
13
+ => Numo::DFloat#shape=[4,5]
14
+ [[0, 1, 2, 3, 4],
15
+ [5, 6, 7, 8, 9],
16
+ [10, 11, 12, 13, 14],
17
+ [15, 16, 17, 18, 19]]
18
+
19
+ a[1,1]
20
+ => 6.0
21
+
22
+ a[1..3,1]
23
+ => Numo::DFloat#shape=[3]
24
+ [6, 11, 16]
25
+
26
+ a[1,[1,3,4]]
27
+ => Numo::DFloat#shape=[3]
28
+ [6, 8, 9]
29
+
30
+ a[true,2].fill(99)
31
+ a
32
+ => Numo::DFloat#shape=[4,5]
33
+ [[0, 1, 99, 3, 4],
34
+ [5, 6, 99, 8, 9],
35
+ [10, 11, 99, 13, 14],
36
+ [15, 16, 99, 18, 19]]
37
+ */
38
+ static VALUE
39
+ <%=c_func%>(int argc, VALUE *argv, VALUE self)
40
+ {
41
+ ssize_t pos;
42
+ char *ptr;
43
+
44
+ pos = na_get_scalar_position(self, argc, argv, sizeof(dtype));
45
+ if (pos == -1) {
46
+ return na_aref_main(argc, argv, self, 0);
47
+ } else {
48
+ ptr = na_get_pointer_for_read(self) + pos;
49
+ return m_extract(ptr);
50
+ }
51
+ }
@@ -0,0 +1,61 @@
1
+ /*
2
+ Array element(s) set.
3
+ @overload []=(dim0,..,dimL,val)
4
+ @param [Numeric,Range,etc] dim0,..,dimL Multi-dimensional Index.
5
+ @param [Numeric,Numo::NArray,etc] val Value(s) to be set to self.
6
+ @return [Numeric] returns val (last argument).
7
+
8
+ --- Replace element(s) at +dim0+, +dim1+, ... (index/range/array/true
9
+ for each dimention). Broadcasting mechanism is applied.
10
+
11
+ a = Numo::DFloat.new(3,4).seq
12
+ => Numo::DFloat#shape=[3,4]
13
+ [[0, 1, 2, 3],
14
+ [4, 5, 6, 7],
15
+ [8, 9, 10, 11]]
16
+
17
+ a[1,2]=99
18
+ a
19
+ => Numo::DFloat#shape=[3,4]
20
+ [[0, 1, 2, 3],
21
+ [4, 5, 99, 7],
22
+ [8, 9, 10, 11]]
23
+
24
+ a[1,[0,2]] = [101,102]
25
+ a
26
+ => Numo::DFloat#shape=[3,4]
27
+ [[0, 1, 2, 3],
28
+ [101, 5, 102, 7],
29
+ [8, 9, 10, 11]]
30
+
31
+ a[1,true]=99
32
+ a
33
+ => Numo::DFloat#shape=[3,4]
34
+ [[0, 1, 2, 3],
35
+ [99, 99, 99, 99],
36
+ [8, 9, 10, 11]]
37
+
38
+ */
39
+ static VALUE
40
+ <%=c_func%>(int argc, VALUE *argv, VALUE self)
41
+ {
42
+ ssize_t pos;
43
+ char *ptr;
44
+ VALUE a;
45
+
46
+ argc--;
47
+ if (argc==0) {
48
+ <%=c_func.sub(/_aset/,"_store")%>(self, argv[argc]);
49
+ } else {
50
+ pos = na_get_scalar_position(self, argc, argv, sizeof(dtype));
51
+ if (pos == -1) {
52
+ a = na_aref_main(argc, argv, self, 0);
53
+ <%=c_func.sub(/_aset/,"_store")%>(a, argv[argc]);
54
+ } else {
55
+ ptr = na_get_pointer_for_read(self) + pos;
56
+ *(dtype*)ptr = m_num_to_data(argv[argc]);
57
+ }
58
+
59
+ }
60
+ return argv[argc];
61
+ }
@@ -0,0 +1,53 @@
1
+ static void
2
+ <%=c_iter%>(na_loop_t *const lp)
3
+ {
4
+ size_t i, n;
5
+ char *p1, *p2, *p3;
6
+ ssize_t s1, s2, s3;
7
+ dtype x, y;
8
+ INIT_COUNTER(lp, n);
9
+ INIT_PTR(lp, 0, p1, s1);
10
+ INIT_PTR(lp, 1, p2, s2);
11
+ INIT_PTR(lp, 2, p3, s3);
12
+ for (i=n; i--;) {
13
+ GET_DATA_STRIDE(p1,s1,dtype,x);
14
+ GET_DATA_STRIDE(p2,s2,dtype,y);
15
+ <% if is_int and %w[div mod divmod].include? method %>
16
+ if (y==0) {
17
+ lp->err_type = rb_eZeroDivError;
18
+ return;
19
+ }
20
+ <% end %>
21
+ x = m_<%=method%>(x,y);
22
+ SET_DATA_STRIDE(p3,s3,dtype,x);
23
+ }
24
+ }
25
+
26
+ static VALUE
27
+ <%=c_func%>_self(VALUE self, VALUE other)
28
+ {
29
+ ndfunc_arg_in_t ain[2] = {{cT,0},{cT,0}};
30
+ ndfunc_arg_out_t aout[1] = {{cT,0}};
31
+ ndfunc_t ndf = { <%=c_iter%>, STRIDE_LOOP, 2, 1, ain, aout };
32
+
33
+ return na_ndloop(&ndf, 2, self, other);
34
+ }
35
+
36
+ /*
37
+ Binary <%=method%>.
38
+ @overload <%=op_map%> other
39
+ @param [Numo::NArray,Numeric] other
40
+ @return [Numo::NArray] self <%=op_map%> other
41
+ */
42
+ static VALUE
43
+ <%=c_func%>(VALUE self, VALUE other)
44
+ {
45
+ VALUE klass, v;
46
+ klass = na_upcast(CLASS_OF(self),CLASS_OF(other));
47
+ if (klass==cT) {
48
+ return <%=c_func%>_self(self, other);
49
+ } else {
50
+ v = rb_funcall(klass, id_cast, 1, self);
51
+ return rb_funcall(v, <%=id_op%>, 1, other);
52
+ }
53
+ }
@@ -0,0 +1,55 @@
1
+ static void
2
+ <%=c_iter%>(na_loop_t *const lp)
3
+ {
4
+ size_t i, n;
5
+ char *p1, *p2, *p3, *p4;
6
+ ssize_t s1, s2, s3, s4;
7
+ dtype x, y, a, b;
8
+ INIT_COUNTER(lp, n);
9
+ INIT_PTR(lp, 0, p1, s1);
10
+ INIT_PTR(lp, 1, p2, s2);
11
+ INIT_PTR(lp, 2, p3, s3);
12
+ INIT_PTR(lp, 3, p4, s4);
13
+ for (i=n; i--;) {
14
+ GET_DATA_STRIDE(p1,s1,dtype,x);
15
+ GET_DATA_STRIDE(p2,s2,dtype,y);
16
+ <% if is_int and %w[divmod].include? method %>
17
+ if (y==0) {
18
+ lp->err_type = rb_eZeroDivError;
19
+ return;
20
+ }
21
+ <% end %>
22
+ m_<%=method%>(x,y,a,b);
23
+ SET_DATA_STRIDE(p3,s3,dtype,a);
24
+ SET_DATA_STRIDE(p4,s4,dtype,b);
25
+ }
26
+ }
27
+
28
+ static VALUE
29
+ <%=c_func%>_self(VALUE self, VALUE other)
30
+ {
31
+ ndfunc_arg_in_t ain[2] = {{cT,0},{cT,0}};
32
+ ndfunc_arg_out_t aout[2] = {{cT,0},{cT,0}};
33
+ ndfunc_t ndf = { <%=c_iter%>, STRIDE_LOOP, 2, 2, ain, aout };
34
+
35
+ return na_ndloop(&ndf, 2, self, other);
36
+ }
37
+
38
+ /*
39
+ Binary <%=method%>.
40
+ @overload <%=op_map%> other
41
+ @param [Numo::NArray,Numeric] other
42
+ @return [Numo::NArray] <%=method%> of self and other.
43
+ */
44
+ static VALUE
45
+ <%=c_func%>(VALUE self, VALUE other)
46
+ {
47
+ VALUE klass, v;
48
+ klass = na_upcast(CLASS_OF(self),CLASS_OF(other));
49
+ if (klass==cT) {
50
+ return <%=c_func%>_self(self, other);
51
+ } else {
52
+ v = rb_funcall(klass, id_cast, 1, self);
53
+ return rb_funcall(v, <%=id_op%>, 1, other);
54
+ }
55
+ }
@@ -0,0 +1,34 @@
1
+ static void
2
+ <%=c_iter%>(na_loop_t *const lp)
3
+ {
4
+ size_t i;
5
+ char *p1, *p2, *p3;
6
+ ssize_t s1, s2, s3;
7
+ dtype x, y;
8
+ INIT_COUNTER(lp, i);
9
+ INIT_PTR(lp, 0, p1, s1);
10
+ INIT_PTR(lp, 1, p2, s2);
11
+ INIT_PTR(lp, 2, p3, s3);
12
+ for (; i--;) {
13
+ GET_DATA_STRIDE(p1,s1,dtype,x);
14
+ GET_DATA_STRIDE(p2,s2,dtype,y);
15
+ x = m_<%=method%>(x,y);
16
+ SET_DATA_STRIDE(p3,s3,dtype,x);
17
+ }
18
+ }
19
+
20
+ /*
21
+ Calculate <%=method%>(a1,a2).
22
+ @overload <%=method%>(a1,a2)
23
+ @param [Numo::NArray,Numeric] a1 first value
24
+ @param [Numo::NArray,Numeric] a2 second value
25
+ @return [Numo::<%=class_name%>] <%=method%>(a1,a2).
26
+ */
27
+ static VALUE
28
+ <%=c_func%>(VALUE mod, VALUE a1, VALUE a2)
29
+ {
30
+ ndfunc_arg_in_t ain[2] = {{cT,0},{cT,0}};
31
+ ndfunc_arg_out_t aout[1] = {{cT,0}};
32
+ ndfunc_t ndf = { <%=c_iter%>, STRIDE_LOOP, 2, 1, ain, aout };
33
+ return na_ndloop(&ndf, 2, a1, a2);
34
+ }