]> rtime.felk.cvut.cz Git - hubacji1/iamcar2.git/blob - scripts/print_json_objects_scenaris_statistics.py
Merge branch 'feature/costs-tests'
[hubacji1/iamcar2.git] / scripts / print_json_objects_scenaris_statistics.py
1 """Print JSON formatted scenarios statistics.
2
3 The structure of input directory (``sys.argv[1]``) must be the
4 following::
5
6    SCEN_DIR/
7       0/
8          fname1.json
9          fname2.json
10          ...
11       1/
12       2/
13       ...
14
15 """
16 from json import loads
17 from math import cos, inf, pi, sin
18 from matplotlib import pyplot as plt
19 from os import listdir
20 from sys import argv, exit
21
22 def get_scenario(fname):
23     """Load scenario from file.
24
25     Keyword arguments:
26     fname -- File name.
27     """
28     if fname is None:
29         raise ValueError("File name as argument needed")
30     with open(fname, "r") as f:
31         try:
32             scenario = loads(f.read())
33         except:
34             scenario = {"error": "Bad JSON format."}
35     return scenario
36
37 def get_scenarios(dname):
38     """Load scenarios from directiory.
39
40     Keyword arguments:
41     dname -- Directory name.
42     """
43     if dname is None:
44         raise ValueError("Directory name as argument needed")
45     s = {}
46     for d in listdir(dname):
47         for f in listdir("{}/{}".format(dname, d)):
48             if f not in s:
49                 s[f] = []
50             s[f].append({
51                 "dn": dname,
52                 "fn": f,
53                 "cnt": int(d),
54                 "sc": get_scenario("{}/{}/{}".format(dname, d, f)),
55             })
56     return s
57
58 def compute_stats(sl={}, what="time"):
59     """Return ``mean``, ``std``, ``med``, ``max``, and ``min`` of ``what``.
60
61     Keyword arguments:
62     sl -- Scenarios list.
63     what -- The variable in scenario stats to compute with.
64     """
65     assert len(sl) > 0
66     wl = [s["sc"][what] for s in sl if "sc" in s and what in s["sc"]]
67     el = [
68         1 for s in sl
69         if "sc" in s
70         and "cost" in s["sc"]
71         and s["sc"]["cost"] != -1
72     ]
73     if len(wl) == 0:
74         wl_mean = inf
75         wl_std = inf
76         wl_max = inf
77         wl_min = -inf
78     else:
79         wl_mean = sum(wl) / len(wl)
80         wl_tmp = [(x - wl_mean)**2 for x in wl]
81         wl_std = (sum(wl_tmp) / len(wl_tmp))**0.5
82         wl_max = max(wl)
83         wl_min = min(wl)
84         wl.sort()
85         wl_med = wl[round(len(wl) / 2)]
86     return {
87         "err": 100 * (len(sl) - len(el)) / len(sl),
88         "avg": wl_mean,
89         "std": wl_std,
90         "med": wl_med,
91         "max": wl_max,
92         "min": wl_min,
93     }
94
95 if __name__ == "__main__":
96     if (len(argv) == 2):
97         SCEN_DIR = argv[1]
98     else:
99         SCEN_DIR = "out"
100
101     def gos(h=False):
102         """Generate output string for values.
103
104         Keyword arguments:
105         h -- String for header?
106         """
107         pr = "{:<16.2f}" if not h else "{:<16}"
108         pr += "{:<16}"
109         pr += "{:<16}"
110         pr += "{:<16}"
111         pr += "{:<16}"
112         for i in range(30): # 5 (from compute_stats) x 6 (stats in README)
113             pr += "{:<16.6f}" if not h else "{:<16}"
114         return pr
115
116     scenarios = get_scenarios(SCEN_DIR)
117     scenarios = sorted(
118         scenarios.items(),
119         key=lambda kv: int(kv[0]) if kv[0].isnumeric() else kv[0]
120     )
121     print(gos(True).format(
122             "%--------------|", "---------------|", "---------------|",
123             "---------------|", "---------------|",
124
125             "----------------", "----------------",
126             "time",
127             "----------------", "---------------|",
128
129             "----------------", "----------------",
130             "iterations",
131             "----------------", "---------------|",
132
133             "----------------", "----------------",
134             "cost",
135             "----------------", "---------------|",
136
137             "----------------", "----------------",
138             "cusps-in-path",
139             "----------------", "---------------|",
140
141             "----------------", "----------------",
142             "connecteds-in-pa", "th",
143             "---------------|",
144
145             "----------------", "----------------",
146             "nodes",
147             "----------------", "---------------|",
148     ))
149     print(gos(True).format(
150             "%err [%]", "planner", "filename",
151             "-", "-",
152             "avg [s]", "std [s]", "med [s]", "max [s]", "min [s]", # time
153             "avg [-]", "std [-]", "med [-]", "max [-]", "min [-]", # iterations
154             "avg [m]", "std [m]", "med [m]", "max [m]", "min [m]", # cost
155             "avg [-]", "std [-]", "med [-]", "max [-]", "min [-]", # cusps-in-p
156             "avg [-]", "std [-]", "med [-]", "max [-]", "min [-]", # connecteds
157             "avg [-]", "std [-]", "med [-]", "max [-]", "min [-]", # nodes
158     ))
159     print()
160     for (f, sl) in scenarios:
161         assert f == sl[0]["fn"]
162         tl = compute_stats(sl, "time")
163         il = compute_stats(sl, "iterations")
164         cl = compute_stats(sl, "cost")
165         cul = compute_stats(sl, "cusps-in-path")
166         col = compute_stats(sl, "connecteds-in-path")
167         nl = compute_stats(sl, "nodes")
168         print(gos().format(
169                 tl["err"], sl[0]["dn"], sl[0]["fn"],
170                 "-", "-",
171                 tl["avg"], tl["std"], tl["med"], tl["max"], tl["min"],
172                 il["avg"], il["std"], il["med"], il["max"], il["min"],
173                 cl["avg"], cl["std"], cl["med"], cl["max"], cl["min"],
174                 cul["avg"], cul["std"], cul["med"], cul["max"], cul["min"],
175                 col["avg"], col["std"], col["med"], col["max"], col["min"],
176                 nl["avg"], nl["std"], nl["med"], nl["max"], nl["min"],
177         ))