carray 1.4.0 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSES +22 -0
  3. data/README.md +18 -14
  4. data/Rakefile +1 -1
  5. data/carray.gemspec +5 -13
  6. data/{ca_iter_block.c → ext/ca_iter_block.c} +13 -13
  7. data/{ca_iter_dimension.c → ext/ca_iter_dimension.c} +16 -16
  8. data/{ca_iter_window.c → ext/ca_iter_window.c} +10 -10
  9. data/{ca_obj_array.c → ext/ca_obj_array.c} +60 -55
  10. data/{ca_obj_bitarray.c → ext/ca_obj_bitarray.c} +12 -12
  11. data/{ca_obj_bitfield.c → ext/ca_obj_bitfield.c} +7 -7
  12. data/{ca_obj_block.c → ext/ca_obj_block.c} +42 -42
  13. data/{ca_obj_fake.c → ext/ca_obj_fake.c} +7 -7
  14. data/{ca_obj_farray.c → ext/ca_obj_farray.c} +18 -18
  15. data/{ca_obj_field.c → ext/ca_obj_field.c} +15 -15
  16. data/{ca_obj_grid.c → ext/ca_obj_grid.c} +27 -27
  17. data/{ca_obj_mapping.c → ext/ca_obj_mapping.c} +9 -9
  18. data/{ca_obj_object.c → ext/ca_obj_object.c} +37 -37
  19. data/{ca_obj_reduce.c → ext/ca_obj_reduce.c} +1 -1
  20. data/{ca_obj_refer.c → ext/ca_obj_refer.c} +33 -33
  21. data/{ca_obj_repeat.c → ext/ca_obj_repeat.c} +43 -43
  22. data/{ca_obj_select.c → ext/ca_obj_select.c} +2 -2
  23. data/{ca_obj_shift.c → ext/ca_obj_shift.c} +23 -23
  24. data/{ca_obj_transpose.c → ext/ca_obj_transpose.c} +23 -23
  25. data/{ca_obj_unbound_repeat.c → ext/ca_obj_unbound_repeat.c} +55 -55
  26. data/{ca_obj_window.c → ext/ca_obj_window.c} +26 -26
  27. data/{carray.h → ext/carray.h} +73 -51
  28. data/{carray_access.c → ext/carray_access.c} +83 -83
  29. data/{carray_attribute.c → ext/carray_attribute.c} +12 -12
  30. data/{carray_call_cfunc.c → ext/carray_call_cfunc.c} +0 -0
  31. data/{carray_cast.c → ext/carray_cast.c} +6 -6
  32. data/{carray_cast_func.rb → ext/carray_cast_func.rb} +0 -0
  33. data/{carray_class.c → ext/carray_class.c} +0 -0
  34. data/{carray_conversion.c → ext/carray_conversion.c} +8 -10
  35. data/{carray_copy.c → ext/carray_copy.c} +19 -19
  36. data/{carray_core.c → ext/carray_core.c} +2 -2
  37. data/ext/carray_data_type.c +66 -0
  38. data/{carray_element.c → ext/carray_element.c} +9 -9
  39. data/{carray_generate.c → ext/carray_generate.c} +0 -0
  40. data/{carray_iterator.c → ext/carray_iterator.c} +40 -38
  41. data/{carray_loop.c → ext/carray_loop.c} +24 -24
  42. data/{carray_mask.c → ext/carray_mask.c} +17 -6
  43. data/{carray_math.rb → ext/carray_math.rb} +3 -3
  44. data/ext/{mathfunc/carray_mathfunc.c → carray_mathfunc.c} +0 -0
  45. data/{carray_numeric.c → ext/carray_numeric.c} +1 -1
  46. data/{carray_operator.c → ext/carray_operator.c} +9 -9
  47. data/{carray_order.c → ext/carray_order.c} +2 -153
  48. data/{carray_sort_addr.c → ext/carray_sort_addr.c} +0 -0
  49. data/{carray_stat.c → ext/carray_stat.c} +5 -5
  50. data/{carray_stat_proc.rb → ext/carray_stat_proc.rb} +23 -23
  51. data/{carray_test.c → ext/carray_test.c} +22 -21
  52. data/{carray_undef.c → ext/carray_undef.c} +0 -0
  53. data/{carray_utils.c → ext/carray_utils.c} +0 -0
  54. data/{extconf.rb → ext/extconf.rb} +0 -5
  55. data/{mkmath.rb → ext/mkmath.rb} +0 -0
  56. data/{ruby_carray.c → ext/ruby_carray.c} +9 -2
  57. data/{ruby_ccomplex.c → ext/ruby_ccomplex.c} +0 -0
  58. data/{ruby_float_func.c → ext/ruby_float_func.c} +0 -0
  59. data/{version.h → ext/version.h} +5 -5
  60. data/{version.rb → ext/version.rb} +0 -0
  61. data/lib/carray.rb +48 -37
  62. data/lib/carray/{base/autoload.rb → autoload.rb} +1 -1
  63. data/lib/carray/autoload/autoload_base.rb +1 -1
  64. data/lib/carray/autoload/autoload_gem_numo_narray.rb +4 -3
  65. data/lib/carray/autoload/autoload_gem_random.rb +8 -0
  66. data/lib/carray/basic.rb +193 -0
  67. data/lib/carray/compose.rb +291 -0
  68. data/lib/carray/construct.rb +445 -0
  69. data/lib/carray/convert.rb +115 -0
  70. data/lib/carray/{base/inspect.rb → inspect.rb} +6 -6
  71. data/lib/carray/io/imagemagick.rb +1 -1
  72. data/lib/carray/{base/iterator.rb → iterator.rb} +3 -3
  73. data/lib/carray/mask.rb +91 -0
  74. data/lib/carray/{base/math.rb → math.rb} +16 -46
  75. data/lib/carray/math/histogram.rb +7 -7
  76. data/lib/carray/mkmf.rb +8 -0
  77. data/lib/carray/object/ca_obj_pack.rb +8 -8
  78. data/lib/carray/obsolete.rb +272 -0
  79. data/lib/carray/ordering.rb +157 -0
  80. data/lib/carray/{base/serialize.rb → serialize.rb} +28 -53
  81. data/lib/carray/{base/string.rb → string.rb} +12 -64
  82. data/lib/carray/{base/struct.rb → struct.rb} +16 -16
  83. data/lib/carray/{io/table.rb → table.rb} +1 -10
  84. data/lib/carray/testing.rb +56 -0
  85. data/lib/carray/time.rb +78 -0
  86. data/lib/carray/transform.rb +100 -0
  87. data/misc/Methods.ja.md +182 -0
  88. data/{NOTE → misc/NOTE} +0 -0
  89. data/test/test_ALL.rb +0 -2
  90. data/test/test_order.rb +7 -7
  91. data/test/test_ref_store.rb +13 -13
  92. data/test/test_stat.rb +7 -15
  93. data/{devel → utils}/guess_shape.rb +0 -0
  94. data/utils/{diff_method.rb → monkey_patch_methods.rb} +17 -7
  95. metadata +88 -151
  96. data/COPYING +0 -56
  97. data/GPL +0 -340
  98. data/LEGAL +0 -50
  99. data/TODO +0 -5
  100. data/carray_random.c +0 -531
  101. data/devel/im2col.rb +0 -17
  102. data/ext/calculus/carray_calculus.c +0 -931
  103. data/ext/calculus/carray_interp.c +0 -358
  104. data/ext/calculus/extconf.rb +0 -12
  105. data/ext/calculus/lib/math/calculus.rb +0 -119
  106. data/ext/calculus/lib/math/interp/adapter_interp1d.rb +0 -31
  107. data/ext/mathfunc/extconf.rb +0 -18
  108. data/ext/mathfunc/test/test_hypot.rb +0 -5
  109. data/ext/mathfunc/test/test_j0.rb +0 -22
  110. data/ext/mathfunc/test/test_jn.rb +0 -8
  111. data/ext/mathfunc/test/test_sph.rb +0 -9
  112. data/lib/carray/autoload/autoload_io_table.rb +0 -1
  113. data/lib/carray/autoload/autoload_math_interp.rb +0 -4
  114. data/lib/carray/base/basic.rb +0 -1146
  115. data/lib/carray/base/obsolete.rb +0 -131
  116. data/lib/carray/math/interp.rb +0 -57
  117. data/lib/carray/math/interp/adapter_gsl_spline.rb +0 -47
  118. data/mt19937ar.c +0 -182
  119. data/mt19937ar.h +0 -86
  120. data/rdoc_main.rb +0 -27
  121. data/rdoc_math.rb +0 -5
  122. data/rdoc_stat.rb +0 -31
  123. data/test/test_narray.rb +0 -64
  124. data/test/test_random.rb +0 -15
  125. data/utils/create_rdoc.sh +0 -9
  126. data/utils/make_tgz.sh +0 -3
