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