Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
bf3346d
setting up new directory structure for clear public vs intermal api …
ParticularlyPythonicBS Oct 7, 2025
f371420
removing star imports from model.py, more work is needed to tame thi…
ParticularlyPythonicBS Oct 8, 2025
c30d544
small taming of the model file, considering moving to a component fo…
ParticularlyPythonicBS Oct 8, 2025
2dc439c
adding placeholder files for component structure
ParticularlyPythonicBS Oct 8, 2025
1b42d77
distributing temoa_initialize into components
ParticularlyPythonicBS Oct 8, 2025
927e047
distributing temoa_rules into components
ParticularlyPythonicBS Oct 8, 2025
ff6e71f
fixing linting errors in _internal
ParticularlyPythonicBS Oct 8, 2025
08448e8
fixing linting errors in components
ParticularlyPythonicBS Oct 8, 2025
5eb0b3d
splitting up CreateSparseDicts, storing the chunks in precompute for…
ParticularlyPythonicBS Oct 9, 2025
eea8271
moving the chunked from precompute to the component files
ParticularlyPythonicBS Oct 9, 2025
e3ab9bb
cleaning up capacity.py
ParticularlyPythonicBS Oct 9, 2025
eb71312
cleaning up commodities.py
ParticularlyPythonicBS Oct 9, 2025
6ade404
cleaning up costs.py
ParticularlyPythonicBS Oct 9, 2025
d7f69b4
cleaning up emissions.py
ParticularlyPythonicBS Oct 9, 2025
6c0185b
cleaning up flows.py
ParticularlyPythonicBS Oct 9, 2025
53462dd
cleaning up geography.py
ParticularlyPythonicBS Oct 9, 2025
f4c1125
cleaning up limits.py
ParticularlyPythonicBS Oct 9, 2025
53353a2
cleaning up operations and merging ramping into it
ParticularlyPythonicBS Oct 9, 2025
1a7d3bf
cleaning up reserves.py
ParticularlyPythonicBS Oct 9, 2025
3babdbe
cleaning up storage.py
ParticularlyPythonicBS Oct 9, 2025
93ed924
cleaning up technology.py
ParticularlyPythonicBS Oct 9, 2025
ec5aac5
cleaning up time.py
ParticularlyPythonicBS Oct 9, 2025
084077e
cleaning up utils.py
ParticularlyPythonicBS Oct 9, 2025
8b8f663
updated backwards compat temoa_model to not used temoa_rules or init…
ParticularlyPythonicBS Oct 10, 2025
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
Prev Previous commit
Next Next commit
small taming of the model file, considering moving to a component fo…
…rmalism instead of the type structure used
  • Loading branch information
ParticularlyPythonicBS committed Oct 8, 2025
commit c30d54470c79925f4c388209489480896f89db8e
79 changes: 78 additions & 1 deletion temoa/_internal/temoa_initialize.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
"""

from itertools import product as cross_product

from operator import itemgetter as iget
from sys import stderr as SE
from typing import TYPE_CHECKING, Iterable
Expand All @@ -47,6 +46,84 @@
# ---------------------------------------------------------------


# ============================================================================
# Public API - Functions intended for external import
# ============================================================================
__all__ = [
# Index creation functions for constraints and variables
'AnnualCommodityBalanceConstraintIndices',
'AnnualRetirementVariableIndices',
'BaseloadDiurnalConstraintIndices',
'CapacityAnnualConstraintIndices',
'CapacityAvailableVariableIndices',
'CapacityConstraintIndices',
'CapacityFactorTechIndices',
'CapacityVariableIndices',
'CommodityBalanceConstraintIndices',
'CostFixedIndices',
'CostVariableIndices',
'CurtailmentVariableIndices',
'DemandActivityConstraintIndices',
'EmissionActivityIndices',
'FlexVariableAnnualIndices',
'FlexVariablelIndices',
'FlowInStorageVariableIndices',
'FlowVariableAnnualIndices',
'FlowVariableIndices',
'LifetimeLoanProcessIndices',
'LifetimeProcessIndices',
'LimitDegrowthCapacityIndices',
'LimitDegrowthNewCapacityDeltaIndices',
'LimitDegrowthNewCapacityIndices',
'LimitGrowthCapacityIndices',
'LimitGrowthNewCapacityDeltaIndices',
'LimitGrowthNewCapacityIndices',
'LimitTechInputSplitAnnualConstraintIndices',
'LimitTechInputSplitAverageConstraintIndices',
'LimitTechInputSplitConstraintIndices',
'LimitTechOutputSplitAnnualConstraintIndices',
'LimitTechOutputSplitAverageConstraintIndices',
'LimitTechOutputSplitConstraintIndices',
'LinkedTechConstraintIndices',
'ModelProcessLifeIndices',
'RampDownDayConstraintIndices',
'RampDownSeasonConstraintIndices',
'RampUpDayConstraintIndices',
'RampUpSeasonConstraintIndices',
'RegionalExchangeCapacityConstraintIndices',
'ReserveMarginIndices',
'RetiredCapacityVariableIndices',
'SeasonalStorageConstraintIndices',
'SeasonalStorageLevelVariableIndices',
'StorageConstraintIndices',
'StorageLevelVariableIndices',
# Validation and initialization functions
'CheckCapacityFactorProcess',
'CheckEfficiencyIndices',
'CheckEfficiencyVariable',
'CreateDemands',
'CreateRegionalIndices',
'CreateSparseDicts',
'CreateSurvivalCurve',
'CreateTimeSeasonSequential',
'CreateTimeSequence',
# Default value functions
'get_default_capacity_factor',
'get_default_loan_rate',
'get_default_process_lifetime',
'get_default_survival',
'get_loan_life',
# Set initialization functions
'init_set_time_optimize',
'init_set_vintage_exist',
'init_set_vintage_optimize',
# Validation functions
'validate_SegFrac',
'validate_time',
'validate_TimeNext',
]


def isValidProcess(M: 'TemoaModel', r, p, i, t, v, o):
"""\
Returns a boolean (True or False) indicating whether, in any given period, a
Expand Down
73 changes: 73 additions & 0 deletions temoa/_internal/temoa_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,79 @@
from temoa.core.model import TemoaModel

