7 changed files with 154 additions and 103 deletions
-
1src/storm/adapters/CarlAdapter.h
-
63src/storm/analysis/GraphConditions.cpp
-
75src/storm/analysis/GraphConditions.h
-
8src/storm/cli/entrypoints.h
-
42src/storm/models/sparse/Dtmc.cpp
-
54src/storm/models/sparse/Dtmc.h
-
14src/storm/utility/storm.h
@ -0,0 +1,63 @@ |
|||
|
|||
#include "GraphConditions.h"
|
|||
#include "storm/utility/constants.h"
|
|||
#include "storm/exceptions/NotImplementedException.h"
|
|||
|
|||
namespace storm { |
|||
namespace analysis { |
|||
template <typename ValueType> |
|||
ConstraintCollector<ValueType>::ConstraintCollector(storm::models::sparse::Dtmc<ValueType> const& dtmc) { |
|||
process(dtmc); |
|||
} |
|||
|
|||
template <typename ValueType> |
|||
std::unordered_set<typename ConstraintType<ValueType>::val> const& ConstraintCollector<ValueType>::getWellformedConstraints() const { |
|||
return this->wellformedConstraintSet; |
|||
} |
|||
|
|||
template <typename ValueType> |
|||
std::unordered_set<typename ConstraintType<ValueType>::val> const& ConstraintCollector<ValueType>::getGraphPreservingConstraints() const { |
|||
return this->graphPreservingConstraintSet; |
|||
} |
|||
|
|||
template <typename ValueType> |
|||
void ConstraintCollector<ValueType>::process(storm::models::sparse::Dtmc<ValueType> const& dtmc) { |
|||
for(uint_fast64_t state = 0; state < dtmc.getNumberOfStates(); ++state) { |
|||
ValueType sum = storm::utility::zero<ValueType>(); |
|||
for (auto const& transition : dtmc.getRows(state)) { |
|||
sum += transition.getValue(); |
|||
if (!storm::utility::isConstant(transition.getValue())) { |
|||
if (transition.getValue().denominator().isConstant()) { |
|||
if (transition.getValue().denominatorAsNumber() > 0) { |
|||
wellformedConstraintSet.emplace((transition.getValue().nominator() - transition.getValue().denominator()).polynomial(), storm::CompareRelation::LEQ); |
|||
wellformedConstraintSet.emplace(transition.getValue().nominator().polynomial(), storm::CompareRelation::GEQ); |
|||
} else if (transition.getValue().denominatorAsNumber() < 0) { |
|||
wellformedConstraintSet.emplace((transition.getValue().nominator() - transition.getValue().denominator()).polynomial(), storm::CompareRelation::GEQ); |
|||
wellformedConstraintSet.emplace(transition.getValue().nominator().polynomial(), storm::CompareRelation::LEQ); |
|||
} else { |
|||
assert(false); // Should fail before.
|
|||
} |
|||
} else { |
|||
wellformedConstraintSet.emplace(transition.getValue().denominator().polynomial(), storm::CompareRelation::NEQ); |
|||
STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Rational functions at edges not yet supported."); |
|||
} |
|||
graphPreservingConstraintSet.emplace(transition.getValue().nominator().polynomial(), storm::CompareRelation::NEQ); |
|||
} |
|||
} |
|||
STORM_LOG_ASSERT(!storm::utility::isConstant(sum) || storm::utility::isOne(sum), "If the sum is a constant, it must be equal to 1."); |
|||
if(!storm::utility::isConstant(sum)) { |
|||
wellformedConstraintSet.emplace((sum.nominator() - sum.denominator()).polynomial(), storm::CompareRelation::EQ); |
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
template <typename ValueType> |
|||
void ConstraintCollector<ValueType>::operator()(storm::models::sparse::Dtmc<ValueType> const& dtmc) { |
|||
process(dtmc); |
|||
} |
|||
|
|||
|
|||
template class ConstraintCollector<storm::RationalFunction>; |
|||
} |
|||
} |
@ -0,0 +1,75 @@ |
|||
#pragma once |
|||
|
|||
#include <type_traits> |
|||
#include <unordered_set> |
|||
#include "storm/adapters/CarlAdapter.h" |
|||
#include "storm/models/sparse/Dtmc.h" |
|||
|
|||
namespace storm { |
|||
namespace analysis { |
|||
|
|||
template <typename ValueType, typename Enable=void> |
|||
struct ConstraintType { |
|||
typedef storm::ArithConstraint<ValueType> val; |
|||
}; |
|||
|
|||
template<typename ValueType> |
|||
struct ConstraintType<ValueType, typename std::enable_if<std::is_same<storm::RationalFunction, ValueType>::value>::type> { |
|||
typedef carl::Formula<typename ValueType::PolyType::PolyType> val; |
|||
}; |
|||
|
|||
/** |
|||
* Class to collect constraints on parametric Markov chains. |
|||
*/ |
|||
template<typename ValueType> |
|||
class ConstraintCollector { |
|||
private: |
|||
// A set of constraints that says that the DTMC actually has valid probability distributions in all states. |
|||
std::unordered_set<typename ConstraintType<ValueType>::val> wellformedConstraintSet; |
|||
|
|||
// A set of constraints that makes sure that the underlying graph of the model does not change depending |
|||
// on the parameter values. |
|||
std::unordered_set<typename ConstraintType<ValueType>::val> graphPreservingConstraintSet; |
|||
|
|||
public: |
|||
/*! |
|||
* Constructs the a constraint collector for the given DTMC. The constraints are built and ready for |
|||
* retrieval after the construction. |
|||
* |
|||
* @param dtmc The DTMC for which to create the constraints. |
|||
*/ |
|||
ConstraintCollector(storm::models::sparse::Dtmc<ValueType> const& dtmc); |
|||
|
|||
/*! |
|||
* Returns the set of wellformed-ness constraints. |
|||
* |
|||
* @return The set of wellformed-ness constraints. |
|||
*/ |
|||
std::unordered_set<typename ConstraintType<ValueType>::val> const& getWellformedConstraints() const; |
|||
|
|||
/*! |
|||
* Returns the set of graph-preserving constraints. |
|||
* |
|||
* @return The set of graph-preserving constraints. |
|||
*/ |
|||
std::unordered_set<typename ConstraintType<ValueType>::val> const& getGraphPreservingConstraints() const; |
|||
|
|||
/*! |
|||
* Constructs the constraints for the given DTMC. |
|||
* |
|||
* @param dtmc The DTMC for which to create the constraints. |
|||
*/ |
|||
void process(storm::models::sparse::Dtmc<ValueType> const& dtmc); |
|||
|
|||
/*! |
|||
* Constructs the constraints for the given DTMC by calling the process method. |
|||
* |
|||
* @param dtmc The DTMC for which to create the constraints. |
|||
*/ |
|||
void operator()(storm::models::sparse::Dtmc<ValueType> const& dtmc); |
|||
|
|||
}; |
|||
|
|||
|
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue