You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
3.5 KiB
79 lines
3.5 KiB
#include "storm-conv/api/storm-conv.h"
|
|
|
|
#include "storm/storage/prism/Program.h"
|
|
#include "storm/storage/jani/Property.h"
|
|
#include "storm/storage/jani/JaniLocationExpander.h"
|
|
#include "storm/storage/jani/JSONExporter.h"
|
|
|
|
#include "storm/settings/SettingsManager.h"
|
|
#include "storm/settings/modules/CoreSettings.h"
|
|
|
|
namespace storm {
|
|
namespace api {
|
|
|
|
void transformJani(storm::jani::Model& janiModel, std::vector<storm::jani::Property>& properties, storm::converter::JaniConversionOptions const& options) {
|
|
|
|
if (!options.locationVariables.empty()) {
|
|
for (auto const& pair : options.locationVariables) {
|
|
storm::jani::JaniLocationExpander expander(janiModel);
|
|
expander.transform(pair.first, pair.second);
|
|
janiModel = expander.getResult();
|
|
}
|
|
}
|
|
|
|
if (options.flatten) {
|
|
std::shared_ptr<storm::utility::solver::SmtSolverFactory> smtSolverFactory;
|
|
if (storm::settings::hasModule<storm::settings::modules::CoreSettings>()) {
|
|
smtSolverFactory = std::make_shared<storm::utility::solver::SmtSolverFactory>();
|
|
} else {
|
|
smtSolverFactory = std::make_shared<storm::utility::solver::Z3SmtSolverFactory>();
|
|
}
|
|
janiModel = janiModel.flattenComposition(smtSolverFactory);
|
|
}
|
|
|
|
if (options.standardCompliant) {
|
|
janiModel.makeStandardJaniCompliant();
|
|
}
|
|
|
|
if (!options.allowArrays && janiModel.getModelFeatures().hasArrays()) {
|
|
janiModel.eliminateArrays(properties);
|
|
}
|
|
|
|
//if (!options.allowFunctions && janiModel.getModelFeatures().hasFunctions()) {
|
|
//janiModel = janiModel.substituteFunctions();
|
|
//}
|
|
|
|
if (options.modelName) {
|
|
janiModel.setName(options.modelName.get());
|
|
}
|
|
}
|
|
|
|
std::pair<storm::jani::Model, std::vector<storm::jani::Property>> convertPrismToJani(storm::prism::Program const& program, std::vector<storm::jani::Property> const& properties, storm::converter::PrismToJaniConverterOptions options) {
|
|
std::pair<storm::jani::Model, std::vector<storm::jani::Property>> res;
|
|
|
|
// Perform conversion
|
|
auto modelAndRenaming = program.toJaniWithLabelRenaming(options.allVariablesGlobal, options.suffix, options.janiOptions.standardCompliant);
|
|
res.first = std::move(modelAndRenaming.first);
|
|
|
|
// Amend properties to potentially changed labels
|
|
for (auto const& property : properties) {
|
|
res.second.emplace_back(property.substituteLabels(modelAndRenaming.second));
|
|
}
|
|
|
|
// Postprocess Jani model based on the options
|
|
transformJani(res.first, res.second, options.janiOptions);
|
|
|
|
return res;
|
|
}
|
|
|
|
void exportJaniToFile(storm::jani::Model const& model, std::vector<storm::jani::Property> const& properties, std::string const& filename, bool compact) {
|
|
storm::jani::JsonExporter::toFile(model, properties, filename, true, compact);
|
|
}
|
|
|
|
void printJaniToStream(storm::jani::Model const& model, std::vector<storm::jani::Property> const& properties, std::ostream& ostream, bool compact) {
|
|
storm::jani::JsonExporter::toStream(model, properties, ostream, true, compact);
|
|
}
|
|
|
|
|
|
}
|
|
}
|