from matplotlib import pyplot as plt
from os import listdir
from sys import argv, exit
+import numpy as np
+import scipy.stats as ss
+
+# ed - euclidean distance
+# rs - reeds and shepp path length
+# sh - reeds and shepp, same heading
+
+# ad - optimize with dijkstra, all nodes
+# as - optimize with smart, all nodes
+# ar - optimize with remove redundant points, all nodes
+# cd - optimize with dijkstra, cusp nodes
+# cs - optimize with smart, cusp nodes
+# cr - optimize with remove redundant points, cusp nodes
+
+LOGF = "log_wo"
+LOG = [
+ {"f": "T2", "c": "orange", "l": "T2"},
+]
+
+r = {}
def load_trajectory(fname):
"""Load trajectory from file.
return trajectories
def gplot():
- """Plot graph."""
+ """Plot graph. Template."""
+ plt.rcParams["font.size"] = 24
fig = plt.figure()
ax = fig.add_subplot(111)
#ax.set_aspect("equal")
plt.show()
#plt.savefig("WHATEVER")
+
+def mean_conf_int(data, conf=0.95):
+ """Return (mean, lower, uppper) of data.
+
+ see https://stackoverflow.com/questions/15033511/compute-a-confidence-interval-from-sample-data
+
+ Keyword arguments:
+ data -- A list of data.
+ conf -- Confidence interval.
+ """
+ a = np.array(data)
+ n = len(a)
+ m = np.mean(a)
+ se = ss.sem(a)
+ h = se * ss.t.ppf((1 + conf) / 2, n - 1)
+ return (m, m - h, m + h)
+
+def count_if_exist(trajectories, what):
+ """From multiple trajectories compute the number of occurences.
+
+ Keyword arguments:
+ trajectories -- The list of trajectories.
+ what -- Number of occurences of what to compute.
+ """
+ occ = 0
+ for t in trajectories:
+ try:
+ if t[what]:
+ occ += 1
+ except:
+ pass
+ return occ
+
+def get_lasts_if_exist(trajectories, what):
+ """From multiple trajectories get the list of last values.
+
+ Keyword arguments:
+ trajectories -- The list of trajectories.
+ what -- The last values of what to take.
+ """
+ val = []
+ for t in trajectories:
+ try:
+ val.append(t[what][-1])
+ except:
+ pass
+ return val
+
+def get_maxs_if_exist(trajectories, what):
+ """From multiple trajectories get the list of maximum values.
+
+ Keyword arguments:
+ trajectories -- The list of trajectories.
+ what -- The maximum values of what to take.
+ """
+ val = []
+ for t in trajectories:
+ try:
+ val.append(max(t[what]))
+ except:
+ pass
+ return val
+
+def get_val_if_exist(trajectories, what):
+ """From m ultiple trajectories get value.
+
+ Keyword arguments:
+ trajectories -- The list of trajectories.
+ what -- What to take.
+ """
+ val = []
+ for t in trajectories:
+ try:
+ val.append(t[what])
+ except:
+ pass
+ return val
+
+def plot_costdist():
+ """Plot distribution of last costs across measured tests."""
+ v = {}
+ for a in r.keys():
+ v[a] = get_lasts_if_exist(r[a], "cost")
+
+ fig = plt.figure()
+ ax = fig.add_subplot(111)
+ ax.set_title("Path cost histogram")
+
+ ax.set_ylabel("Number of paths with given cost [-]")
+ ax.set_xlabel("Path cost [m]")
+ ax.set_yscale("log")
+
+ for a in LOG:
+ plt.hist(
+ v[a["f"]],
+ alpha = 0.5,
+ label = a["l"],
+ bins = 100,
+ histtype = "step",
+ color = a["c"])
+ try:
+ X_WHERE = np.percentile(v[a["f"]], [95])
+ plt.axvline(X_WHERE, lw=1, color=a["c"], linestyle="--")
+ except:
+ pass
+
+ plt.legend()
+ plt.show()
+
+def plot_maxtime():
+ """Plot time of the last traj (the maximum time)."""
+ v = {}
+ for a in r.keys():
+ v[a] = get_lasts_if_exist(r[a], "secs")
+
+ fig = plt.figure()
+ ax = fig.add_subplot(111)
+ ax.set_title("Histogram of time to find the path")
+
+ ax.set_ylabel("Number of paths found [-]")
+ ax.set_xlabel("Algorithm computation time [s]")
+ ax.set_yscale("log")
+
+ for a in LOG:
+ plt.hist(
+ v[a["f"]],
+ alpha = 0.5,
+ label = a["l"],
+ bins = np.arange(0, 10, 0.1),
+ histtype = "step",
+ color = a["c"])
+ try:
+ X_WHERE = np.percentile(v[a["f"]], [95])
+ plt.axvline(X_WHERE, lw=1, color=a["c"], linestyle="--")
+ except:
+ pass
+
+ plt.legend()
+ plt.show()
+
+def plot_nothingdone():
+ """Plot *nothing done* time of ``overlaptrees`` procedure."""
+ v = {}
+ for a in r.keys():
+ v[a] = get_lasts_if_exist(r[a], "nodo")
+
+ fig = plt.figure()
+ ax = fig.add_subplot(111)
+ ax.set_title("Histogram of nothing-done-time")
+
+ ax.set_ylabel("Occurences [-]")
+ ax.set_xlabel("Nothing-done-time percentage [-]")
+
+ for a in LOG:
+ plt.hist(
+ v[a["f"]],
+ alpha = 0.5,
+ label = a["l"],
+ bins = np.arange(0, 1, 0.1),
+ histtype = "step",
+ color = a["c"])
+ try:
+ X_WHERE = np.percentile(v[a["f"]], [95])
+ plt.axvline(X_WHERE, lw=1, color=a["c"], linestyle="--")
+ except:
+ pass
+
+ plt.legend()
+ plt.show()
+
+def print_nofnodes():
+ """Print average number of nodes."""
+ v={}
+ for a in r.keys():
+ lasts = get_lasts_if_exist(r[a], "node")
+ v[a] = np.average(lasts)
+
+ print("Average number of nodes:")
+ for a in LOG:
+ print("{}: {}".format(a["f"], v[a["f"]]))
+
+def print_successrate():
+ """Print success rate of implementations."""
+ v={}
+ for a in r.keys():
+ v[a] = (100.0 * count_if_exist(r[a], "traj") /
+ count_if_exist(r[a], "elap"))
+
+ print("Success rate:")
+ for a in LOG:
+ print("{}: {}".format(a["f"], v[a["f"]]))
+
+if __name__ == "__main__":
+ r = {}
+ for sf in [i["f"] for i in LOG]:
+ r[sf] = load_trajectories("{}/{}".format(LOGF, sf))
+ print_successrate()
+ plot_maxtime()
+ plot_costdist()