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
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
85 wl_med = wl[round(len(wl) / 2)]
87 "err": 100 * (len(sl) - len(el)) / len(sl),
95 if __name__ == "__main__":
102 """Generate output string for values.
105 h -- String for header?
107 pr = "{:<16.2f}" if not h else "{:<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}"
116 scenarios = get_scenarios(SCEN_DIR)
119 key=lambda kv: int(kv[0]) if kv[0].isnumeric() else kv[0]
121 print(gos(True).format(
122 "%--------------|", "---------------|", "---------------|",
123 "---------------|", "---------------|",
125 "----------------", "----------------",
127 "----------------", "---------------|",
129 "----------------", "----------------",
131 "----------------", "---------------|",
133 "----------------", "----------------",
135 "----------------", "---------------|",
137 "----------------", "----------------",
139 "----------------", "---------------|",
141 "----------------", "----------------",
142 "connecteds-in-pa", "th",
145 "----------------", "----------------",
147 "----------------", "---------------|",
149 print(gos(True).format(
150 "%err [%]", "planner", "filename",
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
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")
169 tl["err"], sl[0]["dn"], sl[0]["fn"],
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"],