// Path: src/bigfat/util/StringUtils.java
// public class StringUtils {
// 
// 	public static String[] tokenize(String str, String delims) {
// 		StringTokenizer tok = new StringTokenizer(str, delims);
// 		String[] toks = new String[tok.countTokens()];
// 		for (int i = 0; i < toks.length; i++) {
// 			toks[i] = tok.nextToken();
// 		}
// 		return toks;
// 	}
// 
// 	public static int count(String ngram, char c) {
// 		int n = 0;
// 		for (int i = 0; i < ngram.length(); i++) {
// 			if (ngram.charAt(i) == c) {
// 				n++;
// 			}
// 		}
// 		return n;
// 	}
// 	
// 	public static String getSubstringBefore(String str, char c) {
// 		int i = str.indexOf(c);
// 		if(i == -1) {
// 			throw new RuntimeException(c + " not found in " + str);
// 		}
// 		return str.substring(0, i);
// 	}
// 
// 	public static String getSubstringAfterLast(String str, char c) {
// 		int i = str.lastIndexOf(c);
// 		if(i == -1) {
// 			throw new RuntimeException(c + " not found in " + str);
// 		}
// 		return str.substring(i+1);
// 	}
// 
// 	public static String getSubstringAfter(String str, String c) {
// 		int i = str.indexOf(c);
// 		if(i == -1) {
// 			throw new RuntimeException(c + " not found in " + str);
// 		}
// 		return str.substring(i + c.length());
// 	}
// 
// 	public static List<String> tokenizeList(String str, String delims) {
// 		StringTokenizer tok = new StringTokenizer(str, delims);
// 		int numToks = tok.countTokens();
// 		List<String> toks = new ArrayList<String>(numToks);
// 		for (int i = 0; i < numToks; i++) {
// 			toks.add(tok.nextToken());
// 		}
// 		return toks;
// 	}
// }


import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import bigfat.util.StringUtils;
		this.unkLogProb = unkEntry.logProb;
	}

	private void readRawFormat(BufferedReader in) throws NumberFormatException,
			IOException {

		table = new ArrayList<Map<List<String>, LMEntry>>();

		String line;
		while ((line = in.readLine()) != null) {
			String[] columns = StringUtils.tokenize(line, "\t");
			double logProb = Double.parseDouble(columns[1]);
			List<String> ngram = StringUtils.tokenizeList(columns[0], " ");
			double logBackoff = 0.0;
			if (columns.length == 3) {
				logBackoff = Double.parseDouble(columns[2]);
			}

			int order = ngram.size();
			this.order = Math.max(this.order, order);
			while (table.size() < order) {
				table.add(new HashMap<List<String>, ARPALanguageModel.LMEntry>(
						5000));
			}

			table.get(order - 1).put(ngram, new LMEntry(logProb, logBackoff));
		}
	}

	private void readArpa(BufferedReader in) throws IOException {
// Path: src/bigfat/util/StringUtils.java
// public class StringUtils {
// 
// 	public static String[] tokenize(String str, String delims) {
// 		StringTokenizer tok = new StringTokenizer(str, delims);
// 		String[] toks = new String[tok.countTokens()];
// 		for (int i = 0; i < toks.length; i++) {
// 			toks[i] = tok.nextToken();
// 		}
// 		return toks;
// 	}
// 
// 	public static int count(String ngram, char c) {
// 		int n = 0;
// 		for (int i = 0; i < ngram.length(); i++) {
// 			if (ngram.charAt(i) == c) {
// 				n++;
// 			}
// 		}
// 		return n;
// 	}
// 	
// 	public static String getSubstringBefore(String str, char c) {
// 		int i = str.indexOf(c);
// 		if(i == -1) {
// 			throw new RuntimeException(c + " not found in " + str);
// 		}
// 		return str.substring(0, i);
// 	}
// 
// 	public static String getSubstringAfterLast(String str, char c) {
// 		int i = str.lastIndexOf(c);
// 		if(i == -1) {
// 			throw new RuntimeException(c + " not found in " + str);
// 		}
// 		return str.substring(i+1);
// 	}
// 
// 	public static String getSubstringAfter(String str, String c) {
// 		int i = str.indexOf(c);
// 		if(i == -1) {
// 			throw new RuntimeException(c + " not found in " + str);
// 		}
// 		return str.substring(i + c.length());
// 	}
// 
// 	public static List<String> tokenizeList(String str, String delims) {
// 		StringTokenizer tok = new StringTokenizer(str, delims);
// 		int numToks = tok.countTokens();
// 		List<String> toks = new ArrayList<String>(numToks);
// 		for (int i = 0; i < numToks; i++) {
// 			toks.add(tok.nextToken());
// 		}
// 		return toks;
// 	}
// }


// Path: src/bigfat/interpolate/ARPALanguageModel.java
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import bigfat.util.StringUtils;

		this.unkLogProb = unkEntry.logProb;
	}

	private void readRawFormat(BufferedReader in) throws NumberFormatException,
			IOException {

		table = new ArrayList<Map<List<String>, LMEntry>>();

		String line;
		while ((line = in.readLine()) != null) {
			String[] columns = StringUtils.tokenize(line, "\t");
			double logProb = Double.parseDouble(columns[1]);
			List<String> ngram = StringUtils.tokenizeList(columns[0], " ");
			double logBackoff = 0.0;
			if (columns.length == 3) {
				logBackoff = Double.parseDouble(columns[2]);
			}

			int order = ngram.size();
			this.order = Math.max(this.order, order);
			while (table.size() < order) {
				table.add(new HashMap<List<String>, ARPALanguageModel.LMEntry>(
						5000));
			}

			table.get(order - 1).put(ngram, new LMEntry(logProb, logBackoff));
		}
	}

	private void readArpa(BufferedReader in) throws IOException {
		List<Integer> header = new ArrayList<Integer>();