diff --git a/mert/Data.cpp b/mert/Data.cpp index e568494b6..7647975d4 100644 --- a/mert/Data.cpp +++ b/mert/Data.cpp @@ -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; diff --git a/mert/Optimizer.cpp b/mert/Optimizer.cpp index 040d60e60..f5c565fd6 100644 --- a/mert/Optimizer.cpp +++ b/mert/Optimizer.cpp @@ -14,18 +14,14 @@ static const float MAX_FLOAT=numeric_limits::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 i2O,vector start, unsigned int nrandom):scorer(NULL),FData(NULL),number_of_random_directions(nrandom) @@ -49,11 +45,7 @@ Optimizer::Optimizer(unsigned Pd,vector i2O,vector start, } }; -Optimizer::~Optimizer() -{ - delete scorer; - delete FData; -} +Optimizer::~Optimizer() {} statscore_t Optimizer::GetStatScore(const Point& param)const { diff --git a/mert/Optimizer.h b/mert/Optimizer.h index 9920be77f..75b44be55 100644 --- a/mert/Optimizer.h +++ b/mert/Optimizer.h @@ -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 i2O,vector 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 { diff --git a/mert/ScorerFactory.h b/mert/ScorerFactory.h index 9bab8d933..18963b529 100644 --- a/mert/ScorerFactory.h +++ b/mert/ScorerFactory.h @@ -22,9 +22,8 @@ using namespace std; class ScorerFactory { - public: - vector getTypes() { + static vector getTypes() { vector 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 diff --git a/mert/evaluator.cpp b/mert/evaluator.cpp index f766fb19f..e4625382e 100644 --- a/mert/evaluator.cpp +++ b/mert/evaluator.cpp @@ -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::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; diff --git a/mert/extractor.cpp b/mert/extractor.cpp index a8bc450af..f09c2f01b 100644 --- a/mert/extractor.cpp +++ b/mert/extractor.cpp @@ -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) diff --git a/mert/mert.cpp b/mert/mert.cpp index 128398b9b..63c12890d 100755 --- a/mert/mert.cpp +++ b/mert/mert.cpp @@ -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& 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<resetOptimizer(); + for (size_t j = 0; j < allTasks[i].size(); ++j) { + delete allTasks[i][j]; + } + } + + delete TheScorer; PrintUserTime("Stopping..."); }