public PQNode processAsPertinentRoot()

in graphLayout/jetbrains.mps.graphLayout.planarization/source_gen/jetbrains/mps/graphLayout/planarization/PNode.java [34:162]


  public PQNode processAsPertinentRoot(List<PQNode> children, Node nextGraphNode) {
    ListSequence.fromList(this.getChildren()).removeWhere(new IWhereFilter<PQNode>() {
      public boolean accept(PQNode it) {
        return it.getState() != PQNode.State.EMPTY;
      }
    });
    children = ListSequence.fromList(children).removeWhere(new IWhereFilter<PQNode>() {
      public boolean accept(PQNode it) {
        return it.getState() == PQNode.State.EMPTY;
      }
    });
    List<PQNode> partialChildren = ListSequence.fromList(children).where(new IWhereFilter<PQNode>() {
      public boolean accept(PQNode it) {
        return it.getState() == PQNode.State.PARTIAL;
      }
    }).toListSequence();
    int numPartialChildren = ListSequence.fromList(partialChildren).count();
    QNode newComponent = new QNode();
    PNode nextNode = new PNode(nextGraphNode, null);
    newComponent.addLastChild(nextNode);
    EdgesOrder edgesOrder = newComponent.getEdgesOrder();
    this.addLastChild(newComponent);
    if (numPartialChildren > 2) {
      throw new RuntimeException("can not make reduction: pertinent root has more than two partial children");
    }
    if (numPartialChildren == 0) {
      for (PQNode child : ListSequence.fromList(children).where(new IWhereFilter<PQNode>() {
        public boolean accept(PQNode it) {
          return it.getState() == PQNode.State.FULL;
        }
      })) {
        child.collectEdgesOrderInSubtree(edgesOrder);
      }
    }
    if (numPartialChildren == 1) {
      PQNode partialChild = ListSequence.fromList(partialChildren).first();
      List<PQNode> firstEmptySegment = ListSequence.fromList(new ArrayList<PQNode>());
      boolean endFirstSegment = false;
      for (PQNode child : ListSequence.fromList(partialChild.getChildren())) {
        if (child.getState() == PQNode.State.FULL) {
          endFirstSegment = true;
        } else {
          if (endFirstSegment) {
            newComponent.addLastChild(child);
          } else {
            ListSequence.fromList(firstEmptySegment).addElement(child);
          }
        }
      }
      for (PQNode child : ListSequence.fromList(firstEmptySegment).reversedList()) {
        newComponent.addFirstChild(child);
      }
      ListSequence.fromList(partialChild.getChildren()).removeWhere(new IWhereFilter<PQNode>() {
        public boolean accept(PQNode it) {
          return it.getState() != PQNode.State.FULL;
        }
      });
      partialChild.collectEdgesOrderInSubtree(edgesOrder);
      for (PQNode child : ListSequence.fromList(children).where(new IWhereFilter<PQNode>() {
        public boolean accept(PQNode it) {
          return it.getState() == PQNode.State.FULL;
        }
      })) {
        child.collectEdgesOrderInSubtree(edgesOrder);
      }
    }
    if (numPartialChildren == 2) {
      PQNode partialChild0 = ListSequence.fromList(partialChildren).getElement(0);
      List<PQNode> emptyNodes = ListSequence.fromList(partialChild0.getChildren()).where(new IWhereFilter<PQNode>() {
        public boolean accept(PQNode it) {
          return it.getState() == PQNode.State.EMPTY;
        }
      }).toListSequence();
      emptyNodes = ListSequence.fromList(emptyNodes).reversedList();
      for (PQNode child : ListSequence.fromList(emptyNodes)) {
        newComponent.addFirstChild(child);
      }
      PQNode partialChild1 = ListSequence.fromList(partialChildren).getElement(1);
      ((QNode) partialChild1).reverse();
      emptyNodes = ListSequence.fromList(partialChild1.getChildren()).where(new IWhereFilter<PQNode>() {
        public boolean accept(PQNode it) {
          return it.getState() == PQNode.State.EMPTY;
        }
      }).toListSequence();
      for (PQNode child : ListSequence.fromList(emptyNodes)) {
        newComponent.addLastChild(child);
      }
      /*
        newComponent.getEdgesOrder().merge(partialChild0.getEdgesOrder());
        for (PQNode child : ListSequence.fromList(partialChild0.getChildren()).where(new IWhereFilter<PQNode>() {
          public boolean accept(PQNode it) {
            return it.getState() == PQNode.State.FULL;
          }
        })) {
          child.collectEdgesOrderInSubtree(edgesOrder);
        }
      */
      ListSequence.fromList(partialChild0.getChildren()).removeWhere(new IWhereFilter<PQNode>() {
        public boolean accept(PQNode it) {
          return it.getState() != PQNode.State.FULL;
        }
      });
      partialChild0.collectEdgesOrderInSubtree(edgesOrder);
      for (PQNode child : ListSequence.fromList(children).where(new IWhereFilter<PQNode>() {
        public boolean accept(PQNode it) {
          return it.getState() == PQNode.State.FULL;
        }
      })) {
        child.collectEdgesOrderInSubtree(edgesOrder);
      }
      ListSequence.fromList(partialChild1.getChildren()).removeWhere(new IWhereFilter<PQNode>() {
        public boolean accept(PQNode it) {
          return it.getState() != PQNode.State.FULL;
        }
      });
      partialChild1.collectEdgesOrderInSubtree(edgesOrder);
      /*
        newComponent.getEdgesOrder().merge(partialChild1.getEdgesOrder());
        for (PQNode child : ListSequence.fromList(partialChild1.getChildren()).where(new IWhereFilter<PQNode>() {
          public boolean accept(PQNode it) {
            return it.getState() == PQNode.State.FULL;
          }
        })) {
          child.collectEdgesOrderInSubtree(edgesOrder);
        }
      */
    }
    return nextNode;
  }