]> rtime.felk.cvut.cz Git - hubacji1/iamcar.git/blobdiff - gplot.py
Merge branch 'release/0.7.0'
[hubacji1/iamcar.git] / gplot.py
index f66ad9bb4c01b43a9e9ba5cf8c8f015ffcf94120..1e9005163fd5603cd68578bfa81a3745b8f56d71 100644 (file)
--- a/gplot.py
+++ b/gplot.py
@@ -4,6 +4,26 @@ from json import loads
 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.
@@ -31,7 +51,8 @@ def load_trajectories(dname):
     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")
@@ -50,6 +71,22 @@ def gplot():
     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.
 
@@ -65,3 +102,170 @@ def count_if_exist(trajectories, what):
         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()