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