Ticket #145: clock.c.patch

File clock.c.patch, 5.1 kB (added by draqo, 2 years ago)
  • gnugo/engine/clock.c

    RCS file: /sources/gnugo/gnugo/engine/clock.c,v
    retrieving revision 1.26
    diff -u -r1.26 clock.c
     
    6868}; 
    6969 
    7070struct timer_data { 
    71   struct remaining_time_data official; 
    72   struct remaining_time_data estimated; 
     71  struct remaining_time_data official; // time received from external source 
     72  struct remaining_time_data estimated; // time counted by GnuGO 
    7373  int time_out; 
    7474}; 
    7575 
     
    127127 * 
    128128 *  byo_time > 0 and byo_stones == 0 means no time settings. 
    129129 */ 
    130 void 
     130inline void 
    131131clock_settings(int time, int byo_time, int byo_stones) 
    132132{ 
    133133  if (time >= 0) 
     
    142142/* Get time settings. Returns 1 if any time settings have been made, 
    143143 * 0 otherwise. 
    144144 */ 
    145 int 
     145inline int 
    146146have_time_settings(void) 
    147147{ 
    148148  /* According to the semantics of the GTP command 'time_settings', the 
     
    220220  static int last_movenum = -1; 
    221221  struct timer_data* const td 
    222222    = (color == BLACK) ? &black_time_data : &white_time_data; 
    223   double now = gg_gettimeofday(); 
     223  double now; 
    224224 
    225225  if (!have_time_settings()) 
    226226    return; 
    227227 
     228  now = gg_gettimeofday(); 
     229 
    228230  if (last_movenum >= 0 
    229       && movenum == last_movenum + 1 
    230       && movenum > td->estimated.movenum) { 
     231      && movenum == last_movenum + 1) { 
    231232    double time_used = now - last_time; 
    232233    td->estimated.time_left -= time_used; 
    233234    td->estimated.movenum = movenum; 
    234235    td->estimated.time_for_last_move = time_used; 
    235236    if (td->estimated.time_left < 0) { 
    236237      if (td->estimated.in_byoyomi || byoyomi_stones == 0) { 
     238 
     239#ifndef GG_TURN_OFF_DEBUGS 
    237240        DEBUG(DEBUG_TIME, "%s ran out of time.\n", color_to_string(color)); 
    238241        if (debug & DEBUG_TIME) 
    239242          clock_print(color); 
     243#endif 
     244 
    240245        td->time_out = 1; 
    241246      } 
    242247      else { 
     
    251256    } 
    252257    else if (td->estimated.stones > 0) { 
    253258      gg_assert(td->estimated.in_byoyomi); 
    254       td->estimated.stones = td->estimated.stones - 1; 
     259      --td->estimated.stones; 
    255260      if (td->estimated.stones == 0) { 
    256261        td->estimated.time_left = byoyomi_time; 
    257262        td->estimated.stones = byoyomi_stones; 
     
    262267  last_movenum = movenum; 
    263268  last_time = now; 
    264269 
     270#ifndef GG_TURN_OFF_DEBUGS 
    265271  /* Update main timer. */ 
    266272  if (debug & DEBUG_TIME) 
    267273    clock_print(color); 
     274#endif 
    268275} 
    269276 
    270277 
     
    297304 
    298305  if (timer->stones == 0) { 
    299306    /* Main time running. */ 
    300     *time_left = timer->time_left + byoyomi_time; 
     307    *time_left = timer->time_left; 
    301308    if (byoyomi_time > 0) 
     309        { 
     310          *time_left += byoyomi_time; 
    302311      *stones_left = byoyomi_stones; 
     312        } 
    303313    else { 
    304314      /* Absolute time. Here we aim to be able to play at least X more 
    305315       * moves or a total of Y moves. We choose Y as a third of the 
     
    331341adjust_level_offset(int color) 
    332342{ 
    333343  double time_for_last_move; 
    334   double time_left; 
    335   int stones_left; 
     344  double time_left, estimated_time; 
     345  int stones_left, new_level; 
    336346 
    337347  if (!analyze_time_data(color, &time_for_last_move, &time_left, &stones_left)) 
    338348    return; 
     
    342352   * 
    343353   * FIXME: Use rules with at least some theoretical basis. 
    344354   */ 
    345   if (time_left < time_for_last_move * (stones_left + 3)) 
    346     level_offset--; 
    347   if (time_left < time_for_last_move * stones_left) 
    348     level_offset--; 
    349   if (3 * time_left < 2 * time_for_last_move * stones_left) 
    350     level_offset--; 
    351   if (2 * time_left < time_for_last_move * stones_left) 
    352     level_offset--; 
    353   if (3 * time_left < time_for_last_move * stones_left) 
    354     level_offset--; 
    355  
    356   if (time_for_last_move == 0) 
    357     time_for_last_move = 1; 
    358   if (time_left > time_for_last_move * (stones_left + 6)) 
    359     level_offset++; 
    360   if (time_left > 2 * time_for_last_move * (stones_left + 6)) 
    361     level_offset++; 
     355  if (time_for_last_move < 0.1) 
     356    time_for_last_move = 0.1; 
    362357 
    363   if (level + level_offset < min_level) 
    364     level_offset = min_level - level; 
     358  estimated_time = time_for_last_move * stones_left; 
     359 
     360  if (time_left < estimated_time) 
     361  { 
     362    --level_offset; 
     363 
     364    if (1.33 * time_left < estimated_time) 
     365        { 
     366          --level_offset; 
     367 
     368          if (2 * time_left < estimated_time) 
     369          { 
     370        level_offset -= 2; 
     371 
     372        if (4 * time_left < estimated_time) 
     373          level_offset -= 2; 
     374          } 
     375        } 
     376  } 
     377  else if (0.8 * time_left > estimated_time) 
     378  { 
     379    ++level_offset; 
    365380 
    366   if (level + level_offset > max_level) 
     381    if (0.5 * time_left > estimated_time) 
     382      level_offset += 2; 
     383  } 
     384 
     385  new_level = level + level_offset; 
     386 
     387  if (new_level < min_level) 
     388    level_offset = min_level - level; 
     389  else if (new_level > max_level) 
    367390    level_offset = max_level - level; 
    368391 
    369392  DEBUG(DEBUG_TIME, "New level %d (%d %C %f %f %d)\n", level + level_offset, 
     
    375398/* Interface to level settings. */ 
    376399/********************************/ 
    377400 
    378 int 
     401inline int 
    379402get_level() 
    380403{ 
    381404  return level + level_offset; 
    382405} 
    383406 
    384 void 
     407inline void 
    385408set_level(int new_level) 
    386409{ 
    387410  level = new_level; 
     
    392415    min_level = level; 
    393416} 
    394417 
    395 void 
     418inline void 
    396419set_max_level(int new_max) 
    397420{ 
    398421  max_level = new_max; 
    399422} 
    400423 
    401 void 
     424inline void 
    402425set_min_level(int new_min) 
    403426{ 
    404427  min_level = new_min;