Page **1** of **1**

### Stockfish strength level

Posted: **Tue Aug 22, 2017 2:18 pm**

by **tomitank**

Hi!

I found this:

https://github.com/niklasf/stockfish.js
This is used by "lichess".

My question is: what parameter does the "lichess" use to set engine level?

-Tamas

### Re: Stockfish strength level

Posted: **Tue Aug 22, 2017 2:25 pm**

by **Lyudmil Tsvetkov**

whatever the level, it is very weak, as one is able to beat it even at level 8.

seemingly, for levels 1-6 they are using some randomisation, while levels 7 and 8 only significantly limit the time usage, to fraction of a second.

### Re: Stockfish strength level

Posted: **Tue Aug 22, 2017 4:20 pm**

by **tomitank**

That's okay.

I'm interested, for example, at level 7, what is the minimum depth and the maximum search time.

### Re: Stockfish strength level

Posted: **Tue Aug 22, 2017 4:36 pm**

by **Lyudmil Tsvetkov**

tomitank wrote:That's okay.

I'm interested, for example, at level 7, what is the minimum depth and the maximum search time.

that will depend on the computers.

as different users will be served by different cpus, depth will vary.

### Re: Stockfish strength level

Posted: **Tue Aug 22, 2017 4:44 pm**

by **tomitank**

I do not think so.

On weaker devices, it searched longer.

### Re: Stockfish strength level

Posted: **Tue Aug 22, 2017 5:11 pm**

by **tomitank**

From stockfish source code:

Code: Select all

```
#ifdef SKILL
// Skill structure is used to implement strength limit
struct Skill {
Skill(int l) : level(l) {}
bool enabled() const { return level < 20; }
bool time_to_pick(Depth depth) const { return depth / ONE_PLY == 1 + level; }
Move best_move(size_t multiPV) { return best ? best : pick_best(multiPV); }
Move pick_best(size_t multiPV);
int level;
Move best = MOVE_NONE;
};
#endif
```

Code: Select all

```
// If skill level is enabled and time is up, pick a sub-optimal best move
#ifdef SKILL
if (skill_.enabled() && skill_.time_to_pick(rootDepth))
skill_.pick_best(multiPV_);
#endif
```

Accordingly, is the set level + 1 equal to the maximum search depth?

### Re: Stockfish strength level

Posted: **Tue Aug 22, 2017 5:53 pm**

by **Fabian Fichter**

### Re: Stockfish strength level

Posted: **Tue Aug 22, 2017 6:03 pm**

by **Vinvin**

tomitank wrote:From stockfish source code:

Code: Select all

```
#ifdef SKILL
// Skill structure is used to implement strength limit
struct Skill {
Skill(int l) : level(l) {}
bool enabled() const { return level < 20; }
bool time_to_pick(Depth depth) const { return depth / ONE_PLY == 1 + level; }
Move best_move(size_t multiPV) { return best ? best : pick_best(multiPV); }
Move pick_best(size_t multiPV);
int level;
Move best = MOVE_NONE;
};
#endif
```

Code: Select all

```
// If skill level is enabled and time is up, pick a sub-optimal best move
#ifdef SKILL
if (skill_.enabled() && skill_.time_to_pick(rootDepth))
skill_.pick_best(multiPV_);
#endif
```

Accordingly, is the set level + 1 equal to the maximum search depth?

Yes, SF level on Lichess is 1 to 8. "1" is the strongest level, I think it search for 2 millions nodes or so.

Other levels are simply a constant progression to map "1 to 8" to "1 to 20 SF levels".

### Re: Stockfish strength level

Posted: **Tue Aug 22, 2017 6:30 pm**

by **tomitank**

Is correct?

At Level 8: Max depth = 62, movetime = 370ms / thread (default 3)

At Level 7: Max depth = 37, movetime = 185ms / thread (default 3)

### Re: Stockfish strength level

Posted: **Sat Mar 20, 2021 10:58 pm**

by **purechess**

Latest Lichees uses UCI_Elo and UCI_Limitstrength options with SF 12.

Sets elo,depth and movetime to the values below

Code: Select all

```
impl SkillLevel {
pub fn time(self) -> Duration {
use SkillLevel::*;
Duration::from_millis(match self {
One => 50,
Two => 100,
Three => 150,
Four => 200,
Five => 300,
Six => 400,
Seven => 500,
Eight => 1000,
})
}
pub fn elo(self) -> u32 {
use SkillLevel::*;
match self {
One => 800,
Two => 1100,
Three => 1400,
Four => 1700,
Five => 2000,
Six => 2300,
Seven => 2700,
Eight => 3000,
}
}
pub fn depth(self) -> u8 {
use SkillLevel::*;
match self {
One | Two | Three | Four | Five => 5,
Six => 8,
Seven => 13,
Eight => 22,
}
}
}
```