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.
96 lines
4.9 KiB
96 lines
4.9 KiB
#include "storm-dft/api/storm-dft.h"
|
|
|
|
#include "storm-dft/settings/modules/FaultTreeSettings.h"
|
|
#include "storm-dft/settings/modules/DftGspnSettings.h"
|
|
#include "storm-conv/api/storm-conv.h"
|
|
|
|
namespace storm {
|
|
namespace api {
|
|
|
|
template<>
|
|
void exportDFTToJsonFile(storm::storage::DFT<double> const& dft, std::string const& file) {
|
|
storm::storage::DftJsonExporter<double>::toFile(dft, file);
|
|
}
|
|
|
|
template<>
|
|
void exportDFTToJsonFile(storm::storage::DFT<storm::RationalFunction> const& dft, std::string const& file) {
|
|
STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Export to JSON not supported for this data type.");
|
|
}
|
|
|
|
template<>
|
|
std::string exportDFTToJsonString(storm::storage::DFT<double> const& dft) {
|
|
std::stringstream stream;
|
|
storm::storage::DftJsonExporter<double>::toStream(dft, stream);
|
|
return stream.str();
|
|
}
|
|
|
|
template<>
|
|
std::string exportDFTToJsonString(storm::storage::DFT<storm::RationalFunction> const& dft) {
|
|
STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Export to JSON not supported for this data type.");
|
|
}
|
|
|
|
template<>
|
|
void exportDFTToSMT(storm::storage::DFT<double> const& dft, std::string const& file) {
|
|
storm::modelchecker::DFTASFChecker asfChecker(dft);
|
|
asfChecker.convert();
|
|
asfChecker.toFile(file);
|
|
}
|
|
|
|
template<>
|
|
void exportDFTToSMT(storm::storage::DFT<storm::RationalFunction> const& dft, std::string const& file) {
|
|
STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Export to SMT does not support this data type.");
|
|
}
|
|
|
|
template<>
|
|
std::pair<std::shared_ptr<storm::gspn::GSPN>, uint64_t> transformToGSPN(storm::storage::DFT<double> const& dft) {
|
|
storm::settings::modules::FaultTreeSettings const& ftSettings = storm::settings::getModule<storm::settings::modules::FaultTreeSettings>();
|
|
storm::settings::modules::DftGspnSettings const& dftGspnSettings = storm::settings::getModule<storm::settings::modules::DftGspnSettings>();
|
|
|
|
// Set Don't Care elements
|
|
std::set<uint64_t> dontCareElements;
|
|
if (!ftSettings.isDisableDC()) {
|
|
// Insert all elements as Don't Care elements
|
|
for (std::size_t i = 0; i < dft.nrElements(); i++) {
|
|
dontCareElements.insert(dft.getElement(i)->id());
|
|
}
|
|
}
|
|
|
|
// Transform to GSPN
|
|
storm::transformations::dft::DftToGspnTransformator<double> gspnTransformator(dft);
|
|
auto priorities = gspnTransformator.computePriorities(dftGspnSettings.isExtendPriorities());
|
|
gspnTransformator.transform(priorities, dontCareElements, !dftGspnSettings.isDisableSmartTransformation(),
|
|
dftGspnSettings.isMergeDCFailed(), dftGspnSettings.isExtendPriorities());
|
|
std::shared_ptr<storm::gspn::GSPN> gspn(gspnTransformator.obtainGSPN());
|
|
return std::make_pair(gspn, gspnTransformator.toplevelFailedPlaceId());
|
|
}
|
|
|
|
std::shared_ptr<storm::jani::Model> transformToJani(storm::gspn::GSPN const& gspn, uint64_t toplevelFailedPlace) {
|
|
// Build Jani model
|
|
storm::builder::JaniGSPNBuilder builder(gspn);
|
|
std::shared_ptr<storm::jani::Model> model(builder.build("dft_gspn"));
|
|
|
|
// Build properties
|
|
std::shared_ptr<storm::expressions::ExpressionManager> const& exprManager = gspn.getExpressionManager();
|
|
storm::jani::Variable const& topfailedVar = builder.getPlaceVariable(toplevelFailedPlace);
|
|
storm::expressions::Expression targetExpression = exprManager->integer(1) == topfailedVar.getExpressionVariable().getExpression();
|
|
// Add variable for easier access to 'failed' state
|
|
builder.addTransientVariable(model.get(), "failed", targetExpression);
|
|
auto failedFormula = std::make_shared<storm::logic::AtomicExpressionFormula>(targetExpression);
|
|
auto properties = builder.getStandardProperties(model.get(), failedFormula, "Failed", "a failed state", true);
|
|
|
|
// Export Jani to file
|
|
storm::settings::modules::DftGspnSettings const& dftGspnSettings = storm::settings::getModule<storm::settings::modules::DftGspnSettings>();
|
|
if (dftGspnSettings.isWriteToJaniSet()) {
|
|
storm::api::exportJaniToFile(*model, properties, dftGspnSettings.getWriteToJaniFilename());
|
|
}
|
|
|
|
return model;
|
|
}
|
|
|
|
template<>
|
|
std::pair<std::shared_ptr<storm::gspn::GSPN>, uint64_t> transformToGSPN(storm::storage::DFT<storm::RationalFunction> const& dft) {
|
|
STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Transformation to GSPN not supported for this data type.");
|
|
}
|
|
|
|
}
|
|
}
|