Example #1
0
        /// <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);
        }
Example #2
0
        /// <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());
        }