Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
for gen in extendable_gens_i for sn in snapshots}
l_constraint(network.model, "generator_p_upper", gen_p_upper,
list(extendable_gens_i), snapshots)
## Define committable generator statuses ##
network.model.generator_status = Var(list(fixed_committable_gens_i), snapshots,
within=Binary)
var_lower = p_min_pu.loc[:,fixed_committable_gens_i].multiply(network.generators.loc[fixed_committable_gens_i, 'p_nom'])
var_upper = p_max_pu.loc[:,fixed_committable_gens_i].multiply(network.generators.loc[fixed_committable_gens_i, 'p_nom'])
committable_gen_p_lower = {(gen,sn) : LConstraint(LExpression([(var_lower[gen][sn],network.model.generator_status[gen,sn]),(-1.,network.model.generator_p[gen,sn])]),"<=") for gen in fixed_committable_gens_i for sn in snapshots}
l_constraint(network.model, "committable_gen_p_lower", committable_gen_p_lower,
list(fixed_committable_gens_i), snapshots)
committable_gen_p_upper = {(gen,sn) : LConstraint(LExpression([(var_upper[gen][sn],network.model.generator_status[gen,sn]),(-1.,network.model.generator_p[gen,sn])]),">=") for gen in fixed_committable_gens_i for sn in snapshots}
l_constraint(network.model, "committable_gen_p_upper", committable_gen_p_upper,
list(fixed_committable_gens_i), snapshots)
## Deal with minimum up time ##
up_time_gens = fixed_committable_gens_i[network.generators.loc[fixed_committable_gens_i,"min_up_time"] > 0]
for gen_i, gen in enumerate(up_time_gens):
bn = branch[1]
cycle_is = subnetwork.C[i,:].nonzero()[1]
tree_is = subnetwork.T[i,:].nonzero()[1]
if len(cycle_is) + len(tree_is) == 0: logger.error("The cycle formulation does not support infinite impedances, yet.")
for snapshot in snapshots:
expr = LExpression([(subnetwork.C[i,j], network.model.cycles[subnetwork.name,j,snapshot])
for j in cycle_is])
lhs = expr + sum(subnetwork.T[i,j]*network._p_balance[buses.index[j],snapshot]
for j in tree_is)
rhs = LExpression([(1,network.model.passive_branch_p[bt,bn,snapshot])])
flows[bt,bn,snapshot] = LConstraint(lhs,"==",rhs)
l_constraint(network.model, "passive_branch_p_def", flows,
list(passive_branches.index), snapshots)
sdcs = {}
for gen in sdc_gens:
sdc = network.generators.loc[gen,"shut_down_cost"]
initial_status = network.generators.loc[gen,"initial_status"]
for i,sn in enumerate(snapshots):
if i == 0:
rhs = LExpression([(-sdc, network.model.generator_status[gen,sn])],sdc*initial_status)
else:
rhs = LExpression([(-sdc, network.model.generator_status[gen,sn]),(sdc,network.model.generator_status[gen,snapshots[i-1]])])
lhs = LExpression([(1,network.model.generator_shut_down_cost[gen,sn])])
sdcs[gen,sn] = LConstraint(lhs,">=",rhs)
l_constraint(network.model, "generator_shut_down", sdcs, list(sdc_gens), snapshots)
## Deal with ramp limits without unit commitment ##
ru_gens = network.generators.index[network.generators.ramp_limit_up.notnull()]
ru = {}
for gen in ru_gens:
for sn, sn_prev in zip(snapshots[1:], snapshots[:-1]):
if network.generators.at[gen, "p_nom_extendable"]:
lhs = LExpression([(1, network.model.generator_p[gen,sn]),
(-1, network.model.generator_p[gen,sn_prev]),
def define_link_flows(network,snapshots):
extendable_links_i = network.links.index[network.links.p_nom_extendable]
fixed_links_i = network.links.index[~ network.links.p_nom_extendable]
p_max_pu = get_switchable_as_dense(network, 'Link', 'p_max_pu', snapshots)
p_min_pu = get_switchable_as_dense(network, 'Link', 'p_min_pu', snapshots)
fixed_lower = p_min_pu.loc[:,fixed_links_i].multiply(network.links.loc[fixed_links_i, 'p_nom'])
fixed_upper = p_max_pu.loc[:,fixed_links_i].multiply(network.links.loc[fixed_links_i, 'p_nom'])
network.model.link_p = Var(list(network.links.index), snapshots)
p_upper = {(cb, sn) : LConstraint(LExpression([(1, network.model.link_p[cb, sn])],
-fixed_upper.at[sn, cb]),"<=")
for cb in fixed_links_i for sn in snapshots}
p_upper.update({(cb,sn) : LConstraint(LExpression([(1, network.model.link_p[cb, sn]),
(-p_max_pu.at[sn, cb], network.model.link_p_nom[cb])]),
"<=")
for cb in extendable_links_i for sn in snapshots})
l_constraint(network.model, "link_p_upper", p_upper,
list(network.links.index), snapshots)
p_lower = {(cb, sn) : LConstraint(LExpression([(1, network.model.link_p[cb, sn])],
-fixed_lower.at[sn, cb]),">=")
for cb in fixed_links_i for sn in snapshots}
initial_status = network.generators.loc[gen,"initial_status"]
blocks = max(1,len(snapshots)-min_down_time+1)
gen_down_time = {}
for i in range(blocks):
#sum of 1-status
lhs = LExpression([(-1,network.model.generator_status[gen,snapshots[j]]) for j in range(i,i+min_down_time)],min_down_time)
if i == 0:
rhs = LExpression([(-min_down_time,network.model.generator_status[gen,snapshots[i]])],min_down_time*initial_status)
else:
rhs = LExpression([(-min_down_time,network.model.generator_status[gen,snapshots[i]]),(min_down_time,network.model.generator_status[gen,snapshots[i-1]])])
gen_down_time[i] = LConstraint(lhs,">=",rhs)
l_constraint(network.model, "gen_down_time_{}".format(gen_i), gen_down_time,
range(blocks))
## Deal with start up costs ##
suc_gens = fixed_committable_gens_i[network.generators.loc[fixed_committable_gens_i,"start_up_cost"] > 0]
network.model.generator_start_up_cost = Var(list(suc_gens),snapshots,
domain=NonNegativeReals)
sucs = {}
for gen in suc_gens:
suc = network.generators.loc[gen,"start_up_cost"]
initial_status = network.generators.loc[gen,"initial_status"]
min_up_time = network.generators.loc[gen,"min_up_time"]
initial_status = network.generators.loc[gen,"initial_status"]
blocks = max(1,len(snapshots)-min_up_time+1)
gen_up_time = {}
for i in range(blocks):
lhs = LExpression([(1,network.model.generator_status[gen,snapshots[j]]) for j in range(i,i+min_up_time)])
if i == 0:
rhs = LExpression([(min_up_time,network.model.generator_status[gen,snapshots[i]])],-min_up_time*initial_status)
else:
rhs = LExpression([(min_up_time,network.model.generator_status[gen,snapshots[i]]),(-min_up_time,network.model.generator_status[gen,snapshots[i-1]])])
gen_up_time[i] = LConstraint(lhs,">=",rhs)
l_constraint(network.model, "gen_up_time_{}".format(gen_i), gen_up_time,
range(blocks))
## Deal with minimum down time ##
down_time_gens = fixed_committable_gens_i[network.generators.loc[fixed_committable_gens_i,"min_down_time"] > 0]
for gen_i, gen in enumerate(down_time_gens):
min_down_time = network.generators.loc[gen,"min_down_time"]
initial_status = network.generators.loc[gen,"initial_status"]
blocks = max(1,len(snapshots)-min_down_time+1)
def define_sub_network_balance_constraints(network,snapshots):
sn_balance = {}
for sub_network in network.sub_networks.obj:
for sn in snapshots:
sn_balance[sub_network.name,sn] = LConstraint(LExpression(),"==",LExpression())
for bus in sub_network.buses().index:
sn_balance[sub_network.name,sn].lhs.variables.extend(network._p_balance[bus,sn].variables)
sn_balance[sub_network.name,sn].lhs.constant += network._p_balance[bus,sn].constant
l_constraint(network.model,"sub_network_balance_constraint", sn_balance,
list(network.sub_networks.index), snapshots)
sub_network_cycle_index.append((subnetwork.name, col_j))
branch_idx_attributes = []
for cycle_i in cycle_is:
branch_idx = branches.index[cycle_i]
attribute_value = 1e5 * branches.at[ branch_idx, attribute] * subnetwork.C[ cycle_i, col_j]
branch_idx_attributes.append( (branch_idx, attribute_value))
for snapshot in snapshots:
expression_list = [ (attribute_value,
passive_branch_p[branch_idx[0], branch_idx[1], snapshot]) for (branch_idx, attribute_value) in branch_idx_attributes]
lhs = LExpression(expression_list)
sub_network_cycle_constraints[subnetwork.name,col_j,snapshot] = LConstraint(lhs,"==",LExpression())
return( sub_network_cycle_index, sub_network_cycle_constraints)
def store_e_lower(model,store,snapshot):
return (model.store_e[store,snapshot] >=
model.store_e_nom[store]*e_min_pu.at[snapshot,store])
network.model.store_e_lower = Constraint(list(ext_stores), snapshots, rule=store_e_lower)
free_pyomo_initializers(network.model.store_e_lower)
## Builds the constraint previous_e - p == e ##
e = {}
for store in stores.index:
for i,sn in enumerate(snapshots):
e[store,sn] = LConstraint(sense="==")
e[store,sn].lhs.variables.append((-1,model.store_e[store,sn]))
elapsed_hours = network.snapshot_weightings[sn]
if i == 0 and not stores.at[store,"e_cyclic"]:
previous_e = stores.at[store,"e_initial"]
e[store,sn].lhs.constant += ((1-stores.at[store,"standing_loss"])**elapsed_hours
* previous_e)
else:
previous_e = model.store_e[store,snapshots[i-1]]
e[store,sn].lhs.variables.append(((1-stores.at[store,"standing_loss"])**elapsed_hours,
previous_e))
e[store,sn].lhs.variables.append((-elapsed_hours, model.store_p[store,sn]))
if len(branches_i) > 0:
calculate_PTDF(sub_network)
#kill small PTDF values
sub_network.PTDF[abs(sub_network.PTDF) < ptdf_tolerance] = 0
for i,branch in enumerate(branches_i):
bt = branch[0]
bn = branch[1]
for sn in snapshots:
lhs = sum(sub_network.PTDF[i,j]*network._p_balance[bus,sn]
for j,bus in enumerate(sub_network.buses_o)
if sub_network.PTDF[i,j] != 0)
rhs = LExpression([(1,network.model.passive_branch_p[bt,bn,sn])])
flows[bt,bn,sn] = LConstraint(lhs,"==",rhs)
l_constraint(network.model, "passive_branch_p_def", flows,
list(passive_branches.index), snapshots)