/** * Adapts {@link Solver} to {@link RealtimeSolver}. This real-time solver * behaves as follows, upon receiving a new snapshot * {@link RealtimeSolver#problemChanged(GlobalStateObject)} the underlying * {@link Solver} is called to solve the problem. Any ongoing computation of a * previous snapshot is cancelled. When the solver completes its computation, * {@link Scheduler#updateSchedule(GlobalStateObject,ImmutableList)} is called * to provide the updated schedule. The scheduler is also notified that no * computations are currently taking place by calling * {@link Scheduler#doneForNow()}. * <p> * TODO talk about interrupt in solver * * @param solver The solver to adapt. * @return The adapted solver. */ public static RealtimeSolver toRealtime(Solver solver) { return new SolverToRealtimeAdapter(solver); }
@Override public void cancel() { if (isComputing()) { LOGGER.trace("attempt to cancel running Solver.."); currentFuture.get().cancel(true); scheduler.get().doneForNow(); } }
@Override public void problemChanged(final GlobalStateObject snapshot) { checkState(scheduler.isPresent(), "Not yet initialized."); cancel(); currentFuture = Optional.of( scheduler.get().getSharedExecutor().submit(
@Override public RealtimeSolver get(long seed) { return new SolverToRealtimeAdapter(solver.get(seed)); }
@Override public RtSimSolver build(Solver solver) { return build(new SolverToRealtimeAdapter(solver)); } }
@Override public RealtimeSolver get(long seed) { return new SolverToRealtimeAdapter(getSolverSupplier().get(seed)); }