package org.ggp.base.util.gdl.model;
import org.ggp.base.util.gdl.grammar.Gdl;
import org.ggp.base.util.gdl.grammar.GdlRule;
import org.ggp.base.util.gdl.grammar.GdlSentence;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSetMultimap;
public class ImmutableSentenceFormModel implements SentenceFormModel {
private final ImmutableList<Gdl> gameDescription;
private final ImmutableSet<SentenceForm> sentenceForms;
private final ImmutableSet<SentenceForm> constantSentenceForms;
private final ImmutableSet<SentenceForm> independentSentenceForms;
private final ImmutableSetMultimap<SentenceForm, SentenceForm> dependencyGraph;
private final ImmutableSetMultimap<SentenceForm, GdlRule> rulesByForm;
private final ImmutableSetMultimap<SentenceForm, GdlSentence> trueSentencesByForm;
public ImmutableSentenceFormModel(ImmutableList<Gdl> gameDescription,
ImmutableSet<SentenceForm> sentenceForms,
ImmutableSet<SentenceForm> constantSentenceForms,
ImmutableSet<SentenceForm> independentSentenceForms,
ImmutableSetMultimap<SentenceForm, SentenceForm> dependencyGraph,
ImmutableSetMultimap<SentenceForm, GdlRule> rulesByForm,
ImmutableSetMultimap<SentenceForm, GdlSentence> trueSentencesByForm) {
Preconditions.checkArgument(sentenceForms.containsAll(independentSentenceForms));
Preconditions.checkArgument(independentSentenceForms.containsAll(constantSentenceForms));
Preconditions.checkArgument(sentenceForms.containsAll(dependencyGraph.keySet()));
Preconditions.checkArgument(sentenceForms.containsAll(dependencyGraph.values()));
Preconditions.checkArgument(sentenceForms.containsAll(rulesByForm.keySet()));
Preconditions.checkArgument(sentenceForms.containsAll(trueSentencesByForm.keySet()));
this.gameDescription = gameDescription;
this.sentenceForms = sentenceForms;
this.constantSentenceForms = constantSentenceForms;
this.independentSentenceForms = independentSentenceForms;
this.dependencyGraph = dependencyGraph;
this.rulesByForm = rulesByForm;
this.trueSentencesByForm = trueSentencesByForm;
}
/**
* Returns an ImmutableSentenceFormModel with the same contents as the
* given SentenceFormModel.
*
* May not actually create a copy if the input is immutable.
*/
public static ImmutableSentenceFormModel copyOf(SentenceFormModel other) {
if (other instanceof ImmutableSentenceDomainModel) {
return copyOf(((ImmutableSentenceDomainModel) other).getFormModel());
} else if (other instanceof ImmutableSentenceFormModel) {
return (ImmutableSentenceFormModel) other;
}
ImmutableSetMultimap.Builder<SentenceForm, GdlRule> rulesByForm = ImmutableSetMultimap.builder();
ImmutableSetMultimap.Builder<SentenceForm, GdlSentence> trueSentencesByForm = ImmutableSetMultimap.builder();
for (SentenceForm form : other.getSentenceForms()) {
rulesByForm.putAll(form, other.getRules(form));
trueSentencesByForm.putAll(form, other.getSentencesListedAsTrue(form));
}
return new ImmutableSentenceFormModel(ImmutableList.copyOf(other.getDescription()),
ImmutableSet.copyOf(other.getSentenceForms()),
ImmutableSet.copyOf(other.getConstantSentenceForms()),
ImmutableSet.copyOf(other.getIndependentSentenceForms()),
ImmutableSetMultimap.copyOf(other.getDependencyGraph()),
rulesByForm.build(),
trueSentencesByForm.build());
}
//TODO: Come up with an implementation that can save memory relative to this
//(i.e. where we can reuse SentenceForm references)
@Override
public SentenceForm getSentenceForm(GdlSentence sentence) {
return SimpleSentenceForm.create(sentence);
}
@Override
public ImmutableSet<SentenceForm> getIndependentSentenceForms() {
return independentSentenceForms;
}
@Override
public ImmutableSet<SentenceForm> getConstantSentenceForms() {
return constantSentenceForms;
}
@Override
public ImmutableMultimap<SentenceForm, SentenceForm> getDependencyGraph() {
return dependencyGraph;
}
@Override
public ImmutableSet<GdlSentence> getSentencesListedAsTrue(SentenceForm form) {
return trueSentencesByForm.get(form);
}
@Override
public ImmutableSet<GdlRule> getRules(SentenceForm form) {
return rulesByForm.get(form);
}
@Override
public ImmutableSet<SentenceForm> getSentenceForms() {
return sentenceForms;
}
@Override
public ImmutableList<Gdl> getDescription() {
return gameDescription;
}
}