diff --git a/egret/model_library/transmission/tests/test_baseMVA_scaling.py b/egret/model_library/transmission/tests/test_baseMVA_scaling.py new file mode 100644 index 00000000..fef28dd9 --- /dev/null +++ b/egret/model_library/transmission/tests/test_baseMVA_scaling.py @@ -0,0 +1,125 @@ +# ___________________________________________________________________________ +# +# EGRET: Electrical Grid Research and Engineering Tools +# Copyright 2019 National Technology & Engineering Solutions of Sandia, LLC +# (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. +# Government retains certain rights in this software. +# This software is distributed under the Revised BSD License. +# ___________________________________________________________________________ + +import os +import math +import pytest + +from egret.data.model_data import ModelData +from egret.model_library.transmission.tx_utils import \ + scale_ModelData_to_pu, unscale_ModelData_to_pu +from egret.models.unit_commitment import solve_unit_commitment +from egret.models.tests.test_unit_commitment import test_solver + +current_dir = os.path.dirname(os.path.abspath(__file__)) +uc_test_dir = os.path.join(current_dir, '..','..','..','models', + 'tests', 'uc_test_instances') +scuc_fn = os.path.join(uc_test_dir, 'test_scuc_full_enforce_relaxed_sol.json') +tiny_uc_7_fn = os.path.join(uc_test_dir, 'tiny_uc_7.json') + +def test_scale_unscale(): + md = ModelData.read(scuc_fn) + + ## do type conversions + original_base_MVA = md.data['system']['baseMVA'] + md.data['system']['baseMVA'] = 1. + + scale_ModelData_to_pu(md, inplace=True) + md.data['system']['baseMVA'] = original_base_MVA + + md_transformed = scale_ModelData_to_pu(md, inplace=False) + + # test inplace flag + assert id(md.data) != id(md_transformed.data) + + unscale_ModelData_to_pu(md_transformed, inplace=True) + + assert md.data['system'] == md_transformed.data['system'] + for esn, esd in md.data['elements'].items(): + for en, ed in esd.items(): + assert ed == md_transformed.data['elements'][esn][en] + + for esn, esd in md_transformed.data['elements'].items(): + for en, ed in esd.items(): + assert ed == md.data['elements'][esn][en] + +def test_scaling_spot_check(): + md = ModelData.read(scuc_fn) + + baseMVA = md.data['system']['baseMVA'] + + md_scaled = scale_ModelData_to_pu(md, inplace=False) + + md_scaled_unscaled = unscale_ModelData_to_pu(md_scaled, inplace=False) + + ## commitment should be unchanged + assert md.data['elements']['generator']['101_STEAM_3_t']['commitment']['values'][10] == \ + md_scaled.data['elements']['generator']['101_STEAM_3_t']['commitment']['values'][10] == \ + md_scaled_unscaled.data['elements']['generator']['101_STEAM_3_t']['commitment']['values'][10] + + ## as should production cost + assert md.data['elements']['generator']['101_STEAM_3_t']['production_cost']['values'][10] == \ + md_scaled.data['elements']['generator']['101_STEAM_3_t']['production_cost']['values'][10] == \ + md_scaled_unscaled.data['elements']['generator']['101_STEAM_3_t']['production_cost']['values'][10] + + ## as should voltage angle + assert md.data['elements']['bus']['Alber']['va']['values'][10] == \ + md_scaled.data['elements']['bus']['Alber']['va']['values'][10] == \ + md_scaled_unscaled.data['elements']['bus']['Alber']['va']['values'][10] + + ## pg should be scaled + assert md.data['elements']['generator']['101_STEAM_3_t']['pg']['values'][10] == \ + md_scaled.data['elements']['generator']['101_STEAM_3_t']['pg']['values'][10]/baseMVA == \ + md_scaled_unscaled.data['elements']['generator']['101_STEAM_3_t']['pg']['values'][10] + + ## load should be scaled + assert md.data['elements']['bus']['Alber']['pl']['values'][10] == \ + md_scaled.data['elements']['bus']['Alber']['pl']['values'][10]/baseMVA == \ + md_scaled_unscaled.data['elements']['bus']['Alber']['pl']['values'][10] + + ## load should be scaled + assert md.data['elements']['load']['Alber']['p_load']['values'][10] == \ + md_scaled.data['elements']['load']['Alber']['p_load']['values'][10]/baseMVA == \ + md_scaled_unscaled.data['elements']['load']['Alber']['p_load']['values'][10] + + ## flows should be scaled + assert md.data['elements']['branch']['A22']['pf']['values'][20] == \ + md_scaled.data['elements']['branch']['A22']['pf']['values'][20]/baseMVA == \ + md_scaled_unscaled.data['elements']['branch']['A22']['pf']['values'][20] + + ## contingency flows should also be scaled + assert md.data['elements']['contingency']['A1']['monitored_branches']['values'][10]['A11']['pf'] == \ + md_scaled.data['elements']['contingency']['A1']['monitored_branches']['values'][10]['A11']['pf']/baseMVA == \ + md_scaled_unscaled.data['elements']['contingency']['A1']['monitored_branches']['values'][10]['A11']['pf'] + + ## lmp should be inversly scaled + assert md.data['elements']['bus']['Alber']['lmp']['values'][10] == \ + md_scaled.data['elements']['bus']['Alber']['lmp']['values'][10]*baseMVA == \ + md_scaled_unscaled.data['elements']['bus']['Alber']['lmp']['values'][10] + + ## reserve prices should be inversly scaled + assert md.data['system']['reserve_price']['values'][18] == \ + md_scaled.data['system']['reserve_price']['values'][18]*baseMVA == \ + md_scaled_unscaled.data['system']['reserve_price']['values'][18] + + ## shortfall price should be inversly scaled + assert md.data['system']['reserve_shortfall_cost'] == \ + md_scaled.data['system']['reserve_shortfall_cost']*baseMVA == \ + md_scaled_unscaled.data['system']['reserve_shortfall_cost'] + +def test_scaling_solve(): + md = ModelData.read(tiny_uc_7_fn) + + assert md.data['system']['baseMVA'] == 1. + mdo_unscaled = solve_unit_commitment(md, test_solver, relaxed=True) + + md.data['system']['baseMVA'] = 100. + mdo_scaled = solve_unit_commitment(md, test_solver, relaxed=True) + + assert math.isclose(mdo_scaled.data['system']['total_cost'], mdo_unscaled.data['system']['total_cost']) diff --git a/egret/model_library/transmission/tx_utils.py b/egret/model_library/transmission/tx_utils.py index d9773053..63954047 100644 --- a/egret/model_library/transmission/tx_utils.py +++ b/egret/model_library/transmission/tx_utils.py @@ -247,6 +247,8 @@ def load_shed_limit(load, gens, gen_mins): 'q_max', 'startup_capacity', 'shutdown_capacity', + 'startup_curve', + 'shutdown_curve', 'ramp_up_60min', 'ramp_down_60min', 'initial_p_output', @@ -267,9 +269,9 @@ def load_shed_limit(load, gens, gen_mins): 'headroom', 'reg_up_supplied', 'reg_down_supplied', - 'spin_supplied', 'flex_up_supplied', 'flex_down_supplied', + 'spinning_supplied', 'non_spinning_supplied', 'supplemental_supplied', 'p_cost', @@ -403,40 +405,93 @@ def _get_op(normal_op, inverse_op, attr_name): return inverse_op return normal_op +def _no_op(a,b): + return a + +def _recurse_deeper_dict(normal_op, inverse_op, element, attr_name, value, baseMVA, attributes): + if 'data_type' in value: + _scale_by_baseMVA(normal_op, inverse_op, element, attr_name, value, baseMVA, attributes) + else: # recurse deeper + for k,v in value.items(): + _scale_by_baseMVA(normal_op, inverse_op, value, k, v, baseMVA, attributes) + def _scale_by_baseMVA(normal_op, inverse_op, element, attr_name, attr, baseMVA, attributes): if attr is None: return if isinstance(attr, dict): - if 'data_type' in attr and attr['data_type'] == 'time_series': - op = _get_op(normal_op, inverse_op, attr_name) - values_list = attr['values'] - for time, value in enumerate(values_list): - if isinstance(value, dict): - _scale_by_baseMVA(normal_op, inverse_op, element, attr_name, value, baseMVA, attributes) + if 'data_type' in attr: + if attr['data_type'] == 'time_series': + if attr_name in attributes: + op = _get_op(normal_op, inverse_op, attr_name) + else: + op = _no_op + values_list = attr['values'] + for time, value in enumerate(values_list): + if isinstance(value, dict): + _recurse_deeper_dict(normal_op, inverse_op, element, attr_name, value, baseMVA, attributes) + elif isinstance(value, list): + values_list[time] = [ op(v, baseMVA) for v in value ] + elif isinstance(value, tuple): + values_list[time] = tuple( op(v, baseMVA) for v in value ) + else: + values_list[time] = op( value , baseMVA ) + elif attr['data_type'] == 'cost_curve': + if attr['cost_curve_type'] == 'polynomial': + values_dict = attr['values'] + if 'data_type' in values_dict: + _recurse_deeper_dict(normal_op, inverse_op, element, attr_name, values_dict, baseMVA, attributes) + else: + attr['values'] = { int(power): coeff*(inverse_op(1.,baseMVA)**int(power)) \ + for (power, coeff) in values_dict.items() } + elif attr['cost_curve_type'] == 'piecewise': + values = attr['values'] + if isinstance(values, list): + attr['values'] = [ (normal_op(point,baseMVA), cost) \ + for (point, cost) in values ] + elif isinstance(values, tuple): + attr['values'] = tuple( (normal_op(point,baseMVA), cost) \ + for (point, cost) in values ) + elif isinstance(values, dict): + _recurse_deeper_dict(normal_op, inverse_op, element, attr_name, values, baseMVA, attributes) + else: + raise RuntimeError("Unexpected case converting piecewise cost curve") + elif attr['data_type'] == 'fuel_curve': + values = attr['values'] + if isinstance(values, list): + attr['values'] = [ (normal_op(point,baseMVA), fuel) \ + for (point, fuel) in values ] + elif isinstance(values, tuple): + attr['values'] = tuple( (normal_op(point,baseMVA), fuel) \ + for (point, fuel) in values ) + elif isinstance(values, dict): + _recurse_deeper_dict(normal_op, inverse_op, element, attr_name, values, baseMVA, attributes) + else: + raise RuntimeError("Unexpected case converting piecewise fuel curve") + else: # potentially recurse deeper on the "values" + if attr_name in attributes: + op = _get_op(normal_op, inverse_op, attr_name) + else: + op = _no_op + values = attr['values'] + if isinstance(values, dict): + _recurse_deeper_dict(normal_op, inverse_op, element, attr_name, values, baseMVA, attributes) + elif isinstance(values, list): + attr['values'] = [ op(v, baseMVA) for v in values ] + elif isinstance(value, tuple): + attr['values'] = tuple( op(v, baseMVA) for v in values ) else: - values_list[time] = op( value , baseMVA ) - elif 'data_type' in attr and attr['data_type'] == 'cost_curve': - if attr['cost_curve_type'] == 'polynomial': - values_dict = attr['values'] - new_values = { int(power): coeff*(inverse_op(1.,baseMVA)**int(power)) \ - for (power, coeff) in values_dict.items() } - attr['values'] = new_values - elif attr['cost_curve_type'] == 'piecewise': - values_list_of_tuples = attr['values'] - new_values = [ ( normal_op(point,baseMVA), cost) \ - for (point, cost) in values_list_of_tuples ] - attr['values'] = new_values - elif 'data_type' in attr and attr['data_type'] == 'fuel_curve': - values_list_of_tuples = attr['values'] - new_values = [ ( normal_op(point,baseMVA), fuel) \ - for (point, fuel) in values_list_of_tuples ] - attr['values'] = new_values - else: # recurse deeper + attr['values'] = op( values , baseMVA ) + else: # recurse deeper AND we've already checked for data_type for k,v in attr.items(): _scale_by_baseMVA(normal_op, inverse_op, attr, k, v, baseMVA, attributes) elif attr_name in attributes: op = _get_op(normal_op, inverse_op, attr_name) - element[attr_name] = op( attr , baseMVA ) + if isinstance(attr, list): + element[attr_name] = [ op(a, baseMVA) for a in attr ] + elif isinstance(attr, tuple): + element[attr_name] = tuple( op(a, baseMVA) for a in attr ) + else: + element[attr_name] = op( attr , baseMVA ) else: return diff --git a/egret/model_library/unit_commitment/params.py b/egret/model_library/unit_commitment/params.py index dfd7e420..0f1eaa39 100644 --- a/egret/model_library/unit_commitment/params.py +++ b/egret/model_library/unit_commitment/params.py @@ -387,12 +387,12 @@ def warn_about_negative_demand_rule(m, b, t): ## Assert that MUT and MDT are at least 1 in the time units of the model. ## Otherwise, turn on/offs may not be enforced correctly. def scale_min_uptime(m, g): - scaled_up_time = int(round(m.MinimumUpTime[g] / m.TimePeriodLengthHours)) + scaled_up_time = int(math.ceil(m.MinimumUpTime[g] / m.TimePeriodLengthHours)) return min(max(scaled_up_time,1), value(m.NumTimePeriods)) model.ScaledMinimumUpTime = Param(model.ThermalGenerators, within=NonNegativeIntegers, initialize=scale_min_uptime) def scale_min_downtime(m, g): - scaled_down_time = int(round(m.MinimumDownTime[g] / m.TimePeriodLengthHours)) + scaled_down_time = int(math.ceil(m.MinimumDownTime[g] / m.TimePeriodLengthHours)) return min(max(scaled_down_time,1), value(m.NumTimePeriods)) model.ScaledMinimumDownTime = Param(model.ThermalGenerators, within=NonNegativeIntegers, initialize=scale_min_downtime) @@ -524,12 +524,68 @@ def t0_unit_on_rule(m, g): _add_initial_time_periods_on_off_line(model) _verify_must_run_t0_state_consistency(model) + + # For future shutdowns/startups beyond the time-horizon + # Like UnitOnT0State, a postive quantity means the generator + # *will start* in 'future_status' hours, and a negative quantity + # means the generator *will stop* in -('future_status') hours. + # The default of 0 means we have no information + model.FutureStatus = Param(model.ThermalGenerators, + within=Reals, + mutable=True, + default=0., + initialize=thermal_gen_attrs.get('future_status', dict())) + + def time_periods_since_last_shutdown_rule(m,g): + if value(m.UnitOnT0[g]): + # longer than any time-horizon we'd consider + return 10000 + else: + return int(math.ceil( -value(m.UnitOnT0State[g]) / value(m.TimePeriodLengthHours) )) + model.TimePeriodsSinceShutdown = Param(model.ThermalGenerators, within=PositiveIntegers, mutable=True, + initialize=time_periods_since_last_shutdown_rule) + + def time_periods_before_startup_rule(m,g): + if value(m.FutureStatus[g]) <= 0: + # longer than any time-horizon we'd consider + return 10000 + else: + return int(math.ceil( value(m.FutureStatus[g]) / value(m.TimePeriodLengthHours) )) + model.TimePeriodsBeforeStartup = Param(model.ThermalGenerators, within=PositiveIntegers, mutable=True, + initialize=time_periods_before_startup_rule) + + ############################################### + # startup/shutdown curves for each generator. # + # These are specified in the same time scales # + # as 'time_period_length_minutes' and other # + # time-vary quantities. # + ############################################### + + def startup_curve_init_rule(m,g): + startup_curve = thermal_gens[g].get('startup_curve') + if startup_curve is None: + return () + min_down_time = int(math.ceil(m.MinimumDownTime[g] / m.TimePeriodLengthHours)) + if len(startup_curve) > min_down_time: + logger.warn(f"Truncating startup_curve longer than scaled minimum down time {min_down_time} for generator {g}") + return startup_curve[0:min_down_time] + model.StartupCurve = Set(model.ThermalGenerators, within=NonNegativeReals, ordered=True, initialize=startup_curve_init_rule) + + def shutdown_curve_init_rule(m,g): + shutdown_curve = thermal_gens[g].get('shutdown_curve') + if shutdown_curve is None: + return () + min_down_time = int(math.ceil(m.MinimumDownTime[g] / m.TimePeriodLengthHours)) + if len(shutdown_curve) > min_down_time: + logger.warn(f"Truncating shutdown_curve longer than scaled minimum down time {min_down_time} for generator {g}") + return shutdown_curve[0:min_down_time] + model.ShutdownCurve = Set(model.ThermalGenerators, within=NonNegativeReals, ordered=True, initialize=shutdown_curve_init_rule) #################################################################### # generator power output at t=0 (initial condition). units are MW. # #################################################################### - def between_limits_validator(m, v, g): + def power_generated_t0_validator(m, v, g): t = m.TimePeriods.first() if value(m.UnitOnT0[g]): @@ -544,13 +600,16 @@ def between_limits_validator(m, v, g): return True else: - return v == 0. + # Generator was off, but could have residual power due to + # start-up/shut-down curve. Therefore, do not be too picky + # as the value doesn't affect any constraints directly + return True model.PowerGeneratedT0 = Param(model.ThermalGenerators, - within=NonNegativeReals, - validate=between_limits_validator, - mutable=True, - initialize=thermal_gen_attrs['initial_p_output']) + within=NonNegativeReals, + validate=power_generated_t0_validator, + mutable=True, + initialize=thermal_gen_attrs['initial_p_output']) # limits for time periods in which generators are brought on or off-line. # must be no less than the generator minimum output. @@ -663,7 +722,7 @@ def scale_shutdown_limit_t0(m, g): else: return temp + m.MinimumPowerOutputT0[g] model.ScaledShutdownRampLimitT0 = Param(model.ThermalGenerators, within=NonNegativeReals, initialize=scale_shutdown_limit_t0, mutable=True) - + ############################################### # startup cost parameters for each generator. # ############################################### diff --git a/egret/model_library/unit_commitment/power_balance.py b/egret/model_library/unit_commitment/power_balance.py index 5603f4a4..df08d506 100644 --- a/egret/model_library/unit_commitment/power_balance.py +++ b/egret/model_library/unit_commitment/power_balance.py @@ -572,7 +572,7 @@ def _get_pg_expr_rule(t): def pg_expr_rule(block,b): m = block.parent_block() # bus b, time t (S) - return sum(m.PowerGenerated[g, t] for g in m.ThermalGeneratorsAtBus[b]) \ + return sum(m.PowerGeneratedStartupShutdown[g, t] for g in m.ThermalGeneratorsAtBus[b]) \ + sum(m.PowerOutputStorage[s, t] for s in m.StorageAtBus[b])\ - sum(m.PowerInputStorage[s, t] for s in m.StorageAtBus[b])\ + sum(m.NondispatchablePowerUsed[g, t] for g in m.NondispatchableGeneratorsAtBus[b]) \ @@ -776,7 +776,7 @@ def interface_violation_cost_rule(m,t): # Power balance at each node (S) def power_balance(m, b, t): # bus b, time t (S) - return sum(m.PowerGenerated[g, t] for g in m.ThermalGeneratorsAtBus[b]) \ + return sum(m.PowerGeneratedStartupShutdown[g, t] for g in m.ThermalGeneratorsAtBus[b]) \ + sum(m.PowerOutputStorage[s, t] for s in m.StorageAtBus[b])\ - sum(m.PowerInputStorage[s, t] for s in m.StorageAtBus[b])\ + sum(m.NondispatchablePowerUsed[g, t] for g in m.NondispatchableGeneratorsAtBus[b]) \ diff --git a/egret/model_library/unit_commitment/power_vars.py b/egret/model_library/unit_commitment/power_vars.py index ae65d2f0..ac2aaa66 100644 --- a/egret/model_library/unit_commitment/power_vars.py +++ b/egret/model_library/unit_commitment/power_vars.py @@ -20,6 +20,66 @@ def reactive_power_bounds_rule(m,g,t): return (m.MinimumReactivePowerOutput[g,t], m.MaximumReactivePowerOutput[g,t]) model.ReactivePowerGenerated = Var(model.ThermalGenerators, model.TimePeriods, within=Reals, bounds=reactive_power_bounds_rule) +def _add_power_generated_startup_shutdown(model): + assert model.InitialTime == 1 + + # first, discover if we have startup/shutdown + # curves in the model + model_has_startup_shutdown_curves = False + for s in model.StartupCurve.values(): + if len(s) > 0: + model_has_startup_shutdown_curves = True + break + if not model_has_startup_shutdown_curves: + for s in model.ShutdownCurve.values(): + if len(s) > 0: + model_has_startup_shutdown_curves = True + break + + if model_has_startup_shutdown_curves: + # check the status vars to see if we're compatible + # with startup/shutdown curves + if model.status_vars not in ['garver_2bin_vars', 'garver_3bin_vars', 'garver_3bin_relaxed_stop_vars', 'ALS_state_transition_vars']: + raise RuntimeError(f"Status variable formulation {model.status_vars} is not compatible with startup or shutdown curves") + + def power_generated_startup_shutdown_expr_rule(m, g, t): + startup_curve = m.StartupCurve[g] + shutdown_curve = m.ShutdownCurve[g] + time_periods_before_startup = value(m.TimePeriodsBeforeStartup[g]) + time_periods_since_shutdown = value(m.TimePeriodsSinceShutdown[g]) + + future_startup_past_shutdown_production = 0. + future_startup_power_index = time_periods_before_startup + m.NumTimePeriods - t + if future_startup_power_index <= len(startup_curve): + future_startup_past_shutdown_production += startup_curve[future_startup_power_index] + + past_shutdown_power_index = time_periods_since_shutdown + t + if past_shutdown_power_index <= len(shutdown_curve): + future_startup_past_shutdown_production += shutdown_curve[past_shutdown_power_index] + + linear_vars, linear_coefs = m._get_power_generated_lists(m,g,t) + for startup_idx in range(1, min( len(startup_curve)+1, m.NumTimePeriods+1-t )): + linear_vars.append(m.UnitStart[g,t+startup_idx]) + linear_coefs.append(startup_curve[startup_idx]) + for shutdown_idx in range(1, min( len(shutdown_curve)+1, t+1 )): + linear_vars.append(m.UnitStop[g,t-shutdown_idx+1]) + linear_coefs.append(shutdown_curve[shutdown_idx]) + linear_expr = get_linear_expr(m.UnitOn, m.UnitStart, m.UnitStop) + return linear_expr(linear_vars=linear_vars, linear_coefs=linear_coefs, constant=future_startup_past_shutdown_production) + + model.PowerGeneratedStartupShutdown = Expression(model.ThermalGenerators, model.TimePeriods, + rule=power_generated_startup_shutdown_expr_rule) + + else: + ## if we're here, then we can use 1-bin models + ## and no need to do the additional work + def power_generated_expr_rule(m, g, t): + linear_vars, linear_coefs = m._get_power_generated_lists(m,g,t) + linear_expr = get_linear_expr(m.UnitOn) + return linear_expr(linear_vars=linear_vars, linear_coefs=linear_coefs) + model.PowerGeneratedStartupShutdown = Expression(model.ThermalGenerators, model.TimePeriods, + rule=power_generated_expr_rule) + ## garver/ME power variables (above minimum) @add_model_attr(component_name, requires = {'data_loader': None, 'status_vars': None}) def garver_power_vars(model): @@ -56,6 +116,8 @@ def power_generated_expr_rule(m, g, t): model._get_power_generated_lists = lambda m,g,t : ([m.PowerGeneratedAboveMinimum[g,t], m.UnitOn[g,t]], [1., m.MinimumPowerOutput[g,t]]) model._get_negative_power_generated_lists = lambda m,g,t : ([m.PowerGeneratedAboveMinimum[g,t], m.UnitOn[g,t]], [-1., -m.MinimumPowerOutput[g,t]]) + _add_power_generated_startup_shutdown(model) + return ## carrion arroyo power variables (above minimum) @@ -83,4 +145,6 @@ def power_generated_expr_rule(m, g, t): model._get_power_generated_above_minimum_lists = lambda m,g,t : ([m.PowerGenerated[g,t], m.UnitOn[g,t]], [1., -m.MinimumPowerOutput[g,t]]) model._get_negative_power_generated_above_minimum_lists = lambda m,g,t : ([m.PowerGenerated[g,t], m.UnitOn[g,t]], [-1., m.MinimumPowerOutput[g,t]]) + _add_power_generated_startup_shutdown(model) + return diff --git a/egret/model_library/unit_commitment/security_constraints.py b/egret/model_library/unit_commitment/security_constraints.py index fd629a4d..6756571f 100644 --- a/egret/model_library/unit_commitment/security_constraints.py +++ b/egret/model_library/unit_commitment/security_constraints.py @@ -97,7 +97,7 @@ def security_constraint_model(model): raise Exception('Unrecognized generator {} for security constraint {} at time {}'.format(g,s,time_keys[i])) ## TODO: Make LinearExpression? - b.pgSecurityExpression[s] = sum( val*model.PowerGenerated[g,t] for g,val in thermal_gen_coefs.items() ) \ + b.pgSecurityExpression[s] = sum( val*model.PowerGeneratedStartupShutdown[g,t] for g,val in thermal_gen_coefs.items() ) \ + sum( val*model.NondispatchablePowerUsed[g,t] for g,val in renewable_gen_coefs.items() ) \ + sum( val*(model.PowerOutputStorage[s,t]-model.PowerInputStorage[s,t]) for s,val in coefs['storage'].items()) diff --git a/egret/models/tests/test_unit_commitment.py b/egret/models/tests/test_unit_commitment.py index 280cb536..26cac861 100644 --- a/egret/models/tests/test_unit_commitment.py +++ b/egret/models/tests/test_unit_commitment.py @@ -156,7 +156,7 @@ def test_super_tight_uc_model(): _test_uc_model(create_super_tight_unit_commitment_model, relax=True, test_objvals=lp_obj_list) def test_uc_runner(): - test_names = ['tiny_uc_{}'.format(i) for i in range(1,10+1)] + test_names = ['tiny_uc_{}'.format(i) for i in range(1,11+1)] for test_name in test_names: input_json_file_name = os.path.join(current_dir, 'uc_test_instances', test_name+'.json') md_in = ModelData(input_json_file_name) diff --git a/egret/models/tests/uc_test_instances/tiny_uc_11.json b/egret/models/tests/uc_test_instances/tiny_uc_11.json new file mode 100644 index 00000000..ff713963 --- /dev/null +++ b/egret/models/tests/uc_test_instances/tiny_uc_11.json @@ -0,0 +1 @@ +{"elements": {"bus": {"Bus1": {}}, "load": {"Bus1": {"bus": "Bus1", "in_service": true, "p_load": {"data_type": "time_series", "values": [1088.1318, 996.177, 950.1996, 919.548, 888.8964, 888.8964, 919.548, 980.8512000000001, 1118.7834, 1226.064, 1256.7156, 1272.0414, 1256.7156, 1226.064, 1210.7382, 1210.7382, 1272.0414, 1394.6478000000002, 1379.322, 1348.6704000000002, 1302.693, 1287.3672, 1210.7382, 1134.1091999999999]}}}, "branch": {}, "interface": {}, "zone": {}, "generator": {"GEN1_0_t": {"generator_type": "thermal", "bus": "Bus1", "fuel": "G", "in_service": true, "zone": "None", "failure_rate": 0.0, "p_min": 150, "p_max": 455, "ramp_up_60min": 225, "ramp_down_60min": 225, "startup_capacity": 150, "shutdown_capacity": 150, "min_up_time": 8, "min_down_time": 8, "initial_status": 8, "initial_p_output": 455, "startup_cost": [[8, 450], [14, 900]], "shutdown_cost": 0.0, "p_cost": {"data_type": "cost_curve", "cost_curve_type": "polynomial", "values": {"0": 100, "1": 16.19, "2": 0.00048}}, "fixed_commitment": 1, "agc_capable": true, "ramp_agc": 3.75, "fast_start": false, "supplemental_start": true, "supplemental_non_spinning_capacity": 150, "p_min_agc": 165.0, "p_max_agc": 413.6363636363636}, "GEN1_1_t": {"generator_type": "thermal", "bus": "Bus1", "fuel": "G", "in_service": true, "zone": "None", "failure_rate": 0.0, "p_min": 150, "p_max": 455, "ramp_up_60min": 225, "ramp_down_60min": 225, "startup_capacity": 150, "shutdown_capacity": 150, "min_up_time": 8, "min_down_time": 8, "initial_status": 8, "initial_p_output": 455, "startup_cost": [[8, 450], [14, 900]], "shutdown_cost": 0.0, "p_cost": {"data_type": "cost_curve", "cost_curve_type": "polynomial", "values": {"0": 100, "1": 17.19, "2": 0.00048}}, "fixed_commitment": null, "agc_capable": true, "ramp_agc": 3.75, "fast_start": false, "supplemental_start": true, "supplemental_non_spinning_capacity": 150, "p_min_agc": 165.0, "p_max_agc": 413.6363636363636}, "GEN2_0_t": {"generator_type": "thermal", "bus": "Bus1", "fuel": "G", "in_service": true, "zone": "None", "failure_rate": 0.0, "p_min": 150, "p_max": 455, "ramp_up_60min": 225, "ramp_down_60min": 225, "startup_capacity": 150, "shutdown_capacity": 150, "min_up_time": 8, "min_down_time": 8, "initial_status": 8, "initial_p_output": 245, "startup_cost": [[8, 500], [14, 1000]], "shutdown_cost": 0.0, "p_cost": {"data_type": "cost_curve", "cost_curve_type": "polynomial", "values": {"0": 90, "1": 17.26, "2": 0.00031}}, "agc_capable": true, "ramp_agc": 3.75, "fast_start": false, "supplemental_start": true, "supplemental_non_spinning_capacity": 150, "p_min_agc": 165.0, "p_max_agc": 413.6363636363636, "startup_curve": [100, 50, 25], "shutdown_curve": [75, 5]}, "GEN2_1_t": {"generator_type": "thermal", "bus": "Bus1", "fuel": "G", "in_service": true, "zone": "None", "failure_rate": 0.0, "p_min": 150, "p_max": 455, "ramp_up_60min": 225, "ramp_down_60min": 225, "startup_capacity": 150, "shutdown_capacity": 150, "min_up_time": 8, "min_down_time": 8, "initial_status": 8, "initial_p_output": 245, "startup_cost": [[8, 500], [14, 1000]], "shutdown_cost": 0.0, "p_cost": {"data_type": "cost_curve", "cost_curve_type": "polynomial", "values": {"0": 90, "1": 18.26, "2": 0.00031}}, "area": "Area1", "agc_capable": true, "ramp_agc": 3.75, "fast_start": false, "supplemental_start": true, "supplemental_non_spinning_capacity": 150, "p_min_agc": 165.0, "p_max_agc": 413.6363636363636}, "GEN5_0_t": {"generator_type": "thermal", "bus": "Bus1", "fuel": "G", "in_service": true, "zone": "None", "failure_rate": 0.0, "p_min": 25, "p_max": 162, "ramp_up_60min": 60, "ramp_down_60min": 60, "startup_capacity": 25, "shutdown_capacity": 25, "min_up_time": 6, "min_down_time": 6, "initial_status": -2, "initial_p_output": 0, "startup_cost": [[6, 90], [11, 180]], "shutdown_cost": 0.0, "p_cost": {"data_type": "cost_curve", "cost_curve_type": "polynomial", "values": {"0": 45, "1": 19.7, "2": 0.00398}}, "agc_capable": true, "ramp_agc": 1.0, "fast_start": true, "supplemental_start": true, "supplemental_non_spinning_capacity": 25, "non_spinning_capacity": 35.0, "p_min_agc": 27.500000000000004, "p_max_agc": 147.27272727272725, "future_status": 3, "shutdown_curve": [20, 15, 10, 5], "startup_curve": [20, 15, 10, 5], "fixed_commitment": {"data_type": "time_series", "values": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}, "GEN6_0_t": {"generator_type": "thermal", "bus": "Bus1", "fuel": "G", "in_service": true, "zone": "None", "failure_rate": 0.0, "p_min": 20, "p_max": 80, "ramp_up_60min": 60, "ramp_down_60min": 60, "startup_capacity": 20, "shutdown_capacity": 20, "min_up_time": 3, "min_down_time": 3, "initial_status": -3, "initial_p_output": 0, "startup_cost": [[3, 17], [8, 34]], "shutdown_cost": 0.0, "p_cost": {"data_type": "cost_curve", "cost_curve_type": "polynomial", "values": {"0": 37, "1": 22.26, "2": 0.00712}}, "fixed_commitment": 1, "agc_capable": true, "ramp_agc": 1.0, "fast_start": true, "supplemental_start": true, "supplemental_non_spinning_capacity": 20, "non_spinning_capacity": 30.0, "area": "Area1", "p_min_agc": 22.0, "p_max_agc": 72.72727272727272}, "GEN6_1_t": {"generator_type": "thermal", "bus": "Bus1", "fuel": "G", "in_service": true, "zone": "None", "failure_rate": 0.0, "p_min": 20, "p_max": 80, "ramp_up_60min": 60, "ramp_down_60min": 60, "startup_capacity": 20, "shutdown_capacity": 20, "min_up_time": 3, "min_down_time": 3, "initial_status": -3, "initial_p_output": 0, "startup_cost": [[3, 17], [8, 34]], "shutdown_cost": 0.0, "p_cost": {"data_type": "cost_curve", "cost_curve_type": "polynomial", "values": {"0": 37, "1": 23.26, "2": 0.00712}}, "fixed_commitment": null, "agc_capable": true, "ramp_agc": 1.0, "fast_start": true, "supplemental_start": true, "supplemental_non_spinning_capacity": 20, "non_spinning_capacity": 30.0, "p_min_agc": 22.0, "p_max_agc": 72.72727272727272}}, "storage": {}, "area": {"Area1": {"spinning_reserve_requirement": {"data_type": "time_series", "values": [6.5287908, 5.977062, 5.7011976, 5.517288, 5.3333784, 5.3333784, 5.517288, 5.8851072, 6.7127004, 7.356384, 7.5402936, 7.632248400000001, 7.5402936, 7.356384, 7.2644291999999995, 7.2644291999999995, 7.632248400000001, 8.367886799999999, 8.275932, 8.092022400000001, 7.816158000000001, 7.7242032, 7.2644291999999995, 6.804655199999999]}, "non_spinning_reserve_requirement": {"data_type": "time_series", "values": [6.5287908, 5.977062, 5.7011976, 5.517288, 5.3333784, 5.3333784, 5.517288, 5.8851072, 6.7127004, 7.356384, 7.5402936, 7.632248400000001, 7.5402936, 7.356384, 7.2644291999999995, 7.2644291999999995, 7.632248400000001, 8.367886799999999, 8.275932, 8.092022400000001, 7.816158000000001, 7.7242032, 7.2644291999999995, 6.804655199999999]}, "regulation_up_requirement": {"data_type": "time_series", "values": [3.2643954, 2.988531, 2.8505988, 2.758644, 2.6666892, 2.6666892, 2.758644, 2.9425536, 3.3563502, 3.678192, 3.7701468, 3.8161242000000004, 3.7701468, 3.678192, 3.6322145999999997, 3.6322145999999997, 3.8161242000000004, 4.1839433999999995, 4.137966, 4.046011200000001, 3.9080790000000003, 3.8621016, 3.6322145999999997, 3.4023275999999996]}, "regulation_down_requirement": {"data_type": "time_series", "values": [3.2643954, 2.988531, 2.8505988, 2.758644, 2.6666892, 2.6666892, 2.758644, 2.9425536, 3.3563502, 3.678192, 3.7701468, 3.8161242000000004, 3.7701468, 3.678192, 3.6322145999999997, 3.6322145999999997, 3.8161242000000004, 4.1839433999999995, 4.137966, 4.046011200000001, 3.9080790000000003, 3.8621016, 3.6322145999999997, 3.4023275999999996]}, "flexible_ramp_up_requirement": {"data_type": "time_series", "values": [9.7931862, 8.965592999999998, 8.5517964, 8.275932, 8.0000676, 8.0000676, 8.275932, 8.8276608, 10.069050599999999, 11.034576, 11.3104404, 11.4483726, 11.3104404, 11.034576, 10.896643799999998, 10.896643799999998, 11.4483726, 12.5518302, 12.413897999999998, 12.1380336, 11.724237, 11.586304799999999, 10.896643799999998, 10.206982799999999]}, "flexible_ramp_down_requirement": {"data_type": "time_series", "values": [9.7931862, 8.965592999999998, 8.5517964, 8.275932, 8.0000676, 8.0000676, 8.275932, 8.8276608, 10.069050599999999, 11.034576, 11.3104404, 11.4483726, 11.3104404, 11.034576, 10.896643799999998, 10.896643799999998, 11.4483726, 12.5518302, 12.413897999999998, 12.1380336, 11.724237, 11.586304799999999, 10.896643799999998, 10.206982799999999]}, "supplemental_reserve_requirement": {"data_type": "time_series", "values": [16.321977, 14.942654999999998, 14.252994000000001, 13.793219999999998, 13.333445999999999, 13.333445999999999, 13.793219999999998, 14.712768, 16.781751, 18.39096, 18.850734, 19.080621, 18.850734, 18.39096, 18.161073, 18.161073, 19.080621, 20.919717, 20.689829999999997, 20.230056, 19.540395, 19.310508, 18.161073, 17.011637999999998]}}}}, "system": {"time_keys": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], "time_period_length_minutes": 60, "load_mismatch_cost": 1000.0, "reserve_shortfall_cost": 100.0, "baseMVA": 100.0, "reference_bus": "Bus1", "reference_bus_angle": 0.0, "reserve_requirement": {"data_type": "time_series", "values": [32.643954, 29.885309999999997, 28.505988000000002, 27.586439999999996, 26.666891999999997, 26.666891999999997, 27.586439999999996, 29.425536, 33.563502, 36.78192, 37.701468, 38.161242, 37.701468, 36.78192, 36.322146, 36.322146, 38.161242, 41.839434, 41.379659999999994, 40.460112, 39.08079, 38.621016, 36.322146, 34.023275999999996]}, "spinning_reserve_requirement": {"data_type": "time_series", "values": [13.0575816, 11.954124, 11.4023952, 11.034576, 10.6667568, 10.6667568, 11.034576, 11.7702144, 13.4254008, 14.712768, 15.0805872, 15.264496800000002, 15.0805872, 14.712768, 14.528858399999999, 14.528858399999999, 15.264496800000002, 16.735773599999998, 16.551864, 16.184044800000002, 15.632316000000001, 15.4484064, 14.528858399999999, 13.609310399999998]}, "non_spinning_reserve_requirement": {"data_type": "time_series", "values": [13.0575816, 11.954124, 11.4023952, 11.034576, 10.6667568, 10.6667568, 11.034576, 11.7702144, 13.4254008, 14.712768, 15.0805872, 15.264496800000002, 15.0805872, 14.712768, 14.528858399999999, 14.528858399999999, 15.264496800000002, 16.735773599999998, 16.551864, 16.184044800000002, 15.632316000000001, 15.4484064, 14.528858399999999, 13.609310399999998]}, "regulation_up_requirement": {"data_type": "time_series", "values": [6.5287908, 5.977062, 5.7011976, 5.517288, 5.3333784, 5.3333784, 5.517288, 5.8851072, 6.7127004, 7.356384, 7.5402936, 7.632248400000001, 7.5402936, 7.356384, 7.2644291999999995, 7.2644291999999995, 7.632248400000001, 8.367886799999999, 8.275932, 8.092022400000001, 7.816158000000001, 7.7242032, 7.2644291999999995, 6.804655199999999]}, "regulation_down_requirement": {"data_type": "time_series", "values": [6.5287908, 5.977062, 5.7011976, 5.517288, 5.3333784, 5.3333784, 5.517288, 5.8851072, 6.7127004, 7.356384, 7.5402936, 7.632248400000001, 7.5402936, 7.356384, 7.2644291999999995, 7.2644291999999995, 7.632248400000001, 8.367886799999999, 8.275932, 8.092022400000001, 7.816158000000001, 7.7242032, 7.2644291999999995, 6.804655199999999]}, "flexible_ramp_up_requirement": {"data_type": "time_series", "values": [19.5863724, 17.931185999999997, 17.1035928, 16.551864, 16.0001352, 16.0001352, 16.551864, 17.6553216, 20.138101199999998, 22.069152, 22.6208808, 22.8967452, 22.6208808, 22.069152, 21.793287599999996, 21.793287599999996, 22.8967452, 25.1036604, 24.827795999999996, 24.2760672, 23.448474, 23.172609599999998, 21.793287599999996, 20.413965599999997]}, "flexible_ramp_down_requirement": {"data_type": "time_series", "values": [19.5863724, 17.931185999999997, 17.1035928, 16.551864, 16.0001352, 16.0001352, 16.551864, 17.6553216, 20.138101199999998, 22.069152, 22.6208808, 22.8967452, 22.6208808, 22.069152, 21.793287599999996, 21.793287599999996, 22.8967452, 25.1036604, 24.827795999999996, 24.2760672, 23.448474, 23.172609599999998, 21.793287599999996, 20.413965599999997]}, "supplemental_reserve_requirement": {"data_type": "time_series", "values": [32.643954, 29.885309999999997, 28.505988000000002, 27.586439999999996, 26.666891999999997, 26.666891999999997, 27.586439999999996, 29.425536, 33.563502, 36.78192, 37.701468, 38.161242, 37.701468, 36.78192, 36.322146, 36.322146, 38.161242, 41.839434, 41.379659999999994, 40.460112, 39.08079, 38.621016, 36.322146, 34.023275999999996]}}} \ No newline at end of file diff --git a/egret/models/tests/uc_test_instances/tiny_uc_11_results.json b/egret/models/tests/uc_test_instances/tiny_uc_11_results.json new file mode 100644 index 00000000..3fbec48e --- /dev/null +++ b/egret/models/tests/uc_test_instances/tiny_uc_11_results.json @@ -0,0 +1 @@ +{"elements": {"bus": {"Bus1": {"p_balance_violation": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "pl": {"data_type": "time_series", "values": [1088.1318, 996.1769999999999, 950.1996, 919.548, 888.8964, 888.8964, 919.548, 980.8512000000001, 1118.7834, 1226.064, 1256.7156, 1272.0414, 1256.7156, 1226.064, 1210.7382, 1210.7382, 1272.0414, 1394.6478000000002, 1379.322, 1348.6704000000002, 1302.693, 1287.3672, 1210.7382, 1134.1091999999999]}, "va": {"data_type": "time_series", "values": [-0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0]}}}, "load": {"Bus1": {"bus": "Bus1", "in_service": true, "p_load": {"data_type": "time_series", "values": [1088.1318, 996.1769999999999, 950.1996, 919.548, 888.8964, 888.8964, 919.548, 980.8512000000001, 1118.7834, 1226.064, 1256.7156, 1272.0414, 1256.7156, 1226.064, 1210.7382, 1210.7382, 1272.0414, 1394.6478000000002, 1379.322, 1348.6704000000002, 1302.693, 1287.3672, 1210.7382, 1134.1091999999999]}}}, "branch": {}, "interface": {}, "zone": {}, "generator": {"GEN1_0_t": {"generator_type": "thermal", "bus": "Bus1", "fuel": "G", "in_service": true, "zone": "None", "failure_rate": 0.0, "p_min": 150.0, "p_max": 455.0, "ramp_up_60min": 225.0, "ramp_down_60min": 225.0, "startup_capacity": 150.0, "shutdown_capacity": 150.0, "min_up_time": 8, "min_down_time": 8, "initial_status": 8, "initial_p_output": 455.0, "startup_cost": [[8, 450], [14, 900]], "shutdown_cost": 0.0, "p_cost": {"data_type": "cost_curve", "cost_curve_type": "polynomial", "values": {"0": 100.0, "1": 16.19, "2": 0.00048}}, "fixed_commitment": 1, "agc_capable": true, "ramp_agc": 3.75, "fast_start": false, "supplemental_start": true, "supplemental_non_spinning_capacity": 150.0, "p_min_agc": 165.0, "p_max_agc": 413.6363636363637, "pg": {"data_type": "time_series", "values": [455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0, 455.0]}, "rg": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "commitment": {"data_type": "time_series", "values": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}, "commitment_cost": {"data_type": "time_series", "values": [2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006, 2539.3000000000006]}, "production_cost": {"data_type": "time_series", "values": [5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001, 5026.522000000001]}, "reg_provider": {"data_type": "time_series", "values": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, "reg_up_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "reg_down_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "spinning_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "non_spinning_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "supplemental_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "flex_up_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "flex_down_supplied": {"data_type": "time_series", "values": [10.081191052738221, 17.931185999999997, 17.1035928, 16.551864, 16.0001352, 16.0001352, 16.551864, 17.6553216, 20.138101199999998, 11.034576, 11.3104404, 11.4483726, 11.3104404, 11.034576, 10.896643799999998, 10.896643799999998, 11.4483726, 12.5518302, 12.413897999999998, 12.1380336, 11.724237, 11.586304799999999, 10.896643799999998, 10.206982799999999]}, "headroom": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}}, "GEN1_1_t": {"generator_type": "thermal", "bus": "Bus1", "fuel": "G", "in_service": true, "zone": "None", "failure_rate": 0.0, "p_min": 150.0, "p_max": 455.0, "ramp_up_60min": 225.0, "ramp_down_60min": 225.0, "startup_capacity": 150.0, "shutdown_capacity": 150.0, "min_up_time": 8, "min_down_time": 8, "initial_status": 8, "initial_p_output": 455.0, "startup_cost": [[8, 450], [14, 900]], "shutdown_cost": 0.0, "p_cost": {"data_type": "cost_curve", "cost_curve_type": "polynomial", "values": {"0": 100.0, "1": 17.19, "2": 0.00048}}, "fixed_commitment": null, "agc_capable": true, "ramp_agc": 3.75, "fast_start": false, "supplemental_start": true, "supplemental_non_spinning_capacity": 150.0, "p_min_agc": 165.0, "p_max_agc": 413.6363636363637, "pg": {"data_type": "time_series", "values": [275.0742184, 264.222876, 293.79720480000003, 268.513424, 238.22964319999994, 238.22964319999994, 243.513424, 279.08098560000013, 365.3579992000001, 417.67304, 299.13501280000014, 302.5, 299.1350128, 268.85123200000004, 253.7093416, 253.7093416, 302.5, 302.5, 302.5, 302.5, 302.5, 302.5, 401.2093415999999, 392.0975619999997]}, "rg": {"data_type": "time_series", "values": [78.45543918240114, 109.88531000000015, 0.0, 0.0, 26.666892000000075, 0.0, 0.0, 131.6128244363635, 34.85296363636352, 37.32695999999996, 114.5013508363635, 0.0, 37.70146800000012, 36.78192000000004, 0.0, 0.0, 0.0, 41.83943400000017, 0.0, 16.874212800000166, 0.0, 38.6210160000001, 8.794807436363783, 49.29312760000029]}, "commitment": {"data_type": "time_series", "values": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}, "commitment_cost": {"data_type": "time_series", "values": [2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006, 2689.3000000000006]}, "production_cost": {"data_type": "time_series", "values": [2177.1919345324795, 1988.3004471071995, 2503.10670339456, 2062.9868742527997, 1535.8310451110394, 1535.8310451110394, 1627.8068742527998, 2246.9385325363223, 3757.9821747571223, 4676.299474944001, 2596.022994812163, 2654.5979999999995, 2596.02299481216, 2068.8671656704005, 1805.2892510995196, 1805.2892510995196, 2654.5979999999995, 2654.5979999999995, 2654.5979999999995, 2654.5979999999995, 2654.5979999999995, 2654.5979999999995, 4387.302298709759, 4227.357764323196]}, "reg_provider": {"data_type": "time_series", "values": [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]}, "reg_up_supplied": {"data_type": "time_series", "values": [3.2643954, 0.0, 0.0, 0.0, 0.0, 2.6666892, 0.0, 2.9425536, 3.3563502000000036, 0.0, 0.0, 3.363219999999978, 0.0, 18.75, 18.75, 18.75, 0.0, 0.0, 18.75, 4.046011200000001, 18.75, 12.313163999999988, 3.6322146, 0.0]}, "reg_down_supplied": {"data_type": "time_series", "values": [3.4023190100186507, 2.988531, 2.8505988, 2.758644, 2.6666892, 5.333378400000001, 2.758644, 2.9425536, 3.3563502000000036, 0.0, 0.0, 7.632248400000001, 7.5402936, 7.356384, 7.2644292, 7.2644292, 7.632248400000001, 8.367886799999999, 8.275932, 8.092022400000001, 7.816158000000001, 3.8621016, 3.6322146, 0.0]}, "spinning_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 1.0345759999999988, 0.0, 0.0, 2.758643999999999, 0.0, 0.0, 0.0, 0.0, 22.8967452, 22.620880800000002, 0.0, 0.0, 0.0, 0.0, 37.5, 0.0, 0.0, 0.0, 0.0, 0.0, 3.4023276000000116]}, "non_spinning_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "supplemental_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "flex_up_supplied": {"data_type": "time_series", "values": [0.0, 8.965592999999998, 8.5517964, 8.275932, 8.0000676, 8.0000676, 8.275932, 0.0, 10.069050599999999, 0.0, 0.0, 0.0, 11.3104404, 0.0, 0.0, 0.0, 0.0, 12.5518302, 0.0, 0.0, 11.724237, 0.0, 0.0, 10.206982799999999]}, "flex_down_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "headroom": {"data_type": "time_series", "values": [101.47034241759884, 79.48288099999985, 161.20279519999997, 186.48657599999999, 190.10346479999995, 184.999662, 170.61235599999998, 31.88836036363636, 35.869448163636505, 0.0, 41.36363636363632, 132.7654572000003, 0.0, 38.13921839999992, 15.141890400000069, 0.0, 63.70934159999999, 33.00507539999984, 0.0, 71.34971999999983, 53.051221800000015, 0.0, 21.82357936363637, 13.609310399999952]}}, "GEN2_0_t": {"generator_type": "thermal", "bus": "Bus1", "fuel": "G", "in_service": true, "zone": "None", "failure_rate": 0.0, "p_min": 150.0, "p_max": 455.0, "ramp_up_60min": 225.0, "ramp_down_60min": 225.0, "startup_capacity": 150.0, "shutdown_capacity": 150.0, "min_up_time": 8, "min_down_time": 8, "initial_status": 8, "initial_p_output": 245.00000000000003, "startup_cost": [[8, 500], [14, 1000]], "shutdown_cost": 0.0, "p_cost": {"data_type": "cost_curve", "cost_curve_type": "polynomial", "values": {"0": 90.0, "1": 17.26, "2": 0.00031}}, "agc_capable": true, "ramp_agc": 3.75, "fast_start": false, "supplemental_start": true, "supplemental_non_spinning_capacity": 150.0, "p_min_agc": 165.0, "p_max_agc": 413.6363636363637, "startup_curve": [100.0, 50.0, 25.0], "shutdown_curve": [75.0, 5.0], "pg": {"data_type": "time_series", "values": [150.0, 75.0, 5.0, 0.0, 0.0, 0.0, 25.0, 50.0, 100.0, 150.0, 302.5, 314.27690319999994, 302.5, 302.5, 302.5, 302.5, 314.27690319999994, 435.41202640000023, 420.2701359999998, 389.98635520000016, 344.5606840000001, 329.4187935999999, 150.0, 75.0]}, "rg": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 8.465178400000116, 0.0, 0.0, 36.3221460000001, 36.3221460000001, 38.16124200000011, 0.0, 11.784455000000005, 0.0, 110.4393159999999, 0.0, 0.0, 0.0]}, "commitment": {"data_type": "time_series", "values": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]}, "commitment_cost": {"data_type": "time_series", "values": [2685.9750000000004, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3185.9750000000004, 2685.9750000000004, 2685.9750000000004, 2685.9750000000004, 2685.9750000000004, 2685.9750000000004, 2685.9750000000004, 2685.9750000000004, 2685.9750000000004, 2685.9750000000004, 2685.9750000000004, 2685.9750000000004, 2685.9750000000004, 2685.9750000000004, 0.0]}, "production_cost": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2653.5419375, 2859.5767980259398, 2653.5419375, 2653.5419375, 2653.5419375, 2653.5419375, 2859.5767980259393, 4978.814579763386, 4713.909857046197, 4184.100411611844, 3389.386243460302, 3124.4815207431184, 0.0, 0.0]}, "reg_provider": {"data_type": "time_series", "values": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, "reg_up_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "reg_down_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 7.5402936, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "spinning_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.7701467999999987, 0.0, 0.0, 0.0, 21.793287600000003, 0.0, 22.8967452, 0.0, 0.0, 24.276067200000004, 0.0, 0.0, 0.0, 0.0]}, "non_spinning_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "supplemental_supplied": {"data_type": "time_series", "values": [0.0, 53.793558000000004, 51.310778400000025, 49.655592000000006, 48.000405599999986, 48.000405599999986, 49.655592000000006, 52.965964799999995, 60.4143036, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 61.241896800000006]}, "flex_up_supplied": {"data_type": "time_series", "values": [10.072391795326292, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 11.3104404, 11.4483726, 0.0, 11.034576, 10.896643799999998, 10.896643799999998, 11.4483726, 0.0, 12.413897999999998, 12.1380336, 0.0, 23.172609599999998, 10.896643799999998, 0.0]}, "flex_down_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "headroom": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 27.25823840000001, 132.2579183999999, 152.5, 152.5, 90.60805979999991, 90.60805979999991, 72.02650139999993, 19.587973599999753, 22.945409000000172, 65.01364479999982, 0.0, 45.58120640000012, 0.0, 0.0]}}, "GEN2_1_t": {"generator_type": "thermal", "bus": "Bus1", "fuel": "G", "in_service": true, "zone": "None", "failure_rate": 0.0, "p_min": 150.0, "p_max": 455.0, "ramp_up_60min": 225.0, "ramp_down_60min": 225.0, "startup_capacity": 150.0, "shutdown_capacity": 150.0, "min_up_time": 8, "min_down_time": 8, "initial_status": 8, "initial_p_output": 245.00000000000003, "startup_cost": [[8, 500], [14, 1000]], "shutdown_cost": 0.0, "p_cost": {"data_type": "cost_curve", "cost_curve_type": "polynomial", "values": {"0": 90.0, "1": 18.26, "2": 0.00031}}, "area": "Area1", "agc_capable": true, "ramp_agc": 3.75, "fast_start": false, "supplemental_start": true, "supplemental_non_spinning_capacity": 150.0, "p_min_agc": 165.0, "p_max_agc": 413.6363636363637, "pg": {"data_type": "time_series", "values": [178.0575816, 176.95412399999998, 176.4023952, 176.034576, 175.6667568, 175.6667568, 176.034576, 176.7702144, 178.42540079999998, 183.39096000000004, 180.08058720000005, 180.26449680000002, 180.08058720000005, 179.712768, 179.5288584, 179.5288584, 180.26449680000002, 181.7357736, 181.551864, 181.18404479999998, 180.63231599999997, 180.44840639999998, 179.5288584, 182.011638]}, "rg": {"data_type": "time_series", "values": [112.40067140000001, 0.0, 33.50598800000012, 27.586439999999968, 0.0, 26.666892000000075, 52.58643999999997, 0.0, 85.69944116363651, 0.0, 0.0, 29.69606359999996, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 29.595205000000036, 0.0, 0.0, 0.0, 31.906390163636388, 69.73014839999983]}, "commitment": {"data_type": "time_series", "values": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}, "commitment_cost": {"data_type": "time_series", "values": [2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004, 2835.9750000000004]}, "production_cost": {"data_type": "time_series", "values": [516.2672172749399, 495.96329398409983, 485.81133233867996, 479.0433579083998, 472.27538347811986, 472.27538347811986, 479.0433579083998, 492.5793067689599, 523.0351917052197, 614.4028465140007, 553.4910766414811, 556.8750638566207, 553.4910766414811, 546.7231022112, 543.3391149960598, 543.3391149960598, 556.8750638566199, 583.9469615777399, 580.5629743625998, 573.7949999323198, 563.6430382868999, 560.2590510717598, 543.3391149960598, 589.0229424004498]}, "reg_provider": {"data_type": "time_series", "values": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}, "reg_up_supplied": {"data_type": "time_series", "values": [3.2643954, 5.977062, 17.1035928, 5.517288, 16.000135200000003, 2.6666892, 10.176049533333334, 2.9425536, 3.356350199999997, 7.356384, 8.850734000000001, 4.269028400000023, 8.756893500000015, 18.75, 8.161073, 3.6322146, 9.725720366666668, 10.919716999999999, 4.137966, 4.046011200000001, 17.59942053333333, 4.931076150000008, 5.322800250000028, 6.804655200000019]}, "reg_down_supplied": {"data_type": "time_series", "values": [3.2643954, 2.988531, 2.8505988, 2.758644, 2.6666892, 2.6666892, 2.758644, 2.9425536, 3.356350199999997, 7.356384, 3.7701468, 3.8161242000000004, 3.7701468, 3.678192, 3.6322146, 3.6322146, 3.8161242000000004, 4.1839433999999995, 4.137966, 4.046011200000001, 3.9080790000000003, 3.8621016, 3.6322146, 6.8046552]}, "spinning_supplied": {"data_type": "time_series", "values": [13.0575816, 1.9541240000000009, 0.0, 0.0, 0.0, 10.666756800000002, 0.0, 11.7702144, 13.425400800000004, 19.694449100000007, 0.0, 4.81159259999998, 0.09384049999998784, 0.0, 0.0, 4.528858399999999, 0.0, 0.0, 16.551864, 16.184044800000002, 0.0, 4.3794318499999925, 3.0452555499999687, 10.20698279999998]}, "non_spinning_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "supplemental_supplied": {"data_type": "time_series", "values": [16.321976999999997, 14.942654999999997, 25.655389200000005, 14.827796000000001, 24.000202799999997, 13.333445999999997, 24.827796000000003, 24.26510403636357, 0.0, 3.409278899999993, 23.931321199999996, 43.6902356, 23.837480700000008, 33.103728, 22.689931399999992, 18.161072999999995, 34.345117800000004, 27.6554906, 20.689829999999994, 20.230056, 26.896948, 20.37948255000001, 19.85165865000002, 20.41396560000002]}, "flex_up_supplied": {"data_type": "time_series", "values": [9.7931862, 8.965592999999998, 0.0, 0.0, 8.0000676, 0.0, 8.275932, 17.6553216, 0.0, 17.663068999999997, 11.3104404, 11.4483726, 11.3104404, 1.0345759999999995, 2.641270733333348, 10.896643799999998, 11.4483726, 12.5518302, 2.413897999999998, 0.0, 0.0, 9.8620678, 10.896643799999998, 0.0]}, "flex_down_supplied": {"data_type": "time_series", "values": [9.7931862, 8.965592999999998, 8.5517964, 8.275932, 8.0000676, 8.0000676, 8.275932, 8.8276608, 10.069050599999999, 11.034576, 11.3104404, 11.4483726, 11.3104404, 11.034576, 10.896643799999998, 10.896643799999998, 11.4483726, 12.5518302, 12.413897999999998, 12.1380336, 11.724237, 11.586304799999999, 10.896643799999998, 10.206982799999999]}, "headroom": {"data_type": "time_series", "values": [2.220446049250313e-14, 67.45818539999999, 7.101395799999866, 21.572909200000012, 33.435078400000016, 16.998242399999917, 4.440892098500626e-14, 8.183234763636404, -8.881784197001252e-14, -4.440892098500626e-14, 10.71239619999993, 0.0, 30.853041399999846, 0.0, 0.0, 67.11276340000003, 43.67886799999998, 0.0, 0.0, 37.136343599999975, 0.0, 0.0, 37.294764636363496, 0.0]}}, "GEN5_0_t": {"generator_type": "thermal", "bus": "Bus1", "fuel": "G", "in_service": true, "zone": "None", "failure_rate": 0.0, "p_min": 25.0, "p_max": 162.0, "ramp_up_60min": 60.0, "ramp_down_60min": 60.0, "startup_capacity": 25.0, "shutdown_capacity": 25.0, "min_up_time": 6, "min_down_time": 6, "initial_status": -2, "initial_p_output": 0.0, "startup_cost": [[6, 90], [11, 180]], "shutdown_cost": 0.0, "p_cost": {"data_type": "cost_curve", "cost_curve_type": "polynomial", "values": {"0": 45.0, "1": 19.7, "2": 0.00398}}, "agc_capable": true, "ramp_agc": 1.0, "fast_start": true, "supplemental_start": true, "supplemental_non_spinning_capacity": 25.0, "non_spinning_capacity": 35.0, "p_min_agc": 27.500000000000004, "p_max_agc": 147.27272727272725, "future_status": 3, "shutdown_curve": [20.0, 15.0, 10.0, 5.0], "startup_curve": [20.0, 15.0, 10.0, 5.0], "fixed_commitment": {"data_type": "time_series", "values": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, "pg": {"data_type": "time_series", "values": [10.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.0, 10.0]}, "rg": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "commitment": {"data_type": "time_series", "values": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, "commitment_cost": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "production_cost": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "reg_provider": {"data_type": "time_series", "values": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, "reg_up_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "reg_down_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "spinning_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "non_spinning_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 8.448135999999995, 8.999864799999994, 8.999864799999994, 8.448135999999995, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "supplemental_supplied": {"data_type": "time_series", "values": [25.0, 25.0, 25.0, 16.551864000000005, 16.000135200000006, 16.000135200000006, 16.551864000000005, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0]}, "flex_up_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "flex_down_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "headroom": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}}, "GEN6_0_t": {"generator_type": "thermal", "bus": "Bus1", "fuel": "G", "in_service": true, "zone": "None", "failure_rate": 0.0, "p_min": 20.0, "p_max": 80.0, "ramp_up_60min": 60.0, "ramp_down_60min": 60.0, "startup_capacity": 20.0, "shutdown_capacity": 20.0, "min_up_time": 3, "min_down_time": 3, "initial_status": -3, "initial_p_output": 0.0, "startup_cost": [[3, 17], [8, 34]], "shutdown_cost": 0.0, "p_cost": {"data_type": "cost_curve", "cost_curve_type": "polynomial", "values": {"0": 37.0, "1": 22.26, "2": 0.0071200000000000005}}, "fixed_commitment": 1, "agc_capable": true, "ramp_agc": 1.0, "fast_start": true, "supplemental_start": true, "supplemental_non_spinning_capacity": 20.0, "non_spinning_capacity": 30.0, "area": "Area1", "p_min_agc": 22.0, "p_max_agc": 72.72727272727272, "pg": {"data_type": "time_series", "values": [20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0]}, "rg": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 49.14848860000001, 13.011097200000016, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 23.585899200000004, 0.0, 0.0, 0.6209483999999932, 0.0]}, "commitment": {"data_type": "time_series", "values": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}, "commitment_cost": {"data_type": "time_series", "values": [502.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006, 485.04800000000006]}, "production_cost": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "reg_provider": {"data_type": "time_series", "values": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, "reg_up_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "reg_down_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "spinning_supplied": {"data_type": "time_series", "values": [0.0, 10.0, 0.0, 10.0, 0.0, 0.0, 3.6171704666666664, 0.0, 0.0, 10.0, 10.0, 10.0, 10.0, 0.0, 10.0, 10.0, 10.0, 10.0, 0.0, 0.0, 8.275763000000003, 10.0, 9.793017200000003, 0.0]}, "non_spinning_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "supplemental_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 16.781750999999996, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "flex_up_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 8.5517964, 8.275932, 0.0, 8.0000676, 0.0, 0.0, 10.069050599999999, 4.406083000000003, 0.0, 0.0, 0.0, 10.0, 8.255373066666651, 0.0, 0.0, 0.0, 10.0, 12.1380336, 11.724237, 1.7242369999999978, 0.0, 10.206982799999999]}, "flex_down_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "headroom": {"data_type": "time_series", "values": [0.0, 30.000000000000004, 4.344610800000003, 5.1722040000000025, 30.000000000000004, 35.99979720000001, 49.14848860000001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.233880800000046, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}}, "GEN6_1_t": {"generator_type": "thermal", "bus": "Bus1", "fuel": "G", "in_service": true, "zone": "None", "failure_rate": 0.0, "p_min": 20.0, "p_max": 80.0, "ramp_up_60min": 60.0, "ramp_down_60min": 60.0, "startup_capacity": 20.0, "shutdown_capacity": 20.0, "min_up_time": 3, "min_down_time": 3, "initial_status": -3, "initial_p_output": 0.0, "startup_cost": [[3, 17], [8, 34]], "shutdown_cost": 0.0, "p_cost": {"data_type": "cost_curve", "cost_curve_type": "polynomial", "values": {"0": 37.0, "1": 23.26, "2": 0.0071200000000000005}}, "fixed_commitment": null, "agc_capable": true, "ramp_agc": 1.0, "fast_start": true, "supplemental_start": true, "supplemental_non_spinning_capacity": 20.0, "non_spinning_capacity": 30.0, "p_min_agc": 22.0, "p_max_agc": 72.72727272727272, "pg": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "rg": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "commitment": {"data_type": "time_series", "values": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, "commitment_cost": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "production_cost": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "reg_provider": {"data_type": "time_series", "values": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, "reg_up_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "reg_down_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "spinning_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "non_spinning_supplied": {"data_type": "time_series", "values": [20.0, 20.0, 20.0, 2.5864400000000067, 1.6668920000000087, 1.6668920000000087, 2.5864400000000067, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0]}, "supplemental_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 17.413559999999993, 18.333107999999992, 18.333107999999992, 17.413559999999993, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "flex_up_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "flex_down_supplied": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "headroom": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}}}, "storage": {}, "area": {"Area1": {"spinning_reserve_requirement": {"data_type": "time_series", "values": [6.5287908, 5.977062, 5.7011976, 5.517288, 5.3333784, 5.3333784, 5.517288, 5.8851072, 6.7127004, 7.356384, 7.5402936, 7.632248400000001, 7.5402936, 7.356384, 7.2644292, 7.2644292, 7.632248400000001, 8.367886799999999, 8.275932, 8.092022400000001, 7.816158000000001, 7.7242032, 7.2644292, 6.8046552]}, "non_spinning_reserve_requirement": {"data_type": "time_series", "values": [6.5287908, 5.977062, 5.7011976, 5.517288, 5.3333784, 5.3333784, 5.517288, 5.8851072, 6.7127004, 7.356384, 7.5402936, 7.632248400000001, 7.5402936, 7.356384, 7.2644292, 7.2644292, 7.632248400000001, 8.367886799999999, 8.275932, 8.092022400000001, 7.816158000000001, 7.7242032, 7.2644292, 6.8046552]}, "regulation_up_requirement": {"data_type": "time_series", "values": [3.2643954, 2.988531, 2.8505988, 2.758644, 2.6666892, 2.6666892, 2.758644, 2.9425536, 3.3563502, 3.678192, 3.7701468, 3.8161242000000004, 3.7701468, 3.678192, 3.6322146, 3.6322146, 3.8161242000000004, 4.1839433999999995, 4.137966, 4.046011200000001, 3.9080790000000003, 3.8621016, 3.6322146, 3.4023276]}, "regulation_down_requirement": {"data_type": "time_series", "values": [3.2643954, 2.988531, 2.8505988, 2.758644, 2.6666892, 2.6666892, 2.758644, 2.9425536, 3.3563502, 3.678192, 3.7701468, 3.8161242000000004, 3.7701468, 3.678192, 3.6322146, 3.6322146, 3.8161242000000004, 4.1839433999999995, 4.137966, 4.046011200000001, 3.9080790000000003, 3.8621016, 3.6322146, 3.4023276]}, "flexible_ramp_up_requirement": {"data_type": "time_series", "values": [9.7931862, 8.965592999999998, 8.5517964, 8.275932, 8.0000676, 8.0000676, 8.275932, 8.8276608, 10.069050599999999, 11.034576, 11.3104404, 11.4483726, 11.3104404, 11.034576, 10.896643799999998, 10.896643799999998, 11.4483726, 12.5518302, 12.413897999999998, 12.1380336, 11.724237, 11.586304799999999, 10.896643799999998, 10.206982799999999]}, "flexible_ramp_down_requirement": {"data_type": "time_series", "values": [9.7931862, 8.965592999999998, 8.5517964, 8.275932, 8.0000676, 8.0000676, 8.275932, 8.8276608, 10.069050599999999, 11.034576, 11.3104404, 11.4483726, 11.3104404, 11.034576, 10.896643799999998, 10.896643799999998, 11.4483726, 12.5518302, 12.413897999999998, 12.1380336, 11.724237, 11.586304799999999, 10.896643799999998, 10.206982799999999]}, "supplemental_reserve_requirement": {"data_type": "time_series", "values": [16.321977, 14.942654999999998, 14.252994000000003, 13.793219999999998, 13.333445999999999, 13.333445999999999, 13.793219999999998, 14.712768, 16.781751, 18.39096, 18.850734, 19.080621, 18.850734, 18.39096, 18.161073, 18.161073, 19.080621, 20.919717, 20.689829999999997, 20.230056, 19.540395, 19.310508, 18.161073, 17.011637999999998]}, "spinning_reserve_shortfall": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "non_spinning_reserve_shortfall": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "regulation_up_shortfall": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "regulation_down_shortfall": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "flexible_ramp_up_shortfall": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "flexible_ramp_down_shortfall": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "supplemental_shortfall": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}}}, "dc_branch": {}}, "system": {"time_keys": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"], "time_period_length_minutes": 60, "load_mismatch_cost": 1000.0, "reserve_shortfall_cost": 100.0, "baseMVA": 100.0, "reference_bus": "Bus1", "reference_bus_angle": 0.0, "reserve_requirement": {"data_type": "time_series", "values": [32.643954, 29.885309999999997, 28.505988000000006, 27.586439999999996, 26.666891999999997, 26.666891999999997, 27.586439999999996, 29.425536, 33.563502, 36.78192, 37.701468, 38.161242, 37.701468, 36.78192, 36.322146, 36.322146, 38.161242, 41.839434, 41.379659999999994, 40.460112, 39.08079, 38.621016, 36.322146, 34.023275999999996]}, "spinning_reserve_requirement": {"data_type": "time_series", "values": [13.0575816, 11.954124, 11.4023952, 11.034576, 10.6667568, 10.6667568, 11.034576, 11.7702144, 13.4254008, 14.712768, 15.0805872, 15.264496800000002, 15.0805872, 14.712768, 14.5288584, 14.5288584, 15.264496800000002, 16.735773599999998, 16.551864, 16.184044800000002, 15.632316000000001, 15.4484064, 14.5288584, 13.6093104]}, "non_spinning_reserve_requirement": {"data_type": "time_series", "values": [13.0575816, 11.954124, 11.4023952, 11.034576, 10.6667568, 10.6667568, 11.034576, 11.7702144, 13.4254008, 14.712768, 15.0805872, 15.264496800000002, 15.0805872, 14.712768, 14.5288584, 14.5288584, 15.264496800000002, 16.735773599999998, 16.551864, 16.184044800000002, 15.632316000000001, 15.4484064, 14.5288584, 13.6093104]}, "regulation_up_requirement": {"data_type": "time_series", "values": [6.5287908, 5.977062, 5.7011976, 5.517288, 5.3333784, 5.3333784, 5.517288, 5.8851072, 6.7127004, 7.356384, 7.5402936, 7.632248400000001, 7.5402936, 7.356384, 7.2644292, 7.2644292, 7.632248400000001, 8.367886799999999, 8.275932, 8.092022400000001, 7.816158000000001, 7.7242032, 7.2644292, 6.8046552]}, "regulation_down_requirement": {"data_type": "time_series", "values": [6.5287908, 5.977062, 5.7011976, 5.517288, 5.3333784, 5.3333784, 5.517288, 5.8851072, 6.7127004, 7.356384, 7.5402936, 7.632248400000001, 7.5402936, 7.356384, 7.2644292, 7.2644292, 7.632248400000001, 8.367886799999999, 8.275932, 8.092022400000001, 7.816158000000001, 7.7242032, 7.2644292, 6.8046552]}, "flexible_ramp_up_requirement": {"data_type": "time_series", "values": [19.5863724, 17.931185999999997, 17.1035928, 16.551864, 16.0001352, 16.0001352, 16.551864, 17.6553216, 20.138101199999998, 22.069152, 22.6208808, 22.8967452, 22.6208808, 22.069152, 21.793287599999996, 21.793287599999996, 22.8967452, 25.1036604, 24.827795999999996, 24.2760672, 23.448474, 23.172609599999998, 21.793287599999996, 20.413965599999997]}, "flexible_ramp_down_requirement": {"data_type": "time_series", "values": [19.5863724, 17.931185999999997, 17.1035928, 16.551864, 16.0001352, 16.0001352, 16.551864, 17.6553216, 20.138101199999998, 22.069152, 22.6208808, 22.8967452, 22.6208808, 22.069152, 21.793287599999996, 21.793287599999996, 22.8967452, 25.1036604, 24.827795999999996, 24.2760672, 23.448474, 23.172609599999998, 21.793287599999996, 20.413965599999997]}, "supplemental_reserve_requirement": {"data_type": "time_series", "values": [32.643954, 29.885309999999997, 28.505988000000006, 27.586439999999996, 26.666891999999997, 26.666891999999997, 27.586439999999996, 29.425536, 33.563502, 36.78192, 37.701468, 38.161242, 37.701468, 36.78192, 36.322146, 36.322146, 38.161242, 41.839434, 41.379659999999994, 40.460112, 39.08079, 38.621016, 36.322146, 34.023275999999996]}, "reserve_shortfall": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "spinning_reserve_shortfall": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "non_spinning_reserve_shortfall": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "regulation_up_shortfall": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "regulation_down_shortfall": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "flexible_ramp_up_shortfall": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "flexible_ramp_down_shortfall": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "supplemental_shortfall": {"data_type": "time_series", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, "total_cost": 481071.6730898891}} \ No newline at end of file diff --git a/egret/models/unit_commitment.py b/egret/models/unit_commitment.py index 10846ce2..06a3ddf9 100644 --- a/egret/models/unit_commitment.py +++ b/egret/models/unit_commitment.py @@ -1048,7 +1048,7 @@ def _save_uc_results(m, relaxed): for dt, mt in enumerate(m.TimePeriods): - pg_dict[dt] = value(m.PowerGenerated[g,mt]) + pg_dict[dt] = value(m.PowerGeneratedStartupShutdown[g,mt]) if reserve_requirement: rg_dict[dt] = value(m.ReserveProvided[g,mt]) if relaxed: