From b25a65c7047d9e550a81fe3f65c4232be11c69b8 Mon Sep 17 00:00:00 2001 From: Tom Bland Date: Tue, 25 Mar 2025 11:42:07 +0000 Subject: [PATCH 1/4] Limit search space to relevant techs (experimental) --- src/muse/filters.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/muse/filters.py b/src/muse/filters.py index 1b9d351a..686417af 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) + .any(dim="region") + .rename(technology="replacement") + ) + produces_demanded_commodity = (produces_commodity * demanded_commodities).any( + "commodity" + ) + return search_space & produces_demanded_commodity + @register_initializer(name="from_assets") def initialize_from_assets( From dbbd18205489cb44d40e28e48545c3f9d6a83274 Mon Sep 17 00:00:00 2001 From: Tom Bland Date: Wed, 26 Mar 2025 15:34:46 +0000 Subject: [PATCH 2/4] New test --- tests/test_filters.py | 6 ++++++ 1 file changed, 6 insertions(+) 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 From 85579104b1ad7e2b7be6ed081ee48c88d87cbc57 Mon Sep 17 00:00:00 2001 From: Tom Bland Date: Wed, 26 Mar 2025 15:35:19 +0000 Subject: [PATCH 3/4] Attempt to fix failing test --- src/muse/agents/agent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/muse/agents/agent.py b/src/muse/agents/agent.py index 15801bd9..7369b8ba 100644 --- a/src/muse/agents/agent.py +++ b/src/muse/agents/agent.py @@ -72,7 +72,7 @@ def filter_input( """ if "region" in dataset.dims and "region" not in kwargs: kwargs["region"] = self.region - return dataset.sel(**kwargs) + return dataset.sel(**kwargs, drop=True) @abstractmethod def next( From 783f06da9bbe4ca15f61fcc71e44d9ad50293f13 Mon Sep 17 00:00:00 2001 From: Tom Bland Date: Wed, 26 Mar 2025 15:58:41 +0000 Subject: [PATCH 4/4] Another attempt at keeping test happy --- src/muse/agents/agent.py | 2 +- src/muse/filters.py | 8 ++++---- tests/test_agents.py | 6 +++++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/muse/agents/agent.py b/src/muse/agents/agent.py index 7369b8ba..15801bd9 100644 --- a/src/muse/agents/agent.py +++ b/src/muse/agents/agent.py @@ -72,7 +72,7 @@ def filter_input( """ if "region" in dataset.dims and "region" not in kwargs: kwargs["region"] = self.region - return dataset.sel(**kwargs, drop=True) + return dataset.sel(**kwargs) @abstractmethod def next( diff --git a/src/muse/filters.py b/src/muse/filters.py index 686417af..29942c80 100644 --- a/src/muse/filters.py +++ b/src/muse/filters.py @@ -445,11 +445,11 @@ def initialize_from_technologies( # Only consider technologies that produce demanded commodities demanded_commodities = (demand > 0).any("timeslice") - produces_commodity = ( - (technologies.fixed_outputs > 0) - .any(dim="region") - .rename(technology="replacement") + 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" ) diff --git a/tests/test_agents.py b/tests/test_agents.py index 6c6b9689..c7c582ea 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):