/* * Copyright (C) 2016 Mostafa M.A. (mostafa.amin93@gmail.com) * Copyright (C) 2014-2016 University of Freiburg * * This file is part of the ULTIMATE Automata Library. * * The ULTIMATE Automata Library 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 Automata Library 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 Automata Library. If not, see . * * Additional permission under GNU GPL version 3 section 7: * If you modify the ULTIMATE Automata Library, 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 Automata Library grant you additional permission * to convey the resulting work. */ package de.uni_freiburg.informatik.ultimate.automata.tree.operations; import java.util.Collection; import java.util.HashSet; import de.uni_freiburg.informatik.ultimate.automata.AutomataLibraryException; import de.uni_freiburg.informatik.ultimate.automata.AutomataLibraryServices; import de.uni_freiburg.informatik.ultimate.automata.AutomataOperationCanceledException; import de.uni_freiburg.informatik.ultimate.automata.GeneralOperation; import de.uni_freiburg.informatik.ultimate.automata.IOperation; import de.uni_freiburg.informatik.ultimate.automata.statefactory.IMergeStateFactory; import de.uni_freiburg.informatik.ultimate.automata.statefactory.ISinkStateFactory; import de.uni_freiburg.informatik.ultimate.automata.statefactory.IStateFactory; import de.uni_freiburg.informatik.ultimate.automata.tree.IRankedLetter; import de.uni_freiburg.informatik.ultimate.automata.tree.ITreeAutomatonBU; import de.uni_freiburg.informatik.ultimate.core.lib.exceptions.RunningTaskInfo; /** * Complements a given treeAutomaton. * * @author mostafa (mostafa.amin93@gmail.com) * * @param * letter of the tree automaton. * @param * state of the tree automaton. */ public class Complement extends GeneralOperation> implements IOperation> { private final ITreeAutomatonBU mTreeAutomaton; protected final ITreeAutomatonBU mResult; private final Collection mAlphabet; /*** * Constructor of the complement operator * * @param services * @param factory * @param tree */ public & ISinkStateFactory> Complement( final AutomataLibraryServices services, final SF factory, final ITreeAutomatonBU tree) throws AutomataOperationCanceledException { super(services); mAlphabet = new HashSet<>(); try { mTreeAutomaton = new Totalize<>(mServices, factory, tree).getResult(); } catch (final AutomataOperationCanceledException e) { e.addRunningTaskInfo(new RunningTaskInfo(getClass(), "complementing tree automaton")); throw e; } mResult = computeResult(factory); } /*** * Constructor of the complement operator * * @param services * @param factory * @param tree */ public & ISinkStateFactory> Complement( final AutomataLibraryServices services, final SF factory, final ITreeAutomatonBU tree, final Collection alphabet) throws AutomataOperationCanceledException { super(services); mAlphabet = new HashSet<>(); mAlphabet.addAll(alphabet); try { mTreeAutomaton = new Totalize<>(mServices, factory, tree, alphabet).getResult(); } catch (final AutomataOperationCanceledException e) { e.addRunningTaskInfo(new RunningTaskInfo(getClass(), "complementing tree automaton")); throw e; } mResult = computeResult(factory); } @Override public String startMessage() { return "Starting complementing"; } @Override public String exitMessage() { return "Exiting complementing"; } private & ISinkStateFactory> ITreeAutomatonBU computeResult( final F stateFactory) { mTreeAutomaton.complementFinals(); return mTreeAutomaton; } @Override public ITreeAutomatonBU getResult() { return mResult; } @Override public boolean checkResult(final IStateFactory stateFactory) throws AutomataLibraryException { return true; } }