Esempio n. 1
0
  /**
   * Prune raptor data to include only routes and boardings which have trips today. Doesn't actually
   * improve speed
   */
  @SuppressWarnings("unchecked")
  private RaptorData pruneDataForServiceDays(Graph graph, ArrayList<ServiceDay> serviceDays) {

    if (serviceDays.equals(cachedServiceDays)) return cachedRaptorData;
    RaptorData data = graph.getService(RaptorDataService.class).getData();
    RaptorData pruned = new RaptorData();
    pruned.raptorStopsForStopId = data.raptorStopsForStopId;
    pruned.stops = data.stops;
    pruned.routes = new ArrayList<RaptorRoute>();
    pruned.routesForStop = new List[pruned.stops.length];

    for (RaptorRoute route : data.routes) {
      ArrayList<Integer> keep = new ArrayList<Integer>();

      for (int i = 0; i < route.boards[0].length; ++i) {
        Edge board = route.boards[0][i];
        int serviceId;
        if (board instanceof TransitBoardAlight) {
          serviceId = ((TransitBoardAlight) board).getPattern().getServiceId();
        } else {
          log.debug("Unexpected nonboard among boards");
          continue;
        }
        for (ServiceDay day : serviceDays) {
          if (day.serviceIdRunning(serviceId)) {
            keep.add(i);
            break;
          }
        }
      }
      if (keep.isEmpty()) continue;
      int nPatterns = keep.size();
      RaptorRoute prunedRoute = new RaptorRoute(route.getNStops(), nPatterns);
      for (int stop = 0; stop < route.getNStops() - 1; ++stop) {
        for (int pattern = 0; pattern < nPatterns; ++pattern) {
          prunedRoute.boards[stop][pattern] = route.boards[stop][keep.get(pattern)];
        }
      }
      pruned.routes.add(route);
      for (RaptorStop stop : route.stops) {
        List<RaptorRoute> routes = pruned.routesForStop[stop.index];
        if (routes == null) {
          routes = new ArrayList<RaptorRoute>();
          pruned.routesForStop[stop.index] = routes;
        }
        routes.add(route);
      }
    }
    for (RaptorStop stop : data.stops) {
      if (pruned.routesForStop[stop.index] == null) {
        pruned.routesForStop[stop.index] = Collections.emptyList();
      }
    }
    cachedServiceDays = serviceDays;
    cachedRaptorData = pruned;
    return pruned;
  }
Esempio n. 2
0
  /**
   * This does preliminary search over just routes and stops that have been used in the past between
   * these regions.
   */
  private int preliminaryRaptorSearch(
      RaptorData data, RoutingRequest options, RoutingRequest walkOptions, RaptorSearch search) {
    // find start/end regions
    List<Integer> startRegions = getRegionsForVertex(data.regionData, options.rctx.fromVertex);
    int startRegion;
    // for trips that span regions, we can safely pick either region
    startRegion = startRegions.get(0);
    List<Integer> endRegions = getRegionsForVertex(data.regionData, options.rctx.toVertex);
    int endRegion;
    endRegion = endRegions.get(0);

    // create a reduced set of RaptorData with only the stops/routes previously seen on trips
    // from the start region to the end region
    RaptorData trimmedData = new RaptorData();
    trimmedData.raptorStopsForStopId = new HashMap<AgencyAndId, RaptorStop>();
    HashSet<RaptorStop> stops = data.regionData.stops[startRegion][endRegion];
    for (RaptorStop stop : stops) {
      trimmedData.raptorStopsForStopId.put(stop.stopVertex.getStopId(), stop);
    }

    trimmedData.regionData = data.regionData;
    trimmedData.routes = data.regionData.routes[startRegion][endRegion];
    trimmedData.stops = data.stops;
    // trimmedData.allowedStops = stops;
    trimmedData.routesForStop = data.routesForStop;

    double walkDistance = options.getMaxWalkDistance();
    options = options.clone();
    walkOptions = walkOptions.clone();
    if (walkDistance > 4000) {
      // this is a really long walk. We'll almost never actually need this. So let's do our
      // preliminary search over just 4km first.
      options.setMaxWalkDistance(4000);
      walkOptions.setMaxWalkDistance(4000);
    }

    int round;
    if (trimmedData.routes.size() > 0) {
      log.debug(
          "Doing preliminary search on limited route set ("
              + trimmedData.routes.size()
              + ", "
              + stops.size()
              + ")");
      round = doPreliminarySearch(options, walkOptions, search, trimmedData);
    } else {
      round = 0;
    }

    if (search.getTargetStates().size() == 0 && walkDistance > 5000) {
      // nothing found in preliminary search
      // so we'll do a search with full set of routes & stops, but still limited distance
      log.debug("Doing preliminary search at limited distance");
      round = doPreliminarySearch(options, walkOptions, search, data);
    }

    return round;
  }