package org.ggp.base.apps.benchmark; import java.io.IOException; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import org.ggp.base.util.loader.RemoteResourceLoader; import org.ggp.base.util.statemachine.Move; import org.ggp.base.util.statemachine.StateMachine; import org.ggp.base.util.statemachine.exceptions.GoalDefinitionException; import org.ggp.base.util.statemachine.exceptions.MoveDefinitionException; import org.ggp.base.util.statemachine.exceptions.TransitionDefinitionException; import org.ggp.base.util.statemachine.implementation.prover.ProverStateMachine; import org.ggp.base.util.symbol.factory.exceptions.SymbolFormatException; import external.JSON.JSONArray; import external.JSON.JSONException; import external.JSON.JSONObject; /** * ImportSanchoCases reads through benchmark test cases for Sancho * and converts them into cases for the PlayerTester. * * @author Sam Schreiber */ public class ImportSanchoCases { public static final String[] urlsForSanchoCases = new String[] { "https://raw.githubusercontent.com/SteveDraper/ggp-base/develop/data/tests/suites/Tiltyard.29f58e264f8e5b8a9a190b8ae64a1fccf2892c20.0.49.json", "https://raw.githubusercontent.com/SteveDraper/ggp-base/develop/data/tests/suites/Tiltyard.50de9881e8d992dae28bf268365a78e55b01f33b.1.11.json", "https://raw.githubusercontent.com/SteveDraper/ggp-base/develop/data/tests/suites/Tiltyard.6b34ffb9c48407f9db29c3fcf68063a097c7aec9.1.8.json", "https://raw.githubusercontent.com/SteveDraper/ggp-base/develop/data/tests/suites/Tiltyard.71ed3b17f057c511ef4ed5d3d1c0d4030fcdb27b.0.25.json", "https://raw.githubusercontent.com/SteveDraper/ggp-base/develop/data/tests/suites/Tiltyard.8d472e9d2c354b614c0b97a78e849afa1f206396.0.25.json", "https://raw.githubusercontent.com/SteveDraper/ggp-base/develop/data/tests/suites/Tiltyard.8d472e9d2c354b614c0b97a78e849afa1f206396.0.7.json", "https://raw.githubusercontent.com/SteveDraper/ggp-base/develop/data/tests/suites/Tiltyard.a36059b9e9ef556a1523256d0945a5f472a7edee.1.18.json", "https://raw.githubusercontent.com/SteveDraper/ggp-base/develop/data/tests/suites/Tiltyard.aef8791cf27fd51b06863606a3a1e02edc156c68.0.3.json", "https://raw.githubusercontent.com/SteveDraper/ggp-base/develop/data/tests/suites/Tiltyard.b7d98c11f2da12899a97c1e846938a8d345e6b31.0.7.json", "https://raw.githubusercontent.com/SteveDraper/ggp-base/develop/data/tests/suites/Tiltyard.d125166ef6c8af6c731f4be0f50a950891b7a649.3.36.json", }; public static void main(String[] args) throws MoveDefinitionException, TransitionDefinitionException, GoalDefinitionException, JSONException, IOException { for (String caseURL : urlsForSanchoCases) { try { convertSanchoTestCases(caseURL); } catch (Exception e) { System.err.println("Caught exception when processing " + caseURL); e.printStackTrace(); } } } public static void convertSanchoTestCases(String testCasesURL) throws MoveDefinitionException, TransitionDefinitionException, GoalDefinitionException, JSONException, IOException, SymbolFormatException { JSONObject theCases = RemoteResourceLoader.loadJSON(testCasesURL); JSONArray theCasesArr = theCases.getJSONArray("cases"); for (int i = 0; i < theCasesArr.length(); i++) { JSONObject theCase = theCasesArr.getJSONObject(i); String theCaseID = theCase.getString("case"); String[] extractedData = theCaseID.replaceAll("(.*)Tiltyard (.*), player (.*), move (.*)", "$2 $3 $4").split(" "); String theMatchID = extractedData[0]; int thePlayerID = Integer.parseInt(extractedData[1]); int theMoveID = Integer.parseInt(extractedData[2]); String repoURL = theCase.getString("repo"); String gameKey = theCase.getString("game"); @SuppressWarnings("unused") int startClock = Integer.parseInt(theCase.getString("start")); @SuppressWarnings("unused") int playClock = Integer.parseInt(theCase.getString("play")); int limitMove = theCase.getInt("limit"); JSONObject theCheck = theCase.getJSONObject("check"); int checkRole = Integer.parseInt(theCheck.getString("player")); JSONObject realMatchData = RemoteResourceLoader.loadJSON("http://matches.ggp.org/matches/" + theMatchID + "/"); String theState = realMatchData.getJSONArray("states").getString(theMoveID-1); boolean flipAcceptableMoves = false; if (theCheck.getString("acceptable").startsWith("!:")) { flipAcceptableMoves = true; theCheck.put("acceptable", theCheck.getString("acceptable").substring(2)); } Set<String> acceptableMoves = new HashSet<String>(Arrays.asList(theCheck.getString("acceptable").split(","))); { Set<String> acceptableMovesClean = new HashSet<String>(); for (String move : acceptableMoves) { acceptableMovesClean.add("( " + move + " )"); } acceptableMoves = acceptableMovesClean; } if (flipAcceptableMoves) { StateMachine theMachine = new ProverStateMachine(); theMachine.initialize(PlayerTester.getMediasResGame(gameKey, theState).getRules()); List<Move> legalMoves = theMachine.getLegalMoves(theMachine.getInitialState(), theMachine.getRoles().get(thePlayerID)); Set<String> newAcceptableMoves = new HashSet<String>(); for (Move move : legalMoves) { if (!acceptableMoves.contains(move.toString())) newAcceptableMoves.add(move.toString()); } if (acceptableMoves.size() + newAcceptableMoves.size() != legalMoves.size()) throw new RuntimeException("Acceptable move size mismatch: " + Arrays.deepToString(legalMoves.toArray(new Move[]{})) + " != " + Arrays.toString(acceptableMoves.toArray()) + " + " + Arrays.toString(newAcceptableMoves.toArray())); acceptableMoves = newAcceptableMoves; } if (thePlayerID != checkRole) throw new RuntimeException("Unexpected role check: " + thePlayerID + " vs " + checkRole); if (theMoveID != limitMove) throw new RuntimeException("Start move != limit move: " + theMoveID + " vs " + limitMove); if (!repoURL.equals("games.ggp.org/base")) throw new RuntimeException("Using non-base repo: " + repoURL); StringBuilder theGoodMoves = new StringBuilder("new String[] { "); for (String move : acceptableMoves) { theGoodMoves.append("\"" + move + "\", "); } theGoodMoves.append("}"); System.out.println("new PlayerTester.TestCase(\"Sancho\", \"" + gameKey + "\", " + thePlayerID + ", 15, 5, \"" + theState + "\", " + theGoodMoves +"),"); } } }