numo-narray-alt 0.9.3

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 (66) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +14 -0
  3. data/LICENSE +30 -0
  4. data/README.md +71 -0
  5. data/Rakefile +24 -0
  6. data/ext/numo/narray/SFMT-params.h +97 -0
  7. data/ext/numo/narray/SFMT-params19937.h +48 -0
  8. data/ext/numo/narray/SFMT.c +602 -0
  9. data/ext/numo/narray/SFMT.h +147 -0
  10. data/ext/numo/narray/array.c +575 -0
  11. data/ext/numo/narray/data.c +958 -0
  12. data/ext/numo/narray/extconf.rb +84 -0
  13. data/ext/numo/narray/index.c +1092 -0
  14. data/ext/numo/narray/kwargs.c +142 -0
  15. data/ext/numo/narray/math.c +133 -0
  16. data/ext/numo/narray/narray.c +1976 -0
  17. data/ext/numo/narray/narray.def +28 -0
  18. data/ext/numo/narray/ndloop.c +1840 -0
  19. data/ext/numo/narray/numo/compat.h +23 -0
  20. data/ext/numo/narray/numo/intern.h +115 -0
  21. data/ext/numo/narray/numo/narray.h +480 -0
  22. data/ext/numo/narray/numo/ndloop.h +93 -0
  23. data/ext/numo/narray/numo/template.h +149 -0
  24. data/ext/numo/narray/numo/types/bit.h +38 -0
  25. data/ext/numo/narray/numo/types/complex.h +404 -0
  26. data/ext/numo/narray/numo/types/complex_macro.h +384 -0
  27. data/ext/numo/narray/numo/types/dcomplex.h +42 -0
  28. data/ext/numo/narray/numo/types/dfloat.h +44 -0
  29. data/ext/numo/narray/numo/types/float_def.h +34 -0
  30. data/ext/numo/narray/numo/types/float_macro.h +202 -0
  31. data/ext/numo/narray/numo/types/int16.h +27 -0
  32. data/ext/numo/narray/numo/types/int32.h +23 -0
  33. data/ext/numo/narray/numo/types/int64.h +23 -0
  34. data/ext/numo/narray/numo/types/int8.h +23 -0
  35. data/ext/numo/narray/numo/types/int_macro.h +66 -0
  36. data/ext/numo/narray/numo/types/real_accum.h +481 -0
  37. data/ext/numo/narray/numo/types/robj_macro.h +78 -0
  38. data/ext/numo/narray/numo/types/robject.h +25 -0
  39. data/ext/numo/narray/numo/types/scomplex.h +42 -0
  40. data/ext/numo/narray/numo/types/sfloat.h +45 -0
  41. data/ext/numo/narray/numo/types/uint16.h +24 -0
  42. data/ext/numo/narray/numo/types/uint32.h +20 -0
  43. data/ext/numo/narray/numo/types/uint64.h +20 -0
  44. data/ext/numo/narray/numo/types/uint8.h +20 -0
  45. data/ext/numo/narray/numo/types/uint_macro.h +57 -0
  46. data/ext/numo/narray/numo/types/xint_macro.h +166 -0
  47. data/ext/numo/narray/rand.c +40 -0
  48. data/ext/numo/narray/src/t_bit.c +3236 -0
  49. data/ext/numo/narray/src/t_dcomplex.c +6776 -0
  50. data/ext/numo/narray/src/t_dfloat.c +9417 -0
  51. data/ext/numo/narray/src/t_int16.c +5757 -0
  52. data/ext/numo/narray/src/t_int32.c +5757 -0
  53. data/ext/numo/narray/src/t_int64.c +5759 -0
  54. data/ext/numo/narray/src/t_int8.c +5355 -0
  55. data/ext/numo/narray/src/t_robject.c +5567 -0
  56. data/ext/numo/narray/src/t_scomplex.c +6731 -0
  57. data/ext/numo/narray/src/t_sfloat.c +9374 -0
  58. data/ext/numo/narray/src/t_uint16.c +5753 -0
  59. data/ext/numo/narray/src/t_uint32.c +5753 -0
  60. data/ext/numo/narray/src/t_uint64.c +5755 -0
  61. data/ext/numo/narray/src/t_uint8.c +5351 -0
  62. data/ext/numo/narray/step.c +266 -0
  63. data/ext/numo/narray/struct.c +814 -0
  64. data/lib/numo/narray/extra.rb +1266 -0
  65. data/lib/numo/narray.rb +4 -0
  66. metadata +106 -0
