code: @Override
      public PartitionedSearchPhase buildPhase(int phaseIndex, HeuristicConfigPolicy solverConfigPolicy,
              BestSolutionRecaller bestSolutionRecaller, Termination solverTermination) {
          HeuristicConfigPolicy phaseConfigPolicy = solverConfigPolicy.createPhaseConfigPolicy();
          ThreadFactory threadFactory;
          if (threadFactoryClass != null) {
              threadFactory = ConfigUtils.newInstance(this, "threadFactoryClass", threadFactoryClass);
          } else {
              threadFactory = solverConfigPolicy.buildThreadFactory(ChildThreadType.PART_THREAD);
          }
          DefaultPartitionedSearchPhase phase = new DefaultPartitionedSearchPhase(
                  phaseIndex, solverConfigPolicy.getLogIndentation(), bestSolutionRecaller,
                  buildPhaseTermination(phaseConfigPolicy, solverTermination),
                  buildSolutionPartitioner(), threadFactory, resolvedActiveThreadCount());
          List<PhaseConfig> phaseConfigList_ = phaseConfigList;
          if (ConfigUtils.isEmptyCollection(phaseConfigList_)) {
              phaseConfigList_ = Arrays.asList(
                      new ConstructionHeuristicPhaseConfig(),
                      new LocalSearchPhaseConfig());
          }
          phase.setPhaseConfigList(phaseConfigList_);
          phase.setConfigPolicy(phaseConfigPolicy.createChildThreadConfigPolicy(ChildThreadType.PART_THREAD));
          EnvironmentMode environmentMode = phaseConfigPolicy.getEnvironmentMode();
          if (environmentMode.isNonIntrusiveFullAsserted()) {
              phase.setAssertStepScoreFromScratch(true);
          }
          if (environmentMode.isIntrusiveFastAsserted()) {
              phase.setAssertExpectedStepScore(true);
              phase.setAssertShadowVariablesAreNotStaleAfterStep(true);
          }
          return phase;
      }
docs: ************************************************************************