59void node_init(
Node* node,
Search *search,
const int alpha,
const int beta,
const int depth,
const int n_moves,
Node* parent)
134 condition_broadcast(master);
193 condition_signal(task);
219 for (i = 0; i < node->
n_slave; ++i) {
230 condition_wait(node);
264 const int score = move->
score;
278 for (i = 0; i < node->
n_slave; ++i) {
374 while (move && !search->
stop) {
375 const int alpha = node->
alpha;
376 if (alpha >= node->
beta)
break;
380 if (alpha < move->score && move->
score < node->
beta) {
415 spin_lock(search->
parent);
425 spin_unlock(search->
parent);
429 for (i = 0; i < node->
n_slave; ++i) {
430 if (node->
slave[i] == search) {
436 condition_broadcast(node);
462 condition_wait(task);
486 if (search == NULL) {
487 fatal_error(
"task_init: cannot allocate the search position.\n");
523 condition_init(task);
542 assert(task->
run ==
false);
545 condition_signal(task);
549 condition_free(task);
573 if (stack->
task == NULL) {
574 fatal_error(
"Cannot allocate an array of %d tasks\n", stack->
n);
576 if (stack->
stack == NULL) {
577 fatal_error(
"Cannot allocate a stack of %d entries\n", stack->
n);
581 for (i = 0; i < stack->
n; ++i) {
588 stack->
stack[i] = NULL;
592 for (i = 1; i < stack->
n; ++i) {
610 for (i = 1; i < stack->
n; ++i) {
613 free(stack->
task); stack->
task = NULL;
#define SCORE_MAX
Definition const.h:58
#define SCORE_INF
Definition const.h:52
@ NOMOVE
Definition const.h:37
@ RUNNING
Definition const.h:71
@ STOP_PARALLEL_SEARCH
Definition const.h:72
@ STOP_END
Definition const.h:76
#define SCORE_MIN
Definition const.h:55
void eval_free(Eval *eval)
Free resources used by the evaluation function.
Definition eval.c:519
void eval_init(Eval *eval)
Initialize a new evaluation function.
Definition eval.c:509
int NWS_midgame(Search *search, const int alpha, int depth, Node *parent)
Evaluate a midgame position with a Null Window Search algorithm.
Definition midgame.c:473
int PVS_midgame(Search *search, const int alpha, const int beta, int depth, Node *parent)
Evaluate a position with a deep Principal Variation Search algorithm.
Definition midgame.c:585
Move * movelist_first(MoveList *movelist)
Return the first move of the list.
Definition move.c:422
Move * move_next(Move *move)
Return the next move from the list.
Definition move.c:400
Options options
Definition options.c:22
int search_get_pv_cost(Search *search)
Compute a cost as a combination of node count, depth, etc. from hash_table.
Definition root.c:303
void pv_debug(Search *search, const Move *bestmove, FILE *f)
Debug PV.
Definition root.c:33
void show_current_move(FILE *f, Search *search, const Move *move, const int alpha, const int beta, const bool parallel)
Definition root.c:239
int search_bound(const Search *search, int score)
bound root scores according to stable squares
Definition root.c:253
void record_best_move(Search *search, const Board *init_board, const Move *bestmove, const int alpha, const int beta, const int depth)
Record best move.
Definition root.c:150
unsigned long long search_count_nodes(Search *search)
Return the number of nodes searched.
Definition search.c:1073
void search_clone(Search *search, Search *master)
Clone a search for parallel search.
Definition search.c:540
void search_restore_midgame(Search *search, const Move *move)
Restore the search state as before a move.
Definition search.c:964
void search_update_midgame(Search *search, const Move *move)
Update the search state after a move.
Definition search.c:942
void search_set_state(Search *search, const Stop stop)
Set the search running/waiting state.
Definition search.c:1353
void search_stop_all(Search *search, const Stop stop)
Stop the search.
Definition search.c:1335
#define SPLIT_MIN_MOVES_TODO
Definition settings.h:104
#define SPLIT_MAX_SLAVES
Definition settings.h:107
#define SPLIT_MIN_DEPTH
Definition settings.h:101
Statistics statistics
Definition stats.c:21
#define YBWC_STATS(x)
Definition stats.h:21
LogFile.
Definition util.h:423
FILE * f
Definition util.h:424
int n_moves
Definition move.h:31
unsigned int cost
Definition move.h:24
int score
Definition move.h:23
int x
Definition move.h:22
volatile int n_slave
Definition ybwc.h:54
struct Node * parent
Definition ybwc.h:61
int beta
Definition ybwc.h:52
volatile bool is_waiting
Definition ybwc.h:56
bool pv_node
Definition ybwc.h:53
volatile bool is_helping
Definition ybwc.h:65
struct Search * search
Definition ybwc.h:59
int height
Definition ybwc.h:58
struct Move * move
Definition ybwc.h:62
volatile int n_moves_done
Definition ybwc.h:63
volatile int alpha
Definition ybwc.h:51
struct Search * slave[SPLIT_MAX_SLAVES]
Definition ybwc.h:60
Task help[1]
Definition ybwc.h:66
volatile int bestscore
Definition ybwc.h:50
volatile bool stop_point
Definition ybwc.h:55
volatile int bestmove
Definition ybwc.h:49
int depth
Definition ybwc.h:57
volatile int n_moves_todo
Definition ybwc.h:64
bool cpu_affinity
Definition options.h:30
int n_moves_left
Definition search.h:52
struct Search * parent
Definition search.h:112
struct TaskStack * tasks
Definition search.h:109
volatile unsigned long long child_nodes
Definition search.h:156
bool allow_node_splitting
Definition search.h:123
struct Search * child[MAX_THREADS]
Definition search.h:113
Result * result
Definition search.h:151
int height
Definition search.h:133
struct Search::@25 options
int verbosity
Definition search.h:142
volatile int n_child
Definition search.h:115
volatile Stop stop
Definition search.h:122
volatile unsigned long long n_nodes
Definition search.h:155
Eval eval[1]
Definition search.h:106
struct Task * task
Definition search.h:110
Board board[1]
Definition search.h:96
unsigned long long n_wake_up
Definition stats.h:101
unsigned long long n_stopped_slave
Definition stats.h:99
unsigned long long n_master_helper
Definition stats.h:97
unsigned long long n_waited_slave
Definition stats.h:98
unsigned long long n_stopped_master
Definition stats.h:100
unsigned long long n_split_success
Definition stats.h:96
unsigned long long n_split_try
Definition stats.h:95
Task ** stack
Definition ybwc.h:96
int n
Definition ybwc.h:97
Task * task
Definition ybwc.h:95
int n_idle
Definition ybwc.h:98
struct Node * node
Definition ybwc.h:34
struct Move * move
Definition ybwc.h:35
unsigned long long n_calls
Definition ybwc.h:37
volatile bool is_helping
Definition ybwc.h:32
unsigned long long n_nodes
Definition ybwc.h:38
struct Search * search
Definition ybwc.h:33
volatile bool loop
Definition ybwc.h:30
Thread thread
Definition ybwc.h:36
volatile bool run
Definition ybwc.h:31
struct TaskStack * container
Definition ybwc.h:41
void thread_create2(Thread *thread, void *(*function)(void *), void *data)
Create a thread.
Definition util.c:922
void thread_join(Thread thread)
Join a thread.
Definition util.c:940
void thread_set_cpu(Thread thread, int i)
Choose a single core or cpu to run on, under linux systems, to avoid context changes.
Definition util.c:967
Miscellaneous utilities header.
#define fatal_error(...)
Display an error message as "FATAL_ERROR : file name : function name : line number : ....
Definition util.h:349
static void atomic_add(volatile unsigned long long *value, long long i)
Definition util.h:327
#define log_is_open(l)
Check if the log stream can be used.
Definition util.h:448
void task_stack_free(TaskStack *stack)
Free resources used by the stack of tasks.
Definition ybwc.c:607
Move * node_next_move(Node *node)
Get the next move of the move list.
Definition ybwc.c:345
static Search * task_search_create(Task *task)
Create a search structure for a task.
Definition ybwc.c:481
void task_init(Task *task)
Initialize a task.
Definition ybwc.c:520
Log search_log[1]
Definition search.c:74
void node_wait_slaves(Node *node)
Wait for slaves termination.
Definition ybwc.c:212
void task_free(Task *task)
Free resources used by a task.
Definition ybwc.c:540
bool node_split(Node *node, Move *move)
Node split.
Definition ybwc.c:167
void node_free(Node *node)
Free Resources allocated by a node.
Definition ybwc.c:95
Move * node_first_move(Node *node, MoveList *movelist)
Get the first move of the move list.
Definition ybwc.c:297
void task_stack_resize(TaskStack *stack, const int n)
Resize the stack of tasks.
Definition ybwc.c:626
void task_stack_init(TaskStack *stack, const int n)
Initialize the stack of tasks.
Definition ybwc.c:560
void node_update(Node *node, Move *move)
Update a node.
Definition ybwc.c:261
void task_search(Task *task)
A parallel search within a Task structure.
Definition ybwc.c:362
void * task_loop(void *param)
The main loop runned by a task.
Definition ybwc.c:453
void task_stack_put_idle_task(TaskStack *stack, Task *task)
Put back an idle task after using it.
Definition ybwc.c:661
void node_init(Node *node, Search *search, const int alpha, const int beta, const int depth, const int n_moves, Node *parent)
Initialize a node.
Definition ybwc.c:59
Task * task_stack_get_idle_task(TaskStack *stack)
Return, if available, an idle task.
Definition ybwc.c:638
static void task_search_destroy(Search *search)
Free a search structure of a task.
Definition ybwc.c:505
static bool get_helper(Node *master, Node *node, Move *move)
Seek for & use an helper node.
Definition ybwc.c:112
static Move * node_next_move_lockless(Node *node)
Get the next move of the move list.
Definition ybwc.c:324