From 73e587ba7ffc81b9822079ee989ab19df936789d Mon Sep 17 00:00:00 2001 From: Tucker Alban Date: Mon, 24 Apr 2023 12:57:51 -0400 Subject: [PATCH] Actor vehicle name same as configuration. (#1957) * Actor vehicle now exactly named. * Update changelog. * Make sure that actor names are unique. * Fix validation for case with no social agent actors * Undo headless false. --- CHANGELOG.md | 1 + .../sumo/intersections/6lane/scenario.py | 26 ++++++----- .../sumo/tests/multi_agents_loop/scenario.py | 44 +++++++------------ smarts/core/agent_manager.py | 15 +++++-- smarts/core/bubble_manager.py | 5 ++- smarts/core/data_model.py | 2 +- smarts/core/scenario.py | 2 +- smarts/core/tests/test_smarts_frame_rate.py | 40 +++++++++++------ smarts/core/vehicle_index.py | 4 +- .../10_agents_to_n_roads/10_roads/scenario.py | 18 ++++---- .../10_agents_to_n_roads/1_roads/scenario.py | 18 ++++---- .../10_agents_to_n_roads/20_roads/scenario.py | 18 ++++---- .../10_agents_to_n_roads/50_roads/scenario.py | 18 ++++---- .../10_replays/scenario.py | 18 ++++---- .../1_replay/scenario.py | 18 ++++---- .../20_replays/scenario.py | 18 ++++---- .../50_replays/scenario.py | 18 ++++---- .../diagnostic/n_agents/10_agents/scenario.py | 20 +++++---- .../diagnostic/n_agents/1_agents/scenario.py | 20 +++++---- .../diagnostic/n_agents/20_agents/scenario.py | 20 +++++---- .../diagnostic/n_agents/50_agents/scenario.py | 20 +++++---- smarts/sstudio/types.py | 21 ++++++++- 22 files changed, 222 insertions(+), 162 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ac15d158f..dbd316b834 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,7 @@ Copy and pasting the git commit messages is __NOT__ enough. - The trap manager, `TrapManager`, is now a subclass of `ActorCaptureManager`. - Considering lane-change time ranges between 3s and 6s, assuming a speed of 13.89m/s, the via sensor lane acquisition range was increased from 40m to 80m, for better driving ability. - Modified naming of benchmark used in NeurIPS 2022 from driving-smarts-competition-env to driving-smarts-v2022. +- Social agent actor vehicles are now exactly named the same as the `name` of the actor. - Sstudio generated scenario vehicle traffic ids are now shortened. - ChaseViaPoints zoo agent uses unconstrained path change command, instead of being constrained to [-1, 0, +1] path change commands used previously. - Made the metrics module configurable by supplying parameters through a `Params` class. diff --git a/scenarios/sumo/intersections/6lane/scenario.py b/scenarios/sumo/intersections/6lane/scenario.py index 119596f25d..50c8e8ee76 100644 --- a/scenarios/sumo/intersections/6lane/scenario.py +++ b/scenarios/sumo/intersections/6lane/scenario.py @@ -4,14 +4,16 @@ from smarts.sstudio import gen_scenario from smarts.sstudio.types import Mission, Route, Scenario, SocialAgentActor -actors = [ - SocialAgentActor( - name=f"non-interactive-agent-{speed}-v0", - agent_locator="zoo.policies:non-interactive-agent-v0", - policy_kwargs={"speed": speed}, - ) - for speed in [10, 30, 80] -] + +def actor_gen(id_): + return [ + SocialAgentActor( + name=f"{id_}-non-interactive-agent-{speed}-v0", + agent_locator="zoo.policies:non-interactive-agent-v0", + policy_kwargs={"speed": speed}, + ) + for speed in [10, 30, 80] + ] def to_mission(start_edge, end_edge): @@ -22,10 +24,10 @@ def to_mission(start_edge, end_edge): gen_scenario( Scenario( social_agent_missions={ - "group-1": (actors, [to_mission("edge-north-NS", "edge-south-NS")]), - "group-2": (actors, [to_mission("edge-west-WE", "edge-east-WE")]), - "group-3": (actors, [to_mission("edge-east-EW", "edge-west-EW")]), - "group-4": (actors, [to_mission("edge-south-SN", "edge-north-SN")]), + "group-1": (actor_gen(1), [to_mission("edge-north-NS", "edge-south-NS")]), + "group-2": (actor_gen(2), [to_mission("edge-west-WE", "edge-east-WE")]), + "group-3": (actor_gen(3), [to_mission("edge-east-EW", "edge-west-EW")]), + "group-4": (actor_gen(4), [to_mission("edge-south-SN", "edge-north-SN")]), } ), output_dir=Path(__file__).parent, diff --git a/scenarios/sumo/tests/multi_agents_loop/scenario.py b/scenarios/sumo/tests/multi_agents_loop/scenario.py index 95915aa073..3c308d8f20 100644 --- a/scenarios/sumo/tests/multi_agents_loop/scenario.py +++ b/scenarios/sumo/tests/multi_agents_loop/scenario.py @@ -21,40 +21,30 @@ ] ) -laner_agent = t.SocialAgentActor( - name="keep-lane-agent", - agent_locator="zoo.policies:keep-lane-agent-v0", -) -buddha_agent = t.SocialAgentActor( - name="buddha-agent", - agent_locator="scenarios.sumo.tests.multi_agents_loop.agent_prefabs:buddha-agent-v0", -) +def make_laner(id_): + return t.SocialAgentActor( + name=f"keep-lane-agent_{id_}", + agent_locator="zoo.policies:keep-lane-agent-v0", + ) + + +def make_buddha(id_): + return t.SocialAgentActor( + name=f"buddha-actor_{id_}", + agent_locator="scenarios.sumo.tests.multi_agents_loop.agent_prefabs:buddha-agent-v0", + ) + gen_scenario( t.Scenario( traffic={"basic": traffic}, social_agent_missions={ - "group_1": ( - [laner_agent, buddha_agent], - [t.Mission(route=t.RandomRoute())], - ), - "group_2": ( - [laner_agent, buddha_agent], - [t.Mission(route=t.RandomRoute())], - ), - "group_3": ( - [laner_agent, buddha_agent], - [t.Mission(route=t.RandomRoute())], - ), - "group_4": ( - [laner_agent, buddha_agent], - [t.Mission(route=t.RandomRoute())], - ), - "group_5": ( - [laner_agent, buddha_agent], + f"group_{i}": ( + [make_laner(i), make_buddha(i)], [t.Mission(route=t.RandomRoute())], - ), + ) + for i in range(1, 6) }, ), output_dir=Path(__file__).parent, diff --git a/smarts/core/agent_manager.py b/smarts/core/agent_manager.py index e363ccc99e..934242551c 100644 --- a/smarts/core/agent_manager.py +++ b/smarts/core/agent_manager.py @@ -71,7 +71,7 @@ def __init__(self, sim, interfaces, zoo_addrs=None): # TODO: This field is only for social agents, but is being used as if it were # for any agent. Revisit the accessors. - self._social_agent_data_models = {} + self._social_agent_data_models: Dict[str, SocialAgent] = {} # We send observations and receive actions for all values in this dictionary self._remote_social_agents = {} @@ -528,7 +528,7 @@ def _start_keep_alive_boid_agents(self): actor = bubble.actor social_agent_data_model = SocialAgent( id=SocialAgentId.new(actor.name), - name=actor.name, + actor_name=actor.name, is_boid=True, is_boid_keep_alive=True, agent_locator=actor.agent_locator, @@ -573,7 +573,12 @@ def add_and_emit_social_agent( return True def _add_agent( - self, agent_id, agent_interface, agent_model, boid=False, trainable=True + self, + agent_id, + agent_interface, + agent_model: SocialAgent, + boid=False, + trainable=True, ): # TODO: Disentangle what is entangled below into: # 1. AgentState initialization, @@ -612,7 +617,9 @@ def _add_agent( scenario.surface_patches, agent_model.initial_speed, boid=boid, + vehicle_id=agent_model.actor_name, ) + role = ActorRole.EgoAgent if trainable else ActorRole.SocialAgent for provider in sim.providers: if agent_interface.action not in provider.actions: @@ -702,7 +709,7 @@ def agent_name(self, agent_id: str) -> str: if agent_id not in self._social_agent_data_models: return "" - return self._social_agent_data_models[agent_id].name + return self._social_agent_data_models[agent_id].actor_name def is_boid_agent(self, agent_id: str) -> bool: """Check if an agent is a boid agent""" diff --git a/smarts/core/bubble_manager.py b/smarts/core/bubble_manager.py index 6a4279e16e..20ef36f641 100644 --- a/smarts/core/bubble_manager.py +++ b/smarts/core/bubble_manager.py @@ -729,9 +729,10 @@ def _prepare_sensors_for_agent_control( def _start_social_agent( self, sim, agent_id, social_agent, social_agent_actor, bubble ): + id_ = SocialAgentId.new(social_agent_actor.name) social_agent_data_model = SocialAgent( - id=SocialAgentId.new(social_agent_actor.name), - name=social_agent_actor.name, + id=id_, + actor_name=id_, is_boid=bubble.is_boid, is_boid_keep_alive=bubble.keep_alive, agent_locator=social_agent_actor.agent_locator, diff --git a/smarts/core/data_model.py b/smarts/core/data_model.py index 24cb9a88e4..8a8e4b395e 100644 --- a/smarts/core/data_model.py +++ b/smarts/core/data_model.py @@ -29,7 +29,7 @@ class SocialAgent: """A serializable representation of a social agent.""" id: str - name: str + actor_name: str is_boid: bool is_boid_keep_alive: bool agent_locator: str diff --git a/smarts/core/scenario.py b/smarts/core/scenario.py index af0791bcaa..f989237582 100644 --- a/smarts/core/scenario.py +++ b/smarts/core/scenario.py @@ -413,7 +413,7 @@ def setdefault(l: list, index: int, default): ( SocialAgent( id=SocialAgentId.new(actor.name, group=namespace), - name=actor.name, + actor_name=actor.name, is_boid=False, is_boid_keep_alive=False, agent_locator=actor.agent_locator, diff --git a/smarts/core/tests/test_smarts_frame_rate.py b/smarts/core/tests/test_smarts_frame_rate.py index 49696d6b42..c3fc3cb39b 100644 --- a/smarts/core/tests/test_smarts_frame_rate.py +++ b/smarts/core/tests/test_smarts_frame_rate.py @@ -38,14 +38,16 @@ @pytest.fixture def scenarios(): with temp_scenario(name="6lane", map="maps/6lane.net.xml") as scenario_root: - actors = [ - t.SocialAgentActor( - name=f"non-interactive-agent-{speed}-v0", - agent_locator="zoo.policies:non-interactive-agent-v0", - policy_kwargs={"speed": speed}, - ) - for speed in [10, 30, 80] - ] + + def actor_gen(id_): + return [ + t.SocialAgentActor( + name=f"non-interactive-agent-{speed}-v0_{id_}", + agent_locator="zoo.policies:non-interactive-agent-v0", + policy_kwargs={"speed": speed}, + ) + for speed in [10, 30, 80] + ] def to_mission(start_edge, end_edge): route = t.Route(begin=(start_edge, 1, 0), end=(end_edge, 1, "max")) @@ -58,12 +60,24 @@ def fifth_mission(start_edge, end_edge): gen_scenario( t.Scenario( social_agent_missions={ - "group-1": (actors, [to_mission("edge-north-NS", "edge-south-NS")]), - "group-2": (actors, [to_mission("edge-west-WE", "edge-east-WE")]), - "group-3": (actors, [to_mission("edge-east-EW", "edge-west-EW")]), - "group-4": (actors, [to_mission("edge-south-SN", "edge-north-SN")]), + "group-1": ( + actor_gen(1), + [to_mission("edge-north-NS", "edge-south-NS")], + ), + "group-2": ( + actor_gen(2), + [to_mission("edge-west-WE", "edge-east-WE")], + ), + "group-3": ( + actor_gen(3), + [to_mission("edge-east-EW", "edge-west-EW")], + ), + "group-4": ( + actor_gen(4), + [to_mission("edge-south-SN", "edge-north-SN")], + ), "group-5": ( - actors, + actor_gen(5), [fifth_mission("edge-south-SN", "edge-east-WE")], ), }, diff --git a/smarts/core/vehicle_index.py b/smarts/core/vehicle_index.py index 4eea651721..fe1c1857b4 100644 --- a/smarts/core/vehicle_index.py +++ b/smarts/core/vehicle_index.py @@ -651,11 +651,13 @@ def build_agent_vehicle( surface_patches, initial_speed=None, boid=False, + *, + vehicle_id=None, ): """Build an entirely new vehicle for an agent.""" vehicle = Vehicle.build_agent_vehicle( sim=sim, - vehicle_id=agent_id, + vehicle_id=vehicle_id or agent_id, agent_interface=agent_interface, plan=plan, vehicle_filepath=filepath, diff --git a/smarts/diagnostic/10_agents_to_n_roads/10_roads/scenario.py b/smarts/diagnostic/10_agents_to_n_roads/10_roads/scenario.py index bf1b019100..1aa9d98b09 100644 --- a/smarts/diagnostic/10_agents_to_n_roads/10_roads/scenario.py +++ b/smarts/diagnostic/10_agents_to_n_roads/10_roads/scenario.py @@ -24,20 +24,22 @@ from smarts.sstudio import gen_scenario from smarts.sstudio.types import Mission, RandomRoute, Route, Scenario, SocialAgentActor -actors = [ - SocialAgentActor( - name=f"non-interactive-agent-50-v0", - agent_locator="zoo.policies:non-interactive-agent-v0", - policy_kwargs={"speed": 50}, - ) -] + +def gen_actors(id_): + return [ + SocialAgentActor( + name=f"non-interactive-agent-50-v0_{id_}", + agent_locator="zoo.policies:non-interactive-agent-v0", + policy_kwargs={"speed": 50}, + ) + ] def to_missions(agent_num): missions = {} for i in range(0, agent_num): missions[f"group-{i}"] = tuple( - (actors, [Mission(route=RandomRoute())]), + (gen_actors(i), [Mission(route=RandomRoute())]), ) return missions diff --git a/smarts/diagnostic/10_agents_to_n_roads/1_roads/scenario.py b/smarts/diagnostic/10_agents_to_n_roads/1_roads/scenario.py index 2f39382efe..b78be8e4d2 100644 --- a/smarts/diagnostic/10_agents_to_n_roads/1_roads/scenario.py +++ b/smarts/diagnostic/10_agents_to_n_roads/1_roads/scenario.py @@ -24,20 +24,22 @@ from smarts.sstudio import gen_scenario from smarts.sstudio.types import Mission, RandomRoute, Route, Scenario, SocialAgentActor -actors = [ - SocialAgentActor( - name=f"non-interactive-agent-50-v0", - agent_locator="zoo.policies:non-interactive-agent-v0", - policy_kwargs={"speed": 50}, - ) -] + +def gen_actors(id_): + return [ + SocialAgentActor( + name=f"non-interactive-agent-50-v0_{id_}", + agent_locator="zoo.policies:non-interactive-agent-v0", + policy_kwargs={"speed": 50}, + ) + ] def to_missions(agent_num): missions = {} for i in range(0, agent_num): missions[f"group-{i}"] = tuple( - (actors, [Mission(route=RandomRoute())]), + (gen_actors(i), [Mission(route=RandomRoute())]), ) return missions diff --git a/smarts/diagnostic/10_agents_to_n_roads/20_roads/scenario.py b/smarts/diagnostic/10_agents_to_n_roads/20_roads/scenario.py index bf1b019100..1aa9d98b09 100644 --- a/smarts/diagnostic/10_agents_to_n_roads/20_roads/scenario.py +++ b/smarts/diagnostic/10_agents_to_n_roads/20_roads/scenario.py @@ -24,20 +24,22 @@ from smarts.sstudio import gen_scenario from smarts.sstudio.types import Mission, RandomRoute, Route, Scenario, SocialAgentActor -actors = [ - SocialAgentActor( - name=f"non-interactive-agent-50-v0", - agent_locator="zoo.policies:non-interactive-agent-v0", - policy_kwargs={"speed": 50}, - ) -] + +def gen_actors(id_): + return [ + SocialAgentActor( + name=f"non-interactive-agent-50-v0_{id_}", + agent_locator="zoo.policies:non-interactive-agent-v0", + policy_kwargs={"speed": 50}, + ) + ] def to_missions(agent_num): missions = {} for i in range(0, agent_num): missions[f"group-{i}"] = tuple( - (actors, [Mission(route=RandomRoute())]), + (gen_actors(i), [Mission(route=RandomRoute())]), ) return missions diff --git a/smarts/diagnostic/10_agents_to_n_roads/50_roads/scenario.py b/smarts/diagnostic/10_agents_to_n_roads/50_roads/scenario.py index bf1b019100..1aa9d98b09 100644 --- a/smarts/diagnostic/10_agents_to_n_roads/50_roads/scenario.py +++ b/smarts/diagnostic/10_agents_to_n_roads/50_roads/scenario.py @@ -24,20 +24,22 @@ from smarts.sstudio import gen_scenario from smarts.sstudio.types import Mission, RandomRoute, Route, Scenario, SocialAgentActor -actors = [ - SocialAgentActor( - name=f"non-interactive-agent-50-v0", - agent_locator="zoo.policies:non-interactive-agent-v0", - policy_kwargs={"speed": 50}, - ) -] + +def gen_actors(id_): + return [ + SocialAgentActor( + name=f"non-interactive-agent-50-v0_{id_}", + agent_locator="zoo.policies:non-interactive-agent-v0", + policy_kwargs={"speed": 50}, + ) + ] def to_missions(agent_num): missions = {} for i in range(0, agent_num): missions[f"group-{i}"] = tuple( - (actors, [Mission(route=RandomRoute())]), + (gen_actors(i), [Mission(route=RandomRoute())]), ) return missions diff --git a/smarts/diagnostic/10_agents_with_replay/10_replays/scenario.py b/smarts/diagnostic/10_agents_with_replay/10_replays/scenario.py index 28056ac2fd..b8faebf2a3 100644 --- a/smarts/diagnostic/10_agents_with_replay/10_replays/scenario.py +++ b/smarts/diagnostic/10_agents_with_replay/10_replays/scenario.py @@ -23,20 +23,22 @@ from smarts.sstudio import gen_scenario from smarts.sstudio.types import Mission, RandomRoute, Scenario, SocialAgentActor -actors = [ - SocialAgentActor( - name=f"non-interactive-agent-50-v0", - agent_locator="zoo.policies:non-interactive-agent-v0", - policy_kwargs={"speed": 50}, - ) -] + +def gen_actors(id_): + return [ + SocialAgentActor( + name=f"non-interactive-agent-50-v0_{id_}", + agent_locator="zoo.policies:non-interactive-agent-v0", + policy_kwargs={"speed": 50}, + ) + ] def to_missions(agent_num): missions = {} for i in range(0, agent_num): missions[f"group-{i}"] = tuple( - (actors, [Mission(route=RandomRoute())]), + (gen_actors(i), [Mission(route=RandomRoute())]), ) return missions diff --git a/smarts/diagnostic/10_agents_with_replay/1_replay/scenario.py b/smarts/diagnostic/10_agents_with_replay/1_replay/scenario.py index 700259f8c6..94bedd66a6 100644 --- a/smarts/diagnostic/10_agents_with_replay/1_replay/scenario.py +++ b/smarts/diagnostic/10_agents_with_replay/1_replay/scenario.py @@ -23,20 +23,22 @@ from smarts.sstudio import gen_scenario from smarts.sstudio.types import Mission, RandomRoute, Scenario, SocialAgentActor -actors = [ - SocialAgentActor( - name=f"non-interactive-agent-50-v0", - agent_locator="zoo.policies:non-interactive-agent-v0", - policy_kwargs={"speed": 50}, - ) -] + +def gen_actors(id_): + return [ + SocialAgentActor( + name=f"non-interactive-agent-50-v0_{id_}", + agent_locator="zoo.policies:non-interactive-agent-v0", + policy_kwargs={"speed": 50}, + ) + ] def to_missions(agent_num): missions = {} for i in range(0, agent_num): missions[f"group-{i}"] = tuple( - (actors, [Mission(route=RandomRoute())]), + (gen_actors(i), [Mission(route=RandomRoute())]), ) return missions diff --git a/smarts/diagnostic/10_agents_with_replay/20_replays/scenario.py b/smarts/diagnostic/10_agents_with_replay/20_replays/scenario.py index 28056ac2fd..b8faebf2a3 100644 --- a/smarts/diagnostic/10_agents_with_replay/20_replays/scenario.py +++ b/smarts/diagnostic/10_agents_with_replay/20_replays/scenario.py @@ -23,20 +23,22 @@ from smarts.sstudio import gen_scenario from smarts.sstudio.types import Mission, RandomRoute, Scenario, SocialAgentActor -actors = [ - SocialAgentActor( - name=f"non-interactive-agent-50-v0", - agent_locator="zoo.policies:non-interactive-agent-v0", - policy_kwargs={"speed": 50}, - ) -] + +def gen_actors(id_): + return [ + SocialAgentActor( + name=f"non-interactive-agent-50-v0_{id_}", + agent_locator="zoo.policies:non-interactive-agent-v0", + policy_kwargs={"speed": 50}, + ) + ] def to_missions(agent_num): missions = {} for i in range(0, agent_num): missions[f"group-{i}"] = tuple( - (actors, [Mission(route=RandomRoute())]), + (gen_actors(i), [Mission(route=RandomRoute())]), ) return missions diff --git a/smarts/diagnostic/10_agents_with_replay/50_replays/scenario.py b/smarts/diagnostic/10_agents_with_replay/50_replays/scenario.py index 28056ac2fd..b8faebf2a3 100644 --- a/smarts/diagnostic/10_agents_with_replay/50_replays/scenario.py +++ b/smarts/diagnostic/10_agents_with_replay/50_replays/scenario.py @@ -23,20 +23,22 @@ from smarts.sstudio import gen_scenario from smarts.sstudio.types import Mission, RandomRoute, Scenario, SocialAgentActor -actors = [ - SocialAgentActor( - name=f"non-interactive-agent-50-v0", - agent_locator="zoo.policies:non-interactive-agent-v0", - policy_kwargs={"speed": 50}, - ) -] + +def gen_actors(id_): + return [ + SocialAgentActor( + name=f"non-interactive-agent-50-v0_{id_}", + agent_locator="zoo.policies:non-interactive-agent-v0", + policy_kwargs={"speed": 50}, + ) + ] def to_missions(agent_num): missions = {} for i in range(0, agent_num): missions[f"group-{i}"] = tuple( - (actors, [Mission(route=RandomRoute())]), + (gen_actors(i), [Mission(route=RandomRoute())]), ) return missions diff --git a/smarts/diagnostic/n_agents/10_agents/scenario.py b/smarts/diagnostic/n_agents/10_agents/scenario.py index 6e80c6f3e0..2898c251e2 100644 --- a/smarts/diagnostic/n_agents/10_agents/scenario.py +++ b/smarts/diagnostic/n_agents/10_agents/scenario.py @@ -23,21 +23,23 @@ from smarts.sstudio import gen_scenario from smarts.sstudio.types import Mission, RandomRoute, Scenario, SocialAgentActor -actors = [ - SocialAgentActor( - name=f"non-interactive-agent-{speed}-v0", - agent_locator="zoo.policies:non-interactive-agent-v0", - policy_kwargs={"speed": speed}, - ) - for speed in [10, 30, 80] -] + +def gen_actors(id_): + return [ + SocialAgentActor( + name=f"non-interactive-agent-{speed}-v0_{id_}", + agent_locator="zoo.policies:non-interactive-agent-v0", + policy_kwargs={"speed": speed}, + ) + for speed in [10, 30, 80] + ] def to_missions(agent_num): missions = {} for i in range(0, agent_num): missions[f"group-{i}"] = tuple( - (actors, [Mission(route=RandomRoute())]), + (gen_actors(i), [Mission(route=RandomRoute())]), ) return missions diff --git a/smarts/diagnostic/n_agents/1_agents/scenario.py b/smarts/diagnostic/n_agents/1_agents/scenario.py index 8ff865368f..905ecf5121 100644 --- a/smarts/diagnostic/n_agents/1_agents/scenario.py +++ b/smarts/diagnostic/n_agents/1_agents/scenario.py @@ -23,21 +23,23 @@ from smarts.sstudio import gen_scenario from smarts.sstudio.types import Mission, RandomRoute, Scenario, SocialAgentActor -actors = [ - SocialAgentActor( - name=f"non-interactive-agent-{speed}-v0", - agent_locator="zoo.policies:non-interactive-agent-v0", - policy_kwargs={"speed": speed}, - ) - for speed in [10, 30, 80] -] + +def gen_actors(id_): + return [ + SocialAgentActor( + name=f"non-interactive-agent-{speed}-v0_{id_}", + agent_locator="zoo.policies:non-interactive-agent-v0", + policy_kwargs={"speed": speed}, + ) + for speed in [10, 30, 80] + ] def to_missions(agent_num): missions = {} for i in range(0, agent_num): missions[f"group-{i}"] = tuple( - (actors, [Mission(route=RandomRoute())]), + (gen_actors(i), [Mission(route=RandomRoute())]), ) return missions diff --git a/smarts/diagnostic/n_agents/20_agents/scenario.py b/smarts/diagnostic/n_agents/20_agents/scenario.py index ac3ce50520..868373c44e 100644 --- a/smarts/diagnostic/n_agents/20_agents/scenario.py +++ b/smarts/diagnostic/n_agents/20_agents/scenario.py @@ -23,21 +23,23 @@ from smarts.sstudio import gen_scenario from smarts.sstudio.types import Mission, RandomRoute, Scenario, SocialAgentActor -actors = [ - SocialAgentActor( - name=f"non-interactive-agent-{speed}-v0", - agent_locator="zoo.policies:non-interactive-agent-v0", - policy_kwargs={"speed": speed}, - ) - for speed in [10, 30, 80] -] + +def gen_actors(id_): + return [ + SocialAgentActor( + name=f"non-interactive-agent-{speed}-v0_{id_}", + agent_locator="zoo.policies:non-interactive-agent-v0", + policy_kwargs={"speed": speed}, + ) + for speed in [10, 30, 80] + ] def to_missions(agent_num): missions = {} for i in range(0, agent_num): missions[f"group-{i}"] = tuple( - (actors, [Mission(route=RandomRoute())]), + (gen_actors(i), [Mission(route=RandomRoute())]), ) return missions diff --git a/smarts/diagnostic/n_agents/50_agents/scenario.py b/smarts/diagnostic/n_agents/50_agents/scenario.py index 86ca51ac9d..68095e6115 100644 --- a/smarts/diagnostic/n_agents/50_agents/scenario.py +++ b/smarts/diagnostic/n_agents/50_agents/scenario.py @@ -23,21 +23,23 @@ from smarts.sstudio import gen_scenario from smarts.sstudio.types import Mission, RandomRoute, Scenario, SocialAgentActor -actors = [ - SocialAgentActor( - name=f"non-interactive-agent-{speed}-v0", - agent_locator="zoo.policies:non-interactive-agent-v0", - policy_kwargs={"speed": speed}, - ) - for speed in [10, 30, 80] -] + +def gen_actors(id_): + return [ + SocialAgentActor( + name=f"non-interactive-agent-{speed}-v0_{id_}", + agent_locator="zoo.policies:non-interactive-agent-v0", + policy_kwargs={"speed": speed}, + ) + for speed in [10, 30, 80] + ] def to_missions(agent_num): missions = {} for i in range(0, agent_num): missions[f"group-{i}"] = tuple( - (actors, [Mission(route=RandomRoute())]), + (gen_actors(i), [Mission(route=RandomRoute())]), ) return missions diff --git a/smarts/sstudio/types.py b/smarts/sstudio/types.py index 66063cf2cf..3095ff0658 100644 --- a/smarts/sstudio/types.py +++ b/smarts/sstudio/types.py @@ -1120,7 +1120,8 @@ class Scenario: Dict[str, Tuple[Sequence[SocialAgentActor], Sequence[Mission]]] ] = None """ - Every dictionary item ``{group: (actors, missions)}`` gets run simultaneously. + Actors must have unique names regardless of which group they are assigned to. + Every dictionary item ``{group: (actors, missions)}`` gets selected from simultaneously. If actors > 1 and missions = 0 or actors = 1 and missions > 0, we cycle through them every episode. Otherwise actors must be the same length as missions. @@ -1133,3 +1134,21 @@ class Scenario: """Traffic vehicles trajectory dataset to be replayed.""" scenario_metadata: Optional[ScenarioMetadata] = None """"Scenario data that does not have influence on simulation.""" + + def __post_init__(self): + def _get_name(item): + return item.name + + if self.social_agent_missions is not None: + groups = [k for k in self.social_agent_missions] + for group, (actors, _) in self.social_agent_missions.items(): + for o_group in groups: + if group == o_group: + continue + if intersection := set.intersection( + set(map(_get_name, actors)), + map(_get_name, self.social_agent_missions[o_group][0]), + ): + raise ValueError( + f"Social agent mission groups `{group}`|`{o_group}` have overlapping actors {intersection}" + )