Exemplo 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));
            }
        }
Exemplo n.º 2
0
        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())
 {
 }
Exemplo n.º 4
0
        // <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));
        }
Exemplo n.º 6
0
 // <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();
 }