private boolean revise(DimensionRenamer.Arc arc) {
        boolean revised = false;
        for (Iterator<Integer> fromIterator = possibleAssignments.get(arc.from).iterator(); fromIterator.hasNext(); ) {
            Integer from = fromIterator.next();
            boolean satisfied = false;
            for (Iterator<Integer> toIterator = possibleAssignments.get(arc.to).iterator(); toIterator.hasNext(); ) {
                Integer to = toIterator.next();
                if (constraints.get(arc).stream().allMatch(constraint -> constraint.test(from, to)))
                    satisfied = true;
            }
            if ( ! satisfied) {
                fromIterator.remove();
                revised = true;
            }
        }
        return revised;
    }
Try the solve the constraint problem given in the arguments, and put the result in renames.

This is done by performing iterative arc consistency until we have found a solution.
After an initial iteration, the dimensions will have multiple
valid values. Find a single valid assignment by iteratively locking one
dimension after another, and running the arc consistency algorithm
multiple times.

This requires having constraints that result in an absolute ordering:
equal, lessThan and greaterThan do that, but not necessarily notEqual
If that is needed, the algorithm needs to be adapted with a backtracking
(tree) search

@return the solution in the form of the renames to perform
model-integration/src/main/java/ai/vespa/rankingexpression/importer/NamingConstraintSolver.java