Skip to content

Commit 35d354e

Browse files
committed
fixed repelling
1 parent 8e55ef8 commit 35d354e

6 files changed

Lines changed: 76 additions & 83 deletions

File tree

include/matrix_adaptation.hpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,15 @@ namespace matrix_adaptation
4646
dz.setZero();
4747
}
4848

49+
Float distance(const Vector u, const Vector& v)
50+
{
51+
const auto& delta = u - v;
52+
return invert_y(delta).norm();
53+
}
54+
55+
Float distance_from_center(const Vector& xi) {
56+
return distance(m, xi);
57+
}
4958
};
5059

5160
struct None final : Adaptation
@@ -228,6 +237,7 @@ namespace matrix_adaptation
228237
Vector compute_y(const Vector&) override;
229238

230239
Vector invert_y(const Vector&) override;
240+
231241
};
232242

233243
struct CovarainceNoEigvAdaptation final : CovarianceAdaptation
@@ -286,7 +296,6 @@ namespace matrix_adaptation
286296

287297

288298

289-
290299
inline std::shared_ptr<Adaptation> get(const parameters::Modules& m, const size_t dim, const Vector& x0, const Float expected_z, const Float sigma0)
291300
{
292301
using namespace parameters;

include/repelling.hpp

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,22 @@ namespace repelling
1212
{
1313
namespace distance
1414
{
15-
Float manhattan(const Vector &u, const Vector &v);
16-
Float euclidian(const Vector &u, const Vector &v);
17-
Float mahanolobis(const Vector &u, const Vector &v, const Matrix &C_inv);
15+
Float manhattan(const Vector& u, const Vector& v);
16+
Float euclidian(const Vector& u, const Vector& v);
17+
Float mahanolobis(const Vector& u, const Vector& v, const Matrix& C_inv);
1818

1919
bool hill_valley_test(
20-
const Solution &u,
21-
const Solution &v,
22-
FunctionType &f,
20+
const Solution& u,
21+
const Solution& v,
22+
FunctionType& f,
2323
const size_t n_evals);
2424

2525
bool hill_valley_test_p(
26-
const Solution &u,
27-
const Solution &v,
28-
FunctionType &f,
26+
const Solution& u,
27+
const Solution& v,
28+
FunctionType& f,
2929
const size_t n_evals,
30-
parameters::Parameters &p);
30+
parameters::Parameters& p);
3131
}
3232

3333
struct TabooPoint
@@ -37,20 +37,17 @@ namespace repelling
3737
Float shrinkage;
3838
int n_rep;
3939
Float criticality;
40-
// Matrix C;
41-
// Matrix C_inv;
4240

4341
TabooPoint(
44-
const Solution &s,
45-
const Float radius/*,
46-
const Matrix& C, const Matrix& C_inv*/ ) : solution(s),
47-
radius(radius),
48-
shrinkage(std::pow(0.99, 1. / static_cast<Float>(s.x.size()))),
49-
n_rep(1),
50-
criticality(0.0) {}
51-
/*,
52-
C(C),
53-
C_inv(C_inv) {}*/
42+
const Solution& s,
43+
const Float radius) :
44+
solution(s),
45+
radius(radius),
46+
shrinkage(std::pow(0.99, 1. / static_cast<Float>(s.x.size()))),
47+
n_rep(1),
48+
criticality(0.0)
49+
{}
50+
5451

5552
/**
5653
* \brief Rejection rule for a taboo point for a given xi
@@ -59,20 +56,18 @@ namespace repelling
5956
* \param attempts determines the amount of shrinkage applied; radius = pow(shrinkage, attempts) * radius
6057
* \return
6158
*/
62-
bool rejects(const Vector &xi, const parameters::Parameters &p, const int attempts) const;
59+
bool rejects(const Vector& xi, const parameters::Parameters& p, const int attempts) const;
6360

64-
bool shares_basin(FunctionType &objective, const Solution &sol, parameters::Parameters &p) const;
61+
bool shares_basin(FunctionType& objective, const Solution& sol, parameters::Parameters& p) const;
6562

66-
void calculate_criticality(const parameters::Parameters &p);
63+
void calculate_criticality(const parameters::Parameters& p);
6764
};
6865

