|
|
@ -542,7 +542,7 @@ namespace storm { |
|
|
|
STORM_PRINT(std::endl << "Time for lattice creation: " << latticeWatch << "." << std::endl << std::endl); |
|
|
|
|
|
|
|
ofstream myfile; |
|
|
|
myfile.open ("output.dot"); |
|
|
|
myfile.open ("lattice.dot"); |
|
|
|
lattice->toDotFile(myfile); |
|
|
|
myfile.close(); |
|
|
|
|
|
|
@ -552,6 +552,16 @@ namespace storm { |
|
|
|
// Map with for each variable bool pair whether it is monotone increasing (first) or monotone decreasing (second)
|
|
|
|
std::map<carl::Variable, std::pair<bool, bool>> varsMonotone; |
|
|
|
|
|
|
|
myfile.open ("mc.dot"); |
|
|
|
myfile << "digraph \"MC\" {" << std::endl; |
|
|
|
myfile << "\t" << "node [shape=ellipse]" << std::endl; |
|
|
|
// print all nodes
|
|
|
|
for (uint_fast64_t i = 0; i < sparseModel.get()->getNumberOfStates(); ++i) { |
|
|
|
myfile << "\t\"" << i << "\" [label = \"" << i << "\"]" << std::endl; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (uint_fast64_t i = 0; i < sparseModel.get()->getNumberOfStates(); ++i) { |
|
|
|
// go over all rows
|
|
|
|
auto row = matrix.getRow(i); |
|
|
@ -559,7 +569,7 @@ namespace storm { |
|
|
|
auto first = (*row.begin()); |
|
|
|
if (first.getValue() != ValueType(1)) { |
|
|
|
auto second = (*(++row.begin())); |
|
|
|
|
|
|
|
string color = ""; |
|
|
|
auto val = first.getValue(); |
|
|
|
auto vars = val.gatherVariables(); |
|
|
|
for (auto itr = vars.begin(); itr != vars.end(); ++itr) { |
|
|
@ -573,6 +583,7 @@ namespace storm { |
|
|
|
|
|
|
|
auto compare = lattice->compare(first.getColumn(), second.getColumn()); |
|
|
|
std::pair<bool, bool>* value = &varsMonotone.find(*itr)->second; |
|
|
|
std::pair<bool, bool> old = *value; |
|
|
|
if (compare == 1) { |
|
|
|
value->first &=derivative.constantPart() >= 0; |
|
|
|
value->second &=derivative.constantPart() <= 0; |
|
|
@ -583,11 +594,41 @@ namespace storm { |
|
|
|
value->first = false; |
|
|
|
value->second = false; |
|
|
|
} |
|
|
|
} |
|
|
|
if ((value->first != old.first) && (value->second != old.second)) { |
|
|
|
color = "color = red, "; |
|
|
|
} else if ((value->first != old.first)) { |
|
|
|
myfile << "\t edge[style=dashed];" << std::endl; |
|
|
|
color = "color = blue, "; |
|
|
|
} else if ((value->second != old.second)) { |
|
|
|
myfile << "\t edge[style=dotted];" << std::endl; |
|
|
|
color = "color = blue, "; |
|
|
|
} |
|
|
|
} |
|
|
|
myfile << "\t" << i << " -> " << first.getColumn() << "[" << color << "label=\"" << first.getValue() << "\"];" |
|
|
|
<< std::endl; |
|
|
|
myfile << "\t" << i << " -> " << second.getColumn() << "[" << color << "label=\"" << second.getValue() << "\"];" |
|
|
|
<< std::endl; |
|
|
|
myfile << "\t edge[style=\"\"];" << std::endl; |
|
|
|
} else { |
|
|
|
myfile << "\t" << i << " -> " << first.getColumn() << "[label=\"" << first.getValue() << "\"];" |
|
|
|
<< std::endl; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
myfile << "\tsubgraph legend {" << std::endl; |
|
|
|
// myfile << "\t\trank=\"source\";" << std::endl;
|
|
|
|
myfile << "\t\tnode [color=white];" << std::endl; |
|
|
|
myfile << "\t\tedge [style=invis];" << std::endl; |
|
|
|
myfile << "\t\tedge [style=invis];" << std::endl; |
|
|
|
myfile << "\t\tt0 [label=\"incr+decr false\", fontcolor=red];" << std::endl; |
|
|
|
myfile << "\t\tt1 [label=\"incr false (dashed)\", fontcolor=blue];" << std::endl; |
|
|
|
myfile << "\t\tt2 [label=\"decr false (dotted)\", fontcolor=blue];" << std::endl; |
|
|
|
|
|
|
|
myfile << "\t}" << std::endl; |
|
|
|
myfile << "}" << std::endl; |
|
|
|
myfile.close(); |
|
|
|
monotonicityWatch.stop(); |
|
|
|
STORM_PRINT(std::endl << "Time for monotonicity: " << monotonicityWatch << "." << std::endl << std::endl); |
|
|
|
for (auto itr = varsMonotone.begin(); itr != varsMonotone.end(); ++itr) { |
|
|
|