All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.rwth.swc.coffee4j.engine.constraint.InternalConflictDiagnosisManager Maven / Gradle / Ivy

package de.rwth.swc.coffee4j.engine.constraint;

import de.rwth.swc.coffee4j.engine.TestModel;
import de.rwth.swc.coffee4j.engine.TupleList;
import de.rwth.swc.coffee4j.engine.conflict.choco.ChocoModel;
import de.rwth.swc.coffee4j.engine.conflict.diagnosis.ConflictDiagnostician;
import de.rwth.swc.coffee4j.engine.conflict.diagnosis.ExhaustiveConflictDiagnostician;
import de.rwth.swc.coffee4j.engine.conflict.explanation.ConflictExplainer;
import de.rwth.swc.coffee4j.engine.conflict.explanation.QuickConflictExplainer;
import de.rwth.swc.coffee4j.engine.conflict.InternalConflictSet;
import de.rwth.swc.coffee4j.engine.conflict.InternalDiagnosisSets;
import de.rwth.swc.coffee4j.engine.conflict.InternalMissingInvalidTuple;
import de.rwth.swc.coffee4j.engine.util.Preconditions;
import it.unimi.dsi.fastutil.ints.IntArraySet;
import it.unimi.dsi.fastutil.ints.IntSet;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

class InternalConflictDiagnosisManager {

    private final ConflictExplainer explainer;
    private final ConflictDiagnostician diagnostician;

    InternalConflictDiagnosisManager() {
        this.explainer = new QuickConflictExplainer();
        this.diagnostician = new ExhaustiveConflictDiagnostician();
    }

    List diagnose(TestModel testModel, TupleList toBeNegated) {
        Preconditions.notNull(testModel);
        Preconditions.notNull(toBeNegated);
        Preconditions.check(testModel.getErrorTupleLists().stream()
                .anyMatch(tupleList -> tupleList.getId() == toBeNegated.getId()));

        final List missingInvalidTuples = new ArrayList<>();

        final List constraints = new ArrayList<>();
        constraints.addAll(testModel.getExclusionConstraints());
        constraints.addAll(testModel.getErrorConstraints());

        final ChocoModel chocoModel = new ChocoModel(testModel.getParameterSizes(), constraints);
        chocoModel.setNegationOfConstraint(toBeNegated.getId());

        final IntSet background = new IntArraySet();
        background.add(toBeNegated.getId());

        final IntSet relaxable = new IntArraySet();
        relaxable.addAll(constraints.stream()
                .filter(constraint -> constraint.getTupleList().getId() != toBeNegated.getId())
                .map(constraint -> constraint.getTupleList().getId())
                .collect(Collectors.toList()));

        for(int[] tuple : toBeNegated.getTuples()) {
            chocoModel.reset();

            final int assignmentId = chocoModel.setAssignmentConstraint(toBeNegated.getInvolvedParameters(), tuple);

            background.add(assignmentId);

            final Optional optional = runConflictDiagnosis(chocoModel, background, relaxable);

            optional.ifPresent(explanation -> missingInvalidTuples.add(
                    new InternalMissingInvalidTuple(
                            toBeNegated.getId(), toBeNegated.getInvolvedParameters(), tuple, explanation)));

            chocoModel.clearAssignmentConstraint();
            background.remove(assignmentId);
        }

        return missingInvalidTuples;
    }

    private Optional runConflictDiagnosis(ChocoModel chocoModel,
                                                                 IntSet background,
                                                                 IntSet relaxable) {
        return chocoModel.isSatisfiable() ? Optional.empty() :
                explainer.getMinimalConflict(chocoModel, background.toIntArray(), relaxable.toIntArray())
                        .filter(explanation -> explanation instanceof InternalConflictSet)
                        .map(explanation -> (InternalConflictSet) explanation)
                        .map(explanation -> new InternalDiagnosisSets(
                                explanation,
                                diagnostician.getMinimalDiagnoses(explanation)));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy