Files @ f9ab2070bd69
Branch filter:

Location: OneEye/src/tests/testEngine.py - annotation

Laman
Engine: more tests and fixes
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
077600f0c5f8
077600f0c5f8
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
077600f0c5f8
077600f0c5f8
077600f0c5f8
077600f0c5f8
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
077600f0c5f8
077600f0c5f8
077600f0c5f8
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
077600f0c5f8
077600f0c5f8
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
077600f0c5f8
077600f0c5f8
077600f0c5f8
077600f0c5f8
077600f0c5f8
0cb3fbe06b5d
0cb3fbe06b5d
0cb3fbe06b5d
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
0cb3fbe06b5d
0cb3fbe06b5d
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
0cb3fbe06b5d
0cb3fbe06b5d
f9ab2070bd69
0cb3fbe06b5d
0cb3fbe06b5d
f9ab2070bd69
0cb3fbe06b5d
0cb3fbe06b5d
0cb3fbe06b5d
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
0cb3fbe06b5d
0cb3fbe06b5d
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
0cb3fbe06b5d
0cb3fbe06b5d
0cb3fbe06b5d
0cb3fbe06b5d
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
f9ab2070bd69
import re
import os.path
import logging as log
from unittest import TestCase

import config as cfg
from util import BLACK as B,WHITE as W,EMPTY as _
from go.core import Go
from go.engine import SpecGo,Engine
from statebag import BoardState


_log=log.getLogger(__name__)
_log.setLevel(log.INFO)
_log.propagate=False
formatter=log.Formatter("%(asctime)s %(levelname)s: %(message)s",datefmt="%Y-%m-%d %H:%M:%S")
handler=log.FileHandler("/tmp/oneeye.log",mode="w")
handler.setFormatter(formatter)
_log.addHandler(handler)


def simpleLoadSgf(filename):
	with open(filename) as f:
		contents=f.read()
	g=lambda m: tuple(ord(c)-ord('a') for c in reversed(m.group(1)))
	return [g(m) for m in re.finditer(r"\b[BW]\[([a-z]{2})\]",contents)]


def listStates(moves):
	g=Go()
	res=[BoardState(g.board)]
	for m in moves:
		g.doMove(g.toMove,*m)
		res.append(BoardState(g.board))
	return res


class TestTransitions(TestCase):
	def testBasic(self):
		s1=BoardState([
			[_,_,_],
			[_,_,_],
			[_,_,_]
		])
		s2=BoardState([
			[_,_,_],
			[_,B,_],
			[_,_,_]
		])
		g=SpecGo(3)
		eng=Engine(g)
		eng.load(s1,s2-s1)
		self.assertEqual(eng.dfs(s2,1),[(1,1,1)])

	def testCapture(self):
		s1=BoardState([
			[_,W,_],
			[W,B,_],
			[_,W,_]
		])
		s2=BoardState([
			[_,W,_],
			[W,_,W],
			[_,W,_]
		])
		g=SpecGo(3)
		g.toMove=W
		eng=Engine(g)
		eng.load(s1,s2-s1)
		self.assertEqual(eng.dfs(s2,1),[(W,1,2)])

	def testMulti(self):
		s1=BoardState([
			[_,_,_],
			[_,_,_],
			[_,_,_]
		])
		s2=BoardState([
			[_,_,_],
			[_,B,W],
			[_,_,_]
		])
		g=SpecGo(3)
		eng=Engine(g)
		eng.load(s1,s2-s1)
		self.assertEqual(eng.dfs(s2,2),[(W,1,2),(B,1,1)])

	def testSnapback(self):
		s1=BoardState([
			[B,B,B],
			[B,_,B],
			[B,W,B]
		])
		s2=BoardState([
			[_,_,_],
			[_,_,_],
			[_,W,_]
		])
		g=SpecGo(3)
		eng=Engine(g)
		eng.load(s1,s2-s1)
		self.assertEqual(eng.dfs(s2,2),[(W,2,1),(B,1,1)])

		s1=BoardState([
			[_,_,_],
			[W,B,B],
			[_,W,W]
		])
		s2=BoardState([
			[_,_,_],
			[W,B,B],
			[_,W,_]
		])
		eng.load(s1,s2-s1)
		self.assertEqual(eng.dfs(s2,2),[(W,2,1),(B,2,0)])

	def testReal(self):
		files=["O-Takao-20110106.sgf","Sakai-Iyama-20110110.sgf"]
		g=SpecGo()
		eng=Engine(g)

		for f in files:
			moves=simpleLoadSgf(os.path.join(cfg.srcDir,"tests/data",f))
			states=listStates(moves)

			for k in range(1,4):
				toMove=B
				for (s1,s2) in zip(states,states[k:]):
					diff=s2-s1
					eng.load(s1,diff)
					seq=eng.iterativelyDeepen(s2,toMove)
					msg="\n"+s1.exportDiff(s2)
					self.assertIsNotNone(seq,msg)
					self.assertLessEqual(len(seq),k,msg)
					if len(seq)!=k: _log.warning("shorter than expected transition sequence:" + msg + "\n" + str(seq))
					toMove*=-1