urbanopt-scenario 0.1.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.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +25 -0
  3. data/.rdoc_options +36 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +10 -0
  6. data/.travis.yml +23 -0
  7. data/CHANGELOG.md +5 -0
  8. data/Gemfile +42 -0
  9. data/Jenkinsfile +10 -0
  10. data/LICENSE.md +27 -0
  11. data/RDOC_MAIN.md +39 -0
  12. data/README.md +39 -0
  13. data/Rakefile +51 -0
  14. data/deploy_docs.sh +5 -0
  15. data/doc_templates/LICENSE.md +27 -0
  16. data/doc_templates/README.md.erb +42 -0
  17. data/doc_templates/copyright_erb.txt +31 -0
  18. data/doc_templates/copyright_js.txt +4 -0
  19. data/doc_templates/copyright_ruby.txt +29 -0
  20. data/docs/.gitignore +3 -0
  21. data/docs/.vuepress/components/InnerJsonSchema.vue +84 -0
  22. data/docs/.vuepress/components/JsonSchema.vue +12 -0
  23. data/docs/.vuepress/components/ScenarioSchema.vue +12 -0
  24. data/docs/.vuepress/components/StaticLink.vue +8 -0
  25. data/docs/.vuepress/config.js +15 -0
  26. data/docs/.vuepress/highlight.js +8 -0
  27. data/docs/.vuepress/public/custom_rdoc_styles.css +74 -0
  28. data/docs/.vuepress/utils.js +17 -0
  29. data/docs/README.md +39 -0
  30. data/docs/package-lock.json +11791 -0
  31. data/docs/package.json +22 -0
  32. data/docs/schemas/scenario-schema.md +3 -0
  33. data/lib/measures/.rubocop.yml +5 -0
  34. data/lib/measures/default_feature_reports/LICENSE.md +27 -0
  35. data/lib/measures/default_feature_reports/README.md +56 -0
  36. data/lib/measures/default_feature_reports/README.md.erb +42 -0
  37. data/lib/measures/default_feature_reports/measure.rb +731 -0
  38. data/lib/measures/default_feature_reports/measure.xml +139 -0
  39. data/lib/measures/default_feature_reports/tests/USA_CO_Golden-NREL.724666_TMY3.epw +8768 -0
  40. data/lib/measures/default_feature_reports/tests/default_feature_reports_test.rb +238 -0
  41. data/lib/measures/default_feature_reports/tests/example_model.osm +4378 -0
  42. data/lib/urbanopt-scenario.rb +31 -0
  43. data/lib/urbanopt/scenario.rb +45 -0
  44. data/lib/urbanopt/scenario/default_reports.rb +40 -0
  45. data/lib/urbanopt/scenario/default_reports/construction_cost.rb +169 -0
  46. data/lib/urbanopt/scenario/default_reports/date.rb +97 -0
  47. data/lib/urbanopt/scenario/default_reports/end_use.rb +159 -0
  48. data/lib/urbanopt/scenario/default_reports/end_uses.rb +140 -0
  49. data/lib/urbanopt/scenario/default_reports/feature_report.rb +207 -0
  50. data/lib/urbanopt/scenario/default_reports/location.rb +99 -0
  51. data/lib/urbanopt/scenario/default_reports/logger.rb +44 -0
  52. data/lib/urbanopt/scenario/default_reports/program.rb +261 -0
  53. data/lib/urbanopt/scenario/default_reports/reporting_period.rb +298 -0
  54. data/lib/urbanopt/scenario/default_reports/scenario_report.rb +276 -0
  55. data/lib/urbanopt/scenario/default_reports/schema/README.md +33 -0
  56. data/lib/urbanopt/scenario/default_reports/schema/scenario_csv_columns.txt +13 -0
  57. data/lib/urbanopt/scenario/default_reports/schema/scenario_schema.json +742 -0
  58. data/lib/urbanopt/scenario/default_reports/timeseries_csv.rb +231 -0
  59. data/lib/urbanopt/scenario/default_reports/validator.rb +97 -0
  60. data/lib/urbanopt/scenario/extension.rb +63 -0
  61. data/lib/urbanopt/scenario/logger.rb +42 -0
  62. data/lib/urbanopt/scenario/scenario_base.rb +79 -0
  63. data/lib/urbanopt/scenario/scenario_csv.rb +122 -0
  64. data/lib/urbanopt/scenario/scenario_datapoint_base.rb +162 -0
  65. data/lib/urbanopt/scenario/scenario_post_processor_base.rb +69 -0
  66. data/lib/urbanopt/scenario/scenario_post_processor_default.rb +97 -0
  67. data/lib/urbanopt/scenario/scenario_runner_base.rb +63 -0
  68. data/lib/urbanopt/scenario/scenario_runner_osw.rb +158 -0
  69. data/lib/urbanopt/scenario/simulation_dir_base.rb +90 -0
  70. data/lib/urbanopt/scenario/simulation_dir_osw.rb +261 -0
  71. data/lib/urbanopt/scenario/simulation_mapper_base.rb +47 -0
  72. data/lib/urbanopt/scenario/version.rb +35 -0
  73. data/urbanopt-scenario-gem.gemspec +36 -0
  74. metadata +227 -0
