def plot_codesign_nav_breakdown_cross_workload()

in visualization_utils/plotting-ying.py [0:0]


def plot_codesign_nav_breakdown_cross_workload(input_dir_names, input_all_res_column_name_number):
    trueNum = input_all_res_column_name_number["move validity"]

    # experiment_names
    experiment_names = []
    file_full_addr_list = []
    for dir_name in input_dir_names:
        file_full_addr = os.path.join(dir_name, "result_summary/FARSI_simple_run_0_1_all_reults.csv")
        file_full_addr_list.append(file_full_addr)
        experiment_name = get_experiments_name(file_full_addr, input_all_res_column_name_number)
        """
        Ying: the following lines are added to make the names clearer in the plottings
        """
        if experiment_name[0] == 'a':
            experiment_name = "Audio"
        elif experiment_name[0] == 'h':
            experiment_name = "CAVA"
        elif experiment_name[0] == 'e':
            experiment_name = "ED"
        """
        Ying: adding finished
        """
        experiment_names.append(experiment_name)

    axis_font = {'size': '25'}
    fontSize = 25
    column_name_list = ["transformation_metric", "transformation_block_type", "move name", "comm_comp", "architectural principle", "high level optimization name", "exact optimization name", "neighbouring design space size"]
    #column_name_list = ["transformation_metric", "move name"]#, "comm_comp", "architectural principle", "high level optimization name", "exact optimization name", "neighbouring design space size"]
    #column_name = "move name"
    # initialize the dictionary
    column_column_value_experiment_frequency_dict = {}
    for column_name in column_name_list:
        column_value_experiment_frequency_dict = {}
        # get all possible the values of interest
        all_values = get_all_col_values_of_a_folders(input_dir_names, input_all_res_column_name_number, column_name)
        columne_number = all_res_column_name_number[column_name]
        for column in all_values:
            """
            Ying: the following lines are added for "IC", "Mem", and "PE"
            """
            if column_name == "transformation_block_type":
                if column == "ic":
                    column = "IC"
                elif column == "mem":
                    column = "Mem"
                elif column == "pe":
                    column = "PE"

            if column_name == "architectural principle":
                if column == "identity" or column == "spatial_locality":
                    continue
                elif column == "task_level_parallelism":
                    column = "TLP"
                elif column == "loop_level_parallelism":
                    column = "LLP"
            """
            Ying: adding finished
            """
            column_value_experiment_frequency_dict[column] = {}

        # get all the data
        for file_full_addr in file_full_addr_list:
            with open(file_full_addr, newline='') as csvfile:
                resultReader = csv.reader(csvfile, delimiter=',', quotechar='|')
                experiment_name = get_experiments_name( file_full_addr, input_all_res_column_name_number)
                """
                Ying: the following lines are added to make the names clearer in the plottings
                """
                if experiment_name[0] == 'a':
                    experiment_name = "Audio"
                elif experiment_name[0] == 'h':
                    experiment_name = "CAVA"
                elif experiment_name[0] == 'e':
                    experiment_name = "ED"
                """
                Ying: adding finished
                """
                for column_value in all_values:
                    """
                    Ying: the following lines are added for "IC", "Mem", and "PE"
                    """
                    if column_name == "transformation_block_type":
                        if column_value == "ic":
                            column_value = "IC"
                        elif column_value == "mem":
                            column_value = "Mem"
                        elif column_value == "pe":
                            column_value = "PE"

                    if column_name == "architectural principle":
                        if column_value == "identity" or column_value == "spatial_locality":
                            continue
                        elif column_value == "task_level_parallelism":
                            column_value = "TLP"
                        elif column_value == "loop_level_parallelism":
                            column_value = "LLP"
                    """
                    Ying: adding finished
                    """
                    column_value_experiment_frequency_dict[column_value][experiment_name] = 0

                for i, row in enumerate(resultReader):
                    #if row[trueNum] != "True":
                    #    continue
                    if i > 1:
                        try:

                            # the following for workload awareness
                            #if row[all_res_column_name_number["move name"]] == "identity":
                            #    continue
                            #if row[all_res_column_name_number["architectural principle"]] == "spatial_locality":
                            #    continue


                            col_value = row[columne_number]
                            col_values = col_value.split(";")
                            for col_val in col_values:
                                if "=" in col_val:
                                    val_splitted = col_val.split("=")
                                    column_value_experiment_frequency_dict[val_splitted[0]][experiment_name] += float(val_splitted[1])
                                else:
                                    """
                                    Ying: the following lines are added for "IC", "Mem", and "PE"
                                    """
                                    if column_name == "transformation_block_type":
                                        if col_val == "ic":
                                            col_val = "IC"
                                        elif col_val == "mem":
                                            col_val = "Mem"
                                        elif col_val == "pe":
                                            col_val = "PE"

                                    if column_name == "architectural principle":
                                        if col_val == "identity" or col_val == "spatial_locality":
                                            continue
                                        elif col_val == "task_level_parallelism":
                                            col_val = "TLP"
                                        elif col_val == "loop_level_parallelism":
                                            col_val = "LLP"
                                    """
                                    Ying: adding finished
                                    """
                                    column_value_experiment_frequency_dict[col_val][experiment_name] += 1
                        except:
                            print("what")

        total_cnt = {}
        for el in column_value_experiment_frequency_dict.values():
            for exp, values in el.items():
                if exp not in total_cnt.keys():
                    total_cnt[exp] = 0
                total_cnt[exp] += values

        for col_val, exp_vals in column_value_experiment_frequency_dict.items():
            for exp, values in exp_vals.items():
                column_value_experiment_frequency_dict[col_val][exp] = column_value_experiment_frequency_dict[col_val][exp]
                if column_name != "architectural principle" and column_name != "comm_comp" and total_cnt[exp] != 0: # Ying: add to get rid of normalization for the two plottings
                    column_value_experiment_frequency_dict[col_val][exp] /= total_cnt[exp] # normalize

        # prepare for plotting and plot
        # plt.figure(figsize=(6, 6))
        index = experiment_names
        plotdata = pd.DataFrame(column_value_experiment_frequency_dict, index=index)
        plotdata.plot(kind='bar', stacked=True, figsize=(8, 8))
        plt.rc('font', **axis_font)
        plt.xlabel("Workloads", **axis_font)
        # plt.ylabel(column_name, **axis_font)  # Ying: replace with the following lines
        """
        Ying: set the ylabel acordingly
        """
        if column_name != "comm_comp":
            if column_name == "architectural principle" or column_name == "comm_comp":
                plt.ylabel("Iteration Count", **axis_font)
            else:
                plt.ylabel("Normalized Iteration Portion", **axis_font)
        """
        Ying: adding finished
        """
        plt.xticks(fontsize=fontSize, rotation=0)   # Ying: the original one was 45)
        plt.yticks(fontsize=fontSize)
        # plt.title("experiment vs " + column_name, **axis_font)    # Ying: comment it out as discussed
        # plt.legend(bbox_to_anchor=(1, 1), loc='upper left', fontsize=fontSize)    # Ying: replaced with the following line
        plt.legend(bbox_to_anchor=(0.5, 1.15), loc='upper center', fontsize=fontSize, ncol=3)
        # dump in the top folder
        output_base_dir = '/'.join(input_dir_names[0].split("/")[:-2])
        output_dir = os.path.join(output_base_dir, "cross_workloads/nav_breakdown")
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)
        plt.tight_layout()
        plt.savefig(os.path.join(output_dir,'_'.join(column_name.split(" "))+".png"), bbox_inches='tight')
        # plt.show()
        plt.close('all')
        column_column_value_experiment_frequency_dict[column_name] = copy.deepcopy(column_value_experiment_frequency_dict)

    """
    # multi-stack plot here
    index = experiment_names
    plotdata = pd.DataFrame(column_column_value_experiment_frequency_dict, index=index)

    df_g = plotdata.groupby(["transformation_metric", "move name"])
    plotdata.plot(kind='bar', stacked=True, figsize=(12, 10))
    plt.rc('font', **axis_font)
    plt.xlabel("experiments", **axis_font)
    plt.ylabel(column_name, **axis_font)
    plt.xticks(fontsize=fontSize, rotation=45)
    plt.yticks(fontsize=fontSize)
    plt.title("experiment vs " + column_name, **axis_font)
    plt.legend(bbox_to_anchor=(1, 1), loc='upper left', fontsize=fontSize)
    # dump in the top folder
    output_base_dir = '/'.join(input_dir_names[0].split("/")[:-2])
    output_dir = os.path.join(output_base_dir, "cross_workloads/nav_breakdown")
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    plt.tight_layout()
    plt.savefig(os.path.join(output_dir,'column____'.join(column_name.split(" "))+".png"), bbox_inches='tight')
    # plt.show()
    plt.close('all')
    """
    return column_column_value_experiment_frequency_dict