import numpy as np from globals import * # -------------------------------------------------------------------------------------------------------------------- # # -------------------------------------------------------------------------------------------------------------------- # # -------------------------------------------------------------------------------------------------------------------- # # PLOT FUNCS # -------------------------------------------------------------------------------------------------------------------- # # -------------------------------------------------------------------------------------------------------------------- # # -------------------------------------------------------------------------------------------------------------------- # def get_marker_line(alg_name: str): if alg_name not in mrc_dict or 'marker-line' not in mrc_dict[alg_name]: marker_line = '' if 'APF' in alg_name: marker_line += '--' else: marker_line += '-' marker_line += next(markers_iter) if alg_name not in mrc_dict: mrc_dict[alg_name] = {'marker-line': marker_line} else: mrc_dict[alg_name]['marker-line'] = marker_line return marker_line return mrc_dict[alg_name]['marker-line'] def get_alg_color(alg_name: str): if alg_name not in mrc_dict or 'color' not in mrc_dict[alg_name]: color = next(colors_iter) if alg_name not in mrc_dict: mrc_dict[alg_name] = {'color': color} else: mrc_dict[alg_name]['color'] = color return color return mrc_dict[alg_name]['color'] def get_color(i): index_to_pick = i % len(color_names) return color_names[index_to_pick] def set_plot_title(ax, title, size=9): ax.set_title(f'{title}', fontweight="bold", size=size) def set_legend(ax, framealpha=None, size=9): to_put_legend = True # to_put_legend = False if to_put_legend: if not framealpha: framealpha = 0.8 legend_properties = {'weight': 'bold', 'size': size} # legend_properties = {} if framealpha is not None: ax.legend(prop=legend_properties, framealpha=framealpha) else: ax.legend(prop=legend_properties) def plot_step_in_env(ax, info): ax.cla() # nodes = info['nodes'] # a_name = info['i_agent'].name if 'i_agent' in info else 'agent_0' img_np = info['img_np'] agents = info['agents'] iteration = info['iteration'] field = img_np * -1 ax.imshow(field, origin='lower', cmap='binary') others_y_list, others_x_list, others_cm_list, alpha_list = [], [], [], [] for agent in agents: if 'i_agent' in info and info['i_agent'] == agent: continue curr_node = agent.curr_node others_y_list.append(curr_node.y) others_x_list.append(curr_node.x) others_cm_list.append(get_color(agent.num)) if agent.curr_node == agent.get_goal_node(): alpha_list.append(0.2) else: alpha_list.append(1) ax.scatter(others_y_list, others_x_list, s=100, c='k', alpha=alpha_list) ax.scatter(others_y_list, others_x_list, s=50, c=np.array(others_cm_list), alpha=alpha_list) # ax.scatter(others_y_list, others_x_list, s=50, c='yellow') if 'i_agent' in info: i_agent: AgentAlg = info['i_agent'] curr_node = i_agent.curr_node next_goal_node = i_agent.get_goal_node() ax.scatter([curr_node.y], [curr_node.x], s=200, c='k') ax.scatter([curr_node.y], [curr_node.x], s=100, c='r') ax.scatter([next_goal_node.y], [next_goal_node.x], s=400, c='white', marker='X', alpha=0.4) ax.scatter([next_goal_node.y], [next_goal_node.x], s=200, c='red', marker='X', alpha=0.4) title_str = 'plot_step_in_env\n' if 'to_title' in info: to_title = info['to_title'] title_str += f'{to_title}\n ' if 'img_dir' in info: img_dir = info['img_dir'] title_str += f'Map: {img_dir[:-4]}\n ' if 'i' in info: i = info['i'] title_str += f'(iteration: {i + 1})\n' title_str += f'{len(agents)} agents | iteration: {iteration}' ax.set_title(title_str) def plot_sr(ax, info): ax.cla() alg_names = info['alg_names'] n_agents_list = info['n_agents_list'] img_dir = info['img_dir'] for alg_name in alg_names: sr_list = [] x_list = [] for n_a in n_agents_list: if len(info[alg_name][f'{n_a}']['sr']) > 0: sr_list.append(np.sum(info[alg_name][f'{n_a}']['sr']) / len(info[alg_name][f'{n_a}']['sr'])) x_list.append(n_a) ax.plot(x_list, sr_list, get_marker_line(alg_name), color=get_alg_color(alg_name), alpha=0.5, label=f'{alg_name}', linewidth=5, markersize=20) # ax.set_xlim([min(n_agents_list) - 20, max(n_agents_list) + 20]) ax.set_xlim([min(n_agents_list), max(n_agents_list)]) ax.set_ylim([0, 1 + 0.1]) ax.set_xticks(n_agents_list) ax.set_xlabel('N agents', fontsize=27) ax.set_ylabel('Success Rate', fontsize=27) # ax.set_title(f'{img_dir[:-4]} Map | time limit: {time_to_think_limit} sec.') # set_plot_title(ax, f'{img_dir[:-4]} Map | time limit: {time_to_think_limit} sec.', size=11) set_plot_title(ax, f'{img_dir[:-4]}', size=30) # set_legend(ax, size=18) labelsize = 20 ax.xaxis.set_tick_params(labelsize=labelsize) ax.yaxis.set_tick_params(labelsize=labelsize) plt.tight_layout() def plot_time_metric(ax, info): ax.cla() alg_names = info['alg_names'] n_agents_list = info['n_agents_list'] img_dir = info['img_dir'] max_time = info['max_time'] # x_list = n_agents_list[:4] x_list = n_agents_list for alg_name in alg_names: soc_list = [] x_list_to_plot = [] res_str = '' for n_a in x_list: if len(info[alg_name][f'{n_a}']['time']) > 5: x_list_to_plot.append(n_a) soc_list.append(np.mean(info[alg_name][f'{n_a}']['time'])) res_str += f'\t{n_a} - {soc_list[-1]: .2f}, ' ax.plot(x_list_to_plot, soc_list, get_marker_line(alg_name), color=get_alg_color(alg_name), alpha=0.5, label=f'{alg_name}', linewidth=5, markersize=20) # print(f'{alg_name}\t\t\t: {res_str}') ax.set_xlim([min(x_list) - 20, max(x_list) + 20]) ax.set_xticks(x_list) ax.set_xlabel('N agents', fontsize=27) ax.set_ylabel('Runtime', fontsize=27) # ax.set_title(f'{img_dir[:-4]} Map | time limit: {time_to_think_limit} sec.') set_plot_title(ax, f'{img_dir[:-4]}', size=30) labelsize = 20 ax.xaxis.set_tick_params(labelsize=labelsize) ax.yaxis.set_tick_params(labelsize=labelsize) # set_legend(ax, size=24) def plot_time_metric_cactus(ax, info): ax.cla() alg_names = info['alg_names'] n_agents_list = info['n_agents_list'] img_dir = info['img_dir'] max_time = info['max_time'] # x_list = n_agents_list[:4] x_list = n_agents_list for alg_name in alg_names: rt_list = [] # res_str = '' for n_a in x_list: # for j in info[alg_name][f'{n_a}']['time']: # if j > 30: # print() rt_list.extend(info[alg_name][f'{n_a}']['time']) # res_str += f'\t{n_a} - {rt_list[-1]: .2f}, ' rt_list.sort() ax.plot(rt_list, '-', color=get_alg_color(alg_name), alpha=0.5, linewidth=5, markersize=20) # ax.plot(rt_list, get_marker_line(alg_name), color=get_alg_color(alg_name), alpha=0.5, label=f'{alg_name}', linewidth=5, markersize=20) # Choose evenly spaced indices for the markers num_markers = 10 # Number of markers to show indices = np.linspace(0, len(rt_list) - 1, num_markers, dtype=int) # Add markers at the chosen indices x_data = np.arange(0, len(rt_list)) rt_list = np.array(rt_list) plt.plot(x_data[indices], rt_list[indices], mrc_dict[alg_name]['marker'], color=get_alg_color(alg_name), markersize=15, label=f'{alg_name}') # print(f'{i_alg}\t\t\t: {res_str}') # ax.set_xlim([min(x_list) - 20, max(x_list) + 20]) # ax.set_xticks(x_list) ax.set_xlabel('Solved Instances', fontsize=27) ax.set_ylabel('Runtime', fontsize=27) # ax.set_title(f'{img_dir[:-4]} Map | time limit: {time_to_think_limit} sec.') # set_plot_title(ax, f'{img_dir[:-4]} Map | time limit: {max_time} sec.', size=11) set_plot_title(ax, f'{img_dir[:-4]}', size=30) labelsize = 20 ax.xaxis.set_tick_params(labelsize=labelsize) ax.yaxis.set_tick_params(labelsize=labelsize) # set_legend(ax, size=20) def plot_soc(ax, info): ax.cla() alg_names = info['alg_names'] n_agents_list = info['n_agents_list'] img_dir = info['img_dir'] max_time = info['max_time'] i_problems = info['i_problems'] for alg_name in alg_names: soc_list = [] x_list = [] for n_a in n_agents_list: if len(info[alg_name][f'{n_a}']['soc']) < 5: break x_list.append(n_a) soc_list.append(np.mean(info[alg_name][f'{n_a}']['soc'])) ax.plot(x_list, soc_list, get_marker_line(alg_name), color=get_alg_color(alg_name), alpha=0.5, label=f'{alg_name}', linewidth=5, markersize=20) ax.set_xlim([min(n_agents_list) - 20, max(n_agents_list) + 20]) ax.set_xticks(n_agents_list) ax.set_xlabel('N agents', fontsize=27) ax.set_ylabel('SoC', fontsize=27) # ax.set_title(f'{img_dir[:-4]} Map | time limit: {time_to_think_limit} sec.') set_plot_title(ax, f'{img_dir[:-4]}', size=30) labelsize = 20 ax.xaxis.set_tick_params(labelsize=labelsize) ax.yaxis.set_tick_params(labelsize=labelsize) # set_legend(ax, size=25) def plot_soc_cactus(ax, info): ax.cla() alg_names = info['alg_names'] n_agents_list = info['n_agents_list'] img_dir = info['img_dir'] max_time = info['max_time'] for alg_name in alg_names: y_list = [] # res_str = '' for n_a in n_agents_list: y_list.extend(info[alg_name][f'{n_a}']['soc']) # res_str += f'\t{n_a} - {y_list[-1]: .2f}, ' y_list.sort() ax.plot(y_list, get_marker_line(alg_name), color=get_alg_color(alg_name), alpha=0.5, label=f'{alg_name}', linewidth=5, markersize=20) # print(f'{i_alg}\t\t\t: {res_str}') # ax.set_xlim([min(x_list) - 20, max(x_list) + 20]) # ax.set_xticks(x_list) ax.set_xlabel('Solved Instances', fontsize=27) ax.set_ylabel('SoC', fontsize=27) # ax.set_title(f'{img_dir[:-4]} Map | time limit: {time_to_think_limit} sec.') set_plot_title(ax, f'{img_dir[:-4]}', size=30) labelsize = 20 ax.xaxis.set_tick_params(labelsize=labelsize) ax.yaxis.set_tick_params(labelsize=labelsize) # set_legend(ax, size=23) def plot_makespan(ax, info): ax.cla() alg_names = info['alg_names'] n_agents_list = info['n_agents_list'] img_dir = info['img_dir'] max_time = info['max_time'] for alg_name in alg_names: makespan_list = [] x_list_to_plot = [] for n_a in n_agents_list: if len(info[alg_name][f'{n_a}']['makespan']) > 5: x_list_to_plot.append(n_a) makespan_list.append(np.mean(info[alg_name][f'{n_a}']['makespan'])) ax.plot(x_list_to_plot, makespan_list, get_marker_line(alg_name), color=get_alg_color(alg_name), alpha=0.5, label=f'{alg_name}', linewidth=10, markersize=20) # ax.set_xlim([min(n_agents_list) - 20, max(n_agents_list) + 20]) # ax.set_xticks(n_agents_list) ax.set_xlabel('N agents', fontsize=27) ax.set_ylabel('Makespan', fontsize=27) # ax.set_title(f'{img_dir[:-4]} Map | time limit: {time_to_think_limit} sec.') set_plot_title(ax, f'{img_dir[:-4]}', size=30) labelsize = 20 ax.xaxis.set_tick_params(labelsize=labelsize) ax.yaxis.set_tick_params(labelsize=labelsize) # set_legend(ax, size=25) def plot_makespan_cactus(ax, info): ax.cla() alg_names = info['alg_names'] n_agents_list = info['n_agents_list'] img_dir = info['img_dir'] max_time = info['max_time'] for alg_name in alg_names: y_list = [] # res_str = '' for n_a in n_agents_list: y_list.extend(info[alg_name][f'{n_a}']['makespan']) # res_str += f'\t{n_a} - {y_list[-1]: .2f}, ' y_list.sort() y_list.sort() ax.plot(y_list, '-', color=get_alg_color(alg_name), alpha=0.5, linewidth=5, markersize=20) # ax.plot(y_list, get_marker_line(alg_name), color=get_alg_color(alg_name), alpha=0.5, label=f'{alg_name}', linewidth=3, markersize=10) # Choose evenly spaced indices for the markers num_markers = 10 # Number of markers to show indices = np.linspace(0, len(y_list) - 1, num_markers, dtype=int) # Add markers at the chosen indices x_data = np.arange(0, len(y_list)) rt_list = np.array(y_list) plt.plot(x_data[indices], rt_list[indices], mrc_dict[alg_name]['marker'], color=get_alg_color(alg_name), markersize=15, label=f'{alg_name}') # ax.set_xlim([min(x_list) - 20, max(x_list) + 20]) # ax.set_xticks(x_list) ax.set_xlabel('Solved Instances', fontsize=27) ax.set_ylabel('Makespan', fontsize=27) # ax.set_title(f'{img_dir[:-4]} Map | time limit: {time_to_think_limit} sec.') set_plot_title(ax, f'{img_dir[:-4]}', size=30) labelsize = 20 ax.xaxis.set_tick_params(labelsize=labelsize) ax.yaxis.set_tick_params(labelsize=labelsize) # set_legend(ax, size=20) def plot_throughput(ax, info): ax.cla() alg_names = info['alg_names'] n_agents_list = info['n_agents_list'] img_dir = info['img_dir'] n_steps = info['n_steps'] for alg_name in alg_names: throughput_list = [] for n_a in n_agents_list: throughput_list.append(np.mean(info[alg_name][f'{n_a}']['throughput'])) ax.plot(n_agents_list, throughput_list, get_marker_line(alg_name), color=get_alg_color(alg_name), alpha=0.5, label=f'{alg_name}', linewidth=8, markersize=20) ax.set_xlim([min(n_agents_list) - 20, max(n_agents_list) + 20]) ax.set_xticks(n_agents_list) ax.set_xlabel('N agents', fontsize=20, fontweight='bold') ax.set_ylabel('Throughput', fontsize=20, fontweight='bold') # ax.set_title(f'{img_dir[:-4]} Map | time limit: {time_to_think_limit} sec.') set_plot_title(ax, f'{img_dir[:-4]}', size=22) labelsize = 20 ax.xaxis.set_tick_params(labelsize=labelsize) ax.yaxis.set_tick_params(labelsize=labelsize) # set_legend(ax, size=28) plt.tight_layout() # def get_marker_line(alg_name: str): # if alg_name in markers_lines_dict: # return markers_lines_dict[alg_name] # marker_line = '-' # if 'PrP' == alg_name: # marker_line += 'v' # elif 'LNS2' == alg_name: # marker_line += 'p' # elif 'PIBT' == alg_name: # marker_line += 'h' # elif 'LaCAM' == alg_name: # marker_line += '1' # elif 'LaCAM*' == alg_name: # marker_line += '2' # elif alg_name in ['CGA-MAPF', 'MACGA']: # marker_line += 'X' # # marker_line += 'd' # elif 'CGA(L)' == alg_name: # marker_line += 'X' # elif alg_name in ['CGA(L)+PIBT', 'MACGA+PIBT']: # marker_line += 'd' # else: # marker_line += random.choice(markers) # markers_lines_dict[alg_name] = marker_line # return marker_line # # # def get_alg_color(alg_name: str): # if alg_name in colors_dict: # return colors_dict[alg_name] # if 'PrP' == alg_name: # color = 'green' # elif 'LNS2' == alg_name: # color = 'blue' # elif 'PIBT' == alg_name: # color = 'salmon' # elif 'LaCAM' == alg_name: # color = 'indigo' # elif 'LaCAM*' == alg_name: # color = 'plum' # elif alg_name in ['CGA-MAPF', 'MACGA']: # color = 'red' # elif 'CGA(L)' == alg_name: # color = 'purple' # elif alg_name in ['CGA(L)+PIBT', 'MACGA+PIBT']: # color = 'brown' # else: # color = random.choice(color_names) # colors_dict[alg_name] = color # return color