public String solvePedigree() {
    renumberAll();
    updateDisplay();

    String integrity = checkIntegrity(history.lastElement());
    if (integrity.equals("")) {
      StringBuffer b = new StringBuffer();
      PedigreeSolver ps = new PedigreeSolver(getAllPeople(), getMatingList());
      PedigreeSolution sol = ps.solve();
      PedigreeSolution consolidatedSol = ps.consolidate(sol);
      b.append(consolidatedSol + "\n");
      return b.toString();
    } else {
      return integrity;
    }
  }
  public String getGrade() {
    Document d = XMLParser.createDocument();
    Element root = d.createElement("Grade");

    // first, some specifications of the pedigree
    int numMales = 0;
    int numFemales = 0;
    int numAffectedMales = 0;
    int numAffectedFemales = 0;
    PelicanPerson[] people = getAllPeople();
    for (int i = 0; i < people.length; i++) {
      PelicanPerson p = people[i];
      if (p.sex == PelicanPerson.male) {
        numMales++;
        if (p.affection == PelicanPerson.affected) {
          numAffectedMales++;
        }
      } else {
        numFemales++;
        if (p.affection == PelicanPerson.affected) {
          numAffectedFemales++;
        }
      }
    }
    Element e = d.createElement("Counts");

    Element M = d.createElement("M");
    M.appendChild(d.createTextNode(String.valueOf(numMales)));
    e.appendChild(M);

    Element F = d.createElement("F");
    F.appendChild(d.createTextNode(String.valueOf(numFemales)));
    e.appendChild(F);

    Element aM = d.createElement("aM");
    aM.appendChild(d.createTextNode(String.valueOf(numAffectedMales)));
    e.appendChild(aM);

    Element aF = d.createElement("aF");
    aF.appendChild(d.createTextNode(String.valueOf(numAffectedFemales)));
    e.appendChild(aF);

    root.appendChild(e);

    // now, the analysis results
    renumberAll();
    updateDisplay();

    String integrity = checkIntegrity(history.lastElement());
    if (integrity.equals("")) {
      PedigreeSolver ps = new PedigreeSolver(getAllPeople(), getMatingList());
      PedigreeSolution sol = ps.solve();
      e = d.createElement("Analysis");

      GenotypeSet[] results = sol.getResults();

      Element AR = d.createElement("AR");
      if (results[0].getAll().size() > 0) {
        AR.appendChild(d.createTextNode("Y"));
      } else {
        AR.appendChild(d.createTextNode("N"));
      }
      e.appendChild(AR);

      Element AD = d.createElement("AD");
      if (results[1].getAll().size() > 0) {
        AD.appendChild(d.createTextNode("Y"));
      } else {
        AD.appendChild(d.createTextNode("N"));
      }
      e.appendChild(AD);

      Element SR = d.createElement("SR");
      if (results[2].getAll().size() > 0) {
        SR.appendChild(d.createTextNode("Y"));
      } else {
        SR.appendChild(d.createTextNode("N"));
      }
      e.appendChild(SR);

      Element SD = d.createElement("SD");
      if (results[3].getAll().size() > 0) {
        SD.appendChild(d.createTextNode("Y"));
      } else {
        SD.appendChild(d.createTextNode("N"));
      }
      e.appendChild(SD);
    }
    root.appendChild(e);

    return root.toString();
  }