/*
* Copyright (C) 2020 heizmann@informatik.uni-freiburg.de
* Copyright (C) 2020 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.petrinet.operations;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import de.uni_freiburg.informatik.ultimate.automata.AutomataLibraryServices;
import de.uni_freiburg.informatik.ultimate.automata.petrinet.IPetriNet;
import de.uni_freiburg.informatik.ultimate.automata.petrinet.netdatastructures.BoundedPetriNet;
import de.uni_freiburg.informatik.ultimate.automata.petrinet.netdatastructures.Transition;
import de.uni_freiburg.informatik.ultimate.util.datastructures.ImmutableSet;
import de.uni_freiburg.informatik.ultimate.util.datastructures.relation.HashRelation;
/**
* Constructs a copy of an {@link IPetriNet} in which some flow and some places are removed.
*
* @author heizmann@informatik.uni-freiburg.de
*
* @param
* Type of letters in alphabet of Petri net
* @param
* Type of places in Petri net
*/
public class ProjectToSubnet {
private final BoundedPetriNet mResult;
private final Map, Transition> mInput2Projected;
public ProjectToSubnet(final AutomataLibraryServices services, final IPetriNet operand,
final HashRelation, PLACE> flowToRemove, final Set placesToRemove) {
mResult = new BoundedPetriNet<>(services, operand.getAlphabet(), false);
mInput2Projected = new HashMap<>();
for (final PLACE p : operand.getPlaces()) {
if (!placesToRemove.contains(p)) {
mResult.addPlace(p, operand.getInitialPlaces().contains(p), operand.isAccepting(p));
}
}
for (final Transition t : operand.getTransitions()) {
final HashSet preds = new HashSet<>(t.getPredecessors());
preds.removeAll(flowToRemove.getImage(t));
preds.removeAll(placesToRemove);
final HashSet succs = new HashSet<>(t.getSuccessors());
succs.removeAll(flowToRemove.getImage(t));
succs.removeAll(placesToRemove);
final Transition newTransition =
mResult.addTransition(t.getSymbol(), ImmutableSet.of(preds), ImmutableSet.of(succs));
mInput2Projected.put(t, newTransition);
}
}
public BoundedPetriNet getResult() {
return mResult;
}
public Map, Transition> getTransitionMapping() {
return mInput2Projected;
}
}