Skip to content

Commit ca78b70

Browse files
committed
faster rannk update for cholesky
1 parent 3f9f805 commit ca78b70

File tree

2 files changed

+9
-32
lines changed

2 files changed

+9
-32
lines changed

src/main.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ using std::chrono::duration_cast;
99
using std::chrono::duration;
1010
using std::chrono::milliseconds;
1111

12-
static int dim = 30;
12+
static int dim = 50;
1313
static bool rotated = false;
1414
static size_t budget = dim * 10000;
1515

@@ -66,7 +66,7 @@ void run_modcma(parameters::MatrixAdaptationType mat_t, functions::ObjectiveFunc
6666
parameters::Modules m;
6767
m.matrix_adaptation = mat_t;
6868
m.elitist = false;
69-
m.active = true;
69+
m.active = false;
7070

7171
parameters::Settings settings(
7272
dim,
@@ -83,8 +83,8 @@ void run_modcma(parameters::MatrixAdaptationType mat_t, functions::ObjectiveFunc
8383
FunctionType f = Ellipse(dim, rotated, fun_t);
8484
while (cma.step(f))
8585
{
86-
if (cma.p->stats.global_best.y < 1e-9)
87-
break;
86+
/*if (cma.p->stats.global_best.y < 1e-9)
87+
break;*/
8888
}
8989

9090
std::cout << "modcmaes: " << parameters::to_string(mat_t) << std::defaultfloat;

src/matrix_adaptation.cpp

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)