DasherJava / src / dasherJava / core / languageModeling / Context.java
Context.java
Raw
package dasherJava.core.languageModeling;

import dasherJava.core.languageModeling.LanguageModel.LanguageModelTrainingStats;

public class Context {
	
	private final LanguageModel languageModel;
	private ContextTrieNode head;
	private int order = 0; //empty context
	
	public Context(LanguageModel languageModel, ContextTrieNode head) {
		this.languageModel=languageModel;
		this.head=head;
	}
	
	public Context(Context context) {
		languageModel=context.languageModel;
		head=context.head;
		order=context.order;
	}
	
	public ContextTrieNode getHead() {
		return head;
	}
	
	public void enterSymbol(int symbolIndex) {
		while (true) {
			if (order<languageModel.getMaxOrder()) { //Only try to extend the context if it's not going
			                                         //to make it too long
				ContextTrieNode childForSymbol = head.getChild(symbolIndex);
				if (childForSymbol!=null) {
					head=childForSymbol;
					order++;
					return;
				}
			}
			//If we can't extend the current context, follow vine pointer to shorten it and try again
			ContextTrieNode vine = head.getVine();
			if (vine==null) return; //head is already at root, cannot shorten further
			head=vine;
			order--;
		}
	}
	
	public void learnSymbol(int symbolIndex, LanguageModelTrainingStats trainingStatsReport) {
		head=head.createChild(symbolIndex, trainingStatsReport);
		order++;
		while (order>languageModel.getMaxOrder()) {
			head=head.getVine();
			order--;
		}
	}
}