@@ -283,31 +283,6 @@ namespace matrix_adaptation
283283 return yi;
284284 }
285285
286-
287- Matrix CholeskyAdaptation::rank_one_update (const Matrix& A, const Float beta, Vector a)
288- {
289- const auto d = a.size ();
290- Float b = 1.0 ;
291- A_prime.setZero ();
292-
293- for (int j = 0 ; j < d; j++)
294- {
295- const Float aj2 = std::pow (a (j), 2 );
296- const Float Ajj2 = std::pow (A (j, j), 2 );
297- const Float gamma = Ajj2 * b + beta * aj2;
298-
299- A_prime (j, j) = std::sqrt (Ajj2 + (beta / b) * aj2);
300-
301- for (int k = j + 1 ; k < d; k++)
302- {
303- a (k) -= a (j) / A (j, j) * A (k, j);
304- A_prime (k, j) = A_prime (j, j) / A (j, j) * A (k, j) + A_prime (j, j) * beta * a (j) / gamma * a (k);
305- }
306- b += beta * aj2 / Ajj2;
307- }
308- return A_prime;
309- }
310-
311286 void CholeskyAdaptation::adapt_evolution_paths_inner (
312287 const Population& pop,
313288 const parameters::Weights& w,
@@ -327,13 +302,15 @@ namespace matrix_adaptation
327302 stats.n_updates ++;
328303
329304 A *= std::sqrt (1 - w.c1 - w.cmu );
330- A = rank_one_update (A, w.c1 , pc);
305+
306+ Eigen::internal::llt_rank_update_lower (A, pc, w.c1 );
331307 for (auto i = 0 ; i < mu; i++)
332- A = rank_one_update (A , w.cmu * w.positive (i), pop. Y . col (i));
308+ Eigen::internal::llt_rank_update_lower (A, pop. Y . col (i) , w.cmu * w.positive (i));
333309
334310 if (m.active )
335311 for (auto i = 0 ; i < pop.Y .cols () - mu; i++)
336- A = rank_one_update (A, w.cmu * w.negative (i), pop.Y .col (mu + i));
312+ Eigen::internal::llt_rank_update_lower (A, pop.Y .col (mu + i), w.cmu * w.negative (i));
313+
337314
338315 return true ;
339316 }
0 commit comments