216 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Python
		
	
	
		
		
			
		
	
	
			216 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Python
		
	
	
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								Process timing results from timeShonanAveraging
							 | 
						||
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import xlrd
							 | 
						||
| 
								 | 
							
								import numpy as np
							 | 
						||
| 
								 | 
							
								import matplotlib.pyplot as plt
							 | 
						||
| 
								 | 
							
								from matplotlib.ticker import FuncFormatter
							 | 
						||
| 
								 | 
							
								import heapq
							 | 
						||
| 
								 | 
							
								from collections import Counter
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def make_combined_plot(name, p_values, times, costs, min_cost_range=10):
							 | 
						||
| 
								 | 
							
								    """ Make a plot that combines timing and SO(3) cost.
							 | 
						||
| 
								 | 
							
								        Arguments:
							 | 
						||
| 
								 | 
							
								            name: string of the plot title
							 | 
						||
| 
								 | 
							
								            p_values: list of p-values (int)
							 | 
						||
| 
								 | 
							
								            times: list of timings (seconds)
							 | 
						||
| 
								 | 
							
								            costs: list of costs (double)
							 | 
						||
| 
								 | 
							
								        Will calculate the range of the costs, default minimum range = 10.0
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    min_cost = min(costs)
							 | 
						||
| 
								 | 
							
								    cost_range = max(max(costs)-min_cost,min_cost_range)
							 | 
						||
| 
								 | 
							
								    fig = plt.figure()
							 | 
						||
| 
								 | 
							
								    ax1 = fig.add_subplot(111)
							 | 
						||
| 
								 | 
							
								    ax1.plot(p_values, times, label="time")
							 | 
						||
| 
								 | 
							
								    ax1.set_ylabel('Time used to optimize \ seconds')
							 | 
						||
| 
								 | 
							
								    ax1.set_xlabel('p_value')
							 | 
						||
| 
								 | 
							
								    ax2 = ax1.twinx()
							 | 
						||
| 
								 | 
							
								    ax2.plot(p_values, costs, 'r', label="cost")
							 | 
						||
| 
								 | 
							
								    ax2.set_ylabel('Cost at SO(3) form')
							 | 
						||
| 
								 | 
							
								    ax2.set_xlabel('p_value')
							 | 
						||
| 
								 | 
							
								    ax2.set_xticks(p_values)
							 | 
						||
| 
								 | 
							
								    ax2.set_ylim(min_cost, min_cost + cost_range)
							 | 
						||
| 
								 | 
							
								    plt.title(name, fontsize=12)
							 | 
						||
| 
								 | 
							
								    ax1.legend(loc="upper left")
							 | 
						||
| 
								 | 
							
								    ax2.legend(loc="upper right")
							 | 
						||
| 
								 | 
							
								    plt.interactive(False)
							 | 
						||
| 
								 | 
							
								    plt.show()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def make_convergence_plot(name, p_values, times, costs, iter=10):
							 | 
						||
| 
								 | 
							
								    """ Make a bar that show the success rate for each p_value according to whether the SO(3) cost converges
							 | 
						||
| 
								 | 
							
								        Arguments:
							 | 
						||
| 
								 | 
							
								            name: string of the plot title
							 | 
						||
| 
								 | 
							
								            p_values: list of p-values (int)
							 | 
						||
| 
								 | 
							
								            times: list of timings (seconds)
							 | 
						||
| 
								 | 
							
								            costs: list of costs (double)
							 | 
						||
| 
								 | 
							
								            iter: int of iteration number for each p_value
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    max_cost = np.mean(np.array(heapq.nlargest(iter, costs)))
							 | 
						||
| 
								 | 
							
								    # calculate mean costs for each p value
							 | 
						||
| 
								 | 
							
								    p_values = list(dict(Counter(p_values)).keys())
							 | 
						||
| 
								 | 
							
								    # make sure the iter number 
							 | 
						||
| 
								 | 
							
								    iter = int(len(times)/len(p_values))
							 | 
						||
