ryeppp 0.0.6 → 0.0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -0
- data/VERSION +1 -0
- data/ext/templates/ryeppp.c.rb +54 -58
- data/lib/ryeppp.rb +0 -4
- data/lib/ryeppp/bench.rb +32 -29
- data/lib/ryeppp/version.rb +1 -1
- data/ryeppp.gemspec +2 -0
- data/spec/ryeppp_spec.rb +26 -14
- metadata +35 -2
data/Rakefile
CHANGED
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.7.0.0
|
data/ext/templates/ryeppp.c.rb
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
MAX_SIGNED_INTEGER = 2**63 - 1
|
2
|
-
MIN_SIGNED_INTEGER = -1 * MAX_SIGNED_INTEGER
|
3
|
-
|
4
1
|
class String
|
5
2
|
def pluralize
|
6
3
|
"#{self}#{self.size > 0 && self[-1] == 'e' ? 's' : 'es'}"
|
@@ -39,17 +36,6 @@ def ensure_array_argument(var_name, var_position)
|
|
39
36
|
}}
|
40
37
|
end
|
41
38
|
|
42
|
-
def guard_integer_input_size(var_name, iteration_var_name, allocated_arrays)
|
43
|
-
%{if (rb_funcall(#{var_name}_a[#{iteration_var_name}], '>', 1, #{MAX_SIGNED_INTEGER})) {
|
44
|
-
#{release_array_memory allocated_arrays}
|
45
|
-
rb_raise(rb_eRangeError, "input was too large for 64-bit signed integer");
|
46
|
-
}
|
47
|
-
if (rb_funcall(#{var_name}_a[#{iteration_var_name}], '<', 1, #{MIN_SIGNED_INTEGER})) {
|
48
|
-
#{release_array_memory allocated_arrays}
|
49
|
-
rb_raise(rb_eRangeError, "input was too small for 64-bit signed integer");
|
50
|
-
}}
|
51
|
-
end
|
52
|
-
|
53
39
|
def load_ruby_array_from_yeppp_array(var_name, iteration_var_name, len_var_name, type)
|
54
40
|
%{/* Load the Ruby Array */
|
55
41
|
new_ary = rb_ary_new2(#{len_var_name});
|
@@ -81,7 +67,6 @@ def load_ruby_array_into_yeppp_array(var_name, iteration_var_name, len_var_name,
|
|
81
67
|
#{release_array_memory opts[:allocated_arrays]}
|
82
68
|
rb_raise(rb_eTypeError, "input was not all #{permitted_types.map(&:to_s).map(&:pluralize).join(' and ')}");
|
83
69
|
}
|
84
|
-
#{guard_integer_input_size(var_name, iteration_var_name, opts[:allocated_arrays])}
|
85
70
|
yep_#{var_name}[#{opts[:reverse] ? "#{len_var_name} - #{iteration_var_name} - 1" : iteration_var_name}] = (Yep64#{type})NUM2#{type == 'f' ? 'DBL' : 'LONG'}(#{var_name}_a[#{iteration_var_name}]);
|
86
71
|
}}
|
87
72
|
end
|
@@ -92,7 +77,6 @@ def load_ruby_array_into_yeppp_array_parameterized(var_name, iteration_var_name,
|
|
92
77
|
#{release_array_memory opts[:allocated_arrays]}
|
93
78
|
rb_raise(rb_eTypeError, "input was not all {{ruby_klass_human}}");
|
94
79
|
}
|
95
|
-
#{guard_integer_input_size(var_name, iteration_var_name, opts[:allocated_arrays])}
|
96
80
|
yep_#{var_name}[#{iteration_var_name}] = (Yep64{{type}})NUM2{{ruby_type}}(#{var_name}_a[#{iteration_var_name}]);
|
97
81
|
}}
|
98
82
|
end
|
@@ -150,7 +134,7 @@ FUNCS = Proc.new do |verb_name|
|
|
150
134
|
long l;
|
151
135
|
Yep64{{type}} mult_by;
|
152
136
|
#{declare_yep64_typed_array(%w{x})}
|
153
|
-
|
137
|
+
|
154
138
|
#{ensure_array_argument('x', 'first')}
|
155
139
|
if (TYPE(multiply_by) != T_FIXNUM && TYPE(multiply_by) != T_BIGNUM && TYPE(multiply_by) != T_FLOAT) {
|
156
140
|
rb_raise(rb_eArgError, "second argument was not an integer or a float");
|
@@ -162,21 +146,21 @@ FUNCS = Proc.new do |verb_name|
|
|
162
146
|
|
163
147
|
/* Allocate arrays of inputs and outputs */
|
164
148
|
#{allocate_yep64_typed_array(%w{x}, 'l')}
|
165
|
-
|
149
|
+
|
166
150
|
#{initialize_yeppp}
|
167
|
-
|
151
|
+
|
168
152
|
#{load_ruby_array_into_yeppp_array_parameterized('x', 'i', 'l', :allocated_arrays => %w{x})}
|
169
|
-
|
153
|
+
|
170
154
|
/* Perform the operation */
|
171
155
|
status = yepCore_Multiply_IV64{{type}}S64{{type}}_IV64{{type}}(yep_x, mult_by, (YepSize)l);
|
172
156
|
assert(status == YepStatusOk);
|
173
157
|
|
174
158
|
#{load_ruby_array_from_yeppp_array_parameterized('x', 'i', 'l')}
|
175
|
-
|
159
|
+
|
176
160
|
#{deinitialize_yeppp}
|
177
|
-
|
161
|
+
|
178
162
|
#{release_array_memory(%w{x})}
|
179
|
-
|
163
|
+
|
180
164
|
return new_ary;
|
181
165
|
}
|
182
166
|
}).strip.freeze
|
@@ -193,7 +177,7 @@ FUNCS = Proc.new do |verb_name|
|
|
193
177
|
VALUE *y_a;
|
194
178
|
long l;
|
195
179
|
#{declare_yep64_typed_array(%w{x y})}
|
196
|
-
|
180
|
+
|
197
181
|
#{ensure_array_argument('x', 'first')}
|
198
182
|
#{ensure_array_argument('y', 'second')}
|
199
183
|
|
@@ -201,22 +185,26 @@ FUNCS = Proc.new do |verb_name|
|
|
201
185
|
y_a = RARRAY_PTR(y);
|
202
186
|
l = RARRAY_LEN(x);
|
203
187
|
|
188
|
+
if (l != RARRAY_LEN(y)) {
|
189
|
+
rb_raise(rb_eArgError, "given array arguments have different lengths");
|
190
|
+
}
|
191
|
+
|
204
192
|
/* Allocate arrays of inputs and outputs */
|
205
193
|
#{allocate_yep64_typed_array(%w{x y}, 'l')}
|
206
194
|
|
207
195
|
#{initialize_yeppp}
|
208
|
-
|
196
|
+
|
209
197
|
#{load_ruby_array_into_yeppp_array_parameterized('x', 'i', 'l', :allocated_arrays => %w{x y})}
|
210
198
|
#{load_ruby_array_into_yeppp_array_parameterized('y', 'i', 'l', :allocated_arrays => %w{x y})}
|
211
|
-
|
199
|
+
|
212
200
|
/* Perform the #{verb_name} */
|
213
201
|
status = yepCore_#{verb_name}_IV64{{type}}V64{{type}}_IV64{{type}}(yep_x, yep_y, (YepSize)l);
|
214
202
|
assert(status == YepStatusOk);
|
215
203
|
|
216
204
|
#{load_ruby_array_from_yeppp_array_parameterized('x', 'i', 'l')}
|
217
|
-
|
205
|
+
|
218
206
|
#{deinitialize_yeppp}
|
219
|
-
|
207
|
+
|
220
208
|
#{release_array_memory(%w{x y})}
|
221
209
|
|
222
210
|
return new_ary;
|
@@ -235,7 +223,7 @@ DOT_PRODUCT = %{
|
|
235
223
|
VALUE *y_a;
|
236
224
|
long l;
|
237
225
|
#{declare_yep64_typed_array(%w{x y}, :type => 'f')}
|
238
|
-
|
226
|
+
|
239
227
|
#{ensure_array_argument('x', 'first')}
|
240
228
|
#{ensure_array_argument('y', 'second')}
|
241
229
|
|
@@ -243,22 +231,26 @@ DOT_PRODUCT = %{
|
|
243
231
|
y_a = RARRAY_PTR(y);
|
244
232
|
l = RARRAY_LEN(x);
|
245
233
|
|
234
|
+
if (l != RARRAY_LEN(y)) {
|
235
|
+
rb_raise(rb_eArgError, "given array arguments have different lengths");
|
236
|
+
}
|
237
|
+
|
246
238
|
/* Allocate arrays of inputs and outputs */
|
247
239
|
#{allocate_yep64_typed_array(%w{x y}, 'l', :type => 'f')}
|
248
240
|
|
249
241
|
#{initialize_yeppp}
|
250
|
-
|
242
|
+
|
251
243
|
#{load_ruby_array_into_yeppp_array('x', 'i', 'l', 'f', [:integer, :float], :allocated_arrays => %w{x y})}
|
252
244
|
#{load_ruby_array_into_yeppp_array('y', 'i', 'l', 'f', [:integer, :float], :allocated_arrays => %w{x y})}
|
253
|
-
|
245
|
+
|
254
246
|
/* Perform the operation */
|
255
247
|
status = yepCore_DotProduct_V64fV64f_S64f(yep_x, yep_y, &dp, (YepSize)l);
|
256
248
|
assert(status == YepStatusOk);
|
257
249
|
|
258
250
|
#{deinitialize_yeppp}
|
259
|
-
|
251
|
+
|
260
252
|
#{release_array_memory(%w{x y})}
|
261
|
-
|
253
|
+
|
262
254
|
return DBL2NUM((double)dp);
|
263
255
|
}
|
264
256
|
}.strip
|
@@ -283,17 +275,17 @@ MIN_MAX = typed_variants(%w{Min Max}.map do |kind|
|
|
283
275
|
#{allocate_yep64_typed_array('x', 'l')}
|
284
276
|
|
285
277
|
#{initialize_yeppp}
|
286
|
-
|
278
|
+
|
287
279
|
#{load_ruby_array_into_yeppp_array_parameterized('x', 'i', 'l', :allocated_arrays => %w{x})}
|
288
|
-
|
280
|
+
|
289
281
|
/* Perform the operation */
|
290
282
|
status = yepCore_#{kind}_V64{{type}}_S64{{type}}(yep_x, &#{kind.downcase}, (YepSize)l);
|
291
283
|
assert(status == YepStatusOk);
|
292
284
|
|
293
285
|
#{deinitialize_yeppp}
|
294
|
-
|
286
|
+
|
295
287
|
#{release_array_memory(%w{x})}
|
296
|
-
|
288
|
+
|
297
289
|
return {{ruby_type}}2NUM(({{c_type}})#{kind.downcase});
|
298
290
|
}
|
299
291
|
}.strip
|
@@ -310,7 +302,7 @@ PAIRWISE_MIN_MAX = typed_variants(%w{Min Max}.map do |kind|
|
|
310
302
|
VALUE *y_a;
|
311
303
|
long l;
|
312
304
|
#{declare_yep64_typed_array(%w{x y})}
|
313
|
-
|
305
|
+
|
314
306
|
#{ensure_array_argument('x', 'first')}
|
315
307
|
#{ensure_array_argument('y', 'second')}
|
316
308
|
|
@@ -318,14 +310,18 @@ PAIRWISE_MIN_MAX = typed_variants(%w{Min Max}.map do |kind|
|
|
318
310
|
y_a = RARRAY_PTR(y);
|
319
311
|
l = RARRAY_LEN(x);
|
320
312
|
|
313
|
+
if (l != RARRAY_LEN(y)) {
|
314
|
+
rb_raise(rb_eArgError, "given array arguments have different lengths");
|
315
|
+
}
|
316
|
+
|
321
317
|
/* Allocate arrays of inputs and outputs */
|
322
318
|
#{allocate_yep64_typed_array(%w{x y}, 'l')}
|
323
319
|
|
324
320
|
#{initialize_yeppp}
|
325
|
-
|
321
|
+
|
326
322
|
#{load_ruby_array_into_yeppp_array_parameterized('x', 'i', 'l', :allocated_arrays => %w{x y})}
|
327
323
|
#{load_ruby_array_into_yeppp_array_parameterized('y', 'i', 'l', :allocated_arrays => %w{x y})}
|
328
|
-
|
324
|
+
|
329
325
|
/* Perform the operation */
|
330
326
|
status = yepCore_#{kind}_IV64{{type}}V64{{type}}_IV64{{type}}(yep_x, yep_y, (YepSize)l);
|
331
327
|
assert(status == YepStatusOk);
|
@@ -333,9 +329,9 @@ PAIRWISE_MIN_MAX = typed_variants(%w{Min Max}.map do |kind|
|
|
333
329
|
#{load_ruby_array_from_yeppp_array_parameterized('x', 'i', 'l')}
|
334
330
|
|
335
331
|
#{deinitialize_yeppp}
|
336
|
-
|
332
|
+
|
337
333
|
#{release_array_memory(%w{x y})}
|
338
|
-
|
334
|
+
|
339
335
|
return new_ary;
|
340
336
|
}
|
341
337
|
}.strip
|
@@ -352,7 +348,7 @@ CONSTANT_MIN_MAX = typed_variants(%w{Min Max}.map do |kind|
|
|
352
348
|
long l;
|
353
349
|
Yep64f konst;
|
354
350
|
#{declare_yep64_typed_array(%w{x})}
|
355
|
-
|
351
|
+
|
356
352
|
#{ensure_array_argument('x', 'first')}
|
357
353
|
if (TYPE(c) != T_FIXNUM && TYPE(c) != T_BIGNUM && TYPE(c) != T_FLOAT) {
|
358
354
|
rb_raise(rb_eArgError, "second argument was not a number");
|
@@ -366,9 +362,9 @@ CONSTANT_MIN_MAX = typed_variants(%w{Min Max}.map do |kind|
|
|
366
362
|
#{allocate_yep64_typed_array(%w{x}, 'l')}
|
367
363
|
|
368
364
|
#{initialize_yeppp}
|
369
|
-
|
365
|
+
|
370
366
|
#{load_ruby_array_into_yeppp_array_parameterized('x', 'i', 'l', :allocated_arrays => %w{x})}
|
371
|
-
|
367
|
+
|
372
368
|
/* Perform the operation */
|
373
369
|
status = yepCore_#{kind}_IV64{{type}}S64{{type}}_IV64{{type}}(yep_x, konst, (YepSize)l);
|
374
370
|
assert(status == YepStatusOk);
|
@@ -376,9 +372,9 @@ CONSTANT_MIN_MAX = typed_variants(%w{Min Max}.map do |kind|
|
|
376
372
|
#{load_ruby_array_from_yeppp_array_parameterized('x', 'i', 'l')}
|
377
373
|
|
378
374
|
#{deinitialize_yeppp}
|
379
|
-
|
375
|
+
|
380
376
|
#{release_array_memory(%w{x})}
|
381
|
-
|
377
|
+
|
382
378
|
return new_ary;
|
383
379
|
}
|
384
380
|
}.strip
|
@@ -401,21 +397,21 @@ NEGATE = typed_variants(%{
|
|
401
397
|
|
402
398
|
/* Allocate arrays of inputs and outputs */
|
403
399
|
#{allocate_yep64_typed_array(%w{x}, 'l')}
|
404
|
-
|
400
|
+
|
405
401
|
#{initialize_yeppp}
|
406
|
-
|
402
|
+
|
407
403
|
#{load_ruby_array_into_yeppp_array_parameterized('x', 'i', 'l', :allocated_arrays => %w{x})}
|
408
|
-
|
404
|
+
|
409
405
|
/* Perform the negation */
|
410
406
|
status = yepCore_Negate_IV64{{type}}_IV64{{type}}(yep_x, (YepSize)l);
|
411
407
|
assert(status == YepStatusOk);
|
412
|
-
|
408
|
+
|
413
409
|
#{load_ruby_array_from_yeppp_array_parameterized('x', 'i', 'l')}
|
414
|
-
|
410
|
+
|
415
411
|
#{deinitialize_yeppp}
|
416
|
-
|
412
|
+
|
417
413
|
#{release_array_memory(%w{x})}
|
418
|
-
|
414
|
+
|
419
415
|
return new_ary;
|
420
416
|
}
|
421
417
|
}).freeze
|
@@ -447,7 +443,7 @@ SUMS = %w{Sum SumAbs SumSquares}.map do |kind|
|
|
447
443
|
assert(status == YepStatusOk);
|
448
444
|
|
449
445
|
#{deinitialize_yeppp}
|
450
|
-
|
446
|
+
|
451
447
|
#{release_array_memory(%w{x})}
|
452
448
|
|
453
449
|
return DBL2NUM((double)sum);
|
@@ -485,7 +481,7 @@ MATHS = MATHS_KINDS.map do |kind|
|
|
485
481
|
#{load_ruby_array_from_yeppp_array('y', 'i', 'l', 'f')}
|
486
482
|
|
487
483
|
#{deinitialize_yeppp}
|
488
|
-
|
484
|
+
|
489
485
|
#{release_array_memory(%w{x y})}
|
490
486
|
|
491
487
|
return new_ary;
|
@@ -532,9 +528,9 @@ POLYNOMIAL = %{
|
|
532
528
|
#{load_ruby_array_from_yeppp_array('z', 'i', 'y_l', 'f')}
|
533
529
|
|
534
530
|
#{deinitialize_yeppp}
|
535
|
-
|
531
|
+
|
536
532
|
#{release_array_memory(%w{x y z})}
|
537
|
-
|
533
|
+
|
538
534
|
return new_ary;
|
539
535
|
}
|
540
536
|
}.strip.freeze
|
data/lib/ryeppp.rb
CHANGED
data/lib/ryeppp/bench.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
require 'benchmark'
|
2
2
|
require 'inline'
|
3
|
+
require 'trollop'
|
3
4
|
|
4
5
|
$:<< './lib'
|
5
6
|
require 'ryeppp'
|
6
7
|
|
7
|
-
|
8
|
+
$opts = Trollop::options do
|
9
|
+
opt :verbose, 'Verbose'
|
10
|
+
end
|
8
11
|
|
9
12
|
def puts_with_pounds(s)
|
10
13
|
puts "\n\n#{s} #{'#' * (79 - s.size)}"
|
@@ -25,7 +28,7 @@ class Array
|
|
25
28
|
long n = RARRAY_LEN(self);
|
26
29
|
VALUE *x_a = RARRAY_PTR(self);
|
27
30
|
double minimum = x_a[0];
|
28
|
-
|
31
|
+
|
29
32
|
long i;
|
30
33
|
for (i=1; i<n; i++) {
|
31
34
|
if (TYPE(x_a[i]) != T_FIXNUM && TYPE(x_a[i]) != T_BIGNUM && TYPE(x_a[i]) != T_FLOAT) {
|
@@ -44,7 +47,7 @@ class Array
|
|
44
47
|
long n = RARRAY_LEN(self);
|
45
48
|
VALUE *x_a = RARRAY_PTR(self);
|
46
49
|
long minimum = x_a[0];
|
47
|
-
|
50
|
+
|
48
51
|
long i;
|
49
52
|
for (i=1; i<n; i++) {
|
50
53
|
if (TYPE(x_a[i]) != T_FIXNUM && TYPE(x_a[i]) != T_BIGNUM && TYPE(x_a[i]) != T_FLOAT) {
|
@@ -63,7 +66,7 @@ class Array
|
|
63
66
|
long n = RARRAY_LEN(self);
|
64
67
|
VALUE *x_a = RARRAY_PTR(self);
|
65
68
|
double maximum = x_a[0];
|
66
|
-
|
69
|
+
|
67
70
|
long i;
|
68
71
|
for (i=1; i<n; i++) {
|
69
72
|
if (TYPE(x_a[i]) != T_FIXNUM && TYPE(x_a[i]) != T_BIGNUM && TYPE(x_a[i]) != T_FLOAT) {
|
@@ -82,7 +85,7 @@ class Array
|
|
82
85
|
long n = RARRAY_LEN(self);
|
83
86
|
VALUE *x_a = RARRAY_PTR(self);
|
84
87
|
long maximum = x_a[0];
|
85
|
-
|
88
|
+
|
86
89
|
long i;
|
87
90
|
for (i=1; i<n; i++) {
|
88
91
|
if (TYPE(x_a[i]) != T_FIXNUM && TYPE(x_a[i]) != T_BIGNUM && TYPE(x_a[i]) != T_FLOAT) {
|
@@ -113,7 +116,7 @@ class Array
|
|
113
116
|
VALUE *x_a = RARRAY_PTR(self);
|
114
117
|
VALUE *x_b = RARRAY_PTR(b);
|
115
118
|
VALUE new_ary = rb_ary_new2(n);
|
116
|
-
|
119
|
+
|
117
120
|
long i;
|
118
121
|
|
119
122
|
if (n != RARRAY_LEN(b)) {
|
@@ -131,7 +134,7 @@ class Array
|
|
131
134
|
VALUE *x_a = RARRAY_PTR(self);
|
132
135
|
VALUE *x_b = RARRAY_PTR(b);
|
133
136
|
VALUE new_ary = rb_ary_new2(n);
|
134
|
-
|
137
|
+
|
135
138
|
long i;
|
136
139
|
|
137
140
|
if (n != RARRAY_LEN(b)) {
|
@@ -157,7 +160,7 @@ class Array
|
|
157
160
|
VALUE *x_a = RARRAY_PTR(self);
|
158
161
|
double konst = NUM2DBL(c);
|
159
162
|
VALUE new_ary = rb_ary_new2(n);
|
160
|
-
|
163
|
+
|
161
164
|
long i;
|
162
165
|
for (i=0; i<n; i++) {
|
163
166
|
rb_ary_push(new_ary, (NUM2DBL(x_a[i]) < konst) ? x_a[i] : c);
|
@@ -171,7 +174,7 @@ class Array
|
|
171
174
|
VALUE *x_a = RARRAY_PTR(self);
|
172
175
|
double konst = NUM2DBL(c);
|
173
176
|
VALUE new_ary = rb_ary_new2(n);
|
174
|
-
|
177
|
+
|
175
178
|
long i;
|
176
179
|
for (i=0; i<n; i++) {
|
177
180
|
rb_ary_push(new_ary, (NUM2DBL(x_a[i]) > konst) ? x_a[i] : c);
|
@@ -203,7 +206,7 @@ class Array
|
|
203
206
|
long n = RARRAY_LEN(self);
|
204
207
|
VALUE *x_a = RARRAY_PTR(self);
|
205
208
|
VALUE new_ary = rb_ary_new2(n);
|
206
|
-
|
209
|
+
|
207
210
|
long i;
|
208
211
|
for (i=0; i<n; i++) {
|
209
212
|
rb_ary_push(new_ary, DBL2NUM(log(NUM2DBL(x_a[i]))));
|
@@ -216,7 +219,7 @@ class Array
|
|
216
219
|
long n = RARRAY_LEN(self);
|
217
220
|
VALUE *x_a = RARRAY_PTR(self);
|
218
221
|
VALUE new_ary = rb_ary_new2(n);
|
219
|
-
|
222
|
+
|
220
223
|
long i;
|
221
224
|
for (i=0; i<n; i++) {
|
222
225
|
rb_ary_push(new_ary, DBL2NUM(pow(2.717, NUM2DBL(x_a[i]))));
|
@@ -229,7 +232,7 @@ class Array
|
|
229
232
|
long n = RARRAY_LEN(self);
|
230
233
|
VALUE *x_a = RARRAY_PTR(self);
|
231
234
|
VALUE new_ary = rb_ary_new2(n);
|
232
|
-
|
235
|
+
|
233
236
|
long i;
|
234
237
|
for (i=0; i<n; i++) {
|
235
238
|
rb_ary_push(new_ary, DBL2NUM(sin(NUM2DBL(x_a[i]))));
|
@@ -242,7 +245,7 @@ class Array
|
|
242
245
|
long n = RARRAY_LEN(self);
|
243
246
|
VALUE *x_a = RARRAY_PTR(self);
|
244
247
|
VALUE new_ary = rb_ary_new2(n);
|
245
|
-
|
248
|
+
|
246
249
|
long i;
|
247
250
|
for (i=0; i<n; i++) {
|
248
251
|
rb_ary_push(new_ary, DBL2NUM(cos(NUM2DBL(x_a[i]))));
|
@@ -255,7 +258,7 @@ class Array
|
|
255
258
|
long n = RARRAY_LEN(self);
|
256
259
|
VALUE *x_a = RARRAY_PTR(self);
|
257
260
|
VALUE new_ary = rb_ary_new2(n);
|
258
|
-
|
261
|
+
|
259
262
|
long i;
|
260
263
|
for (i=0; i<n; i++) {
|
261
264
|
rb_ary_push(new_ary, DBL2NUM(tan(NUM2DBL(x_a[i]))));
|
@@ -279,9 +282,9 @@ class Array
|
|
279
282
|
static VALUE c_sum() {
|
280
283
|
long n = RARRAY_LEN(self);
|
281
284
|
double sum = 0.0;
|
282
|
-
|
285
|
+
|
283
286
|
VALUE *x_a = RARRAY_PTR(self);
|
284
|
-
|
287
|
+
|
285
288
|
long i;
|
286
289
|
for (i=0; i<n; i++) {
|
287
290
|
if (TYPE(x_a[i]) != T_FIXNUM && TYPE(x_a[i]) != T_BIGNUM && TYPE(x_a[i]) != T_FLOAT) {
|
@@ -298,9 +301,9 @@ class Array
|
|
298
301
|
static VALUE c_sumabs() {
|
299
302
|
long n = RARRAY_LEN(self);
|
300
303
|
double sum = 0.0;
|
301
|
-
|
304
|
+
|
302
305
|
VALUE *x_a = RARRAY_PTR(self);
|
303
|
-
|
306
|
+
|
304
307
|
long i;
|
305
308
|
for (i=0; i<n; i++) {
|
306
309
|
if (TYPE(x_a[i]) != T_FIXNUM && TYPE(x_a[i]) != T_BIGNUM && TYPE(x_a[i]) != T_FLOAT) {
|
@@ -317,9 +320,9 @@ class Array
|
|
317
320
|
static VALUE c_sumsquares() {
|
318
321
|
long n = RARRAY_LEN(self);
|
319
322
|
double sum = 0.0;
|
320
|
-
|
323
|
+
|
321
324
|
VALUE *x_a = RARRAY_PTR(self);
|
322
|
-
|
325
|
+
|
323
326
|
long i;
|
324
327
|
for (i=0; i<n; i++) {
|
325
328
|
if (TYPE(x_a[i]) != T_FIXNUM && TYPE(x_a[i]) != T_BIGNUM && TYPE(x_a[i]) != T_FLOAT) {
|
@@ -400,7 +403,7 @@ class Array
|
|
400
403
|
if (TYPE(x_v) != T_FIXNUM && TYPE(x_v) != T_BIGNUM && TYPE(x_v) != T_FLOAT) {
|
401
404
|
rb_raise(rb_eTypeError, "first argument was not an integer or float");
|
402
405
|
}
|
403
|
-
|
406
|
+
|
404
407
|
x_a = RARRAY_PTR(self);
|
405
408
|
n = RARRAY_LEN(self);
|
406
409
|
x = NUM2DBL(x_v);
|
@@ -453,7 +456,7 @@ V_s = (0..1_024*1_024).to_a.map{Random.rand(1_024)}
|
|
453
456
|
# Dot Product
|
454
457
|
puts_with_pounds "Dot Product"
|
455
458
|
n = 1
|
456
|
-
if
|
459
|
+
if $opts[:verbose]
|
457
460
|
puts "dot_product_f: #{V_f.dot_product_f(V_f)}"
|
458
461
|
puts "c_dot_product_f: #{V_f.c_dot_product_f(V_f)}"
|
459
462
|
puts "Ryeppp.dotproduct_v64fv64f_s64f: #{Ryeppp.dotproduct_v64fv64f_s64f(V_f, V_f)}"
|
@@ -481,12 +484,12 @@ end
|
|
481
484
|
puts_with_pounds "Pairwise Min and Max"
|
482
485
|
Benchmark.bm(WIDTH) do |x|
|
483
486
|
%w{min max}.each do |prefix|
|
484
|
-
x.report("#{prefix}_v64fv64f_v64f:")
|
485
|
-
x.report("c_#{prefix}_v64fv64f_v64f:")
|
486
|
-
x.report("Ryeppp.#{prefix}_v64fv64f_v64f:")
|
487
|
-
x.report("#{prefix}_v64fs64f_v64f:")
|
488
|
-
x.report("c_#{prefix}_v64fs64f_v64f:")
|
489
|
-
x.report("Ryeppp.#{prefix}_v64fs64f_v64f:")
|
487
|
+
x.report("#{prefix}_v64fv64f_v64f:") { n.times { V_f.send("#{prefix}_v64fv64f_v64f", V_f) } }
|
488
|
+
x.report("c_#{prefix}_v64fv64f_v64f:") { n.times { V_f.send("c_#{prefix}_v64fv64f_v64f", V_f) } }
|
489
|
+
x.report("Ryeppp.#{prefix}_v64fv64f_v64f:") { n.times { Ryeppp.send("#{prefix}_v64fv64f_v64f", V_f, V_f) } }
|
490
|
+
x.report("#{prefix}_v64fs64f_v64f:") { n.times { V_f.send("#{prefix}_v64fs64f_v64f", K) } }
|
491
|
+
x.report("c_#{prefix}_v64fs64f_v64f:") { n.times { V_f.send("c_#{prefix}_v64fs64f_v64f", K) } }
|
492
|
+
x.report("Ryeppp.#{prefix}_v64fs64f_v64f:") { n.times { Ryeppp.send("#{prefix}_v64fs64f_v64f", V_f, K) } }
|
490
493
|
end
|
491
494
|
end
|
492
495
|
|
@@ -518,7 +521,7 @@ n = 1
|
|
518
521
|
P_SMALL = (0..1_024).to_a.map{Random.rand}
|
519
522
|
P_LARGE = (0..1_024*1_024).to_a.map{Random.rand}
|
520
523
|
X = Random.rand
|
521
|
-
if
|
524
|
+
if $opts[:verbose]
|
522
525
|
puts "evaluate_polynomial: #{P_SMALL.evaluate_polynomial(X)}"
|
523
526
|
puts "evaluate_polynomial_iter: #{P_SMALL.evaluate_polynomial_iter(X)}"
|
524
527
|
puts "c_evaluate_polynomial: #{P_SMALL.c_evaluate_polynomial(X)}"
|
data/lib/ryeppp/version.rb
CHANGED
data/ryeppp.gemspec
CHANGED
@@ -26,4 +26,6 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_development_dependency "rspec", ">= 2.13.0"
|
27
27
|
spec.add_development_dependency "rspec", ">= 2.13.0"
|
28
28
|
spec.add_development_dependency "RubyInline", "~> 3.12.2"
|
29
|
+
spec.add_development_dependency "trollop", "~> 2.0"
|
30
|
+
spec.add_development_dependency "version_bumper", "~> 0.3.0"
|
29
31
|
end
|
data/spec/ryeppp_spec.rb
CHANGED
@@ -1,36 +1,43 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
SMALLEST_TOO_BIG_INTEGER = 2**63
|
4
|
+
BIGGEST_TOO_SMALL_INTEGER = -2**63 - 1
|
5
|
+
|
3
6
|
describe Ryeppp do
|
4
7
|
# Addition
|
5
8
|
it 'should add vectors of Fixnums' do
|
6
9
|
Ryeppp.add_v64sv64s_v64s([1], [2]).should eq([3])
|
7
10
|
expect{Ryeppp.add_v64sv64s_v64s([1, 'a'], [2, 'b'])}.to raise_error(TypeError)
|
8
|
-
expect{Ryeppp.add_v64sv64s_v64s([
|
9
|
-
expect{Ryeppp.add_v64sv64s_v64s([
|
11
|
+
expect{Ryeppp.add_v64sv64s_v64s([SMALLEST_TOO_BIG_INTEGER], [1])}.to raise_error(RangeError)
|
12
|
+
expect{Ryeppp.add_v64sv64s_v64s([BIGGEST_TOO_SMALL_INTEGER], [1])}.to raise_error(RangeError)
|
13
|
+
expect{Ryeppp.add_v64sv64s_v64s([1], [2, 3])}.to raise_error(ArgumentError)
|
10
14
|
end
|
11
15
|
it 'should add vectors of Floats' do
|
12
16
|
Ryeppp.add_v64fv64f_v64f([1.1], [1.1]).should eq([2.2])
|
13
17
|
expect{Ryeppp.add_v64fv64f_v64f([1.1, 'a'], [2.2, 'b'])}.to raise_error(TypeError)
|
18
|
+
expect{Ryeppp.add_v64fv64f_v64f([1.1], [2.2, 3.3])}.to raise_error(ArgumentError)
|
14
19
|
end
|
15
20
|
|
16
21
|
# Subtraction
|
17
22
|
it 'should subtract vectors of Fixnums' do
|
18
23
|
Ryeppp.subtract_v64sv64s_v64s([1], [2]).should eq([-1])
|
19
24
|
expect{Ryeppp.subtract_v64sv64s_v64s([1, 'a'], [2, 'b'])}.to raise_error(TypeError)
|
20
|
-
expect{Ryeppp.subtract_v64sv64s_v64s([
|
21
|
-
expect{Ryeppp.subtract_v64sv64s_v64s([
|
25
|
+
expect{Ryeppp.subtract_v64sv64s_v64s([SMALLEST_TOO_BIG_INTEGER], [2])}.to raise_error(RangeError)
|
26
|
+
expect{Ryeppp.subtract_v64sv64s_v64s([BIGGEST_TOO_SMALL_INTEGER], [2])}.to raise_error(RangeError)
|
27
|
+
expect{Ryeppp.subtract_v64sv64s_v64s([1], [2, 3])}.to raise_error(ArgumentError)
|
22
28
|
end
|
23
29
|
it 'should subtract vectors of Floats' do
|
24
30
|
Ryeppp.subtract_v64fv64f_v64f([1.1], [1.1]).should eq([0])
|
25
31
|
expect{Ryeppp.subtract_v64fv64f_v64f([1.1, 'a'], [2.2, 'b'])}.to raise_error(TypeError)
|
32
|
+
expect{Ryeppp.subtract_v64fv64f_v64f([1.1], [2.2, 3.3])}.to raise_error(ArgumentError)
|
26
33
|
end
|
27
34
|
|
28
35
|
# Multiplication
|
29
36
|
it 'should multiply a vector of Fixnums by a constant' do
|
30
37
|
Ryeppp.multiply_v64ss64s_v64s([1, 2, 3], 2).should eq([2, 4, 6])
|
31
38
|
expect{Ryeppp.multiply_v64ss64s_v64s([1, 'a'], 2)}.to raise_error(TypeError)
|
32
|
-
expect{Ryeppp.multiply_v64ss64s_v64s([
|
33
|
-
expect{Ryeppp.multiply_v64ss64s_v64s([
|
39
|
+
expect{Ryeppp.multiply_v64ss64s_v64s([SMALLEST_TOO_BIG_INTEGER], 2)}.to raise_error(RangeError)
|
40
|
+
expect{Ryeppp.multiply_v64ss64s_v64s([BIGGEST_TOO_SMALL_INTEGER], 2)}.to raise_error(RangeError)
|
34
41
|
expect{Ryeppp.multiply_v64ss64s_v64s(2, 2)}.to raise_error(ArgumentError)
|
35
42
|
expect{Ryeppp.multiply_v64ss64s_v64s([1, 2], 'a')}.to raise_error(ArgumentError)
|
36
43
|
end
|
@@ -42,14 +49,16 @@ describe Ryeppp do
|
|
42
49
|
it 'should multiply vectors of Fixnums' do
|
43
50
|
Ryeppp.multiply_v64sv64s_v64s([2], [3]).should eq([6])
|
44
51
|
expect{Ryeppp.multiply_v64sv64s_v64s([1, 'a'], [2, 'b'])}.to raise_error(TypeError)
|
45
|
-
expect{Ryeppp.multiply_v64sv64s_v64s([
|
46
|
-
expect{Ryeppp.multiply_v64sv64s_v64s([
|
52
|
+
expect{Ryeppp.multiply_v64sv64s_v64s([SMALLEST_TOO_BIG_INTEGER], [2])}.to raise_error(RangeError)
|
53
|
+
expect{Ryeppp.multiply_v64sv64s_v64s([BIGGEST_TOO_SMALL_INTEGER], [2])}.to raise_error(RangeError)
|
47
54
|
expect{Ryeppp.multiply_v64sv64s_v64s(2, [2])}.to raise_error(ArgumentError)
|
48
55
|
expect{Ryeppp.multiply_v64sv64s_v64s([2], 2)}.to raise_error(ArgumentError)
|
56
|
+
expect{Ryeppp.multiply_v64sv64s_v64s([1], [2, 3])}.to raise_error(ArgumentError)
|
49
57
|
end
|
50
58
|
it 'should multiply vectors of Floats' do
|
51
59
|
Ryeppp.multiply_v64fv64f_v64f([2.5], [3.5]).should eq([8.75])
|
52
60
|
expect{Ryeppp.multiply_v64fv64f_v64f([1.1, 'a'], [2.2, 'b'])}.to raise_error(TypeError)
|
61
|
+
expect{Ryeppp.multiply_v64fv64f_v64f([1.1], [2.2, 3.3])}.to raise_error(ArgumentError)
|
53
62
|
end
|
54
63
|
|
55
64
|
# Dot Product
|
@@ -58,14 +67,15 @@ describe Ryeppp do
|
|
58
67
|
expect{Ryeppp.dotproduct_v64fv64f_s64f([1, 2, 'a'], [4, 5, 'b'])}.to raise_error(TypeError)
|
59
68
|
expect{Ryeppp.dotproduct_v64fv64f_s64f(2, [2])}.to raise_error(ArgumentError)
|
60
69
|
expect{Ryeppp.dotproduct_v64fv64f_s64f([2], 2)}.to raise_error(ArgumentError)
|
70
|
+
expect{Ryeppp.dotproduct_v64fv64f_s64f([1], [2, 3])}.to raise_error(ArgumentError)
|
61
71
|
end
|
62
72
|
|
63
73
|
# Minimum
|
64
74
|
it 'should find the minimum in a vector of Fixnums' do
|
65
75
|
Ryeppp.min_v64s_s64s([3, 2, 1]).should eq(1)
|
66
76
|
expect{Ryeppp.min_v64s_s64s([1, 'a'])}.to raise_error(TypeError)
|
67
|
-
expect{Ryeppp.min_v64s_s64s([
|
68
|
-
expect{Ryeppp.min_v64s_s64s([
|
77
|
+
expect{Ryeppp.min_v64s_s64s([SMALLEST_TOO_BIG_INTEGER])}.to raise_error(RangeError)
|
78
|
+
expect{Ryeppp.min_v64s_s64s([BIGGEST_TOO_SMALL_INTEGER])}.to raise_error(RangeError)
|
69
79
|
expect{Ryeppp.min_v64s_s64s(2)}.to raise_error(ArgumentError)
|
70
80
|
end
|
71
81
|
it 'should find the minimum in a vector of Floats' do
|
@@ -78,8 +88,8 @@ describe Ryeppp do
|
|
78
88
|
it 'should find the maximum in a vector of Fixnums' do
|
79
89
|
Ryeppp.max_v64s_s64s([3, 2, 1]).should eq(3)
|
80
90
|
expect{Ryeppp.max_v64s_s64s([1, 'a'])}.to raise_error(TypeError)
|
81
|
-
expect{Ryeppp.max_v64s_s64s([
|
82
|
-
expect{Ryeppp.max_v64s_s64s([
|
91
|
+
expect{Ryeppp.max_v64s_s64s([SMALLEST_TOO_BIG_INTEGER])}.to raise_error(RangeError)
|
92
|
+
expect{Ryeppp.max_v64s_s64s([BIGGEST_TOO_SMALL_INTEGER])}.to raise_error(RangeError)
|
83
93
|
expect{Ryeppp.max_v64s_s64s(2)}.to raise_error(ArgumentError)
|
84
94
|
end
|
85
95
|
it 'should find the maximum in a vector of Floats' do
|
@@ -94,6 +104,7 @@ describe Ryeppp do
|
|
94
104
|
expect{Ryeppp.min_v64fv64f_v64f([1.0, 'a'], [2.0, 'b'])}.to raise_error(TypeError)
|
95
105
|
expect{Ryeppp.min_v64fv64f_v64f(1.0, [2.0, 'b'])}.to raise_error(ArgumentError)
|
96
106
|
expect{Ryeppp.min_v64fv64f_v64f([1.0], 1)}.to raise_error(ArgumentError)
|
107
|
+
expect{Ryeppp.min_v64fv64f_v64f([1.0], [2.0, 3.0])}.to raise_error(ArgumentError)
|
97
108
|
end
|
98
109
|
# Pairwise Maxima
|
99
110
|
it 'should find the pairwise maxima in vectors of Floats' do
|
@@ -101,6 +112,7 @@ describe Ryeppp do
|
|
101
112
|
expect{Ryeppp.max_v64fv64f_v64f([1.0, 'a'], [2.0, 'b'])}.to raise_error(TypeError)
|
102
113
|
expect{Ryeppp.max_v64fv64f_v64f(1.0, [2.0, 'b'])}.to raise_error(ArgumentError)
|
103
114
|
expect{Ryeppp.max_v64fv64f_v64f([1.0, 'a'], 2.0)}.to raise_error(ArgumentError)
|
115
|
+
expect{Ryeppp.max_v64fv64f_v64f([1.0], [2.0, 3.0])}.to raise_error(ArgumentError)
|
104
116
|
end
|
105
117
|
|
106
118
|
# Constant Minima
|
@@ -122,8 +134,8 @@ describe Ryeppp do
|
|
122
134
|
it 'should negate vectors of Fixnums' do
|
123
135
|
Ryeppp.negate_v64s_s64s([1]).should eq([-1])
|
124
136
|
expect{Ryeppp.negate_v64s_s64s([1, 'a'])}.to raise_error(TypeError)
|
125
|
-
expect{Ryeppp.negate_v64s_s64s([
|
126
|
-
expect{Ryeppp.negate_v64s_s64s([
|
137
|
+
expect{Ryeppp.negate_v64s_s64s([SMALLEST_TOO_BIG_INTEGER])}.to raise_error(RangeError)
|
138
|
+
expect{Ryeppp.negate_v64s_s64s([BIGGEST_TOO_SMALL_INTEGER])}.to raise_error(RangeError)
|
127
139
|
expect{Ryeppp.negate_v64s_s64s(1)}.to raise_error(ArgumentError)
|
128
140
|
end
|
129
141
|
it 'should negate vectors of Floats' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ryeppp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-07-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -107,6 +107,38 @@ dependencies:
|
|
107
107
|
- - ~>
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: 3.12.2
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: trollop
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '2.0'
|
118
|
+
prerelease: false
|
119
|
+
type: :development
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '2.0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: version_bumper
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ~>
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 0.3.0
|
134
|
+
prerelease: false
|
135
|
+
type: :development
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 0.3.0
|
110
142
|
description: This gem provides bindings to the Yeppp! library. According to the documentation,
|
111
143
|
"Yeppp! is a high-performance SIMD-optimized mathematical library for x86, ARM,
|
112
144
|
and MIPS processors on Windows, Android, Mac OS X, and GNU/Linux systems."
|
@@ -123,6 +155,7 @@ files:
|
|
123
155
|
- LICENSE.txt
|
124
156
|
- README.md
|
125
157
|
- Rakefile
|
158
|
+
- VERSION
|
126
159
|
- ext/ryeppp/extconf.rb
|
127
160
|
- ext/templates/ryeppp.c.rb
|
128
161
|
- lib/ryeppp.rb
|