private Map<StateExpr, BDD> rootConstraints( IpSpaceAssignment srcIpSpaceAssignment, BDD initialHeaderSpaceBdd) { LocationVisitor<Optional<StateExpr>> locationToStateExpr = getLocationToStateExpr(); IpSpaceToBDD srcIpSpaceToBDD = new MemoizedIpSpaceToBDD(_bddPacket.getSrcIp(), ImmutableMap.of()); // convert Locations to StateExprs, and merge srcIp constraints Map<StateExpr, BDD> rootConstraints = new HashMap<>(); for (IpSpaceAssignment.Entry entry : srcIpSpaceAssignment.getEntries()) { BDD srcIpSpaceBDD = entry.getIpSpace().accept(srcIpSpaceToBDD); entry.getLocations().stream() .map(locationToStateExpr::visit) .filter(Optional::isPresent) .map(Optional::get) .forEach(root -> rootConstraints.merge(root, srcIpSpaceBDD, BDD::or)); } // add the global initial HeaderSpace and remove unsat entries Map<StateExpr, BDD> finalRootConstraints = rootConstraints.entrySet().stream() .map( entry -> Maps.immutableEntry( entry.getKey(), entry.getValue().and(initialHeaderSpaceBdd))) .filter(entry -> !entry.getValue().isZero()) .collect(ImmutableMap.toImmutableMap(Entry::getKey, Entry::getValue)); // make sure there is at least one possible source checkArgument( !finalRootConstraints.isEmpty(), "No sources are compatible with the headerspace constraint"); return finalRootConstraints; }
.filter(e -> e.getLocations().contains(srcLocation)) .findFirst();
.filter(e -> e.getLocations().contains(srcLocation)) .findFirst();
.flatMap(entry -> entry.getLocations().stream()) .collect(ImmutableSet.toImmutableSet());
entry -> entry .getLocations() .forEach( location ->
@VisibleForTesting static TableAnswerElement resolveIpSpaceOfLocation( SpecifiersQuestion question, SpecifierContext context) { List<ColumnMetadata> columns = ImmutableList.of( new ColumnMetadata(COL_LOCATIONS, Schema.STRING, "Resolution", false, false), new ColumnMetadata(COL_IP_SPACE, Schema.STRING, "IP space", false, false)); TableAnswerElement table = new TableAnswerElement(new TableMetadata(columns)); Map<String, ColumnMetadata> columnMap = table.getMetadata().toColumnMap(); Set<Location> locations = question.getLocationSpecifier().resolve(context); IpSpaceAssignment ipSpaceAssignment = question.getIpSpaceSpecifier().resolve(locations, context); for (IpSpaceAssignment.Entry entry : ipSpaceAssignment.getEntries()) { table.addRow( Row.of( columnMap, COL_LOCATIONS, entry.getLocations().toString(), COL_IP_SPACE, Objects.toString(entry.getIpSpace()))); } return table; }