5 #ifndef ROCKY_ZAGROS_EDA_STRATEGY
6 #define ROCKY_ZAGROS_EDA_STRATEGY
9 #include <rocky/zagros/strategies/strategy.h>
12 #include <Eigen/Cholesky>
22 template<
typename T_e,
int T_dim>
29 template<
typename T_e,
int T_dim>
39 std::vector<T_e> top_particles_mem_;
41 std::vector<int> solution_ind_;
43 std::vector<T_e> cov_mem_;
45 std::vector<T_e> mean_mem_;
53 this->problem_ = problem;
54 this->target_container_ = tgt_container;
55 this->candidates_container_ = cnd_container;
56 this->sample_size_ = sample_size;
57 this->n_candidates_ = cnd_container->n_particles();
58 top_particles_mem_.resize(sample_size * T_dim);
59 solution_ind_.resize(sample_size);
60 cov_mem_.resize(T_dim * T_dim);
61 mean_mem_.resize(T_dim);
63 void sample_std_normal(T_e* vec){
64 static std::normal_distribution<T_e> dist(0.0, 1.0);
65 tbb::parallel_for(0, T_dim, [&](
auto i){
66 vec[i] = dist(rocky::utils::random::prng());
71 target_container_->
best_k(solution_ind_.data(), sample_size_);
73 T_e* top_particles_ptr = top_particles_mem_.data();
75 tbb::parallel_for(0, sample_size_, [&](
int p){
76 std::copy(this->target_container_->
particle(this->solution_ind_[p]),
77 this->target_container_->particle(this->solution_ind_[p]) + T_dim,
78 top_particles_ptr + p * T_dim);
81 Eigen::Map<Eigen::Matrix<T_e, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> top_particles_mat(top_particles_mem_.data(), sample_size_, T_dim);
82 Eigen::Map<Eigen::Matrix<T_e, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> cov_mat(cov_mem_.data(), T_dim, T_dim);
83 Eigen::Map<Eigen::Matrix<T_e, 1, T_dim, Eigen::RowMajor>> mean_mat(mean_mem_.data());
85 mean_mat = top_particles_mat.colwise().mean();
86 top_particles_mat.rowwise() -= mean_mat;
87 cov_mat = (top_particles_mat.adjoint() * top_particles_mat) /
static_cast<T_e
>(sample_size_-1);
89 Eigen::LLT<Eigen::Matrix<T_e, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> llt(cov_mat);
91 tbb::parallel_for(0, sample_size_, [&](
auto p){
92 Eigen::Map<Eigen::Matrix<T_e, 1, T_dim, Eigen::RowMajor>> sample_mat(this->candidates_container_->
particle(p));
93 sample_std_normal(this->candidates_container_->
particle(p));
94 sample_mat = (llt.matrixL() * sample_mat.transpose()).transpose();
95 sample_mat.rowwise() += mean_mat;
100 this->target_container_->
replace_with(this->candidates_container_);