@Override
  public void progressChanged(ExperimentProgress algorithmExperiment) {

    String executionTask = algorithmExperiment.getExecutionProgressTask();
    int executionPercent = algorithmExperiment.getExecutionProgressPercent();

    boolean begin = executionPercent == 0;
    boolean finish = executionPercent == 100;
    boolean repeated =
        executionPercent == executionLastPercent && executionTask.equals(executionLastTask);
    boolean timeTrigger = chronometer.getTotalElapsed() >= verbosePeriod;
    if (((begin || finish) && !repeated) || timeTrigger) {
      printProgress(algorithmExperiment);

      executionLastPercent = executionPercent;
      executionLastTask = executionTask;
      chronometer.reset();
    }
  }
  private void printProgress(ExperimentProgress algorithmExperiment) {

    String experimentMessage =
        new Date().toString()
            + " => "
            + algorithmExperiment.getExperimentProgressTask()
            + " --> "
            + algorithmExperiment.getExperimentProgressPercent()
            + "% ";

    if (algorithmExperiment.getExperimentProgressRemainingTime() > 0) {
      experimentMessage =
          experimentMessage
              + "( remaining: "
              + DateCollapse.collapse(algorithmExperiment.getExperimentProgressRemainingTime())
              + " )";
    } else if (algorithmExperiment.getExperimentProgressRemainingTime() < 0) {
      experimentMessage = experimentMessage + "( remaining: unknown )";
    }

    Global.printStandard(experimentMessage + "\n");
  }