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

org.opentripplanner.astar.AStarBuilder Maven / Gradle / Ivy

The newest version!
package org.opentripplanner.astar;

import java.time.Duration;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import org.opentripplanner.astar.model.GraphPath;
import org.opentripplanner.astar.model.ShortestPathTree;
import org.opentripplanner.astar.spi.AStarEdge;
import org.opentripplanner.astar.spi.AStarState;
import org.opentripplanner.astar.spi.AStarVertex;
import org.opentripplanner.astar.spi.DominanceFunction;
import org.opentripplanner.astar.spi.RemainingWeightHeuristic;
import org.opentripplanner.astar.spi.SearchTerminationStrategy;
import org.opentripplanner.astar.spi.SkipEdgeStrategy;
import org.opentripplanner.astar.spi.TraverseVisitor;

public abstract class AStarBuilder<
  State extends AStarState,
  Edge extends AStarEdge,
  Vertex extends AStarVertex,
  Builder extends AStarBuilder
> {

  private Builder builder;
  private RemainingWeightHeuristic heuristic = RemainingWeightHeuristic.TRIVIAL;
  private SkipEdgeStrategy skipEdgeStrategy;
  private TraverseVisitor traverseVisitor;
  private boolean arriveBy;
  private Set fromVertices;
  private Set toVertices;
  private SearchTerminationStrategy terminationStrategy;
  private DominanceFunction dominanceFunction;
  private Edge originBackEdge;
  private Collection initialStates;

  protected AStarBuilder() {}

  protected void setBuilder(Builder builder) {
    this.builder = builder;
  }

  public Builder setHeuristic(RemainingWeightHeuristic heuristic) {
    this.heuristic = heuristic;
    return builder;
  }

  public Builder setSkipEdgeStrategy(SkipEdgeStrategy skipEdgeStrategy) {
    this.skipEdgeStrategy = skipEdgeStrategy;
    return builder;
  }

  public Builder setTraverseVisitor(TraverseVisitor traverseVisitor) {
    this.traverseVisitor = traverseVisitor;
    return builder;
  }

  public Builder setArriveBy(boolean arriveBy) {
    this.arriveBy = arriveBy;
    return builder;
  }

  protected boolean arriveBy() {
    return arriveBy;
  }

  public Builder setFrom(Set fromVertices) {
    this.fromVertices = fromVertices;
    return builder;
  }

  public Builder setFrom(Vertex fromVertex) {
    this.fromVertices = Collections.singleton(fromVertex);
    return builder;
  }

  public Builder setTo(Set toVertices) {
    this.toVertices = toVertices;
    return builder;
  }

  public Builder setTo(Vertex toVertex) {
    this.toVertices = Collections.singleton(toVertex);
    return builder;
  }

  public Builder setTerminationStrategy(SearchTerminationStrategy terminationStrategy) {
    this.terminationStrategy = terminationStrategy;
    return builder;
  }

  /** The function that compares paths converging on the same vertex to decide which ones continue to be explored. */
  public Builder setDominanceFunction(DominanceFunction dominanceFunction) {
    this.dominanceFunction = dominanceFunction;
    return builder;
  }

  protected abstract Duration streetRoutingTimeout();

  public Builder setOriginBackEdge(Edge originBackEdge) {
    this.originBackEdge = originBackEdge;
    return builder;
  }

  public Builder setInitialStates(Collection initialStates) {
    this.initialStates = initialStates;
    return builder;
  }

  public ShortestPathTree getShortestPathTree() {
    return build().getShortestPathTree();
  }

  public List> getPathsToTarget() {
    return build().getPathsToTarget();
  }

  private AStar build() {
    final Set origin = arriveBy ? toVertices : fromVertices;
    final Set destination = arriveBy ? fromVertices : toVertices;

    Collection initialStates;

    if (this.initialStates != null) {
      initialStates = this.initialStates;
    } else {
      initialStates = createInitialStates(origin);

      if (originBackEdge != null) {
        for (var state : initialStates) {
          state.initBackEdge(originBackEdge);
        }
      }
    }

    prepareInitialStates(initialStates);
    initializeHeuristic(heuristic, origin, destination, arriveBy);

    return new AStar<>(
      heuristic,
      skipEdgeStrategy,
      traverseVisitor,
      arriveBy,
      origin,
      destination,
      terminationStrategy,
      Optional.ofNullable(dominanceFunction).orElseGet(this::createDefaultDominanceFunction),
      streetRoutingTimeout(),
      initialStates
    );
  }

  protected abstract Collection createInitialStates(Set originVertices);

  protected abstract void prepareInitialStates(Collection initialStates);

  protected abstract void initializeHeuristic(
    RemainingWeightHeuristic heuristic,
    Set origin,
    Set destination,
    boolean arriveBy
  );

  protected abstract DominanceFunction createDefaultDominanceFunction();
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy