public void UpdateEvolutionPaths(Matrix <double> eigenvectors, Matrix <double> invertedSqrtEigenvalues,
                                         AdaptationParameters adaptationParameters, SelectionParameters selectionParameters,
                                         long FFE, Vector <double> means, Vector <double> previousMeans)
        {
            int problemSize = PSigma.Count;

            Matrix <double> invertedSqrtCovarianceMatrix = eigenvectors * invertedSqrtEigenvalues * eigenvectors.Transpose();
            Vector <double> meanDifferenceDivBySigma     = (means - previousMeans) / Sigma;

            PSigma *= 1 - adaptationParameters.CSigma;
            PSigma += invertedSqrtCovarianceMatrix * PathUpdateCoefficient(adaptationParameters.CSigma, selectionParameters.MuEff, meanDifferenceDivBySigma);

            HSigma = Convert.ToInt32(PSigma.DotProduct(PSigma) / (1.0 - Math.Pow(1.0 - adaptationParameters.CSigma,
                                                                                 2.0 * FFE / selectionParameters.Lambda)) / problemSize
                                     < 2.0 + 4.0 / (problemSize + 1.0));

            PC *= 1.0 - adaptationParameters.CC;
            PC += HSigma * PathUpdateCoefficient(adaptationParameters.CC, selectionParameters.MuEff, meanDifferenceDivBySigma);
        }
 public void AdaptStepSize(AdaptationParameters adaptationParameters)
 {
     Sigma *= Math.Exp(adaptationParameters.CSigma / adaptationParameters.Damping * (PSigma.L2Norm() / adaptationParameters.ChiN - 1.0));
 }