/// <summary> /// Generates soft clauses based on the variables. /// </summary> /// <param name="variables">The variables.</param> /// <returns>The soft clauses.</returns> private Dictionary <Clause, uint> GenerateSoftClauses(List <string> variables) { Dictionary <Clause, uint> clauses = new Dictionary <Clause, uint>(); foreach (string variable in variables) { Clause clause = new Clause(); clause.Add(new Literal(variable, false)); uint weight = (uint)ProgramMetadata.Barriers[variable].Weight; clauses.Add(clause, weight); } return(clauses); }
/// <summary> /// Generates clauses based on the errors. /// </summary> /// <param name="errors">The errors.</param> /// <returns>The clauses.</returns> private List <Clause> GenerateClauses(List <RepairableError> errors) { List <Clause> clauses = new List <Clause>(); foreach (RepairableError error in errors) { RaceError race = error as RaceError; if (race != null) { IEnumerable <Barrier> barriers = error.Barriers; if (race != null && race.Overapproximated && race.OverapproximatedBarriers.Any()) { // consider the over-approximation barriers for the loop barriers = race.OverapproximatedBarriers; } Clause clause = new Clause(); foreach (string variable in barriers.Select(x => x.Name)) { clause.Add(new Literal(variable, true)); } clauses.Add(clause); } else { foreach (string variable in error.Barriers.Select(x => x.Name)) { Clause clause = new Clause(); clause.Add(new Literal(variable, false)); clauses.Add(clause); } } } return(clauses.Distinct().ToList()); }