1 # -*- coding: utf-8 -*-
2 """This module contain functions to ease graph plots."""
4 from matplotlib import pyplot as plt
6 from sys import argv, exit
9 def load_trajectory(fname):
10 """Load trajectory from file.
13 fname -- The file name.
16 raise ValueError("File name as argument needed")
17 with open(fname, "r") as f:
18 trajectory = loads(f.read())
21 def load_trajectories(dname):
22 """Load trajectories from directory.
25 dname -- The directory name.
28 raise ValueError("Directory name as argument needed")
30 for f in listdir(dname):
31 trajectories.append(load_trajectory("{}/{}".format(dname, f)))
36 plt.rcParams["font.size"] = 24
38 ax = fig.add_subplot(111)
39 #ax.set_aspect("equal")
41 #ax.set_title("TITLE")
42 #ax.set_xlabel("Time [s]")
43 #ax.set_ylabel("YLABEL")
47 #plt.plot(xcoords, ycoords, color="blue", label="LABEL")
48 #plt.hist(vals) # log=?, range=[?], bins=?
49 #ax.bar(xvals, yvals) # width=?
50 #ax.set_xticklabels(xvals, rotation=90)
53 #plt.savefig("WHATEVER")
55 def count_if_exist(trajectories, what):
56 """From multiple trajectories compute the number of occurences.
59 trajectories -- The list of trajectories.
60 what -- Number of occurences of what to compute.
63 for t in trajectories:
71 def get_lasts_if_exist(trajectories, what):
72 """From multiple trajectories get the list of last values.
75 trajectories -- The list of trajectories.
76 what -- The last values of what to take.
79 for t in trajectories:
81 val.append(t[what][-1])
86 def get_maxs_if_exist(trajectories, what):
87 """From multiple trajectories get the list of maximum values.
90 trajectories -- The list of trajectories.
91 what -- The maximum values of what to take.
94 for t in trajectories:
96 val.append(max(t[what]))
101 def plot_successrate():
102 """Plot success rate of single/multi-core implementations."""
103 LOGF="logs_T2st3co2_lpar"
104 LOGSF=["opt1_nn3", "opt1_nn4", "opt1_nn4_save-heading"]
106 LOGSF[0]: "RRT* nearest neighbour",
107 LOGSF[1]: "Nearest neighbour heuristics (same heading)",
108 LOGSF[2]: "Nearest neighbour heuristics (save same heading)"}
112 r["{}".format(LEG[sf])] = load_trajectories("{}/{}".format(LOGF, sf))
116 v[a] = (100 * count_if_exist(r[a], "traj") /
117 count_if_exist(r[a], "elap"))
118 vs = sorted(v.items(), key=lambda kv: kv[1])
120 plt.rcParams["font.size"] = 24
122 ax = fig.add_subplot(111)
123 ax.set_title("Success rate of trajectories found within 10 seconds limit")
125 ax.set_ylabel("Framework tested [-]")
126 ax.set_xlabel("Found successfully [%]")
128 ax.set_yticklabels([])
131 print("{}: {}%".format(k, i))
132 ax.barh(j, float(i), 4, label=k)
138 def plot_mintrajcost():
139 """Plot minimum trajectory cost found."""
141 ALG=["Karaman2011", "Kuwata2008", "LaValle1998"]
142 ALGT={"Karaman2011": "RRT*",
143 "Kuwata2008": "RRT + heur",
144 "LaValle1998": "RRT"}
154 r["{}, {}, {}".format(ALGT[a], STT[st], COT[co])] = (
155 load_trajectories("{}/{}st{}co{}_lpar".format(
160 v[a] = get_lasts_if_exist(r[a], "cost")
162 #plt.rcParams["font.size"] = 24
164 for i in range(len(r.keys())):
165 ax = fig.add_subplot(3, 1, i + 1)
166 ax.set_title("Minimum trajectory cost found in 10 seconds (sequential)")
168 ax.set_ylabel("Framework tested [-]")
169 ax.set_xlabel("Minimum trajectory cost [m]")
170 #ax.set_yticklabels([])
172 plt.bar(range(len(v[r.keys()[i]])), v[r.keys()[i]], label=r.keys()[i])
179 """Plot distribution of last costs across measured tests."""
180 LOGF="logs_T2st3co2_lpar"
181 LOGSF=["opt0_nnedist", "opt2_nnsh", "opt1_nnedist"]
183 LOGSF[0]: "No path optimization",
184 LOGSF[1]: "RRT*-Smart optimization",
185 LOGSF[2]: "Dijkstra optimization"}
187 LEG[LOGSF[0]]: "orange",
188 LEG[LOGSF[1]]: "blue",
189 LEG[LOGSF[2]]: "red"}
193 r["{}".format(LEG[sf])] = load_trajectories("{}/{}".format(LOGF, sf))
197 v[a] = get_lasts_if_exist(r[a], "cost")
199 plt.rcParams["font.size"] = 24
201 ax = fig.add_subplot(111)
202 ax.set_title("Path cost histogram")
204 ax.set_ylabel("Number of paths with given cost [-]")
205 ax.set_xlabel("Path cost [m]")
207 ax.set_aspect("equal")
210 plt.hist(v[a], alpha=0.5, label=a, bins=100, histtype="step",
212 X_WHERE = np.percentile(v[a], [95])
213 plt.axvline(X_WHERE, lw=1, color=COLS[a], linestyle="--")
219 """Plot time of the last traj (the maximum time)."""
220 LOGF="logs_T2st3co2_lpar"
221 LOGSF=["opt1_nn3_with-approximate-goal", "opt1_nn4", "opt1_nnedist"]
223 LOGSF[0]: "RRT* nearest neighbour",
224 LOGSF[1]: "Nearest neighbour with same heading",
225 LOGSF[2]: "Nearest neighbour Euclidean distance"}
227 LEG[LOGSF[0]]: "orange",
228 LEG[LOGSF[1]]: "blue",
229 LEG[LOGSF[2]]: "red"}
233 r["{}".format(LEG[sf])] = load_trajectories("{}/{}".format(LOGF, sf))
237 v[a] = get_lasts_if_exist(r[a], "secs")
239 plt.rcParams["font.size"] = 24
241 ax = fig.add_subplot(111)
242 ax.set_title("Path found time histogram")
244 ax.set_ylabel("Number of paths found [-]")
245 ax.set_xlabel("Algorithm elapsed time [s]")
247 ax.set_aspect("equal")
250 plt.hist(v[a], alpha=0.5, label=a, bins=np.arange(0, 10, 0.1),
251 histtype="step", color=COLS[a])
252 X_WHERE = np.percentile(v[a], [95])
253 plt.axvline(X_WHERE, lw=1, color=COLS[a], linestyle="--")
258 def print_nofnodes():
259 """Print average number of nodes."""
260 LOGF="logs_T2st3co2_lpar"
261 LOGSF=["opt1_nn3_with-approximate-goal", "opt1_nn4", "opt1_nnedist"]
263 LOGSF[0]: "RRT* nearest neighbour",
264 LOGSF[1]: "Nearest neighbour with same heading",
265 LOGSF[2]: "Nearest neighbour Euclidean distance"}
269 r["{}".format(LEG[sf])] = load_trajectories("{}/{}".format(LOGF, sf))
273 lasts = get_lasts_if_exist(r[a], "node")
274 v[a] = np.average(lasts)
276 print("Average number of points:")
278 print("{}: {}".format(a, v[a]))
280 def print_successrate():
281 """Print success rate of implementations."""
282 LOGF="logs_T2st3co2_lpar"
283 LOGSF=["opt0_nnedist", "opt2_nnsh", "opt1_nnedist", "opt1_nn4"]
285 LOGSF[0]: "opt0 nn edist",
286 LOGSF[1]: "opt2 nn same heading",
287 LOGSF[2]: "opt1 nn edist",
288 LOGSF[3]: "opt1 nn same heading"}
292 r["{}".format(LEG[sf])] = load_trajectories("{}/{}".format(LOGF, sf))
296 v[a] = (100.0 * count_if_exist(r[a], "traj") /
297 count_if_exist(r[a], "elap"))
299 print("Success rate:")
301 print("{}: {}".format(a, v[a]))
303 if __name__ == "__main__":