public static ImmutableSentenceDomainModel CopyUsingCartesianDomains(ISentenceDomainModel otherModel) { var immutableSentenceDomainModel = otherModel as ImmutableSentenceDomainModel; if (immutableSentenceDomainModel != null) return immutableSentenceDomainModel; var domains = ImmutableDictionary.CreateBuilder<ISentenceForm, ISentenceFormDomain>(); foreach (ISentenceForm form in otherModel.SentenceForms) { ISentenceFormDomain otherDomain = otherModel.GetDomain(form); var domainsForSlots = new List<ISet<TermObject>>(); for (int i = 0; i < form.TupleSize; i++) domainsForSlots.Add(otherDomain.GetDomainForSlot(i)); domains[form] = new CartesianSentenceFormDomain(form, domainsForSlots); } return new ImmutableSentenceDomainModel(ImmutableSentenceFormModel.CopyOf(otherModel), domains.ToImmutable()); }
private Dictionary<ISentenceForm, ISentenceFormDomain> GetCartesianDomainsFromModel() { var results = new Dictionary<ISentenceForm, ISentenceFormDomain>(); foreach (NameAndArity sentenceEntry in _sentencesModel.SentencesModel.Keys) { List<TermModel> bodyModels = _sentencesModel.SentencesModel[sentenceEntry]; // We'll end up taking the Cartesian product of the different types of terms we have available if (sentenceEntry.Arity == 0) { Fact sentence = new GroundFact(sentenceEntry.Name); var form = new SimpleSentenceForm(sentence); results[form] = new CartesianSentenceFormDomain(form, new MultiDictionary<int, TermObject>(false)); } else { IEnumerable<HashSet<Term>> sampleTerms = ToSampleTerms(bodyModels); foreach (IEnumerable<Term> terms in sampleTerms.CartesianProduct()) { Fact sentence = new VariableFact(true, sentenceEntry.Name, terms.ToArray()); var form = new SimpleSentenceForm(sentence); results[form] = GetDomain(form, sentence); } } } return results; }