Esempio n. 1
0
void sort_init(sort_t * sort, board_t * board, const attack_t * attack, int depth, int height, int trans_killer) {

   ASSERT(sort!=NULL);
   ASSERT(board!=NULL);
   ASSERT(attack!=NULL);
   ASSERT(depth_is_ok(depth));
   ASSERT(height_is_ok(height));
   ASSERT(trans_killer==MoveNone||move_is_ok(trans_killer));

   sort->board = board;
   sort->attack = attack;

   sort->depth = depth;
   sort->height = height;

   sort->trans_killer = trans_killer;
   sort->killer_1 = Killer[sort->height][0];
   sort->killer_2 = Killer[sort->height][1];
   if (sort->height > 2){
	  sort->killer_3 = Killer[sort->height-2][0];
      sort->killer_4 = Killer[sort->height-2][1]; 
   }
   else{
      sort->killer_3 = MoveNone;
      sort->killer_4 = MoveNone;
   }

   if (ATTACK_IN_CHECK(sort->attack)) {

      gen_legal_evasions(sort->list,sort->board,sort->attack);
      note_moves(sort->list,sort->board,sort->height,sort->trans_killer);
      list_sort(sort->list);

      sort->gen = PosLegalEvasion + 1;
      sort->test = TEST_NONE;

   } else { // not in check

      LIST_CLEAR(sort->list);
      sort->gen = PosSEE;
   }

   sort->pos = 0;
}
Esempio n. 2
0
void sort_init(sort_t * sort, board_t * board, const attack_t * attack, int depth, int height, int trans_killer, bool in_pv, int ThreadId) {

   ASSERT(sort!=NULL);
   ASSERT(board!=NULL);
   ASSERT(attack!=NULL);
   ASSERT(depth_is_ok(depth));
   ASSERT(height_is_ok(height));
   ASSERT(trans_killer==MoveNone||move_is_ok(trans_killer));

   sort->board = board;
   sort->attack = attack;

   sort->height = height;

   sort->trans_killer = trans_killer;
   sort->killer_1 = Killer[ThreadId][sort->height][0]; // last best
   sort->killer_3 = Killer[ThreadId][sort->height][1];
   if (sort->height > 2){
      sort->killer_2 = Killer[ThreadId][sort->height-2][0];  // last best below
      sort->killer_4 = Killer[ThreadId][sort->height-2][1];
   }
   else{
      sort->killer_2 = MoveNone;
      sort->killer_4 = MoveNone;
   }

   // uniqueness added.                                                // WHM
   if (sort->killer_1 != MoveNone) {                                   // WHM
      if (sort->killer_2 == sort->killer_1) sort->killer_2 = MoveNone; // WHM
      if (sort->killer_3 == sort->killer_1) sort->killer_3 = MoveNone; // WHM
      if (sort->killer_4 == sort->killer_1) sort->killer_4 = MoveNone; // WHM
   }                                                                   // WHM
   if (sort->killer_2 != MoveNone) {                                   // WHM
      if (sort->killer_3 == sort->killer_2) sort->killer_3 = MoveNone; // WHM
      if (sort->killer_4 == sort->killer_2) sort->killer_4 = MoveNone; // WHM
   }                                                                   // WHM
      if (sort->killer_4 == sort->killer_3) sort->killer_4 = MoveNone; // WHM

   ASSERT(sort->killer_1 == MoveNone  ||  sort->killer_1 != sort->killer_2); // WHM
   ASSERT(sort->killer_1 == MoveNone  ||  sort->killer_1 != sort->killer_3); // WHM
   ASSERT(sort->killer_1 == MoveNone  ||  sort->killer_1 != sort->killer_4); // WHM
   ASSERT(sort->killer_2 == MoveNone  ||  sort->killer_2 != sort->killer_1); // WHM
   ASSERT(sort->killer_2 == MoveNone  ||  sort->killer_2 != sort->killer_3); // WHM
   ASSERT(sort->killer_2 == MoveNone  ||  sort->killer_2 != sort->killer_4); // WHM
   ASSERT(sort->killer_3 == MoveNone  ||  sort->killer_3 != sort->killer_1); // WHM
   ASSERT(sort->killer_3 == MoveNone  ||  sort->killer_3 != sort->killer_2); // WHM
   ASSERT(sort->killer_3 == MoveNone  ||  sort->killer_3 != sort->killer_4); // WHM
   ASSERT(sort->killer_4 == MoveNone  ||  sort->killer_4 != sort->killer_1); // WHM
   ASSERT(sort->killer_4 == MoveNone  ||  sort->killer_4 != sort->killer_2); // WHM
   ASSERT(sort->killer_4 == MoveNone  ||  sort->killer_4 != sort->killer_3); // WHM
   
   sort->in_pv = in_pv;
   
   if (ATTACK_IN_CHECK(sort->attack)) {

      gen_legal_evasions(sort->list,sort->board,sort->attack);
      note_moves(sort->list,sort->board,sort->height,sort->trans_killer,ThreadId);
      list_sort(sort->list);

      sort->gen = PosLegalEvasion + 1;
      sort->test = TEST_NONE;

   } else { // not in check

      LIST_CLEAR(sort->list);
      sort->gen = PosSEE;
   }

   sort->pos = 0;
}
Esempio n. 3
0
void search_full_init(list_t * list, board_t * board) {

   const char * string;
   int trans_move, trans_min_depth, trans_max_depth, trans_min_value, trans_max_value;

   ASSERT(list_is_ok(list));
   ASSERT(board_is_ok(board));

   // null-move options

   string = option_get_string("NullMove Pruning");

   if (false) {
   } else if (my_string_equal(string,"Always")) {
      UseNull = true;
      UseNullEval = false;
   } else if (my_string_equal(string,"Fail High")) {
      UseNull = true;
      UseNullEval = true;
   } else if (my_string_equal(string,"Never")) {
      UseNull = false;
      UseNullEval = false;
   } else {
      ASSERT(false);
      UseNull = true;
      UseNullEval = true;
   }

   NullReduction = option_get_int("NullMove Reduction");

   string = option_get_string("Verification Search");

   if (false) {
   } else if (my_string_equal(string,"Always")) {
      UseVer = true;
      UseVerEndgame = false;
   } else if (my_string_equal(string,"Endgame")) {
      UseVer = true;
      UseVerEndgame = true;
   } else if (my_string_equal(string,"Never")) {
      UseVer = false;
      UseVerEndgame = false;
   } else {
      ASSERT(false);
      UseVer = true;
      UseVerEndgame = true;
   }

   VerReduction = option_get_int("Verification Reduction");

   // history-pruning options

   UseHistory = option_get_bool("History Pruning");
   HistoryValue = (option_get_int("History Threshold") * 16384 + 50) / 100;

   UseExtendedHistory = option_get_bool("Toga Extended History Pruning");
   HistoryBound = (option_get_int("Toga History Threshold") * 16384 + 50) / 100;

   // futility-pruning options

   UseFutility = option_get_bool("Futility Pruning");
   FutilityMargin1 = option_get_int("Futility Margin");
   FutilityMargin2 = option_get_int("Extended Futility Margin");


   // delta-pruning options

   UseDelta = option_get_bool("Delta Pruning");
   DeltaMargin = option_get_int("Delta Margin");

   // quiescence-search options

   CheckNb = option_get_int("Quiescence Check Plies");
   CheckDepth = 1 - CheckNb;

   // standard sort

   list_note(list);
   list_sort(list);

   // basic sort

   trans_move = MoveNone;
   if (UseTrans) trans_retrieve(Trans,board->key,&trans_move,&trans_min_depth,&trans_max_depth,&trans_min_value,&trans_max_value);

   note_moves(list,board,0,trans_move);
   list_sort(list);
}
Esempio n. 4
0
void search_full_init(list_t * list, board_t * board, int ThreadId) {

   const char * string;
   int trans_move, trans_depth, trans_flags, trans_value;
   int i, j;
   entry_t * found_entry;

   ASSERT(list_is_ok(list));
   ASSERT(board_is_ok(board));

   // null-move options

   string = option_get_string("NullMove Pruning");

   if (false) {
   } else if (my_string_equal(string,"Always")) {
      UseNull = true;
      UseNullEval = false;
   } else if (my_string_equal(string,"Fail High")) {
      UseNull = true;
      UseNullEval = true;
   } else if (my_string_equal(string,"Never")) {
      UseNull = false;
      UseNullEval = false;
   } else {
      ASSERT(false);
      UseNull = true;
      UseNullEval = true;
   }

   NullReduction = option_get_int("NullMove Reduction");

   string = option_get_string("Verification Search");

   if (false) {
   } else if (my_string_equal(string,"Always")) {
      UseVer = true;
      UseVerEndgame = false;
   } else if (my_string_equal(string,"Endgame")) {
      UseVer = true;
      UseVerEndgame = true;
   } else if (my_string_equal(string,"Never")) {
      UseVer = false;
      UseVerEndgame = false;
   } else {
      ASSERT(false);
      UseVer = true;
      UseVerEndgame = true;
   }

   VerReduction = option_get_int("Verification Reduction");

   // history-pruning options

   UseHistory = option_get_bool("History Pruning");
   HistoryValue = (option_get_int("History Threshold") * 16384 + 50) / 100;

   
   // Stockfish Late Move Reductions
   // about 20 elo better than previous Toga History Reductions

   for (i = 0; i < 64; i++){   
      for (j = 0; j < 64; j++){
         if (i == 0 || j == 0){
            quietPvMoveReduction[i][j] = quietMoveReduction[i][j] = 0;
         }
         else{
            double pvReduction =
               log((double) (i)) * log((double) (j)) / 3.0;
            double nonPvReduction =
               (1.0 + log((double) (i))) * log((double) (j)) / 2.5; // JD
            quietPvMoveReduction[i][j] =
               (int) (pvReduction >= 1.0 ?
                      floor(pvReduction) : 0);
            quietMoveReduction[i][j] =
               (int) (nonPvReduction >= 1.0 ?
                      floor(nonPvReduction) : 0);
         }
      }
   }

   // futility-pruning options

   UseFutility = option_get_bool("Futility Pruning");
   FutilityMargin1 = option_get_int("Futility Margin");
   FutilityMargin2 = option_get_int("Extended Futility Margin");

   // delta-pruning options

   UseDelta = option_get_bool("Delta Pruning");
   DeltaMargin = option_get_int("Delta Margin");

   // quiescence-search options

   SearchCurrent[ThreadId]->CheckNb = option_get_int("Quiescence Check Plies");
   SearchCurrent[ThreadId]->CheckDepth = 1 - SearchCurrent[ThreadId]->CheckNb;

   // standard sort

   list_note(list);
   list_sort(list);
   
   // misc
   
   SearchCurrent[ThreadId]->last_move = MoveNone;

   // basic sort

   trans_move = MoveNone;
   if (UseTrans) trans_retrieve(Trans,&found_entry,board->key,&trans_move,&trans_depth,&trans_flags,&trans_value);
   note_moves(list,board,0,trans_move,ThreadId);
   list_sort(list);
}