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"]]
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
79 wl_med = wl[round(len(wl) / 2)]
81 "err": 100 * (len(sl) - len(wl)) / len(sl),
89 if __name__ == "__main__":
96 """Generate output string for values.
99 h -- String for header?
101 pr = "{:<16.2f}" if not h else "{:<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}"
110 scenarios = get_scenarios(SCEN_DIR)
113 key=lambda kv: int(kv[0]) if kv[0].isnumeric() else kv[0]
115 print(gos(True).format(
116 "%--------------|", "---------------|", "---------------|",
117 "---------------|", "---------------|",
119 "----------------", "----------------",
121 "----------------", "---------------|",
123 "----------------", "----------------",
125 "----------------", "---------------|",
127 "----------------", "----------------",
129 "----------------", "---------------|",
131 "----------------", "----------------",
133 "----------------", "---------------|",
135 "----------------", "----------------",
136 "connecteds-in-pa", "th",
139 "----------------", "----------------",
141 "----------------", "---------------|",
143 print(gos(True).format(
144 "%err [%]", "planner", "filename",
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
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")
163 tl["err"], sl[0]["dn"], sl[0]["fn"],
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"],