Program Listing for File output_collector.h

Return to documentation for file (src/translator/output_collector.h)

#pragma once

#include "common/definitions.h"
#include "common/file_stream.h"

#include <mutex>
#include <iostream>
#include <map>

namespace marian {

class PrintingStrategy {
public:
  virtual ~PrintingStrategy() {}
  virtual bool shouldBePrinted(long) = 0;
};

class DefaultPrinting : public PrintingStrategy {
public:
  bool shouldBePrinted(long) override { return true; }
};

class QuietPrinting : public PrintingStrategy {
public:
  bool shouldBePrinted(long) override { return false; }
};

class GeometricPrinting : public PrintingStrategy {
public:
  bool shouldBePrinted(long id) override {
    if(id == 0)
      next_ = (long)start_;
    if(id <= 5)
      return true;
    if(next_ == id) {
      next_ += next_;
      return true;
    }
    return false;
  }

private:
  size_t start_{10};
  long next_{10};
};

class OutputCollector {
public:
  OutputCollector();
  OutputCollector(std::string outFile);

  template <class T>
  OutputCollector(T&& arg) : nextId_(0), outStrm_(new io::OutputFileStream(arg)) {}

  OutputCollector(const OutputCollector&) = delete;

  void Write(long sourceId,
             const std::string& best1,
             const std::string& bestn,
             bool nbest);

  void setPrintingStrategy(Ptr<PrintingStrategy> strategy) {
    printing_ = strategy;
  }

protected:
  typedef std::map<long, std::pair<std::string, std::string>> Outputs;
  Outputs outputs_;
  long nextId_;
  UPtr<std::ostream> outStrm_;
  Ptr<PrintingStrategy> printing_;
  std::mutex mutex_;
};

class StringCollector {
public:
  StringCollector(bool quiet = false);
  StringCollector(const StringCollector&) = delete;

  void add(long sourceId, const std::string& best1, const std::string& bestn);
  std::vector<std::string> collect(bool nbest);

protected:
  long maxId_;  // the largest index of the translated source sentences
  bool quiet_;  // if true do not log best translations
  std::mutex mutex_;

  typedef std::map<long, std::pair<std::string, std::string>> Outputs;
  Outputs outputs_;
};
}  // namespace marian