1 """Print JSON formatted scenarios statistics.
3 The structure of input directory (``sys.argv[1]``) must be the
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
22 def get_scenario(fname):
23 """Load scenario from file.
29 raise ValueError("File name as argument needed")
30 with open(fname, "r") as f:
32 scenario = loads(f.read())
34 scenario = {"error": "Bad JSON format."}
37 def get_scenarios(dname):
38 """Load scenarios from directiory.
41 dname -- Directory name.
44 raise ValueError("Directory name as argument needed")
46 for d in listdir(dname):
47 for f in listdir("{}/{}".format(dname, d)):
54 "sc": get_scenario("{}/{}/{}".format(dname, d, f)),
58 def compute_stats(sl={}, what="time"):
59 """Return ``mean``, ``std``, ``med``, ``max``, and ``min`` of ``what``.
63 what -- The variable in scenario stats to compute with.
66 wl = [s["sc"][what] for s in sl if "sc" in s and what in s["sc"]]
71 and s["sc"]["cost"] != -1
80 wl_mean = sum(wl) / len(wl)
81 wl_tmp = [(x - wl_mean)**2 for x in wl]
82 wl_std = (sum(wl_tmp) / len(wl_tmp))**0.5
86 wl_med = wl[round(len(wl) / 2)]
88 "err": 100 * (len(sl) - len(el)) / len(sl),
96 if __name__ == "__main__":
103 """Generate output string for values.
106 h -- String for header?
108 pr = "{:<16.2f}" if not h else "{:<16}"
113 for i in range(30): # 5 (from compute_stats) x 6 (stats in README)
114 pr += "{:<16.6f}" if not h else "{:<16}"
117 scenarios = get_scenarios(SCEN_DIR)
120 key=lambda kv: int(kv[0]) if kv[0].isnumeric() else kv[0]
122 print(gos(True).format(
123 "%--------------|", "---------------|", "---------------|",
124 "---------------|", "---------------|",
126 "----------------", "----------------",
128 "----------------", "---------------|",
130 "----------------", "----------------",
132 "----------------", "---------------|",
134 "----------------", "----------------",
136 "----------------", "---------------|",
138 "----------------", "----------------",
140 "----------------", "---------------|",
142 "----------------", "----------------",
143 "connecteds-in-pa", "th",
146 "----------------", "----------------",
148 "----------------", "---------------|",
150 print(gos(True).format(
151 "%err [%]", "planner", "filename",
153 "avg [s]", "std [s]", "med [s]", "max [s]", "min [s]", # time
154 "avg [-]", "std [-]", "med [-]", "max [-]", "min [-]", # iterations
155 "avg [m]", "std [m]", "med [m]", "max [m]", "min [m]", # cost
156 "avg [-]", "std [-]", "med [-]", "max [-]", "min [-]", # cusps-in-p
157 "avg [-]", "std [-]", "med [-]", "max [-]", "min [-]", # connecteds
158 "avg [-]", "std [-]", "med [-]", "max [-]", "min [-]", # nodes
161 for (f, sl) in scenarios:
162 assert f == sl[0]["fn"]
163 tl = compute_stats(sl, "time")
164 il = compute_stats(sl, "iterations")
165 cl = compute_stats(sl, "cost")
166 cul = compute_stats(sl, "cusps-in-path")
167 col = compute_stats(sl, "connecteds-in-path")
168 nl = compute_stats(sl, "nodes")
170 tl["err"], sl[0]["dn"], sl[0]["fn"],
172 tl["avg"], tl["std"], tl["med"], tl["max"], tl["min"],
173 il["avg"], il["std"], il["med"], il["max"], il["min"],
174 cl["avg"], cl["std"], cl["med"], cl["max"], cl["min"],
175 cul["avg"], cul["std"], cul["med"], cul["max"], cul["min"],
176 col["avg"], col["std"], col["med"], col["max"], col["min"],
177 nl["avg"], nl["std"], nl["med"], nl["max"], nl["min"],