60
61
return std::make_pair(converted, should_negate);
64
void printStats(PetriNetBuilder& builder, options_t& options)
66
if (options.printstatistics) {
67
if (options.enablereduction != 0) {
69
std::cout << "Size of net before structural reductions: " <<
70
builder.numberOfPlaces() << " places, " <<
71
builder.numberOfTransitions() << " transitions" << std::endl;
72
std::cout << "Size of net after structural reductions: " <<
73
builder.numberOfPlaces() - builder.RemovedPlaces() << " places, " <<
74
builder.numberOfTransitions() - builder.RemovedTransitions() << " transitions" << std::endl;
75
std::cout << "Structural reduction finished after " << builder.getReductionTime() <<
76
" seconds" << std::endl;
78
std::cout << "\nNet reduction is enabled.\n";
79
builder.printStats(std::cout);
63
84
void reduce(Condition_ptr &negatedQuery, PetriEngine::PetriNetBuilder &builder,
64
85
options_t &options, bool removeLoops) {
65
86
QueryPlaceAnalysisContext placecontext(builder.getPlaceNames(), builder.getTransitionNames(), nullptr);
70
91
false, containsNext, options.reductions);
73
96
template<typename Checker>
75
98
_verify(Condition_ptr &negatedQuery, bool printstats, options_t &options, PetriEngine::PetriNetBuilder &builder) {
77
100
if (options.enablereduction > 0) {
101
PetriNetBuilder loopInvariantBuilder(builder);
78
102
bool conclusive_answer = false;
79
reduce(negatedQuery, builder, options, true);
80
auto modelChecker = std::make_unique<Checker>(*builder.makePetriNet(), negatedQuery);
103
reduce(negatedQuery, loopInvariantBuilder, options, true);
104
printStats(loopInvariantBuilder, options);
105
auto net = std::unique_ptr<PetriNet>{loopInvariantBuilder.makePetriNet()};
106
if(!options.model_out_file.empty())
109
file.open(options.model_out_file, std::ios::out);
112
auto modelChecker = std::make_unique<Checker>(*net, negatedQuery);
81
113
bool satisfied = modelChecker->isSatisfied();
115
result.satisfied = false;
116
conclusive_answer = true;
118
std::cerr << "Conclusive negative answer" << std::endl;
120
} else if (!modelChecker->isReductionDirty() || !loopInvariantBuilder.getReducer()->loopRemovalApplied()) {
83
121
result.satisfied = true;
84
122
conclusive_answer = true;
85
} else if (!modelChecker->isDirty()) {
86
result.satisfied = false;
87
conclusive_answer = true;
124
if (loopInvariantBuilder.getReducer()->loopRemovalApplied())
125
std::cerr << "Conclusive positive answer" << std::endl;
127
std::cerr << "No loop removal applied. So positive answer is conclusive.";
89
130
result.is_weak = modelChecker->isweak();
90
131
if (conclusive_answer) {
92
133
modelChecker->printStats(std::cout);
135
result.loopInvariantReduction = loopInvariantBuilder.getReducer()->loopRemovalApplied();
139
if (options.enablereduction > 0) {
97
140
reduce(negatedQuery, builder, options, false);
98
auto modelChecker = std::make_unique<Checker>(*builder.makePetriNet(), negatedQuery);
99
result.satisfied = modelChecker->isSatisfied();
100
result.is_weak = modelChecker->isweak();
141
printStats(builder, options);
143
auto modelChecker = std::make_unique<Checker>(*builder.makePetriNet(), negatedQuery);
144
result.satisfied = modelChecker->isSatisfied();
145
result.is_weak = modelChecker->isweak();
147
std::cerr << "Loop sensitive reduction answer" << std::endl;
101
149
if (printstats) {
102
150
modelChecker->printStats(std::cout);