private void localSearchStepEnded(LocalSearchStepScope stepScope) {
   if (constraintMatchEnabled) {
     long timeMillisSpent = stepScope.getPhaseScope().calculateSolverTimeMillisSpent();
     for (ConstraintMatchTotal constraintMatchTotal :
         stepScope.getScoreDirector().getConstraintMatchTotals()) {
       pointList.add(
           new ConstraintMatchTotalStepScoreStatisticPoint(
               timeMillisSpent,
               constraintMatchTotal.getConstraintPackage(),
               constraintMatchTotal.getConstraintName(),
               constraintMatchTotal.getScoreLevel(),
               constraintMatchTotal.getConstraintMatchCount(),
               constraintMatchTotal.getWeightTotalAsNumber().doubleValue()));
     }
   }
 }
 @Override
 public void stepEnded(LocalSearchStepScope stepScope) {
   super.stepEnded(stepScope);
   double timeGradient = stepScope.getTimeGradient();
   double reverseTimeGradient = 1.0 - timeGradient;
   temperatureLevels = new double[levelsLength];
   for (int i = 0; i < levelsLength; i++) {
     temperatureLevels[i] = startingTemperatureLevels[i] * reverseTimeGradient;
     if (temperatureLevels[i] < temperatureMinimum) {
       temperatureLevels[i] = temperatureMinimum;
     }
   }
   // TODO implement reheating
 }
 @Override
 protected Collection<? extends Object> findNewTabu(LocalSearchStepScope stepScope) {
   return stepScope.getStep().getPlanningValues();
 }