docs: @Override
      public CrossoverResult crossover() {
          double[][] parents = parentSelection.selectParents();
  
          double[] offspringValues = new double[parents[0].length];
  
          if (rng.nextDouble() < crossoverRate) {
              for (int i = 0; i < offspringValues.length; ++i) {
                  double t = rng.nextDouble();
                  offspringValues[i] = t * parents[0][i] + (1.0 - t) * parents[1][i];
              }
              return new CrossoverResult(true, offspringValues);
          }
  
          return new CrossoverResult(false, parents[0]);
      }