Skip to content

Commit 4fbc1ff

Browse files
committed
Create separate functions for broadcasting and distributing timeslices
1 parent 88d40b4 commit 4fbc1ff

File tree

12 files changed

+87
-113
lines changed

12 files changed

+87
-113
lines changed

src/muse/constraints.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ def max_production(
446446
from xarray import ones_like, zeros_like
447447

448448
from muse.commodities import is_enduse
449-
from muse.timeslices import convert_timeslice
449+
from muse.timeslices import distribute_timeslice
450450

451451
if year is None:
452452
year = int(market.year.min())
@@ -465,7 +465,7 @@ def max_production(
465465
.sel(**kwargs)
466466
.drop_vars("technology")
467467
)
468-
capacity = convert_timeslice(techs.fixed_outputs) * techs.utilization_factor
468+
capacity = distribute_timeslice(techs.fixed_outputs) * techs.utilization_factor
469469
if "asset" not in capacity.dims and "asset" in search_space.dims:
470470
capacity = capacity.expand_dims(asset=search_space.asset)
471471
production = ones_like(capacity)
@@ -724,7 +724,7 @@ def minimum_service(
724724
from xarray import ones_like, zeros_like
725725

726726
from muse.commodities import is_enduse
727-
from muse.timeslices import convert_timeslice
727+
from muse.timeslices import distribute_timeslice
728728

729729
if "minimum_service_factor" not in technologies.data_vars:
730730
return None
@@ -747,7 +747,7 @@ def minimum_service(
747747
.sel(**kwargs)
748748
.drop_vars("technology")
749749
)
750-
capacity = convert_timeslice(techs.fixed_outputs) * techs.minimum_service_factor
750+
capacity = distribute_timeslice(techs.fixed_outputs) * techs.minimum_service_factor
751751
if "asset" not in capacity.dims:
752752
capacity = capacity.expand_dims(asset=search_space.asset)
753753
production = ones_like(capacity)
@@ -808,7 +808,7 @@ def lp_costs(technologies: xr.Dataset, costs: xr.DataArray) -> xr.Dataset:
808808
from xarray import zeros_like
809809

810810
from muse.commodities import is_enduse
811-
from muse.timeslices import convert_timeslice
811+
from muse.timeslices import distribute_timeslice
812812

813813
assert "year" not in technologies.dims
814814

@@ -821,7 +821,7 @@ def lp_costs(technologies: xr.Dataset, costs: xr.DataArray) -> xr.Dataset:
821821
selection["region"] = costs.region
822822
fouts = technologies.fixed_outputs.sel(selection).rename(technology="replacement")
823823

824-
production = zeros_like(costs * convert_timeslice(fouts))
824+
production = zeros_like(costs * distribute_timeslice(fouts))
825825
for dim in production.dims:
826826
if isinstance(production.get_index(dim), pd.MultiIndex):
827827
production = drop_timeslice(production)

src/muse/costs.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from muse.commodities import is_enduse, is_fuel, is_material, is_pollutant
1515
from muse.quantities import consumption
16-
from muse.timeslices import convert_timeslice
16+
from muse.timeslices import distribute_timeslice
1717
from muse.utilities import filter_input
1818

1919

@@ -96,7 +96,7 @@ def net_present_value(
9696
raw_revenues = (production * prices_non_env * rates).sum(("commodity", "year"))
9797

9898
# Cost of installed capacity
99-
installed_capacity_costs = convert_timeslice(
99+
installed_capacity_costs = distribute_timeslice(
100100
techs.cap_par * (capacity**techs.cap_exp),
101101
)
102102

@@ -118,7 +118,7 @@ def net_present_value(
118118
material_costs = (production * prices_material * rates).sum(("commodity", "year"))
119119

120120
# Fixed and Variable costs
121-
fixed_costs = convert_timeslice(
121+
fixed_costs = distribute_timeslice(
122122
techs.fix_par * (capacity**techs.fix_exp),
123123
)
124124
variable_costs = techs.var_par * (
@@ -256,7 +256,7 @@ def lifetime_levelized_cost_of_energy(
256256
fuels = is_fuel(technologies.comm_usage)
257257

258258
# Cost of installed capacity
259-
installed_capacity_costs = convert_timeslice(
259+
installed_capacity_costs = distribute_timeslice(
260260
techs.cap_par * (capacity**techs.cap_exp),
261261
)
262262

@@ -278,7 +278,7 @@ def lifetime_levelized_cost_of_energy(
278278
material_costs = (production * prices_material * rates).sum(("commodity", "year"))
279279

280280
# Fixed and Variable costs
281-
fixed_costs = convert_timeslice(
281+
fixed_costs = distribute_timeslice(
282282
techs.fix_par * (capacity**techs.fix_exp),
283283
)
284284
variable_costs = (
@@ -364,11 +364,11 @@ def annual_levelized_cost_of_energy(
364364
rates = techs.interest_rate / (1 - (1 + techs.interest_rate) ** (-life))
365365

366366
annualized_capital_costs = (
367-
convert_timeslice(techs.cap_par * rates) / techs.utilization_factor
367+
distribute_timeslice(techs.cap_par * rates) / techs.utilization_factor
368368
)
369369

370370
o_and_e_costs = (
371-
convert_timeslice(techs.fix_par + techs.var_par) / techs.utilization_factor
371+
distribute_timeslice(techs.fix_par + techs.var_par) / techs.utilization_factor
372372
)
373373

374374
fuel_costs = (techs.fixed_inputs * prices).sum("commodity")

src/muse/demand_share.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def new_and_retro(
145145
A_{a, s}^r = w_s\sum_i A_a^{r, i}
146146
147147
with :math:`w_s` a weight associated with each timeslice and determined via
148-
:py:func:`muse.timeslices.convert_timeslice`.
148+
:py:func:`muse.timeslices.distribute_timeslice`.
149149
150150
#. An intermediate quantity, the :py:func:`unmet demand
151151
<muse.demand_share.unmet_demand>` :math:`U` is defined from

src/muse/objectives.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -383,12 +383,12 @@ def lifetime_levelized_cost_of_energy(
383383
due to a zero utilisation factor.
384384
"""
385385
from muse.costs import lifetime_levelized_cost_of_energy as LCOE
386-
from muse.timeslices import convert_timeslice
386+
from muse.timeslices import distribute_timeslice
387387

388388
capacity = capacity_to_service_demand(technologies, demand)
389389
production = (
390390
capacity
391-
* convert_timeslice(technologies.fixed_outputs)
391+
* distribute_timeslice(technologies.fixed_outputs)
392392
* technologies.utilization_factor
393393
)
394394

@@ -416,12 +416,12 @@ def net_present_value(
416416
See :py:func:`muse.costs.net_present_value` for more details.
417417
"""
418418
from muse.costs import net_present_value as NPV
419-
from muse.timeslices import convert_timeslice
419+
from muse.timeslices import distribute_timeslice
420420

421421
capacity = capacity_to_service_demand(technologies, demand)
422422
production = (
423423
capacity
424-
* convert_timeslice(technologies.fixed_outputs)
424+
* distribute_timeslice(technologies.fixed_outputs)
425425
* technologies.utilization_factor
426426
)
427427

@@ -448,12 +448,12 @@ def net_present_cost(
448448
See :py:func:`muse.costs.net_present_cost` for more details.
449449
"""
450450
from muse.costs import net_present_cost as NPC
451-
from muse.timeslices import convert_timeslice
451+
from muse.timeslices import distribute_timeslice
452452

453453
capacity = capacity_to_service_demand(technologies, demand)
454454
production = (
455455
capacity
456-
* convert_timeslice(technologies.fixed_outputs)
456+
* distribute_timeslice(technologies.fixed_outputs)
457457
* technologies.utilization_factor
458458
)
459459

@@ -480,12 +480,12 @@ def equivalent_annual_cost(
480480
See :py:func:`muse.costs.equivalent_annual_cost` for more details.
481481
"""
482482
from muse.costs import equivalent_annual_cost as EAC
483-
from muse.timeslices import convert_timeslice
483+
from muse.timeslices import distribute_timeslice
484484

485485
capacity = capacity_to_service_demand(technologies, demand)
486486
production = (
487487
capacity
488-
* convert_timeslice(technologies.fixed_outputs)
488+
* distribute_timeslice(technologies.fixed_outputs)
489489
* technologies.utilization_factor
490490
)
491491

src/muse/outputs/mca.py

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def quantity(
3535
from muse.outputs.sector import market_quantity
3636
from muse.registration import registrator
3737
from muse.sectors import AbstractSector
38-
from muse.timeslices import convert_timeslice, drop_timeslice
38+
from muse.timeslices import distribute_timeslice, drop_timeslice
3939
from muse.utilities import multiindex_to_coords
4040

4141
OUTPUT_QUANTITY_SIGNATURE = Callable[
@@ -350,12 +350,10 @@ def sector_supply(sector: AbstractSector, market: xr.Dataset, **kwargs) -> pd.Da
350350
]
351351
agent_market.loc[dict(commodity=excluded)] = 0
352352

353-
result = convert_timeslice(
354-
supply(
355-
agent_market,
356-
capacity,
357-
technologies,
358-
),
353+
result = supply(
354+
agent_market,
355+
capacity,
356+
technologies,
359357
)
360358

361359
if "year" in result.dims:
@@ -580,13 +578,12 @@ def sector_consumption(
580578
]
581579
agent_market.loc[dict(commodity=excluded)] = 0
582580

583-
production = convert_timeslice(
584-
supply(
585-
agent_market,
586-
capacity,
587-
technologies,
588-
),
581+
production = supply(
582+
agent_market,
583+
capacity,
584+
technologies,
589585
)
586+
590587
prices = a.filter_input(market.prices, year=output_year)
591588
result = consumption(
592589
technologies=technologies, production=production, prices=prices
@@ -720,12 +717,10 @@ def sector_fuel_costs(
720717
year=output_year,
721718
).fillna(0.0)
722719

723-
production = convert_timeslice(
724-
supply(
725-
agent_market,
726-
capacity,
727-
technologies,
728-
),
720+
production = supply(
721+
agent_market,
722+
capacity,
723+
technologies,
729724
)
730725

731726
prices = a.filter_input(market.prices, year=output_year)
@@ -776,7 +771,7 @@ def sector_capital_costs(
776771
year=output_year,
777772
technology=capacity.technology,
778773
)
779-
data_agent = convert_timeslice(data.cap_par * (capacity**data.cap_exp))
774+
data_agent = distribute_timeslice(data.cap_par * (capacity**data.cap_exp))
780775
data_agent["agent"] = a.name
781776
data_agent["category"] = a.category
782777
data_agent["sector"] = getattr(sector, "name", "unnamed")
@@ -833,13 +828,12 @@ def sector_emission_costs(
833828
i = (np.where(envs))[0][0]
834829
red_envs = envs[i].commodity.values
835830
prices = a.filter_input(market.prices, year=output_year, commodity=red_envs)
836-
production = convert_timeslice(
837-
supply(
838-
agent_market,
839-
capacity,
840-
technologies,
841-
),
831+
production = supply(
832+
agent_market,
833+
capacity,
834+
technologies,
842835
)
836+
843837
total = production.sel(commodity=enduses).sum("commodity")
844838
data_agent = total * (allemissions * prices).sum("commodity")
845839
data_agent["agent"] = a.name
@@ -906,7 +900,7 @@ def sector_lcoe(sector: AbstractSector, market: xr.Dataset, **kwargs) -> pd.Data
906900
capacity = agent.filter_input(capacity_to_service_demand(demand, techs))
907901
production = (
908902
capacity
909-
* convert_timeslice(techs.fixed_outputs)
903+
* distribute_timeslice(techs.fixed_outputs)
910904
* techs.utilization_factor
911905
)
912906

@@ -983,7 +977,7 @@ def sector_eac(sector: AbstractSector, market: xr.Dataset, **kwargs) -> pd.DataF
983977
capacity = agent.filter_input(capacity_to_service_demand(demand, techs))
984978
production = (
985979
capacity
986-
* convert_timeslice(techs.fixed_outputs)
980+
* distribute_timeslice(techs.fixed_outputs)
987981
* techs.utilization_factor
988982
)
989983

src/muse/quantities.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ def gross_margin(
153153
- non-environmental commodities OUTPUTS are related to revenues.
154154
"""
155155
from muse.commodities import is_enduse, is_pollutant
156-
from muse.timeslices import convert_timeslice
156+
from muse.timeslices import distribute_timeslice
157157
from muse.utilities import broadcast_techs
158158

159159
tech = broadcast_techs( # type: ignore
@@ -190,7 +190,7 @@ def gross_margin(
190190
enduses = is_enduse(technologies.comm_usage)
191191

192192
# Variable costs depend on factors such as labour
193-
variable_costs = convert_timeslice(
193+
variable_costs = distribute_timeslice(
194194
var_par * ((fixed_outputs.sel(commodity=enduses)).sum("commodity")) ** var_exp,
195195
)
196196

@@ -340,7 +340,7 @@ def maximum_production(technologies: xr.Dataset, capacity: xr.DataArray, **filte
340340
filters and the set of technologies in `capacity`.
341341
"""
342342
from muse.commodities import is_enduse
343-
from muse.timeslices import convert_timeslice
343+
from muse.timeslices import distribute_timeslice
344344
from muse.utilities import broadcast_techs, filter_input
345345

346346
capa = filter_input(
@@ -352,7 +352,9 @@ def maximum_production(technologies: xr.Dataset, capacity: xr.DataArray, **filte
352352
ftechs = filter_input(
353353
btechs, **{k: v for k, v in filters.items() if k in btechs.dims}
354354
)
355-
result = capa * convert_timeslice(ftechs.fixed_outputs) * ftechs.utilization_factor
355+
result = (
356+
capa * distribute_timeslice(ftechs.fixed_outputs) * ftechs.utilization_factor
357+
)
356358
return result.where(is_enduse(result.comm_usage), 0)
357359

358360

@@ -543,7 +545,7 @@ def minimum_production(technologies: xr.Dataset, capacity: xr.DataArray, **filte
543545
the filters and the set of technologies in `capacity`.
544546
"""
545547
from muse.commodities import is_enduse
546-
from muse.timeslices import convert_timeslice
548+
from muse.timeslices import distribute_timeslice
547549
from muse.utilities import broadcast_techs, filter_input
548550

549551
capa = filter_input(
@@ -564,7 +566,9 @@ def minimum_production(technologies: xr.Dataset, capacity: xr.DataArray, **filte
564566
btechs, **{k: v for k, v in filters.items() if k in btechs.dims}
565567
)
566568
result = (
567-
capa * convert_timeslice(ftechs.fixed_outputs) * ftechs.minimum_service_factor
569+
capa
570+
* distribute_timeslice(ftechs.fixed_outputs)
571+
* ftechs.minimum_service_factor
568572
)
569573
return result.where(is_enduse(result.comm_usage), 0)
570574

@@ -574,10 +578,10 @@ def capacity_to_service_demand(
574578
technologies: xr.Dataset,
575579
) -> xr.DataArray:
576580
"""Minimum capacity required to fulfill the demand."""
577-
from muse.timeslices import convert_timeslice
581+
from muse.timeslices import distribute_timeslice
578582

579583
timeslice_outputs = (
580-
convert_timeslice(technologies.fixed_outputs.sel(commodity=demand.commodity))
584+
distribute_timeslice(technologies.fixed_outputs.sel(commodity=demand.commodity))
581585
* technologies.utilization_factor
582586
)
583587
capa_to_service_demand = demand / timeslice_outputs

src/muse/readers/csv.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def to_agent_share(name):
136136

137137
def read_technodata_timeslices(filename: Union[str, Path]) -> xr.Dataset:
138138
from muse.readers import camel_to_snake
139-
from muse.timeslices import convert_timeslice
139+
from muse.timeslices import TIMESLICE
140140

141141
csv = pd.read_csv(filename, float_precision="high", low_memory=False)
142142
csv = csv.rename(columns=camel_to_snake)
@@ -170,7 +170,7 @@ def read_technodata_timeslices(filename: Union[str, Path]) -> xr.Dataset:
170170
if item not in ["technology", "region", "year"]
171171
]
172172
result = result.stack(timeslice=timeslice_levels)
173-
result = convert_timeslice(result)
173+
result = result.sel(timeslice=TIMESLICE.timeslice)
174174
# sorts timeslices into the correct order
175175
return result
176176

@@ -607,7 +607,7 @@ def read_initial_market(
607607
"""Read projections, import and export csv files."""
608608
from logging import getLogger
609609

610-
from muse.timeslices import TIMESLICE, convert_timeslice
610+
from muse.timeslices import TIMESLICE, distribute_timeslice
611611

612612
# Projections must always be present
613613
if isinstance(projections, (str, Path)):
@@ -630,8 +630,8 @@ def read_initial_market(
630630
getLogger(__name__).info("Base year import not provided. Set to zero.")
631631
base_year_import = xr.zeros_like(projections)
632632

633-
base_year_export = convert_timeslice(base_year_export)
634-
base_year_import = convert_timeslice(base_year_import)
633+
base_year_export = distribute_timeslice(base_year_export)
634+
base_year_import = distribute_timeslice(base_year_import)
635635
base_year_export.name = "exports"
636636
base_year_import.name = "imports"
637637

0 commit comments

Comments
 (0)