Skip to content
Snippets Groups Projects
Commit eb24401a authored by Thomas Purcell's avatar Thomas Purcell
Browse files

Modify mpi gather_all in DI to not create vectors of vectors

parent 04a3f9b8
No related branches found
No related tags found
No related merge requests found
......@@ -134,7 +134,7 @@ void SISSORegressor::l0_norm(std::vector<double>& prop, int n_dim)
std::vector<double> coefs(n_dim + 1, 0.0);
std::vector<int> inds(n_dim, 0);
std::vector<std::vector<int>> inds_min(_n_residual);
std::vector<int> inds_min(_n_residual * _n_dim, -1);
std::vector<double> min_errors(_n_residual, util_funcs::norm(_prop.data(), _n_samp));
......@@ -172,32 +172,31 @@ void SISSORegressor::l0_norm(std::vector<double>& prop, int n_dim)
int rr = 0;
while((rr < _n_residual) && (error > min_errors[rr]))
++rr;
inds_min.insert(inds_min.begin() + rr, inds);
inds_min.insert(inds_min.begin() + rr * n_dim, inds.begin(), inds.end());
min_errors.insert(min_errors.begin() + rr, error);
inds_min.pop_back();
inds_min.erase(inds_min.end() - n_dim, inds_min.end());
min_errors.pop_back();
}
++rr;
} while(std::next_permutation(v.begin(), v.end()) && (rr < start_end[1]));
std::vector<std::vector<double>> all_min_error;
std::vector<std::vector<std::vector<int>>> all_inds_min;
std::vector<double> all_min_error(_mpi_comm->size() * _n_residual);
// std::vector<std::vector<std::vector<int>>> all_inds_min;
std::vector<int> all_inds_min(_mpi_comm->size() *_n_residual * n_dim);
mpi::all_gather(*_mpi_comm, min_errors, all_min_error);
mpi::all_gather(*_mpi_comm, inds_min, all_inds_min);
mpi::all_gather(*_mpi_comm, min_errors.data(), _n_residual, all_min_error);
mpi::all_gather(*_mpi_comm, inds_min.data(), _n_residual * n_dim, all_inds_min);
min_errors = std::vector<double>(all_min_error.size() * _n_residual);
for(int me = 0; me < all_min_error.size(); ++me)
std::copy_n(all_min_error[me].begin(), all_min_error[me].size(), &min_errors[me * _n_residual]);
inds = util_funcs::argsort(all_min_error);
inds = util_funcs::argsort(min_errors);
std::vector<node_ptr> min_nodes(n_dim);
std::vector<Model> models;
for(int rr = 0; rr < _n_residual; ++rr)
{
for(int ii = 0; ii < n_dim; ++ii)
min_nodes[ii] = _feat_space->phi_selected()[all_inds_min[inds[rr] / _n_residual][inds[rr] % _n_residual][ii]];
min_nodes[ii] = _feat_space->phi_selected()[all_inds_min[inds[rr] * n_dim + ii]];
models.push_back(Model(_prop, _prop_test, min_nodes));
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment