Subversion Repositories Games.Chess Giants

Rev

Rev 33 | Rev 154 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 33 Rev 108
Line 10... Line 10...
10
 *   amount of time used, and then makes any necessary adjustments based on    *
10
 *   amount of time used, and then makes any necessary adjustments based on    *
11
 *   the time controls.                                                        *
11
 *   the time controls.                                                        *
12
 *                                                                             *
12
 *                                                                             *
13
 *******************************************************************************
13
 *******************************************************************************
14
 */
14
 */
15
void TimeAdjust(int time_used, int side) {
15
void TimeAdjust(int side, int time_used) {
16
/*
16
/*
17
 ************************************************************
17
 ************************************************************
18
 *                                                          *
18
 *                                                          *
19
 *  Decrement the number of moves remaining to the next     *
19
 *  Decrement the number of moves remaining to the next     *
20
 *  time control.  Then subtract the time the program took  *
20
 *  time control.  Then subtract the time the program took  *
Line 35... Line 35...
35
  }
35
  }
36
  if (tc_increment)
36
  if (tc_increment)
37
    tc_time_remaining[side] += tc_increment;
37
    tc_time_remaining[side] += tc_increment;
38
}
38
}
39
 
39
 
40
/* last modified 02/23/14 */
40
/* last modified 10/01/14 */
41
/*
41
/*
42
 *******************************************************************************
42
 *******************************************************************************
43
 *                                                                             *
43
 *                                                                             *
44
 *   TimeCheck() is used to determine when the search should stop.  It uses    *
44
 *   TimeCheck() is used to determine when the search should stop.  It uses    *
45
 *   several conditions to make this determination:  (1) The search time has   *
45
 *   several conditions to make this determination:  (1) The search time has   *
Line 113... Line 113...
113
 *  time has been used so far.                              *
113
 *  time has been used so far.                              *
114
 *                                                          *
114
 *                                                          *
115
 ************************************************************
115
 ************************************************************
116
 */
116
 */
117
  time_used = (ReadClock() - start_time);
117
  time_used = (ReadClock() - start_time);
118
  if (tree->nodes_searched > noise_level && display_options & 32 &&
118
  if (time_used >= (int) noise_level && display_options & 16 && time_used > burp) { // Pierre-Marie Baty -- added type cast
119
      time_used > burp) {
-
 
120
    Lock(lock_io);
119
    Lock(lock_io);
121
    if (pondering)
120
    if (pondering)
122
      printf("         %2i   %s%7s?  ", iteration_depth,
121
      printf("         %2i   %s%7s?  ", iteration, Display2Times(time_used),
123
          Display2Times(time_used), tree->remaining_moves_text);
122
          tree->remaining_moves_text);
124
    else
123
    else
125
      printf("         %2i   %s%7s*  ", iteration_depth,
124
      printf("         %2i   %s%7s*  ", iteration, Display2Times(time_used),
126
          Display2Times(time_used), tree->remaining_moves_text);
125
          tree->remaining_moves_text);
127
    if (display_options & 32 && display_options & 64)
126
    if (display_options & 16)
128
      printf("%d. ", move_number);
127
      printf("%d. ", move_number);
129
    if ((display_options & 32) && (display_options & 64) && Flip(root_wtm))
128
    if ((display_options & 16) && Flip(root_wtm))
130
      printf("... ");
129
      printf("... ");
131
    printf("%s(%snps)             \r", tree->root_move_text,
130
    printf("%s(%snps)             \r", tree->root_move_text,
132
        DisplayKMB(nodes_per_second));
131
        DisplayKMB(nodes_per_second, 0));
133
    burp = (time_used / 1500) * 1500 + 1500;
132
    burp = (time_used / 1500) * 1500 + 1500;
134
    fflush(stdout);
133
    fflush(stdout);
135
    Unlock(lock_io);
134
    Unlock(lock_io);
136
  }
135
  }
137
/*
136
/*
Line 144... Line 143...
144
 *  actually back up a move to play.                        *
143
 *  actually back up a move to play.                        *
145
 *                                                          *
144
 *                                                          *
146
 ************************************************************
145
 ************************************************************
147
 */
146
 */
148
  if (n_root_moves == 1 && !booking && !annotate_mode && !pondering &&
147
  if (n_root_moves == 1 && !booking && !annotate_mode && !pondering &&
149
      iteration_depth > 1)
148
      iteration > 1 && (time_used > time_limit || time_used > 100))
150
    return 1;
149
    return 1;
151
  if (iteration_depth <= 2)
150
  if (iteration <= 2)
152
    return 0;
151
    return 0;
153
/*
152
/*
154
 ************************************************************
153
 ************************************************************
155
 *                                                          *
154
 *                                                          *
156
 *  If we are pondering or in analyze mode, we do not       *
155
 *  If we are pondering or in analyze mode, we do not       *
Line 231... Line 230...
231
  if (time_used + 300 > tc_time_remaining[root_wtm])
230
  if (time_used + 300 > tc_time_remaining[root_wtm])
232
    return 1;
231
    return 1;
233
  return 0;
232
  return 0;
234
}
233
}
235
 
234
 
236
/* last modified 02/23/14 */
235
/* last modified 09/30/14 */
237
/*
236
/*
238
 *******************************************************************************
237
 *******************************************************************************
239
 *                                                                             *
238
 *                                                                             *
240
 *   TimeSet() is called to set the two variables "time_limit" and             *
239
 *   TimeSet() is called to set the two variables "time_limit" and             *
241
 *   "absolute_time_limit" which controls the amount of time taken by the      *
240
 *   "absolute_time_limit" which controls the amount of time taken by the      *
Line 257... Line 256...
257
 *                                                          *
256
 *                                                          *
258
 *  Check to see if we are in a sudden-death type of time   *
257
 *  Check to see if we are in a sudden-death type of time   *
259
 *  control.  If so, we have a fixed amount of time         *
258
 *  control.  If so, we have a fixed amount of time         *
260
 *  remaining.  Set the search time accordingly and exit.   *
259
 *  remaining.  Set the search time accordingly and exit.   *
261
 *                                                          *
260
 *                                                          *
-
 
261
 *  The basic algorithm is to divide the remaining time     *
262
 *  If we have less than 5 seconds on the clock prior to    *
262
 *  left on the clock by a constant (that is larger for     *
-
 
263
 *  ponder=off games since we don't get to ponder and save  *
263
 *  the increment, then limit our search to the increment.  *
264
 *  time as the game progresses) and add the increment.     *
264
 *                                                          *
265
 *                                                          *
265
 *  If we have less than 2.5 seconds on the clock prior to  *
-
 
266
 *  the increment, then limit our search to half the        *
-
 
267
 *  increment in an attempt to add some time to our buffer. *
-
 
268
 *                                                          *
-
 
269
 *  Set our MAX search time to half the remaining time.     *
266
 *  Set our MAX search time to the smaller of 5 * the time  *
270
 *                                                          *
-
 
271
 *  If our search time will drop the clock below 1 second,  *
-
 
272
 *  then limit our MAX search time to the normal search     *
267
 *  limit or 1/2 of the time left on the clock.             *
273
 *  time.  This is done to stop any extensions from         *
-
 
274
 *  dropping us too low.                                    *
-
 
275
 *                                                          *
268
 *                                                          *
276
 ************************************************************
269
 ************************************************************
277
 */
270
 */
278
  if (tc_sudden_death == 1) {
271
  if (tc_sudden_death == 1) {
279
    if (tc_increment) {
-
 
280
      time_limit =
272
    time_limit =
281
          (tc_time_remaining[root_wtm] -
273
        (tc_time_remaining[root_wtm] -
282
          tc_operator_time * tc_moves_remaining[root_wtm]) /
-
 
283
          (ponder ? 20 : 26) + tc_increment;
274
        tc_safety_margin) / (ponder ? 20 : 26) + tc_increment;
284
      if (tc_time_remaining[root_wtm] < 500 + tc_increment) {
-
 
285
        time_limit = tc_increment;
-
 
286
        if (tc_time_remaining[root_wtm] < 250 + tc_increment)
-
 
287
          time_limit /= 2;
-
 
288
      }
-
 
289
      absolute_time_limit = tc_time_remaining[root_wtm] / 2 + tc_increment;
-
 
290
      if (absolute_time_limit < time_limit ||
-
 
291
          tc_time_remaining[root_wtm] - time_limit < 100)
-
 
292
        absolute_time_limit = time_limit;
-
 
293
      if (tc_time_remaining[root_wtm] - time_limit < 50) {
-
 
294
        time_limit = tc_time_remaining[root_wtm] - 50;
-
 
295
        if (time_limit < 5)
-
 
296
          time_limit = 5;
-
 
297
      }
-
 
298
      if (tc_time_remaining[root_wtm] - absolute_time_limit < 25) {
-
 
299
        absolute_time_limit = tc_time_remaining[root_wtm] - 25;
-
 
300
        if (absolute_time_limit < 5)
-
 
301
          absolute_time_limit = 5;
-
 
302
      }
-
 
303
 
-
 
304
    } else {
-
 
305
      time_limit = tc_time_remaining[root_wtm] / (ponder ? 20 : 26);
-
 
306
      absolute_time_limit =
275
    absolute_time_limit =
307
          Min(time_limit * 5, tc_time_remaining[root_wtm] / 2);
276
        Min(time_limit * 5, tc_time_remaining[root_wtm] / 2);
308
    }
-
 
309
  }
277
  }
310
/*
278
/*
311
 ************************************************************
279
 ************************************************************
312
 *                                                          *
280
 *                                                          *
313
 *  We are not in a sudden_death situation.  We now have    *
281
 *  We are not in a sudden_death situation.  We now have    *
314
 *  two choices:  If the program has saved enough time to   *
282
 *  two choices:  If the program has saved enough time to   *
315
 *  meet the surplus requirement, then we simply divide     *
283
 *  meet the surplus requirement, then we simply divide     *
316
 *  the time left evenly among the moves left.  If we       *
284
 *  the time left evenly among the moves left.  If we       *
317
 *  haven't yet saved up a cushion so that "fail-lows"      *
285
 *  haven't yet saved up a cushion so that "hard-moves"     *
318
 *  have extra time to find a solution, we simply take the  *
286
 *  can be searched more thoroughly, we simply take the     *
319
 *  number of moves divided into the total time less the    *
287
 *  number of moves divided into the total time as the      *
320
 *  necessary operator time as the target.                  *
288
 *  target.                                                 *
321
 *                                                          *
289
 *                                                          *
322
 ************************************************************
290
 ************************************************************
323
 */
291
 */
324
  else {
292
  else {
325
    if (move_number <= tc_moves)
293
    if (move_number <= tc_moves)
326
      simple_average =
-
 
327
          (tc_time -
-
 
328
          (tc_operator_time * tc_moves_remaining[root_wtm])) / tc_moves;
294
      simple_average = (tc_time - tc_safety_margin) / tc_moves;
329
    else
295
    else
330
      simple_average =
296
      simple_average =
331
          (tc_secondary_time -
-
 
332
          (tc_operator_time * tc_moves_remaining[root_wtm])) /
297
          (tc_secondary_time - tc_safety_margin) / tc_secondary_moves;
333
          tc_secondary_moves;
-
 
334
    surplus =
298
    surplus =
335
        Max(tc_time_remaining[root_wtm] -
299
        Max(tc_time_remaining[root_wtm] - tc_safety_margin -
336
        (tc_operator_time * tc_moves_remaining[root_wtm]) -
-
 
337
        simple_average * tc_moves_remaining[root_wtm], 0);
300
        simple_average * tc_moves_remaining[root_wtm], 0);
338
    average =
301
    average =
339
        (tc_time_remaining[root_wtm] -
302
        (tc_time_remaining[root_wtm] - tc_safety_margin +
340
        (tc_operator_time * tc_moves_remaining[root_wtm]) +
-
 
341
        tc_moves_remaining[root_wtm] * tc_increment)
303
        tc_moves_remaining[root_wtm] * tc_increment)
342
        / tc_moves_remaining[root_wtm];
304
        / tc_moves_remaining[root_wtm];
343
    if (surplus < tc_safety_margin)
305
    if (surplus < tc_safety_margin)
344
      time_limit = (average < simple_average) ? average : simple_average;
306
      time_limit = (average < simple_average) ? average : simple_average;
345
    else
307
    else
346
      time_limit =
308
      time_limit =
347
          (average < 2/*.0*/ * simple_average) ? average : 2/*.0*/ * simple_average; // Pierre-Marie Baty -- this is integer math
309
          (average < 2 * simple_average) ? average : 2 * simple_average; // Pierre-Marie Baty -- fixed types
348
  }
310
  }
349
  if (surplus < 0)
-
 
350
    surplus = 0;
-
 
351
  if (tc_increment > 200 && moves_out_of_book < 2)
311
  if (tc_increment > 200 && moves_out_of_book < 2)
352
    /*time_limit *= 1.2;*/ time_limit = (time_limit * 12) / 10; // Pierre-Marie Baty -- this is integer math
312
    time_limit = (int) (time_limit * 1.2); // Pierre-Marie Baty -- added type cast
353
  if (time_limit <= 0)
313
  if (time_limit <= 0)
354
    time_limit = 5;
314
    time_limit = 5;
355
  absolute_time_limit =
315
  absolute_time_limit =
356
      time_limit + surplus / 2 + ((tc_time_remaining[root_wtm] -
316
      time_limit + surplus / 2 + (tc_time_remaining[root_wtm] -
357
          tc_operator_time * tc_moves_remaining[root_wtm]) / 4);
317
      tc_safety_margin) / 4;
358
  if (absolute_time_limit > 6 * time_limit)
318
  if (absolute_time_limit > 5 * time_limit)
359
    absolute_time_limit = 6 * time_limit;
319
    absolute_time_limit = 5 * time_limit;
360
  if (absolute_time_limit > tc_time_remaining[root_wtm] / 2)
320
  if (absolute_time_limit > tc_time_remaining[root_wtm] / 2)
361
    absolute_time_limit = tc_time_remaining[root_wtm] / 2;
321
    absolute_time_limit = tc_time_remaining[root_wtm] / 2;
362
/*
322
/*
363
 ************************************************************
323
 ************************************************************
364
 *                                                          *
324
 *                                                          *
Line 370... Line 330...
370
 *  and instant moves.                                      *
330
 *  and instant moves.                                      *
371
 *                                                          *
331
 *                                                          *
372
 ************************************************************
332
 ************************************************************
373
 */
333
 */
374
  if (usage_level)
334
  if (usage_level)
375
    /*time_limit *= 1.0 + usage_level / 100.0;*/ time_limit += time_limit * usage_level / 100; // Pierre-Marie Baty -- this is integer math
335
    time_limit = (int) (time_limit * (1.0 + usage_level / 100.0)); // Pierre-Marie Baty -- added type cast
376
  if (first_nonbook_factor && moves_out_of_book < first_nonbook_span) {
336
  if (first_nonbook_factor && moves_out_of_book < first_nonbook_span) {
377
    mult =
337
    mult =
378
        (first_nonbook_span - moves_out_of_book + 1) * first_nonbook_factor;
338
        (first_nonbook_span - moves_out_of_book + 1) * first_nonbook_factor;
379
    extra = time_limit * mult / first_nonbook_span / 100;
339
    extra = time_limit * mult / first_nonbook_span / 100;
380
    time_limit += extra;
340
    time_limit += extra;
Line 399... Line 359...
399
      time_limit > 3 * tc_time / tc_moves)
359
      time_limit > 3 * tc_time / tc_moves)
400
    time_limit = 3 * tc_time / tc_moves;
360
    time_limit = 3 * tc_time / tc_moves;
401
  time_limit = Min(time_limit, absolute_time_limit);
361
  time_limit = Min(time_limit, absolute_time_limit);
402
  if (search_type != puzzle) {
362
  if (search_type != puzzle) {
403
    if (!tc_sudden_death)
363
    if (!tc_sudden_death)
404
      Print(128, "        time surplus %s  ", DisplayTime(surplus));
364
      Print(32, "        time surplus %s  ", DisplayTime(surplus));
405
    else
365
    else
406
      Print(128, "         ");
366
      Print(32, "        ");
407
    Print(128, "time limit %s", DisplayTimeKibitz(time_limit));
367
    Print(32, "time limit %s", DisplayTimeKibitz(time_limit));
408
    Print(128, " (+%s)", DisplayTimeKibitz(extra));
-
 
409
    Print(128, " (%s)", DisplayTimeKibitz(absolute_time_limit));
368
    Print(32, " (%s)\n", DisplayTimeKibitz(absolute_time_limit));
410
    if (fabs(usage_level) > 0.0001) {
-
 
411
      Print(128, "/");
-
 
412
      Print(128, "(%d)", usage_level);
-
 
413
    }
-
 
414
    Print(128, "\n");
-
 
415
  }
369
  }
416
  if (time_limit <= 1) {
370
  if (time_limit <= 1) {
417
    time_limit = 1;
371
    time_limit = 1;
418
    usage_level = 0;
372
    usage_level = 0;
419
  }
373
  }