Commit ed5ff185 authored by Martin Beseda's avatar Martin Beseda
Browse files

[CODE] [ENH] Minor code improvements.

parent aa00b162
...@@ -44,7 +44,6 @@ win_visual_studio_static_local: ...@@ -44,7 +44,6 @@ win_visual_studio_static_local:
- 'rmdir /s /q build external_dependencies/*' - 'rmdir /s /q build external_dependencies/*'
script: script:
- 'echo %DEPENDENCIES_LINK_TYPE%'
- 'call build_scripts\windows\win_VS_build_x64_release.bat' - 'call build_scripts\windows\win_VS_build_x64_release.bat'
# Windows 10 # Windows 10
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
echo "Generating documentation into folder 'docs'..."; echo "Generating documentation into folder 'docs'...";
doxygen 2>&1; doxygen 2>&1;
cd docs/latex; cd docs/latex || exit 1;
echo "Building LaTeX documentation../"; echo "Building LaTeX documentation../";
make >/dev/null && echo "Documentation was built." || exit -1; make >/dev/null && echo "Documentation was built." || exit -1;
cd ../..; cd ../..;
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
#################### ####################
# VALIDATION TESTS # # VALIDATION TESTS #
#################### ####################
cd build/examples; cd build/Examples || exit 1
for f in *; do for f in *; do
echo "Example ${f} starting..." echo "Example ${f} starting..."
./${f} || exit 1 "./${f}" || exit 1
done done
############## ##############
...@@ -14,6 +14,6 @@ done ...@@ -14,6 +14,6 @@ done
############## ##############
for f in build/unit-tests/*_test; do for f in build/unit-tests/*_test; do
echo "Test ${f} starting..." echo "Test ${f} starting..."
${f} || exit 1 "${f}" || exit 1
done done
...@@ -53,14 +53,14 @@ niteration=100 ...@@ -53,14 +53,14 @@ niteration=100
layers_cardinality="100 1" layers_cardinality="100 1"
src_net_file="${home_dir}/nets/he3+.l4n" src_net_file="${home_dir}/nets/he3+.l4n"
target_net_file="${home_dir}/nets/he3+.l4n" target_net_file="${home_dir}/nets/he3+.l4n"
source_data_file="${home_dir}/data/he3+.xyz" source_data_file="${home_dir}/data/HE4+T1.xyz" #he3+.xyz"
cross_validation_fn="he3+_cross_validation.txt" cross_validation_fn="he3+_cross_validation.txt"
out_file="he3+.txt" out_file="he3+.txt"
echo $niteration $batch_size $tolerance $source_data_file $target_net_file $nlayers $layers_cardinality $nsym_g2 $g2_cutoffs $g2_extensions $g2_shifts $nsym_g5 $g5_cutoffs $g5_extensions $g5_shifts $g5_angles $src_net_file $cross_validation_k $cross_validation_ntests $cross_validation_fn echo $niteration $batch_size $tolerance $source_data_file $target_net_file $nlayers $layers_cardinality $nsym_g2 $g2_cutoffs $g2_extensions $g2_shifts $nsym_g5 $g5_cutoffs $g5_extensions $g5_shifts $g5_angles $src_net_file $cross_validation_k $cross_validation_ntests $cross_validation_fn
# mpirun -np 1 -env LD_PRELOAD /apps/tools/valgrind/3.9.0/impi/lib/valgrind/libmpiwrap-amd64-linux.so valgrind --leak-check=full ./acsf $niteration $batch_size $tolerance $source_data_file $target_net_file $nlayers $layers_cardinality $nsym_g2 $g2_cutoffs $g2_extensions $g2_shifts $nsym_g5 $g5_cutoffs $g5_extensions $g5_shifts $g5_angles $src_net_file $cross_validation_k $cross_validation_ntests $cross_validation_fn > out.txt # mpirun -np 1 -env LD_PRELOAD /apps/tools/valgrind/3.9.0/impi/lib/valgrind/libmpiwrap-amd64-linux.so valgrind --leak-check=full ./acsf $niteration $batch_size $tolerance $source_data_file $target_net_file $nlayers $layers_cardinality $nsym_g2 $g2_cutoffs $g2_extensions $g2_shifts $nsym_g5 $g5_cutoffs $g5_extensions $g5_shifts $g5_angles $src_net_file $cross_validation_k $cross_validation_ntests $cross_validation_fn > out.txt
mpirun -np 1 ./acsf $niteration $batch_size $tolerance $source_data_file $target_net_file $nlayers $layers_cardinality $nsym_g2 $g2_cutoffs $g2_extensions $g2_shifts $nsym_g5 $g5_cutoffs $g5_extensions $g5_shifts $g5_angles $src_net_file $cross_validation_k $cross_validation_ntests $cross_validation_fn valgrind mpirun -np 1 ./acsf $niteration $batch_size $tolerance $source_data_file $target_net_file $nlayers $layers_cardinality $nsym_g2 $g2_cutoffs $g2_extensions $g2_shifts $nsym_g5 $g5_cutoffs $g5_extensions $g5_shifts $g5_angles $src_net_file $cross_validation_k $cross_validation_ntests $cross_validation_fn
cd ../.. cd ../..
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#include "CrossValidator.h" #include "CrossValidator.h"
#include "message.h" #include "message.h"
#include "../mpi_wrapper.h" #include "MPIWrapper/mpi_wrapper.h"
#include "../exceptions.h" #include "../exceptions.h"
namespace lib4neuro { namespace lib4neuro {
......
#include <algorithm> #include <algorithm>
#include <limits> #include <limits>
#include <memory> #include <memory>
...@@ -7,9 +6,7 @@ ...@@ -7,9 +6,7 @@
#include <map> #include <map>
#include <numeric> #include <numeric>
#include <mpi.h> #include <mpi.h>
//#include "../mpi_wrapper.h"
#define ARMA_ALLOW_FAKE_GCC
#include <armadillo> #include <armadillo>
#include <boost/serialization/export.hpp> #include <boost/serialization/export.hpp>
#include <ctime> #include <ctime>
...@@ -22,9 +19,6 @@ ...@@ -22,9 +19,6 @@
#include "../message.h" #include "../message.h"
#include "DataSet.h" #include "DataSet.h"
//BOOST_CLASS_EXPORT_IMPLEMENT(lib4neuro::DataSet)
//BOOST_CLASS_EXPORT_IMPLEMENT(lib4neuro::ACSFDataSet)
namespace lib4neuro { namespace lib4neuro {
void DataSet::MPI_redistribute_data( ){ void DataSet::MPI_redistribute_data( ){
......
#ifndef INC_4NEURO_ERRORFUNCTION_H #ifndef INC_4NEURO_ERRORFUNCTION_H
#define INC_4NEURO_ERRORFUNCTION_H #define INC_4NEURO_ERRORFUNCTION_H
#define ARMA_ALLOW_FAKE_GCC
//#include <armadillo>
#include "../settings.h" #include "../settings.h"
#include "../Network/NeuralNetwork.h" #include "../Network/NeuralNetwork.h"
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Created by martin on 20.08.19. // Created by martin on 20.08.19.
// //
#define ARMA_ALLOW_FAKE_GCC
#include <4neuro.h> #include <4neuro.h>
#include <iomanip> #include <iomanip>
#include <vector> #include <vector>
...@@ -438,7 +436,6 @@ void dynamic_test( ...@@ -438,7 +436,6 @@ void dynamic_test(
} }
} }
int main( int argc, char** argv ) { int main( int argc, char** argv ) {
MPI_INIT MPI_INIT
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
#include "ExprtkWrapperSerialization.h" #include "ExprtkWrapperSerialization.h"
#include "exceptions.h" #include "exceptions.h"
#include "../mpi_wrapper.h" #include "MPIWrapper/mpi_wrapper.h"
//BOOST_CLASS_EXPORT_IMPLEMENT(ExprtkWrapper); //BOOST_CLASS_EXPORT_IMPLEMENT(ExprtkWrapper);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#include <random.hpp> #include <random.hpp>
#include "GradientDescent.h" #include "GradientDescent.h"
#include "message.h" #include "message.h"
#include "../mpi_wrapper.h" #include "MPIWrapper/mpi_wrapper.h"
namespace lib4neuro { namespace lib4neuro {
GradientDescent::GradientDescent(double epsilon, GradientDescent::GradientDescent(double epsilon,
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* @date 4.2.19 - * @date 4.2.19 -
*/ */
#include "../mpi_wrapper.h" #include "MPIWrapper/mpi_wrapper.h"
#include "GradientDescentBB.h" #include "GradientDescentBB.h"
#include "message.h" #include "message.h"
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* @date 19.2.19 - * @date 19.2.19 -
*/ */
#include "../mpi_wrapper.h" #include "MPIWrapper/mpi_wrapper.h"
#include "GradientDescentSingleItem.h" #include "GradientDescentSingleItem.h"
......
#define ARMA_ALLOW_FAKE_GCC
#include <armadillo> #include <armadillo>
#include <mpi.h> #include <mpi.h>
...@@ -11,7 +10,7 @@ ...@@ -11,7 +10,7 @@
#include <petscksp.h> #include <petscksp.h>
#endif #endif
#include "../mpi_wrapper.h" #include "MPIWrapper/mpi_wrapper.h"
#include "LevenbergMarquardt.h" #include "LevenbergMarquardt.h"
#include "../message.h" #include "../message.h"
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// Created by martin on 05.09.19. // Created by martin on 05.09.19.
// //
#define ARMA_ALLOW_FAKE_GCC
#include <armadillo> #include <armadillo>
#include <utility> #include <utility>
#include <random> #include <random>
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#include <iostream> #include <iostream>
#include <format.hpp> #include <format.hpp>
#include "../mpi_wrapper.h" #include "MPIWrapper/mpi_wrapper.h"
#include "message.h" #include "message.h"
#include "../Network/NeuralNetwork.h" #include "../Network/NeuralNetwork.h"
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#include <stdexcept> #include <stdexcept>
#include <boost/serialization/export.hpp> #include <boost/serialization/export.hpp>
#include "../mpi_wrapper.h" #include "MPIWrapper/mpi_wrapper.h"
#include "NormalizationStrategyACSF.h" #include "NormalizationStrategyACSF.h"
#include "NormalizationStrategyACSFSerialization.h" #include "NormalizationStrategyACSFSerialization.h"
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#ifndef LIB4NEURO_NORMALIZATIONSTRATEGYFINDDATAVEC_H #ifndef LIB4NEURO_NORMALIZATIONSTRATEGYFINDDATAVEC_H
#define LIB4NEURO_NORMALIZATIONSTRATEGYFINDDATAVEC_H #define LIB4NEURO_NORMALIZATIONSTRATEGYFINDDATAVEC_H
#include "../mpi_wrapper.h" #include "MPIWrapper/mpi_wrapper.h"
/* Helper functions to find max and min values in inputs/outputs of DataSet */ /* Helper functions to find max and min values in inputs/outputs of DataSet */
double inline find_max_inp(const std::vector<std::pair<std::vector<double>, std::vector<double>>>& data) { double inline find_max_inp(const std::vector<std::pair<std::vector<double>, std::vector<double>>>& data) {
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#include <boost/algorithm/string/erase.hpp> #include <boost/algorithm/string/erase.hpp>
#include <mpi.h> #include <mpi.h>
#include "../mpi_wrapper.h" #include "MPIWrapper/mpi_wrapper.h"
#include "CSVReader.h" #include "CSVReader.h"
#include "exceptions.h" #include "exceptions.h"
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#include <algorithm> #include <algorithm>
#include <cctype> #include <cctype>
#include "../mpi_wrapper.h" #include "MPIWrapper/mpi_wrapper.h"
#include "../exceptions.h" #include "../exceptions.h"
#include "Reader.h" #include "Reader.h"
...@@ -37,50 +37,56 @@ void lib4neuro::Reader::print_data() { ...@@ -37,50 +37,56 @@ void lib4neuro::Reader::print_data() {
void lib4neuro::Reader::read() { void lib4neuro::Reader::read() {
// TODO make filepath relative to an executable directory instead of the current one! // TODO make filepath relative to an executable directory instead of the current one!
// TODO https://www.boost.org/doc/libs/1_36_0/libs/filesystem/doc/reference.html#initial_path // TODO https://www.boost.org/doc/libs/1_36_0/libs/filesystem/doc/reference.html#initial_path
if( lib4neuro::mpi_rank == 0 ){ try {
std::ifstream ifs(this->file_path); if (lib4neuro::mpi_rank == 0) {
std::ifstream ifs(this->file_path);
if ( !ifs.is_open() ) {
// throw std::logic_error("File could not be opened! Possibly due to the lack of access privileges or an incorrect path.\n"); if (!ifs.is_open()) {
MPI_INTERRUPT MPI_INTERRUPT
THROW_LOGIC_ERROR( "File \'" + this->file_path + "\' could not be opened! Possibly due to the lack of access privileges or an incorrect path.\n" ); // throw std::logic_error("File could not be opened! Possibly due to the lack of access privileges or an incorrect path.\n");
} THROW_LOGIC_ERROR("File \'" + this->file_path +
"\' could not be opened! Possibly due to the lack of access privileges or an incorrect path.\n")
std::string line; }
if (this->ignore_first_line) {
std::getline(ifs,
line);
}
/* Read single line from the file */ std::string line;
while (std::getline(ifs,
line)) {
/* Ignore empty line */ if (this->ignore_first_line) {
if (line == "") { std::getline(ifs,
continue; line);
} }
/* Separate elements of the line according to the delimiter */ /* Read single line from the file */
size_t last = 0; while (std::getline(ifs,
size_t next = 0; line)) {
std::vector<std::string> separated_line;
while ((next = line.find(this->delimiter, /* Ignore empty line */
last)) != std::string::npos) { if (line == "") {
separated_line.emplace_back(line.substr(last, continue;
next - last)); }
last = next + 1;
/* Separate elements of the line according to the delimiter */
size_t last = 0;
size_t next = 0;
std::vector<std::string> separated_line;
while ((next = line.find(this->delimiter,
last)) != std::string::npos) {
separated_line.emplace_back(line.substr(last,
next - last));
last = next + 1;
}
separated_line.emplace_back(line.substr(last));
/* Store the elements from the line to the vector with data */
this->data.emplace_back(separated_line);
} }
separated_line.emplace_back(line.substr(last));
/* Store the elements from the line to the vector with data */ ifs.close();
this->data.emplace_back(separated_line);
} }
} catch(...) {
ifs.close(); MPI_ERROR_CHECK
THROW_LOGIC_ERROR("read() function error!")
} }
MPI_ERROR_CHECK
} }
void lib4neuro::Reader::remove_white_characters_from_vector(std::vector<std::string>& v) { void lib4neuro::Reader::remove_white_characters_from_vector(std::vector<std::string>& v) {
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
#include <limits> #include <limits>
#include <mpi.h> #include <mpi.h>
#include "../mpi_wrapper.h" #include "MPIWrapper/mpi_wrapper.h"
#include "../message.h" #include "../message.h"
#include "XYZReader.h" #include "XYZReader.h"
...@@ -53,8 +53,6 @@ std::shared_ptr<lib4neuro::DataSet> lib4neuro::XYZReader::get_data_set( ) { ...@@ -53,8 +53,6 @@ std::shared_ptr<lib4neuro::DataSet> lib4neuro::XYZReader::get_data_set( ) {
line = this->data.at(1); line = this->data.at(1);
this->remove_white_characters_from_vector(line); this->remove_white_characters_from_vector(line);
n_particles = std::stoul(line.at(0)); n_particles = std::stoul(line.at(0));
// COUT_INFO( "# of particles in cluster: " << n_particles);
// COUT_INFO( "# of various particles: " << n_configurations);
unsigned int situation; unsigned int situation;
...@@ -69,15 +67,6 @@ std::shared_ptr<lib4neuro::DataSet> lib4neuro::XYZReader::get_data_set( ) { ...@@ -69,15 +67,6 @@ std::shared_ptr<lib4neuro::DataSet> lib4neuro::XYZReader::get_data_set( ) {
if (situation == 1) { if (situation == 1) {
data_set_contents.emplace_back(std::make_pair(inputs, data_set_contents.emplace_back(std::make_pair(inputs,
outputs)); outputs));
// std::cout << "[" << data_set_contents.size() << "] inputs: ";
// for( auto el: inputs ){
// std::cout << el << ", ";
// }
// std::cout << "outputs: ";
// for( auto el: outputs ){
// std::cout << el << ", ";
// }
// std::cout << std::endl;
inputs.clear(); inputs.clear();
outputs.clear(); outputs.clear();
...@@ -135,7 +124,6 @@ std::shared_ptr<lib4neuro::DataSet> lib4neuro::XYZReader::get_data_set( ) { ...@@ -135,7 +124,6 @@ std::shared_ptr<lib4neuro::DataSet> lib4neuro::XYZReader::get_data_set( ) {
MPI_Bcast( &n_clusters, 1, MPI_INT, 0, lib4neuro::mpi_active_comm ); MPI_Bcast( &n_clusters, 1, MPI_INT, 0, lib4neuro::mpi_active_comm );
MPI_Bcast( &n_elements, 1, MPI_INT, 0, lib4neuro::mpi_active_comm ); MPI_Bcast( &n_elements, 1, MPI_INT, 0, lib4neuro::mpi_active_comm );
MPI_Bcast( &this->charge, 1, MPI_INT, 0, lib4neuro::mpi_active_comm ); MPI_Bcast( &this->charge, 1, MPI_INT, 0, lib4neuro::mpi_active_comm );
// COUT_INFO("# number of configurations: " << n_clusters);
if( this->data_set == nullptr ){ if( this->data_set == nullptr ){
/* synchronization of element list */ /* synchronization of element list */
...@@ -208,8 +196,8 @@ void lib4neuro::XYZReader::transform_input_to_acsf(std::unordered_map<ELEMENT_SY ...@@ -208,8 +196,8 @@ void lib4neuro::XYZReader::transform_input_to_acsf(std::unordered_map<ELEMENT_SY
unsigned int n_particles = this->element_list->size(); unsigned int n_particles = this->element_list->size();
unsigned int n_coords_per_particle = (this->charge && !this->ignore_charge) ? 4 : 3; unsigned int n_coords_per_particle = (this->charge && !this->ignore_charge) ? 4 : 3;
COUT_INFO("data contains charge " << this->charge ); // COUT_INFO("data contains charge " << this->charge );
COUT_INFO("should we ignore charge " << this->ignore_charge ); // COUT_INFO("should we ignore charge " << this->ignore_charge );
/* Create a new set of Atomic-Centered Symmetry Functions serving as coordinates */ /* Create a new set of Atomic-Centered Symmetry Functions serving as coordinates */
std::vector<double> acsf_coords; std::vector<double> acsf_coords;
...@@ -221,32 +209,10 @@ void lib4neuro::XYZReader::transform_input_to_acsf(std::unordered_map<ELEMENT_SY ...@@ -221,32 +209,10 @@ void lib4neuro::XYZReader::transform_input_to_acsf(std::unordered_map<ELEMENT_SY
unsigned int idx; unsigned int idx;
this->acsf_data_set = std::make_shared<DataSet>(); this->acsf_data_set = std::make_shared<DataSet>();
/* normalization data for each element*/
// std::unordered_map<ELEMENT_SYMBOL, std::vector<double> > inputs_min, inputs_max;
// std::vector<double> outputs_min(out_dim), outputs_max(out_dim);
// std::fill(outputs_min.begin(), outputs_min.end(), std::numeric_limits<double>::max());
// std::fill(outputs_max.begin(), outputs_max.end(), std::numeric_limits<double>::min());
// for( auto el: element_description ){
// inputs_min[el.first] = std::vector<double>(element_description[el.first]->getSymmetryFunctions()->size());
// inputs_max[el.first] = std::vector<double>(element_description[el.first]->getSymmetryFunctions()->size());
// std::fill(inputs_min[el.first].begin(), inputs_min[el.first].end(), std::numeric_limits<double>::max());
// std::fill(inputs_max[el.first].begin(), inputs_max[el.first].end(), std::numeric_limits<double>::min());
// std::cout << "new element: " << inputs_min[el.first].size() << std::endl;
// }
std::vector<ELEMENT_SYMBOL> element_order;//used for input ordering std::vector<ELEMENT_SYMBOL> element_order; //used for input ordering
for(auto configuration : *data) { /* Iterate over configurations */ for(auto configuration : *data) { /* Iterate over configurations */
// std::cout << "A" << std::endl;
/* update the output value ranges */
// for( size_t j = 0; j < outputs_min.size(); ++j ){
// outputs_min[ j ] = std::min( outputs_min[ j ], configuration.second[ j ] );
// outputs_max[ j ] = std::max( outputs_max[ j ], configuration.second[ j ] );
// }
// std::cout << "B" << std::endl;
idx = 0; idx = 0;
particles.clear(); particles.clear();
...@@ -254,15 +220,12 @@ void lib4neuro::XYZReader::transform_input_to_acsf(std::unordered_map<ELEMENT_SY ...@@ -254,15 +220,12 @@ void lib4neuro::XYZReader::transform_input_to_acsf(std::unordered_map<ELEMENT_SY
for(auto el : *this->element_list) { /* Iterate over particles */ for(auto el : *this->element_list) { /* Iterate over particles */
for(unsigned int i = 0; i < 3; i++) { /* Iterate over all coordinates of a single particle */ for(unsigned int i = 0; i < 3; i++) { /* Iterate over all coordinates of a single particle */
cartesian_coords.at(i) = configuration.first.at(idx); cartesian_coords.at(i) = configuration.first.at(idx);
// std::cout << "d[" << i << "] = i[" << idx << "](" << configuration.first.at(idx) << "), " ;
idx++; idx++;
} }
if( this->charge && !this->ignore_charge ){ if( this->charge && !this->ignore_charge ){
cartesian_coords.at(3) = configuration.first.at(idx); cartesian_coords.at(3) = configuration.first.at(idx);
// std::cout << "d[" << 3 << "] = i[" << idx << "](" << configuration.first.at(idx) << ") " ;
idx++; idx++;
} }
// std::cout << std::endl;
if(this->ignore_charge && this->charge) { if(this->ignore_charge && this->charge) {
idx++; //skips charge - TODO add support for charge! idx++; //skips charge - TODO add support for charge!
...@@ -270,30 +233,18 @@ void lib4neuro::XYZReader::transform_input_to_acsf(std::unordered_map<ELEMENT_SY ...@@ -270,30 +233,18 @@ void lib4neuro::XYZReader::transform_input_to_acsf(std::unordered_map<ELEMENT_SY
particles.emplace_back(std::make_pair(el, cartesian_coords)); particles.emplace_back(std::make_pair(el, cartesian_coords));
} }
// std::cout << "C" << std::endl;
/* Transform Cartesian coordinates into ACSFs */ /* Transform Cartesian coordinates into ACSFs */
std::vector<double> single_particle_coords; std::vector<double> single_particle_coords;
std::vector<std::pair<ELEMENT_SYMBOL, std::vector<double>>> acsf_coords_prep; std::vector<std::pair<ELEMENT_SYMBOL, std::vector<double>>> acsf_coords_prep;
for(size_t i = 0; i < particles.size(); i++) { /* Iterate over all the particles */ for(size_t i = 0; i < particles.size(); i++) { /* Iterate over all the particles */
single_particle_coords.clear(); single_particle_coords.clear();
// std::cout << "D" << std::endl;
/* Compute vector of ACSF coordinates for a single particle */ /* Compute vector of ACSF coordinates for a single particle */
for (auto sym_func : *element_description[particles.at(i).first]->getSymmetryFunctions()) { for (auto sym_func : *element_description[particles.at(i).first]->getSymmetryFunctions()) {
// std::cout << "E1" << std::endl;
single_particle_coords.emplace_back(sym_func->eval(i, particles)); single_particle_coords.emplace_back(sym_func->eval(i, particles));
// std::cout << "E2" << std::endl;
}