All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opentripplanner.street.search.StreetSearchBuilder Maven / Gradle / Ivy

The newest version!
package org.opentripplanner.street.search;

import java.time.Duration;
import java.util.Collection;
import java.util.Set;
import javax.annotation.Nonnull;
import org.opentripplanner.astar.AStarBuilder;
import org.opentripplanner.astar.spi.DominanceFunction;
import org.opentripplanner.astar.spi.RemainingWeightHeuristic;
import org.opentripplanner.ext.dataoverlay.routing.DataOverlayContext;
import org.opentripplanner.routing.api.request.RouteRequest;
import org.opentripplanner.routing.api.request.preference.StreetPreferences;
import org.opentripplanner.routing.api.request.request.StreetRequest;
import org.opentripplanner.street.model.edge.Edge;
import org.opentripplanner.street.model.vertex.Vertex;
import org.opentripplanner.street.search.intersection_model.IntersectionTraversalCalculator;
import org.opentripplanner.street.search.request.StreetSearchRequest;
import org.opentripplanner.street.search.request.StreetSearchRequestMapper;
import org.opentripplanner.street.search.state.State;
import org.opentripplanner.street.search.strategy.DominanceFunctions;
import org.opentripplanner.street.search.strategy.EuclideanRemainingWeightHeuristic;

public class StreetSearchBuilder extends AStarBuilder {

  private RouteRequest routeRequest;
  private StreetRequest streetRequest = new StreetRequest();
  private IntersectionTraversalCalculator intersectionTraversalCalculator;
  private DataOverlayContext dataOverlayContext;

  public static StreetSearchBuilder of() {
    return new StreetSearchBuilder();
  }

  private StreetSearchBuilder() {
    super();
    setBuilder(this);
  }

  public StreetSearchBuilder setRequest(RouteRequest request) {
    this.routeRequest = request;
    setArriveBy(request.arriveBy());
    return this;
  }

  public StreetSearchBuilder setStreetRequest(StreetRequest streetRequest) {
    this.streetRequest = streetRequest;
    return this;
  }

  public StreetSearchBuilder setVerticesContainer(TemporaryVerticesContainer container) {
    setFrom(container.getFromVertices());
    setTo(container.getToVertices());
    return this;
  }

  public StreetSearchBuilder setIntersectionTraversalCalculator(
    IntersectionTraversalCalculator intersectionTraversalCalculator
  ) {
    this.intersectionTraversalCalculator = intersectionTraversalCalculator;
    return this;
  }

  public StreetSearchBuilder setDataOverlayContext(DataOverlayContext dataOverlayContext) {
    this.dataOverlayContext = dataOverlayContext;
    return this;
  }

  @Nonnull
  @Override
  protected Duration streetRoutingTimeout() {
    return routeRequest.preferences().street().routingTimeout();
  }

  @Override
  protected Collection createInitialStates(Set originVertices) {
    StreetSearchRequest streetSearchRequest = StreetSearchRequestMapper
      .map(routeRequest)
      .withMode(streetRequest.mode())
      .withArriveBy(arriveBy())
      .build();

    return State.getInitialStates(originVertices, streetSearchRequest);
  }

  @Override
  protected void prepareInitialStates(Collection initialStates) {
    if (intersectionTraversalCalculator == null) {
      final StreetPreferences streetPreferences = routeRequest.preferences().street();
      intersectionTraversalCalculator =
        IntersectionTraversalCalculator.create(
          streetPreferences.intersectionTraversalModel(),
          streetPreferences.drivingDirection()
        );
    }

    for (var state : initialStates) {
      state.getRequest().setIntersectionTraversalCalculator(intersectionTraversalCalculator);
      state.getRequest().setDataOverlayContext(dataOverlayContext);
    }
  }

  @Override
  protected void initializeHeuristic(
    RemainingWeightHeuristic heuristic,
    Set ignored,
    Set destination,
    boolean arriveBy
  ) {
    if (heuristic.equals(RemainingWeightHeuristic.TRIVIAL)) {
      // No initialization needed
    } else if (heuristic instanceof EuclideanRemainingWeightHeuristic euclideanHeuristic) {
      euclideanHeuristic.initialize(
        streetRequest.mode(),
        destination,
        arriveBy,
        routeRequest.preferences()
      );
    } else {
      throw new IllegalArgumentException("Unknown heuristic type: " + heuristic);
    }
  }

  @Override
  protected DominanceFunction createDefaultDominanceFunction() {
    return new DominanceFunctions.Pareto();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy