diff --git a/src/muse/filters.py b/src/muse/filters.py index 1b9d351a..29942c80 100644 --- a/src/muse/filters.py +++ b/src/muse/filters.py @@ -436,13 +436,25 @@ def initialize_from_technologies( ("asset", demand.asset.values), ("replacement", technologies.technology.values), ) - return xr.DataArray( + search_space = xr.DataArray( np.ones(tuple(len(u[1]) for u in coords), dtype=bool), coords=coords, dims=[u[0] for u in coords], name="search_space", ) + # Only consider technologies that produce demanded commodities + demanded_commodities = (demand > 0).any("timeslice") + produces_commodity = (technologies.fixed_outputs > 0).rename( + technology="replacement" + ) + if "region" in produces_commodity.dims: + produces_commodity = produces_commodity.any("region") + produces_demanded_commodity = (produces_commodity * demanded_commodities).any( + "commodity" + ) + return search_space & produces_demanded_commodity + @register_initializer(name="from_assets") def initialize_from_assets( diff --git a/tests/test_agents.py b/tests/test_agents.py index 764068a2..49dab110 100644 --- a/tests/test_agents.py +++ b/tests/test_agents.py @@ -144,7 +144,11 @@ def test_run_retro_agent(retro_agent, technologies, agent_market, demand_share): technologies.max_capacity_growth[:] = retro_agent.assets.capacity.sum() * 100 investment_year = int(agent_market.year[1]) - retro_agent.next(technologies.sel(year=investment_year), agent_market, demand_share) + retro_agent.next( + technologies.sel(year=investment_year).isel(region=0), + agent_market.isel(region=0), + demand_share, + ) def test_merge_assets(assets): diff --git a/tests/test_filters.py b/tests/test_filters.py index 40edc423..c98744a3 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -194,12 +194,18 @@ def test_init_from_tech(demand_share, technologies, agent_market): agent = namedtuple("DummyAgent", ["tolerance"])(tolerance=1e-8) + # All technologies produce demanded commodities space = initialize_from_technologies(agent, demand_share, technologies=technologies) assert set(space.dims) == {"asset", "replacement"} assert (space.asset.values == demand_share.asset.values).all() assert (space.replacement.values == technologies.technology.values).all() assert space.all() + # No technology produces demanded commodities + technologies.fixed_outputs[:] = 0 + space = initialize_from_technologies(agent, demand_share, technologies=technologies) + assert not space.any() + def test_init_from_asset(technologies, rng): from collections import namedtuple