def init(self, xml, port, server=None, server2=None, port2=None, role=0, exp_uid=None, episode=0, action_filter=None, resync=0, step_options=0, action_space=None): """"Initialize a Malmo environment. xml - the mission xml. port - the MalmoEnv service's port. server - the MalmoEnv service address. Default is localhost. server2 - the MalmoEnv service address for given role if not 0. port2 - the MalmoEnv service port for given role if not 0. role - the agent role (0..N-1) for missions with N agents. Defaults to 0. exp_uid - the experiment's unique identifier. Generated if not given. episode - the "reset" start count for experiment re-starts. Defaults to 0. action_filter - an optional list of valid actions to filter by. Defaults to simple commands. step_options - encodes withTurnKey and withInfo in step messages. Defaults to info included, turn if required. """ if True: action_filter = {"move", "turn", "use", "attack"} if not xml.startswith('<Mission'): i = xml.index("<Mission") if i == -1: raise EnvException("Mission xml must contain <Mission> tag.") xml = xml[i:] self.xml = etree.fromstring(xml) self.role = role if exp_uid is None: self.exp_uid = str(uuid.uuid4()) else: self.exp_uid = exp_uid command_parser = CommandParser(action_filter) commands = command_parser.get_commands_from_xml(self.xml, self.role) actions = command_parser.get_actions(commands) # print("role " + str(self.role) + " actions " + str(actions) if action_space: self.action_space = action_space else: self.action_space = ActionSpace(actions) self.port = port if server is not None: self.server = server if server2 is not None: self.server2 = server2 else: self.server2 = self.server if port2 is not None: self.port2 = port2 else: self.port2 = self.port + self.role self.agent_count = len(self.xml.findall(self.ns + 'AgentSection')) turn_based = self.xml.find('.//' + self.ns + 'TurnBasedCommands') is not None if turn_based: self.turn_key = 'AKWozEre' else: self.turn_key = "" if step_options is None: self.step_options = 0 if not turn_based else 2 else: self.step_options = step_options self.done = True # print("agent count " + str(self.agent_count) + " turn based " + turn_based) self.resync_period = resync self.resets = episode e = etree.fromstring( """<MissionInit xmlns="http://ProjectMalmo.microsoft.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" SchemaVersion="" PlatformVersion=""" + '\"' + malmo_version + '\"' + """> <ExperimentUID></ExperimentUID> <ClientRole>0</ClientRole> <ClientAgentConnection> <ClientIPAddress>127.0.0.1</ClientIPAddress> <ClientMissionControlPort>0</ClientMissionControlPort> <ClientCommandsPort>0</ClientCommandsPort> <AgentIPAddress>127.0.0.1</AgentIPAddress> <AgentMissionControlPort>0</AgentMissionControlPort> <AgentVideoPort>0</AgentVideoPort> <AgentDepthPort>0</AgentDepthPort> <AgentLuminancePort>0</AgentLuminancePort> <AgentObservationsPort>0</AgentObservationsPort> <AgentRewardsPort>0</AgentRewardsPort> <AgentColourMapPort>0</AgentColourMapPort> </ClientAgentConnection> </MissionInit>""") e.insert(0, self.xml) self.xml = e self.xml.find(self.ns + 'ClientRole').text = str(self.role) self.xml.find(self.ns + 'ExperimentUID').text = self.exp_uid if self.role != 0 and self.agent_count > 1: e = etree.Element(self.ns + 'MinecraftServerConnection', attrib={ 'address': self.server, 'port': str(0) }) self.xml.insert(2, e) video_producers = self.xml.findall('.//' + self.ns + 'VideoProducer') assert len(video_producers) == self.agent_count video_producer = video_producers[self.role] self.width = int(video_producer.find(self.ns + 'Width').text) self.height = int(video_producer.find(self.ns + 'Height').text) want_depth = video_producer.attrib["want_depth"] self.depth = 4 if want_depth is not None and ( want_depth == "true" or want_depth == "1") else 3 # print(str(self.width) + "x" + str(self.height) + "x" + str(self.depth)) self.observation_space = VisualObservationSpace( self.width, self.height, self.depth)
def init(self, xml, port, server=None, server2=None, port2=None, role=0, exp_uid=None, episode=0, action_filter=None, resync=0, step_options=0, action_space=None): """"Initialize a Malmo environment. xml - the mission xml. port - the MalmoEnv service's port. server - the MalmoEnv service address. Default is localhost. server2 - the MalmoEnv service address for given role if not 0. port2 - the MalmoEnv service port for given role if not 0. role - the agent role (0..N-1) for missions with N agents. Defaults to 0. exp_uid - the experiment's unique identifier. Generated if not given. episode - the "reset" start count for experiment re-starts. Defaults to 0. action_filter - an optional list of valid actions to filter by. Defaults to simple commands. step_options - encodes withTurnKey and withInfo in step messages. Defaults to info included, turn if required. """ if action_filter is None: action_filter = {"move", "turn", "use", "attack"} if not xml.startswith('<Mission'): i = xml.index("<Mission") if i == -1: raise EnvException("Mission xml must contain <Mission> tag.") xml = xml[i:] self.xml = etree.fromstring(xml) self.role = role if exp_uid is None: self.exp_uid = str(uuid.uuid4()) else: self.exp_uid = exp_uid command_parser = CommandParser(action_filter) commands = command_parser.get_commands_from_xml(self.xml, self.role) actions = command_parser.get_actions(commands) # print("role " + str(self.role) + " actions " + str(actions) if action_space: self.action_space = action_space else: self.action_space = ActionSpace(actions) self.port = port if server is not None: self.server = server if server2 is not None: self.server2 = server2 else: self.server2 = self.server if port2 is not None: self.port2 = port2 else: self.port2 = self.port + self.role self.agent_count = len(self.xml.findall(self.ns + 'AgentSection')) turn_based = self.xml.find('.//' + self.ns + 'TurnBasedCommands') is not None if turn_based: self.turn_key = 'AKWozEre' else: self.turn_key = "" if step_options is None: self.step_options = 0 if not turn_based else 2 else: self.step_options = step_options self.done = True # print("agent count " + str(self.agent_count) + " turn based " + turn_based) self.resync_period = resync self.resets = episode e = etree.fromstring("""<MissionInit xmlns="http://ProjectMalmo.microsoft.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" SchemaVersion="" PlatformVersion=""" + '\"' + malmo_version + '\"' + """> <ExperimentUID></ExperimentUID> <ClientRole>0</ClientRole> <ClientAgentConnection> <ClientIPAddress>127.0.0.1</ClientIPAddress> <ClientMissionControlPort>0</ClientMissionControlPort> <ClientCommandsPort>0</ClientCommandsPort> <AgentIPAddress>127.0.0.1</AgentIPAddress> <AgentMissionControlPort>0</AgentMissionControlPort> <AgentVideoPort>0</AgentVideoPort> <AgentDepthPort>0</AgentDepthPort> <AgentLuminancePort>0</AgentLuminancePort> <AgentObservationsPort>0</AgentObservationsPort> <AgentRewardsPort>0</AgentRewardsPort> <AgentColourMapPort>0</AgentColourMapPort> </ClientAgentConnection> </MissionInit>""") e.insert(0, self.xml) self.xml = e self.xml.find(self.ns + 'ClientRole').text = str(self.role) self.xml.find(self.ns + 'ExperimentUID').text = self.exp_uid if self.role != 0 and self.agent_count > 1: e = etree.Element(self.ns + 'MinecraftServerConnection', attrib={'address': self.server, 'port': str(0) }) self.xml.insert(2, e) video_producers = self.xml.findall('.//' + self.ns + 'VideoProducer') assert len(video_producers) == self.agent_count video_producer = video_producers[self.role] self.width = int(video_producer.find(self.ns + 'Width').text) self.height = int(video_producer.find(self.ns + 'Height').text) want_depth = video_producer.attrib["want_depth"] self.depth = 4 if want_depth is not None and (want_depth == "true" or want_depth == "1") else 3 # print(str(self.width) + "x" + str(self.height) + "x" + str(self.depth)) self.observation_space = VisualObservationSpace(self.width, self.height, self.depth)