computation 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/features/computation_committees.feature +89 -3
- data/features/computation_emissions.feature +35 -1
- data/features/support/env.rb +1 -1
- data/lib/computation/carbon_model.rb +57 -1
- data/lib/computation/characterization.rb +4 -0
- data/lib/computation/data.rb +6 -2
- data/lib/test_support/computation_record.rb +9 -0
- metadata +44 -46
- data/lib/test_support/db/schema.rb +0 -7
@@ -1,8 +1,94 @@
|
|
1
1
|
Feature: Computation Committee Calculations
|
2
2
|
The computation model should generate correct committee calculations
|
3
3
|
|
4
|
-
Scenario:
|
4
|
+
Scenario: Compute units committee from default
|
5
5
|
Given a computation emitter
|
6
|
-
When the "
|
6
|
+
When the "compute_units" committee is calculated
|
7
7
|
Then the committee should have used quorum "default"
|
8
|
-
And the conclusion of the committee should be "
|
8
|
+
And the conclusion of the committee should be "1"
|
9
|
+
|
10
|
+
Scenario: Compute time commitee from default
|
11
|
+
Given a computation emitter
|
12
|
+
When the "compute_time" committee is calculated
|
13
|
+
Then the committee should have used quorum "default"
|
14
|
+
And the conclusion of the committee should be "1.0"
|
15
|
+
|
16
|
+
Scenario: eGRID subregion committee from default
|
17
|
+
Given a computation emitter
|
18
|
+
When the "egrid_subregion" committee is calculated
|
19
|
+
Then the committee should have used quorum "default"
|
20
|
+
And the conclusion of the committee should have "abbreviation" of "US"
|
21
|
+
|
22
|
+
Scenario: eGRID subregion commitee from zip code
|
23
|
+
Given a computation emitter
|
24
|
+
And a characteristic "zip_code.name" of "94122"
|
25
|
+
When the "egrid_subregion" committee is calculated
|
26
|
+
Then the committee should have used quorum "from zip code"
|
27
|
+
And the conclusion of the committee should have "abbreviation" of "CAMX"
|
28
|
+
|
29
|
+
Scenario: eGRID region committee from default eGRID subregion
|
30
|
+
Given a computation emitter
|
31
|
+
When the "egrid_subregion" committee is calculated
|
32
|
+
And the "egrid_region" committee is calculated
|
33
|
+
Then the committee should have used quorum "from eGRID subregion"
|
34
|
+
And the conclusion of the committee should have "name" of "US"
|
35
|
+
|
36
|
+
Scenario: eGRID region committe from zip code
|
37
|
+
Given a computation emitter
|
38
|
+
And a characteristic "zip_code.name" of "94122"
|
39
|
+
When the "egrid_subregion" committee is calculated
|
40
|
+
And the "egrid_region" committee is calculated
|
41
|
+
Then the committee should have used quorum "from eGRID subregion"
|
42
|
+
And the conclusion of the committee should have "name" of "W"
|
43
|
+
|
44
|
+
Scenario: Compute electricity intensity commtitee from default
|
45
|
+
Given a computation emitter
|
46
|
+
When the "compute_electricity_intensity" committee is calculated
|
47
|
+
Then the committee should have used quorum "default"
|
48
|
+
And the conclusion of the committee should be "0.075"
|
49
|
+
|
50
|
+
Scenario: Power usage effectiveness commtitee from default
|
51
|
+
Given a computation emitter
|
52
|
+
When the "power_usage_effectiveness" committee is calculated
|
53
|
+
Then the committee should have used quorum "default"
|
54
|
+
And the conclusion of the committee should be "1.5"
|
55
|
+
|
56
|
+
Scenario: Electricity use commitee from default compute units, time, electricity intensity, zip code, and PUE
|
57
|
+
Given a computation emitter
|
58
|
+
When the "compute_units" committee is calculated
|
59
|
+
And the "compute_time" committee is calculated
|
60
|
+
And the "egrid_subregion" committee is calculated
|
61
|
+
And the "egrid_region" committee is calculated
|
62
|
+
And the "compute_electricity_intensity" committee is calculated
|
63
|
+
And the "power_usage_effectiveness" committee is calculated
|
64
|
+
And the "electricity_use" committee is calculated
|
65
|
+
Then the committee should have used quorum "from compute units, time, electricity intensity, PUE, and eGRID region"
|
66
|
+
And the conclusion of the committee should be "0.14063"
|
67
|
+
|
68
|
+
Scenario: Electricity use commitee from compute units, time, electricity intensity, zip code, and PUE
|
69
|
+
Given a computation emitter
|
70
|
+
And a characteristic "compute_units" of "10"
|
71
|
+
And a characteristic "compute_time" of "10"
|
72
|
+
And a characteristic "zip_code.name" of "94122"
|
73
|
+
And a characteristic "compute_electricity_intensity" of "1.0"
|
74
|
+
And a characteristic "power_usage_effectiveness" of "2.0"
|
75
|
+
And the "egrid_subregion" committee is calculated
|
76
|
+
And the "egrid_region" committee is calculated
|
77
|
+
And the "electricity_use" committee is calculated
|
78
|
+
Then the committee should have used quorum "from compute units, time, electricity intensity, PUE, and eGRID region"
|
79
|
+
And the conclusion of the committee should be "222.22222"
|
80
|
+
|
81
|
+
Scenario: Emission factor committee from default eGRID subregion
|
82
|
+
Given a computation emitter
|
83
|
+
When the "egrid_subregion" committee is calculated
|
84
|
+
And the "emission_factor" committee is calculated
|
85
|
+
Then the committee should have used quorum "from eGRID subregion"
|
86
|
+
And the conclusion of the committee should be "2.0"
|
87
|
+
|
88
|
+
Scenario: Emission factor committee from zip code
|
89
|
+
Given a computation emitter
|
90
|
+
And a characteristic "zip_code.name" of "94122"
|
91
|
+
When the "egrid_subregion" committee is calculated
|
92
|
+
And the "emission_factor" committee is calculated
|
93
|
+
Then the committee should have used quorum "from eGRID subregion"
|
94
|
+
And the conclusion of the committee should be "1.0"
|
@@ -4,4 +4,38 @@ Feature: Computation Emissions Calculations
|
|
4
4
|
Scenario: Calculations starting from nothing
|
5
5
|
Given a computation has nothing
|
6
6
|
When emissions are calculated
|
7
|
-
Then the emission value should be within "0.
|
7
|
+
Then the emission value should be within "0.01" kgs of "0.28"
|
8
|
+
|
9
|
+
Scenario: Calculations starting from compute units
|
10
|
+
Given a computation has "compute_units" of "10"
|
11
|
+
When emissions are calculated
|
12
|
+
Then the emission value should be within "0.01" kgs of "2.81"
|
13
|
+
|
14
|
+
Scenario: Calculations starting from compute time
|
15
|
+
Given a computation has "compute_time" of "10"
|
16
|
+
When emissions are calculated
|
17
|
+
Then the emission value should be within "0.01" kgs of "2.81"
|
18
|
+
|
19
|
+
Scenario: Calculations starting from zip code
|
20
|
+
Given a computation has "zip_code.name" of "94122"
|
21
|
+
When emissions are calculated
|
22
|
+
Then the emission value should be within "0.01" kgs of "0.13"
|
23
|
+
|
24
|
+
Scenario: Calculations starting from compute electricity intensity
|
25
|
+
Given a computation has "compute_electricity_intensity" of "1.0"
|
26
|
+
When emissions are calculated
|
27
|
+
Then the emission value should be within "0.01" kgs of "3.75"
|
28
|
+
|
29
|
+
Scenario: Calculations starting from power usage effectiveness
|
30
|
+
Given a computation has "power_usage_effectiveness" of "2.0"
|
31
|
+
When emissions are calculated
|
32
|
+
Then the emission value should be within "0.01" kgs of "0.38"
|
33
|
+
|
34
|
+
Scenario: Calculations starting from compute units, time, electricity intensity, zip code, and PUE
|
35
|
+
Given a computation has "compute_units" of "10"
|
36
|
+
And it has "compute_time" of "10"
|
37
|
+
And it has "zip_code.name" of "94122"
|
38
|
+
And it has "compute_electricity_intensity" of "1.0"
|
39
|
+
And it has "power_usage_effectiveness" of "2.0"
|
40
|
+
When emissions are calculated
|
41
|
+
Then the emission value should be within "0.01" kgs of "222.22"
|
data/features/support/env.rb
CHANGED
@@ -4,8 +4,64 @@ module BrighterPlanet
|
|
4
4
|
def self.included(base)
|
5
5
|
base.decide :emission, :with => :characteristics do
|
6
6
|
committee :emission do # returns kg CO2e
|
7
|
+
quorum 'from electricity use and emission factor', :needs => [:electricity_use, :emission_factor] do |characteristics|
|
8
|
+
characteristics[:electricity_use] * characteristics[:emission_factor]
|
9
|
+
end
|
10
|
+
|
11
|
+
quorum 'default' do
|
12
|
+
raise "The emission committee's default quorum should never be called."
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
committee :emission_factor do # returns kg co2e / kWh
|
17
|
+
quorum 'from eGRID subregion', :needs => :egrid_subregion do |characteristics|
|
18
|
+
characteristics[:egrid_subregion].electricity_emission_factor
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
committee :electricity_use do # returns kWh including distribution losses
|
23
|
+
quorum 'from compute units, time, electricity intensity, PUE, and eGRID region', :needs => [:compute_units, :compute_time, :compute_electricity_intensity, :power_usage_effectiveness, :egrid_region] do |characteristics|
|
24
|
+
(characteristics[:compute_units] * characteristics[:compute_time] * characteristics[:compute_electricity_intensity] * characteristics[:power_usage_effectiveness]) / (1 - characteristics[:egrid_region].loss_factor)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
committee :power_usage_effectiveness do # returns data center total energy use / IT energy use
|
29
|
+
quorum 'default' do
|
30
|
+
base.fallback.power_usage_effectiveness
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
committee :compute_electricity_intensity do # returns kW (average load of IT infrastructure)
|
35
|
+
quorum 'default' do
|
36
|
+
base.fallback.compute_electricity_intensity
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
committee :egrid_region do # returns eGRID region
|
41
|
+
quorum 'from eGRID subregion', :needs => :egrid_subregion do |characteristics|
|
42
|
+
characteristics[:egrid_subregion].egrid_region
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
committee :egrid_subregion do # returns eGRID subregion
|
47
|
+
quorum 'from zip code', :needs => :zip_code do |characteristics|
|
48
|
+
characteristics[:zip_code].egrid_subregion
|
49
|
+
end
|
50
|
+
|
51
|
+
quorum 'default' do
|
52
|
+
EgridSubregion.find_by_abbreviation 'US'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
committee :compute_time do # returns hours
|
57
|
+
quorum 'default' do
|
58
|
+
base.fallback.compute_time
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
committee :compute_units do # returns compute units (EC2 instances)
|
7
63
|
quorum 'default' do
|
8
|
-
|
64
|
+
base.fallback.compute_units
|
9
65
|
end
|
10
66
|
end
|
11
67
|
end
|
data/lib/computation/data.rb
CHANGED
@@ -4,9 +4,13 @@ module BrighterPlanet
|
|
4
4
|
def self.included(base)
|
5
5
|
base.data_miner do
|
6
6
|
schema do
|
7
|
-
float
|
7
|
+
float 'compute_time'
|
8
|
+
integer 'compute_units'
|
9
|
+
string 'zip_code_name'
|
10
|
+
float 'compute_electricity_intensity'
|
11
|
+
float 'power_usage_effectiveness'
|
8
12
|
end
|
9
|
-
|
13
|
+
|
10
14
|
process :run_data_miner_on_belongs_to_associations
|
11
15
|
end
|
12
16
|
end
|
@@ -5,4 +5,13 @@ require 'sniff'
|
|
5
5
|
class ComputationRecord < ActiveRecord::Base
|
6
6
|
include Sniff::Emitter
|
7
7
|
include BrighterPlanet::Computation
|
8
|
+
|
9
|
+
belongs_to :zip_code, :foreign_key => 'zip_code_name'
|
10
|
+
belongs_to :egrid_subregion, :foreign_key => 'egrid_subregion_abbreviation'
|
11
|
+
belongs_to :egrid_region, :foreign_key => 'egrid_region_name'
|
12
|
+
|
13
|
+
falls_back_on :compute_time => 1.0, # assume 1 hour
|
14
|
+
:compute_units => 1, # assume 1 EC2 Unit
|
15
|
+
:power_usage_effectiveness => 1.5, # based on Amazon's EC2 cost comparison calculator statement that most data centers have PUE of 1.3 - 3.0
|
16
|
+
:compute_electricity_intensity => 0.075 # kW based on Amazon's EC2 cost comparison calculator stating 150W for small compute instance equivalent server and 0.5 power conversion factor (to get average operating load from nameplate capacity) - EC2 probably has lower draw but higher power conversion factor
|
8
17
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: computation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andy Rossmeissl
|
@@ -19,14 +19,13 @@ autorequire:
|
|
19
19
|
bindir: bin
|
20
20
|
cert_chain: []
|
21
21
|
|
22
|
-
date: 2010-09-
|
22
|
+
date: 2010-09-27 00:00:00 -07:00
|
23
23
|
default_executable:
|
24
24
|
dependencies:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
|
-
type: :development
|
27
|
-
prerelease: false
|
28
26
|
name: activerecord
|
29
|
-
|
27
|
+
prerelease: false
|
28
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
30
29
|
none: false
|
31
30
|
requirements:
|
32
31
|
- - ~>
|
@@ -37,12 +36,12 @@ dependencies:
|
|
37
36
|
- 0
|
38
37
|
- 0
|
39
38
|
version: 3.0.0
|
40
|
-
requirement: *id001
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
39
|
type: :development
|
43
|
-
|
40
|
+
version_requirements: *id001
|
41
|
+
- !ruby/object:Gem::Dependency
|
44
42
|
name: bundler
|
45
|
-
|
43
|
+
prerelease: false
|
44
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
46
45
|
none: false
|
47
46
|
requirements:
|
48
47
|
- - ~>
|
@@ -53,12 +52,12 @@ dependencies:
|
|
53
52
|
- 0
|
54
53
|
- 0
|
55
54
|
version: 1.0.0
|
56
|
-
requirement: *id002
|
57
|
-
- !ruby/object:Gem::Dependency
|
58
55
|
type: :development
|
59
|
-
|
56
|
+
version_requirements: *id002
|
57
|
+
- !ruby/object:Gem::Dependency
|
60
58
|
name: cucumber
|
61
|
-
|
59
|
+
prerelease: false
|
60
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
62
61
|
none: false
|
63
62
|
requirements:
|
64
63
|
- - ~>
|
@@ -69,12 +68,12 @@ dependencies:
|
|
69
68
|
- 8
|
70
69
|
- 3
|
71
70
|
version: 0.8.3
|
72
|
-
requirement: *id003
|
73
|
-
- !ruby/object:Gem::Dependency
|
74
71
|
type: :development
|
75
|
-
|
72
|
+
version_requirements: *id003
|
73
|
+
- !ruby/object:Gem::Dependency
|
76
74
|
name: jeweler
|
77
|
-
|
75
|
+
prerelease: false
|
76
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
78
77
|
none: false
|
79
78
|
requirements:
|
80
79
|
- - ~>
|
@@ -85,12 +84,12 @@ dependencies:
|
|
85
84
|
- 4
|
86
85
|
- 0
|
87
86
|
version: 1.4.0
|
88
|
-
requirement: *id004
|
89
|
-
- !ruby/object:Gem::Dependency
|
90
87
|
type: :development
|
91
|
-
|
88
|
+
version_requirements: *id004
|
89
|
+
- !ruby/object:Gem::Dependency
|
92
90
|
name: rake
|
93
|
-
|
91
|
+
prerelease: false
|
92
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
94
93
|
none: false
|
95
94
|
requirements:
|
96
95
|
- - ">="
|
@@ -99,12 +98,12 @@ dependencies:
|
|
99
98
|
segments:
|
100
99
|
- 0
|
101
100
|
version: "0"
|
102
|
-
requirement: *id005
|
103
|
-
- !ruby/object:Gem::Dependency
|
104
101
|
type: :development
|
105
|
-
|
102
|
+
version_requirements: *id005
|
103
|
+
- !ruby/object:Gem::Dependency
|
106
104
|
name: rdoc
|
107
|
-
|
105
|
+
prerelease: false
|
106
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
108
107
|
none: false
|
109
108
|
requirements:
|
110
109
|
- - ">="
|
@@ -113,12 +112,12 @@ dependencies:
|
|
113
112
|
segments:
|
114
113
|
- 0
|
115
114
|
version: "0"
|
116
|
-
requirement: *id006
|
117
|
-
- !ruby/object:Gem::Dependency
|
118
115
|
type: :development
|
119
|
-
|
116
|
+
version_requirements: *id006
|
117
|
+
- !ruby/object:Gem::Dependency
|
120
118
|
name: rspec
|
121
|
-
|
119
|
+
prerelease: false
|
120
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
122
121
|
none: false
|
123
122
|
requirements:
|
124
123
|
- - ~>
|
@@ -131,28 +130,28 @@ dependencies:
|
|
131
130
|
- beta
|
132
131
|
- 17
|
133
132
|
version: 2.0.0.beta.17
|
134
|
-
requirement: *id007
|
135
|
-
- !ruby/object:Gem::Dependency
|
136
133
|
type: :development
|
137
|
-
|
134
|
+
version_requirements: *id007
|
135
|
+
- !ruby/object:Gem::Dependency
|
138
136
|
name: sniff
|
139
|
-
|
137
|
+
prerelease: false
|
138
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
140
139
|
none: false
|
141
140
|
requirements:
|
142
141
|
- - ~>
|
143
142
|
- !ruby/object:Gem::Version
|
144
|
-
hash:
|
143
|
+
hash: 23
|
145
144
|
segments:
|
146
145
|
- 0
|
147
|
-
-
|
148
|
-
-
|
149
|
-
version: 0.
|
150
|
-
|
146
|
+
- 2
|
147
|
+
- 0
|
148
|
+
version: 0.2.0
|
149
|
+
type: :development
|
150
|
+
version_requirements: *id008
|
151
151
|
- !ruby/object:Gem::Dependency
|
152
|
-
type: :runtime
|
153
|
-
prerelease: false
|
154
152
|
name: emitter
|
155
|
-
|
153
|
+
prerelease: false
|
154
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
156
155
|
none: false
|
157
156
|
requirements:
|
158
157
|
- - ~>
|
@@ -163,7 +162,8 @@ dependencies:
|
|
163
162
|
- 1
|
164
163
|
- 3
|
165
164
|
version: 0.1.3
|
166
|
-
|
165
|
+
type: :runtime
|
166
|
+
version_requirements: *id009
|
167
167
|
description: A software model in Ruby for the greenhouse gas emissions of a computer's computations
|
168
168
|
email: andy@rossmeissl.net
|
169
169
|
executables: []
|
@@ -182,7 +182,6 @@ files:
|
|
182
182
|
- lib/computation/data.rb
|
183
183
|
- lib/computation/summarization.rb
|
184
184
|
- lib/test_support/computation_record.rb
|
185
|
-
- lib/test_support/db/schema.rb
|
186
185
|
- features/support/env.rb
|
187
186
|
- features/computation_committees.feature
|
188
187
|
- features/computation_emissions.feature
|
@@ -225,4 +224,3 @@ test_files:
|
|
225
224
|
- features/computation_committees.feature
|
226
225
|
- features/computation_emissions.feature
|
227
226
|
- lib/test_support/computation_record.rb
|
228
|
-
- lib/test_support/db/schema.rb
|