Skip to content

Commit

Permalink
Merge pull request #192 from lbl-srg/issue183_logParInp
Browse files Browse the repository at this point in the history
Closes #183.
  • Loading branch information
dhblum authored Jul 31, 2019
2 parents ed00247 + 17acc60 commit a3b4ce5
Show file tree
Hide file tree
Showing 17 changed files with 2,418 additions and 11 deletions.
1 change: 1 addition & 0 deletions mpcpy/exodata.py
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,7 @@ def _process_weather_data(self):
self.measurements[key] = {};
self.measurements[key]['Sample'] = variables.Static(key+'_Sample', 3600, units.s);
# Simulate the fmu
self._save_parameter_input_data = False
self._simulate_fmu();
# Add process var data
for key in self.process_variables:
Expand Down
19 changes: 16 additions & 3 deletions mpcpy/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,18 @@ class Modelica(_Model, utility._FMU, utility._Building):
Name of timezone according to the package ``tzwhere``. If
``'from_geography'``, then geography kwarg is required.
geography : list or tuple, optional
List or tuple with (latitude, longitude) in degrees.
List or tuple with (latitude, longitude) in degrees.
save_parameter_input_data: boolean
True to output the parameter and input data set for simulations and optimizations
Saved files are:
"mpcpy_simulation_parameters_model.csv"
"mpcpy_simulation_inputs_model.csv"
"mpcpy_simulation_parameters_optimization_initial.csv"
"mpcpy_simulation_inputs_optimization_initial.csv"
"mpcpy_optimization_parameters.csv"
"mpcpy_optimization_inputs.csv"
Times will be in UTC.
Default is False.
Attributes
----------
Expand All @@ -172,7 +183,7 @@ class Modelica(_Model, utility._FMU, utility._Building):
'''

def __init__(self, estimate_method, validate_method, measurements, **kwargs):
def __init__(self, estimate_method, validate_method, measurements, save_parameter_input_data=False, **kwargs):
'''Constructor of a modelica or FMU model object.
'''
Expand All @@ -183,6 +194,8 @@ def __init__(self, estimate_method, validate_method, measurements, **kwargs):
self.input_names = self._get_input_names();
self._parse_building_kwargs(kwargs);
self._parse_time_zone_kwargs(kwargs);
self._save_parameter_input_data = save_parameter_input_data
self._save_parameter_input_filename = 'model'
# Check estimation method compatible with model
if estimate_method is JModelica:
if self.mopath is None:
Expand Down Expand Up @@ -371,7 +384,7 @@ def validate(self, start_time, final_time, validate_filename, plot = 1):
# Perform validation
self._validate_method._validate(self, validate_filename, plot = plot);

def simulate(self, start_time, final_time):
def simulate(self, start_time, final_time, ):
'''Simulate the model with current parameter estimates and any exodata
inputs.
Expand Down
23 changes: 22 additions & 1 deletion mpcpy/optimization.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
from pyjmi import transfer_optimization_problem;
from pyjmi.optimization.casadi_collocation import ExternalData
import copy
import os

