|
|
@@ -0,0 +1,56 @@ |
|
|
import subprocess |
|
|
from lib.common.dominoUtil import running_on_local |
|
|
from lib.config import PROJECT_PATH |
|
|
import time |
|
|
import psutil |
|
|
import os |
|
|
import numpy as np |
|
|
|
|
|
def _recommended_threads(): |
|
|
return psutil.cpu_count()-2 |
|
|
|
|
|
def _recommended_memory(): |
|
|
return psutil.virtual_memory().available/(2*1024*1024) |
|
|
|
|
|
def _numbers_in_file(fn): |
|
|
f = open( fn ) |
|
|
return [ int(x) for x in f.readlines() ] |
|
|
|
|
|
|
|
|
def stockfish( fen, seconds=1, threads=None, memory=None ): |
|
|
""" Return the evaluation for a position """ |
|
|
return stockfish_scores( fen=fen, seconds=seconds, threads=threads, memory=memory)[-1] |
|
|
|
|
|
def is_positional( scores ): |
|
|
""" True if the position is positional in nature """ |
|
|
score_diff = [ abs(sd) for sd in np.diff( scores ) ] |
|
|
return max( score_diff ) < 25 |
|
|
|
|
|
def stockfish_scores(fen, seconds=1, threads=None, memory=None, all_scores=False): |
|
|
""" Call stockfish engine and return vector of evaluation score """ |
|
|
|
|
|
# Defaults |
|
|
memory = memory or _recommended_memory() |
|
|
threads = threads or _recommended_threads() |
|
|
binary = 'mac' if running_on_local() else 'linux' |
|
|
|
|
|
# Shell out to Stockfish |
|
|
subprocess.call(["chmod", "+x", "stockfish.sh"]) |
|
|
subprocess.call(["chmod", "+x", "stockfish_"+binary]) |
|
|
cmd = ' '.join( ['./stockfish.sh' ,fen, str(seconds) , binary, str(threads), str(memory) ] ) |
|
|
print cmd |
|
|
subprocess.call( cmd, shell=True ) |
|
|
|
|
|
# Read from score.txt |
|
|
time.sleep( 1 ) |
|
|
try: |
|
|
scores_file = os.path.join( PROJECT_PATH,'roardata_stockfish','scores.txt') |
|
|
return _numbers_in_file(scores_file) |
|
|
except: |
|
|
analysis_file = scores_file.replace('score.txt','analysis.txt') |
|
|
print "stockfish engine had trouble reading " + scores_file + ", probably because the analysis file did not contain the evaluation string as expected" |
|
|
print "Here is the analysis file " + analysis_file |
|
|
with open( analysis_file, 'r') as fin: |
|
|
print fin.read() |
|
|
|
|
|
|