| 
					
				 | 
			
			
				@@ -596,6 +596,94 @@ class MiniGridEnv(gym.Env): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         # Initialize the state 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.seed() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.reset() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def __str__(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Produce a pretty string of the environment's grid along with the agent. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        The agent is represented by `⏩`. A grid pixel is represented by 2-character 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        string, the first one for the object and the second one for the color. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        from copy import deepcopy 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        def rotate_left(array): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            new_array = deepcopy(array) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for i in range(len(array)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for j in range(len(array[0])): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    new_array[j][len(array[0])-1-i] = array[i][j] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return new_array 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        def vertically_symmetrize(array): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            new_array = deepcopy(array) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for i in range(len(array)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for j in range(len(array[0])): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    new_array[i][len(array[0])-1-j] = array[i][j] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return new_array 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # Map of object id to short string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        OBJECT_IDX_TO_IDS = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            0: ' ', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            1: 'W', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            2: 'D', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            3: 'L', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            4: 'K', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            5: 'B', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            6: 'X', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            7: 'G' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # Short string for opened door 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        OPENDED_DOOR_IDS = '_' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # Map of color id to short string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        COLOR_IDX_TO_IDS = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            0: 'R', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            1: 'G', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            2: 'B', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            3: 'P', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            4: 'Y', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            5: 'E' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # Map agent's direction to short string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        AGENT_DIR_TO_IDS = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            0: '⏩', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            1: '⏬', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            2: '⏪', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            3: '⏫' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        array = self.grid.encode() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        array = rotate_left(array) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        array = vertically_symmetrize(array) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        new_array = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for line in array: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            new_line = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for pixel in line: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                # If the door is opened 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if pixel[0] in [2, 3] and pixel[2] == 1: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    object_ids = OPENDED_DOOR_IDS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    object_ids = OBJECT_IDX_TO_IDS[pixel[0]] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                # If no object 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if pixel[0] == 0: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    color_ids = ' ' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    color_ids = COLOR_IDX_TO_IDS[pixel[1]] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new_line.append(object_ids + color_ids) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            new_array.append(new_line) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # Add the agent 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        new_array[self.agentPos[1]][self.agentPos[0]] = AGENT_DIR_TO_IDS[self.agentDir] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return "\n".join([" ".join(line) for line in new_array]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def _genGrid(self, width, height): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert False, "_genGrid needs to be implemented by each environment" 
			 |