Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

annualization_factor fix #211

Merged
merged 1 commit into from
Dec 1, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/energiapy/model/constraints/transport.py
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ def transport_capacity_UB_no_bin_rule(instance, source, sink, transport, *scale_
return instance.constraint_transport_capacity_UB_no_bin


def constraint_transport_capex(instance: ConcreteModel, trans_capex: dict, distance_dict: dict, transport_avail_dict: dict, network_scale_level: int = 0):
def constraint_transport_capex(instance: ConcreteModel, trans_capex: dict, distance_dict: dict, transport_avail_dict: dict, network_scale_level: int = 0, annualization_factor:float = 1):
"""_summary_

Args:
Expand All @@ -315,7 +315,7 @@ def constraint_transport_capex(instance: ConcreteModel, trans_capex: dict, dista
distance_dict (dict): _description_
transport_avail_dict (dict): _description_
network_scale_level (int, optional): _description_. Defaults to 0.

annualization_factor (float, optional):
Returns:
_type_: _description_
"""
Expand All @@ -324,7 +324,7 @@ def constraint_transport_capex(instance: ConcreteModel, trans_capex: dict, dista

def transport_capex_rule(instance, source, sink, transport, *scale_list):
if transport in transport_avail_dict[(source, sink)]:
return instance.Capex_transport[source, sink, transport, scale_list[:network_scale_level + 1]] == distance_dict[(source, sink)]*trans_capex[transport]*instance.Cap_F[source, sink, transport, scale_list[:network_scale_level + 1]]
return instance.Capex_transport[source, sink, transport, scale_list[:network_scale_level + 1]] == annualization_factor*distance_dict[(source, sink)]*trans_capex[transport]*instance.Cap_F[source, sink, transport, scale_list[:network_scale_level + 1]]
else:
return instance.Capex_transport[source, sink, transport, scale_list[:network_scale_level + 1]] == 0
instance.constraint_transport_capex = Constraint(
Expand Down
2 changes: 1 addition & 1 deletion src/energiapy/model/formulate.py
Original file line number Diff line number Diff line change
Expand Up @@ -604,7 +604,7 @@ def formulate(scenario: Scenario, constraints: Set[Constraints] = None, objectiv
transport_capacity_factor=scenario.transport_capacity_factor, transport_capacity_scale_level=scenario.transport_capacity_scale_level)

constraint_transport_capex(instance=instance, trans_capex=scenario.trans_capex, distance_dict=scenario.distance_dict,
transport_avail_dict=scenario.transport_avail_dict, network_scale_level=scenario.network_scale_level)
transport_avail_dict=scenario.transport_avail_dict, network_scale_level=scenario.network_scale_level, annualization_factor=scenario.annualization_factor)

constraint_transport_network_capex(
instance=instance, network_scale_level=scenario.network_scale_level)
Expand Down
28 changes: 10 additions & 18 deletions src/energiapy/model/objectives.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,12 @@
from ..model.constraints.constraints import Constraints


def objective_cost(instance: ConcreteModel, constraints: Set[Constraints], network_scale_level: int = 0, annualization_factor: float = 1) -> Objective:
def objective_cost(instance: ConcreteModel, constraints: Set[Constraints], network_scale_level: int = 0) -> Objective:
"""Objective to minimize total cost

Args:
instance (ConcreteModel): pyomo instance
network_scale_level (int, optional): scale of network decisions. Defaults to 0.
annualization_factor (float, optional): fraction of capital expenditure incurred on an annual basis

Returns:
Objective: cost objective
Expand Down Expand Up @@ -71,7 +70,7 @@ def objective_cost_rule(instance):
cost_trans_vopex = 0
cost_trans_fopex = 0

return annualization_factor*(capex + cost_trans_capex ) + vopex + fopex + cost_purch + cost_trans_vopex + cost_trans_fopex + incidental + land_cost - credit + storage_cost
return capex + cost_trans_capex + vopex + fopex + cost_purch + cost_trans_vopex + cost_trans_fopex + incidental + land_cost - credit + storage_cost

instance.objective_cost = Objective(
rule=objective_cost_rule, doc='total cost')
Expand All @@ -80,15 +79,13 @@ def objective_cost_rule(instance):


def objective_cost_w_demand_penalty(instance: ConcreteModel, demand_penalty: Dict[Location, Dict[Resource, float]], constraints: Set[Constraints],
network_scale_level: int = 0, demand_scale_level: int = 0, annualization_factor: float = 1) -> Objective:
network_scale_level: int = 0, demand_scale_level: int = 0) -> Objective:
"""Objective to minimize total cost with demand penalty

Args:
instance (ConcreteModel): pyomo instance
network_scale_level (int, optional): scale of network decisions. Defaults to 0.
demand_penalty (Dict[Location, Resource]): penalty for unmet demand for resource at each location
annualization_factor (float, optional): fraction of capital expenditure incurred on an annual basis


Returns:
Objective: cost objective
Expand Down Expand Up @@ -134,22 +131,20 @@ def objective_cost_w_demand_penalty_rule(instance):

penalty = sum(demand_penalty[location_][resource_]*instance.Demand_penalty[location_, resource_, scale_] for location_, resource_, scale_ in product(
instance.locations, instance.resources_demand, scale_iter_penalty))
return annualization_factor*(capex + cost_trans_capex ) + vopex + fopex + cost_purch + cost_trans_vopex + cost_trans_fopex + incidental + land_cost - credit + penalty
return capex + cost_trans_capex + vopex + fopex + cost_purch + cost_trans_vopex + cost_trans_fopex + incidental + land_cost - credit + penalty
instance.objective_cost_w_demand_penalty = Objective(
rule=objective_cost_w_demand_penalty_rule, doc='total cost with penalty for demand')
constraint_latex_render(objective_cost_w_demand_penalty_rule)
return instance.objective_cost_w_demand_penalty


def objective_uncertainty_cost(instance: ConcreteModel, penalty: float, network_scale_level: int = 0,
uncertainty_scale_level: int = 0, annualization_factor: float = 1) -> Objective:
uncertainty_scale_level: int = 0) -> Objective:
"""Objective to minimize total cost

Args:
instance (ConcreteModel): pyomo instance
network_scale_level (int, optional): scale of network decisions. Defaults to 0.
annualization_factor (float, optional): fraction of capital expenditure incurred on an annual basis


Returns:
Objective: cost objective
Expand Down Expand Up @@ -178,7 +173,7 @@ def uncertainty_cost_objective_rule(instance):
cost_trans_capex = 0
cost_trans_vopex = 0
cost_trans_fopex = 0
return annualization_factor*(capex + cost_trans_capex ) + vopex + fopex + cost_purch + cost_trans_vopex + cost_trans_fopex + cap_penalty
return capex + cost_trans_capex + vopex + fopex + cost_purch + cost_trans_vopex + cost_trans_fopex + cap_penalty

instance.uncertainty_cost_objective = Objective(rule=uncertainty_cost_objective_rule,
doc='total purchase from network')
Expand Down Expand Up @@ -251,14 +246,12 @@ def objective_discharge_max_rule(instance, *scale_list):
return instance.objective_discharge_max


def objective_profit(instance: ConcreteModel, constraints: Set[Constraints], network_scale_level: int = 0, annualization_factor: float = 1) -> Objective:
def objective_profit(instance: ConcreteModel, constraints: Set[Constraints], network_scale_level: int = 0) -> Objective:
"""Objective to maximize total profit

Args:
instance (ConcreteModel): pyomo instance
network_scale_level (int, optional): scale of network decisions. Defaults to 0.
annualization_factor (float, optional): fraction of capital expenditure incurred on an annual basis


Returns:
Objective: profit objective
Expand Down Expand Up @@ -302,7 +295,7 @@ def objective_profit_rule(instance):
cost_trans_capex = 0
cost_trans_vopex = 0
cost_trans_fopex = 0
return -(annualization_factor*(capex + cost_trans_capex ) + vopex + fopex + cost_purch + cost_trans_vopex + cost_trans_fopex + incidental + land_cost) + credit + revenue
return -(capex + cost_trans_capex + vopex + fopex + cost_purch + cost_trans_vopex + cost_trans_fopex + incidental + land_cost) + credit + revenue

instance.objective_profit = Objective(
rule=objective_profit_rule, sense=maximize, doc='total profit')
Expand All @@ -311,13 +304,12 @@ def objective_profit_rule(instance):


def objective_profit_w_demand_penalty(instance: ConcreteModel, demand_penalty: Dict[Location, Dict[Resource, float]], constraints: Set[Constraints],
network_scale_level: int = 0, demand_scale_level: int = 0, annualization_factor: float = 1) -> Objective:
network_scale_level: int = 0, demand_scale_level: int = 0) -> Objective:
"""Objective to maximize total profit with a penalty for unmet demand

Args:
instance (ConcreteModel): pyomo instance
network_scale_level (int, optional): scale of network decisions. Defaults to 0.
annualization_factor (float, optional): fraction of capital expenditure incurred on an annual basis

Returns:
Objective: profit objective
Expand Down Expand Up @@ -366,7 +358,7 @@ def objective_profit_w_demand_penalty_rule(instance):

penalty = sum(demand_penalty[location_][resource_]*instance.Demand_penalty[location_, resource_, scale_] for location_, resource_, scale_ in product(
instance.locations, instance.resources_demand, scale_iter_penalty))
return -(annualization_factor*(capex + cost_trans_capex ) + vopex + fopex + cost_purch + cost_trans_vopex + cost_trans_fopex + incidental + land_cost + penalty) + credit + revenue
return -(capex + cost_trans_capex + vopex + fopex + cost_purch + cost_trans_vopex + cost_trans_fopex + incidental + land_cost + penalty) + credit + revenue

instance.objective_profit_w_demand_penalty = Objective(
rule=objective_profit_w_demand_penalty_rule, sense=maximize, doc='total profit w demand_penalty')
Expand Down