logger = getLogger(__name__)


# ============================================================================
# Public API - Functions intended for external import
# ============================================================================
__all__ = [
# Core capacity constraints
'AdjustedCapacity_Constraint',
'Capacity_Constraint',
'CapacityAnnual_Constraint',
'CapacityAvailableByPeriodAndTech_Constraint',
# Activity and flow constraints
'Demand_Constraint',
'DemandActivity_Constraint',
'CommodityBalance_Constraint',
'AnnualCommodityBalance_Constraint',
# Retirement constraints
'AnnualRetirement_Constraint',
# Storage constraints
'StorageEnergy_Constraint',
'StorageEnergyUpperBound_Constraint',
'SeasonalStorageEnergy_Constraint',
'SeasonalStorageEnergyUpperBound_Constraint',
'StorageChargeRate_Constraint',
'StorageDischargeRate_Constraint',
'StorageThroughput_Constraint',
# Ramping constraints
'BaseloadDiurnal_Constraint',
'RampUpDay_Constraint',
'RampDownDay_Constraint',
'RampUpSeason_Constraint',
'RampDownSeason_Constraint',
# Limit constraints (capacity, activity, emissions, etc.)
'LimitActivity_Constraint',
'LimitActivityShare_Constraint',
'LimitAnnualCapacityFactor_Constraint',
'LimitCapacity_Constraint',
'LimitCapacityShare_Constraint',
'LimitEmission_Constraint',
'LimitNewCapacity_Constraint',
'LimitNewCapacityShare_Constraint',
'LimitResource_Constraint',
'LimitSeasonalCapacityFactor_Constraint',
'LimitStorageFraction_Constraint',
# Technology split constraints
'LimitTechInputSplit_Constraint',
'LimitTechInputSplitAnnual_Constraint',
'LimitTechInputSplitAverage_Constraint',
'LimitTechOutputSplit_Constraint',
'LimitTechOutputSplitAnnual_Constraint',
'LimitTechOutputSplitAverage_Constraint',
# Growth/degrowth constraints
'LimitDegrowthCapacityConstraint_rule',
'LimitDegrowthNewCapacityConstraint_rule',
'LimitDegrowthNewCapacityDeltaConstraint_rule',
'LimitGrowthCapacityConstraint_rule',
'LimitGrowthNewCapacityConstraint_rule',
'LimitGrowthNewCapacityDeltaConstraint_rule',
# Regional and special constraints
'RegionalExchangeCapacity_Constraint',
'RenewablePortfolioStandard_Constraint',
'ReserveMargin_Constraint',
'LinkedEmissionsTech_Constraint',
# Parameter calculation rules
'ParamLoanAnnualize_rule',
'ParamPeriodLength',
'ParamProcessLifeFraction_rule',
'SegFracPerSeason_rule',
# Objective function
'TotalCost_rule',
]


# ---------------------------------------------------------------
# Define the derived variables used in the objective function
# and constraints below.
Expand Down
28 changes: 26 additions & 2 deletions temoa/core/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
)

