code: @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;
      }
docs: ************************************************************************