MAPF_Solver / functions_plotting.py
ArseniyPerchik's picture
more
ad7641a
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