/**
   * Compares two realisations
   *
   * @throws TopologyException
   * @throws NewickIOException
   * @params realisation
   * @params Vertices-Realisation Points Map returns the populated map
   */
  public static void verticesDistribution(
      String real, LinkedHashMap<Integer, List<Double>> vrMap, RBTreeArcDiscretiser dtimes)
      throws NewickIOException, TopologyException {
    boolean flag = true;
    Realisation r = UnparsedRealisation.parseRealisation(real);
    RootedBifurcatingTree t = r.getTree();
    int noofvertices = t.getNoOfVertices();

    for (int i = 0; i < noofvertices; i++) {
      if (vrMap.get(i) != null) {
        List<Double> list = vrMap.get(i);
        String meta = r.getPlacements().get(i);
        int[] point = {0, 0};
        point[0] = Integer.parseInt(meta.substring(meta.indexOf("(") + 1, meta.lastIndexOf(",")));
        point[1] = Integer.parseInt(meta.substring(meta.indexOf(",") + 1, meta.lastIndexOf(")")));
        Double time = dtimes.getDiscretisationTime(point[0], point[1]);
        list.add(time);
        vrMap.put(i, list);
      } else {
        List<Double> list = new ArrayList<Double>();
        String meta = r.getPlacements().get(i);
        int[] point = {0, 0};
        point[0] = Integer.parseInt(meta.substring(meta.indexOf("(") + 1, meta.lastIndexOf(",")));
        point[1] = Integer.parseInt(meta.substring(meta.indexOf(",") + 1, meta.lastIndexOf(")")));
        Double time = dtimes.getDiscretisationTime(point[0], point[1]);
        list.add(time);
        vrMap.put(i, list);
      }
    }
  }
  /**
   * Compares two realisations
   *
   * @throws TopologyException
   * @throws NewickIOException
   * @params realisation1
   * @params realisation2 returns true if similar or false otherwise
   */
  public static boolean compareRealisation(String real1, String real2)
      throws NewickIOException, TopologyException {
    boolean flag = true;

    Realisation r1 = UnparsedRealisation.parseRealisation(real1);
    Realisation r2 = UnparsedRealisation.parseRealisation(real2);
    RootedBifurcatingTree t1 = r1.getTree();
    RootedBifurcatingTree t2 = r2.getTree();
    assert (t1
        == t2); // Assumes the realisations have same gene tree otherwise comparing realisation
                // makes no sense

    int noofvertices = r1.getTree().getNoOfVertices();

    for (int i = 0; i < noofvertices; i++) {
      if (Integer.parseInt(
                  r1.getPlacements()
                      .get(i)
                      .substring(
                          r1.getPlacements().get(i).indexOf("(") + 1,
                          r1.getPlacements().get(i).indexOf(",")))
              != Integer.parseInt(
                  r2.getPlacements()
                      .get(i)
                      .substring(
                          r2.getPlacements().get(i).indexOf("(") + 1,
                          r2.getPlacements().get(i).indexOf(",")))
          || (Integer.parseInt(
                  r1.getPlacements()
                      .get(i)
                      .substring(
                          r1.getPlacements().get(i).indexOf(",") + 1,
                          r1.getPlacements().get(i).indexOf(")")))
              != Integer.parseInt(
                  r2.getPlacements()
                      .get(i)
                      .substring(
                          r2.getPlacements().get(i).indexOf(",") + 1,
                          r2.getPlacements().get(i).indexOf(")"))))) return false;
    }
    return flag;
  }