Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 3
0
        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));
            }
        }