@Override public ARGPath getNextPathForInterpolation() { ARGState current = sources.remove(0); assert current.isTarget() : "current element is not a target"; ARGPathBuilder errorPathBuilder = ARGPath.reverseBuilder(); errorPathBuilder.add( current, FluentIterable.from(AbstractStates.getOutgoingEdges(current)).first().orNull()); while (predecessorRelation.get(current) != null) { ARGState parent = predecessorRelation.get(current); if (stateHasFalseInterpolant(parent)) { logger.log( Level.FINEST, "interpolant on path, namely for state ", parent.getStateId(), " is already false, so return empty path"); return EMPTY_PATH; } if (predecessorRelation.get(parent) != null) { errorPathBuilder.add(parent, parent.getEdgeToChild(current)); } current = parent; } return errorPathBuilder.build(current); }
@Override public ARGPath getNextPathForInterpolation() { ARGPathBuilder errorPathBuilder = ARGPath.builder(); ARGState current = sources.pop(); if (!isValidInterpolationRoot(predecessorRelation.get(current))) { logger.log( Level.FINEST, "interpolant of predecessor of ", current.getStateId(), " is already false, so return empty path"); return EMPTY_PATH; } // if the current state is not the root, it is a child of a branch , however, the path should // not start with the // child, but with the branching node (children are stored on the stack because this needs // less book-keeping) if (current != root) { errorPathBuilder.add( predecessorRelation.get(current), predecessorRelation.get(current).getEdgeToChild(current)); } while (successorRelation.get(current).iterator().hasNext()) { Iterator<ARGState> children = successorRelation.get(current).iterator(); ARGState child = children.next(); errorPathBuilder.add(current, current.getEdgeToChild(child)); // push all other children of the current state, if any, onto the stack for later // interpolations int size = 1; while (children.hasNext()) { size++; ARGState sibling = children.next(); logger.log( Level.FINEST, "\tpush new root ", sibling.getStateId(), " onto stack for parent ", predecessorRelation.get(sibling).getStateId()); sources.push(sibling); } assert (size <= 2); current = child; } return errorPathBuilder.build(current); }