darvin_functions 0.0.1 → 0.0.2
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.
- data/README.rdoc +7 -0
- data/ext/darvin_functions.c +69 -0
- data/ext/darvin_functions.h +20 -0
- data/test/helper.rb +10 -0
- data/test/test_mmp.rb +44 -0
- metadata +12 -9
- data/ext/darvin_functions.bundle +0 -0
data/README.rdoc
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
#include <memory.h>
|
3
|
+
#include <stdlib.h>
|
4
|
+
|
5
|
+
#include "darvin_functions.h"
|
6
|
+
|
7
|
+
VALUE mDarvinFunctions;
|
8
|
+
|
9
|
+
/********************************************************************************
|
10
|
+
* roundNumber
|
11
|
+
********************************************************************************/
|
12
|
+
long roundNumber(double value) {
|
13
|
+
if (value == 0.0) return (0); // don't mess with zero
|
14
|
+
if (value > 0.0) return ((long)(value+.5)); // positive number
|
15
|
+
return ((long)(value - .5)); // negative number
|
16
|
+
}
|
17
|
+
|
18
|
+
/* vself is a reference to the module or itself
|
19
|
+
varray is a Ruby array */
|
20
|
+
VALUE mDarvinFunctions_workout_mmp(VALUE vself, VALUE varray) {
|
21
|
+
if (NIL_P(varray) || RARRAY_LEN(varray) == 0)
|
22
|
+
return varray;
|
23
|
+
|
24
|
+
VALUE new_array = rb_ary_new2(RARRAY_LEN(varray));
|
25
|
+
|
26
|
+
int i, j, trail, offset;
|
27
|
+
long *tot; // total for specific interval
|
28
|
+
long *maxTot; // current sum for (i-1)
|
29
|
+
|
30
|
+
tot = ALLOCA_N(long, RARRAY_LEN(varray)); // allocate memory
|
31
|
+
maxTot = ALLOCA_N(long, RARRAY_LEN(varray)); // allocate memory
|
32
|
+
|
33
|
+
trail = 0; // trailing value
|
34
|
+
memset(maxTot, '\0', sizeof maxTot); // init max totals by slot
|
35
|
+
|
36
|
+
maxTot[0] = tot[0] = FIX2INT(RARRAY_PTR(varray)[0]); // need first total (for single cell average), seed for others
|
37
|
+
|
38
|
+
/*
|
39
|
+
* this loop initializes the totals for all slot averages (1-n)
|
40
|
+
* assume numbers are 1 2 3 4 5
|
41
|
+
* maxTot[] will be 1, 3, 6, 10, 15
|
42
|
+
* The idea is each slot is initialized to the earliers total values,
|
43
|
+
* that is slot0 is initialized to 1
|
44
|
+
* slot1 is initialized to 1 + 2
|
45
|
+
* ...
|
46
|
+
* slot4 is initialized to 1 + 2 + 3 + 4 + 5
|
47
|
+
*/
|
48
|
+
for (i=1; i<RARRAY_LEN(varray); i++) // loop thru all the numbers
|
49
|
+
maxTot[i] = tot[i] = (tot[i-1] + FIX2INT(RARRAY_PTR(varray)[i])); // compute tot for subsequent cells (starting at cell 0)
|
50
|
+
|
51
|
+
for (offset=1; offset<RARRAY_LEN(varray); offset++) { // loop starting at index 1 (index-1 is the value to subtract)
|
52
|
+
trail = FIX2INT(RARRAY_PTR(varray)[offset-1]); // this is the value to subtract from the beginning of the list
|
53
|
+
for (i=offset; i<RARRAY_LEN(varray); i++) { // first time subtract 1 from all (except n list)
|
54
|
+
j = i - offset; // subtract trail and add next value
|
55
|
+
tot[j] += (FIX2INT(RARRAY_PTR(varray)[i]) - trail); // to temp variable
|
56
|
+
if (tot[j] > maxTot[j]) maxTot[j] = tot[j];// set maxTot for slot if larger
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
for (i=0; i<RARRAY_LEN(varray); i++) // first value divided by 1 (ignore it)
|
61
|
+
rb_ary_push(new_array, INT2FIX(roundNumber((double)maxTot[i] / (double)(i+1))));
|
62
|
+
|
63
|
+
return new_array;
|
64
|
+
}
|
65
|
+
|
66
|
+
void Init_darvin_functions(){
|
67
|
+
mDarvinFunctions = rb_define_module("DarvinFunctions");
|
68
|
+
rb_define_module_function(mDarvinFunctions, "workout_mmp", mDarvinFunctions_workout_mmp, 1);
|
69
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#ifndef RUBY_DARVINFUNCTIONS
|
2
|
+
#define RUBY_DARVINFUNCTIONS
|
3
|
+
|
4
|
+
#include <ruby.h>
|
5
|
+
#include <string.h>
|
6
|
+
#include <math.h>
|
7
|
+
#include <time.h>
|
8
|
+
#include <locale.h>
|
9
|
+
|
10
|
+
#if !defined(RSTRING_PTR)
|
11
|
+
#define RSTRING_PTR(TC_s) (RSTRING(TC_s)->ptr)
|
12
|
+
#endif
|
13
|
+
#if !defined(RSTRING_LEN)
|
14
|
+
#define RSTRING_LEN(TC_s) (RSTRING(TC_s)->len)
|
15
|
+
#endif
|
16
|
+
#if !defined(RARRAY_LEN)
|
17
|
+
#define RARRAY_LEN(TC_a) (RARRAY(TC_a)->len)
|
18
|
+
#endif
|
19
|
+
|
20
|
+
#endif
|
data/test/helper.rb
ADDED
data/test/test_mmp.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'benchmark'
|
3
|
+
|
4
|
+
class TestMMP < Test::Unit::TestCase
|
5
|
+
MAX_POWER = 150000 # 1500.00 Watts as an integer
|
6
|
+
|
7
|
+
context "test case" do
|
8
|
+
should "handle an empty array" do
|
9
|
+
assert_equal [], DarvinFunctions::workout_mmp([])
|
10
|
+
end
|
11
|
+
|
12
|
+
should "handle an array of one" do
|
13
|
+
assert_equal [10], DarvinFunctions::workout_mmp([10])
|
14
|
+
end
|
15
|
+
|
16
|
+
should "handle an array of two" do
|
17
|
+
assert_equal [10, 7], DarvinFunctions::workout_mmp([10, 4])
|
18
|
+
end
|
19
|
+
|
20
|
+
should "handle an array of three" do
|
21
|
+
assert_equal [10, 7, 5], DarvinFunctions::workout_mmp([10, 4, 2])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "Benchmark" do
|
26
|
+
|
27
|
+
setup do
|
28
|
+
@size = 14400
|
29
|
+
@data = []
|
30
|
+
@size.times do |i|
|
31
|
+
value = Math.sin(i % Math::PI / 2)
|
32
|
+
@data << (value * MAX_POWER * 100 * rand).to_i / 100.0
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
should "run under a minute" do
|
37
|
+
tms = Benchmark.bmbm(10) do |x|
|
38
|
+
x.report { DarvinFunctions::workout_mmp(@data) }
|
39
|
+
end.last
|
40
|
+
assert tms.total < 60, "#{@size} array took too long: #{tms.total} seconds is too long" # seconds
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Darvin Bauer
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-06-10 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -36,13 +36,15 @@ executables: []
|
|
36
36
|
|
37
37
|
extensions:
|
38
38
|
- ext/extconf.rb
|
39
|
-
extra_rdoc_files:
|
40
|
-
|
39
|
+
extra_rdoc_files:
|
40
|
+
- README.rdoc
|
41
41
|
files:
|
42
|
-
- ext/darvin_functions.
|
42
|
+
- ext/darvin_functions.h
|
43
|
+
- ext/darvin_functions.c
|
43
44
|
- ext/extconf.rb
|
45
|
+
- README.rdoc
|
44
46
|
has_rdoc: true
|
45
|
-
homepage: http://github.com/pedalbrain/
|
47
|
+
homepage: http://github.com/pedalbrain/Darvin_Functions
|
46
48
|
licenses: []
|
47
49
|
|
48
50
|
post_install_message:
|
@@ -71,5 +73,6 @@ rubygems_version: 1.3.6
|
|
71
73
|
signing_key:
|
72
74
|
specification_version: 3
|
73
75
|
summary: Various functions for data processing, clean up and analysis
|
74
|
-
test_files:
|
75
|
-
|
76
|
+
test_files:
|
77
|
+
- test/helper.rb
|
78
|
+
- test/test_mmp.rb
|
data/ext/darvin_functions.bundle
DELETED
Binary file
|