| 
								 | 
							
								    p_mean_cost = [np.mean(np.array(costs[i*iter:(i+1)*iter])) for i in range(len(p_values))]
							 | 
						||
| 
								 | 
							
								    p_max = p_values[p_mean_cost.index(max(p_mean_cost))]
							 | 
						||
| 
								 | 
							
								    # print(p_mean_cost)
							 | 
						||
| 
								 | 
							
								    # print(p_max)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #take mean and make the combined plot
							 | 
						||
| 
								 | 
							
								    mean_times = []
							 | 
						||
| 
								 | 
							
								    mean_costs = []
							 | 
						||
| 
								 | 
							
								    for p in p_values:
							 | 
						||
| 
								 | 
							
								        costs_tmp = costs[p_values.index(p)*iter:(p_values.index(p)+1)*iter]
							 | 
						||
| 
								 | 
							
								        mean_cost = sum(costs_tmp)/len(costs_tmp)
							 | 
						||
| 
								 | 
							
								        mean_costs.append(mean_cost)
							 | 
						||
| 
								 | 
							
								        times_tmp = times[p_values.index(p)*iter:(p_values.index(p)+1)*iter]
							 | 
						||
| 
								 | 
							
								        mean_time = sum(times_tmp)/len(times_tmp)
							 | 
						||
| 
								 | 
							
								        mean_times.append(mean_time)
							 | 
						||
| 
								 | 
							
								    make_combined_plot(name, p_values,mean_times, mean_costs)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # calculate the convergence rate for each p_value
							 | 
						||
| 
								 | 
							
								    p_success_rates = []
							 | 
						||
| 
								 | 
							
								    if p_mean_cost[0] >= 0.95*np.mean(np.array(costs)) and p_mean_cost[0] <= 1.05*np.mean(np.array(costs)):
							 | 
						||
| 
								 | 
							
								        p_success_rates = [ 1.0 for p in p_values]
							 | 
						||
| 
								 | 
							
								    else:
							 | 
						||
| 
								 | 
							
								        for p in p_values:
							 | 
						||
| 
								 | 
							
								            if p > p_max:
							 | 
						||
| 
								 | 
							
								                p_costs = costs[p_values.index(p)*iter:(p_values.index(p)+1)*iter]
							 | 
						||
| 
								 | 
							
								                # print(p_costs)
							 | 
						||
| 
								 | 
							
								                converged = [ int(p_cost < 0.3*max_cost) for p_cost in p_costs]
							 | 
						||
| 
								 | 
							
								                success_rate = sum(converged)/len(converged)    
							 | 
						||