@@ -0,0 +1,231 @@
1
+ # *********************************************************************************
2
+ # URBANopt, Copyright (c) 2019, Alliance for Sustainable Energy, LLC, and other
3
+ # contributors. All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without modification,
6
+ # are permitted provided that the following conditions are met:
7
+ #
8
+ # Redistributions of source code must retain the above copyright notice, this list
9
+ # of conditions and the following disclaimer.
10
+ #
11
+ # Redistributions in binary form must reproduce the above copyright notice, this
12
+ # list of conditions and the following disclaimer in the documentation and/or other
13
+ # materials provided with the distribution.
14
+ #
15
+ # Neither the name of the copyright holder nor the names of its contributors may be
16
+ # used to endorse or promote products derived from this software without specific
17
+ # prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22
+ # IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
23
+ # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24
+ # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27
+ # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28
+ # OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ # *********************************************************************************
30
+
31
+ require 'csv'
32
+ require 'pathname'
33
+ require 'json-schema'
34
+ require 'urbanopt/scenario/default_reports/validator'
35
+ require 'urbanopt/scenario/default_reports/logger'
36
+
37
+ module URBANopt
38
+ module Scenario
39
+ module DefaultReports
40
+ ##
41
+ # TimeseriesCSV include timesries reults reported in a CSV file.
42
+ ##
43
+ class TimeseriesCSV
44
+ attr_accessor :path, :first_report_datetime, :column_names #:nodoc:
45
+
46
+ ##
47
+ # TimeseriesCSV class initializes timeseries csv attributes: +:path+ , +:first_report_datetime+ , +:column_names+
48
+ ##
49
+ # +hash+ - _Hash_ - A hash which may contain a deserialized timeseries_csv.
50
+ ##
51
+ def initialize(hash = {})
52
+ hash.delete_if { |k, v| v.nil? }
53
+ hash = defaults.merge(hash)
54
+
55
+ @run_dir = ''
56
+
57
+ @path = hash[:path]
58
+ @first_report_datetime = hash[:first_report_datetime]
59
+ @column_names = hash[:column_names]
60
+
61
+ # hash of column_name to array of values, does not get serialized to hash
62
+ @mutex = Mutex.new
63
+ @data = nil
64
+
65
+ # initialize class variables @@validator and @@schema
66
+ @@validator ||= Validator.new
67
+ @@schema ||= @@validator.schema
68
+
69
+ # initialize @@logger
70
+ @@logger ||= URBANopt::Scenario::DefaultReports.logger
71
+ end
72
+
73
+ ##
74
+ # Assigns default values if values does not exist.
75
+ ##
76
+ def defaults
77
+ hash = {}
78
+ hash[:path] = nil
79
+ hash[:column_names] = []
80
+ return hash
81
+ end
82
+
83
+ ##
84
+ # Gets run directory.
85
+ ##
86
+ # [parameters:]
87
+ # +name+ - _String_ - The name of the scenario (+directory_name+).
88
+ ##
89
+ def run_dir_name(name)
90
+ @run_dir = name
91
+ end
92
+
93
+ ##
94
+ # Converts to a Hash equivalent for JSON serialization.
95
+ ##
96
+ # - Exclude attributes with nil values.
97
+ # - Validate reporting_period hash properties against schema.
98
+ ##
99
+ def to_hash
100
+ result = {}
101
+ directory_path = Pathname.new File.expand_path(@run_dir.to_s, File.dirname(__FILE__)) if @run_dir
102
+ csv_path = Pathname.new @path if @path
103
+
104
+ relative_path = csv_path.to_s.sub(directory_path.to_s, '')
105
+
106
+ result[:path] = relative_path if @path
107
+ result[:first_report_datetime] = @first_report_datetime if @first_report_datetime
108
+ result[:column_names] = @column_names if @column_names
109
+
110
+ # validate timeseries_csv properties against schema
111
+ if @@validator.validate(@@schema[:definitions][:TimeseriesCSV][:properties], result).any?
112
+ raise "scenario_report properties does not match schema: #{@@validator.validate(@@schema[:definitions][:TimeseriesCSV][:properties], result)}"
113
+ end
114
+
115
+ return result
116
+ end
117
+
118
+ ##
119
+ # Loads data from the CSV file.
120
+ ##
121
+ def load_data
122
+ @mutex.synchronize do
123
+ if @data.nil?
124
+ @data = {}
125
+ @column_names = []
126
+ CSV.foreach(@path) do |row|
127
+ if @column_names.empty?
128
+ @column_names = row
129
+ @column_names.each do |column_name|
130
+ @data[column_name] = []
131
+ end
132
+ else
133
+ row.each_with_index do |value, i|
134
+ @data[@column_names[i]] << value.to_f
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
141
+
142
+ ##
143
+ # Gets data for each column name in the CSV file.
144
+ ##
145
+ # [parameters:]
146
+ # +column_name+ - _String_ - The header of each column in the CSV file.
147
+ ##
148
+ def get_data(column_name)
149
+ load_data
150
+ return @data[column_name]
151
+ end
152
+
153
+ ##
154
+ # Saves data to the the scenario report CSV file.
155
+ ##
156
+ # [parameters:]
157
+ # +path+ - _String_ - The path of the scenario report CSV (default_scenario_report.csv).
158
+ ##
159
+ def save_data(path)
160
+ File.open(path, 'w') do |f|
161
+ f.puts @column_names.join(',')
162
+ n = @data[@column_names[0]].size
163
+
164
+ (0..n).each do |i|
165
+ line = []
166
+ @column_names.each do |column_name|
167
+ line << @data[column_name][i]
168
+ end
169
+ f.puts line.join(',')
170
+ end
171
+ begin
172
+ f.fsync
173
+ rescue StandardError
174
+ f.flush
175
+ end
176
+ end
177
+ end
178
+
179
+ ##
180
+ # Merges timeseries csv to each other.
181
+ ##
182
+ # - initialize first_report_datetime with the incoming first_report_datetime if its nil.
183
+ # - checks if first_report_datetime are identical.
184
+ # - merge the column names
185
+ # - merge the column data
186
+ ##
187
+ # [parameters:]
188
+ # +other+ - _TimeseriesCSV_ - An object of TimeseriesCSV class.
189
+ ##
190
+ def add_timeseries_csv(other)
191
+ @path = other.path
192
+
193
+ # initialize first_report_datetime with the incoming first_report_datetime if its nil.
194
+ if @first_report_datetime.nil?
195
+ @first_report_datetime = other.first_report_datetime
196
+ end
197
+
198
+ # checks if first_report_datetime are identical.
199
+ if @first_report_datetime != other.first_report_datetime
200
+ raise "first_report_datetime '#{@first_report_datetime}' does not match other.first_report_datetime '#{other.first_report_datetime}'"
201
+ end
202
+
203
+ # merge the column names
204
+ @column_names = @column_names.concat(other.column_names).uniq
205
+
206
+ # merge the column data
207
+ other.column_names.each do |column_name|
208
+ new_values = other.get_data(column_name)
209
+
210
+ if @data.nil?
211
+ @data = {}
212
+ end
213
+
214
+ current_values = @data[column_name]
215
+ if current_values
216
+ if current_values.size != new_values.size
217
+ raise 'Values of different sizes in add_timeseries_csv'
218
+ end
219
+ new_values.each_with_index do |value, i|
220
+ new_values[i] = value + current_values[i]
221
+ end
222
+ @data[column_name] = new_values
223
+ else
224
+ @data[column_name] = new_values
225
+ end
226
+ end
227
+ end
228
+ end
229
+ end
230
+ end
231
+ end
@@ -0,0 +1,97 @@
1
+ # *********************************************************************************
2
+ # URBANopt, Copyright (c) 2019, Alliance for Sustainable Energy, LLC, and other
3
+ # contributors. All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without modification,
6
+ # are permitted provided that the following conditions are met:
7
+ #
8
+ # Redistributions of source code must retain the above copyright notice, this list
9
+ # of conditions and the following disclaimer.
10
+ #
11
+ # Redistributions in binary form must reproduce the above copyright notice, this
12
+ # list of conditions and the following disclaimer in the documentation and/or other
13
+ # materials provided with the distribution.
14
+ #
15
+ # Neither the name of the copyright holder nor the names of its contributors may be
16
+ # used to endorse or promote products derived from this software without specific
17
+ # prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22
+ # IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
23
+ # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24
+ # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27
+ # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28
+ # OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ # *********************************************************************************
30
+
31
+ require 'json'
32
+
33
+ module URBANopt
34
+ module Scenario
35
+ module DefaultReports
36
+ class Validator
37
+ @@schema = nil
38
+
39
+ # initialize the root directory
40
+ def initialize
41
+ super
42
+
43
+ @root_dir = File.absolute_path(File.join(File.dirname(__FILE__), '..', '..', '..', '..'))
44
+
45
+ @instance_lock = Mutex.new
46
+ @@schema ||= schema
47
+ end
48
+
49
+ # Return the absolute path of the default reports files
50
+ def files_dir
51
+ File.absolute_path(File.join(@root_dir, 'lib/urbanopt/scenario/default_reports/'))
52
+ end
53
+
54
+ # return path to schema file
55
+ def schema_file
56
+ File.join(files_dir, 'schema/scenario_schema.json')
57
+ end
58
+
59
+ # return schema
60
+ def schema
61
+ @instance_lock.synchronize do
62
+ if @@schema.nil?
63
+ File.open(schema_file, 'r') do |f|
64
+ @@schema = JSON.parse(f.read, symbolize_names: true)
65
+ end
66
+ end
67
+ end
68
+
69
+ @@schema
70
+ end
71
+
72
+ ##
73
+ # validate data against schema
74
+ ##
75
+ # [parameters:]
76
+ # +schema+ - _Hash_ - A hash of the JSON scenario_schema.
77
+ # +data+ - _Hash_ - A hash of the data to be validated against scenario_schema.
78
+ ##
79
+ def validate(schema, data)
80
+ JSON::Validator.fully_validate(schema, data)
81
+ end
82
+
83
+ # check if the schema is valid
84
+ def schema_valid?
85
+ metaschema = JSON::Validator.validator_for_name('draft6').metaschema
86
+ JSON::Validator.validate(metaschema, @@schema)
87
+ end
88
+
89
+ # return detailed schema validation errors
90
+ def schema_validation_errors
91
+ metaschema = JSON::Validator.validator_for_name('draft6').metaschema
92
+ JSON::Validator.fully_validate(metaschema, @@schema)
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,63 @@
1
+ # *********************************************************************************
2
+ # URBANopt, Copyright (c) 2019, Alliance for Sustainable Energy, LLC, and other
3
+ # contributors. All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without modification,
6
+ # are permitted provided that the following conditions are met:
7
+ #
8
+ # Redistributions of source code must retain the above copyright notice, this list
9
+ # of conditions and the following disclaimer.
10
+ #
11
+ # Redistributions in binary form must reproduce the above copyright notice, this
12
+ # list of conditions and the following disclaimer in the documentation and/or other
13
+ # materials provided with the distribution.
14
+ #
15
+ # Neither the name of the copyright holder nor the names of its contributors may be
16
+ # used to endorse or promote products derived from this software without specific
17
+ # prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22
+ # IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
23
+ # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24
+ # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27
+ # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28
+ # OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ # *********************************************************************************
30
+
31
+ require 'openstudio/extension'
32
+
33
+ module URBANopt
34
+ module Scenario
35
+ class Extension < OpenStudio::Extension::Extension
36
+ def initialize
37
+ super
38
+ @root_dir = File.absolute_path(File.join(File.dirname(__FILE__), '..', '..', '..'))
39
+ end
40
+
41
+ ##
42
+ # Returns the absolute path of the measures or nil if there is none, can be used when configuring OSWs.
43
+ def measures_dir
44
+ return File.absolute_path(File.join(@root_dir, 'lib', 'measures'))
45
+ end
46
+
47
+ ##
48
+ # Relevant files such as weather data, design days, etc.
49
+ # Return the absolute path of the files or nil if there is none, used when configuring OSWs
50
+ def files_dir
51
+ return nil
52
+ end
53
+
54
+ ##
55
+ # Doc templates are common files like copyright files which are used to update measures and other code.
56
+ # Doc templates will only be applied to measures in the current repository.
57
+ # Return the absolute path of the doc templates dir or nil if there is none.
58
+ def doc_templates_dir
59
+ return File.absolute_path(File.join(@root_dir, 'doc_templates'))
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,42 @@
1
+ # *********************************************************************************
2
+ # URBANopt, Copyright (c) 2019, Alliance for Sustainable Energy, LLC, and other
3
+ # contributors. All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without modification,
6
+ # are permitted provided that the following conditions are met:
7
+ #
8
+ # Redistributions of source code must retain the above copyright notice, this list
9
+ # of conditions and the following disclaimer.
10
+ #
11
+ # Redistributions in binary form must reproduce the above copyright notice, this
12
+ # list of conditions and the following disclaimer in the documentation and/or other
13
+ # materials provided with the distribution.
14
+ #
15
+ # Neither the name of the copyright holder nor the names of its contributors may be
16
+ # used to endorse or promote products derived from this software without specific
17
+ # prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22
+ # IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
23
+ # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24
+ # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27
+ # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28
+ # OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ # *********************************************************************************
30
+
31
+ require 'logger'
32
+
33
+ module URBANopt
34
+ module Scenario
35
+ @@logger = Logger.new(STDOUT)
36
+
37
+ # Definining class variable "@@logger" to log errors, info and warning messages.
38
+ def self.logger
39
+ @@logger
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,79 @@
1
+ # *********************************************************************************
2
+ # URBANopt, Copyright (c) 2019, Alliance for Sustainable Energy, LLC, and other
3
+ # contributors. All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without modification,
6
+ # are permitted provided that the following conditions are met:
7
+ #
8
+ # Redistributions of source code must retain the above copyright notice, this list
9
+ # of conditions and the following disclaimer.
10
+ #
11
+ # Redistributions in binary form must reproduce the above copyright notice, this
12
+ # list of conditions and the following disclaimer in the documentation and/or other
13
+ # materials provided with the distribution.
14
+ #
15
+ # Neither the name of the copyright holder nor the names of its contributors may be
16
+ # used to endorse or promote products derived from this software without specific
17
+ # prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22
+ # IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
23
+ # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24
+ # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27
+ # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28
+ # OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ # *********************************************************************************
30
+
31
+ module URBANopt
32
+ module Scenario
33
+ # ScenarioBase is a simulation method agnostic description of a Scenario.
34
+ class ScenarioBase
35
+ ##
36
+ # Initialize ScenarioBase attributes: +name+ , +root directory+ , +run directory+ and +feature_file+
37
+ ##
38
+ # [parameters:]
39
+ # +name+ - _String_ - Human readable scenario name.
40
+ # +root_dir+ - _String_ - Root directory for the scenario, contains Gemfile describing dependencies.
41
+ # +run_dir+ - _String_ - Directory for simulation of this scenario, deleting run directory clears the scenario.
42
+ # +feature_file+ - _FeatureFile_ - An instance of +URBANopt::Core::FeatureFile+ containing features for simulation.
43
+ def initialize(name, root_dir, run_dir, feature_file)
44
+ @name = name
45
+ @root_dir = root_dir
46
+ @run_dir = run_dir
47
+ @feature_file = feature_file
48
+ end
49
+
50
+ ##
51
+ # Name of the Scenario.
52
+ attr_reader :name #:nodoc:
53
+
54
+ ##
55
+ # Root directory containing Gemfile.
56
+ attr_reader :root_dir #:nodoc:
57
+
58
+ ##
59
+ # Directory to run this Scenario.
60
+ attr_reader :run_dir #:nodoc:
61
+
62
+ ##
63
+ # An instance of +URBANopt::Core::FeatureFile+ associated with this Scenario.
64
+ attr_reader :feature_file #:nodoc:
65
+
66
+ # An array of SimulationDirBase objects.
67
+ def simulation_dirs
68
+ raise 'simulation_dirs not implemented for ScenarioBase, override in your class'
69
+ end
70
+
71
+ # Removes all simulation input and output files by removing this Scenario's +run_dir+ .
72
+ def clear
73
+ Dir.glob(File.join(@run_dir, '/*')).each do |f|
74
+ FileUtils.rm_rf(f)
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end