80 ModelCheckerType<ModelType, SolveValueType> modelchecker(model);
82 for (
auto const& property : input.
properties) {
85 modelchecker.specifyFormula(storm::api::createTask<ValueType>(property.getRawFormula(),
true));
86 modelchecker.setInstantiationsAreGraphPreserving(samples.
graphPreserving);
90 std::vector<typename storm::utility::parametric::VariableType<ValueType>::type> parameters;
91 std::vector<typename std::vector<typename storm::utility::parametric::CoefficientType<ValueType>::type>::const_iterator> iterators;
92 std::vector<typename std::vector<typename storm::utility::parametric::CoefficientType<ValueType>::type>::const_iterator> iteratorEnds;
100 for (
auto const& entry : product) {
101 parameters.push_back(entry.first);
102 iterators.push_back(entry.second.cbegin());
103 iteratorEnds.push_back(entry.second.cend());
109 for (uint64_t i = 0; i < parameters.size(); ++i) {
110 valuation[parameters[i]] = *iterators[i];
114 std::unique_ptr<storm::modelchecker::CheckResult> result = modelchecker.check(
Environment(), valuation);
115 valuationWatch.
stop();
120 printInitialStatesResult<ValueType>(result, &valuationWatch, &valuation);
122 for (uint64_t i = 0; i < parameters.size(); ++i) {
124 if (iterators[i] == iteratorEnds[i]) {
126 iterators[i] = product.at(parameters[i]).cbegin();
129 if (i == parameters.size() - 1) {
149 verifyPropertiesAtSamplePoints<storm::modelchecker::SparseDtmcInstantiationModelChecker, storm::models::sparse::Dtmc<ValueType>, ValueType,
150 SolveValueType>(*model->template as<storm::models::sparse::Dtmc<ValueType>>(), input, samples);
152 verifyPropertiesAtSamplePoints<storm::modelchecker::SparseCtmcInstantiationModelChecker, storm::models::sparse::Ctmc<ValueType>, ValueType,
153 SolveValueType>(*model->template as<storm::models::sparse::Ctmc<ValueType>>(), input, samples);
155 verifyPropertiesAtSamplePoints<storm::modelchecker::SparseMdpInstantiationModelChecker, storm::models::sparse::Mdp<ValueType>, ValueType,
156 SolveValueType>(*model->template as<storm::models::sparse::Mdp<ValueType>>(), input, samples);
158 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Sampling is currently only supported for DTMCs, CTMCs and MDPs.");
164 STORM_LOG_THROW(!model || model->isSparseModel(), storm::exceptions::NotSupportedException,
"Sampling is only supported for sparse models.");
167 if (sampleString.empty()) {
172 std::set<typename storm::utility::parametric::VariableType<ValueType>::type> modelParameters;
176 modelParameters.insert(rewParameters.begin(), rewParameters.end());
178 std::vector<std::string> cartesianProducts;
179 boost::split(cartesianProducts, sampleString, boost::is_any_of(
";"));
180 for (
auto& product : cartesianProducts) {
181 boost::trim(product);
184 std::vector<std::string> valuesForVariables;
185 boost::split(valuesForVariables, product, boost::is_any_of(
","));
186 for (
auto& values : valuesForVariables) {
190 std::set<typename storm::utility::parametric::VariableType<ValueType>::type> encounteredParameters;
193 for (
auto const& varValues : valuesForVariables) {
194 auto equalsPosition = varValues.find(
"=");
195 STORM_LOG_THROW(equalsPosition != varValues.npos, storm::exceptions::WrongFormatException,
"Incorrect format of samples.");
196 std::string variableName = varValues.substr(0, equalsPosition);
197 boost::trim(variableName);
198 std::string values = varValues.substr(equalsPosition + 1);
201 bool foundParameter =
false;
203 for (
auto const& parameter : modelParameters) {
204 std::stringstream parameterStream;
205 parameterStream << parameter;
206 if (parameterStream.str() == variableName) {
207 foundParameter =
true;
208 theParameter = parameter;
209 encounteredParameters.insert(parameter);
212 STORM_LOG_THROW(foundParameter, storm::exceptions::WrongFormatException,
"Unknown parameter '" << variableName <<
"'.");
214 std::vector<std::string> splitValues;
215 boost::split(splitValues, values, boost::is_any_of(
":"));
216 STORM_LOG_THROW(!splitValues.empty(), storm::exceptions::WrongFormatException,
"Expecting at least one value per parameter.");
218 auto& list = newCartesianProduct[theParameter];
220 for (
auto& value : splitValues) {
226 STORM_LOG_THROW(encounteredParameters == modelParameters, storm::exceptions::WrongFormatException,
227 "Variables for all parameters are required when providing samples.");
235 std::string
const& instantiationString) {
237 "Gradient descent is currently only supported for DTMCs.");
238 std::shared_ptr<storm::models::sparse::Dtmc<ValueType>> dtmc = model->template as<storm::models::sparse::Dtmc<ValueType>>();
241 auto formula = formulas[0];
243 STORM_LOG_THROW(formula->isProbabilityOperatorFormula() || formula->isRewardOperatorFormula(), storm::exceptions::NotSupportedException,
244 "Input formula needs to be either a probability operator formula or a reward operator formula.");
248 boost::optional<std::string> rewardModel = boost::none;
249 if (formula->isRewardOperatorFormula()) {
250 if (formula->asRewardOperatorFormula().hasRewardModelName()) {
251 rewardModel = std::string(formula->asRewardOperatorFormula().getRewardModelName());
253 rewardModel = std::string(
"");
256 vars.insert(rewardParameter);
264 for (
auto const& pair : keyValue) {
265 auto variable = carl::VariablePool::getInstance().findVariableWithName(pair.first);
266 auto value = storm::utility::convertNumber<typename storm::utility::parametric::CoefficientType<ValueType>::type>(pair.second);
267 instantiation.emplace(variable, value);
273 std::shared_ptr<storm::logic::Formula> formulaWithoutBound;
275 formulaWithoutBound = std::make_shared<storm::logic::ProbabilityOperatorFormula>(
279 formulaWithoutBound = std::make_shared<storm::logic::RewardOperatorFormula>(formulas[0]->asRewardOperatorFormula().getSubformula().asSharedPointer());
285 for (
auto const& parameter : vars) {
286 std::cout <<
"Derivative w.r.t. " << parameter <<
": ";
289 std::cout << *result <<
'\n';
std::unique_ptr< modelchecker::ExplicitQuantitativeCheckResult< ConstantType > > check(Environment const &env, storm::utility::parametric::Valuation< FunctionType > const &valuation, typename utility::parametric::VariableType< FunctionType >::type const ¶meter, boost::optional< std::vector< ConstantType > > const &valueVector=boost::none)
check calculates the deriative of the model w.r.t.