6966
struct Repelling
7067
{
7168
std::vector<TabooPoint> archive;
7269
int attempts = 0;
7370
Float coverage = 20.0;
74-
// Matrix C;
75-
Matrix C_inv;
7671

7772
virtual ~Repelling() = default;
7873

@@ -83,38 +78,36 @@ namespace repelling
8378
* \param p
8479
* \return
8580
*/
86-
virtual bool is_rejected(const Vector &xi, parameters::Parameters &p);
81+
virtual bool is_rejected(const Vector& xi, parameters::Parameters& p);
8782

8883
/**
8984
* \brief Update the archive of points
9085
* \param p
9186
*/
92-
virtual void update_archive(FunctionType &objective, parameters::Parameters &p);
87+
virtual void update_archive(FunctionType& objective, parameters::Parameters& p);
9388

9489
/**
9590
* \brief Hook before sampling starts
9691
*/
97-
virtual void prepare_sampling(const parameters::Parameters &p);
92+
virtual void prepare_sampling(const parameters::Parameters& p);
9893
};
9994

10095
struct NoRepelling final : Repelling
10196
{
10297

103-
bool is_rejected(const Vector &xi, parameters::Parameters &p) override
98+
bool is_rejected(const Vector& xi, parameters::Parameters& p) override
10499
{
105100
return false;
106101
}
107102

108-
void update_archive(FunctionType &objective, parameters::Parameters &p) override
109-
{
110-
}
103+
void update_archive(FunctionType& objective, parameters::Parameters& p) override
104+
{}
111105

112-
void prepare_sampling(const parameters::Parameters &p) override
113-
{
114-
}
106+
void prepare_sampling(const parameters::Parameters& p) override
107+
{}
115108
};
116109

117-
inline std::shared_ptr<Repelling> get(const parameters::Modules &m)
110+
inline std::shared_ptr<Repelling> get(const parameters::Modules& m)
118111
{
119112
if (m.repelling_restart)
120113
return std::make_shared<Repelling>();

src/interface.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,12 +341,14 @@ void define_matrix_adaptation(py::module& main)
341341
py::arg("pop"),
342342
py::arg("weights"),
343343
py::arg("stats"),
344+
py::arg("settings"),
344345
py::arg("mu"),
345346
py::arg("lamb"))
346347
.def("adapt_evolution_paths_innner", &Adaptation::adapt_evolution_paths_inner,
347348
py::arg("pop"),
348349
py::arg("weights"),
349350
py::arg("stats"),
351+
py::arg("settings"),
350352
py::arg("mu"),
351353
py::arg("lamb"))
352354
.def("adapt_matrix", &Adaptation::adapt_matrix,
@@ -356,7 +358,9 @@ void define_matrix_adaptation(py::module& main)
356358
py::arg("mu"),
357359
py::arg("settings"),
358360
py::arg("stats"))
359-
.def("restart", &Adaptation::restart, py::arg("settings"))
361+
.def("restart", &Adaptation::restart, py::arg("settings"), py::args("sigma"))
362+
.def("distance", &Adaptation::distance, py::arg("u"), py::arg("v"))
363+
.def("distance_from_center", &Adaptation::distance_from_center, py::arg("x"))
360364
.def("compute_y", &Adaptation::compute_y, py::arg("zi"))
361365
.def("invert_x", &Adaptation::invert_x, py::arg("xi"), py::arg("sigma"))
362366
.def("invert_y", &Adaptation::invert_y, py::arg("yi"))

