1cc1dc7a3Sopenharmony_ci#!/usr/bin/env python3 2cc1dc7a3Sopenharmony_ci# SPDX-License-Identifier: Apache-2.0 3cc1dc7a3Sopenharmony_ci# ----------------------------------------------------------------------------- 4cc1dc7a3Sopenharmony_ci# Copyright 2022 Arm Limited 5cc1dc7a3Sopenharmony_ci# 6cc1dc7a3Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); you may not 7cc1dc7a3Sopenharmony_ci# use this file except in compliance with the License. You may obtain a copy 8cc1dc7a3Sopenharmony_ci# of the License at: 9cc1dc7a3Sopenharmony_ci# 10cc1dc7a3Sopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 11cc1dc7a3Sopenharmony_ci# 12cc1dc7a3Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software 13cc1dc7a3Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 14cc1dc7a3Sopenharmony_ci# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 15cc1dc7a3Sopenharmony_ci# License for the specific language governing permissions and limitations 16cc1dc7a3Sopenharmony_ci# under the License. 17cc1dc7a3Sopenharmony_ci# ----------------------------------------------------------------------------- 18cc1dc7a3Sopenharmony_ci""" 19cc1dc7a3Sopenharmony_ciThis script is a simple test result plotter for sweeps on multiple compressors. 20cc1dc7a3Sopenharmony_ci""" 21cc1dc7a3Sopenharmony_ciimport csv 22cc1dc7a3Sopenharmony_ciimport numpy as np 23cc1dc7a3Sopenharmony_ciimport matplotlib.pyplot as plt 24cc1dc7a3Sopenharmony_ciimport sys 25cc1dc7a3Sopenharmony_ci 26cc1dc7a3Sopenharmony_ciDATABASE = "competitive.csv" 27cc1dc7a3Sopenharmony_ci 28cc1dc7a3Sopenharmony_ci 29cc1dc7a3Sopenharmony_ciclass Series: 30cc1dc7a3Sopenharmony_ci 31cc1dc7a3Sopenharmony_ci def __init__(self, name, perf, qual): 32cc1dc7a3Sopenharmony_ci self.name = name 33cc1dc7a3Sopenharmony_ci self.perf = perf 34cc1dc7a3Sopenharmony_ci self.qual = qual 35cc1dc7a3Sopenharmony_ci 36cc1dc7a3Sopenharmony_ci 37cc1dc7a3Sopenharmony_cidef get_series(database, compressor, quality, block_size): 38cc1dc7a3Sopenharmony_ci title = f"{compressor} {quality} {block_size}" 39cc1dc7a3Sopenharmony_ci in_section = False 40cc1dc7a3Sopenharmony_ci 41cc1dc7a3Sopenharmony_ci perf = [] 42cc1dc7a3Sopenharmony_ci qual = [] 43cc1dc7a3Sopenharmony_ci 44cc1dc7a3Sopenharmony_ci with open(database) as csvfile: 45cc1dc7a3Sopenharmony_ci reader = csv.reader(csvfile) 46cc1dc7a3Sopenharmony_ci for row in reader: 47cc1dc7a3Sopenharmony_ci if len(row) == 1: 48cc1dc7a3Sopenharmony_ci in_section = row[0] == title 49cc1dc7a3Sopenharmony_ci continue 50cc1dc7a3Sopenharmony_ci 51cc1dc7a3Sopenharmony_ci if in_section: 52cc1dc7a3Sopenharmony_ci perf.append(float(row[2])) 53cc1dc7a3Sopenharmony_ci qual.append(float(row[3])) 54cc1dc7a3Sopenharmony_ci 55cc1dc7a3Sopenharmony_ci return (perf, qual) 56cc1dc7a3Sopenharmony_ci 57cc1dc7a3Sopenharmony_ci 58cc1dc7a3Sopenharmony_cidef plot(block_size, series_set): 59cc1dc7a3Sopenharmony_ci 60cc1dc7a3Sopenharmony_ci for series in series_set: 61cc1dc7a3Sopenharmony_ci plt.scatter(series.perf, series.qual, s=2, label=series.name) 62cc1dc7a3Sopenharmony_ci 63cc1dc7a3Sopenharmony_ci plt.xlabel("Speed (MT/s)") 64cc1dc7a3Sopenharmony_ci plt.ylabel("PSNR dB") 65cc1dc7a3Sopenharmony_ci plt.legend(loc='lower right', prop={'size': 6}) 66cc1dc7a3Sopenharmony_ci 67cc1dc7a3Sopenharmony_ci plt.tight_layout() 68cc1dc7a3Sopenharmony_ci plt.savefig(f"ASTC_v_ISPC_{block_size}.png") 69cc1dc7a3Sopenharmony_ci plt.clf() 70cc1dc7a3Sopenharmony_ci 71cc1dc7a3Sopenharmony_ci 72cc1dc7a3Sopenharmony_cidef plot_diff(series_a, series_b): 73cc1dc7a3Sopenharmony_ci 74cc1dc7a3Sopenharmony_ci diff_perf = np.divide(series_a.perf, series_b.perf) 75cc1dc7a3Sopenharmony_ci diff_qual = np.subtract(series_a.qual, series_b.qual) 76cc1dc7a3Sopenharmony_ci label = f"{series_a.name} vs {series_b.name}" 77cc1dc7a3Sopenharmony_ci 78cc1dc7a3Sopenharmony_ci plt.scatter(diff_perf, diff_qual, s=2, c="#0091BD", label=label) 79cc1dc7a3Sopenharmony_ci plt.scatter(np.mean(diff_perf), np.mean(diff_qual), s=10, c="#FFA500", marker="*") 80cc1dc7a3Sopenharmony_ci 81cc1dc7a3Sopenharmony_ci plt.axhline(y=0, color="r", linestyle="dotted", lw=0.5) 82cc1dc7a3Sopenharmony_ci plt.axvline(x=1, color="r", linestyle="dotted", lw=0.5) 83cc1dc7a3Sopenharmony_ci 84cc1dc7a3Sopenharmony_ci plt.xlabel("Relative speed") 85cc1dc7a3Sopenharmony_ci plt.ylabel("PSNR diff (dB)") 86cc1dc7a3Sopenharmony_ci plt.legend(loc='lower right', prop={'size': 6}) 87cc1dc7a3Sopenharmony_ci 88cc1dc7a3Sopenharmony_ci plt.tight_layout() 89cc1dc7a3Sopenharmony_ci file_name = label.replace(" ", "_") + ".png" 90cc1dc7a3Sopenharmony_ci plt.savefig(file_name) 91cc1dc7a3Sopenharmony_ci plt.clf() 92cc1dc7a3Sopenharmony_ci 93cc1dc7a3Sopenharmony_ci 94cc1dc7a3Sopenharmony_cidef main(): 95cc1dc7a3Sopenharmony_ci 96cc1dc7a3Sopenharmony_ci block_sizes = ["4x4", "6x6", "8x8"] 97cc1dc7a3Sopenharmony_ci 98cc1dc7a3Sopenharmony_ci for block_size in block_sizes: 99cc1dc7a3Sopenharmony_ci series_set = [] 100cc1dc7a3Sopenharmony_ci 101cc1dc7a3Sopenharmony_ci perf, qual = get_series(DATABASE, "ISPC", "rgba", block_size) 102cc1dc7a3Sopenharmony_ci series_set.append(Series(f"{block_size} IPSC Slow", perf, qual)) 103cc1dc7a3Sopenharmony_ci 104cc1dc7a3Sopenharmony_ci perf, qual = get_series(DATABASE, "ISPC", "rgb", block_size) 105cc1dc7a3Sopenharmony_ci series_set.append(Series(f"{block_size} IPSC Fast", perf, qual)) 106cc1dc7a3Sopenharmony_ci 107cc1dc7a3Sopenharmony_ci perf, qual = get_series(DATABASE, "ASTC", "60", block_size) 108cc1dc7a3Sopenharmony_ci series_set.append(Series(f"{block_size} ASTC 60", perf, qual)) 109cc1dc7a3Sopenharmony_ci 110cc1dc7a3Sopenharmony_ci perf, qual = get_series(DATABASE, "ASTC", "50", block_size) 111cc1dc7a3Sopenharmony_ci series_set.append(Series(f"{block_size} ASTC 50", perf, qual)) 112cc1dc7a3Sopenharmony_ci 113cc1dc7a3Sopenharmony_ci perf, qual = get_series(DATABASE, "ASTC", "10", block_size) 114cc1dc7a3Sopenharmony_ci series_set.append(Series(f"{block_size} ASTC 10", perf, qual)) 115cc1dc7a3Sopenharmony_ci 116cc1dc7a3Sopenharmony_ci perf, qual = get_series(DATABASE, "ASTC", "8", block_size) 117cc1dc7a3Sopenharmony_ci series_set.append(Series(f"{block_size} ASTC 8", perf, qual)) 118cc1dc7a3Sopenharmony_ci 119cc1dc7a3Sopenharmony_ci plot(block_size, series_set) 120cc1dc7a3Sopenharmony_ci 121cc1dc7a3Sopenharmony_ci plot_diff(series_set[3], series_set[0]) 122cc1dc7a3Sopenharmony_ci 123cc1dc7a3Sopenharmony_ci return 0 124cc1dc7a3Sopenharmony_ci 125cc1dc7a3Sopenharmony_ci 126cc1dc7a3Sopenharmony_ciif __name__ == "__main__": 127cc1dc7a3Sopenharmony_ci sys.exit(main()) 128