|
@ -29,26 +29,10 @@ namespace storm { |
|
|
this->formulas = formulas; |
|
|
this->formulas = formulas; |
|
|
this->validate = validate; |
|
|
this->validate = validate; |
|
|
this->precision = precision; |
|
|
this->precision = precision; |
|
|
|
|
|
|
|
|
if (numberOfSamples > 0) { |
|
|
|
|
|
// sampling
|
|
|
|
|
|
if (model->isOfType(storm::models::ModelType::Dtmc)) { |
|
|
|
|
|
this->resultCheckOnSamples = std::map<typename utility::parametric::VariableType<ValueType>::type, std::pair<bool, bool>>( |
|
|
|
|
|
checkOnSamples(model->as<storm::models::sparse::Dtmc<ValueType>>(), numberOfSamples)); |
|
|
|
|
|
} else if (model->isOfType(storm::models::ModelType::Mdp)) { |
|
|
|
|
|
this->resultCheckOnSamples = std::map<typename utility::parametric::VariableType<ValueType>::type, std::pair<bool, bool>>( |
|
|
|
|
|
checkOnSamples(model->as<storm::models::sparse::Mdp<ValueType>>(), numberOfSamples)); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
checkSamples= true; |
|
|
|
|
|
} else { |
|
|
|
|
|
checkSamples= false; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<storm::models::sparse::Model<ValueType>> sparseModel = model->as<storm::models::sparse::Model<ValueType>>(); |
|
|
std::shared_ptr<storm::models::sparse::Model<ValueType>> sparseModel = model->as<storm::models::sparse::Model<ValueType>>(); |
|
|
|
|
|
|
|
|
if (regions.size() == 1) { |
|
|
if (regions.size() == 1) { |
|
|
region = *(regions.begin()); |
|
|
|
|
|
|
|
|
this->region = *(regions.begin()); |
|
|
} else { |
|
|
} else { |
|
|
assert (regions.size() == 0); |
|
|
assert (regions.size() == 0); |
|
|
typename storm::storage::ParameterRegion<ValueType>::Valuation lowerBoundaries; |
|
|
typename storm::storage::ParameterRegion<ValueType>::Valuation lowerBoundaries; |
|
@ -61,7 +45,22 @@ namespace storm { |
|
|
lowerBoundaries.insert(std::make_pair(var, lb)); |
|
|
lowerBoundaries.insert(std::make_pair(var, lb)); |
|
|
upperBoundaries.insert(std::make_pair(var, ub)); |
|
|
upperBoundaries.insert(std::make_pair(var, ub)); |
|
|
} |
|
|
} |
|
|
region = storm::storage::ParameterRegion<ValueType>(std::move(lowerBoundaries), std::move(upperBoundaries)); |
|
|
|
|
|
|
|
|
this->region = storm::storage::ParameterRegion<ValueType>(std::move(lowerBoundaries), std::move(upperBoundaries)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (numberOfSamples > 0) { |
|
|
|
|
|
// sampling
|
|
|
|
|
|
if (model->isOfType(storm::models::ModelType::Dtmc)) { |
|
|
|
|
|
this->resultCheckOnSamples = std::map<typename utility::parametric::VariableType<ValueType>::type, std::pair<bool, bool>>( |
|
|
|
|
|
checkOnSamples(model->as<storm::models::sparse::Dtmc<ValueType>>(), numberOfSamples)); |
|
|
|
|
|
} else if (model->isOfType(storm::models::ModelType::Mdp)) { |
|
|
|
|
|
this->resultCheckOnSamples = std::map<typename utility::parametric::VariableType<ValueType>::type, std::pair<bool, bool>>( |
|
|
|
|
|
checkOnSamples(model->as<storm::models::sparse::Mdp<ValueType>>(), numberOfSamples)); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
checkSamples= true; |
|
|
|
|
|
} else { |
|
|
|
|
|
checkSamples= false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
this->extender = new storm::analysis::OrderExtender<ValueType>(sparseModel); |
|
|
this->extender = new storm::analysis::OrderExtender<ValueType>(sparseModel); |
|
@ -561,17 +560,20 @@ namespace storm { |
|
|
for (auto itr2 = variables.begin(); itr2 != variables.end(); ++itr2) { |
|
|
for (auto itr2 = variables.begin(); itr2 != variables.end(); ++itr2) { |
|
|
// Only change value for current variable
|
|
|
// Only change value for current variable
|
|
|
if ((*itr) == (*itr2)) { |
|
|
if ((*itr) == (*itr2)) { |
|
|
auto val = std::pair<typename utility::parametric::VariableType<ValueType>::type, typename utility::parametric::CoefficientType<ValueType>::type>( |
|
|
|
|
|
(*itr2), storm::utility::convertNumber<typename utility::parametric::CoefficientType<ValueType>::type>( |
|
|
|
|
|
boost::lexical_cast<std::string>((i + 1) / (double(numberOfSamples + 1))))); |
|
|
|
|
|
|
|
|
auto lb = region.getLowerBoundary(itr->name()); |
|
|
|
|
|
auto ub = region.getUpperBoundary(itr->name()); |
|
|
|
|
|
// Creates samples between lb and ub, that is: lb, lb + (ub-lb)/(#samples -1), lb + 2* (ub-lb)/(#samples -1), ..., ub
|
|
|
|
|
|
auto val = |
|
|
|
|
|
std::pair<typename utility::parametric::VariableType<ValueType>::type, typename utility::parametric::CoefficientType<ValueType>::type> |
|
|
|
|
|
(*itr,utility::convertNumber<typename utility::parametric::CoefficientType<ValueType>::type>(lb + i*(ub-lb)/(numberOfSamples-1))); |
|
|
valuation.insert(val); |
|
|
valuation.insert(val); |
|
|
assert (0 < val.second && val.second < 1); |
|
|
|
|
|
|
|
|
|
|
|
} else { |
|
|
} else { |
|
|
auto val = std::pair<typename utility::parametric::VariableType<ValueType>::type, typename utility::parametric::CoefficientType<ValueType>::type>( |
|
|
|
|
|
(*itr2), storm::utility::convertNumber<typename utility::parametric::CoefficientType<ValueType>::type>( |
|
|
|
|
|
boost::lexical_cast<std::string>((1) / (double(numberOfSamples + 1))))); |
|
|
|
|
|
|
|
|
auto lb = region.getLowerBoundary(itr->name()); |
|
|
|
|
|
auto val = |
|
|
|
|
|
std::pair<typename utility::parametric::VariableType<ValueType>::type, typename utility::parametric::CoefficientType<ValueType>::type> |
|
|
|
|
|
(*itr,utility::convertNumber<typename utility::parametric::CoefficientType<ValueType>::type>(lb)); |
|
|
valuation.insert(val); |
|
|
valuation.insert(val); |
|
|
assert (0 < val.second && val.second < 1); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
storm::models::sparse::Dtmc<double> sampleModel = instantiator.instantiate(valuation); |
|
|
storm::models::sparse::Dtmc<double> sampleModel = instantiator.instantiate(valuation); |
|
|