@@ -0,0 +1,266 @@
1
+ /*
2
+ step.c
3
+ Ruby/Numo::NArray - Numerical Array class for Ruby
4
+ Copyright (C) 2007-2020 Masahiro TANAKA
5
+ */
6
+ #include <math.h>
7
+ #include <ruby.h>
8
+
9
+ #include "numo/narray.h"
10
+
11
+ #if defined(__FreeBSD__) && __FreeBSD__ < 4
12
+ #include <floatingpoint.h>
13
+ #endif
14
+
15
+ #ifdef HAVE_FLOAT_H
16
+ #include <float.h>
17
+ #endif
18
+
19
+ #ifdef HAVE_IEEEFP_H
20
+ #include <ieeefp.h>
21
+ #endif
22
+
23
+ #ifndef DBL_EPSILON
24
+ #define DBL_EPSILON 2.2204460492503131e-16
25
+ #endif
26
+
27
+ static ID id_beg, id_end, id_len, id_step;
28
+
29
+ #define EXCL(r) RTEST(rb_funcall((r), rb_intern("exclude_end?"), 0))
30
+
31
+ /*
32
+ * call-seq:
33
+ * step.parameters([array_size]) => [start,step,length]
34
+ *
35
+ * Returns the iteration parameters of <i>step</i>. If
36
+ * <i>array_sizse</i> is given, negative array index is considered.
37
+ */
38
+
39
+ void nary_step_array_index(VALUE obj, size_t ary_size, size_t* plen, ssize_t* pbeg, ssize_t* pstep) {
40
+ size_t len;
41
+ ssize_t beg = 0, step = 1;
42
+ VALUE vbeg, vend, vstep, vlen;
43
+ ssize_t end = ary_size;
44
+
45
+ #ifdef HAVE_RB_ARITHMETIC_SEQUENCE_EXTRACT
46
+ rb_arithmetic_sequence_components_t x;
47
+ rb_arithmetic_sequence_extract(obj, &x);
48
+
49
+ vstep = x.step;
50
+ vbeg = x.begin;
51
+ vend = x.end;
52
+ #else
53
+ struct enumerator* e;
54
+
55
+ if (rb_obj_is_kind_of(obj, rb_cRange)) {
56
+ vstep = rb_ivar_get(obj, id_step);
57
+ } else { // Enumerator
58
+ na_parse_enumerator_step(obj, &vstep);
59
+ e = RENUMERATOR_PTR(obj);
60
+ obj = e->obj; // Range
61
+ }
62
+
63
+ vbeg = rb_funcall(obj, id_beg, 0);
64
+ vend = rb_funcall(obj, id_end, 0);
65
+ #endif
66
+ vlen = rb_ivar_get(obj, id_len);
67
+
68
+ if (RTEST(vbeg)) {
69
+ beg = NUM2SSIZET(vbeg);
70
+ if (beg < 0) {
71
+ beg += ary_size;
72
+ }
73
+ }
74
+ if (RTEST(vend)) {
75
+ end = NUM2SSIZET(vend);
76
+ if (end < 0) {
77
+ end += ary_size;
78
+ }
79
+ }
80
+
81
+ // puts("pass 1");
82
+
83
+ if (RTEST(vlen)) {
84
+ len = NUM2SIZET(vlen);
85
+ if (len > 0) {
86
+ if (RTEST(vstep)) {
87
+ step = NUM2SSIZET(step);
88
+ if (RTEST(vbeg)) {
89
+ if (RTEST(vend)) {
90
+ rb_raise(rb_eStandardError, "verbose Step object");
91
+ } else {
92
+ end = beg + step * (len - 1);
93
+ }
94
+ } else {
95
+ if (RTEST(vend)) {
96
+ if (EXCL(obj)) {
97
+ if (step > 0) end--;
98
+ if (step < 0) end++;
99
+ }
100
+ beg = end - step * (len - 1);
101
+ } else {
102
+ beg = 0;
103
+ end = step * (len - 1);
104
+ }
105
+ }
106
+ } else { // no step
107
+ step = 1;
108
+ if (RTEST(vbeg)) {
109
+ if (RTEST(vend)) {
110
+ if (EXCL(obj)) {
111
+ if (beg < end) end--;
112
+ if (beg > end) end++;
113
+ }
114
+ if (len > 1) step = (end - beg) / (len - 1);
115
+ } else {
116
+ end = beg + (len - 1);
117
+ }
118
+ } else {
119
+ if (RTEST(vend)) {
120
+ if (EXCL(obj)) {
121
+ end--;
122
+ }
123
+ beg = end - (len - 1);
124
+ } else {
125
+ beg = 0;
126
+ end = len - 1;
127
+ }
128
+ }
129
+ }
130
+ }
131
+ } else { // no len
132
+ if (RTEST(vstep)) {
133
+ step = NUM2SSIZET(vstep);
134
+ } else {
135
+ step = 1;
136
+ }
137
+ if (step > 0) {
138
+ if (!RTEST(vbeg)) {
139
+ beg = 0;
140
+ }
141
+ if (!RTEST(vend)) {
142
+ end = ary_size - 1;
143
+ } else if (EXCL(obj)) {
144
+ end--;
145
+ }
146
+ if (beg <= end) {
147
+ len = (end - beg) / step + 1;
148
+ } else {
149
+ len = 0;
150
+ }
151
+ } else if (step < 0) {
152
+ if (!RTEST(vbeg)) {
153
+ beg = ary_size - 1;
154
+ }
155
+ if (!RTEST(vend)) {
156
+ end = 0;
157
+ } else if (EXCL(obj)) {
158
+ end++;
159
+ }
160
+ if (beg >= end) {
161
+ len = (beg - end) / (-step) + 1;
162
+ } else {
163
+ len = 0;
164
+ }
165
+ } else {
166
+ rb_raise(rb_eStandardError, "step must be non-zero");
167
+ }
168
+ }
169
+
170
+ // puts("pass 2");
171
+
172
+ if (beg < 0 || beg >= (ssize_t)ary_size || end < 0 || end >= (ssize_t)ary_size) {
173
+ rb_raise(rb_eRangeError, "beg=%" SZF "d,end=%" SZF "d is out of array size (%" SZF "u)", beg, end, ary_size);
174
+ }
175
+ if (plen) *plen = len;
176
+ if (pbeg) *pbeg = beg;
177
+ if (pstep) *pstep = step;
178
+ }
179
+
180
+ void nary_step_sequence(VALUE obj, size_t* plen, double* pbeg, double* pstep) {
181
+ VALUE vend, vstep, vlen;
182
+ double dbeg, dend, dstep = 1, dsize, err;
183
+ size_t size, n;
184
+
185
+ #ifdef HAVE_RB_ARITHMETIC_SEQUENCE_EXTRACT
186
+ rb_arithmetic_sequence_components_t x;
187
+ rb_arithmetic_sequence_extract(obj, &x);
188
+
189
+ vstep = x.step;
190
+ dbeg = NUM2DBL(x.begin);
191
+ vend = x.end;
192
+ #else
193
+ struct enumerator* e;
194
+
195
+ if (rb_obj_is_kind_of(obj, rb_cRange)) {
196
+ vstep = rb_ivar_get(obj, id_step);
197
+ } else { // Enumerator
198
+ na_parse_enumerator_step(obj, &vstep);
199
+ e = RENUMERATOR_PTR(obj);
200
+ obj = e->obj; // Range
201
+ }
202
+
203
+ dbeg = NUM2DBL(rb_funcall(obj, id_beg, 0));
204
+ vend = rb_funcall(obj, id_end, 0);
205
+ #endif
206
+ vlen = rb_ivar_get(obj, id_len);
207
+
208
+ if (RTEST(vlen)) {
209
+ size = NUM2SIZET(vlen);
210
+
211
+ if (!RTEST(vstep)) {
212
+ if (RTEST(vend)) {
213
+ dend = NUM2DBL(vend);
214
+ if (EXCL(obj)) {
215
+ n = size;
216
+ } else {
217
+ n = size - 1;
218
+ }
219
+ if (n > 0) {
220
+ dstep = (dend - dbeg) / n;
221
+ } else {
222
+ dstep = 1;
223
+ }
224
+ } else {
225
+ dstep = 1;
226
+ }
227
+ }
228
+ } else {
229
+ if (!RTEST(vstep)) {
230
+ dstep = 1;
231
+ } else {
232
+ dstep = NUM2DBL(vstep);
233
+ }
234
+ if (RTEST(vend)) {
235
+ dend = NUM2DBL(vend);
236
+ err = (fabs(dbeg) + fabs(dend) + fabs(dend - dbeg)) / fabs(dstep) * DBL_EPSILON;
237
+ if (err > 0.5) err = 0.5;
238
+ dsize = (dend - dbeg) / dstep;
239
+ if (EXCL(obj))
240
+ dsize -= err;
241
+ else
242
+ dsize += err;
243
+ dsize = floor(dsize) + 1;
244
+ if (dsize < 0) dsize = 0;
245
+ if (isinf(dsize) || isnan(dsize)) {
246
+ rb_raise(rb_eArgError, "not finite size");
247
+ }
248
+ size = dsize;
249
+ } else {
250
+ rb_raise(rb_eArgError, "cannot determine length argument");
251
+ }
252
+ }
253
+
254
+ if (plen) *plen = size;
255
+ if (pbeg) *pbeg = dbeg;
256
+ if (pstep) *pstep = dstep;
257
+ }
258
+
259
+ void Init_nary_step(void) {
260
+ rb_define_alias(rb_cRange, "%", "step");
261
+
262
+ id_beg = rb_intern("begin");
263
+ id_end = rb_intern("end");
264
+ id_len = rb_intern("length");
265
+ id_step = rb_intern("step");
266
+ }