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