@Override
    public boolean isMoveDoable(ScoreDirector<Solution_> scoreDirector) {
        boolean movable = false;
        for (GenuineVariableDescriptor<Solution_> variableDescriptor : variableDescriptorList) {
            Object leftValue = variableDescriptor.getValue(leftPillar.get(0));
            Object rightValue = variableDescriptor.getValue(rightPillar.get(0));
            if (!Objects.equals(leftValue, rightValue)) {
                movable = true;
                if (!variableDescriptor.isValueRangeEntityIndependent()) {
                    ValueRangeDescriptor<Solution_> valueRangeDescriptor = variableDescriptor.getValueRangeDescriptor();
                    Solution_ workingSolution = scoreDirector.getWorkingSolution();
                    for (Object rightEntity : rightPillar) {
                        ValueRange rightValueRange = valueRangeDescriptor.extractValueRange(workingSolution, rightEntity);
                        if (!rightValueRange.contains(leftValue)) {
                            return false;
                        }
                    }
                    for (Object leftEntity : leftPillar) {
                        ValueRange leftValueRange = valueRangeDescriptor.extractValueRange(workingSolution, leftEntity);
                        if (!leftValueRange.contains(rightValue)) {
                            return false;
                        }
                    }
                }
            }
        }
        return movable;
    }
@Override
    public boolean isMoveDoable(ScoreDirector<Solution_> scoreDirector) {
        boolean movable = false;
        for (GenuineVariableDescriptor<Solution_> variableDescriptor : variableDescriptorList) {
            Object leftValue = variableDescriptor.getValue(leftPillar.get(0));
            Object rightValue = variableDescriptor.getValue(rightPillar.get(0));
            if (!Objects.equals(leftValue, rightValue)) {
                movable = true;
                if (!variableDescriptor.isValueRangeEntityIndependent()) {
                    ValueRangeDescriptor<Solution_> valueRangeDescriptor = variableDescriptor.getValueRangeDescriptor();
                    Solution_ workingSolution = scoreDirector.getWorkingSolution();
                    for (Object rightEntity : rightPillar) {
                        ValueRange rightValueRange = valueRangeDescriptor.extractValueRange(workingSolution, rightEntity);
                        if (!rightValueRange.contains(leftValue)) {
                            return false;
                        }
                    }
                    for (Object leftEntity : leftPillar) {
                        ValueRange leftValueRange = valueRangeDescriptor.extractValueRange(workingSolution, leftEntity);
                        if (!leftValueRange.contains(rightValue)) {
                            return false;
                        }
                    }
                }
            }
        }
        return movable;
    }
@ Override public boolean isMoveDoable ( ScoreDirector < Solution_ > scoreDirector ) { boolean movable = false ; for ( GenuineVariableDescriptor < Solution_ > variableDescriptor : variableDescriptorList ) { Object leftValue = variableDescriptor . getValue ( leftPillar . get ( 0 ) ) ; Object rightValue = variableDescriptor . getValue ( rightPillar . get ( 0 ) ) ; if ( ! Objects . equals ( leftValue , rightValue ) ) { movable = true ; if ( ! variableDescriptor . isValueRangeEntityIndependent ( ) ) { ValueRangeDescriptor < Solution_ > valueRangeDescriptor = variableDescriptor . getValueRangeDescriptor ( ) ; Solution_ workingSolution = scoreDirector . getWorkingSolution ( ) ; for ( Object rightEntity : rightPillar ) { ValueRange rightValueRange = valueRangeDescriptor . extractValueRange ( workingSolution , rightEntity ) ; if ( ! rightValueRange . contains ( leftValue ) ) { return false ; } } for ( Object leftEntity : leftPillar ) { ValueRange leftValueRange = valueRangeDescriptor . extractValueRange ( workingSolution , leftEntity ) ; if ( ! leftValueRange . contains ( rightValue ) ) { return false ; } } } } } return movable ; }
************************************************************************
************************************************************************