Browse Source
Add ModelTransformation interface and abstract Product class for product of model and automaton. [Joachim Klein]
Add ModelTransformation interface and abstract Product class for product of model and automaton. [Joachim Klein]
git-svn-id: https://www.prismmodelchecker.org/svn/prism/prism/trunk@9588 bbc10eb1-c90d-0410-af57-cb519fbb1720master
2 changed files with 227 additions and 0 deletions
@ -0,0 +1,49 @@ |
|||
//============================================================================== |
|||
// |
|||
// Copyright (c) 2014- |
|||
// Authors: |
|||
// * Joachim Klein <klein@tcs.inf.tu-dresden.de> (TU Dresden) |
|||
// |
|||
//------------------------------------------------------------------------------ |
|||
// |
|||
// This file is part of PRISM. |
|||
// |
|||
// PRISM is free software; you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation; either version 2 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// PRISM 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 General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with PRISM; if not, write to the Free Software Foundation, |
|||
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|||
// |
|||
//============================================================================== |
|||
|
|||
package explicit; |
|||
|
|||
import prism.PrismException; |
|||
|
|||
/** |
|||
* Interface for a model transformation. |
|||
*/ |
|||
public interface ModelTransformation<OriginalModel extends Model, TransformedModel extends Model> { |
|||
|
|||
/** Get the original model. */ |
|||
public OriginalModel getOriginalModel(); |
|||
|
|||
/** Get the transformed model. */ |
|||
public TransformedModel getTransformedModel() throws PrismException; |
|||
|
|||
/** |
|||
* Take a {@code StateValues} object for the transformed model and |
|||
* project the values to the original model. |
|||
* @param svTransformedModel a {@code StateValues} object for the transformed model |
|||
* @return a corresponding {@code StateValues} object for the original model. |
|||
**/ |
|||
public StateValues projectToOriginalModel(StateValues svTransformedModel) throws PrismException; |
|||
} |
|||
@ -0,0 +1,178 @@ |
|||
//============================================================================== |
|||
// |
|||
// Copyright (c) 2014- |
|||
// Authors: |
|||
// * Joachim Klein <klein@tcs.inf.tu-dresden.de> (TU Dresden) |
|||
// |
|||
//------------------------------------------------------------------------------ |
|||
// |
|||
// This file is part of PRISM. |
|||
// |
|||
// PRISM is free software; you can redistribute it and/or modify |
|||
// it under the terms of the GNU General Public License as published by |
|||
// the Free Software Foundation; either version 2 of the License, or |
|||
// (at your option) any later version. |
|||
// |
|||
// PRISM 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 General Public License for more details. |
|||
// |
|||
// You should have received a copy of the GNU General Public License |
|||
// along with PRISM; if not, write to the Free Software Foundation, |
|||
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|||
// |
|||
//============================================================================== |
|||
|
|||
|
|||
package explicit; |
|||
|
|||
import java.util.BitSet; |
|||
|
|||
import parser.type.TypeBool; |
|||
import parser.type.TypeDouble; |
|||
import parser.type.TypeInt; |
|||
import prism.PrismException; |
|||
|
|||
/** |
|||
* Base class for the results of a product operation between a model and |
|||
* an automaton. Provides infrastructure for converting information on the |
|||
* states between the original model, the automaton and the product model. |
|||
* |
|||
* The mapping between product states and the constituent parts is |
|||
* specified via the (abstract) functions getModelState() and getAutomatonState(). |
|||
* |
|||
* @param <M> The type of the product model, e.g, DTMC, MDP, ... |
|||
*/ |
|||
public abstract class Product<M extends Model> implements ModelTransformation<M, M> |
|||
{ |
|||
protected M originalModel = null; |
|||
protected M productModel = null; |
|||
|
|||
/** |
|||
* For the given productState index, return the corresponding |
|||
* state index in the original model. |
|||
*/ |
|||
public abstract int getModelState(int productState); |
|||
|
|||
/** |
|||
* For the given productState index, return the corresponding |
|||
* state index in the automaton. |
|||
*/ |
|||
public abstract int getAutomatonState(int productState); |
|||
|
|||
/** |
|||
* Constructor. |
|||
* @param originalModel the original model |
|||
*/ |
|||
public Product(M originalModel) |
|||
{ |
|||
this.originalModel = originalModel; |
|||
} |
|||
|
|||
/** |
|||
* Constructor. |
|||
* @param productModel the product model |
|||
* @param originalModel the original model |
|||
*/ |
|||
public Product(M productModel, M originalModel) |
|||
{ |
|||
this.originalModel = originalModel; |
|||
this.productModel = productModel; |
|||
} |
|||
|
|||
/** |
|||
* Get the product model. |
|||
*/ |
|||
public M getProductModel() |
|||
{ |
|||
return productModel; |
|||
} |
|||
|
|||
@Override |
|||
public M getTransformedModel() |
|||
{ |
|||
return getProductModel(); |
|||
} |
|||
|
|||
@Override |
|||
public M getOriginalModel() |
|||
{ |
|||
return originalModel; |
|||
} |
|||
|
|||
/** |
|||
* Lifts a BitSet over states in the automaton to a BitSet |
|||
* over states in the product model: A bit is set in the |
|||
* result for a product state if the bit is set in the parameter |
|||
* for the corresponding automaton state. |
|||
* @param automataStates a BitSet over states of the automaton for this product. |
|||
*/ |
|||
public BitSet liftFromAutomaton(BitSet automataStates) |
|||
{ |
|||
BitSet result = new BitSet(); |
|||
|
|||
for (int productState = 0; productState < productModel.getNumStates(); productState++) { |
|||
if (automataStates.get(getAutomatonState(productState))) { |
|||
result.set(productState, true); |
|||
} |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
|
|||
/** |
|||
* Lifts a BitSet over states in the original model to a BitSet |
|||
* over states in the product model: A bit is set in the |
|||
* result for a product state if the bit is set in the parameter |
|||
* for the corresponding original model state. |
|||
* @param automataStates a BitSet over states of the automaton for this product. |
|||
*/ |
|||
public BitSet liftFromModel(BitSet modelStates) |
|||
{ |
|||
BitSet result = new BitSet(); |
|||
|
|||
for (int productState = 0; productState < productModel.getNumStates(); productState++) { |
|||
if (modelStates.get(getModelState(productState))) { |
|||
result.set(productState, true); |
|||
} |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
|
|||
/** |
|||
* Project state values from the product model back to the original model. This function |
|||
* assumes that the product model has at most one initial state per state in the original |
|||
* model. The value of this state is then projected to the corresponding state of the |
|||
* original model. |
|||
* @param sv the state values in the product model |
|||
* @return the corresponding state values in the original model |
|||
* @throws PrismException |
|||
*/ |
|||
@Override |
|||
public StateValues projectToOriginalModel(StateValues sv) throws PrismException |
|||
{ |
|||
// the resulting state values have one value per state in the original model |
|||
StateValues result = new StateValues(sv.type, getOriginalModel().getNumStates()); |
|||
|
|||
// iterate over all the initial states in the product |
|||
for (Integer productState : productModel.getInitialStates()) { |
|||
// get the state index of the corresponding state in the original model |
|||
int modelState = getModelState(productState); |
|||
|
|||
if (sv.type instanceof TypeBool) { |
|||
result.setBooleanValue(modelState, (Boolean) sv.getValue(productState)); |
|||
} else if (sv.type instanceof TypeInt) { |
|||
result.setIntValue(modelState, (Integer) sv.getValue(productState)); |
|||
} else if (sv.type instanceof TypeDouble) { |
|||
result.setDoubleValue(modelState, (Double) sv.getValue(productState)); |
|||
} else { |
|||
throw new PrismException("Handling for type "+sv.type+" not implemented."); |
|||
} |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
|
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue