static public bool UpdateOnCount(IntVarList varList) { int min = varList.MinInterval.Min; int max = varList.MaxInterval.Max; int count = max - min + 1; if (count < 256) { Value[] valList = new Value[count]; int valCount = 0; foreach (IntVar var in varList) { foreach (int val in var) { int idx = val - min; if (valList[idx].m_Value == 0) { ++valCount; valList[idx].m_Variable = var; } ++valList[idx].m_Value; } } if (valCount < varList.Count) { return(true); } for (int idx = 0; idx < count; ++idx) { if (valList[idx].m_Value == 1) { IntVar var = valList[idx].m_Variable; if (!var.IsBound()) { int val = min + idx; var.Intersect(val); } } } } return(false); }
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; } } }