public String fulltraining(Pair dataset) {
    StringBuilder sb = new StringBuilder();

    ArrayList<Data> dataTable = dataset.getDataSet();
    reset();
    init(dataset);
    count(dataset, +1);
    sb.append(printModel());
    sb.append(printProbabilisticModel());
    int correct = 0;

    for (int i = 0; i < dataTable.size(); i++) {
      String result = test(dataTable.get(i));
      if (result.equals(dataTable.get(i).getAttributes().get(nAttr - 1))) {
        correct++;
      }
    }
    sb.append(printConfusion());
    sb.append("\n--- Full Training Set ---\n");
    sb.append("Correct Answer\t: ").append(correct).append("\n");
    sb.append("Wrong Answer  \t: ").append(dataTable.size() - correct).append("\n");
    sb.append("Total         \t: ").append(dataTable.size()).append("\n");
    sb.append("Accuracy      \t: ").append(correct * 100.0 / dataTable.size()).append(" %\n");

    return sb.toString();
  }
  public String ten_fold(Pair dataset) {
    StringBuilder sb = new StringBuilder();

    ArrayList<Data> dataTable = dataset.getDataSet();
    reset();
    init(dataset);
    count(dataset, +1);
    sb.append(printModel());
    sb.append(printProbabilisticModel());
    int sizeMin = dataTable.size() / 10, mod = dataTable.size() % 10;
    int offset = 0;
    int correct = 0;

    for (int i = 0; i < 10; i++) {
      ArrayList datas = new ArrayList();
      int to = offset + sizeMin;
      if (mod > 0) {
        to++;
        mod--;
      }
      if (to > dataTable.size()) to = dataTable.size();
      for (int j = offset; j < to; j++) {
        datas.add(dataTable.get(j));
      }
      Pair datatest = new Pair(dataset.getAttrLib(), datas);
      count(datatest, -1);
      for (int j = offset; j < to; j++) {
        String result = test(dataTable.get(j));
        if (result.equals(dataTable.get(i).getAttributes().get(nAttr - 1))) correct++;
      }
      count(datatest, +1);
      offset = to;
    }
    sb.append(printConfusion());
    sb.append("\n--- Cross Validation 10-fold ---\n");
    sb.append("Correct Answer\t: ").append(correct).append("\n");
    sb.append("Wrong Answer  \t: ").append(dataTable.size() - correct).append("\n");
    sb.append("Total         \t: ").append(dataTable.size()).append("\n");
    sb.append("Accuracy      \t: ").append(correct * 100.0 / dataTable.size()).append(" %\n");

    return sb.toString();
  }
 public void count(Pair dataset, int change) {
   ArrayList<Data> dataTable = dataset.getDataSet();
   for (int i = 0; i < dataTable.size(); i++) {
     ArrayList<String> dataValue = dataTable.get(i).getAttributes();
     int classId = domainAttr[nAttr - 1].indexOf(dataValue.get(dataValue.size() - 1));
     if (classId < -1) continue;
     for (int j = 0; j < nAttr; j++) {
       int id = domainAttr[j].indexOf(dataValue.get(j));
       if (id < 0) {
         id = domainAttr[j].size();
         domainAttr[j].add(dataValue.get(j));
         countTable[j].add(new ArrayList());
         for (int k = 0; k < domainAttr[nAttr - 1].size(); k++) countTable[j].get(id).add(0);
       }
       int bef = countTable[j].get(id).get(classId);
       countTable[j].get(id).set(classId, bef + change);
       bef = sumTable[j].get(classId);
       sumTable[j].set(classId, bef + change);
     }
     nAll += change;
   }
 }
  public void init(Pair dataset) {
    ArrayList<Data> attribut = dataset.getAttrLib();
    ArrayList<String> classAttr = attribut.get(attribut.size() - 1).getAttributes();
    // Initailize domain Attribut
    nAttr = attribut.size();
    nAll = 0;
    domainAttr = new ArrayList[nAttr];
    nameAttr = new String[nAttr];
    for (int i = 0; i < nAttr; i++) {
      ArrayList<String> temp = attribut.get(i).getAttributes();
      domainAttr[i] = new ArrayList<>();
      for (String s : temp) {
        domainAttr[i].add(s);
      }
      nameAttr[i] = new String(attribut.get(i).getName());
    }

    // Inisialisasi tabel count dan tabel sum
    countTable = new ArrayList[nAttr];
    sumTable = new ArrayList[nAttr];
    for (int i = 0; i < nAttr; i++) {
      countTable[i] = new ArrayList<>();
      sumTable[i] = new ArrayList<>();
      for (int j = 0; j < domainAttr[i].size(); j++) {
        countTable[i].add(new ArrayList());
        for (int k = 0; k < classAttr.size(); k++) countTable[i].get(j).add(0);
      }
      for (int j = 0; j < classAttr.size(); j++) sumTable[i].add(0);
    }
    // Inisialisasi Confusion Matrix
    confusion = new ArrayList<>();
    for (int i = 0; i < domainAttr[nAttr - 1].size(); i++) {
      confusion.add(new ArrayList());
      for (int j = 0; j < domainAttr[nAttr - 1].size(); j++) confusion.get(i).add(0);
    }
  }