Jip Spel
6 years ago
4 changed files with 185 additions and 114 deletions
-
8src/storm-pars/analysis/Lattice.cpp
-
120src/storm-pars/analysis/Lattice.h
-
129src/storm-pars/analysis/LatticeExtender.cpp
-
42src/storm-pars/analysis/LatticeExtender.h
@ -0,0 +1,129 @@ |
|||
//
|
|||
// Created by Jip Spel on 28.08.18.
|
|||
//
|
|||
|
|||
#include "LatticeExtender.h"
|
|||
#include "storm/utility/macros.h"
|
|||
#include "storm/storage/SparseMatrix.h"
|
|||
#include "storm/utility/graph.h"
|
|||
#include <storm/logic/Formula.h>
|
|||
#include <storm/modelchecker/propositional/SparsePropositionalModelChecker.h>
|
|||
#include "storm/models/sparse/Model.h"
|
|||
|
|||
#include "storm/exceptions/NotImplementedException.h"
|
|||
#include "storm/exceptions/NotSupportedException.h"
|
|||
|
|||
#include <set>
|
|||
|
|||
namespace storm { |
|||
namespace analysis { |
|||
|
|||
template <typename ValueType> |
|||
LatticeExtender<ValueType>::LatticeExtender(){//std::shared_ptr<storm::models::sparse::Dtmc<ValueType>> model) {
|
|||
//TODO
|
|||
} |
|||
|
|||
// template <typename ValueType>
|
|||
// storm::analysis::Lattice* LatticeExtender<ValueType>::toLattice(std::vector<std::shared_ptr<storm::logic::Formula const>> formulas) {
|
|||
// STORM_LOG_THROW((++formulas.begin()) == formulas.end(), storm::exceptions::NotSupportedException, "Only one formula allowed for monotonicity analysis");
|
|||
// STORM_LOG_THROW((*(formulas[0])).isProbabilityOperatorFormula()
|
|||
// && ((*(formulas[0])).asProbabilityOperatorFormula().getSubformula().isUntilFormula()
|
|||
// || (*(formulas[0])).asProbabilityOperatorFormula().getSubformula().isEventuallyFormula()), storm::exceptions::NotSupportedException, "Expecting until formula");
|
|||
//
|
|||
// uint_fast64_t numberOfStates = this->model.getNumberOfStates();
|
|||
//
|
|||
// storm::modelchecker::SparsePropositionalModelChecker<storm::models::sparse::Model<ValueType>> propositionalChecker(this->model);
|
|||
// storm::storage::BitVector phiStates;
|
|||
// storm::storage::BitVector psiStates;
|
|||
// if ((*(formulas[0])).asProbabilityOperatorFormula().getSubformula().isUntilFormula()) {
|
|||
// phiStates = propositionalChecker.check((*(formulas[0])).asProbabilityOperatorFormula().getSubformula().asUntilFormula().getLeftSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
|
|||
// psiStates = propositionalChecker.check((*(formulas[0])).asProbabilityOperatorFormula().getSubformula().asUntilFormula().getRightSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
|
|||
// } else {
|
|||
// phiStates = storm::storage::BitVector(numberOfStates, true);
|
|||
// psiStates = propositionalChecker.check((*(formulas[0])).asProbabilityOperatorFormula().getSubformula().asEventuallyFormula().getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
|
|||
// }
|
|||
//
|
|||
// // Get the maybeStates
|
|||
// std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 = storm::utility::graph::performProb01(this->model.getBackwardTransitions(), phiStates, psiStates);
|
|||
// storm::storage::BitVector topStates = statesWithProbability01.second;
|
|||
// storm::storage::BitVector bottomStates = statesWithProbability01.first;
|
|||
//
|
|||
// STORM_LOG_THROW(topStates.begin() != topStates.end(), storm::exceptions::NotImplementedException, "Formula yields to no 1 states");
|
|||
// STORM_LOG_THROW(bottomStates.begin() != bottomStates.end(), storm::exceptions::NotImplementedException, "Formula yields to no zero states");
|
|||
//
|
|||
// // Transform to Lattice
|
|||
// auto matrix = this->model.getTransitionMatrix();
|
|||
//
|
|||
// for (uint_fast64_t i = 0; i < numberOfStates; ++i) {
|
|||
// stateMap[i] = storm::storage::BitVector(numberOfStates, false);
|
|||
//
|
|||
// auto row = matrix.getRow(i);
|
|||
// for (auto rowItr = row.begin(); rowItr != row.end(); ++rowItr) {
|
|||
// stateMap[i].set(rowItr->getColumn(), true);
|
|||
// }
|
|||
// // TODO: allow more than 2 transitions? or fix this in preprocessing?
|
|||
// STORM_LOG_THROW(stateMap[i].getNumberOfSetBits() <= 2, storm::exceptions::NotSupportedException, "Only two outgoing transitions per state allowed");
|
|||
// }
|
|||
//
|
|||
// // Create the Lattice
|
|||
// storm::analysis::Lattice *lattice = new storm::analysis::Lattice(topStates, bottomStates, numberOfStates);
|
|||
// return this->extendLattice(lattice, std::set<storm::expressions::Expression>({}));
|
|||
// }
|
|||
//
|
|||
// template <typename ValueType>
|
|||
// storm::analysis::Lattice* LatticeExtender<ValueType>::extendLattice(storm::analysis::Lattice* lattice, std::set<storm::expressions::Expression> assumptions) {
|
|||
// uint_fast64_t numberOfStates = this->model.getNumberOfStates();
|
|||
//
|
|||
// storm::storage::BitVector oldStates(numberOfStates);
|
|||
//
|
|||
// // Create a copy of the states already present in the lattice.
|
|||
// storm::storage::BitVector seenStates = lattice->getAddedStates();
|
|||
//
|
|||
// while (oldStates != seenStates) {
|
|||
// // As long as new states are added to the lattice, continue.
|
|||
// oldStates = storm::storage::BitVector(seenStates);
|
|||
//
|
|||
// for (auto stateItr = stateMap.begin(); stateItr != stateMap.end(); ++stateItr) {
|
|||
// // Iterate over all states
|
|||
// auto stateNumber = stateItr->first;
|
|||
// storm::storage::BitVector successors = stateItr->second;
|
|||
//
|
|||
// // Check if current state has not been added yet, and all successors have
|
|||
// bool check = !seenStates[stateNumber];
|
|||
// for (auto succIndex = successors.getNextSetIndex(0); check && succIndex != numberOfStates; succIndex = successors.getNextSetIndex(++succIndex)) {
|
|||
// check &= seenStates[succIndex];
|
|||
// }
|
|||
//
|
|||
// if (check && successors.getNumberOfSetBits() == 1) {
|
|||
// // As there is only one successor the current state and its successor must be at the same nodes.
|
|||
// lattice->addToNode(stateNumber, lattice->getNode(successors.getNextSetIndex(0)));
|
|||
// seenStates.set(stateNumber);
|
|||
// } else if (check && successors.getNumberOfSetBits() > 1) {
|
|||
// // TODO: allow more than 2 transitions?
|
|||
//
|
|||
// // Otherwise, check how the two states compare, and add if the comparison is possible.
|
|||
// uint_fast64_t successor1 = successors.getNextSetIndex(0);
|
|||
// uint_fast64_t successor2 = successors.getNextSetIndex(successor1 + 1);
|
|||
// int compareResult = lattice->compare(successor1, successor2);
|
|||
// if (compareResult == 1) {
|
|||
// // successor 1 is closer to top than successor 2
|
|||
// lattice->addBetween(stateNumber, lattice->getNode(successor1),
|
|||
// lattice->getNode(successor2));
|
|||
// } else if (compareResult == 2) {
|
|||
// // successor 2 is closer to top than successor 1
|
|||
// lattice->addBetween(stateNumber, lattice->getNode(successor2),
|
|||
// lattice->getNode(successor1));
|
|||
// } else if (compareResult == 0) {
|
|||
// // the successors are at the same level
|
|||
// lattice->addToNode(stateNumber, lattice->getNode(successor1));
|
|||
// } else {
|
|||
// // TODO: create critical pair
|
|||
// }
|
|||
// seenStates.set(stateNumber);
|
|||
// }
|
|||
// }
|
|||
// }
|
|||
// return lattice;
|
|||
// }
|
|||
} |
|||
} |
@ -0,0 +1,42 @@ |
|||
// |
|||
// Created by Jip Spel on 28.08.18. |
|||
// |
|||
|
|||
#ifndef STORM_LATTICEEXTENDER_H |
|||
#define STORM_LATTICEEXTENDER_H |
|||
|
|||
#include <storm/logic/Formula.h> |
|||
#include "storm/models/sparse/Dtmc.h" |
|||
#include "storm-pars/analysis/Lattice.h" |
|||
|
|||
|
|||
|
|||
namespace storm { |
|||
namespace analysis { |
|||
|
|||
template <typename ValueType> |
|||
class LatticeExtender { |
|||
|
|||
public: |
|||
LatticeExtender(); |
|||
|
|||
// /*! |
|||
// * Creates a Lattice based on the transition matrix, topStates of the Lattice and bottomStates of the Lattice |
|||
// * @tparam ValueType Type of the probabilities |
|||
// * @param model The pointer to the model |
|||
// * @param formulas Vector with pointer to formula |
|||
// * @return pointer to the created Lattice. |
|||
// */ |
|||
// storm::analysis::Lattice* toLattice(std::vector<std::shared_ptr<storm::logic::Formula const>> formulas); |
|||
// |
|||
// storm::analysis::Lattice* extendLattice(storm::analysis::Lattice* lattice, std::set<storm::expressions::Expression> assumptions); |
|||
|
|||
private: |
|||
std::shared_ptr<storm::models::sparse::Dtmc<ValueType>> model; |
|||
|
|||
std::map<uint_fast64_t, storm::storage::BitVector> stateMap; |
|||
}; |
|||
} |
|||
} |
|||
|
|||
#endif //STORM_LATTICEEXTENDER_H |
Write
Preview
Loading…
Cancel
Save
Reference in new issue