Пример #1
0
        public void EmptyIntersect()
        {
            IntDomain a	= new IntDomain( 8, 55 );

            Assert.AreEqual( a.Intersect( a ), a );
            Assert.IsTrue( a.Intersect( new IntDomain() ).IsEmpty() );
        }
Пример #2
0
        public void EmptyIntersect()
        {
            IntDomain a = new IntDomain(8, 55);

            Assert.AreEqual(a.Intersect(a), a);
            Assert.IsTrue(a.Intersect(new IntDomain()).IsEmpty());
        }
Пример #3
0
            static private bool Update(IntDomain[] domArray, int index)
            {
                int val = domArray[index].Interval.Min;

                for (int idx = 0; idx < domArray.Length; ++idx)
                {
                    IntDomain dom = domArray[idx];

                    if (idx != index &&
                        dom.Contains(val))
                    {
                        dom = dom.Difference(val);

                        if (dom.IsEmpty())
                        {
                            return(true);
                        }

                        domArray[idx] = dom;

                        if (dom.Interval.IsBound())
                        {
                            if (Update(domArray, idx))
                            {
                                return(true);
                            }
                        }
                    }
                }

                return(false);
            }
Пример #4
0
        public void EmptyDifference()
        {
            IntDomain a	= new IntDomain( 8, 55 );

            Assert.IsTrue( a.Difference( a ).IsEmpty() );
            Assert.AreEqual( a.Difference( new IntDomain() ), a );
        }
Пример #5
0
        public void Add(bool[] row, string name)
        {
            IntDomain domain = new IntDomain(row);
            IntVar    var    = new IntVar(m_Solver, domain, name);

            m_List.Add(var);
        }
Пример #6
0
 public void Difference6()
 {
     IntDomain c	= new IntDomain( 16, 47 );
     IntDomain a	= new IntDomain( c );
     IntDomain r	= a.Difference( new IntDomain( 48, 63 ) );
     Assert.AreEqual( r, c );
 }
Пример #7
0
        public override void Update()
        {
            IntDomain tmp = Var0.Domain.Intersect(Var1.Domain);

            Var0.Update(tmp);
            Var1.Update(tmp);
        }
Пример #8
0
        public void EmptyUnion()
        {
            IntDomain a = new IntDomain(8, 55);

            Assert.AreEqual(a.Union(a), a);
            Assert.AreEqual(a.Union(new IntDomain()), a);
        }
Пример #9
0
        public void EmptyDifference()
        {
            IntDomain a = new IntDomain(8, 55);

            Assert.IsTrue(a.Difference(a).IsEmpty());
            Assert.AreEqual(a.Difference(new IntDomain()), a);
        }
Пример #10
0
            // Count the number of times each domain occurs in the variable list
            // If the number times is equal to the cardinality of the domain, then we know
            // that that domain can only be used by those variables that it's used by.
            static public void UpdateOnDomain(IntVarList varList)
            {
                Dictionary <IntDomain, List <IntVar> > map = new Dictionary <IntDomain, List <IntVar> >();

                foreach (IntVar var in varList)
                {
                    IntDomain dom = var.Domain;

                    List <IntVar> list;
                    if (!map.TryGetValue(dom, out list))
                    {
                        list = new List <IntVar>(varList.Count);

                        map[dom] = list;
                    }

                    list.Add(var);
                }

                if (map.Count > 1)
                {
                    foreach (KeyValuePair <IntDomain, List <IntVar> > kv in map)
                    {
                        if (kv.Key.Cardinality == kv.Value.Count)
                        {
                            UpdateOnDomain(map, kv.Key);
                        }
                    }
                }
            }
Пример #11
0
        public void EmptyUnion()
        {
            IntDomain a	= new IntDomain( 8, 55 );

            Assert.AreEqual( a.Union( a ), a );
            Assert.AreEqual( a.Union( new IntDomain() ), a );
        }
Пример #12
0
 public void Intersect2()
 {
     IntDomain a	= new IntDomain( 8, 55 );
     IntDomain b	= new IntDomain( 40, 63 );
     IntDomain c	= b.Intersect( a );
     Validate( c, 40, 55 );
 }
Пример #13
0
 public void Intersect5()
 {
     IntDomain a	= new IntDomain( 8, 55 );
     IntDomain b	= new IntDomain( 40, 63 );
     IntDomain c	= a.Intersect( b );
     Validate( c, 40, 55 );
 }
Пример #14
0
        public void Union1()
        {
            IntDomain a = new IntDomain(-20, -1);
            IntDomain b = new IntDomain(0, 19);
            IntDomain c = a.Union(b);

            Validate(c, -20, 19);
        }
