Skip to content

Commit

Permalink
- assertに引っかかるUnitTestを削除。
Browse files Browse the repository at this point in the history
- 探索中に引っかかるassertがあったの削除。
- ProbCutで歩の成りが返ってくるが、このhistory、captureのところ見てたの修正。
- qsearchで千日手チェック、やはり入れることにした。

ブログのコメント欄。
```
やねうらお
2023年11月6日 19:43 より:編集
qsearch()の千日手判定を削除したから、固定depthで回していると、循環があってMAX_PLYまで探索が行って(その間に他の枝とかも調べたりで)探索が終わらないだとか、MAX_PLYにいくまでにstack使い切って落ちるだとか、たぶんそのへんではないかと思います。(これはコンパイル時にstack明示的に指定して増やしてないとそういうことが置きます)

取り急ぎ、qsearchの千日手判定を復活させることにしました。
```

Discordの書き込み。
```
やねうらお — 今日 19:46
そういや、qsearchで王手延長するの、あれ、どこかで抑制するようにした覚えがあるんすけど、qsearchのコードがStockfishのほうで変化があって、それ取り込んだからか、いつの間にかなくなってますな…。(これも原因なのかな…)
やねうらお — 今日 19:47
チェスでは、そんなに王手が続かないのかな…。それとも千日手チェックをしてるから、回避できてるのかな?
やねうらお — 今日 19:51
qsearchで、ある局面で王手が2通りあって、どちらでも循環してると、MAX_PLYに行くまでにこの2択の分岐が延々とあって、指数関数的な組み合わせを調べることになるから、(王手の限り延長し続けると)探索が終わらないのだ。😵‍💫
```
  • Loading branch information
yaneurao committed Nov 6, 2023
1 parent 89ada77 commit 607974c
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 8 deletions.
21 changes: 14 additions & 7 deletions source/engine/yaneuraou-engine/yaneuraou-search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1987,7 +1987,7 @@ Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, boo

#if defined(ENABLE_PAWN_HISTORY)
if (type_of(pos.piece_on(prevSq)) != PAWN && type_of((ss - 1)->currentMove) != PROMOTION)
thisThread->pawnHistory[pawn_structure(pos)][pos.piece_on(prevSq)][prevSq] << bonus / 4;
thisThread->pawnHistory(pawn_structure(pos),pos.piece_on(prevSq),prevSq) << bonus / 4;
#endif
}

Expand Down Expand Up @@ -2221,7 +2221,8 @@ Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, boo

if (move != excludedMove && pos.legal(move))
{
ASSERT_LV3(pos.capture_stage(move));
//ASSERT_LV3(pos.capture_stage(move));
// moveは歩の成りも返ってくるが、これがcapture_stage()と一致するとは限らない。

// ※ MovePickerはprob cutの時に、
// (GenerateAllLegalMovesオプションがオンであっても)歩の成らずは返してこないことは保証している。
Expand All @@ -2231,10 +2232,10 @@ Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, boo
// → 将棋だとこのprefetch、効果がなさげなのでコメントアウト。

ss->currentMove = move;
ss->continuationHistory = &(thisThread->continuationHistory[ss->inCheck ]
[true ]) // captureOrPromotion
(pos.moved_piece_after(move),
to_sq(move) );
ss->continuationHistory = &(thisThread->continuationHistory[ss->inCheck ]
[/*/true*/pos.capture_stage(move)])
(pos.moved_piece_after(move) ,
to_sq(move) );

pos.do_move(move, st);

Expand Down Expand Up @@ -3307,7 +3308,13 @@ Value qsearch(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth)
// Step 2. Check for an immediate draw or maximum ply reached

//if (pos.is_draw(ss->ply) || ss->ply >= MAX_PLY)
// → 将棋、千日手の頻度がチェスほどではないのでqsearch()で千日手判定を行う効果に乏しい。
// → 将棋、千日手の頻度がチェスほどではないのでqsearch()で千日手判定を行う効果に乏しいかと思ったのだが、
// このチェックしないとqsearchでMAX_PLYまで行くので弱くなる。

auto draw_type = pos.is_repetition2(16, ss->ply);

if (draw_type != REPETITION_NONE)
return value_from_tt(draw_value(draw_type, pos.side_to_move()), ss->ply);

if (ss->ply >= MAX_PLY)
return draw_value(REPETITION_DRAW, pos.side_to_move());
Expand Down
3 changes: 3 additions & 0 deletions source/position.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2598,10 +2598,13 @@ void Position::UnitTest(Test::UnitTester& tester)
m = pos.to_move(m16);
tester.test("make_move(SQ_77, SQ_76) is pseudo_legal == true", pos.pseudo_legal(m) == true);

#if 0
// 後手の駒の場合、現在の手番の駒ではないので、pseudo_legalではない。(pseudo_legalは手番側の駒であることを保証する)
m16 = make_move16(SQ_83, SQ_84);
m = pos.to_move(m16);
// → pos.to_move()で現在の手番側の駒ではないからMOVE_NONEが返るか…。このテスト、意味ないな。
tester.test("make_move(SQ_83, SQ_84) is pseudo_legal == false", pos.pseudo_legal(m) == false);
#endif

// 88の先手の角を22に移動。これは途中に駒があって移動できないのでpseudo_legalではない。
// (pseudo_legalは、その駒が移動できる(移動先の升にその駒の利きがある)ことを保証する)
Expand Down
2 changes: 1 addition & 1 deletion source/testcmd/unit_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ namespace Test

// --- 各classに対するUnitTest

#if defined(YANEURAOU_ENGINE) && defined (EVAL_LEARN)
#if defined(YANEURAOU_ENGINE) && defined(EVAL_LEARN)
// 自己対局のテスト(これはデバッガで追いかけたいことがあるので、他のをすっ飛ばして最初にやって欲しい)
tester.run(Learner::UnitTest);
#endif
Expand Down

0 comments on commit 607974c

Please sign in to comment.