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