/**
   * The purpose of this method is to parse the information that is listed in the learners
   * configuration file.
   *
   * @throws Exception
   */
  public static void ParseLearners() throws Exception {
    for (String line : FileUtilities.ReadLinesFromFile(LEARNER_TEMPLATES_FILE)) {
      if (line.startsWith("#") || line.trim().length() == 0) // Ignore comment characters
      continue;

      ArrayList<String> lineItems = ListUtilities.CreateStringList(line.split(";"));
      String description = lineItems.get(0);
      String learnerClassName = lineItems.get(1);
      String commandTemplate = (lineItems.size() > 2) ? lineItems.get(2) : "";

      LearnerConfigMap.put(
          description, new LearnerConfig(description, learnerClassName, commandTemplate));
    }
  }
  /**
   * The purpose of this method is to parse the algorithms that have been defined in the algorithm
   * configuration files.
   *
   * @throws Exception
   */
  public static void ParseAlgorithms() throws Exception {
    for (String line : FileUtilities.ReadLinesFromFile(CLASSIFICATION_ALGORITHMS_FILE)) {
      if (line.startsWith("#") || line.trim().length() == 0) // Ignore comment characters
      continue;

      ArrayList<String> lineItems = ListUtilities.CreateStringList(line.split(";"));
      String key = lineItems.remove(0);
      String learnerKey = lineItems.remove(0);

      CheckLearnerKey(key, learnerKey);
      ClassificationAlgorithms.put(key, new ClassificationAlgorithm(key, learnerKey, lineItems));
    }

    for (String line : FileUtilities.ReadLinesFromFile(FEATURE_SELECTION_ALGORITHMS_FILE)) {
      if (line.startsWith("#") || line.trim().length() == 0) // Ignore comment characters
      continue;

      ArrayList<String> lineItems = ListUtilities.CreateStringList(line.split(";"));

      String key = lineItems.remove(0);
      String learnerKey = lineItems.remove(0);
      ArrayList<String> parameters = lineItems;

      CheckLearnerKey(key, learnerKey);
      FeatureSelectionAlgorithms.put(
          key, new FeatureSelectionAlgorithm(key, learnerKey, parameters));
    }

    // The following algorithms are made available to any experiment and aren't specified in the
    // config file
    FeatureSelectionAlgorithms.put(
        "None", new FeatureSelectionAlgorithm("None", "", new ArrayList<String>()));
    FeatureSelectionAlgorithms.put(
        "PriorKnowledge",
        new FeatureSelectionAlgorithm("PriorKnowledge", "", new ArrayList<String>()));
  }