Fixed use of Zobrist hash for positional superko detection.

This commit is contained in:
cs6601
2012-09-04 16:02:49 -04:00
parent 0bbcb1054d
commit d4acc5beda
14 changed files with 507 additions and 152 deletions

View File

@@ -0,0 +1,33 @@
package net.woodyfolsom.msproj;
import static org.junit.Assert.*;
import java.util.List;
import org.junit.Test;
public class GameStateTest {
@Test
public void testGetEmptyCoords() {
GameState gameState = new GameState(3);
gameState.playStone(Player.BLACK, "A1");
gameState.playStone(Player.WHITE, "A2");
gameState.playStone(Player.BLACK, "A3");
List<String> validMoves = gameState.getEmptyCoords();
assertFalse(validMoves.contains("A1"));
assertFalse(validMoves.contains("A2"));
assertFalse(validMoves.contains("A3"));
assertTrue(validMoves.contains("B1"));
assertTrue(validMoves.contains("B2"));
assertTrue(validMoves.contains("B3"));
assertTrue(validMoves.contains("C1"));
assertTrue(validMoves.contains("C2"));
assertTrue(validMoves.contains("C3"));
}
}

View File

@@ -1,8 +1,14 @@
package net.woodyfolsom.msproj;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.List;
import net.woodyfolsom.msproj.policy.ActionGenerator;
import net.woodyfolsom.msproj.policy.ValidMoveGenerator;
import org.junit.Test;
public class IllegalMoveTest {
@@ -63,4 +69,27 @@ public class IllegalMoveTest {
System.out.println(gameState);
assertFalse("Play by WHITE at J1 should have failed.",gameState.playStone(Player.WHITE, Action.getInstance("J1")));
}
@Test
public void testIllegalMoveSuicide() {
GameState gameState = new GameState(3);
gameState.playStone(Player.WHITE, Action.getInstance("A1"));
gameState.playStone(Player.WHITE, Action.getInstance("B1"));
gameState.playStone(Player.WHITE, Action.getInstance("B2"));
gameState.playStone(Player.WHITE, Action.getInstance("A3"));
gameState.playStone(Player.WHITE, Action.getInstance("B3"));
System.out.println("State before move: ");
System.out.println(gameState);
assertFalse("Play by BLACK at A2 should have failed.",gameState.playStone(Player.BLACK, Action.getInstance("A2")));
List<Action> validMoves = new ValidMoveGenerator().getActions(new GameConfig(), gameState, Player.BLACK, ActionGenerator.ALL_ACTIONS);
assertEquals(4, validMoves.size());
assertTrue(validMoves.contains(Action.PASS));
assertTrue(validMoves.contains(Action.getInstance("C1")));
assertTrue(validMoves.contains(Action.getInstance("C2")));
assertTrue(validMoves.contains(Action.getInstance("C3")));
assertFalse(validMoves.contains(Action.getInstance("A2")));
}
}

View File

@@ -14,4 +14,56 @@ public class LegalMoveTest {
assertTrue(gameState.playStone(Player.WHITE, Action.getInstance("B2")));
System.out.println(gameState);
}
@Test
public void testLegalMove2Liberties() {
//Unit test based on illegal move from 9x9 game using MonteCarloUCT
//Illegal move detected by gokgs.com server
GameState gameState = new GameState(9);
gameState.playStone(Player.BLACK, Action.getInstance("G5"));
gameState.playStone(Player.BLACK, Action.getInstance("G7"));
gameState.playStone(Player.BLACK, Action.getInstance("F6"));
gameState.playStone(Player.BLACK, Action.getInstance("H6"));
gameState.playStone(Player.BLACK, Action.getInstance("C7"));
gameState.playStone(Player.BLACK, Action.getInstance("D7"));
gameState.playStone(Player.BLACK, Action.getInstance("E7"));
gameState.playStone(Player.BLACK, Action.getInstance("F7"));
gameState.playStone(Player.BLACK, Action.getInstance("G8"));
gameState.playStone(Player.BLACK, Action.getInstance("H9"));
gameState.playStone(Player.BLACK, Action.getInstance("J7"));
gameState.playStone(Player.BLACK, Action.getInstance("E5"));
gameState.playStone(Player.BLACK, Action.getInstance("F4"));
gameState.playStone(Player.BLACK, Action.getInstance("G3"));
gameState.playStone(Player.BLACK, Action.getInstance("D4"));
gameState.playStone(Player.BLACK, Action.getInstance("E3"));
gameState.playStone(Player.BLACK, Action.getInstance("B4"));
gameState.playStone(Player.BLACK, Action.getInstance("C3"));
gameState.playStone(Player.BLACK, Action.getInstance("D2"));
gameState.playStone(Player.BLACK, Action.getInstance("E1"));
gameState.playStone(Player.WHITE, Action.getInstance("H8"));
gameState.playStone(Player.WHITE, Action.getInstance("H7"));
gameState.playStone(Player.WHITE, Action.getInstance("D9"));
gameState.playStone(Player.WHITE, Action.getInstance("D8"));
gameState.playStone(Player.WHITE, Action.getInstance("E8"));
gameState.playStone(Player.WHITE, Action.getInstance("A7"));
gameState.playStone(Player.WHITE, Action.getInstance("A6"));
gameState.playStone(Player.WHITE, Action.getInstance("B8"));
gameState.playStone(Player.WHITE, Action.getInstance("B7"));
gameState.playStone(Player.WHITE, Action.getInstance("B6"));
gameState.playStone(Player.WHITE, Action.getInstance("C5"));
gameState.playStone(Player.WHITE, Action.getInstance("D5"));
gameState.playStone(Player.WHITE, Action.getInstance("D6"));
gameState.playStone(Player.WHITE, Action.getInstance("A3"));
gameState.playStone(Player.WHITE, Action.getInstance("B3"));
gameState.playStone(Player.WHITE, Action.getInstance("B1"));
gameState.playStone(Player.WHITE, Action.getInstance("F1"));
System.out.println("State before move: ");
System.out.println(gameState);
assertTrue("Play by WHITE at H5 should not have failed.",gameState.playStone(Player.WHITE, Action.getInstance("H5")));
}
}

