public static void main(String[] args) throws IOException, Exception {
    // break into cases for each data set
    // for congressional, partition into training and test sets

    int whichDataSet = -1;
    Scanner in = new Scanner(System.in);
    String whichMonk = "";
    boolean IG = false;
    int tempIG = -1;

    // check input parameters
    try {
      if (args.length > 3) throw new NumberFormatException();
      tempIG = Integer.parseInt(args[0]);
      whichDataSet = Integer.parseInt(args[1]);
      // System.out.println(tempIG + " " + whichDataSet);
      if (args.length < 2 || whichDataSet < 0 || whichDataSet > 2 || tempIG < 0 || tempIG > 1) {
        throw new NumberFormatException();
      }
      // System.out.println(tempIG + " " + whichDataSet);
      if (args.length < 3 && whichDataSet == 1) {
        throw new NumberFormatException();
      }
      // System.out.println(tempIG + "* " + whichDataSet);
      if (args.length == 3) {
        int whichMonkInt = Integer.parseInt(args[2]);
        if (whichMonkInt == 1) whichMonk = "monks-1";
        else if (whichMonkInt == 2) whichMonk = "monks-2";
        else if (whichMonkInt == 3) whichMonk = "monks-3";
        else throw new NumberFormatException();
      }
      if (tempIG == 0) IG = false;
      else IG = true;
    } catch (NumberFormatException e) {
      System.out.println(
          "ERROR: \n\nUsage: ./run_traditional <IG or GR> <whichDataSet> <whichMonkDataSet> \n"
              + "IG or GR: (0) for information gain, (1) for gain ratio"
              + "\nwhichDataSet can be: (0=Congressional, 1=MONK, 2=Mushroom)"
              + "\nwhichMonkDataSet is only relevant if Monk chosen can be: (1 2 or 3)");
      System.exit(1);
    }

    // cases for each data set
    switch (whichDataSet) {
      case 0:
        {
          fileName = "house-votes-84.data";
          System.out.println("\n\nRunning data set: " + fileName);
          parser = new CongressionalInputParser();
          outputClasses = parser.initializeOutputClasses();
          masterAttributes = parser.initializeMasterAttributesAndValues();
          attributes = parser.getAttributesSet();
          examples = parser.readExamples(fileName);
          partitionIntoTestAndTraining(examples);
          traditionalDecisionTreeBuilder =
              new GreedyInformationGainDecisionTree(
                  trainingExamples, masterAttributes, attributes, outputClasses, IG);
          System.out.println("\n\nnumber of congressional Examples: " + examples.size());
          break;
        }
      case 1:
        {
          String fileName1 = whichMonk + ".train";
          String fileName2 = whichMonk + ".test";
          System.out.println("\n\nRunning data set: " + fileName1);
          parser = new MonkInputParser();
          outputClasses = parser.initializeOutputClasses();
          masterAttributes = parser.initializeMasterAttributesAndValues();
          attributes = parser.getAttributesSet();
          trainingExamples = parser.readExamples(fileName1);
          testExamples = parser.readExamples(fileName2);
          traditionalDecisionTreeBuilder =
              new GreedyInformationGainDecisionTree(
                  trainingExamples, masterAttributes, attributes, outputClasses, IG);
          System.out.println(
              "\n\nnumber of monk " + whichMonk + " Examples: " + trainingExamples.size());

          break;
        }
      case 2:
        {
          String fileName1 = "agaricus-lepiota.data";
          System.out.println("\n\nRunning data set: " + fileName1);
          parser = new MushroomInputParser();
          outputClasses = parser.initializeOutputClasses();
          masterAttributes = parser.initializeMasterAttributesAndValues();
          attributes = parser.getAttributesSet();
          examples = parser.readExamples(fileName1);

          // testExamples = parser.readExamples(fileName2);
          partitionIntoTestAndTraining(examples);

          traditionalDecisionTreeBuilder =
              new GreedyInformationGainDecisionTree(
                  trainingExamples, masterAttributes, attributes, outputClasses, IG);
          System.out.println("\n\nnumber of mushroom Examples: " + examples.size());

          break;
        }
    }

    // System.out.println(trainingExamples.get(1).getAttributeList());

    finalDecisionTree =
        traditionalDecisionTreeBuilder.makeDecisionTree(trainingExamples, attributes, null);

    // System.out.println(finalDecisionTree.toString());

    System.out.println("\nTesting the tree on the TRAINING examples...");
    tester = new DecisionTreeTester(trainingExamples, masterAttributes, attributes, outputClasses);
    tester.test(finalDecisionTree);
    String out = tester.printPerformanceMetrics();
    System.out.println(out);

    System.out.println("\nTesting the tree on the " + testExamples.size() + " TEST examples...");
    tester = new DecisionTreeTester(testExamples, masterAttributes, attributes, outputClasses);
    tester.test(finalDecisionTree);
    out = tester.printPerformanceMetrics();
    System.out.println(out);

    System.out.println("Successful completion of program");
  }