* @return sometimes null
*/
public Termination buildTermination(HeuristicConfigPolicy configPolicy) {
List<Termination> terminationList = new ArrayList<Termination>();
if (terminationClass != null) {
Termination termination = ConfigUtils.newInstance(this, "terminationClass", terminationClass);
terminationList.add(termination);
}
Long timeMillisSpentLimit = calculateTimeMillisSpentLimit();
if (timeMillisSpentLimit != null) {
terminationList.add(new TimeMillisSpentTermination(timeMillisSpentLimit));
}
Long unimprovedTimeMillisSpentLimit = calculateUnimprovedTimeMillisSpentLimit();
if (unimprovedTimeMillisSpentLimit != null) {
terminationList.add(new UnimprovedTimeMillisSpentTermination(unimprovedTimeMillisSpentLimit));
}
if (bestScoreLimit != null) {
Score bestScoreLimit_ = configPolicy.getScoreDefinition().parseScore(bestScoreLimit);
ScoreDefinition scoreDefinition = configPolicy.getScoreDefinition();
double[] timeGradientWeightNumbers = new double[scoreDefinition.getLevelsSize() - 1];
for (int i = 0; i < timeGradientWeightNumbers.length; i++) {
timeGradientWeightNumbers[i] = 0.50; // Number pulled out of thin air
}
terminationList.add(new BestScoreTermination(scoreDefinition, bestScoreLimit_, timeGradientWeightNumbers));
}
if (bestScoreFeasible != null) {
ScoreDefinition scoreDefinition = configPolicy.getScoreDefinition();
if (!(scoreDefinition instanceof FeasibilityScoreDefinition)) {
throw new IllegalStateException("The termination bestScoreFeasible (" + bestScoreFeasible
+ ") is not compatible with a scoreDefinitionClass (" + scoreDefinition.getClass()
+ ") which does not implement the interface "
+ FeasibilityScoreDefinition.class.getSimpleName() + ".");
}
if (!bestScoreFeasible) {
throw new IllegalArgumentException("The termination bestScoreFeasible (" + bestScoreFeasible
+ ") cannot be false.");
}
FeasibilityScoreDefinition feasibilityScoreDefinition = (FeasibilityScoreDefinition) scoreDefinition;
double[] timeGradientWeightFeasibleNumbers
= new double[feasibilityScoreDefinition.getFeasibleLevelsSize() - 1];
for (int i = 0; i < timeGradientWeightFeasibleNumbers.length; i++) {
timeGradientWeightFeasibleNumbers[i] = 0.50; // Number pulled out of thin air
}
terminationList.add(new BestScoreFeasibleTermination(feasibilityScoreDefinition,
timeGradientWeightFeasibleNumbers));
}
if (stepCountLimit != null) {
terminationList.add(new StepCountTermination(stepCountLimit));
}
if (unimprovedStepCountLimit != null) {
terminationList.add(new UnimprovedStepCountTermination(unimprovedStepCountLimit));
}
if (!ConfigUtils.isEmptyCollection(terminationConfigList)) {
for (TerminationConfig terminationConfig : terminationConfigList) {
Termination termination = terminationConfig.buildTermination(configPolicy);
if (termination != null) {
terminationList.add(termination);
}
}
}