File size: 3,214 Bytes
158b61b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
 * TargetPhraseImpl.cpp
 *
 *  Created on: 23 Oct 2015
 *      Author: hieu
 */

#include <stdlib.h>
#include "TargetPhraseImpl.h"
#include "../Scores.h"
#include "../System.h"
#include "../MemPool.h"
#include "../PhraseBased/Manager.h"
#include "../AlignmentInfoCollection.h"
#include "../TranslationModel/PhraseTable.h"

using namespace std;

namespace Moses2
{
namespace SCFG
{

TargetPhraseImpl *TargetPhraseImpl::CreateFromString(MemPool &pool,
    const PhraseTable &pt, const System &system, const std::string &str)
{
  //cerr << "str=" << str << endl;
  FactorCollection &vocab = system.GetVocab();

  vector<string> toks = Tokenize(str);
  size_t size = toks.size() - 1;
  TargetPhraseImpl *ret =
    new (pool.Allocate<TargetPhraseImpl>()) TargetPhraseImpl(pool, pt, system,
        size);

  for (size_t i = 0; i < size; ++i) {
    SCFG::Word &word = (*ret)[i];
    word.CreateFromString(vocab, system, toks[i]);
  }

  // lhs
  ret->lhs.CreateFromString(vocab, system, toks.back());
  //cerr << "ret=" << *ret << endl;
  return ret;
}

TargetPhraseImpl::TargetPhraseImpl(MemPool &pool,
                                   const PhraseTable &pt,
                                   const System &system,
                                   size_t size)
  :Moses2::TargetPhrase<SCFG::Word>(pool, pt, system, size)
  ,m_alignNonTerm(&AlignmentInfoCollection::Instance().GetEmptyAlignmentInfo())

{
  m_scores = new (pool.Allocate<Scores>()) Scores(system, pool,
      system.featureFunctions.GetNumScores());

}

TargetPhraseImpl::~TargetPhraseImpl()
{
  // TODO Auto-generated destructor stub
}

std::string TargetPhraseImpl::Debug(const System &system) const
{
  stringstream out;
  out << lhs.Debug(system);
  out << " -> ";
  for (size_t i = 0; i < GetSize(); ++i) {
    const SCFG::Word &word = (*this)[i];
    out << word.Debug(system) << " ";
  }
  out << "pt=" << pt.GetName();
  out << " SCORES:" << GetScores().Debug(system);
  out << " ALIGN-T:";
  out << GetAlignTerm().Debug(system);
  out << " ALIGN-NT:";
  out << GetAlignNonTerm().Debug(system);

  return out.str();
}

void TargetPhraseImpl::SetAlignmentInfo(const std::string &alignString)
{
  AlignmentInfo::CollType alignTerm, alignNonTerm;

  vector<string> toks = Tokenize(alignString);
  for (size_t i = 0; i < toks.size(); ++i) {
    vector<size_t> alignPair = Tokenize<size_t>(toks[i], "-");
    UTIL_THROW_IF2(alignPair.size() != 2, "Wrong alignment format");

    size_t sourcePos = alignPair[0];
    size_t targetPos = alignPair[1];

    if ((*this)[targetPos].isNonTerminal) {
      alignNonTerm.insert(std::pair<size_t,size_t>(sourcePos, targetPos));
    } else {
      alignTerm.insert(std::pair<size_t,size_t>(sourcePos, targetPos));
    }
  }

  SetAlignTerm(alignTerm);
  SetAlignNonTerm(alignNonTerm);
  //    cerr << "TargetPhrase::SetAlignmentInfo(const StringPiece &alignString) this:|" << *this << "|\n";

  //cerr << "alignTerm=" << alignTerm.size() << endl;
  //cerr << "alignNonTerm=" << alignNonTerm.size() << endl;

}

size_t TargetPhraseImpl::GetNumNonTerms() const
{
  size_t ret = 0;
  for (size_t i = 0; i < GetSize(); ++i) {
    if ((*this)[i].isNonTerminal) {
      ++ret;
    }
  }
  return ret;
}


}
}