Пример #15
0
        public void Union6()
        {
            IntDomain a = new IntDomain(-20, -1);
            IntDomain b = new IntDomain(0, 19);
            IntDomain c = b.Union(a);

            Validate(c, -20, 19);
        }
Пример #16
0
        public void Difference6()
        {
            IntDomain c = new IntDomain(16, 47);
            IntDomain a = new IntDomain(c);
            IntDomain r = a.Difference(new IntDomain(48, 63));

            Assert.AreEqual(r, c);
        }
Пример #17
0
        public void Intersect2()
        {
            IntDomain a = new IntDomain(8, 55);
            IntDomain b = new IntDomain(40, 63);
            IntDomain c = b.Intersect(a);

            Validate(c, 40, 55);
        }
Пример #18
0
        public void Intersect5()
        {
            IntDomain a = new IntDomain(8, 55);
            IntDomain b = new IntDomain(40, 63);
            IntDomain c = a.Intersect(b);

            Validate(c, 40, 55);
        }
Пример #19
0
 protected IntVarExprVal(IntVar var0, IntVar var1, int val) :
     base(var0.Solver, new Variable[] { var0, var1 })
 {
     m_Var0   = var0;
     m_Var1   = var1;
     m_Value  = val;
     m_Domain = new IntDomain(val);
 }
Пример #20
0
        public IntVarMatrix(Solver solver, int rowCount, int colCount, IntDomain domain) :
            base(solver)
        {
            m_VarList  = null;
            m_RowCount = rowCount;
            m_ColCount = colCount;

            InitMatrix(domain);
        }
Пример #21
0
        public IntVar(Solver solver, IntDomain domain, string name) :
            base(solver, name)
        {
            m_Domain            = domain;
            m_DomainPrev        = domain;
            m_DomainPrevInvalid = false;

            m_Solver.IntVarList.Add(this);
        }
Пример #22
0
        private void Validate(IntDomain domain, int min, int max)
        {
            Assert.AreEqual(domain.Interval, new IntInterval(min, max));

            for (int val = min; val <= max; ++val)
            {
                Assert.IsTrue(domain.Contains(val));
            }
        }
Пример #23
0
        protected void UpdateVar0()
        {
            IntDomain domain = new IntDomain();

            foreach (FltInterval flt_iset in FltVar.Domain)
            {
                domain = domain.Union((int)Math.Floor(flt_iset.Min), (int)Math.Ceiling(flt_iset.Max));
            }

            IntVar.Intersect(domain);
        }
Пример #24
0
        public void Enumerator()
        {
            List<IntInterval> l1	= new List<IntInterval>( 3 );
            l1.Add( new IntInterval( 8, 23 ) );
            l1.Add( new IntInterval( 40, 55 ) );
            l1.Add( new IntInterval( 72, 87 ) );

            IntDomain a	= new IntDomain( l1 );

            List<IntInterval> list	= new List<IntInterval>( a );
        }
Пример #25
0
        public void IntersectsWith4()
        {
            IntDomain a = new IntDomain(new int[] { 0, 15, 48, 63 });

            Assert.IsFalse(a.IntersectsWith(new IntInterval(-10, -1)));
            Assert.IsFalse(a.IntersectsWith(new IntInterval(16, 47)));
            Assert.IsFalse(a.IntersectsWith(new IntInterval(64, 80)));

            Assert.IsTrue(a.IntersectsWith(new IntInterval(15, 47)));
            Assert.IsTrue(a.IntersectsWith(new IntInterval(16, 48)));
        }
Пример #26
0
		private void UpdateVar0()
		{
			IntDomain domain	= new IntDomain();

			foreach( int idx in Var1 )
			{
				domain	= domain.Union( VarList[ idx ].Domain );
			}
		
			Var0.Intersect( domain );
		}
Пример #27
0
        public IntDomain Union()
        {
            IntDomain domain = new IntDomain();

            foreach (IntVar var in this)
            {
                domain = domain.Union(var.Domain);
            }

            return(domain);
        }
Пример #28
0
        private void UpdateVar0()
        {
            IntDomain domain = IntDomain.Empty;

            foreach (int idx in Var1)
            {
                domain = domain.Union(m_DomainList[idx]);
            }

            Var0.Intersect(domain);
        }
Пример #29
0
        public IntDomain[] ToDomainArray()
        {
            IntDomain[] list = new IntDomain[Count];

            for (int idx = 0; idx < Count; ++idx)
            {
                list[idx] = At(idx).Domain;
            }

            return(list);
        }
