public void computeAValue()

in graphLayout/jetbrains.mps.graphLayout.planarization/source_gen/jetbrains/mps/graphLayout/planarization/QNode.java [123:194]


  public void computeAValue() {
    super.computeAValue();
    if (getState() != PQNode.State.PARTIAL) {
      myAValue = 0;
      return;
    }
    int valueFromA = 0;
    PQNode aChild = null;
    for (PQNode child : ListSequence.fromList(getChildren())) {
      int curValue = child.getNumFullLeaves() - child.getAValue();
      if (valueFromA < curValue) {
        valueFromA = curValue;
        aChild = child;
      }
    }
    valueFromA = getNumFullLeaves() - valueFromA;
    int valueFromH = INF;
    PQNode firstChild = null;
    PQNode lastChild = null;
    PQNode curFirst = null;
    boolean insideHSegment = false;
    int numFullLeavesInSegment = 0;
    for (PQNode child : ListSequence.fromList(getChildren())) {
      if (insideHSegment) {
        if (child.getState() == PQNode.State.FULL) {
          numFullLeavesInSegment += child.getNumFullLeaves();
        } else {
          int aValue = getNumFullLeaves() - numFullLeavesInSegment - (curFirst.getNumFullLeaves() - curFirst.getHValue()) - (child.getNumFullLeaves() - child.getHValue());
          if (aValue < valueFromH) {
            firstChild = curFirst;
            lastChild = child;
            valueFromH = aValue;
          }
          numFullLeavesInSegment = 0;
          if (child.getState() == PQNode.State.PARTIAL) {
            curFirst = child;
          } else {
            insideHSegment = false;
          }
        }
      } else {
        if (child.getState() != PQNode.State.EMPTY) {
          curFirst = child;
          insideHSegment = true;
        }
      }
    }
    // last segment wasn't checked by previous cycle 
    PQNode last = ListSequence.fromList(getChildren()).last();
    if (insideHSegment && curFirst != last) {
      int aValue = getNumFullLeaves() - numFullLeavesInSegment - curFirst.getAValue() - last.getAValue();
      if (aValue < valueFromH) {
        firstChild = curFirst;
        lastChild = last;
        valueFromH = aValue;
      }
    }
    if (valueFromA <= valueFromH) {
      myMakeAFromH = false;
      myAValue = valueFromA;
      myFirstAChild = aChild;
      mySecondAChild = null;
    } else {
      myMakeAFromH = true;
      myAValue = valueFromH;
      myFirstAChild = firstChild;
      mySecondAChild = lastChild;
    }
    if (myAValue > INF) {
      myAValue = INF;
    }
  }