Files @ f9ab2070bd69
Branch filter:

Location: OneEye/src/tests/testEngine.py

Laman
Engine: more tests and fixes
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