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

Lattice.cpp « phrase-extract.5 « training « scripts - github.com/moses-smt/mosesdecoder.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 32b0508e6e4dd03c4a3145feca6a3cac011275ae (plain)
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
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 *  Lattice.cpp
 *  extract
 *
 *  Created by Hieu Hoang on 18/07/2010.
 *  Copyright 2010 __MyCompanyName__. All rights reserved.
 *
 */

#include <cassert>
#include "Lattice.h"
#include "LatticeNode.h"
#include "Tunnel.h"
#include "TunnelCollection.h"
#include "SyntaxTree.h"
#include "SentenceAlignment.h"
#include "tables-core.h"
#include "Rule.h"
#include "RuleCollection.h"

using namespace std;

Lattice::Lattice(size_t sourceSize)
:m_stacks(sourceSize + 1)
{
}

Lattice::~Lattice()
{
	std::vector<Stack>::iterator iterStack;
	for (iterStack = m_stacks.begin(); iterStack != m_stacks.end(); ++iterStack)
	{
		Stack &stack = *iterStack;
		RemoveAllInColl(stack);
	}	
}

void Lattice::CreateArcs(size_t startPos, const TunnelCollection &holeColl, const SentenceAlignment &sentence, const Global &global)
{	
	for (size_t endPos = startPos + 1; endPos <= sentence.source.size(); ++endPos)
	{
		const TunnelList &holes = holeColl.GetHoles(startPos, endPos - 1);
		
		TunnelList::const_iterator iterHole;
		for (iterHole = holes.begin(); iterHole != holes.end(); ++iterHole)
		{
			const Tunnel &hole = *iterHole;
			CreateArcsUsing1Hole(hole, sentence, global);
		}
	}
}

void Lattice::CreateArcsUsing1Hole(const Tunnel &hole, const SentenceAlignment &sentence, const Global &global)
{
	size_t startPos	= hole.GetStart(0)
				, endPos	= hole.GetEnd(0) + 1; // lattice indexing
	size_t numSymbols = endPos - startPos;
	
	Stack &startStack = GetStack(startPos);

	// do terminals 1st
	assert(numSymbols > 0);
	
	if (numSymbols <= global.maxSymbolsSource)
	{
		LatticeNode *node = new LatticeNode(hole, &sentence);
		startStack.push_back(node);
	}
	
	// non-terms. cartesian product of source & target labels
	assert(startPos == hole.GetStart(0) && endPos - 1 == hole.GetEnd(0));
	size_t startT	= hole.GetStart(1)
				,endT		= hole.GetEnd(1);
	
	const SyntaxNodes &nodesS = sentence.sourceTree.GetNodes(startPos, endPos - 1);
	const SyntaxNodes &nodesT = sentence.targetTree.GetNodes(startT, endT );

	SyntaxNodes::const_iterator iterS, iterT;
	for (iterS = nodesS.begin(); iterS != nodesS.end(); ++iterS)
	{
		const SyntaxNode *syntaxNodeS = *iterS;
		
		for (iterT = nodesT.begin(); iterT != nodesT.end(); ++iterT)
		{
			const SyntaxNode *syntaxNodeT = *iterT;
			
			bool isSyntax = syntaxNodeS->IsSyntax() || syntaxNodeT->IsSyntax();
			size_t maxSourceNonTermSpan = isSyntax ? global.maxHoleSpanSourceSyntax : global.maxHoleSpanSourceDefault;
			
			if (maxSourceNonTermSpan >= endPos - startPos)
			{				
				LatticeNode *node = new LatticeNode(hole, syntaxNodeS, syntaxNodeT);
				startStack.push_back(node);
			}
		}
	}
}

Stack &Lattice::GetStack(size_t startPos)
{
	assert(startPos < m_stacks.size());
	return m_stacks[startPos];
}

const Stack &Lattice::GetStack(size_t startPos) const
{
	assert(startPos < m_stacks.size());
	return m_stacks[startPos];
}

void Lattice::CreateRules(size_t startPos, const SentenceAlignment &sentence, const Global &global)
{
	const Stack &startStack = GetStack(startPos);
	
	Stack::const_iterator iterStack;
	for (iterStack = startStack.begin(); iterStack != startStack.end(); ++iterStack)
	{
		const LatticeNode *node = *iterStack;
		Rule *initRule = new Rule(node);
		
		if (initRule->CanRecurse(global, *sentence.holeCollection))
		{ // may or maynot be valid, but can continue to build on this rule
			initRule->CreateRules(m_rules, *this, sentence, global);
		}

		if (initRule->IsValid(global, *sentence.holeCollection))
		{ // add to rule collection
			m_rules.Add(initRule, sentence);
		}
		else
		{
			delete initRule;
		}

		
	}
}