From 471fb90a1e55264801933032c65d5754a38dbadf Mon Sep 17 00:00:00 2001 From: marlowfawn Date: Fri, 29 Mar 2024 12:13:00 -0400 Subject: [PATCH 01/22] Initial commit with working state machine --- Q_Learning_agent.py | 29 ------- enums/direction.py | 10 +-- env.py | 2 + final_proj/socket_agent_proj.py | 141 ++++++++++++++++++++++++++++++++ final_proj/util.py | 6 ++ helper.py | 61 +++++++++++--- socket_agent.py | 42 ---------- socket_agent_performing.py | 62 -------------- socket_agent_training.py | 96 ---------------------- 9 files changed, 205 insertions(+), 244 deletions(-) delete mode 100644 Q_Learning_agent.py mode change 100755 => 100644 enums/direction.py create mode 100755 final_proj/socket_agent_proj.py create mode 100644 final_proj/util.py mode change 100755 => 100644 helper.py delete mode 100755 socket_agent.py delete mode 100644 socket_agent_performing.py delete mode 100644 socket_agent_training.py diff --git a/Q_Learning_agent.py b/Q_Learning_agent.py deleted file mode 100644 index 37b8ef9..0000000 --- a/Q_Learning_agent.py +++ /dev/null @@ -1,29 +0,0 @@ -import numpy as np -import pandas as pd -import torch -import torch.nn.functional as F -import json # Import json for dictionary serialization - -class QLAgent: - # here are some default parameters, you can use different ones - def __init__(self, action_space, alpha=0.5, gamma=0.8, epsilon=0.1, mini_epsilon=0.01, decay=0.999): - self.action_space = action_space - self.alpha = alpha # learning rate - self.gamma = gamma # discount factor - self.epsilon = epsilon # exploit vs. explore probability - self.mini_epsilon = mini_epsilon # threshold for stopping the decay - self.decay = decay # value to decay the epsilon over time - self.qtable = pd.DataFrame(columns=[i for i in range(self.action_space)]) # generate the initial table - - def trans(self, state, granularity=0.5): - # You should design a function to transform the huge state into a learnable state for the agent - # It should be simple but also contains enough information for the agent to learn - - pass - - def learning(self, action, rwd, state, next_state): - # implement the Q-learning function - - def choose_action(self, state): - # implement the action selection for the fully trained agent - diff --git a/enums/direction.py b/enums/direction.py old mode 100755 new mode 100644 index 54712c4..8150fcd --- a/enums/direction.py +++ b/enums/direction.py @@ -2,8 +2,8 @@ class Direction(Enum): - NONE = 0, - NORTH = 1, - SOUTH = 2, - EAST = 3, - WEST = 4 + NORTH = 0 + SOUTH = 1 + EAST = 2 + WEST = 3 + NONE = 4 diff --git a/env.py b/env.py index 022234d..b403276 100755 --- a/env.py +++ b/env.py @@ -47,6 +47,7 @@ def step(self, action): player_action, arg = player_action if player_action in MOVEMENT_ACTIONS: self.unwrapped.game.player_move(i, player_action) + self.unwrapped.game.player_move(i, player_action) elif player_action == PlayerAction.NOP: self.unwrapped.game.nop(i) elif player_action == PlayerAction.INTERACT: @@ -116,6 +117,7 @@ def step(self, player_action): i, player_action, arg = player_action if player_action in MOVEMENT_ACTIONS: self.unwrapped.game.player_move(i, player_action) + self.unwrapped.game.player_move(i, player_action) elif player_action == PlayerAction.NOP: self.unwrapped.game.nop(i) elif player_action == PlayerAction.INTERACT: diff --git a/final_proj/socket_agent_proj.py b/final_proj/socket_agent_proj.py new file mode 100755 index 0000000..5adb485 --- /dev/null +++ b/final_proj/socket_agent_proj.py @@ -0,0 +1,141 @@ +# Author: Gyan Tatiya +# Email: Gyan.Tatiya@tufts.edu + +import json +import socket + +import pandas as pd + +from final_proj.util import get_geometry +from utils import recv_socket_data + + +# todo: update with Helen's method for making interaction areas? +def populate_locs(observation): + locs: dict = {} + + for idx, obj in enumerate(observation['registers']): + locs[f'register {idx}'] = get_geometry(obj) + + for idx, obj in enumerate(observation['cartReturns']): + locs[f'cartReturn {idx}'] = get_geometry(obj) + + for idx, obj in enumerate(observation['basketReturns']): + locs[f'basketReturn {idx}'] = get_geometry(obj) + + for obj in observation['counters']: + locs[obj['food']] = get_geometry(obj) + + for obj in observation['shelves']: + locs[obj['food']] = get_geometry(obj) + + return locs + + +class Agent: + + def __init__(self, conn, agent_id): + self.socket = conn + self.agent_id = agent_id + self.obs = None + self.shopping_list: list = self.init_list() + self.goal = "" + self.done = False + self.has_cart = False + + def transition(self): + if self.done: # If we've left the store + self.execute("NOP") # Do nothing + + elif not self.has_cart: # If we don't have a cart + self.get_cart() # Get one! + + elif self.goal == "": # If we currently don't have a goal + if not self.shopping_list: # Check if there's anything left on our list + self.exit() # Leave the store (includes checkout) + else: # We've still got something on our shopping list + item = self.shopping_list.pop(0) + self.goal = locs[item] # Set our goal to the next item on our list + self.goto() # Go to our goal + + else: # If we have a goal and we're here, that means we're at the goal! + self.add_to_cart() + + # Agent retrieves a + def get_cart(self): + print(f"Agent {self.agent_id} getting a cart/basket") + + pass # todo + + self.has_cart = True + + def goto(self, goal=None): + if goal is None: + goal = self.goal + + # todo: check if we're holding a cart + holding_cart = False + + if holding_cart: + print(f"Agent {self.agent_id} going to location {goal} with cart") + + pass # todo + else: + print(f"Agent {self.agent_id} going to location {goal} without cart") + + pass # todo + + # Agent picks up an item and adds it to the cart + def add_to_cart(self): + print(f"Agent {self.agent_id} adding an item to the cart") + + pass # todo + + self.goal = "" + + # todo + def exit(self): + print(f"Agent {self.agent_id} exiting") + + pass # todo + + self.done = True + + # Reads the shopping list + def init_list(self): + print(f"Agent {self.agent_id} reading list") + shopping_list = [] + self.execute("NOP") + shopping_list += self.obs['observation']["players"][self.agent_id]["shopping_list"].copy() + return shopping_list + + # Given an action, executes it for this agent + def execute(self, action): + action = f"{self.agent_id} {action}" + self.socket.send(str.encode(action)) # send action to env + output = recv_socket_data(self.socket) # get observation from env + self.obs = json.loads(output) + + +if __name__ == "__main__": + + action_commands = ['NOP', 'NORTH', 'SOUTH', 'EAST', 'WEST', 'TOGGLE_CART', 'INTERACT'] + + print("action_commands: ", action_commands) + + # Connect to Supermarket + HOST = '127.0.0.1' + PORT = 9000 + sock_game = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock_game.connect((HOST, PORT)) + + sock_game.send(str.encode("0 NOP")) # send action to env + output = recv_socket_data(sock_game) # get observation from env + output = json.loads(output) + locs = populate_locs(output['observation']) + + # agents = [Agent(sock_game, 0)] + agents = [Agent(sock_game, 0), Agent(sock_game, 1), Agent(sock_game, 2)] + while True: + for agent in agents: + agent.transition() diff --git a/final_proj/util.py b/final_proj/util.py new file mode 100644 index 0000000..6388929 --- /dev/null +++ b/final_proj/util.py @@ -0,0 +1,6 @@ +def get_geometry(obj): + return { + "position": obj["position"], + "height": obj["height"], + "width": obj["width"] + } diff --git a/helper.py b/helper.py old mode 100755 new mode 100644 index 1fd0483..8ba0456 --- a/helper.py +++ b/helper.py @@ -1,9 +1,11 @@ +from copy import deepcopy + from enums.direction import Direction -def obj_collision(obj, x_position, y_position, x_margin=0.55, y_margin=0.55): +def obj_collision(obj, x_position, y_position, x_margin=0.55, y_margin=0.55): return obj.position[0] - x_margin < x_position < obj.position[0] + obj.width + x_margin and \ - obj.position[1] - y_margin < y_position < obj.position[1] + obj.height + y_margin + obj.position[1] - y_margin < y_position < obj.position[1] + obj.height + y_margin def overlap(x1, y1, width_1, height_1, x2, y2, width_2, height_2): @@ -11,21 +13,60 @@ def overlap(x1, y1, width_1, height_1, x2, y2, width_2, height_2): def objects_overlap(obj1, obj2): - return overlap(obj1.position[0], obj1.position[1], obj1.width, obj1.height, - obj2.position[0], obj2.position[1], obj2.width, obj2.height) + return overlap(obj1['position'][0], obj1['position'][1], obj1['width'], obj1['height'], + obj2['position'][0], obj2['position'][1], obj2['width'], obj2['height']) -def pos_collision(x1, y1, x2, y2, x_margin, y_margin): +def pos_collision(x1, y1, x2, y2, x_margin, y_margin): return x1 - x_margin < x2 < x1 + x_margin and y1 - y_margin < y2 < y1 + y_margin def can_interact_default(obj, player, range=0.5): if player.direction == Direction.NORTH: - return obj.collision(player, player.position[0], player.position[1] - range) + return obj.collision(player, obj['position'][0], obj['position'][1] - range) elif player.direction == Direction.SOUTH: - return obj.collision(player, player.position[0], player.position[1] + range) + return obj.collision(player, obj['position'][0], obj['position'][1] + range) elif player.direction == Direction.WEST: - return obj.collision(player, player.position[0] - range, player.position[1]) + return obj.collision(player, obj['position'][0] - range, obj['position'][1]) elif player.direction == Direction.EAST: - return obj.collision(player, player.position[0] + range, player.position[1]) - return False \ No newline at end of file + return obj.collision(player, obj['position'][0] + range, obj['position'][1]) + return False + + +def project_collision(obj, state, direction: Direction, dist=0.4): + obj_copy = deepcopy(obj) + + if direction == Direction.NORTH: + obj_copy['position'][1] -= dist + if obj_copy['position'][1] < 2: + return True + elif direction == Direction.EAST: + obj_copy['position'][0] += dist + if obj_copy['position'][0] > 18.5: + return True + elif direction == Direction.SOUTH: + obj_copy['position'][1] += dist + if obj_copy['position'][1] > 24: + return True + elif direction == Direction.WEST: + obj_copy['position'][0] -= dist + if obj_copy['position'][0] < 2: + return True + + for key, value in state['observation'].items(): + for item in value: + if (overlap(obj_copy['position'][0], obj_copy['position'][1], obj_copy['width'], obj_copy['height'], + item['position'][0], item['position'][1], item['width'], item['height'])): + if not (obj_copy == item or ( + 'index' in item.keys() and 'index' in obj_copy.keys() and item['index'] == obj_copy['index'])): + return True + return False + + +def round_float(n, granularity): + return round(round(n / granularity) * granularity, 1) + + +def euclidean_distance(pos1, pos2): + # Calculate Euclidean distance between two points + return ((pos1[0] - pos2[0]) ** 2 + (pos1[1] - pos2[1]) ** 2) ** 0.5 diff --git a/socket_agent.py b/socket_agent.py deleted file mode 100755 index f868679..0000000 --- a/socket_agent.py +++ /dev/null @@ -1,42 +0,0 @@ -# Author: Gyan Tatiya -# Email: Gyan.Tatiya@tufts.edu - -import json -import random -import socket - -from env import SupermarketEnv -from utils import recv_socket_data - - -if __name__ == "__main__": - - # Make the env - # env_id = 'Supermarket-v0' - # env = gym.make(env_id) - - action_commands = ['NOP', 'NORTH', 'SOUTH', 'EAST', 'WEST', 'TOGGLE_CART', 'INTERACT'] - - print("action_commands: ", action_commands) - - # Connect to Supermarket - HOST = '127.0.0.1' - PORT = 9000 - sock_game = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock_game.connect((HOST, PORT)) - - while True: - # action = str(random.randint(0, 1)) - # action += " " + random.choice(action_commands) # random action - - # assume this is the only agent in the game - action = "0 " + "SOUTH" - - print("Sending action: ", action) - sock_game.send(str.encode(action)) # send action to env - - output = recv_socket_data(sock_game) # get observation from env - output = json.loads(output) - - print("Observations: ", output["observation"]) - print("Violations", output["violations"]) diff --git a/socket_agent_performing.py b/socket_agent_performing.py deleted file mode 100644 index 23815f6..0000000 --- a/socket_agent_performing.py +++ /dev/null @@ -1,62 +0,0 @@ -#Author: Hang Yu - -import json -import random -import socket - -import gymnasium as gym -from env import SupermarketEnv -from utils import recv_socket_data - -from Q_Learning_agnet import QLAgent # Make sure to import your QLAgent class -import pickle -import pandas as pd - - -if __name__ == "__main__": - - - action_commands = ['NOP', 'NORTH', 'SOUTH', 'EAST', 'WEST', 'TOGGLE_CART', 'INTERACT', 'RESET'] - # Initialize Q-learning agent - action_space = len(action_commands) - 1 # Assuming your action space size is equal to the number of action commands - agent = QLAgent(action_space) - agent.qtable = pd.read_json('qtable.json') - - - - # Connect to Supermarket - HOST = '127.0.0.1' - PORT = 9000 - sock_game = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock_game.connect((HOST, PORT)) - - training_time = 100 - episode_length = 1000 - for i in range(training_time): - sock_game.send(str.encode("0 RESET")) # reset the game - state = recv_socket_data(sock_game) - state = json.loads(state) - cnt = 0 - while not state['gameOver']: - cnt += 1 - # Choose an action based on the current state - action_index = agent.choose_action(state) - action = "0 " + action_commands[action_index] - - print("Sending action: ", action) - sock_game.send(str.encode(action)) # send action to env - - next_state = recv_socket_data(sock_game) # get observation from env - next_state = json.loads(next_state) - - # Update state - state = next_state - agent.qtable.to_json('qtable.json') - - if cnt > episode_length: - break - # Additional code for end of episode if needed - - # Close socket connection - sock_game.close() - diff --git a/socket_agent_training.py b/socket_agent_training.py deleted file mode 100644 index 269f275..0000000 --- a/socket_agent_training.py +++ /dev/null @@ -1,96 +0,0 @@ -#Author Hang Yu - -import json -import random -import socket - -import gymnasium as gym -from env import SupermarketEnv -from utils import recv_socket_data - -from Q_Learning_agnet import QLAgent # Make sure to import your QLAgent class -import pickle -import pandas as pd - - -cart = False -exit_pos = [-0.8, 15.6] # The position of the exit in the environment from [-0.8, 15.6] in x, and y = 15.6 -cart_pos_left = [1, 18.5] # The position of the cart in the environment from [1, 2] in x, and y = 18.5 -cart_pos_right = [2, 18.5] - -def distance_to_cart(state): - agent_position = state['observation']['players'][0]['position'] - if agent_position[0] > 1.5: - cart_distances = [euclidean_distance(agent_position, cart_pos_right)] - else: - cart_distances = [euclidean_distance(agent_position, cart_pos_left)] - return min(cart_distances) - -def euclidean_distance(pos1, pos2): - # Calculate Euclidean distance between two points - return ((pos1[0] - pos2[0])**2 + (pos1[1] - pos2[1])**2)**0.5 - - -def calculate_reward(previous_state, current_state): - # design your own reward function here - # You should design a function to calculate the reward for the agent to guide the agent to do the desired task - pass - -if __name__ == "__main__": - - - action_commands = ['NOP', 'NORTH', 'SOUTH', 'EAST', 'WEST', 'TOGGLE_CART', 'INTERACT', 'RESET'] - # Initialize Q-learning agent - action_space = len(action_commands) - 1 # Assuming your action space size is equal to the number of action commands - agent = QLAgent(action_space) - -#################### - #Once you have your agent trained, or you want to continue training from a previous training session, you can load the qtable from a json file - #agent.qtable = pd.read_json('qtable.json') -#################### - - - # Connect to Supermarket - HOST = '127.0.0.1' - PORT = 9000 - sock_game = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock_game.connect((HOST, PORT)) - - training_time = 100 - episode_length = 1000 - for i in range(training_time): - sock_game.send(str.encode("0 RESET")) # reset the game - state = recv_socket_data(sock_game) - state = json.loads(state) - cnt = 0 - while not state['gameOver']: - cnt += 1 - # Choose an action based on the current state - action_index = agent.choose_action(state) - action = "0 " + action_commands[action_index] - - print("Sending action: ", action) - sock_game.send(str.encode(action)) # send action to env - - next_state = recv_socket_data(sock_game) # get observation from env - next_state = json.loads(next_state) - - # Define the reward based on the state and next_state - reward = calculate_reward(state, next_state) # You need to define this function - print("------------------------------------------") - print(reward, action_commands[action_index]) - print("------------------------------------------") - # Update Q-table - agent.learning(action_index, reward, state, next_state) - - # Update state - state = next_state - agent.qtable.to_json('qtable.json') - - if cnt > episode_length: - break - # Additional code for end of episode if needed - - # Close socket connection - sock_game.close() - From fca8d64afc595bd2579937cb32e104d08a6869cc Mon Sep 17 00:00:00 2001 From: marlowfawn Date: Tue, 2 Apr 2024 18:11:49 -0400 Subject: [PATCH 02/22] Added (not very good) A* --- env.py | 2 - final_proj/astar_dynamic.py | 123 ++++++++++++++++++++ final_proj/astar_static.py | 193 ++++++++++++++++++++++++++++++++ final_proj/socket_agent_proj.py | 55 +++++++-- final_proj/util.py | 10 +- helper.py | 39 ++++++- 6 files changed, 405 insertions(+), 17 deletions(-) create mode 100644 final_proj/astar_dynamic.py create mode 100644 final_proj/astar_static.py diff --git a/env.py b/env.py index b403276..022234d 100755 --- a/env.py +++ b/env.py @@ -47,7 +47,6 @@ def step(self, action): player_action, arg = player_action if player_action in MOVEMENT_ACTIONS: self.unwrapped.game.player_move(i, player_action) - self.unwrapped.game.player_move(i, player_action) elif player_action == PlayerAction.NOP: self.unwrapped.game.nop(i) elif player_action == PlayerAction.INTERACT: @@ -117,7 +116,6 @@ def step(self, player_action): i, player_action, arg = player_action if player_action in MOVEMENT_ACTIONS: self.unwrapped.game.player_move(i, player_action) - self.unwrapped.game.player_move(i, player_action) elif player_action == PlayerAction.NOP: self.unwrapped.game.nop(i) elif player_action == PlayerAction.INTERACT: diff --git a/final_proj/astar_dynamic.py b/final_proj/astar_dynamic.py new file mode 100644 index 0000000..8123635 --- /dev/null +++ b/final_proj/astar_dynamic.py @@ -0,0 +1,123 @@ +import math +from copy import deepcopy + +import numpy as np +from PIL import Image + +from enums.direction import Direction +from helper import project_collision_dyn, project_collision, round_float + +STEP = 0.15 + + +class Node: + """A node class for A* Pathfinding""" + + def __init__(self, parent=None, position=None): + self.parent = parent + self.position = position + + self.g = 0 + self.h = 0 + self.f = 0 + + def __eq__(self, other): + return self.position == other.position + + +# By Nicholas Swift via https://medium.com/@nicholas.w.swift/easy-a-star-pathfinding-7e6689c7f7b2 +# Modifications by Marlow Fawn +def astar(goal, player, state): + """Returns a list of tuples as a path from the given start to the given end in the given maze""" + player_copy = deepcopy(player) + goal_copy = deepcopy(goal) + + start = (round(player_copy['position'][1] / STEP), round(player_copy['position'][0] / STEP)) + end = (round(goal_copy['position'][1] / STEP), round(goal_copy['position'][0] / STEP)) + # Create start and end node + start_node = Node(None, start) + start_node.g = start_node.h = start_node.f = 0 + end_node = Node(None, end) + end_node.g = end_node.h = end_node.f = 0 + + # Initialize both open and closed list + open_list = [] + closed_list = [] + + # Add the start node + open_list.append(start_node) + + # Loop until you find the end + while len(open_list) > 0: + + # Get the current node + current_node = open_list[0] + current_index = 0 + for index, item in enumerate(open_list): + if item.f < current_node.f: + current_node = item + current_index = index + + # Pop current off open list, add to closed list + open_list.pop(current_index) + closed_list.append(current_node) + + # Found the goal + if current_node == end_node: + path = [] + current = current_node + while current is not None: + path.append(current.position) + current = current.parent + return path[::-1] # Return reversed path + + # Generate children + children = [] + for new_position in [(0, -1), (0, 1), (-1, 0), (1, 0)]: # Adjacent squares + + # Get node position + node_position = (current_node.position[0] + new_position[0], current_node.position[1] + new_position[1]) + + # Make sure walkable terrain + # todo: If holding cart, even bigger? + # todo: update based on new_position + player_copy['position'][0] = convert_to_real(node_position[0]) + player_copy['position'][1] = convert_to_real(node_position[1]) + if project_collision(player_copy, state, Direction.NONE): + continue + + # Create new node + new_node = Node(current_node, node_position) + + # Append + children.append(new_node) + + # Loop through children + for child in children: + + # Child is on the closed list + for closed_child in closed_list: + if child == closed_child: + continue + + # Create the f, g, and h values + child.g = current_node.g + 1 + child.h = ((child.position[0] - end_node.position[0]) ** 2) + ( + (child.position[1] - end_node.position[1]) ** 2) + child.f = child.g + child.h + + # Child is already in the open list + for open_node in open_list: + if child == open_node and child.g > open_node.g: + continue + + # Add the child to the open list + open_list.append(child) + + +def convert_to_real(loc): + return loc * STEP + + +def convert_to_astar(loc): + return round(loc / STEP) diff --git a/final_proj/astar_static.py b/final_proj/astar_static.py new file mode 100644 index 0000000..550540c --- /dev/null +++ b/final_proj/astar_static.py @@ -0,0 +1,193 @@ +import math +from copy import deepcopy + +import numpy as np +from PIL import Image + +from enums.direction import Direction +from helper import project_collision_dyn, project_collision + +from warnings import warn +import heapq + +STEP = 0.3 +BUFFER = 0.3 + +def init_map(obs): + map_ = [] + tile = { + "position": [0, 0], + "width": 0.6 + BUFFER, + "height": 0.4 + BUFFER + } + max_width = 25 + max_height = 25 + while tile["position"][1] < max_height: + map_.append([]) + while tile["position"][0] < max_width: + map_[len(map_) - 1].append(project_collision_dyn(tile, obs, Direction.NONE)) + tile["position"][0] += STEP + + tile["position"][0] = 0 + tile["position"][1] += STEP + + # map_ = update_dyn(map_, obs) + + return map_ + + +def update_dyn(map_: [[]], state): + for player in state['observation']['players']: + x = round(player['position'][0] / 0.15) + y = round(player['position'][1] / 0.15) + for i in range(math.ceil(player['width'] / 0.15)): + for j in range(math.ceil(player['height'] / 0.15)): + map_[y + j][x + i] = 2 + return map_ + + +class Node: + """ + A node class for A* Pathfinding + """ + + def __init__(self, parent=None, position=None): + self.parent = parent + self.position = position + + self.g = 0 + self.h = 0 + self.f = 0 + + def __eq__(self, other): + return self.position == other.position + + def __repr__(self): + return f"{self.position} - g: {self.g} h: {self.h} f: {self.f}" + + # defining less than for purposes of heap queue + def __lt__(self, other): + return self.f < other.f + + # defining greater than for purposes of heap queue + def __gt__(self, other): + return self.f > other.f + + +def return_path(current_node): + path = [] + current = current_node + while current is not None: + path.append(current.position) + current = current.parent + return path[::-1] # Return reversed path + + +def astar(goal, player, maze): + player_copy = deepcopy(player) + goal_copy = deepcopy(goal) + + start = (round(player_copy['position'][1] / STEP), round(player_copy['position'][0] / STEP)) + end = (round(goal_copy['position'][1] / STEP), round(goal_copy['position'][0] / STEP)) + + # maze[start[1]][start[0]] = 2 + # maze[end[1]][end[0]] = 3 + # x = np.asarray(maze, np.uint8) + # im = Image.fromarray(x, 'P') + # im.putpalette([0, 0, 0, # Black + # 255, 0, 0, # Red + # 0, 255, 0, #g + # 0, 255, 255]) # b + # im.show() + + # Create start and end node + start_node = Node(None, start) + start_node.g = start_node.h = start_node.f = 0 + end_node = Node(None, end) + end_node.g = end_node.h = end_node.f = 0 + + # Initialize both open and closed list + open_list = [] + closed_list = [] + + # Heapify the open_list and Add the start node + heapq.heapify(open_list) + heapq.heappush(open_list, start_node) + + # Adding a stop condition + outer_iterations = 0 + max_iterations = (len(maze[0]) * len(maze) // 2) + + # what squares do we search + adjacent_squares = ((0, -1), (0, 1), (-1, 0), (1, 0),) + + # Loop until you find the end + while len(open_list) > 0: + outer_iterations += 1 + + if outer_iterations > max_iterations: + # if we hit this point return the path such as it is + # it will not contain the destination + warn("giving up on pathfinding too many iterations") + return return_path(current_node) + + # Get the current node + current_node = heapq.heappop(open_list) + closed_list.append(current_node) + + # Found the goal + if current_node == end_node: + return return_path(current_node) + + # Generate children + children = [] + + for new_position in adjacent_squares: # Adjacent squares + + # Get node position + node_position = (current_node.position[0] + new_position[0], current_node.position[1] + new_position[1]) + + # Make sure within range + if node_position[0] > (len(maze) - 1) or node_position[0] < 0 or node_position[1] > ( + len(maze[len(maze) - 1]) - 1) or node_position[1] < 0: + continue + + # Make sure walkable terrain + if maze[node_position[0]][node_position[1]] != 0: + continue + + # Create new node + new_node = Node(current_node, node_position) + + # Append + children.append(new_node) + + # Loop through children + for child in children: + # Child is on the closed list + if len([closed_child for closed_child in closed_list if closed_child == child]) > 0: + continue + + # Create the f, g, and h values + child.g = current_node.g + 1 + child.h = ((child.position[0] - end_node.position[0]) ** 2) + ( + (child.position[1] - end_node.position[1]) ** 2) + child.f = child.g + child.h + + # Child is already in the open list + if len([open_node for open_node in open_list if + child.position == open_node.position and child.g > open_node.g]) > 0: + continue + + # Add the child to the open list + heapq.heappush(open_list, child) + + warn("Couldn't get a path to destination") + return None + +def convert_to_real(loc): + return loc * STEP + + +def convert_to_astar(loc): + return round(loc / STEP) diff --git a/final_proj/socket_agent_proj.py b/final_proj/socket_agent_proj.py index 5adb485..838e639 100755 --- a/final_proj/socket_agent_proj.py +++ b/final_proj/socket_agent_proj.py @@ -3,9 +3,12 @@ import json import socket +from copy import deepcopy import pandas as pd +from enums.direction import Direction +from final_proj.astar_static import astar, init_map, convert_to_astar from final_proj.util import get_geometry from utils import recv_socket_data @@ -15,19 +18,29 @@ def populate_locs(observation): locs: dict = {} for idx, obj in enumerate(observation['registers']): - locs[f'register {idx}'] = get_geometry(obj) + geometry = get_geometry(obj) + geometry['position'][0] += geometry['width'] + 1 + locs[f'register {idx}'] = geometry for idx, obj in enumerate(observation['cartReturns']): - locs[f'cartReturn {idx}'] = get_geometry(obj) + geometry = get_geometry(obj) + geometry['position'][1] -= 1 + locs[f'cartReturn {idx}'] = geometry for idx, obj in enumerate(observation['basketReturns']): - locs[f'basketReturn {idx}'] = get_geometry(obj) + geometry = get_geometry(obj) + geometry['position'][1] -= 1 + locs[f'basketReturn {idx}'] = geometry for obj in observation['counters']: - locs[obj['food']] = get_geometry(obj) + geometry = get_geometry(obj) + geometry['position'][0] -= 1 + locs[obj['food']] = geometry for obj in observation['shelves']: - locs[obj['food']] = get_geometry(obj) + geometry = get_geometry(obj) + geometry['position'][1] += geometry['height'] + 1 + locs[obj['food']] = geometry return locs @@ -75,15 +88,36 @@ def goto(self, goal=None): # todo: check if we're holding a cart holding_cart = False - if holding_cart: print(f"Agent {self.agent_id} going to location {goal} with cart") pass # todo else: print(f"Agent {self.agent_id} going to location {goal} without cart") - - pass # todo + player = self.obs['observation']['players'][self.agent_id] + path = astar(goal, player, init_map(self.obs)) + for node in path: + player = self.obs['observation']['players'][self.agent_id] + player_x = convert_to_astar(player['position'][0]) + player_y = convert_to_astar(player['position'][1]) + if player_x < node[1]: + command = Direction.EAST + elif player_x > node[1]: + command = Direction.WEST + elif player_y < node[0]: + command = Direction.SOUTH + elif player_y > node[0]: + command = Direction.NORTH + else: + continue + + self.step(command, player['direction']) + + def step(self, command: Direction, direction: Direction): + if not command == direction: + self.execute(command.name) + self.execute(command.name) + self.execute(command.name) # Agent picks up an item and adds it to the cart def add_to_cart(self): @@ -133,9 +167,8 @@ def execute(self, action): output = recv_socket_data(sock_game) # get observation from env output = json.loads(output) locs = populate_locs(output['observation']) - - # agents = [Agent(sock_game, 0)] - agents = [Agent(sock_game, 0), Agent(sock_game, 1), Agent(sock_game, 2)] + agents = [Agent(sock_game, 0)] + # agents = [Agent(sock_game, 0), Agent(sock_game, 1), Agent(sock_game, 2)] while True: for agent in agents: agent.transition() diff --git a/final_proj/util.py b/final_proj/util.py index 6388929..dd34c76 100644 --- a/final_proj/util.py +++ b/final_proj/util.py @@ -1,6 +1,10 @@ +from copy import deepcopy + + def get_geometry(obj): + obj_copy = deepcopy(obj) return { - "position": obj["position"], - "height": obj["height"], - "width": obj["width"] + "position": obj_copy["position"], + "height": obj_copy["height"], + "width": obj_copy["width"] } diff --git a/helper.py b/helper.py index 8ba0456..22f9680 100644 --- a/helper.py +++ b/helper.py @@ -1,3 +1,5 @@ +import decimal +import math from copy import deepcopy from enums.direction import Direction @@ -63,8 +65,43 @@ def project_collision(obj, state, direction: Direction, dist=0.4): return False +def project_collision_dyn(obj, state, direction: Direction, dist=0.4): + obj_copy = deepcopy(obj) + + if direction == Direction.NORTH: + obj_copy['position'][1] -= dist + if obj_copy['position'][1] < 2: + return 1 + elif direction == Direction.EAST: + obj_copy['position'][0] += dist + if obj_copy['position'][0] > 18.5: + return 1 + elif direction == Direction.SOUTH: + obj_copy['position'][1] += dist + if obj_copy['position'][1] > 24: + return 1 + elif direction == Direction.WEST: + obj_copy['position'][0] -= dist + if obj_copy['position'][0] < 2: + return 1 + + for key, value in state['observation'].items(): + for item in value: + if (overlap(obj_copy['position'][0], obj_copy['position'][1], obj_copy['width'], obj_copy['height'], + item['position'][0], item['position'][1], item['width'], item['height'])): + if not (obj_copy == item or ( + 'index' in item.keys() and 'index' in obj_copy.keys() and item['index'] == obj_copy['index'])): + if key == "players": + return 0 + else: + return 1 + return 0 + + def round_float(n, granularity): - return round(round(n / granularity) * granularity, 1) + d = decimal.Decimal(str(granularity)) + precision = -1*d.as_tuple().exponent + return round(round(n / granularity) * granularity, precision) def euclidean_distance(pos1, pos2): From 552ac97e50e62240dce00731292c4ff707ede512 Mon Sep 17 00:00:00 2001 From: marlowfawn Date: Thu, 4 Apr 2024 21:23:20 -0400 Subject: [PATCH 03/22] After much A* work, just built a simple reactive navigation. Needs tweaking. --- enums/direction.py | 4 +-- final_proj/astar_static.py | 59 ++++++++++++++++----------------- final_proj/socket_agent_proj.py | 53 +++++++++++++++++++++-------- helper.py | 11 +++--- 4 files changed, 77 insertions(+), 50 deletions(-) diff --git a/enums/direction.py b/enums/direction.py index 8150fcd..5ba6273 100644 --- a/enums/direction.py +++ b/enums/direction.py @@ -3,7 +3,7 @@ class Direction(Enum): NORTH = 0 - SOUTH = 1 - EAST = 2 + EAST = 1 + SOUTH = 2 WEST = 3 NONE = 4 diff --git a/final_proj/astar_static.py b/final_proj/astar_static.py index 550540c..ae0ae25 100644 --- a/final_proj/astar_static.py +++ b/final_proj/astar_static.py @@ -13,19 +13,21 @@ STEP = 0.3 BUFFER = 0.3 + def init_map(obs): map_ = [] tile = { "position": [0, 0], - "width": 0.6 + BUFFER, - "height": 0.4 + BUFFER + "width": 0.6, + "height": 0.4, + "index": 0 } max_width = 25 max_height = 25 while tile["position"][1] < max_height: map_.append([]) while tile["position"][0] < max_width: - map_[len(map_) - 1].append(project_collision_dyn(tile, obs, Direction.NONE)) + map_[len(map_) - 1].append(project_collision_dyn(tile, obs, Direction.NONE, buffer=BUFFER)) tile["position"][0] += STEP tile["position"][0] = 0 @@ -33,16 +35,26 @@ def init_map(obs): # map_ = update_dyn(map_, obs) + x = np.asarray(map_, np.uint8) + im = Image.fromarray(x, 'P') + im.putpalette([0, 0, 0, # Black + 255, 0, 0, # Red + 0, 255, 0, # g + 0, 255, 255]) # b + im.show() + return map_ -def update_dyn(map_: [[]], state): +def update_dyn(map_: [[]], state, index=0): for player in state['observation']['players']: - x = round(player['position'][0] / 0.15) - y = round(player['position'][1] / 0.15) - for i in range(math.ceil(player['width'] / 0.15)): - for j in range(math.ceil(player['height'] / 0.15)): - map_[y + j][x + i] = 2 + if player['index'] == index: + continue + x = round((player['position'][0] - BUFFER) / STEP) + y = round((player['position'][1] - BUFFER) / STEP) + for i in range(math.ceil((player['width'] + BUFFER) / STEP)): + for j in range(math.ceil((player['height'] + BUFFER) / STEP)): + map_[y + j][x + i] = -1 return map_ @@ -84,21 +96,8 @@ def return_path(current_node): def astar(goal, player, maze): - player_copy = deepcopy(player) - goal_copy = deepcopy(goal) - - start = (round(player_copy['position'][1] / STEP), round(player_copy['position'][0] / STEP)) - end = (round(goal_copy['position'][1] / STEP), round(goal_copy['position'][0] / STEP)) - - # maze[start[1]][start[0]] = 2 - # maze[end[1]][end[0]] = 3 - # x = np.asarray(maze, np.uint8) - # im = Image.fromarray(x, 'P') - # im.putpalette([0, 0, 0, # Black - # 255, 0, 0, # Red - # 0, 255, 0, #g - # 0, 255, 255]) # b - # im.show() + start = (round(player['position'][1] / STEP), round(player['position'][0] / STEP)) + end = (round(goal['position'][1] / STEP), round(goal['position'][0] / STEP)) # Create start and end node start_node = Node(None, start) @@ -147,11 +146,6 @@ def astar(goal, player, maze): # Get node position node_position = (current_node.position[0] + new_position[0], current_node.position[1] + new_position[1]) - # Make sure within range - if node_position[0] > (len(maze) - 1) or node_position[0] < 0 or node_position[1] > ( - len(maze[len(maze) - 1]) - 1) or node_position[1] < 0: - continue - # Make sure walkable terrain if maze[node_position[0]][node_position[1]] != 0: continue @@ -185,9 +179,14 @@ def astar(goal, player, maze): warn("Couldn't get a path to destination") return None + def convert_to_real(loc): return loc * STEP -def convert_to_astar(loc): +def convert_to_index(loc): return round(loc / STEP) + + +def get_pathfind_index(obj): + return f"{convert_to_index(obj['position'][1])},{convert_to_index(obj['position'][0])}" diff --git a/final_proj/socket_agent_proj.py b/final_proj/socket_agent_proj.py index 838e639..6347c1a 100755 --- a/final_proj/socket_agent_proj.py +++ b/final_proj/socket_agent_proj.py @@ -6,10 +6,11 @@ from copy import deepcopy import pandas as pd +import pathfind.graph.transform from enums.direction import Direction -from final_proj.astar_static import astar, init_map, convert_to_astar from final_proj.util import get_geometry +from helper import project_collision from utils import recv_socket_data @@ -94,30 +95,56 @@ def goto(self, goal=None): pass # todo else: print(f"Agent {self.agent_id} going to location {goal} without cart") + self.nav(goal) + + def nav(self, goal): + target = "x" + reached_x = False + reached_y = False + while True: player = self.obs['observation']['players'][self.agent_id] - path = astar(goal, player, init_map(self.obs)) - for node in path: - player = self.obs['observation']['players'][self.agent_id] - player_x = convert_to_astar(player['position'][0]) - player_y = convert_to_astar(player['position'][1]) - if player_x < node[1]: + player_x = player['position'][0] + player_y = player['position'][1] + goal_x = goal['position'][0] + goal_y = goal['position'][1] + + x_dist = abs(player_x - goal_x) + y_dist = abs(player_y - goal_y) + + if target == "x": + if (player_x - goal_x) < -0.15: command = Direction.EAST - elif player_x > node[1]: + elif (player_x - goal_x) > 0.15: command = Direction.WEST - elif player_y < node[0]: + else: + reached_x = True + if y_dist > 0.15: + reached_y = False + target = "y" + continue + else: + if (player_y - goal_y) < -0.15: command = Direction.SOUTH - elif player_y > node[0]: + elif (player_y - goal_y) > 0.15: command = Direction.NORTH else: - continue - + reached_y = True + if x_dist > 0.15: + reached_x = False + target = "x" + continue + + if reached_x and reached_y: + break + else: + while project_collision(player, self.obs, command, 0.4): + command = Direction((command.value + 1) % 4) self.step(command, player['direction']) def step(self, command: Direction, direction: Direction): if not command == direction: self.execute(command.name) self.execute(command.name) - self.execute(command.name) # Agent picks up an item and adds it to the cart def add_to_cart(self): diff --git a/helper.py b/helper.py index 22f9680..6391196 100644 --- a/helper.py +++ b/helper.py @@ -65,7 +65,7 @@ def project_collision(obj, state, direction: Direction, dist=0.4): return False -def project_collision_dyn(obj, state, direction: Direction, dist=0.4): +def project_collision_dyn(obj, state, direction: Direction, dist=0.4, buffer=0): obj_copy = deepcopy(obj) if direction == Direction.NORTH: @@ -88,19 +88,20 @@ def project_collision_dyn(obj, state, direction: Direction, dist=0.4): for key, value in state['observation'].items(): for item in value: if (overlap(obj_copy['position'][0], obj_copy['position'][1], obj_copy['width'], obj_copy['height'], - item['position'][0], item['position'][1], item['width'], item['height'])): + item['position'][0] - buffer, item['position'][1] - buffer, item['width'] + buffer, + item['height'] + buffer)): if not (obj_copy == item or ( 'index' in item.keys() and 'index' in obj_copy.keys() and item['index'] == obj_copy['index'])): if key == "players": - return 0 + return -1 else: - return 1 + return -1 return 0 def round_float(n, granularity): d = decimal.Decimal(str(granularity)) - precision = -1*d.as_tuple().exponent + precision = -1 * d.as_tuple().exponent return round(round(n / granularity) * granularity, precision) From 40b963cede40d5a3a8c7d2bb73f504f9ba8df577 Mon Sep 17 00:00:00 2001 From: marlowfawn Date: Thu, 11 Apr 2024 15:54:08 -0400 Subject: [PATCH 04/22] Bug fixes to navigation. Still need to figure out player radius --- final_proj/socket_agent_proj.py | 54 ++++++++++++++++----------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/final_proj/socket_agent_proj.py b/final_proj/socket_agent_proj.py index 6347c1a..6baec2c 100755 --- a/final_proj/socket_agent_proj.py +++ b/final_proj/socket_agent_proj.py @@ -14,6 +14,8 @@ from utils import recv_socket_data +STEP = 0.15 + # todo: update with Helen's method for making interaction areas? def populate_locs(observation): locs: dict = {} @@ -103,46 +105,42 @@ def nav(self, goal): reached_y = False while True: player = self.obs['observation']['players'][self.agent_id] - player_x = player['position'][0] - player_y = player['position'][1] - goal_x = goal['position'][0] - goal_y = goal['position'][1] - x_dist = abs(player_x - goal_x) - y_dist = abs(player_y - goal_y) + x_dist = player['position'][0] - goal['position'][0] + y_dist = player['position'][1] - goal['position'][1] + + if abs(x_dist) < STEP: + reached_x = True + if abs(y_dist) < STEP: + reached_y = True + if reached_x and reached_y: + break if target == "x": - if (player_x - goal_x) < -0.15: + if x_dist < -STEP: command = Direction.EAST - elif (player_x - goal_x) > 0.15: + elif x_dist > STEP: command = Direction.WEST else: - reached_x = True - if y_dist > 0.15: - reached_y = False - target = "y" - continue + reached_y = False + target = "y" + continue else: - if (player_y - goal_y) < -0.15: + if y_dist < -STEP: command = Direction.SOUTH - elif (player_y - goal_y) > 0.15: + elif y_dist > STEP: command = Direction.NORTH else: - reached_y = True - if x_dist > 0.15: - reached_x = False - target = "x" - continue + reached_x = False + target = "x" + continue - if reached_x and reached_y: - break - else: - while project_collision(player, self.obs, command, 0.4): - command = Direction((command.value + 1) % 4) - self.step(command, player['direction']) + while project_collision(player, self.obs, command, 0.8): + command = Direction((command.value + 1) % 4) + self.step(command, player) - def step(self, command: Direction, direction: Direction): - if not command == direction: + def step(self, command: Direction, player): + if not command == player['direction']: self.execute(command.name) self.execute(command.name) From 5add8e116324cd799023fbdf903b2272eb8a40d5 Mon Sep 17 00:00:00 2001 From: Helen Date: Mon, 22 Apr 2024 22:24:33 -0400 Subject: [PATCH 05/22] utils for adding interact boxes --- .DS_Store | Bin 10244 -> 8196 bytes final_proj/constants.py | 38 +++ final_proj/env.json | 551 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 589 insertions(+) create mode 100644 final_proj/constants.py create mode 100644 final_proj/env.json diff --git a/.DS_Store b/.DS_Store index c1b992f7ae0d87705aafe5b3628c8d39615193e7..b8334b677d5c62e9f6b4fe5688fa91a7b39c0da5 100644 GIT binary patch delta 112 zcmZn(XmOBWU|?W$DortDU;r^WfEYvza8E20o2aMAD77(QH$S7)W*z}X#?66(o0vD} ziq2x(>?*#FQIHv^5C|l=frKka&&I;<%#-<50y!8VCNWHo=b5^BwP*}T!)itVnY0#c delta 397 zcmZp1XbF&DU|?W$DortDU{C-uIe-{M3-C-V6q~50$SAilU^hRb+-4pDMn+2^hE#?e zATDD_WGG?CXDDKbXUJtJWhiFIWJqSvV<-oTmwD#oCnx3PCxJ`>n!N&u%QrI#?q%j= z2P#ekD$SdGKvY77Va9(j0IFkP-~&q)0L{w*Do6sFoCw5~lN$s?_?TLNMsUCsZ{8y^ zmr Date: Mon, 22 Apr 2024 22:51:25 -0400 Subject: [PATCH 06/22] added docstrings to make interact box funcs easier to understand --- final_proj/util.py | 173 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) diff --git a/final_proj/util.py b/final_proj/util.py index dd34c76..1b1c9c0 100644 --- a/final_proj/util.py +++ b/final_proj/util.py @@ -1,3 +1,7 @@ +import time +import json +import copy +from constants import * from copy import deepcopy @@ -8,3 +12,172 @@ def get_geometry(obj): "height": obj_copy["height"], "width": obj_copy["width"] } + + +def recv_socket_data(sock): + BUFF_SIZE = 4096 # 4 KiB + data = b'' + while True: + time.sleep(0.00001) + part = sock.recv(BUFF_SIZE) + data += part + if len(part) < BUFF_SIZE: + # either 0 or end of data + break + + return data + +def euclidean_distance(pos1, pos2): + # Calculate Euclidean distance between two points + return ((pos1[0] - pos2[0])**2 + (pos1[1] - pos2[1])**2)**0.5 + +def bounding_box(place:dict) -> dict: + """find the bounding box for a place. + + Args: + place (dict): a dictionary containing height, width and position of the object + + Returns: + dict: a dictionary containing the northmost y, the southmost y, and westmost x and the eastmost x + """ + upper_left = place['position'] + height = place['height'] + width = place['width'] + return {"northmost":upper_left[1], "westmost":upper_left[0], "southmost":upper_left[1]+height, "eastmost":upper_left[0]+width} + +def player_interact_area(player) -> list: + interact_boxes = four_side_interact_area(player) + dir = player['direction'] + player['interact_box'] = interact_boxes[dir] + return player['interact_box'] + +def one_side_interact_area(place_obj) -> list: + place_bounding_box = bounding_box(place_obj) + # player needs to be within one of the interact boxes and facing the object to interact + # these place objects can only be accessed from the north side e.g. cart returns + interact_box = copy.deepcopy(place_bounding_box) + interact_box['southmost'] = interact_box['northmost'] + interact_box['northmost'] -= interact_distance + interact_box['player_needs_to_face'] = 'SOUTH' + return [interact_box] + +def two_side_interact_area(place_obj) -> list: + place_bounding_box = bounding_box(place_obj) + # player needs to be within one of the interact boxes and facing the object to interact + # these place objects can only be accessed from two sides + interact_boxes = one_side_interact_area(place_obj) + south_interact_box = copy.deepcopy(place_bounding_box) + south_interact_box['northmost'] = place_bounding_box['southmost'] + south_interact_box['southmost'] += interact_distance + south_interact_box['player_needs_to_face'] = 'NORTH' + interact_boxes = [interact_boxes[0], south_interact_box] + return interact_boxes + +def four_side_interact_area(place_obj:dict) -> dict: + place_bounding_box = bounding_box(place_obj) + # player needs to be within interact box to interact + interact_boxes = two_side_interact_area(place_obj) + west_interact_box = copy.deepcopy(place_bounding_box) + west_interact_box['eastmost'] = place_bounding_box['westmost'] + west_interact_box['westmost'] -= interact_distance + west_interact_box['player_needs_to_face'] = 'EAST' + east_interact_box = copy.deepcopy(place_bounding_box) + east_interact_box['westmost'] = place_bounding_box['eastmost'] + east_interact_box['eastmost'] += interact_distance + east_interact_box['player_needs_to_face'] = 'WEST' + interact_boxes.append(east_interact_box) + interact_boxes.append(west_interact_box) + return interact_boxes + +def overlap(player, interact_box): + return ( + interact_box['northmost'] <= player['bounding_box']['northmost'] <= interact_box['southmost'] and ( + (interact_box['westmost'] <= player['bounding_box']['westmost'] <= interact_box['eastmost']) + or + (interact_box['westmost'] <= player['bounding_box']['eastmost'] <= interact_box['eastmost']) + ) + or + interact_box['northmost'] <= player['bounding_box']['southmost'] <= interact_box['southmost'] and ( + (interact_box['westmost'] <= player['bounding_box']['westmost'] <= interact_box['eastmost']) + or + (interact_box['westmost'] <= player['bounding_box']['eastmost'] <= interact_box['eastmost']) + ) + ) + +def can_interact_player(player, place_obj) -> bool: + """Returns whether the `player` object can interact with the `place_obj` based on their interact boxes + + Args: + player (dict): a player dictionary containing the player's interact boxes + place_obj (dict): a place object containing the place's interact boxes + + Returns: + bool: whether the player and the place can interact + """ + for interact_box in place_obj['interact_boxes']: + if overlap(player=player, interact_box=interact_box) and player_directions[player['direction']] == interact_box['player_needs_to_face']: + return True + return False + +def loc_in_interact_box(box, loc) -> bool: + return ( + box['northmost'] <= loc[1] <= box['southmost'] and box['westmost'] <= loc[0] <= box['eastmost'] + ) + +def x_in_interact_box(box, x) -> bool: + return ( + box['westmost'] <= x <= box['eastmost'] + ) + +def y_in_interact_box(box, y) -> bool: + return ( + box['northmost'] <= y <= box['southmost'] + ) + + +def add_interact_boxes_to_obs(obs) -> dict: + """Add interact boxes to objects in the observation + + Args: + obs (dict): the observation dictionary + + Returns: + dict: obs with interact boxes added to its obejcts + """ + for object_name in obs: + object_list = obs[object_name] + for _, obj_dict in enumerate(object_list): + if object_name == 'players': + obj_dict['bounding_box'] = bounding_box(obj_dict) + elif object_name == "cartReturns": + obj_dict["interact_boxes"] = one_side_interact_area(obj_dict) + elif object_name == "baskets": + obj_dict["interact_boxes"] = four_side_interact_area(obj_dict) + elif object_name == "carts": + possible_boxes = four_side_interact_area(obj_dict) + obj_dir = player_directions[obj_dict['direction']] + if obj_dir == 'NORTH': + obj_dict["interact_boxes"] = [possible_boxes[1]] + elif obj_dir == 'SOUTH': + obj_dict["interact_boxes"] = [possible_boxes[0]] + elif obj_dir == 'WEST': + obj_dict["interact_boxes"] = [possible_boxes[2]] + else: + obj_dict["interact_boxes"] = [possible_boxes[3]] + elif object_name == "shelves": + obj_dict['interact_boxes'] = two_side_interact_area(obj_dict) + else: + obj_dict["interact_boxes"] = four_side_interact_area(obj_dict) + return obs + +if __name__ == "__main__": + # run this to test adding interact boxes to objects in env.json (json version of the env object) + f = open("env.json") + obs = json.load(f) + # test adding interact boxes to each object in the environment + obs = add_interact_boxes_to_obs(obs) + with open('env_interact_boxes.json', 'w') as file: + # Write the dictionary to the JSON file + json.dump(obs, file, indent=4) + + From 4e63089a61ff10ecb33d4746cf8b3438a9cb237c Mon Sep 17 00:00:00 2001 From: Helen Date: Mon, 22 Apr 2024 23:49:15 -0400 Subject: [PATCH 07/22] example environment after adding interaction areas --- .gitignore | 2 + final_proj/env_interact_boxes.json | 1229 ++++++++++++++++++++++++++++ 2 files changed, 1231 insertions(+) create mode 100644 .gitignore create mode 100644 final_proj/env_interact_boxes.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0f2994f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode/ +*__pycache__* \ No newline at end of file diff --git a/final_proj/env_interact_boxes.json b/final_proj/env_interact_boxes.json new file mode 100644 index 0000000..816b62e --- /dev/null +++ b/final_proj/env_interact_boxes.json @@ -0,0 +1,1229 @@ +{ + "carts": [], + "baskets": [], + "registers": [ + { + "height": 2.5, + "width": 2.25, + "position": [ + 1, + 4.5 + ], + "num_items": 0, + "foods": [], + "food_quantities": [], + "food_images": [], + "capacity": 12, + "image": "images/Registers/registersA.png", + "curr_player": null, + "interact_boxes": [ + { + "northmost": 7.0, + "westmost": 1, + "southmost": 7.35, + "eastmost": 3.25, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 4.15, + "westmost": 1, + "southmost": 4.5, + "eastmost": 3.25, + "player_needs_to_face": "SOUTH" + }, + { + "northmost": 4.5, + "westmost": 0.65, + "southmost": 7.0, + "eastmost": 1, + "player_needs_to_face": "EAST" + }, + { + "northmost": 4.5, + "westmost": 3.25, + "southmost": 7.0, + "eastmost": 3.6, + "player_needs_to_face": "WEST" + } + ] + }, + { + "height": 2.5, + "width": 2.25, + "position": [ + 1, + 9.5 + ], + "num_items": 0, + "foods": [], + "food_quantities": [], + "food_images": [], + "capacity": 12, + "image": "images/Registers/registersB.png", + "curr_player": null, + "interact_boxes": [ + { + "northmost": 12.0, + "westmost": 1, + "southmost": 12.35, + "eastmost": 3.25, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 9.15, + "westmost": 1, + "southmost": 9.5, + "eastmost": 3.25, + "player_needs_to_face": "SOUTH" + }, + { + "northmost": 9.5, + "westmost": 0.65, + "southmost": 12.0, + "eastmost": 1, + "player_needs_to_face": "EAST" + }, + { + "northmost": 9.5, + "westmost": 3.25, + "southmost": 12.0, + "eastmost": 3.6, + "player_needs_to_face": "WEST" + } + ] + } + ], + "shelves": [ + { + "height": 1, + "width": 2, + "position": [ + 5.5, + 1.5 + ], + "food": "milk", + "price": 2, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/milk.png", + "shelf_image": "images/Shelves/fridge.png", + "food_name": "milk", + "interact_boxes": [ + { + "northmost": 2.5, + "westmost": 5.5, + "southmost": 2.85, + "eastmost": 7.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 1.15, + "westmost": 5.5, + "southmost": 1.5, + "eastmost": 7.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 7.5, + 1.5 + ], + "food": "milk", + "price": 2, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/milk.png", + "shelf_image": "images/Shelves/fridge.png", + "food_name": "milk", + "interact_boxes": [ + { + "northmost": 2.5, + "westmost": 7.5, + "southmost": 2.85, + "eastmost": 9.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 1.15, + "westmost": 7.5, + "southmost": 1.5, + "eastmost": 9.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 9.5, + 1.5 + ], + "food": "chocolate milk", + "price": 2, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/milk_chocolate.png", + "shelf_image": "images/Shelves/fridge.png", + "food_name": "chocolate milk", + "interact_boxes": [ + { + "northmost": 2.5, + "westmost": 9.5, + "southmost": 2.85, + "eastmost": 11.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 1.15, + "westmost": 9.5, + "southmost": 1.5, + "eastmost": 11.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 11.5, + 1.5 + ], + "food": "chocolate milk", + "price": 2, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/milk_chocolate.png", + "shelf_image": "images/Shelves/fridge.png", + "food_name": "chocolate milk", + "interact_boxes": [ + { + "northmost": 2.5, + "westmost": 11.5, + "southmost": 2.85, + "eastmost": 13.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 1.15, + "westmost": 11.5, + "southmost": 1.5, + "eastmost": 13.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 13.5, + 1.5 + ], + "food": "strawberry milk", + "price": 2, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/milk_strawberry.png", + "shelf_image": "images/Shelves/fridge.png", + "food_name": "strawberry milk", + "interact_boxes": [ + { + "northmost": 2.5, + "westmost": 13.5, + "southmost": 2.85, + "eastmost": 15.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 1.15, + "westmost": 13.5, + "southmost": 1.5, + "eastmost": 15.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 5.5, + 5.5 + ], + "food": "apples", + "price": 5, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/apples.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "apples", + "interact_boxes": [ + { + "northmost": 6.5, + "westmost": 5.5, + "southmost": 6.85, + "eastmost": 7.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 5.15, + "westmost": 5.5, + "southmost": 5.5, + "eastmost": 7.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 7.5, + 5.5 + ], + "food": "oranges", + "price": 5, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/oranges.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "oranges", + "interact_boxes": [ + { + "northmost": 6.5, + "westmost": 7.5, + "southmost": 6.85, + "eastmost": 9.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 5.15, + "westmost": 7.5, + "southmost": 5.5, + "eastmost": 9.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 9.5, + 5.5 + ], + "food": "banana", + "price": 1, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/banana.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "banana", + "interact_boxes": [ + { + "northmost": 6.5, + "westmost": 9.5, + "southmost": 6.85, + "eastmost": 11.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 5.15, + "westmost": 9.5, + "southmost": 5.5, + "eastmost": 11.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 11.5, + 5.5 + ], + "food": "strawberry", + "price": 1, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/strawberry.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "strawberry", + "interact_boxes": [ + { + "northmost": 6.5, + "westmost": 11.5, + "southmost": 6.85, + "eastmost": 13.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 5.15, + "westmost": 11.5, + "southmost": 5.5, + "eastmost": 13.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 13.5, + 5.5 + ], + "food": "raspberry", + "price": 1, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/raspberry.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "raspberry", + "interact_boxes": [ + { + "northmost": 6.5, + "westmost": 13.5, + "southmost": 6.85, + "eastmost": 15.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 5.15, + "westmost": 13.5, + "southmost": 5.5, + "eastmost": 15.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 5.5, + 9.5 + ], + "food": "sausage", + "price": 4, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/sausage.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "sausage", + "interact_boxes": [ + { + "northmost": 10.5, + "westmost": 5.5, + "southmost": 10.85, + "eastmost": 7.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 9.15, + "westmost": 5.5, + "southmost": 9.5, + "eastmost": 7.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 7.5, + 9.5 + ], + "food": "steak", + "price": 5, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/meat_01.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "steak", + "interact_boxes": [ + { + "northmost": 10.5, + "westmost": 7.5, + "southmost": 10.85, + "eastmost": 9.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 9.15, + "westmost": 7.5, + "southmost": 9.5, + "eastmost": 9.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 9.5, + 9.5 + ], + "food": "steak", + "price": 5, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/meat_02.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "steak", + "interact_boxes": [ + { + "northmost": 10.5, + "westmost": 9.5, + "southmost": 10.85, + "eastmost": 11.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 9.15, + "westmost": 9.5, + "southmost": 9.5, + "eastmost": 11.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 11.5, + 9.5 + ], + "food": "chicken", + "price": 6, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/meat_03.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "chicken", + "interact_boxes": [ + { + "northmost": 10.5, + "westmost": 11.5, + "southmost": 10.85, + "eastmost": 13.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 9.15, + "westmost": 11.5, + "southmost": 9.5, + "eastmost": 13.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 13.5, + 9.5 + ], + "food": "ham", + "price": 6, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/ham.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "ham", + "interact_boxes": [ + { + "northmost": 10.5, + "westmost": 13.5, + "southmost": 10.85, + "eastmost": 15.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 9.15, + "westmost": 13.5, + "southmost": 9.5, + "eastmost": 15.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 5.5, + 13.5 + ], + "food": "brie cheese", + "price": 5, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/cheese_01.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "brie cheese", + "interact_boxes": [ + { + "northmost": 14.5, + "westmost": 5.5, + "southmost": 14.85, + "eastmost": 7.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 13.15, + "westmost": 5.5, + "southmost": 13.5, + "eastmost": 7.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 7.5, + 13.5 + ], + "food": "swiss cheese", + "price": 5, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/cheese_02.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "swiss cheese", + "interact_boxes": [ + { + "northmost": 14.5, + "westmost": 7.5, + "southmost": 14.85, + "eastmost": 9.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 13.15, + "westmost": 7.5, + "southmost": 13.5, + "eastmost": 9.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 9.5, + 13.5 + ], + "food": "cheese wheel", + "price": 15, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/cheese_03.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "cheese wheel", + "interact_boxes": [ + { + "northmost": 14.5, + "westmost": 9.5, + "southmost": 14.85, + "eastmost": 11.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 13.15, + "westmost": 9.5, + "southmost": 13.5, + "eastmost": 11.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 11.5, + 13.5 + ], + "food": "cheese wheel", + "price": 15, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/cheese_03.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "cheese wheel", + "interact_boxes": [ + { + "northmost": 14.5, + "westmost": 11.5, + "southmost": 14.85, + "eastmost": 13.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 13.15, + "westmost": 11.5, + "southmost": 13.5, + "eastmost": 13.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 13.5, + 13.5 + ], + "food": "cheese wheel", + "price": 15, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/cheese_03.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "cheese wheel", + "interact_boxes": [ + { + "northmost": 14.5, + "westmost": 13.5, + "southmost": 14.85, + "eastmost": 15.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 13.15, + "westmost": 13.5, + "southmost": 13.5, + "eastmost": 15.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 5.5, + 17.5 + ], + "food": "garlic", + "price": 2, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/garlic.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "garlic", + "interact_boxes": [ + { + "northmost": 18.5, + "westmost": 5.5, + "southmost": 18.85, + "eastmost": 7.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 17.15, + "westmost": 5.5, + "southmost": 17.5, + "eastmost": 7.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 7.5, + 17.5 + ], + "food": "leek", + "price": 1, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/leek_onion.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "leek", + "interact_boxes": [ + { + "northmost": 18.5, + "westmost": 7.5, + "southmost": 18.85, + "eastmost": 9.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 17.15, + "westmost": 7.5, + "southmost": 17.5, + "eastmost": 9.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 9.5, + 17.5 + ], + "food": "red bell pepper", + "price": 2, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/bell_pepper_red.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "red bell pepper", + "interact_boxes": [ + { + "northmost": 18.5, + "westmost": 9.5, + "southmost": 18.85, + "eastmost": 11.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 17.15, + "westmost": 9.5, + "southmost": 17.5, + "eastmost": 11.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 11.5, + 17.5 + ], + "food": "carrot", + "price": 1, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/carrot.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "carrot", + "interact_boxes": [ + { + "northmost": 18.5, + "westmost": 11.5, + "southmost": 18.85, + "eastmost": 13.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 17.15, + "westmost": 11.5, + "southmost": 17.5, + "eastmost": 13.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 13.5, + 17.5 + ], + "food": "lettuce", + "price": 2, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/lettuce.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "lettuce", + "interact_boxes": [ + { + "northmost": 18.5, + "westmost": 13.5, + "southmost": 18.85, + "eastmost": 15.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 17.15, + "westmost": 13.5, + "southmost": 17.5, + "eastmost": 15.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 5.5, + 21.5 + ], + "food": "avocado", + "price": 2, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/avocado.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "avocado", + "interact_boxes": [ + { + "northmost": 22.5, + "westmost": 5.5, + "southmost": 22.85, + "eastmost": 7.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 21.15, + "westmost": 5.5, + "southmost": 21.5, + "eastmost": 7.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 7.5, + 21.5 + ], + "food": "broccoli", + "price": 1, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/broccoli.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "broccoli", + "interact_boxes": [ + { + "northmost": 22.5, + "westmost": 7.5, + "southmost": 22.85, + "eastmost": 9.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 21.15, + "westmost": 7.5, + "southmost": 21.5, + "eastmost": 9.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 9.5, + 21.5 + ], + "food": "cucumber", + "price": 2, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/cucumber.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "cucumber", + "interact_boxes": [ + { + "northmost": 22.5, + "westmost": 9.5, + "southmost": 22.85, + "eastmost": 11.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 21.15, + "westmost": 9.5, + "southmost": 21.5, + "eastmost": 11.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 11.5, + 21.5 + ], + "food": "yellow bell pepper", + "price": 2, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/bell_pepper_yellow.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "yellow bell pepper", + "interact_boxes": [ + { + "northmost": 22.5, + "westmost": 11.5, + "southmost": 22.85, + "eastmost": 13.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 21.15, + "westmost": 11.5, + "southmost": 21.5, + "eastmost": 13.5, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 1, + "width": 2, + "position": [ + 13.5, + 21.5 + ], + "food": "onion", + "price": 2, + "capacity": 12, + "quantity": 12, + "food_image": "images/food/onion.png", + "shelf_image": "images/Shelves/shelf.png", + "food_name": "onion", + "interact_boxes": [ + { + "northmost": 22.5, + "westmost": 13.5, + "southmost": 22.85, + "eastmost": 15.5, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 21.15, + "westmost": 13.5, + "southmost": 21.5, + "eastmost": 15.5, + "player_needs_to_face": "SOUTH" + } + ] + } + ], + "cartReturns": [ + { + "height": 6, + "width": 0.7, + "position": [ + 1, + 18.5 + ], + "quantity": 5, + "interact_boxes": [ + { + "northmost": 18.15, + "westmost": 1, + "southmost": 18.5, + "eastmost": 1.7, + "player_needs_to_face": "SOUTH" + } + ] + }, + { + "height": 6, + "width": 0.7, + "position": [ + 2, + 18.5 + ], + "quantity": 6, + "interact_boxes": [ + { + "northmost": 18.15, + "westmost": 2, + "southmost": 18.5, + "eastmost": 2.7, + "player_needs_to_face": "SOUTH" + } + ] + } + ], + "basketReturns": [ + { + "height": 0.2, + "width": 0.3, + "position": [ + 3.5, + 18.5 + ], + "quantity": 12, + "interact_boxes": [ + { + "northmost": 18.7, + "westmost": 3.5, + "southmost": 19.05, + "eastmost": 3.8, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 18.15, + "westmost": 3.5, + "southmost": 18.5, + "eastmost": 3.8, + "player_needs_to_face": "SOUTH" + }, + { + "northmost": 18.5, + "westmost": 3.15, + "southmost": 18.7, + "eastmost": 3.5, + "player_needs_to_face": "EAST" + }, + { + "northmost": 18.5, + "westmost": 3.8, + "southmost": 18.7, + "eastmost": 4.1499999999999995, + "player_needs_to_face": "WEST" + } + ] + } + ], + "counters": [ + { + "height": 2.25, + "width": 1.5, + "position": [ + 18.25, + 4.75 + ], + "food": "prepared foods", + "price": 15, + "interact_boxes": [ + { + "northmost": 7.0, + "westmost": 18.25, + "southmost": 7.35, + "eastmost": 19.75, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 4.4, + "westmost": 18.25, + "southmost": 4.75, + "eastmost": 19.75, + "player_needs_to_face": "SOUTH" + }, + { + "northmost": 4.75, + "westmost": 17.9, + "southmost": 7.0, + "eastmost": 18.25, + "player_needs_to_face": "EAST" + }, + { + "northmost": 4.75, + "westmost": 19.75, + "southmost": 7.0, + "eastmost": 20.1, + "player_needs_to_face": "WEST" + } + ] + }, + { + "height": 2.25, + "width": 1.5, + "position": [ + 18.25, + 10.75 + ], + "food": "fresh fish", + "price": 12, + "interact_boxes": [ + { + "northmost": 13.0, + "westmost": 18.25, + "southmost": 13.35, + "eastmost": 19.75, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 10.4, + "westmost": 18.25, + "southmost": 10.75, + "eastmost": 19.75, + "player_needs_to_face": "SOUTH" + }, + { + "northmost": 10.75, + "westmost": 17.9, + "southmost": 13.0, + "eastmost": 18.25, + "player_needs_to_face": "EAST" + }, + { + "northmost": 10.75, + "westmost": 19.75, + "southmost": 13.0, + "eastmost": 20.1, + "player_needs_to_face": "WEST" + } + ] + }, + { + "height": 2.25, + "width": 1.5, + "position": [ + 18.25, + 10.75 + ], + "food": "fresh fish", + "price": 12, + "interact_boxes": [ + { + "northmost": 13.0, + "westmost": 18.25, + "southmost": 13.35, + "eastmost": 19.75, + "player_needs_to_face": "NORTH" + }, + { + "northmost": 10.4, + "westmost": 18.25, + "southmost": 10.75, + "eastmost": 19.75, + "player_needs_to_face": "SOUTH" + }, + { + "northmost": 10.75, + "westmost": 17.9, + "southmost": 13.0, + "eastmost": 18.25, + "player_needs_to_face": "EAST" + }, + { + "northmost": 10.75, + "westmost": 19.75, + "southmost": 13.0, + "eastmost": 20.1, + "player_needs_to_face": "WEST" + } + ] + } + ] +} \ No newline at end of file From 5337c033feb1c3223038113ea34d1f0123bd1d6d Mon Sep 17 00:00:00 2001 From: Helen Date: Tue, 23 Apr 2024 00:02:49 -0400 Subject: [PATCH 08/22] added interaction areas to locs --- final_proj/socket_agent_proj.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/final_proj/socket_agent_proj.py b/final_proj/socket_agent_proj.py index 6baec2c..e6e4662 100755 --- a/final_proj/socket_agent_proj.py +++ b/final_proj/socket_agent_proj.py @@ -11,38 +11,45 @@ from enums.direction import Direction from final_proj.util import get_geometry from helper import project_collision -from utils import recv_socket_data +from util import * STEP = 0.15 # todo: update with Helen's method for making interaction areas? def populate_locs(observation): + # add interaction areas to objects in the observation + obs_with_boxes = add_interact_boxes_to_obs(obs=observation) locs: dict = {} - for idx, obj in enumerate(observation['registers']): + for idx, obj in enumerate(obs_with_boxes['registers']): geometry = get_geometry(obj) geometry['position'][0] += geometry['width'] + 1 + geometry['interact_boxes'] = obj['interact_boxes'] locs[f'register {idx}'] = geometry - for idx, obj in enumerate(observation['cartReturns']): + for idx, obj in enumerate(obs_with_boxes['cartReturns']): geometry = get_geometry(obj) geometry['position'][1] -= 1 + geometry['interact_boxes'] = obj['interact_boxes'] locs[f'cartReturn {idx}'] = geometry - for idx, obj in enumerate(observation['basketReturns']): + for idx, obj in enumerate(obs_with_boxes['basketReturns']): geometry = get_geometry(obj) geometry['position'][1] -= 1 + geometry['interact_boxes'] = obj['interact_boxes'] locs[f'basketReturn {idx}'] = geometry - for obj in observation['counters']: + for obj in obs_with_boxes['counters']: geometry = get_geometry(obj) geometry['position'][0] -= 1 + geometry['interact_boxes'] = obj['interact_boxes'] locs[obj['food']] = geometry - for obj in observation['shelves']: + for obj in obs_with_boxes['shelves']: geometry = get_geometry(obj) geometry['position'][1] += geometry['height'] + 1 + geometry['interact_boxes'] = obj['interact_boxes'] locs[obj['food']] = geometry return locs From 713381b5ba910a127ffd85a87d9b7e305b9cd569 Mon Sep 17 00:00:00 2001 From: Helen Date: Wed, 24 Apr 2024 11:07:15 -0400 Subject: [PATCH 09/22] fixed issue with interact in the env --- helper.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/helper.py b/helper.py index 6391196..b7a6807 100644 --- a/helper.py +++ b/helper.py @@ -25,13 +25,13 @@ def pos_collision(x1, y1, x2, y2, x_margin, y_margin): def can_interact_default(obj, player, range=0.5): if player.direction == Direction.NORTH: - return obj.collision(player, obj['position'][0], obj['position'][1] - range) + return obj.collision(player, player.position[0], player.position[1] - range) elif player.direction == Direction.SOUTH: - return obj.collision(player, obj['position'][0], obj['position'][1] + range) + return obj.collision(player, player.position[0], player.position[1] + range) elif player.direction == Direction.WEST: - return obj.collision(player, obj['position'][0] - range, obj['position'][1]) + return obj.collision(player, player.position[0] - range, player.position[1]) elif player.direction == Direction.EAST: - return obj.collision(player, obj['position'][0] + range, obj['position'][1]) + return obj.collision(player, player.position[0] + range, player.position[1]) return False From 9be1aab04aee2bcd0c373456df01e43cdd28fea6 Mon Sep 17 00:00:00 2001 From: Helen Date: Wed, 24 Apr 2024 12:15:25 -0400 Subject: [PATCH 10/22] using the ta's astar --- final_proj/astar_path_planner.py | 437 +++++++++++++++++++++++++++++++ final_proj/constants.py | 57 +++- final_proj/socket_agent_proj.py | 173 ++++++++---- final_proj/util.py | 5 + 4 files changed, 615 insertions(+), 57 deletions(-) create mode 100644 final_proj/astar_path_planner.py diff --git a/final_proj/astar_path_planner.py b/final_proj/astar_path_planner.py new file mode 100644 index 0000000..404c887 --- /dev/null +++ b/final_proj/astar_path_planner.py @@ -0,0 +1,437 @@ + +import numpy as np +from utils import recv_socket_data +import json +from queue import PriorityQueue + +import json +import socket + +from utils import recv_socket_data + +cartReturns = [2, 18.5] +basketReturns = [3.5, 18.5] +registerReturns_1 = [2, 4.5] +registerReturns_2 = [2, 9.5] + +offset = 1 + +objs = [ + {'height': 2.5, 'width': 3, 'position': [0.2, 4.5], 're_centered_position': [2.125, 5.75]}, + {'height': 2.5, 'width': 3, 'position': [0.2, 9.5], 're_centered_position': [2.125, 10.75]}, + {'height': 1, 'width': 2, 'position': [5.5, 1.5], 're_centered_position': [6.5, 2]}, + {'height': 1, 'width': 2, 'position': [7.5, 1.5], 're_centered_position': [8.5, 2]}, + {'height': 1, 'width': 2, 'position': [9.5, 1.5], 're_centered_position': [10.5, 2]}, + {'height': 1, 'width': 2, 'position': [11.5, 1.5], 're_centered_position': [12.5, 2]}, + {'height': 1, 'width': 2, 'position': [13.5, 1.5], 're_centered_position': [14.5, 2]}, + {'height': 1, 'width': 2, 'position': [5.5, 5.5], 're_centered_position': [6.5, 6]}, + {'height': 1, 'width': 2, 'position': [7.5, 5.5], 're_centered_position': [8.5, 6]}, + {'height': 1, 'width': 2, 'position': [9.5, 5.5], 're_centered_position': [10.5, 6]}, + {'height': 1, 'width': 2, 'position': [11.5, 5.5], 're_centered_position': [12.5, 6]}, + {'height': 1, 'width': 2, 'position': [13.5, 5.5], 're_centered_position': [14.5, 6]}, + {'height': 1, 'width': 2, 'position': [5.5, 9.5], 're_centered_position': [6.5, 10]}, + {'height': 1, 'width': 2, 'position': [7.5, 9.5], 're_centered_position': [8.5, 10]}, + {'height': 1, 'width': 2, 'position': [9.5, 9.5], 're_centered_position': [10.5, 10]}, + {'height': 1, 'width': 2, 'position': [11.5, 9.5], 're_centered_position': [12.5, 10]}, + {'height': 1, 'width': 2, 'position': [13.5, 9.5], 're_centered_position': [14.5, 10]}, + {'height': 1, 'width': 2, 'position': [5.5, 13.5], 're_centered_position': [6.5, 14]}, + {'height': 1, 'width': 2, 'position': [7.5, 13.5], 're_centered_position': [8.5, 14]}, + {'height': 1, 'width': 2, 'position': [9.5, 13.5], 're_centered_position': [10.5, 14]}, + {'height': 1, 'width': 2, 'position': [11.5, 13.5], 're_centered_position': [12.5, 14]}, + {'height': 1, 'width': 2, 'position': [13.5, 13.5], 're_centered_position': [14.5, 14]}, + {'height': 1, 'width': 2, 'position': [5.5, 17.5], 're_centered_position': [6.5, 18]}, + {'height': 1, 'width': 2, 'position': [7.5, 17.5], 're_centered_position': [8.5, 18]}, + {'height': 1, 'width': 2, 'position': [9.5, 17.5], 're_centered_position': [10.5, 18]}, + {'height': 1, 'width': 2, 'position': [11.5, 17.5], 're_centered_position': [12.5, 18]}, + {'height': 1, 'width': 2, 'position': [13.5, 17.5], 're_centered_position': [14.5, 18]}, + {'height': 1, 'width': 2, 'position': [5.5, 21.5], 're_centered_position': [6.5, 22]}, + {'height': 1, 'width': 2, 'position': [7.5, 21.5], 're_centered_position': [8.5, 22]}, + {'height': 1, 'width': 2, 'position': [9.5, 21.5], 're_centered_position': [10.5, 22]}, + {'height': 1, 'width': 2, 'position': [11.5, 21.5], 're_centered_position': [12.5, 22]}, + {'height': 1, 'width': 2, 'position': [13.5, 21.5], 're_centered_position': [14.5, 22]}, + {'height': 6, 'width': 0.7, 'position': [1, 18.5], 're_centered_position': [1.35, 21.5]}, + {'height': 6, 'width': 0.7, 'position': [2, 18.5], 're_centered_position': [2.35, 21.5]}, + {'height': 0.8, 'width': 0.8, 'position': [3.5, 18.5], 're_centered_position': [4.15, 19.4]}, + {'height': 2.25, 'width': 1.5, 'position': [18.25, 4.75], 're_centered_position': [19.125, 5.875]}, + {'height': 2.25, 'width': 1.5, 'position': [18.25, 10.75], 're_centered_position': [19.125, 11.875]} +] + + +def update_position_to_center(obj_pose): + """ + Update the position of objects to their re_centered_position if their current position matches obj_pose. + + Parameters: + objects (list of dicts): List of objects with details including position and re_centered_position. + obj_pose (list): The position to match for updating to re_centered_position. + + Returns: + None: Objects are modified in place. + """ + global objs + for obj in objs: + # Compare current position with obj_pose + if obj['position'] == obj_pose: + # If they match, update position to re_centered_position + obj_pose = obj['re_centered_position'] + break + return obj_pose + + +class Astar_agent: + def __init__(self, socket_game, env): + self.shopping_list = env['observation']['players'][0]['shopping_list'] + self.shopping_quant = env['observation']['players'][0]['list_quant'] + self.game = socket_game + self.map_width = 20 + self.map_height = 25 + self.obs = env['observation'] + self.cart = None + self.basket = None + self.player = self.obs['players'][0] + self.last_action = "NOP" + self.current_direction = self.player['direction'] + self.size = [0.6, 0.4] + + + + def step(self, action): + action = "0 " + action + self.game.send(str.encode(action)) # send action to env + output = recv_socket_data(self.game) # get observation from env + if output: + output = json.loads(output) + self.obs = output['observation'] + self.last_action = action + self.player = self.obs['players'][0] + return output + + def heuristic(self, a, b): + """Calculate the Manhattan distance from point a to point b.""" + return abs(a[0] - b[0]) + abs(a[1] - b[1]) + + + def overlap(self, x1, y1, width_1, height_1, x2, y2, width_2, height_2): + return (x1 > x2 + width_2 or x2 > x1 + width_1 or y1 > y2 + height_2 or y2 > y1 + height_1) + + def objects_overlap(self, x1, y1, width_1, height_1, x2, y2, width_2, height_2): + return self.overlap(x1, y1, width_1, height_1, x2, y2, width_2, height_2) + def collision(self, x, y, width, height, obj): + """ + Check if a rectangle defined by (x, y, width, height) does NOT intersect with an object + and ensure the rectangle stays within the map boundaries. + + Parameters: + x (float): The x-coordinate of the rectangle's top-left corner. + y (float): The y-coordinate of the rectangle's top-left corner. + width (float): The width of the rectangle. + height (float): The height of the rectangle. + obj (dict): An object with 'position', 'width', and 'height'. + + Returns: + bool: Returns True if there is NO collision (i.e., no overlap) and the rectangle is within map boundaries, + False if there is a collision or the rectangle goes outside the map boundaries. + """ + # Define map boundaries + min_x = 0.5 + max_x = 24 + min_y = 2.5 + max_y = 19.5 + + # Calculate the boundaries of the rectangle + rectangle = { + 'northmost': y, + 'southmost': y + height, + 'westmost': x, + 'eastmost': x + width + } + + # Ensure the rectangle is within the map boundaries + if not (min_x <= rectangle['westmost'] and rectangle['eastmost'] <= max_x and + min_y <= rectangle['northmost'] and rectangle['southmost'] <= max_y): + return False # The rectangle is out of the map boundaries + + # Calculate the boundaries of the object + obj_box = { + 'northmost': obj['position'][1], + 'southmost': obj['position'][1] + obj['height'], + 'westmost': obj['position'][0], + 'eastmost': obj['position'][0] + obj['width'] + } + + # Check if there is no overlap using the specified cardinal bounds + no_overlap = not ( + (obj_box['northmost'] <= rectangle['northmost'] <= obj_box['southmost'] or + obj_box['northmost'] <= rectangle['southmost'] <= obj_box['southmost']) and ( + (obj_box['westmost'] <= rectangle['westmost'] <= obj_box['eastmost'] or + obj_box['westmost'] <= rectangle['eastmost'] <= obj_box['eastmost']) + ) + ) + + return no_overlap + + # The function will return False if the rectangle is outside the map boundaries or intersects with the object. + + + def hits_wall(self, x, y): + wall_width = 0.4 + return not (y <= 2 or y + self.size[1] >= self.map_height - wall_width or \ + x + self.size[0] >= self.map_width - wall_width) + + def neighbors(self, point, map_width, map_height, objs): + """Generate walkable neighboring points avoiding collisions with objects.""" + step = 0.150 + directions = [(0, step), (step, 0), (0, -step), (-step, 0)] # Adjacent squares: N, E, S, W + x, y = point + + results = [] + for dx, dy in directions: + nx, ny = x + dx, y + dy + if 0 <= nx < map_width and 0 <= ny < map_height and all(self.objects_overlap(nx, ny, self.size[0], self.size[1], obj['position'][0], + obj['position'][1], obj['width'], obj['height']) for obj in objs) and self.hits_wall( nx, ny): + results.append((nx, ny)) + return results + def is_close_enough(self, current, goal, tolerance=0.15, is_item = True): + """Check if the current position is within tolerance of the goal position.""" + if is_item is not None: + tolerance = 0.6 + return (abs(current[0] - goal[0]) < tolerance - 0.15 and abs(current[1] - goal[1]) < tolerance +0.05 ) + + else: + return (abs(current[0] - goal[0]) < tolerance and abs(current[1] - goal[1]) < tolerance) + def distance(self, a, b): + return np.sqrt((a[0] - b[0])**2 + (a[1] - b[1])**2) + + def astar(self, start, goal, objs, map_width, map_height, is_item = True): + """Perform the A* algorithm to find the shortest path from start to goal.""" + frontier = PriorityQueue() + frontier.put(start, 0) + came_from = {} + cost_so_far = {} + came_from[start] = None + cost_so_far[start] = 0 + distance = 1000 + + while not frontier.empty(): + + current = frontier.get() + if self.is_close_enough(current, goal, is_item=is_item): + break + + for next in self.neighbors(current, map_width, map_height, objs): + new_cost = cost_so_far[current] + 0.15 # Assume cost between neighbors is 1 + if next not in cost_so_far or new_cost < cost_so_far[next]: + cost_so_far[next] = new_cost + priority = new_cost + self.heuristic(next, goal) + frontier.put(next, priority) + came_from[next] = current + + # Reconstruct path + if self.is_close_enough(current, goal, is_item=is_item): + path = [] + while current: + path.append(current) + current = came_from[current] + path.reverse() + return path + + return None # No path found + # PlayerAction.NORTH: (Direction.NORTH, (0, -1), 0), + # PlayerAction.SOUTH: (Direction.SOUTH, (0, 1), 1), + # PlayerAction.EAST: (Direction.EAST, (1, 0), 2), + # PlayerAction.WEST: (Direction.WEST, (-1, 0), 3) + def from_path_to_actions(self, path): + """Convert a path to a list of actions.""" + # if the current direction is not the same as the direction of the first step in the path, add a TURN action + # directions = [(0, step), (step, 0), (0, -step), (-step, 0)] # Adjacent squares: N, E, S, W + actions = [] + cur_dir = self.current_direction + + for i in range(len(path) - 1): + x1, y1 = path[i] + x2, y2 = path[i + 1] + if x2 > x1: + if cur_dir != '2': + actions.append('EAST') + cur_dir = '2' + actions.append('EAST' ) + else: + actions.append('EAST') + elif x2 < x1: + if cur_dir != '3': + actions.append('WEST') + cur_dir = '3' + actions.append('WEST') + else: + actions.append('WEST') + elif y2 < y1: + if cur_dir != '0': + actions.append('NORTH') + cur_dir = '0' + actions.append('NORTH') + else: + actions.append('NORTH') + elif y2 > y1: + if cur_dir != '1': + actions.append('SOUTH') + cur_dir = '1' + actions.append('SOUTH') + else: + actions.append('SOUTH') + return actions + + def face_item(self, goal_x, goal_y): + x, y = self.player['position'] + cur_dir = self.current_direction + #print("info: ", cur_dir, y, goal_y) + if goal_y < y: + if cur_dir != '0': + self.step('NORTH') + dis = abs(goal_y - y) + while dis> 0.75: + self.step('NORTH') + if abs(dis - abs(goal_y - self.player['position'][1])) < 0.1: + break + else: + dis = abs(goal_y - self.player['position'][1]) + return 'NORTH' + elif goal_y > y: + if cur_dir != '1': + self.step('SOUTH') + dis = abs(goal_y - y) + while dis > 0.75: + self.step('SOUTH') + if abs(dis - abs(goal_y - self.player['position'][1])) < 0.1: + break + else: + dis = abs(goal_y - self.player['position'][1]) + return 'SOUTH' + + def perform_actions(self, actions): + """Perform a list of actions.""" + for action in actions: + self.step(action) + return self.obs + def change_direction(self, direction): + cur_dir = self.current_direction + if direction == 'NORTH': + if cur_dir != '0': + self.step('NORTH') + return 'NORTH' + elif direction == 'SOUTH': + if cur_dir != '1': + self.step('SOUTH') + return 'SOUTH' + elif direction == 'EAST': + if cur_dir != '2': + self.step('EAST') + return 'EAST' + elif direction == 'WEST': + if cur_dir != '3': + self.step('WEST') + return 'WEST' +def find_item_position(data, item_name): + """ + Finds the position of an item based on its name within the shelves section of the data structure. + + Parameters: + data (dict): The complete data structure containing various game elements including shelves. + item_name (str): The name of the item to find. + + Returns: + list or None: The position of the item as [x, y] or None if the item is not found. + """ + # Loop through each shelf in the data + for shelf in data['observation']['shelves']: + if shelf['food_name'] == item_name: + return shelf['position'] + return None + +# {'command_result': {'command': 'RESET', 'result': 'SUCCESS', 'message': '', 'stepCost': 0}, 'observation': {'players': [{'index': 0, 'position': [1.2, 15.6], 'width': 0.6, 'height': 0.4, 'sprite_path': None, 'direction': 2, 'curr_cart': -1, 'shopping_list': ['chocolate milk'], 'list_quant': [1], 'holding_food': None, 'bought_holding_food': False, 'budget': 100, 'bagged_items': [], 'bagged_quant': []}], 'carts': [], 'baskets': [], 'registers': [{'height': 2.5, 'width': 2.25, 'position': [1, 4.5], 'num_items': 0, 'foods': [], 'food_quantities': [], 'food_images': [], 'capacity': 12, 'image': 'images/Registers/registersA.png', 'curr_player': None}, {'height': 2.5, 'width': 2.25, 'position': [1, 9.5], 'num_items': 0, 'foods': [], 'food_quantities': [], 'food_images': [], 'capacity': 12, 'image': 'images/Registers/registersB.png', 'curr_player': None}], 'shelves': [{'height': 1, 'width': 2, 'position': [5.5, 1.5], 'food': 'milk', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/milk.png', 'shelf_image': 'images/Shelves/fridge.png', 'food_name': 'milk'}, {'height': 1, 'width': 2, 'position': [7.5, 1.5], 'food': 'milk', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/milk.png', 'shelf_image': 'images/Shelves/fridge.png', 'food_name': 'milk'}, {'height': 1, 'width': 2, 'position': [9.5, 1.5], 'food': 'chocolate milk', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/milk_chocolate.png', 'shelf_image': 'images/Shelves/fridge.png', 'food_name': 'chocolate milk'}, {'height': 1, 'width': 2, 'position': [11.5, 1.5], 'food': 'chocolate milk', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/milk_chocolate.png', 'shelf_image': 'images/Shelves/fridge.png', 'food_name': 'chocolate milk'}, {'height': 1, 'width': 2, 'position': [13.5, 1.5], 'food': 'strawberry milk', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/milk_strawberry.png', 'shelf_image': 'images/Shelves/fridge.png', 'food_name': 'strawberry milk'}, {'height': 1, 'width': 2, 'position': [5.5, 5.5], 'food': 'apples', 'price': 5, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/apples.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'apples'}, {'height': 1, 'width': 2, 'position': [7.5, 5.5], 'food': 'oranges', 'price': 5, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/oranges.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'oranges'}, {'height': 1, 'width': 2, 'position': [9.5, 5.5], 'food': 'banana', 'price': 1, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/banana.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'banana'}, {'height': 1, 'width': 2, 'position': [11.5, 5.5], 'food': 'strawberry', 'price': 1, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/strawberry.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'strawberry'}, {'height': 1, 'width': 2, 'position': [13.5, 5.5], 'food': 'raspberry', 'price': 1, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/raspberry.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'raspberry'}, {'height': 1, 'width': 2, 'position': [5.5, 9.5], 'food': 'sausage', 'price': 4, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/sausage.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'sausage'}, {'height': 1, 'width': 2, 'position': [7.5, 9.5], 'food': 'steak', 'price': 5, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/meat_01.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'steak'}, {'height': 1, 'width': 2, 'position': [9.5, 9.5], 'food': 'steak', 'price': 5, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/meat_02.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'steak'}, {'height': 1, 'width': 2, 'position': [11.5, 9.5], 'food': 'chicken', 'price': 6, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/meat_03.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'chicken'}, {'height': 1, 'width': 2, 'position': [13.5, 9.5], 'food': 'ham', 'price': 6, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/ham.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'ham'}, {'height': 1, 'width': 2, 'position': [5.5, 13.5], 'food': 'brie cheese', 'price': 5, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/cheese_01.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'brie cheese'}, {'height': 1, 'width': 2, 'position': [7.5, 13.5], 'food': 'swiss cheese', 'price': 5, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/cheese_02.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'swiss cheese'}, {'height': 1, 'width': 2, 'position': [9.5, 13.5], 'food': 'cheese wheel', 'price': 15, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/cheese_03.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'cheese wheel'}, {'height': 1, 'width': 2, 'position': [11.5, 13.5], 'food': 'cheese wheel', 'price': 15, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/cheese_03.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'cheese wheel'}, {'height': 1, 'width': 2, 'position': [13.5, 13.5], 'food': 'cheese wheel', 'price': 15, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/cheese_03.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'cheese wheel'}, {'height': 1, 'width': 2, 'position': [5.5, 17.5], 'food': 'garlic', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/garlic.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'garlic'}, {'height': 1, 'width': 2, 'position': [7.5, 17.5], 'food': 'leek', 'price': 1, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/leek_onion.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'leek'}, {'height': 1, 'width': 2, 'position': [9.5, 17.5], 'food': 'red bell pepper', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/bell_pepper_red.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'red bell pepper'}, {'height': 1, 'width': 2, 'position': [11.5, 17.5], 'food': 'carrot', 'price': 1, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/carrot.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'carrot'}, {'height': 1, 'width': 2, 'position': [13.5, 17.5], 'food': 'lettuce', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/lettuce.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'lettuce'}, {'height': 1, 'width': 2, 'position': [5.5, 21.5], 'food': 'avocado', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/avocado.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'avocado'}, {'height': 1, 'width': 2, 'position': [7.5, 21.5], 'food': 'broccoli', 'price': 1, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/broccoli.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'broccoli'}, {'height': 1, 'width': 2, 'position': [9.5, 21.5], 'food': 'cucumber', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/cucumber.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'cucumber'}, {'height': 1, 'width': 2, 'position': [11.5, 21.5], 'food': 'yellow bell pepper', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/bell_pepper_yellow.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'yellow bell pepper'}, {'height': 1, 'width': 2, 'position': [13.5, 21.5], 'food': 'onion', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/onion.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'onion'}], 'cartReturns': [{'height': 6, 'width': 0.7, 'position': [1, 18.5], 'quantity': 6}, {'height': 6, 'width': 0.7, 'position': [2, 18.5], 'quantity': 6}], 'basketReturns': [{'height': 0.2, 'width': 0.3, 'position': [3.5, 18.5], 'quantity': 12}], 'counters': [{'height': 2.25, 'width': 1.5, 'position': [18.25, 4.75], 'food': 'prepared foods', 'price': 15}, {'height': 2.25, 'width': 1.5, 'position': [18.25, 10.75], 'food': 'fresh fish', 'price': 12}, {'height': 2.25, 'width': 1.5, 'position': [18.25, 10.75], 'food': 'fresh fish', 'price': 12}]}, 'step': 1, 'gameOver': False, 'violations': ''} +# [11.5, 17.5] +# hang@jstaley-XPS-8940:~/TA/propershopper-1$ python astar_path_planner.py +# action_commands: ['NOP', 'NORTH', 'SOUTH', 'EAST', 'WEST', 'TOGGLE_CART', 'INTERACT'] +# ['sausage', 'milk', 'prepared foods', 'onion', 'fresh fish', 'apples', 'oranges', 'steak'] +# {'command_result': {'command': 'RESET', 'result': 'SUCCESS', 'message': '', 'stepCost': 0}, 'observation': {'players': [{'index': 0, 'position': [1.2, 15.6], 'width': 0.6, 'height': 0.4, 'sprite_path': None, 'direction': 2, 'curr_cart': -1, 'shopping_list': ['sausage', 'milk', 'prepared foods', 'onion', 'fresh fish', 'apples', 'oranges', 'steak'], 'list_quant': [2, 3, 1, 1, 1, 1, 1, 1], 'holding_food': None, 'bought_holding_food': False, 'budget': 100, 'bagged_items': [], 'bagged_quant': []}], 'carts': [], 'baskets': [], 'registers': [{'height': 2.5, 'width': 2.25, 'position': [1, 4.5], 'num_items': 0, 'foods': [], 'food_quantities': [], 'food_images': [], 'capacity': 12, 'image': 'images/Registers/registersA.png', 'curr_player': None}, {'height': 2.5, 'width': 2.25, 'position': [1, 9.5], 'num_items': 0, 'foods': [], 'food_quantities': [], 'food_images': [], 'capacity': 12, 'image': 'images/Registers/registersB.png', 'curr_player': None}], 'shelves': [{'height': 1, 'width': 2, 'position': [5.5, 1.5], 'food': 'milk', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/milk.png', 'shelf_image': 'images/Shelves/fridge.png', 'food_name': 'milk'}, {'height': 1, 'width': 2, 'position': [7.5, 1.5], 'food': 'milk', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/milk.png', 'shelf_image': 'images/Shelves/fridge.png', 'food_name': 'milk'}, {'height': 1, 'width': 2, 'position': [9.5, 1.5], 'food': 'chocolate milk', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/milk_chocolate.png', 'shelf_image': 'images/Shelves/fridge.png', 'food_name': 'chocolate milk'}, {'height': 1, 'width': 2, 'position': [11.5, 1.5], 'food': 'chocolate milk', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/milk_chocolate.png', 'shelf_image': 'images/Shelves/fridge.png', 'food_name': 'chocolate milk'}, {'height': 1, 'width': 2, 'position': [13.5, 1.5], 'food': 'strawberry milk', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/milk_strawberry.png', 'shelf_image': 'images/Shelves/fridge.png', 'food_name': 'strawberry milk'}, {'height': 1, 'width': 2, 'position': [5.5, 5.5], 'food': 'apples', 'price': 5, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/apples.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'apples'}, {'height': 1, 'width': 2, 'position': [7.5, 5.5], 'food': 'oranges', 'price': 5, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/oranges.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'oranges'}, {'height': 1, 'width': 2, 'position': [9.5, 5.5], 'food': 'banana', 'price': 1, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/banana.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'banana'}, {'height': 1, 'width': 2, 'position': [11.5, 5.5], 'food': 'strawberry', 'price': 1, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/strawberry.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'strawberry'}, {'height': 1, 'width': 2, 'position': [13.5, 5.5], 'food': 'raspberry', 'price': 1, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/raspberry.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'raspberry'}, {'height': 1, 'width': 2, 'position': [5.5, 9.5], 'food': 'sausage', 'price': 4, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/sausage.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'sausage'}, {'height': 1, 'width': 2, 'position': [7.5, 9.5], 'food': 'steak', 'price': 5, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/meat_01.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'steak'}, {'height': 1, 'width': 2, 'position': [9.5, 9.5], 'food': 'steak', 'price': 5, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/meat_02.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'steak'}, {'height': 1, 'width': 2, 'position': [11.5, 9.5], 'food': 'chicken', 'price': 6, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/meat_03.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'chicken'}, {'height': 1, 'width': 2, 'position': [13.5, 9.5], 'food': 'ham', 'price': 6, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/ham.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'ham'}, {'height': 1, 'width': 2, 'position': [5.5, 13.5], 'food': 'brie cheese', 'price': 5, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/cheese_01.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'brie cheese'}, {'height': 1, 'width': 2, 'position': [7.5, 13.5], 'food': 'swiss cheese', 'price': 5, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/cheese_02.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'swiss cheese'}, {'height': 1, 'width': 2, 'position': [9.5, 13.5], 'food': 'cheese wheel', 'price': 15, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/cheese_03.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'cheese wheel'}, {'height': 1, 'width': 2, 'position': [11.5, 13.5], 'food': 'cheese wheel', 'price': 15, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/cheese_03.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'cheese wheel'}, {'height': 1, 'width': 2, 'position': [13.5, 13.5], 'food': 'cheese wheel', 'price': 15, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/cheese_03.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'cheese wheel'}, {'height': 1, 'width': 2, 'position': [5.5, 17.5], 'food': 'garlic', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/garlic.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'garlic'}, {'height': 1, 'width': 2, 'position': [7.5, 17.5], 'food': 'leek', 'price': 1, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/leek_onion.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'leek'}, {'height': 1, 'width': 2, 'position': [9.5, 17.5], 'food': 'red bell pepper', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/bell_pepper_red.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'red bell pepper'}, {'height': 1, 'width': 2, 'position': [11.5, 17.5], 'food': 'carrot', 'price': 1, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/carrot.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'carrot'}, {'height': 1, 'width': 2, 'position': [13.5, 17.5], 'food': 'lettuce', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/lettuce.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'lettuce'}, {'height': 1, 'width': 2, 'position': [5.5, 21.5], 'food': 'avocado', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/avocado.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'avocado'}, {'height': 1, 'width': 2, 'position': [7.5, 21.5], 'food': 'broccoli', 'price': 1, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/broccoli.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'broccoli'}, {'height': 1, 'width': 2, 'position': [9.5, 21.5], 'food': 'cucumber', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/cucumber.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'cucumber'}, {'height': 1, 'width': 2, 'position': [11.5, 21.5], 'food': 'yellow bell pepper', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/bell_pepper_yellow.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'yellow bell pepper'}, {'height': 1, 'width': 2, 'position': [13.5, 21.5], 'food': 'onion', 'price': 2, 'capacity': 12, 'quantity': 12, 'food_image': 'images/food/onion.png', 'shelf_image': 'images/Shelves/shelf.png', 'food_name': 'onion'}], 'cartReturns': [{'height': 6, 'width': 0.7, 'position': [1, 18.5], 'quantity': 6}, {'height': 6, 'width': 0.7, 'position': [2, 18.5], 'quantity': 6}], 'basketReturns': [{'height': 0.2, 'width': 0.3, 'position': [3.5, 18.5], 'quantity': 12}], 'counters': [{'height': 2.25, 'width': 1.5, 'position': [18.25, 4.75], 'food': 'prepared foods', 'price': 15}, {'height': 2.25, 'width': 1.5, 'position': [18.25, 10.75], 'food': 'fresh fish', 'price': 12}, {'height': 2.25, 'width': 1.5, 'position': [18.25, 10.75], 'food': 'fresh fish', 'price': 12}]}, 'step': 1, 'gameOver': False, 'violations': ''} +# [11.5, 17.5] + +if __name__=="__main__": + + action_commands = ['NOP', 'NORTH', 'SOUTH', 'EAST', 'WEST', 'TOGGLE_CART', 'INTERACT'] + + print("action_commands: ", action_commands) + + # Connect to Supermarket + HOST = '127.0.0.1' + PORT = 9000 + sock_game = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock_game.connect((HOST, PORT)) + sock_game.send(str.encode("0 RESET")) # reset the game + state = recv_socket_data(sock_game) + game_state = json.loads(state) + shopping_list = game_state['observation']['players'][0]['shopping_list'] + shopping_quant = game_state['observation']['players'][0]['list_quant'] + agent = Astar_agent(socket_game=sock_game, env=game_state) + print(shopping_list) + + + # shopping_list = ['fresh fish', 'prepared foods'] + + + if len(shopping_list) > 0: + print("go for basket") + path = agent.astar((agent.player['position'][0], agent.player['position'][1]),(basketReturns[0], basketReturns[1] ), objs, 20, 25) + actions = agent.from_path_to_actions(path) + agent.perform_actions(actions) + agent.face_item(basketReturns[0], basketReturns[1]) + agent.step('INTERACT') + agent.step('INTERACT') + for item in shopping_list: + y_offset = 0 + print("go for item: ", item) + item_pos = find_item_position(game_state, item) + if item != 'prepared foods' and item != 'fresh fish': + item_pos = find_item_position(game_state, item) + #item = update_position_to_center(item_pos) + else: + if item == 'prepared foods': + item_pos = [18.25, 4.75] + else: + item_pos = [18.25, 10.75] + if item == 'milk' or item == 'chocolate milk' or item == 'strawberry milk': + y_offset = 3 + # print("item_pos: ", item_pos) + path = agent.astar((agent.player['position'][0], agent.player['position'][1]), + (item_pos[0] + offset, item_pos[1] + y_offset), objs, 20, 25) + if path == None: + continue + agent.perform_actions(agent.from_path_to_actions(path)) + agent.face_item(item_pos[0] + offset, item_pos[1]) + #player.face_item(item_pos[0] + offset, item_pos[1]) + for i in range(shopping_quant[shopping_list.index(item)]): + agent.step('INTERACT') + if item == 'prepared foods' and item == 'fresh fish': + agent.step('INTERACT') + + # go to closer register + if agent.player['position'][1] < 7: + path = agent.astar((agent.player['position'][0], agent.player['position'][1]), + (registerReturns_1[0] + offset, registerReturns_1[1]), objs, 20, 25) + if path == None: + print("no path to register") + agent.perform_actions(agent.from_path_to_actions(path)) + #player.face_item(registerReturns_1[0] + offset, registerReturns_1[1]) + else: + path = agent.astar((agent.player['position'][0], agent.player['position'][1]), + (registerReturns_2[0] + offset, registerReturns_2[1]), objs, 20, 25) + if path == None: + print("no path to register") + agent.perform_actions(agent.from_path_to_actions(path)) + #player.face_item(registerReturns_2[0] + offset, registerReturns_2[1]) + + agent.step('INTERACT') + agent.step('INTERACT') + agent.step('INTERACT') + print(agent.obs) + + diff --git a/final_proj/constants.py b/final_proj/constants.py index bcaabaa..cd0ca94 100644 --- a/final_proj/constants.py +++ b/final_proj/constants.py @@ -1,6 +1,10 @@ ###########################Helen: ################################################ ##some constants that were useful during single agent norm-conforming navigation## ################################################################################## +cartReturns = [2, 18.5] +basketReturns = [3.5, 18.5] +registerReturns_1 = [2, 4.5] +registerReturns_2 = [2, 9.5] exit_pos = [-0.6, 3.0] default_start_pos = [1.5, 15.6] interact_distance = 0.25 @@ -35,4 +39,55 @@ "player_needs_to_face": "SOUTH" } ] - } \ No newline at end of file + } + +cartReturns = [2, 18.5] +basketReturns = [3.5, 18.5] +registerReturns_1 = [2, 4.5] +registerReturns_2 = [2, 9.5] + +offset = 1 + +MAP_WIDTH, MAP_HEIGHT = 20, 25 +LOCATION_TOLERANCE = 0.15 +BACKTRACK_TOLERANCE = 3 * LOCATION_TOLERANCE + +objs = [ + {'height': 2.5, 'width': 3, 'position': [0.2, 4.5], 're_centered_position': [2.125, 5.75]}, + {'height': 2.5, 'width': 3, 'position': [0.2, 9.5], 're_centered_position': [2.125, 10.75]}, + {'height': 1, 'width': 2, 'position': [5.5, 1.5], 're_centered_position': [6.5, 2]}, + {'height': 1, 'width': 2, 'position': [7.5, 1.5], 're_centered_position': [8.5, 2]}, + {'height': 1, 'width': 2, 'position': [9.5, 1.5], 're_centered_position': [10.5, 2]}, + {'height': 1, 'width': 2, 'position': [11.5, 1.5], 're_centered_position': [12.5, 2]}, + {'height': 1, 'width': 2, 'position': [13.5, 1.5], 're_centered_position': [14.5, 2]}, + {'height': 1, 'width': 2, 'position': [5.5, 5.5], 're_centered_position': [6.5, 6]}, + {'height': 1, 'width': 2, 'position': [7.5, 5.5], 're_centered_position': [8.5, 6]}, + {'height': 1, 'width': 2, 'position': [9.5, 5.5], 're_centered_position': [10.5, 6]}, + {'height': 1, 'width': 2, 'position': [11.5, 5.5], 're_centered_position': [12.5, 6]}, + {'height': 1, 'width': 2, 'position': [13.5, 5.5], 're_centered_position': [14.5, 6]}, + {'height': 1, 'width': 2, 'position': [5.5, 9.5], 're_centered_position': [6.5, 10]}, + {'height': 1, 'width': 2, 'position': [7.5, 9.5], 're_centered_position': [8.5, 10]}, + {'height': 1, 'width': 2, 'position': [9.5, 9.5], 're_centered_position': [10.5, 10]}, + {'height': 1, 'width': 2, 'position': [11.5, 9.5], 're_centered_position': [12.5, 10]}, + {'height': 1, 'width': 2, 'position': [13.5, 9.5], 're_centered_position': [14.5, 10]}, + {'height': 1, 'width': 2, 'position': [5.5, 13.5], 're_centered_position': [6.5, 14]}, + {'height': 1, 'width': 2, 'position': [7.5, 13.5], 're_centered_position': [8.5, 14]}, + {'height': 1, 'width': 2, 'position': [9.5, 13.5], 're_centered_position': [10.5, 14]}, + {'height': 1, 'width': 2, 'position': [11.5, 13.5], 're_centered_position': [12.5, 14]}, + {'height': 1, 'width': 2, 'position': [13.5, 13.5], 're_centered_position': [14.5, 14]}, + {'height': 1, 'width': 2, 'position': [5.5, 17.5], 're_centered_position': [6.5, 18]}, + {'height': 1, 'width': 2, 'position': [7.5, 17.5], 're_centered_position': [8.5, 18]}, + {'height': 1, 'width': 2, 'position': [9.5, 17.5], 're_centered_position': [10.5, 18]}, + {'height': 1, 'width': 2, 'position': [11.5, 17.5], 're_centered_position': [12.5, 18]}, + {'height': 1, 'width': 2, 'position': [13.5, 17.5], 're_centered_position': [14.5, 18]}, + {'height': 1, 'width': 2, 'position': [5.5, 21.5], 're_centered_position': [6.5, 22]}, + {'height': 1, 'width': 2, 'position': [7.5, 21.5], 're_centered_position': [8.5, 22]}, + {'height': 1, 'width': 2, 'position': [9.5, 21.5], 're_centered_position': [10.5, 22]}, + {'height': 1, 'width': 2, 'position': [11.5, 21.5], 're_centered_position': [12.5, 22]}, + {'height': 1, 'width': 2, 'position': [13.5, 21.5], 're_centered_position': [14.5, 22]}, + {'height': 6, 'width': 0.7, 'position': [1, 18.5], 're_centered_position': [1.35, 21.5]}, + {'height': 6, 'width': 0.7, 'position': [2, 18.5], 're_centered_position': [2.35, 21.5]}, + {'height': 0.8, 'width': 0.8, 'position': [3.5, 18.5], 're_centered_position': [4.15, 19.4]}, + {'height': 2.25, 'width': 1.5, 'position': [18.25, 4.75], 're_centered_position': [19.125, 5.875]}, + {'height': 2.25, 'width': 1.5, 'position': [18.25, 10.75], 're_centered_position': [19.125, 11.875]} +] \ No newline at end of file diff --git a/final_proj/socket_agent_proj.py b/final_proj/socket_agent_proj.py index e6e4662..daeb278 100755 --- a/final_proj/socket_agent_proj.py +++ b/final_proj/socket_agent_proj.py @@ -12,9 +12,10 @@ from final_proj.util import get_geometry from helper import project_collision from util import * +from final_proj.astar_path_planner import * -STEP = 0.15 +STEP = 0.15 # the size of the player's step # todo: update with Helen's method for making interaction areas? def populate_locs(observation): @@ -57,14 +58,15 @@ def populate_locs(observation): class Agent: - def __init__(self, conn, agent_id): + def __init__(self, conn, agent_id, env): self.socket = conn self.agent_id = agent_id - self.obs = None + self.obs = env['observation'] self.shopping_list: list = self.init_list() self.goal = "" self.done = False self.has_cart = False + self.astar_planner = Astar_agent(socket_game=conn, env=env) def transition(self): if self.done: # If we've left the store @@ -88,11 +90,20 @@ def transition(self): def get_cart(self): print(f"Agent {self.agent_id} getting a cart/basket") - pass # todo + # always grabs a basket for now + self.goto(basketReturns, is_item=True) self.has_cart = True - def goto(self, goal=None): + def check_has_container(self, container): + """Check if we have are holding the `container`. Either a cart or a basket + + Args: + container (_type_): either a cart or a basket + """ + #TODO:Helen implement this + + def goto(self, goal=None, is_item=True): if goal is None: goal = self.goal @@ -101,57 +112,103 @@ def goto(self, goal=None): if holding_cart: print(f"Agent {self.agent_id} going to location {goal} with cart") - pass # todo + pass # TODO: goto with cart. TA says it might be as simple as changing the player's shape. If it's too complicated we will skip it else: + print(f"Agent {self.agent_id} planning a path to {goal} without cart") + path = self.nav(goal, is_item=is_item) print(f"Agent {self.agent_id} going to location {goal} without cart") - self.nav(goal) - - def nav(self, goal): - target = "x" - reached_x = False - reached_y = False - while True: + + for intermediate_target_location in path: player = self.obs['observation']['players'][self.agent_id] - - x_dist = player['position'][0] - goal['position'][0] - y_dist = player['position'][1] - goal['position'][1] - - if abs(x_dist) < STEP: - reached_x = True - if abs(y_dist) < STEP: - reached_y = True - if reached_x and reached_y: - break - - if target == "x": - if x_dist < -STEP: - command = Direction.EAST - elif x_dist > STEP: - command = Direction.WEST - else: - reached_y = False - target = "y" - continue - else: - if y_dist < -STEP: - command = Direction.SOUTH - elif y_dist > STEP: - command = Direction.NORTH - else: - reached_x = False - target = "x" - continue - - while project_collision(player, self.obs, command, 0.8): - command = Direction((command.value + 1) % 4) - self.step(command, player) - - def step(self, command: Direction, player): - if not command == player['direction']: - self.execute(command.name) - self.execute(command.name) - - # Agent picks up an item and adds it to the cart + self.step(step_location=intermediate_target_location, player=player, backtrack=[]) + + def nav(self, goal, is_item=True): + player = self.obs['observation']['players'][self.agent_id] + player_location = player['position'] + path = self.astar_planner.astar(start=player_location, goal=goal, map_width=MAP_WIDTH, map_height=MAP_HEIGHT, objs=objs, is_item=is_item) + return path # this returns a path of x, y locations that the agent will go through + ##################################### + ## The old navigation code is below## + ##################################### + # target = "x" + # reached_x = False + # reached_y = False + # while True: + # player = self.obs['observation']['players'][self.agent_id] + + # x_dist = player['position'][0] - goal['position'][0] + # y_dist = player['position'][1] - goal['position'][1] + + # if abs(x_dist) < STEP: + # reached_x = True + # if abs(y_dist) < STEP: + # reached_y = True + # if reached_x and reached_y: + # break + + # if target == "x": + # if x_dist < -STEP: + # command = Direction.EAST + # elif x_dist > STEP: + # command = Direction.WEST + # else: + # reached_y = False + # target = "y" + # continue + # else: + # if y_dist < -STEP: + # command = Direction.SOUTH + # elif y_dist > STEP: + # command = Direction.NORTH + # else: + # reached_x = False + # target = "x" + # continue + + # while project_collision(player, self.obs, command, 0.8): + # command = Direction((command.value + 1) % 4) + # self.step(command, player) + + def step(self, step_location:list|tuple, player, backtrack:list): + """Keep locally adjusting and stepping in the right direction so that `player` ends up `close_enough` to `step_location`. `step_location` should be only one step away + + Args: + step_location (list | tuple): a (x, y) that is assumed to be one step away from the player's current location + player (_type_): the player object that needs to be at `step_location` + backtrack (list): a list of locations visited by the player + """ + goal_x, goal_y = step_location + player_x, player_y = player['position'] + while not self.astar_planner.is_close_enough(current=player['position'], goal=step_location, tolerance=LOCATION_TOLERANCE, is_item=False):#deals with stochasticity: keep locally adjusting to the right location until it's close enough + # compare previous position with current position to determine if a location needs to be saved in the player's backtracking trace + prev_x = player_x + prev_y = player_y + player_x, player_y = player['position'] + if player_x != prev_x or player_y != prev_y:#player has moved, record its prev position for potential backtracking + backtrack.append((prev_x, prev_y)) + + if manhattan_distance(player['position'], step_location) >= BACKTRACK_TOLERANCE:#player has wandered too far due to stochasticity, there could be an object between the player and the goal `step_location` now. The player needs to backtrack to the starting location, otherwise it could be banging its head against the object forever + self.step(step_location=backtrack[-1], player=player, backtrack=backtrack[:-1]) + del backtrack[-1] + elif player_x < goal_x and abs(player_x - goal_x) >= LOCATION_TOLERANCE:# player should go EAST + self.execute(Direction.EAST.name) + elif player_x > goal_x and abs(player_x - goal_x) >= LOCATION_TOLERANCE:#player should go WEST + self.execute(Direction.WEST.name) + elif player_y < goal_y and abs(player_y - goal_y) >= LOCATION_TOLERANCE:#player should go SOUTH + self.execute(Direction.SOUTH.name) + elif player_y < goal_y and abs(player_y - goal_y) >= LOCATION_TOLERANCE:#player should go NORTH + self.execute(Direction.NORTH.name) + + # def infer_actual_action(player_state_before_execution:tuple[float, float, Direction], player_state_after_execution:tuple[float, float, Direction]): + # prev_x, prev_y, prev_orientation = player_state_before_execution + # after_x, after_y, after_orientation = player_state_after_execution + # if after_orientation != prev_orientation:#player turned + # return after_orientation + # elif prev_x < after_x:#player went EAST + # return Direction.EAST + + + # TODO: Agent picks up an item and adds it to the cart def add_to_cart(self): print(f"Agent {self.agent_id} adding an item to the cart") @@ -159,11 +216,15 @@ def add_to_cart(self): self.goal = "" - # todo + # TODO use other functions to complete checkout def exit(self): print(f"Agent {self.agent_id} exiting") + self.goto([2, 12.5]) - pass # todo + # pick_up_and_put_in(shelf_direction = "NORTH") + # self.add_to_cart() + + self.goto([-0.8, 15.6]) self.done = True @@ -199,7 +260,7 @@ def execute(self, action): output = recv_socket_data(sock_game) # get observation from env output = json.loads(output) locs = populate_locs(output['observation']) - agents = [Agent(sock_game, 0)] + agents = [Agent(sock_game, 0, env=output)] # agents = [Agent(sock_game, 0), Agent(sock_game, 1), Agent(sock_game, 2)] while True: for agent in agents: diff --git a/final_proj/util.py b/final_proj/util.py index 1b1c9c0..7742abb 100644 --- a/final_proj/util.py +++ b/final_proj/util.py @@ -3,6 +3,7 @@ import copy from constants import * from copy import deepcopy +from constants import * def get_geometry(obj): @@ -27,6 +28,10 @@ def recv_socket_data(sock): return data +def manhattan_distance(pos1, pos2): + # Calculate the Manhattan distance from pos1 to pos2 + return abs(pos2[0] - pos1[1]) + abs(pos2[1] - pos2[0]) + def euclidean_distance(pos1, pos2): # Calculate Euclidean distance between two points return ((pos1[0] - pos2[0])**2 + (pos1[1] - pos2[1])**2)**0.5 From ed2661a53ffb60ef41e0ae77d5a16b4d7fa56e86 Mon Sep 17 00:00:00 2001 From: Helen Date: Thu, 25 Apr 2024 01:08:46 -0400 Subject: [PATCH 11/22] navigation and getcontainer works for static multiagent --- final_proj/astar_dynamic.py | 2 +- final_proj/astar_path_planner.py | 16 +- final_proj/constants.py | 1 - final_proj/env_interact_boxes.json | 784 ++++++++++++++--------------- final_proj/socket_agent_proj.py | 328 ++++++++---- final_proj/util.py | 104 ++-- helper.py | 32 +- 7 files changed, 733 insertions(+), 534 deletions(-) diff --git a/final_proj/astar_dynamic.py b/final_proj/astar_dynamic.py index 8123635..9dac5e2 100644 --- a/final_proj/astar_dynamic.py +++ b/final_proj/astar_dynamic.py @@ -27,7 +27,7 @@ def __eq__(self, other): # By Nicholas Swift via https://medium.com/@nicholas.w.swift/easy-a-star-pathfinding-7e6689c7f7b2 # Modifications by Marlow Fawn -def astar(goal, player, state): +def astar(goal, player, state) -> list: """Returns a list of tuples as a path from the given start to the given end in the given maze""" player_copy = deepcopy(player) goal_copy = deepcopy(goal) diff --git a/final_proj/astar_path_planner.py b/final_proj/astar_path_planner.py index 404c887..d433deb 100644 --- a/final_proj/astar_path_planner.py +++ b/final_proj/astar_path_planner.py @@ -8,6 +8,7 @@ import socket from utils import recv_socket_data +from util import * cartReturns = [2, 18.5] basketReturns = [3.5, 18.5] @@ -112,10 +113,11 @@ def heuristic(self, a, b): def overlap(self, x1, y1, width_1, height_1, x2, y2, width_2, height_2): - return (x1 > x2 + width_2 or x2 > x1 + width_1 or y1 > y2 + height_2 or y2 > y1 + height_1) + return not (x1 > x2 + width_2 or x2 > x1 + width_1 or y1 > y2 + height_2 or y2 > y1 + height_1) def objects_overlap(self, x1, y1, width_1, height_1, x2, y2, width_2, height_2): return self.overlap(x1, y1, width_1, height_1, x2, y2, width_2, height_2) + def collision(self, x, y, width, height, obj): """ Check if a rectangle defined by (x, y, width, height) does NOT intersect with an object @@ -175,7 +177,7 @@ def collision(self, x, y, width, height, obj): def hits_wall(self, x, y): wall_width = 0.4 - return not (y <= 2 or y + self.size[1] >= self.map_height - wall_width or \ + return (y <= 2 or y + self.size[1] >= self.map_height - wall_width or \ x + self.size[0] >= self.map_width - wall_width) def neighbors(self, point, map_width, map_height, objs): @@ -187,13 +189,13 @@ def neighbors(self, point, map_width, map_height, objs): results = [] for dx, dy in directions: nx, ny = x + dx, y + dy - if 0 <= nx < map_width and 0 <= ny < map_height and all(self.objects_overlap(nx, ny, self.size[0], self.size[1], obj['position'][0], - obj['position'][1], obj['width'], obj['height']) for obj in objs) and self.hits_wall( nx, ny): + collision = any(self.objects_overlap(nx, ny, self.size[0], self.size[1], obj['position'][0], obj['position'][1], obj['width'], obj['height']) for obj in objs) + if 0 <= nx < map_width and 0 <= ny < map_height and not collision and not self.hits_wall(nx, ny): results.append((nx, ny)) return results - def is_close_enough(self, current, goal, tolerance=0.15, is_item = True): + def is_close_enough(self, current, goal:tuple|dict, tolerance=0.15, is_item = True): """Check if the current position is within tolerance of the goal position.""" - if is_item is not None: + if is_item: tolerance = 0.6 return (abs(current[0] - goal[0]) < tolerance - 0.15 and abs(current[1] - goal[1]) < tolerance +0.05 ) @@ -235,7 +237,7 @@ def astar(self, start, goal, objs, map_width, map_height, is_item = True): path.reverse() return path - return None # No path found + return [] # No path found # PlayerAction.NORTH: (Direction.NORTH, (0, -1), 0), # PlayerAction.SOUTH: (Direction.SOUTH, (0, 1), 1), # PlayerAction.EAST: (Direction.EAST, (1, 0), 2), diff --git a/final_proj/constants.py b/final_proj/constants.py index cd0ca94..f63b623 100644 --- a/final_proj/constants.py +++ b/final_proj/constants.py @@ -10,7 +10,6 @@ interact_distance = 0.25 cart_pos_left = [1, 18.5] # The position of the cart in the environment from [1, 2] in x, and y = 18.5 cart_pos_right = [2, 18.5] -basketReturn = [] counter = [] loc = [1, 17.5] register_region_x = 1 + 2.25 diff --git a/final_proj/env_interact_boxes.json b/final_proj/env_interact_boxes.json index 816b62e..12907bb 100644 --- a/final_proj/env_interact_boxes.json +++ b/final_proj/env_interact_boxes.json @@ -16,36 +16,36 @@ "capacity": 12, "image": "images/Registers/registersA.png", "curr_player": null, - "interact_boxes": [ - { - "northmost": 7.0, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 4.25, "westmost": 1, - "southmost": 7.35, + "southmost": 4.5, "eastmost": 3.25, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 4.15, + "SOUTH_BOX": { + "northmost": 7.0, "westmost": 1, - "southmost": 4.5, + "southmost": 7.25, "eastmost": 3.25, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" }, - { + "WEST_BOX": { "northmost": 4.5, - "westmost": 0.65, + "westmost": 0.75, "southmost": 7.0, "eastmost": 1, "player_needs_to_face": "EAST" }, - { + "EAST_BOX": { "northmost": 4.5, "westmost": 3.25, "southmost": 7.0, - "eastmost": 3.6, + "eastmost": 3.5, "player_needs_to_face": "WEST" } - ] + } }, { "height": 2.5, @@ -61,36 +61,36 @@ "capacity": 12, "image": "images/Registers/registersB.png", "curr_player": null, - "interact_boxes": [ - { - "northmost": 12.0, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 9.25, "westmost": 1, - "southmost": 12.35, + "southmost": 9.5, "eastmost": 3.25, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 9.15, + "SOUTH_BOX": { + "northmost": 12.0, "westmost": 1, - "southmost": 9.5, + "southmost": 12.25, "eastmost": 3.25, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" }, - { + "WEST_BOX": { "northmost": 9.5, - "westmost": 0.65, + "westmost": 0.75, "southmost": 12.0, "eastmost": 1, "player_needs_to_face": "EAST" }, - { + "EAST_BOX": { "northmost": 9.5, "westmost": 3.25, "southmost": 12.0, - "eastmost": 3.6, + "eastmost": 3.5, "player_needs_to_face": "WEST" } - ] + } } ], "shelves": [ @@ -108,22 +108,22 @@ "food_image": "images/food/milk.png", "shelf_image": "images/Shelves/fridge.png", "food_name": "milk", - "interact_boxes": [ - { - "northmost": 2.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 1.25, "westmost": 5.5, - "southmost": 2.85, + "southmost": 1.5, "eastmost": 7.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 1.15, + "SOUTH_BOX": { + "northmost": 2.5, "westmost": 5.5, - "southmost": 1.5, + "southmost": 2.75, "eastmost": 7.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -139,22 +139,22 @@ "food_image": "images/food/milk.png", "shelf_image": "images/Shelves/fridge.png", "food_name": "milk", - "interact_boxes": [ - { - "northmost": 2.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 1.25, "westmost": 7.5, - "southmost": 2.85, + "southmost": 1.5, "eastmost": 9.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 1.15, + "SOUTH_BOX": { + "northmost": 2.5, "westmost": 7.5, - "southmost": 1.5, + "southmost": 2.75, "eastmost": 9.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -170,22 +170,22 @@ "food_image": "images/food/milk_chocolate.png", "shelf_image": "images/Shelves/fridge.png", "food_name": "chocolate milk", - "interact_boxes": [ - { - "northmost": 2.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 1.25, "westmost": 9.5, - "southmost": 2.85, + "southmost": 1.5, "eastmost": 11.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 1.15, + "SOUTH_BOX": { + "northmost": 2.5, "westmost": 9.5, - "southmost": 1.5, + "southmost": 2.75, "eastmost": 11.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -201,22 +201,22 @@ "food_image": "images/food/milk_chocolate.png", "shelf_image": "images/Shelves/fridge.png", "food_name": "chocolate milk", - "interact_boxes": [ - { - "northmost": 2.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 1.25, "westmost": 11.5, - "southmost": 2.85, + "southmost": 1.5, "eastmost": 13.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 1.15, + "SOUTH_BOX": { + "northmost": 2.5, "westmost": 11.5, - "southmost": 1.5, + "southmost": 2.75, "eastmost": 13.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -232,22 +232,22 @@ "food_image": "images/food/milk_strawberry.png", "shelf_image": "images/Shelves/fridge.png", "food_name": "strawberry milk", - "interact_boxes": [ - { - "northmost": 2.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 1.25, "westmost": 13.5, - "southmost": 2.85, + "southmost": 1.5, "eastmost": 15.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 1.15, + "SOUTH_BOX": { + "northmost": 2.5, "westmost": 13.5, - "southmost": 1.5, + "southmost": 2.75, "eastmost": 15.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -263,22 +263,22 @@ "food_image": "images/food/apples.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "apples", - "interact_boxes": [ - { - "northmost": 6.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 5.25, "westmost": 5.5, - "southmost": 6.85, + "southmost": 5.5, "eastmost": 7.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 5.15, + "SOUTH_BOX": { + "northmost": 6.5, "westmost": 5.5, - "southmost": 5.5, + "southmost": 6.75, "eastmost": 7.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -294,22 +294,22 @@ "food_image": "images/food/oranges.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "oranges", - "interact_boxes": [ - { - "northmost": 6.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 5.25, "westmost": 7.5, - "southmost": 6.85, + "southmost": 5.5, "eastmost": 9.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 5.15, + "SOUTH_BOX": { + "northmost": 6.5, "westmost": 7.5, - "southmost": 5.5, + "southmost": 6.75, "eastmost": 9.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -325,22 +325,22 @@ "food_image": "images/food/banana.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "banana", - "interact_boxes": [ - { - "northmost": 6.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 5.25, "westmost": 9.5, - "southmost": 6.85, + "southmost": 5.5, "eastmost": 11.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 5.15, + "SOUTH_BOX": { + "northmost": 6.5, "westmost": 9.5, - "southmost": 5.5, + "southmost": 6.75, "eastmost": 11.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -356,22 +356,22 @@ "food_image": "images/food/strawberry.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "strawberry", - "interact_boxes": [ - { - "northmost": 6.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 5.25, "westmost": 11.5, - "southmost": 6.85, + "southmost": 5.5, "eastmost": 13.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 5.15, + "SOUTH_BOX": { + "northmost": 6.5, "westmost": 11.5, - "southmost": 5.5, + "southmost": 6.75, "eastmost": 13.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -387,22 +387,22 @@ "food_image": "images/food/raspberry.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "raspberry", - "interact_boxes": [ - { - "northmost": 6.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 5.25, "westmost": 13.5, - "southmost": 6.85, + "southmost": 5.5, "eastmost": 15.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 5.15, + "SOUTH_BOX": { + "northmost": 6.5, "westmost": 13.5, - "southmost": 5.5, + "southmost": 6.75, "eastmost": 15.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -418,22 +418,22 @@ "food_image": "images/food/sausage.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "sausage", - "interact_boxes": [ - { - "northmost": 10.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 9.25, "westmost": 5.5, - "southmost": 10.85, + "southmost": 9.5, "eastmost": 7.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 9.15, + "SOUTH_BOX": { + "northmost": 10.5, "westmost": 5.5, - "southmost": 9.5, + "southmost": 10.75, "eastmost": 7.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -449,22 +449,22 @@ "food_image": "images/food/meat_01.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "steak", - "interact_boxes": [ - { - "northmost": 10.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 9.25, "westmost": 7.5, - "southmost": 10.85, + "southmost": 9.5, "eastmost": 9.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 9.15, + "SOUTH_BOX": { + "northmost": 10.5, "westmost": 7.5, - "southmost": 9.5, + "southmost": 10.75, "eastmost": 9.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -480,22 +480,22 @@ "food_image": "images/food/meat_02.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "steak", - "interact_boxes": [ - { - "northmost": 10.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 9.25, "westmost": 9.5, - "southmost": 10.85, + "southmost": 9.5, "eastmost": 11.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 9.15, + "SOUTH_BOX": { + "northmost": 10.5, "westmost": 9.5, - "southmost": 9.5, + "southmost": 10.75, "eastmost": 11.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -511,22 +511,22 @@ "food_image": "images/food/meat_03.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "chicken", - "interact_boxes": [ - { - "northmost": 10.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 9.25, "westmost": 11.5, - "southmost": 10.85, + "southmost": 9.5, "eastmost": 13.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 9.15, + "SOUTH_BOX": { + "northmost": 10.5, "westmost": 11.5, - "southmost": 9.5, + "southmost": 10.75, "eastmost": 13.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -542,22 +542,22 @@ "food_image": "images/food/ham.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "ham", - "interact_boxes": [ - { - "northmost": 10.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 9.25, "westmost": 13.5, - "southmost": 10.85, + "southmost": 9.5, "eastmost": 15.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 9.15, + "SOUTH_BOX": { + "northmost": 10.5, "westmost": 13.5, - "southmost": 9.5, + "southmost": 10.75, "eastmost": 15.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -573,22 +573,22 @@ "food_image": "images/food/cheese_01.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "brie cheese", - "interact_boxes": [ - { - "northmost": 14.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 13.25, "westmost": 5.5, - "southmost": 14.85, + "southmost": 13.5, "eastmost": 7.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 13.15, + "SOUTH_BOX": { + "northmost": 14.5, "westmost": 5.5, - "southmost": 13.5, + "southmost": 14.75, "eastmost": 7.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -604,22 +604,22 @@ "food_image": "images/food/cheese_02.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "swiss cheese", - "interact_boxes": [ - { - "northmost": 14.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 13.25, "westmost": 7.5, - "southmost": 14.85, + "southmost": 13.5, "eastmost": 9.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 13.15, + "SOUTH_BOX": { + "northmost": 14.5, "westmost": 7.5, - "southmost": 13.5, + "southmost": 14.75, "eastmost": 9.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -635,22 +635,22 @@ "food_image": "images/food/cheese_03.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "cheese wheel", - "interact_boxes": [ - { - "northmost": 14.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 13.25, "westmost": 9.5, - "southmost": 14.85, + "southmost": 13.5, "eastmost": 11.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 13.15, + "SOUTH_BOX": { + "northmost": 14.5, "westmost": 9.5, - "southmost": 13.5, + "southmost": 14.75, "eastmost": 11.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -666,22 +666,22 @@ "food_image": "images/food/cheese_03.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "cheese wheel", - "interact_boxes": [ - { - "northmost": 14.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 13.25, "westmost": 11.5, - "southmost": 14.85, + "southmost": 13.5, "eastmost": 13.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 13.15, + "SOUTH_BOX": { + "northmost": 14.5, "westmost": 11.5, - "southmost": 13.5, + "southmost": 14.75, "eastmost": 13.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -697,22 +697,22 @@ "food_image": "images/food/cheese_03.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "cheese wheel", - "interact_boxes": [ - { - "northmost": 14.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 13.25, "westmost": 13.5, - "southmost": 14.85, + "southmost": 13.5, "eastmost": 15.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 13.15, + "SOUTH_BOX": { + "northmost": 14.5, "westmost": 13.5, - "southmost": 13.5, + "southmost": 14.75, "eastmost": 15.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -728,22 +728,22 @@ "food_image": "images/food/garlic.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "garlic", - "interact_boxes": [ - { - "northmost": 18.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 17.25, "westmost": 5.5, - "southmost": 18.85, + "southmost": 17.5, "eastmost": 7.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 17.15, + "SOUTH_BOX": { + "northmost": 18.5, "westmost": 5.5, - "southmost": 17.5, + "southmost": 18.75, "eastmost": 7.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -759,22 +759,22 @@ "food_image": "images/food/leek_onion.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "leek", - "interact_boxes": [ - { - "northmost": 18.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 17.25, "westmost": 7.5, - "southmost": 18.85, + "southmost": 17.5, "eastmost": 9.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 17.15, + "SOUTH_BOX": { + "northmost": 18.5, "westmost": 7.5, - "southmost": 17.5, + "southmost": 18.75, "eastmost": 9.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -790,22 +790,22 @@ "food_image": "images/food/bell_pepper_red.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "red bell pepper", - "interact_boxes": [ - { - "northmost": 18.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 17.25, "westmost": 9.5, - "southmost": 18.85, + "southmost": 17.5, "eastmost": 11.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 17.15, + "SOUTH_BOX": { + "northmost": 18.5, "westmost": 9.5, - "southmost": 17.5, + "southmost": 18.75, "eastmost": 11.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -821,22 +821,22 @@ "food_image": "images/food/carrot.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "carrot", - "interact_boxes": [ - { - "northmost": 18.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 17.25, "westmost": 11.5, - "southmost": 18.85, + "southmost": 17.5, "eastmost": 13.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 17.15, + "SOUTH_BOX": { + "northmost": 18.5, "westmost": 11.5, - "southmost": 17.5, + "southmost": 18.75, "eastmost": 13.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -852,22 +852,22 @@ "food_image": "images/food/lettuce.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "lettuce", - "interact_boxes": [ - { - "northmost": 18.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 17.25, "westmost": 13.5, - "southmost": 18.85, + "southmost": 17.5, "eastmost": 15.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 17.15, + "SOUTH_BOX": { + "northmost": 18.5, "westmost": 13.5, - "southmost": 17.5, + "southmost": 18.75, "eastmost": 15.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -883,22 +883,22 @@ "food_image": "images/food/avocado.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "avocado", - "interact_boxes": [ - { - "northmost": 22.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 21.25, "westmost": 5.5, - "southmost": 22.85, + "southmost": 21.5, "eastmost": 7.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 21.15, + "SOUTH_BOX": { + "northmost": 22.5, "westmost": 5.5, - "southmost": 21.5, + "southmost": 22.75, "eastmost": 7.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -914,22 +914,22 @@ "food_image": "images/food/broccoli.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "broccoli", - "interact_boxes": [ - { - "northmost": 22.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 21.25, "westmost": 7.5, - "southmost": 22.85, + "southmost": 21.5, "eastmost": 9.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 21.15, + "SOUTH_BOX": { + "northmost": 22.5, "westmost": 7.5, - "southmost": 21.5, + "southmost": 22.75, "eastmost": 9.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -945,22 +945,22 @@ "food_image": "images/food/cucumber.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "cucumber", - "interact_boxes": [ - { - "northmost": 22.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 21.25, "westmost": 9.5, - "southmost": 22.85, + "southmost": 21.5, "eastmost": 11.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 21.15, + "SOUTH_BOX": { + "northmost": 22.5, "westmost": 9.5, - "southmost": 21.5, + "southmost": 22.75, "eastmost": 11.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -976,22 +976,22 @@ "food_image": "images/food/bell_pepper_yellow.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "yellow bell pepper", - "interact_boxes": [ - { - "northmost": 22.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 21.25, "westmost": 11.5, - "southmost": 22.85, + "southmost": 21.5, "eastmost": 13.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 21.15, + "SOUTH_BOX": { + "northmost": 22.5, "westmost": 11.5, - "southmost": 21.5, + "southmost": 22.75, "eastmost": 13.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } }, { "height": 1, @@ -1007,22 +1007,22 @@ "food_image": "images/food/onion.png", "shelf_image": "images/Shelves/shelf.png", "food_name": "onion", - "interact_boxes": [ - { - "northmost": 22.5, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 21.25, "westmost": 13.5, - "southmost": 22.85, + "southmost": 21.5, "eastmost": 15.5, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 21.15, + "SOUTH_BOX": { + "northmost": 22.5, "westmost": 13.5, - "southmost": 21.5, + "southmost": 22.75, "eastmost": 15.5, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" } - ] + } } ], "cartReturns": [ @@ -1034,15 +1034,15 @@ 18.5 ], "quantity": 5, - "interact_boxes": [ - { - "northmost": 18.15, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 18.25, "westmost": 1, "southmost": 18.5, "eastmost": 1.7, "player_needs_to_face": "SOUTH" } - ] + } }, { "height": 6, @@ -1052,15 +1052,15 @@ 18.5 ], "quantity": 6, - "interact_boxes": [ - { - "northmost": 18.15, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 18.25, "westmost": 2, "southmost": 18.5, "eastmost": 2.7, "player_needs_to_face": "SOUTH" } - ] + } } ], "basketReturns": [ @@ -1072,36 +1072,36 @@ 18.5 ], "quantity": 12, - "interact_boxes": [ - { - "northmost": 18.7, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 18.25, "westmost": 3.5, - "southmost": 19.05, + "southmost": 18.5, "eastmost": 3.8, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 18.15, + "SOUTH_BOX": { + "northmost": 18.7, "westmost": 3.5, - "southmost": 18.5, + "southmost": 18.95, "eastmost": 3.8, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" }, - { + "WEST_BOX": { "northmost": 18.5, - "westmost": 3.15, + "westmost": 3.25, "southmost": 18.7, "eastmost": 3.5, "player_needs_to_face": "EAST" }, - { + "EAST_BOX": { "northmost": 18.5, "westmost": 3.8, "southmost": 18.7, - "eastmost": 4.1499999999999995, + "eastmost": 4.05, "player_needs_to_face": "WEST" } - ] + } } ], "counters": [ @@ -1114,36 +1114,36 @@ ], "food": "prepared foods", "price": 15, - "interact_boxes": [ - { - "northmost": 7.0, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 4.5, "westmost": 18.25, - "southmost": 7.35, + "southmost": 4.75, "eastmost": 19.75, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 4.4, + "SOUTH_BOX": { + "northmost": 7.0, "westmost": 18.25, - "southmost": 4.75, + "southmost": 7.25, "eastmost": 19.75, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" }, - { + "WEST_BOX": { "northmost": 4.75, - "westmost": 17.9, + "westmost": 18.0, "southmost": 7.0, "eastmost": 18.25, "player_needs_to_face": "EAST" }, - { + "EAST_BOX": { "northmost": 4.75, "westmost": 19.75, "southmost": 7.0, - "eastmost": 20.1, + "eastmost": 20.0, "player_needs_to_face": "WEST" } - ] + } }, { "height": 2.25, @@ -1154,36 +1154,36 @@ ], "food": "fresh fish", "price": 12, - "interact_boxes": [ - { - "northmost": 13.0, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 10.5, "westmost": 18.25, - "southmost": 13.35, + "southmost": 10.75, "eastmost": 19.75, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 10.4, + "SOUTH_BOX": { + "northmost": 13.0, "westmost": 18.25, - "southmost": 10.75, + "southmost": 13.25, "eastmost": 19.75, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" }, - { + "WEST_BOX": { "northmost": 10.75, - "westmost": 17.9, + "westmost": 18.0, "southmost": 13.0, "eastmost": 18.25, "player_needs_to_face": "EAST" }, - { + "EAST_BOX": { "northmost": 10.75, "westmost": 19.75, "southmost": 13.0, - "eastmost": 20.1, + "eastmost": 20.0, "player_needs_to_face": "WEST" } - ] + } }, { "height": 2.25, @@ -1194,36 +1194,36 @@ ], "food": "fresh fish", "price": 12, - "interact_boxes": [ - { - "northmost": 13.0, + "interact_boxes": { + "NORTH_BOX": { + "northmost": 10.5, "westmost": 18.25, - "southmost": 13.35, + "southmost": 10.75, "eastmost": 19.75, - "player_needs_to_face": "NORTH" + "player_needs_to_face": "SOUTH" }, - { - "northmost": 10.4, + "SOUTH_BOX": { + "northmost": 13.0, "westmost": 18.25, - "southmost": 10.75, + "southmost": 13.25, "eastmost": 19.75, - "player_needs_to_face": "SOUTH" + "player_needs_to_face": "NORTH" }, - { + "WEST_BOX": { "northmost": 10.75, - "westmost": 17.9, + "westmost": 18.0, "southmost": 13.0, "eastmost": 18.25, "player_needs_to_face": "EAST" }, - { + "EAST_BOX": { "northmost": 10.75, "westmost": 19.75, "southmost": 13.0, - "eastmost": 20.1, + "eastmost": 20.0, "player_needs_to_face": "WEST" } - ] + } } ] } \ No newline at end of file diff --git a/final_proj/socket_agent_proj.py b/final_proj/socket_agent_proj.py index daeb278..6cc8466 100755 --- a/final_proj/socket_agent_proj.py +++ b/final_proj/socket_agent_proj.py @@ -1,5 +1,3 @@ -# Author: Gyan Tatiya -# Email: Gyan.Tatiya@tufts.edu import json import socket @@ -52,6 +50,18 @@ def populate_locs(observation): geometry['position'][1] += geometry['height'] + 1 geometry['interact_boxes'] = obj['interact_boxes'] locs[obj['food']] = geometry + + for idx, obj in enumerate(obs_with_boxes['carts']): + geometry = get_geometry(obj) + geometry['position'][1] += geometry['height'] + 1 + geometry['interact_boxes'] = obj['interact_boxes'] + locs['cart {idx}'] = geometry + + for idx, obj in enumerate(obs_with_boxes['baskets']): + geometry = get_geometry(obj) + geometry['position'][1] += geometry['height'] + 1 + geometry['interact_boxes'] = obj['interact_boxes'] + locs['basket {idx}'] = geometry return locs @@ -61,55 +71,160 @@ class Agent: def __init__(self, conn, agent_id, env): self.socket = conn self.agent_id = agent_id - self.obs = env['observation'] - self.shopping_list: list = self.init_list() + self.env = env + self.list_quant:list = env['observation']['players'][self.agent_id]['list_quant'] + self.shopping_list:list[tuple] = [(item, quant) for item, quant in zip(env['observation']['players'][self.agent_id]['shopping_list'], self.list_quant)] self.goal = "" self.done = False - self.has_cart = False + self.container_id = -1 + self.container_type = '' + self.holding_container = False + self.holding_food = None self.astar_planner = Astar_agent(socket_game=conn, env=env) def transition(self): if self.done: # If we've left the store self.execute("NOP") # Do nothing - elif not self.has_cart: # If we don't have a cart - self.get_cart() # Get one! + elif self.container_id == -1: # If we don't have a container + self.get_container() # Get one! elif self.goal == "": # If we currently don't have a goal if not self.shopping_list: # Check if there's anything left on our list - self.exit() # Leave the store (includes checkout) + self.exit() # Leave the store (includes checkout), might need to return basket else: # We've still got something on our shopping list - item = self.shopping_list.pop(0) - self.goal = locs[item] # Set our goal to the next item on our list - self.goto() # Go to our goal - - else: # If we have a goal and we're here, that means we're at the goal! - self.add_to_cart() + item, quantity = self.strategically_choose_from_shopping_list(self.shopping_list) + for _ in range(quantity): + self.goal = item # Set our goal to the next item on our list + self.get_item() # Go to our goal + self.transition() + elif self.goal == 'add_to_container': # If we have a goal and we're here, that means we're at the goal! + self.add_to_container() + else: # this shouldn't happen, just exit + self.exit() - # Agent retrieves a - def get_cart(self): - print(f"Agent {self.agent_id} getting a cart/basket") + + def get_item(self): + """get `quantitiy` number of `item` - # always grabs a basket for now - self.goto(basketReturns, is_item=True) + Args: + item (str): an item on the shopping list + """ + print(f"Agent {self.agent_id} going to {self.goal}") + #TODO:go to the item and get it. Look at the implementation of `get_container` for reference. target item in stored self.goal + #change goal after getting item. + self.holding_food = self.env['observation']['players'][self.agent_id]['holding_food'] + if self.holding_food is not None: + self.holding_container = False #sanity check: can't hold both food and container + if self.holding_food == self.goal:# successfully got item + self.goal = "add_to_container" + + # Agent retrieves a container + def get_container(self): + if sum(self.list_quant) <= 6: + self.update_container(container='basket') + print(f"Agent {self.agent_id} getting a basket") + if self.container_id == -1: # has never gotten a container + self.goal = 'basketReturn 0' + self.goto(goal='basketReturn 0', is_item=True) + else: + self.goal = 'basket' + self.goto(goal=f'basket {self.container_id}', is_item=True) + self.execute('INTERACT') + self.execute('INTERACT') + self.update_container('basket') + self.holding_container = True #we have to make this assumption, it's not reflected in the env + else: + print(f"Agent {self.agent_id} getting a cart") + self.update_container(container='cart') + if self.container_id == -1: # has never gotten a container + self.goto(goal='cartReturn 0', is_item=True) + else: + self.goal = 'cart' + self.goto(goal=f'cart {self.container_id}', is_item=True) + self.execute('INTERACT') + self.execute('INTERACT') + self.update_container('cart') + self.goal = "" - self.has_cart = True + def strategically_choose_from_shopping_list(self, shopping_list): + """Strategically choose an item from the shopping list - def check_has_container(self, container): - """Check if we have are holding the `container`. Either a cart or a basket + Args: + shopping_list (list[tuple]): shopping list of (item, quantity) + """ + #TODO: add optimization strategy + return shopping_list.pop(0) + + def update_container(self, container='basket'): + """Check if we are responsible for any `container`. Either a cart or a basket Args: container (_type_): either a cart or a basket """ - #TODO:Helen implement this + if self.env['observation']['players'][self.agent_id]['curr_cart'] != -1:#currently holding a cart + self.container_type = 'cart' + self.container_id = self.env['observation']['players'][self.agent_id]['curr_cart'] + self.holding_container = True + return + for i, c in enumerate(self.env['observation'][container+'s']): + if c['owner'] == self.agent_id: + self.container_id = i + self.container_type = container + return + + def interact_box_to_goal_location(self, box:dict) -> tuple[float, float]: + """Given an interact box, determine which goal location within the box to aim for + + Args: + box (dict): interact box + + Returns: + tuple[float, float]: the goal location + """ + player_needs_to_face = box['player_needs_to_face'] + if player_needs_to_face == Direction.SOUTH.name: + top_left = (box['westmost'],box['northmost']) + return top_left + elif player_needs_to_face == Direction.NORTH.name: + bot_left = (box['westmost'],box['southmost']) + return bot_left + elif player_needs_to_face == Direction.WEST.name: + bot_right = (box['eastmost'],box['southmost']) + return bot_right + else: + bot_left = (box['westmost'],box['southmost']) + return bot_left - def goto(self, goal=None, is_item=True): + + def goto(self, goal:list|tuple|str, is_item=True): if goal is None: goal = self.goal - # todo: check if we're holding a cart - holding_cart = False - if holding_cart: + if is_item:#goal is an item in the env, not a (x, y) + populate_locs(self.env['observation']) + if goal in ('cartReturn 0', 'cartReturn 1', 'basketReturn 0'): # access these from the North + interact_box = locs[goal]['interact_boxes']['NORTH_BOX'] + goal = self.interact_box_to_goal_location(box=interact_box) + elif goal in ('cart', 'basket'): + if self.container_type != goal:# current container and goal doesn't match, get current container instead + self.goto(goal=self.container_type) + return + elif self.holding_container:#already holding container + return + else: + interact_boxes:dict = locs[f'{goal} {self.container_id}'] + if goal == 'cart': + interact_box = list(interact_boxes.values())[0]#cart only has one interact box, go to that interact box + goal= self.interact_box_to_goal_location(box=interact_box) + else: + interact_box = locs[f'{goal} {self.container_id}']['interact_boxes']['SOUTH_BOX'] + goal= self.interact_box_to_goal_location(box=interact_box) + else:# access everything else from the SOUTH + interact_box = locs[goal]['interact_boxes']['SOUTH_BOX'] + goal = self.interact_box_to_goal_location(box=interact_box) + + if self.holding_container and self.container_type == 'cart': print(f"Agent {self.agent_id} going to location {goal} with cart") pass # TODO: goto with cart. TA says it might be as simple as changing the player's shape. If it's too complicated we will skip it @@ -119,85 +234,115 @@ def goto(self, goal=None, is_item=True): print(f"Agent {self.agent_id} going to location {goal} without cart") for intermediate_target_location in path: - player = self.obs['observation']['players'][self.agent_id] - self.step(step_location=intermediate_target_location, player=player, backtrack=[]) + self.step(step_location=intermediate_target_location, player_id=self.agent_id, backtrack=[]) + + if is_item: # locally adjust to make sure we can interact with the target item + self.reactive_nav(goal=interact_box, is_box=True) + + def nav(self, goal, is_item=True): - player = self.obs['observation']['players'][self.agent_id] + """The default navigation + + Args: + goal (_type_): (x, y) + + Returns: + _type_: a list of (x, y) to goal + """ + player = self.env['observation']['players'][self.agent_id] player_location = player['position'] - path = self.astar_planner.astar(start=player_location, goal=goal, map_width=MAP_WIDTH, map_height=MAP_HEIGHT, objs=objs, is_item=is_item) + path = self.astar_planner.astar(start=tuple(player_location), goal=goal, map_width=MAP_WIDTH, map_height=MAP_HEIGHT, objs=objs, is_item=is_item) return path # this returns a path of x, y locations that the agent will go through - ##################################### - ## The old navigation code is below## - ##################################### - # target = "x" - # reached_x = False - # reached_y = False - # while True: - # player = self.obs['observation']['players'][self.agent_id] - - # x_dist = player['position'][0] - goal['position'][0] - # y_dist = player['position'][1] - goal['position'][1] - - # if abs(x_dist) < STEP: - # reached_x = True - # if abs(y_dist) < STEP: - # reached_y = True - # if reached_x and reached_y: - # break - - # if target == "x": - # if x_dist < -STEP: - # command = Direction.EAST - # elif x_dist > STEP: - # command = Direction.WEST - # else: - # reached_y = False - # target = "y" - # continue - # else: - # if y_dist < -STEP: - # command = Direction.SOUTH - # elif y_dist > STEP: - # command = Direction.NORTH - # else: - # reached_x = False - # target = "x" - # continue - - # while project_collision(player, self.obs, command, 0.8): - # command = Direction((command.value + 1) % 4) - # self.step(command, player) - - def step(self, step_location:list|tuple, player, backtrack:list): + + def reactive_nav(self, goal, is_box=False): + """Purely reactie navigation + + Args: + goal (_type_): (x, y) or interact_box + """ + ############################################## + ## The old reactive navigation code is below## + ############################################## + target = "x" + reached_x = False + reached_y = False + while True: + player = self.env['observation']['players'][self.agent_id] + + if is_box: + x_dist = player['position'][0] - goal['westmost'] + y_dist = player['position'][1] - goal['northmost'] + if can_interact_in_box(player=player, interact_box=goal): + reached_x = True + reached_y = True + else: + x_dist = player['position'][0] - goal[0] + y_dist = player['position'][1] - goal[1] + + if abs(x_dist) < STEP: + reached_x = True + if abs(y_dist) < STEP: + reached_y = True + if reached_x and reached_y: + break + + if target == "x": + if x_dist < -STEP: + command = Direction.EAST + elif x_dist > STEP: + command = Direction.WEST + else: + reached_y = False + target = "y" + continue + else: + if y_dist < -STEP: + command = Direction.SOUTH + elif y_dist > STEP: + command = Direction.NORTH + else: + reached_x = False + target = "x" + continue + + while project_collision(player, self.env, command, STEP): + command = Direction((command.value + 1) % 4) + self.execute(action=command.name) + + def step(self, step_location:list|tuple, player_id:int, backtrack:list): """Keep locally adjusting and stepping in the right direction so that `player` ends up `close_enough` to `step_location`. `step_location` should be only one step away Args: step_location (list | tuple): a (x, y) that is assumed to be one step away from the player's current location - player (_type_): the player object that needs to be at `step_location` + player_id (int): the player id for the player that needs to be at `step_location` backtrack (list): a list of locations visited by the player """ goal_x, goal_y = step_location - player_x, player_y = player['position'] - while not self.astar_planner.is_close_enough(current=player['position'], goal=step_location, tolerance=LOCATION_TOLERANCE, is_item=False):#deals with stochasticity: keep locally adjusting to the right location until it's close enough + player_x, player_y = self.env['observation']["players"][player_id]['position'] + while not self.astar_planner.is_close_enough(current=self.env['observation']["players"][player_id]['position'], goal=step_location, tolerance=LOCATION_TOLERANCE, is_item=False):#deals with stochasticity: keep locally adjusting to the right location until it's close enough # compare previous position with current position to determine if a location needs to be saved in the player's backtracking trace prev_x = player_x prev_y = player_y - player_x, player_y = player['position'] + player_x, player_y = self.env['observation']["players"][player_id]['position'] if player_x != prev_x or player_y != prev_y:#player has moved, record its prev position for potential backtracking backtrack.append((prev_x, prev_y)) - if manhattan_distance(player['position'], step_location) >= BACKTRACK_TOLERANCE:#player has wandered too far due to stochasticity, there could be an object between the player and the goal `step_location` now. The player needs to backtrack to the starting location, otherwise it could be banging its head against the object forever - self.step(step_location=backtrack[-1], player=player, backtrack=backtrack[:-1]) + if manhattan_distance(self.env['observation']["players"][player_id]['position'], step_location) >= BACKTRACK_TOLERANCE:#player has wandered too far due to stochasticity, there could be an object between the player and the goal `step_location` now. The player needs to backtrack to the starting location, otherwise it could be banging its head against the object forever + self.step(step_location=backtrack[-1], player_id=player_id, backtrack=backtrack[:-1]) del backtrack[-1] elif player_x < goal_x and abs(player_x - goal_x) >= LOCATION_TOLERANCE:# player should go EAST - self.execute(Direction.EAST.name) + #self.execute(Direction.EAST.name) + self.reactive_nav(goal=step_location, is_box=False) elif player_x > goal_x and abs(player_x - goal_x) >= LOCATION_TOLERANCE:#player should go WEST - self.execute(Direction.WEST.name) + #self.execute(Direction.WEST.name) + self.reactive_nav(goal=step_location, is_box=False) elif player_y < goal_y and abs(player_y - goal_y) >= LOCATION_TOLERANCE:#player should go SOUTH - self.execute(Direction.SOUTH.name) + #self.execute(Direction.SOUTH.name) + self.reactive_nav(goal=step_location, is_box=False) elif player_y < goal_y and abs(player_y - goal_y) >= LOCATION_TOLERANCE:#player should go NORTH - self.execute(Direction.NORTH.name) + #self.execute(Direction.NORTH.name) + self.reactive_nav(goal=step_location, is_box=False) # def infer_actual_action(player_state_before_execution:tuple[float, float, Direction], player_state_after_execution:tuple[float, float, Direction]): # prev_x, prev_y, prev_orientation = player_state_before_execution @@ -209,17 +354,17 @@ def step(self, step_location:list|tuple, player, backtrack:list): # TODO: Agent picks up an item and adds it to the cart - def add_to_cart(self): - print(f"Agent {self.agent_id} adding an item to the cart") + def add_to_container(self): + print(f"Agent {self.agent_id} adding an item to the {self.container_type}") - pass # todo + pass # TODO self.goal = "" # TODO use other functions to complete checkout def exit(self): print(f"Agent {self.agent_id} exiting") - self.goto([2, 12.5]) + self.goto([2, 12.5], is_item=False) # pick_up_and_put_in(shelf_direction = "NORTH") # self.add_to_cart() @@ -233,7 +378,7 @@ def init_list(self): print(f"Agent {self.agent_id} reading list") shopping_list = [] self.execute("NOP") - shopping_list += self.obs['observation']["players"][self.agent_id]["shopping_list"].copy() + shopping_list += self.env['observation']["players"][self.agent_id]["shopping_list"].copy() return shopping_list # Given an action, executes it for this agent @@ -241,7 +386,7 @@ def execute(self, action): action = f"{self.agent_id} {action}" self.socket.send(str.encode(action)) # send action to env output = recv_socket_data(self.socket) # get observation from env - self.obs = json.loads(output) + self.env = json.loads(output) if __name__ == "__main__": @@ -255,7 +400,8 @@ def execute(self, action): PORT = 9000 sock_game = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock_game.connect((HOST, PORT)) - + sock_game.send(str.encode("0 RESET")) # reset the game + state = recv_socket_data(sock_game) sock_game.send(str.encode("0 NOP")) # send action to env output = recv_socket_data(sock_game) # get observation from env output = json.loads(output) diff --git a/final_proj/util.py b/final_proj/util.py index 7742abb..d66996d 100644 --- a/final_proj/util.py +++ b/final_proj/util.py @@ -1,9 +1,12 @@ import time import json import copy +from pathlib import Path from constants import * from copy import deepcopy from constants import * +from enums.direction import Direction +from helper import * def get_geometry(obj): @@ -30,7 +33,7 @@ def recv_socket_data(sock): def manhattan_distance(pos1, pos2): # Calculate the Manhattan distance from pos1 to pos2 - return abs(pos2[0] - pos1[1]) + abs(pos2[1] - pos2[0]) + return abs(pos2[0] - pos1[0]) + abs(pos2[1] - pos2[1]) def euclidean_distance(pos1, pos2): # Calculate Euclidean distance between two points @@ -50,6 +53,33 @@ def bounding_box(place:dict) -> dict: width = place['width'] return {"northmost":upper_left[1], "westmost":upper_left[0], "southmost":upper_left[1]+height, "eastmost":upper_left[0]+width} +def find_midpoint(interact_box:dict) -> tuple[float, float]: + """find the midpoint along an edge of an interact box. Which edge it is depends on the direction the player needs to face in the box + + Args: + interact_box (dict): an interact box for an object + + Returns: + tuple[float, float]: (x, y) + """ + player_needs_to_face = interact_box['player_needs_to_face'] + if player_needs_to_face == Direction.NORTH.name:#this box is to the SOUTH of the interaction object + edge_y = interact_box['southmost'] + edge_x = (interact_box['eastmost'] - interact_box['westmost']) / 2.0 + interact_box['westmost'] + return (edge_x, edge_y) + elif player_needs_to_face == Direction.SOUTH.name:#this box is to the NORTH of the interaction object + edge_y = interact_box['northmost'] + edge_x = (interact_box['eastmost'] - interact_box['westmost']) / 2.0 + interact_box['westmost'] + return (edge_x, edge_y) + elif player_needs_to_face == Direction.WEST.name:#this box is to the EAST of the interaction object + edge_x = interact_box['eastmost'] + edge_y = (interact_box['southmost'] - interact_box['northmost']) / 2.0 + interact_box['northmost'] + return (edge_x, edge_y) + else:#this box is to the WEST of the interaction object + edge_x = interact_box['westmost'] + edge_y = (interact_box['southmost'] - interact_box['northmost']) / 2.0 + interact_box['northmost'] + return (edge_x, edge_y) + def player_interact_area(player) -> list: interact_boxes = four_side_interact_area(player) dir = player['direction'] @@ -64,7 +94,7 @@ def one_side_interact_area(place_obj) -> list: interact_box['southmost'] = interact_box['northmost'] interact_box['northmost'] -= interact_distance interact_box['player_needs_to_face'] = 'SOUTH' - return [interact_box] + return {'NORTH_BOX':interact_box} def two_side_interact_area(place_obj) -> list: place_bounding_box = bounding_box(place_obj) @@ -75,7 +105,7 @@ def two_side_interact_area(place_obj) -> list: south_interact_box['northmost'] = place_bounding_box['southmost'] south_interact_box['southmost'] += interact_distance south_interact_box['player_needs_to_face'] = 'NORTH' - interact_boxes = [interact_boxes[0], south_interact_box] + interact_boxes['SOUTH_BOX'] = south_interact_box return interact_boxes def four_side_interact_area(place_obj:dict) -> dict: @@ -90,25 +120,34 @@ def four_side_interact_area(place_obj:dict) -> dict: east_interact_box['westmost'] = place_bounding_box['eastmost'] east_interact_box['eastmost'] += interact_distance east_interact_box['player_needs_to_face'] = 'WEST' - interact_boxes.append(east_interact_box) - interact_boxes.append(west_interact_box) + interact_boxes['WEST_BOX'] = west_interact_box + interact_boxes['EAST_BOX'] = east_interact_box return interact_boxes -def overlap(player, interact_box): - return ( - interact_box['northmost'] <= player['bounding_box']['northmost'] <= interact_box['southmost'] and ( - (interact_box['westmost'] <= player['bounding_box']['westmost'] <= interact_box['eastmost']) - or - (interact_box['westmost'] <= player['bounding_box']['eastmost'] <= interact_box['eastmost']) - ) - or - interact_box['northmost'] <= player['bounding_box']['southmost'] <= interact_box['southmost'] and ( - (interact_box['westmost'] <= player['bounding_box']['westmost'] <= interact_box['eastmost']) - or - (interact_box['westmost'] <= player['bounding_box']['eastmost'] <= interact_box['eastmost']) - ) +def player_overlap_with_interact_box(player, interact_box): + return not ( + player['bounding_box']['westmost'] > interact_box['eastmost'] or\ + player['bounding_box']['northmost'] > interact_box['southmost'] or\ + player['bounding_box']['eastmost'] < interact_box['westmost'] or\ + player['bounding_box']['southmost'] < interact_box['northmost'] ) + +def can_interact_in_box(player, interact_box) -> bool: + """Returns whether `player` overlaps with interact_box + + Args: + player (dict): player + interact_box (dict): interact box + + Returns: + bool: Whether the player can interact in box + """ + player['bounding_box'] = bounding_box(place=player) + if player_overlap_with_interact_box(player=player, interact_box=interact_box) and player_directions[player['direction']] == interact_box['player_needs_to_face']: + return True + return False + def can_interact_player(player, place_obj) -> bool: """Returns whether the `player` object can interact with the `place_obj` based on their interact boxes @@ -120,7 +159,7 @@ def can_interact_player(player, place_obj) -> bool: bool: whether the player and the place can interact """ for interact_box in place_obj['interact_boxes']: - if overlap(player=player, interact_box=interact_box) and player_directions[player['direction']] == interact_box['player_needs_to_face']: + if player_overlap_with_interact_box(player=player, interact_box=interact_box) and player_directions[player['direction']] == interact_box['player_needs_to_face']: return True return False @@ -160,15 +199,15 @@ def add_interact_boxes_to_obs(obs) -> dict: obj_dict["interact_boxes"] = four_side_interact_area(obj_dict) elif object_name == "carts": possible_boxes = four_side_interact_area(obj_dict) - obj_dir = player_directions[obj_dict['direction']] - if obj_dir == 'NORTH': - obj_dict["interact_boxes"] = [possible_boxes[1]] - elif obj_dir == 'SOUTH': - obj_dict["interact_boxes"] = [possible_boxes[0]] - elif obj_dir == 'WEST': - obj_dict["interact_boxes"] = [possible_boxes[2]] - else: - obj_dict["interact_boxes"] = [possible_boxes[3]] + obj_dir = obj_dict['direction'] + if obj_dir == Direction.NORTH:#can be interacted with from the SOUTH + obj_dict["interact_boxes"] = {'SOUTH_BOX':possible_boxes['SOUTH_BOX']} + elif obj_dir == Direction.SOUTH:#can be interacted with from the NORTH + obj_dict["interact_boxes"] = {'NORTH_BOX':possible_boxes['NORTH_BOX']} + elif obj_dir == Direction.WEST:#can be interacted with from the EAST + obj_dict["interact_boxes"] = {'EAST_BOX':possible_boxes['EAST_BOX']} + else:#can be interacted with from the WEST + obj_dict["interact_boxes"] = {'WEST_BOX':possible_boxes['SOUTH_BOX']} elif object_name == "shelves": obj_dict['interact_boxes'] = two_side_interact_area(obj_dict) else: @@ -177,11 +216,16 @@ def add_interact_boxes_to_obs(obs) -> dict: if __name__ == "__main__": # run this to test adding interact boxes to objects in env.json (json version of the env object) - f = open("env.json") + # Get the path to the current file + current_file_path = Path(__file__) + + # Get the folder containing the current file + dir = current_file_path.parent + f = open(dir / "env.json") obs = json.load(f) # test adding interact boxes to each object in the environment obs = add_interact_boxes_to_obs(obs) - with open('env_interact_boxes.json', 'w') as file: + with open(dir / 'env_interact_boxes.json', 'w') as file: # Write the dictionary to the JSON file json.dump(obs, file, indent=4) diff --git a/helper.py b/helper.py index b7a6807..be5a409 100644 --- a/helper.py +++ b/helper.py @@ -39,19 +39,23 @@ def project_collision(obj, state, direction: Direction, dist=0.4): obj_copy = deepcopy(obj) if direction == Direction.NORTH: - obj_copy['position'][1] -= dist + if obj_copy['direction'] == direction:#object moves + obj_copy['position'][1] -= dist if obj_copy['position'][1] < 2: return True elif direction == Direction.EAST: - obj_copy['position'][0] += dist + if obj_copy['direction'] == direction:#object moves + obj_copy['position'][0] += dist if obj_copy['position'][0] > 18.5: return True elif direction == Direction.SOUTH: - obj_copy['position'][1] += dist + if obj_copy['direction'] == direction:#object moves + obj_copy['position'][1] += dist if obj_copy['position'][1] > 24: return True elif direction == Direction.WEST: - obj_copy['position'][0] -= dist + if obj_copy['direction'] == direction:#object moves + obj_copy['position'][0] -= dist if obj_copy['position'][0] < 2: return True @@ -69,21 +73,25 @@ def project_collision_dyn(obj, state, direction: Direction, dist=0.4, buffer=0): obj_copy = deepcopy(obj) if direction == Direction.NORTH: - obj_copy['position'][1] -= dist + if obj_copy['direction'] == direction:#object moves + obj_copy['position'][1] -= dist if obj_copy['position'][1] < 2: - return 1 + return True elif direction == Direction.EAST: - obj_copy['position'][0] += dist + if obj_copy['direction'] == direction:#object moves + obj_copy['position'][0] += dist if obj_copy['position'][0] > 18.5: - return 1 + return True elif direction == Direction.SOUTH: - obj_copy['position'][1] += dist + if obj_copy['direction'] == direction:#object moves + obj_copy['position'][1] += dist if obj_copy['position'][1] > 24: - return 1 + return True elif direction == Direction.WEST: - obj_copy['position'][0] -= dist + if obj_copy['direction'] == direction:#object moves + obj_copy['position'][0] -= dist if obj_copy['position'][0] < 2: - return 1 + return True for key, value in state['observation'].items(): for item in value: From 7d4b70580375b5bca8887dc00be23a1911557e7b Mon Sep 17 00:00:00 2001 From: Helen Date: Thu, 25 Apr 2024 01:14:24 -0400 Subject: [PATCH 12/22] readme for running the agent --- final_proj/README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 final_proj/README.md diff --git a/final_proj/README.md b/final_proj/README.md new file mode 100644 index 0000000..733542a --- /dev/null +++ b/final_proj/README.md @@ -0,0 +1,19 @@ +## Installing +Clone the repo + +``` +git clone https://github.com/marlow-fawn/propershopper.git +``` + +## Running keyboard input +Running the simulation with keyboard input is a good way to get a sense of the physics of the simulation and how interaction with objects works. + +To run keyboard input, while in the "proppershopper" directory, run + +``` + socket_env.py --keyboard_input --random_start --num_players 5 +``` +## Run our agent +``` + socket_agent_proj.py +``` From 443058aaeee824027db74e956a4be54acfce7db7 Mon Sep 17 00:00:00 2001 From: Helen Date: Thu, 25 Apr 2024 02:13:33 -0400 Subject: [PATCH 13/22] fixed issues with project collision --- enums/direction.py | 4 ++-- helper.py | 24 ++++++++++++------------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/enums/direction.py b/enums/direction.py index 5ba6273..8150fcd 100644 --- a/enums/direction.py +++ b/enums/direction.py @@ -3,7 +3,7 @@ class Direction(Enum): NORTH = 0 - EAST = 1 - SOUTH = 2 + SOUTH = 1 + EAST = 2 WEST = 3 NONE = 4 diff --git a/helper.py b/helper.py index be5a409..237d619 100644 --- a/helper.py +++ b/helper.py @@ -39,24 +39,24 @@ def project_collision(obj, state, direction: Direction, dist=0.4): obj_copy = deepcopy(obj) if direction == Direction.NORTH: - if obj_copy['direction'] == direction:#object moves + if obj_copy['direction'] == direction.value:#object moves obj_copy['position'][1] -= dist - if obj_copy['position'][1] < 2: + if obj_copy['position'][1] < 2.1: return True elif direction == Direction.EAST: - if obj_copy['direction'] == direction:#object moves + if obj_copy['direction'] == direction.value:#object moves obj_copy['position'][0] += dist if obj_copy['position'][0] > 18.5: return True elif direction == Direction.SOUTH: - if obj_copy['direction'] == direction:#object moves + if obj_copy['direction'] == direction.value:#object moves obj_copy['position'][1] += dist if obj_copy['position'][1] > 24: return True elif direction == Direction.WEST: - if obj_copy['direction'] == direction:#object moves + if obj_copy['direction'] == direction.value:#object moves obj_copy['position'][0] -= dist - if obj_copy['position'][0] < 2: + if obj_copy['position'][0] < 0.55: return True for key, value in state['observation'].items(): @@ -73,24 +73,24 @@ def project_collision_dyn(obj, state, direction: Direction, dist=0.4, buffer=0): obj_copy = deepcopy(obj) if direction == Direction.NORTH: - if obj_copy['direction'] == direction:#object moves + if obj_copy['direction'] == direction.value:#object moves obj_copy['position'][1] -= dist - if obj_copy['position'][1] < 2: + if obj_copy['position'][1] < 2.1: return True elif direction == Direction.EAST: - if obj_copy['direction'] == direction:#object moves + if obj_copy['direction'] == direction.value:#object moves obj_copy['position'][0] += dist if obj_copy['position'][0] > 18.5: return True elif direction == Direction.SOUTH: - if obj_copy['direction'] == direction:#object moves + if obj_copy['direction'] == direction.value:#object moves obj_copy['position'][1] += dist if obj_copy['position'][1] > 24: return True elif direction == Direction.WEST: - if obj_copy['direction'] == direction:#object moves + if obj_copy['direction'] == direction.value:#object moves obj_copy['position'][0] -= dist - if obj_copy['position'][0] < 2: + if obj_copy['position'][0] < 0.55: return True for key, value in state['observation'].items(): From 7f55ab899258d5a5fa28f5482c7670a3b6c4e98e Mon Sep 17 00:00:00 2001 From: Helen Date: Thu, 25 Apr 2024 02:37:49 -0400 Subject: [PATCH 14/22] edge cases --- final_proj/socket_agent_proj.py | 73 ++++++++++++++++++++++++++++++++- helper.py | 32 ++++++++++++++- 2 files changed, 102 insertions(+), 3 deletions(-) diff --git a/final_proj/socket_agent_proj.py b/final_proj/socket_agent_proj.py index 6cc8466..886ec22 100755 --- a/final_proj/socket_agent_proj.py +++ b/final_proj/socket_agent_proj.py @@ -238,7 +238,7 @@ def goto(self, goal:list|tuple|str, is_item=True): if is_item: # locally adjust to make sure we can interact with the target item - self.reactive_nav(goal=interact_box, is_box=True) + self.approach_interact(goal=interact_box) def nav(self, goal, is_item=True): @@ -255,6 +255,63 @@ def nav(self, goal, is_item=True): path = self.astar_planner.astar(start=tuple(player_location), goal=goal, map_width=MAP_WIDTH, map_height=MAP_HEIGHT, objs=objs, is_item=is_item) return path # this returns a path of x, y locations that the agent will go through + + + def approach_interact(self, goal): + """Purely reactie navigation + + Args: + goal (_type_): a location in an interact_box + """ + ############################################## + ## The old reactive navigation code is below## + ############################################## + target = "x" + reached_x = False + reached_y = False + while True: + player = self.env['observation']['players'][self.agent_id] + + x_dist = player['position'][0] - goal['westmost'] + y_dist = player['position'][1] - goal['northmost'] + if can_interact_in_box(player=player, interact_box=goal): + reached_x = True + reached_y = True + else: + x_dist = player['position'][0] - goal[0] + y_dist = player['position'][1] - goal[1] + + if abs(x_dist) < STEP: + reached_x = True + if abs(y_dist) < STEP: + reached_y = True + if reached_x and reached_y: + break + + if target == "x": + if x_dist < -STEP: + command = Direction.EAST + elif x_dist > STEP: + command = Direction.WEST + else: + reached_y = False + target = "y" + continue + else: + if y_dist < -STEP: + command = Direction.SOUTH + elif y_dist > STEP: + command = Direction.NORTH + else: + reached_x = False + target = "x" + continue + + while approach_to_interact(player, self.env, command, STEP): + command = Direction((command.value + 1) % 4) + self.execute(action=command.name) + + def reactive_nav(self, goal, is_box=False): """Purely reactie navigation @@ -267,6 +324,7 @@ def reactive_nav(self, goal, is_box=False): target = "x" reached_x = False reached_y = False + stuck = 0 # stuck for timestep while True: player = self.env['observation']['players'][self.agent_id] @@ -308,8 +366,19 @@ def reactive_nav(self, goal, is_box=False): while project_collision(player, self.env, command, STEP): command = Direction((command.value + 1) % 4) + stuck += 1 self.execute(action=command.name) + def go_around_obstacle(self, player, env): + """Try to go around the obstacle + + Args: + player (dict): player + env (dict): current env + """ + #TODO: try to go around the obstacle. Making an "L" shaped manuver + pass + def step(self, step_location:list|tuple, player_id:int, backtrack:list): """Keep locally adjusting and stepping in the right direction so that `player` ends up `close_enough` to `step_location`. `step_location` should be only one step away @@ -340,7 +409,7 @@ def step(self, step_location:list|tuple, player_id:int, backtrack:list): elif player_y < goal_y and abs(player_y - goal_y) >= LOCATION_TOLERANCE:#player should go SOUTH #self.execute(Direction.SOUTH.name) self.reactive_nav(goal=step_location, is_box=False) - elif player_y < goal_y and abs(player_y - goal_y) >= LOCATION_TOLERANCE:#player should go NORTH + elif player_y > goal_y and abs(player_y - goal_y) >= LOCATION_TOLERANCE:#player should go NORTH #self.execute(Direction.NORTH.name) self.reactive_nav(goal=step_location, is_box=False) diff --git a/helper.py b/helper.py index 237d619..81faca0 100644 --- a/helper.py +++ b/helper.py @@ -35,7 +35,8 @@ def can_interact_default(obj, player, range=0.5): return False -def project_collision(obj, state, direction: Direction, dist=0.4): + +def approach_to_interact(obj, state, direction: Direction, dist=0.4):#orientation matters obj_copy = deepcopy(obj) if direction == Direction.NORTH: @@ -68,6 +69,35 @@ def project_collision(obj, state, direction: Direction, dist=0.4): return True return False +def project_collision(obj, state, direction: Direction, dist=0.4): + obj_copy = deepcopy(obj) + + if direction == Direction.NORTH: + obj_copy['position'][1] -= dist + if obj_copy['position'][1] < 2.1: + return True + elif direction == Direction.EAST: + obj_copy['position'][0] += dist + if obj_copy['position'][0] > 18.5: + return True + elif direction == Direction.SOUTH: + obj_copy['position'][1] += dist + if obj_copy['position'][1] > 24: + return True + elif direction == Direction.WEST: + obj_copy['position'][0] -= dist + if obj_copy['position'][0] < 0.55: + return True + + for key, value in state['observation'].items(): + for item in value: + if (overlap(obj_copy['position'][0], obj_copy['position'][1], obj_copy['width'], obj_copy['height'], + item['position'][0], item['position'][1], item['width'], item['height'])): + if not (obj_copy == item or ( + 'index' in item.keys() and 'index' in obj_copy.keys() and item['index'] == obj_copy['index'])): + return True + return False + def project_collision_dyn(obj, state, direction: Direction, dist=0.4, buffer=0): obj_copy = deepcopy(obj) From 2349a318dc5c3d66844aa1af7988ddf342146e1a Mon Sep 17 00:00:00 2001 From: Helen Date: Thu, 25 Apr 2024 10:02:48 -0400 Subject: [PATCH 15/22] fixed edge cases in proj_collision --- final_proj/constants.py | 4 +- final_proj/socket_agent_proj.py | 108 ++++++++++++++++++++++---------- helper.py | 60 +++++++++++++++--- 3 files changed, 128 insertions(+), 44 deletions(-) diff --git a/final_proj/constants.py b/final_proj/constants.py index f63b623..56003fa 100644 --- a/final_proj/constants.py +++ b/final_proj/constants.py @@ -8,8 +8,6 @@ exit_pos = [-0.6, 3.0] default_start_pos = [1.5, 15.6] interact_distance = 0.25 -cart_pos_left = [1, 18.5] # The position of the cart in the environment from [1, 2] in x, and y = 18.5 -cart_pos_right = [2, 18.5] counter = [] loc = [1, 17.5] register_region_x = 1 + 2.25 @@ -40,6 +38,7 @@ ] } +example_cart = {'position': [1.2720096174545914, 18.013690800070798], 'direction': 3, 'capacity': 12, 'owner': 0, 'last_held': 0, 'contents': [], 'contents_quant': [], 'purchased_contents': [], 'purchased_quant': [], 'width': 0.75, 'height': 0.4} cartReturns = [2, 18.5] basketReturns = [3.5, 18.5] registerReturns_1 = [2, 4.5] @@ -47,6 +46,7 @@ offset = 1 +STEP = 0.15 # the size of the player's step MAP_WIDTH, MAP_HEIGHT = 20, 25 LOCATION_TOLERANCE = 0.15 BACKTRACK_TOLERANCE = 3 * LOCATION_TOLERANCE diff --git a/final_proj/socket_agent_proj.py b/final_proj/socket_agent_proj.py index 886ec22..7c5d267 100755 --- a/final_proj/socket_agent_proj.py +++ b/final_proj/socket_agent_proj.py @@ -1,6 +1,7 @@ import json import socket +import random from copy import deepcopy import pandas as pd @@ -12,9 +13,6 @@ from util import * from final_proj.astar_path_planner import * - -STEP = 0.15 # the size of the player's step - # todo: update with Helen's method for making interaction areas? def populate_locs(observation): # add interaction areas to objects in the observation @@ -198,6 +196,12 @@ def interact_box_to_goal_location(self, box:dict) -> tuple[float, float]: def goto(self, goal:list|tuple|str, is_item=True): + """go to the goal, either a (x, y) of a string such as 'basket', 'register' + + Args: + goal (list | tuple | str): _description_ + is_item (bool, optional): _description_. Defaults to True. + """ if goal is None: goal = self.goal @@ -226,7 +230,7 @@ def goto(self, goal:list|tuple|str, is_item=True): if self.holding_container and self.container_type == 'cart': print(f"Agent {self.agent_id} going to location {goal} with cart") - + path = [] pass # TODO: goto with cart. TA says it might be as simple as changing the player's shape. If it's too complicated we will skip it else: print(f"Agent {self.agent_id} planning a path to {goal} without cart") @@ -238,7 +242,7 @@ def goto(self, goal:list|tuple|str, is_item=True): if is_item: # locally adjust to make sure we can interact with the target item - self.approach_interact(goal=interact_box) + self.locally_approach_interact(goal_box=interact_box) def nav(self, goal, is_item=True): @@ -253,15 +257,15 @@ def nav(self, goal, is_item=True): player = self.env['observation']['players'][self.agent_id] player_location = player['position'] path = self.astar_planner.astar(start=tuple(player_location), goal=goal, map_width=MAP_WIDTH, map_height=MAP_HEIGHT, objs=objs, is_item=is_item) - return path # this returns a path of x, y locations that the agent will go through + return path # this returns a path of x, y locations that the agent will go through without considering other players - def approach_interact(self, goal): - """Purely reactie navigation + def locally_approach_interact(self, goal_box): + """Reactie navigation to approach the interaction object when we are already very close to it (after basic navigation). Shouldn't be used when we are still potentially far. Args: - goal (_type_): a location in an interact_box + goal (dict): an interact_box """ ############################################## ## The old reactive navigation code is below## @@ -269,17 +273,15 @@ def approach_interact(self, goal): target = "x" reached_x = False reached_y = False + stuck = 0 while True: player = self.env['observation']['players'][self.agent_id] - - x_dist = player['position'][0] - goal['westmost'] - y_dist = player['position'][1] - goal['northmost'] - if can_interact_in_box(player=player, interact_box=goal): + goal_box_point = self.interact_box_to_goal_location(box=goal_box) + x_dist = player['position'][0] - goal_box_point[0] + y_dist = player['position'][1] - goal_box_point[1] + if can_interact_in_box(player=player, interact_box=goal_box): reached_x = True reached_y = True - else: - x_dist = player['position'][0] - goal[0] - y_dist = player['position'][1] - goal[1] if abs(x_dist) < STEP: reached_x = True @@ -306,9 +308,14 @@ def approach_interact(self, goal): reached_x = False target = "x" continue - - while approach_to_interact(player, self.env, command, STEP): - command = Direction((command.value + 1) % 4) + + original_command = command + while project_collision_with_orientation(player, self.env, command):# approach interact takes orientation into consideration. + command = Direction(self.turn_ninety_degrees(dir=command)) # take the 90 degrees action instead + stuck += 1 + if stuck >= 10:#been stuck for too long, F it, take the 270 degree action + self.execute(action=self.turn_ninety_degrees(self.turn_opposite_dir(original_command))) + stuck = 0 #hopefully no longer stuck self.execute(action=command.name) @@ -363,21 +370,58 @@ def reactive_nav(self, goal, is_box=False): reached_x = False target = "x" continue - - while project_collision(player, self.env, command, STEP): - command = Direction((command.value + 1) % 4) + original_command = command + while project_collision(player, self.env, command): + command = Direction(self.turn_ninety_degrees(dir=command)) # take the 90 degrees action instead stuck += 1 - self.execute(action=command.name) + if stuck >= 10:#been stuck for too long, it's probably a corner, F it, take the 270 degree action + self.execute(action=self.turn_ninety_degrees(self.turn_opposite_dir(original_command))) + stuck = 0 #hopefully no longer stuck + if player['direction'] == command.name: + self.execute(action=command.name)# execute once if already facing that direction + else: + self.execute(action=command.name) + self.execute(action=command.name) + + def turn_opposite_dir(self, dir:Direction) -> Direction: + """Turn 180 degrees with respect to the given - def go_around_obstacle(self, player, env): - """Try to go around the obstacle + Args: + command (Direction): the direction command whose ninety degree direction we want to find + Returns: + returns the 90 degrees direction + """ + if dir == Direction.NORTH: + return Direction.SOUTH + if dir == Direction.SOUTH: + return Direction.NORTH + if dir == Direction.EAST: + return Direction.WEST + else: + return Direction.EAST + + def turn_ninety_degrees(self, dir:Direction) -> Direction: + """Turn 90 degrees clockwise with respect to the given Args: - player (dict): player - env (dict): current env + command (Direction): the direction command whose ninety degree direction we want to find + Returns: + returns the 90 degrees direction """ - #TODO: try to go around the obstacle. Making an "L" shaped manuver - pass + turned_dir = Direction((dir.value + 2) % 5) + if turned_dir == Direction.NONE: + return Direction.SOUTH + return turned_dir + + # def go_around_obstacle(self, player, env): + # """Try to go around the obstacle + + # Args: + # player (dict): player + # env (dict): current env + # """ + # #TODO: try to go around the obstacle. Making an "L" shaped manuver + # pass def step(self, step_location:list|tuple, player_id:int, backtrack:list): """Keep locally adjusting and stepping in the right direction so that `player` ends up `close_enough` to `step_location`. `step_location` should be only one step away @@ -433,12 +477,10 @@ def add_to_container(self): # TODO use other functions to complete checkout def exit(self): print(f"Agent {self.agent_id} exiting") - self.goto([2, 12.5], is_item=False) + self.goto(goal='register 0', is_item=True) - # pick_up_and_put_in(shelf_direction = "NORTH") - # self.add_to_cart() - self.goto([-0.8, 15.6]) + self.goto([-0.6, 3.0], is_item=False)#upper exit self.done = True diff --git a/helper.py b/helper.py index 81faca0..c937756 100644 --- a/helper.py +++ b/helper.py @@ -1,7 +1,7 @@ import decimal import math from copy import deepcopy - +from final_proj.constants import * from enums.direction import Direction @@ -36,7 +36,19 @@ def can_interact_default(obj, player, range=0.5): -def approach_to_interact(obj, state, direction: Direction, dist=0.4):#orientation matters +def project_collision_with_orientation(obj, state, direction: Direction, dist=0.4, buffer=0.0):#orientation matters + """Project collision while taking the obj's orientation into account. This should only be used when the player is very close to the target item they want to interact with. Otherwise, the player might get stuck turning back and forth in a corner formed by static obstacles + + Args: + obj (dict): most likely the player + state (dict): game state + direction (Direction): directional command + dist (float, optional): distance the obj is about to travel. Defaults to 0.4. + buffer (float, optional): buffer between objects in the env. Defaults to 0.0. + + Returns: + _type_: _description_ + """ obj_copy = deepcopy(obj) if direction == Direction.NORTH: @@ -62,14 +74,35 @@ def approach_to_interact(obj, state, direction: Direction, dist=0.4):#orientatio for key, value in state['observation'].items(): for item in value: - if (overlap(obj_copy['position'][0], obj_copy['position'][1], obj_copy['width'], obj_copy['height'], - item['position'][0], item['position'][1], item['width'], item['height'])): - if not (obj_copy == item or ( + if key == 'players':#for players, pretend that they are wider and taller than they actually are to stay away + if (obj_copy == item or ( + 'index' in item.keys() and 'index' in obj_copy.keys() and item['index'] == obj_copy['index'])): + continue + if (overlap(obj_copy['position'][0], obj_copy['position'][1], obj_copy['width'], obj_copy['height'], + item['position'][0], item['position'][1], item['width'] + buffer + 0.75, item['height'] + buffer + 0.75)): + return True + else: + if (obj_copy == item or ( 'index' in item.keys() and 'index' in obj_copy.keys() and item['index'] == obj_copy['index'])): + continue + if (overlap(obj_copy['position'][0], obj_copy['position'][1], obj_copy['width'], obj_copy['height'], + item['position'][0], item['position'][1], item['width'] + buffer, item['height'] + buffer)): return True return False -def project_collision(obj, state, direction: Direction, dist=0.4): +def project_collision(obj, state, direction: Direction, dist=0.4, buffer=0.0): + """Project collision. This should only be used when the player is likely far from the target item they want to interact with. Otherwise, the player might get stuck turning back and forth in a corner formed by static obstacles + + Args: + obj (dict): most likely the player + state (dict): game state + direction (Direction): directional command + dist (float, optional): distance the obj is about to travel. Defaults to 0.4. + buffer (float, optional): buffer between objects in the env. Defaults to 0.0. + + Returns: + _type_: _description_ + """ obj_copy = deepcopy(obj) if direction == Direction.NORTH: @@ -91,10 +124,19 @@ def project_collision(obj, state, direction: Direction, dist=0.4): for key, value in state['observation'].items(): for item in value: - if (overlap(obj_copy['position'][0], obj_copy['position'][1], obj_copy['width'], obj_copy['height'], - item['position'][0], item['position'][1], item['width'], item['height'])): - if not (obj_copy == item or ( + if key == 'players':#for players, pretend that they are wider and taller than they actually are to stay away + if (obj_copy == item or ( + 'index' in item.keys() and 'index' in obj_copy.keys() and item['index'] == obj_copy['index'])): + continue + if (overlap(obj_copy['position'][0], obj_copy['position'][1], obj_copy['width'], obj_copy['height'], + item['position'][0], item['position'][1], item['width'] + buffer + 0.75, item['height'] + buffer + 0.75)): + return True + else: + if (obj_copy == item or ( 'index' in item.keys() and 'index' in obj_copy.keys() and item['index'] == obj_copy['index'])): + continue + if (overlap(obj_copy['position'][0], obj_copy['position'][1], obj_copy['width'], obj_copy['height'], + item['position'][0], item['position'][1], item['width'] + buffer, item['height'] + buffer)): return True return False From 5a72d3f9d269530ec7a98e4377a985cf7b8360b2 Mon Sep 17 00:00:00 2001 From: Helen Date: Thu, 25 Apr 2024 10:42:00 -0400 Subject: [PATCH 16/22] make sure to update self.env at transition --- final_proj/socket_agent_proj.py | 1 + 1 file changed, 1 insertion(+) diff --git a/final_proj/socket_agent_proj.py b/final_proj/socket_agent_proj.py index 7c5d267..be2afff 100755 --- a/final_proj/socket_agent_proj.py +++ b/final_proj/socket_agent_proj.py @@ -81,6 +81,7 @@ def __init__(self, conn, agent_id, env): self.astar_planner = Astar_agent(socket_game=conn, env=env) def transition(self): + self.execute(action='NOP') # this updates self.env if self.done: # If we've left the store self.execute("NOP") # Do nothing From afd9538257a2569e6f7a1c3a48bd0fe6a3127d62 Mon Sep 17 00:00:00 2001 From: Helen Date: Thu, 25 Apr 2024 11:38:37 -0400 Subject: [PATCH 17/22] make sure to update self.env at transition --- final_proj/socket_agent_proj.py | 16 ++++++------- final_proj/util.py | 10 ++++---- helper.py | 41 ++++++++++++++++++--------------- 3 files changed, 36 insertions(+), 31 deletions(-) diff --git a/final_proj/socket_agent_proj.py b/final_proj/socket_agent_proj.py index be2afff..49fc49e 100755 --- a/final_proj/socket_agent_proj.py +++ b/final_proj/socket_agent_proj.py @@ -182,13 +182,13 @@ def interact_box_to_goal_location(self, box:dict) -> tuple[float, float]: tuple[float, float]: the goal location """ player_needs_to_face = box['player_needs_to_face'] - if player_needs_to_face == Direction.SOUTH.name: + if player_needs_to_face == Direction.SOUTH: top_left = (box['westmost'],box['northmost']) return top_left - elif player_needs_to_face == Direction.NORTH.name: + elif player_needs_to_face == Direction.NORTH: bot_left = (box['westmost'],box['southmost']) return bot_left - elif player_needs_to_face == Direction.WEST.name: + elif player_needs_to_face == Direction.WEST: bot_right = (box['eastmost'],box['southmost']) return bot_right else: @@ -311,11 +311,11 @@ def locally_approach_interact(self, goal_box): continue original_command = command - while project_collision_with_orientation(player, self.env, command):# approach interact takes orientation into consideration. + while project_collision_with_orientation(player, self.env, command, dist=STEP):# approach interact takes orientation into consideration. command = Direction(self.turn_ninety_degrees(dir=command)) # take the 90 degrees action instead stuck += 1 if stuck >= 10:#been stuck for too long, F it, take the 270 degree action - self.execute(action=self.turn_ninety_degrees(self.turn_opposite_dir(original_command))) + command = self.turn_ninety_degrees(self.turn_opposite_dir(original_command)) stuck = 0 #hopefully no longer stuck self.execute(action=command.name) @@ -372,13 +372,13 @@ def reactive_nav(self, goal, is_box=False): target = "x" continue original_command = command - while project_collision(player, self.env, command): + while project_collision(player, self.env, command, dist=STEP): command = Direction(self.turn_ninety_degrees(dir=command)) # take the 90 degrees action instead stuck += 1 if stuck >= 10:#been stuck for too long, it's probably a corner, F it, take the 270 degree action - self.execute(action=self.turn_ninety_degrees(self.turn_opposite_dir(original_command))) + command = self.turn_ninety_degrees(self.turn_opposite_dir(original_command)) stuck = 0 #hopefully no longer stuck - if player['direction'] == command.name: + if player['direction'] == command.value: self.execute(action=command.name)# execute once if already facing that direction else: self.execute(action=command.name) diff --git a/final_proj/util.py b/final_proj/util.py index d66996d..fb91324 100644 --- a/final_proj/util.py +++ b/final_proj/util.py @@ -93,7 +93,7 @@ def one_side_interact_area(place_obj) -> list: interact_box = copy.deepcopy(place_bounding_box) interact_box['southmost'] = interact_box['northmost'] interact_box['northmost'] -= interact_distance - interact_box['player_needs_to_face'] = 'SOUTH' + interact_box['player_needs_to_face'] = Direction.SOUTH return {'NORTH_BOX':interact_box} def two_side_interact_area(place_obj) -> list: @@ -104,7 +104,7 @@ def two_side_interact_area(place_obj) -> list: south_interact_box = copy.deepcopy(place_bounding_box) south_interact_box['northmost'] = place_bounding_box['southmost'] south_interact_box['southmost'] += interact_distance - south_interact_box['player_needs_to_face'] = 'NORTH' + south_interact_box['player_needs_to_face'] = Direction.NORTH interact_boxes['SOUTH_BOX'] = south_interact_box return interact_boxes @@ -115,11 +115,11 @@ def four_side_interact_area(place_obj:dict) -> dict: west_interact_box = copy.deepcopy(place_bounding_box) west_interact_box['eastmost'] = place_bounding_box['westmost'] west_interact_box['westmost'] -= interact_distance - west_interact_box['player_needs_to_face'] = 'EAST' + west_interact_box['player_needs_to_face'] = Direction.EAST east_interact_box = copy.deepcopy(place_bounding_box) east_interact_box['westmost'] = place_bounding_box['eastmost'] east_interact_box['eastmost'] += interact_distance - east_interact_box['player_needs_to_face'] = 'WEST' + east_interact_box['player_needs_to_face'] = Direction.WEST interact_boxes['WEST_BOX'] = west_interact_box interact_boxes['EAST_BOX'] = east_interact_box return interact_boxes @@ -144,7 +144,7 @@ def can_interact_in_box(player, interact_box) -> bool: bool: Whether the player can interact in box """ player['bounding_box'] = bounding_box(place=player) - if player_overlap_with_interact_box(player=player, interact_box=interact_box) and player_directions[player['direction']] == interact_box['player_needs_to_face']: + if player_overlap_with_interact_box(player=player, interact_box=interact_box) and player['direction'] == interact_box['player_needs_to_face'].value: return True return False diff --git a/helper.py b/helper.py index c937756..e83c6d7 100644 --- a/helper.py +++ b/helper.py @@ -75,19 +75,21 @@ def project_collision_with_orientation(obj, state, direction: Direction, dist=0. for key, value in state['observation'].items(): for item in value: if key == 'players':#for players, pretend that they are wider and taller than they actually are to stay away - if (obj_copy == item or ( - 'index' in item.keys() and 'index' in obj_copy.keys() and item['index'] == obj_copy['index'])): - continue if (overlap(obj_copy['position'][0], obj_copy['position'][1], obj_copy['width'], obj_copy['height'], - item['position'][0], item['position'][1], item['width'] + buffer + 0.75, item['height'] + buffer + 0.75)): - return True - else: - if (obj_copy == item or ( + item['position'][0], item['position'][1], item['width'] + buffer + 2* STEP, item['height'] + buffer + 2* STEP)): + if not (obj_copy == item or ( 'index' in item.keys() and 'index' in obj_copy.keys() and item['index'] == obj_copy['index'])): - continue + + print("projected collision with: ", {key}) + return True + else: if (overlap(obj_copy['position'][0], obj_copy['position'][1], obj_copy['width'], obj_copy['height'], item['position'][0], item['position'][1], item['width'] + buffer, item['height'] + buffer)): - return True + if not (obj_copy == item or ( + 'index' in item.keys() and 'index' in obj_copy.keys() and item['index'] == obj_copy['index'])): + + print("projected collision with: ", {key}) + return True return False def project_collision(obj, state, direction: Direction, dist=0.4, buffer=0.0): @@ -125,19 +127,22 @@ def project_collision(obj, state, direction: Direction, dist=0.4, buffer=0.0): for key, value in state['observation'].items(): for item in value: if key == 'players':#for players, pretend that they are wider and taller than they actually are to stay away - if (obj_copy == item or ( - 'index' in item.keys() and 'index' in obj_copy.keys() and item['index'] == obj_copy['index'])): - continue if (overlap(obj_copy['position'][0], obj_copy['position'][1], obj_copy['width'], obj_copy['height'], - item['position'][0], item['position'][1], item['width'] + buffer + 0.75, item['height'] + buffer + 0.75)): - return True - else: - if (obj_copy == item or ( + item['position'][0], item['position'][1], item['width'] + buffer + 2* STEP, item['height'] + buffer + 2* STEP)): + if not (obj_copy == item or ( 'index' in item.keys() and 'index' in obj_copy.keys() and item['index'] == obj_copy['index'])): - continue + + print("projected collision with: ", {key}) + return True + else: + if (overlap(obj_copy['position'][0], obj_copy['position'][1], obj_copy['width'], obj_copy['height'], item['position'][0], item['position'][1], item['width'] + buffer, item['height'] + buffer)): - return True + if not (obj_copy == item or ( + 'index' in item.keys() and 'index' in obj_copy.keys() and item['index'] == obj_copy['index'])): + + print("projected collision with: ", {key}) + return True return False From d4eaebacbe39beb692ca1ce0c5d9813e810a7d58 Mon Sep 17 00:00:00 2001 From: Helen Date: Fri, 26 Apr 2024 18:46:41 -0400 Subject: [PATCH 18/22] changed low level astar to high level planning --- ...t 2024-04-25 at 6.43.24\342\200\257PM.png" | Bin 0 -> 335299 bytes final_proj/astar_dynamic.py | 2 +- final_proj/box_regions.py | 198 +++++++++ ...th_planner.py => fast_high_level_astar.py} | 390 ++++++------------ final_proj/map_box_regions.pdf | Bin 0 -> 296520 bytes final_proj/socket_agent_proj.py | 86 ++-- final_proj/util.py | 47 ++- helper.py | 2 +- 8 files changed, 397 insertions(+), 328 deletions(-) create mode 100644 "final_proj/Screenshot 2024-04-25 at 6.43.24\342\200\257PM.png" create mode 100644 final_proj/box_regions.py rename final_proj/{astar_path_planner.py => fast_high_level_astar.py} (67%) create mode 100644 final_proj/map_box_regions.pdf diff --git "a/final_proj/Screenshot 2024-04-25 at 6.43.24\342\200\257PM.png" "b/final_proj/Screenshot 2024-04-25 at 6.43.24\342\200\257PM.png" new file mode 100644 index 0000000000000000000000000000000000000000..a9c839ed6f1ed30e4706d28127dd0b231f6e6ab5 GIT binary patch literal 335299 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

kzMG5`g-4ef-^g=gBe{2-R)*l7P zGH01mzwr)RdY9d%=bt72f%TT5DG<=W$R)+g4afgc^6|os-CwL+x{K-K?OcY~^6cm}-hMQi-FbkVk(#`Dk=QmU8J+3@?XzA(b3((~`&a?;>`gp0@8z!a+$ z3f=f;nny-@ht0jFS{ReNXXo`@62@Q5pOGDqmRn3t`O15f$V0#utb&5*uVj{aZ^@Nq zTM(=kAtM-(74;;GPCsHRcoy^zz>hLa*^lPXJ>kU*z3e}$BSGN{y`YTz66O5^l5t9L zc4LHOgZ8MSmevh#_W+~yy%H#!R|tmYcp6w*JlCoYLbRu~k2~`a&n$>*-zscHR04Mt+%3EVJ}mIuIt(EX;S|)S?A;6lWRF~2 zKUs#=cF3w+cE9)qoT`@+vUVF?DV&szhBeCCmnmm7yLQ*4Sh_0rFq{Z5b5q8~56Z3bD#34)~NlS%kbXn%oQ9+M{gxC-waXKJxOzFfq$2?$J9ZYmgK9 zm>VzTk9xL-Ul?`aO;Pz$5J92z&*gOotTOF<*qI=qK5P4{r}GyN8$GHD6M`_b(9!;j z-brl5si0TNiOe=f_{l5SO>LouG4)oMex=F8V?FgDw4c~=sSeX72=QYYwqH|cAx>N( zD3mg6S!0Zc3|3Aj9nWWxe1L?dGI#Woz~)E{yTg8rR}yZq*$)f<#ReV=Jo+Iv2M@sNMF%hJK{d!HCD(_<+{xarh2# zl&R`^6a#$$ORH41fYPsRx>DJ z@7l>H33ly&1WRrMNV2EoK`IG1{}MhVdA}9!%Xks?3OobmKC}dvN`&@?s|1(l;iiret-i(xmGm`XZK$en1g$tCf&*%Kc0GB#zPZ10=Bj zP#-p2TR?OGn@py{kQrJj6^E~N`g7u6sEt!&vBNXAc!yci)B}H}Ka!!r4taHz5`C@# z(cK<%^B!HN^2K8zQVj_-?1Q;XLs)Nf@m4E5_5Dc)IQrXiVT91{Gy*TN-o5WjKca^g zCuO~{NiBMJS`awQLOX-7(nzrQKh(qFwVu%i{mqRFKN{R%Kq@<;ixn9AU?)= z>d1L%E5{1HjU_r-*Yqm9LD4WKK~))4Dvr;yXX%e`-|G#&1~a}D-Et%(;CehyKb9(z z?s+B_r!Rg6G|;;mJk1xF0O^l^AvJs&nT+0D2MbNVTpCknaVy(PnNYUBF4>qHXNmc4 z0!;Kq7GxUkqJrH|Ob`*q#iJo=b~-|#g#h0QlHN@ZZN7aZ_V~a}?G6y;_r%rvSUTZG z7Y>P&8|{xnMVL;&sdGcVbl-0Rmf@R19)T`Jzv0%^hfs#aG3O5!M&3;!HD|hD^J3k% zJq;f;V!eUipY$?I&RDTR-tfv45Vod(ZIlX>pH=k<37&73XeIGNt%P7NH|fiyA0I26 zBY5XK54q-m8-&%0;LbGw*5!`@7r3oCBb1G-C`My=>=nxFiiz2VT*FxHIDOnHDl~G3 zB_`WL$sr5_I=w5Quezqp0-ItF$BK{y44ocCeTWrnvfy_%4i^hC%j=Daq<3wXIKh6| z>ib5$8sUMX*v`1FJi zChTLM{2J%E`iS3!%+jqE#bxKth2Rah+9kxdp4XIK4+%wzL|1;Ow^7N>J;NUX916R9o5Wnxi6h9X zZLd_$K(b_fuSg^J(JlX@CfitDu9eHm$OgFp-&lbi=-<w!xGo7c-vp5`0Od)&vB z2ITL;pmbsG50$C``#Rvaba;z1BD#0`0GD->cYE}`;iH)sU3O@DuYGj}adxInO&?y0 z1!d6mw>9$d5hZG{y`KH<5?o=lCrx)G?ci?zCRe$xpl-u>{Kib!!m@eo`L6d(OfzKY z{Eu7cIi$5U`7(SJp#X2VnEoBfMz&#`?@-HIR4!&AAOCRRSgWEq+@GmK?U`?m0LK%y zCqztr2)m8h+AYG}1U9Uu~W7C6qJGbRyQ3+QiVOJM9y@l)O@H9bL&C=n?t>(u~?q5rA zX^X+e=hn=EWrW^m$!2YhuB8UD@jt5}Mk` zW7gKZI!9wAX5`1kI7I%Yk#SyJjxp3~805aXmTQhr!QjR8MJv;!1E8n9lu-sO_ny|2 zwQM`ir@VCPlJV;07@*UV-gXX~+89tlbTSq~=du!lE3AdTUq~&0GZ<_KESgFR?}2J(jrQ- z@4^?4{~fgMM>mW6=esmL5*_JA!gEirxSa4fqQK6v9GG2w`GtBpaiV>+TgLF%$CP9w zuubQ8$TDKnrfr)#<`7tTTDg}H=f&+P(=|6N+SC@@-kDY9Wsz1gieJnd`5~=ra+W)i zc9}SM*sxKCK|<+Vn$#p@Uq2AwI%yEy&K+-}DCqIj)F9LN*y6iKIi=*+H`5V%l+I8c ztS|!6)}YB{Aum>WHx<=jqrJA5u*7mgX0qE)u5}pHA(?LgYJBBvJ-MtTwQ|vM3Qg0% z4b47dWtGsAy+1reQ$u-o6eeT6!OTU^=+4%5;iOP>Btk~KfjJ>mrc}!tBDLKD7 zx!0@q++ypZl{1BMv*$~030UqQj|O^20gsc%Lb(=~^trkMxAu*0BF>}$bdr~DIj;tI zH&z+X`Yo2Uhf=LM^2}yw<9}mG@hK+$&g`$FG%6>7pmbV+iSkqB?HP@$Ry~-J!^879 zef6iV2$O-nVcu^yNxJdy=kxnOsy1w?_nLAMdW3+woKbFIWSt2QyKKV!N_uC{#mvx$ zR?Z{97AcoFvBn+IAH1+muqSfBHbYYHMHxunU{$6+F&^vCl8)I>;4(Oh&`*`iEr|O3 z^qz#0A_&9_SksGo-j*_|Ez9Wu3GEGI%6aS+D~FHGbY%tx0)VLOKpEFh&*b^|v&wU% zz*(@aqD`6 z$CU#g0T9<5q-5_I`!}SBYcd||x=+;Kavk14RO{551HiX=Y5=%;*+frV(G{`M{K7CZ z>N~-oGghukYtv=RLL+0n!$OuJX+kf;vVrS$zP95);+e3%ARZvl1y)Td^!%0Mq)--O zX);Beav6?$*y;?lHeKP`EpNG>#|XLTVMfT3F%i|Wp)juTC^~P+A%D^Myv6t6XqM0j zHIwNXhavurBvN6F1O@)=ryFFBzx{0$Y=F%cma-dZHGZ8{FWOHQM3-z&^RzSN!gO?B z+iT`Sl1qdXYJXX9+F8(^T%rVP$MJMR!&fm z<0pZRxmoJ?aD`WlSwd!_hKvTWFqN-r{H|g zi)Q(`?3ucuvInlKrohTJ=Dv`t$hDm`{w9Ojc_7(li;lrk-2XuuU0t?I$DOCgZGEka z_A$$vb4`Bt>9j#7p`hXQQ7?Jx+l}I}m~Mt_yqOHMFui&3c<3ER^z4h6oufND!B|w0 zrTe>v7rj@ozNN$TCTjjYB+so>NvMjl@3Y&(NuM9=b1VXXIP*eBk=Vz4`^RT{8=~7c zz#=$2@334#_+>KRHrQ_KNAzzwnnJewfyQ91kpXP$Lf|d}SVqwqe^)x$**|&ca2KA_ zdwIp~G&tZ3?02^29p|?yC#)&RGpPws1$F5(T~K?#_7bWIjL>)9ru+25SUkS#EHib6 zi+w)n5nzW0twQB6X0j5RYp2RETKZ>K)Oid-7PSj4;|k0o3_peF4JEU?ngU1FtyX-^ zZ=ac%?kec!3ZOp>subglwvETxy%DVg3-2_6jP={#(PGANhS1$KV==y5ds#Vo?_Hz} zp=IJx(C=hCKmi>ZQhX$?-|=m)hnI)EMaG#M+^*5+tFQ?l91j3}nOTD^#oJf6U{7Sz z=}DQ0ib{IXtdwcR>!{cM_+UQI#bYcRN$REn>#q^=!SV5}iy6EF z(7<(tk>~3p4nIc1I~vzGxLa+5U)rvjc)r{UqN9h3to9xEzV{3$g}}(73@6)pX1aK& zjs>p^k#<1P9_ ziaU7pqqDmACxDIa7Jid24g#w4i1@PsyI~2AL;!Lu)^lqGj^g7g29N0^VWrZ>tVolzB~TIfs-7s zaXhQtnnB^05s_EG83Z_yB-D!kuIK5#bW*0hjwI>%jvv5|s9+7ap>a#NfsX*ex(cvf zJ^-8YZ(wB}qrL}$;{8{DbNifl%Sf8Y@Hf1JuCGLPKNX$&9(o26X;`3= zmX42|jD%q~;7XE-6n_ER34f~8&HrY4b*aMChSe<6oq5p=$bs-s{QA9asriUT%&$@a z#O?5EW6B}b<=H*-iw2TiF=FW`LZZG(<2sApr}?Qf(yToDLa$CN)3#ybu)~kS!-3le ziPdh=)u|E{zbc~NgtG_XOGkAZ61{g?@V-CjdhzlxKR>DplIlII1g98(yCsvurIxa) z^EpnT%O{90i~T`@mB;-hav$K zeHE`J?8_yf5xpHdxXn@^#gVSPm&$G0t@jG)9g!~YDgZ%L1Oe`q)Kbk|diRwl>XR=8 zJ#WIGU+5z-rrt{Uh=5zvCtuL4ZR%g zl8_==w^y+$FW3k8)QojA5sC4DdBKMpS>5GyWU&0u^-)7=Ttk$!2rggM-HL?6B* zr|H5J%x)4Kq5_rTpm~5rK4cysGXq9SLY$*e-gu!rlWGfB(p1=;kwoXX!o(0PnOLAj z!ly#QulGb&dXmAQa)~Ocse_(LHo5iP;X051<8qZXO$OiiT+UMCdfSVU}D?Qg_MH<Ne5z<1p>lO*sFBsr4kq_K; zgzCF*wCKubRCrZs9e&#t)U$_#Pt`lgEG8!P@z7zQJ)_`#kQXMu;THP=zosMb4zk z$I+r$h`xsz+4l7jrx=~Rd-F@{p_V^iQLD%(XivBUPH*0kJ3i^)ExV}l-3(PXN9W3e znwEzGJuw5Y*^z4wCl0zyHO?Kzga^E}9%#wiWk0^&Ouc1`Grop2*beYT-NPKj_m(I3F<-&(Wh+LLmbzOuPEV9j5lfsxQ#q}UpTE%dz7$l2 zcba`dDsh99-@UA@BHrpedC3F69s%T_ z?5BAPRX4cJUV49!oJVaS6!yGQZw zhu|dN;2Lr2afQt(HpOzG1OR$tg78t2vo`;VvPhr!_7u^%7+wX}gS^dk|=6 z<5Id#J?0yL473h)r5*=12e9u#rl2v}0Qw2{g|rt6LxPC2(xWHMW*=zqEfWaktx(8p zZx{TZU*1$mjUw5vHs4Y^mb+%xAQ^Mm$o^dgP2^Jf{2`JP+h{?u{SY_z$Gj9Q>xQ5D z%WI#gvRx`3@uGE3cP_>k#@P+M<3z|oH*R$flyRqJFF!@#d>!dLq!zfp2ZV}0H6aBJ z-bZhd&;6V$yJi>y)0W>nh(~$CZ}tB3BX8SWx-wkdzVmQRTT=1qv2QoqHYdKym#+L+ zjQ&k3zcerHPre?RT=4)^H&qBD_>u)-k169qOQK}%t*{Smlxjk*AV#s1WQ6!s-pq_% zv+V|(^LRpT)b6wqpg_RS4v@-Fv&+rEwoX|K54?!}bo#xRJfPHE)!r@?GLa5TUr#@y z+y$&GyXewQu6xgcCd3Hcre#1XxPZ!-B8bfr+7))(4N5t4ds3_aiy%P(dsm@o7U9&D zCVs~}6Hq6!qW=B#R*^!}M80ds{rZ(X*6J)_EwO;tYZd;l={OZpGQfqv^#d$`8H9rC ztDZlgUdX)wHBakZz$;jK8a@#Q8i$-C9hvLx=YCZ|?(KDft;OUY!!|h>o?~qWJocsT zsz^4vNkk0Z85<42=@TsjOz2knn`cmlm)1OcpqyjGsmQ}*6vgp6MD?ghG2dV@GK%3a z-wscX011cm{5(%xd@HNk@L$g%nIxESO$CJls#cX2@b*)4k2APkLrIX>B2ketHk*h7 zsR>W>ah&*0ttfxT-^%!(Utl9tiNXFYHJUG$@5Ddb(%2}yq5kd1@<9S{wW(in(CScR z-1xHEMZZD%(u_k_?)25&f&f?jP=?g#nn}soIgP|ES3hsY|4`tquzOdYTlWQyoUL(j zE}w-1{D{@d!>bS*T%!Ff8kCbSBifSv-ZwW5LT5V82={ors9`j^k}PNV<5 z=wF{BYiaSJdbG(g*s&{ZUPi1!J_v;ar6xBd&rbV3$PmpL{+K!w*O z{67S$-;a@T7%05#5YG1!oN5I4Jv3y1e-Te8gm!Gq6r&?Re@2vJG!cKj?el`O+}-vC zch>)S@w~k^;hRZsno5Kvc;+h35&D|NOmCR|&e#cf`d2`H!USdl@4ZUjr<@1C zpcxg81ZCu%0A5Sq<8F-)$hZ(KAN!);&slR{DiP0}Gv8X_0tipp>}qxiDGT?jfighiO)pXf4sB&rlwHF(gtUq z=2PQLujq^9_^=wH)Yp**tIUfs|F8_;!u-OlPR0uTw(m@YVffVM+W+9`A1us4ZgAT} z&woSuCN??dIqR+7vaH)q5NpkM3qM?Ja?%pM9J^Q(bu5a=cV@j6!2f*NGvfWk>(Y5G z9@)`$(B|xq;)9YwhGDR54S|viv8&d!tFhEtaMkGSoh+j-d6bPXIt%{8Q^4oiGu*Qj z!MLaO5dBe*7}XC4NllIVzlZbxP%3aX6C(FI+Fo}iVRs48XlQh$bIS?(Ohk5tc9vsk z%zKa2I_2mJ$5|9FoU^E#M;Gr}4-%Kx4wyWo@^jjKFa}tbs`dB9l%?^FjOFPQpgR4d z9eE~tj~nAF_Nlfk-fw4epESQe_=w|2_+MR-ryQ48IfN7Dwy|g5q}6tl8GlPFmd)-( zbuF~g!6H&GtZ_s#JaU#oT$xY?$0YF}Ci3(je|-8sWe5J|RC;-Dj`~qmJO-+dhtJyn zghHD+%G{)1=B*5O6ZHCIny3mi&Sdb+t;F%iT;EY)oc&6|B9JZgsIStAuiPaCGP#`X zJZAUo&VI8}Z+8CA9Z1I+gCa15)k8xo@0=TznA7I!h{qz5mnjkA8y{t`7O5k6RVZwhyS!=MAVT*6DdECw**i*?y#g}(0adTEWb9_L!7Ip{~(EI ziCt(9XA?*Z(AREPVWB}~XVZ8xgUOCD&cUZXpp}{B(~^|$0G>uAo@)2Uf_|c6CsDCM z;Z?Zn))RIcs@98*L#lz-{=?UQotgh*gXp7SiWC$WqYY^pkXDMMa^q}Mq5ANAWh7n4 z^LEc<(i5J2G3Shj#*qEo4xP|chc64c>D$j$bq>~196!$T6>JpocGIV?9Z>&BR6pxp zDG2C`v(*VHI;`I*r*FSI8UFiD5#d9|L#svcsmHbr`yw$<@Bi!RrprIC;;l-0_tA`E zBnrPPVRVq!$!B>@Gu9W3EiQ{JPUTh5$b_q*f^uyTXjgvWq&hwHQJ)Xm{Q3K9*+&;t zp)5;>j)Eh9z2yHs1}_CFeq+*nDuq!=Nlxpp;7K78;)gX?I2nvk%{@pVx@jNQt6)t@+m%l@H0jdV#`B)P(W0OaX#q`s@9J zc6k;b-*LRX$LyN zxuVa4SErZz_zEsX}EnYI<$DEXO%}2>w}~BCYo9ci1QFrHn)o(#Vn2B>s-W zfS#r2*rv{8hEuE7e)Q&L)|yZLJ)k-Me+{Tk7O{kQc?O1OAGBu^IM z%UkoXLpK{QzaObPD?cOf6KxIk%uhTOcA;JJ?OlR4jbxiqoGN(-w7t^VJP*s@+86@Y zdkE7%vMm80^GyeBZ{7-TWw2rQxjcb{eZdN=ARhTlp&K@RIRP6I96IvS?foxrqjeGq zOTDCO0pX3hI)czEmn#R{JXT}$1#k@0;gEA+1~395;H|TJ0P1{X0E@6_?dUlEY3bFw zfc*S1?AJ-xbetH-kz=ACae`dgHZW1qe_PMs5-Lusay{4m_D~BtE!eL2&l_XQSA-6k z$HOES`!&@}Amo1YB!Fj8^I!Tf--gV$1)$EIs8G&Mof+)@w`C$#Qvaz zO2W4)%xqqCbh=`O?`U72qmoGL!3It*gpJ*rA&G%inYceI>dS%X+s_yeHNQ9q5@9&H zp&t0YpxuL7$nvq-Wy@g5@r_?&mNEly=iIjCwC ztErOmQz3=yx+aA;W1*G|@qgk$YFC4osX15g`;F3T=*!vd$Xb-+eig-h7(Vps6*uX+ zWsg@qmcH*pGs-T=#F3O3I)NaD%tch`C}FWU6F-Vcr7|ueE5^s)1?+i_>r`iDa8-ol zvH_?CjK2DNKh=^n%$tY&MBf9-0TWh~{f%;900AwRwQy~r0KTH#XX9L)_dJq8AhMVG zPEw~!0wgZwi-^sS>b-wm{Kou}@G;-Mw>0gg#L8%F}j$DUq zkyv1eF=3Fz0%YD)4tQ7p?gfzX$Q6q{$_PtWUdes1<=OY@197=yIddzALoV=O> zaPLdZqtLiJWQU;w9Ua1Ud*YV57mo*Y7a==tqavsifc4`$9a%sliIxH?;My=W1xGjAsU5f6u+1G50-5~4LfV+w0Y1j~a&L0^1SU=4GA z%xbHA!7YN)914q=@$SOk8e`CIK%2xx}Mt!Z*(Q&CiRtX zVsV~jeLwicn=U=jdF@2!;}XA9Yqc0zQ={59Je0ipm0%*bB*tf-ih_nz%GoFt&ZF08 zKABheLB~??Ug#uxwVo7v#v5LS3TN$3k_+F!>*o63ezVi7wRVMEGYv*~739T~Q9s_7 zaQ`pjzB;U`ZR=ZU1O!C75k$H}x)niCxOtPL#Insbgh#xKU|2J3~`g_|V2Ig=fzTw;-wM8j==9_$Ryy}`X=oMOjr zdA<_|6wk|i9mkemoMu@Hq3)VA_eIVOR2K*U+AUs4XJ;%pI#AF?x8RkCq}CqkJ92Gy zYw(;aRi5$3$<4W(n>JrX@xe#+JZ43a9hVi^7qt%3Uv{&&BnZWm{Tt`pC<|7%&_WU` zwm0hf_e-I}5D@o4Db(_dh9wj{YVB?(M&N?CDnx=4rRn8;QiW)VN6=M;E%`lSWxPO+ zkB@mXNlb+G1m)R8k#%luh?jzbIx!K!8|m~jx?1&u;NwWaE7)H51NDs!X&xFnDU=8q zXNc~1ETkiE&Rd?#*%O-gGG|QO>*;qN>FZJoqTuHoHqkvpmc%<&so&A>zokfyar()% zPY|Ttj~*W2MHmR$xpvx(o=AaTDUN*K^vI;LZ6HVt(=w8TjR4e1EK*$y5r6R^&mwO^ z%jk(jRT7!>=W%t|SMk#C-klh{jNGPE`7anW1Bv(d*%Q1G+=ZHa)Pa(owH01KT|=S$ zcUV{Jf*vnrn`c=jjA_-rexFV^|6CPL$3jv#rQ6=uuf4I+DqHuf&m{fjbi3~K?#eL# zSM9rN(sf)?XP8#Ri|REWQg`sHF*uR~*VsQNEJ$u$S^_`sAYuUuo0~{>fW&KLVc+`} zxgb7kiVTh&?mb6#f=^qI!rCT74Z%5bPwr@l&;VA}zz(hC3HrWW{fXMpgn~RKS;(Fc znsDvo*0MX%N1;kFPd<_1amb`{z{qx%MOI9~o>cHIIB0HSKpmFpB;Xhx=ZErETUFqI z+`cq8Zf3Ka8qkpJN!BHC5tWvgX2OVA%nlyqde{+@<#A+03=H%q(s5Cxq_CBEoGeWNBP>j6u~1EMH2Ti-6$AN1?$c71n-AH1_VL#Ul6=rLFSVZe)rj(U}2Kr>_t)bE4SIZaR$WX%Ir&WIRr4 zBv_Qsa@7iWm#c!;Uh|;UYG*1QxGlU907Lp~GKU)8T5$K`Y6k31DcgLhK+$DU#}6{q zim@W#Imu6-^%sXdoAI1>EqKLpWy0j0 zmHbvA#Ir4qryF{EsvVaayB=+jmj|;|B6ua&cXns^E<2NlI4yo?a7=WeO~L2g0?R$x z(|mCjpzK0A2K!> zC@583SqWlnMt77%|Cpa;GtA&)FfybZ0)Gxw6#^|8`hWkG5PbZ z^7l7ajeM@EF%s-A1TXhpH=UjLIqvy@7-)YiRFV|xONZFm15sU0i9Y5ChQP{y5EwWAGT>;^&$#J1vCp`ND!8#NzSGo zt54BXs;m&_M_S=_fl(38v?5u&ztzBI9PObbj<7xNDdI z(L>c_%Yivg`gwH*;*1762QB+dHUprzdO#+aDiscG-&<6faxjAJ0U&kKotBv*Xgddt zujl!&mMsPCVQ{)=Njqy{b}&49{mg)mKbbGkyy(Po??kVKf6&=s31j3C_gPIgC;Vw+ z6^+x!+oLlu5^N$T%-y$UmZemlQwFC9 zftGXG2gF)G;pO}S+nc-Fs1b3|{e{_Q)2NMw3tx2(p^L99k}{K~xh*dVX3 zI#iF|w^mfc`#6Re0thtl(ej;~+w4rcG{!4_S_aHTl*`>S9`l$O`K#v}9nqY4=ynSb z=s{3*o^y*IxY~R%sgTnWgPSb{oXC91d`?k+UpdM`)$^GLXKln%u{aj` zd&qv*vY2^VM|m6;UN`F7tf!^Se*Oe!@r$G0J6F0;9s!r{kqj;I(D#~~vDO__8ql&^ zZJLtM)s6w^-dU=}K|C}Xr61%94L<{OE9ojf!Mew;wGci*nWmxrJG7mV)?&*Sjt7<5hT6Qb zFo49y6iHL3d{r>is$O)GuTJ$KM|=|?DmmmwbwG>~+}{mVtD+aYxdBC$q#RVvv=hzu z$3v2TwwT@Z9Fz9B6hc)1w$Y5~`75l*72qYr@=Rq0I&o~Zcp0z<%KenMe@+_o*vCqD zu+4)5LH@{pUgM`?z}VBsr#GSjVe)y0#EL$X@Q zgLk~Pzqow8b_jR6Q=1m}ov(MlkJB0;&$c)Ilxjz3yPNyM40SAm&I!-Fm;}XiihWjv z%teOYFCr;u4S(kJe~v<{s0nvks;^7(7=Fs+m1N2!_$aBD;)aI+2oYmV0UGIs`s!Ih zA&>du;4L@>ZUAa=CHM+zf@lyv4N-j-Sy_d$trnkx)&M*XDj`C|wS0;Jh&iN<3?)Hk zO#-arHnZ zB&x?vO?2>u%I^jcXYDC!md(Cf0Qk6`ksqNuMlGC!8cn^;n_HKieBO>LNs(`VRW8TA zx7^q)FV90s9T+r7*kr8eIJJ}o_Jy^;8S4S)0Q4m~P%!wVJVf2RySsYX7v?8T3&7A< zgOcZ3G}2$Wy51a5DA&imWnc=XvFz619L31_p5(Y~{?meErM&oq#+XT;hwb<=SoYN` z#*X5;9hbAHG6oNLY>8~p=BcGu>OTL24#L;V_~g(C-iH?BG#iz$LDk4KW1A5pR|@TG z>+^3k;nuFFc+l!oP~D9hWFwZe|0EXCl-ucJ4sr>B7RG?E3XOE;;dL(Fdy6`+W!c;RaDRO;z*KHrYaHI?`22t3{xA z;VjGcOyJXWc3M#c87jT<4ve$5x_nlTJ({=r$1d2rf=e@kNxR08f@j|DZ{}itlV@zI zP*q{FU$Atjoy}NXHj*C10f`BSwLB<{A5K^y70Hk~H{oWdV~z83+4Z6tkgSrW6O1qt zY(MR8fhjC%k$`kXz*u^v(#v}9xF_c^F|k$F+k@3Qlo@olVs5<2ztErPQxbg3Eim|a zQ4~!5th}<4-p_4l`q}*4TvaTBk^I-Imfom!P<1~*b8Zhq(2rYDUsr<$I}IN$R9n>M zDx;Y3Rs(q0rJ=7^aD6+IhFHVhs(ltQ=i z?O1{Nk*;7uS{gfh2~x3mtFF4n^Ulh~RGn|R- ztX;lM0i8uB5s@a|kViQt`3?*Z_oKPX8nT%U@v`(Z62b^S@K1k2-(+4pE+%GIJ$dG|)Q;i%;>iIGSV5r6KS|e{%f!4aH1YTs7DH_^x zroKK(ra?suEuA-5W##mgGL(69!nNgzQIUP#3U<72ai0f1Wrg^lt}@?!x*fL6Bd)qY zbah{s8%2V>xVU(4)0*-|Jm;wWDfR4~U4G3(wXEV(B;B-$%iz2vrgR4wJ+-HiUl@Rd zAJ5Px^(b*0{0_*;gpxsB*HCE*!ZED-MaXGZep_+Nb<e9O$4PDV%0bTAWaEh;xELuPE0KkS?%}=oGniiHz6f)r;%U#jFjd5S8lAy#H z-kkrHSbA{CwCr~2d4 zz{`TemxyCvvvu|8j>9YM3&J=^8<4hMY!sm8Lt6Id-H&eKq4Cg<;EKC9s=B~TLjNUM z2<0Gkf^VOb*<+e(k=aZAIGXrH_t993{PlfF!?kxN$PVMAw@9opy`dw$0mfF9hileh(yp0-friBBgEDSLlp=;Ua*jBm_{gw%aTev1sX(blpb3I6EO6Dqh9>NnKK z6RRcTf|k*`JNUj{(CZ?qx(1iAq*?x=-V#6`vpzZ&>!WHh-5mJ8)J&W%Otggb(*jAF zz>8%MdBIytMn)+ft!Se+b2b`$+GK%8UU!w@cWg4lx@Sw-x5O8A^#=n!e8Ts;p)&c% zGXw;9ADN{F5w@sY`hCgjYm2n(a ztYBsfVl4vo&( zLjOEVuIR_|@;B95INWmNHzg|9Y>@V-1@pN|#TG_RAjK?AEs9#*8j zUYXVScu(K5H7=vD*$i9`zZG%(vSFUx!ezky3KfpTa$gVk1K)d?inosvyh(4jT#tPY znvF7`GqJMkg3!~=V+}tKZMSO`Ek0M1AtrkIAA7tt_EbwzjYr-5GxN0*SjCjt#9~-- zKb!&6jMul#;gtUUe$C#3!%-ffpj#`lznW~q#zxKFHTnEEA_?Jb>p8UM^XDJKptCYs zSSQk(%(B3&h>vw;aUV|v97DVxX*Hzs#tdrFDTfQnrnMrzjgli|89Q*#H z|9z-n6X^>xw#ModL{b8uJDpPR8$FE5Z*b)I=X|RrfWU-&|7Q_|2_-S^|7`f$y58Y4 zx|<4N{IICDYm(XX`d^1j%2-d~eFK0S`|qF3uyD+p+`Az{Bld_D`Bu{>hh>`fm;3Ww z=aUG{30B<9d@sEOki{~?IwMCWPjU{rB#J>d{!$udx^Bv!*ZBaS$SGmqkCpLE)- z_zrBh`yls>krdWp(K!r(f+MvB zc)#XmcE7DmY8S@4+&l14Uv$|?H!m*H+FNi-_+OR{U|@}<1qY0$-B|X8e#bt!Z9DREJ6}U_cDEbZPkjPA_^VyT`?4@X=B9~{;-0pAj1`z~E&l`J z-7eJFK8+EQ@ck>ot%S=P74_1<&bmm)R<(QyRH0W48NBS4|eQWq@HyF$7@EM?`t=a(z!3wpP(1L zOh?nrEQYn4inghv$Z=^=t(w+ad%)-s#M09H6ZN{S-Vl1{Zfya>dHq6%17YWK-Vr_^ z@5f=kDS}!FC)ej6vI3Xse2rkn%MNy3;MltdIq08gL8}hZxV?r3P3(7t(*YR8KK#4_ zX9ggstl*~h;m+M`h&xVht|MxLBe*O}`a~Rxua3=GU!ZgDzZDTY167}BzsHsGb z2z)51m!pd^IH)qk5dcYerNMUqBy+0}vRKHoCDk+i%rIXj@_Taj4%3rUn|<=vqtlDi zF2~`5`#X35I!O+;+#vqja!{st6xyU#^pc~1Ja^U=k52TyoC00D}v~oHAWGaB_pboAy0uOkc zPsE~W%lSsV$7?&fYXezjB>#?Ex3^0j2{o^rUIhZ|#hqlHgKmRhS$U0G{8{Y(Zo6b& zqnICpJ+es;Ora!C@7zwe%c`|C?2RK>EDedz@6I5zFu0@50!m~uMq}m8^|Knuc$^67 zR9iEsg!aOc-Z$0b#6S0;;47^7Bz$T@{e^Wq9aakGqUW(mz}Z~QWFR-l(0UZBtNX}zXYdD zGSBeqI7W>;r{DkuGsV0eA)aEGwnF(>zgn)`?&i$RcE)GHzq~yqRlk(9nzFz;5hLo6&+s?vG{ z=gy^=@~T7c^+bugm05qydXM03HD9A+&R+8y*_2-G+x39s%NeQH0s?^1((rxi2LFYn zWnb!TTg_U^=jGZ2D=f7Cl~Czy!EsJ0uTzuWevq+U97v62a$L{UhDI{pT2oqrRiZ8D zXIXWBYz2UFh@!`ooh5$-c)T%s)}~v}%nrBgo#46Q3-RTEAxFJcP{v)H0a?KLoC_eq zYHxfhFE0ZMZA5S+Z;fTV6cMS4$bHZ_6>W_Z*eZ1h)C)n$FMX;&_s8iHf7WZo3?TR`dpQ@_QlcC-|kTb5U z)vv*W)d6Qcvy>($V(9h!xXs}`e+#l5)H*i@sUV1oz;!_QdTe<0oK{emn0IiHPU#+} zU4AL!yPqS`!i))DHW_H;zLvNADm^1Y`O@mJ#I@+I&N->{N6xwQ6OIh75;TbgR6h4J zV;|1DS}f(D(bN=XmO5?bVsQ$r#L#{&F1BmmfOf4n{D&6(&nUy30%s0w`as{S4Ow_| zygk&6Y^(vQ_~x$$4tmS-EIPksz-ru{N{eB8AR{44Q63UDXI{E&*Xsf_B3^A6p3J4`eV)2S2Glsg$V!6W z|8sUHh-Ty8M5N5`;g|!9ci45NNVz)nm%Q2G)T{8OLul!Pm{yY@>k3=SC|e6+?hGPG zu<~V-Y~1Mg(qk}CM89vTeej?7PY3a}&A zr^B}$^&J%3`Wm0WZk^fw|M)mzRn4-YJO!oKTzFdQ9=@}fBp6sPbhaupBFaNRPw^?F`=&o`q9G# zKoEN*B6Nd$`ZJZ4Pa}H0OH6A~{YnAeCEVv=-XOQ_VyxbeXQ_b&;RPB*fX zykAjv+Qc&j`P@kCjlq-8j4YvZ_Dw* zl&y5?;%Bu^NtP4oKjMEYGg6cy#$~=%to}l@O+c>$2EwEbcAh9k?$GW|U8T%iLy>%l zvOV@E?uP5q*Gs@Oc!Z4l<&m%F$Wv5aYJyRCae@w2xvY#}pGL-FKXC6~Oa*_=^Ef1! z6I)g1%cak3g;jFGeQ!#>r*&+-r6AAK2cBY-zX2Y*%ZNhx&gr!j*^!Zi(=TVgBll5N zCvO=Uu3$R9Tt~qI6QRl>fobJIri$t*D<4$yiHo+&=? zyJH%QWKOqh@wXt*6<2u!h<<10buT@A!bz8!qz9zIU6UhgoYR0?x%kJ>waW2WpfrzvsRPD^??aghw3bzH`8?|SD~KAlW2Zcm!ZF~ok?pq0#1h)N*oFsLx8tFV^`l=*YJb2oJl zaZDEjsUI>x+tJ~Kc}Mv>Wc~H4mkE_;Ub74<`4{O~F_wftDUA!wngx*2b|8K^K z-|EnoU8wD?ZPih#rakvF*}yH8>$mXkR`psropx;))cQ}E3G%iJ8|x`E&}_r&R6!dG zPM1re49-@T{V4=nF{^_2D$c}(BkfXFi@i`1h%UdGPN|;+@J^&L$=DBR%xh<6s4GZQxm=w^4WFpKe|rl$Iyg=! z;~xYZeZRriGN4II&w1({>AgDB;9fjx84d0agYM>cq~7kMTMlhuu#IfjTFq|4C z*LNx&PHouD&wThEB~q6!AJEkNcJ7Rv*y^_Dh_nY(!3#lAqWf?x+C=&sVWl2+uQeCa z(f7vcdT`u)Pj+@HyP{_rM-krA7574K#@=$(}gp z2Gh~O`EG5h(f_!x3Z@~N^U&??&-23-cSbkEK!+Z{1Kd^(b(mNl)6gQA2qM~buGoku z^B-Tem)x$7q-(&;YfzbD%MzL1-guk@D1ok1&!D@L&^FqvbQ{5F#1vJ*&S{KJ<#vzx zHfvFjBWuNRc!A8tCE>f#ZkYdwTmQ*kL$JNx!jV!8dE_#0poPq)p%q`L zj9!0wOz87@5DPC`Ub4>dLdjN<@&Hqjw{rN?oC8K9bN!uygub)tS|~3URdfg;ua^_A z`G!t{^mNsy0_CAEEf*R)&J|NUm3y5C;hS{j!xS-Muc;u52dEC3;Gi|fm)rpm&+XoeD-Ck>hdx(cB z6ukx_yX{SZXR9>9$glBT;p^>av#MmRJm=f2pU2%B`Na~2uuAsJN2WPO#WrEvg7W}T zVRXk8a_o#P*ualsq1(`I1r+f`-XbLQFzt_eiJ`dM7Fp+_*p|{Y1 zU7?!L^2McL(P}3D&DE8Sa(vaK{2$y(TyJG8S#SNych_OEp2FXWBNNzE8xlw7ln6i zA7*UJUWIOt$*nqLtXIa-j~!P1sZ(hmm_5DZ&pWxLi(*Q*twH z<|1vO{hMf963)=n1CtZ(k=Lzt)>gSl%cTi1+pSk#BJ}SS?k-)*_DP^tdV(}Z7n%JJ zYYp}c>$h>L8gsl+hu}#yXyIDW96E=1vkQF{j=Tjehi+o(+^@fJ)k(B^XzaVr^%PSi zwb%(oAMIuybJIt&Cl0}7r$B~1!vhbL>&E*E)Xfh~ z#7=wDiOvaEBw9ZsP~ww({yC*7^lu=@AIYB05Aa^_C{-y6+4n6JDd zQWy^+h218BC}Vost1)@WywKL~UE-42a<$o;de4G;&f4N$ccc3T3|i9H>rsY6kZs{N zZ+U-fbRsnt6U$Kued(l5B1RcB#9-IBW!Q8!*04P=SS+7Z;*ORoBX}YW$m1mIEBe0d1Eayzd`-xWKabu5tq)J%My9EpxMV*XAJ*q=MoN8V zjKG$?of=3j4JoCD{do3MRTd7wq-%yl`p?Ucv^A1q2M0Maf0Blz&Y<^bb08$F>uFGs zAibfqaUf4q3aZ(J2FAEXLF2G4+_%0?hJail_kLK!zPZ{xfG~uhY)Vc-W02+qPvI>< zUw`W@HJhOgwRo{zUGVC4Azd-|vBye6|K?tFdSj`tI|~VGPY(?sqJK5q>Y6;9!pC(W zI4$_~ER^GF<5#`DvSpmD)2sY~Z_`h`U*qHLalF3z;6qgQcg&IVk^*94DC-&<;@ z?JK`4t9|jsPHjc<0QT`p*QMh-?QFqgtdo`v*x!oqrgMV3y zf<(~J(Mztp)!nq?1?C1>yaK=qvgDd{mx*QDcylfEEIwphk?z&Eb0z*Ki%#)(pC+Pn zXr*t~9JS+mblH#gZff)`oSU~bUo0f_&+|F=5*Ju+HEvDC&i&cs6G&xVjAWho2D_g7ktX{Xdmgx#%+u- z)vp#d+!LW6UoWGutXL$4lCFY9@a8MrV9xQqV@q8BV@fYkME|{Eg3leNp-0Ew>urDy zlT;IKM})9;9nqnsNRDceCR7_9`s?2_jnCYYqfA+g1NE8e=5(Xc>0x+?eTFo~RbK zv6J^!P0X&GK00G#bm-Y``Mr+_bBg6f@IivT@et0E5IuaI2L~xG>u~$Eb^&cQD7Rz= zBKjiaccLKf-U?~yqvnPzUk;Ow$zEUL8t`mkklq;i`8-9Ce3{Y48&F9a{5oRL&_LI^ zx3Nv;i1_CYUIVsbmEE8{M4HP> zE}abV=H}SOQQPCFKYXnvY3;o)>0-+Z!KcWes&=3-gZf-Wl{aQiB0dU|4+*bm~Fcauw^{x zsa3z@-A~oc%YfAu6Jn@8VkQOv{kRUkW~;4H_Am8&G-Ql)U4VzajP34>jHe zT4B?tw=bZIC;h#(DBk8Pz8qQe39|}g!44B94}YN$+C zws7$t4EjHl@;{HfjD6(m#SFq#LSmQqFX}s8lQ^&;4=8Fi8rJ@C)SGvtBfE#VSYJgG zW-8g%bT$bapV*(^4jEwdvg4squbE7Ego9IF-c(^UZeeZ1nD}il?S0!ua%9<9{&Q)D z(OWy6A-#msyQrlJib%{n0g>KIb!^$}mfjr?4_IR3(^VX#J^wb4q#A9vf9MgIQQ)+?= zpb|_5gTT{IJCTuKEf+OX$tglisbT2)QI4Aq+};Nr2r$QnPsA)SL6%e3b3p5J&lS|Y z84|s#Z6|tjta)=J#5vw_cIM*gFqIYz3bka82f?SD(ng%y7G)kS{-+^;7DLy4bBf;r zxpBFmi$SQTI3$xSQ zv=BcE3{7g74HV2uaXz8YdK9(f{k1w8%B8I*<0hIW1O*sMwAgL=Sz~KoBL`EpAN#i8 zNXu*RcKJOtW-uesx#F7eSs%$Oj_bC)msFMkA{L_^{)Xi4`eON{-{1FK4^O%}%su=J z1_H&)Fb zXUMOo!Lgr;xSPG2q<>WICO#o&7GGmsl->o5{bQtP6elgpzN7eYR6P&M(}yM_J0J|5 z8!oA$mT&$xw;hlJ`g3Rz83w$-E9h#}vTcFTa~$ROrsG3R!MHh*LO>O*mrt$&u$9vv z&3RtnZ^5NUFc+=abywOJ;z3{HKKSFIg~;OSM+R3w+I(dh9bnkOJ;=KYWtWfrtzRpI zCSbQeKM+DPhI)^NWIS@h);(nZ_pY#9bpk<7yJEQip=1K7bI9yD zaLz$v2AJ3l@CpWMc;Ms{e}&)yzn2i0K=Hp}Kwmk^x~emPAikiU+eJMWSH$NFEP zCm;Bq$ut9PdlYzY?KAuiMI_hxfME*v=sL3iRgbYunS46(p1v4B^3oaQau>ae|L$jt z2UU_Vy3SPo0VMWdTCA~Vz}ptx{(C;$7osJK)G{|Db1h0wD(({F@3peG@KvziFf$e? z{fac&`Tqs#_yg(j>V0vqiQ#}xu9v|K5wo+vyobZ%DLuniDt7Upsxs~enM?FoI*`=$ zaiBW_@R4c&GXSkfx-JBCNbyjka8E!rQb?6c;9U{m&GPcED8pZ0d#RFPBr%#-!6|ZJ z+}m1{{7_rDBZT6FKD=hGC2h7;3-91KAJ0KWp807`T^dX;>^W8mnmoSp8)3XBa!ccW(v^F z7Dy=H^>M+MptqV-pX{-p%+gd~1c@u+;WcH8J4meu5hW+RquBmYq`o6+fd55Ebc7At zcr_fCz-#FPSbF$hVJ%>NzKrplKy^F4j9+_a5dBisT29o@JYOG2L71>ZMS?P8){}Ff z=#kb`5J9h<2Vf z_v#Ecsn3hE%t8eA${Yu@JSXGH7DBNhcWrIo+#p?%QUVKedZpxeI8Q|6N08urXnmTT zdmcK5{2Lx;==I1PA;F|Q|Gp2y%>k%Gtl?wH7j=fb*4~OiE);qM{GO7Ormx8hO~NkD z-AtKnc}5-Of}081QmM#fvj3eu{{ce&Jc1hb$k0|)ikXjhI&X^5g`BmPYn1w7l6avY zs}K@RRq;&K7M0tRmp%r!UWQN6n!(B}qBQ9Ny5Sy^=r$C#T~A9O^8`LxniVBB0d;j< zGp(&{{Nq@2Kq=xwjX_ef+syOz{RC=~w#GPL67em{_UZ_d5Jn(PhcH@OHc(IWru%vR zG2hw$a>@xfwhZEKP@|G6;m2|=?T%BU>+msJpTUsV8N?evtECO-j=I6=vQNWtB)Z2d zbQ%nzkD)zN8h%1fjWD`o=7`N_uIOtUgUiK1uF+N}GZk=TCxBaq2}){Q-C@i zf6A`#oA`P`sbgW~c6xLmajDe&K$QHkt1j^%YfSBa-3eg>^T)%ruSQ?E&v{uk*@IYL zuy>?a6L?P(Ad@NiP2S~FV>A}~#Tapm?D>qlm_#HpJ;rnoz>lD4oH>X

hGeRy(-t6w|iSt65*yU>2doXT9FkGYNrZ{*f7hIqi>(Od#!XEoX{Pj3G|MyQv z^J&a?!(D7FxPa4R=gSw#Ryu?zpt+vWon_UBVwJd;he!P}P~;F=AHFfT%8&x)Qmv9f zc0b9W#&58{F5&cQCEy6WwYEZqm`&eUMLvJwZ@+A0ta0>@&af*4nP#Oo9y6Ux2k zoSPX)-7lpo_?Z%}r+%#!r=jvRg z6f5%mrQ(DKO1%?3ZM^Rb>z;}?qkGLuY-5euMIvJj6dVg`7jx3H`wk1NcMTcwxhT@m zp|eggsugS)pojvb$bxgSwIbgVa^EniL#SyZQ0W1#t`pPKkZb_nWz3(PNWnR+n<5Cs z0@yG##_@Fi&&f>Y#r)WE4+GT4oaOb43Yv9emG^NXU}WUjzpgvll)gu6NtH zG)@U2>DO;8Q=#o|TmJGqc)b_t&{L$YSv7LKN}Uztr7BqX1XXuw{?-j_8Afa^zTBLC z*06r9K)!`TG(P$ zU-zG;Mn@U)-S1{P>~P*9!iDT1UE+3q%s9A5N`6G|nJ;5JkcIFr`$3mQ=0NAagG?-U zD6h7wRQ3L1?AhSpmoP-w2iMv^SND|gqdvk*pAMy1+>g#_#jMi0OZJp+KnK3}O0)20 zw?(iImdC~IN`w$^#J@7#KvOx9M=%wSoz2Jhx}~?D+6dC!jPVN=C$aLSQRZ;{^NgpO zNK60e1@QY_EO8+}FMA}oGfRx8-ZiiI2oMicR724%x><#d1-&|Y8up!>2BrIHS;vSWv`WT}%tO#TD5etY zB=HT((-*&w)M2OSDNPrK5|l<>KTm3)zcC zbAxv#4J_4KXDXfgox-=QmlN=rFTHceBX>IoqZ`wuc4p3Ep#MAV=%CPaQ!3+u{cEEJ`k96Vp5ou~K|5h>+JO7>TUx zPnGpMgSCD-n0*eTfthOF6g||hCG-7t=B-1rbzVkt9&GKemX@@BPDA+VI|f#65(4Bf zdLOK&4|1UYoHu_QVYY!;9GL!8MmaavP~LE%CKDz*aJp>gptV0g!`j{+{Cpz>=(1~e zrY4$ipbYPcQM!GqhfUl4i6!&PMFW^WHb?eC-`!nuu!*66LqdARIyueNVyJ>}E1&sv z3FvzI>GS8I3UVh4-Id^fALaWsXbh)jcr2sfdJqZbiwK7tVO{N346jWVpqnHAS~cODmX?`b zDHYXcGgl2+g~J&JJeqWBSI#yaGz&B>71c$PA9(5?A4)R@GK^dlOM2KP1sj|_*Fg?r zDJ(!2LA;lbwJ~xN-O}}Oo;o)-8Fj1W*-4bo6w=c(_RY@bn}06e;T~wR+VxAv?>54K ziwVvr&t2t2n$vlKQ4Mo}Zc|=cYMf135ck32InH|T7_J;`^cjCYZNDTsTl?lUn(k)r zHjUCVmWwN%V1X=K()BKD@~_g}94{F1C|wOSyxB*r#4=eFOWZj=2yWveOFwyB=%gs8 zxbIC+@5dI3R0*-RG@xeYS##oBv32Fi#$=<_nV*2Z5Jb8S6M-CEOI0>-C1LddKQ z-S|`&dpY&)b}E7?Mv?F^-EET>9Q7$LOQfwbp3$5GHngbe^U+5TL4M=Mg7NR!Fv5Wo zX{CO|yL#ynypEh}g0}&Jk!}LviR*`lLLO%YppR{O5+0`k;BQ=uwIp6--O8Vji=_E990C~Jw5Pj7tM|o zjTN{suRy}s#>x}vW)t}y@JDd6hnX6TQfNvaCek%z;4Jm4sG?XP_mREM{;c$GslT+BdCX=>;MW>|D2 z8|NlVttj_H>8m;3lJ&9S)V|OO_^bUIutl?36tA(K`8)>Gi>C2Vpl-zVCniH8A*14d zEx=k5^q*Ep_q0<772tywa5Qaxvh+T8UPBWHIT}`jQjTNlLtb0DhT-N$PPW^S%kBG& zY&kG7IHfb)o8vNv`i=~ z3%cgB5Y)yRQ4~kB^hG5l|K*c4l1M@1hM0{i>TITd2lT}rhQ3M_aQRdTa~2i##938s zfU{?@ZBwEQ-GJ0`zC@P`M(UslXrhFK+%yWbQKH--FfnaY!I_T$B=~8!!s4}SW?K#} zvAq&~f1Pa>m0?ng;~ z2iL(n9)2U7$6jB{ird+wOZ>=~UtyRxiBg$ZLArTAM59k{>xq z8?8@-kYV&$2M{bS;L_X#&XDYq;&;`>VOjDD{_uGV*Dhgcn1+qe4tjw>v=)4Qgz~s8 zsw)kx!XpJ894uCl|GrWyId+;PN-K5Qof6~alDni;D1Y-|l{Jt5ppZ1y(}rr70iw#G z@hXwdsh}7$e#`q-Oj2{gJKtDl2x~4YAo!6XZ94zml3D|ibdK;&AM5tGKL0#_-I5t- zdq^Ato#+OQlvcu2kxg081njvQPp!+?YWnDBU;I+s>WU5$ue#gJm(Wq$Z?Tq&iN#U8 zq^3ocF5m>GG`d8ysky{m16J+ADlb3LkR~Cdl3gq15)KRa6$x;i3#e-L1DhuN%)%c!qC z<2bpW^gvn|(|#Pusw?dn-71fXvyfH9zeHqczN&i-sH;-uTO5^Hw?kBo*90LssRb5o znyQmD&D$Y0-SFLQ-ObHmj+*q8E190G|gu8`o*A(NIEtL`sB>Ogho5lb$0M|B%8E z)Alh4g9oy3$B= zZi?VlABhcbI^1D&iH2N3QnUZw(1``dON~ZmPH89#=KD@GY3P@?+3D~R+k)(sSj#M9 zAc_bRW3R?ncca=8q*nR_-swl5D|QYpE@q%_l$I`Y<}T5%@SV@gi#3XW97zrpR;n{9 z+F_!<$`K3kU!0vSpPiJ_p4^e*H#%}j29G56F4E@?8`iA6vrbU0&1xt-zT{f@CbiDWJ z5WkbZV�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

t zibk*s1O5^GFX1qjS5&-5E=T)LvbUT)QI*H)^S9!fL{{ zx* zcz1@G`tgW?{Bg;{7w?1#k*SHUrydO}{=DP92w6hU+Za4k`&E*irP2U<-(tmq%nUy! zk<;+t|6)>ut!`KEa;_w_#sKM$&8C;HcjV+XeKX+K=VfE9m(>IilE?O8)qnFZ)%K9x z3n4!82QIrdR_e($nge*umn#N1PpT81WK(+z94s~BdIiT@XIEI?53syt3ELgOYZzIV zadBTST4r{jzB~R+Zm+D;xb8UpFcB?U;=icmoP@8jPlIXL=w790r#&lensJKrp1Q-j zT#{}j3Y@x)uX4hdlR7ZBj|%2dMmy#Q%gB_B`!1K-F6cNho6xHI4Z1GHFmpgYh)+x0 zzRV)@H3XR&5fTumA``U|H_3}B;u6Ka5sr-%vIdPKGLd2E=zS=Kt|C9+jnFwk{B8rk z(hheC8iJ1oT|D>G=MF5&5QsPaLWwg3E^?~qZw$2njv;$D9hL-5{*M>HU<5h$z8#|H zV*hwkWlrFAi|2>>JIxxLlq+2k4XYfqtfbfw6G67tXITApi3H+}4PGMW5{PrJbF!V& z48-Nde$&+(YX57*mxCL_MVP?pjh*+;2TGl?%)`88vDB+7UGBG2)UF16mzEX z=Tn_dC9dQiBOMO(g&hwP4QtWwd|mP6A8XpiR6p?t8Pgcwax<4IneL?(e!G)I(p&Ly znEq}f44x-CS2_|8&yL`F7Jc7gB)Z=xUrSt4i~y8%H$XJ(#Pi{v94Q?NA^^?FlNDP z{K0bgRXL{Q+c>yYmeQ{$9}ayQkhy0Ok31W^d2De@C81n3G)hDH=-- zJk+)v)J}-1h!;1NEnpM}AAH|mV|XAGyQ-YR-6>QwfzI7QC{tt7{GlGN33C+>Q++nA z*`{gEjnWm0#%sNgIXp(~fVD=C-Nql*m{raqYyCU3< z!xCO3QI;@4At5#3s#{BwaWi?x#XaBT0ldq@6d^)C|X-SF|Egofal zH>%_pZgJ$#;GvP$KFp|(fD8RJ@(8<1^e|^yT>5ybgA?a(=p8H^WNh4Q zUAuf~>Z=qqwK#dBa@b z!zO0~U$t^4dA4TZgIJ!^2#lvxJr;BA^!r%&{?Wm>4|^y(1jBl*Z1GMysNuHx+iQVQ z3hp^o2H4C?CF5j*kb0X#aZl5t`bUZ9jX-usBF0T@<43s9E3&Y6HY``lG$_NYOm@s} z^PBwg&OuC;5?=imNr2e<@6|ujh@1Eun+zhn_+oMDhu+`X5$ZHjUxDYIXO`&}NU!v} z!-zEfo0OItxENwvE@5Wc(XxFHaHk9+U7(K1@QB&hz44y|#h`G!Fm!QRrflD8hR~b8MwgXiVW(wnYRAPUEgN3u8v>QN{B!VJ# zME5E^WQ{{)@KrK=kTm15=N~b$CfCRnOXLUh0)SQi9FY8E0o-YcN$Do!i$x+Pb5CS+ ztHZo<6_RrQ>Ah6uiz8C4WMW@UkoXFR*uRRhE)|Cvbm#X~N}ukhb$pCyz0y zFT(1~ptd(4K96N$9Zub)rc?TGGhKF&!D{G}(TrM{;{5V2L(6w~9}qvx23PIlC+Y;M zWq}mZUoHW+4V%$+I()XHV)wHhm*d@P{?oqJdUvG-l~m8BBPZ{bK@u)NsdQ_&b}3r{Cm`9$2r*pkxcIqA zstx)(=V&-tb~_N6@1KlBr@3Eo-irt9$|1}QU(aA8{W?gMT0~;Mtk*@!&HHhtU0aD- zO+nrfV@cuoYVQVu=nk8d${2e}2(3y^Dgp?sR{ajJ0u;%ua|cxH)QDr^{gA(27y=pqXW^q};_^HS2n5FirfOeh z7=F=>-KwzdlYB&nAFoJKph z+jA1w5(BwZyMI3O^$rF*y*R((dbUIOy}tN!IBrecuCD9B$amMLXq?Zz31H*=vqj46A%plvC^Py{-Vz(A~4r+cd1V(H=+-4t(G@Z zIh4!?4ooT^N!<3pV&#TwFiojlYbRV}A$VZFJBEv~JEu#oc(bIBh&~c_JbU{n=GoB# zQZ56^KC?=D>L_Z)sGiX|&0#09piAdzK@O!jf;#OHt0X&V_qp%8Ab!R3@jbaGt5I;D z)+Co?&OBMi8SO{*Sg8rqu?6u8<^zI{MKXpJio$AX>r*L<#xe?oPvoXH?NFVaH?6<8 zZ1s_H?KhNoV#yT*bOmZv3XQgGw@!0xlp*}y3kFCPd z6vtHEca7q4zl$c*YUvajA23W$S~B4B6#i=G!B<;%$Lmgf{Hig{NMXrj{6(5-u8C>R zD4QC=$E?$vmty4v)Sxs#&jz6xF9u%57 zjUY@+63Cx{&Mjo}I5(MpB zTpA#ztxn?6R@wJd6(9>C`6U`mGKyu167(Bv$+%#fH7IL%RRa@S(iXA*1492b5(RJ# zls}hULoGTX>}j_kgy93?7_0B6v_w9zPRb=#wP0H(MImH@6R> z)RQ^&1QaRuvHHV*kiJZVsk|zL-63|bq7VHHke=j0Pnz>4k?Hms@AiTuN?Ck>XKa07+BS=f6mCDg~gx+buY_)3p)9+0griw+qUkl zm~fOBI_7jpBMV#svVCay!50Z^2sUg(+so~*z%CWP$n#L= zs)Z9V4uZQ{;jx6Gm?6iYt2D_0NiFP?1$b#&PoQxvo$iQD(xXAe$3zWy@4iT}yo)Pm zM%V5zwqO{JwQi1KCZm*&VP2}v#rOiB<=JJW{Px@>U4Wj@JBs-HDg&Ld_5_vIS9Ln|iegdg;5a^@ z*N+=6W(tYx*b~ZO?}LuvxO^1i5*Qijw5ZzOk6T${RpKpwRcT(8Rl$P&f;e2E(d;+5vvB9?qFzXtNZ9dgpU z-gM&VF!;3^nHvB~d*nWv=3Y#PwyO$y177YU@91y@Ie=^m+NkY{v^tzb+g)?NzVCb2 z^N&)UQdg?7 z40X(08bYn!FK(*Qn8#7jJJq zBpfDJ?xrWZxhOpmDQkB)Zs0UL-Q-(sKA)22HFR)h5Lwi;kzVNq_^vbvh+L%3?>13s zdJT%1UtEu;yV$uN2>qD!dR}^-e1CG0*zUsKoRe$Wg{9v9^ZS!Ey(XHb>o@ld4#(?e ztnN=PJ1_RCy#J1cB8Te9`;)z%T6xlSA1T?881o2;mj;Xd@uCjF_@9qUY@lsWt3 zDLmffHQ;bK!^6>Sx<|;Il2N$KeO|_jfFtfAh2I{&Ii4wZ)3@!~8u( zmb*rWwkg7FuN93KRbqB7c--*U6z+@OnPrprZG5JX8ik`rl3?Cnp&pxXAH4TJBh*Q5 z0H@@>7c_EdA6VG1yNP5V>cSs-UWa^}TwmkOB(&1k$uhh1YB+&`J5w`_-nY+AW#>uW!ojyh~|h`UUY!t<@hb7soj z4M*79D2Hbjl_p z`|WTkcy*mhenD>~VtfKgVVtHM??>4utd`NQ7Oi55jl3`0hV|h5a~@(N^)}jIwk>3?vE%B27CGH`=G80Y66cyD(Ed%%RSPZAa2gY{$N7p0&`sK zwx$4S>FdG4!IXKdDV8a~X0$su>7dhvFx*_la0 z8{VL7N2+f}E=yeepTkNUmjVEg1AvcEDgV$MqJP&iYs)8Hn&1mkG9fe?3+^wkcc)Ak z`d%1CeS|=WN7X*UA~#HEYSQnT^* zYaI)c!iaQ_QvazNj6YfTz{3^n7yq$mP)caOXLAHrag0$`v%U_^9{ub_`4Cn$%V*ov z`YTDtzi~AMR|hm>E%%-}Fq3mYZ$Nb82P6W1GT4*5FAP8^k>$SPf5XoIYF&7L6cjI*cl)irW8}}U0(B}*HaJSLNnae$ zE-uE{Ig5R!Od6g0i((x9qQy%Jb(|&5mjMc*FBhA9Xt9N9k1r190vV#-C9UrLQUQ98 z-~&{u3hiB;4l|byOe(1nI>8d-q>EoV-2MZtm1960<1?6~b-;jW6ci>CBcA4fJ~>%V z5BWtEW9H*CKjO|t^X}$ZXfwq?o>Mu6DZla0mwwDjU243MkZ*>KZnJx{+zB~)Mbc;{ z!m6(|CF7YfI>cdxk`e!*DZ*Q)!JWy^`{-=@)z@?8-xN(__Jsr{y9dA5PX58Qcy-R* z-!#iwi4H?-72KXJB3{#pF7PJ!eH=XGvYXRMT)aLj>!%i&9JC!|*?S>3Nd|8NkAx0- zV*a?2aLUs$M6?ZdxCH8@_Jx8@q5}2UKY#k%g&_@27NB-9CGLKzgUezx-;=}mF`!jS z)A*sSBRwa`;<^0ENUyBV&!{Dnq=4L|vuX`#ghskJI)fHpF{eVuJMj_u(+j4((+hH& z{a62~rJ|vvrLAE)+Nx0uOUHpLM|ig5jHI{H8{Xl!*^-Yl}*DjGjPeGq#|_&e(Tj zi?EghSaF1vc*fa9xA{PmgTcp5a=4kH6-?LlhT~S}OYxkJVO)yVcf9aB^L0F`gG|?e zon2p`kJ}SMu;mkhovCaX_&lTRqc33J$CJiG-}44@}qZ^hmI z7xR5FpF&xgBXH->K0l&D^i>YpFnylIOV@efnw#yYoop{s1Ijk0{DtMxfv2=ri~iMB z_0isG2I;|!T^%8W@=|jV3HL@U^~tadou*PQ>_wx&n7`K5{NfeHlie)4o;++xM|$2l z9XtoZ>=xMd&Eeu50d~nE;6U2n^yCG&l#4s*|Do)y!=n7wzftL-L+OSAq)Vh3QW^vl z>28pej-f+(=n@r>?v!vS3F+f{gy~Eu?EW~jmJE>6B)q~AAX6>+} zk$*fT)x)CFP5%=7MZ{g1NenqNSB6dFlN@HN|MBxPbKIMVhxw6{h_G?T1%)jg*tf8apG=ksx#@04Js{S{B91;R3 ziCB}i`yI^0=Y~EYyZ{;!`fgwA1&PkS5kV7wr0uPB>OImQ+B}=;mc9ltPw|O7aWz zE-}hW9JS#ls@O;l)!?_%4XG;2!s?;`p&zn|dJSqEvpAn|7_-kKCv$O*T6wkX_=H!E z0XK4x(YE`7`y-0i|XzNc`q=`!^c(GQ!ZQvN)k z+YM;u&OxgV3`&qUb%Rw*WK;FZadqV9ec^cTd=Q93G-|8 zCm}=8k4m|J64dtLcoFnj>umuHL~>c)Uj9;{jql8(YO_0gQ}znqTv2x13h;uKtcq>Z zO}T56&~QL1w-e2c=55wDDNIh8!-ypGXiz(Egm^9UmlR~wu zcoMW53b-KQHbc-vBzy!FHnJ(KzeczFGrw)+`rFNZ*P}!GXG_{u!bK4)W4CaOw^npBi#kx{1Us;`~&f+Ob z<&UGpbWa>djO+9Hu@OO|ol5OEYeB?QqgH=gFN9iLw-EK^f5&jy=906&F4)MC@M+`>`E>x}T785r$ zSj4@LT5j*Y4XnWrcJ%K45>Ns+O&og-D!YU3Qw6~uULmUccgyHs!%RK#4<7!m`IHdl zfOL3`%sZxS0cqL!s&nYgh~B;160!l`*frLypa#y3jV22-C)!#f+|a-ewu=x7E9w@q zl(_?juYml+rTP9NiUb|Dw|5>F^vkF7yrg}dFt$B;a08MQxeu$m`V7b=M1h1f>R4Rm zRX1KY4qu|oRlvJn$_Tae&oU=)o_+lPv(_QYg`y+MpAHP4G<;j?NxNIN!zy6N+RoTM zmaIpw^s0M0nkVd(DowDS(e`4h1)s*MP`fqieU8po5MC46vO}4(37dTudQ~#zto+qL zs7_~qZ#bNZU5`wF$NZ~_oLUuG0&;@b3Tpqm^`59a@eK1^C?Sy}`TNeV#Os$~Az$w; zuks9oHA#It?6TKLE;e+k-$1En5HoXU2R0>lU|O*^h|GP&{=to>;47q#(n@~$$6L5+ zA!}?6s`^R7Tq!Zf6lN8Nl+n$06!ny@tS8y^GxIR%DUw%YWv-<6Y0Z^6zwKq&BPY|# z;Yp{zLI;`(a8FSp9S8dp&OQ>pe0617p6<3bYs*_1fR z=OkbTX9hr*0SmX5-gWZAk~lh}k1NByKN4A1N5I_lZePn>)$$E0ai>6R@bzP4j`^<` zR0~XqA(8&~{&s8-jqW<4^x(^EIe@kaF=Z5`W{p;*66#xmaZNmI4U!rSHP#dc)+q*} zdcEC=300(J6bt2$`9D$a{|ZainauD7PB0voyu2>Oz*>3m8SUxpu66tZ$^DqhpdVdvb;$L-CoBV?ZI_-Q8YXEL-mI zRQ;JE_+_=^58N!dvG@OP9{Ha&hsI0ua(#GAHF~Bd#M3iTQcrw{?E`9MC5d=~bSROY zs~7PZ+9DjGZD?c+r>FE0&TZ8vb8Y~ez~b+ni&w61=qgDxQ@?HX#U)vGAxZ;A^%y2) zPx}_{Vr&YWkPJeBS@B!af3q|HNrnNWP$eyf-m(BP%&l4!v}0Y#h=OWuJ~_0R$D zc0J!?RJ8TNQwr%hH!~~yoVw7IWcuh1XAUxY5JASxRRduLO#nsUf?YKAku@6qHL(RScrr47_7EJbj zn!p`P$7KdRMiy~natGG)cwyG6bOkBD&SpY?!;|AIa_7%|NPt?xkoP?-VwfF z#Il+z0HQGu6jJZYP7?A!8-{bTv-{Rkl@HA`yF#A(Hq0C>99$k=``t%=pQh|jrNk1% zqraYdyyiK0%uWd#qx=y*{PMIGS1|P2wA-H5K)sIsHE$WsO=HK{li$d zVj>dE|5t)Kn8|g4xJEbR*!P_!z@Y9&;II8^Hap_Xp~1-qiGk;nL0aalYc}O9I#W}| zkCx{}4t_qSr%j6Ho-PWZjgc4o-L%AAAJ=d3Mbf(VgGa^NO_HXhmCP6;i;^C_5FldN znktYjMOm5Y%f{uU(7WmM+Xc$3{G2o^rj07GNk63WllUy^5mP)y9X^|O@GP8oCoB5Q z{JZ+OiK+BNDc0s-S*EpzbNaZv(#Fcb?q1 zvq|4sj|Yk6rwF?kXOuc&qBCB7N|adid5v_>)vm8Z-v?&^8f4(FbGX^(@(N!7(Ygp7 zu(46g5J^w{I-k8ppao+OI?sTWkZ&xz41v=5%lTiXM3YElWT2NQv_bcxfX~Dntx&Jh zKxjol8Zsf4V6_0msl0K|dd78@3&-6loAxFsB#==0k&IVpp1}C1&ADy#xsk6Wu{o;+ z*{CCx8h?kl-M`g%Q=(cGt?rW|0v+-c^T`o>=aY ziJ@T{1`S9*a*DivaCp$DuED$`Q+a}9BALGFwmDd#ej->%mp7+jkO$vL@1`Sn`+5qm zyC*RScJL5Z3N|UpX&`cn5MD@$GQC%2Q@I51z52Nq{2KA0+jlR#6waIXLxQ$ue@#c^ zwH`T22Lg2aP(B9g3V>72VN+k7K&jur`}7W^uf+get0>-KZWSp$pA?KYPCKJDJGr0d z3{hXtyZ!b~S0nj^uXn58osb@YNqDj6jGrQXj27+s==p5ugvK@_J{BbkO}Z?`VgOKlu=o1s<&q>3u%tNBQ3Msol}C`oAr6>lYJy-I(bx%Y5mDI$=IE(`=gIh*AhLpG@HfDB3)$V7}5+t@e2CpfmaBHwFPe(chl05CT1|FCM zT@ftv*u4lrdFsV_x|KlXC*51~Nv`pJXlH0Tb;0w&Nbatx&$BeF#xkDsz+NHSo1{s4q7cbZ2$Vlk%HbVU)i+xpDEXI|nhwMwAa&-Go)~I9!wx11i>ic@}IrH`d39t6WI|LOX|(NG>c;9LirNUr5YWUu~d zyDT&Y#RLVyQSjgrh}_G-%R8TOC?c$HSBN0hR-~LK(ORVDxRnuISyuh?_)OD8a7>vZ zthrU@W=s`lvN+eW#>zwjb*TMmJ%(aYq}z-PI{z2?gR{>giryse2!ffcTUO~vV@IV% zQ4pL;YO)y{6fv>`&P=)tf;gbH#dIbCf-&`-VK+Kv#+PBZ0>&Bk-Ge~Rk0k1cUC*Mw zqYF~bIcj^cbWkX0vW8#+^pG>)xgX5)L2jRRcKI1zitu~n(?)*VgNXdR@AM=u?Kz1o z-NF=QII!I_-94#>Q@W(a1pc2VuzG(+R};4@3wpnbU=G=K`~WUR3xrSYt|?0*Qg9uv z13~?s#te!I+T#Jc+$iDrasV-1C*R8tw^Q9ajmN^C3Ww)?hvp zdhQz%<00wTSlVKi;Q8=-r6;;SNG*5d96=1FNeF&6H(CYDd&3)V{kTECxt{% zGOYTZ6wc^V>xQTUh0GB^s<+5Sd$BSJQ6Q>g%cfC2RRfDf(OStE9zo9w#xGDLcf$x* zN)mH?`BBt<_!?c0SX_9)w#nE}aOuGvy&<;^s^B5^i?M2 z;|(bD$(nBD3%Wi0`s&QzO;-z+A2GfoQgsKV@uQl1`Wmq%d*wcW4Cn|X;~i6N_wvVZ z+p&OJyNY|zwL>tnB{$fi3wjR*y*oaZyF~cGEhpE&{n8`!@L){4rc*I1(Zn16YxBf? z$Z(=uF7Z=?BNQN7CL=1XMajzNa{gtoGWuteC+Kvl@0aGsy1f?EX3Z^RFkh@Y8_5bJ zQ&bR&+vTJ4M}H|fB2rI(xk(}$9~Tqw5iE$wB`1oA39icHKqWwJTM|F-xkeCE&VxTE z8CjtFP!`X$dPtJXVIH3x=ZP}UAhL*z-{X`aR6l*G#n-+BJ-6eHFq=UXy_}lI6s>^w zKW8AV_@m#Ch}IipbVIq2w`+dw_ync&NS$N{w_RtsN{*(3SU$I73{{C zH_4)ML^j6puz(eG{G4ZJWlP4$NFE`EINJwB9?T3n#$UvjGHi_3Lks|zXAftVYGq*1 zO9E&5GQ|3RUt)48940N=5?BHcE2rjF?DGe$qV=7{ZM>PdM_hmq`xj$A`QV4U(YAZ+ z^K0Z(F}$@cy3@>A-=j}MH92i&ZytM6+MLJBGdV-v`tZ9zLhM`iAxh$!rO4p?g6Pdh z>i$@UWTBlpMM%gn+F*uKQ9P|_I1jY6W%%cLP{sSOCW zOSskCyJ0|)yt4)70&ZpbMRbk?pzVh%@sAfEdq(?;H@AVZUUoVkL2>}dZ}H0cEgrYIIY<@9pHX)yztQom%ZW~3!n>I z<;kF|+J@9@SAJm4u2}u!Hyi-Eu~t{^=l4`XmNA(^x-v=u7U&}Rk`?T+wb*Q?!xSRI zf~lt?;B%^R;{S9u|Ne_Pwt0Vz#_bVFbFCwGpDd=&oZA$kzem$6Iv2l)7(#c z|AK!lWXdSCluPGjwc*?`_T+gx5`~G+g(>fW(nbe^JKtz*xSUsBg+u~(E9S1dXx4`;p-p8>fuzmC_g|&Ejg}0q`9shx`-IGA z$X6t#%aZHlr5{n^{&+qdFN4uNILC-kdny`a_Pe2wIj29=nvS2bikp|p`Pc2wgoVIB zYc2PzhG}YU_H<&GaaXl|H4-cFgBQvYcH0XbFM0>)d&M&HA!-@u&OH&C>?hpp6&K#W zHEHye&ij0V^d@svF9P{~9PIU!)w+0B%ks^RmV@&UR+pLrr+L*6bzGHI7+bLg1*hmC zNAVfw6PjSICF*K6bR;70q!nQ-Lv)t*&Y_gT10%#;^Ge}p#U!R!?@VBcjxYTX;BUL8 zf$*%ui^L#Ae?+J9*X@eKd`Xh)SUjsJ;CfsH!()5&k3@I|hYQ_Kb!rUBkL(reCMo>8 zBIeBG%Vq9xx4<2m&Jvu}A{({7hZ}kLJ5)8jQO$ z&{44Tuu}f-G3hBFTJ=hhWv(e!nj{K3UG7%1<|PQ_`^|LG{u@_IhRD z{9pn*;oS*DOJvnGf{hy;OY)C}waN$oz6bH3`?)J~d)j|l)u^D9<$Dh#Gq@xEXvwR_ z9zRy&5x1m9;2u5PeShB;Nt2zIBUsgU#M26l%d9AT@AOT6nU%COM1+e>_55`3v1qTm z12RQWnrgB8r_+!%pUV6$Js$V3r~h-XPeFzfJ!aTzC%1iPk9_Q}M zVm(hgZE}4FKwHx*ht~_M3;f~cVkttk-xe8g^pzgXu1BhJN^csJbxKk|t_X3Jo@u9# zIW1@Zl-2RkqV@# zhKLiAyC&g&gNw4C+A3LI0w0t8^x&H`m_dfxW|}_aVZ8^reLlQIFJQi{^HY*VK1bPgS z{_meGr901qyzJYeQ#|+Cl#jZ~zd3bUoYd&0T9g7kfheEw%~16j_RiZHJGdhXJ~Lua zH{#S)GcfZ;*Hz{rulEBwSt}5qA5}$Pof)XBBz0{?bbo4~PGxyPkXT=6E;JzJP%^ZG zWU@b=0O|?fB)eKUI;!F%$pkj+3n_P_x`AEj1(+EaEFo&FEMc`f_4*a!_FeJo#8OBC zXMfvpiTtDHaDxgb6jaCke|zc`2q&Ge;CBfe%x)%B*pP1 zqpV{Tlyt{N+2VfCv~BZqc&_wa3vW&$z4F;OG7!atAG?4Jk2~Bf3#+NO^3KI(Wocfe z>(Oiwx>m-Vwf1z=W93pyC{|gV`N8u+0UY2<82!L5;RlMA(a9|awK0ccBnP-}1=)5cC80$lMN1K={qQON=zr(NBczk$~FfNr@ih zZBhsj1GnZuFd6k$fqzYTJjB+uXs1r@G{jbjn_y&@oqp8(;|UFCSKf{Mp13nzpFSlb zo|KVp8JX8^`4%Q$uk{=$8ew^{hpy3t<Ogn#Roas?@6Ru*zdM^>Uw28$kKb3Wl-*x9zn~g6F3zd?=Bo)N&q~AHpVVXfBGK zokUd=n@kYr6<%eCpx($O-9KV+`9~}^M!zdJO#ZJue!xZgW<2kg$B0C%?f&=s2#OuP zy?o$Dm^kJm&QD&HtVA07*1)SrXD>KPyo26li4U!Bd}M*mkCq-0d5y9T^R^X!T<{7U z|1tjFJPqy#>yLLrlKqzJnRW`l&_lPMc5s^KL%o&Cfd4NS8$76qd&VunRFhjOk}hZrugvegAmROy@UC^6e)e(A^q`HP4NY2AY^@w~ zg83698Sr||G9=HlZKTNfT6+T}rRd@$`4AJg`~rIq6q$sUg|`{eZID=`D@Jl$A5mNO z>%()0vqfu%>9d=a)q`6dw&{3o+r5d|1Je&kU0O?=cU>w2ds6;hw0`-&9a>O6^3doj z{s;yX5Porga;h%B2njKY8se)Q^J7Ezjw~JDPjGe%N4DK-bezMN9?J)%6v%ef{`BaX z`aZ#RIviN+b5=A^I04svue6u)jllEC;%D$mPe?4m5uxu#^K7wxu@sKQNL~T6-E$ka`$xNtYOeB& z`laJ^PZ0hNfB_iTMOvz&6zXU-<1?p1!J zr52+ppNN4O`0Y}e;&v@ene4}`8@E<*{QIV~4U`4vB%e1^u@wexHk94Brs$lN{~3q< zd&++2j$9`rnmxNxB9N@AUm5cSljK3lkZ|pWVs0?Y>MI_$p^FRGEfx%lw09gVaon=F zl2OdDnMYK04|Rn)_R|MSjRxO!6}9JWEC`y+W4a*4GY(rVDS?@n`g-~I1tJ<>fpp4u zZj_1N)ra{Ep1S)x`2FY=RO=QyU0megXtoaWdhv7Dh9ySKBn_EGu?ZNEGkyo}(gvgR z8*jxt<(bx4mag*1=eF0w8|5BWUF@Z7^!MB&M}5ZNoHdTh#!Dk)w1ta|dJatP$0oNv zp8e4c5I_`+G@7t3(UJ}%(@;hU?kl>x#@hXOCEyIZmvresTvMN!T^8RFrb|6g#%~Eo zM2)`!pR<82eAxPUg!$27l+veugM~Wofz}E((m1ouD@pE^jEXansSciBgN`Df8LG#G za&c#H)^&8KPf6>Wm^@#9i_9#pfX2q+LR7vag@>av0(#U`IDGg5&Nho`e;Epfe;61- zUVzHvJpm{}LfFcp z{qD^{GV=ampH;Nb+Z7lh$?^8y(ad4&j^NLI9V3H;n8Id-t?=jYxZ%v>PUjJXRV(;> zVO4eUjt`0;Sgn(b2yYltt;+XeX8s7EX6Md*I2CDC7*Ll8d}Pnq5)5M-QXWc8=^urX zUfn)s7ls^PUKIFzb!)?jArK0RSpilsUNm4fDS7xGWXDT1w zxF6CyKr+;9&?*tyXG)iEp-;$>{oU?8^hd$s^s;Dq0I^rA){8W`QRt|rT)7NCMHsw@x^{%olWEL@0T;_70*D`Rvyq2%( z4qv(@3ey_(j{WrJydAQ2*)qy~0yzNdJzzCbH>_t zKY+~n1r6Pe_`}pa4gX}Fgmf}@+F~?Ye`LXu0fr7UlCT@g+<-B=zr?^z<@g15stlHZ5`UQk8dT_z8D`Fr}u6eO~-GmIi1LA}g>H zbu|C1iQB^^xe2?>emJ*cKs=oMV~RZn3kL}sZYhd=bs zz9}-=SB{KDB}zI!OK{^3an?N05eSQGRHwu4nlGS;+cB%^8)=*oHYJ~#q?;FtQnxn* z-EVq#nEbB)$PAZr&``OsL8o)yueAh5fND9ypq^vwIo;r{CYW(hP0dDCXEJp$Yc4{@ zIGHJXyqlfgMJ{^6y=pRep^`ASC05<; zBSC5hoBL=B{|5fOp}AA9NS|%L@^Bh&2?MnwN*D5@GIR<&uROawum+|$rUWyA2x@t_A_>VV$BVd2dgGgc zuL5=jmT#4CdkpFsCvXO&rw=<}aW}$G373F`DGcPr8}4edNyp!VNL%HieE(IElOi8X zhzo|TAULku$Sl3%zt7WSbN5HG|J`$5Ps?`TU971R8n(i$^JVjv-$tCzTwI_-3`Gr={`oDEp-|Do1ku^H7EHodq`y2j#r#0Bhy<^e5RDlG*~z z_X3BPtAAyr<&N70_LFwWlOf~k?ry@CUWw(kfaL=M@spS3R+7!vLK3r@_0SX=D7Ps} zA&{%p4ne*O@nz*f!?s$c7>{+E{?dQ)ibKO6`LfEHZFrcQcTv<$JR1Ef2bff16CpF0 z8_#RT4&}j2Q4s(G5!nm}05Ve?#hUyf%*XG8A1qnTP#u>8%^5RQHjfzLZaG$rgHi@q zHVhf6tRx#bMg}O8mn}vLl6uT9T!+7Tepv=`;n`a&O=&=p)Yu96=wc$%Iu_~`zL@1& zjhcEFlapjv5@sSW#fN=iI(;EOT1~aX-ISw<#>9zBi7Uv@iKcqnm!%(%jy`B8=f`0* z15>Y)vmr@x@udCEY1_J0O0#A5cHKg$N~I@*e;U@g6GCT!_ghk0@7pZn4-iK|eEM#K_Jl-;+;Lhh%tQ3hc7!nT;4SR4H;6z!$Y zhpEb=t^&=XkSKWRO#ATifGThfqL?W47=`g2@erTCiDaV`Dt3f^-!Z`RM^bwEVYHkVALf#mlC4pXjwxKOOg2O63v8C&U%Y zqa0Tf_Y0Z`Pv9S$xrL8hgog3o9Bv|c^Z`}qR9V7L$>AS}cy+JZYp znpKPLQ3EfZr8*CAG)z#@;Ns|)To}ATdWa<{WEDCm|a*Z9X0|Pt_)BWKm*A9eX;vC+UI5Q2~SiKi4{IGO-#Qz za%KGnq-@c-mrfAKA9(O*FO|%P++SZ?AJ_1BuNo&AdXw+iwXsIzWj|Es!}AW)y>^5V zJzzQ|fFH{krzqLF@}T&x=9&I&@T&7+D8^ZEuVzLTtyzw0875u#7*@?iQv4(JsDUv(T@krwQ9yR|Ob; zXh*ytEOSOsqIDayAbei`Kz3% zI=3U?LQz;G?WBCh)kAR(ANM0<-bwQh?WJm!0;7zqncQXA0-((9vF`LZW(mK19Q4wFk|sAdHBRpk@p8ls4>^Oor`;dU#6O}k zr*i=j;ct@dB0NY^Lq)eS%C3d9FZ-g#c4bzW8ukmk z-_{?hfp~v=G)rQ6|LY=oyOH|s<0*$%q9%!sdcH^U`23WnN=|GXs!N=h&3lKThNO@6 zi{V)!KjHO>*6@BiEBCLN=ae=9?XLsH}uOhd#6a0UXujwVtM5J3; z>+FAz3Z+1u^s9CFBCpz2;Mbp9J@GTSVr*l_b93+Ixev@oE8G^}8LXJx6XGjcrM08} zy@_QefJ0kDX=hw{82KG#a(}qXv1A7CLzMT3t5o3ar&ROYr0@0pc(RP@-&0uKEF6L~ zbj>!F7Xw%$iZ3AgM(Ofvgiy(`=fa99NDCi(Qn*9h-^)0fcT`N0AK7NS|1J?n+~i-P z0z{|iPGE@|e+R_et8M-I)t+P%(>^zZ7S~5gZj}FLK0jfvu|~l}Qb!MJ%eUtO7~(E* zSGDTR7HzZBQLeo_Z;Y30NRaXZCdqWn zf8WUmpb)5mG3)1l<%M2fV%+vE^9~+6qsV+Oue;<`xGibmzVJECIdZ4Kat(R79>dkH zVzb_{(IHFMxY|$qBk2G$gPvj$2Q=}F5f8aC^!dVUK@ z^bhO)=g20W)3vp_0Tov?!NUL zvWd@lGI4x=4jbcO+8b3ut~BG#xd1PLb>IO#i_S8CdgztE=-y8EVcpjR51KZ5XVs(c z-ztg(1q?%84rEFwrrlq)%^1 z*A;ZzEiz&fwVE4dM&GgpFH;UDk7AgEc}?O z+OZaca!*|CwzQo5$V-dkn%g`tSqN=>VcaClQI}Jxgl~@H)4`rrcJ6-g@1)s#CBXRr<(EfDR?EKZjPCo_5K1Zo2+RA; zmlkeMi>x2(X2s)-y8Q~Ukz(d_86K1&Av4UElE2#cVuV=W)`20-&>!$OTDYsvGdG%M z?WZSc(qK$U7Mdt^|H{3Hu;}(@88AZzeU`XDEIDP=!SIW%<@sn{#k=f2#%Py(V$CYx z&Sdfv0;ww>>z*qJNOO)A#UM z&6enfY^P7C9r$pb6U|7Ip$YQgQfv%lmuhoK_{xpJo``LCYGeKvl90uPB(Wu0@0K7( zD;H~Hxi>sH*1UXN*e zCfC}^r&w*;qIaZJ8rod_)IKS^Ts1Z!f?>01yxYaoZGxy`togcdvNA*VYLzAPm*&nz z4TqBoMvVLw0Z#PEo!h=<-JQkwjqSHmpj2qk-R}AA<=5nGA4#6-9erf{PCirc z7UU$pB$XADby!!r@T?uBTtGZ0+2!FUt$ioQDGYIj9lf634pWU~Wj)q}{|q?{!P8*o zeEXJmgIikan*1+bO5o)?x1s99=hZ#xY#lPc6me?%c3h-u|6}yxGmu!&$^JR#-hrU@ z&0^W1M8yD~{+Euw0e~rVCr^0jca0xSlQB9EqLvcaC`XZfHPqU`LAtl>q%5uj>6=Bf zPb0vyI^wvZePxXZ(xO8Eu!{){-2>T~u=^e7yEzJe)Q7%EL&n|h>1;Y)U)VBw_TA>a zIHNHxP2uZ=ELtncLNWtH;n+7Iu)VUFsea0ixHpS%l+)9v3r-}wcVEofiIRVxt1tMp za$ketI-)-3H{nGLreu7$f!lVL|B@M*^|ypk?m+AeruY)+oUM?KKR5z6dz@C(=6qYTZSSDQK(X^G>>n%>aJ;Z z$3o=yj~;P!PzF+Sn*p+iPt{$GE#cISvZYRtI4cJqbAwv}}A89!p4Hb}i zK3KE3^$Xx8Cb+Rsw23IZk?inC#fwcnf@_gMWAg5rgtv* zp54IkB{CM=Xp$ZlmLMUcJ6W9QRn(%BIxmYx>9M5EC7N!YHd%ar+;$zA?p>pm6o1q| z$^H{LQ}54-W(+)P)`@P2-JjUM{(Mvs@vEn=dVPk@;`He(@1m(%4q`l)lL~ZR$y;m>hpSPF5-y+T8bX*TfL*Ucbdg$a$OaL8J z)p1A9!Ldz@pLwDed1mQ*(>8RxZ1xN9{A$xh(lp-wePso?4eh$jj3@1w!s4TU1X4Ui z#O=|~SPQK+JgU7kP%YBQ&HV9fnE`CEHB1>oZ&B{H&= z%E*Ht4|(4R2Q1!B=5D?(GE^CJ7pZ&ES;aGL#sq(C=~=s;fqv=}i+)zOqxf`Hf%^1} z-`$_N0?s~IWthZ!WQLg=RxT#pt%6js2TQ2ZRxcSqLe^Xa1yM*XFqhV^Yv4_Gi3d zRgxg_XE?Jnh{0FGct@`+Es@*I>@!|9z5RWb;Cd5fsg|k`gK;I?H}0}vqGkH*QB$Kg z!(aguUHkeEG{F%n)WBjf*aK^oegh_ zit{VIY@|8_`-YV_Gj`TLyr~i9V-elm@Ifj zMz&{akc!@IP*I_->Q-PiTUx-urQ~>10I!VrH4C?OKkA69*o{oNZn-Ocn5mc3?~oLP z&{X&Dd~L5B++X`pJuCaGuitwcnY~!OO$o3_4_kRJ5$MOjna7@$Kcw>D+-sHfVRTqY zVi%arM|v++!7{qIV#xf5P@-Ke+$j=MnmwmlJ`{nOc>Sn(@HavcjTatrC3msqsKE;W zPH5oFvGtx)zx>e{%|P5}^>dSTG`I43S-b7b({?K}Uy2$xU&%2I0iO6a*i{#q0wRN7 zFZxSyJ;__^B0r_i4h@@s0p$WZGL$Rk`D-}fm`X0yHBb}dKm1DdY$L?LC?I_GJ$#3>h!LkM=!nG6>B&Gj2x7_ zn%Pe_g?kOmbRS#$)`gKP$o*K7e*Uva+-30hE62Z}#?e<`Cds;Y^+=HD0=CpSU&d>8 zmhX5pkfVf}g2g`{I$C6q@&a4;Gv#i4S`2MO4KWx017?G3kayBe4OCC{?3L#~ZfFbl zLwibkh*$1Ev?W6cfTBmx_2r)gK@E_Fst<;`5W=kU{EYY8$e`{*1OngR+)*iA4s`F2+~5oRP{dd)-9c`It^!6!$` zcgR`QW#stGni5$=i(2RP8Q>GuIqQrZ?3VAf!+F{8&|eK@ocopq={|mL6hzC3;z!%; zdgijRKN*@fF9@XY#hVkzGEQ5&8Fl$#=n}L*gqjbIYtepM@S~hbW5yJGJ;u1J{IPFm zM&e+B<@N_T_;pn^)DjRPsTZqR_hkM2{sO#|^uz*FAlB8l`TcO6B1x2C=TyHANxb6D z2B;$`&6g+=`VQt(lJI?o{znEBUe5L#R3_mi4Rc{Q^-KEm!^)UJ7vfN6m!LDwka6g1 zyQnXn(e(2i(-A?q?U!cu3<1(^#jJxg7Quyh$1aeF={*bThWh!+uh`RPxWCNGHwG1|B3oGJ) z9v=0uRIIska7*cn<^7>~)tR1}Ck4-G14E{G8lC?aku1#-UHj`GbOH7^JOg6Krqy9j zYz|wn5J7T5H!uV%;%;#3)Arzz;d%TT0_qA~rc_3<-RA}-g#kb)<}&MBX1n@fvSWhqx`j>iJO}PJP1a zj9Kx?x_Am=CBUdtGtOA)9WLzAo5>HjeO?vvTwUU$5D_vj<}QS}VK!ubZ1P}s;p$Ql zc}GU-bfiWs67r}rdJB7-OW{zMtjc5UqXoCTL-ge(YK+8WmfY>;N~={diFR-_6<3HK z#s;35WK)}d3RdF#0j>zOZdLZLp4Z%uccU(m;aE{TUN0{}WO_!zm-vYFF>o@CGC^f* zJI$Y{^y_PV6DaeX%bMWU*wVQNv(%Vd&Oskc(xN)oh+ z?ImxxWoQDS7w_SguCZz(J4NqLy7&kRMVI)pZP0w5knKqVHMy0h%@t)-P@a#>oP8!{6p@w4YHt7V_io zt&skUkq_LAUzulQhKUwUUyz`y70Ab;F2_JVv_)kSk_`*pT z9X=YemN>3U9TQ!D@vkB3y?1~FBRj|qNN|fp;$oO+Y*~9@V*g)sy>(R7Z}cvT(jh6` zB}#{M4Bd#Nbf?4+QW8UlNF$&KNGsjl-6`D+-Ce`XoWbw!+;h*m>;A=>wI*2aXTLk1 z{p@Gkl8`ca-NyDL+>IH8yDevl`>_&R{h^g#y-ICo0{S02*gWJ8oPRbl8BEfaXSlbI zGH!o^Q1{YlL?l-20>gdzMS~kR^cD)WVNbjA z62uln;>T1?oZtG&R*vq_a7oZAnGl$0)d(%;;IZpD4hE>kZ|HGFJ%LP+uWjS4>t-X~9X4M$SYpkdQJ7oerV_!+9+gDVz0 z>2VqUIC={+9q^S%Zkh3o%^zHhbUSKkr9jxxY)W$_xI{881yL5_3Z9Lq8qfe9m#w^P zq)GeGOBgffVV6~^r8`y|r9S$t*ul7%uYRPLCx-kC?rqeT%K5HsbOO2=eE)>On?J$d zV;YDe3j_j@6wVyZZI{C@n(1HwK?H8H%|(=vjCav;^-vtd z{a=B!_G`c}FrRz8FxFDfDMIkdO%J+6mUv!xyS2yyVvGKknz$%`q^E~8^fmwxztXRV zmWU(P1Kp)hX+U8w-w=Tsw$o3W28{oNc&?L}`rys(Fb?JRW|O)J32^oEe`&ezCBC02 z50KfsUA_4$?X3qjY@I3gSO7J0K`JnSWYX_PJlRkDq*N3zwu4Chx800$xHY}oOcOy5 zM`2seJKJh{cx8rCE8D*>N*Xk_pK8i2Ig%va=pOb;?ZtOGssAPtQAnO$=n0sH`Nsc~ z{b-`!FH8FEex6r@Yqg=~(HeW??_}dD)8T1#WF^+|aRzfy)q&;}gZ&F6$= z9efq?W5c*cih^0RX(g2>o;64t-QX_G#rPnBf*+;eI((n|tv_O)Mfj5u_@1{o0{tB2 zWMVeq7`W()sqDc;_zqXGW$SnifjF|@@zo|Sd!|wg9ug0g3X>uF@86CXr~Osx@Ydy5 zzYbnE1C==gruD)y!?ABCr`*YWoS|_~2u}=ac?=Vd%G_$;#whFAO&{w>Y}9b{!P-j7 zq4Tm}rnvhj#EP4mt7V0{g-s151`P5J_GwHe2IXDzXP(L_j%@$h&WOtkPP9e12*ebU zeZnw%wOS93nBODv8z)_>vgG&?fsr0t7nxMI6Z06v!n}^r;}kK8;0SCZl{IJ=sa3v1 zlvBUMwT={fr^faq>m0T)ReCCzLe9jTo_<*HbRc<`WRnyEJ>7R$)bmL->Dk)%)c=vs zTDHPt*9_SzB zt?dIjPSfU#=B@rDlM~5O{G=m?(0vI+@?j6hW-9OX7zUDKOEtTazuFuob6xA9w4s}2 zKK@DhhR~Pk86Gz3!peexB!W-`Mxzm&d*%5{hKyuG`C@&auV1auH`gCN=niJ}3)SOr z*}|9T*^M!*%picQ)B1jQL8#xc;Iw;|W8j1Y*5d!+FJ@tHuFI4Vr*}R+=D)u-z2|6z z>=^d(#z)E8c}$v?Fw3{+&&zEi8hEk5sf#k>c1Fm+CL7)ItM95Eo0IJ|cN5#u%+IC2 zrv${&__Kl_t?lvZv_fkUhV>_d^#PDuE2kUm!h^M;>;K_I$ZeOFEhG8>H`L#imT~i7 zrr*`~F>d(?EcfpPLHDE=>)QpgRhTU$pV(#3v9wqRxHB57U(a}LOuBR{3pI+(u0=jM z3k5-YpNtv%KOBq#mY-buY(#YdDO_JT?qRmXfBdz%E8(+zbSU74a@l1?t-ZVFGf6m) zkYh$APLWDv^nAI0G!FLgq?EZ4p-SY8mtvmUNrsDS@CaIeIzUiiM_jBH3~c2%ZM)tEr@21q zZy8w3L%WBbD!Kl=?b2>mE8lDk73@A+3Zw8CRQ?j!vEsvdCFDbL!#AJjvChL!f$a0_U&j6}G&P5~*Zyo`t* zkdQPX(`5r72;23AIdYnI==X4R;{U*~X`qjW8L3iN5#h-le@~>1CV>sb30Kk-h=red zblX=`{EITP=!@Z&>FQqsy9ePoH9Xf3{lNNvF2B6rL&N8Kzv$BiI-y}RY;is);BXBF z>rXJg>kLuQw5R)vfze53k=cxWihCCmxgI9@B6R(r)fe$Cl{!www?6zuVr;(J|J`$W zlXM!3imFV5cKd-2DITkcnf6}O|Ge^7WQ699s>HA{f`32ZPj_@!vuT-w7eT~icZV#a z(1PQm;I2Z`FV9XAa+pTs8*wP+yvdsrMU+Kwzxy5#YdNCncyLwizg%$SoHb@%Sgy3k zfRKkn*;y=PkVG-4kS^=WDF4g+vti7il;cLNsrF^{@%?&-B`L>0J^?l8{q_q=>>)O& zq2JNeW={{nSK|KDPDkfSnzpm4f2~R)vicUqm*=Fz_V(?Wcx^81??qv*hwbyVXSt*( zeCn681-+_y$n0Uq4G*a#yBhyp=H-h$H;}gM(H?JCA5#4%tV-e34|#y$yF3Js32syQ z+MO^B5z*Q(-eBvRWHV_NRO`)TFX29c4o#lw zNoQ%oDcmUiL<5au9Y1i;7WQOKO8g*e)HiC}gGZADJAVB1PbH*72*08w%Xm@Z>;U60 z-aRJ=3xQBy9hK$d*?nT0+0T z8y`#)xcW>x_4jI=CYXAx=h>`}D-C<6@a8wFrSZJ2^T#ZT-2ZbRPg;R?LIswYUlQcb zelCm?#yTLSDsdjc<4x0aeV>zV{AgKT;O{Q~`!P|O*_s>}sz23doW^62NOxM%jUP-9 zq=oq$cWP{m{?3AqK+De%eKX$Mz4KXS{BBrtIbIt18x?|DB_mE7nh2`6BU z3T00+k7#9#nPzj=kMf)X-lMiIhMU$~7k6K%q zIf!$!KIdrJvZssHqa;~Ak>;&%adByJFsfYFhWF#ETghDm2@vOXudHF{?^%td2#O3MNB- zrg#u{j%tW8<|yN5F367Y-HIvpGlBgqML51{VbZHkMQo{`YE^{VRuda~OlVb=9K?Se zHp!OKg5|uNM)>?%y<_P|EO3|X#Gwf&9gQSr%#vj^ujwQ z@4R_S7{`?Ng)G#u--;;;WfRL{kSq+L{-()Z|9-9#-)bo;1<|6;S$Ej|zok3=-><&L zA}L7{6_lyJGz#BWp~5FD0=j@#ty0!qhWJZ~$LouYgvnYwHYFC%W*Y%v@4K*v(75t(| zhilG|5V&nl#bj=Lb9I zr48@4^ddHR$cGmPej9tz+jjbeJG>l6NXl6k8HQbFn zzhNv9{`jADq3BZBNt7X`4_V7NPo*kB0|mwe@~kW6D`C4iFjKwayRb@b8&iUXkb3is z+oNrjH&n#WkS&pKz98#+EjiAMmsrm^L8oud$wCB0JgBH!7EgLy{~qfKimPs4YK9c^ zaG(H7%9qCEO%S4gjL5&AzYM~plVr0=44QLp=LuS^9iF2%srIRq<*`a5>++);6g~ zk54&vkh{R_G)-tLErajsXa0fSaO;>;%Jhw}!ia{uw+pojjsaQ%|Nf8VaBSXw+uK{F z*eVi)7D{kN9YXN&|3?;#?hZq*Sn^h}nFj^JF}tkORr$_kFDG49n1rTgz*62!kd};| zemCvzI5h8h3 z1h4G)Y>$}tXjb9zYbGLX{ro%4D*C>m`%zil38Ldh9#$DtG?{+V&YDE z4DgKDTF5a)C`Jtb0ohbidu?Kkw|!zAa7W=Rf(w+{#>f*77Mq>N5=QfO`!6z0P}sQq zM+=pCqJ_pbiK)P)dg*_Is~*li`{|a=4Od?QA=Q@~H?Mb_=PrUpILmkKw|!cvbl}~a zfZr>>pdmZrzhQ_!Tl3H-PBd`og#qqIK|45|u+$P_12Ib$==y%wO#+VNYZ3;9oc6{1 zOsz!-&xhb2QM(9|^@~KM5+-`T#Krr1hr)Yn$`@m5AfSD8t>(zQz1q zya645p!J<#?E0HvoMTeq7^E7+Q6?~BHut|?^q;SFUh%U3P8QvlXPwyg3;GMKtghUU znOu*RMu|F)eVAZYX(HSMM!nZIQq-w45p&>b zH*d6`-y%GaPWIN8i3;JuZNHuyhO`eJj4mLI|c|AAs_%}*kgAI{AFe@*Er>CqIY7CZJN9Mbn9Vz_jqeaLEOTFQ zn2&JB5L0Wa?p)`fS*;eWVsFM3+h7a~MCVPYt17B$E^3+?buL<9;_s%nPLZFQ8kw?_*jFF3V~QbR zcC~MKt&ykrCC`9qN&AD&XLMj!^8%!$fdEg@>eYyhEK()#)#knX>B{bR$c<><$Lo}9 zmo=a#o33i=Sl(^k7Be%8nb=1kR5qGPU%URiJ&^5gjE;z*t{Ojw>5!gJrCt5p>Aas0 z|J!TT>3{Ej8(?(7?bz*&2d=ZsO{x+FHJ{w~=jalp_^$6Mj;OR-s$xjzeWRe+U6I38QNbQze3uC8sL? z{@gkewpVDXSasCLCh?)xqfPvj{)U**0nh-Hlg(~)_*lJghSSBw!r1txhxg|*jqmk1 zTWflT)i@}eoFhwJUC)gGZYHLLfFt1>AG(#!XL_4uLn0hvi=9&m7NHKdUR7Xu8E7T5Chu zmmUdPBRo~Vz-R%Gd>y#=+LW)cVH2O_?Wsh~=?a{qSs1QicksPHX;4M^o!w)@R_&6p zpLTxp%%tmO-X386@-w{hTh^zTIm+_eMfojqw^fM$)1%=l3t06(bICzG$?}=m*wN*f zL?+#=V?AHd&kN&Y*8WfhJU}Ha=oD1dEGU8bK2u2T>3@=D>}Nhb2|>SsMgZ!rx8r2A z{6vZl;fnbN_|K&!F@6#}+ZiF#YwnHpkmjxvo6=8osws)?cWG8cR{ULyPjpffrXOM} z^|zFrqlW<5Oi0{{q=Y(qmrubV-VoUf4Om#5jWaks*^=(B^pTxy0M;X*LKg}@uFnE!P;iJPN@A$T%gQy-ygUObxo7U@F>{Q^p7Ls2Ycej|QqYeW>&Uc022A zK;13{`Vt^Fw(ZNcr9+vgiM2n(8@^Ybt_4YdP*?dsZ)suESk{)XPvOLRs|Zf!@)>CLWHiPi&f8PKMyjo@!_HptFePTfP4)rE7<;gh#(Na?Gf z=Y(koP_DrBUq(9+Qyh;h|G8@)zjme+dyai0lF-R@juBCMGLppKd+fYT+=h-pLNX3x zZu6qI`TR7)_DWJsBPo(orR-xNj_H*YB@Z_rIaJd#T^ph)0iByV(zj+~!rAiDcx7GW zJwJwBs2>u>cKp_G>Ri{TmIE&1y^wCj!pTR>d@&b7l*k@vO@@>(oR4Vq@-@7Qr6S$l zMV<84tma;C3_X7RwlSr85jz`X++$v1f$x>MiTQSKahWSwNxB9Jr=SuZ8nhemc;&7v zP!hNrssDJiC5$9@DJX&fa!qeM(&FkKIEk*^jo^+y5vzuw)4id1KZjWnJ_zmwj}d>k zAT{Z&mq@P$J+`k^13?CLkP585x3qT;ubew0JoJcMt-Q4HS;KUEW zYsdBrvda69DV&eoZ*7mX5`!Q&g0lvXi@KoqH39=`I?b?u+8Or6>r9RQCfz=em!czg^e zgkG!>x~VwyPc3P>uHLBmazdS&UYW$h0$+3U6$c~(bfta_j>yU=LKx$dD#32iccayFq57+ew(6 z|L(%N2&a$NEq>hfzShz)`+TuzyVLP~(rJ2jM(&UB!_Cw<*dm3T*f4NJ?^ zf4qL>%qmW6$G4)`UwWMulk%6&a|2tVW2}1$KWod_2G2h)%4Tu<<+_B?*?gFOeCTlW zo#xzY5zK{fW{Q2pC|Hf;hy^zQ{dVJCucU$|SrNPM@}+@Ap9giXfR&*ug{nDR=}P!^ zjs=NvGfr^8E*5K7uDjfuy@&JN&Apo{X&V(II`kLjgK!z>8r1RtD2vN`_f5MfJdRkj zg3!n6eo<@qNL)(Z)ladb)oM4D*tf!OO#(8DY-ki!vY08hR0qE@ZLbm6YhC8@Ll0e_ zOkrZ?dLx|ek;DLWFAPd^W71FbjSZ8?w5DL^@pOngsyNF(eru{<9%+l3saAeYsI^eC zaN#ytl~08+QsPnd!ngWzgtxJ#6kvM0PsqNid>^^4tW3k9eMcy0e=Gt7G&hDj(Y95L z*euQpI5+ifKaLFPYkRzbOcADS!EKYTkaQL{9BH(=;zv;FsjfayWd%QmNsi2CC>&{gFq zNsbHO+P!!0$@0;Hv@`a27)#2>w#wOb%2h`LEE)mdfL0T2nx*Sa{1lA+RoU8T>Q+Sn z>19Xh<%s6YobFQe=D?(;%QCYODWxIT(e&C~tl(}jDadlBHGFh^#qwFEg1f#RLXJvT z&!p-bVIOq9{=$u1H>5a4+=f0gxg~E4#jl?uPH5-G#E^*oL)9glcS`1IK*ud=>@y|p zuQ^n-z>klB)pPjkPc-E+4}c+%>f-%)9!m`cja)W?;p-MW)G8;}ROiY0zV@o}wKLc&V>S&j%D{wP~>2NUJl0W5jQ??Uj(WRJi z&Obl*!m!}M-gJ4E5>-tH7Pv8cGcPA5#ggW&8Bb;frDez#rgtGGpd;5C zg68{I!3Kuf+ddjP2rn%z-dafmVOtXc1`8G2VTN=lxvR%Cbw}-RH`-9MzMT(C1ByO1 zbN~5>mArwaWgdum)cN@W}4o=`0j2Zn#UBjwqsU51|%Q zbsQ6q7a8$b)}GK@!A*~TRXVjlEC4%u-!h;iCC<&4Hs>GY)gI`BB=^rsxTl7?~D30TCDMk%c2Qt8XT(iyP4?(ETh}rZ|HA@|_*^KOeY+2l;OSAe50e9L!r^?pHYvu{-Y#BADN z$!8c5Uh`Q%W{prm=Qnp~l{4s>i$n!(dw~W4$9|z^dl3bQ6b>UugF$jN0ihrn zgtO&WhwV`R*2uJ9V?O?q2$yq{uuD1l|XoPr3qaB3tFR8$o ziKW{T!g>><^Z~R{?JLTtlsxmB?}QRhT8-2N%}MHl`tN8{CrO;a$q4DdnPns*qi6Jr zsb;Sz%@>NhKDA6VT zd74rgG-=o8U-PmrUFeGcUh16Xj1{l(E3h;5yDAQu=Fzh-(l&us9Hcmqej}nt(Qf8s zJ$0d^MdzUzDELCR){Y06aLszA5l1!~ipgbw5UZHD?{XV-4rmFTphLg87zQ3q4#z?t zZEyW{r}eO2J-JpXAUJVO`ly54iY()$N~eqXh%RjL^P2qZWnXZzOw^?`@#i^D4iR17{HY~>x z>#Km*Nw+iCfJ8ke*e7p0nQM?P zY*7bgzqnAZc8zB8pvLHaM&iO|lW>!&c>qh+V6#d05wJJ->WrI~EkuajfMGRld!AaE z96}iphTIr!REnLik|*Ruz$69CR9RefbmC({@z!a18#rw{D<+8HB8J81j%lMpQB#te zL^nS12GrM^BuJB!N`K)3nl@RULBGHrjFRK)iuL;X=APFH{pV`ei)g z0kJpva+D3SGs(t+HtoME`o@Q{-1GQ03+CYKXKSCc`0Wz_IWviOG?h2gxUNF420G_q zXvDq{2R~t%4c1vdg)e1+^=B%_;j^q5r^(P>(A{F46dLK=(5#*VW6;!67T>>0Ch)Rn zz|c;gv>|5BTrt_|a(^&E1K*cullMA0p^y*m7mA4 z%znP~8K-Tn%YyfgJDtw()xQ)gwh+DnlewT}8_8?Dg@NFZ@>P&L1jhHpUBaY4FAI)( zhVwR_QjY!u0Xqu#y3<;SA!L(Hfq%S+&zas^B)Sc+HX6ZFL{^9N<|ALcdWSR_CKw0q zywxwzl<}y6F|?EV4{j6_0ymkC6>To`3^3fA_kk3&g4;6JU8U+06 zWjr+)#=&nuztQ_}zp@kV4qN{vSPMtye7_hOw!82Zop&NwZ)JKF{wv}acD>2={Y#8P z#0Kaq(LbTbJn+XPPs+I_ynRz>Tv@Hge%71>*xRHA1v|m>k`2;{7tdc+YbUBmmmsWY zn7dfZs+gTY-4H_~fV0N1EZw+TvUuV=o+-9aQ5aWuu}R&TB?~$!5Nxlt%q9c zxX)!AXs>a4e;zGlIFMPh8YkT8HMA8}K#qwI^ zU-82WPDx#4*E<$RB=fO;Un1YOqB)?HsGSu8NplT|#VcSywyIF(+=& zsD2p!aojGcdJvNQ4S$!bJyBY^ZT@mE_~Pd9?(BunJ@$}Nld;lp^}S_7jM2G9Sak)y zRo5>+k1-Mfcsj9&hhdPlx2yGxZX4pbW>;g~g|G=5G$J&5Re{fEXn`*=V8bCy6??W3hMk|=VY{a4@diRsbP2Rzwr|qBN^@gBphBe8K01B`I56}lD7PVd0Z3iF~uCeH^@4aO&I5hTSTE-T13VN?eia+d|p z&Io6p=BI8;rNSy_sYtcgE*qUHWN~{8;dHC5?5NLqV%q1=h7a@DZRvf|QtxQYSD4ic zTj8lVJpD#Q{J=^{)RgZEU9@G6nGLlh3)7?;Rz#C4;fT|S- z?FHO?LQj#7q`k8m=M}^&#ZG*k96eMF478J`LKw@xLrXV&?p)FJmMkJJ7bSY^IHdd- zhG%;eaIfVHd*~2IFt3uC(-8B$`S^lu#L98o*Ttg;y(qnY=lD#gclS@O2)iOBV%8!l z@wVnBUnlE$;UOgKUvPG8Auoq@3zM?jI!iRz!uR7qc%f@VYcbNy2yC~!&b@CsksrjJ4N3TEZ>w+jjuWLSpZLfhT2JFAS-QZm1m@y;28<=W+ zexm-^;qUfGK=bAi)iSz^@ww}cbmQ+9+v}Q{j~I=7=1-R2>NjhUh3kra7vu0FNY2GR zpzmUzy!iA5X4_>Q%fG4;n)b;jJL3n|GkQ9dS1*FVR&+}dWWl-Bj=$uLak;WldwMN5 z#7cMibUGqL6BH8Tn7@#tvB@NQIFb%FcJv1^fyG{YPWvttr>fOcrrABG+q0`2vS+z} zBZL<%{k2-Sw^@$~z5i0LX*)5{>HJu1;D#}mmW9D`SZS*Yi4y2ibgb zL2&8%GAWeXBktl|>Ut1Or738Qtc!@x*8o}!pMc+cqq5iGfKa5OD3yR6qi+|f?CUpO~Wbp=k?Hf*v-djWwyTreirzKv1j0Mle7Yyox5Nd|@<%3h!Mndx2$*ecPA@>SmE2!sM*wY%R^j|+}F;%j|G zEnlpssH8fg@+|e~1ov8@BZe_z{Mi_qPYKa}VNZCF4<2CgeRT^D?zF?B#dyrc>(7F^ zAr*J^e@h{bSKZPIZOm?KyUyS$x&CdgE^vzwQW!9|A=^tY%(x#nf7*LiC`vWg2y;>U~!dNJfhZ_`0Y zvl_{v9xmR^G5^ULv(@YN$d=EoiIGonGP$LaZMF7#gEj`PehVwU%__c!U1qbHEsn#% zcPP1n?~sKtxHNitC<&rEk&3Dn$9UG%EtPoVPb$Hz0l|U4u$_HX={nO~sc{N;4Hc<{ zUlUBq{Mj)Y&2dJy+En8vLBeMYCQ0?0s0z>N-UX3ub%=&p3SCJz;IeHpmwfdm zNUl~P<$L8$9)ngfNJLgr5%0SV z)z?;t3`rZ1&gXCwa{Ab`(h3bDdcFh{;BxaZxtoV(G(l%TzSgKcI94PZtcj@FCNz2^ zw|9kcyX+ZiOM;-sE@#dV?ngr}^y>tiM^pF$+Yz9Hy z4%LrrO@kYt!!Md^z1PM=YSW9gSAP8mtC%Ble>Mhv`E9PFLl%&8IUEwsK>}O?KHdPj zjQKw&U>#G=ywx+4xK9_oiGc5~ErKAuT9Dd{VE>?mU4<+!^zdOOWYIgxiQ*b59QjcE zrG^-xMG)47ZGlGRQe(3J)gUsYAN~lh0R~(oKqpV3fE!x?$dA+KW}Ojo4uG!V_Z524 z3oF&L+57xC2!c`*e$3Up6FtC8Sz$t%gRjb@%LG@7BoYTt)-Q~vo+(;v63N`0&vv*~ zG;mvvQhO8BP+&N{jfNpTN_6eo+TvS|Gpx3lR?70WjESY+gW=Py z@B`@X$2Rz#+MzgLIsir+5zb_GhrLtyt8^T3uu(aZ>y=FTAt)Nn{sOTlDv zBV%uMY9wnUNJ3FH|3%FF5V?tw_};P#m&AbbqFk)|tI3PSSrr4XANC~(Ev?VbKkgCIjA0rm`#;>1 z0`~#vK4JM)GtC~NabiRHVe4Jf->?UT%gUqc*q*++>M&sW0q-*o_&chfi+`k^MGe{K z*2}(+qKceB3cA=#<}YMj?Fn`VrD@PCBWdS~4T*OLqE`gzoXz;LeBZqTGyjWoPL!!F z(&W0HZ}e7m9c~IP`qHPR!*BhXsD21c*+&NT;Vr3Ww%6F8HyvwBU98{N&efd=^c8sb zGh!<8Rz#0XhdVWBtRu5X=%&WI*m(2~A$n0=T`h(f7vvq6`@_IY1``I3(J@XS>_eMv z7IaS`wpZ>y8`00U`g74@eX?5rlAFp4Gi5Wsk8SB;EVy)6x5NbOt2B+f>bM@#ku6xM zVL!jxMT^E8M8`HtRO)y1Nu%ig*c;zgaZN`=g11RgJO3pVT4$sBT{nY7E2Si+Z`SK4ji8(wh!Epb3<%XLJJSaZXF(ZEpfp%NV2!J`%e zOLsx$;&^#{F4$fJx_z1ALm4L?Zb@|B_zEc)*{eJhn03G__ zV?@dutK(uWPypvsKglWmDX{@(qWzpbU9AP(0%6RNaMPxIv%9;c@O(WFQd%5I9L|+z zp?Ev&SjSEH6qAtbei-LKRzf=o!d&itSszGQ@3OoGaY~1OJN4ZQoQMc4_otoRAx-Yzl_YeV zuVY&BAn-wGyCD$UJIi5-M?VJk(2&(1*9FHd%azo6q4huU-}9v1dc-Lw>=oaxQ`!{>xqmRZ4f92%_|PxnF4zJT*O4MV=G* zU)R;=HsheDPAZ-DSl4plBxj5r68U!~PuaJ@L}tfB>5O*!uU_;D(Jm_sk6X%61y9(F zD}TLa4`8>ZVVksh9}gYrg093Je|yZS@9)h~gSNf%g=0p5rLil26-x*VI+(Q(s!z2) zfIO~f>+u&pUn3?+up?h+*Qqtcw*|Bv@;n3E>iIa2S%#IC5NF`{xtwbGm5>?KyFj|f z0k<-Ua`$6g=2(WxQxA8EMQ#;A_2ZbiJ?PZlnC*x~EFB3nuY2T~P&7|)bzlA}^G_7sDa8xFVqlNI@qj@Ewo0&BTLopuoR9vZs@DfbP#ELgoB2Zj9ZbFO6^ z-r}qY>%3Px)Tw!)eK+C;&Cj9nAZ+{GCoz<&j$_c%SaubrJm$O%@7d{dq?h6}*YZHTkM!@8vi&LVsOWFmQ$NCoUP*-98mpGH;5ywi^y)Uid&45r~3OGyV z)|1|+MdlSf%O{2^yLN8`QU@%Io-fYVG1P0eweLx4Es_Jn&p0Lg;Q5@_Fm$mim@mf~ z+{by^B2f%)SJ>JWyR%~5q2M5*E?~l|eH^7PO8hyBW^77Q&7*r)GASA#3Yd126Hh2- z?|lz=!;?!~54G-$x9u>P60z%XVR^y*P?EJ1__j^pQP!<7xl=NOvp-?R#wv^KMmb>U z^9&sPfVWk)hLb%P)aGJB#bI=USA|X)d&)P@9mL0SXbL?w9d0Qok4Hozj3lfcj^^)pt5Rng@VqyF3zh3olv->U4k`#$4@`k{e)$?a@ z;ORiTkgn=Hvo~Fr8zrMriI3GY|*IZ!PXAcQI&%6d(u)e;Tvm@Y>7z{;L#%_~|^&Z&|Z zHawhC%ZglnEmGG^$Z#`o$3-#3lXADKc`D~$n)GbWb=V;_XFkY1Tgoysd>1YVfJQ-4 z#ZX~aAV15)-o$Tlz4k2k<6D}|XS$zt$``sq)Q<$==YZOA&|NO$c#w;+|9ujmy+X_& z@)dmqKFdN`^Z;AgS~XVy_;d+6-UiSh$teW9;D_x}^R!fk-GUI&Ve~d@I_uVad|w<6 z7SsL-Pj{1!_X=?l-OFM!y77P}g>`zN9V)`thea$-k54wNu@BSzZ%zA%tv1R^J(qBc zD>~N2&{xvj8d2wBa1`ZFx*fZ#Bl8t6%45nuwIvNBl9;*IswfL--Wyfr>6G*Tq^9 zp0fSdnmKIP`erLpCF-zNd%s*dksS4trr)+suP)V8yiSwmJjR?SEo0QM4Tsdc0bdYb zAaGZT=k~;L;opam{Qq7|b#Q)*&|$XV6^L*BrX-hU@2#m^&TV^4iB}pBU$;0S#(w$0 zlO4-n(faojuglG}I=f*&eZIrLwp|ksr_bnp)AdkuN~4Dtg9SR8Sl1;WIxpN51jUHL ztxkDHKVTJm{`~Vi5kujb^Ar+&1MDn2DX5c;?ufFzjFXjXpzZfRpOK+pLVCV=Yi=#> z1!+qPN+OgI*gIC$ih;*<$ssN_k-1whqT9=Qk*uQi8HQfI9#pACTXv+VSg3`N7l69i-8;nr8Qm@S3 zkbDG3BiCot{+IkilQ_9*+?S^VwOVz~^<2g9NNnS5lEqah|LafP45y?jGr}xt?N$c2 zLXdHQYRH@s{@8$~7krm*(S^R!KX9sS)T3N~`0v{?QaR!{Z_y(nQH`DGab4)-w^uOiQYq%e3N_U>nV6H?4t4&jvP!?n+qNqGxQ;mk>QK-^Kq8?XN*E}s zT&mp?cb{b0epd(?PfK2*UN~{1;=HA_*^FPWIgHJQB9l>hIruJhBGM(vomF{piciGx z@AFWG0S5c=FPVe~q)E*Pzd~HVAM3w(-p)3SzQjIZI1-fLsu{qE*&Gp}DZRaM_hX)$_iUC{QIUK5@tv&jQ#7tn3rjXM{4AgyDKx!Z244Z z9m7doy1}qK-YL!NQdI`>%i|nfpjlsEYsLatX1zQ8cYF3G_qO>jyxCrFtRV3SF%o)D zQ}WqAjHm8EF9O!Quoq)9b>V{p-TpodOZ;M45`WuFSfVBJ9$^4nXhe$1r=oKNN%N7a z!QvD^Dt_91j!0sYaJEFb;Lmw5Qa1=13(z=Jr(XJdNm{(>a-@+)eaHybdQKcf-1w0A z*P-r*F7WTlu~+t2c7Hk~wmS+1mCoM#s?qUrdbDi){NRqZW(bXS?DvSJ3Wh73ZaUa< zFt;bYyp`FS+_xi33^mdMN4+UIC_n?Q)Gbzdv6>B!asp1hXwHGIEiBfx-{k@-v&N`A zw7~vfcocaw8f8&LGBRt;nExJwjxco+aF)?EJ}t;Sv^$2bahX1V01|Wl#aEye{zn*0 z34YqY+XSSphY@w(eu)Lmz(eulVTCtP0Dh2I(sS|wpGKTpCE;MH_#7bG7B~kK^c}1s zAm~o}V2TG{oD`c)lH5|sX@0Z_8kE~(9l0LWrQ}NBh!fs3wWbfL4SSG8y*Z>UxhQR$ zwr*SZ&4TFM`~5AlKLv#jynJkvfon}%x=i6UQMAL**;rh{&C%ag;s5L?C{jud47>ti z{xYFYn1T~)&N9E%d1yy@UmmZx5661rFqK|(4wsbqVEqWNb0OrLf+O|XPl32UMJENJ zSQHtDquX|!lP7|#kf6YZNz#o6mDCn?UawlI10G+O%89d3dL}%b*y^AHDZe1Y$KlUER6Ds+?Ul?IM zPk2V5^d5$4F<~4|zUKTxr3Xg=Ll)_Jmq$1lhXjKvDVp2;!=Jsq;n z00m-G{N(4J^!3kHOa%@V!yP;!vP>rGR!Ioc&`6!|oGpgkM$KbVp!=uwtB91M zYgOPM(S@Yyvl+zslZF5AuAUf*2O(R#Aj32V6sd?gZ*94pa$s3`pjXM~gw8mr;qV63 ztP%ugrs`?G*p338qo=w3GE4kH9R2%+rOLTD+J%kPZNlIw5Y83mk8dy*MRH5KFINDx z36|f=`=H=tp74UN%J4xCHN+-G&jhO@?TRVxyhXg+`g~Jzw$@lLC7Z9to;(6l7_AdT~q8bC0@(@xyA^ ze`aLV`eoax4T$~z>$leZai#P{29>M;p#fFZdm7xvb`J@VCXaMIqw}= z1R$JL;`&5@G%_+y-?DjUy~NvCUkzY+5qg#NHfL}!36|7-!K$1HE6oq3@9B+fF1p(REVhr(TrB7XES<%6Nx_|jIpY(-WDtrk4S=0OJA+GdMZ-MpC zx%TDto-3>sD<_MN_Oot+7tSBj3b$!7T8!HEhELE`c@qL%L?lrSDDA29cpWZwx6@gn#q%(F!*82^`f|DPAB5gqY3 zUx`BWSu)JN35=pHFZp8gq0(xzzI#mgsnR`Dua~pE7XN!Vu)#7)EC8|T;;jiQ2?9YM zinF3qsa-t-oX8Qa2pqUzO`-_~H@h+q?I#^ZwJ<*27b{xYuMk_q zLYo?o7@(#CUAswK&@8>J7-%;ECdxIyxk>tldZF8>vl6r*v&P z1VN>{K?F(Z*fb~|0!j)9Dk&}9-L*kFq`PykyZL|TJ>UD@Pw%;Bj5T0y24k&fJ6J)?CAH{e+*TczV2TEe%(w4Iw}j&Z}&CtlfWr?yG_ zznVUFT~rY3M%O5P-{-_o25e<^Z}vIvO~IL2UzElH{n7e>+ou3jqi}8Kh2J1mHl41o zqOnus$no`yT1%tzu3PH=_n&B3P#II~*}nzie?`ya#k#N{MU&MHyF-9kmSgMze)I1#_+MWrNRb5Y#7r^>nA*O$A|Va;js3z` zk&|9ec=n|_N1vqvVK1>UDiKmOM@Zi*&os|7UdPOQ0{FczcH- z5Kq0cTy7I%bH;fUPrEd=iciCG--7+~xHJ{k69v@S!+(_o9Z&Pz$B_dr(5z%w&jS7w z58RYHR}7TUEXRu;2_c|%tXm|=DDy;#acr3~7((28EAD)}ulMC;*cY>&wR^%*ybAnE zk-BAF%BQ2aJTf(|WC=(m*q5v9#fWT4D2#m_)I`Yw^l>T*9_Q|ELcFG4fLzB;3=zZOfO=-6*~c+vKa$|?VfE|(H>+24 zT>rjm1@gs_Jqnelgi=L4xh$P^_(g^xV}q#D(Ur;v;FZs#CZrDkMqp12=G6gVZO-YL zmbB-hpO#3y(EB!BUSjV~5ImpChc;n`K>3;%wWxz+9Yt}}TgD-3JT~L!&v$gZ`}Z2u z&oN1m4rOv)l(oqcT&8=Hgwug2y?p(zX?$Ou*Ae76%3jCQb_Dbk(ut|xfMaLYIpOu7 zc~LG^@;7woJ4u>_XJFBK3MJLVQ9$HZiC9=5K^iSeuR=l*mQL{JP5;!D$U!U)!ItUTap9&;6rNGpNqA4i_>9*Z{X8-sMf8^!&M3piS3mblK8E zkv=ZZjiBCb6@2t&QbZty)y3-UY(>dZy>;d9io=2IND^w!SUXH=Ei0d$DDzBwwl>a+!D^d~EH&dye6InAr;0q2Aey2PL%5y- z`UsaiVSu!p-`d@ZPzpsw@0(U}(3^w?mpKCvI=LZ@p>e~C!@f(mhr=i58?X1bV4-F0 z<0??Ao^#QFo5$wHEa$yW>Lyp5rS|_X;p?t*@3z;&m-GI?9x_YD7*!Q?e&$kZ&Vter z{z7PreNw?_yc{-QRe@&`iPl@=W_Z@)eJW2s<^#ki%cjka38vltUM3m@-#AvDQ5eQU z{41XsP@creujD7gIXr($X1^{AgO_aHHhZypHh2y>yFQ89Yj{oXL!WG**fq`%8gR4c z+Dod(_onQPn`GSg*;MuRE;(lqu1T*0b-02EKQN&7(z#!1^6g3LFpe57B8Km^5hY5m zTo|wCy0@&0Y&_12K#ESonvQQoM1)QR2hVts9%9fP$9Z_u>`ZHom~x}UD&ll`CLe-t zO+&+4N{YER1VT40=3UfLl17#GChe80xb4={LA^j+Jq%Z4V$FISUss}d$Xgo6nol*g zE$F)Iv4%K8-$@5#m5MoVvAd{OU;cko zGBRktGP|Ihcz1eq>Owwj%S+#6t2afMr~-)Zwlkgr6W=aJcPn?YU2?4HDMlx>9uSE1 z(u-`#jAX%luDlM}pX_K#8_I-)_qR{UFK&jywU@`!!v#S}!K1%xV<>{GG*osHc&)w# z7h7TuFkSc7_~6J8gjcazVe+Bco%hHJrR=6XOVe~M*Fpi7=CY4VSq4UM&Z4ZIT;pC_vx>lDtc!2m4Pl`GG)3qo#UVOC6Iimsu z%&uIq8+l7B$3{~1R^^WzR-Bxi5mbKVFcH0T`>kIjxU0iX`oq+%d`ZFfU+V~p0>vv~ z1bz9^6%|=G`s0qGjQ|zLxHZvY!_7t_JF!fDr{%2d)D+rs0I3Idui>NrzV?8rZ(VS{ zGCbJz6wF9|J&d)To;hA0U#G5Yg_ZBNB2W={vvnfnYtwSw)Zt*u6duNEdL_6o5%j*| zF*r@YS$~OeW6T4+XS}(^XLgD0K^bT_iKBeSsM-!X-CEo<{d57#rW2)ML*b5X-PN>D+Fw zHt8)wD$}75y_?(aS|zGjSVgnUyCGL&JQd`A>+am0*|xTTs<|KjxgW@Z%nO()wTub@ z(xzM>^x7i8k1ROa+CU)n%s*y=|QLkxL3{#-E!rE5BK7OYaA*GvYB_BgyPo&HCmirbjh~B2OrFa}T!on}G<} zgh^;2L>ETTW1JqPT5%Q%JasEExT-^u$NVQ}@}H0Shre1o;kaXtyD&u?4Tk*o?p>)N zYknd8sMhM=)|QUu1q5vE#;LQOo02IxPdrk(0=oR#uA6=Gw&ybCrY$3-Zy-8V5{WKjd^}v^xf8m zT1Wlw(CRN;sD}DR6|%v{O>lmL-rwl}e?E<%ZAB2jqAwLP3(AC@!TV>XY^2y8o87qS zN}zk2(=2W2{(UIntERE?2G2w9J1L@q-yahfOpM(FO&lG6nU~=4^TaSQfv{vo`PfuS z77_eV*Uo z`c10>HU2|3#BXV1RO&G(jg4%Kte%KP6Ta-e99Fi!>EARp6lwjoi{jgqi0|-JmGEqz z!_DvN_hepfpoOQ7Uu-M=!| z?X{-SN{nQ}w^K<&qo3J>Cprld+fFR92{=ilLG3=g**vqHiD?pbG20{)^xKI}U;o zgee0GEwyx8z01aEOAD@Wp8Ar`{Z$h_(mEfSy?0Q+zD1yTky*q*sQ{<}@MvqT7XTI+dH9zhI*ENcc zv$I~}6F7d8=|?i>zr|txgHxiZf|g0CDL>;HCdE{SbWBZ%3TqC|;aHpvY1?1yo!g6l z6+lFph>>Tm_$9|c7$4F*6#YTcKBPAe<~8 zRd0zjXFi_?BaDtMUUKaRu5N<7RlxGFpH;T1K^k0W5)~71{7pdo013;Q>3H1DxmUynn$hMMJSMtiO?f5j}iJQCN#t)k;{}l9mY^adD5)#GnS$Fp zrRfqx?kL<*R*X!~4fn~2!rsbkxxeu|95re3`EAUdV&mTeElV(_ST}2aes(@$(u{yv z=R{>_sE(tvD>z^~esQ#DoSvSS&e#83Y3u~$9-eJyQ6_!;kLCX-FI+tg;b$>{9B%-^ zLzf$gs=z3xj2&;`F-D}Ec80trL~|ujL+>Ls+46zGwjs2{usu;Dj*l6(Xp3c9Xn$7Xp98WKHLw$$b6v`=sh53Q5qWLOC8#C_I>M6LIwn&)zf=b}8Z_gkF8u0t+@I;w^ zT-CkAq-YM06I}&^o3T&X)_k!dupUdbjWhPAyXDaPFj-SqztuBF9p^`{W1Z;6?%-P? z&s+59Z(Cu6htwfK5rktUNh^2c%HCN2a{K4pE>St_01u+-+Q_!(k=yBSQA0z$^4XVT zDP-g&SgU2>;1u6o`PSX@s3_>uxWe zT6k%Qw*kiR$gmiF8d^fneuAb;l~XV0yh5}L%cV2Z=0tgCMmm@HPd#?B3=)Sn)So(K zz7nzp0<@FjHWFz2Y2&as$^dP6Eai_(5!6W_qK*|zVD))F{V8=2Hw9m!MgG(D^5waO zIk#kkG^dXCvX>?FFO*5;=@Ub=ij)ano_Dl(-?W=F&YoSPDR+i+$PE_m?V6CISoFRB znL$e6#EbuuFHSFH(7;GZt<9im#mX`tYZ8lL7%&>&dhmwwl#B%b!7l${MIdjK;2#D? z6~w`BHE9$+GaF+w=_8Z5aI)z^t!3Vi^*d6B1@Jm&j;P!0pUW-f|4b$ zseki5pr=lLYZLidw=%I=Kp_?I`Y!J{t{eOacm@A3;{FH-bwMaxZw_`h^P>%2c9y#f z97tn1)%TMUA1nh^2I8ZV&q=1 zJJY5Tj^lizom(VJ+K`nI?Lt%%Hxn{P1p1;8_c^Km=h;j%!O- zr=eED?^;DDd-oY*=zDpR9qDIAdI!+Xo+ea3+Eg;8xQu&)#Ruqt9X94&OA&MzJ!oe` zWOB!loDY{<(}m+g>8*6^j%)Ef%?xHpWlqMrQgr;^?9GKz@dZ8p+4F6n%cmR5!5mWh zy7rR^Pc2Vwtb!HSaFAX`dghO?lj7gcA>(2GU(PL?oIZOe`kg~wajEz{^|$X&DzAUN zt6l_nwM+uX3)!na$`&R!;Dvjh*y>?OCUAVZ!af3j#dFA~W79k8hgWU6x_17s=?+Xh ze8z79ddgfDfU=Q$a4D2FdaPFtm7}e^_c@?0)0vW-=bc%=W$tX ztQhvnHX@BDoUXCM6_?9Osn1^(7ZVcOrL=!~n5!&r-}_;PsLn^mI%|A;!>)J7{(Tymau;sg zkVQy3XyDI38*l?*+o@p4#^;-n-*1p}7_beGzj@R%@jTtV5VSO>xGPY+e#7*X>2yD7 zIns|4Zbq#|HZ(8qNOH>E`8n1_8pm?t;D3z&`9L~!CWPbQ16?t|QupZS5qy8|QiMAn zqs?>@bQYI$p|=yKXmP?ouC5q;{@DehI{mJ zM&$w4cuL}W)N5Cp#?Vdcd8uAW)LrS#)>r4@tD$By&XlAr8jmfv#%Q1)YcBV_`rptn z-I|GVu_>!c#;rl)D0?gy_G_U(*yjU^BAI6#JxdU7W%KeS&?N6j9F2!-TlPJujU}H7D-8`)20OAvs|t3};=w zA^Q?a92poHO}^6%;l6r(PG^QLog-^O7O~{SVpZ|tYPbG?=T>Yd`w6k0dJ*KjrObu( z2J0G}|weH~XMy_VgEo46UW#E5SH*j8~3%=BEM>o%^ttJo z-Q;8@hAQ3!U5U(KW7`|<>7{vX7`>6LtjF}oc&IHqSg_A8ebfv=E*_U+$mfD-Z zSgNEk&?_IIV1>V0W0DlwPGweE0S)Zin9M8G#2U6UH@W`D`p&3ll=6ekbX= z424oY0c2EPXesXY%KQp36C<%q0jUbr?OFU27#rcL7b_R3w}eNz&l5|o5!vXpu;}gzIwo z=_NEi^z>HPFlgxp$F4R+B*3b>_1AIjGflVQoU6`Sb3}(s7CibItAnk8Xh5=md#oRS z*AH2EHHu1LWt|Rcd7Jb4Abh+)A@)g)-JufMRlKs=cX%yxj~?|?T>##s1ux&rk)g&C zZBt8&fk{=tgzthb1~PI4Lw{p;S9aXe4dhV)5%%aFH6vxt-s19c-6g~$uiX=9mRAtE~NSC2bKMRde$2UN6HB~p1}_^ zqx%bzYpI1kO)Ji%QK+nf`?v9wd)5ezAxp>dOxTr`Lb_S!*GTAwBADz`pCspI%J1c@ zB*Qr>iXx4S1%%NA;i{qs;pcaF(DP5uP-rVN$T@$A857@K}k<6hxo$np{Q*f ztYMr9cu8&F(9KUgXfe|faCB-Mcx+GM{135?)f^)Qz(Y95kQz5d@YA+C48G!CK`mH83YbOc~|~xIWezdL=3Yk zUuL5mw1?Hue>_7nZ!jvy$50hyWZX4iy$E@0DobNasKUES8T;{BJmO?!`HrO_dYG`76pGi{ZY0^K&VTg+fYa>9 z)@;~`*?VKJl@I1GdfjISW24wchG#f$nxG}}@)jb)wXqvLn4@W7W`!|nNMFU6v|j+X zH~17XEinF0azrxjhT+?RAQajV?mV>2{mV&s{S2eo7r3G4Pt>Y`@n5npZZjtfGKQQB zJTBe@X3-cde;KZ2=aIP{QUmsPu6)C!}6Lw0S6LlPDP_Sp98|Gak$w>4hs zJH%nP;0>?@p|LjEkJYd)nm}`9_*3f_@DgJ{1t5<#3GAeVQ9;p)?kK*f<_};aD4p3$ z!ymJ4+?Ht{FJN(quG(yW^T6Z@KxG~C^gXyp3)Uia(T`tFkdpADbiI(pe}%cxf~QBN zBF|o3@Ah^OW&Yr831V;=wlpP}_vVBGUasOtmEwu6Od<`=PeMIb@|*e-&7K~E1ozt9f3TkX6UU3aGmqu=ByZ-p{!L56bFxZ zxM~k8m}hB{)e_)fr_KiUB|r0(qC@jJ#TXw|5O_rGQDRx`vmjK%09|@ry&^vr@O?wG zfPaMV!c2+*rLR75Yi<@CI+$F26S{oS_Sw3~9UT6_8n37{USM@H!K#>E^%ykwM5BI2 z@@pA~lVt^X2T*w^oMPJft-Rv8lnft^eI*rwODy760h8Xe#D^*ZRTB`AjIC6AxgX> z`FLC?GCS6{?^u7$)P|tjp^Ecr@^WE#j}!+Vsebt+vNeO7JY^1eMD)Q2v;&HIlR%ys zF+N_X9`7Of5Xk0b)y>vn(kzF|`;Ct|-9%w?(=v&Ia1zyk) z;!6SyYG-%<%TgAEiQYtuROBCz5Q>!kYEO=Z1nWA3P(yxIxOnguPYT3)q^*Y1zku#k zGjPX2!D<)EcP?Ss8Z#xxsiv;}WBZ>s--#(>xSEo&2m1Nd`8%i6Vb3<>V*8IZ1746^ zAtf4kzq>ec|0(XjQ7{t$Mx$vO+DHADdg^Lnf|>%%h?@|9gxJb2p-78U&6?<@D!uz( z#)CNB>IW?mTqE$3BBb>mXRZ*cGq}?9$p>f26-z%RT{-@U!-vUa67pzzT1(4b z@E`R+%(jk1%4>Ic3dZyj*lq%nQdghELH>#D#>|8>LG=#Q*1kVLQjzGP5I$;wp0X4S zDi)-P@)T7ic~Co_0e5CKl2I62-mkB>=3Pc)Ui{oJ}iB{ z0iCZhb_qad=@-l#yM`xQ;mJ(EGX_$&{l;mO>mjT8;D&-1fLz1e?v@ax4)<(KdC)E8 zCa}&=-GG7d@@yzaqc13iQLk!`gH-y?{O7czS9ELgmxb{%gy1-xz;he;1b@jQ98g#kbkR056O(g9PfY2nD1&>S6BpyEmJnyb21J zEkP9z{mvdq z8ZN|2XH*-UR#y8ceW~;iL+4*RB{fbXZ5F(7{;w$0LehCJ?Q7!m^Islcf4CM+PyhG> zIw#&-x*)UQ!tKmCoeuY$^K3&>{t!$0$LMetB#bl)Qwcuh(Zj4Ca26vYKYZVUmqyX`hj5kUV#M#pIy*YRFhqVP|u#Xh<6X; zxW_A~3Wt;Qv{@q$Q?}f|O|>nZLxID5f4EJCB%AlCMYQ0H1u3^a@D4;ikZ2m zE1c5Tf}@O?>u{7Xd2i+l9AwkMi#T~y44B|@Us}x|;cixX<*Jx`yRwMhAe3U$SI4!_ zxedv09S`ZQ+~vv53=j`=zjLR!Zn>(-CP2=8CU%+%1~yz0Br2+mS;*uJWogDv%7<5O zm^LN>&+VnLuz*re?^<|>3k141J)BrNgt06E@LAV?n=eq1TI}5Us$pM2E zZnk8>UD(}gh;cTsp1DdVD+^xXS2JDRExj6DATBsAy{#k!OVJ#tigBx>xcbUdc$BcSC-Lsr&ZRR=$}`}8qPvJZnOTHw=_J!sL4_?>)w&`qmaJS?A zR4{n|zQr$8JLJz<2M`K3c@RA%1q)gwyh5r?Xef+n=~xztmjTf-l-lN_Od5CFd^b+} ztumf02XbO4C;D5`4SK!x=J5CsUQm@ZK>++^*~fLU>jR`!NnoL01%f;OB?ZR0JtLgPgm2CD1AZdY`R2kQ6G!iLuKnpPzPinttj>xN-p5dL$=)>LeUE{r*a}K7)4VG2 zUT&Neo{-D!SgS8zgeU`a&?$(HS`0Eg9H^SeeqpLX|p7cURXtIdNDh4>F-(d^r-qQt> z_gK_j_>4S&GFuj#XfL=IH?QuT<8~#<58eD=K9@c-4G*}_4$0C>qX!7*?!vD5;i`Y^ z2>xZ=qT8`l&t{otSwvIRrKl8me(nGEMzKl3{yMK8eWnO@^^29DCNANvqI0;pNoP#t zOdr-OnyP}9nHXSC2Xb(52x)T881XTn7;<&u$+M-N9PrPF8S)L>sg2CbN48xk*+Fj@B8cl@)d-7_!stGN=$9X-^}0{KdE)?%D)jlkqjtHnMn#?Ha^AK3ZjLCB-u&` zLlUaO&!0Q|H6BbuyJv`&5}YZ-Dp_89iymXXJoqmP^8b>6Xz z3ZN{cE)cg9TjHzM8}v|k3b6{FbhvgLUPHI3)aPh5i2u^iu&HT)Uthg!E{{PL#SHIx zUA*Avi__*1{y5#ZRw&=zkqYyvvMepvnmGy_Yoz3!!~AEWg98emq15wwU{44AFXUs< zZ1uV!jWwC#q%_gnD|;csnh+*>HQI{CMu)kEh6^Yd7{8uEifn%Q%}Toy%}Nx-PWe%p zPSHXNR!=s#c% z|Mq3MpHbRUFfo|(AJ|nb*F>owgl8Vn3-eO7f2SPJ@48?k)R>Gi{7E^6UuE_0l;ENw z`z-4Gjm~WE3IaHQRQfJq$dXznrQ<2;bP!jO4jw1AH7DbMbG4YIxVSiXS!xjbd{`PO zV`(0pU~@KH3|+^6PJQQ9LKo+W=fl=LgtfgQNom<8HD8m^cOPDNY-? z;XWSGduowmUBwi$$H*#$Ptt<-r{IU|5e?0|hmhTPNxE;_Az8PLhAX%q=5-JbeBRmg5kaYHAA~JtM zak}L3Js!!68n{tXKsOIb3ca6VOn<<8pjELGA^rIvTEEasGw|wRbaV7|523D6323ZyT`NDtrzdaOlj9rWN?hMUGQ6fz_P$ujnsD-*>oLV<0IxvigCWj zNsK#d?M+ctsKXP^3uPt@i_B-Lys}KOnC>Q;S};8l%mW_$e_EF**1s_;6Cnm!aL+ZE z1!WBpEvfj7ec=69>39pXm#G_@dr9KL=DW~pt~$J0gEtL78&ML=mQl=6`OqG6u<+&` z2XFSkhZ&2ow$GBj*Zr7nzO~aOTCAXOkWmfHe zQpw&B_DS2A&DK`d#&LEUF0NF6VQ%O^-g6Il1>ZZg6{ma*af{?p_ETZM z!NFVhS;D9Ca%d!g5LGHndXjgp^|uEb5-Z+P&xr;sGY`Qlmv}IB-jV)|dU^>#m=rMC z-}(tbi0@Yf&>5V}J-UCD&&-KSdzjzt29`7aB=0GjecdK@)LLUsujkahKt4}Xf(rNi zG1`m=pM-<3FU=J<)eEUAVN}y9wfkz1-<(!fI?_|VJc`>5?Np zDy9)uvvkTJP-A3+mp}!{(%TBBkZ0!D3oy#Yxd1P(80ohFUdgXodqdNB^TD2P@Eu$7 z4+CIZKS&9M;{$~sJ!2tZ`}wXeWFQJVz9DqG@sR5Eo@%Fs5q<_8K0Um_B)-oW97v7$ z$D`1tL>$#!uBcbSnV+Haq|~8q%lkgm{*p&rvs|&r?4v{XLf8U-`3Tgdy+x?_{&h_K zR6I^TvUA^(OY_2k2)#14oQ3LtD02xjwnF8()R=}ZeBl2o5Sg%^AJ;((vp z)P;5hdYvXB)5F97!$$$}4KS+mE(C778i%2RE{*k#&K%mA2soVC9NV78hv~l~-{@E7 zOmwGgKEb+!OQo{F_mlE}+*G)v%7~Oc!otfpn_=VN=aoK=WgA?_cvSNHrQM!f0e&)V z>S-^QglU$G>(TFYF7k35>^7=_f#x|KZrk(*Uq@?Y)%I)G*_{})$PSSqk75%?tn?7= z)gQ)+_3-1QW1IP|_P6uwqyGnjmsn|)t?c+MBRcTZ4KbURLhO!^2UaakqlYFWk;MB1 zuW~Y88;(j~wte-%VCd0M0kPkpP{zOpfn2$zC<|%a)aKJP6ttsP4RGpJ8XHago5(LE zgU`WWw5(<1L$Ny(@|K@ul2vsrp4-2sds0PB%`k9u;h1cF1xEhpZotNGVcq@5HRp1?~S)O6*Ae++5=zY>FT?6m*c6+!0 z{j2^e#X(|1>@aN{bES;Ub6J&$Cv-P^Zn*Ui{1`>!M2GNg@^hzJV(Q~Za z^O#DnJ}~l@W1oHDwm?6L+cOo*{2|L7=g{HJg78xgk;&}a^G;WRY;`4hQ~K;n|MX`} zbnmVNQhVrxDfV`IHqi|qn?G635aA5i51sGUHeE@V601EKOx?%yVu)34eFUz?`D`28oJNM z;rdGY*LR~rqW`8mFBVTE@lBch9j}&DG=jeMzp=n$%%Cja z>W!73PhEKlLi7`ZIPzx&(Wxlx09tsnIFBe=)Sc5Y1d8HB(n<}8ghE*+o0Jg?SAwz28p zZN3-)J7>IP3-AI;xp)**6g)02_IC?4g5>+9etJSHaXjlYo2&8=f@CG?Ei6*tOii4J zAt?Vh8DgtwW;R16UIDM-eA)L^Pqjyo>IcNXNILBV@jLBGJKYf1=0K(TZ&GYj;qyGh zqnjP9iwHsb0FyTkUIW|gjnBE~7FSmK!o%94osI7OberHNtmjJZ`QHw$E*Imh(ol_^ zO3+cujz)>aoa}D3B`L^!7OH4SBNK1SWy6f>*?tBGr1Ism#|b^6ew6@MahpUZpl>l zeJ)8H#7oSpS~=S)#B>XaAiu?)H_n3>w;3~$&Ms7n#afyt5?&5;OBjb2of}jI_@e8- zn^VMb{h3h~1&HWUn7Uw|7B?)!{*peX8LUlU)4vDn0}?zv-T{yOu`;xQf2wgHej_Z# z@PhQ5+ojnocq)GvR(9KR0Id0dRWA@5F-M>QwJOr9SpB;`ojipyMuNMaU0gt*VUn^t27 zQ}T)A#KiVg;qZNyq5sX|!JK5RucIf#e&g-bx3i)ft<3LYEry%aaS&QS0_J^Z$gyTB zm9=q*H@NVEe&()SIm=9Ro;53$4os^UN3A}K->Kv%?D#8#w#gXJ8~gV=hPM{34ADx= z%mrmm4D5&+UB&@nJ_j>1eP3It@!d(hw$$=!wF+N+popavr@e@c4o#3#YTx>i$F}F> zxkMFi(G=;+&W;n;eM7`66~MkX)4kSd`=tz*Bb!O&{^RZh&TcHW_42Wv`cCA>cjud# z;cqdbcfk$!-b{WI8(g-y7awdHTG>~mV%Tfu{ z73sUtKc4aaHV(EGVoQeFrnbt2VM@ijZk|zhTP>Bl|VtU@E z@8f6VRsoOrqTWEh@82}sLzOQzEUzuP!IuzI_ zz+_|>Xr!^VDflwo-z2w|uu?s-Z98@FR%0Ap(Bd&JmA2WN0j2XuYRZ_esrjQgFKh45k#T>65{+zIr>eJ@WZL3Xz;<>>`jg>W|qTN`I%ex(8%Pn>t z;b+Yh+v%ZF>c4H40Ky2{jX36uv7M+sGh3gTkk6`H@l9 zqvFU3t=!TdBI2@~u^Rinc7_o1d(kboz0)**)MZjarrve>Ee$_u?dqz}*}{R7l;{eH1H$p#;{xVz*4`9*9) znPqW5;kC&iXYYg8;({kXe0-=-IdkE8zW_S`nqiVKL8ViH8s9q&X$im^c6q~Mf@%VM zK+cD@m;kr1!bWPJ{*~L7E5s>vyM->N494L24VgF?ud*A;HBfujesI#Zd|q!PXm$Oc8N(xIMA4 zk5LKI@x~)mawUmc_@fI_723Cse>ktMd%YxBp_A;$y1$i^6zWcip=y7Ar-ylvPpSBs z0@smy{x|Pl=iuC@oiE?NH>-TzExRaes(W=7t1|OD$ym(ENGnHm^Q@3o5Y9u;rTs(L z;qKC!>2Y3G4`c*#y?1a8zCbU7^iO3$AwR%g_l6e{CT?E$Ep@l1OTZP(miZ9!9{2S% zmgTh~!6H3tM;ceAQqyPbmudUnm?ZrbNyh^n`1^CIH50UwF8l#u9<0=0m*8W@`C4Bm zKWZaZo8JsBz?CE_cqMyPs*}4E*+Ls0vIN zTY{cPd3#uRX{Gg~T-Wf1lXJZ!>whOIsxP4)JzhlzP^eSW9!g4iUx{;EGT=fB#`j z=Y>GWH&~46xe+kCzqDkUJ^{8Q?(tBE*d45rk9B(!PBwgB_%BIX7CZ7^6y|-W;g$&( zR6wzRBW%T0`SCu{q)ObZ32=<{b@&j{2s^)l?k>&Ve5|g5DP49Ee;-nxk~Xt)E83d_#(91IZUXvUC#TPy9om*O{y!fJSy zE)-TWS5wHY`4wjH`O6*}a&l0|3(*LMQsSgVQwm0PbrLM;M^>-A>alreFY-3@`qOEfr0)b?+gaFZn#aI&$v5O^jnBzk z{k#GK)I!}fp#$cx{J4?66?;i|`}s9`b&6uWy|=A}P}4r;@~M>kl)8SDkSyvyDNKVJ0&b+6hll=G?3eONf0T#YbAA7fF-RO4p_yc85Kko6dI2&r!& z14j(gvXHU+BgW3B6s4%!8Lr;P2`hf(10nT?1qg7JrB%-rVeU!O-`cfTo}TtK)s&XW z|5r8iIV&DcGz&8bOW@IK-W#WdD!yjG$?|KDaX_P?okReqRq-)lLfFn*ekmQlok@8S z(#P$K$c!&U>-jQBKjigluW@eTwY|O`S5>s6nQSwL6N>5Y>gi$f*Fd$-(rbSs;3{#! zyA)tAtM)j!@VspRYO?|8uXB@% zT1B93)v?17G{NUrOt$=rBtx2+)vdgrqJOZ{%Pw?k!qM*2tojyF7y?LfEGq(XN zS}S3cR&CZ$+xGAoK5nVQ4Bh|>&UtrTu03&Q(EL@QVMjO~X$FhMCY9)0RyGg>h)7=} zk5FnC)ChR_YpS>GI5Cx4^2D|Y+M@KSt&10t_zzbQGvQZuAAHx-6y9fo9c z6-%}1RmV{uzeevIDQY1n3Ux;kzlO_$%slHiO7w5^H{=-j+WVSrCwdgryOlh=2Y)_C zuTk~3xr6%NkKnkg3jXO)TaSZQKd>H4emu6*P&*!$&YI>N_WtzYko^@p-%WZ-97<|` zI)%v|?XC@9Di_aAo?L&MSlsu5_uT0-Q<*L=-+y60V^(KQM#nEL z-%EICxz+6Yt8>{!-nj`7`)evetrg{eUOp)ZV$>$ch4|h_Uc84mo!$9y#kq771)_Ui zgJY>G^u6k3+E(K>wcVEE>>mE=zey|_WO81;p{B|5!?WF=Nogi%BvE@+ zaNU2Tu$fIBPGxFj@>Gf=$)*Vkv1T=VkC_(uKd#mj0%>|3`#n5)BvaxIWQI3Olru9g z$OS`VkOT#Siqr^|SH^6AV3vG;P)V@vR5z;Xst<%|>X|uSZ?AgC@>b$%7YMxuFUR5< zB{G^UmB=dHSYle$J65g^+V%}=Lw_7!eMtYPxVa;dPWtZW;%*B=JXhx*wgA2QBT#Ilj6d|w>-3k9btJZ+Mc*@;L_z z9J(0f!{sp7$VMG~h%4cIWah;hKzU{57q>ilrsZWel64jo@0~b8oUcy2#7rSrwKwWF zZ&`|ADD1TNjV5@v33e)w6Y@Wa5dIe(;-K$|ac&-{7P;d4M4U^MdR`+i4&z~mB@?jy zrIzzT1M-|OjlpEl74u4vf#gNPM_x+0eXhlC!o&r+;#t)ijb_U81$`~yvgKq;YrUIg zzTYILeecN~WR?EF-tb)rqJ2E7KBA?8UskHlyjiifp~_i(zA;xJ9vc6#KpsAV`pyhq7(o zTB+0|ifmJqwQLnarYKuwvX^ZLschL|Y?FxWS%<__NY=@coypEvriigKjL{G>gIUb- zo8IsH{q@y5e?G??b3FHTUFUV3=lMKy-)aYIt7^O;KJ-Q7I!-lDh2)_ARL##0oCAc< zN61ddezbc|Ovc#<2TYT=?go{&x9j5CaK7-|Rypu*@S(FYooasy!OOj|IpOgiMh(bk~Xi+57dKsdE9%IQflBi zq0v&6PgGBXavqD4Zv7}|#@NAYyDB{X6d8{8`P9XOFIJp-WaVJaTkaj9@~J`dl^mru zsA5jo6}O!AzkTaJSH5VR`Wj-cJ}Y}yQCo8gb%d)f_OCaY{zW)UB`{ZN^`_?DlE%FY zM_Qpn>OFsMMZeMEFmkL1B=z2?qb$5h_p9~4-Fyv?IplO*&Ewi99>oo)uBx`n880q) z^Zse3{U`Y0Gt#e6ns*9rA8aK)lHa?pqvp?PJ)wDiUE>RVq^=kg8Wbe8 ze{(Uck3gtjj4>;0qxPm6>OrPz?jo@^C)~#mCcE?x_7IDTlrCMmM^8*jithapy=yG% z9OT|dh0Ajw4%rX8{y?rlT3X5$Rtp<%pJInHgBfHh=Gh#FPjWP^t7oXSG1|^2kh!#l z#Ijr1-*(zV*h@RJTOsVEHGQlO{KJ?<>S5%8{59HeE42X0yOi5^Pg20EI|&HL(?24u zyeA^UapA*&qtb+H+gsk8%r`s>CWbM@m295E_l?MRrwVMdRlP1dEv~5YpV-r#BzD{X z%zD;cb`i0t(yWf<3Hy(U5ew|mVg<9vjP)%{mNg=XiM88p&kka)?*M1n-boP~%yoJT zTYr~jTy{&W;@Z=Ia^lw1SDHlt&%7Y;qED?yFir-BG#b3(qD_!uJf+& z|JW{-^IrR_u6w@3xpm&L+TWg*Y$y{>i5~g6O~i7^<;_1T-J%^V*jPwl2Y0N; zU#s@Z-cf<@VwG3u&H$d=ddStliqlD@g!NyVV)N!tBwF~9X6>2+V^WvhlAJXj(end% zjZdtn$&ozd!2dNY{H)`T$HA9Hfc)jJA9y&uTv6mXkU9ynN35~O&ki?*rEq+Wg?^3R zq0OjaEKGF$3TuEEFV4PjCYLP{{~+ntKV}6A%O2pXtnb>OOPfBL|CoC*dFy503JA$= zV&(X^Zug`^AH;^Q#p&*6-pg5f=?mUh9(hF!6so1nSNkJ?Sg}}Cq*Fg$WUAEcpq6oM zz5o4S=(#A1+@4strz*TVVFR^`FD=Gy|D|j82Lf-tO13{GeEd`WJN}Oi)JB#kyHdA~ z^G-g6rFA&B2DNG`jX^^KnJIR^_nEc_dKh_!QZthpV89~qu>R9H2rZJUW$ zhlR3dzr)P8Zfpfz;XQmf+PWGOIo=36^F|b?cq2)lGSj@%M;`WnB?x^_zUFm<>B|Jr zuCs=y#`$t=rlA+s?w@09D;T>fkAsci&zT;N>UXqb?3=TP}DAvKvs?LE))1`&C?0eh_OP>>(s1#G{`iet4@nm~zJB zT@7#f?gt9*{~D#tFIsyaf41h$iGiFHPeOOyT;OkmN46xZKwwK#A z4xM&6b^ON?bbe>8QBhP&Jw;pJwqy&gDD;yi-0BSzM21Rpd;(MzH0rI`EgVvcQ`9db!V%)I}(-U7xsfy`~e6M7irlVwP|an%)}$9GWq z(xnlfI7ct@$$~#B-hY(q)-^6Wac&V>^|$q#5V|RKhSDNf<2n6W;Q6al@p+HYnE0ax zdhPA)IDBs^&I~~}uUoB|Y=<$r3!U1I0>u=>&p*IA6rx*0cecBmx^8CGZA{ja!-p{c z(hC&#Zm&%PySlUKDpOSd`}wHh{n~y|YAAge5ewvPxuiAEmt1#{+^Z{E0zni(n^bglO50#*U~iSZe&bzY6D z7~GfeLAiTU)$M;x%qZ6`foIVGPD`ruLNODcEam8WxJ9p(-`TwlPuk-i5B!^t~N z)_CBSOOQvb?4d54l(Sx?MOwHxo(g1I80=50VOHPJ-^V(mR_DY5>=?RD2s~$hul}E zO!=m2d+uzn_Lh5c30N|AIFqN%CyulGTp0Bob=Z5{1pvU>lKX!F*iUZDnNNiX9Wv8G z#;Yi4=ZIp)Q-s=n{HXZkhMjTtZSj~SJRuecMxM7({qRIiKgjuL;_36WqH|*%W-}d% z&YNfV;X_DqA`;Zh+Ggr|>k@Vp zXJN~^_bA`SWB`Gond_*@6;LVc6U*i7CfNPU4jJKf2u1D0v@t2OaDm9*^C57wD%V2p zP`y3n=QzJMISZ5TAJzz}ddibx!2j;pT({@7>Q`C{oWbANUfZ&Tz=_OKgC@=gw(b** zA`faRzVRKbH^J3jk=v<>;yjJGl=gy{eKw)=H9xN!WMJ36PTQf0v#9$N$9MT(9d!5K z5O&wNXEONkhFQ-Sh&R{u%=vc#&OhY_~VS?j%sB)}3=t9r7wh z7LZH8fs$NUy-E{Hri&Yix~Lb#ByQENgQ|0N-u<)UVi1+pm?<5?wv$OKgJpu*TzTKV zNqXzfI17nro|w)v5wrqG8^?EAt&8zA27odXC1xHDHCMPD6%*CaT*JmDc%5DqxDJPd zKKD%|Y&G?liajTt^W5)0YTky^72@7Ech#^*U(c`nmzKg>6-HaLAQiNoEU9m*F-1Np zR|h2%D(8B1jy%y&{&G@S*yvF{&tCM{*xjr*OXbO@1NR=Kj8!=Ka%IF=tJk=XA4`At zxw15kUk^V#_$i%V*S2>(ErFE(b3)@F5N*sP!Oi77Jz7D^M2G z9u2@4wh6*yfZi@2C9$T3`;EWfgwCy1&))G8l0C2Dtw?x%|4HxSu-aTk_F)m#e86!& zut&w1n~}$LaUpb3LyD_fe2v)(T@qt_&q!NKwgepw+Y;_asyWAiHckxB7GpIlPYAod zl+>Ng0~l$uKIJpjJf||l_L^q%MFVc1znJmmj=!mmN#SF}os$#e_|`^6A6lJYaAul$%5>OF&u;06r#Mm}4VZG9bDT{W2i`|fdCQUMxjST%O}-1?#X!tzqsM495Hs8~f(iN`e# z+H612XJh!K3H=_W!S#tUW(rp~sQYcH6CHa6tN7~eFVKnA$rv`5=ez?#&LB9WF zN2|kyBTv3U@L<}c9Zc470kC>DE5EZjZTo$Wfg+9k`C19BP-C>1UCgu~6l_AuC_NFR zZ{;JuYex2VlwpQCBa+H9|2?_N#jyO%XiCaXo*i-LLGD_wlULR zX>nfTEXdjCCFY%OG(o_|O=9&C|H8U)OEe*1mAn@UpC;9!XY_sHvP^05nil zWhS&_i%bVBVrTEKH`Wo7rE`1Qs^?$#Wi*a#%|7;cN0oO8SfRU?M zd4F4}8br2hY>}Ml=qy_>NeVKr`|&<5#dy^b5PY{Gk;AmQ?yd9Sy>V73`iSgdA9W=V z0|#hd=bR;uA7mSha_|a`oGR-fN%}IlZgRs-ZusX;0@>7Ve)XZ^h>FmP)a=eaMU++( zDIIyPN>_Ey2%JL>eA-Tb%3;8p@Mm$~lEVCC5rHt~3Zxwqwq2!yiBoJ*Z`%HhyuAd~ zo@H&NY}csRZmcz~xBQ9#GOm6ji~(sq`sj;$Q`8W#p51yh z!by$*LjpE7*3*(m)B&$Be$V>F3@z)MYA%DCawHg~arQ;`l{IgXw+*RWT)b6=*RPoq zyKFu5<`JyTLL6sl!F}}F{*VK?K-RBl*8&}uV9T!;Df%UJjL}i>!#xQ~<@FP1%m`<>nA!P{Ugrs5pv39i|V?wl{ zK+e&UeJ$^`hZE0|j!R?630@(b_X8N@RQLpHV(CXJ5<1{!Dkc!Uca}a{tMNE^p0L2X zB!u?ET%q)94hks8p{m;(XST|Hyx(hhhk_{enDaXoBm#Z-y{iN)D%4=Cd_1yjzPWl3xzDR(^9x9lP-@6K1^F`bwm8cNC zGMhqv2VQVQTrqgOZ(hGsob!0o9vYngtP7YhT`c*uaYY6UZ#>!Pcy`Z)a>)Ug9?yE(@oXL`qp6a_Rbh`F!}bMgM` z&6FCk+Bp)3Z`S^tOu>xJu5~55C4_-(D?03#)vsrpKzNPPmOpnTU?w?*opNB~Rd)iv zismJ+z;=-#VPhA|hTrx6Xz)AKUXgZwl+di>6*QcEOmavL^BWo-^+tNy(Y;BVv(zp% z!luXzD-Xga4l^iQOo+u}u!4SKd{)f$I0)l@y+SGap+Bnu+pI8s%TRn9$$^)TyNU2X z#hay7aCX?L8$^C5eZIDe?0?y1bZeG4(PYsg7hLiwnuBhleT;Tmcl&wTSUkj{^Ehqe z<4Gu93JIe9ocJss!a>hKUbSD9wgn_3WE8%-=4S1p19Z84BTE^-M|1R5*{y$ipk=qg zVqc=j#M9HdCrPY#n`s;J5So!`5CQseHWqa2gr;;`xZ8>G`%sNg8AZfY1L96LZnpSM z4`xB;iYivncONbmTl}WKs$pFsXTHW-lP_1KvlHwQlfv5)>A2RgQeHzAixpiAZ_d0N z-&D`p*B6H+s{28o&Ysnq3V7G|qoax1sb~y**|V6}=a7>kveuZ({OJl`y?%w$n?U;s zDaMD%ue%=Nd;NT7U+ARxzoZ`^^+v3en7w$9xA6FEH-Z}WrAsr-8HW0~t81tdk~-E} z@6kqH*pHwV&XM-D=h5BT+Z6&}GMB2aXQ7jXPaSt1KIJC*l6V-s;_Bjfy{~IAzoXDH zdL!Od%PB+W4o=pTF$~!{nqQ1MHV1xV8TIKY@g;asIkxH!L!f>`-+Nz*Z~7%gOb9gZ zOUJ8dl3B>5mkJj<3!JQOD}Ws@_8fvx+kDzEE;7dQHl*}Id>`a#uBCTLSjXZi+fuT6 z*;EIcQ&g5UMR?HCWsG5t_z}Fm)`@l*G3#Eh^Z@BFyv-$Q3<|&Gt&xl%!+FP{_A;06 z&dGpB5I2yXawKZqaWx8TC^grdWptyCI_o!l8(KYd`<}U;RtdDYw6ZVqo^3($w47&d z`EohhO1s0%zLH!WYxUWtbGp_Gk|jtoh^W+Gos_$6(Guo(R)HJ(Y0^a*wY<29nNC4A zd}J=kBjyRTkNt9pF*#W0qLl_s_K4$z%ZI>NNgI~1tGd-?XL)03)vfClNJe@$IhWE@ z-DAqEs5eYiQG(l~x2x-f;R_lZL936zC3@#EXCdO}Sjf8h*h<(b1Vd(zOV`IzqbhS7 zmwvKyYX*ceLR$1Tkt1l%#`Lu!{Vm$xABLvcL5DI{$7B-SNfC$9S4SYKXz_~P#o{Yz z+$81tTQ3%gPx{!;4=EU6<(D*GW!LKGW~fKTm63WE@N1Sh>LL@oW!|t{&w$^*sm*vO z`O{YW(36P+AhC0F(u(8h`VFWu+G@ZOYQg zem-tT@)FSyXio;peQ2I=M|2!rYi0u-#InbF^|CD|f!h7x9HEJ{9MO6$bg3_?XBwJI zg6BjJSgmu52c9Y$won_A2QUo!0DPwV zzzR0cmy3l!(S+#8NiS4$d<5vx!^yq{MpAOfc<+TB@^ir^2V;=Y(M*Juc+pEKW-C2cbmA~eRE1`(w}|$b5>@KOs>oqN zR%K6ir1x8Hq{HWzYS7Pto}HZ;HXA1w$Sa3n_-_i}z&3sXkHl%nfPu~iJlME+pO$rj z6W=MWNO@xgNLX2=m37;br6nWyBw7$OUy}kB?HnF`I8T)LG9Z!SOL`RWD{c>}^wB9v zF`8Uhm3+23^(N;x99M@P z%w}%C1~Ktv|JM!;!dj0mlW3o7jJd5Es#MLbw4ZnUaBHPCYZ0?s6EEtz#WJe z{3s2Aimw{2nAL-6HxHY4ASu-+>uMZ{$MYxldKC0}%;QPDVBDczL8Ps=X8}A!N{S(y zJx?+aMA>^Q(2S&QNLfPE&+?dT^`8zVw!K4_YZ%T;jz0WSG(4DjS*8Tf&z*O%%>6|i z2#P0?FP;;sk9rlI%qRpgiH0@v1Y$a>>!hd3s~4gq6Z;gfxRIm{jj#=2k>I8+%K)zt z1Vg!_Z`fiwrPcGU=Ls^MAC8$J_nDXY6@wh7j#i13$srgt|EkyaODRZScUtdYJ6`G* z$pVHR^z;+hjV`nhPYV6%v_}(D!XU0snad`)k9|6765`%(VP$vxVQ{+P)6dLKJsfnW z%0`D(*_-X1vwcb-+PR9Hy%Aeij2i0g0%kFUV@{W~eIjq4(gKv!z{E2e4Y5YrmA|am zB?QD$c%wxf!`W(B#!dlf-_yT?n2<$scD8tURyS}7v}j9PM@E~(_v zWq8O2--XTr*ck~R&B?cn7%e#130kL6Z-!lJreE1gO=fUhRA|Pz#r8`wNAk^RCNjPW z{Ky~!?Z)Dhz6RabwDU2GR>Op)5fZ-?XdD_cHAT%6=%-15-R`D?Tm;y7BJt2qPpPn( z3@GH4?YI#}RL_ohD6=?3`3+bb$_Jp;DWf5r)b;^26|3+|xVjA##~U-qTc z!aW>e84aT|&b>&EMk}H$RVj8UV7oIAid}y4qx9U0SpNd5ndkgBkpHa3`E06u0^W*j zMVsu^Ke1>LW^q{qUdFhL88%34bLm4+g=l>_eO7lpmkwT=_rX)_Iy$RMK$Kmjd@eE< z9+7}8XOh%?`bOzlzP+xt_d`rYhZadt^cqK&IB3kUS(Io%=nq}o9w7DVL@4rN*-uN- zqO>Ns@H4Mte?)BRYA)e1-J oNA#kEDI6i=OW&>hsF=hCeT4w!%tnbkT%3>L4dd(OIu6hO52Wl{RR910 literal 0 HcmV?d00001 diff --git a/final_proj/astar_dynamic.py b/final_proj/astar_dynamic.py index 9dac5e2..8123635 100644 --- a/final_proj/astar_dynamic.py +++ b/final_proj/astar_dynamic.py @@ -27,7 +27,7 @@ def __eq__(self, other): # By Nicholas Swift via https://medium.com/@nicholas.w.swift/easy-a-star-pathfinding-7e6689c7f7b2 # Modifications by Marlow Fawn -def astar(goal, player, state) -> list: +def astar(goal, player, state): """Returns a list of tuples as a path from the given start to the given end in the given maze""" player_copy = deepcopy(player) goal_copy = deepcopy(goal) diff --git a/final_proj/box_regions.py b/final_proj/box_regions.py new file mode 100644 index 0000000..e6b58bf --- /dev/null +++ b/final_proj/box_regions.py @@ -0,0 +1,198 @@ +from util import * + +class BoxRegion: + """Box Region class for fast high level A star""" + + def __init__(self, name:str=None, parent=None, box:dict=None, neighbors:set=None): + self.name = name + self.parent = parent + if box is None: + self.midpoint = None + else: + self.midpoint = (abs(box['westmost'] - box['eastmost']) / 2.0, abs(box['southmost'] - box['northmost']) / 2.0) + self.box = box + self.neighbors = neighbors + + + def __eq__(self, other): + return self.midpoint == other.midpoint + + def add_neighbors(self, neighbors): + self.neighbors.update(neighbors) + + def contains(self, point:list|tuple[float, float]) -> bool: + """Check whether a point is in the box region + + Args: + point (list | tuple[float, float]): (x, y) + Returns: + bool: T for in region + """ + return (self.box['westmost'] <= point[0] <= self.box['eastmost']) and (self.box['northmost'] <= point[1] <= self.box['southmost']) + +NW_corner = BoxRegion( + name = "NW_corner", + box = { + 'westmost':-0.6, + 'eastmost':3.25, + 'northmost':1.5, + 'southmost':4.5 + } +) +W_corner = BoxRegion( + name = "W_corner", + box = { + 'westmost':-0.6, + 'eastmost':3.25, + 'northmost':7.0, + 'southmost':9.5 + } +) +SW_corner = BoxRegion( + name = "SW_corner", + box = { + 'westmost':-0.6, + 'eastmost':3.25, + 'northmost':3.5, + 'southmost':21.5 + } +) +NE_corner = BoxRegion( + name = "NE_corner", + box = { + 'westmost':18.25, + 'eastmost':19.75, + 'northmost':1.5, + 'southmost':4.75 + } +) +E_corner = BoxRegion( + name = "E_corner", + box = { + 'westmost':18.25, + 'eastmost':19.75, + 'northmost':7.0, + 'southmost':10.75 + } +) +SE_corner = BoxRegion( + name = "SE_corner", + box = { + 'westmost':18.25, + 'eastmost':19.75, + 'northmost':13.0, + 'southmost':25.0 + } +) + +aisle1 = BoxRegion( + name = "aisle1", + box = { + 'westmost':5.5, + 'eastmost':15.5, + 'northmost':2.5, + 'southmost':5.5 + } +) +aisle2 = BoxRegion( + name = "aisle2", + box = { + 'westmost':5.5, + 'eastmost':15.5, + 'northmost':6.5, + 'southmost':9.5 + } +) +aisle3 = BoxRegion( + name = "aisle3", + box = { + 'westmost':5.5, + 'eastmost':15.5, + 'northmost':10.5, + 'southmost':13.5 + } +) +aisle4 = BoxRegion( + name = "aisle4", + box = { + 'westmost':5.5, + 'eastmost':15.5, + 'northmost':14.5, + 'southmost':17.5 + } +) +aisle5 = BoxRegion( + name = "aisle5", + box = { + 'westmost':5.5, + 'eastmost':15.5, + 'northmost':18.5, + 'southmost':21.5 + } +) +aisle6 = BoxRegion( + name = "aisle6", + box = { + 'westmost':5.5, + 'eastmost':15.5, + 'northmost':22.5, + 'southmost':25 + } +) + +W_walkway = BoxRegion( + name = "W_walkway", + box = { + 'westmost':3.25, + 'eastmost':5.5, + 'northmost':1.5, + 'southmost':25.0 + } +) +E_walkway = BoxRegion( + name = "E_walkway", + box = { + 'westmost':15.5, + 'eastmost':18.25, + 'northmost':1.5, + 'southmost':25.0 + } +) + +NW_corner.add_neighbors(neighbors=[W_walkway]) +W_corner.add_neighbors(neighbors=[W_walkway]) +SW_corner.add_neighbors(neighbors=[W_walkway]) +W_walkway.add_neighbors(neighbors=[ + NW_corner, W_corner, SW_corner, aisle1, aisle2, aisle3, aisle4, aisle5, aisle6 +]) +aisle1.add_neighbors(neighbors=[W_walkway, E_walkway]) +aisle2.add_neighbors(neighbors=[W_walkway, E_walkway]) +aisle3.add_neighbors(neighbors=[W_walkway, E_walkway]) +aisle4.add_neighbors(neighbors=[W_walkway, E_walkway]) +aisle5.add_neighbors(neighbors=[W_walkway, E_walkway]) +aisle6.add_neighbors(neighbors=[W_walkway, E_walkway]) + +E_walkway.add_neighbors(neighbors=[ + NE_corner, E_corner, SE_corner, aisle1, aisle2, aisle3, aisle4, aisle5, aisle6 +]) + +NE_corner.add_neighbors(neighbors=[E_walkway]) +E_corner.add_neighbors(neighbors=[E_walkway]) +SE_corner.add_neighbors(neighbors=[E_walkway]) + +regions = [ + NE_corner, + W_corner, + SW_corner, + NE_corner, + E_corner, + SE_corner, + W_walkway, + E_walkway, + aisle1, + aisle2, + aisle3, + aisle4, + aisle5, + aisle6, +] \ No newline at end of file diff --git a/final_proj/astar_path_planner.py b/final_proj/fast_high_level_astar.py similarity index 67% rename from final_proj/astar_path_planner.py rename to final_proj/fast_high_level_astar.py index d433deb..dfbe68f 100644 --- a/final_proj/astar_path_planner.py +++ b/final_proj/fast_high_level_astar.py @@ -1,14 +1,14 @@ import numpy as np -from utils import recv_socket_data import json from queue import PriorityQueue import json import socket -from utils import recv_socket_data + from util import * +from box_regions import * cartReturns = [2, 18.5] basketReturns = [3.5, 18.5] @@ -93,106 +93,72 @@ def __init__(self, socket_game, env): self.last_action = "NOP" self.current_direction = self.player['direction'] self.size = [0.6, 0.4] - - - - def step(self, action): - action = "0 " + action - self.game.send(str.encode(action)) # send action to env - output = recv_socket_data(self.game) # get observation from env - if output: - output = json.loads(output) - self.obs = output['observation'] - self.last_action = action - self.player = self.obs['players'][0] - return output - def heuristic(self, a, b): - """Calculate the Manhattan distance from point a to point b.""" - return abs(a[0] - b[0]) + abs(a[1] - b[1]) - - def overlap(self, x1, y1, width_1, height_1, x2, y2, width_2, height_2): - return not (x1 > x2 + width_2 or x2 > x1 + width_1 or y1 > y2 + height_2 or y2 > y1 + height_1) - - def objects_overlap(self, x1, y1, width_1, height_1, x2, y2, width_2, height_2): - return self.overlap(x1, y1, width_1, height_1, x2, y2, width_2, height_2) - def collision(self, x, y, width, height, obj): - """ - Check if a rectangle defined by (x, y, width, height) does NOT intersect with an object - and ensure the rectangle stays within the map boundaries. - - Parameters: - x (float): The x-coordinate of the rectangle's top-left corner. - y (float): The y-coordinate of the rectangle's top-left corner. - width (float): The width of the rectangle. - height (float): The height of the rectangle. - obj (dict): An object with 'position', 'width', and 'height'. - - Returns: - bool: Returns True if there is NO collision (i.e., no overlap) and the rectangle is within map boundaries, - False if there is a collision or the rectangle goes outside the map boundaries. - """ - # Define map boundaries - min_x = 0.5 - max_x = 24 - min_y = 2.5 - max_y = 19.5 - - # Calculate the boundaries of the rectangle - rectangle = { - 'northmost': y, - 'southmost': y + height, - 'westmost': x, - 'eastmost': x + width - } + # def collision(self, x, y, width, height, obj): + # """ + # Check if a rectangle defined by (x, y, width, height) does NOT intersect with an object + # and ensure the rectangle stays within the map boundaries. + + # Parameters: + # x (float): The x-coordinate of the rectangle's top-left corner. + # y (float): The y-coordinate of the rectangle's top-left corner. + # width (float): The width of the rectangle. + # height (float): The height of the rectangle. + # obj (dict): An object with 'position', 'width', and 'height'. + + # Returns: + # bool: Returns True if there is NO collision (i.e., no overlap) and the rectangle is within map boundaries, + # False if there is a collision or the rectangle goes outside the map boundaries. + # """ + # # Define map boundaries + # min_x = 0.5 + # max_x = 24 + # min_y = 2.5 + # max_y = 19.5 + + # # Calculate the boundaries of the rectangle + # rectangle = { + # 'northmost': y, + # 'southmost': y + height, + # 'westmost': x, + # 'eastmost': x + width + # } - # Ensure the rectangle is within the map boundaries - if not (min_x <= rectangle['westmost'] and rectangle['eastmost'] <= max_x and - min_y <= rectangle['northmost'] and rectangle['southmost'] <= max_y): - return False # The rectangle is out of the map boundaries - - # Calculate the boundaries of the object - obj_box = { - 'northmost': obj['position'][1], - 'southmost': obj['position'][1] + obj['height'], - 'westmost': obj['position'][0], - 'eastmost': obj['position'][0] + obj['width'] - } - - # Check if there is no overlap using the specified cardinal bounds - no_overlap = not ( - (obj_box['northmost'] <= rectangle['northmost'] <= obj_box['southmost'] or - obj_box['northmost'] <= rectangle['southmost'] <= obj_box['southmost']) and ( - (obj_box['westmost'] <= rectangle['westmost'] <= obj_box['eastmost'] or - obj_box['westmost'] <= rectangle['eastmost'] <= obj_box['eastmost']) - ) - ) + # # Ensure the rectangle is within the map boundaries + # if not (min_x <= rectangle['westmost'] and rectangle['eastmost'] <= max_x and + # min_y <= rectangle['northmost'] and rectangle['southmost'] <= max_y): + # return False # The rectangle is out of the map boundaries + + # # Calculate the boundaries of the object + # obj_box = { + # 'northmost': obj['position'][1], + # 'southmost': obj['position'][1] + obj['height'], + # 'westmost': obj['position'][0], + # 'eastmost': obj['position'][0] + obj['width'] + # } + + # # Check if there is no overlap using the specified cardinal bounds + # no_overlap = not ( + # (obj_box['northmost'] <= rectangle['northmost'] <= obj_box['southmost'] or + # obj_box['northmost'] <= rectangle['southmost'] <= obj_box['southmost']) and ( + # (obj_box['westmost'] <= rectangle['westmost'] <= obj_box['eastmost'] or + # obj_box['westmost'] <= rectangle['eastmost'] <= obj_box['eastmost']) + # ) + # ) - return no_overlap + # return no_overlap - # The function will return False if the rectangle is outside the map boundaries or intersects with the object. + # # The function will return False if the rectangle is outside the map boundaries or intersects with the object. - def hits_wall(self, x, y): - wall_width = 0.4 - return (y <= 2 or y + self.size[1] >= self.map_height - wall_width or \ - x + self.size[0] >= self.map_width - wall_width) + # def hits_wall(self, x, y): + # wall_width = 0.4 + # return (y <= 2 or y + self.size[1] >= self.map_height - wall_width or \ + # x + self.size[0] >= self.map_width - wall_width) - def neighbors(self, point, map_width, map_height, objs): - """Generate walkable neighboring points avoiding collisions with objects.""" - step = 0.150 - directions = [(0, step), (step, 0), (0, -step), (-step, 0)] # Adjacent squares: N, E, S, W - x, y = point - - results = [] - for dx, dy in directions: - nx, ny = x + dx, y + dy - collision = any(self.objects_overlap(nx, ny, self.size[0], self.size[1], obj['position'][0], obj['position'][1], obj['width'], obj['height']) for obj in objs) - if 0 <= nx < map_width and 0 <= ny < map_height and not collision and not self.hits_wall(nx, ny): - results.append((nx, ny)) - return results + def is_close_enough(self, current, goal:tuple|dict, tolerance=0.15, is_item = True): """Check if the current position is within tolerance of the goal position.""" if is_item: @@ -201,137 +167,73 @@ def is_close_enough(self, current, goal:tuple|dict, tolerance=0.15, is_item = Tr else: return (abs(current[0] - goal[0]) < tolerance and abs(current[1] - goal[1]) < tolerance) - def distance(self, a, b): - return np.sqrt((a[0] - b[0])**2 + (a[1] - b[1])**2) - def astar(self, start, goal, objs, map_width, map_height, is_item = True): - """Perform the A* algorithm to find the shortest path from start to goal.""" + + def which_region(self, location:list|tuple) -> BoxRegion: + """Find which region the location is in + + Args: + location (list | tuple): (x, y) + + Returns: + BoxRegion: the region location is in + """ + for box_region in regions: + if box_region.contains(location): + return box_region + raise Exception("location not on map") + + + def normalized_manhattan_dist(self, start:tuple|list, goal:tuple|list) -> float: + """Return the normalized manhattan dist from start to goal + + Args: + start (tuple | list): (x, y) + goal (tuple | list): (x, y) + + Returns: + float: between 0 and 1 + """ + longest_possible_manhattan_dist = MAP_WIDTH + MAP_HEIGHT + dist = manhattan_distance(pos1=start, pos2=goal) + return dist / longest_possible_manhattan_dist + + def heuristic(self, box_region:BoxRegion, goal:list|tuple) -> float: + return self.normalized_manhattan_dist(start=box_region.midpoint, goal=goal) + + + def astar(self, player, start, goal, obs): + """Perform high level planning to find a path from start location to goal region.""" + start_region = self.which_region(start) # figure out which BoxRegion start is in frontier = PriorityQueue() - frontier.put(start, 0) + frontier.put(start_region, 0) came_from = {} cost_so_far = {} came_from[start] = None - cost_so_far[start] = 0 - distance = 1000 + cost_so_far[start_region] = 0 + while not frontier.empty(): - - current = frontier.get() - if self.is_close_enough(current, goal, is_item=is_item): - break - - for next in self.neighbors(current, map_width, map_height, objs): - new_cost = cost_so_far[current] + 0.15 # Assume cost between neighbors is 1 - if next not in cost_so_far or new_cost < cost_so_far[next]: - cost_so_far[next] = new_cost - priority = new_cost + self.heuristic(next, goal) - frontier.put(next, priority) - came_from[next] = current - + curr_region:BoxRegion = frontier.get() + if curr_region.contains(goal): + break # found goal region + for neighbor_region in curr_region.neighbors: + cost_to_neighbor = cost_so_far[curr_region] + 1 + calculate_crowdedness_factor(player, neighbor_region, obs) + if neighbor_region not in cost_so_far or cost_so_far[neighbor_region] > cost_to_neighbor: + cost_so_far[neighbor_region] = cost_to_neighbor + priority = cost_to_neighbor + self.heuristic(neighbor_region, goal) + frontier.put(neighbor_region, priority) + came_from[neighbor_region] = curr_region + # Reconstruct path - if self.is_close_enough(current, goal, is_item=is_item): - path = [] - while current: - path.append(current) - current = came_from[current] - path.reverse() - return path - - return [] # No path found - # PlayerAction.NORTH: (Direction.NORTH, (0, -1), 0), - # PlayerAction.SOUTH: (Direction.SOUTH, (0, 1), 1), - # PlayerAction.EAST: (Direction.EAST, (1, 0), 2), - # PlayerAction.WEST: (Direction.WEST, (-1, 0), 3) - def from_path_to_actions(self, path): - """Convert a path to a list of actions.""" - # if the current direction is not the same as the direction of the first step in the path, add a TURN action - # directions = [(0, step), (step, 0), (0, -step), (-step, 0)] # Adjacent squares: N, E, S, W - actions = [] - cur_dir = self.current_direction - - for i in range(len(path) - 1): - x1, y1 = path[i] - x2, y2 = path[i + 1] - if x2 > x1: - if cur_dir != '2': - actions.append('EAST') - cur_dir = '2' - actions.append('EAST' ) - else: - actions.append('EAST') - elif x2 < x1: - if cur_dir != '3': - actions.append('WEST') - cur_dir = '3' - actions.append('WEST') - else: - actions.append('WEST') - elif y2 < y1: - if cur_dir != '0': - actions.append('NORTH') - cur_dir = '0' - actions.append('NORTH') - else: - actions.append('NORTH') - elif y2 > y1: - if cur_dir != '1': - actions.append('SOUTH') - cur_dir = '1' - actions.append('SOUTH') - else: - actions.append('SOUTH') - return actions - - def face_item(self, goal_x, goal_y): - x, y = self.player['position'] - cur_dir = self.current_direction - #print("info: ", cur_dir, y, goal_y) - if goal_y < y: - if cur_dir != '0': - self.step('NORTH') - dis = abs(goal_y - y) - while dis> 0.75: - self.step('NORTH') - if abs(dis - abs(goal_y - self.player['position'][1])) < 0.1: - break - else: - dis = abs(goal_y - self.player['position'][1]) - return 'NORTH' - elif goal_y > y: - if cur_dir != '1': - self.step('SOUTH') - dis = abs(goal_y - y) - while dis > 0.75: - self.step('SOUTH') - if abs(dis - abs(goal_y - self.player['position'][1])) < 0.1: - break - else: - dis = abs(goal_y - self.player['position'][1]) - return 'SOUTH' - - def perform_actions(self, actions): - """Perform a list of actions.""" - for action in actions: - self.step(action) - return self.obs - def change_direction(self, direction): - cur_dir = self.current_direction - if direction == 'NORTH': - if cur_dir != '0': - self.step('NORTH') - return 'NORTH' - elif direction == 'SOUTH': - if cur_dir != '1': - self.step('SOUTH') - return 'SOUTH' - elif direction == 'EAST': - if cur_dir != '2': - self.step('EAST') - return 'EAST' - elif direction == 'WEST': - if cur_dir != '3': - self.step('WEST') - return 'WEST' + path = [] + while current: + path.append(current) + current = came_from[current] + path.reverse() + return path + + def find_item_position(data, item_name): """ Finds the position of an item based on its name within the shelves section of the data structure. @@ -379,61 +281,5 @@ def find_item_position(data, item_name): # shopping_list = ['fresh fish', 'prepared foods'] - - if len(shopping_list) > 0: - print("go for basket") - path = agent.astar((agent.player['position'][0], agent.player['position'][1]),(basketReturns[0], basketReturns[1] ), objs, 20, 25) - actions = agent.from_path_to_actions(path) - agent.perform_actions(actions) - agent.face_item(basketReturns[0], basketReturns[1]) - agent.step('INTERACT') - agent.step('INTERACT') - for item in shopping_list: - y_offset = 0 - print("go for item: ", item) - item_pos = find_item_position(game_state, item) - if item != 'prepared foods' and item != 'fresh fish': - item_pos = find_item_position(game_state, item) - #item = update_position_to_center(item_pos) - else: - if item == 'prepared foods': - item_pos = [18.25, 4.75] - else: - item_pos = [18.25, 10.75] - if item == 'milk' or item == 'chocolate milk' or item == 'strawberry milk': - y_offset = 3 - # print("item_pos: ", item_pos) - path = agent.astar((agent.player['position'][0], agent.player['position'][1]), - (item_pos[0] + offset, item_pos[1] + y_offset), objs, 20, 25) - if path == None: - continue - agent.perform_actions(agent.from_path_to_actions(path)) - agent.face_item(item_pos[0] + offset, item_pos[1]) - #player.face_item(item_pos[0] + offset, item_pos[1]) - for i in range(shopping_quant[shopping_list.index(item)]): - agent.step('INTERACT') - if item == 'prepared foods' and item == 'fresh fish': - agent.step('INTERACT') - - # go to closer register - if agent.player['position'][1] < 7: - path = agent.astar((agent.player['position'][0], agent.player['position'][1]), - (registerReturns_1[0] + offset, registerReturns_1[1]), objs, 20, 25) - if path == None: - print("no path to register") - agent.perform_actions(agent.from_path_to_actions(path)) - #player.face_item(registerReturns_1[0] + offset, registerReturns_1[1]) - else: - path = agent.astar((agent.player['position'][0], agent.player['position'][1]), - (registerReturns_2[0] + offset, registerReturns_2[1]), objs, 20, 25) - if path == None: - print("no path to register") - agent.perform_actions(agent.from_path_to_actions(path)) - #player.face_item(registerReturns_2[0] + offset, registerReturns_2[1]) - - agent.step('INTERACT') - agent.step('INTERACT') - agent.step('INTERACT') - print(agent.obs) diff --git a/final_proj/map_box_regions.pdf b/final_proj/map_box_regions.pdf new file mode 100644 index 0000000000000000000000000000000000000000..55a52708ef3fc47fcac961ed5b96ac8a98658f14 GIT binary patch literal 296520 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�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%0As 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

=8V@d3mu4Wp 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�d&+;Zvjb-#dmJ*ZTUHz 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 =H#TOB`Ul8S4|163wd3PnXnz4z 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 z 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 e+?rUOqe-MHN5{V6@ANj^^qGNhcrugz>2 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�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

r9lzekAc{?z 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 literal 0 HcmV?d00001 diff --git a/final_proj/socket_agent_proj.py b/final_proj/socket_agent_proj.py index 49fc49e..9c23268 100755 --- a/final_proj/socket_agent_proj.py +++ b/final_proj/socket_agent_proj.py @@ -11,7 +11,7 @@ from final_proj.util import get_geometry from helper import project_collision from util import * -from final_proj.astar_path_planner import * +from final_proj.fast_high_level_astar import * # todo: update with Helen's method for making interaction areas? def populate_locs(observation): @@ -127,7 +127,7 @@ def get_container(self): self.goal = 'basketReturn 0' self.goto(goal='basketReturn 0', is_item=True) else: - self.goal = 'basket' + self.goal = 'basket'# we have gotten a basket before, it's somewhere in the environment self.goto(goal=f'basket {self.container_id}', is_item=True) self.execute('INTERACT') self.execute('INTERACT') @@ -152,11 +152,11 @@ def strategically_choose_from_shopping_list(self, shopping_list): Args: shopping_list (list[tuple]): shopping list of (item, quantity) """ - #TODO: add optimization strategy + #TODO: replace with optimization strategy return shopping_list.pop(0) def update_container(self, container='basket'): - """Check if we are responsible for any `container`. Either a cart or a basket + """Check if we are responsible for any `container` and update container related status. Either a cart or a basket Args: container (_type_): either a cart or a basket @@ -171,37 +171,14 @@ def update_container(self, container='basket'): self.container_id = i self.container_type = container return - - def interact_box_to_goal_location(self, box:dict) -> tuple[float, float]: - """Given an interact box, determine which goal location within the box to aim for - - Args: - box (dict): interact box - - Returns: - tuple[float, float]: the goal location - """ - player_needs_to_face = box['player_needs_to_face'] - if player_needs_to_face == Direction.SOUTH: - top_left = (box['westmost'],box['northmost']) - return top_left - elif player_needs_to_face == Direction.NORTH: - bot_left = (box['westmost'],box['southmost']) - return bot_left - elif player_needs_to_face == Direction.WEST: - bot_right = (box['eastmost'],box['southmost']) - return bot_right - else: - bot_left = (box['westmost'],box['southmost']) - return bot_left def goto(self, goal:list|tuple|str, is_item=True): """go to the goal, either a (x, y) of a string such as 'basket', 'register' Args: - goal (list | tuple | str): _description_ - is_item (bool, optional): _description_. Defaults to True. + goal (list | tuple | str): (x, y) or strings such as 'strawberry', 'basket' + is_item (bool, optional): if the goal is an item. Set False for (x, y). Defaults to True. """ if goal is None: goal = self.goal @@ -238,7 +215,7 @@ def goto(self, goal:list|tuple|str, is_item=True): path = self.nav(goal, is_item=is_item) print(f"Agent {self.agent_id} going to location {goal} without cart") - for intermediate_target_location in path: + for intermediate_target_location in path: # astar planner only gets us close to the goal self.step(step_location=intermediate_target_location, player_id=self.agent_id, backtrack=[]) @@ -246,6 +223,30 @@ def goto(self, goal:list|tuple|str, is_item=True): self.locally_approach_interact(goal_box=interact_box) + def interact_box_to_goal_location(self, box:dict) -> tuple[float, float]: + """Given an interact box, determine which goal location within the box to aim for + + Args: + box (dict): interact box + + Returns: + tuple[float, float]: the goal location + """ + player_needs_to_face = box['player_needs_to_face'] + if player_needs_to_face == Direction.SOUTH: + top_left = (box['westmost'],box['northmost']) + return top_left + elif player_needs_to_face == Direction.NORTH: + bot_left = (box['westmost'],box['southmost']) + return bot_left + elif player_needs_to_face == Direction.WEST: + bot_right = (box['eastmost'],box['southmost']) + return bot_right + else: + bot_left = (box['westmost'],box['southmost']) + return bot_left + + def nav(self, goal, is_item=True): """The default navigation @@ -260,7 +261,7 @@ def nav(self, goal, is_item=True): path = self.astar_planner.astar(start=tuple(player_location), goal=goal, map_width=MAP_WIDTH, map_height=MAP_HEIGHT, objs=objs, is_item=is_item) return path # this returns a path of x, y locations that the agent will go through without considering other players - + def locally_approach_interact(self, goal_box): """Reactie navigation to approach the interaction object when we are already very close to it (after basic navigation). Shouldn't be used when we are still potentially far. @@ -312,10 +313,10 @@ def locally_approach_interact(self, goal_box): original_command = command while project_collision_with_orientation(player, self.env, command, dist=STEP):# approach interact takes orientation into consideration. - command = Direction(self.turn_ninety_degrees(dir=command)) # take the 90 degrees action instead + command = Direction(self._turn_ninety_degrees(dir=command)) # take the 90 degrees action instead stuck += 1 if stuck >= 10:#been stuck for too long, F it, take the 270 degree action - command = self.turn_ninety_degrees(self.turn_opposite_dir(original_command)) + command = self._turn_ninety_degrees(self._turn_opposite_dir(original_command)) stuck = 0 #hopefully no longer stuck self.execute(action=command.name) @@ -373,18 +374,17 @@ def reactive_nav(self, goal, is_box=False): continue original_command = command while project_collision(player, self.env, command, dist=STEP): - command = Direction(self.turn_ninety_degrees(dir=command)) # take the 90 degrees action instead + command = Direction(self._turn_ninety_degrees(dir=command)) # take the 90 degrees action instead stuck += 1 if stuck >= 10:#been stuck for too long, it's probably a corner, F it, take the 270 degree action - command = self.turn_ninety_degrees(self.turn_opposite_dir(original_command)) - stuck = 0 #hopefully no longer stuck + command = self._turn_ninety_degrees(self._turn_opposite_dir(original_command)) if player['direction'] == command.value: self.execute(action=command.name)# execute once if already facing that direction else: self.execute(action=command.name) self.execute(action=command.name) - def turn_opposite_dir(self, dir:Direction) -> Direction: + def _turn_opposite_dir(self, dir:Direction) -> Direction: """Turn 180 degrees with respect to the given Args: @@ -401,7 +401,7 @@ def turn_opposite_dir(self, dir:Direction) -> Direction: else: return Direction.EAST - def turn_ninety_degrees(self, dir:Direction) -> Direction: + def _turn_ninety_degrees(self, dir:Direction) -> Direction: """Turn 90 degrees clockwise with respect to the given Args: @@ -414,15 +414,7 @@ def turn_ninety_degrees(self, dir:Direction) -> Direction: return Direction.SOUTH return turned_dir - # def go_around_obstacle(self, player, env): - # """Try to go around the obstacle - - # Args: - # player (dict): player - # env (dict): current env - # """ - # #TODO: try to go around the obstacle. Making an "L" shaped manuver - # pass + def step(self, step_location:list|tuple, player_id:int, backtrack:list): """Keep locally adjusting and stepping in the right direction so that `player` ends up `close_enough` to `step_location`. `step_location` should be only one step away diff --git a/final_proj/util.py b/final_proj/util.py index fb91324..5edfe52 100644 --- a/final_proj/util.py +++ b/final_proj/util.py @@ -39,6 +39,38 @@ def euclidean_distance(pos1, pos2): # Calculate Euclidean distance between two points return ((pos1[0] - pos2[0])**2 + (pos1[1] - pos2[1])**2)**0.5 +def calculate_crowdedness_factor(player:dict, box:dict, observation:dict) -> float: + """Given an observation, a player, and a box region, calculate how crowded that region is + + Args: + player (dict): the agent excluded in the calculation + box (dict): the region of interest {"westmost":float, "southmost":float, "eastmost":float, "northmost":float} + observation (dict): observation containing the players in the map + Returns: + how much empty space per unit area + """ + area = abs(box['westmost'] - box['eastmost']) * abs(box['northmost'] - box['southmost']) + occupied_area = 0 + for p in observation['players']: + if p['index'] == player['index']: # don't count our player + continue + if obj_overlap_with_box(p, box): + occupied_area += p['width']*p['height'] + for c in observation['carts']: + if c['owner'] == player['index']: # don't count our cart + continue + if obj_overlap_with_box(c, box): + occupied_area += c['width'] * c['height'] + for b in observation['baskets']: + if b['owner'] == player['index']: # don't count our basket + continue + if obj_overlap_with_box(b, box): + occupied_area += b['width'] * b['height'] + return 1.0 - (occupied_area / area) + + # divide number of players by area of the box region + return player_count / (abs(box['westmost'] - box['eastmost']) * abs(box['northmost'] - box['southmost'])) + def bounding_box(place:dict) -> dict: """find the bounding box for a place. @@ -124,12 +156,13 @@ def four_side_interact_area(place_obj:dict) -> dict: interact_boxes['EAST_BOX'] = east_interact_box return interact_boxes -def player_overlap_with_interact_box(player, interact_box): +def obj_overlap_with_box(obj:dict, box:dict): + obj['bounding_box'] = bounding_box(place=obj) return not ( - player['bounding_box']['westmost'] > interact_box['eastmost'] or\ - player['bounding_box']['northmost'] > interact_box['southmost'] or\ - player['bounding_box']['eastmost'] < interact_box['westmost'] or\ - player['bounding_box']['southmost'] < interact_box['northmost'] + obj['bounding_box']['westmost'] > box['eastmost'] or\ + obj['bounding_box']['northmost'] > box['southmost'] or\ + obj['bounding_box']['eastmost'] < box['westmost'] or\ + obj['bounding_box']['southmost'] < box['northmost'] ) @@ -144,7 +177,7 @@ def can_interact_in_box(player, interact_box) -> bool: bool: Whether the player can interact in box """ player['bounding_box'] = bounding_box(place=player) - if player_overlap_with_interact_box(player=player, interact_box=interact_box) and player['direction'] == interact_box['player_needs_to_face'].value: + if obj_overlap_with_box(obj=player, box=interact_box) and player['direction'] == interact_box['player_needs_to_face'].value: return True return False @@ -159,7 +192,7 @@ def can_interact_player(player, place_obj) -> bool: bool: whether the player and the place can interact """ for interact_box in place_obj['interact_boxes']: - if player_overlap_with_interact_box(player=player, interact_box=interact_box) and player_directions[player['direction']] == interact_box['player_needs_to_face']: + if obj_overlap_with_box(obj=player, box=interact_box) and player_directions[player['direction']] == interact_box['player_needs_to_face']: return True return False diff --git a/helper.py b/helper.py index e83c6d7..847d95c 100644 --- a/helper.py +++ b/helper.py @@ -92,7 +92,7 @@ def project_collision_with_orientation(obj, state, direction: Direction, dist=0. return True return False -def project_collision(obj, state, direction: Direction, dist=0.4, buffer=0.0): +def project_collision(obj:dict|list|tuple, state, direction: Direction, dist=0.4, buffer=0.0): """Project collision. This should only be used when the player is likely far from the target item they want to interact with. Otherwise, the player might get stuck turning back and forth in a corner formed by static obstacles Args: From 52a2e9264a2bdc300dbd46a6a57b666ef603594b Mon Sep 17 00:00:00 2001 From: Helen Date: Fri, 26 Apr 2024 19:53:07 -0400 Subject: [PATCH 19/22] integrated high level planning --- final_proj/fast_high_level_astar.py | 6 +- final_proj/socket_agent_proj.py | 107 ++++++---------------------- final_proj/util.py | 10 +-- 3 files changed, 30 insertions(+), 93 deletions(-) diff --git a/final_proj/fast_high_level_astar.py b/final_proj/fast_high_level_astar.py index dfbe68f..a53525b 100644 --- a/final_proj/fast_high_level_astar.py +++ b/final_proj/fast_high_level_astar.py @@ -79,7 +79,7 @@ def update_position_to_center(obj_pose): return obj_pose -class Astar_agent: +class HighLevelPlanner: def __init__(self, socket_game, env): self.shopping_list = env['observation']['players'][0]['shopping_list'] self.shopping_quant = env['observation']['players'][0]['list_quant'] @@ -230,6 +230,8 @@ def astar(self, player, start, goal, obs): while current: path.append(current) current = came_from[current] + if current == start_region: + break path.reverse() return path @@ -275,7 +277,7 @@ def find_item_position(data, item_name): game_state = json.loads(state) shopping_list = game_state['observation']['players'][0]['shopping_list'] shopping_quant = game_state['observation']['players'][0]['list_quant'] - agent = Astar_agent(socket_game=sock_game, env=game_state) + agent = HighLevelPlanner(socket_game=sock_game, env=game_state) print(shopping_list) diff --git a/final_proj/socket_agent_proj.py b/final_proj/socket_agent_proj.py index 9c23268..ef8f3a1 100755 --- a/final_proj/socket_agent_proj.py +++ b/final_proj/socket_agent_proj.py @@ -12,6 +12,7 @@ from helper import project_collision from util import * from final_proj.fast_high_level_astar import * +from box_regions import * # todo: update with Helen's method for making interaction areas? def populate_locs(observation): @@ -78,7 +79,7 @@ def __init__(self, conn, agent_id, env): self.container_type = '' self.holding_container = False self.holding_food = None - self.astar_planner = Astar_agent(socket_game=conn, env=env) + self.planner = HighLevelPlanner(socket_game=conn, env=env) def transition(self): self.execute(action='NOP') # this updates self.env @@ -209,18 +210,25 @@ def goto(self, goal:list|tuple|str, is_item=True): if self.holding_container and self.container_type == 'cart': print(f"Agent {self.agent_id} going to location {goal} with cart") path = [] - pass # TODO: goto with cart. TA says it might be as simple as changing the player's shape. If it's too complicated we will skip it + pass # TODO: goto with cart. TA says it might be as simple as changing the player's shape as long as they are holding a cart and change it back once they are not. If it's too complicated we will skip it else: print(f"Agent {self.agent_id} planning a path to {goal} without cart") - path = self.nav(goal, is_item=is_item) + path = self.planner.astar( + player_id=self.agent_id, + start=self.env['observation']['players'][self.agent_id], + goal=goal, + obs=self.env['observation'] + ) print(f"Agent {self.agent_id} going to location {goal} without cart") - for intermediate_target_location in path: # astar planner only gets us close to the goal - self.step(step_location=intermediate_target_location, player_id=self.agent_id, backtrack=[]) + for box_region in path: + self.reactive_nav(goal=box_region.midpoint, is_box=False) - - if is_item: # locally adjust to make sure we can interact with the target item - self.locally_approach_interact(goal_box=interact_box) + # we should now be in the same region as the goal (x, y) location + if is_item: + self.reactive_nav(goal=interact_box, is_box=True) + else: + self.reactive_nav(goal=goal, is_box=False) def interact_box_to_goal_location(self, box:dict) -> tuple[float, float]: @@ -245,80 +253,7 @@ def interact_box_to_goal_location(self, box:dict) -> tuple[float, float]: else: bot_left = (box['westmost'],box['southmost']) return bot_left - - - def nav(self, goal, is_item=True): - """The default navigation - - Args: - goal (_type_): (x, y) - - Returns: - _type_: a list of (x, y) to goal - """ - player = self.env['observation']['players'][self.agent_id] - player_location = player['position'] - path = self.astar_planner.astar(start=tuple(player_location), goal=goal, map_width=MAP_WIDTH, map_height=MAP_HEIGHT, objs=objs, is_item=is_item) - return path # this returns a path of x, y locations that the agent will go through without considering other players - - - def locally_approach_interact(self, goal_box): - """Reactie navigation to approach the interaction object when we are already very close to it (after basic navigation). Shouldn't be used when we are still potentially far. - - Args: - goal (dict): an interact_box - """ - ############################################## - ## The old reactive navigation code is below## - ############################################## - target = "x" - reached_x = False - reached_y = False - stuck = 0 - while True: - player = self.env['observation']['players'][self.agent_id] - goal_box_point = self.interact_box_to_goal_location(box=goal_box) - x_dist = player['position'][0] - goal_box_point[0] - y_dist = player['position'][1] - goal_box_point[1] - if can_interact_in_box(player=player, interact_box=goal_box): - reached_x = True - reached_y = True - - if abs(x_dist) < STEP: - reached_x = True - if abs(y_dist) < STEP: - reached_y = True - if reached_x and reached_y: - break - - if target == "x": - if x_dist < -STEP: - command = Direction.EAST - elif x_dist > STEP: - command = Direction.WEST - else: - reached_y = False - target = "y" - continue - else: - if y_dist < -STEP: - command = Direction.SOUTH - elif y_dist > STEP: - command = Direction.NORTH - else: - reached_x = False - target = "x" - continue - - original_command = command - while project_collision_with_orientation(player, self.env, command, dist=STEP):# approach interact takes orientation into consideration. - command = Direction(self._turn_ninety_degrees(dir=command)) # take the 90 degrees action instead - stuck += 1 - if stuck >= 10:#been stuck for too long, F it, take the 270 degree action - command = self._turn_ninety_degrees(self._turn_opposite_dir(original_command)) - stuck = 0 #hopefully no longer stuck - self.execute(action=command.name) def reactive_nav(self, goal, is_box=False): @@ -338,11 +273,11 @@ def reactive_nav(self, goal, is_box=False): player = self.env['observation']['players'][self.agent_id] if is_box: - x_dist = player['position'][0] - goal['westmost'] - y_dist = player['position'][1] - goal['northmost'] + goal_loc = self.interact_box_to_goal_location(box=goal) + x_dist = player['position'][0] - goal_loc['westmost'] + y_dist = player['position'][1] - goal_loc['northmost'] if can_interact_in_box(player=player, interact_box=goal): - reached_x = True - reached_y = True + break else: x_dist = player['position'][0] - goal[0] y_dist = player['position'][1] - goal[1] @@ -426,7 +361,7 @@ def step(self, step_location:list|tuple, player_id:int, backtrack:list): """ goal_x, goal_y = step_location player_x, player_y = self.env['observation']["players"][player_id]['position'] - while not self.astar_planner.is_close_enough(current=self.env['observation']["players"][player_id]['position'], goal=step_location, tolerance=LOCATION_TOLERANCE, is_item=False):#deals with stochasticity: keep locally adjusting to the right location until it's close enough + while not self.planner.is_close_enough(current=self.env['observation']["players"][player_id]['position'], goal=step_location, tolerance=LOCATION_TOLERANCE, is_item=False):#deals with stochasticity: keep locally adjusting to the right location until it's close enough # compare previous position with current position to determine if a location needs to be saved in the player's backtracking trace prev_x = player_x prev_y = player_y diff --git a/final_proj/util.py b/final_proj/util.py index 5edfe52..02fdd1c 100644 --- a/final_proj/util.py +++ b/final_proj/util.py @@ -39,11 +39,11 @@ def euclidean_distance(pos1, pos2): # Calculate Euclidean distance between two points return ((pos1[0] - pos2[0])**2 + (pos1[1] - pos2[1])**2)**0.5 -def calculate_crowdedness_factor(player:dict, box:dict, observation:dict) -> float: +def calculate_crowdedness_factor(player_id:int, box:dict, observation:dict) -> float: """Given an observation, a player, and a box region, calculate how crowded that region is Args: - player (dict): the agent excluded in the calculation + player_id (int): the agent excluded in the calculation box (dict): the region of interest {"westmost":float, "southmost":float, "eastmost":float, "northmost":float} observation (dict): observation containing the players in the map Returns: @@ -52,17 +52,17 @@ def calculate_crowdedness_factor(player:dict, box:dict, observation:dict) -> flo area = abs(box['westmost'] - box['eastmost']) * abs(box['northmost'] - box['southmost']) occupied_area = 0 for p in observation['players']: - if p['index'] == player['index']: # don't count our player + if p['index'] == player_id: # don't count our player continue if obj_overlap_with_box(p, box): occupied_area += p['width']*p['height'] for c in observation['carts']: - if c['owner'] == player['index']: # don't count our cart + if c['owner'] == player_id: # don't count our cart continue if obj_overlap_with_box(c, box): occupied_area += c['width'] * c['height'] for b in observation['baskets']: - if b['owner'] == player['index']: # don't count our basket + if b['owner'] == player_id: # don't count our basket continue if obj_overlap_with_box(b, box): occupied_area += b['width'] * b['height'] From 611a6f362693965cbadd1e18f541d16110ec6a31 Mon Sep 17 00:00:00 2001 From: tonkology <105685922+tonkology@users.noreply.github.com> Date: Fri, 26 Apr 2024 21:31:59 -0400 Subject: [PATCH 20/22] Update socket_agent_proj.py - added add_to_container function It works (for the current configuration where the agent is south of the shelf --- final_proj/socket_agent_proj.py | 61 +++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/final_proj/socket_agent_proj.py b/final_proj/socket_agent_proj.py index ef8f3a1..fb1d7f6 100755 --- a/final_proj/socket_agent_proj.py +++ b/final_proj/socket_agent_proj.py @@ -396,8 +396,65 @@ def step(self, step_location:list|tuple, player_id:int, backtrack:list): # TODO: Agent picks up an item and adds it to the cart def add_to_container(self): - print(f"Agent {self.agent_id} adding an item to the {self.container_type}") - + #self.env + #a function to be used if the item is north of the player + violation=self.env['violations'] + #moving the cart south of the player + action = "0 " + "SOUTH" + sock_game.send(str.encode(action)) # send action to env + output = recv_socket_data(sock_game) # get observation from env + self.env = json.loads(output) + #leaving the cart + action = "0 " + "TOGGLE_CART" + sock_game.send(str.encode(action)) # send action to env + output = recv_socket_data(sock_game) # get observation from env + self.env = json.loads(output) + #moving the player till it hits the shelf + while not any("shelf" in v for v in violation): #I've added shelf because the player might hit something else (a player of a cart) + action = "0 " + "NORTH" + sock_game.send(str.encode(action)) # send action to env + output = recv_socket_data(sock_game) # get observation from env + self.env = json.loads(output) + current_p_y=self.env['observation']['players'][0]['position'][1] + violation=self.env['violations'] + #picking up the item + action = "0 " + "INTERACT" + sock_game.send(str.encode(action)) # send action to env + output = recv_socket_data(sock_game) # get observation from env + self.env = json.loads(output) + #clearing the message + action = "0 " + "INTERACT" + sock_game.send(str.encode(action)) # send action to env + output = recv_socket_data(sock_game) # get observation from env + self.env = json.loads(output) + violation=[] + len(violation) + #moving back to the cart + while not any("cart" in v for v in violation): + action = "0 " + "SOUTH" + sock_game.send(str.encode(action)) # send action to env + output = recv_socket_data(sock_game) # get observation from env + self.env = json.loads(output) + current_p_y=self.env['observation']['players'][0]['position'][1] + violation=self.env['violations'] + #placing the item to the cart + action = "0 " + "INTERACT" + sock_game.send(str.encode(action)) # send action to env + output = recv_socket_data(sock_game) # get observation from env + self.env = json.loads(output) + #clearing the message + action = "0 " + "INTERACT" + sock_game.send(str.encode(action)) # send action to env + output = recv_socket_data(sock_game) # get observation from env + self.env = json.loads(output) + #re-picking the cart + action = "0 " + "TOGGLE_CART" + sock_game.send(str.encode(action)) # send action to env + output = recv_socket_data(sock_game) # get observation from env + self.env = json.loads(output) + + return self.env + pass # TODO self.goal = "" From c5b1a9240dfff28d9efabc4e4b31939d9ba03aa7 Mon Sep 17 00:00:00 2001 From: tonkology <105685922+tonkology@users.noreply.github.com> Date: Sat, 27 Apr 2024 11:24:47 -0400 Subject: [PATCH 21/22] Update socket_agent_proj.py Changed "cart" to "basket" --- final_proj/socket_agent_proj.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/final_proj/socket_agent_proj.py b/final_proj/socket_agent_proj.py index fb1d7f6..0c41846 100755 --- a/final_proj/socket_agent_proj.py +++ b/final_proj/socket_agent_proj.py @@ -430,7 +430,7 @@ def add_to_container(self): violation=[] len(violation) #moving back to the cart - while not any("cart" in v for v in violation): + while not any("basket" in v for v in violation): action = "0 " + "SOUTH" sock_game.send(str.encode(action)) # send action to env output = recv_socket_data(sock_game) # get observation from env From d92b4560580c4174d8e31a1313407d0c324027bd Mon Sep 17 00:00:00 2001 From: tonkology <105685922+tonkology@users.noreply.github.com> Date: Sat, 27 Apr 2024 11:37:57 -0400 Subject: [PATCH 22/22] Update socket_agent_proj.py updated the agent: - moving left three steps to get exactly north of the basket - added "counter" with "shelf" in checking if the player hitting fish and cheese counters --- final_proj/socket_agent_proj.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/final_proj/socket_agent_proj.py b/final_proj/socket_agent_proj.py index 0c41846..107d963 100755 --- a/final_proj/socket_agent_proj.py +++ b/final_proj/socket_agent_proj.py @@ -410,7 +410,7 @@ def add_to_container(self): output = recv_socket_data(sock_game) # get observation from env self.env = json.loads(output) #moving the player till it hits the shelf - while not any("shelf" in v for v in violation): #I've added shelf because the player might hit something else (a player of a cart) + while not any("shelf" or "counter" in v for v in violation): #I've added shelf because the player might hit something else (a player of a cart) action = "0 " + "NORTH" sock_game.send(str.encode(action)) # send action to env output = recv_socket_data(sock_game) # get observation from env @@ -427,6 +427,22 @@ def add_to_container(self): sock_game.send(str.encode(action)) # send action to env output = recv_socket_data(sock_game) # get observation from env self.env = json.loads(output) + action = "0 " + "WEST" + sock_game.send(str.encode(action)) # send action to env + output = recv_socket_data(sock_game) # get observation from env + self.env = json.loads(output) + action = "0 " + "WEST" + sock_game.send(str.encode(action)) # send action to env + output = recv_socket_data(sock_game) # get observation from env + self.env = json.loads(output) + action = "0 " + "WEST" + sock_game.send(str.encode(action)) # send action to env + output = recv_socket_data(sock_game) # get observation from env + self.env = json.loads(output) + action = "0 " + "WEST" + sock_game.send(str.encode(action)) # send action to env + output = recv_socket_data(sock_game) # get observation from env + self.env = json.loads(output) violation=[] len(violation) #moving back to the cart