/* Compute final score. We use area scoring since that is the only * option that makes sense for this move generation algorithm. */ static int gtp_final_score(char *s) { float score = komi; int i, j; compute_final_status(); for (i = 0; i < board_size; i++) for (j = 0; j < board_size; j++) { int status = get_final_status(i, j); if (status == BLACK_TERRITORY) score--; else if (status == WHITE_TERRITORY) score++; else if ((status == ALIVE) ^ (get_board(i, j) == WHITE)) score--; else score++; } if (score > 0.0) return gtp_success("W+%3.1f", score); if (score < 0.0) return gtp_success("B+%3.1f", -score); return gtp_success("0"); }
static float compute_score() { int i, j; float score = komi; compute_final_status(); for (i = 0; i < board_size; i++) { for (j = 0; j < board_size; j++) { int status = get_final_status(i, j); if (status == BLACK_TERRITORY) { score--; } else if (status == WHITE_TERRITORY) { score++; } else if ((status == ALIVE) ^ (get_board(i, j) == WHITE)) { score--; } else { score++; } } } return score; }
static int gtp_final_status_list(char *s) { int n; int i, j; int status = UNKNOWN; char status_string[GTP_BUFSIZE]; int first_string; if (sscanf(s, "%s %n", status_string, &n) != 1) return gtp_failure("missing status"); if (!strcmp(status_string, "alive")) status = ALIVE; else if (!strcmp(status_string, "dead")) status = DEAD; else if (!strcmp(status_string, "seki")) status = SEKI; else return gtp_failure("invalid status"); compute_final_status(); gtp_start_response(GTP_SUCCESS); first_string = 1; for (i = 0; i < board_size; i++) for (j = 0; j < board_size; j++) if (get_final_status(i, j) == status) { int k; int stonei[MAX_BOARD * MAX_BOARD]; int stonej[MAX_BOARD * MAX_BOARD]; int num_stones = get_string(i, j, stonei, stonej); /* Clear the status so we don't find the string again. */ for (k = 0; k < num_stones; k++) set_final_status(stonei[k], stonej[k], UNKNOWN); if (first_string) first_string = 0; else gtp_printf("\n"); gtp_print_vertices(num_stones, stonei, stonej); } return gtp_finish_response(); }
static void finish_live_ioreq_op(grpc_call *call, grpc_ioreq_op op, grpc_op_error status) { completed_request *cr; gpr_uint8 master_set = call->request_set[op]; reqinfo_master *master; size_t i; /* ioreq is live: we need to do something */ master = &call->masters[master_set]; master->complete_mask |= 1u << op; if (status != GRPC_OP_OK) { master->status = status; master->complete_mask = master->need_mask; } if (master->complete_mask == master->need_mask) { for (i = 0; i < GRPC_IOREQ_OP_COUNT; i++) { if (call->request_set[i] != master_set) { continue; } call->request_set[i] = REQSET_DONE; switch ((grpc_ioreq_op)i) { case GRPC_IOREQ_RECV_MESSAGE: case GRPC_IOREQ_SEND_MESSAGE: if (master->status == GRPC_OP_OK) { call->request_set[i] = REQSET_EMPTY; } else { call->write_state = WRITE_STATE_WRITE_CLOSED; } break; case GRPC_IOREQ_RECV_CLOSE: case GRPC_IOREQ_SEND_INITIAL_METADATA: case GRPC_IOREQ_SEND_TRAILING_METADATA: case GRPC_IOREQ_SEND_STATUS: case GRPC_IOREQ_SEND_CLOSE: break; case GRPC_IOREQ_RECV_STATUS: get_final_status(call, call->request_data[GRPC_IOREQ_RECV_STATUS]); break; case GRPC_IOREQ_RECV_STATUS_DETAILS: get_final_details(call, call->request_data[GRPC_IOREQ_RECV_STATUS_DETAILS]); break; case GRPC_IOREQ_RECV_INITIAL_METADATA: SWAP(grpc_metadata_array, call->buffered_metadata[0], *call->request_data[GRPC_IOREQ_RECV_INITIAL_METADATA] .recv_metadata); break; case GRPC_IOREQ_RECV_TRAILING_METADATA: SWAP(grpc_metadata_array, call->buffered_metadata[1], *call->request_data[GRPC_IOREQ_RECV_TRAILING_METADATA] .recv_metadata); break; case GRPC_IOREQ_OP_COUNT: abort(); break; } } cr = &call->completed_requests[call->num_completed_requests++]; cr->status = master->status; cr->on_complete = master->on_complete; cr->user_data = master->user_data; } }
static void finish_batch(grpc_exec_ctx *exec_ctx, void *bctlp, int success) { batch_control *bctl = bctlp; grpc_call *call = bctl->call; grpc_call *child_call; grpc_call *next_child_call; gpr_mu_lock(&call->mu); if (bctl->send_initial_metadata) { grpc_metadata_batch_destroy( &call->metadata_batch[0 /* is_receiving */][0 /* is_trailing */]); } if (bctl->send_message) { call->sending_message = 0; } if (bctl->send_final_op) { grpc_metadata_batch_destroy( &call->metadata_batch[0 /* is_receiving */][1 /* is_trailing */]); } if (bctl->recv_initial_metadata) { grpc_metadata_batch *md = &call->metadata_batch[1 /* is_receiving */][0 /* is_trailing */]; grpc_metadata_batch_filter(md, recv_initial_filter, call); if (gpr_time_cmp(md->deadline, gpr_inf_future(md->deadline.clock_type)) != 0 && !call->is_client) { GPR_TIMER_BEGIN("set_deadline_alarm", 0); set_deadline_alarm(exec_ctx, call, md->deadline); GPR_TIMER_END("set_deadline_alarm", 0); } } if (bctl->recv_final_op) { grpc_metadata_batch *md = &call->metadata_batch[1 /* is_receiving */][1 /* is_trailing */]; grpc_metadata_batch_filter(md, recv_trailing_filter, call); if (call->have_alarm) { grpc_timer_cancel(exec_ctx, &call->alarm); } /* propagate cancellation to any interested children */ child_call = call->first_child; if (child_call != NULL) { do { next_child_call = child_call->sibling_next; if (child_call->cancellation_is_inherited) { GRPC_CALL_INTERNAL_REF(child_call, "propagate_cancel"); grpc_call_cancel(child_call, NULL); GRPC_CALL_INTERNAL_UNREF(exec_ctx, child_call, "propagate_cancel"); } child_call = next_child_call; } while (child_call != call->first_child); } if (call->is_client) { get_final_status(call, set_status_value_directly, call->final_op.client.status); get_final_details(call, call->final_op.client.status_details, call->final_op.client.status_details_capacity); } else { get_final_status(call, set_cancelled_value, call->final_op.server.cancelled); } success = 1; } bctl->success = success != 0; gpr_mu_unlock(&call->mu); if (gpr_unref(&bctl->steps_to_complete)) { post_batch_completion(exec_ctx, bctl); } }