workcraft/workcraft

View on GitHub
workcraft/MpsatVerificationPlugin/src/org/workcraft/plugins/mpsat_verification/tasks/ConformationOutputInterpreter.java

Summary

Maintainability
A
30 mins
Test Coverage
package org.workcraft.plugins.mpsat_verification.tasks;

import org.workcraft.plugins.mpsat_verification.projection.Enabledness;
import org.workcraft.plugins.mpsat_verification.utils.CompositionUtils;
import org.workcraft.plugins.pcomp.ComponentData;
import org.workcraft.plugins.pcomp.CompositionData;
import org.workcraft.plugins.pcomp.tasks.PcompOutput;
import org.workcraft.plugins.stg.Signal;
import org.workcraft.plugins.stg.StgModel;
import org.workcraft.plugins.stg.utils.StgUtils;
import org.workcraft.tasks.ExportOutput;
import org.workcraft.traces.Solution;
import org.workcraft.traces.Trace;
import org.workcraft.utils.LogUtils;
import org.workcraft.workspace.WorkspaceEntry;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

public class ConformationOutputInterpreter extends AbstractCompositionOutputInterpreter {

    public ConformationOutputInterpreter(WorkspaceEntry we, ExportOutput exportOutput,
            PcompOutput pcompOutput, MpsatOutput mpsatOutput, boolean interactive) {

        super(we, exportOutput, pcompOutput, mpsatOutput, interactive);
    }

    @Override
    public List<Solution> processSolutions(List<Solution> solutions) {
        String title = getWorkspaceEntry().getTitle();
        StgModel compositionStg = getCompositionStg();
        CompositionData compositionData = getCompositionData();
        ComponentData devData = compositionData.getComponentData(0);
        ComponentData envData = compositionData.getComponentData(1);

        HashSet<String> visitedTraces = new HashSet<>();
        boolean needsMultiLineMessage = solutions.size() > 1;
        if (needsMultiLineMessage) {
            LogUtils.logMessage("Unique projection(s) to '" + title + "':");
        }

        Set<String> outputSignals = compositionStg.getSignalReferences(Signal.Type.OUTPUT);
        Set<String> outputEvents = StgUtils.getAllEvents(outputSignals);

        List<Solution> result = new LinkedList<>();
        for (Solution solution : solutions) {
            // Get unique projection trace
            Trace devTrace = CompositionUtils.projectTrace(solution.getMainTrace(), devData);
            String traceText = devTrace.toString();
            if (!visitedTraces.contains(traceText)) {
                visitedTraces.add(traceText);
                if (needsMultiLineMessage) {
                    LogUtils.logMessage("  " + traceText);
                } else {
                    LogUtils.logMessage("Projection to '" + title + "': " + traceText);
                }

                Set<Trace> compositionContinuations = solution.getContinuations();
                Enabledness devEnabledness = CompositionUtils.getEnabledness(compositionContinuations, devData);
                Enabledness envEnabledness = CompositionUtils.getEnabledness(compositionContinuations, envData);

                Set<String> unexpectedlyEnabledOutputEvents = new HashSet<>(outputEvents);
                unexpectedlyEnabledOutputEvents.retainAll(devEnabledness.keySet());
                unexpectedlyEnabledOutputEvents.removeAll(envEnabledness.keySet());
                result.addAll(CompositionUtils.getEnabledViolatorSolutions(devTrace, unexpectedlyEnabledOutputEvents,
                        devEnabledness));
            }
        }
        return result;
    }

}