Browse Source

nicer output for storm-conv and fixed an issue in storm-conv related to substituting constants before translating the functions

main
TimQu 7 years ago
parent
commit
c3837968dd
  1. 46
      src/storm-conv-cli/storm-conv.cpp
  2. 4
      src/storm-conv/api/storm-conv.cpp
  3. 4
      src/storm-conv/converter/options/JaniConversionOptions.cpp
  4. 3
      src/storm-conv/converter/options/JaniConversionOptions.h
  5. 7
      src/storm-parsers/api/model_descriptions.cpp
  6. 2
      src/storm-parsers/api/model_descriptions.h

46
src/storm-conv-cli/storm-conv.cpp

@ -11,6 +11,7 @@
#include "storm-parsers/api/storm-parsers.h"
#include "storm/utility/initialize.h"
#include "storm/utility/macros.h"
#include "storm/utility/Stopwatch.h"
#include "storm/storage/SymbolicModelDescription.h"
#include "storm/storage/jani/Model.h"
@ -42,15 +43,28 @@ namespace storm {
}
}
storm::utility::Stopwatch startStopwatch(std::string const& message) {
STORM_PRINT_AND_LOG(message);
return storm::utility::Stopwatch(true);
}
void stopStopwatch(storm::utility::Stopwatch& stopWatch) {
stopWatch.stop();
STORM_PRINT_AND_LOG(" done. (" << stopWatch << " seconds)." << std::endl);
}
void processPrismInputJaniOutput(storm::prism::Program const& prismProg, std::vector<storm::jani::Property> const& properties) {
auto const& output = storm::settings::getModule<storm::settings::modules::ConversionOutputSettings>();
auto const& input = storm::settings::getModule<storm::settings::modules::ConversionInputSettings>();
auto const& jani = storm::settings::getModule<storm::settings::modules::JaniExportSettings>();
auto conversionTime = startStopwatch("Converting PRISM Program to JANI model ... " );
storm::converter::PrismToJaniConverterOptions options;
options.allVariablesGlobal = jani.isGlobalVarsSet();
options.suffix = "";
options.janiOptions = storm::converter::JaniConversionOptions(jani);
options.janiOptions.substituteConstants = true;
// Get the name of the output file
std::string outputFilename = "";
@ -89,20 +103,27 @@ namespace storm {
auto janiModelProperties = storm::api::convertPrismToJani(prismProg, properties, options);
stopStopwatch(conversionTime);
auto exportingTime = startStopwatch("Exporting JANI model ... ");
if (outputFilename != "") {
storm::api::exportJaniToFile(janiModelProperties.first, janiModelProperties.second, outputFilename, jani.isCompactJsonSet());
STORM_PRINT_AND_LOG("Stored to file '" << outputFilename << "'");
}
if (output.isStdOutOutputEnabled()) {
storm::api::printJaniToStream(janiModelProperties.first, janiModelProperties.second, std::cout, jani.isCompactJsonSet());
}
stopStopwatch(exportingTime);
}
void processPrismInput() {
auto parsingTime = startStopwatch("Parsing PRISM input ... " );
auto const& input = storm::settings::getModule<storm::settings::modules::ConversionInputSettings>();
// Parse the prism program
storm::storage::SymbolicModelDescription prismProg = storm::api::parseProgram(input.getPrismInputFilename(), input.isPrismCompatibilityEnabled());
storm::storage::SymbolicModelDescription prismProg = storm::api::parseProgram(input.getPrismInputFilename(), input.isPrismCompatibilityEnabled(), false);
// Parse properties (if available)
std::vector<storm::jani::Property> properties;
@ -111,13 +132,14 @@ namespace storm {
properties = storm::api::parsePropertiesForSymbolicModelDescription(input.getPropertyInput(), prismProg, propertyFilter);
}
// Substitute constant definitions in program and properties.
// Set constant definitions in program
std::string constantDefinitionString = input.getConstantDefinitionString();
auto constantDefinitions = prismProg.parseConstantDefinitions(constantDefinitionString);
prismProg = storm::storage::SymbolicModelDescription(prismProg.asPrismProgram().defineUndefinedConstants(constantDefinitions).substituteConstants());
if (!properties.empty()) {
properties = storm::api::substituteConstantsInProperties(properties, constantDefinitions);
}
prismProg = storm::storage::SymbolicModelDescription(prismProg.asPrismProgram().defineUndefinedConstants(constantDefinitions));
// Substitution of constants can only be done after conversion in order to preserve formula definitions in which
// constants appear that are renamed in some modules...
stopStopwatch(parsingTime);
// Branch on the type of output
auto const& output = storm::settings::getModule<storm::settings::modules::ConversionOutputSettings>();
@ -129,6 +151,8 @@ namespace storm {
}
void processJaniInputJaniOutput(storm::jani::Model const& janiModel, std::vector<storm::jani::Property> const& properties) {
auto conversionTime = startStopwatch("Performing transformations on JANI model ... " );
auto const& output = storm::settings::getModule<storm::settings::modules::ConversionOutputSettings>();
auto const& input = storm::settings::getModule<storm::settings::modules::ConversionInputSettings>();
auto const& jani = storm::settings::getModule<storm::settings::modules::JaniExportSettings>();
@ -166,16 +190,23 @@ namespace storm {
auto transformedProperties = properties;
storm::api::transformJani(transformedJaniModel, transformedProperties, options);
stopStopwatch(conversionTime);
auto exportingTime = startStopwatch("Exporting JANI model ... ");
if (outputFilename != "") {
storm::api::exportJaniToFile(transformedJaniModel, transformedProperties, outputFilename, jani.isCompactJsonSet());
STORM_PRINT_AND_LOG("Stored to file '" << outputFilename << "'");
}
if (output.isStdOutOutputEnabled()) {
storm::api::printJaniToStream(transformedJaniModel, transformedProperties, std::cout, jani.isCompactJsonSet());
}
stopStopwatch(exportingTime);
}
void processJaniInput() {
auto parsingTime = startStopwatch("Parsing JANI input ... " );
auto const& input = storm::settings::getModule<storm::settings::modules::ConversionInputSettings>();
// Parse the jani model
@ -200,8 +231,9 @@ namespace storm {
if (!properties.empty()) {
properties = storm::api::substituteConstantsInProperties(properties, constantDefinitions);
}
stopStopwatch(parsingTime);
// Branch on the type of output
auto const& output = storm::settings::getModule<storm::settings::modules::ConversionOutputSettings>();
if (output.isJaniOutputSet()) {
processJaniInputJaniOutput(janiModel, properties);

4
src/storm-conv/api/storm-conv.cpp

@ -13,6 +13,10 @@ namespace storm {
void transformJani(storm::jani::Model& janiModel, std::vector<storm::jani::Property>& properties, storm::converter::JaniConversionOptions const& options) {
if (options.substituteConstants) {
janiModel = janiModel.substituteConstants();
}
if (!options.locationVariables.empty()) {
for (auto const& pair : options.locationVariables) {
storm::jani::JaniLocationExpander expander(janiModel);

4
src/storm-conv/converter/options/JaniConversionOptions.cpp

@ -3,11 +3,11 @@
namespace storm {
namespace converter {
JaniConversionOptions::JaniConversionOptions() : standardCompliant(false), flatten(false), allowedModelFeatures(storm::jani::getAllKnownModelFeatures()) {
JaniConversionOptions::JaniConversionOptions() : standardCompliant(false), flatten(false), substituteConstants(true), allowedModelFeatures(storm::jani::getAllKnownModelFeatures()) {
// Intentionally left empty
};
JaniConversionOptions::JaniConversionOptions(storm::settings::modules::JaniExportSettings const& settings) : locationVariables(settings.getLocationVariables()), standardCompliant(settings.isExportAsStandardJaniSet()), flatten(settings.isExportFlattenedSet()), allowedModelFeatures(storm::jani::getAllKnownModelFeatures()) {
JaniConversionOptions::JaniConversionOptions(storm::settings::modules::JaniExportSettings const& settings) : locationVariables(settings.getLocationVariables()), standardCompliant(settings.isExportAsStandardJaniSet()), flatten(settings.isExportFlattenedSet()), substituteConstants(true), allowedModelFeatures(storm::jani::getAllKnownModelFeatures()) {
if (settings.isEliminateFunctionsSet()) {
allowedModelFeatures.remove(storm::jani::ModelFeature::Functions);
}

3
src/storm-conv/converter/options/JaniConversionOptions.h

@ -24,6 +24,9 @@ namespace storm {
/// If set, the model is transformed into a single automaton
bool flatten;
/// If set, constants in expressions are substituted with their definition
bool substituteConstants;
/// If given, the model will get this name
boost::optional<std::string> modelName;

7
src/storm-parsers/api/model_descriptions.cpp

@ -13,8 +13,11 @@
namespace storm {
namespace api {
storm::prism::Program parseProgram(std::string const& filename, bool prismCompatibility) {
storm::prism::Program program = storm::parser::PrismParser::parse(filename, prismCompatibility).simplify().simplify();
storm::prism::Program parseProgram(std::string const& filename, bool prismCompatibility, bool simplify) {
storm::prism::Program program = storm::parser::PrismParser::parse(filename, prismCompatibility);
if (simplify) {
program = program.simplify().simplify();
}
program.checkValidity();
return program;
}

2
src/storm-parsers/api/model_descriptions.h

@ -15,7 +15,7 @@ namespace storm {
namespace api {
storm::prism::Program parseProgram(std::string const& filename, bool prismCompatibility = false);
storm::prism::Program parseProgram(std::string const& filename, bool prismCompatibility = false, bool simplify = true);
std::pair<storm::jani::Model, std::map<std::string, storm::jani::Property>> parseJaniModel(std::string const& filename);
std::pair<storm::jani::Model, std::map<std::string, storm::jani::Property>> parseJaniModel(std::string const& filename, storm::jani::ModelFeatures const& allowedFeatures);

Loading…
Cancel
Save