from temoa._internal.temoa_initialize import (
# ============================================================================
# Index creation functions for constraints and variables
# ============================================================================
AnnualCommodityBalanceConstraintIndices,
AnnualRetirementVariableIndices,
BaseloadDiurnalConstraintIndices,
Expand Down Expand Up @@ -79,36 +82,48 @@
SeasonalStorageLevelVariableIndices,
StorageConstraintIndices,
StorageLevelVariableIndices,
# Default value functions
get_default_capacity_factor,
get_default_loan_rate,
get_default_process_lifetime,
get_default_survival,
get_loan_life,
# Set initialization functions
init_set_time_optimize,
init_set_vintage_exist,
init_set_vintage_optimize,
# Validation functions
validate_SegFrac,
validate_time,
validate_TimeNext,
)

# from temoa._internal.temoa_rules import *
# ============================================================================
# Temoa Constraint Functions
# Core model constraints and business logic rules
# ============================================================================
from temoa._internal.temoa_rules import (
# Core capacity constraints
AdjustedCapacity_Constraint,
AnnualCommodityBalance_Constraint,
# Retirement constraints
AnnualRetirement_Constraint,
# Ramping constraints
BaseloadDiurnal_Constraint,
Capacity_Constraint,
CapacityAnnual_Constraint,
CapacityAvailableByPeriodAndTech_Constraint,
CommodityBalance_Constraint,
# Activity and flow constraints
Demand_Constraint,
DemandActivity_Constraint,
# Limit constraints (capacity, activity, emissions, etc.)
LimitActivity_Constraint,
LimitActivityShare_Constraint,
LimitAnnualCapacityFactor_Constraint,
LimitCapacity_Constraint,
LimitCapacityShare_Constraint,
# Growth/degrowth constraints
LimitDegrowthCapacityConstraint_rule,
LimitDegrowthNewCapacityConstraint_rule,
LimitDegrowthNewCapacityDeltaConstraint_rule,
Expand All @@ -121,20 +136,23 @@
LimitResource_Constraint,
LimitSeasonalCapacityFactor_Constraint,
LimitStorageFraction_Constraint,
# Technology split constraints
LimitTechInputSplit_Constraint,
LimitTechInputSplitAnnual_Constraint,
LimitTechInputSplitAverage_Constraint,
LimitTechOutputSplit_Constraint,
LimitTechOutputSplitAnnual_Constraint,
LimitTechOutputSplitAverage_Constraint,
LinkedEmissionsTech_Constraint,
# Parameter calculation rules
ParamLoanAnnualize_rule,
ParamPeriodLength,
ParamProcessLifeFraction_rule,
RampDownDay_Constraint,
RampDownSeason_Constraint,
RampUpDay_Constraint,
RampUpSeason_Constraint,
# Regional and special constraints
RegionalExchangeCapacity_Constraint,
RenewablePortfolioStandard_Constraint,
ReserveMargin_Constraint,
Expand All @@ -143,16 +161,22 @@
SegFracPerSeason_rule,
StorageChargeRate_Constraint,
StorageDischargeRate_Constraint,
# Storage constraints
StorageEnergy_Constraint,
StorageEnergyUpperBound_Constraint,
StorageThroughput_Constraint,
# Objective function
TotalCost_rule,
)

# ============================================================================
# Validation Functions
# Input validation and data integrity checks
# ============================================================================
from temoa.model_checking.validators import (
no_slash_or_pipe,
region_check,
region_group_check,
# validate_CapacityFactorProcess,
validate_0to1,
validate_Efficiency,
validate_linked_tech,
Expand Down
15 changes: 15 additions & 0 deletions temoa/model_checking/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,21 @@
logger = getLogger(__name__)


# ============================================================================
# Public API - Functions intended for external import
# ============================================================================
__all__ = [
'no_slash_or_pipe',
'region_check',
'region_group_check',
'validate_0to1',
'validate_Efficiency',
'validate_linked_tech',
'validate_ReserveMargin',
'validate_tech_sets',
]
Comment on lines +42 to +54
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Good addition of public API surface declaration.

The __all__ export list clearly defines the public API for this module, which improves discoverability and helps prevent accidental imports of internal functions.

Consider sorting the __all__ list alphabetically for consistency, as suggested by the static analysis tool:

 __all__ = [
-    'no_slash_or_pipe',
-    'region_check',
-    'region_group_check',
     'validate_0to1',
     'validate_Efficiency',
     'validate_linked_tech',
     'validate_ReserveMargin',
     'validate_tech_sets',
+    'no_slash_or_pipe',
+    'region_check',
+    'region_group_check',
 ]

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 Ruff (0.13.3)

45-54: __all__ is not sorted

Apply an isort-style sorting to __all__

(RUF022)

🤖 Prompt for AI Agents
In temoa/model_checking/validators.py around lines 42 to 54, the __all__ list is
defined but not alphabetically ordered; reorder the entries alphabetically
(case-sensitive as in the file) so the exported names are listed in sorted order
to match the static analysis recommendation and improve consistency.



def validate_linked_tech(M: 'TemoaModel') -> bool:
"""
A validation that for all the linked techs, they have the same lifetime in each possible vintage
Expand Down