Exemple #1
0
        public void AddMapDomain(IntVar var, IEnumerable <IntVar> bool_vars, long offset = 0)
        {
            int i = 0;

            foreach (IntVar bool_var in bool_vars)
            {
                int b_index   = bool_var.Index;
                int var_index = var.Index;

                ConstraintProto       ct1  = new ConstraintProto();
                LinearConstraintProto lin1 = new LinearConstraintProto();
                lin1.Vars.Add(var_index);
                lin1.Coeffs.Add(1L);
                lin1.Domain.Add(offset + i);
                lin1.Domain.Add(offset + i);
                ct1.Linear = lin1;
                ct1.EnforcementLiteral.Add(b_index);
                model_.Constraints.Add(ct1);

                ConstraintProto       ct2  = new ConstraintProto();
                LinearConstraintProto lin2 = new LinearConstraintProto();
                lin2.Vars.Add(var_index);
                lin2.Coeffs.Add(1L);
                lin2.Domain.Add(Int64.MinValue);
                lin2.Domain.Add(offset + i - 1);
                lin2.Domain.Add(offset + i + 1);
                lin2.Domain.Add(Int64.MaxValue);
                ct2.Linear = lin2;
                ct2.EnforcementLiteral.Add(-b_index - 1);
                model_.Constraints.Add(ct2);

                i++;
            }
        }
Exemple #2
0
        public Constraint AddLinearExpressionInDomain(LinearExpr linear_expr, Domain domain)
        {
            Dictionary <IntVar, long> dict = new Dictionary <IntVar, long>();
            long                  constant = LinearExpr.GetVarValueMap(linear_expr, 1L, dict);
            Constraint            ct       = new Constraint(model_);
            LinearConstraintProto linear   = new LinearConstraintProto();

            foreach (KeyValuePair <IntVar, long> term in dict)
            {
                linear.Vars.Add(term.Key.Index);
                linear.Coeffs.Add(term.Value);
            }
            foreach (long value in domain.FlattenedIntervals())
            {
                if (value == Int64.MinValue || value == Int64.MaxValue)
                {
                    linear.Domain.Add(value);
                }
                else
                {
                    linear.Domain.Add(value - constant);
                }
            }
            ct.Proto.Linear = linear;
            return(ct);
        }
Exemple #3
0
        static ConstraintProto NewLinear2(int v1, int v2, long c1, long c2, long lb, long ub)
        {
            LinearConstraintProto linear = new LinearConstraintProto();

            linear.Vars.Add(v1);
            linear.Vars.Add(v2);
            linear.Coeffs.Add(c1);
            linear.Coeffs.Add(c2);
            linear.Domain.Add(lb);
            linear.Domain.Add(ub);
            ConstraintProto ct = new ConstraintProto();

            ct.Linear = linear;
            return(ct);
        }
Exemple #4
0
        private long FillLinearConstraint(LinearExpr expr, out LinearConstraintProto linear)
        {
            var dict = var_value_map_;

            dict.Clear();
            long constant = LinearExpr.GetVarValueMap(expr, dict, terms_);
            var  count    = dict.Count;

            linear = new LinearConstraintProto();
            linear.Vars.Capacity = count;
            linear.Vars.AddRange(dict.Keys);
            linear.Coeffs.Capacity = count;
            linear.Coeffs.AddRange(dict.Values);
            return(constant);
        }
Exemple #5
0
 public Constraint AddLinearConstraint(IEnumerable<Tuple<IntVar, long>> terms,
                                       long lb, long ub)
 {
   Constraint ct = new Constraint(model_);
   LinearConstraintProto lin = new LinearConstraintProto();
   foreach (Tuple<IntVar, long> term in terms)
   {
     lin.Vars.Add(term.Item1.Index);
     lin.Coeffs.Add(term.Item2);
   }
   lin.Domain.Add(lb);
   lin.Domain.Add(ub);
   ct.Proto.Linear = lin;
   return ct;
 }
Exemple #6
0
 public Constraint AddSumConstraint(IEnumerable<IntVar> vars, long lb,
                                    long ub)
 {
   Constraint ct = new Constraint(model_);
   LinearConstraintProto lin = new LinearConstraintProto();
   foreach (IntVar var in vars)
   {
     lin.Vars.Add(var.Index);
     lin.Coeffs.Add(1L);
   }
   lin.Domain.Add(lb);
   lin.Domain.Add(ub);
   ct.Proto.Linear = lin;
   return ct;
 }
Exemple #7
0
        private long FillLinearConstraint(LinearExpr expr, out LinearConstraintProto linear)
        {
            linear = new LinearConstraintProto();
            Dictionary <IntVar, long> dict = new Dictionary <IntVar, long>();
            long constant = LinearExpr.GetVarValueMap(expr, 1L, dict, terms_);
            var  count    = dict.Count;

            linear.Vars.Capacity   = count;
            linear.Coeffs.Capacity = count;
            foreach (KeyValuePair <IntVar, long> term in dict)
            {
                linear.Vars.Add(term.Key.Index);
                linear.Coeffs.Add(term.Value);
            }
            return(constant);
        }
Exemple #8
0
 public Constraint AddLinearConstraintWithBounds(
     IEnumerable<Tuple<IntVar, long>> terms, IEnumerable<long> bounds)
 {
   Constraint ct = new Constraint(model_);
   LinearConstraintProto lin = new LinearConstraintProto();
   foreach (Tuple<IntVar, long> term in terms)
   {
     lin.Vars.Add(term.Item1.Index);
     lin.Coeffs.Add(term.Item2);
   }
   foreach (long b in bounds)
   {
     lin.Domain.Add(b);
   }
   ct.Proto.Linear = lin;
   return ct;
 }
