Skip to content
Snippets Groups Projects
Commit 93618442 authored by Giovanni Bussi's avatar Giovanni Bussi
Browse files

unique_ptr: Pamm

parent 96a4d6e2
No related branches found
No related tags found
No related merge requests found
......@@ -37,11 +37,7 @@ PammObject::PammObject( const PammObject& in ):
min(in.min),
max(in.max)
{
for(unsigned i=0; i<in.kernels.size(); ++i) kernels.push_back( new KernelFunctions( in.kernels[i] ) );
}
PammObject::~PammObject() {
for(unsigned i=0; i<kernels.size(); ++i) delete kernels[i];
for(unsigned i=0; i<in.kernels.size(); ++i) kernels.emplace_back( new KernelFunctions( in.kernels[i].get() ) );
}
void PammObject::setup( const std::string& filename, const double& reg, const std::vector<std::string>& valnames,
......@@ -53,13 +49,13 @@ void PammObject::setup( const std::string& filename, const double& reg, const st
return;
}
std::vector<Value*> pos;
std::vector<std::unique_ptr<Value>> pos;
pbc.resize( valnames.size() );
min.resize( valnames.size() );
max.resize( valnames.size() );
for(unsigned i=0; i<valnames.size(); ++i) {
pbc[i]=pbcin[i]; min[i]=imin[i]; max[i]=imax[i];
pos.push_back( new Value() );
pos.emplace_back( new Value() );
if( !pbc[i] ) pos[i]->setNotPeriodic();
else pos[i]->setDomain( min[i], max[i] );
}
......@@ -68,29 +64,30 @@ void PammObject::setup( const std::string& filename, const double& reg, const st
for(unsigned k=0;; ++k) {
std::unique_ptr<KernelFunctions> kk = KernelFunctions::read( &ifile, false, valnames );
if( !kk ) break ;
kk->normalize( pos );
kernels.push_back( kk.release() ); // kernels should be changed into a vector<unique_ptr>.
// meanwhile, I just release the unique_ptr herelease the unique_ptr here. GB
kk->normalize( Tools::unique2raw( pos ) );
kernels.emplace_back( std::move(kk) );
ifile.scanField();
}
ifile.close();
for(unsigned i=0; i<valnames.size(); ++i) delete pos[i];
}
void PammObject::evaluate( const std::vector<double>& invar, std::vector<double>& outvals, std::vector<std::vector<double> >& der ) const {
std::vector<Value*> pos;
std::vector<std::unique_ptr<Value>> pos;
for(unsigned i=0; i<pbc.size(); ++i) {
pos.push_back( new Value() );
pos.emplace_back( new Value() );
if( !pbc[i] ) pos[i]->setNotPeriodic();
else pos[i]->setDomain( min[i], max[i] );
// And set the value
pos[i]->set( invar[i] );
}
// convert pointers once
auto pos_ptr=Tools::unique2raw(pos);
// Evaluate the set of kernels
double denom=regulariser; std::vector<double> dderiv( der[0].size(), 0 );
for(unsigned i=0; i<kernels.size(); ++i) {
outvals[i]=kernels[i]->evaluate( pos, der[i] ); denom+=outvals[i];
outvals[i]=kernels[i]->evaluate( pos_ptr, der[i] ); denom+=outvals[i];
for(unsigned j=0; j<der[i].size(); ++j) dderiv[j] += der[i][j];
}
// Evaluate the set of derivatives
......@@ -99,7 +96,6 @@ void PammObject::evaluate( const std::vector<double>& invar, std::vector<double>
for(unsigned j=0; j<der[i].size(); ++j) der[i][j]=der[i][j]/denom - outvals[i]*dderiv[j]/denom;
}
for(unsigned i=0; i<pbc.size(); ++i) delete pos[i];
}
......
......@@ -38,12 +38,11 @@ private:
/// The domain of the function
std::vector<std::string> min, max;
/// List of kernel functions involved
std::vector<KernelFunctions*> kernels;
std::vector<std::unique_ptr<KernelFunctions>> kernels;
public:
// Explicit definitions for constructor, copy constructor and destructor
PammObject();
PammObject( const PammObject& );
~PammObject();
PammObject operator=(const PammObject& po) { plumed_error(); regulariser=po.regulariser; return PammObject(); }
/// Setup the Pamm object
void setup( const std::string& filename, const double& reg, const std::vector<std::string>& valnames,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment