def test3(self): """Testing eval symmetry of each function""" funcs = (f for f in dir(leval) if f.startswith("eval")) funcs = (getattr(leval, f) for f in funcs) funcs = (f for f in funcs if callable(f) and f != leval.evaluateComplete and f != leval.evalMaterial and f != leval.evalPawnStructure and f != leval.evalTrappedBishops) sw, phasew = leval.evalMaterial(self.board, WHITE) sb, phaseb = leval.evalMaterial(self.board, BLACK) self.assertEqual(phasew, phaseb) pawnScore, passed, weaked = leval.cacheablePawnInfo(self.board, phasew) sw = leval.evalPawnStructure(self.board, WHITE, phasew, passed, weaked) pawnScore, passed, weaked = leval.cacheablePawnInfo(self.board, phaseb) sb = leval.evalPawnStructure(self.board, BLACK, phaseb, passed, weaked) self.assertEqual(sw, sb) sw = leval.evalTrappedBishops(self.board, WHITE) sb = leval.evalTrappedBishops(self.board, BLACK) self.assertEqual(sw, sb) for func in funcs: sw = func(self.board, WHITE, phasew) sb = func(self.board, BLACK, phaseb) # print func, sw, sb self.assertEqual(sw, sb)
def test3(self): """Testing eval symmetry of each function""" funcs = (f for f in dir(leval) if f.startswith("eval")) funcs = (getattr(leval,f) for f in funcs) funcs = (f for f in funcs if callable(f) \ and f != leval.evaluateComplete\ and f != leval.evalMaterial\ and f != leval.evalPawnStructure\ and f != leval.evalTrappedBishops) sw, phasew = leval.evalMaterial (self.board, WHITE) sb, phaseb = leval.evalMaterial (self.board, BLACK) self.assertEqual(phasew, phaseb) pawnScore, passed, weaked = leval.cacheablePawnInfo (self.board, phasew) sw = leval.evalPawnStructure (self.board, WHITE, phasew, passed, weaked) pawnScore, passed, weaked = leval.cacheablePawnInfo (self.board, phaseb) sb = leval.evalPawnStructure (self.board, BLACK, phaseb, passed, weaked) self.assertEqual(sw, sb) sw = leval.evalTrappedBishops (self.board, WHITE) sb = leval.evalTrappedBishops (self.board, BLACK) self.assertEqual(sw, sb) for func in funcs: sw = func(self.board, WHITE, phasew) sb = func(self.board, BLACK, phaseb) #print func, sw, sb self.assertEqual(sw, sb)
def test4(self): """Testing eval symmetry of each function""" funcs = (f for f in dir(leval) if f.startswith("eval")) funcs = (getattr(leval, f) for f in funcs) funcs = (f for f in funcs if callable(f) and f != leval.evalMaterial) sw, phasew = leval.evalMaterial(self.board, WHITE) sb, phaseb = leval.evalMaterial(self.board, BLACK) self.assertEqual(phasew, phaseb) for func in funcs: sw = func(self.board, WHITE, phasew) sb = func(self.board, BLACK, phaseb) #print func, sw, sb self.assertEqual(sw, sb)
def test4(self): """Testing eval symmetry of each function""" funcs = (f for f in dir(leval) if f.startswith("eval")) funcs = (getattr(leval,f) for f in funcs) funcs = (f for f in funcs if callable(f) and f != leval.evalMaterial) sw, phasew = leval.evalMaterial (self.board, WHITE) sb, phaseb = leval.evalMaterial (self.board, BLACK) self.assertEqual(phasew, phaseb) for func in funcs: sw = func(self.board, WHITE, phasew) sb = func(self.board, BLACK, phaseb) #print func, sw, sb self.assertEqual(sw, sb)
def game_changed(self, model, ply): if len(self.plot) + model.lowply > ply: return for i in range(len(self.plot) + model.lowply, ply): if i in model.scores: points = model.scores[i][1] else: points = leval.evaluateComplete( model.getBoardAtPly(i).board, WHITE) self.plot.addScore(points) if model.status == DRAW: points = 0 elif model.status == WHITEWON: points = sys.maxsize elif model.status == BLACKWON: points = -sys.maxsize else: if ply in model.scores: points = model.scores[ply][1] else: points = leval.evaluateComplete( model.getBoardAtPly(ply).board, WHITE) self.plot.addScore(points) # As shownChanged will normally be emitted just after game_changed - # if we are viewing the latest position - we can do the selection change # now, and thereby avoid redraw being called twice if self.plot.selected == ply - model.lowply - 1: self.plot.select(ply - model.lowply) self.plot.redraw() # Uncomment this to debug eval function return board = model.boards[-1].board opboard = model.boards[-1].clone().board opboard.setColor(1 - opboard.color) material, phase = leval.evalMaterial(board) if board.color == WHITE: print("material", -material) e1 = leval.evalKingTropism(board) e2 = leval.evalKingTropism(opboard) print("evaluation: %d + %d = %d " % (e1, e2, e1 + e2)) p1 = leval.evalPawnStructure(board, phase) p2 = leval.evalPawnStructure(opboard, phase) print("pawns: %d + %d = %d " % (p1, p2, p1 + p2)) print("knights:", -leval.evalKnights(board)) print("king:", -leval.evalKing(board, phase)) else: print("material", material) print("evaluation:", leval.evalKingTropism(board)) print("pawns:", leval.evalPawnStructure(board, phase)) print("pawns2:", leval.evalPawnStructure(opboard, phase)) print("pawns3:", leval.evalPawnStructure(board, phase) + leval.evalPawnStructure(opboard, phase)) print("knights:", leval.evalKnights(board)) print("king:", leval.evalKing(board, phase)) print("----------------------")
def __chooseComment(self, model, ply): if ply == model.lowply: return _("Initial position") ######################################################################## # Set up variables ######################################################################## color = model.getBoardAtPly(ply - 1).board.color s, phase = evalMaterial( model.getBoardAtPly(ply).board, model.getBoardAtPly(ply - 1).color) # * Final: Will be shown alone: "mates", "draws" # * Prefix: Will always be shown: "castles", "promotes" # * Attack: Will always be shown: "threaten", "preassures", "defendes" # * Moves (s): Will always be shown: "put into *" # * State: (s) Will always be shown: "new *" # * Simple: (s) Max one will be shown: "develops", "activity" # * Tip: (s) Will sometimes be shown: "pawn storm", "cramped position" ######################################################################## # Call strategic evaluation functions ######################################################################## def getMessages(prefix): messages = [] for functionName in dir(strateval): if not functionName.startswith(prefix + "_"): continue function = getattr(strateval, functionName) messages.extend(function(model, ply, phase)) return messages # move = model.moves[-1].move # print "----- %d - %s -----" % (model.ply/2, toSAN(oldboard, move)) # ---------------------------------------------------------------------- # Final # ---------------------------------------------------------------------- messages = getMessages("final") if messages: return "%s %s" % (reprColor[color], messages[0]) # --- strings = [] # ---------------------------------------------------------------------- # Attacks # ---------------------------------------------------------------------- messages = getMessages("attack") for message in messages: strings.append("%s %s" % (reprColor[color], message)) # ---------------------------------------------------------------------- # Check for prefixes # ---------------------------------------------------------------------- messages = getMessages("prefix") if messages: prefix = messages[0] else: prefix = "" # ---------------------------------------------------------------------- # Check for special move stuff. All of which accept prefixes # ---------------------------------------------------------------------- for message in getMessages("offencive_moves") + getMessages("defencive_moves"): if prefix: strings.append( "%s %s %s %s" % (reprColor[color], prefix, _("and") + "\n", message)) prefix = "" else: strings.append("%s %s" % (reprColor[color], message)) # ---------------------------------------------------------------------- # Simple # ---------------------------------------------------------------------- # We only add simples if there hasn't been too much stuff to say if not strings: messages = getMessages("simple") if messages: messages.sort(reverse=True) score, message = messages[0] if prefix: strings.append( "%s %s %s %s" % (reprColor[color], prefix, _("and") + "\n", message)) prefix = "" # ---------------------------------------------------------------------- # Prefix fallback # ---------------------------------------------------------------------- # There was nothing to apply the prefix to, so we just post it here # before the states and tips if prefix: strings.append("%s %s" % (reprColor[color], prefix)) prefix = "" # ---------------------------------------------------------------------- # State # ---------------------------------------------------------------------- messages = getMessages("state") messages.sort(reverse=True) for score, message in messages: strings.append(message) # ---------------------------------------------------------------------- # Tips # ---------------------------------------------------------------------- tips = getMessages("tip") tips.sort(reverse=True) for (score, tip) in tips: if tip in self.givenTips: oldscore, oldply = self.givenTips[tip] if score < oldscore * 1.3 or model.ply < oldply + 10: continue self.givenTips[tip] = (score, model.ply) strings.append(tip) break # ---------------------------------------------------------------------- # Last solution # ---------------------------------------------------------------------- if not strings: tcord = TCORD(model.getMoveAtPly(ply - 1).move) piece = model.getBoardAtPly(ply).board.arBoard[tcord] strings.append(_("%(color)s moves a %(piece)s to %(cord)s") % { 'color': reprColor[color], 'piece': reprPiece[piece], 'cord': reprCord[tcord] }) return ";\n".join(strings)
def __chooseComment(self, model, ply): if ply == model.lowply: return _("Initial position") ######################################################################## # Set up variables ######################################################################## color = model.getBoardAtPly(ply-1).board.color s, phase = evalMaterial (model.getBoardAtPly(ply).board, model.getBoardAtPly(ply-1).color) # * Final: Will be shown alone: "mates", "draws" # * Prefix: Will always be shown: "castles", "promotes" # * Attack: Will always be shown: "threaten", "preassures", "defendes" # * Moves (s): Will always be shown: "put into *" # * State: (s) Will always be shown: "new *" # * Simple: (s) Max one will be shown: "develops", "activity" # * Tip: (s) Will sometimes be shown: "pawn storm", "cramped position" ######################################################################## # Call strategic evaluation functions ######################################################################## def getMessages (prefix): messages = [] for functionName in dir(strateval): if not functionName.startswith(prefix+"_"): continue function = getattr(strateval, functionName) messages.extend(function (model, ply, phase)) return messages #move = model.moves[-1].move #print "----- %d - %s -----" % (model.ply/2, toSAN(oldboard, move)) # ---------------------------------------------------------------------- # Final # ---------------------------------------------------------------------- messages = getMessages ("final") if messages: return "%s %s" % (reprColor[color], messages[0]) # --- strings = [] # ---------------------------------------------------------------------- # Attacks # ---------------------------------------------------------------------- messages = getMessages ("attack") for message in messages: strings.append("%s %s" % (reprColor[color], message)) # ---------------------------------------------------------------------- # Check for prefixes # ---------------------------------------------------------------------- messages = getMessages ("prefix") if messages: prefix = messages[0] else: prefix = "" # ---------------------------------------------------------------------- # Check for special move stuff. All of which accept prefixes # ---------------------------------------------------------------------- for message in getMessages("offencive_moves") \ + getMessages("defencive_moves"): if prefix: strings.append("%s %s %s %s" % (reprColor[color], prefix, _("and"), message)) prefix = "" else: strings.append("%s %s" % (reprColor[color], message)) # ---------------------------------------------------------------------- # Simple # ---------------------------------------------------------------------- # We only add simples if there hasn't been too much stuff to say if not strings: messages = getMessages ("simple") if messages: messages.sort(reverse=True) score, message = messages[0] if prefix: strings.append("%s %s %s %s" % (reprColor[color], prefix, _("and"), message)) prefix = "" # ---------------------------------------------------------------------- # Prefix fallback # ---------------------------------------------------------------------- # There was nothing to apply the prefix to, so we just post it here # before the states and tips if prefix: strings.append("%s %s" % (reprColor[color], prefix)) prefix = "" # ---------------------------------------------------------------------- # State # ---------------------------------------------------------------------- messages = getMessages("state") messages.sort(reverse=True) for score, message in messages: strings.append(message) # ---------------------------------------------------------------------- # Tips # ---------------------------------------------------------------------- tips = getMessages("tip") tips.sort(reverse=True) for (score, tip) in tips: if tip in self.givenTips: oldscore, oldply = self.givenTips[tip] if score < oldscore*1.3 or model.ply < oldply+10: continue self.givenTips[tip] = (score, model.ply) strings.append(tip) break # ---------------------------------------------------------------------- # Last solution # ---------------------------------------------------------------------- if not strings: tcord = TCORD(model.getMoveAtPly(ply-1).move) piece = model.getBoardAtPly(ply).board.arBoard[tcord] strings.append( _("%(color)s moves a %(piece)s to %(cord)s") % { 'color': reprColor[color], 'piece': reprPiece[piece], 'cord': reprCord[tcord]}) return ";\n".join(strings)