#%% Optimization Class
class Optimization(utility._mpcpyPandas, utility._Measurements):
Expand Down Expand Up @@ -936,6 +937,8 @@ def _simulate_initial(self, Optimization):
self.elapsed_seconds = Optimization.elapsed_seconds;
self.total_elapsed_seconds = Optimization.total_elapsed_seconds;
# Simulate fmu
self._save_parameter_input_data = self.Model._save_parameter_input_data
self._save_parameter_input_filename = 'optimization_initial'
self._simulate_fmu();
# Store initial simulation
self.res_init = self._res;
Expand All @@ -949,6 +952,9 @@ def _solve(self, Optimization):
self._create_input_mpcpy_ts_list_opt();
# Set inputs
self._create_input_object_from_input_mpcpy_ts_list(self._input_mpcpy_ts_list_opt);
# Save inputs if wanted
if self.Model._save_parameter_input_data:
self._input_df.to_csv('mpcpy_optimization_inputs.csv')
# Create ExternalData structure
self._create_external_data(Optimization);
# Set optimization options
Expand All @@ -959,8 +965,23 @@ def _solve(self, Optimization):
self.opt_options['n_e'] = self._sim_opts['ncp'];
# Set parameters if they exist
if hasattr(self, 'parameter_data'):
# Remove parameter data file if exists
if self.Model._save_parameter_input_data:
file_name = 'mpcpy_optimization_parameters.csv'
if os.path.exists(file_name):
os.remove(file_name)
for key in self.parameter_data.keys():
self.opt_problem.set(key, self.parameter_data[key]['Value'].get_base_data());
value = self.parameter_data[key]['Value'].get_base_data()
self.opt_problem.set(key, value);
# Save parameters to file if wanted
if self.Model._save_parameter_input_data:
if os.path.exists(file_name):
with open(file_name, 'a') as f:
f.write('{0},{1}\n'.format(key,value))
else:
with open(file_name, 'w') as f:
f.write('parameter,value\n')
f.write('{0},{1}\n'.format(key,value))
# Set start and final time
start_time = self.total_elapsed_seconds - self.elapsed_seconds;
final_time = self.total_elapsed_seconds;
Expand Down
11 changes: 10 additions & 1 deletion mpcpy/systems.py
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,13 @@ class EmulationFromFMU(_Emulation, utility._FMU):
``'from_geography'``, then geography kwarg is required.
geography : list or tuple, optional
List or tuple with (latitude, longitude) in degrees.
save_parameter_input_data: boolean
True to output the parameter and input data set for simulations and optimizations.
Saved files are:
"mpcpy_simulation_parameters_system.csv"
"mpcpy_simulation_inputs_system.csv"
Times will be in UTC.
Default is False.
Attributes
----------
Expand All @@ -203,7 +210,7 @@ class EmulationFromFMU(_Emulation, utility._FMU):
'''

def __init__(self, measurements, **kwargs):
def __init__(self, measurements, save_parameter_input_data=False, **kwargs):
'''Constructor of a system fmu simulation source.
'''
Expand All @@ -214,6 +221,8 @@ def __init__(self, measurements, **kwargs):
self.input_names = self._get_input_names();
self._parse_building_kwargs(kwargs);
self._parse_time_zone_kwargs(kwargs);
self._save_parameter_input_data = save_parameter_input_data
self._save_parameter_input_filename = 'system'

def _simulate(self):
'''Simulate the fmu.
Expand Down
22 changes: 20 additions & 2 deletions mpcpy/utility.py
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ class _FMU(_mpcpyPandas):

def _simulate_fmu(self):
'''Simulate an fmu with pyfmi and using any given exodata inputs.
Yields
------
measurements[key]['Simulated'] : variables.Timeseries
Expand All @@ -276,6 +276,9 @@ def _simulate_fmu(self):
self._create_input_mpcpy_ts_list_sim();
# Set inputs
self._create_input_object_from_input_mpcpy_ts_list(self._input_mpcpy_ts_list);
# Save inputs if wanted
if self._save_parameter_input_data:
self._input_df.to_csv('mpcpy_simulation_inputs_{0}.csv'.format(self._save_parameter_input_filename))
# Get simulation options
self._sim_opts = self.fmu.simulate_options();
# Set simulation fmu with start
Expand All @@ -290,8 +293,23 @@ def _simulate_fmu(self):
final_time = self.total_elapsed_seconds;
# Set parameters in fmu if they exist
if hasattr(self, 'parameter_data'):
# Remove parameter data file if exists
if self._save_parameter_input_data:
file_name = 'mpcpy_simulation_parameters_{0}.csv'.format(self._save_parameter_input_filename)
if os.path.exists(file_name):
os.remove(file_name)
for key in self.parameter_data.keys():
self.fmu.set(key, self.parameter_data[key]['Value'].get_base_data());
value = self.parameter_data[key]['Value'].get_base_data()
self.fmu.set(key, value);
# Save parameters to file if wanted
if self._save_parameter_input_data:
if os.path.exists(file_name):
with open(file_name, 'a') as f:
f.write('{0},{1}\n'.format(key,value))
else:
with open(file_name, 'w') as f:
f.write('parameter,value\n')
f.write('{0},{1}\n'.format(key,value))
# Get minimum measurement sample rate for simulation
min_sample = 3600;
for key in self.measurements.keys():
Expand Down
Loading

0 comments on commit a3b4ce5

Please sign in to comment.