/* This file is part of the Joshua Machine Translation System.
*
* Joshua is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package joshua.prefix_tree;
import java.util.Collections;
import java.util.List;
import joshua.corpus.MatchedHierarchicalPhrases;
import joshua.corpus.suffix_array.HierarchicalPhrases;
import joshua.corpus.suffix_array.Suffixes;
import joshua.corpus.vocab.SymbolTable;
//import joshua.decoder.ff.tm.BilingualRule;
import joshua.decoder.ff.tm.Rule;
//import joshua.decoder.ff.tm.hiero.MemoryBasedBatchGrammar;
/**
* Root node of a prefix tree.
*
* @author Lane Schwartz
*/
public class RootNode extends Node {
private final PrefixTree tree;
private final MatchedHierarchicalPhrases matchedPhrases;
RootNode(PrefixTree tree, int incomingArcValue) {
super(tree.parallelCorpus, 1);
this.tree = tree;
SymbolTable vocab = tree.vocab;
this.matchedPhrases = HierarchicalPhrases.emptyList(vocab);
Suffixes suffixArray = tree.suffixArray;
if (suffixArray != null) {
setBounds(0, suffixArray.size()-1);
}
}
/**
* Gets an empty list of rules.
*
* @return an empty list of rules
*/
protected List<Rule> getResults() {
return Collections.emptyList();
}
/**
* Gets an empty list of matched hierarchical phrases.
* <p>
* The list of hierarchical phrases
* for the X node that comes off of ROOT
* is defined to be an empty list.
* <p>
* One could alternatively consider
* every phrase in the corpus to match here,
* but we don't.
*
* @return an empty list of matched hierarchical phrases
*/
protected MatchedHierarchicalPhrases getMatchedPhrases() {
return matchedPhrases;
}
public String toString() {
return toString(tree.vocab, PrefixTree.ROOT_NODE_ID);
}
public Node addChild(int child) {
if (child==SymbolTable.X) {
if (children.containsKey(child)) {
throw new ChildNodeAlreadyExistsException(this, child);
} else {
XNode node = new XNode(this);
children.put(child, node);
return node;
}
} else {
return super.addChild(child);
}
}
String toTreeString(String tabs, SymbolTable vocab) {
return super.toTreeString(tabs, vocab, PrefixTree.ROOT_NODE_ID);
}
// /* See Javadoc for joshua.decoder.ff.tm.Grammar#constructOOVRule */
// public Rule constructOOVRule(int num_feats, int sourceWord, boolean have_lm_model) {
// int[] p_french = new int[1];
// p_french[0] = sourceWord;
// int[] english = new int[1];
// english[0] = sourceWord;
// float[] feat_scores = new float[num_feats];
//
// // TODO: This is a hack to make the decoding without a LM works
// // no LM is used for decoding, so we should set the stateless cost
// boolean hasLM = true; //THIS IS A HACK
// if (! hasLM) {
// //this.feat_scores[0]=100.0/(this.featureFunctions.get(0)).getWeight();
// feat_scores[0] = 100;
// }
// int defaultOwner = 0; // THIS IS A HACK
// return new BilingualRule(SymbolTable.X, p_french, english, feat_scores, 0, defaultOwner, 0, getOOVRuleID());
//
// }
//
// /* See Javadoc for joshua.decoder.ff.tm.Grammar#getOOVRuleID */
// public int getOOVRuleID() {
// return MemoryBasedBatchGrammar.OOV_RULE_ID;
// }
//
// /* See Javadoc for joshua.decoder.ff.tm.Grammar#constructManualRule */
// public Rule constructManualRule(int lhs, int[] sourceWords, int[] targetWords, float[] scores, int aritity) {
// // TODO Auto-generated method stub
// return null;
// }
//
// /* See Javadoc for joshua.decoder.ff.tm.Grammar#hasRuleForSpan */
// public boolean hasRuleForSpan(int startIndex, int endIndex, int pathLength) {
// if (tree.maxPhraseSpan == -1) { // mono-glue grammar
// return (startIndex == 0);
// } else {
// return (endIndex - startIndex <= tree.maxPhraseSpan);
// }
// }
}