Skip to content

Commit

Permalink
Updates for hybrids to Simulation::m_inputs
Browse files Browse the repository at this point in the history
  • Loading branch information
sjanzou committed Jul 12, 2023
1 parent bf219b1 commit dc02c8f
Show file tree
Hide file tree
Showing 10 changed files with 103 additions and 72 deletions.
2 changes: 1 addition & 1 deletion src/excelexch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -746,7 +746,7 @@ int ExcelExchange::RunExcelExchange( ExcelExchange &ex, VarTable &inputs, Simula
else
{
// override the variable value in the simulation object
sim->Override( ex.Vars[i].Name, vval );
sim->Override( ex.Vars[i].Name, vval, 0 ); // TODO: hybrids

// update ui input value per Paul 3/6/15
Case *c = sim->GetCase();
Expand Down
6 changes: 3 additions & 3 deletions src/invoke.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2155,7 +2155,7 @@ void fcall_ssc_module_create_from_case(lk::invoke_t &cxt)
int existing_type = ssc_data_query(p_data, ssc_info_name(p_inf));
if (existing_type != data_type)
{
if (VarValue *vv = sim.GetInput(name))
if (VarValue *vv = sim.GetInput(name, 0)) // TODO: hybrids
{
if (!field.IsEmpty())
{
Expand Down Expand Up @@ -5790,8 +5790,8 @@ static void fcall_reopt_size_battery(lk::invoke_t &cxt)
//
size_t length;
ssc_number_t* gen = base_case.GetOutput("gen")->Array(&length);
ssc_data_set_number(p_data, "lat", base_case.GetInput("lat")->Value());
ssc_data_set_number(p_data, "lon", base_case.GetInput("lon")->Value());
ssc_data_set_number(p_data, "lat", base_case.GetInput("lat", 0)->Value()); // TODO: hybrids
ssc_data_set_number(p_data, "lon", base_case.GetInput("lon", 0)->Value()); // TODO: hybrids
ssc_data_set_array(p_data, "gen", gen, length);

auto copy_vars_into_ssc_data = [&base_case, &p_data](std::vector<std::string>& captured_vec){
Expand Down
8 changes: 4 additions & 4 deletions src/p50p90.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -208,10 +208,10 @@ void P50P90Form::OnSimulate( wxCommandEvent & )
Simulation *sim = new Simulation( m_case, wxString::Format("Year %d", (int)years[n]) );
sims.push_back( sim );

sim->Override( "use_specific_weather_file", VarValue(true) );
sim->Override( "user_specified_weather_file", VarValue(weatherFile) );
sim->Override("use_specific_wf_wind", VarValue(true));
sim->Override("user_specified_wf_wind", VarValue(weatherFile));
sim->Override( "use_specific_weather_file", VarValue(true), 0 ); // TODO: hybrids
sim->Override( "user_specified_weather_file", VarValue(weatherFile), 0 );
sim->Override("use_specific_wf_wind", VarValue(true), 0);
sim->Override("user_specified_wf_wind", VarValue(weatherFile), 0);

if ( !sim->Prepare() )
wxMessageBox( wxString::Format("Internal error preparing simulation %d for P50/P90.", (int)(n+1)) );
Expand Down
24 changes: 12 additions & 12 deletions src/parametric.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -808,7 +808,7 @@ void ParametricViewer::OnMenuItem(wxCommandEvent &evt)
{
if (m_grid_data->GetRuns()[m_grid_data->GetRunNumberForRowNumber(m_selected_grid_row)])
{
new VariableGridFrame(this, &SamApp::Project(), m_case, m_grid_data->GetRuns()[m_grid_data->GetRunNumberForRowNumber(m_selected_grid_row)]->GetInputVarTable(), wxString::Format("Parametric run %d inputs", m_selected_grid_row + 1));
new VariableGridFrame(this, &SamApp::Project(), m_case, m_grid_data->GetRuns()[m_grid_data->GetRunNumberForRowNumber(m_selected_grid_row)]->GetInputVarTable(0), wxString::Format("Parametric run %d inputs", m_selected_grid_row + 1)); // TODO:hybrids
}
}
break;
Expand All @@ -822,7 +822,7 @@ void ParametricViewer::OnMenuItem(wxCommandEvent &evt)
if (Case* dup = dynamic_cast<Case*>(m_case->Duplicate()))
{
// update var table
auto pvtParametric = m_grid_data->GetRuns()[m_grid_data->GetRunNumberForRowNumber(m_selected_grid_row)]->GetInputVarTable();
auto pvtParametric = m_grid_data->GetRuns()[m_grid_data->GetRunNumberForRowNumber(m_selected_grid_row)]->GetInputVarTable(0); // TODO:hybrids
for (auto it = pvtParametric->begin(); it != pvtParametric->end(); ++it) {
if (auto pvv = dup->Values(0).Get(it->first)) {
if (pvv->Type() == it->second->Type())
Expand Down Expand Up @@ -1125,7 +1125,7 @@ void ParametricViewer::ImportData(wxArrayString& vals, int& row, int& col) {
pv.Name = name;
pv.IsInput = inputcol;
if (!m_grid_data->IsValid(pv)) {
wxString typeS = m_case->BaseCase().GetInput(pv.Name)->TypeAsString();
wxString typeS = m_case->BaseCase().GetInput(pv.Name, 0)->TypeAsString(); // TODO: hybrids
wxString typeS2 = pv.Values[0].TypeAsString();
wxString errorStr = "Import Error: Value type of " + vals[c*row] + " is {" + typeS2 + "}, should be {" + typeS + "}.";
// some variables listed as {array} but can be single-value number
Expand Down Expand Up @@ -2076,7 +2076,7 @@ wxString ParametricGridData::GetColLabelValue(int col)
}

bool ParametricGridData::IsValid(const ParametricData::Var& pv) {
VarValue* vv = m_par.GetCase()->BaseCase().GetInput(pv.Name);
VarValue* vv = m_par.GetCase()->BaseCase().GetInput(pv.Name,0); // TODO:hybrids
if (vv == nullptr) {
return false;
}
Expand All @@ -2092,7 +2092,7 @@ VarInfo* ParametricGridData::GetVarInfo(int , int col)
if ((col>-1) && (col < m_cols))
{
if (IsInput(col))
vi = m_par.GetCase()->Variables(0).Lookup(m_var_names[col]);
vi = m_par.GetCase()->Variables(0).Lookup(m_var_names[col]); // TODO: hybrids
}
return vi;
}
Expand Down Expand Up @@ -2519,9 +2519,9 @@ void ParametricGridData::DeleteSetup(ParametricData::Var &var)
// reset simulation input to base case input
for (int row = 0; row < m_rows; row++)
{
if (VarValue *vv = m_case->BaseCase().GetInput(var.Name))
if (VarValue *vv = m_case->BaseCase().GetInput(var.Name,0))// TODO: hybrids
{
m_par.Runs[row]->Override(var.Name, *vv);
m_par.Runs[row]->Override(var.Name, *vv,0);// TODO: hybrids
m_valid_run[row] = false;
}
}
Expand Down Expand Up @@ -2807,14 +2807,14 @@ bool ParametricGridData::RunSimulations_multi()
if (VarValue *vv = &m_par.Setup[col].Values[i])
{
// set for simulation
m_par.Runs[i]->Override(m_var_names[col], *vv);
m_par.Runs[i]->Override(m_var_names[col], *vv,0);// TODO: hybrids
}
}
}
// Excel exchange if necessary
ExcelExchange &ex = m_case->ExcelExch();
if (ex.Enabled)
ExcelExchange::RunExcelExchange(ex, m_case->Values(0), m_par.Runs[i]);
ExcelExchange::RunExcelExchange(ex, m_case->Values(0), m_par.Runs[i]);// TODO: hybrids

if (!m_par.Runs[i]->Prepare())
wxMessageBox(wxString::Format("internal error preparing simulation %d for parametric: %s", (int)(i + 1), m_par.Runs[i]->GetErrors()[0]));
Expand Down Expand Up @@ -2898,7 +2898,7 @@ bool ParametricGridData::RunSimulations_single()
if (VarValue *vv = &m_par.Setup[col].Values[i])
{
// set for simulation
m_par.Runs[i]->Override(m_var_names[col], *vv);
m_par.Runs[i]->Override(m_var_names[col], *vv, 0);// TODO: hybrids
}
}
}
Expand Down Expand Up @@ -2969,14 +2969,14 @@ bool ParametricGridData::Generate_lk()
if (VarValue *vv = &m_par.Setup[col].Values[i])
{
// set for simulation
m_par.Runs[i]->Override(m_var_names[col], *vv);
m_par.Runs[i]->Override(m_var_names[col], *vv,0);// TODO: hybrids
}
}
}
// Excel exchange if necessary
ExcelExchange &ex = m_case->ExcelExch();
if (ex.Enabled)
ExcelExchange::RunExcelExchange(ex, m_case->Values(0), m_par.Runs[i]);
ExcelExchange::RunExcelExchange(ex, m_case->Values(0), m_par.Runs[i]);// TODO: hybrids

wxString file = fld + wxString::Format("/run%d.lk", (int)(i+1));
if (FILE *fp = fopen(file.c_str(), "w"))
Expand Down
8 changes: 4 additions & 4 deletions src/pvuncertainty.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -359,10 +359,10 @@ void PVUncertaintyForm::OnSimulate( wxCommandEvent & )
Simulation *sim = new Simulation( m_case, wxString::Format("Year %d", (int)years[n]) );
sims.push_back( sim );

sim->Override( "use_specific_weather_file", VarValue(true) );
sim->Override( "user_specified_weather_file", VarValue(weatherFile) );
sim->Override("use_specific_wf_wind", VarValue(true));
sim->Override("user_specified_wf_wind", VarValue(weatherFile));
sim->Override( "use_specific_weather_file", VarValue(true), 0 ); // TODO: hybrids
sim->Override( "user_specified_weather_file", VarValue(weatherFile), 0 ); // TODO: hybrids
sim->Override("use_specific_wf_wind", VarValue(true), 0);// TODO: hybrids
sim->Override("user_specified_wf_wind", VarValue(weatherFile), 0); // TODO: hybrids

if ( !sim->Prepare() )
wxMessageBox( wxString::Format("Internal error preparing simulation %d for Uncertainty Simulations.", (int)(n+1)) );
Expand Down
2 changes: 1 addition & 1 deletion src/script.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,7 @@ static void fcall_parsim( lk::invoke_t &cxt )
cxt.error("error translating value for '" + name + wxString::Format("' in run [%d]", (int)i ) );
return;
}
sim->Override( name, value );
sim->Override( name, value, 0 ); // TODO: hybrids
}

if ( !sim->Prepare() )
Expand Down
89 changes: 60 additions & 29 deletions src/simulation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,13 +108,15 @@ void Simulation::Write( wxOutputStream &os )
{
wxDataOutputStream out( os );
out.Write8( 0x9c );
out.Write8( 3 ); // version
out.Write8( 4 ); // version - update to 4 for hybrids

out.WriteString( m_name );

write_array_string( out, m_overrides );

m_inputs.Write( os );
out.Write8(m_inputs.size());
for (size_t i=0; i < m_inputs.size(); i++)
m_inputs[i].Write(os);
m_outputs.Write( os, SamApp::Project().GetSaveHourlyData() ? 0 : 1024 );

write_array_string( out, m_errors );
Expand All @@ -128,19 +130,28 @@ void Simulation::Write( wxOutputStream &os )
out.Write8( 0x9c );
}

bool Simulation::Read( wxInputStream &is )
bool Simulation::Read(wxInputStream& is)
{
Clear();
wxDataInputStream in( is );
wxDataInputStream in(is);

wxUint8 code = in.Read8(); // code
wxUint8 ver = in.Read8(); // ver

m_name = in.ReadString();

read_array_string( in, m_overrides );
read_array_string(in, m_overrides);

m_inputs.Read( is );
if (ver > 3) {
size_t n = in.Read8();
m_inputs.resize(n);
for (size_t i = 0; i < m_inputs.size(); i++)
m_inputs[i].Read(is);
}
else {
m_inputs.resize(1);
m_inputs[0].Read(is);
}
m_outputs.Read(is);

read_array_string( in, m_errors );
Expand Down Expand Up @@ -185,27 +196,27 @@ void Simulation::Clear()
m_uiHints.clear();
}

void Simulation::Override( const wxString &name, const VarValue &val )
void Simulation::Override( const wxString &name, const VarValue &val, size_t ndxHybrid)
{
if ( VarValue *vv = m_inputs.Create( name, val.Type() ) )
if ( VarValue *vv = m_inputs[ndxHybrid].Create(name, val.Type()))
{
m_overrides.Add( name );
vv->Copy( val );
}
}


wxString Simulation::GetOverridesLabel( bool with_labels )
wxString Simulation::GetOverridesLabel(size_t ndxHybrid, bool with_labels )
{
wxString tag;
for( size_t i=0;i<m_overrides.size();i++ )
{
if ( VarValue *vv = m_inputs.Get( m_overrides[i] ) )
if ( VarValue *vv = m_inputs[ndxHybrid].Get(m_overrides[i]))
{
wxString label = m_overrides[i];

if ( with_labels )
if ( VarInfo *vi = m_case->Variables(0).Lookup( m_overrides[i] ) )
if ( VarInfo *vi = m_case->Variables(ndxHybrid).Lookup( m_overrides[i] ) )
if ( !vi->Label.IsEmpty() )
label = vi->Label;

Expand All @@ -218,15 +229,12 @@ wxString Simulation::GetOverridesLabel( bool with_labels )
return tag;
}

VarValue *Simulation::GetInput( const wxString &name )
VarValue *Simulation::GetInput( const wxString &name, size_t ndxHybrid)
{
if ( VarValue *val = m_inputs.Get( name ) )
if ( VarValue *val = m_inputs[ndxHybrid].Get(name))
return val;
if (VarValue* val = m_case->Values(ndxHybrid).Get(name))
return val;
// TODO:hybrid handling
for (int ndx_hybrid = m_case->GetConfiguration()->Technology.size()-1; ndx_hybrid >=0 ; ndx_hybrid--) {
if (VarValue* val = m_case->Values(ndx_hybrid).Get(name))
return val;
}

return NULL;
}
Expand Down Expand Up @@ -288,24 +296,47 @@ VarValue *Simulation::GetOutput( const wxString &var )

VarValue *Simulation::GetValue( const wxString &name )
{
if ( VarValue *vv = Outputs().Get( name ) ) return vv;
else return GetInput( name );
if ( VarValue *vv = Outputs().Get( name ) )
return vv;
else {
bool found = false;
for (size_t i = m_inputs.size() - 1; i>0 && !found; i--) {
if (vv = GetInput(name, i))
found = true;
}
return vv;
}
}

wxString Simulation::GetLabel( const wxString &var )
{
if ( m_outputLabels.find( var ) != m_outputLabels.end() )
return m_outputLabels[ var ];
else
return m_case->Variables(0).Label( var );
else {
bool found = false;
wxString label = wxEmptyString;
for (size_t i = m_inputs.size() - 1; i > 0 && !found; i--) {
label = m_case->Variables(i).Label(var);
found = (label.Left(11) != "<not found:");
}
return label;
}
}

wxString Simulation::GetUnits( const wxString &var )
{
if ( m_outputUnits.find( var ) != m_outputUnits.end() )
return m_outputUnits[ var ];
else
return m_case->Variables(0).Units( var );
else {
bool found = false;
wxString units = wxEmptyString;
for (size_t i = m_inputs.size() - 1; i > 0 && !found; i--) {
units = m_case->Variables(i).Units(var);
found = (units != wxEmptyString);
}
return units;
}

}
StringHash Simulation::GetUIHints(const wxString &var)
{
Expand Down Expand Up @@ -519,11 +550,11 @@ bool Simulation::Prepare()
for (VarTableBase::const_iterator it = m_case->Values(ndx_hybrid).begin();
it != m_case->Values(ndx_hybrid).end();
++it)
if (0 == m_inputs.Get(it->first))
m_inputs.Set(it->first, *(it->second));
if (0 == m_inputs[ndx_hybrid].Get(it->first))
m_inputs[ndx_hybrid].Set(it->first, *(it->second));

// recalculate all the equations
CaseEvaluator eval(m_case, m_inputs, m_case->Equations(ndx_hybrid));// update m_inputs for hybrids
CaseEvaluator eval(m_case, m_inputs[ndx_hybrid], m_case->Equations(ndx_hybrid));// update m_inputs for hybrids
int n = eval.CalculateAll(ndx_hybrid);

if (n < 0)
Expand Down Expand Up @@ -676,7 +707,7 @@ bool Simulation::Generate_lk(FILE *fp)
int existing_type = ssc_data_query(p_data, ssc_info_name(p_inf));
if (existing_type != data_type)
{
if (VarValue *vv = GetInput(name))
if (VarValue *vv = GetInput(name, 0)) // TODO: hybrid update
{
if (!field.IsEmpty())
{
Expand Down Expand Up @@ -837,7 +868,7 @@ bool Simulation::CmodInputsToSSCData(ssc_module_t p_mod, ssc_data_t p_data) {

int existing_type = ssc_data_query(p_data, ssc_info_name(p_inf));
if (existing_type != data_type) {
if (VarValue *vv = GetInput(name)) {
if (VarValue *vv = GetInput(name, 0)) { // TODO:hybrids
if (!field.IsEmpty()) {
if (vv->Type() != VV_TABLE) {
wxString err = "SSC variable has table:field specification, but '" + name +
Expand Down
12 changes: 6 additions & 6 deletions src/simulation.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,11 @@ class Simulation
static bool WriteDebugFile( const wxString &file, ssc_data_t p_data );

// setting up the simulation
void Override( const wxString &name, const VarValue &val );
wxString GetOverridesLabel( bool with_labels = true );
void Override( const wxString &name, const VarValue &val, size_t ndxHybrid);
wxString GetOverridesLabel(size_t ndxHybrid, bool with_labels = true );
void SetName( const wxString &s ) { m_name = s; }
wxString GetName() { return m_name; }
VarValue *GetInput( const wxString &name );
VarValue *GetInput( const wxString &name, size_t ndxHybrid);
void SetInput(const wxString & name, lk::vardata_t val);

// generate code
Expand All @@ -126,7 +126,7 @@ class Simulation
// returns an output or input, outputs have precedence
VarValue *GetValue( const wxString &name );

VarTable *GetInputVarTable() { return &m_inputs; }
VarTable *GetInputVarTable(size_t ndxHybrid) { return &m_inputs[ndxHybrid]; }

bool JSONInputsToSSCData(wxString& fn, ssc_data_t p_data);

Expand Down Expand Up @@ -197,9 +197,9 @@ class Simulation
wxArrayString m_simlist;
wxString m_name;
wxArrayString m_overrides;
VarTable m_inputs;
std::vector<VarTable> m_inputs; // one or more vartables (more than one for hybrids) see case.h m_vals
wxArrayString m_outputList;
VarTable m_outputs;
VarTable m_outputs; // single vartable for all outputs including hybrids
wxArrayString m_errors, m_warnings, m_notices;

StringHash m_outputLabels, m_outputUnits, m_uiHints;
Expand Down
Loading

0 comments on commit dc02c8f

Please sign in to comment.