Skip to content

Instantly share code, notes, and snippets.

@daroza
Forked from notbanker/stockfish.py
Created March 19, 2017 17:52
Show Gist options
  • Select an option

  • Save daroza/cdb8f2d198d798b3096eaa2c0221c43b to your computer and use it in GitHub Desktop.

Select an option

Save daroza/cdb8f2d198d798b3096eaa2c0221c43b to your computer and use it in GitHub Desktop.

Revisions

  1. @notbanker notbanker created this gist Mar 23, 2016.
    56 changes: 56 additions & 0 deletions stockfish.py
    Original file line number Diff line number Diff line change
    @@ -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()