code: @Override
      public final Solution_ solve(Solution_ problem) {
          if (problem == null) {
              throw new IllegalArgumentException("The problem (" + problem + ") must not be null.");
          }
          solverScope.setBestSolution(problem);
          outerSolvingStarted(solverScope);
          boolean restartSolver = true;
          while (restartSolver) {
              solvingStarted(solverScope);
              runPhases(solverScope);
              solvingEnded(solverScope);
              restartSolver = checkProblemFactChanges();
          }
          outerSolvingEnded(solverScope);
          return solverScope.getBestSolution();
      }
docs: ************************************************************************