Exemple #9
0
        public Constraint AddLinearConstraint(IEnumerable <IntVar> vars,
                                              IEnumerable <long> coeffs,
                                              long lb, long ub)
        {
            Constraint            ct  = new Constraint(model_);
            LinearConstraintProto lin = new LinearConstraintProto();

            foreach (IntVar var in vars)
            {
                lin.Vars.Add(var.Index);
            }
            foreach (long coeff in coeffs)
            {
                lin.Coeffs.Add(coeff);
            }
            lin.Domain.Add(lb);
            lin.Domain.Add(ub);
            ct.Proto.Linear = lin;
            return(ct);
        }
Exemple #10
0
 public Constraint AddLinearConstraintWithBounds(IEnumerable<IntVar> vars,
                                                 IEnumerable<int> coeffs,
                                                 IEnumerable<long> bounds)
 {
   Constraint ct = new Constraint(model_);
   LinearConstraintProto lin = new LinearConstraintProto();
   foreach (IntVar var in vars)
   {
     lin.Vars.Add(var.Index);
   }
   foreach (int coeff in coeffs)
   {
     lin.Coeffs.Add(coeff);
   }
   foreach (long b in bounds)
   {
     lin.Domain.Add(b);
   }
   ct.Proto.Linear = lin;
   return ct;
 }
Exemple #11
0
        public Constraint Add(BoundIntegerExpression lin)
        {
            switch (lin.CtType)
            {
            case BoundIntegerExpression.Type.BoundExpression:
            {
                Dictionary <IntVar, long> dict = new Dictionary <IntVar, long>();
                long                  constant = IntegerExpression.GetVarValueMap(lin.Left, 1L, dict);
                Constraint            ct       = new Constraint(model_);
                LinearConstraintProto linear   = new LinearConstraintProto();
                foreach (KeyValuePair <IntVar, long> term in dict)
                {
                    linear.Vars.Add(term.Key.Index);
                    linear.Coeffs.Add(term.Value);
                }
                linear.Domain.Add(lin.Lb == Int64.MinValue ? Int64.MinValue
                            : lin.Lb - constant);
                linear.Domain.Add(lin.Ub == Int64.MaxValue ? Int64.MaxValue
                            : lin.Ub - constant);
                ct.Proto.Linear = linear;
                return(ct);
            }

            case BoundIntegerExpression.Type.VarEqVar:
            {
                Dictionary <IntVar, long> dict = new Dictionary <IntVar, long>();
                long constant = IntegerExpression.GetVarValueMap(lin.Left, 1L, dict);
                constant += IntegerExpression.GetVarValueMap(lin.Right, -1L, dict);
                Constraint            ct     = new Constraint(model_);
                LinearConstraintProto linear = new LinearConstraintProto();
                foreach (KeyValuePair <IntVar, long> term in dict)
                {
                    linear.Vars.Add(term.Key.Index);
                    linear.Coeffs.Add(term.Value);
                }
                linear.Domain.Add(-constant);
                linear.Domain.Add(-constant);
                ct.Proto.Linear = linear;
                return(ct);
            }

            case BoundIntegerExpression.Type.VarDiffVar:
            {
                Dictionary <IntVar, long> dict = new Dictionary <IntVar, long>();
                long constant = IntegerExpression.GetVarValueMap(lin.Left, 1L, dict);
                constant += IntegerExpression.GetVarValueMap(lin.Right, -1L, dict);
                Constraint            ct     = new Constraint(model_);
                LinearConstraintProto linear = new LinearConstraintProto();
                foreach (KeyValuePair <IntVar, long> term in dict)
                {
                    linear.Vars.Add(term.Key.Index);
                    linear.Coeffs.Add(term.Value);
                }
                linear.Domain.Add(Int64.MinValue);
                linear.Domain.Add(-constant - 1);
                linear.Domain.Add(-constant + 1);
                linear.Domain.Add(Int64.MaxValue);
                ct.Proto.Linear = linear;
                return(ct);
            }

            case BoundIntegerExpression.Type.VarEqCst:
            {
                Dictionary <IntVar, long> dict = new Dictionary <IntVar, long>();
                long                  constant = IntegerExpression.GetVarValueMap(lin.Left, 1L, dict);
                Constraint            ct       = new Constraint(model_);
                LinearConstraintProto linear   = new LinearConstraintProto();
                foreach (KeyValuePair <IntVar, long> term in dict)
                {
                    linear.Vars.Add(term.Key.Index);
                    linear.Coeffs.Add(term.Value);
                }
                linear.Domain.Add(lin.Lb - constant);
                linear.Domain.Add(lin.Lb - constant);
                ct.Proto.Linear = linear;
                return(ct);
            }

            case BoundIntegerExpression.Type.VarDiffCst:
            {
                Dictionary <IntVar, long> dict = new Dictionary <IntVar, long>();
                long                  constant = IntegerExpression.GetVarValueMap(lin.Left, 1L, dict);
                Constraint            ct       = new Constraint(model_);
                LinearConstraintProto linear   = new LinearConstraintProto();
                foreach (KeyValuePair <IntVar, long> term in dict)
                {
                    linear.Vars.Add(term.Key.Index);
                    linear.Coeffs.Add(term.Value);
                }
                linear.Domain.Add(Int64.MinValue);
                linear.Domain.Add(lin.Lb - constant - 1);
                linear.Domain.Add(lin.Lb - constant + 1);
                linear.Domain.Add(Int64.MaxValue);
                ct.Proto.Linear = linear;
                return(ct);
            }
            }
            return(null);
        }