Skip to content
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
121 changes: 48 additions & 73 deletions temoa/components/capacity.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
from deprecated import deprecated
from pyomo.environ import value

from .utils import get_capacity_factor

if TYPE_CHECKING:
from temoa.core.model import TemoaModel
from temoa.types import (
Expand Down Expand Up @@ -142,23 +144,14 @@ def get_default_capacity_factor(
return value(model.capacity_factor_tech[r, s, d, t])


def get_capacity_factor(
model: TemoaModel, r: Region, s: Season, d: TimeOfDay, t: Technology, v: Vintage
) -> float:
if model.is_capacity_factor_process[r, t, v]:
return value(model.capacity_factor_process[r, s, d, t, v])
else:
return value(model.capacity_factor_tech[r, s, d, t])


# ============================================================================
# PYOMO INDEX SETS
# ============================================================================


def capacity_variable_indices(
def new_capacity_variable_indices(
model: TemoaModel,
) -> set[tuple[Region, Technology, Vintage]] | None:
) -> set[tuple[Region, Technology, Vintage]]:
return model.new_capacity_rtv


Expand All @@ -184,86 +177,72 @@ def annual_retirement_variable_indices(
}


def capacity_variable_indices(
model: TemoaModel,
) -> set[tuple[Region, Period, Technology, Vintage]]:
return model.active_capacity_rptv


def capacity_available_variable_indices(
model: TemoaModel,
) -> set[tuple[Region, Period, Technology]] | None:
) -> set[tuple[Region, Period, Technology]]:
return model.active_capacity_available_rpt


def regional_exchange_capacity_constraint_indices(
model: TemoaModel,
) -> set[tuple[Region, Region, Period, Technology, Vintage]]:
indices: set[tuple[Region, Region, Period, Technology, Vintage]] = set()
for r_e, p, i in model.export_regions:
for r_i, t, v, _o in model.export_regions[r_e, p, i]:
indices.add((r_e, r_i, p, t, v))

return indices
return {
(r_to, r_from, p, t, v)
for r_from, p, i in model.export_regions
for r_to, t, v, _o in model.export_regions[r_from, p, i]
}


def capacity_annual_constraint_indices(
model: TemoaModel,
) -> set[tuple[Region, Period, Technology, Vintage]]:
capacity_indices: set[tuple[Region, Period, Technology, Vintage]] = set()
if model.active_activity_rptv:
for r, p, t, v in model.active_activity_rptv:
if t in model.tech_annual and t not in model.tech_demand:
if t not in model.tech_uncap:
capacity_indices.add((r, p, t, v))
else:
return set()

return capacity_indices
return {
(r, p, t, v)
for r, p, t, v in model.active_capacity_rptv
if t in model.tech_annual and t not in model.tech_demand
}


def capacity_constraint_indices(
model: TemoaModel,
) -> set[tuple[Region, Period, Season, TimeOfDay, Technology, Vintage]]:
capacity_indices: set[tuple[Region, Period, Season, TimeOfDay, Technology, Vintage]] = set()
if model.active_activity_rptv:
for r, p, t, v in model.active_activity_rptv:
if t not in model.tech_annual or t in model.tech_demand:
if t not in model.tech_uncap:
if t not in model.tech_storage:
for s in model.time_season:
for d in model.time_of_day:
capacity_indices.add((r, p, s, d, t, v))
else:
return set()

return capacity_indices


@deprecated('switched over to validator... this set is typically VERY empty')
def capacity_factor_process_indices(
model: TemoaModel,
) -> set[tuple[Region, Season, TimeOfDay, Technology, Vintage]]:
indices: set[tuple[Region, Season, TimeOfDay, Technology, Vintage]] = set()
for r, _i, t, v, _o in model.efficiency.sparse_keys():
for s in model.time_season:
for d in model.time_of_day:
indices.add((r, s, d, t, v))
return indices
return {
(r, p, s, d, t, v)
for r, p, t, v in model.active_capacity_rptv
for s in model.time_season
for d in model.time_of_day
if t not in model.tech_annual or t in model.tech_demand
if t not in model.tech_storage
}


def capacity_factor_tech_indices(
model: TemoaModel,
) -> set[tuple[Region, Season, TimeOfDay, Technology]]:
all_cfs: set[tuple[Region, Season, TimeOfDay, Technology]] = set()
if model.active_capacity_available_rpt: # in case every tech in the model is unlim_cap
for r, _p, t in model.active_capacity_available_rpt:
for s in model.time_season:
for d in model.time_of_day:
all_cfs.add((r, s, d, t))
else:
return set()
return all_cfs
return {
(r, s, d, t)
for r, _p, t in model.active_capacity_available_rpt
for s in model.time_season
for d in model.time_of_day
}


def capacity_available_variable_indices_vintage(
@deprecated('switched over to validator... this set is typically VERY empty')
def capacity_factor_process_indices(
model: TemoaModel,
) -> set[tuple[Region, Period, Technology, Vintage]] | None:
return model.active_capacity_available_rptv
) -> set[tuple[Region, Season, TimeOfDay, Technology, Vintage]]:
return {
(r, s, d, t, v)
for r, _i, t, v, _o in model.efficiency.sparse_keys()
for s in model.time_season
for d in model.time_of_day
}


# ============================================================================
Expand Down Expand Up @@ -660,18 +639,14 @@ def create_capacity_and_retirement_sets(model: TemoaModel) -> None:
# Create active capacity index sets from the now-populated process_vintages
model.new_capacity_rtv = {
(r, t, v)
for r, p, t in model.process_vintages
for v in model.process_vintages[r, p, t]
for r, t, v in model.process_periods
if t not in model.tech_uncap and v in model.time_optimize
}
model.active_capacity_available_rpt = {
(r, p, t)
for r, p, t in model.process_vintages
if model.process_vintages[r, p, t] and t not in model.tech_uncap
(r, p, t) for r, p, t in model.process_vintages if t not in model.tech_uncap
}
model.active_capacity_available_rptv = {
model.active_capacity_rptv = {
(r, p, t, v)
for r, p, t in model.process_vintages
for r, p, t in model.active_capacity_available_rpt
for v in model.process_vintages[r, p, t]
if t not in model.tech_uncap
}
Comment on lines +648 to 652
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Rename the documented set to active_capacity_rptv.

create_capacity_and_retirement_sets() now populates model.active_capacity_rptv, but the function docstring still advertises model.active_capacity_available_rptv. That leaves the new capacity-index naming self-contradictory right where the rename was introduced.

📝 Suggested doc fix
-        - model.active_capacity_available_rptv: set of (r, p, t, v) where vintage capacity is
+        - model.active_capacity_rptv: set of (r, p, t, v) where vintage capacity is
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@temoa/components/capacity.py` around lines 648 - 652, The docstring for
create_capacity_and_retirement_sets() still refers to
model.active_capacity_available_rptv while the implementation populates
model.active_capacity_rptv; update the function docstring to mention
model.active_capacity_rptv (and any explanatory text that uses the old name) so
the documentation matches the actual set created by the function and avoid the
old name model.active_capacity_available_rptv.

11 changes: 3 additions & 8 deletions temoa/components/commodities.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ def demand_activity_constraint_indices(
demand commodity (and no annual techs co-serve it), the flow variables are fixed
directly and DAC indices are omitted.
"""
indices = {
return {
(r, p, s, d, t, v, dem)
for r, p, dem in model.demand_constraint_rpc
if (r, p, dem) not in model.singleton_demands
Expand All @@ -145,15 +145,14 @@ def demand_activity_constraint_indices(
for s in model.time_season
for d in model.time_of_day
}
return indices


def commodity_balance_constraint_indices(
model: TemoaModel,
) -> set[tuple[Region, Period, Season, TimeOfDay, Commodity]]:
# Generate indices only for those commodities that are produced by
# technologies with varying output at the time slice level.
indices = {
return {
(r, p, s, d, c)
for r, p, c in model.commodity_balance_rpc
# r in this line includes interregional transfer combinations (not needed).
Expand All @@ -163,24 +162,20 @@ def commodity_balance_constraint_indices(
for d in model.time_of_day
}

return indices


def annual_commodity_balance_constraint_indices(
model: TemoaModel,
) -> set[tuple[Region, Period, Commodity]]:
# Generate indices only for those commodities that are produced by
# technologies with constant annual output.
indices = {
return {
(r, p, c)
for r, p, c in model.commodity_balance_rpc
# r in this line includes interregional transfer combinations (not needed).
if r in model.regions # this line ensures only the regions are included.
and c in model.commodity_annual
}

return indices


# ============================================================================
# PYOMO CONSTRAINT RULES
Expand Down
15 changes: 3 additions & 12 deletions temoa/components/costs.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,18 +97,11 @@ def get_loan_life(model: TemoaModel, r: Region, t: Technology, v: Vintage) -> in


def cost_fixed_indices(model: TemoaModel) -> set[tuple[Region, Period, Technology, Vintage]]:
# we pull the unlimited capacity techs from this index. They cannot have fixed costs
if model.active_activity_rptv:
return {
(r, p, t, v) for r, p, t, v in model.active_activity_rptv if t not in model.tech_uncap
}
return set()
return model.active_capacity_rptv


def cost_variable_indices(model: TemoaModel) -> set[tuple[Region, Period, Technology, Vintage]]:
if model.active_activity_rptv:
return model.active_activity_rptv
return set()
return model.active_activity_rptv


def lifetime_loan_process_indices(model: TemoaModel) -> set[tuple[Region, Technology, Vintage]]:
Expand All @@ -120,9 +113,7 @@ def lifetime_loan_process_indices(model: TemoaModel) -> set[tuple[Region, Techno
because in myopic mode, previously optimized vintages remain active in later
windows and their data must be accepted by the param's index set.
"""
indices = {(r, t, v) for r, i, t, v, o in model.efficiency.sparse_keys()}

return indices
return {(r, t, v) for r, i, t, v, o in model.efficiency.sparse_keys()}


# ============================================================================
Expand Down
8 changes: 2 additions & 6 deletions temoa/components/emissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,20 +38,18 @@
def emission_activity_indices(
model: TemoaModel,
) -> set[tuple[Region, Commodity, Commodity, Technology, Vintage, Commodity]]:
indices = {
return {
(r, e, i, t, v, o)
for r, i, t, v, o in model.efficiency.sparse_keys()
for e in model.commodity_emissions
if r in model.regions # omit any exchange/groups
}

return indices


def linked_tech_constraint_indices(
model: TemoaModel,
) -> set[tuple[Region, Period, Season, TimeOfDay, Technology, Vintage, Commodity]]:
linkedtech_indices = {
return {
(r, p, s, d, t, v, e)
for r, t, e in model.linked_techs.sparse_keys()
for p in model.time_optimize
Expand All @@ -62,8 +60,6 @@ def linked_tech_constraint_indices(
for d in model.time_of_day
}

return linkedtech_indices


# ============================================================================
# PYOMO CONSTRAINT RULES
Expand Down
16 changes: 4 additions & 12 deletions temoa/components/flows.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,7 @@

def flow_variable_indices(
model: TemoaModel,
) -> (
set[tuple[Region, Period, Season, TimeOfDay, Commodity, Technology, Vintage, Commodity]] | None
):
) -> set[tuple[Region, Period, Season, TimeOfDay, Commodity, Technology, Vintage, Commodity]]:
return model.active_flow_rpsditvo


Expand All @@ -55,9 +53,7 @@ def flow_variable_annual_indices(

def flex_variable_indices(
model: TemoaModel,
) -> (
set[tuple[Region, Period, Season, TimeOfDay, Commodity, Technology, Vintage, Commodity]] | None
):
) -> set[tuple[Region, Period, Season, TimeOfDay, Commodity, Technology, Vintage, Commodity]]:
return model.active_flex_rpsditvo


Expand All @@ -69,17 +65,13 @@ def flex_variable_annual_indices(

def flow_in_storage_variable_indices(
model: TemoaModel,
) -> (
set[tuple[Region, Period, Season, TimeOfDay, Commodity, Technology, Vintage, Commodity]] | None
):
) -> set[tuple[Region, Period, Season, TimeOfDay, Commodity, Technology, Vintage, Commodity]]:
return model.active_flow_in_storage_rpsditvo


def curtailment_variable_indices(
model: TemoaModel,
) -> (
set[tuple[Region, Period, Season, TimeOfDay, Commodity, Technology, Vintage, Commodity]] | None
):
) -> set[tuple[Region, Period, Season, TimeOfDay, Commodity, Technology, Vintage, Commodity]]:
return model.active_curtailment_rpsditvo


Expand Down
Loading
Loading