/*
* Copyright (C) 2020 Matthias Heizmann (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.counting;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import de.uni_freiburg.informatik.ultimate.automata.AutomataLibraryServices;
import de.uni_freiburg.informatik.ultimate.automata.AutomataOperationCanceledException;
import de.uni_freiburg.informatik.ultimate.automata.AutomatonDefinitionPrinter;
import de.uni_freiburg.informatik.ultimate.automata.IAutomaton;
import de.uni_freiburg.informatik.ultimate.core.model.models.IElement;
/**
* Data structure for Counting Automata
*
* @author Marcel Ebbinghaus
* @author who is the author?
*/
public class CountingAutomaton implements IAutomaton {
protected final AutomataLibraryServices mServices;
private Set mAlphabet;
private Set mStates;
private ArrayList mCounter;
private Map mInitialConditions;
private Map mFinalConditions;
private Map>> mTransitions;
/**
private Set mAlphabet;
private Set mStates;
private ArrayList mCounter;
private Map>> mInitialConditions;
private Map>> mFinalConditions;
private Map>> mTransitions;
*/
public CountingAutomaton(final AutomataLibraryServices services) {
super();
mServices = services;
}
public CountingAutomaton(final AutomataLibraryServices services,
Set alphabet,
Set states,
ArrayList counter,
Map initialConditions,
Map finalConditions,
Map>> transitions) {
super();
mServices = services;
mAlphabet = alphabet;
mStates = states;
mCounter = counter;
mInitialConditions = initialConditions;
mFinalConditions = finalConditions;
mTransitions = transitions;
}
/**
public CountingAutomaton(final AutomataLibraryServices services,
Set alphabet,
Set states,
ArrayList counter,
Map>> initialConditions,
Map>> finalConditions,
Map>> transitions) {
super();
mServices = services;
mAlphabet = alphabet;
mStates = states;
mCounter = counter;
mInitialConditions = initialConditions;
mFinalConditions = finalConditions;
mTransitions = transitions;
}
*/
@Override
public Set getAlphabet() {
return mAlphabet;
}
public Set getStates() {
return mStates;
}
public ArrayList getCounter() {
return mCounter;
}
public Map getInitialConditions() {
return mInitialConditions;
}
public Map getFinalConditions(){
return mFinalConditions;
}
/**
public Map>> getInitialConditions() {
return mInitialConditions;
}
public Map>> getFinalConditions() {
return mFinalConditions;
}
*/
public Map>> getTransitions() {
return mTransitions;
}
public void addTransition(STATE preState, Transition transition) {
ArrayList> currentTransitions = mTransitions.get(preState);
currentTransitions.add(transition);
mTransitions.put(preState, currentTransitions);
}
public void addInitialCondition(STATE state, ArrayList> conditionDNF) {
InitialCondition currentInitialCondition = mInitialConditions.get(state);
ConjunctGuards conjunction = new ConjunctGuards(currentInitialCondition.getCondition(), conditionDNF);
InitialCondition newInitialCondition = new InitialCondition(conjunction.getResult());
mInitialConditions.put(state, newInitialCondition);
}
public void addFinalCondition(STATE state, ArrayList> conditionDNF) {
FinalCondition currentFinalCondition = mFinalConditions.get(state);
ConjunctGuards conjunction = new ConjunctGuards(currentFinalCondition.getCondition(), conditionDNF);
FinalCondition newFinalCondition = new FinalCondition(conjunction.getResult());
mFinalConditions.put(state, newFinalCondition);
}
/**
public void addInitialCondition(STATE state, ArrayList> conditionDNF) {
ArrayList> currentInitialConditions = mInitialConditions.get(state);
ConjunctGuards conjunction = new ConjunctGuards(currentInitialConditions, conditionDNF);
mInitialConditions.put(state, conjunction.getResult());
}
public void addFinalCondition(STATE state, ArrayList> conditionDNF) {
ArrayList> currentFinalConditions = mFinalConditions.get(state);
ConjunctGuards conjunction = new ConjunctGuards(currentFinalConditions, conditionDNF);
mFinalConditions.put(state, conjunction.getResult());
}
*/
public CountingAutomaton copyCountingAutomaton() {
ArrayList counterListCopy = new ArrayList();
for (Counter counter : mCounter) {
counterListCopy.add(counter.copyCounter());
}
Map initialConditionsCopy = new HashMap();
Map finalConditionsCopy = new HashMap();
Map>> transitionsCopy = new HashMap>>();
for (STATE state : mStates) {
InitialCondition initialConditionCopy = mInitialConditions.get(state).copyInitialCondition();
initialConditionsCopy.put(state, initialConditionCopy);
FinalCondition finalConditionCopy = mFinalConditions.get(state).copyFinalCondition();
finalConditionsCopy.put(state, finalConditionCopy);
ArrayList> transitionListCopy = new ArrayList>();
for (Transition transition : mTransitions.get(state)) {
transitionListCopy.add(transition.copyTransition());
}
transitionsCopy.put(state, transitionListCopy);
}
CountingAutomaton copy = new CountingAutomaton(
mServices,
mAlphabet,
mStates,
counterListCopy,
initialConditionsCopy,
finalConditionsCopy,
transitionsCopy);
return copy;
}
@Override
public int size() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String sizeInformation() {
// TODO Auto-generated method stub
return null;
}
@Override
public IElement transformToUltimateModel(final AutomataLibraryServices services)
throws AutomataOperationCanceledException {
// TODO Auto-generated method stub
return null;
}
@Override
public String toString() {
return (AutomatonDefinitionPrinter.toString(mServices, "ca", this));
}
}