Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Version 1.0.0 #277

Merged
merged 32 commits into from
Jan 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
0d09e94
Use new version of reporting-gem (#271)
vtnate May 6, 2024
d81320a
Use new version of reporting-gem (#271) (#272) (#273)
vtnate May 6, 2024
2e8d016
bump to v0.13.0
vtnate Jul 16, 2024
d6c66e8
use ruby 3.2 and bump dependency versions
vtnate Jul 16, 2024
4b78bd0
use os38 branches of uo gems
vtnate Jul 16, 2024
301a861
use OS3.8 in CI
vtnate Jul 16, 2024
ba9296d
use local logger instead of reporting-gem one
vtnate Jul 16, 2024
c62e01b
fix typos
vtnate Jul 16, 2024
7c30482
clarify ruby version, remove duplicate dependencies
vtnate Jul 18, 2024
392a24f
remove outdated comment
vtnate Jul 18, 2024
049a568
use branches and new gems in test gemfile
vtnate Jul 18, 2024
18fafda
WIP: adapting to new extension-gem runner config, and debug printing
vtnate Jul 18, 2024
ae626f3
Fixup openstudio-extension-gem sub bundle errors (#275)
jmarrec Jul 19, 2024
c23041b
clean up path syntax in spec file
vtnate Jul 19, 2024
f74664e
use sqlite 2.0
vtnate Jul 25, 2024
c165d7d
use exactly ruby 3.2.2 in the test gemfile
vtnate Jul 25, 2024
d59394e
use os39 rc3 image in CI
vtnate Nov 13, 2024
99fe030
use os39 branches for testing
vtnate Nov 13, 2024
e6f8736
changes from running `update_measures` rake task
vtnate Nov 13, 2024
c606376
run CI on every push
vtnate Nov 13, 2024
3306621
use released os-gems in spec gemfile
vtnate Nov 19, 2024
bad1b66
use real OS3.9 docker image in CI
vtnate Jan 23, 2025
308f21d
use released gems
vtnate Jan 23, 2025
cfdb7f8
bump to version 1.0.0
vtnate Jan 23, 2025
0e7ac4f
update changelog
vtnate Jan 23, 2025
0f77180
update copyright dates to include 2025
vtnate Jan 23, 2025
b6ee452
inconsequential change to force CI to run
vtnate Jan 23, 2025
44758cd
use released gems in CI
vtnate Jan 23, 2025
a21da83
Revert "use released gems in CI"
vtnate Jan 23, 2025
4781986
update branches in test gemfile
vtnate Jan 23, 2025
722d4d8
Merge pull request #276 from urbanopt/os39
kflemin Jan 23, 2025
290e39a
Merge branch 'master' into develop
vtnate Jan 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 6 additions & 8 deletions .github/workflows/nightly_ci_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,28 @@ name: Scenario-gem CI

on:
workflow_dispatch:
# push:
push:
schedule:
# https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule
# 5 am UTC (11pm MDT the day before) every weekday night in MDT
- cron: '21 5 * * 2-6'
pull_request:
types: [review_requested]

env:
# This env var should enforce develop branch of all dependencies
# This env var will enforce develop branch of all dependencies
FAVOR_LOCAL_GEMS: true
GEM_DEVELOPER_KEY: ${{ secrets.GEM_DEVELOPER_KEY }}

jobs:
weeknight-tests:
# ubuntu-latest works since https://github.com/rbenv/ruby-build/releases/tag/v20220710 (July 10, 2022)
# https://github.com/rbenv/ruby-build/discussions/1940
runs-on: ubuntu-latest
container:
image: docker://nrel/openstudio:3.7.0
image: docker://nrel/openstudio:3.9.0
steps:
- uses: actions/checkout@v4
- name: Update gems
run: bundle update
run: |
bundle install
bundle update
- name: Run Rspec
run: bundle exec rspec
- name: Coveralls
Expand Down
15 changes: 14 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# URBANopt Scenario Gem

## Version 1.0.0

Date Range: 05/06/24 - 01/23/25

* Upgrade to OpenStudio 3.9 and Ruby 3.2.2 by @vtnate in https://github.com/urbanopt/urbanopt-scenario-gem/pull/276
* Fixup openstudio-extension-gem sub bundle errors by @jmarrec in https://github.com/urbanopt/urbanopt-scenario-gem/pull/275

### New Contributors

* @jmarrec made their first contribution in https://github.com/urbanopt/urbanopt-scenario-gem/pull/275

**Full Changelog**: https://github.com/urbanopt/urbanopt-scenario-gem/compare/v0.12.0...v1.0.0

## Version 0.12.0
Date Range: 01/10/24 - 05/06/24
* Use new version of reporting-gem by @vtnate in https://github.com/urbanopt/urbanopt-scenario-gem/pull/271
Expand Down Expand Up @@ -194,7 +207,7 @@ Date Range: 01/15/20 - 03/30/20:
- Fixed [#83]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/83 ), add multiple pV
- Fixed [#88]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/88 ), add units to CSV reports
- Fixed [#89]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/89 ), created Save feature report method
- Fixed [#91]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/91 ), add total_costruction_cost to reports
- Fixed [#91]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/91 ), add total_construction_cost to reports
- Fixed [#95]( https://github.com/urbanopt/urbanopt-scenario-gem/issues/95 ), list datapoint failures
- Fixed [#98]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/98 ), add power, net power, net energy and apparent power to timeseries results
- Fixed [#101]( https://github.com/urbanopt/urbanopt-scenario-gem/pull/101 ), fix for unit conversion when timeseries doe not exist
Expand Down
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ allow_local = ENV['FAVOR_LOCAL_GEMS']
# if allow_local && File.exist?('../urbanopt-core-gem')
# gem 'urbanopt-core', path: '../urbanopt-core-gem'
# elsif allow_local
# gem 'urbanopt-core', github: 'URBANopt/urbanopt-core-gem', branch: 'os37'
# gem 'urbanopt-core', github: 'URBANopt/urbanopt-core-gem', branch: 'os39'
# end

# if allow_local && File.exist?('../openstudio-common-measures-gem')
Expand Down
2 changes: 1 addition & 1 deletion LICENSE.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
URBANopt (tm), Copyright (c) 2019-2024, Alliance for Sustainable Energy, LLC, and other
URBANopt (tm), Copyright (c) 2019-2025, Alliance for Sustainable Energy, LLC, and other
contributors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
Expand Down
2 changes: 1 addition & 1 deletion doc_templates/LICENSE.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
URBANopt (tm), Copyright (c) 2019-2024, Alliance for Sustainable Energy, LLC, and other
URBANopt (tm), Copyright (c) 2019-2025, Alliance for Sustainable Energy, LLC, and other
contributors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
Expand Down
2 changes: 1 addition & 1 deletion doc_templates/copyright_erb.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<%
# *********************************************************************************
# URBANopt (tm), Copyright (c) 2019-2024, Alliance for Sustainable Energy, LLC, and other
# URBANopt (tm), Copyright (c) 2019-2025, Alliance for Sustainable Energy, LLC, and other
# contributors. All rights reserved.

# Redistribution and use in source and binary forms, with or without modification,
Expand Down
2 changes: 1 addition & 1 deletion lib/urbanopt/scenario/logger.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ module URBANopt
module Scenario
@@logger = Logger.new($stdout)

# Definining class variable "@@logger" to log errors, info and warning messages.
# Defining class variable "@@logger" to log errors, info and warning messages.
def self.logger
@@logger
end
Expand Down
22 changes: 16 additions & 6 deletions lib/urbanopt/scenario/scenario_csv.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,21 +48,31 @@ def initialize(name, root_dir, run_dir, feature_file, mapper_files_dir, csv_file
# Require all simulation mappers in mapper_files_dir
def load_mapper_files
# loads default values from extension gem
options = OpenStudio::Extension::RunnerConfig.default_config
@options = OpenStudio::Extension::RunnerConfig.default_config(@root_dir)
# check if runner.conf file exists
if File.exist?(File.join(@root_dir, OpenStudio::Extension::RunnerConfig::FILENAME))
runner_config = OpenStudio::Extension::RunnerConfig.new(@root_dir)
# use the default values overriden with runner.conf values
options = options.merge(runner_config.options)
# use the default values overridden with runner.conf values where not
# nil nor empty strings
@options = @options.merge(runner_config.options.reject{|k, v| v.nil? || (v.kind_of?(String) && v === '')})
end

# bundle path is assigned from the runner.conf if it exists or is assigned in the root_dir
bundle_path = !options.key?(:bundle_install_path) || options[:bundle_install_path] === '' ? File.join(@root_dir, '.bundle/install/') : options[:bundle_install_path]
# if bundle install path is not provided or is empty, it will be placed in root_dir/.bundle/install, otherwise use the provided path
if [email protected]?(:bundle_install_path) || @options[:bundle_install_path] === ''
@options[:bundle_install_path] = File.join(@root_dir, '.bundle/install/')
else
@options[:bundle_install_path]= Pathname.new(@options[:bundle_install_path]).cleanpath.to_s
end
bundle_path = @options[:bundle_install_path]

puts "Bundle final path is set to: #{bundle_path}"

# checks if bundle path doesn't exist or is empty
if !Dir.exist?(bundle_path) || Dir.empty?(bundle_path)
# install bundle
OpenStudio::Extension::Runner.new(@root_dir)
Bundler.with_unbundled_env do
OpenStudio::Extension::Runner.new(@root_dir, [], @options)
end
end

# find all lib dirs in the bundle path and add them to the path
Expand Down
2 changes: 1 addition & 1 deletion lib/urbanopt/scenario/scenario_datapoint_base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ def create_osw
# rubocop: enable Style/EvalWithLocation #:nodoc:

##
# Return true if the datapoint is out of date, false otherwise. Non-existant files are out of date.
# Return true if the datapoint is out of date, false otherwise. Non-existent files are out of date.
##
# [return:] _Boolean_ - True if the datapoint is out of date, false otherwise.
def out_of_date?
Expand Down
6 changes: 3 additions & 3 deletions lib/urbanopt/scenario/scenario_runner_osw.rb
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,11 @@ def create_simulation_files(scenario, force_clear = false)

##
# Create and run all SimulationFileOSW for Scenario.
# A staged runner is implented to run buildings, then transformers then district systems.
# A staged runner is implemented to run buildings, then transformers then district systems.
# - instantiate openstudio runner to run .osw files.
# - create simulation files for this scenario.
# - get feature_type value from in.osw files
# - cretae 3 groups to store .osw files (+building_osws+ , +transformer_osws+ , +district_system_osws+)
# - create 3 groups to store .osw files (+building_osws+ , +transformer_osws+ , +district_system_osws+)
# - add each osw file to its corresponding group id +simulation_dir+ is out_of_date
# - Run osw file groups in order and store simulation failure in a array.
##
Expand Down Expand Up @@ -78,7 +78,7 @@ def run(scenario, force_clear = false, options = {})
# end
# end

# cretae 3 groups to store .osw files (+building_osws+ , +transformer_osws+ , +district_system_osws+)
# create 3 groups to store .osw files (+building_osws+ , +transformer_osws+ , +district_system_osws+)
building_osws = []
transformer_osws = []
district_system_osws = []
Expand Down
2 changes: 1 addition & 1 deletion lib/urbanopt/scenario/simulation_dir_base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def run_dir

##
# Return true if the simulation is out of date (input files newer than results), false otherwise.
# Non-existant simulation input files are out of date.
# Non-existent simulation input files are out of date.
##
def out_of_date?
raise 'out_of_date? is not implemented for SimulationFileBase, override in your class'
Expand Down
2 changes: 1 addition & 1 deletion lib/urbanopt/scenario/simulation_dir_osw.rb
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ def out_osw

##
# Return true if the simulation is out of date (input files newer than results), false otherwise.
# Non-existant simulation input files are out of date.
# Non-existent simulation input files are out of date.
##
def out_of_date?
if !File.exist?(run_dir)
Expand Down
2 changes: 1 addition & 1 deletion lib/urbanopt/scenario/version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@

module URBANopt
module Scenario
VERSION = '0.12.0'.freeze
VERSION = '1.0.0'.freeze
end
end
23 changes: 9 additions & 14 deletions spec/files/Gemfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
source 'http://rubygems.org'

ruby '~> 2.7.0'
ruby '3.2.2'

# Local gems are useful when developing and integrating the various dependencies.
# To favor the use of local gems, set the following environment variable:
Expand All @@ -26,57 +26,52 @@ allow_local = ENV['FAVOR_LOCAL_GEMS']
# end
#

# pin this dependency to avoid unicode_normalize error
gem 'addressable', '2.8.1'
# pin this dependency to avoid using racc dependency (which has native extensions)
gem 'parser', '3.2.2.2'

if allow_local && File.exist?('../openstudio-common-measures-gem')
gem 'openstudio-common-measures', path: '../openstudio-common-measures-gem'
elsif allow_local
gem 'openstudio-common-measures', github: 'NREL/openstudio-common-measures-gem', branch: 'develop'
else
gem 'openstudio-common-measures', '~> 0.8.0'
gem 'openstudio-common-measures', '~> 0.11.0'
end

if allow_local && File.exist?('../openstudio-model-articulation-gem')
gem 'openstudio-model-articulation', path: '../openstudio-model-articulation-gem'
elsif allow_local
gem 'openstudio-model-articulation', github: 'NREL/openstudio-model-articulation-gem', branch: 'develop'
else
gem 'openstudio-model-articulation', '~> 0.8.0'
gem 'openstudio-model-articulation', '~> 0.11.0'
end

if allow_local && File.exist?('../openstudio-load-flexibility-measures-gem')
gem 'openstudio-load-flexibility-measures', path: '../openstudio-load-flexibility-measures-gem'
elsif allow_local
gem 'openstudio-load-flexibility-measures', github: 'NREL/openstudio-load-flexibility-measures-gem', branch: 'master'
gem 'openstudio-load-flexibility-measures', github: 'NREL/openstudio-load-flexibility-measures-gem', branch: 'develop'
else
gem 'openstudio-load-flexibility-measures', '~> 0.7.0'
gem 'openstudio-load-flexibility-measures', '~> 0.10.0'
end

if allow_local && File.exist?('../openstudio-ee-gem')
gem 'openstudio-ee', path: '../openstudio-ee-gem'
elsif allow_local
gem 'openstudio-ee', github: 'NREL/openstudio-ee-gem', branch: 'develop'
else
gem 'openstudio-ee', '~> 0.8.0'
gem 'openstudio-ee', '~> 0.11.0'
end

if allow_local && File.exist?('../openstudio-calibration-gem')
gem 'openstudio-calibration', path: '../openstudio-calibration-gem'
elsif allow_local
gem 'openstudio-calibration', github: 'NREL/openstudio-calibration-gem', branch: 'develop'
else
gem 'openstudio-calibration', '~> 0.8.0'
gem 'openstudio-calibration', '~> 0.11.0'
end

if allow_local && File.exist?('../urbanopt-geojson-gem')
gem 'urbanopt-geojson', path: '../urbanopt-geojson-gem'
elsif allow_local
gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'develop'
else
gem 'urbanopt-geojson', '~> 0.10.0'
gem 'urbanopt-geojson', '~> 1.0.0'
end

# NEVER put SCENARIO-GEM in this file...it will make all simulations fail due to the sqlite dependency
Expand All @@ -87,5 +82,5 @@ if allow_local && File.exist?('../urbanopt-reporting-gem')
elsif allow_local
gem 'urbanopt-reporting', github: 'URBANopt/urbanopt-reporting-gem', branch: 'develop'
else
gem 'urbanopt-reporting', '~> 0.8.0'
gem 'urbanopt-reporting', '~> 1.0.0'
end
50 changes: 27 additions & 23 deletions spec/urbanopt/urbanopt_scenario_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,13 @@
require_relative '../files/example_feature_file'
require 'json'
require 'json-schema'
require 'logger'

RSpec.describe URBANopt::Scenario do
@@logger ||= URBANopt::Reporting::DefaultReports.logger

let(:logger) { Logger.new($stdout) }

root_dir = (Pathname(__FILE__).dirname.parent / 'test').cleanpath

it 'has a version number' do
expect(URBANopt::Scenario::VERSION).not_to be nil
Expand All @@ -17,33 +22,32 @@
it 'has a logger' do
expect(URBANopt::Scenario.logger).not_to be nil
current_level = URBANopt::Scenario.logger.level
URBANopt::Scenario.logger.level = Logger::DEBUG
expect(URBANopt::Scenario.logger.level).to eq Logger::DEBUG
URBANopt::Scenario.logger.level = Logger::ERROR
expect(URBANopt::Scenario.logger.level).to eq Logger::ERROR
URBANopt::Scenario.logger.level = current_level
end

it 'can run a scenario' do
name = 'example_scenario'

# copy all files into test directory
root_dir = File.join(File.dirname(__FILE__), '../test')
Dir.mkdir(root_dir) unless File.exist?(root_dir)
run_dir = File.join(File.dirname(__FILE__), '../test/example_scenario/')
FileUtils.cp(File.join(File.dirname(__FILE__), '../files/example_feature_file.json'), File.join(File.dirname(__FILE__), '../test/example_feature_file.json'))
feature_file_path = File.join(File.dirname(__FILE__), '../test/example_feature_file.json')
FileUtils.cp_r(File.join(File.dirname(__FILE__), '../files/mappers'), File.join(File.dirname(__FILE__), '../test/mappers'), remove_destination: true)
FileUtils.cp_r(File.join(File.dirname(__FILE__), '../files/weather'), File.join(File.dirname(__FILE__), '../test/weather'), remove_destination: true)
mapper_files_dir = File.join(File.dirname(__FILE__), '../test/mappers/')
FileUtils.cp(File.join(File.dirname(__FILE__), '../files/example_scenario.csv'), File.join(File.dirname(__FILE__), '../test/example_scenario.csv'))
csv_file = File.join(File.dirname(__FILE__), '../test/example_scenario.csv')
run_dir = root_dir / 'example_scenario/'
FileUtils.cp(root_dir.parent / 'files' / 'example_feature_file.json', root_dir / 'example_feature_file.json')
feature_file_path = root_dir / 'example_feature_file.json'
FileUtils.cp_r(root_dir.parent / 'files' / 'mappers', root_dir.parent / 'test' / 'mappers', remove_destination: true)
FileUtils.cp_r(root_dir.parent / 'files' / 'weather', root_dir.parent / 'test' / 'weather', remove_destination: true)
mapper_files_dir = root_dir / 'mappers/'
FileUtils.cp(root_dir.parent / 'files' / 'example_scenario.csv', root_dir / 'example_scenario.csv')
csv_file = root_dir / 'example_scenario.csv'
num_header_rows = 1

FileUtils.cp(File.join(File.dirname(__FILE__), '../files/Gemfile'), File.join(File.dirname(__FILE__), '../test/Gemfile'))
FileUtils.cp(root_dir.parent / 'files' / 'Gemfile', root_dir / 'Gemfile')

# write a runner.conf in project dir
options = { gemfile_path: File.join(File.dirname(__FILE__), '../test/Gemfile'), bundle_install_path: File.join(File.dirname(__FILE__), '../test/.bundle/install') }
options = { gemfile_path: root_dir / 'Gemfile', bundle_install_path: root_dir / '.bundle' / 'install' }
File.open(File.join(root_dir, 'runner.conf'), 'w') do |f|
f.write(options.to_json)
f.write(JSON.pretty_generate(options))
end

feature_file = ExampleFeatureFile.new(feature_file_path)
Expand Down Expand Up @@ -92,7 +96,7 @@
expect(File.exist?(simulation_dirs[2].run_dir)).to be true

# pass Gemfile and bundle paths to extension gem runner, otherwise it will use this gem's and that doesn't work b/c of native gems
options = { gemfile_path: File.join(File.dirname(__FILE__), '../test/Gemfile'), bundle_install_path: File.join(File.dirname(__FILE__), '../test/.bundle/install'), skip_config: false }
options = { gemfile_path: root_dir / 'Gemfile', bundle_install_path: root_dir / '.bundle' / 'install', skip_config: false }
simulation_dirs = scenario_runner.run(scenario, false, options)
if clear_results
expect(simulation_dirs.size).to eq(3)
Expand Down Expand Up @@ -185,10 +189,10 @@
# Get scenario schema hash
schema = validator.schema

# Read scenario json file and validated againt schema
# Read scenario json file and validated against schema
scenario_json = JSON.parse(File.read(scenario_json_file))

@@logger.info("Schema Validation Errors: #{JSON::Validator.fully_validate(schema, scenario_json)}")
logger.info("Schema Validation Errors: #{JSON::Validator.fully_validate(schema, scenario_json)}")
expect(JSON::Validator.fully_validate(schema, scenario_json).empty?).to be true

# close json file
Expand All @@ -205,7 +209,7 @@
scenario_csv_schema_headers = validator.csv_headers
expect((scenario_csv_headers_with_no_units & scenario_csv_schema_headers)).to eq(scenario_csv_headers_with_no_units)

# Read feature_reprot json file and validate against schema
# Read feature_report json file and validate against schema
Dir["#{File.dirname(__FILE__)}/../**/*default_feature_reports.json"].each do |json_file|
feature_json = JSON.parse(File.read(json_file))
expect(JSON::Validator.fully_validate(schema[:definitions][:FeatureReport][:properties], feature_json).empty?).to be true
Expand All @@ -214,8 +218,8 @@

it 'can integrate opendss results' do
# generate opendss results for testing
opendss_results_source = File.join(File.dirname(__FILE__), '../files/opendss_outputs/')
opendss_results_destination = File.join(File.dirname(__FILE__), '../test/example_scenario')
opendss_results_source = root_dir.parent / 'files' / 'opendss_outputs/'
opendss_results_destination = root_dir / 'example_scenario'
FileUtils.copy_entry opendss_results_source, opendss_results_destination
# post_process opendss results
opendss_post_processor = URBANopt::Scenario::OpenDSSPostProcessor.new($scenario_result, 'opendss')
Expand All @@ -224,8 +228,8 @@

it 'can integrate disco results' do
# generate disco results for testing
disco_results_source = File.join(File.dirname(__FILE__), '../files/disco_outputs/')
disco_results_destination = File.join(File.dirname(__FILE__), '../test/example_scenario')
disco_results_source = root_dir.parent / 'files' / 'disco_outputs/'
disco_results_destination = root_dir / 'example_scenario'
FileUtils.copy_entry disco_results_source, disco_results_destination
# post_process disco results
disco_post_processor = URBANopt::Scenario::DISCOPostProcessor.new($scenario_result, 'disco')
Expand Down
Loading
Loading