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