Browse Source
			
			
			Merge pull request 'Refactoring of Prism Output' (#1) from adversaries_and_refactoring into tempestpyadaption
			
				
		Merge pull request 'Refactoring of Prism Output' (#1) from adversaries_and_refactoring into tempestpyadaption
	
		
	
			
				Reviewed-on: #1pull/3/head
				 13 changed files with 944 additions and 1282 deletions
			
			
		- 
					38CMakeLists.txt
- 
					12main.cpp
- 
					2util/CMakeLists.txt
- 
					272util/Grid.cpp
- 
					11util/Grid.h
- 
					222util/PrismFormulaPrinter.cpp
- 
					61util/PrismFormulaPrinter.h
- 
					1358util/PrismModulesPrinter.cpp
- 
					194util/PrismModulesPrinter.h
- 
					8util/PrismPrinter.cpp
- 
					8util/PrismPrinter.h
- 
					31util/cell.cpp
- 
					9util/cell.h
| @ -1,24 +1,26 @@ | |||
| include(util/CMakeLists.txt) | |||
| 
 | |||
| set(CMAKE_CXX_STANDARD 20) | |||
| 
 | |||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__FILENAME__='\"$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<))\"'") | |||
| add_definitions(-DLOG_DEBUG) | |||
| 
 | |||
| cmake_minimum_required(VERSION 3.0...3.22) | |||
| 
 | |||
| set(CMAKE_BUILD_TYPE Debug) | |||
| 
 | |||
| project( | |||
|   Minigrid2PRISM | |||
|   VERSION 0.1 | |||
|   LANGUAGES CXX) | |||
| set(CMAKE_CXX_STANDARD 20) | |||
| 
 | |||
| find_package(yaml-cpp) | |||
| 
 | |||
| add_executable(main | |||
|                ${SRCS} | |||
|                main.cpp | |||
|                ) | |||
| 
 | |||
| target_link_libraries(main pthread yaml-cpp) | |||
| include(util/CMakeLists.txt) | |||
| include(FetchContent) | |||
| 
 | |||
| FetchContent_Declare( | |||
|   yaml-cpp | |||
|   GIT_REPOSITORY https://github.com/jbeder/yaml-cpp.git | |||
|   GIT_TAG master | |||
|   OVERRIDE_FIND_PACKAGE | |||
| ) | |||
| FetchContent_GetProperties(yaml-cpp) | |||
| if(NOT yaml-cpp_POPULATED) | |||
|   message(STATUS "Fetching yaml-cpp...") | |||
|   FetchContent_Populate(yaml-cpp) | |||
|   add_subdirectory(${yaml-cpp_SOURCE_DIR} ${yaml-cpp_BINARY_DIR}) | |||
| endif() | |||
| FetchContent_MakeAvailable(yaml-cpp) | |||
| 
 | |||
| add_executable(main ${SRCS} main.cpp) | |||
| target_link_libraries(main pthread yaml-cpp::yaml-cpp) | |||
| @ -0,0 +1,222 @@ | |||
| #include "PrismFormulaPrinter.h"
 | |||
| 
 | |||
| #include <map>
 | |||
| #include <string>
 | |||
| #include <algorithm>
 | |||
| 
 | |||
| std::string oneOffToString(const int &offset) { | |||
|   return offset != 0 ? ( offset == 1 ? "+1" : "-1" )  : ""; | |||
| } | |||
| 
 | |||
| std::string vectorToDisjunction(const std::vector<std::string> &formulae) { | |||
|   bool first = true; | |||
|   std::string disjunction = ""; | |||
|   for(const auto &formula : formulae) { | |||
|     if(first) first = false; | |||
|     else disjunction += " | "; | |||
|     disjunction += formula; | |||
|   } | |||
|   return disjunction; | |||
| } | |||
| 
 | |||
| std::string cellToConjunction(const AgentName &agentName, const cell &c) { | |||
|   return "x" + agentName + "=" + std::to_string(c.column) + "&y" + agentName + "=" + std::to_string(c.row); | |||
| } | |||
| 
 | |||
| std::string cellToConjunctionWithOffset(const AgentName &agentName, const cell &c, const std::string &xOffset, const std::string &yOffset){ | |||
|   return "x" + agentName + xOffset + "=" + std::to_string(c.column) + "&y" + agentName + yOffset + "=" + std::to_string(c.row); | |||
| } | |||
| 
 | |||
| std::string coordinatesToConjunction(const AgentName &agentName, const coordinates &c, const ViewDirection viewDirection) { | |||
|   return "x" + agentName + "=" + std::to_string(c.first) + "&y" + agentName + "=" + std::to_string(c.second) + "&view" + agentName + "=" + std::to_string(viewDirection); | |||
| } | |||
| 
 | |||
| std::string objectPositionToConjunction(const AgentName &agentName, const std::string &identifier, const std::pair<int, int> &relativePosition) { | |||
|   std::string xOffset = oneOffToString(relativePosition.first); | |||
|   std::string yOffset = oneOffToString(relativePosition.second); | |||
|   return "x" + agentName + xOffset + "=x" + identifier + "&y" + agentName + yOffset + "=y" + identifier; | |||
| } | |||
| std::string objectPositionToConjunction(const AgentName &agentName, const std::string &identifier, const std::pair<int, int> &relativePosition, const ViewDirection viewDirection) { | |||
|   std::string xOffset = oneOffToString(relativePosition.first); | |||
|   std::string yOffset = oneOffToString(relativePosition.second); | |||
|   return "x" + agentName + xOffset + "=x" + identifier + "&y" + agentName + yOffset + "=y" + identifier + "&view" + agentName + "=" + std::to_string(viewDirection); | |||
| } | |||
| 
 | |||
| std::map<ViewDirection, coordinates> getAdjacentCells(const cell &c) { | |||
|   return {{1, c.getNorth()}, {2, c.getEast()}, {3, c.getSouth()}, {0, c.getWest()}}; | |||
| } | |||
| 
 | |||
| std::map<ViewDirection, std::pair<int, int>> getRelativeAdjacentCells() { | |||
|   return { {1, {0,+1}}, {2, {-1,0}}, {3, {0,-1}}, {0, {+1,0}} }; | |||
| } | |||
| 
 | |||
| std::map<std::string, std::pair<int, int>> getRelativeSurroundingCells() { | |||
|   return { {"NorthWest", {-1,-1}}, {"North", { 0,-1}}, {"NorthEast", {+1,-1}}, | |||
|            {"West",      {-1, 0}},                     {"East",      {+1, 0}}, | |||
|            {"SouthWest", {-1,+1}}, {"South", { 0,+1}}, {"SouthEast", {+1,+1}} }; | |||
| } | |||
| 
 | |||
| namespace prism { | |||
|   PrismFormulaPrinter::PrismFormulaPrinter(std::ostream &os, const std::map<std::string, cells> &restrictions, const cells &walls, const cells &boxes, const cells &balls, const cells &lockedDoors, const cells &unlockedDoors, const cells &keys, const std::map<std::string, cells> &slipperyTiles, const cells &lava, const cells &goals) | |||
|     : os(os),  restrictions(restrictions), walls(walls), boxes(boxes), balls(balls), lockedDoors(lockedDoors), unlockedDoors(unlockedDoors), keys(keys), slipperyTiles(slipperyTiles), lava(lava), goals(goals) | |||
|   { } | |||
| 
 | |||
|   void PrismFormulaPrinter::print(const AgentName &agentName) { | |||
|     for(const auto& [direction, cells] : restrictions) { | |||
|       printRestrictionFormula(agentName, direction, cells); | |||
|     } | |||
| 
 | |||
|     if(slipperyBehaviour()) { | |||
|       for(const auto& [direction, cells] : slipperyTiles) { | |||
|         printIsOnFormula(agentName, "Slippery", cells, direction); | |||
|       } | |||
|       std::vector<std::string> allSlipperyDirections = {agentName + "IsOnSlipperyNorth", agentName + "IsOnSlipperyEast", agentName + "IsOnSlipperySouth", agentName + "IsOnSlipperyWest"}; | |||
|       os << buildFormula(agentName + "IsOnSlippery", vectorToDisjunction(allSlipperyDirections)); | |||
| 
 | |||
|       for(const auto& [direction, relativePosition] : getRelativeSurroundingCells()) { | |||
|         printSlipRestrictionFormula(agentName, direction); | |||
|       } | |||
|     } else { | |||
|       os << buildFormula(agentName + "IsOnSlippery", "false"); | |||
|     } | |||
|     printIsOnFormula(agentName, "Lava", lava); | |||
|     printIsOnFormula(agentName, "Goal", goals); | |||
| 
 | |||
|     for(const auto& ball : balls) { | |||
|       std::string identifier = capitalize(ball.getColor()) + ball.getType(); | |||
|       printRelativeRestrictionFormulaWithCondition(agentName, identifier, "!" + identifier + "PickedUp"); | |||
|       portableObjects.push_back(agentName + "Carrying" + identifier); | |||
|     } | |||
| 
 | |||
|     for(const auto& box : boxes) { | |||
|       std::string identifier = capitalize(box.getColor()) + box.getType(); | |||
|       printRelativeRestrictionFormulaWithCondition(agentName, identifier, "!" + identifier + "PickedUp"); | |||
|       portableObjects.push_back(agentName + "Carrying" + identifier); | |||
|     } | |||
| 
 | |||
|     for(const auto& key : keys) { | |||
|       std::string identifier = capitalize(key.getColor()) + key.getType(); | |||
|       printRelativeRestrictionFormulaWithCondition(agentName, identifier, "!" + identifier + "PickedUp"); | |||
|       portableObjects.push_back(agentName + "Carrying" + identifier); | |||
|     } | |||
| 
 | |||
|     for(const auto& door : unlockedDoors) { | |||
|       std::string identifier = capitalize(door.getColor()) + door.getType(); | |||
|       printRestrictionFormulaWithCondition(agentName, identifier, getAdjacentCells(door), "!" + identifier + "Open"); | |||
|       printIsNextToFormula(agentName, identifier, getAdjacentCells(door)); | |||
|     } | |||
| 
 | |||
|     for(const auto& door : lockedDoors) { | |||
|       std::string identifier = capitalize(door.getColor()) + door.getType(); | |||
|       printRestrictionFormulaWithCondition(agentName, identifier, getAdjacentCells(door), "!" + identifier + "Open"); | |||
|       printIsNextToFormula(agentName, identifier, getAdjacentCells(door)); | |||
|     } | |||
| 
 | |||
|     if(conditionalMovementRestrictions.size() > 0) { | |||
|       os << buildFormula(agentName + "CannotMoveConditionally", vectorToDisjunction(conditionalMovementRestrictions)); | |||
|       os << buildFormula(agentName + "IsCarrying", vectorToDisjunction(portableObjects)); | |||
|     } else { | |||
|       os << buildFormula(agentName + "CannotMoveConditionally", "false"); | |||
|     } | |||
|   } | |||
| 
 | |||
|   void PrismFormulaPrinter::printRestrictionFormula(const AgentName &agentName, const std::string &direction, const cells &grid_cells) { | |||
|     os << buildFormula(agentName + "CannotMove" + direction + "Wall", buildDisjunction(agentName, grid_cells)); | |||
|   } | |||
| 
 | |||
|   void PrismFormulaPrinter::printIsOnFormula(const AgentName &agentName, const std::string &type, const cells &grid_cells, const std::string &direction) { | |||
|     os << buildFormula(agentName + "IsOn" + type + direction, buildDisjunction(agentName, grid_cells)); | |||
|   } | |||
| 
 | |||
|   void PrismFormulaPrinter::printIsNextToFormula(const AgentName &agentName, const std::string &type, const std::map<ViewDirection, coordinates> &coordinates) { | |||
|     os << buildFormula(agentName + "IsNextTo" + type, buildDisjunction(agentName, coordinates)); | |||
|   } | |||
| 
 | |||
|   void PrismFormulaPrinter::printRestrictionFormulaWithCondition(const AgentName &agentName, const std::string &reason, const std::map<ViewDirection, coordinates> &coordinates, const std::string &condition) { | |||
|     os << buildFormula(agentName + "CannotMove" + reason, "(" + buildDisjunction(agentName, coordinates) + ") & " + condition); | |||
|     conditionalMovementRestrictions.push_back(agentName + "CannotMove" + reason); | |||
|   } | |||
| 
 | |||
|   void PrismFormulaPrinter::printRelativeRestrictionFormulaWithCondition(const AgentName &agentName, const std::string &reason, const std::string &condition) { | |||
|     os << buildFormula(agentName + "CannotMove" + reason, "(" + buildDisjunction(agentName, reason) + ") & " + condition); | |||
|     conditionalMovementRestrictions.push_back(agentName + "CannotMove" + reason); | |||
|   } | |||
| 
 | |||
|   void PrismFormulaPrinter::printSlipRestrictionFormula(const AgentName &agentName, const std::string &direction) { | |||
|     std::pair<int, int> slipCell = getRelativeSurroundingCells().at(direction); | |||
|     bool semicolon = anyPortableObject() ? false : true; | |||
|     os << buildFormula(agentName + "CannotSlip" + direction, buildDisjunction(agentName, walls, slipCell), semicolon); | |||
|     for(auto const key : keys) { | |||
|       std::string identifier = capitalize(key.getColor()) + key.getType(); | |||
|       os << " | " << objectPositionToConjunction(agentName, identifier, slipCell); | |||
|     } | |||
|     for(auto const ball : balls) { | |||
|       std::string identifier = capitalize(ball.getColor()) + ball.getType(); | |||
|       os << " | " << objectPositionToConjunction(agentName, identifier, slipCell); | |||
|     } | |||
|     for(auto const box : boxes) { | |||
|       std::string identifier = capitalize(box.getColor()) + box.getType(); | |||
|       os << " | " << objectPositionToConjunction(agentName, identifier, slipCell); | |||
|     } | |||
|     os << ";\n"; | |||
|   } | |||
| 
 | |||
|   std::string PrismFormulaPrinter::buildFormula(const std::string &formulaName, const std::string &formula, const bool semicolon) { | |||
|     return "formula " + formulaName + " = " + formula + (semicolon ? ";\n": ""); | |||
|   } | |||
| 
 | |||
|   std::string PrismFormulaPrinter::buildDisjunction(const AgentName &agentName, const std::map<ViewDirection, coordinates> &cells) { | |||
|     if(cells.size() == 0) return "false"; | |||
|     bool first = true; | |||
|     std::string disjunction = ""; | |||
|     for(const auto [viewDirection, coordinates] : cells) { | |||
|       if(first) first = false; | |||
|       else disjunction += " | "; | |||
|       disjunction += "(" + coordinatesToConjunction(agentName, coordinates, viewDirection) + ")"; | |||
|     } | |||
|     return disjunction; | |||
|   } | |||
| 
 | |||
|   std::string PrismFormulaPrinter::buildDisjunction(const AgentName &agentName, const cells &cells) { | |||
|     if(cells.size() == 0) return "false"; | |||
|     bool first = true; | |||
|     std::string disjunction = ""; | |||
|     for(auto const cell : cells) { | |||
|       if(first) first = false; | |||
|       else disjunction += " | "; | |||
|       disjunction += "(" + cellToConjunction(agentName, cell) + ")"; | |||
|     } | |||
|     return disjunction; | |||
|   } | |||
| 
 | |||
|   std::string PrismFormulaPrinter::buildDisjunction(const AgentName &agentName, const std::string &reason) { | |||
|     std::string disjunction = ""; | |||
|     bool first = true; | |||
|     for(auto const [viewDirection, relativePosition] : getRelativeAdjacentCells()) { | |||
|       if(first) first = false; | |||
|       else disjunction += " | "; | |||
|       disjunction += "(" + objectPositionToConjunction(agentName, reason, relativePosition, viewDirection) + ")"; | |||
|     } | |||
|     return disjunction; | |||
|   } | |||
| 
 | |||
|   std::string PrismFormulaPrinter::buildDisjunction(const AgentName &agentName, const cells &cells, const std::pair<int, int> &offset) { | |||
|     std::string disjunction = ""; | |||
|     bool first = true; | |||
|     std::string xOffset = oneOffToString(offset.first); | |||
|     std::string yOffset = oneOffToString(offset.second); | |||
|     for(auto const cell : cells) { | |||
|       if(first) first = false; | |||
|       else disjunction += " | "; | |||
|       disjunction += "(" + cellToConjunctionWithOffset(agentName, cell, xOffset, yOffset) + ")"; | |||
|     } | |||
|     return disjunction; | |||
|   } | |||
| 
 | |||
|   bool PrismFormulaPrinter::slipperyBehaviour() const { | |||
|     return !slipperyTiles.at("North").empty() || !slipperyTiles.at("East").empty() || !slipperyTiles.at("South").empty() || !slipperyTiles.at("West").empty(); | |||
|   } | |||
|   bool PrismFormulaPrinter::anyPortableObject() const { | |||
|     return !keys.empty() || !boxes.empty() || !balls.empty(); | |||
|   } | |||
| } | |||
| @ -0,0 +1,61 @@ | |||
| #pragma once | |||
| 
 | |||
| #include <iostream> | |||
| #include <functional> | |||
| #include "MinigridGrammar.h" | |||
| #include "PrismPrinter.h" | |||
| #include "ConfigYaml.h" | |||
| 
 | |||
| 
 | |||
| std::string oneOffToString(const int &offset); | |||
| std::string vectorToDisjunction(const std::vector<std::string> &formulae); | |||
| std::string cellToConjunction(const AgentName &agentName, const cell &c); | |||
| std::string cellToConjunctionWithOffset(const AgentName &agentName, const cell &c, const std::string &xOffset, const std::string &yOffset); | |||
| std::string coordinatesToConjunction(const AgentName &agentName, const coordinates &c, const ViewDirection viewDirection); | |||
| std::string objectPositionToConjunction(const AgentName &agentName, const std::string &identifier, const std::pair<int, int> &relativePosition); | |||
| std::string objectPositionToConjunction(const AgentName &agentName, const std::string &identifier, const std::pair<int, int> &relativePosition, const ViewDirection viewDirection); | |||
| std::map<ViewDirection, coordinates> getAdjacentCells(const cell &c); | |||
| std::map<ViewDirection, std::pair<int, int>> getRelativeAdjacentCells(); | |||
| std::map<std::string, std::pair<int, int>> getRelativeSurroundingCells(); | |||
| 
 | |||
| namespace prism { | |||
|   class PrismFormulaPrinter { | |||
|     public: | |||
|       PrismFormulaPrinter(std::ostream &os, const std::map<std::string, cells> &restrictions, const cells &walls, const cells &boxes, const cells &balls, const cells &lockedDoors, const cells &unlockedDoors, const cells &keys, const std::map<std::string, cells> &slipperyTiles, const cells &lava, const cells &goals); | |||
| 
 | |||
|       void print(const AgentName &agentName); | |||
| 
 | |||
|       void printRestrictionFormula(const AgentName &agentName, const std::string &direction, const cells &grid_cells); | |||
|       void printIsOnFormula(const AgentName &agentName, const std::string &type, const cells &grid_cells, const std::string &direction = ""); | |||
|       void printIsNextToFormula(const AgentName &agentName, const std::string &type, const std::map<ViewDirection, coordinates> &coordinates); | |||
|       void printRestrictionFormulaWithCondition(const AgentName &agentName, const std::string &reason, const std::map<ViewDirection, coordinates> &coordinates, const std::string &condition); | |||
|       void printRelativeRestrictionFormulaWithCondition(const AgentName &agentName, const std::string &reason, const std::string &condition); | |||
|       void printSlipRestrictionFormula(const AgentName &agentName, const std::string &direction); | |||
|     private: | |||
|       std::string buildFormula(const std::string &formulaName, const std::string &formula, const bool semicolon = true); | |||
|       std::string buildLabel(const std::string &labelName, const std::string &label); | |||
|       std::string buildDisjunction(const AgentName &agentName, const std::map<ViewDirection, coordinates> &cells); | |||
|       std::string buildDisjunction(const AgentName &agentName, const cells &cells); | |||
|       std::string buildDisjunction(const AgentName &agentName, const std::string &reason); | |||
|       std::string buildDisjunction(const AgentName &agentName, const cells &cells, const std::pair<int, int> &offset); | |||
| 
 | |||
|       bool slipperyBehaviour() const; | |||
|       bool anyPortableObject() const; | |||
| 
 | |||
| 
 | |||
|       std::ostream &os; | |||
|       std::map<std::string, cells> restrictions; | |||
|       cells walls; | |||
|       cells boxes; | |||
|       cells balls; | |||
|       cells lockedDoors; | |||
|       cells unlockedDoors; | |||
|       cells keys; | |||
|       std::map<std::string, cells> slipperyTiles; | |||
|       cells lava; | |||
|       cells goals; | |||
| 
 | |||
|       std::vector<std::string> conditionalMovementRestrictions; | |||
|       std::vector<std::string> portableObjects; | |||
|   }; | |||
| } | |||
						
							
						
						
							1358
	
						
						util/PrismModulesPrinter.cpp
						
							File diff suppressed because it is too large
							
							
								
									View File
								
							
						
					
				File diff suppressed because it is too large
							
							
								
									View File
								
							
						| @ -1,119 +1,111 @@ | |||
| #pragma once | |||
| 
 | |||
| #include <iostream> | |||
| #include <set> | |||
| #include <functional> | |||
| #include "MinigridGrammar.h" | |||
| #include "PrismPrinter.h" | |||
| #include "ConfigYaml.h" | |||
| 
 | |||
| 
 | |||
| std::string northUpdate(const AgentName &a); | |||
| std::string southUpdate(const AgentName &a); | |||
| std::string eastUpdate(const AgentName &a); | |||
| std::string westUpdate(const AgentName &a); | |||
| 
 | |||
| namespace prism { | |||
|   class PrismModulesPrinter { | |||
|     public: | |||
|       PrismModulesPrinter(const ModelType &modelType, const size_t &numberOfPlayer, std::vector<Configuration> config ,const bool enforceOneWays = false); | |||
| 
 | |||
|       std::ostream& printRestrictionFormula(std::ostream& os, const AgentName &agentName, const std::string &direction, const cells &grid_cells, const cells& keys, const cells& doors); | |||
|       std::ostream& printKeyRestrictionFormula(std::ostream& os, const AgentName &agentName, const std::string &direction, const cells &keys); | |||
|       std::ostream& printDoorRestrictionFormula(std::ostream& os, const AgentName &agentName, const std::string &direction, const cells &doors); | |||
|       std::ostream& printIsOnSlipperyFormula(std::ostream& os, const AgentName &agentName, const std::vector<std::reference_wrapper<cells>> &slipperyCollection, const cells &slipperyNorth, const cells &slipperyEast, const cells &slipperySouth, const cells &slipperyWest); | |||
|       std::ostream& printGoalLabel(std::ostream& os, const AgentName&agentName, const cells &goals); | |||
|       std::ostream& printCrashLabel(std::ostream &os, const std::vector<AgentName> agentNames); | |||
|       std::ostream& printAvoidanceLabel(std::ostream &os, const std::vector<AgentName> agentNames, const int &distance); | |||
|       std::ostream& printKeysLabels(std::ostream& os, const AgentName&agentName, const cells &keys); | |||
|       std::ostream& printBackgroundLabels(std::ostream &os, const AgentName &agentName, const std::pair<Color, cells> &backgroundTiles); | |||
|       std::ostream& printIsInLavaFormula(std::ostream& os, const AgentName &agentName, const cells &lava); | |||
|       std::ostream& printIsFixedFormulas(std::ostream& os, const AgentName &agentName); | |||
|       std::ostream& printTurningNotAllowedFormulas(std::ostream& os, const AgentName &agentName, const cells &floor); | |||
|       std::ostream& printWallFormula(std::ostream& os, const AgentName &agentName, const cells &walls); | |||
|       std::ostream& printFormulas(std::ostream& os, | |||
|                                   const AgentName&agentName, | |||
|                                   const cells &restrictionNorth, | |||
|                                   const cells &restrictionEast, | |||
|                                   const cells &restrictionSouth, | |||
|                                   const cells &restrictionWest, | |||
|                                   const std::vector<std::reference_wrapper<cells>> &slipperyCollection, | |||
|                                   const cells &lava, | |||
|                                   const cells &walls, | |||
|                                   const cells &noTurnFloor, | |||
|                                   const cells &slipperyNorth, | |||
|                                   const cells &slipperyEast, | |||
|                                   const cells &slipperySouth, | |||
|                                   const cells &slipperyWest, | |||
|                                   const cells &keys, | |||
|                                   const cells &doors); | |||
| 
 | |||
|       std::ostream& printKeyModule(std::ostream &os, const cell &key, const coordinates &boundaries, AgentName agentName); | |||
|       std::ostream& printKeyActions(std::ostream &os, const cell& key ,const std::string &keyIdentifier, AgentName agentName); | |||
| 
 | |||
|       std::ostream& printDoorModule(std::ostream &os, const cell &door, const coordinates &boundaries, AgentName agentName); | |||
|       std::ostream& printDoorActions(std::ostream &os, const cell &door ,const std::string &doorIdentifier, AgentName agentName); | |||
|       std::ostream& printConstants(std::ostream &os, const std::vector<std::string> &constants); | |||
|        /* | |||
|         * Representation for Slippery Tile. | |||
|         *  -) North: Slips from North to South | |||
|         *  -) East: Slips from East to West | |||
|         *  -) South: Slips from South to North | |||
|         *  -) West: Slips from West to East | |||
|         */ | |||
|       enum class SlipperyType { North, East, South, West }; | |||
| 
 | |||
|       /* | |||
|        * Prints Slippery on move action. | |||
|        * | |||
|        * @param neighborhood: Information of wall-blocks in 8-neighborhood { n, nw, e, se, s, sw, w, nw }. If entry is false, then corresponding neighboorhood position is a wall. | |||
|        * @param orientation: Information of slippery type (either north, south, east, west). | |||
|        */ | |||
|       std::ostream& printSlipperyMove(std::ostream &os, const AgentName &agentName, const size_t &agentIndex, const coordinates &c, std::set<std::string> &slipperyActions, const std::array<bool, 8>& neighborhood, SlipperyType orientation); | |||
| 
 | |||
|       /* | |||
|        * Prints Slippery on turn action. | |||
|        * | |||
|        * @param neighborhood: Information of wall-blocks in 8-neighborhood { n, nw, e, se, s, sw, w, nw }. If entry is false, then corresponding neighboorhood position is a wall. | |||
|        * @param orientation: Information of slippery type (either north, south, east, west). | |||
|        */ | |||
|       std::ostream& printSlipperyTurn(std::ostream &os, const AgentName &agentName, const size_t &agentIndex, const coordinates &c, std::set<std::string> &slipperyActions, const std::array<bool, 8>& neighborhood, SlipperyType orientation); | |||
| 
 | |||
|       std::ostream& printModel(std::ostream &os, const ModelType &modelType); | |||
|       std::ostream& printBooleansForKeys(std::ostream &os, const AgentName &agentName, const cells &keys); | |||
|       std::ostream& printActionsForKeys(std::ostream &os, const AgentName &agentName, const cells &keys); | |||
|       std::ostream& printBooleansForBackground(std::ostream &os, const AgentName &agentName, const std::map<Color, cells> &backgroundTiles); | |||
|       std::ostream& printActionsForBackground(std::ostream &os, const AgentName &agentName, const std::map<Color, cells> &backgroundTiles); | |||
|       std::ostream& printInitStruct(std::ostream &os, const AgentNameAndPositionMap &agents, const KeyNameAndPositionMap &keys, const cells &lockedDoors, const cells &unlockedDoors, prism::ModelType modelType); | |||
|       std::ostream& printModule(std::ostream &os, | |||
|                                 const AgentName &agentName, | |||
|                                 const size_t &agentIndex, | |||
|                                 const coordinates &boundaries, | |||
|                                 const coordinates& initialPosition, | |||
|                                 const cells &keys, | |||
|                                 const std::map<Color, cells> &backgroundTiles, | |||
|                                 const bool agentWithView, | |||
|                                 const std::vector<float> &probabilities = {}, | |||
|                                 const double faultyProbability = 0); | |||
|       std::ostream& printMovementActions(std::ostream &os, const AgentName &agentName, const size_t &agentIndex, const bool agentWithView, const float &probability = 1.0, const double &stickyProbability = 0.0); | |||
|       std::ostream& printDoneActions(std::ostream &os, const AgentName &agentName, const size_t &agentIndex); | |||
|       std::ostream& printEndmodule(std::ostream &os); | |||
|       std::ostream& printPlayerStruct(std::ostream &os, const AgentName &agentName, const bool agentWithView, const std::vector<float> &probabilities = {}, const std::set<std::string> &slipperyActions = {}); | |||
|       std::ostream& printGlobalMoveVariable(std::ostream &os, const size_t &numberOfPlayer); | |||
|       std::ostream& printRewards(std::ostream &os, const AgentName &agentName, const std::map<coordinates, float> &stateRewards, const cells &lava, const cells &goals, const std::map<Color, cells> &backgroundTiles); | |||
| 
 | |||
|       std::ostream& printConfiguration(std::ostream &os, const std::vector<Configuration>& configurations); | |||
|       std::ostream& printConfiguredActions(std::ostream &os, const AgentName &agentName); | |||
| 
 | |||
|       std::string moveGuard(const size_t &agentIndex); | |||
|       std::string pickupGuard(const AgentName &agentName, const std::string keyColor); | |||
|       std::string dropGuard(const AgentName &agentName, const std::string keyColor, size_t view); | |||
|       std::string moveUpdate(const size_t &agentIndex); | |||
|       std::string unlockGuard(const AgentName &agentName, const cell& door); | |||
|       std::string toggleGuard(const AgentName &agentName, const cell& door); | |||
| 
 | |||
|       std::string viewVariable(const AgentName &agentName, const size_t &agentDirection, const bool agentWithView); | |||
|       PrismModulesPrinter(std::ostream& os, const ModelType &modelType, const coordinates &maxBoundaries, const cells &boxes, const cells &balls, const cells &lockedDoors, const cells &unlockedDoors, const cells &keys, const std::map<std::string, cells> &slipperyTiles, const AgentNameAndPositionMap &agentNameAndPositionMap, std::vector<Configuration> config, const float probIntended, const float faultyProbability); | |||
| 
 | |||
|       std::ostream& print(); | |||
| 
 | |||
|       void printModelType(const ModelType &modelType); | |||
| 
 | |||
| 
 | |||
|       bool isGame() const; | |||
|     private: | |||
|       void printPortableObjectModule(const cell &object); | |||
|       void printPortableObjectActions(const std::string &agentName, const std::string &identifier); | |||
| 
 | |||
|       void printDoorModule(const cell &object, const bool &opened); | |||
|       void printLockedDoorActions(const std::string &agentName, const std::string &identifier); | |||
|       void printUnlockedDoorActions(const std::string &agentName, const std::string &identifier); | |||
| 
 | |||
|       void printRobotModule(const AgentName &agentName, const coordinates &initialPosition); | |||
|       void printPortableObjectActionsForRobot(const std::string &agentName, const std::string &identifier); | |||
|       void printUnlockedDoorActionsForRobot(const std::string &agentName, const std::string &identifier); | |||
|       void printLockedDoorActionsForRobot(const std::string &agentName, const std::string &identifier, const std::string &key); | |||
|       void printMovementActionsForRobot(const std::string &a); | |||
|       void printTurnActionsForRobot(const std::string &a); | |||
|       void printSlipperyMovementActionsForRobot(const AgentName &a); | |||
|       void printSlipperyMovementActionsForNorth(const AgentName &a); | |||
|       void printSlipperyMovementActionsForEast(const AgentName &a); | |||
|       void printSlipperyMovementActionsForSouth(const AgentName &a); | |||
|       void printSlipperyMovementActionsForWest(const AgentName &a); | |||
|       void printSlipperyTurnActionsForNorth(const AgentName &a); | |||
|       void printSlipperyTurnActionsForEast(const AgentName &a); | |||
|       void printSlipperyTurnActionsForSouth(const AgentName &a); | |||
|       void printSlipperyTurnActionsForWest(const AgentName &a); | |||
| 
 | |||
|       std::string printMovementGuard(const AgentName &a, const std::string &direction, const size_t &viewDirection); | |||
|       std::string printMovementUpdate(const AgentName &a, const update &update) const; | |||
|       std::string printTurnGuard(const AgentName &a, const std::string &direction, const ActionId &actionId, const std::string &cond = ""); | |||
|       std::string printTurnUpdate(const AgentName &a, const update &u, const ActionId &actionId) const; | |||
|       std::string printSlipperyMovementGuard(const AgentName &a, const std::string &direction, const ViewDirection &viewDirection, const std::vector<std::string> &guards); | |||
|       std::string printSlipperyMovementUpdate(const AgentName &a, const std::string &direction, const updates &u) const; | |||
|       std::string printSlipperyTurnGuard(const AgentName &a, const std::string &direction, const ActionId &actionId, const std::vector<std::string> &guards, const std::string &cond); | |||
|       std::string printSlipperyTurnUpdate(const AgentName &a, const updates &u); | |||
| 
 | |||
|       void printFaultyMovementModule(const AgentName &a); | |||
|       void printMoveModule(); | |||
| 
 | |||
|       void printConstants(const std::vector<std::string> &constants); | |||
| 
 | |||
|       ModelType const& modelType; | |||
|       const size_t numberOfPlayer; | |||
|       bool enforceOneWays; | |||
|       void printDoneActions(const AgentName &agentName); | |||
|       void printPlayerStruct(const AgentName &agentName); | |||
|       void printRewards(const AgentName &agentName, const std::map<coordinates, float> &stateRewards, const cells &lava, const cells &goals, const std::map<Color, cells> &backgroundTiles); | |||
| 
 | |||
|       void printConfiguration(const std::vector<Configuration>& configurations); | |||
|       void printConfiguredActions(const AgentName &agentName); | |||
| 
 | |||
|       bool anyPortableObject() const; | |||
|       bool faultyBehaviour() const; | |||
|       bool slipperyBehaviour() const; | |||
|       std::string moveGuard(const AgentName &agentName) const; | |||
|       std::string faultyBehaviourGuard(const AgentName &agentName, const ActionId &actionId) const; | |||
|       std::string faultyBehaviourUpdate(const AgentName &agentName, const ActionId &actionId) const; | |||
|       std::string moveUpdate(const AgentName &agentName) const; | |||
|       std::string updatesToString(const updates &updates) const; | |||
|       std::string updateToString(const update &u) const; | |||
| 
 | |||
|       std::string viewVariable(const AgentName &agentName, const size_t &agentDirection) const; | |||
| 
 | |||
| 
 | |||
|       std::string buildConjunction(const AgentName &a, std::vector<std::string> formulae) const; | |||
| 
 | |||
| 
 | |||
|       std::ostream &os; | |||
|       std::stringstream actionStream; | |||
| 
 | |||
|       ModelType const &modelType; | |||
|       coordinates const &maxBoundaries; | |||
|       AgentName agentName; | |||
|       cells boxes; | |||
|       cells balls; | |||
|       cells lockedDoors; | |||
|       cells unlockedDoors; | |||
|       cells keys; | |||
|       std::map<std::string, cells> slipperyTiles; | |||
| 
 | |||
|       AgentNameAndPositionMap agentNameAndPositionMap; | |||
|       std::map<AgentName, size_t> agentIndexMap; | |||
|       size_t numberOfPlayer; | |||
|       float const faultyProbability; | |||
|       float const probIntended; | |||
|       std::vector<Configuration> configuration; | |||
|       std::map<int, std::string> viewDirectionMapping; | |||
|       std::vector<ViewDirection> viewDirections = {0, 1, 2, 3}; | |||
| 
 | |||
|       std::map<AgentName, std::set<std::pair<ActionId, std::string>>> agentNameActionMap; | |||
|   }; | |||
| } | |||
| @ -0,0 +1,8 @@ | |||
| #include "PrismPrinter.h"
 | |||
| 
 | |||
| #include <algorithm>
 | |||
| 
 | |||
| std::string capitalize(std::string string) { | |||
|   string[0] = std::toupper(string[0]); | |||
|   return string; | |||
| } | |||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue