Fix memory leaks in mert.

This commit is contained in:
Tetsuo Kiso 2011-11-11 20:40:59 +09:00
parent 85d39d7d42
commit c2121695c2
7 changed files with 47 additions and 34 deletions

View File

@ -30,9 +30,11 @@ Data::Data(Scorer& ptr):
Data::~Data() {
if (featdata) {
delete featdata;
featdata = NULL;
}
if (scoredata) {
delete scoredata;
scoredata = NULL;
}
}
@ -284,9 +286,8 @@ void Data::createShards(size_t shard_count, float shard_size, const string& scor
shard_contents.push_back(rand() % data_size);
}
}
ScorerFactory SF;
Scorer* scorer = SF.getScorer(score_type, scorerconfig);
Scorer* scorer = ScorerFactory::getScorer(score_type, scorerconfig);
shards.push_back(Data(*scorer));
shards.back().score_type = score_type;

View File

@ -14,18 +14,14 @@ static const float MAX_FLOAT=numeric_limits<float>::max();
void Optimizer::SetScorer(Scorer *S)
void Optimizer::SetScorer(Scorer *_scorer)
{
if(scorer)
delete scorer;
scorer=S;
scorer = _scorer;
}
void Optimizer::SetFData(FeatureData *F)
void Optimizer::SetFData(FeatureData *_FData)
{
if(FData)
delete FData;
FData=F;
FData = _FData;
};
Optimizer::Optimizer(unsigned Pd,vector<unsigned> i2O,vector<parameter_t> start, unsigned int nrandom):scorer(NULL),FData(NULL),number_of_random_directions(nrandom)
@ -49,11 +45,7 @@ Optimizer::Optimizer(unsigned Pd,vector<unsigned> i2O,vector<parameter_t> start,
}
};
Optimizer::~Optimizer()
{
delete scorer;
delete FData;
}
Optimizer::~Optimizer() {}
statscore_t Optimizer::GetStatScore(const Point& param)const
{

View File

@ -16,13 +16,14 @@ using namespace std;
class Optimizer
{
protected:
Scorer * scorer; //no accessor for them only child can use them
FeatureData * FData;//no accessor for them only child can use them
Scorer *scorer; //no accessor for them only child can use them
FeatureData *FData;//no accessor for them only child can use them
unsigned int number_of_random_directions;
public:
Optimizer(unsigned Pd,vector<unsigned> i2O,vector<parameter_t> start,unsigned int nrandom);
void SetScorer(Scorer *S);
void SetFData(FeatureData *F);
void SetScorer(Scorer *_scorer);
void SetFData(FeatureData *_FData);
virtual ~Optimizer();
unsigned size()const {

View File

@ -22,9 +22,8 @@ using namespace std;
class ScorerFactory
{
public:
vector<string> getTypes() {
static vector<string> getTypes() {
vector<string> types;
types.push_back(string("BLEU"));
types.push_back(string("PER"));
@ -34,7 +33,7 @@ public:
return types;
}
Scorer* getScorer(const string& type, const string& config = "") {
static Scorer* getScorer(const string& type, const string& config = "") {
if (type == "BLEU") {
return (BleuScorer*) new BleuScorer(config);
} else if (type == "PER") {
@ -49,6 +48,10 @@ public:
throw runtime_error("Unknown scorer type: " + type);
}
}
private:
ScorerFactory() {}
~ScorerFactory() {}
};
#endif //__SCORER_FACTORY_H

View File

@ -110,13 +110,12 @@ int main(int argc, char** argv)
if (candidate.length() == 0) throw runtime_error("You have to specify at least one candidate file.");
split(candidate,',',candFiles);
ScorerFactory sfactory;
scorer = sfactory.getScorer(scorerType,scorerConfig);
scorer = ScorerFactory::getScorer(scorerType,scorerConfig);
cerr << "Using scorer: " << scorer->getName() << endl;
scorer->setReferenceFiles(refFiles);
PrintUserTime("Reference files loaded");
for (vector<string>::const_iterator it = candFiles.begin(); it != candFiles.end(); ++it)
{
@ -125,6 +124,8 @@ int main(int argc, char** argv)
PrintUserTime("Evaluation done");
delete scorer;
return EXIT_SUCCESS;
} catch (const exception& e) {
cerr << "Exception: " << e.what() << endl;

View File

@ -175,8 +175,8 @@ int main(int argc, char** argv)
else cerr << "Binary write mode is NOT selected" << endl;
TRACE_ERR("Scorer type: " << scorerType << endl);
ScorerFactory sfactory;
Scorer* scorer = sfactory.getScorer(scorerType,scorerConfig);
// ScorerFactory sfactory;
Scorer* scorer = ScorerFactory::getScorer(scorerType,scorerConfig);
//load references
if (referenceFiles.size() > 0)

View File

@ -81,12 +81,21 @@ int option_index;
/**
* Runs an optimisation, or a random restart.
**/
class OptimizationTask : public Moses::Task
class OptimizationTask : public Moses::Task
{
public:
OptimizationTask(Optimizer* optimizer, const Point& point) :
m_optimizer(optimizer), m_point(point) {}
~OptimizationTask() {}
void resetOptimizer() {
if (m_optimizer) {
delete m_optimizer;
m_optimizer = NULL;
}
}
bool DeleteAfterExecution() {
return false;
}
@ -291,8 +300,7 @@ int main (int argc, char **argv)
}
//it make sense to know what parameter set were used to generate the nbest
ScorerFactory SF;
Scorer *TheScorer=SF.getScorer(scorertype,scorerconfig);
Scorer *TheScorer = ScorerFactory::getScorer(scorertype,scorerconfig);
//load data
Data D(*TheScorer);
@ -381,12 +389,12 @@ int main (int argc, char **argv)
Data& data = D;
if (shard_count) data = shards[i]; //use the sharded data if it exists
vector<OptimizationTask*>& tasks = allTasks[i];
Optimizer *O=OptimizerFactory::BuildOptimizer(pdim,tooptimize,start_list[0],type,nrandom);
Optimizer *O = OptimizerFactory::BuildOptimizer(pdim,tooptimize,start_list[0],type,nrandom);
O->SetScorer(data.getScorer());
O->SetFData(data.getFeatureData());
//A task for each start point
for (size_t j = 0; j < startingPoints.size(); ++j) {
OptimizationTask* task = new OptimizationTask(O,startingPoints[j]);
OptimizationTask* task = new OptimizationTask(O, startingPoints[j]);
tasks.push_back(task);
#ifdef WITH_THREADS
pool.Submit(task);
@ -417,7 +425,6 @@ int main (int argc, char **argv)
bestP = allTasks[i][j]->getPoint();
best = score;
}
delete allTasks[i][j];
}
mean/=(float)ntry;
@ -447,5 +454,13 @@ int main (int argc, char **argv)
ofstream res("weights.txt");
res<<finalP<<endl;
for (size_t i = 0; i < allTasks.size(); ++i) {
allTasks[i][0]->resetOptimizer();
for (size_t j = 0; j < allTasks[i].size(); ++j) {
delete allTasks[i][j];
}
}
delete TheScorer;
PrintUserTime("Stopping...");
}