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)); } }
public override bool Equals(object obj) { if (object.ReferenceEquals((object)this, obj)) { return(true); } DomainConstraint <T_Variable, T_Element> domainConstraint = obj as DomainConstraint <T_Variable, T_Element>; if (domainConstraint == null || this._hashCode != domainConstraint._hashCode || !this._range.SetEquals(domainConstraint._range)) { return(false); } return(this._variable.Equals((object)domainConstraint._variable)); }
internal override IEnumerable <LiteralVertexPair <DomainConstraint <T_Variable, T_Element> > > GetSuccessors(Vertex vertex) { InitializeInverseMap(); var domainVariable = _inverseMap[vertex.Variable]; // since vertex children are ordinally aligned with domain, handle domain as array var domain = domainVariable.Domain.ToArray(); // foreach unique successor vertex, build up range var vertexToRange = new Dictionary <Vertex, Set <T_Element> >(); for (var i = 0; i < vertex.Children.Length; i++) { var successorVertex = vertex.Children[i]; Set <T_Element> range; if (!vertexToRange.TryGetValue(successorVertex, out range)) { range = new Set <T_Element>(domainVariable.Domain.Comparer); vertexToRange.Add(successorVertex, range); } range.Add(domain[i]); } foreach (var vertexRange in vertexToRange) { var successorVertex = vertexRange.Key; var range = vertexRange.Value; // construct a DomainConstraint including the given range var constraint = new DomainConstraint <T_Variable, T_Element>(domainVariable, range.MakeReadOnly()); var 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)); } }