class Stockfish::AnalysisParser

Converts raw analysis output into a hash

Constants

ROW_SCANNER

Attributes

analysis[RW]
raw_analysis[RW]

Public Class Methods

new(raw_analysis = nil) click to toggle source
# File lib/stockfish/analysis_parser.rb, line 24
def initialize(raw_analysis = nil)
  @raw_analysis = raw_analysis
  @analysis = {}
end

Public Instance Methods

best_move_uci() click to toggle source
# File lib/stockfish/analysis_parser.rb, line 54
def best_move_uci
  @raw_analysis[/^bestmove (\w+)/, 1]
end
game_over?() click to toggle source
# File lib/stockfish/analysis_parser.rb, line 38
def game_over?
  !!@raw_analysis[/^bestmove \(none\)$/]
end
handle_game_over() click to toggle source
# File lib/stockfish/analysis_parser.rb, line 42
def handle_game_over
  game_over = @raw_analysis.match(/^info depth 0 score (?<outcome>[a-z]+) 0$/)
  score = case game_over[:outcome]
          when "mate" then "mate 0"
          when "cp" then 0
          end
  @analysis = {
    :bestmove   => nil,
    :variations => [{ :score => score, :sequence => [], :depth => 0 }]
  }
end
handle_multipv() click to toggle source
# File lib/stockfish/analysis_parser.rb, line 88
def handle_multipv
  multipv = nil
  count = 0
  @analysis = {
    :bestmove   => best_move_uci,
    :variations => []
  }
  @raw_analysis.strip.split("\n").reverse.each do |row|
    variation = parse_variation_row(row)
    next if variation.nil?
    multipv = variation[:multipv] if multipv.nil?
    @analysis[:variations].push variation
    count += 1
    break if count >= multipv
  end
  @analysis || {}
end
handle_singlepv() click to toggle source
# File lib/stockfish/analysis_parser.rb, line 75
def handle_singlepv
  @raw_analysis.strip.split("\n").reverse.each do |row|
    variation = parse_variation_row(row)
    next if variation.nil? || variation[:sequence].split(" ")[0] != best_move_uci
    @analysis = {
      :bestmove   => best_move_uci,
      :variations => [variation]
    }
    return @analysis
  end
  @analysis || {}
end
parse() click to toggle source
# File lib/stockfish/analysis_parser.rb, line 29
def parse
  return handle_game_over if game_over?
  if @raw_analysis.include?("multipv")
    handle_multipv
  else
    handle_singlepv
  end
end
parse_variation_row(row) click to toggle source
# File lib/stockfish/analysis_parser.rb, line 58
def parse_variation_row(row)
  sequence = row.match(/ pv (?<moves>.*)/)
  return if sequence.nil?
  analysis = row.match(ROW_SCANNER)
  score = case analysis[:score_type]
          when "cp" then analysis[:score].to_f/100
          when "mate" then "mate #{analysis[:score]}"
          end
  variation = {
    :score    => score,
    :sequence => sequence[:moves].split(/\s+/),
    :depth    => analysis[:depth].to_i,
  }
  variation[:multipv] = analysis[:multipv] ? analysis[:multipv].to_i : 1
  variation
end