| | from typing import NamedTuple |
| | from urllib.parse import urlparse, parse_qs |
| | from mlagents_envs.base_env import AgentId, GroupId |
| |
|
| | GlobalGroupId = str |
| | GlobalAgentId = str |
| |
|
| |
|
| | class BehaviorIdentifiers(NamedTuple): |
| | """ |
| | BehaviorIdentifiers is a named tuple of the identifiers that uniquely distinguish |
| | an agent encountered in the trainer_controller. The named tuple consists of the |
| | fully qualified behavior name, the name of the brain name (corresponds to trainer |
| | in the trainer controller) and the team id. In the future, this can be extended |
| | to support further identifiers. |
| | """ |
| |
|
| | behavior_id: str |
| | brain_name: str |
| | team_id: int |
| |
|
| | @staticmethod |
| | def from_name_behavior_id(name_behavior_id: str) -> "BehaviorIdentifiers": |
| | """ |
| | Parses a name_behavior_id of the form name?team=0 |
| | into a BehaviorIdentifiers NamedTuple. |
| | This allows you to access the brain name and team id of an agent |
| | :param name_behavior_id: String of behavior params in HTTP format. |
| | :returns: A BehaviorIdentifiers object. |
| | """ |
| |
|
| | parsed = urlparse(name_behavior_id) |
| | name = parsed.path |
| | ids = parse_qs(parsed.query) |
| | team_id: int = 0 |
| | if "team" in ids: |
| | team_id = int(ids["team"][0]) |
| | return BehaviorIdentifiers( |
| | behavior_id=name_behavior_id, brain_name=name, team_id=team_id |
| | ) |
| |
|
| |
|
| | def create_name_behavior_id(name: str, team_id: int) -> str: |
| | """ |
| | Reconstructs fully qualified behavior name from name and team_id |
| | :param name: brain name |
| | :param team_id: team ID |
| | :return: name_behavior_id |
| | """ |
| | return name + "?team=" + str(team_id) |
| |
|
| |
|
| | def get_global_agent_id(worker_id: int, agent_id: AgentId) -> GlobalAgentId: |
| | """ |
| | Create an agent id that is unique across environment workers using the worker_id. |
| | """ |
| | return f"agent_{worker_id}-{agent_id}" |
| |
|
| |
|
| | def get_global_group_id(worker_id: int, group_id: GroupId) -> GlobalGroupId: |
| | """ |
| | Create a group id that is unique across environment workers when using the worker_id. |
| | """ |
| | return f"group_{worker_id}-{group_id}" |
| |
|