/// <summary> /// Satisfies the equals. /// </summary> /// <param name="v1">The v1.</param> /// <param name="v2">The v2.</param> /// <param name="trail">The trail.</param> /// <returns></returns> private static bool SatisfyEquals(Variable v1, Variable v2, Trail trail) { var d1 = (AllenDomain)v1.Domain; if (d1.Empty) { return(false); } var d3 = new AllenDomain(d1.Min(), d1.Max() + d1.Duration, d1.Duration, d1.Step); var d2 = (AllenDomain)v2.Domain; if (d2.Empty) { return(false); } for (int st1 = d1.Min(); st1 <= d1.Max(); st1 += d1.Step) { bool found = false; for (int st2 = d2.Min(); st2 <= d2.Max(); st2 += d2.Step) { int lt1 = st1 + d1.Duration; int lt2 = st2 + d2.Duration; if ((st1 == st2) && (lt1 == lt2)) { found = true; break; } } if (!found) { d3.Remove(st1); if (d3.Size() == 0) { return(false); } } } //v1.UpdateDomain(d3, trail); return(true); }
/// <summary> /// Satisfies the precedes. /// </summary> /// <param name="v1">The v1.</param> /// <param name="v2">The v2.</param> /// <returns></returns> private static bool SatisfyPrecedes(Variable v1, Variable v2) { var d1 = (AllenDomain)v1.Domain; if (d1.Empty) return false; var d3 = new AllenDomain(d1.Min(), d1.Max() + d1.Duration, d1.Duration, d1.Step); var d2 = (AllenDomain)v2.Domain; if (d2.Empty) return false; for (var st1 = d1.Min(); st1 <= d1.Max(); st1 += d1.Step) { var found = false; for (var st2 = d2.Min(); st2 <= d2.Max(); st2 += d2.Step) { var lt1 = st1 + d1.Duration; if (lt1 >= st2) continue; found = true; break; } if (found) continue; d3.Remove(st1); if (d3.Size() == 0) { return false; } } //v1.UpdateDomain(d3, trail); return true; }