| 
								 | 
							
								                p_success_rates.append(success_rate)
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                p_success_rates.append(0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    plt.bar(p_values, p_success_rates, align='center', alpha=0.5)
							 | 
						||
| 
								 | 
							
								    plt.xticks(p_values)
							 | 
						||
| 
								 | 
							
								    plt.yticks(np.arange(0, 1.2, 0.2), ['0%', '20%', '40%', '60%', '80%', '100%'])
							 | 
						||
| 
								 | 
							
								    plt.xlabel("p_value")
							 | 
						||
| 
								 | 
							
								    plt.ylabel("success rate")
							 | 
						||
| 
								 | 
							
								    plt.title(name, fontsize=12)
							 | 
						||
| 
								 | 
							
								    plt.show()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def make_eigen_and_bound_plot(name, p_values, times1, costPs, cost3s, times2, min_eigens, subounds):
							 | 
						||
| 
								 | 
							
								    """ Make a plot that combines time for optimizing, time for optimizing and compute min_eigen,
							 | 
						||
| 
								 | 
							
								        min_eigen, subound (subound = (f_R - f_SDP) / f_SDP).
							 | 
						||
| 
								 | 
							
								        Arguments:
							 | 
						||
| 
								 | 
							
								            name: string of the plot title
							 | 
						||
| 
								 | 
							
								            p_values: list of p-values (int)
							 | 
						||
| 
								 | 
							
								            times1: list of timings (seconds)
							 | 
						||
| 
								 | 
							
								            costPs: f_SDP
							 | 
						||
| 
								 | 
							
								            cost3s: f_R
							 | 
						||
| 
								 | 
							
								            times2: list of timings (seconds)
							 | 
						||
| 
								 | 
							
								            min_eigens: list of min_eigen (double)
							 | 
						||
| 
								 | 
							
								            subounds: list of subound (double)
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    if dict(Counter(p_values))[5] != 1:
							 | 
						||
| 
								 | 
							
								        p_values = list(dict(Counter(p_values)).keys())
							 | 
						||
| 
								 | 
							
								        iter = int(len(times1)/len(p_values))
							 | 
						||
| 
								 | 
							
								        p_mean_times1 = [np.mean(np.array(times1[i*iter:(i+1)*iter])) for i in range(len(p_values))]
							 | 
						||
| 
								 | 
							
								        p_mean_times2 = [np.mean(np.array(times2[i*iter:(i+1)*iter])) for i in range(len(p_values))]
							 | 
						||
| 
								 | 
							
								        print("p_values \n", p_values)
							 | 
						||
| 
								 | 
							
								        print("p_mean_times_opti \n", p_mean_times1)
							 | 
						||
| 
								 | 
							
								        print("p_mean_times_eig \n", p_mean_times2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        p_mean_costPs = [np.mean(np.array(costPs[i*iter:(i+1)*iter])) for i in range(len(p_values))]
							 | 
						||
| 
								 | 
							
								        p_mean_cost3s = [np.mean(np.array(cost3s[i*iter:(i+1)*iter])) for i in range(len(p_values))]
							 | 
						||
| 
								 | 
							
								        p_mean_lambdas = [np.mean(np.array(min_eigens[i*iter:(i+1)*iter])) for i in range(len(p_values))]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        print("p_mean_costPs \n", p_mean_costPs)
							 | 
						||
| 
								 | 
							
								        print("p_mean_cost3s \n", p_mean_cost3s)
							 | 
						||
| 
								 | 
							
								        print("p_mean_lambdas \n", p_mean_lambdas)
							 | 
						||
| 
								 | 
							
								        print("*******************************************************************************************************************")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    else:
							 | 
						||
| 
								 | 
							
								        plt.figure(1)
							 | 
						||
| 
								 | 
							
								        plt.ylabel('Time used (seconds)')
							 | 
						||
| 
								 | 
							
								        plt.xlabel('p_value')
							 | 
						||
| 
								 | 
							
								        plt.plot(p_values, times1, 'r', label="time for optimizing")
							 | 
						||
| 
								 | 
							
								        plt.plot(p_values, times2, 'blue', label="time for optimizing and check")
							 | 
						||
| 
								 | 
							
								        plt.title(name, fontsize=12)
							 | 
						||
| 
								 | 
							
								        plt.legend(loc="best")
							 | 
						||
| 
								 | 
							
								        plt.interactive(False)
							 | 
						||
| 
								 | 
							
								        plt.show()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        plt.figure(2)
							 | 
						||
| 
								 | 
							
								        plt.ylabel('Min eigen_value')
							 | 
						||
| 
								 | 
							
								        plt.xlabel('p_value')
							 | 
						||
| 
								 | 
							
								        plt.plot(p_values, min_eigens, 'r', label="min_eigen values")
							 | 
						||
| 
								 | 
							
								        plt.title(name, fontsize=12)
							 | 
						||
| 
								 | 
							
								        plt.legend(loc="best")
							 | 
						||
| 
								 | 
							
								        plt.interactive(False)
							 | 
						||
| 
								 | 
							
								        plt.show()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        plt.figure(3)
							 | 
						||
| 
								 | 
							
								        plt.ylabel('sub_bounds')
							 | 
						||
| 
								 | 
							
								        plt.xlabel('p_value')
							 | 
						||
| 
								 | 
							
								        plt.plot(p_values, subounds, 'blue', label="sub_bounds")
							 | 
						||
| 
								 | 
							
								        plt.title(name, fontsize=12)
							 | 
						||
| 
								 | 
							
								        plt.legend(loc="best")
							 | 
						||
| 
								 | 
							
								        plt.show()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Process arguments and call plot function
							 | 
						||
| 
								 | 
							
								import argparse
							 | 
						||
| 
								 | 
							
								import csv
							 | 
						||
| 
								 | 
							
								import os
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								parser = argparse.ArgumentParser()
							 | 
						||
| 
								 | 
							
								parser.add_argument("path")
							 | 
						||
| 
								 | 
							
								args = parser.parse_args()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								file_path = []
							 | 
						||
| 
								 | 
							
								domain = os.path.abspath(args.path)
							 | 
						||
| 
								 | 
							
								for info in os.listdir(args.path):
							 | 
						||
| 
								 | 
							
								    file_path.append(os.path.join(domain, info))
							 | 
						||
| 
								 | 
							
								file_path.sort()
							 | 
						||
| 
								 | 
							
								print(file_path)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# name of all the plots
							 | 
						||
| 
								 | 
							
								names = {}
							 | 
						||
| 
								 | 
							
								names[0] = 'tinyGrid3D vertex = 9, edge = 11'
							 | 
						||
| 
								 | 
							
								names[1] = 'smallGrid3D vertex = 125, edge = 297'
							 | 
						||
| 
								 | 
							
								names[2] = 'parking-garage vertex = 1661, edge = 6275'
							 | 
						||
| 
								 | 
							
								names[3] = 'sphere2500 vertex = 2500, edge = 4949'
							 | 
						||
| 
								 | 
							
								# names[4] = 'sphere_bignoise vertex = 2200, edge = 8647'
							 | 
						||
| 
								 | 
							
								names[5] = 'torus3D vertex = 5000, edge = 9048'
							 | 
						||
| 
								 | 
							
								names[6] = 'cubicle vertex = 5750, edge = 16869'
							 | 
						||
| 
								 | 
							
								names[7] = 'rim vertex = 10195, edge = 29743'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Parse CSV file
							 | 
						||
| 
								 | 
							
								for key, name in names.items():
							 | 
						||
| 
								 | 
							
								    print(key, name)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # find  according file to process
							 | 
						||
| 
								 | 
							
								    name_file = None
							 | 
						||
| 
								 | 
							
								    for path in file_path:
							 | 
						||
| 
								 | 
							
								        if name[0:3] in path:
							 | 
						||
| 
								 | 
							
								            name_file = path
							 | 
						||
| 
								 | 
							
								    if name_file == None:
							 | 
						||
| 
								 | 
							
								        print("The file %s is not in the path" % name)
							 | 
						||
| 
								 | 
							
								        continue
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    p_values, times1, costPs, cost3s, times2, min_eigens, subounds = [],[],[],[],[],[],[]
							 | 
						||
| 
								 | 
							
								    with open(name_file) as csvfile:
							 | 
						||
| 
								 | 
							
								        reader = csv.reader(csvfile, delimiter='\t')
							 | 
						||
| 
								 | 
							
								        for row in reader:
							 | 
						||
| 
								 | 
							
								            print(row)
							 | 
						||
| 
								 | 
							
								            p_values.append(int(row[0]))
							 | 
						||
| 
								 | 
							
								            times1.append(float(row[1]))
							 | 
						||
| 
								 | 
							
								            costPs.append(float(row[2]))
							 | 
						||
| 
								 | 
							
								            cost3s.append(float(row[3]))
							 | 
						||
| 
								 | 
							
								            if len(row) > 4:
							 | 
						||
| 
								 | 
							
								                times2.append(float(row[4]))
							 | 
						||
| 
								 | 
							
								                min_eigens.append(float(row[5]))
							 | 
						||
| 
								 | 
							
								                subounds.append(float(row[6]))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #plot
							 | 
						||
| 
								 | 
							
								    # make_combined_plot(name, p_values, times1, cost3s)
							 | 
						||
| 
								 | 
							
								    # make_convergence_plot(name, p_values, times1, cost3s)
							 | 
						||
| 
								 | 
							
								    make_eigen_and_bound_plot(name, p_values, times1, costPs, cost3s, times2, min_eigens, subounds)
							 |