src/main.cpp

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,16 @@ void run_modcma(parameters::MatrixAdaptationType mat_t, functions::ObjectiveFunc
6565
parameters::Modules m;
6666
m.matrix_adaptation = mat_t;
6767
m.ssa = ssa;
68-
m.active = true;
68+
m.active = false;
69+
m.sampler = parameters::BaseSampler::HALTON;
70+
m.restart_strategy = parameters::RestartStrategyType::STOP;
71+
m.sample_transformation = parameters::SampleTranformerType::CAUCHY;
72+
m.elitist = true;
73+
m.sequential_selection = true;
74+
m.threshold_convergence = true;
75+
m.weights = parameters::RecombinationWeights::EQUAL;
76+
m.repelling_restart = true;
77+
6978

7079
/*m.elitist = false;
7180
m.active = false;
@@ -101,8 +110,8 @@ void run_modcma(parameters::MatrixAdaptationType mat_t, functions::ObjectiveFunc
101110
std::nullopt,
102111
budget,
103112
2.0,
104-
43,
105-
13
113+
27,
114+
17
106115
);
107116
auto p = std::make_shared<parameters::Parameters>(settings);
108117
auto cma = ModularCMAES(p);
@@ -112,10 +121,10 @@ void run_modcma(parameters::MatrixAdaptationType mat_t, functions::ObjectiveFunc
112121
while (cma.step(f))
113122
{
114123

115-
//std::cout << "evals: " << cma.p->stats.evaluations << "/" << budget << ": ";
116-
//std::cout << "iters: " << cma.p->stats.t << ": ";
117-
//std::cout << "sigma: " << cma.p->mutation->sigma << ": ";
118-
//std::cout << "best_y: " << cma.p->stats.global_best.y << std::endl;
124+
std::cout << "evals: " << cma.p->stats.evaluations << "/" << budget << ": ";
125+
std::cout << "iters: " << cma.p->stats.t << ": ";
126+
std::cout << "sigma: " << cma.p->mutation->sigma << ": ";
127+
std::cout << "best_y: " << cma.p->stats.global_best.y << std::endl;
119128

120129
if (cma.p->stats.global_best.y < 1e-9)
121130
break;
@@ -143,7 +152,7 @@ void run_modcma(parameters::MatrixAdaptationType mat_t, functions::ObjectiveFunc
143152
int main()
144153
{
145154
auto ft = functions::SPHERE;
146-
auto ssa = parameters::StepSizeAdaptation::TPA;
155+
auto ssa = parameters::StepSizeAdaptation::MSR;
147156

148157
//run_modcma(parameters::MatrixAdaptationType::NONE, ft, ssa);
149158
//run_modcma(parameters::MatrixAdaptationType::SEPERABLE, ft, ssa);
@@ -152,7 +161,7 @@ int main()
152161

153162

154163
//run_modcma(parameters::MatrixAdaptationType::CHOLESKY, ft, ssa);
155-
run_modcma(parameters::MatrixAdaptationType::COVARIANCE, ft, ssa);
164+
//run_modcma(parameters::MatrixAdaptationType::COVARIANCE, ft, ssa);
156165
//run_modcma(parameters::MatrixAdaptationType::COVARIANCE_NO_EIGV, ft, ssa);
157166
run_modcma(parameters::MatrixAdaptationType::NATURAL_GRADIENT, ft, ssa);
158167
}

src/matrix_adaptation.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ namespace matrix_adaptation
201201

202202

203203

204-
void matrix_adaptation::MatrixAdaptation::adapt_evolution_paths_inner(const Population& pop, const Weights& w,
204+
void MatrixAdaptation::adapt_evolution_paths_inner(const Population& pop, const Weights& w,
205205
const Stats& stats, const parameters::Settings& settings, const size_t mu, const size_t lambda)
206206
{
207207
ps = (1.0 - w.cs) * ps + (w.sqrt_cs_mueff * dz);
@@ -245,7 +245,7 @@ namespace matrix_adaptation
245245
return true;
246246
}
247247

248-
void matrix_adaptation::MatrixAdaptation::restart(const Settings& settings, const Float sigma)
248+
void MatrixAdaptation::restart(const Settings& settings, const Float sigma)
249249
{
250250
Adaptation::restart(settings, sigma);
251251
M = Matrix::Identity(settings.dim, settings.dim);
@@ -268,7 +268,7 @@ namespace matrix_adaptation
268268
}
269269

270270

271-
void matrix_adaptation::None::adapt_evolution_paths_inner(const Population& pop, const Weights& w,
271+
void None::adapt_evolution_paths_inner(const Population& pop, const Weights& w,
272272
const Stats& stats, const parameters::Settings& settings, const size_t mu, const size_t lambda)
273273
{
274274
ps = (1.0 - w.cs) * ps + (w.sqrt_cs_mueff * dz);
@@ -285,7 +285,7 @@ namespace matrix_adaptation
285285
return yi;
286286
}
287287

288-
void matrix_adaptation::CholeskyAdaptation::adapt_evolution_paths_inner(const Population& pop,
288+
void CholeskyAdaptation::adapt_evolution_paths_inner(const Population& pop,
289289
const parameters::Weights& w,
290290
const parameters::Stats& stats, const parameters::Settings& settings, size_t mu, size_t lambda)
291291
{
@@ -314,7 +314,7 @@ namespace matrix_adaptation
314314
return true;
315315
}
316316

317-
void matrix_adaptation::CholeskyAdaptation::restart(const parameters::Settings& settings, const Float sigma)
317+
void CholeskyAdaptation::restart(const parameters::Settings& settings, const Float sigma)
318318
{
319319
Adaptation::restart(settings, sigma);
320320
A = Matrix::Identity(settings.dim, settings.dim);
@@ -364,7 +364,7 @@ namespace matrix_adaptation
364364
return true;
365365
}
366366

367-
void matrix_adaptation::SelfAdaptation::restart(const parameters::Settings& settings, const Float sigma)
367+
void SelfAdaptation::restart(const parameters::Settings& settings, const Float sigma)
368368
{
369369
A = Matrix::Identity(settings.dim, settings.dim);
370370
}
@@ -407,7 +407,7 @@ namespace matrix_adaptation
407407
return A.triangularView<Eigen::Lower>().solve(yi);
408408
}
409409

410-
void matrix_adaptation::NaturalGradientAdaptation::adapt_evolution_paths_inner(
410+
void NaturalGradientAdaptation::adapt_evolution_paths_inner(
411411
const Population& pop,
412412
const parameters::Weights& w,
413413
const parameters::Stats& stats,
@@ -481,7 +481,7 @@ namespace matrix_adaptation
481481
Vector NaturalGradientAdaptation::invert_y(const Vector& yi)
482482
{
483483
if (outdated_A_inv)
484-
A_inv = A.inverse();
484+
A_inv = A.completeOrthogonalDecomposition().pseudoInverse();
485485
return A_inv * yi;
486486
}
487487

src/repelling.cpp

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ namespace repelling
6666
bool TabooPoint::rejects(const Vector &xi, const parameters::Parameters &p, const int attempts) const
6767
{
6868
const Float rejection_radius = std::pow(shrinkage, attempts) * radius;
69-
const Float delta_xi = distance::mahanolobis(xi, solution.x, p.repelling->C_inv) / p.mutation->sigma;
70-
69+
const Float delta_xi = p.adaptation->distance(xi, solution.x) / p.mutation->sigma;
70+
7171
if (delta_xi < rejection_radius)
7272
return true;
7373

@@ -81,7 +81,8 @@ namespace repelling
8181

8282
void TabooPoint::calculate_criticality(const parameters::Parameters &p)
8383
{
84-
const Float delta_m = distance::mahanolobis(p.adaptation->m, solution.x, p.repelling->C_inv) / p.mutation->sigma;
84+
const Float delta_m = p.adaptation->distance_from_center(solution.x) / p.mutation->sigma;
85+
8586
const auto u = delta_m + radius;
8687
const auto l = delta_m - radius;
8788
criticality = cdf(u) - cdf(l);
@@ -95,29 +96,6 @@ namespace repelling
9596

9697
std::sort(archive.begin(), archive.end(), [](const TabooPoint &a, const TabooPoint &b)
9798
{ return a.criticality > b.criticality; });
98-
99-
//! If it is not intialized
100-
if (static_cast<size_t>(C_inv.cols()) != p.settings.dim)
101-
{
102-
C_inv = Matrix::Identity(p.settings.dim, p.settings.dim);
103-
}
104-
105-
if (!(p.settings.modules.matrix_adaptation == parameters::MatrixAdaptationType::NONE ||
106-
p.settings.modules.matrix_adaptation == parameters::MatrixAdaptationType::MATRIX))
107-
{
108-
using namespace matrix_adaptation;
109-
const auto dynamic = std::dynamic_pointer_cast<CovarianceAdaptation>(p.adaptation);
110-
111-
C_inv.noalias() = (dynamic->B * dynamic->d.cwiseInverse().asDiagonal()) * dynamic->B.transpose();
112-
113-
/*const Float d_sigma = p.mutation->sigma / p.settings.sigma0;
114-
if (d_sigma > constants::sigma_threshold)
115-
{
116-
C = dynamic->C / dynamic->C.maxCoeff();
117-
C_inv = dynamic->inv_C / dynamic->inv_C.maxCoeff();
118-
}*/
119-
}
120-
12199
}
122100

123101
void Repelling::update_archive(FunctionType &objective, parameters::Parameters &p)

0 commit comments

Comments
 (0)