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
9 changes: 8 additions & 1 deletion assume/common/market_objects.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,9 +156,16 @@ def __hash__(self):

def __post_init__(self):
"""
Post-initialization checks for deprecated key "solver" in param_dict.
Post-initialization checks for checks on failing initializations.
"""

if "" in self.additional_fields:
warn(
"Empty string '' found in 'additional_fields' and will be ignored.",
UserWarning,
)
self.additional_fields = [f for f in self.additional_fields if f != ""]

if "solver" in self.param_dict:
warn(
"The key 'solver' in 'param_dict' is deprecated and may be removed in future versions. "
Expand Down
2 changes: 1 addition & 1 deletion assume/markets/base_market.py
Original file line number Diff line number Diff line change
Expand Up @@ -670,7 +670,7 @@ async def clear_market(self, market_products: list[MarketProduct]):
0,
)

self.open_auctions - set(market_products)
self.open_auctions -= set(market_products)

accepted_orderbook = sorted(
accepted_orderbook, key=lambda x: str(x["agent_addr"])
Expand Down
15 changes: 7 additions & 8 deletions assume/strategies/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,7 @@
EnergyNaiveStrategy,
ExchangeEnergyNaiveStrategy,
EnergyHeuristicElasticStrategy,
DsmCapacityHeuristicBalancingPosStrategy,
DsmCapacityHeuristicBalancingNegStrategy,
DsmCapacityHeuristicBalancingStrategy,
)
from assume.strategies.interactive_strategies import EnergyInteractiveStrategy
from assume.strategies.dmas_powerplant import EnergyOptimizationDmasStrategy
Expand All @@ -54,8 +53,8 @@
"flexable_eom_linked": EnergyHeuristicFlexableLinkedStrategy,
"flexable_neg_crm_storage": StorageCapacityHeuristicBalancingNegStrategy,
"flexable_pos_crm_storage": StorageCapacityHeuristicBalancingPosStrategy,
"pos_crm_dsm": DsmCapacityHeuristicBalancingPosStrategy,
"neg_crm_dsm": DsmCapacityHeuristicBalancingNegStrategy,
"pos_crm_dsm": DsmCapacityHeuristicBalancingStrategy,
"neg_crm_dsm": DsmCapacityHeuristicBalancingStrategy,
"naive_redispatch": EnergyNaiveRedispatchStrategy,
"naive_da_dsm": DsmEnergyOptimizationStrategy,
"naive_redispatch_dsm": DsmEnergyNaiveRedispatchStrategy,
Expand All @@ -78,10 +77,10 @@
"storage_energy_heuristic_flexable": StorageEnergyHeuristicFlexableStrategy,
"storage_capacity_heuristic_balancing_neg": StorageCapacityHeuristicBalancingNegStrategy,
"storage_capacity_heuristic_balancing_pos": StorageCapacityHeuristicBalancingPosStrategy,
"household_capacity_heuristic_balancing_pos": DsmCapacityHeuristicBalancingPosStrategy,
"industry_capacity_heuristic_balancing_pos": DsmCapacityHeuristicBalancingPosStrategy,
"household_capacity_heuristic_balancing_neg": DsmCapacityHeuristicBalancingNegStrategy,
"industry_capacity_heuristic_balancing_neg": DsmCapacityHeuristicBalancingNegStrategy,
"household_capacity_heuristic_balancing_pos": DsmCapacityHeuristicBalancingStrategy,
"industry_capacity_heuristic_balancing_pos": DsmCapacityHeuristicBalancingStrategy,
"household_capacity_heuristic_balancing_neg": DsmCapacityHeuristicBalancingStrategy,
"industry_capacity_heuristic_balancing_neg": DsmCapacityHeuristicBalancingStrategy,
"powerplant_energy_naive_redispatch": EnergyNaiveRedispatchStrategy,
"demand_energy_naive_redispatch": EnergyNaiveRedispatchStrategy,
"household_energy_optimization": DsmEnergyOptimizationStrategy,
Expand Down
43 changes: 2 additions & 41 deletions assume/strategies/naive_strategies.py
Original file line number Diff line number Diff line change
Expand Up @@ -529,9 +529,9 @@ def find_first_block_bid(
return volume


class DsmCapacityHeuristicBalancingPosStrategy(MinMaxStrategy):
class DsmCapacityHeuristicBalancingStrategy(MinMaxStrategy):
"""
Strategy for Positive CRM Reserve (Demand Side, i.e., up & down, symmetric).
Strategy for Positive/Negative CRM Reserve (Demand Side, i.e., up & down, symmetric).
"""

def calculate_bids(self, unit, market_config, product_tuples, **kwargs):
Expand Down Expand Up @@ -561,45 +561,6 @@ def calculate_bids(self, unit, market_config, product_tuples, **kwargs):
"price": 0, # or unit.calculate_marginal_cost(...)
"volume": symmetric_capacity,
"unit_id": unit.id,
"market_id": "CRM_pos",
}
)
return self.remove_empty_bids(bids)


class DsmCapacityHeuristicBalancingNegStrategy(MinMaxStrategy):
"""
Strategy for Negative CRM Reserve (Demand Side, i.e., up & down, symmetric).
"""

def calculate_bids(self, unit, market_config, product_tuples, **kwargs):
# IDENTICAL LOGIC as POS, since symmetric in Germany (volume is symmetric)
# If you ever want to do *only* neg or pos (asymmetric), just change which cap you use!
bids = []
max_power = unit.max_plant_capacity
min_power = unit.min_plant_capacity

for product in product_tuples:
start, end, only_hours = product
block_times = [dt for dt in unit.index.get_date_list() if start <= dt < end]

