diff --git a/src/SymmetryFunction/ACSFParametersOptimizer.cpp b/src/SymmetryFunction/ACSFParametersOptimizer.cpp index 4d92bedfd4c75fb3c1f933838bc1182e94bbc520..2ddeeb6f155c0b75f4fbced40271416f34e508c2 100644 --- a/src/SymmetryFunction/ACSFParametersOptimizer.cpp +++ b/src/SymmetryFunction/ACSFParametersOptimizer.cpp @@ -1,12 +1,14 @@ // // Created by martin on 10.09.19. // - #include <algorithm> #include <random> #include <unordered_map> #include <armadillo> +#include <unordered_set> + +#include <boost/functional/hash.hpp> #include "LearningMethods/LevenbergMarquardt.h" #include "Reader/XYZReader.h" @@ -60,8 +62,9 @@ void lib4neuro::ACSFParametersOptimizer::fit_ACSF_parameters(std::vector<SYMMETR FullyConnectedFFN nn(&neuron_numbers, &type_hidden_neurons); /* Initial parameters' values */ + // TODO take care of parameters' boundaries std::unordered_map<SYMMETRY_FUNCTION_PARAMETER, double> init_param_values; - std::normal_distribution<> d{1, 10}; // TODO make probability distribution choice more flexible by adding function parameters + std::normal_distribution<> d{1, 0.085}; // TODO make probability distribution choice more flexible by adding function parameters std::uniform_real_distribution<> d_uni(0, 2); std::vector<short int> shift_max_vals = {-1, 1}; if(random_init_params) { @@ -146,6 +149,38 @@ void lib4neuro::ACSFParametersOptimizer::fit_ACSF_parameters(std::vector<SYMMETR /* Termination condition */ if(current_error < termination_threshold) { COUT_INFO("Error when optimizing ACSF parameters: " + std::to_string(current_error)); + + /* Compute correlation of ACSFs */ +// this->data_set->get_inputs_matrix()->print(); + arma::Mat<double> m = arma::cor(*this->data_set->get_inputs_matrix()); + m.print(); + + arma::Col<arma::uword> v = arma::find(m > 0.9); + std::unordered_set<std::vector<unsigned long long>, boost::hash<std::vector<unsigned long long>>> correlation_indices; + for(size_t k = 0; k < v.size(); k++) { + std::vector<unsigned long long> v_tmp = {v.at(k) % m.n_rows, (unsigned long long)(v.at(k) / m.n_rows)}; + if(v_tmp.at(0) == v_tmp.at(1)) { + continue; + } + std::sort(v_tmp.begin(), v_tmp.end()); + correlation_indices.insert(v_tmp); + } + +// std::unique(correlation_indices.begin(), correlation_indices.end()); + + if(!correlation_indices.empty()) { + std::cout <<"WARNING: Following " << correlation_indices.size() << " symmetry function pairs correlate significantly (>0.9):" << std::endl; + unsigned int corr_ind = 0; + for(auto e : correlation_indices) { + std::cout << "{" << e.at(0) << ", " << e.at(1) << "} "; + if(corr_ind % 10 == 9) { + std::cout << std::endl; + } + corr_ind++; + } + std::cout << std::endl; + } + return; }