// File: kobanium[P]Ray/src/mcts/UctSearch.cpp
// Function: ParallelUctSearchPondering(thread_arg_t*)
static void
ParallelUctSearchPondering( thread_arg_t *arg )
{
  const thread_arg_t *targ = (thread_arg_t *)arg;
  const int color = targ->color;
  int winner = 0, interval = CRITICALITY_INTERVAL;
  bool enough_size = true;
  bool use_analysis = targ->lz_analysis_cs > 0 ? true : false;
  game_info_t *game = AllocateGame();
  ray_clock::time_point analysis_timer;

  // スレッドIDが0のスレッドだけ別の処理をする
  // 探索回数が閾値を超える, または探索が打ち切られたらループを抜ける
  if (targ->thread_id == 0) {
    analysis_timer = ray_clock::now();
    do {
      // 探索回数を1回増やす
      IncrementPoCount();
      // 盤面のコピー
      CopyGame(game, targ->game);
      // 1回プレイアウトする
      UctSearch(game, color, mt[targ->thread_id], current_root, winner);
      // ハッシュに余裕があるか確認
      enough_size = CheckRemainingHashSize();
      // OwnerとCriticalityを計算する
      if (GetPoCount() > interval) {
        CalculateOwner(color);
        CalculateCriticality(color);
        interval += CRITICALITY_INTERVAL;
      }

      if (use_analysis &&
          static_cast<int>(100 * GetSpendTime(analysis_timer)) > targ->lz_analysis_cs) {
        analysis_timer = ray_clock::now();
        PrintLeelaZeroAnalyze(&uct_node[current_root]);
      }

    } while (!pondering_stop && enough_size);
  } else {
    do {
      // 探索回数を1回増やす
      IncrementPoCount();
      // 盤面のコピー
      CopyGame(game, targ->game);
      // 1回プレイアウトする
      UctSearch(game, color, mt[targ->thread_id], current_root, winner);
      // ハッシュに余裕があるか確認
      enough_size = CheckRemainingHashSize();
    } while (!pondering_stop && enough_size);
  }

  // メモリの解放
  FreeGame(game);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rax
movl 0xc(%rax), %eax
movl %eax, -0x14(%rbp)
movl $0x0, -0x18(%rbp)
movl $0x64, -0x1c(%rbp)
movb $0x1, -0x1d(%rbp)
movq -0x10(%rbp), %rax
movl 0x10(%rax), %eax
testl %eax, %eax
setg %al
negb %al
andb $0x1, %al
movb %al, -0x1e(%rbp)
callq 0x9bce0
movq %rax, -0x28(%rbp)
leaq -0x30(%rbp), %rdi
callq 0x8e6e0
movq -0x10(%rbp), %rax
cmpl $0x0, 0x8(%rax)
jne 0x8a471
callq 0x7090
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq %rax, -0x30(%rbp)
callq 0x8f930
movq -0x28(%rbp), %rdi
movq -0x10(%rbp), %rax
movq (%rax), %rsi
callq 0x9c660
movq -0x28(%rbp), %rdi
movl -0x14(%rbp), %esi
movq -0x10(%rbp), %rax
movslq 0x8(%rax), %rax
leaq 0x1aac2711(%rip), %rdx  # 0x1ab4cac0
imulq $0x9c8, %rax, %rax      # imm = 0x9C8
addq %rax, %rdx
movl 0x1aac26f9(%rip), %ecx  # 0x1ab4cab8
leaq -0x18(%rbp), %r8
callq 0x8b610
callq 0x9fd70
andb $0x1, %al
movb %al, -0x1d(%rbp)
callq 0x8f8a0
cmpl -0x1c(%rbp), %eax
jle 0x8a3f5
movl -0x14(%rbp), %edi
callq 0x8b9d0
movl -0x14(%rbp), %edi
callq 0x8bbc0
movl -0x1c(%rbp), %eax
addl $0x64, %eax
movl %eax, -0x1c(%rbp)
testb $0x1, -0x1e(%rbp)
je 0x8a44e
leaq -0x30(%rbp), %rdi
callq 0x8e710
movaps %xmm0, %xmm1
movsd 0x21c09(%rip), %xmm0    # 0xac018
mulsd %xmm1, %xmm0
cvttsd2si %xmm0, %eax
movq -0x10(%rbp), %rcx
cmpl 0x10(%rcx), %eax
jle 0x8a44e
callq 0x7090
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
movq %rax, -0x30(%rbp)
movq 0x1aac2678(%rip), %rdi  # 0x1ab4cab0
movslq 0x1aac2679(%rip), %rax  # 0x1ab4cab8
imulq $0x4548, %rax, %rax     # imm = 0x4548
addq %rax, %rdi
callq 0x22680
jmp 0x8a450
xorl %eax, %eax
testb $0x1, 0x1aaec8f1(%rip)  # 0x1ab76d4a
movb %al, -0x41(%rbp)
jne 0x8a464
movb -0x1d(%rbp), %al
movb %al, -0x41(%rbp)
movb -0x41(%rbp), %al
testb $0x1, %al
jne 0x8a384
jmp 0x8a4de
jmp 0x8a473
callq 0x8f930
movq -0x28(%rbp), %rdi
movq -0x10(%rbp), %rax
movq (%rax), %rsi
callq 0x9c660
movq -0x28(%rbp), %rdi
movl -0x14(%rbp), %esi
movq -0x10(%rbp), %rax
movslq 0x8(%rax), %rax
leaq 0x1aac2622(%rip), %rdx  # 0x1ab4cac0
imulq $0x9c8, %rax, %rax      # imm = 0x9C8
addq %rax, %rdx
movl 0x1aac260a(%rip), %ecx  # 0x1ab4cab8
leaq -0x18(%rbp), %r8
callq 0x8b610
callq 0x9fd70
andb $0x1, %al
movb %al, -0x1d(%rbp)
xorl %eax, %eax
testb $0x1, 0x1aaec880(%rip)  # 0x1ab76d4a
movb %al, -0x42(%rbp)
jne 0x8a4d5
movb -0x1d(%rbp), %al
movb %al, -0x42(%rbp)
movb -0x42(%rbp), %al
testb $0x1, %al
jne 0x8a473
jmp 0x8a4de
movq -0x28(%rbp), %rdi
callq 0x9bd30
addq $0x50, %rsp
popq %rbp
retq
nopl (%rax)