up_caps = []
down_caps = []
for t in block_times:
flex = unit.flex_power_requirement.at[t]
up_caps.append(max_power - flex)
down_caps.append(flex - min_power)
symmetric_capacity = min(min(up_caps), min(down_caps))
if symmetric_capacity > 0:
bids.append(
{
"start_time": start,
"end_time": end,
"only_hours": only_hours,
"price": 0,
"volume": symmetric_capacity,
"unit_id": unit.id,
"market_id": "CRM_neg",
}
)
return self.remove_empty_bids(bids)
3 changes: 1 addition & 2 deletions docs/source/bidding_strategies.rst
Original file line number Diff line number Diff line change
Expand Up @@ -180,8 +180,7 @@ storage_energy_optimization_dmas EOM Storage strateg
Optimization method API references:

- :py:meth:`assume.strategies.naive_strategies.DsmEnergyOptimizationStrategy`
- :py:meth:`assume.strategies.naive_strategies.DsmCapacityHeuristicBalancingPosStrategy`
- :py:meth:`assume.strategies.naive_strategies.DsmCapacityHeuristicBalancingNegStrategy`
- :py:meth:`assume.strategies.naive_strategies.DsmCapacityHeuristicBalancingStrategy`
- :py:meth:`assume.strategies.dmas_powerplant.EnergyOptimizationDmasStrategy`
- :py:meth:`assume.strategies.dmas_storage.StorageEnergyOptimizationDmasStrategy`

Expand Down
14 changes: 6 additions & 8 deletions examples/notebooks/10a_DSU_and_flexibility.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -1516,9 +1516,7 @@
"outputs": [],
"source": [
"from assume.strategies.naive_strategies import (\n",
" DsmCapacityHeuristicBalancingNegStrategy,\n",
" # EnergyNaiveStrategy,\n",
" DsmCapacityHeuristicBalancingPosStrategy,\n",
" DsmCapacityHeuristicBalancingStrategy,\n",
" # EnergyNaiveProfileStrategy,\n",
" DsmEnergyNaiveRedispatchStrategy,\n",
" DsmEnergyOptimizationStrategy,\n",
Expand All @@ -1527,8 +1525,8 @@
"\n",
"bidding_strategies: dict[str, BaseStrategy] = {\n",
" \"industry_energy_optimization\": DsmEnergyOptimizationStrategy,\n",
" \"industry_capacity_heuristic_balancing_pos\": DsmCapacityHeuristicBalancingPosStrategy,\n",
" \"industry_capacity_heuristic_balancing_neg\": DsmCapacityHeuristicBalancingNegStrategy,\n",
" \"industry_capacity_heuristic_balancing_pos\": DsmCapacityHeuristicBalancingStrategy,\n",
" \"industry_capacity_heuristic_balancing_neg\": DsmCapacityHeuristicBalancingStrategy,\n",
" \"industry_energy_naive_redispatch\": DsmEnergyNaiveRedispatchStrategy,\n",
"}"
]
Expand Down Expand Up @@ -1705,7 +1703,7 @@
"paper_plant_1.min_plant_capacity = components[\"boiler\"].min_power\n",
"\n",
"# 2. Instantiate the positive CRM bidding strategy\n",
"strategy = DsmCapacityHeuristicBalancingPosStrategy()\n",
"strategy = DsmCapacityHeuristicBalancingStrategy()\n",
"\n",
"# 3. Calculate market bids using the agent's optimized flexibility\n",
"bids = strategy.calculate_bids(\n",
Expand Down Expand Up @@ -2897,7 +2895,7 @@
"provenance": []
},
"kernelspec": {
"display_name": "assume3",
"display_name": "assume",
"language": "python",
"name": "python3"
},
Expand All @@ -2911,7 +2909,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.12"
"version": "3.13.7"
}
},
"nbformat": 4,
Expand Down
11 changes: 5 additions & 6 deletions tests/test_steam_plant.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@
from assume.common.fast_pandas import FastSeries
from assume.common.forecaster import SteamgenerationForecaster
from assume.strategies.naive_strategies import (
DsmCapacityHeuristicBalancingNegStrategy,
DsmCapacityHeuristicBalancingPosStrategy,
DsmCapacityHeuristicBalancingStrategy,
DsmEnergyOptimizationStrategy,
)
from assume.units.steam_generation_plant import SteamPlant
Expand Down Expand Up @@ -596,8 +595,8 @@ def steam_plant_with_crm_flex(steam_plant_components_with_hp_b):
market_prices={"EOM": 0},
)
bidding_strategy = {
"CRM_pos": DsmCapacityHeuristicBalancingPosStrategy(),
"CRM_neg": DsmCapacityHeuristicBalancingNegStrategy(),
"CRM_pos": DsmCapacityHeuristicBalancingStrategy(),
"CRM_neg": DsmCapacityHeuristicBalancingStrategy(),
}
plant = SteamPlant(
id="A360",
Expand Down Expand Up @@ -633,13 +632,13 @@ def test_crm_block_flexibility_and_bidding(steam_plant_with_crm_flex):
product_tuples.append((index[i], index[i + block_length], None))

# --- POSITIVE CRM ---
pos_strategy = DsmCapacityHeuristicBalancingPosStrategy()
pos_strategy = DsmCapacityHeuristicBalancingStrategy()
pos_bids = pos_strategy.calculate_bids(
steam_plant_with_crm_flex, market_config, product_tuples
)
assert isinstance(pos_bids, list)
# --- NEGATIVE CRM ---
neg_strategy = DsmCapacityHeuristicBalancingNegStrategy()
neg_strategy = DsmCapacityHeuristicBalancingStrategy()
neg_bids = neg_strategy.calculate_bids(
steam_plant_with_crm_flex, market_config, product_tuples
)
Expand Down
Loading