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.
66 lines
2.6 KiB
66 lines
2.6 KiB
#include "src/storage/ppg/ProgramGraph.h"
|
|
#include "src/storage/jani/Model.h"
|
|
#include "src/storage/jani/Location.h"
|
|
#include "src/storage/IntegerInterval.h"
|
|
|
|
|
|
namespace storm {
|
|
namespace builder {
|
|
|
|
enum class JaniProgramGraphVariableDomainMethod {
|
|
Unrestricted, IntervalPropagation
|
|
};
|
|
|
|
struct JaniProgramGraphBuilderSetting {
|
|
JaniProgramGraphVariableDomainMethod variableDomainMethod = JaniProgramGraphVariableDomainMethod::Unrestricted;
|
|
};
|
|
|
|
class JaniProgramGraphBuilder {
|
|
public:
|
|
static unsigned janiVersion;
|
|
|
|
JaniProgramGraphBuilder() {
|
|
|
|
}
|
|
|
|
//void addVariableRestriction(storm::expressions::Variable const& var, storm::IntegerInterval const& interval ) {
|
|
|
|
//}
|
|
|
|
|
|
|
|
storm::jani::Model* build(storm::ppg::ProgramGraph const& pg, std::string const& name = "program_graph") {
|
|
expManager = pg.getExpressionManager();
|
|
storm::jani::Model* model = new storm::jani::Model(name, storm::jani::ModelType::MDP, janiVersion, expManager);
|
|
storm::jani::Automaton mainAutomaton("main");
|
|
addProcedureVariables(mainAutomaton, pg);
|
|
addProcedureLocations(mainAutomaton, pg);
|
|
model->addAutomaton(mainAutomaton);
|
|
return model;
|
|
}
|
|
|
|
private:
|
|
void addProcedureVariables(storm::jani::Automaton& automaton, storm::ppg::ProgramGraph const& pg) {
|
|
for (auto const& v : pg.getVariables()) {
|
|
if(variableRestrictions.count(v.getIndex())) {
|
|
assert(false);
|
|
} else {
|
|
storm::jani::UnboundedIntegerVariable janiVar(v.getName(), v, expManager->integer(0), false);
|
|
automaton.addUnboundedIntegerVariable(janiVar);
|
|
}
|
|
}
|
|
}
|
|
|
|
void addProcedureLocations(storm::jani::Automaton& automaton, storm::ppg::ProgramGraph const& pg) {
|
|
for(auto it = pg.locationBegin(); it != pg.locationEnd(); ++it) {
|
|
storm::jani::Location janiLoc(std::to_string(it->second.id()));
|
|
automaton.addLocation(janiLoc);
|
|
}
|
|
}
|
|
|
|
std::map<uint64_t, storm::storage::IntegerInterval> variableRestrictions;
|
|
std::shared_ptr<storm::expressions::ExpressionManager> expManager;
|
|
|
|
};
|
|
}
|
|
}
|