Пример #30
0
        public void Enumerator()
        {
            List <IntInterval> l1 = new List <IntInterval>(3);

            l1.Add(new IntInterval(8, 23));
            l1.Add(new IntInterval(40, 55));
            l1.Add(new IntInterval(72, 87));

            IntDomain a = new IntDomain(l1);

            List <IntInterval> list = new List <IntInterval>(a);
        }
Пример #31
0
        public override void Update()
        {
            int sum_min = 0;
            int sum_max = 0;

            for (int idx = 0; idx < VarList.Count; ++idx)
            {
                IntDomain dom = VarList[idx].Domain;

                sum_min += dom.Min;
                sum_max += dom.Max;
            }

            Var0.Intersect(sum_min, sum_max);
            if (Var0.Domain.IsEmpty())
            {
                return;
            }

            for (int idx = 0; idx < VarList.Count; ++idx)
            {
                IntVar var = VarList[idx];

                int min = Var0.Min - (sum_max - var.Max);
                int max = Var0.Max - (sum_min - var.Min);

                if (min > var.Min || max < var.Max)
                {
                    sum_min -= var.Min;
                    sum_max -= var.Max;

                    var.Intersect(min, max);

                    if (var.Domain.IsEmpty())
                    {
                        break;
                    }

                    sum_min += var.Min;
                    sum_max += var.Max;

                    Var0.Intersect(sum_min, sum_max);

                    if (Var0.Domain.IsEmpty())
                    {
                        break;
                    }

                    idx = -1;
                }
            }
        }
Пример #32
0
        internal void Update(IntDomain result)
        {
            if (!ReferenceEquals(m_Domain, result))
            {
                Store();

                m_DomainPrevInvalid = false;
                m_DomainPrev        = m_Domain;
                m_Domain            = result;

                OnDomainChange();
            }
        }
Пример #33
0
        private void Update2()
        {
            int sum_min = 0;
            int sum_max = 0;

            for (int i = 0; i < VarList.Count; ++i)
            {
                IntDomain dom = VarList[i].Domain;

                sum_min += dom.Min;
                sum_max += dom.Max;
            }

            if (m_Value < sum_min || m_Value > sum_max)
            {
                Violate();
                return;
            }

            for (int idx = 0; idx < VarList.Count; ++idx)
            {
                IntVar var = VarList[idx];

                int min = m_Value - (sum_max - var.Max);
                int max = m_Value - (sum_min - var.Min);

                if (min > var.Min || max < var.Max)
                {
                    sum_min -= var.Min;
                    sum_max -= var.Max;

                    var.Intersect(min, max);

                    if (var.Domain.IsEmpty())
                    {
                        return;
                    }

                    sum_min += var.Min;
                    sum_max += var.Max;

                    if (m_Value < sum_min || m_Value > sum_max)
                    {
                        Violate();
                        return;
                    }

                    idx = -1;
                }
            }
        }
Пример #34
0
        private void UpdateVar0()
        {
            if (VarList.Count > 0)
            {
                IntDomain domain = VarList.Front().Domain *m_IntArray[0];

                for (int idx = 1; idx < VarList.Count; ++idx)
                {
                    domain += VarList[idx].Domain * m_IntArray[idx];
                }

                Var0.Intersect(domain);
            }
        }
Пример #35
0
        public void PreviousState()
        {
            Solver p = new Solver(-10000, 10000);
            IntVar a = new IntVar(p, 0, 100, "a");

            p.StateStack.Begin();
            a.Max = 60;

            p.StateStack.Begin();
            a.Max = 30;

            p.StateStack.Begin();

            p.StateStack.Begin();
            a.Max = 10;

            IntDomain d1 = a.DomainPrev;

            Assert.AreEqual(d1, new IntDomain(0, 30));

            int c1 = d1.Cardinality - a.Domain.Cardinality;

            Assert.AreEqual(c1, 20);

            p.StateStack.Cancel();

            p.StateStack.Cancel();

            IntDomain d2 = a.DomainPrev;

            Assert.AreEqual(d2, new IntDomain(0, 60));

            int c2 = d2.Cardinality - a.Domain.Cardinality;

            Assert.AreEqual(c2, 30);

            p.StateStack.Cancel();

            IntDomain d3 = a.DomainPrev;

            Assert.AreEqual(d3, new IntDomain(0, 100));

            int c3 = d3.Cardinality - a.Domain.Cardinality;

            Assert.AreEqual(c3, 40);

            p.StateStack.Cancel();

            Assert.AreEqual(a.Domain, new IntDomain(0, 100));
        }
Пример #36
0
        public override void Update()
        {
            if (VarList.Count == 0)
            {
                return;
            }

            IntDomain domain = VarList.Front().Domain;

            for (int idx = 1; idx < VarList.Count; ++idx)
            {
                domain *= VarList[idx].Domain;
            }

            Var0.Intersect(domain);
        }
