/*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.optaplanner.examples.common.app;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.optaplanner.core.api.domain.solution.PlanningSolution;
import org.optaplanner.core.api.solver.Solver;
import org.optaplanner.core.api.solver.SolverFactory;
import org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig;
import org.optaplanner.core.config.solver.EnvironmentMode;
import org.optaplanner.core.config.solver.SolverConfig;
import org.optaplanner.core.config.solver.termination.TerminationConfig;
import org.optaplanner.core.impl.score.director.easy.EasyScoreCalculator;
/**
* @param <Solution_> the solution type, the class with the {@link PlanningSolution} annotation
*/
@RunWith(Parameterized.class)
public abstract class SolveAllTurtleTest<Solution_> extends AbstractTurtleTest {
protected abstract String createSolverConfigResource();
protected abstract Solution_ readPlanningProblem();
@Test
public void runFastAndFullAssert() {
checkRunTurtleTests();
SolverFactory<Solution_> solverFactory = buildSolverFactory();
Solution_ planningProblem = readPlanningProblem();
// Specifically use NON_INTRUSIVE_FULL_ASSERT instead of FULL_ASSERT to flush out bugs hidden by intrusiveness
// 1) NON_INTRUSIVE_FULL_ASSERT ASSERT to find CH bugs (but covers little ground)
planningProblem = buildAndSolve(solverFactory, EnvironmentMode.NON_INTRUSIVE_FULL_ASSERT, planningProblem, 2L);
// 2) FAST_ASSERT to run past CH into LS to find easy bugs (but covers much ground)
planningProblem = buildAndSolve(solverFactory, EnvironmentMode.FAST_ASSERT, planningProblem, 5L);
// 3) NON_INTRUSIVE_FULL_ASSERT ASSERT to find LS bugs (but covers little ground)
planningProblem = buildAndSolve(solverFactory, EnvironmentMode.NON_INTRUSIVE_FULL_ASSERT, planningProblem, 3L);
}
protected Solution_ buildAndSolve(SolverFactory<Solution_> solverFactory, EnvironmentMode environmentMode,
Solution_ planningProblem, long maximumMinutesSpent) {
SolverConfig solverConfig = solverFactory.getSolverConfig();
solverConfig.getTerminationConfig().setMinutesSpentLimit(maximumMinutesSpent);
solverConfig.setEnvironmentMode(environmentMode);
Class<? extends EasyScoreCalculator> easyScoreCalculatorClass = overwritingEasyScoreCalculatorClass();
if (easyScoreCalculatorClass != null && environmentMode.isAsserted()) {
ScoreDirectorFactoryConfig assertionScoreDirectorFactoryConfig = new ScoreDirectorFactoryConfig();
assertionScoreDirectorFactoryConfig.setEasyScoreCalculatorClass(easyScoreCalculatorClass);
solverConfig.getScoreDirectorFactoryConfig().setAssertionScoreDirectorFactory(
assertionScoreDirectorFactoryConfig);
}
Solver<Solution_> solver = solverFactory.buildSolver();
Solution_ bestSolution = solver.solve(planningProblem);
return bestSolution;
}
protected Class<? extends EasyScoreCalculator> overwritingEasyScoreCalculatorClass() {
return null;
}
protected SolverFactory<Solution_> buildSolverFactory() {
SolverFactory<Solution_> solverFactory = SolverFactory.createFromXmlResource(createSolverConfigResource());
TerminationConfig terminationConfig = new TerminationConfig();
// buildAndSolve() fills in minutesSpentLimit
solverFactory.getSolverConfig().setTerminationConfig(terminationConfig);
return solverFactory;
}
}