Пример #1
0
 public void mergeIn(SPQRTreeNode tn2) {
   addChildNodes(tn2.getChildNodes());
   persistentGraphEdges.addAll(tn2.getPersistentGraphEdges());
   nodeType = SPQRNodeType.none;
   skeletonEdges = null;
   referenceEdge = null;
 }
Пример #2
0
 private String toStringHelper(SPQRTreeNode tn, int depth) {
   String result = "";
   for (int i = 0; i < depth; i++) {
     result += "\t";
   }
   result += tn.toString();
   result += "\n";
   for (SPQRTreeNode c : tn.getChildNodes()) {
     result += toStringHelper(c, depth + 1);
   }
   return result;
 }
Пример #3
0
  private void orderSNodes(SPQRTreeNode toOrder) {
    // If the node if a sequence.
    if (toOrder.getNodeType() == SPQRNodeType.snode) {
      Vector<SPQRTreeNode> reorderedChildren = new Vector<SPQRTreeNode>();

      // Remove the reference edge from the sequence.
      MultiSet<Pair<Integer, Integer>> sEdgesMinReference =
          new MultiSet<Pair<Integer, Integer>>(toOrder.getSkeletonEdges());
      sEdgesMinReference.remove(toOrder.getReferenceEdge());

      // The start of the sequence is one of the nodes of the reference edge.
      Integer startNode = Pair.get1(toOrder.getReferenceEdge());
      Integer endNode = nextNode(startNode, sEdgesMinReference);

      // Iterate over all edges in the sequence.
      do {
        // Find the child that contains both the start and the end node of the edgeToWorkWith.
        SPQRTreeNode containingChild = null;
        for (SPQRTreeNode c : toOrder.getChildNodes()) {
          boolean containsN1 = false;
          boolean containsN2 = false;
          for (Pair<Integer, Integer> e : c.getPersistentGraphEdges()) {
            containsN1 =
                containsN1 || (Pair.get1(e).equals(startNode)) || (Pair.get2(e).equals(startNode));
            containsN2 =
                containsN2 || (Pair.get1(e).equals(endNode)) || (Pair.get2(e).equals(endNode));
          }
          if (containsN1 && containsN2) {
            containingChild = c;
          }
        }
        // That child is the next child in the sequence.
        reorderedChildren.add(containingChild);

        startNode = endNode;
        endNode = nextNode(endNode, sEdgesMinReference);
      } while (endNode != null);
      toOrder.setChildNodes(reorderedChildren);
    }
    for (SPQRTreeNode c : toOrder.getChildNodes()) {
      orderSNodes(c);
    }
  }
Пример #4
0
  private void addSPQRTreeNodeAndChildren(
      int spqrTreePointer, int spqrTreeNodePointer, SPQRTreeNode toNode) {
    treeNode2TreeNodePtr.put(toNode, spqrTreeNodePointer);
    switch (this.spqrNodeType(spqrTreePointer, spqrTreeNodePointer)) {
      case 0:
        toNode.setNodeType(SPQRNodeType.snode);
        break;
      case 1:
        toNode.setNodeType(SPQRNodeType.pnode);
        break;
      case 2:
        toNode.setNodeType(SPQRNodeType.rnode);
        break;
    }
    int pgPointer = spqrPertinentGraph(spqrTreePointer, spqrTreeNodePointer);
    for (Integer ePtr : spqrPertinentEdges(pgPointer)) {
      int orgNodes[] = this.spqrPertinentEdgeOriginalNodes(pgPointer, ePtr);
      toNode.addPersistentGraphEdge(
          nodePointer2NodeId.get(orgNodes[0]), nodePointer2NodeId.get(orgNodes[1]));
    }
    int sgPointer = spqrSkeleton(spqrTreePointer, spqrTreeNodePointer);
    for (Integer ePtr : spqrSkeletonEdges(sgPointer)) {
      int orgNodes[] = this.spqrSkeletonEdgeOriginalNodes(sgPointer, ePtr);
      toNode.addSkeletonEdge(
          nodePointer2NodeId.get(orgNodes[0]), nodePointer2NodeId.get(orgNodes[1]));
      if (!spqrSkeletonEdgeIsVirtual(sgPointer, ePtr)) {
        SPQRTreeNode childForRealEdge = toNode.addChildNode();
        childForRealEdge.setNodeType(SPQRNodeType.qnode);
        childForRealEdge.addSkeletonEdge(
            nodePointer2NodeId.get(orgNodes[0]), nodePointer2NodeId.get(orgNodes[1]));
        childForRealEdge.addPersistentGraphEdge(
            nodePointer2NodeId.get(orgNodes[0]), nodePointer2NodeId.get(orgNodes[1]));
      }
    }

    int sRefEdge = this.spqrPertinentSkeletonReferenceEdge(pgPointer);
    int orgNodes[] = this.spqrSkeletonEdgeOriginalNodes(sgPointer, sRefEdge);
    toNode.setReferenceEdge(
        nodePointer2NodeId.get(orgNodes[0]), nodePointer2NodeId.get(orgNodes[1]));
    toNode.referenceEdgeIsVirtual(spqrSkeletonEdgeIsVirtual(sgPointer, sRefEdge));

    int spqrParentPointer = 0;
    if (toNode.getParentNode() != null) {
      spqrParentPointer = treeNode2TreeNodePtr.get(toNode.getParentNode());
    }
    for (int childPtr : spqrChildNodes(spqrTreePointer, spqrTreeNodePointer, spqrParentPointer)) {
      SPQRTreeNode newChild = toNode.addChildNode();
      addSPQRTreeNodeAndChildren(spqrTreePointer, childPtr, newChild);
    }
  }
Пример #5
0
 public void setChildNodes(Vector<SPQRTreeNode> ns) {
   childNodes = ns;
   for (SPQRTreeNode n : ns) {
     n.setParentNode(this);
   }
 }
Пример #6
0
 public void addChildNodes(Vector<SPQRTreeNode> ns) {
   childNodes.addAll(ns);
   for (SPQRTreeNode n : ns) {
     n.setParentNode(this);
   }
 }
Пример #7
0
 public SPQRTreeNode addChildNode() {
   SPQRTreeNode s = new SPQRTreeNode();
   s.setParentNode(this);
   childNodes.add(s);
   return s;
 }
Пример #8
0
 public void addChildNode(SPQRTreeNode n) {
   n.setParentNode(this);
   childNodes.add(n);
 }