private SolverInstanceContext internalDisposeSolver(String containerId, String solverId) { // need to dispose resources here SolverInstanceContext sic = solvers.remove(SolverInstance.getSolverInstanceKey(containerId, solverId)); if (sic != null) { synchronized (sic) { if (sic.getInstance().getStatus() == SolverInstance.SolverStatus.SOLVING) { terminateSolverEarly(sic); } } } return sic; }
private void solvePlanningProblem(final SolverInstanceContext sic, final Object planningSolution) { sic.getInstance().setBestSolution(null); sic.getInstance().setStatus(SolverInstance.SolverStatus.SOLVING); this.executor.execute(() -> { try { // If the executor's queue is full, it's possible that the solver gets canceled before it starts SolverInstance.SolverStatus status; synchronized (sic) { status = sic.getInstance().getStatus(); // TODO Race condition: status turns into non-solving before solver starts // See https://issues.jboss.org/browse/PLANNER-540 } if (status == SolverInstance.SolverStatus.SOLVING) { sic.getSolver().solve(planningSolution); } } catch (Exception e) { logger.error("Exception executing solver '" + sic.getInstance().getSolverId() + "' from container '" + sic.getInstance().getContainerId() + "'. Thread will terminate.", e); } finally { synchronized (sic) { sic.getInstance().setStatus(SolverInstance.SolverStatus.NOT_SOLVING); } } }); }
solverId); SolverInstance instance = new SolverInstance(); instance.setSolverConfigFile(configFile); instance.setContainerId(containerId); instance.setSolverId(solverId);
public ServiceResponse<SolverInstance> createSolver(String containerId, String solverId, SolverInstance instance) { if (instance == null || instance.getSolverConfigFile() == null) { logger.error("Error creating solver. Configuration file name is null: " + instance); return new ServiceResponse<>( + ". Solver configuration file is null: " + instance); instance.setContainerId(containerId); instance.setSolverId(solverId); if (solvers.containsKey(instance.getSolverInstanceKey())) { logger.error("Error creating solver. Solver '" + solverId + "' already exists for container '" + containerId + "'."); return new ServiceResponse<>(ServiceResponse.ResponseType.FAILURE, if (instance.getStatus() == null) { instance.setStatus(SolverInstance.SolverStatus.NOT_SOLVING); instance.getSolverConfigFile()); updateSolverInstance(sic); solvers.put(instance.getSolverInstanceKey(), sic);
@SuppressWarnings("unchecked") private <S extends Score<?>> S marshallUnmarshallScore(S toBeMarshalled) { ScoreWrapper wrapper = new ScoreWrapper(toBeMarshalled); SolverInstance instance = new SolverInstance(); instance.setScoreWrapper(wrapper); String marshalledSolver = marshaller.marshall(instance); SolverInstance result = marshaller.unmarshall(marshalledSolver, SolverInstance.class); return (S) result.getScoreWrapper().toScore(); } }
public ServiceResponse<SolverInstance> getSolverWithBestSolution(String containerId, String solverId) { try { SolverInstanceContext sic = solvers.get(SolverInstance.getSolverInstanceKey(containerId, solverId)); if (sic != null) { updateSolverInstance(sic); sic.getInstance().setBestSolution(sic.getSolver().getBestSolution()); return new ServiceResponse<>(ServiceResponse.ResponseType.SUCCESS, "Best computed solution for '" + solverId + "' successfully retrieved from container '" + containerId + "'", sic.getInstance()); } else { return new ServiceResponse<>(ServiceResponse.ResponseType.FAILURE, "Solver '" + solverId + "' not found in container '" + containerId + "'", null); } } catch (Exception e) { logger.error("Error retrieving solver '" + solverId + "' state from container '" + containerId + "'", e); return new ServiceResponse<>(ServiceResponse.ResponseType.FAILURE, "Error retrieving solver '" + solverId + "' state from container '" + containerId + "'" + e.getMessage(), null); } }
public String getSolverInstanceKey() { return getSolverInstanceKey(this.containerId, this.solverId); }
private void updateSolverInstance(SolverInstanceContext sic) { synchronized (sic) { // We keep track of the solver status ourselves, so there's no need to call buggy updateSolverStatus( sic ); Score<?> bestScore = sic.getSolver().getBestScore(); sic.getInstance().setScoreWrapper(new ScoreWrapper(bestScore)); } }
private List<SolverInstance> getSolversForContainer(String containerId) { List<SolverInstance> sl = new ArrayList<>(solvers.size()); for (SolverInstanceContext sic : solvers.values()) { if (containerId.equalsIgnoreCase(sic.getInstance().getContainerId())) { updateSolverInstance(sic); sl.add(sic.getInstance()); } } return sl; }
String containerId = context.getContainerId(createSolverCommand.getContainerId(), ContainerLocatorProvider.get().getLocator()); SolverInstance instance = new SolverInstance(); instance.setContainerId(containerId); instance.setSolverId(createSolverCommand.getSolverId()); instance.setSolverConfigFile(createSolverCommand.getSolverConfigFile()); response = solverService.createSolver(containerId, createSolverCommand.getSolverId(),
Object problemFactChanges) { try { SolverInstanceContext sic = solvers.get(SolverInstance.getSolverInstanceKey(containerId, solverId)); if (problemFactChanges instanceof List) {
public ServiceResponse<Void> terminateSolverEarly(String containerId, String solverId) { try { SolverInstanceContext sic = solvers.get(SolverInstance.getSolverInstanceKey(containerId, solverId)); if (sic != null) { synchronized (sic) { switch (sic.getInstance().getStatus()) { case SOLVING: { terminateSolverEarly(sic); "Solver '" + solverId + "' on container '" + containerId + "' is in unrecognized state '" + sic.getInstance().getStatus() + "'.");
public ServiceResponse<SolverInstance> getSolver(String containerId, String solverId) { try { SolverInstanceContext sic = solvers.get(SolverInstance.getSolverInstanceKey(containerId, solverId)); if (sic != null) { updateSolverInstance(sic); return new ServiceResponse<>(ServiceResponse.ResponseType.SUCCESS, "Solver '" + solverId + "' state successfully retrieved from container '" + containerId + "'", sic.getInstance()); } else { return new ServiceResponse<>(ServiceResponse.ResponseType.FAILURE, "Solver '" + solverId + "' not found in container '" + containerId + "'", null); } } catch (Exception e) { logger.error("Error retrieving solver '" + solverId + "' state from container '" + containerId + "'", e); return new ServiceResponse<>(ServiceResponse.ResponseType.FAILURE, "Error retrieving solver '" + solverId + "' state from container '" + containerId + "'" + e.getMessage(), null); } }
public ServiceResponse<Boolean> isEveryProblemFactChangeProcessed(final String containerId, final String solverId) { try { SolverInstanceContext sic = solvers.get(SolverInstance.getSolverInstanceKey(containerId, solverId)); if (sic != null) { synchronized (sic) { switch (sic.getInstance().getStatus()) { case SOLVING: { boolean everyProblemFactChangeProcessed = sic.getSolver().isEveryProblemFactChangeProcessed(); "Solver '" + solverId + "' on container '" + containerId + "' is in unrecognized state '" + sic.getInstance().getStatus() + "'.");
Object planningProblem) { try { SolverInstanceContext sic = solvers.get(SolverInstance.getSolverInstanceKey(containerId, solverId)); if (sic != null) { synchronized (sic) { switch (sic.getInstance().getStatus()) { case SOLVING: { return new ServiceResponse<>(ServiceResponse.ResponseType.FAILURE, "Solver '" + solverId + "' on container '" + containerId + "' is in unrecognized state '" + sic.getInstance().getStatus() + "'.");