def feature_matrix2(trips, n=None):
    velocities = [compute_velocity(trip) for trip in trips]
    speeds = [compute_scalar(velocity) for velocity in velocities]
    maxlen = len(max(speeds, key=len)) if n is None else n
    print("maxlen:", maxlen)
    res = np.array([np.fft.fft(s, n=maxlen) for s in speeds])
    print(res.shape)
    return res
def feature_matrix2(trips, n=None):
    velocities = [compute_velocity(trip) for trip in trips]
    speeds = [compute_scalar(velocity) for velocity in velocities]
    maxlen = len(max(speeds, key=len)) if n is None else n
    print("maxlen:", maxlen)
    res = np.array([np.fft.fft(s, n=maxlen) for s in speeds])
    print(res.shape)
    return res
def feature_vector(trip):
    velocity = compute_velocity(trip)
    velocity5 = n_step_diff(trip, n=5)
    acceleration = np.gradient(velocity)
    acceleration5 = np.gradient(velocity5)
    cos_dt = [cos_between(a, np.array([1, 0])) for a in acceleration5]
    angle_dt = [np.arccos(c) for c in cos_dt]
    speed = compute_scalar(velocity)
    corner_features = corners_features(velocity)
    acc_features = acceleration_features(velocity, angle_dt, cos_dt, speed)
    return np.hstack((corner_features, acc_features))
def feature_vector(trip):
    velocity = compute_velocity(trip)
    velocity5 = n_step_diff(trip, n=5)
    acceleration = np.gradient(velocity)
    acceleration5 = np.gradient(velocity5)
    cos_dt = [cos_between(a, np.array([1, 0])) for a in acceleration5]
    angle_dt = [np.arccos(c) for c in cos_dt]
    speed = compute_scalar(velocity)
    corner_features = corners_features(velocity)
    acc_features = acceleration_features(velocity, angle_dt, cos_dt, speed)
    return np.hstack((corner_features, acc_features))
def main():
    trips = read_trips(sys.argv[1])
    velocities = [compute_velocity(trip) for trip in trips]
    speeds = [compute_scalar(v) for v in velocities]
    features = np.array([corners_features(v, s) for v, s in zip(velocities, speeds)])
    #print(features)
    n = random.randint(0, 199)
    n = 29
    print("Trip number is:", n)
    (corners, angles) = identify_corners(velocities[n])
    trip = trips[n]
    import matplotlib.pyplot as plt
    plt.scatter(trips[n][:,0], trips[n][:,1])#, c=speeds[n])
    for start, end in corners:
        t = trip[list(range(start, end+1))]
        plt.plot(t[:,0], t[:,1], 'r', linewidth=4.0)
    plt.axis('equal')
    plt.show()
def corners_features(velocity, dists=None):
    if dists is None:
        dists = compute_scalar(velocity)
    corners, angles = identify_corners(velocity, dists)
    if len(corners) == 0:
        return np.zeros(14)
    corner_speeds = [dists[range(c1, c2+1)] for c1, c2 in corners]
    corner_speeds_contig = list(chain(*corner_speeds))
    bins = np.linspace(0, 14, 10)
    corner_speed_hist, bs = np.histogram(corner_speeds_contig, bins=bins)
    mean_corner_speeds = [np.mean(cs) for cs in corner_speeds]
    max_speed = np.max(mean_corner_speeds)
    min_speed = np.min(mean_corner_speeds)
    mean_speed = np.mean(mean_corner_speeds)
    res = np.hstack((
        np.array([float(len(corners))/np.sum(dists), np.mean(angles), max_speed, min_speed, mean_speed]),
        corner_speed_hist
    ))
    return res
def main():
    trips = read_trips(sys.argv[1])
    velocities = [compute_velocity(trip) for trip in trips]
    speeds = [compute_scalar(v) for v in velocities]
    features = np.array(
        [corners_features(v, s) for v, s in zip(velocities, speeds)])
    #print(features)
    n = random.randint(0, 199)
    n = 29
    print("Trip number is:", n)
    (corners, angles) = identify_corners(velocities[n])
    trip = trips[n]
    import matplotlib.pyplot as plt
    plt.scatter(trips[n][:, 0], trips[n][:, 1])  #, c=speeds[n])
    for start, end in corners:
        t = trip[list(range(start, end + 1))]
        plt.plot(t[:, 0], t[:, 1], 'r', linewidth=4.0)
    plt.axis('equal')
    plt.show()