Пример #37
0
        private void UpdateVar1()
        {
            IntDomain diff = new IntDomain();

            foreach (int idx in Index)
            {
                FltVar var = VarList[idx];

                if (!Var0.Domain.IntersectsWith(var.Domain))
                {
                    diff = diff.Union(idx);
                }
            }

            Index.Difference(diff);
        }
Пример #38
0
        private void InitMatrix( IntDomain domain )
        {
            m_VarList	= new IntVarList( m_Solver, m_RowCount * m_ColCount );

            for( int row = 0; row < m_RowCount; ++row )
            {
                for( int col = 0; col < m_ColCount; ++col )
                {
                    string name		= row.ToString() + "." + col.ToString();

                    IntVar cell		= new IntVar( m_Solver, domain, name );

                    m_VarList.Add( cell );
                }
            }
        }
Пример #39
0
        private void Validate( IntDomain domain, int min, int max )
        {
            Assert.AreEqual( domain.Interval, new IntInterval( min, max ) );

            for( int val = min; val <= max; ++val )
            {
                Assert.IsTrue( domain.Contains( val ) );
            }
        }
Пример #40
0
        public void IntersectsWith4()
        {
            IntDomain a	= new IntDomain( new int[] { 0, 15, 48, 63 } );

            Assert.IsFalse( a.IntersectsWith( new IntInterval( -10, -1 ) ) );
            Assert.IsFalse( a.IntersectsWith( new IntInterval( 16, 47 ) ) );
            Assert.IsFalse( a.IntersectsWith( new IntInterval( 64, 80 ) ) );

            Assert.IsTrue( a.IntersectsWith( new IntInterval( 15, 47 ) ) );
            Assert.IsTrue( a.IntersectsWith( new IntInterval( 16, 48 ) ) );
        }
Пример #41
0
        public IntVarMatrix( Solver solver, int rowCount, int colCount, IntDomain domain )
            : base(solver)
        {
            m_VarList		= null;
            m_RowCount		= rowCount;
            m_ColCount		= colCount;

            InitMatrix( domain );
        }
Пример #42
0
 public void Update( IntDomain[] list )
 {
     if( list.Length == Count )
     {
         for( int idx = 0; idx < list.Length; ++idx )
         {
             At( idx ).Update( list[ idx ] );
         }
     }
 }
Пример #43
0
        public IntDomain Union()
        {
            IntDomain domain	= new IntDomain();

            foreach( IntVar var in this )
            {
                domain	= domain.Union( var.Domain );
            }

            return domain;
        }
Пример #44
0
        public void Union1()
        {
            IntDomain a	= new IntDomain( -20, -1 );
            IntDomain b	= new IntDomain( 0, 19 );
            IntDomain c	= a.Union( b );

            Validate( c, -20, 19 );
        }
Пример #45
0
        public void Union6()
        {
            IntDomain a	= new IntDomain( -20, -1 );
            IntDomain b	= new IntDomain( 0, 19 );
            IntDomain c	= b.Union( a );

            Validate( c, -20, 19 );
        }
Пример #46
0
 protected IntVarExprVal( IntVar var0, IntVar var1, int val )
     : base(var0.Solver, new Variable[] { var0, var1 })
 {
     m_Var0		= var0;
     m_Var1		= var1;
     m_Value		= val;
     m_Domain	= new IntDomain( val );
 }
Пример #47
0
        static void Mul2()
        {
            IntDomain v		= new IntDomain();
            for( int idx = 0; idx < 100000; ++idx )
            {
                Solver s	= new Solver( -1000, 1000 );
                IntVar a	= new IntVar( s, IntDomain.Random( -100, 100, 1 ), "a" );
                IntVar b	= new IntVar( s, IntDomain.Random( -100, 100, 1 ), "b" );
                IntVar c	= new IntVar( s, IntDomain.Random( -100, 100, 1 ), "c" );
                IntVar d	= new IntVar( s, IntDomain.Random( -100, 100, 1 ), "d" );
                IntVarList l	= new IntVarList( s, new IntVar[] { a, b, c, d } );
                //p.Add( a + b + c + d );
                s.Add( l.Sum() );

                s.Propagate();
                s.PrintVariables();
                s.PrintConstraints();
            }
        }
Пример #48
0
        public IntDomain[] ToDomainArray()
        {
            IntDomain[] list	= new IntDomain[ Count ];

            for( int idx = 0; idx < Count; ++idx )
            {
                list[ idx ]		= At( idx ).Domain;
            }

            return list;
        }