diff --git a/src/feature_creation/feature_space/FeatureSpace.cpp b/src/feature_creation/feature_space/FeatureSpace.cpp index b16eeb710f62aa1331a31019c3808425b49bea1a..978fa39be093bcb0471c9d9ee17467d1df946c73 100644 --- a/src/feature_creation/feature_space/FeatureSpace.cpp +++ b/src/feature_creation/feature_space/FeatureSpace.cpp @@ -1,4 +1,5 @@ #include <feature_creation/feature_space/FeatureSpace.hpp> +#include <iomanip> BOOST_CLASS_EXPORT_GUID(FeatureNode, "FeatureNode") BOOST_CLASS_EXPORT_GUID(AddNode, "AddNode") @@ -180,10 +181,24 @@ void FeatureSpace::generate_feature_space(std::vector<double>& prop) int feat_ind = _phi.size(); std::array<int, 2> start_end = _mpi_comm->get_start_end_from_list(_phi.size() - _start_gen.back(), _start_gen.back()); - for(auto feat_1 = _phi.begin() + start_end[0]; feat_1 < _phi.begin() + start_end[1]; ++feat_1) - generate_new_feats(feat_1, next_phi, feat_ind, l_bound, u_bound); - _start_gen.push_back(_phi.size()); + node_value_arrs::clear_temp_reg(); + #pragma omp parallel firstprivate(feat_ind) default(shared) + { + std::vector<node_ptr> next_phi_private; + + #pragma omp for schedule(auto) + for(auto feat_1 = _phi.begin() + start_end[0]; feat_1 < _phi.begin() + start_end[1]; ++feat_1) + generate_new_feats(feat_1, next_phi_private, feat_ind, l_bound, u_bound); + + #pragma omp critical + { + next_phi.insert(next_phi.end(), next_phi_private.begin(), next_phi_private.end()); + std::cout << omp_get_thread_num() << '\t' << next_phi_private.size() << std::endl; + } + } + _start_gen.push_back(_phi.size()); + std::cout << omp_get_thread_num() << '\t' << _phi.size() << '\t' << next_phi.size() << std::endl; node_value_arrs::clear_temp_reg(); if((nn < _max_phi) || (nn <= _n_rung_store) || (_mpi_comm->size() == 1)) { @@ -225,6 +240,7 @@ void FeatureSpace::generate_feature_space(std::vector<double>& prop) throw std::logic_error("It appears that no new features were created during this rung, stopping here because there is likely something wrong with selected inputs."); node_value_arrs::clear_temp_reg(); + std::cout << _phi.size() << std::endl; if(nn < _max_phi) { // Remove identical features @@ -240,10 +256,31 @@ void FeatureSpace::generate_feature_space(std::vector<double>& prop) _mpi_comm->barrier(); for(int sc = 0; sc < _scores.size() - 1; ++sc) - if(_scores[inds[sc + 1]] - _scores[inds[sc]] < 1e-10) - if(std::abs(util_funcs::r(_phi[_start_gen.back() + inds[sc]]->value_ptr(), _phi[_start_gen.back() + inds[sc]]->value_ptr(), _n_samp) - std::abs(util_funcs::r(_phi[_start_gen.back() + inds[sc]]->value_ptr(), _phi[_start_gen.back() + inds[sc + 1]]->value_ptr(), _n_samp))) < 1e-13) + { + if(_scores[inds[sc]] > -1e-10) + { + for(int sc2 = sc + 1; sc2 < _scores.size(); ++sc2) + { + if(std::abs(util_funcs::r(_phi[_start_gen.back() + inds[sc]]->value_ptr(0), _phi[_start_gen.back() + inds[sc]]->value_ptr(1), _n_samp) - std::abs(util_funcs::r(_phi[_start_gen.back() + inds[sc]]->value_ptr(0), _phi[_start_gen.back() + inds[sc2]]->value_ptr(1), _n_samp))) < 1e-13) + { + // std::cout << _phi[_start_gen.back() + inds[sc]]->value_ptr(0) << '\t' << _phi[_start_gen.back() + inds[sc2]]->value_ptr(1) << '\t' << inds[sc] << '\t' << inds[sc2] << '\t' << std::setw(30) << _phi[_start_gen.back() + inds[sc2]]->expr() << '\t' << std::setw(30) << _phi[_start_gen.back() + inds[sc]]->expr() << '\t' << std::abs(util_funcs::r2(_phi[_start_gen.back() + inds[sc]]->value_ptr(), _phi[_start_gen.back() + inds[sc2]]->value_ptr(), _n_samp)) << std::endl; + del_inds.push_back(-1 * (inds[sc] + _start_gen.back())); + break; + } + } + } + else if(_scores[inds[sc + 1]] - _scores[inds[sc]] < 1e-10) + { + // std::cout << sc << '\t' << std::setw(30) << _phi[_start_gen.back() + inds[sc + 1]]->expr() << '\t' << std::setw(30) << _phi[_start_gen.back() + inds[sc]]->expr() << '\t' << _scores[inds[sc + 1]] << '\t' << _scores[inds[sc]] << std::endl; + if(std::abs(util_funcs::r(_phi[_start_gen.back() + inds[sc]]->value_ptr(0), _phi[_start_gen.back() + inds[sc]]->value_ptr(1), _n_samp) - std::abs(util_funcs::r(_phi[_start_gen.back() + inds[sc]]->value_ptr(0), _phi[_start_gen.back() + inds[sc + 1]]->value_ptr(1), _n_samp))) < 1e-13) + { del_inds.push_back(-1 * (inds[sc] + _start_gen.back())); + } + } + } + inds = util_funcs::argsort(del_inds); + std::cout << del_inds.size() << std::endl; for(int ii = 0; ii < inds.size(); ++ii) _phi.erase(_phi.begin() - del_inds[inds[ii]]); @@ -252,6 +289,7 @@ void FeatureSpace::generate_feature_space(std::vector<double>& prop) for(int ff = _start_gen.back(); ff < _phi.size(); ++ff) _phi[ff]->reindex(ff); } + std::cout << _phi.size() << std::endl; if(nn <= _n_rung_store) { bool use_temp = (nn != _max_phi) || (_max_phi > _n_rung_store); diff --git a/src/feature_creation/node/value_storage/nodes_value_containers.cpp b/src/feature_creation/node/value_storage/nodes_value_containers.cpp index 1b4426b1c906dc288e05ba16dc2545df2a97c134..f5a913f104d3a4c67bb7e667366d01dd8cd01ee3 100644 --- a/src/feature_creation/node/value_storage/nodes_value_containers.cpp +++ b/src/feature_creation/node/value_storage/nodes_value_containers.cpp @@ -67,22 +67,22 @@ void node_value_arrs::resize_values_arr(int n_dims, int n_feat, bool use_temp) } } -double* node_value_arrs::get_value_ptr(int arr_ind, int feat_ind, int offset, int thread) +double* node_value_arrs::get_value_ptr(int arr_ind, int feat_ind, int offset) { if(arr_ind < N_STORE_FEATURES) return access_value_arr(arr_ind); temp_storage_reg(arr_ind, offset) = feat_ind; - return access_temp_storage((arr_ind % N_STORE_FEATURES) + (offset % 3) * N_STORE_FEATURES) + thread * N_STORE_FEATURES * 3; + return access_temp_storage((arr_ind % N_STORE_FEATURES) + (offset % 3) * N_STORE_FEATURES + omp_get_thread_num() * N_STORE_FEATURES * 3); } -double* node_value_arrs::get_test_value_ptr(int arr_ind, int feat_ind, int offset, int thread) +double* node_value_arrs::get_test_value_ptr(int arr_ind, int feat_ind, int offset) { if(arr_ind < N_STORE_FEATURES) return access_test_value_arr(arr_ind); temp_storage_test_reg(arr_ind, offset) = feat_ind; - return access_temp_storage_test((arr_ind % N_STORE_FEATURES) + (offset % 3) * N_STORE_FEATURES) + thread * N_STORE_FEATURES * 3; + return access_temp_storage_test((arr_ind % N_STORE_FEATURES) + (offset % 3) * N_STORE_FEATURES + omp_get_thread_num() * N_STORE_FEATURES * 3); } void node_value_arrs::initialize_d_matrix_arr() diff --git a/src/feature_creation/node/value_storage/nodes_value_containers.hpp b/src/feature_creation/node/value_storage/nodes_value_containers.hpp index c36a06030661c509d49031abb3675d812df05f4f..52942da42d7f5fd2969726282f8fa44f06a87604 100644 --- a/src/feature_creation/node/value_storage/nodes_value_containers.hpp +++ b/src/feature_creation/node/value_storage/nodes_value_containers.hpp @@ -77,7 +77,7 @@ namespace node_value_arrs * * @return The register element for a given feature index and offset */ - inline int& temp_storage_reg(int ind, int offset = 0, int thread = omp_get_thread_num()){return TEMP_STORAGE_REG[(ind % N_STORE_FEATURES) + (offset % 3) * N_STORE_FEATURES + thread * N_STORE_FEATURES * 3];} + inline int& temp_storage_reg(int ind, int offset = 0){return TEMP_STORAGE_REG[(ind % N_STORE_FEATURES) + (offset % 3) * N_STORE_FEATURES + omp_get_thread_num() * N_STORE_FEATURES * 3];} /** * @brief Get a reference slot/feature register of the test data @@ -87,7 +87,7 @@ namespace node_value_arrs * * @return The register element for a given feature index and offset */ - inline int& temp_storage_test_reg(int ind, int offset = 0, int thread = omp_get_thread_num()){return TEMP_STORAGE_TEST_REG[(ind % N_STORE_FEATURES) + (offset % 3) * N_STORE_FEATURES + thread * N_STORE_FEATURES * 3];} + inline int& temp_storage_test_reg(int ind, int offset = 0){return TEMP_STORAGE_TEST_REG[(ind % N_STORE_FEATURES) + (offset % 3) * N_STORE_FEATURES + omp_get_thread_num() * N_STORE_FEATURES * 3];} /** * @brief Access element of the permanent training data storage array @@ -134,7 +134,7 @@ namespace node_value_arrs * * @return The value pointer */ - double* get_value_ptr(int arr_ind, int feat_ind, int offset = 0, int thread = omp_get_thread_num()); + double* get_value_ptr(int arr_ind, int feat_ind, int offset = 0); /** * @brief Get a Node's test_value_ptr @@ -145,7 +145,7 @@ namespace node_value_arrs * * @return The value pointer */ - double* get_test_value_ptr(int arr_ind, int feat_ind, int offset = 0, int thread = omp_get_thread_num()); + double* get_test_value_ptr(int arr_ind, int feat_ind, int offset = 0); /** * @brief Get the pointer to a particular selected Node from sis