def corners_features(velocity, dists=None):
    if dists is None:
        dists = compute_scalar(velocity)
    corners, angles = identify_corners(velocity, dists)
    if len(corners) == 0:
        return np.zeros(14)
    corner_speeds = [dists[range(c1, c2 + 1)] for c1, c2 in corners]
    corner_speeds_contig = list(chain(*corner_speeds))
    bins = np.linspace(0, 14, 10)
    corner_speed_hist, bs = np.histogram(corner_speeds_contig, bins=bins)
    mean_corner_speeds = [np.mean(cs) for cs in corner_speeds]
    max_speed = np.max(mean_corner_speeds)
    min_speed = np.min(mean_corner_speeds)
    mean_speed = np.mean(mean_corner_speeds)
    res = np.hstack((np.array([
        float(len(corners)) / np.sum(dists),
        np.mean(angles), max_speed, min_speed, mean_speed
    ]), corner_speed_hist))
    return res
def identify_corners(velocity, dist=None):
    """
    Calculates where the corners are from a sequence of velocities
    Arguments:
        velocity: a sequence of 2D velocity vectors
        dist: (Optional) a sequence of scalar distances if this has already been calculated. 
    Returns:
        sequences of indices in a list. Each sequence corresponds to a corner where the indices are positions from the original trip array
    """
    if dist is None:
        dist = compute_scalar(velocity)
    res = []
    angles = []
    i = 0
    while i < len(velocity) - 1:
        if angle_between(velocity[i], velocity[i + 1]) > np.radians(5):
            start = i
            start_vec = velocity[i]
            prev_corner_angle = 0
            currdist = dist[i]
            if dist[i] < 1:
                #if the distance from last is small it's probably noise
                i += 1
                continue
            for j, (v, d) in enumerate(zip(velocity[i + 1:], dist[i + 1:])):
                if d < 1:
                    #if the distance from last is small it's probably noise
                    continue
                currdist += d
                corner_angle = angle_between(start_vec, v)
                if currdist > 70 or corner_angle <= prev_corner_angle + np.radians(
                        1):
                    if corner_angle > np.radians(45):
                        i = i + j
                        res.append([start, i])
                        angles.append(corner_angle)
                        break
                    else:
                        break
                prev_corner_angle = corner_angle
        i += 1
    return (res, angles)
def identify_corners(velocity, dist=None):
    """
    Calculates where the corners are from a sequence of velocities
    Arguments:
        velocity: a sequence of 2D velocity vectors
        dist: (Optional) a sequence of scalar distances if this has already been calculated. 
    Returns:
        sequences of indices in a list. Each sequence corresponds to a corner where the indices are positions from the original trip array
    """
    if dist is None:
        dist = compute_scalar(velocity)
    res = []
    angles = []
    i = 0
    while i < len(velocity) - 1:
        if angle_between(velocity[i], velocity[i+1]) > np.radians(5):
            start = i
            start_vec = velocity[i]
            prev_corner_angle = 0
            currdist = dist[i]
            if dist[i] < 1:
                #if the distance from last is small it's probably noise
                i+=1
                continue
            for j, (v, d) in enumerate(zip(velocity[i+1:], dist[i+1:])):
                if d < 1:
                    #if the distance from last is small it's probably noise
                    continue
                currdist += d
                corner_angle = angle_between(start_vec, v)
                if currdist > 70 or corner_angle <= prev_corner_angle + np.radians(1):
                    if corner_angle > np.radians(45):
                        i = i + j
                        res.append([start, i])
                        angles.append(corner_angle)
                        break
                    else:
                        break
                prev_corner_angle = corner_angle
        i += 1
    return (res, angles)
def feature_vector(trip):
    velocity = compute_velocity(trip)
    speed = compute_scalar(velocity)
    corner_features = corners_features(velocity)
    acc_features = acceleration_features(speed)
    return np.hstack((corner_features, acc_features))
def feature_vector(trip):
    velocity = compute_velocity(trip)
    speed = compute_scalar(velocity)
    corner_features = corners_features(velocity)
    acc_features = acceleration_features(speed)
    return np.hstack((corner_features, acc_features))