130 lines
5.5 KiB

  1. #include "src/storage/jani/EdgeDestination.h"
  2. #include "src/utility/macros.h"
  3. #include "src/exceptions/WrongFormatException.h"
  4. namespace storm {
  5. namespace jani {
  6. EdgeDestination::EdgeDestination(uint64_t locationIndex, storm::expressions::Expression const& probability, std::vector<Assignment> const& assignments) : locationIndex(locationIndex), probability(probability), assignments(assignments) {
  7. for (auto const& assignment : assignments) {
  8. if (assignment.isTransientAssignment()) {
  9. transientAssignments.push_back(assignment);
  10. } else {
  11. nonTransientAssignments.push_back(assignment);
  12. }
  13. }
  14. sortAssignments(this->assignments);
  15. sortAssignments(transientAssignments);
  16. sortAssignments(nonTransientAssignments);
  17. }
  18. void EdgeDestination::addAssignment(Assignment const& assignment) {
  19. // We make sure that there are no two assignments to the same variable.
  20. for (auto const& oldAssignment : assignments) {
  21. STORM_LOG_THROW(oldAssignment.getExpressionVariable() != assignment.getExpressionVariable(), storm::exceptions::WrongFormatException, "Cannot add assignment '" << assignment << "', because another assignment '" << assignment << "' writes to the same target variable.");
  22. }
  23. assignments.push_back(assignment);
  24. sortAssignments(assignments);
  25. if (assignment.isTransientAssignment()) {
  26. transientAssignments.push_back(assignment);
  27. sortAssignments(transientAssignments);
  28. } else {
  29. nonTransientAssignments.push_back(assignment);
  30. sortAssignments(nonTransientAssignments);
  31. }
  32. }
  33. uint64_t EdgeDestination::getLocationIndex() const {
  34. return locationIndex;
  35. }
  36. storm::expressions::Expression const& EdgeDestination::getProbability() const {
  37. return probability;
  38. }
  39. void EdgeDestination::setProbability(storm::expressions::Expression const& probability) {
  40. this->probability = probability;
  41. }
  42. std::vector<Assignment>& EdgeDestination::getAssignments() {
  43. return assignments;
  44. }
  45. std::vector<Assignment> const& EdgeDestination::getAssignments() const {
  46. return assignments;
  47. }
  48. std::vector<Assignment>& EdgeDestination::getNonTransientAssignments() {
  49. return nonTransientAssignments;
  50. }
  51. std::vector<Assignment> const& EdgeDestination::getNonTransientAssignments() const {
  52. return nonTransientAssignments;
  53. }
  54. std::vector<Assignment>& EdgeDestination::getTransientAssignments() {
  55. return transientAssignments;
  56. }
  57. std::vector<Assignment> const& EdgeDestination::getTransientAssignments() const {
  58. return transientAssignments;
  59. }
  60. void EdgeDestination::substitute(std::map<storm::expressions::Variable, storm::expressions::Expression> const& substitution) {
  61. this->setProbability(this->getProbability().substitute(substitution));
  62. for (auto& assignment : this->getAssignments()) {
  63. assignment.substitute(substitution);
  64. }
  65. for (auto& assignment : this->getTransientAssignments()) {
  66. assignment.substitute(substitution);
  67. }
  68. for (auto& assignment : this->getNonTransientAssignments()) {
  69. assignment.substitute(substitution);
  70. }
  71. }
  72. bool EdgeDestination::hasAssignment(Assignment const& assignment) const {
  73. for (auto const& containedAssignment : assignments) {
  74. if (containedAssignment == assignment) {
  75. return true;
  76. }
  77. }
  78. return false;
  79. }
  80. bool EdgeDestination::removeAssignment(Assignment const& assignment) {
  81. bool toRemove = removeAssignment(assignment, assignments);
  82. if (toRemove) {
  83. if (assignment.isTransientAssignment()) {
  84. removeAssignment(assignment, transientAssignments);
  85. } else {
  86. removeAssignment(assignment, nonTransientAssignments);
  87. }
  88. return true;
  89. }
  90. return false;
  91. }
  92. void EdgeDestination::sortAssignments(std::vector<Assignment>& assignments) {
  93. std::sort(assignments.begin(), assignments.end(), [] (storm::jani::Assignment const& assignment1, storm::jani::Assignment const& assignment2) {
  94. bool smaller = assignment1.getExpressionVariable().getType().isBooleanType() && !assignment2.getExpressionVariable().getType().isBooleanType();
  95. if (!smaller) {
  96. smaller = assignment1.getExpressionVariable() < assignment2.getExpressionVariable();
  97. }
  98. return smaller;
  99. });
  100. }
  101. bool EdgeDestination::removeAssignment(Assignment const& assignment, std::vector<Assignment>& assignments) {
  102. for (auto it = assignments.begin(), ite = assignments.end(); it != ite; ++it) {
  103. if (assignment == *it) {
  104. assignments.erase(it);
  105. return true;
  106. }
  107. }
  108. return false;
  109. }
  110. }
  111. }