def process(self, point):
     if self._prev_point is None:
         self._prev_point = point
         return
     
     # if there is no hypothesis, lets see if we far away from the existing endpoint
     if self._hypothesis_point is None:
         if not self._endpoint_exists(self._prev_point):
             self._hypothesis_point = self._prev_point
         else:
             self._prev_point = point
             return
     
     ds = distance(self._hypothesis_point, self._prev_point)
     if ds < self._stationary_distance_threshold:
         dt = delta_float_time(self._prev_point[0], point[0])
         # if we time contribution is large, then shift hypothesis point to the most recent onec
         if dt > self._current_cumulative_dt:
             self._hypothesis_point = self._prev_point
         self._current_cumulative_dt += dt
         if self._current_cumulative_dt > self._stationary_threshold:
             self._endpoints.append(self._hypothesis_point)
             self._hypothesis_point = None
             self._current_cumulative_dt = 0
     else:
         # moved too far from hypothesis point, reseting
         self._hypothesis_point = None
         self._current_cumulative_dt = 0
     self._prev_point = point
    def process(self, point):
        if self._from_endpoint_index is None:
            index = self._get_closest_endpoint_index(point)
            if index is not None:
                self._start_route(point, index)
            return
        else:
            dt = delta_float_time(self._current_route[-1][0], point[0])
            if dt > self._continuity_threshold:
                if self._verbose:
                    dist = distance(point, self._endpoints[self._from_endpoint_index])
                    print('Continuity ruined from %s\n    to %s\n   dt=%smin, dist=%s' %
                          (trajectory_point_to_str([self._current_route[-1]], 0),
                           trajectory_point_to_str([point], 0),
                           dt/60., dist))
                index = self._get_closest_endpoint_index(point)
                if index == self._from_endpoint_index:
                    if self._verbose:
                        print(' !BUT Didnt move too far from beginning though')
                    self._stop_route()
                    self._start_route(point, index)
                else:
                    self._stop_route()
                return
            
            self._current_route.append(point)

            index = self._get_closest_endpoint_index(point)
            if index == self._from_endpoint_index:
                if self._verbose:
                    print('made a loop or didnt move')
                self._stop_route()
                self._start_route(point, index)
            elif index == self._to_endpoint_index():
                if self._from_endpoint_index == 0:
                    self._AtoB_routes.append(np.array(self._current_route))
                    if self._verbose:
                        print('A to B found: %s TO %s' %
                              (trajectory_point_to_str(self._current_route, 0),
                               trajectory_point_to_str(self._current_route, len(self._current_route)-1)))
                    self._stop_route()
                    
                else:
                    self._BtoA_routes.append(np.array(self._current_route))
                    if self._verbose:
                        print('B to A found: %s TO %s' %
                              (trajectory_point_to_str(self._current_route, 0),
                               trajectory_point_to_str(self._current_route, len(self._current_route)-1)))
                    self._stop_route()
   def allow(self, current_p, next_p):    
       dist = distance(current_p, next_p)
       dt = delta_float_time(current_p[0], next_p[0])
       v = ms_to_mph*dist/dt
       if v > self._speed_threshold:
           if self._outliers_counter > 0:
               self._outliers_counter -= 1
               return False
 
       if dist > self._distance_threshold:
           if self._outliers_counter > 0:
               self._outliers_counter -= 1
               return False
       self._outliers_counter = self._max_number_outliers
       
       return True
 def allow(self, current_p, next_p):
     dt = delta_float_time(current_p[0], next_p[0])
     if dt < 1:
         return False
     return True
 def get_duration(self):
     return delta_float_time(self.data[0, 0], self.data[-1, 0])