lib/openstudio/analysis/translator/excel.rb in openstudio-analysis-0.1.8 vs lib/openstudio/analysis/translator/excel.rb in openstudio-analysis-0.1.9
- old
+ new
@@ -48,10 +48,14 @@
@template_json = nil
end
def process
@setup = parse_setup()
+
+ @version = Semantic::Version.new @version
+ raise "Spreadsheet version #{@version} is no longer supported. Please upgrade your spreadsheet to at least 0.1.9" if @version < '0.1.9'
+
@variables = parse_variables()
# call validate to make sure everything that is needed exists (i.e. directories)
validate_analysis()
end
@@ -61,13 +65,10 @@
FileUtils.rm_f(filename) if File.exists?(filename)
File.open(filename, 'w') { |f| f << JSON.pretty_generate(@variables) }
end
def validate_analysis
- version_test = Semantic::Version.new @version
- raise "Spreadsheet version #{@version} is no longer supported. Please upgrade your spreadsheet to at least 0.1.9" if version_test < '0.1.9'
-
# Setup the paths and do some error checking
raise "Measures directory '#{@measure_path}' does not exist" unless Dir.exists?(@measure_path)
@models.uniq!
raise "No seed models defined in spreadsheet" if @models.empty?
@@ -100,28 +101,35 @@
variable_names << variable['display_name']
if variable['method'] == 'static'
# add this as an argument
# check something
elsif variable['method'] == 'lhs'
- if variable['type'] == 'enum'
+ if variable['type'] == 'enum' || variable['type'] == 'Choice'
# check something
else # must be an integer or double
- if variable['distribution']['min'].nil? || variable['distribution']['min'] == ""
- raise "Variable #{measure['name']}:#{variable['name']} must have a minimum"
+ if variable['distribution']['type'] == 'discrete_uncertain'
+ if variable['distribution']['discrete_values'].nil? || variable['distribution']['discrete_values'] == ""
+ raise "Variable #{measure['name']}:#{variable['name']} needs discrete values"
+ end
+ else
+ if variable['distribution']['min'].nil? || variable['distribution']['min'] == ""
+ raise "Variable #{measure['name']}:#{variable['name']} must have a minimum"
+ end
+ if variable['distribution']['max'].nil? || variable['distribution']['max'] == ""
+ raise "Variable #{measure['name']}:#{variable['name']} must have a maximum"
+ end
+ if variable['distribution']['mean'].nil? || variable['distribution']['mean'] == ""
+ raise "Variable #{measure['name']}:#{variable['name']} must have a mean"
+ end
+ if variable['distribution']['stddev'].nil? || variable['distribution']['stddev'] == ""
+ raise "Variable #{measure['name']}:#{variable['name']} must have a stddev"
+ end
+ if variable['distribution']['min'] > variable['distribution']['max']
+ raise "Variable min is greater than variable max for #{measure['name']}:#{variable['name']}"
+ end
end
- if variable['distribution']['max'].nil? || variable['distribution']['max'] == ""
- raise "Variable #{measure['name']}:#{variable['name']} must have a maximum"
- end
- if variable['distribution']['mean'].nil? || variable['distribution']['mean'] == ""
- raise "Variable #{measure['name']}:#{variable['name']} must have a mean"
- end
- if variable['distribution']['stddev'].nil? || variable['distribution']['stddev'] == ""
- raise "Variable #{measure['name']}:#{variable['name']} must have a stddev"
- end
- if variable['distribution']['min'] > variable['distribution']['max']
- raise "Variable min is greater than variable max for #{measure['name']}:#{variable['name']}"
- end
+
end
elsif variable['method'] == 'pivot'
# check something
end
end
@@ -140,17 +148,17 @@
def create_analysis_hash
# save the format in the OpenStudio analysis json format template without
# the correct weather files or models
@template_json = translate_to_analysis_json_template()
-
+
@template_json
end
-
+
def save_analysis
@template_json = create_analysis_hash
-
+
#validate_template_json
# iterate over each model and save the zip and json
@models.each do |model|
save_analysis_zip(model)
@@ -171,16 +179,15 @@
argument_template = ERB.new(File.open("#{template_root}/argument.json.erb", 'r').read)
# Templated analysis json file (this is what is returned)
puts "Analysis name is #{@name}"
openstudio_analysis_json = JSON.parse(analysis_template.result(get_binding))
-
+
openstudio_analysis_json['analysis']['problem'].merge!(@problem)
openstudio_analysis_json['analysis']['problem']['algorithm'].merge!(@algorithm)
-
-
+
@measure_index = -1
@variables['data'].each do |measure|
# With OpenStudio server we need to create the workflow with all the measure instances
if measure['enabled'] && measure['name'] != 'baseline'
@measure_index += 1
@@ -229,13 +236,36 @@
vr = nil
if @variable['method'] == 'static'
# add this as an argument
vr = JSON.parse(static_variable_template.result(get_binding))
elsif @variable['method'] == 'lhs'
- if @variable['type'] == 'enum'
+ if @variable['type'] == 'enum' || @variable['type'].downcase == 'choice'
@values_and_weights = @variable['distribution']['enumerations'].map { |v| {value: v} }.to_json
- vr =JSON.parse(discrete_uncertain_variable_template.result(get_binding))
+ vr = JSON.parse(discrete_uncertain_variable_template.result(get_binding))
+ elsif @variable['distribution']['type'] == 'discrete_uncertain'
+ puts @variable.inspect
+ weights = nil
+ if @variable['distribution']['discrete_weights'] && @variable['distribution']['discrete_weights'] != ''
+ weights = eval(@variable['distribution']['discrete_weights'])
+ end
+
+ values = nil
+ if variable['type'].downcase == 'bool'
+ values = eval(@variable['distribution']['discrete_values'])
+ values.map!{|v| v.downcase == 'true'}
+ else
+ values = eval(@variable['distribution']['discrete_values'])
+ end
+
+ if weights
+ raise "Discrete variable #{@variable['name']} does not have equal length of values and weights" if values.size != weights.size
+ @values_and_weights = values.zip( weights ).map { |v,w| {value: v, weight: w} }.to_json
+ else
+ @values_and_weights = values.map { |v| {value: v} }.to_json
+ end
+
+ vr = JSON.parse(discrete_uncertain_variable_template.result(get_binding))
else
vr = JSON.parse(uncertain_variable_template.result(get_binding))
end
elsif @variable['method'] == 'pivot'
@values_and_weights = @variable['distribution']['enumerations'].map { |v| {value: v} }.to_json
@@ -273,11 +303,11 @@
end
Dir.glob("#{@measure_path}/**/*.rb").each do |measure|
next if measure.include?("spec") # don't include the spec folders nor files
measure_name = measure.split(File::SEPARATOR).last(2).first
- #puts " Adding ./measures/#{measure_name}/#{File.basename(measure)}"
+ #puts " Adding ./measures/#{measure_name}/#{File.basename(measure)}"
zipfile.add("./measures/#{measure_name}/#{File.basename(measure)}", measure)
end
#puts "Adding #{model[:path]}"
zipfile.add("./seed/#{File.basename(model[:path])}", model[:path])
@@ -391,26 +421,30 @@
next if row[0].nil?
if b_settings
@version = row[1].chomp if row[0] == "Spreadsheet Version"
@settings["#{row[0].snake_case}"] = row[1] if row[0]
+
+ # type some of the values that we know
+ @settings["proxy_port"] = @settings["proxy_port"].to_i if @settings["proxy_port"]
+
elsif b_run_setup
@name = row[1].chomp if row[0] == "Analysis Name"
@machine_name = @name.snake_case
@export_path = File.expand_path(File.join(@root_path, row[1])) if row[0] == "Export Directory"
@measure_path = File.expand_path(File.join(@root_path, row[1])) if row[0] == "Measure Directory"
elsif b_problem_setup
- if row[0]
+ if row[0]
v = row[1]
v.to_i if v % 1 == 0
@problem["#{row[0].snake_case}"] = v
end
-
+
elsif b_algorithm_setup
if row[0]
v = row[1]
- v = v.to_i if v % 1 == 0
+ v = v.to_i if v % 1 == 0
@algorithm["#{row[0].snake_case}"] = v
end
elsif b_weather_files
if row[0] == "Weather File"
@weather_files += Dir.glob(File.expand_path(File.join(@root_path, row[1])))
@@ -462,32 +496,45 @@
var['type'] = row[5]
var['units'] = row[6]
var['distribution'] = {}
- #parse the enums
- if var['type'] == 'enum'
+ #parse the choices/enums
+ if var['type'] == 'enum' || var['type'] == 'Choice' # this is now a choice
var['distribution']['enumerations'] = row[8].gsub("|", "").split(",").map { |v| v.strip }
- elsif var['type'] == 'bool' #TODO: i think this has been deprecated
+ elsif var['type'] == 'bool'
var['distribution']['enumerations'] = []
- var['distribution']['enumerations'] << 'true'
+ var['distribution']['enumerations'] << 'true' #todo: should this be a real bool?
var['distribution']['enumerations'] << 'false'
end
if var['method'] == 'lhs'
var['distribution']['min'] = row[9]
var['distribution']['max'] = row[10]
var['distribution']['mean'] = row[11]
var['distribution']['stddev'] = row[12]
- var['distribution']['type'] = row[13]
- var['distribution']['source'] = row[14]
+
+ if @version >= "0.1.10"
+ var['distribution']['discrete_values'] = row[13]
+ var['distribution']['discrete_weights'] = row[14]
+ var['distribution']['type'] = row[15]
+ else
+ var['distribution']['type'] = row[13]
+ end
elsif var['method'] == 'static'
var['distribution']['static_value'] = row[7]
- var['distribution']['source'] = row[14]
end
- var['notes'] = row[15]
- var['relation_to_eui'] = row[16]
+ if @version >= "0.1.10"
+ # new columns for discrete variables
+ var['distribution']['source'] = row[16]
+ var['notes'] = row[17]
+ var['relation_to_eui'] = row[18]
+ else
+ var['distribution']['source'] = row[14]
+ var['notes'] = row[15]
+ var['relation_to_eui'] = row[16]
+ end
data['data'][measure_index]['variables'] << var
end
else
measure_index += 1