View File

@@ -1,6 +1,8 @@
package net.woodyfolsom.msproj.policy;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
@@ -34,22 +36,15 @@ public class RandomTest {
gameState.playStone(Player.BLACK, Action.getInstance("A3"));
gameState.playStone(Player.BLACK, Action.getInstance("A4"));
gameState.playStone(Player.BLACK, Action.getInstance("B1"));;
gameState.playStone(Player.BLACK, Action.getInstance("B2"));
//gameState.playStone('B', 3, GameBoard.BLACK_STONE);
gameState.playStone(Player.BLACK, Action.getInstance("B4"));
gameState.playStone(Player.BLACK, Action.getInstance("B2"));
gameState.playStone(Player.BLACK, Action.getInstance("B4"));
gameState.playStone(Player.BLACK, Action.getInstance("C2"));
gameState.playStone(Player.BLACK, Action.getInstance("C3"));
gameState.playStone(Player.BLACK, Action.getInstance("C4"));
gameState.playStone(Player.BLACK, Action.getInstance("C4"));
gameState.playStone(Player.BLACK, Action.getInstance("D4"));
gameState.playStone(Player.WHITE, Action.getInstance("C1"));
gameState.playStone(Player.WHITE, Action.getInstance("D2"));
gameState.playStone(Player.WHITE, Action.getInstance("D3"));
System.out.println("State before random WHITE move selection:");
System.out.println(gameState);
//This is correct - checked vs. MFOG
@@ -61,4 +56,55 @@ public class RandomTest {
System.out.println(gameState);
}
@Test
public void testIllegalMoveSuicide() {
GameState gameState = new GameState(3);
gameState.playStone(Player.WHITE, Action.getInstance("A1"));
gameState.playStone(Player.WHITE, Action.getInstance("B1"));
gameState.playStone(Player.WHITE, Action.getInstance("B2"));
gameState.playStone(Player.WHITE, Action.getInstance("A3"));
gameState.playStone(Player.WHITE, Action.getInstance("B3"));
System.out.println("State before move: ");
System.out.println(gameState);
RandomMovePolicy randomMovePolicy = new RandomMovePolicy();
//There is only a minute chance (5E-7) that RandomMoveGenerator fails to return an invalid move with probability 1/4
//after 50 calls, if this bug recurs.
for (int i = 0; i < 50; i++) {
Action action = randomMovePolicy.getAction(new GameConfig(),gameState,Player.BLACK);
//System.out.println(action);
assertFalse("RandomMovePolicy returned illegal suicide move A2",action.equals(Action.getInstance("A2")));
}
}
@Test
public void testIllegalMoveKo() {
GameState gameState = new GameState(4);
gameState.playStone(Player.WHITE, Action.getInstance("B1"));
gameState.playStone(Player.WHITE, Action.getInstance("A2"));
gameState.playStone(Player.WHITE, Action.getInstance("C2"));
gameState.playStone(Player.WHITE, Action.getInstance("B3"));
gameState.playStone(Player.BLACK, Action.getInstance("A3"));
gameState.playStone(Player.BLACK, Action.getInstance("C3"));
gameState.playStone(Player.BLACK, Action.getInstance("B4"));
System.out.println("State before move: ");
System.out.println(gameState);
assertTrue(gameState.playStone(Player.BLACK, Action.getInstance("B2")));
System.out.println("State after move: ");
System.out.println(gameState);
RandomMovePolicy randomMovePolicy = new RandomMovePolicy();
//Test that after 50 moves, the policy never returns B3, which would be a Ko violation
for (int i = 0; i < 50; i++) {
Action action = randomMovePolicy.getAction(new GameConfig(),gameState,Player.WHITE);
//System.out.println(action);
assertFalse(action.equals(Action.NONE));
assertFalse("RandomMovePolicy returned Ko violation move B3",action.equals(Action.getInstance("B3")));
}
}
}