mirror of
https://github.com/moses-smt/mosesdecoder.git
synced 2024-10-26 11:28:48 +03:00
Fix memory leaks in mert.
This commit is contained in:
parent
85d39d7d42
commit
c2121695c2
@ -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;
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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...");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user