@@ -1,358 +0,0 @@
1
- /* ---------------------------------------------------------------------------
2
-
3
- carray/carray_interp.c
4
-
5
- This file is part of Ruby/CArray extension library.
6
- You can redistribute it and/or modify it under the terms of
7
- the Ruby Licence.
8
-
9
- Copyright (C) 2005 Hiroki Motoyoshi
10
-
11
- ---------------------------------------------------------------------------- */
12
-
13
- #include "ruby.h"
14
- #include "carray.h"
15
- #include <math.h>
16
-
17
- static int
18
- find_index (ca_size_t n, double *y, double yy, ca_size_t *major, double *frac)
19
- {
20
- ca_size_t a, b, c, x1;
21
- double ya, yb, yc;
22
- double y1, y2;
23
-
24
- if ( yy <= y[0] ) {
25
- x1 = 0;
26
- goto label;
27
- }
28
-
29
- if ( yy >= y[n-1] ) {
30
- x1 = n-2;
31
- goto label;
32
- }
33
-
34
- /* check for equally spaced scale */
35
-
36
- a = (ca_size_t)((yy-y[0])/(y[n-1]-y[0])*(n-1));
37
-
38
- if ( a >= 0 && a < n-1 ) {
39
- if ( (y[a] - yy) * (y[a+1] - yy) <= 0 ) {
40
- x1 = a;
41
- goto label;
42
- }
43
- }
44
-
45
- /* binary section method */
46
-
47
- a = 0;
48
- b = n-1;
49
-
50
- ya = y[a];
51
- yb = y[b];
52
-
53
- if ( ya > yb ) {
54
- return -1; /* input scale array should have accending order */
55
- }
56
-
57
- while ( (b - a) >= 1 ) {
58
- c = (a + b)/2;
59
- yc = y[c];
60
- if ( a == c ) {
61
- break;
62
- }
63
-
64
- if ( yc == yy ) {
65
- a = c;
66
- break;
67
- }
68
- else if ( (ya - yy) * (yc - yy) <= 0 ) {
69
- b = c;
70
- yb = yc;
71
- }
72
- else {
73
- a = c;
74
- ya = yc;
75
- }
76
-
77
- if ( ya > yb ) {
78
- return -1; /* input scale array should have accending order */
79
- }
80
- }
81
-
82
- x1 = a;
83
-
84
- label:
85
-
86
- y1 = y[x1];
87
- y2 = y[x1+1];
88
-
89
- *major = x1;
90
-
91
- if ( y2 - y1 == 0 ) {
92
- *frac = 0.0;
93
- }
94
- else {
95
- *frac = (yy-y1)/(y2-y1);
96
- }
97
-
98
- return 0;
99
- }
100
-
101
-
102
- /*
103
-
104
- n-dimensional linear interpolation
105
-
106
- y[i+fi, j+fj, ..., n+fn]
107
-
108
- 1 1 1
109
- = Sigma Sigma ... Sigma wi[si]*wj[sj]*...*wn[sn]*y[i+si,j+sj,...,n+sn]
110
- si=0 sj=0 sn=0
111
-
112
- i , j, ..., n : major integer value
113
- fi, fj, ..., fn : fractional value
114
-
115
- wi[0] = 1-fi, wj[0] = 1-fj, ..., wn[0] = 1-fn
116
- wi[1] = fi, wj[1] = fj, ..., wn[1] = fn
117
-
118
- */
119
-
120
- static int
121
- linear_interp_loop (CArray *ca, ca_size_t *major, double *frac,
122
- int level, ca_size_t *idx, double wt, double *valp)
123
- {
124
- double tmp;
125
-
126
- if ( level == ca->rank-1 ) {
127
-
128
- idx[level] = major[level];
129
- ca_fetch_index(ca, idx, &tmp);
130
- *valp += (1.0 - frac[level]) * wt * tmp;
131
-
132
- idx[level] = major[level] + 1;
133
- ca_fetch_index(ca, idx, &tmp);
134
- *valp += frac[level] * wt * tmp;
135
-
136
- }
137
- else {
138
-
139
- if ( frac[level] != 1.0 ) { /* condition for performance issue */
140
- idx[level] = major[level];
141
- linear_interp_loop(ca, major, frac,
142
- level+1, idx, (1.0 - frac[level])*wt, valp);
143
- }
144
-
145
- if ( frac[level] != 0.0 ) { /* condition for performance issue */
146
- idx[level] = major[level] + 1;
147
- linear_interp_loop(ca, major, frac,
148
- level+1, idx, frac[level]*wt, valp);
149
- }
150
-
151
- }
152
-
153
- return 0;
154
- }
155
-
156
- static double
157
- linear_interp (CArray *ca, ca_size_t *major, double *frac)
158
- {
159
- ca_size_t idx[CA_RANK_MAX];
160
- double value = 0;
161
- linear_interp_loop(ca, major, frac, 0, idx, 1, &value);
162
- return value;
163
- }
164
-
165
- /*
166
-
167
- If value[n] is NaN, the interpolation will be made for each index of the dimension n. So you must prepare the buffer sufficient to store these values.
168
-
169
- */
170
-
171
- static int
172
- ca_interpolate_loop (CArray *ca, double **scale,
173
- CArray **value,
174
- ca_size_t *major, double *frac,
175
- int level, double **dstp)
176
- {
177
- double val, frc;
178
- ca_size_t maj;
179
- ca_size_t i;
180
-
181
- if ( level == ca->rank-1 ) {
182
- if ( ! value[level] ) {
183
- for (i=0; i<ca->dim[level]; i++) {
184
- major[level] = i;
185
- frac[level] = 0.0;
186
- **dstp = linear_interp(ca, major, frac);
187
- *dstp += 1;
188
- }
189
- }
190
- else {
191
- for (i=0; i<value[level]->elements; i++) {
192
- ca_fetch_addr(value[level], i, &val);
193
- find_index(ca->dim[level], scale[level], val, &maj, &frc);
194
- major[level] = maj;
195
- frac[level] = frc;
196
- **dstp = linear_interp(ca, major, frac);
197
- *dstp += 1;
198
- }
199
- }
200
- }
201
- else {
202
- if ( ! value[level] ) {
203
- for (i=0; i<ca->dim[level]; i++) {
204
- major[level] = i;
205
- frac[level] = 0.0;
206
- ca_interpolate_loop(ca, scale, value, major, frac, level+1, dstp);
207
- }
208
- }
209
- else {
210
- for (i=0; i<value[level]->elements; i++) {
211
- ca_fetch_addr(value[level], i, &val);
212
- find_index(ca->dim[level], scale[level], val, &maj, &frc);
213
- major[level] = maj;
214
- frac[level] = frc;
215
- ca_interpolate_loop(ca, scale, value, major, frac, level+1, dstp);
216
- }
217
- }
218
- }
219
- return 0; /* normal exit */
220
- }
221
-
222
- int
223
- ca_interpolate (CArray *ca, double **scale, CArray **value, double *outp)
224
- {
225
- ca_size_t major[CA_RANK_MAX];
226
- double frac[CA_RANK_MAX];
227
- int status;
228
-
229
- status = ca_interpolate_loop(ca, scale, value, major, frac, 0, &outp);
230
-
231
- return status;
232
- }
233
-
234
-
235
- static VALUE
236
- rb_ca_interpolate_bilinear (int argc, VALUE *argv, volatile VALUE self)
237
- {
238
- volatile VALUE vscales, vvalues, vs, out;
239
- CArray *ca, *co, *cs;
240
- double *scales[CA_RANK_MAX];
241
- CArray *values[CA_RANK_MAX];
242
- CArray *scales_ca[CA_RANK_MAX];
243
- int8_t out_rank;
244
- ca_size_t out_dim[CA_RANK_MAX];
245
- int i;
246
-
247
- rb_scan_args(argc, argv, "2", &vscales, &vvalues);
248
-
249
- Check_Type(vscales, T_ARRAY);
250
- Check_Type(vvalues, T_ARRAY);
251
-
252
- if ( RARRAY_LEN(vscales) != RARRAY_LEN(vvalues) ) {
253
- rb_raise(rb_eArgError, "invalid number of values or scales");
254
- }
255
-
256
- ca = ca_wrap_readonly(self, CA_DOUBLE);
257
-
258
- if ( ca->rank != RARRAY_LEN(vvalues) ) {
259
- rb_raise(rb_eArgError, "invalid number of values");
260
- }
261
-
262
- for (i=0; i<ca->rank; i++) {
263
- vs = rb_ary_entry(vscales, i);
264
- if ( NIL_P(vs) ) {
265
- scales[i] = NULL;
266
- }
267
- else {
268
- cs = ca_wrap_readonly(vs, CA_DOUBLE);
269
- scales_ca[i] = cs;
270
- ca_attach(cs);
271
- scales[i] = (double *) cs->ptr;
272
- rb_ary_store(vscales, i, vs);
273
- }
274
- }
275
-
276
- out_rank = 0;
277
- for (i=0; i<ca->rank; i++) {
278
- vs = rb_ary_entry(vvalues, i);
279
- if ( NIL_P(vs) ) {
280
- out_dim[out_rank++] = ca->dim[i];
281
- values[i] = NULL;
282
- }
283
- else {
284
- values[i] = ca_wrap_readonly(vs, CA_DOUBLE);
285
- if ( values[i]->obj_type != CA_OBJ_SCALAR ) {
286
- out_dim[out_rank++] = values[i]->elements;
287
- }
288
- rb_ary_store(vvalues, i, vs);
289
- }
290
- }
291
-
292
- if ( out_rank == 0 ) {
293
- out = rb_cscalar_new(CA_DOUBLE, 0, NULL);
294
- }
295
- else {
296
- out = rb_carray_new(CA_DOUBLE, out_rank, out_dim, 0, NULL);
297
- }
298
-
299
- Data_Get_Struct(out, CArray, co);
300
-
301
- for (i=0; i<ca->rank; i++) {
302
- if ( values[i] ) {
303
- ca_attach(values[i]);
304
- }
305
- }
306
-
307
-
308
- ca_attach(ca);
309
- ca_interpolate(ca, scales, values, (double*) co->ptr);
310
- ca_detach(ca);
311
-
312
- for (i=0; i<ca->rank; i++) {
313
- if ( values[i] ) {
314
- ca_detach(values[i]);
315
- }
316
- if ( scales[i] ) {
317
- ca_detach(scales_ca[i]);
318
- }
319
- }
320
-
321
- if ( out_rank == 0 ) {
322
- return rb_ca_fetch_addr(out, 0);
323
- }
324
- else {
325
- return out;
326
- }
327
- }
328
-
329
- void
330
- Init_carray_interpolate ()
331
- {
332
- rb_define_method(rb_cCArray, "interp_nd_linear",
333
- rb_ca_interpolate_bilinear, -1);
334
- }
335
-
336
- /*
337
-
338
- scales = [nil, nil, sza, vza, saz]
339
- values = [nil, nil, 60, 60, 120]
340
- brdf.interp_linear_nd(scales, values)
341
-
342
- interp_1d_linear
343
- interp_1d_parabolic
344
- interp_1d_cubic
345
- interp_1d_akima
346
- interp_1d_akima2
347
- interp_1d_curv
348
-
349
- interp_2d_natgrid
350
- interp_2d_fitpack
351
- interp_nd_linear
352
-
353
- gridding_2d_natgrid
354
-
355
-
356
- */
357
-
358
-
@@ -1,12 +0,0 @@
1
- require "mkmf"
2
-
3
- dir_config("carray", "../..", "../..")
4
-
5
- have_header("carray.h")
6
-
7
- if /cygwin|mingw/ =~ RUBY_PLATFORM
8
- have_library("carray")
9
- end
10
-
11
- create_makefile("carray/carray_calculus")
12
-
@@ -1,119 +0,0 @@
1
- # ----------------------------------------------------------------------------
2
- #
3
- # carray/base/calculus.rb
4
- #
5
- # This file is part of Ruby/CArray extension library.
6
- # You can redistribute it and/or modify it under the terms of
7
- # the Ruby Licence.
8
- #
9
- # Copyright (C) 2005 Hiroki Motoyoshi
10
- #
11
- # ----------------------------------------------------------------------------
12
-
13
- class CArray
14
-
15
- def normalize (scale = nil)
16
- if scale
17
- return self / self.integrate(scale)
18
- else
19
- return self / self.sum
20
- end
21
- end
22
-
23
- def normalize! (scale = nil)
24
- self[] = normalize(scale)
25
- return self
26
- end
27
-
28
- def solve (sc, val, type: "cubic", eps: 100 * Float::EPSILON)
29
- func = self - val
30
- list, output = [], []
31
- (0...dim0-1).each do |i|
32
- if func[i] == UNDEF
33
- elsif func[i].abs < eps and not list.include?(i-1)
34
- output.push(sc[i])
35
- elsif func[i+1] == UNDEF
36
- elsif i < dim0 - 1 and func[i]*func[i+1] < 0
37
- list.push(i)
38
- end
39
- end
40
- list.each do |i|
41
- sx = CArray.double(4)
42
- sy = CArray.double(4)
43
- sx[0], sx[3] = sc[i], sc[i+1]
44
- sy[0], sy[3] = func[i], func[i+1]
45
- sx[1], sx[2] = (2.0*sx[0]+sx[3])/3.0, (sx[0]+2.0*sx[3])/3.0
46
- sy[1], sy[2] = func.interpolate(sc, sx[1], type: type), func.interpolate(sc, sx[2], type: type)
47
- output.push(sx.interpolate(sy, 0, type: type))
48
- end
49
- return output.uniq
50
- end
51
-
52
- def solve2 (sc, eps: 100 * Float::EPSILON)
53
- retvals = []
54
- self.dim1.times do |j|
55
- func = self[nil,j].to_ca
56
- list, output = [], []
57
- (0...dim0-1).each do |i|
58
- if func[i] == UNDEF
59
- elsif func[i].abs < eps and not list.include?(i-1)
60
- output.push(sc[i])
61
- elsif func[i+1] == UNDEF
62
- elsif i < dim0 - 1 and func[i]*func[i+1] < 0
63
- list.push(i)
64
- end
65
- end
66
- list.each do |i|
67
- sx = CArray.double(4)
68
- sy = CArray.double(4)
69
- sx[0], sx[3] = sc[i], sc[i+1]
70
- sy[0], sy[3] = func[i], func[i+1]
71
- sx[1], sx[2] = (2*sx[0]+sx[3])/3, (sx[0]+2*sx[3])/3
72
- sy[1], sy[2] = func.interpolate(sc, sx[1], :type=>"linear"), func.interpolate(sc, sx[2], :type=>"linear")
73
- output.push(sx.interpolate(sy, 0))
74
- end
75
- retvals << output.uniq
76
- end
77
- retvals = retvals.map{|s| s.empty? ? [nil] : s}
78
- return retvals
79
- end
80
-
81
- private
82
-
83
- def _interpolate2 (x, y, x0, y0)
84
- case x.size
85
- when 1
86
- return self[0, nil].interpolate(y, y0)
87
- when 2, 3
88
- return self[:i,nil].interpolate(y, y0).interpolate(x, x0)
89
- end
90
- ri = x.section(x0)
91
- i0 = ri.floor - 1
92
- if i0 < 0
93
- i0 = 0
94
- elsif i0 + 3 > x.size - 1
95
- i0 = x.size - 4
96
- end
97
- return self[i0..i0+3,nil][:i,nil].interpolate(y, y0).
98
- interpolate(x[i0..i0+3],x0)
99
- end
100
-
101
- public
102
-
103
- def interpolate2 (x, y, x0, y0)
104
- if x0.is_a?(Numeric) and y0.is_a?(Numeric)
105
- return _interpolate2(x, y, x0, y0)
106
- else
107
- x0 = CArray.wrap_readonly(x0)
108
- y0 = CArray.wrap_readonly(y0)
109
- out = CArray.double(x0.size, y0.size)
110
- x0.each_with_index do |xi, i|
111
- y0.each_with_index do |yj, j|
112
- out[i,j] = _interpolate2(x, y, xi, yj)
113
- end
114
- end
115
- return out.compact
116
- end
117
- end
118
-
119
- end