docs: public List<BinarySolution> doCrossover(double probability, BinarySolution parent1, BinarySolution parent2)  {
      List<BinarySolution> offspring = new ArrayList<>(2);
      offspring.add((BinarySolution) parent1.copy()) ;
      offspring.add((BinarySolution) parent2.copy()) ;
  
      if (crossoverRandomGenerator.getRandomValue() < probability) {
        // 1. Get the total number of bits
        int totalNumberOfBits = parent1.getTotalNumberOfBits();
  
        // 2. Calculate the point to make the crossover
        int crossoverPoint = pointRandomGenerator.getRandomValue(0, totalNumberOfBits - 1);
  
        // 3. Compute the variable containing the crossover bit
        int variable = 0;
        int bitsAccount = parent1.getVariableValue(variable).getBinarySetLength() ;
        while (bitsAccount < (crossoverPoint + 1)) {
          variable++;
          bitsAccount += parent1.getVariableValue(variable).getBinarySetLength() ;
        }
  
        // 4. Compute the bit into the selected variable
        int diff = bitsAccount - crossoverPoint;
        int intoVariableCrossoverPoint = parent1.getVariableValue(variable).getBinarySetLength() - diff ;
  
        // 5. Apply the crossover to the variable;
        BinarySet offspring1, offspring2;
        offspring1 = (BinarySet) parent1.getVariableValue(variable).clone();
        offspring2 = (BinarySet) parent2.getVariableValue(variable).clone();
  
        for (int i = intoVariableCrossoverPoint; i < offspring1.getBinarySetLength(); i++) {
          boolean swap = offspring1.get(i);
          offspring1.set(i, offspring2.get(i));
          offspring2.set(i, swap);
        }
  
        offspring.get(0).setVariableValue(variable, offspring1);
        offspring.get(1).setVariableValue(variable, offspring2);
  
        // 6. Apply the crossover to the other variables
        for (int i = variable + 1; i < parent1.getNumberOfVariables(); i++) {
            offspring.get(0).setVariableValue(i, (BinarySet) parent2.getVariableValue(i).clone());
            offspring.get(1).setVariableValue(i, (BinarySet) parent1.getVariableValue(i).clone());
        }
  
      }
      return offspring ;
    }