Browse Source
Builder for ProgramGraphs, for now, ignores actions.
Builder for ProgramGraphs, for now, ignores actions.
Former-commit-id:tempestpy_adaptions5f51f17e17
[formerly1e48ddd098
] Former-commit-id:80434a7402
sjunges
8 years ago
2 changed files with 210 additions and 0 deletions
@ -0,0 +1,69 @@ |
|||||
|
#include "ProgramGraphBuilder.h"
|
||||
|
#include "src/storage/pgcl/ObserveStatement.h"
|
||||
|
#include "src/storage/pgcl/LoopStatement.h"
|
||||
|
#include "src/storage/pgcl/IfStatement.h"
|
||||
|
#include "src/storage/pgcl/NondeterministicBranch.h"
|
||||
|
#include "src/storage/pgcl/ProbabilisticBranch.h"
|
||||
|
|
||||
|
|
||||
|
namespace storm { |
||||
|
namespace builder { |
||||
|
void ProgramGraphBuilderVisitor::visit(storm::pgcl::AssignmentStatement const& s) { |
||||
|
builder.currentLoc()->addProgramEdgeToAllGroups(builder.getAction(), builder.nextLocId()); |
||||
|
|
||||
|
} |
||||
|
void ProgramGraphBuilderVisitor::visit(storm::pgcl::ObserveStatement const& s) { |
||||
|
builder.currentLoc()->addProgramEdgeToAllGroups(builder.noAction(), s.getCondition().getBooleanExpression(), builder.nextLocId()); |
||||
|
} |
||||
|
void ProgramGraphBuilderVisitor::visit(storm::pgcl::IfStatement const& s) { |
||||
|
storm::expressions::Expression elseCondition; |
||||
|
storm::ppg::ProgramLocation* beforeStatementLocation = builder.currentLoc(); |
||||
|
builder.storeNextLocation(builder.nextLoc()); |
||||
|
storm::ppg::ProgramLocation* bodyStart = builder.newLocation(); |
||||
|
builder.buildBlock(*s.getIfBody()); |
||||
|
if(s.hasElse()) { |
||||
|
builder.storeNextLocation(builder.nextLoc()); |
||||
|
bodyStart = builder.newLocation(); |
||||
|
builder.buildBlock(*s.getElseBody()); |
||||
|
} |
||||
|
beforeStatementLocation->addProgramEdgeToAllGroups(builder.noAction(), s.getCondition().getBooleanExpression(), bodyStart->id()); |
||||
|
if(s.hasElse()) { |
||||
|
elseCondition = !s.getCondition().getBooleanExpression(); |
||||
|
beforeStatementLocation->addProgramEdgeToAllGroups(builder.noAction(), elseCondition, builder.nextLocId()); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
void ProgramGraphBuilderVisitor::visit(storm::pgcl::LoopStatement const& s) { |
||||
|
storm::ppg::ProgramLocation* beforeStatementLocation = builder.currentLoc(); |
||||
|
builder.storeNextLocation(beforeStatementLocation); |
||||
|
storm::ppg::ProgramLocation* bodyStart = builder.newLocation(); |
||||
|
builder.buildBlock(*s.getBody()); |
||||
|
beforeStatementLocation->addProgramEdgeToAllGroups(builder.noAction(), s.getCondition().getBooleanExpression(), bodyStart->id()); |
||||
|
beforeStatementLocation->addProgramEdgeToAllGroups(builder.noAction(), !s.getCondition().getBooleanExpression(), builder.nextLocId()); |
||||
|
} |
||||
|
|
||||
|
void ProgramGraphBuilderVisitor::visit(storm::pgcl::NondeterministicBranch const& s) { |
||||
|
storm::ppg::ProgramLocation* beforeStatementLocation = builder.currentLoc(); |
||||
|
builder.storeNextLocation(builder.nextLoc()); |
||||
|
storm::ppg::ProgramLocation* bodyStart = builder.newLocation(); |
||||
|
builder.buildBlock(*s.getLeftBranch()); |
||||
|
beforeStatementLocation->addProgramEdgeToAllGroups(builder.noAction(), builder.nextLocId()); |
||||
|
builder.storeNextLocation(builder.nextLoc()); |
||||
|
bodyStart = builder.newLocation(); |
||||
|
beforeStatementLocation->addProgramEdgeToAllGroups(builder.noAction(), builder.nextLocId()); |
||||
|
builder.buildBlock(*s.getRightBranch()); |
||||
|
|
||||
|
} |
||||
|
void ProgramGraphBuilderVisitor::visit(storm::pgcl::ProbabilisticBranch const& s) { |
||||
|
storm::ppg::ProgramLocation* beforeStatementLocation = builder.currentLoc(); |
||||
|
builder.storeNextLocation(builder.nextLoc()); |
||||
|
storm::ppg::ProgramLocation* bodyStart = builder.newLocation(); |
||||
|
beforeStatementLocation->addProgramEdgeGroup(s.getProbability()); |
||||
|
builder.buildBlock(*s.getLeftBranch()); |
||||
|
builder.storeNextLocation(builder.nextLoc()); |
||||
|
bodyStart = builder.newLocation(); |
||||
|
beforeStatementLocation->addProgramEdgeGroup(1 - s.getProbability()); |
||||
|
builder.buildBlock(*s.getRightBranch()); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,141 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "src/storage/pgcl/PgclProgram.h" |
||||
|
#include "src/storage/ppg/ProgramGraph.h" |
||||
|
#include "src/storage/pgcl/AbstractStatementVisitor.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace builder { |
||||
|
class ProgramGraphBuilder; |
||||
|
|
||||
|
|
||||
|
class ProgramGraphBuilderVisitor: public storm::pgcl::AbstractStatementVisitor{ |
||||
|
public: |
||||
|
ProgramGraphBuilderVisitor(ProgramGraphBuilder& builder) : builder(builder) { |
||||
|
|
||||
|
} |
||||
|
|
||||
|
virtual void visit(storm::pgcl::AssignmentStatement const&); |
||||
|
virtual void visit(storm::pgcl::ObserveStatement const&); |
||||
|
virtual void visit(storm::pgcl::IfStatement const&); |
||||
|
virtual void visit(storm::pgcl::LoopStatement const&); |
||||
|
virtual void visit(storm::pgcl::NondeterministicBranch const&); |
||||
|
virtual void visit(storm::pgcl::ProbabilisticBranch const&); |
||||
|
|
||||
|
private: |
||||
|
ProgramGraphBuilder& builder; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class ProgramGraphBuilder { |
||||
|
|
||||
|
|
||||
|
public: |
||||
|
static storm::ppg::ProgramGraph* build(storm::pgcl::PgclProgram const& program) { |
||||
|
ProgramGraphBuilder builder(program); |
||||
|
builder.run(); |
||||
|
return builder.finalize(); |
||||
|
} |
||||
|
|
||||
|
~ProgramGraphBuilder() { |
||||
|
if(graph != nullptr) { |
||||
|
// delete graph; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
storm::ppg::ProgramLocation* currentLoc() const { |
||||
|
return currentStack.back(); |
||||
|
} |
||||
|
|
||||
|
storm::ppg::ProgramLocation* newLocation() { |
||||
|
currentStack.push_back(graph->addLocation()); |
||||
|
return currentLoc(); |
||||
|
} |
||||
|
|
||||
|
storm::ppg::ProgramLocation* storeNextLocation(storm::ppg::ProgramLocation* loc) { |
||||
|
nextStack.push_back(loc); |
||||
|
} |
||||
|
|
||||
|
storm::ppg::ProgramLocation* nextLoc() const { |
||||
|
return nextStack.back(); |
||||
|
} |
||||
|
|
||||
|
storm::ppg::ProgramLocationIdentifier nextLocId() const { |
||||
|
return nextLoc()->id(); |
||||
|
} |
||||
|
|
||||
|
storm::ppg::ProgramActionIdentifier getAction() const { |
||||
|
return graph->addAction(); |
||||
|
} |
||||
|
|
||||
|
storm::ppg::ProgramActionIdentifier noAction() const { |
||||
|
return noActionId; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
void buildBlock(storm::pgcl::PgclBlock const& block) { |
||||
|
|
||||
|
ProgramGraphBuilderVisitor visitor(*this); |
||||
|
for(auto const& statement : block) { |
||||
|
std::cout << "Statement " << statement->getLocationNumber() << std::endl; |
||||
|
if(!statement->isLast()) { |
||||
|
nextStack.push_back(graph->addLocation(false)); |
||||
|
} |
||||
|
assert(!currentStack.empty()); |
||||
|
assert(!nextStack.empty()); |
||||
|
statement->accept(visitor); |
||||
|
assert(!currentStack.empty()); |
||||
|
assert(!nextStack.empty()); |
||||
|
currentStack.back() = nextStack.back(); |
||||
|
nextStack.pop_back(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
private: |
||||
|
ProgramGraphBuilder(storm::pgcl::PgclProgram const& program) |
||||
|
: program(program) |
||||
|
{ |
||||
|
graph = new storm::ppg::ProgramGraph(program.getExpressionManager(), program.getVariables()); |
||||
|
noActionId = getAction(); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void run() { |
||||
|
currentStack.push_back(graph->addLocation(true)); |
||||
|
// Terminal state. |
||||
|
nextStack.push_back(graph->addLocation(false)); |
||||
|
// Observe Violated State. |
||||
|
if(program.hasObserve()) { |
||||
|
observeFailedState = graph->addLocation(); |
||||
|
} |
||||
|
buildBlock(program); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
storm::ppg::ProgramGraph* finalize() { |
||||
|
storm::ppg::ProgramGraph* tmp = graph; |
||||
|
graph = nullptr; |
||||
|
return tmp; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
std::vector<storm::ppg::ProgramLocation*> currentStack; |
||||
|
std::vector<storm::ppg::ProgramLocation*> nextStack; |
||||
|
|
||||
|
storm::ppg::ProgramActionIdentifier noActionId; |
||||
|
|
||||
|
storm::ppg::ProgramLocation* observeFailedState = nullptr; |
||||
|
|
||||
|
storm::pgcl::PgclProgram const& program; |
||||
|
storm::ppg::ProgramGraph* graph; |
||||
|
|
||||
|
|
||||
|
|
||||
|
}; |
||||
|
|
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue