use of com.dat3m.dartagnan.solver.caat.constraints.Constraint in project Dat3M by hernanponcedeleon.
the class Reasoner method computeViolationReasons.
// ========================== Reason computation ==========================
public DNF<CAATLiteral> computeViolationReasons(Constraint constraint) {
if (!constraint.checkForViolations()) {
return DNF.FALSE();
}
CAATPredicate pred = constraint.getConstrainedPredicate();
Collection<? extends Collection<? extends Derivable>> violations = constraint.getViolations();
List<Conjunction<CAATLiteral>> reasonList = new ArrayList<>(violations.size());
if (constraint instanceof AcyclicityConstraint) {
// For acyclicity constraints, it is likely that we encounter the same
// edge multiple times (as it can be part of different cycles)
// so we memoize the computed reasons and reuse them if possible.
final RelationGraph constrainedGraph = (RelationGraph) pred;
final int mapSize = violations.stream().mapToInt(Collection::size).sum() * 4 / 3;
final Map<Edge, Conjunction<CAATLiteral>> reasonMap = new HashMap<>(mapSize);
for (Collection<Edge> violation : (Collection<Collection<Edge>>) violations) {
Conjunction<CAATLiteral> reason = violation.stream().map(edge -> reasonMap.computeIfAbsent(edge, key -> computeReason(constrainedGraph, key))).reduce(Conjunction.TRUE(), Conjunction::and);
reasonList.add(reason);
}
} else {
for (Collection<? extends Derivable> violation : violations) {
Conjunction<CAATLiteral> reason = violation.stream().map(edge -> computeReason(pred, edge)).reduce(Conjunction.TRUE(), Conjunction::and);
reasonList.add(reason);
}
}
return new DNF<>(reasonList);
}
use of com.dat3m.dartagnan.solver.caat.constraints.Constraint in project Dat3M by hernanponcedeleon.
the class ExecutionGraph method getOrCreateConstraintFromAxiom.
// =======================================================
// =================== Reading the WMM ====================
private Constraint getOrCreateConstraintFromAxiom(Axiom axiom) {
if (constraintMap.containsKey(axiom)) {
return constraintMap.get(axiom);
}
Constraint constraint;
RelationGraph innerGraph = getOrCreateGraphFromRelation(axiom.getRelation());
if (axiom.isAcyclicity()) {
constraint = new AcyclicityConstraint(innerGraph);
} else if (axiom.isEmptiness()) {
constraint = new EmptinessConstraint(innerGraph);
} else if (axiom.isIrreflexivity()) {
constraint = new IrreflexivityConstraint(innerGraph);
} else {
throw new UnsupportedOperationException("The axiom " + axiom + " is not recognized.");
}
constraintMap.put(axiom, constraint);
return constraint;
}
use of com.dat3m.dartagnan.solver.caat.constraints.Constraint in project Dat3M by hernanponcedeleon.
the class CAATModel method from.
public static CAATModel from(Collection<? extends CAATPredicate> predicates, Collection<? extends Constraint> constraints) {
Set<Constraint> consts = new HashSet<>(constraints);
Set<CAATPredicate> preds = new HashSet<>(predicates);
consts.forEach(c -> preds.add(c.getConstrainedPredicate()));
PredicateHierarchy hierarchy = new PredicateHierarchy(preds);
return new CAATModel(hierarchy, consts);
}
use of com.dat3m.dartagnan.solver.caat.constraints.Constraint in project Dat3M by hernanponcedeleon.
the class CAATSolver method computeInconsistencyReasons.
// ======================================== Reason computation ==============================================
private DNF<CAATLiteral> computeInconsistencyReasons(List<Constraint> violatedConstraints) {
List<Conjunction<CAATLiteral>> reasons = new ArrayList<>();
for (Constraint constraint : violatedConstraints) {
reasons.addAll(reasoner.computeViolationReasons(constraint).getCubes());
}
stats.numComputedReasons += reasons.size();
// The conversion to DNF removes duplicates and dominated clauses
DNF<CAATLiteral> result = new DNF<>(reasons);
stats.numComputedReducedReasons += result.getNumberOfCubes();
return result;
}
use of com.dat3m.dartagnan.solver.caat.constraints.Constraint in project Dat3M by hernanponcedeleon.
the class ExecutionGraph method constructMappings.
// --------------------------------------------------
private void constructMappings(boolean createOnlyAxiomRelevantGraphs) {
Set<RelationGraph> graphs = new HashSet<>();
Set<Constraint> constraints = new HashSet<>();
for (Axiom axiom : verificationTask.getAxioms()) {
Constraint constraint = getOrCreateConstraintFromAxiom(axiom);
constraints.add(constraint);
}
if (!createOnlyAxiomRelevantGraphs) {
for (Relation rel : verificationTask.getRelationDependencyGraph().getNodeContents()) {
if (!EXCLUDED_RELS.contains(rel.getName())) {
RelationGraph graph = getOrCreateGraphFromRelation(rel);
graphs.add(graph);
}
}
}
caatModel = CAATModel.from(graphs, constraints);
}
Aggregations