@Override
  public Boolean doStep() {
    this.incrementStepNumber();
    this.modelLogging("The step " + this.stepNumber + " is starting.\n" +
        "The model is:\n", this.steppingModel);
    this.notifyStatus("Step " + this.stepNumber + " started");

    // ==> Convert the model into a standard linear model if it isn't valid
    if (!this.steppingModel.isValid() && !this.solverStepHelper.fixModel()) {
      this.notifyStatusAndLog("Cannot fix the input model");
      return Boolean.FALSE;
    }

    // ==> If the solution is already optimal don't do nothing
    if (this.solverStepHelper.isSolutionOptimal()) {
      this.notifyStatusAndLog("The found solution is optimal. The solution is: " +
          this.steppingModel.getCurrentSolution().getNonAugmentedSolution());
      return Boolean.TRUE;
    }

    if (this.solverStepHelper.checkInitialSolution()) {
      // ==> There is an initial solution => compute the current step for the current model
      try {
        Integer[] pivot = this.solverStepHelper.findPivot();
        this.solverStepHelper.doPivot(pivot[0], pivot[1]);
        logger.info("Completed the pivot step.\nThe model is:\n" + this.steppingModel.toString());

        if (this.solverStepHelper.isSolutionOptimal()) {
          // ==> The step computation returned an optimal solution
          logger.info("The found solution is optimal");
          this.notifyStatus("Completed the pivot step. The found solution is optimal: " +
              this.steppingModel.getCurrentSolution().getNonAugmentedSolution());
        } else {
          // ==> The step computation returned a non-optimal solution
          logger.info("The found solution isn't optimal. More steps are needed.");
          this.notifyStatus("Completed the pivot step. The found solution isn't optimal. " +
              "More steps are needed.");
        }
      } catch (UnlimitedProblemException exc) {
        this.notifyStatusAndLog("The problem is unlimited");
      }
    } else {
      // ==> There isn't a initial solution => create and compute a new simplex to get the initial
      //     solution
      try {
        this.solverStepHelper.findInitialSolution();
        this.notifyStatusAndLog("Found the initial solution:\n" +
            this.steppingModel.getCurrentSolution().toString());
      } catch (UnlimitedProblemException exc) {
        this.notifyStatusAndLog("The problem is unlimited");
      }
    }

    return Boolean.TRUE;
  }