public Constraint AddLinearExpressionInDomain(LinearExpression linear_expr, Domain domain) { Dictionary <IntVar, long> dict = new Dictionary <IntVar, long>(); long constant = LinearExpression.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); }
// Internal methods. void SetObjective(LinearExpression obj, bool minimize) { CpObjectiveProto objective = new CpObjectiveProto(); if (obj is IntVar) { objective.Coeffs.Add(1L); objective.Offset = 0L; if (minimize) { objective.Vars.Add(obj.Index); objective.ScalingFactor = 1L; } else { objective.Vars.Add(Negated(obj.Index)); objective.ScalingFactor = -1L; } } else { Dictionary <IntVar, long> dict = new Dictionary <IntVar, long>(); long constant = LinearExpression.GetVarValueMap(obj, 1L, dict); if (minimize) { objective.ScalingFactor = 1L; objective.Offset = constant; } else { objective.ScalingFactor = -1L; objective.Offset = -constant; } foreach (KeyValuePair <IntVar, long> it in dict) { objective.Coeffs.Add(it.Value); if (minimize) { objective.Vars.Add(it.Key.Index); } else { objective.Vars.Add(Negated(it.Key.Index)); } } } model_.Objective = objective; }