]> rtime.felk.cvut.cz Git - hubacji1/iamcar2.git/blob - scripts/print_json_objects_scenaris_statistics.py
Merge branch 'feature/refactor-plot-graphs'
[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     if len(wl) == 0:
68         wl_mean = inf
69         wl_std = inf
70         wl_max = inf
71         wl_min = -inf
72     else:
73         wl_mean = sum(wl) / len(wl)
74         wl_tmp = [(x - wl_mean)**2 for x in wl]
75         wl_std = (sum(wl_tmp) / len(wl_tmp))**0.5
76         wl_max = max(wl)
77         wl_min = min(wl)
78         wl.sort()
79         wl_med = wl[round(len(wl) / 2)]
80     return {
81         "err": 100 * (len(sl) - len(wl)) / len(sl),
82         "avg": wl_mean,
83         "std": wl_std,
84         "med": wl_med,
85         "max": wl_max,
86         "min": wl_min,
87     }
88
89 if __name__ == "__main__":
90     if (len(argv) == 2):
91         SCEN_DIR = argv[1]
92     else:
93         SCEN_DIR = "out"
94
95     def gos(h=False):
96         """Generate output string for values.
97
98         Keyword arguments:
99         h -- String for header?
100         """
101         pr = "{:<16.2f}" if not h else "{:<16}"
102         pr += "{:<16}"
103         pr += "{:<16}"
104         pr += "{:<16}"
105         pr += "{:<16}"
106         for i in range(30): # 5 (from compute_stats) x 6 (stats in README)
107             pr += "{:<16.6f}" if not h else "{:<16}"
108         return pr
109
110     scenarios = get_scenarios(SCEN_DIR)
111     scenarios = sorted(
112         scenarios.items(),
113         key=lambda kv: int(kv[0]) if kv[0].isnumeric() else kv[0]
114     )
115     print(gos(True).format(
116             "%--------------|", "---------------|", "---------------|",
117             "---------------|", "---------------|",
118
119             "----------------", "----------------",
120             "time",
121             "----------------", "---------------|",
122
123             "----------------", "----------------",
124             "iterations",
125             "----------------", "---------------|",
126
127             "----------------", "----------------",
128             "cost",
129             "----------------", "---------------|",
130
131             "----------------", "----------------",
132             "cusps-in-path",
133             "----------------", "---------------|",
134
135             "----------------", "----------------",
136             "connecteds-in-pa", "th",
137             "---------------|",
138
139             "----------------", "----------------",
140             "nodes",
141             "----------------", "---------------|",
142     ))
143     print(gos(True).format(
144             "%err [%]", "planner", "filename",
145             "-", "-",
146             "avg [s]", "std [s]", "med [s]", "max [s]", "min [s]", # time
147             "avg [-]", "std [-]", "med [-]", "max [-]", "min [-]", # iterations
148             "avg [m]", "std [m]", "med [m]", "max [m]", "min [m]", # cost
149             "avg [-]", "std [-]", "med [-]", "max [-]", "min [-]", # cusps-in-p
150             "avg [-]", "std [-]", "med [-]", "max [-]", "min [-]", # connecteds
151             "avg [-]", "std [-]", "med [-]", "max [-]", "min [-]", # nodes
152     ))
153     print()
154     for (f, sl) in scenarios:
155         assert f == sl[0]["fn"]
156         tl = compute_stats(sl, "time")
157         il = compute_stats(sl, "iterations")
158         cl = compute_stats(sl, "cost")
159         cul = compute_stats(sl, "cusps-in-path")
160         col = compute_stats(sl, "connecteds-in-path")
161         nl = compute_stats(sl, "nodes")
162         print(gos().format(
163                 tl["err"], sl[0]["dn"], sl[0]["fn"],
164                 "-", "-",
165                 tl["avg"], tl["std"], tl["med"], tl["max"], tl["min"],
166                 il["avg"], il["std"], il["med"], il["max"], il["min"],
167                 cl["avg"], cl["std"], cl["med"], cl["max"], cl["min"],
168                 cul["avg"], cul["std"], cul["med"], cul["max"], cul["min"],
169                 col["avg"], col["std"], col["med"], col["max"], col["min"],
170                 nl["avg"], nl["std"], nl["med"], nl["max"], nl["min"],
171         ))