internal override IEnumerable <LiteralVertexPair <DomainConstraint <T_Variable, T_Element> > > GetSuccessors( Vertex vertex) { this.InitializeInverseMap(); DomainVariable <T_Variable, T_Element> domainVariable = this._inverseMap[vertex.Variable]; T_Element[] domain = domainVariable.Domain.ToArray(); Dictionary <Vertex, Set <T_Element> > vertexToRange = new Dictionary <Vertex, Set <T_Element> >(); for (int index = 0; index < vertex.Children.Length; ++index) { Vertex child = vertex.Children[index]; Set <T_Element> set; if (!vertexToRange.TryGetValue(child, out set)) { set = new Set <T_Element>(domainVariable.Domain.Comparer); vertexToRange.Add(child, set); } set.Add(domain[index]); } foreach (KeyValuePair <Vertex, Set <T_Element> > keyValuePair in vertexToRange) { Vertex successorVertex = keyValuePair.Key; Set <T_Element> range = keyValuePair.Value; DomainConstraint <T_Variable, T_Element> constraint = new DomainConstraint <T_Variable, T_Element>(domainVariable, range.MakeReadOnly()); Literal <DomainConstraint <T_Variable, T_Element> > literal = new Literal <DomainConstraint <T_Variable, T_Element> >(new TermExpr <DomainConstraint <T_Variable, T_Element> >(constraint), true); yield return(new LiteralVertexPair <DomainConstraint <T_Variable, T_Element> >(successorVertex, literal)); } }
internal override Vertex TranslateTermToVertex( TermExpr <DomainConstraint <T_Variable, T_Element> > term) { Set <T_Element> range = term.Identifier.Range; DomainVariable <T_Variable, T_Element> variable1 = term.Identifier.Variable; Set <T_Element> domain = variable1.Domain; if (range.All <T_Element>((Func <T_Element, bool>)(element => !domain.Contains(element)))) { return(Vertex.Zero); } if (domain.All <T_Element>((Func <T_Element, bool>)(element => range.Contains(element)))) { return(Vertex.One); } Vertex[] array = domain.Select <T_Element, Vertex>((Func <T_Element, Vertex>)(element => { if (!range.Contains(element)) { return(Vertex.Zero); } return(Vertex.One); })).ToArray <Vertex>(); int variable2; if (!this._domainVariableToRobddVariableMap.TryGetValue(variable1, out variable2)) { variable2 = this.Solver.CreateVariable(); this._domainVariableToRobddVariableMap[variable1] = variable2; } return(this.Solver.CreateLeafVertex(variable2, array)); }
internal DomainConstraint(DomainVariable <T_Variable, T_Element> variable, T_Element element) : this(variable, new Set <T_Element>((IEnumerable <T_Element>) new T_Element[1] { element }).MakeReadOnly()) { }
// <summary> // Constructs a new constraint for the given variable and range. // </summary> // <param name="variable"> Variable in constraint. </param> // <param name="range"> Range of constraint. </param> internal DomainConstraint(DomainVariable <T_Variable, T_Element> variable, Set <T_Element> range) { DebugCheck.NotNull(variable); DebugCheck.NotNull(range); _variable = variable; _range = range.AsReadOnly(); _hashCode = _variable.GetHashCode() ^ _range.GetElementsHashCode(); }
public override bool Equals(object obj) { if (object.ReferenceEquals((object)this, obj)) { return(true); } DomainVariable <T_Variable, T_Element> domainVariable = obj as DomainVariable <T_Variable, T_Element>; if (domainVariable == null || this._hashCode != domainVariable._hashCode || !this._identifierComparer.Equals(this._identifier, domainVariable._identifier)) { return(false); } return(this._domain.SetEquals(domainVariable._domain)); }
// <summary> // Constructor supporting a singleton range domain constraint // </summary> internal DomainConstraint(DomainVariable <T_Variable, T_Element> variable, T_Element element) : this(variable, new Set <T_Element>(new[] { element }).MakeReadOnly()) { }
internal DomainConstraint(DomainVariable <T_Variable, T_Element> variable, Set <T_Element> range) { this._variable = variable; this._range = range.AsReadOnly(); this._hashCode = this._variable.GetHashCode() ^ this._range.GetElementsHashCode(); }