/*
* Copyright (C) 2015-2016 Christian Schilling (schillic@informatik.uni-freiburg.de)
* Copyright (C) 2015-2016 University of Freiburg
*
* This file is part of the ULTIMATE Automaton Delta Debugger.
*
* The ULTIMATE Automaton Delta Debugger is free software: you can redistribute
* it and/or modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* The ULTIMATE Automaton Delta Debugger is distributed in the hope that it will
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
* General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the ULTIMATE Automaton Delta Debugger. If not, see
* .
*
* Additional permission under GNU GPL version 3 section 7: If you modify the
* ULTIMATE Automaton Delta Debugger, or any covered work, by linking or
* combining it with Eclipse RCP (or a modified version of Eclipse RCP),
* containing parts covered by the terms of the Eclipse Public License, the
* licensors of the ULTIMATE Automaton Delta Debugger grant you additional
* permission to convey the resulting work.
*/
package de.uni_freiburg.informatik.ultimate.plugins.analysis.automatondeltadebugger;
import de.uni_freiburg.informatik.ultimate.automata.AutomataLibraryServices;
import de.uni_freiburg.informatik.ultimate.automata.IOperation;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.IDoubleDeckerAutomaton;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.INestedWordAutomaton;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.buchi.BuchiComplementNCSB;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.Complement;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.RemoveDeadEnds;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.RemoveNonLiveStates;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.RemoveUnreachable;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.minimization.MinimizeNwaOverapproximation;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.minimization.MinimizeNwaPmaxSat;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.minimization.MinimizeNwaPmaxSatDirect;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.minimization.MinimizeNwaPmaxSatDirectBi;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.minimization.ShrinkNwa;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.minimization.maxsat.arrays.MinimizeNwaMaxSAT;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.simulation.delayed.BuchiReduce;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.simulation.delayed.nwa.ReduceNwaDelayedSimulation;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.simulation.direct.nwa.ReduceNwaDirectSimulation;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.simulation.fair.ReduceBuchiFairDirectSimulation;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.simulation.multipebble.ReduceNwaDelayedFullMultipebbleSimulation;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.simulation.multipebble.ReduceNwaDirectFullMultipebbleSimulation;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.simulation.util.CompareSimulations;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.simulation.util.DirectSimulationComparison;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.simulation.util.nwa.graph.summarycomputationgraph.ReduceNwaDelayedSimulationB;
import de.uni_freiburg.informatik.ultimate.automata.nestedword.operations.simulation.util.nwa.graph.summarycomputationgraph.ReduceNwaDirectSimulationB;
import de.uni_freiburg.informatik.ultimate.automata.statefactory.StringFactory;
import de.uni_freiburg.informatik.ultimate.core.model.services.IUltimateServiceProvider;
/**
* Examples used by delta debugger.
*
* NOTE: Users may insert their sample code as a new method and leave it here.
*
* @author Christian Schilling (schillic@informatik.uni-freiburg.de)
*/
@SuppressWarnings({ "squid:S00112", "squid:S1452",
"checkstyle:com.puppycrawl.tools.checkstyle.checks.metrics.ClassDataAbstractionCouplingCheck" })
public class AutomatonDebuggerExamples {
private final AutomataLibraryServices mServices;
/**
* @param services
* Ultimate services.
*/
public AutomatonDebuggerExamples(final IUltimateServiceProvider services) {
mServices = new AutomataLibraryServices(services);
}
/**
* Implemented operations for quick usage.
*
* NOTE: If another operation is supported, add a value here.
*/
public enum EOperationType {
/**
* Used for default settings to inform user that the method was not selected.
*/
EXCEPTION_DUMMY,
/**
* {@link MinimizeNwaMaxSAT}.
*/
MINIMIZE_NWA_MAXSAT,
/**
* {@link MinimizeNwaPmaxSat}.
*/
MINIMIZE_NWA_PMAXSAT,
/**
* {@link MinimizeNwaPmaxSat}.
*/
MINIMIZE_NWA_PMAXSAT_ASYMMETRIC,
/**
* {@link MinimizeNwaPmaxSatAsymmetric}.
*/
REDUCE_NWA_DIRECT_SIMULATION,
/**
* {@link ReduceNwaDirectSimulationB}.
*/
REDUCE_NWA_DIRECT_SIMULATION_B,
/**
* {@link ReduceNwaDelayedSimulation}.
*/
REDUCE_NWA_DELAYED_SIMULATION,
/**
* {@link ReduceNwaDelayedSimulationB}.
*/
REDUCE_NWA_DELAYED_SIMULATION_B,
/**
* {@link ReduceNwaDelayedFullMultipebbleSimulation}.
*/
REDUCE_NWA_DELAYED_FULL_MULTIPEBBLE_SIMULATION,
/**
* {@link ShrinkNwa}.
*/
SHRINK_NWA,
/**
* {@link BuchiComplementNCSB}.
*/
BUCHI_COMPLEMENT_NCSB,
/**
* {@link BuchiReduce}.
*/
BUCHI_REDUCE,
/**
* {@link Complement}.
*/
COMPLEMENT,
/**
* {@link MinimizeNwaOverapproximation}.
*/
MINIMIZE_NWA_OVERAPPROXIMATION,
/**
* {@link RemoveDeadEnds}.
*/
REMOVE_DEAD_ENDS,
/**
* {@link RemoveNonLiveStates}.
*/
REMOVE_NON_LIVE_STATES,
/**
* {@link DirectSimulationComparison}.
*/
DIRECT_SIMULATION_COMPARISON,
/**
* {@link ReduceNwaDirectFullMultipebbleSimulation}.
*/
REDUCE_NWA_DIRECT_FULL_MULTIPEBBLE_SIMULATION,
/**
* {@link CompareSimulations}.
*/
COMPARE_SIMULATIONS,
/**
* {@link ReduceBuchiFairDirectSimulation}.
*/
REDUCE_BUCHI_FAIR_DIRECT_SIMULATION
}
/**
* Getter for an {@link IOperation}.
*
* @param type
* operation type
* @param automaton
* nested word automaton
* @param factory
* state factory
* @return operation corresponding to type
* @throws Throwable
* when operation fails
*/
@SuppressWarnings({ "squid:MethodCyclomaticComplexity",
"checkstyle:com.puppycrawl.tools.checkstyle.checks.metrics.JavaNCSSCheck" })
public IOperation getOperation(final EOperationType type,
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
final IOperation operation;
switch (type) {
case EXCEPTION_DUMMY:
throw new IllegalArgumentException("Select a valid operation for delta debugging.");
case MINIMIZE_NWA_MAXSAT:
operation = minimizeNwaMaxSat(automaton, factory);
break;
case MINIMIZE_NWA_PMAXSAT:
operation = minimizeNwaPmaxSat(automaton, factory);
break;
case MINIMIZE_NWA_PMAXSAT_ASYMMETRIC:
operation = minimizeNwaPmaxSatAsymmetric(automaton, factory);
break;
case REDUCE_NWA_DIRECT_SIMULATION:
operation = reduceNwaDirectSimulation(automaton, factory);
break;
case REDUCE_NWA_DIRECT_SIMULATION_B:
operation = reduceNwaDirectSimulationB(automaton, factory);
break;
case REDUCE_NWA_DELAYED_SIMULATION:
operation = reduceNwaDelayedSimulation(automaton, factory);
break;
case REDUCE_NWA_DELAYED_SIMULATION_B:
operation = reduceNwaDelayedSimulationB(automaton, factory);
break;
case REDUCE_NWA_DELAYED_FULL_MULTIPEBBLE_SIMULATION:
operation = reduceNwaDelayedFullMultipebbleSimulation(automaton, factory);
break;
case SHRINK_NWA:
operation = shrinkNwa(automaton, factory);
break;
case BUCHI_COMPLEMENT_NCSB:
operation = buchiComplementNcsb(automaton, factory);
break;
case BUCHI_REDUCE:
operation = buchiReduce(automaton, factory);
break;
case COMPLEMENT:
operation = complement(automaton, factory);
break;
case MINIMIZE_NWA_OVERAPPROXIMATION:
operation = minimizeNwaOverapproximation(automaton, factory);
break;
case REMOVE_DEAD_ENDS:
operation = removeDeadEnds(automaton);
break;
case REMOVE_NON_LIVE_STATES:
operation = removeNonLiveStates(automaton);
break;
case DIRECT_SIMULATION_COMPARISON:
operation = directSimulationComparison(automaton, factory);
break;
case REDUCE_NWA_DIRECT_FULL_MULTIPEBBLE_SIMULATION:
operation = reduceNwaDirectFullMultipebbleSimulation(automaton, factory);
break;
case COMPARE_SIMULATIONS:
operation = compareSimulations(automaton, factory);
break;
case REDUCE_BUCHI_FAIR_DIRECT_SIMULATION:
operation = reduceBuchiFairDirectSimulation(automaton, factory);
break;
default:
throw new IllegalArgumentException("Unknown operation.");
}
return operation;
}
/**
* @param automaton
* The automaton.
* @param factory
* state factory
* @return new {@link MinimizeNwaMaxSAT} instance
* @throws Throwable
* when error occurs
*/
public IOperation minimizeNwaMaxSat(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
final IDoubleDeckerAutomaton preprocessed =
new RemoveUnreachable<>(mServices, automaton).getResult();
return new MinimizeNwaMaxSAT<>(mServices, factory, preprocessed);
}
/**
* @param automaton
* The automaton.
* @param factory
* state factory
* @return new {@link MinimizeNwaMaxSAT2} instance
* @throws Throwable
* when error occurs
*/
public IOperation minimizeNwaPmaxSat(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
final IDoubleDeckerAutomaton preprocessed =
new RemoveDeadEnds<>(mServices, automaton).getResult();
return new MinimizeNwaPmaxSatDirectBi<>(mServices, factory, preprocessed);
}
/**
* @param automaton
* The automaton.
* @param factory
* state factory
* @return new {@link ReduceNwaDirectSimulation} instance
* @throws Throwable
* when error occurs
*/
public IOperation reduceNwaDirectSimulation(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
final IDoubleDeckerAutomaton preprocessed =
new RemoveDeadEnds<>(mServices, automaton).getResult();
return new ReduceNwaDirectSimulation<>(mServices, factory, preprocessed, false);
}
/**
* @param automaton
* The automaton.
* @param factory
* state factory
* @return new {@link ReduceNwaDirectSimulationB} instance
* @throws Throwable
* when error occurs
*/
public IOperation reduceNwaDirectSimulationB(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
final IDoubleDeckerAutomaton preprocessed =
new RemoveDeadEnds<>(mServices, automaton).getResult();
return new ReduceNwaDirectSimulationB<>(mServices, factory, preprocessed);
}
/**
* @param automaton
* The automaton.
* @param factory
* state factory
* @return new {@link ReduceNwaDelayedSimulation} instance
* @throws Throwable
* when error occurs
*/
public IOperation reduceNwaDelayedSimulation(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
final IDoubleDeckerAutomaton preprocessed =
new RemoveDeadEnds<>(mServices, automaton).getResult();
return new ReduceNwaDelayedSimulation<>(mServices, factory, preprocessed, false);
}
/**
* @param automaton
* The automaton.
* @param factory
* state factory
* @return new {@link ReduceNwaDelayedSimulationB} instance
* @throws Throwable
* when error occurs
*/
public IOperation reduceNwaDelayedSimulationB(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
final IDoubleDeckerAutomaton preprocessed =
new RemoveNonLiveStates<>(mServices, automaton).getResult();
return new ReduceNwaDelayedSimulationB<>(mServices, factory, preprocessed);
}
/**
* @param automaton
* The automaton.
* @param factory
* state factory
* @return new {@link ReduceNwaDelayedFullMultipebbleSimulation} instance
* @throws Throwable
* when error occurs
*/
public IOperation reduceNwaDelayedFullMultipebbleSimulation(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
final IDoubleDeckerAutomaton preprocessed =
new RemoveUnreachable<>(mServices, automaton).getResult();
return new ReduceNwaDelayedFullMultipebbleSimulation<>(mServices, factory, preprocessed);
}
/**
* @param automaton
* The automaton.
* @param factory
* state factory
* @return new {@link ReduceNwaDirectSimulation} instance
* @throws Throwable
* when error occurs
*/
public IOperation shrinkNwa(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
final IDoubleDeckerAutomaton preprocessed =
new RemoveUnreachable<>(mServices, automaton).getResult();
return new ShrinkNwa<>(mServices, factory, preprocessed);
}
public IOperation buchiComplementNcsb(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
return new BuchiComplementNCSB<>(mServices, factory, automaton);
}
/**
* @param automaton
* The automaton.
* @param factory
* state factory
* @return new {@link BuchiReduce} instance
* @throws Throwable
* when error occurs
*/
public IOperation buchiReduce(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
final IDoubleDeckerAutomaton preprocessed =
new RemoveDeadEnds<>(mServices, automaton).getResult();
return new BuchiReduce<>(mServices, factory, preprocessed);
}
/**
* @param automaton
* The automaton.
* @param factory
* state factory
* @return new {@code Complement()} instance
* @throws Throwable
* when error occurs
*/
public IOperation complement(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
return new Complement<>(mServices, factory, automaton);
}
/**
* @param automaton
* The automaton.
* @param factory
* state factory
* @return new {@link MinimizeNwaOverapproximation} instance
* @throws Throwable
* when error occurs
*/
public IOperation minimizeNwaOverapproximation(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
final IDoubleDeckerAutomaton preprocessed =
new RemoveUnreachable<>(mServices, automaton).getResult();
return new MinimizeNwaOverapproximation<>(mServices, factory, preprocessed);
}
/**
* @param automaton
* The automaton.
* @return new {@link RemoveDeadEnds} instance
* @throws Throwable
* when error occurs
*/
public IOperation
removeDeadEnds(final INestedWordAutomaton automaton) throws Throwable {
return new RemoveDeadEnds<>(mServices, automaton);
}
/**
* @param automaton
* The automaton.
* @return new {@link RemoveNonLiveStates} instance
* @throws Throwable
* when error occurs
*/
public IOperation
removeNonLiveStates(final INestedWordAutomaton automaton) throws Throwable {
return new RemoveNonLiveStates<>(mServices, automaton);
}
/**
* @param automaton
* The automaton.
* @param factory
* state factory
* @return new {@link DirectSimulationComparison} instance
* @throws Throwable
* when error occurs
*/
public IOperation directSimulationComparison(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
return new DirectSimulationComparison<>(mServices, factory, automaton);
}
/**
* @param automaton
* The automaton.
* @param factory
* state factory
* @return new {@link ReduceNwaDirectFullMultipebbleSimulation} instance
* @throws Throwable
* when error occurs
*/
public IOperation reduceNwaDirectFullMultipebbleSimulation(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
final IDoubleDeckerAutomaton preprocessed =
new RemoveUnreachable<>(mServices, automaton).getResult();
return new ReduceNwaDirectFullMultipebbleSimulation<>(mServices, factory, preprocessed);
}
/**
* @param automaton
* The automaton.
* @param factory
* state factory
* @return new {@link CompareSimulations} instance
* @throws Throwable
* when error occurs
*/
public IOperation compareSimulations(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
final IDoubleDeckerAutomaton preprocessed =
new RemoveUnreachable<>(mServices, automaton).getResult();
return new CompareSimulations<>(mServices, factory, preprocessed);
}
/**
* @param automaton
* The automaton.
* @param factory
* state factory
* @return new {@link MinimizeNwaPmaxSatDirect} instance
* @throws Throwable
* when error occurs
*/
public IOperation minimizeNwaPmaxSatAsymmetric(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
final IDoubleDeckerAutomaton preprocessed =
new RemoveDeadEnds<>(mServices, automaton).getResult();
return new MinimizeNwaPmaxSatDirect<>(mServices, factory, preprocessed);
}
/**
* @param automaton
* The automaton.
* @param factory
* state factory
* @return new {@link ReduceBuchiFairDirectSimulation} instance
* @throws Throwable
* when error occurs
*/
public IOperation reduceBuchiFairDirectSimulation(
final INestedWordAutomaton automaton, final StringFactory factory) throws Throwable {
final IDoubleDeckerAutomaton preprocessed =
new RemoveDeadEnds<>(mServices, automaton).getResult();
return new ReduceBuchiFairDirectSimulation<>(mServices, factory, preprocessed);
}
}