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--;
}
}
}