ranges_merger 0.3.1 → 0.4.0
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 +33 -11
- data/VERSION +1 -1
- data/lib/ranges_merger.rb +1 -0
- data/lib/ranges_merger/ranges_merger_energy_calculation.rb +68 -0
- data/ranges_merger.gemspec +5 -3
- data/spec/ranges_merger_energy_calculation_spec.rb +105 -0
- metadata +14 -12
data/README.rdoc
CHANGED
@@ -9,9 +9,7 @@ Very simple gem for merging range-like objects.
|
|
9
9
|
If you want to merge please use code just like below.
|
10
10
|
|
11
11
|
a = [1, 3]
|
12
|
-
|
13
12
|
b = [2, 4]
|
14
|
-
|
15
13
|
c = [4, 6]
|
16
14
|
|
17
15
|
result = RangesMerger.merge([a, b, c])
|
@@ -25,13 +23,9 @@ If you want to merge please use code just like below.
|
|
25
23
|
If you want to merge Range objects.
|
26
24
|
|
27
25
|
ranges = [
|
28
|
-
|
29
26
|
(1..2),
|
30
|
-
|
31
27
|
(2..3),
|
32
|
-
|
33
28
|
(5..8)
|
34
|
-
|
35
29
|
]
|
36
30
|
|
37
31
|
result = RangesMerger.merge(ranges)
|
@@ -47,15 +41,12 @@ If you want to exclude please use code just like below.
|
|
47
41
|
First - base:
|
48
42
|
|
49
43
|
a = [1, 3]
|
50
|
-
|
51
44
|
b = [3, 5]
|
52
|
-
|
53
45
|
c = [9, 11]
|
54
46
|
|
55
47
|
Seconds - exclusions:
|
56
48
|
|
57
49
|
x = [2, 4]
|
58
|
-
|
59
50
|
y = [4, 10]
|
60
51
|
|
61
52
|
And run some processing
|
@@ -73,13 +64,11 @@ If you want to have instance, add and remove ranges as you wish just do somethin
|
|
73
64
|
r = RangesMerger.new
|
74
65
|
|
75
66
|
r += [[1, 10]]
|
76
|
-
|
77
67
|
r += [[8, 15]]
|
78
68
|
|
79
69
|
# r.to_array => [[1, 15]]
|
80
70
|
|
81
71
|
r -= [[2, 4]]
|
82
|
-
|
83
72
|
r -= [[11, 12]]
|
84
73
|
|
85
74
|
# r.to_array => [[1, 2], [4,11], [12,15]]
|
@@ -133,6 +122,39 @@ object.
|
|
133
122
|
|
134
123
|
|
135
124
|
|
125
|
+
== Calculation of energy (beta)
|
126
|
+
|
127
|
+
Imagine you have information about voltage and current and you want to calculate work/energy.
|
128
|
+
Theese measurements are not set to one point in time but to a time range ('from' and 'to').
|
129
|
+
Theese time ranges are not identical for voltage and current. So what would you do? You
|
130
|
+
can use this gem! :)
|
131
|
+
|
132
|
+
# currents = [
|
133
|
+
# [ time_from, time_to, value ],
|
134
|
+
# ...
|
135
|
+
# ]
|
136
|
+
#
|
137
|
+
|
138
|
+
currents = [
|
139
|
+
[1, 2, 1],
|
140
|
+
[2, 3, 2]
|
141
|
+
]
|
142
|
+
|
143
|
+
voltages = [
|
144
|
+
[1, 2, 2],
|
145
|
+
[2, 3, 1]
|
146
|
+
]
|
147
|
+
|
148
|
+
result = RangesMerger.energy_calculation(voltages, currents)
|
149
|
+
|
150
|
+
# result => 4
|
151
|
+
|
152
|
+
|
153
|
+
This is early version, it should work and calculate correct amount of energy, but
|
154
|
+
it could not :]
|
155
|
+
|
156
|
+
|
157
|
+
|
136
158
|
== Contributing to ranges_merger
|
137
159
|
|
138
160
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/lib/ranges_merger.rb
CHANGED
@@ -2,6 +2,7 @@ require 'ranges_merger/ranges_merger_merging'
|
|
2
2
|
require 'ranges_merger/ranges_merger_utils'
|
3
3
|
require 'ranges_merger/ranges_merger_exclusion'
|
4
4
|
require 'ranges_merger/ranges_merger_divider'
|
5
|
+
require 'ranges_merger/ranges_merger_energy_calculation'
|
5
6
|
|
6
7
|
class RangesMerger
|
7
8
|
extend RangesMergerMerging
|
@@ -0,0 +1,68 @@
|
|
1
|
+
class RangesMerger
|
2
|
+
|
3
|
+
def self.energy_calculation(voltages, currents, _debug = false)
|
4
|
+
return 0 if voltages.size == 0 or currents.size == 0
|
5
|
+
|
6
|
+
# sort time ranges
|
7
|
+
voltages = voltages.sort { |a, b| a[0] <=> b[0] }
|
8
|
+
currents = currents.sort { |a, b| a[0] <=> b[0] }
|
9
|
+
# without checking of overlaps
|
10
|
+
|
11
|
+
# for loop
|
12
|
+
voltage_i = 0
|
13
|
+
current_i = 0
|
14
|
+
|
15
|
+
# output
|
16
|
+
energy = 0.0
|
17
|
+
|
18
|
+
voltage_first = true
|
19
|
+
voltage_first = false if currents[0][0] < voltages[0][0]
|
20
|
+
|
21
|
+
while voltage_i < voltages.size and current_i < currents.size
|
22
|
+
v = voltages[voltage_i]
|
23
|
+
c = currents[current_i]
|
24
|
+
|
25
|
+
# common time range
|
26
|
+
_time_from = v[0]
|
27
|
+
_time_from = c[0] if c[0] > v[0]
|
28
|
+
|
29
|
+
_time_to = v[1]
|
30
|
+
_time_to = c[1] if c[1] < v[1]
|
31
|
+
|
32
|
+
# adding to output
|
33
|
+
if _time_to > _time_from
|
34
|
+
_energy_part = v[2] * c[2] * (_time_to - _time_from)
|
35
|
+
else
|
36
|
+
# it should not enter here... probably
|
37
|
+
_energy_part = 0.0
|
38
|
+
end
|
39
|
+
energy += _energy_part
|
40
|
+
|
41
|
+
puts "#{voltage_i}, #{current_i} = #{_energy_part}, #{v.inspect}, #{c.inspect}" if _debug
|
42
|
+
|
43
|
+
# next from array
|
44
|
+
if c[1] > v[1]
|
45
|
+
voltage_i += 1
|
46
|
+
else
|
47
|
+
current_i += 1
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
#currents = [
|
53
|
+
# [1, 2] => 1,
|
54
|
+
# [2, 3] => 2
|
55
|
+
#]
|
56
|
+
#
|
57
|
+
#voltages = [
|
58
|
+
# [1, 2] => 2,
|
59
|
+
# [2, 3] => 1
|
60
|
+
#]
|
61
|
+
|
62
|
+
|
63
|
+
start_time = voltages
|
64
|
+
|
65
|
+
return energy
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
data/ranges_merger.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "ranges_merger"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.4.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Aleksander Kwiatkowski"]
|
12
|
-
s.date = "
|
12
|
+
s.date = "2012-05-23"
|
13
13
|
s.description = "Simple gem used for merging range-like objects. If you have problems with operations on ranges this gem can save you some time."
|
14
14
|
s.email = "bobikx@poczta.fm"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -28,17 +28,19 @@ Gem::Specification.new do |s|
|
|
28
28
|
"VERSION",
|
29
29
|
"lib/ranges_merger.rb",
|
30
30
|
"lib/ranges_merger/ranges_merger_divider.rb",
|
31
|
+
"lib/ranges_merger/ranges_merger_energy_calculation.rb",
|
31
32
|
"lib/ranges_merger/ranges_merger_exclusion.rb",
|
32
33
|
"lib/ranges_merger/ranges_merger_merging.rb",
|
33
34
|
"lib/ranges_merger/ranges_merger_utils.rb",
|
34
35
|
"ranges_merger.gemspec",
|
36
|
+
"spec/ranges_merger_energy_calculation_spec.rb",
|
35
37
|
"spec/ranges_merger_spec.rb",
|
36
38
|
"spec/spec_helper.rb"
|
37
39
|
]
|
38
40
|
s.homepage = "http://github.com/akwiatkowski/ranges_merger"
|
39
41
|
s.licenses = ["LGPLv3"]
|
40
42
|
s.require_paths = ["lib"]
|
41
|
-
s.rubygems_version = "1.8.
|
43
|
+
s.rubygems_version = "1.8.15"
|
42
44
|
s.summary = "Small gem for merging range-like objects"
|
43
45
|
|
44
46
|
if s.respond_to? :specification_version then
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "RangesMerger" do
|
4
|
+
|
5
|
+
# Merging
|
6
|
+
|
7
|
+
it "should calculate energy (1)" do
|
8
|
+
# time_from, time_to, value
|
9
|
+
|
10
|
+
currents = [
|
11
|
+
[1, 2, 1],
|
12
|
+
[2, 3, 2]
|
13
|
+
]
|
14
|
+
|
15
|
+
voltages = [
|
16
|
+
[1, 2, 2],
|
17
|
+
[2, 3, 1]
|
18
|
+
]
|
19
|
+
|
20
|
+
result = RangesMerger.energy_calculation(voltages, currents)
|
21
|
+
result.should == 4
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should calculate energy (2)" do
|
25
|
+
# time_from, time_to, value
|
26
|
+
|
27
|
+
currents = [
|
28
|
+
[0, 1, 0],
|
29
|
+
[2, 5, 1],
|
30
|
+
[5, 6, 0]
|
31
|
+
]
|
32
|
+
|
33
|
+
voltages = [
|
34
|
+
[0, 1, 5],
|
35
|
+
[2, 5, 0],
|
36
|
+
[5, 6, 5]
|
37
|
+
]
|
38
|
+
|
39
|
+
result = RangesMerger.energy_calculation(voltages, currents)
|
40
|
+
result.should == 0
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should calculate energy (3)" do
|
44
|
+
# time_from, time_to, value
|
45
|
+
|
46
|
+
currents = [
|
47
|
+
[0, 5, 0],
|
48
|
+
[5, 10, 1]
|
49
|
+
]
|
50
|
+
|
51
|
+
voltages = [
|
52
|
+
[0, 1, 1],
|
53
|
+
[1, 2, 0],
|
54
|
+
#
|
55
|
+
[2, 3, 1],
|
56
|
+
[3, 4, 0],
|
57
|
+
#
|
58
|
+
[4, 5, 1],
|
59
|
+
[5, 6, 0],
|
60
|
+
#
|
61
|
+
[6, 7, 1],
|
62
|
+
[7, 8, 0],
|
63
|
+
#
|
64
|
+
[8, 9, 1],
|
65
|
+
[9, 10, 0],
|
66
|
+
]
|
67
|
+
|
68
|
+
result = RangesMerger.energy_calculation(voltages, currents)
|
69
|
+
result.should == 2
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should calculate energy (4)" do
|
73
|
+
# time_from, time_to, value
|
74
|
+
|
75
|
+
currents = [
|
76
|
+
[0, 0.1, 1],
|
77
|
+
[0.2, 0.5, 2]
|
78
|
+
]
|
79
|
+
|
80
|
+
voltages = [
|
81
|
+
[1, 2, 1]
|
82
|
+
]
|
83
|
+
|
84
|
+
result = RangesMerger.energy_calculation(voltages, currents)
|
85
|
+
result.should == 0
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should calculate energy (5)" do
|
89
|
+
# time_from, time_to, value
|
90
|
+
|
91
|
+
currents = [
|
92
|
+
[0, 0.1, 1],
|
93
|
+
[0.2, 0.5, 2]
|
94
|
+
]
|
95
|
+
|
96
|
+
voltages = [
|
97
|
+
[0, 1, 1]
|
98
|
+
]
|
99
|
+
|
100
|
+
result = RangesMerger.energy_calculation(voltages, currents)
|
101
|
+
result.should == 0.1 + (0.5 - 0.2) * 2
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ranges_merger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-05-23 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &27977180 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 2.3.0
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *27977180
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: bundler
|
27
|
-
requirement: &
|
27
|
+
requirement: &19793280 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.0.0
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *19793280
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: jeweler
|
38
|
-
requirement: &
|
38
|
+
requirement: &21103540 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.6.4
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *21103540
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rcov
|
49
|
-
requirement: &
|
49
|
+
requirement: &22223640 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *22223640
|
58
58
|
description: Simple gem used for merging range-like objects. If you have problems
|
59
59
|
with operations on ranges this gem can save you some time.
|
60
60
|
email: bobikx@poczta.fm
|
@@ -75,10 +75,12 @@ files:
|
|
75
75
|
- VERSION
|
76
76
|
- lib/ranges_merger.rb
|
77
77
|
- lib/ranges_merger/ranges_merger_divider.rb
|
78
|
+
- lib/ranges_merger/ranges_merger_energy_calculation.rb
|
78
79
|
- lib/ranges_merger/ranges_merger_exclusion.rb
|
79
80
|
- lib/ranges_merger/ranges_merger_merging.rb
|
80
81
|
- lib/ranges_merger/ranges_merger_utils.rb
|
81
82
|
- ranges_merger.gemspec
|
83
|
+
- spec/ranges_merger_energy_calculation_spec.rb
|
82
84
|
- spec/ranges_merger_spec.rb
|
83
85
|
- spec/spec_helper.rb
|
84
86
|
homepage: http://github.com/akwiatkowski/ranges_merger
|
@@ -96,7 +98,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
96
98
|
version: '0'
|
97
99
|
segments:
|
98
100
|
- 0
|
99
|
-
hash:
|
101
|
+
hash: 3481524600643469531
|
100
102
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
103
|
none: false
|
102
104
|
requirements:
|
@@ -105,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
105
107
|
version: '0'
|
106
108
|
requirements: []
|
107
109
|
rubyforge_project:
|
108
|
-
rubygems_version: 1.8.
|
110
|
+
rubygems_version: 1.8.15
|
109
111
|
signing_key:
|
110
112
|
specification_version: 3
|
111
113
|
summary: Small gem for merging range-like objects
|