evaluate.rs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. use game::*;
  2. use bitboard::*;
  3. use movegen::*;
  4. use std::f32::*;
  5. pub type PosValue = f32;
  6. pub const MIN_VALUE: PosValue = -1000000.0f32;
  7. pub const MAX_VALUE: PosValue = 1000000.0f32;
  8. fn value_castling_rights(game: &Game, side: Side) -> PosValue {
  9. let mut val: PosValue = 0.0f32;
  10. for i in 0..2 {
  11. if game.castling_rights[i] { val += 12.0f32; }
  12. }
  13. for i in 2..4 {
  14. if game.castling_rights[i] { val -= 12.0f32; }
  15. }
  16. if side == BLACK {
  17. return -val;
  18. }
  19. else {
  20. return val;
  21. }
  22. }
  23. fn side_value(game: &Game, side: Side) -> u32 {
  24. let knights = game.get_piece(KNIGHT, side);
  25. let ks = BitboardIterator(knights);
  26. let mut k_attacks: u32 = 0;
  27. for k in ks {
  28. let targets = get_knight_targets(square(k));
  29. k_attacks += targets.count_ones() * 4;
  30. }
  31. let adv_pawn_mask = match side { WHITE => ROW_7, BLACK => ROW_2 };
  32. let advanced_pawns = (game.get_piece(PAWN, side) & adv_pawn_mask).count_ones() * 200;
  33. advanced_pawns + k_attacks
  34. }
  35. fn material_value(game: &Game, side: Side) -> PosValue {
  36. (game.get_piece(PAWN, side).count_ones() * 100
  37. + game.get_piece(KNIGHT, side).count_ones() * 300
  38. + game.get_piece(BISHOP, side).count_ones() * 320
  39. + game.get_piece(ROOK, side).count_ones() * 400
  40. + game.get_piece(QUEEN, side).count_ones() * 700) as PosValue
  41. }
  42. pub fn evaluate(game: &Game) -> PosValue {
  43. let sv = side_value(game, game.turn) as PosValue - side_value(game, !game.turn) as PosValue;
  44. let material_value_us = material_value(game, game.turn);
  45. let material_value_them = material_value(game, !game.turn);
  46. let mat_val = material_value_us.powf(0.995f32) - material_value_them.powf(0.995f32);
  47. return mat_val + value_castling_rights(game, game.turn);
  48. }