Ticket #145: influence.c.patch

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

    RCS file: /sources/gnugo/gnugo/engine/influence.c,v
    retrieving revision 1.118
    diff -u -r1.118 influence.c
     
    446446  memcpy(q->safe, safe_stones, BOARDMAX * sizeof(*safe_stones)); 
    447447  q->captured = black_captured - white_captured; 
    448448   
    449   for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    450     if (ON_BOARD(ii)) { 
     449  scan_board(ii, 
    451450      /* Initialize. */ 
    452451      q->white_influence[ii] = 0.0; 
    453452      q->black_influence[ii] = 0.0; 
     
    490489         * in our private copy here. 
    491490         */ 
    492491        q->safe[ii] = 0; 
    493     } 
     492  ) 
    494493} 
    495494 
    496495 
     
    555554reset_unblocked_blocks(struct influence_data *q) 
    556555{ 
    557556  int pos; 
    558   for (pos = BOARDMIN; pos < BOARDMAX; pos++) 
    559     if (ON_BOARD(pos)) { 
     557  scan_board(pos, 
    560558      if (!q->safe[pos] && q->white_strength[pos] > 0.0 
    561559          && q->white_permeability[pos] != 1.0) { 
    562560        DEBUG(DEBUG_INFLUENCE, "  black block removed from %1m\n", pos); 
     
    567565        DEBUG(DEBUG_INFLUENCE, "  white block removed from %1m\n", pos); 
    568566        q->black_permeability[pos] = 1.0; 
    569567      } 
    570     } 
     568  ) 
    571569} 
    572570 
    573571 
     
    974972  /* Additionally, we introduce a weaker kind of barriers around living 
    975973   * stones. 
    976974   */ 
    977   for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    978     if (ON_BOARD(ii) && !q->safe[ii]) { 
     975  scan_board(ii, 
     976    if (!q->safe[ii]) { 
    979977      int k; 
    980978      float black_reduction = 1.0; 
    981979      float white_reduction = 1.0; 
     
    1000998        q->black_permeability[ii] *= black_reduction; 
    1001999      if (white_reduction > 0.0) 
    10021000        q->white_permeability[ii] *= white_reduction; 
    1003     } 
     1001        } 
     1002  ) 
    10041003 
    10051004  reset_unblocked_blocks(q); 
    10061005} 
     
    10731072                                                   q->black_strength); 
    10741073  int double_blocks[MAX_DOUBLE_BLOCKS]; 
    10751074  int num_blocks = 0; 
    1076   for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
     1075  scan_board(ii, 
    10771076    if (board[ii] == EMPTY 
    10781077        && !(inhibited_sources && inhibited_sources[ii]) 
    10791078        && strength[ii] > 0.0) { 
     
    10831082        if (num_blocks == MAX_DOUBLE_BLOCKS) 
    10841083          break; 
    10851084      } 
    1086     } 
     1085        } 
     1086  ) 
     1087 
    10871088  { 
    10881089    int k; 
    10891090    float *permeability = ((q->color_to_move == BLACK) 
     
    11161117  find_influence_patterns(q); 
    11171118  modify_depth_values(1 - stackp); 
    11181119   
    1119   for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    1120     if (ON_BOARD(ii) && !(inhibited_sources && inhibited_sources[ii])) { 
     1120  scan_board(ii, 
     1121    if (!(inhibited_sources && inhibited_sources[ii])) { 
    11211122      if (q->white_strength[ii] > 0.0) 
    11221123        accumulate_influence(q, ii, WHITE); 
    11231124      if (q->black_strength[ii] > 0.0) 
    11241125        accumulate_influence(q, ii, BLACK); 
    1125     } 
     1126        } 
     1127  ) 
    11261128 
    11271129  value_territory(q); 
    11281130  remove_double_blocks(q, inhibited_sources); 
     
    12991301  memset(first_guess, 0, BOARDMAX*sizeof(float)); 
    13001302  memset(q->territory_value, 0, BOARDMAX*sizeof(float)); 
    13011303  /* First loop: guess territory directly from influence. */ 
    1302   for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    1303     if (ON_BOARD(ii) 
    1304         && !q->safe[ii]) { 
     1304  scan_board(ii, 
     1305    if (!q->safe[ii]) { 
    13051306      float diff = 0.0; 
    13061307      if (q->white_influence[ii] + q->black_influence[ii] > 0) 
    13071308        diff = (q->white_influence[ii] - q->black_influence[ii]) 
     
    13561357      else if (board[ii] == WHITE) 
    13571358        first_guess[ii] = -1.0; 
    13581359      q->territory_value[ii] = first_guess[ii]; 
    1359     } 
     1360        } 
     1361  ) 
    13601362 
    13611363  /* Second loop: Correct according to neighbour vertices. Each territory 
    13621364   * value is degraded to the minimum value of its neighbors (unless this 
    13631365   * neighbor has reduced permeability for the opponent's influence). 
    13641366   */ 
    1365   for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    1366     if (ON_BOARD(ii) 
     1367  scan_board(ii, 
     1368    if ( 
    13671369        /* Do not overrule dead stone territory above. 
    13681370         * FIXME: This does not do what it claims to do. Correcting it 
    13691371         * seems to break some tests, though. 
    13701372         */ 
    1371         && !q->safe[ii]) { 
     1373          !q->safe[ii]) { 
    13721374      /* Loop over all neighbors. */ 
    13731375      for (k = 0; k < 4; k++) { 
    13741376        if (!ON_BOARD(ii + delta[k])) 
     
    13981400          } 
    13991401        } 
    14001402      } 
    1401     } 
     1403        } 
     1404  ) 
    14021405 
    14031406  /* Third loop: Nonterritory patterns, points for prisoners. */ 
    1404   for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    1405     if (ON_BOARD(ii) 
    1406         && !q->safe[ii]) { 
     1407  scan_board(ii, 
     1408    if (!q->safe[ii]) { 
    14071409      /* If marked as non-territory for the color currently owning 
    14081410       * it, reset the territory value. 
    14091411       */ 
     
    14201422        q->territory_value[ii] += 1.0; 
    14211423      else if (board[ii] == WHITE) 
    14221424        q->territory_value[ii] -= 1.0; 
    1423     } 
     1425        } 
     1426  ) 
    14241427} 
    14251428 
    14261429 
     
    14401443  regions->number = 0; 
    14411444 
    14421445  /* Reset the markings. */ 
    1443   for (ii = BOARDMIN; ii < BOARDMAX; ii++) { 
     1446  scan_board(ii, 
    14441447    marked[ii] = 0; 
    14451448    regions->segmentation[ii] = 0; 
    1446   } 
     1449  ) 
    14471450 
    1448   for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    1449     if (ON_BOARD(ii) 
    1450         && !marked[ii] 
     1451  scan_board(ii, 
     1452    if (!marked[ii] 
    14511453        && region_owner(q, ii) != EMPTY) { 
    14521454      /* Found an unlabelled intersection. Use flood filling to find 
    14531455       * the rest of the region. 
     
    14841486      regions->size[regions->number] = size; 
    14851487      regions->territorial_value[regions->number] = terr_val; 
    14861488      regions->owner[regions->number] = color; 
    1487     } 
     1489        } 
     1490  ) 
    14881491} 
    14891492 
    14901493 
     
    15421545  
    15431546  /* We mark the saved stones and their neighbors in the goal array. 
    15441547   */ 
    1545   for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    1546     if (ON_BOARD(ii)) { 
     1548  scan_board(ii, 
    15471549      if (q->safe[ii] == INFLUENCE_SAVED_STONE) 
    15481550        goal[ii] = 1; 
    15491551      else 
    15501552        goal[ii] = 0; 
    1551     } 
     1553  ) 
    15521554 
    15531555 
    15541556  /* Turn off DEBUG_INFLUENCE for influence computations we are not 
     
    15731575  reset_unblocked_blocks(q); 
    15741576   
    15751577  /* Spread influence for new influence sources. */ 
    1576   for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    1577     if (ON_BOARD(ii)) 
     1578  scan_board(ii, 
    15781579      if ((color == BLACK 
    15791580            && q->black_strength[ii] > base->black_strength[ii]) 
    15801581          || (color == WHITE 
    15811582              && q->white_strength[ii] > base->white_strength[ii])) 
    15821583        accumulate_influence(q, ii, color); 
     1584  ) 
    15831585 
    15841586  value_territory(q); 
    15851587 
     
    16231625    /* Notice that we compare the out of board markers as well, in 
    16241626     * case the board size should have changed between calls. 
    16251627     */ 
    1626     for (ii = BOARDMIN; ii < BOARDMAX; ii++) { 
     1628    scan_board(ii, 
    16271629      if (cached_board[ii] != board[ii]) { 
    16281630        cached_board[ii] = board[ii]; 
    16291631        board_was_cached = 0; 
    16301632      } 
    1631     } 
     1633        ) 
    16321634 
    16331635    if (!board_was_cached) 
    16341636      for (k = 0; k < 2; k++) 
    16351637        active_caches[k] = 0; 
    16361638 
    16371639    if (active_caches[cache_number]) { 
    1638       for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    1639         if (ON_BOARD(ii)) 
    1640           escape_value[ii] = escape_values[ii][cache_number]; 
     1640      scan_board(ii, 
     1641            escape_value[ii] = escape_values[ii][cache_number]; 
     1642          ) 
    16411643 
    16421644      return; 
    16431645    } 
     
    16581660 
    16591661  debug = save_debug; 
    16601662   
    1661   for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    1662     if (ON_BOARD(ii)) { 
     1663  scan_board(ii, 
    16631664      if (whose_moyo(&escape_influence, ii) == color) 
    16641665        escape_value[ii] = 4; 
    16651666      else if (whose_area(&escape_influence, ii) == color) 
     
    16901691      } 
    16911692      else 
    16921693        escape_value[ii] = 0; 
    1693     } 
     1694  ) 
    16941695 
    16951696  if (0 && (debug & DEBUG_ESCAPE) && verbose > 0) 
    16961697    print_influence(&escape_influence, "escape influence"); 
    16971698 
    16981699  if (!goal) { 
    16991700    /* Save the computed values in the cache. */ 
    1700     for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    1701       if (ON_BOARD(ii)) 
    1702         escape_values[ii][cache_number] = escape_value[ii]; 
     1701    scan_board(ii, 
     1702          escape_values[ii][cache_number] = escape_value[ii]; 
     1703        ) 
     1704 
    17031705    active_caches[cache_number] = 1; 
    17041706  } 
    17051707} 
     
    17971799  ASSERT_ON_BOARD1(move); 
    17981800  ASSERT1(IS_STONE(color), move); 
    17991801 
    1800   for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    1801     if (ON_BOARD(ii)) { 
     1802  scan_board(ii, 
    18021803      float new_value = q->territory_value[ii]; 
    18031804      float old_value = base->territory_value[ii]; 
    18041805      this_delta = new_value - old_value; 
     
    18151816              "  %1m:   - %1m territory change %f (%f -> %f)\n", 
    18161817              move, ii, this_delta, old_value, new_value); 
    18171818      total_delta += this_delta; 
    1818     } 
     1819  ) 
    18191820 
    18201821  /* Finally, captured stones: */ 
    18211822  this_delta = q->captured - base->captured; 
     
    18411842  float score = 0.0; 
    18421843  int ii; 
    18431844 
    1844   for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    1845     if (ON_BOARD(ii)) 
    1846       score += q->territory_value[ii]; 
     1845  scan_board(ii, 
     1846    score += q->territory_value[ii]; 
     1847  ) 
    18471848   
    18481849  if (use_chinese_rules) 
    18491850    score += stones_on_board(WHITE) - stones_on_board(BLACK) + komi + handicap; 
     
    18661867  int count = 0; 
    18671868  int ii; 
    18681869 
    1869   for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    1870     if (ON_BOARD(ii)) { 
     1870  scan_board(ii, 
    18711871      if (iq->safe[ii]) 
    18721872        count += WEIGHT_TERRITORY; 
    18731873      else if (whose_territory(iq, ii) != EMPTY 
     
    18771877        count += WEIGHT_MOYO; 
    18781878      else if (whose_area(oq, ii) != EMPTY) 
    18791879        count += WEIGHT_AREA; 
    1880     } 
     1880  ) 
    18811881 
    18821882  return (float) count / (WEIGHT_TERRITORY * board_size * board_size); 
    18831883} 
     
    19121912{ 
    19131913  int ii; 
    19141914   
    1915   for (ii = BOARDMIN; ii < BOARDMAX; ii++) { 
     1915  scan_board(ii, 
    19161916    white_influence[ii] = q->white_influence[ii]; 
    19171917    black_influence[ii] = q->black_influence[ii]; 
    19181918    white_strength[ii] = q->white_strength[ii]; 
     
    19441944      influence_regions[ii] = 4; 
    19451945    else if (board[ii] == BLACK) 
    19461946      influence_regions[ii] = -4; 
    1947   } 
     1947  ) 
    19481948} 
    19491949   
    19501950 
     
    20712071{ 
    20722072  int ii; 
    20732073  start_draw_board(); 
    2074   for (ii = BOARDMIN; ii < BOARDMAX; ii++) 
    2075     if (ON_BOARD(ii)) { 
     2074  scan_board(ii, 
    20762075      int c = EMPTY; 
    20772076      int color = GG_COLOR_BLACK; 
    20782077      if (q->safe[ii]) { 
     
    21072106        color = GG_COLOR_RED; 
    21082107      } 
    21092108      draw_color_char(I(ii), J(ii), c, color); 
    2110     } 
     2109  ) 
    21112110  end_draw_board(); 
    21122111} 
    21132112