Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/moses-smt/mosesdecoder.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHieu Hoang <hieuhoang@gmail.com>2014-09-30 15:25:36 +0400
committerHieu Hoang <hieuhoang@gmail.com>2014-09-30 15:25:36 +0400
commitc40faed0d6b22faa4acd22414d7a893ceca781e0 (patch)
tree6bf08ecd2af005e443e68bc461831ba6f66c2a10 /moses-cmd
parent85261aa190ee8e56cc84f79fbd36561a75ace146 (diff)
separate out class TranslationTask into it's on file
Diffstat (limited to 'moses-cmd')
-rw-r--r--moses-cmd/Jamfile2
-rw-r--r--moses-cmd/Main.cpp327
-rw-r--r--moses-cmd/TranslationTask.cpp296
-rw-r--r--moses-cmd/TranslationTask.h65
4 files changed, 365 insertions, 325 deletions
diff --git a/moses-cmd/Jamfile b/moses-cmd/Jamfile
index 4869d729f..993e0df02 100644
--- a/moses-cmd/Jamfile
+++ b/moses-cmd/Jamfile
@@ -1,4 +1,4 @@
-alias deps : mbr.cpp ..//z ..//boost_iostreams ..//boost_filesystem ../moses//moses ;
+alias deps : mbr.cpp TranslationTask.cpp ..//z ..//boost_iostreams ..//boost_filesystem ../moses//moses ;
exe moses : Main.cpp deps ;
exe lmbrgrid : LatticeMBRGrid.cpp deps ;
diff --git a/moses-cmd/Main.cpp b/moses-cmd/Main.cpp
index 0af4603cb..1aace5401 100644
--- a/moses-cmd/Main.cpp
+++ b/moses-cmd/Main.cpp
@@ -34,22 +34,20 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//#include <vld.h>
#endif
-#include "moses/TranslationAnalysis.h"
#include "moses/IOWrapper.h"
-#include "mbr.h"
-
#include "moses/Hypothesis.h"
#include "moses/HypergraphOutput.h"
#include "moses/Manager.h"
#include "moses/StaticData.h"
+#include "moses/TypeDef.h"
#include "moses/Util.h"
#include "moses/Timer.h"
-#include "moses/ThreadPool.h"
-#include "moses/OutputCollector.h"
#include "moses/TranslationModel/PhraseDictionary.h"
#include "moses/FF/StatefulFeatureFunction.h"
#include "moses/FF/StatelessFeatureFunction.h"
+#include "TranslationTask.h"
+
#ifdef HAVE_PROTOBUF
#include "hypergraph.pb.h"
#endif
@@ -60,325 +58,6 @@ using namespace MosesCmd;
namespace MosesCmd
{
-// output floats with five significant digits
-static const size_t PRECISION = 3;
-
-/** Enforce rounding */
-void fix(std::ostream& stream, size_t size)
-{
- stream.setf(std::ios::fixed);
- stream.precision(size);
-}
-
-/** Translates a sentence.
- * - calls the search (Manager)
- * - applies the decision rule
- * - outputs best translation and additional reporting
- **/
-class TranslationTask : public Task
-{
-
-public:
-
- TranslationTask(size_t lineNumber,
- InputType* source, OutputCollector* outputCollector, OutputCollector* nbestCollector,
- OutputCollector* latticeSamplesCollector,
- OutputCollector* wordGraphCollector, OutputCollector* searchGraphCollector,
- OutputCollector* detailedTranslationCollector,
- OutputCollector* alignmentInfoCollector,
- OutputCollector* unknownsCollector,
- bool outputSearchGraphSLF,
- boost::shared_ptr<HypergraphOutput<Manager> > hypergraphOutput) :
- m_source(source), m_lineNumber(lineNumber),
- m_outputCollector(outputCollector), m_nbestCollector(nbestCollector),
- m_latticeSamplesCollector(latticeSamplesCollector),
- m_wordGraphCollector(wordGraphCollector), m_searchGraphCollector(searchGraphCollector),
- m_detailedTranslationCollector(detailedTranslationCollector),
- m_alignmentInfoCollector(alignmentInfoCollector),
- m_unknownsCollector(unknownsCollector),
- m_outputSearchGraphSLF(outputSearchGraphSLF),
- m_hypergraphOutput(hypergraphOutput) {}
-
- /** Translate one sentence
- * gets called by main function implemented at end of this source file */
- void Run() {
- // shorthand for "global data"
- const StaticData &staticData = StaticData::Instance();
-
- // input sentence
- Sentence sentence;
-
- // report wall time spent on translation
- Timer translationTime;
- translationTime.start();
-
- // report thread number
-#if defined(WITH_THREADS) && defined(BOOST_HAS_PTHREADS)
- TRACE_ERR("Translating line " << m_lineNumber << " in thread id " << pthread_self() << std::endl);
-#endif
-
-
- // execute the translation
- // note: this executes the search, resulting in a search graph
- // we still need to apply the decision rule (MAP, MBR, ...)
- Timer initTime;
- initTime.start();
- Manager manager(m_lineNumber, *m_source,staticData.GetSearchAlgorithm());
- VERBOSE(1, "Line " << m_lineNumber << ": Initialize search took " << initTime << " seconds total" << endl);
- manager.ProcessSentence();
-
- // we are done with search, let's look what we got
- Timer additionalReportingTime;
- additionalReportingTime.start();
-
- // output word graph
- if (m_wordGraphCollector) {
- ostringstream out;
- fix(out,PRECISION);
- manager.GetWordGraph(m_lineNumber, out);
- m_wordGraphCollector->Write(m_lineNumber, out.str());
- }
-
- // output search graph
- if (m_searchGraphCollector) {
- ostringstream out;
- fix(out,PRECISION);
- manager.OutputSearchGraph(m_lineNumber, out);
- m_searchGraphCollector->Write(m_lineNumber, out.str());
-
-#ifdef HAVE_PROTOBUF
- if (staticData.GetOutputSearchGraphPB()) {
- ostringstream sfn;
- sfn << staticData.GetParam("output-search-graph-pb")[0] << '/' << m_lineNumber << ".pb" << ends;
- string fn = sfn.str();
- VERBOSE(2, "Writing search graph to " << fn << endl);
- fstream output(fn.c_str(), ios::trunc | ios::binary | ios::out);
- manager.SerializeSearchGraphPB(m_lineNumber, output);
- }
-#endif
- }
-
- // Output search graph in HTK standard lattice format (SLF)
- if (m_outputSearchGraphSLF) {
- stringstream fileName;
- fileName << staticData.GetParam("output-search-graph-slf")[0] << "/" << m_lineNumber << ".slf";
- std::ofstream *file = new std::ofstream;
- file->open(fileName.str().c_str());
- if (file->is_open() && file->good()) {
- ostringstream out;
- fix(out,PRECISION);
- manager.OutputSearchGraphAsSLF(m_lineNumber, out);
- *file << out.str();
- file -> flush();
- } else {
- TRACE_ERR("Cannot output HTK standard lattice for line " << m_lineNumber << " because the output file is not open or not ready for writing" << std::endl);
- }
- delete file;
- }
-
- // Output search graph in hypergraph format for Kenneth Heafield's lazy hypergraph decoder
- if (m_hypergraphOutput.get()) {
- m_hypergraphOutput->Write(manager);
- }
-
- additionalReportingTime.stop();
-
- // apply decision rule and output best translation(s)
- if (m_outputCollector) {
- ostringstream out;
- ostringstream debug;
- fix(debug,PRECISION);
-
- // all derivations - send them to debug stream
- if (staticData.PrintAllDerivations()) {
- additionalReportingTime.start();
- manager.PrintAllDerivations(m_lineNumber, debug);
- additionalReportingTime.stop();
- }
-
- Timer decisionRuleTime;
- decisionRuleTime.start();
-
- // MAP decoding: best hypothesis
- const Hypothesis* bestHypo = NULL;
- if (!staticData.UseMBR()) {
- bestHypo = manager.GetBestHypothesis();
- if (bestHypo) {
- if (StaticData::Instance().GetOutputHypoScore()) {
- out << bestHypo->GetTotalScore() << ' ';
- }
- if (staticData.IsPathRecoveryEnabled()) {
- OutputInput(out, bestHypo);
- out << "||| ";
- }
- if (staticData.GetParam("print-id").size() && Scan<bool>(staticData.GetParam("print-id")[0]) ) {
- out << m_source->GetTranslationId() << " ";
- }
-
- if (staticData.GetReportSegmentation() == 2) {
- manager.GetOutputLanguageModelOrder(out, bestHypo);
- }
- OutputBestSurface(
- out,
- bestHypo,
- staticData.GetOutputFactorOrder(),
- staticData.GetReportSegmentation(),
- staticData.GetReportAllFactors());
- if (staticData.PrintAlignmentInfo()) {
- out << "||| ";
- OutputAlignment(out, bestHypo);
- }
-
- OutputAlignment(m_alignmentInfoCollector, m_lineNumber, bestHypo);
- IFVERBOSE(1) {
- debug << "BEST TRANSLATION: " << *bestHypo << endl;
- }
- } else {
- VERBOSE(1, "NO BEST TRANSLATION" << endl);
- }
-
- out << endl;
- }
-
- // MBR decoding (n-best MBR, lattice MBR, consensus)
- else {
- // we first need the n-best translations
- size_t nBestSize = staticData.GetMBRSize();
- if (nBestSize <= 0) {
- cerr << "ERROR: negative size for number of MBR candidate translations not allowed (option mbr-size)" << endl;
- exit(1);
- }
- TrellisPathList nBestList;
- manager.CalcNBest(nBestSize, nBestList,true);
- VERBOSE(2,"size of n-best: " << nBestList.GetSize() << " (" << nBestSize << ")" << endl);
- IFVERBOSE(2) {
- PrintUserTime("calculated n-best list for (L)MBR decoding");
- }
-
- // lattice MBR
- if (staticData.UseLatticeMBR()) {
- if (m_nbestCollector) {
- //lattice mbr nbest
- vector<LatticeMBRSolution> solutions;
- size_t n = min(nBestSize, staticData.GetNBestSize());
- getLatticeMBRNBest(manager,nBestList,solutions,n);
- ostringstream out;
- OutputLatticeMBRNBest(out, solutions,m_lineNumber);
- m_nbestCollector->Write(m_lineNumber, out.str());
- } else {
- //Lattice MBR decoding
- vector<Word> mbrBestHypo = doLatticeMBR(manager,nBestList);
- OutputBestHypo(mbrBestHypo, m_lineNumber, staticData.GetReportSegmentation(),
- staticData.GetReportAllFactors(),out);
- IFVERBOSE(2) {
- PrintUserTime("finished Lattice MBR decoding");
- }
- }
- }
-
- // consensus decoding
- else if (staticData.UseConsensusDecoding()) {
- const TrellisPath &conBestHypo = doConsensusDecoding(manager,nBestList);
- OutputBestHypo(conBestHypo, m_lineNumber,
- staticData.GetReportSegmentation(),
- staticData.GetReportAllFactors(),out);
- OutputAlignment(m_alignmentInfoCollector, m_lineNumber, conBestHypo);
- IFVERBOSE(2) {
- PrintUserTime("finished Consensus decoding");
- }
- }
-
- // n-best MBR decoding
- else {
- const Moses::TrellisPath &mbrBestHypo = doMBR(nBestList);
- OutputBestHypo(mbrBestHypo, m_lineNumber,
- staticData.GetReportSegmentation(),
- staticData.GetReportAllFactors(),out);
- OutputAlignment(m_alignmentInfoCollector, m_lineNumber, mbrBestHypo);
- IFVERBOSE(2) {
- PrintUserTime("finished MBR decoding");
- }
- }
- }
-
- // report best translation to output collector
- m_outputCollector->Write(m_lineNumber,out.str(),debug.str());
-
- decisionRuleTime.stop();
- VERBOSE(1, "Line " << m_lineNumber << ": Decision rule took " << decisionRuleTime << " seconds total" << endl);
- }
-
- additionalReportingTime.start();
-
- // output n-best list
- if (m_nbestCollector && !staticData.UseLatticeMBR()) {
- TrellisPathList nBestList;
- ostringstream out;
- manager.CalcNBest(staticData.GetNBestSize(), nBestList,staticData.GetDistinctNBest());
- OutputNBest(out, nBestList, staticData.GetOutputFactorOrder(), m_lineNumber,
- staticData.GetReportSegmentation());
- m_nbestCollector->Write(m_lineNumber, out.str());
- }
-
- //lattice samples
- if (m_latticeSamplesCollector) {
- TrellisPathList latticeSamples;
- ostringstream out;
- manager.CalcLatticeSamples(staticData.GetLatticeSamplesSize(), latticeSamples);
- OutputNBest(out,latticeSamples, staticData.GetOutputFactorOrder(), m_lineNumber,
- staticData.GetReportSegmentation());
- m_latticeSamplesCollector->Write(m_lineNumber, out.str());
- }
-
- // detailed translation reporting
- if (m_detailedTranslationCollector) {
- ostringstream out;
- fix(out,PRECISION);
- TranslationAnalysis::PrintTranslationAnalysis(out, manager.GetBestHypothesis());
- m_detailedTranslationCollector->Write(m_lineNumber,out.str());
- }
-
- //list of unknown words
- if (m_unknownsCollector) {
- const vector<const Phrase*>& unknowns = manager.getSntTranslationOptions()->GetUnknownSources();
- ostringstream out;
- for (size_t i = 0; i < unknowns.size(); ++i) {
- out << *(unknowns[i]);
- }
- out << endl;
- m_unknownsCollector->Write(m_lineNumber, out.str());
- }
-
- // report additional statistics
- manager.CalcDecoderStatistics();
- VERBOSE(1, "Line " << m_lineNumber << ": Additional reporting took " << additionalReportingTime << " seconds total" << endl);
- VERBOSE(1, "Line " << m_lineNumber << ": Translation took " << translationTime << " seconds total" << endl);
- IFVERBOSE(2) {
- PrintUserTime("Sentence Decoding Time:");
- }
- }
-
- ~TranslationTask() {
- delete m_source;
- }
-
-private:
- InputType* m_source;
- size_t m_lineNumber;
- OutputCollector* m_outputCollector;
- OutputCollector* m_nbestCollector;
- OutputCollector* m_latticeSamplesCollector;
- OutputCollector* m_wordGraphCollector;
- OutputCollector* m_searchGraphCollector;
- OutputCollector* m_detailedTranslationCollector;
- OutputCollector* m_alignmentInfoCollector;
- OutputCollector* m_unknownsCollector;
- bool m_outputSearchGraphSLF;
- boost::shared_ptr<HypergraphOutput<Manager> > m_hypergraphOutput;
- std::ofstream *m_alignmentStream;
-
-
-};
static void PrintFeatureWeight(const FeatureFunction* ff)
{
diff --git a/moses-cmd/TranslationTask.cpp b/moses-cmd/TranslationTask.cpp
new file mode 100644
index 000000000..f5864f75e
--- /dev/null
+++ b/moses-cmd/TranslationTask.cpp
@@ -0,0 +1,296 @@
+#include "TranslationTask.h"
+#include "moses/StaticData.h"
+#include "moses/Sentence.h"
+#include "moses/IOWrapper.h"
+#include "moses/TranslationAnalysis.h"
+#include "moses/TypeDef.h"
+#include "moses/Util.h"
+#include "moses/InputType.h"
+#include "moses/OutputCollector.h"
+#include "mbr.h"
+
+using namespace std;
+using namespace Moses;
+
+namespace MosesCmd
+{
+
+TranslationTask::TranslationTask(size_t lineNumber,
+ InputType* source, OutputCollector* outputCollector, OutputCollector* nbestCollector,
+ OutputCollector* latticeSamplesCollector,
+ OutputCollector* wordGraphCollector, OutputCollector* searchGraphCollector,
+ OutputCollector* detailedTranslationCollector,
+ OutputCollector* alignmentInfoCollector,
+ OutputCollector* unknownsCollector,
+ bool outputSearchGraphSLF,
+ boost::shared_ptr<HypergraphOutput<Manager> > hypergraphOutput) :
+ m_source(source), m_lineNumber(lineNumber),
+ m_outputCollector(outputCollector), m_nbestCollector(nbestCollector),
+ m_latticeSamplesCollector(latticeSamplesCollector),
+ m_wordGraphCollector(wordGraphCollector), m_searchGraphCollector(searchGraphCollector),
+ m_detailedTranslationCollector(detailedTranslationCollector),
+ m_alignmentInfoCollector(alignmentInfoCollector),
+ m_unknownsCollector(unknownsCollector),
+ m_outputSearchGraphSLF(outputSearchGraphSLF),
+ m_hypergraphOutput(hypergraphOutput)
+{}
+
+void TranslationTask::Run() {
+ // shorthand for "global data"
+ const StaticData &staticData = StaticData::Instance();
+
+ // input sentence
+ Sentence sentence;
+
+ // report wall time spent on translation
+ Timer translationTime;
+ translationTime.start();
+
+ // report thread number
+#if defined(WITH_THREADS) && defined(BOOST_HAS_PTHREADS)
+ TRACE_ERR("Translating line " << m_lineNumber << " in thread id " << pthread_self() << endl);
+#endif
+
+
+ // execute the translation
+ // note: this executes the search, resulting in a search graph
+ // we still need to apply the decision rule (MAP, MBR, ...)
+ Timer initTime;
+ initTime.start();
+ Manager manager(m_lineNumber, *m_source,staticData.GetSearchAlgorithm());
+ VERBOSE(1, "Line " << m_lineNumber << ": Initialize search took " << initTime << " seconds total" << endl);
+ manager.ProcessSentence();
+
+ // we are done with search, let's look what we got
+ Timer additionalReportingTime;
+ additionalReportingTime.start();
+
+ // output word graph
+ if (m_wordGraphCollector) {
+ ostringstream out;
+ fix(out,PRECISION);
+ manager.GetWordGraph(m_lineNumber, out);
+ m_wordGraphCollector->Write(m_lineNumber, out.str());
+ }
+
+ // output search graph
+ if (m_searchGraphCollector) {
+ ostringstream out;
+ fix(out,PRECISION);
+ manager.OutputSearchGraph(m_lineNumber, out);
+ m_searchGraphCollector->Write(m_lineNumber, out.str());
+
+#ifdef HAVE_PROTOBUF
+ if (staticData.GetOutputSearchGraphPB()) {
+ ostringstream sfn;
+ sfn << staticData.GetParam("output-search-graph-pb")[0] << '/' << m_lineNumber << ".pb" << ends;
+ string fn = sfn.str();
+ VERBOSE(2, "Writing search graph to " << fn << endl);
+ fstream output(fn.c_str(), ios::trunc | ios::binary | ios::out);
+ manager.SerializeSearchGraphPB(m_lineNumber, output);
+ }
+#endif
+ }
+
+ // Output search graph in HTK standard lattice format (SLF)
+ if (m_outputSearchGraphSLF) {
+ stringstream fileName;
+ fileName << staticData.GetParam("output-search-graph-slf")[0] << "/" << m_lineNumber << ".slf";
+ ofstream *file = new ofstream;
+ file->open(fileName.str().c_str());
+ if (file->is_open() && file->good()) {
+ ostringstream out;
+ fix(out,PRECISION);
+ manager.OutputSearchGraphAsSLF(m_lineNumber, out);
+ *file << out.str();
+ file -> flush();
+ } else {
+ TRACE_ERR("Cannot output HTK standard lattice for line " << m_lineNumber << " because the output file is not open or not ready for writing" << endl);
+ }
+ delete file;
+ }
+
+ // Output search graph in hypergraph format for Kenneth Heafield's lazy hypergraph decoder
+ if (m_hypergraphOutput.get()) {
+ m_hypergraphOutput->Write(manager);
+ }
+
+ additionalReportingTime.stop();
+
+ // apply decision rule and output best translation(s)
+ if (m_outputCollector) {
+ ostringstream out;
+ ostringstream debug;
+ fix(debug,PRECISION);
+
+ // all derivations - send them to debug stream
+ if (staticData.PrintAllDerivations()) {
+ additionalReportingTime.start();
+ manager.PrintAllDerivations(m_lineNumber, debug);
+ additionalReportingTime.stop();
+ }
+
+ Timer decisionRuleTime;
+ decisionRuleTime.start();
+
+ // MAP decoding: best hypothesis
+ const Hypothesis* bestHypo = NULL;
+ if (!staticData.UseMBR()) {
+ bestHypo = manager.GetBestHypothesis();
+ if (bestHypo) {
+ if (StaticData::Instance().GetOutputHypoScore()) {
+ out << bestHypo->GetTotalScore() << ' ';
+ }
+ if (staticData.IsPathRecoveryEnabled()) {
+ OutputInput(out, bestHypo);
+ out << "||| ";
+ }
+ if (staticData.GetParam("print-id").size() && Scan<bool>(staticData.GetParam("print-id")[0]) ) {
+ out << m_source->GetTranslationId() << " ";
+ }
+
+ if (staticData.GetReportSegmentation() == 2) {
+ manager.GetOutputLanguageModelOrder(out, bestHypo);
+ }
+ OutputBestSurface(
+ out,
+ bestHypo,
+ staticData.GetOutputFactorOrder(),
+ staticData.GetReportSegmentation(),
+ staticData.GetReportAllFactors());
+ if (staticData.PrintAlignmentInfo()) {
+ out << "||| ";
+ OutputAlignment(out, bestHypo);
+ }
+
+ OutputAlignment(m_alignmentInfoCollector, m_lineNumber, bestHypo);
+ IFVERBOSE(1) {
+ debug << "BEST TRANSLATION: " << *bestHypo << endl;
+ }
+ } else {
+ VERBOSE(1, "NO BEST TRANSLATION" << endl);
+ }
+
+ out << endl;
+ }
+
+ // MBR decoding (n-best MBR, lattice MBR, consensus)
+ else {
+ // we first need the n-best translations
+ size_t nBestSize = staticData.GetMBRSize();
+ if (nBestSize <= 0) {
+ cerr << "ERROR: negative size for number of MBR candidate translations not allowed (option mbr-size)" << endl;
+ exit(1);
+ }
+ TrellisPathList nBestList;
+ manager.CalcNBest(nBestSize, nBestList,true);
+ VERBOSE(2,"size of n-best: " << nBestList.GetSize() << " (" << nBestSize << ")" << endl);
+ IFVERBOSE(2) {
+ PrintUserTime("calculated n-best list for (L)MBR decoding");
+ }
+
+ // lattice MBR
+ if (staticData.UseLatticeMBR()) {
+ if (m_nbestCollector) {
+ //lattice mbr nbest
+ vector<LatticeMBRSolution> solutions;
+ size_t n = min(nBestSize, staticData.GetNBestSize());
+ getLatticeMBRNBest(manager,nBestList,solutions,n);
+ ostringstream out;
+ OutputLatticeMBRNBest(out, solutions,m_lineNumber);
+ m_nbestCollector->Write(m_lineNumber, out.str());
+ } else {
+ //Lattice MBR decoding
+ vector<Word> mbrBestHypo = doLatticeMBR(manager,nBestList);
+ OutputBestHypo(mbrBestHypo, m_lineNumber, staticData.GetReportSegmentation(),
+ staticData.GetReportAllFactors(),out);
+ IFVERBOSE(2) {
+ PrintUserTime("finished Lattice MBR decoding");
+ }
+ }
+ }
+
+ // consensus decoding
+ else if (staticData.UseConsensusDecoding()) {
+ const TrellisPath &conBestHypo = doConsensusDecoding(manager,nBestList);
+ OutputBestHypo(conBestHypo, m_lineNumber,
+ staticData.GetReportSegmentation(),
+ staticData.GetReportAllFactors(),out);
+ OutputAlignment(m_alignmentInfoCollector, m_lineNumber, conBestHypo);
+ IFVERBOSE(2) {
+ PrintUserTime("finished Consensus decoding");
+ }
+ }
+
+ // n-best MBR decoding
+ else {
+ const TrellisPath &mbrBestHypo = doMBR(nBestList);
+ OutputBestHypo(mbrBestHypo, m_lineNumber,
+ staticData.GetReportSegmentation(),
+ staticData.GetReportAllFactors(),out);
+ OutputAlignment(m_alignmentInfoCollector, m_lineNumber, mbrBestHypo);
+ IFVERBOSE(2) {
+ PrintUserTime("finished MBR decoding");
+ }
+ }
+ }
+
+ // report best translation to output collector
+ m_outputCollector->Write(m_lineNumber,out.str(),debug.str());
+
+ decisionRuleTime.stop();
+ VERBOSE(1, "Line " << m_lineNumber << ": Decision rule took " << decisionRuleTime << " seconds total" << endl);
+ }
+
+ additionalReportingTime.start();
+
+ // output n-best list
+ if (m_nbestCollector && !staticData.UseLatticeMBR()) {
+ TrellisPathList nBestList;
+ ostringstream out;
+ manager.CalcNBest(staticData.GetNBestSize(), nBestList,staticData.GetDistinctNBest());
+ OutputNBest(out, nBestList, staticData.GetOutputFactorOrder(), m_lineNumber,
+ staticData.GetReportSegmentation());
+ m_nbestCollector->Write(m_lineNumber, out.str());
+ }
+
+ //lattice samples
+ if (m_latticeSamplesCollector) {
+ TrellisPathList latticeSamples;
+ ostringstream out;
+ manager.CalcLatticeSamples(staticData.GetLatticeSamplesSize(), latticeSamples);
+ OutputNBest(out,latticeSamples, staticData.GetOutputFactorOrder(), m_lineNumber,
+ staticData.GetReportSegmentation());
+ m_latticeSamplesCollector->Write(m_lineNumber, out.str());
+ }
+
+ // detailed translation reporting
+ if (m_detailedTranslationCollector) {
+ ostringstream out;
+ fix(out,PRECISION);
+ TranslationAnalysis::PrintTranslationAnalysis(out, manager.GetBestHypothesis());
+ m_detailedTranslationCollector->Write(m_lineNumber,out.str());
+ }
+
+ //list of unknown words
+ if (m_unknownsCollector) {
+ const vector<const Phrase*>& unknowns = manager.getSntTranslationOptions()->GetUnknownSources();
+ ostringstream out;
+ for (size_t i = 0; i < unknowns.size(); ++i) {
+ out << *(unknowns[i]);
+ }
+ out << endl;
+ m_unknownsCollector->Write(m_lineNumber, out.str());
+ }
+
+ // report additional statistics
+ manager.CalcDecoderStatistics();
+ VERBOSE(1, "Line " << m_lineNumber << ": Additional reporting took " << additionalReportingTime << " seconds total" << endl);
+ VERBOSE(1, "Line " << m_lineNumber << ": Translation took " << translationTime << " seconds total" << endl);
+ IFVERBOSE(2) {
+ PrintUserTime("Sentence Decoding Time:");
+ }
+}
+
+
+}
diff --git a/moses-cmd/TranslationTask.h b/moses-cmd/TranslationTask.h
new file mode 100644
index 000000000..84a6a8bf5
--- /dev/null
+++ b/moses-cmd/TranslationTask.h
@@ -0,0 +1,65 @@
+#pragma once
+
+#include <boost/smart_ptr/shared_ptr.hpp>
+#include "moses/ThreadPool.h"
+#include "moses/Manager.h"
+#include "moses/HypergraphOutput.h"
+
+namespace Moses
+{
+ class InputType;
+ class OutputCollector;
+}
+
+namespace MosesCmd
+{
+
+/** Translates a sentence.
+ * - calls the search (Manager)
+ * - applies the decision rule
+ * - outputs best translation and additional reporting
+ **/
+class TranslationTask : public Moses::Task
+{
+
+public:
+
+ TranslationTask(size_t lineNumber,
+ Moses::InputType* source, Moses::OutputCollector* outputCollector, Moses::OutputCollector* nbestCollector,
+ Moses::OutputCollector* latticeSamplesCollector,
+ Moses::OutputCollector* wordGraphCollector, Moses::OutputCollector* searchGraphCollector,
+ Moses::OutputCollector* detailedTranslationCollector,
+ Moses::OutputCollector* alignmentInfoCollector,
+ Moses::OutputCollector* unknownsCollector,
+ bool outputSearchGraphSLF,
+ boost::shared_ptr<Moses::HypergraphOutput<Moses::Manager> > hypergraphOutput);
+
+ ~TranslationTask() {
+ delete m_source;
+ }
+
+ /** Translate one sentence
+ * gets called by main function implemented at end of this source file */
+ void Run();
+
+
+private:
+ Moses::InputType* m_source;
+ size_t m_lineNumber;
+ Moses::OutputCollector* m_outputCollector;
+ Moses::OutputCollector* m_nbestCollector;
+ Moses::OutputCollector* m_latticeSamplesCollector;
+ Moses::OutputCollector* m_wordGraphCollector;
+ Moses::OutputCollector* m_searchGraphCollector;
+ Moses::OutputCollector* m_detailedTranslationCollector;
+ Moses::OutputCollector* m_alignmentInfoCollector;
+ Moses::OutputCollector* m_unknownsCollector;
+ bool m_outputSearchGraphSLF;
+ boost::shared_ptr<Moses::HypergraphOutput<Moses::Manager> > m_hypergraphOutput;
+ std::ofstream *m_alignmentStream;
+
+
+};
+
+
+} //namespace