public static void performExperiment(
      DatasetFactory ds_factory,
      double ds_reduce_retio,
      String[] eval_annot_types,
      int repeatCount,
      int numFolds,
      String results_file_name,
      TrainTest... engines)
      throws URISyntaxException, IOException, ExecutionException, ResourceInstantiationException,
          PersistenceException, JDOMException, BenchmarkReportInputFileFormatException {
    for (int a = 0; a < repeatCount; a++) {
      for (String annot_type : eval_annot_types) {
        logger.info(String.format("Performing evaluation for annotation type: %s", annot_type));

        LearningEvaluator.CentralResultsRepository.repository.clear();
        TimeBenchmarkUtils.enableGateTimeBenchmark();

        final DataSet dataset =
            new DataSetReduce(ds_factory.createDataset(annot_type), ds_reduce_retio);

        MachineLearningExperiment experiment = new MachineLearningExperiment(dataset, engines);

        if (numFolds == 1) {
          Corpus testCorpus =
              ((CzechLawDataSet) ds_factory.createDataset(annot_type)).getTestCorpus();

          experiment.trainOnly();

          experiment.testOnly(testCorpus);

          logger.info("saving results, counting time statistics...");
          MachineLearningExperimenter.saveResults(results_file_name);
        } else {
          // experiment.crossValidation(numFolds);
          experiment.controlledCrossValidation(
              10, new File("../intlib/train-10-fold-cross/").toURI().toURL(), null, false);

          logger.info("saving results, counting time statistics...");
          MachineLearningExperimenter.saveResults(results_file_name);
        }

        GateUtils.deleteAllPublicGateResources();
      }
    }
  }