MinimalChess 0.2 released

Discussion of anything and everything relating to chess playing software and machines.

Moderator: Ras

User avatar
mvanthoor
Posts: 1784
Joined: Wed Jul 03, 2019 4:42 pm
Location: Netherlands
Full name: Marcel Vanthoor

Re: MinimalChess 0.2 released

Post by mvanthoor »

lithander wrote: Sun Feb 14, 2021 1:47 pm Thanks for playing with MinimalChess! :)
I'm running a tournament against Rustic Alpha 1 right now. The few things I can see right now:

1. Because you have no quiescence search, your engine blunders pieces
2. MinimalChess searches to about the same depth as Rustic, but reaches it a fraction later because you have no move ordering.
3. Because of 1 and 2, Rustic is tactically stronger, and the advantage becomes bigger as the game progresses. Rustic's search depth advantage increases up to 3 ply. (Rustic has the same deficiency against engines that already have a transposition table: they also pull far ahead in the late middle-game and endgame.)
4. The tournament is now going at 35 / 100 games, and all games were finished; up to now, the engine seems stable. (At least in CuteChess.)
5. Good info reporting to the GUI.

If you add the following:

- PST's (how _DO_ you know where to put your pieces without a PST?)
- Quiescence search
- MVV-LVA move ordering

Then you would reach feature parity with Rustic, version Alpha 1. The only difference between the engines at that point would be the values in the PST's, and the raw speed. I look forward to that version. (As an experiment, we could actually match PST's, to compare the engines on speed only. PS: My PST's are written from the viewpoint of white. If you look at a PST arranged in an 8x8 grid, then A1 is on the lower left. Much easier to edit by hand than PST's where A1 is the top left. Rustic's PST implementation )

(If you start adding features, it may be wise to rename your engine, or "derive" a successor from it. "MinimalChess" while in the end having a bazillion features doesn't seem to fit :shock: )
Author of Rustic, an engine written in Rust.
Releases | Code | Docs | Progress | CCRL
User avatar
mvanthoor
Posts: 1784
Joined: Wed Jul 03, 2019 4:42 pm
Location: Netherlands
Full name: Marcel Vanthoor

Re: MinimalChess 0.2 released

Post by mvanthoor »

Ran 150 games in total. No crashes, no illegal moves. Well done.

Unfortunately, MinimalChess lost all 150 games, but without a PST, QSearch or move ordering that is to be expected. I look forward to a version that has feature parity with Rustic A1 :)
Author of Rustic, an engine written in Rust.
Releases | Code | Docs | Progress | CCRL
User avatar
lithander
Posts: 915
Joined: Sun Dec 27, 2020 2:40 am
Location: Bremen, Germany
Full name: Thomas Jahn

Re: MinimalChess 0.2 released

Post by lithander »

mvanthoor wrote: Mon Feb 15, 2021 6:26 pm Ran 150 games in total. No crashes, no illegal moves. Well done.

Unfortunately, MinimalChess lost all 150 games, but without a PST, QSearch or move ordering that is to be expected. I look forward to a version that has feature parity with Rustic A1 :)
I don't feel too bad about losing to Rustic. As you noted I have a lot of excuses for that! ;)

That the engine otherwise seems to run fine for everyone that has tried it so far, without major bugs or hickups, is actually making me very happy.
You wouldn't believe how many engines I tried in that ELO range as sparring partners that were exhibiting faulty behavior.

And so I do think that even as a lower strength engine MinimalChess can be valuable as a sparring partner for equally low strength engines or humans if they can do that consistently without bugs. At least that's what I'm telling myself to feel better about the measly thousand-something ELO. :P
mvanthoor wrote: Mon Feb 15, 2021 6:26 pm If you start adding features, it may be wise to rename your engine, or "derive" a successor from it. "MinimalChess" while in the end having a bazillion features doesn't seem to fit :shock:
I'd like to reach a point somewhere in the near future where I can say my first chess engine is done and start from scratch. My next attempt may be more ambitious, climbing the ELO ladder and giving Rustic a good fight is definitely a worthy goal for the future. But MinimalChess isn't cut out to be that rival. Every time I had to make a decision regarding simplicity vs performance I went for the simple solution. The motto of this thing is KISS: I only started playing chess a few months ago and counting material is all I understand at that point. Why pretend otherwise in the engine I write?

But I admit that the scope of what I consider minimal has been expanding already. I thought a fixed search depth would be fine. But then someone said that an engine that ignores the time control parameters completely isn't a viable engine. Makes total sense but if you want to become viable in that sense you'll need some kind of pruning and iterative deepening because otherwise you can't make use of the extra time. So that's what explains the feature set of 0.2.
mvanthoor wrote: Mon Feb 15, 2021 6:26 pm - PST's (how _DO_ you know where to put your pieces without a PST?)
- MVV-LVA move ordering
I'm just as surprised as you are that just by implementing the *rules* of chess and the *value of material* the engine already plays that "well". So my current definition of minimal is to keep these properties. I won't try to funnel additional chess knowledge (that I don't have anyway) into the engine. PSTs feel completely arbitrary and move ordering too, to some extend. Actually, I even randomize my move order at the moment so the engine plays non-deterministically without an open book! :)
mvanthoor wrote: Mon Feb 15, 2021 6:26 pm - Quiescence search
This however I feel would be in scope. It's not merely an optimization technique like transposition tables. It doesn't micro manage the engines search by tweaking the evaluation. The horizon effect is a fundamental problem to the search itself and manifesting in such a severe way that it could almost be considered a bug.

I hope I don't sound too dismissive of your suggestions? I have limited time for spare-time projects and I need to structure them in a way that I can stay motivated over a long period of time if I want to achieve anything. If I can't make something competitive yet I'll make something that is somewhat original, and if only in that I skip most of the best optimization techniques and see if I can still gain more playing strength elsewise. My hard disk is full of ambitious pet projects where, like Icarus, I aimed for the sun too quickly just to burn out before completing anything.
Minimal Chess (simple, open source, C#) - Youtube & Github
Leorik (competitive, in active development, C#) - Github & Lichess
Sven
Posts: 4052
Joined: Thu May 15, 2008 9:57 pm
Location: Berlin, Germany
Full name: Sven Schüle

Re: MinimalChess 0.2 released

Post by Sven »

Quiescence search and a minimal way of move ordering (i.e., trying captures before quiet moves and capturing the biggest enemy pieces with the smallest friendly pieces first) are essential parts of a chess engine. Move ordering does not add knowledge but it improves performance considerably so you should not ignore it. Simple move ordering can be implemented in much less than an hour, same for qsearch.

And without a minimum of positional evaluation a chess engine will not behave like a chess player, it won't even try to develop its pieces, control the center and protect its king. But that's what a chess beginner is told ... PST is probably the easiest and fastest way to achieve that.

Time control, iterative deepening (as the usual way of letting the engine think longer and search deeper if it gets more time) and a very basic support of a standard engine communication protocol (UCI or WB) are essential for a minimal engine, too, since you can't run any serious tests without that.

In my view a minimal chess engine should definitely play stronger than a human chess beginner. Look, it's a computer ... 😉
Sven Schüle (engine author: Jumbo, KnockOut, Surprise)
User avatar
mvanthoor
Posts: 1784
Joined: Wed Jul 03, 2019 4:42 pm
Location: Netherlands
Full name: Marcel Vanthoor

Re: MinimalChess 0.2 released

Post by mvanthoor »

lithander wrote: Tue Feb 16, 2021 11:37 pm I don't feel too bad about losing to Rustic. As you noted I have a lot of excuses for that! ;)
My engine loses lots of games against some engines that are nearby in the rating list... just because they have some sort of quirk or trick that they use over and over again. If you write an engine that sits around the 1700 level and you meet TSCP, when you have no transposition table and no evaluation, your rating will suffer because TSCP will slaughter you over and over again with the same "I got myself a passed pawn!"-trick.
That the engine otherwise seems to run fine for everyone that has tried it so far, without major bugs or hickups, is actually making me very happy.
You wouldn't believe how many engines I tried in that ELO range as sparring partners that were exhibiting faulty behavior.
I know. When I was trying my first tests (even before I had move sorting and qsearch) I couldn't find any engines in the 1200 range that were even able to consistently finish a tournament at fast time controls. Having a stable engine that can handle all time controls and doesn't crash constantly is very imporant if you want to have your engine tested and used by others.
And so I do think that even as a lower strength engine MinimalChess can be valuable as a sparring partner for equally low strength engines or humans if they can do that consistently without bugs. At least that's what I'm telling myself to feel better about the measly thousand-something ELO. :P
If nothing else, it will become known as a stable sparring partner for beginner human players, and for some it may end up in something like Picochess.
I'd like to reach a point somewhere in the near future where I can say my first chess engine is done and start from scratch.
Personally, I wouldn't want to think about starting over again from scratch.
My next attempt may be more ambitious, climbing the ELO ladder and giving Rustic a good fight is definitely a worthy goal for the future.
Good :) The Alpha 1 (and all subsequent versions) will stay available of course, so you can test against any of them as they become available. I have my own target list, like Shallow Blue 2.0 (againt which my engine overperforms), TSCP (against which it underperforms), WukongJS, Vice, BBC, then something in between, en finally Fritz 11 and Glaurung 2.2. At that point, the engine would be close to 2900 Elo, and I'll see where it ends from there.
But MinimalChess isn't cut out to be that rival. Every time I had to make a decision regarding simplicity vs performance I went for the simple solution. The motto of this thing is KISS: I only started playing chess a few months ago and counting material is all I understand at that point. Why pretend otherwise in the engine I write?
At some point, you'll have to study chess principles, or you won't be able to write a good evaluation function. You could, but then you don't understand what you're writing. I have quite some theoretical knowledge about chess (I've been playing on and off for over 30 years), but in over-the-board games, I'm often way too lazy to actually calculate anything.

Still, in most positions, I can clearly see where an engine's weak points are with regard to positional play.
But I admit that the scope of what I consider minimal has been expanding already. I thought a fixed search depth would be fine. But then someone said that an engine that ignores the time control parameters completely isn't a viable engine. Makes total sense but if you want to become viable in that sense you'll need some kind of pruning and iterative deepening because otherwise you can't make use of the extra time. So that's what explains the feature set of 0.2.
Same here. I added MVV-LVA when I found out how massively slow the engine is without move sorting. Personally, the following things are needed for a minimal chess engine:

- Board representation
- Move generator
- Alpha/Beta search
- QSearch
- MVV-LVA move sorting
- Evaluation: Material count and PST
- Iterative deepening
- Time controls per game and move
- UCI or XBoard interface

With these, you have a chess engine that can basically do anything (except "go mate X") a GUI could want from it, without any other optimizations but MVV-LVA. The rating will be between 1400 and 1700 CCRL, depending on:

- Speed of the engine (coming down to chosen algorithms and programming language)
- Accuracy/quality of the PST's
- Time handling

This is exactly Rustic's current feature set, and that's why it's in the list as Alpha 1; because it's minimal (in my eyes), but I don't consider it "finished" yet. For that, it would need at least:

- Transposition table
- Hash move / PV move sorting
- Killer moves
- History heuristics
- Both UCI and XBoard at feature parity

Then, for me, the engine is "done", and the rest is optimization / extension of existing features.
I'm just as surprised as you are that just by implementing the *rules* of chess and the *value of material* the engine already plays that "well". So my current definition of minimal is to keep these properties. I won't try to funnel additional chess knowledge (that I don't have anyway) into the engine. PSTs feel completely arbitrary and move ordering too, to some extend. Actually, I even randomize my move order at the moment so the engine plays non-deterministically without an open book! :)
PST's are about piece placement, and if you think about it, it's very logical:

- The center of the board is better than the edges.
- Pawns must be forward, especially the two center pawns.
- Rooks need a bonus on the 7th rank because they can attack pawns there.
- King at the edge in the opening and middle game, and in the center in the endgame.

I created my own PST's, but one of the first things I'm going to write after the engine gains the features I just listed above (Transposition Table and such) is to write a Texel tuner to automatically tune the evaluation.

Move ordering is also not arbitrary; MVV-LVA is very logical. It just means "pawn x Queen" is better than "Knight x Rook", and "Queen x Rook" is probably bad (assuming the rook is defended). MVV-LVA just searches captures that are most likely to be good first.
mvanthoor wrote: Mon Feb 15, 2021 6:26 pm - Quiescence search
This however I feel would be in scope. It's not merely an optimization technique like transposition tables. It doesn't micro manage the engines search by tweaking the evaluation. The horizon effect is a fundamental problem to the search itself and manifesting in such a severe way that it could almost be considered a bug.
Quiescence search is essential to fix the horizon effect, and if you don't want it to explode with searching bad captures, MVV-LVA is also needed there.
I hope I don't sound too dismissive of your suggestions? I have limited time for spare-time projects and I need to structure them in a way that I can stay motivated over a long period of time if I want to achieve anything. If I can't make something competitive yet I'll make something that is somewhat original, and if only in that I skip most of the best optimization techniques and see if I can still gain more playing strength elsewise. My hard disk is full of ambitious pet projects where, like Icarus, I aimed for the sun too quickly just to burn out before completing anything.
Same here. Rustic (and the rest of the chess programming stuff) is a *VERY* long term project for me, and I don't really mind how long it takes. Sometimes I don't have a lot of time, sometimes I'm not motivated to research things, sometimes I'm stuck and need to think about some stuff for a week. That doesn't matter; I find it to be more important that a new feature is well wrtiten, stable, and well commented so I don't have to return to it ever again, except if I want to replace it with a better/more sophisticated version. (For example, I could replace MVV-LVA with SEE at some point; or maybe they need to be kept both. I don't know yet, because I haven't researched it yet.)

Good luck with a new engine; I look forward to playing against it some day :)
Author of Rustic, an engine written in Rust.
Releases | Code | Docs | Progress | CCRL
User avatar
lithander
Posts: 915
Joined: Sun Dec 27, 2020 2:40 am
Location: Bremen, Germany
Full name: Thomas Jahn

Re: MinimalChess 0.2 released

Post by lithander »

mvanthoor wrote: Wed Feb 17, 2021 11:14 am Personally, the following things are needed for a minimal chess engine:

- Board representation
- Move generator
- Alpha/Beta search
- QSearch
- MVV-LVA move sorting
- Evaluation: Material count and PST
- Iterative deepening
- Time controls per game and move
- UCI or XBoard interface
Sven wrote: Wed Feb 17, 2021 9:24 am Quiescence search and a minimal way of move ordering are essential parts of a chess engine.

And without a minimum of positional evaluation a chess engine will not behave like a chess player, it won't even try to develop its pieces, control the center and protect its king. But that's what a chess beginner is told ... PST is probably the easiest and fastest way to achieve that.

Time control, iterative deepening (as the usual way of letting the engine think longer and search deeper if it gets more time) and a very basic support of a standard engine communication protocol (UCI or WB) are essential for a minimal engine, too.
Thanks for your list of essential features. It seems that both of you are largely in agreement on the techniques I should implement before calling my first engine done. And I will gladly attempt to do so!

I was just worried over Marcel's earlier advice about not adding a ton of features to an engine that claims to be minimal (a worry which I shared) and unsure if I might have reached that point of feature-creep already. But I'm definitely not trying to look for excuses to call it quits. This is slowly turning into a full blown hobby. :)
mvanthoor wrote: Wed Feb 17, 2021 11:14 amAt some point, you'll have to study chess principles, or you won't be able to write a good evaluation function. You could, but then you don't understand what you're writing. I have quite some theoretical knowledge about chess (I've been playing on and off for over 30 years), but in over-the-board games, I'm often way too lazy to actually calculate anything.
I'm trying to learn to play better chess, too. But it seems my engine is outpacing me in gaining strength. ;)
Minimal Chess (simple, open source, C#) - Youtube & Github
Leorik (competitive, in active development, C#) - Github & Lichess
unserializable
Posts: 65
Joined: Sat Oct 24, 2020 6:39 pm
Full name: Taimo Peelo

Re: MinimalChess 0.2 released

Post by unserializable »

unserializable wrote: Sun Feb 14, 2021 7:31 pm ...
I used debug build of MCE because I had not yet figured out how to do release builds, but now I have and at the end of next week I will involve release build of MCE in some further testing to see whether numbers seem to match -- note that the time control that I used was 10s+0 (10 seconds per game, no increment), so any debug build slowdown could have been critical in that.
...
Below some notes from my further testing. Also, congrats on starting off at the very symbolic 666th place on CCRL 404 :mrgreen:.

General

Compared with debug build, I saw match score percentages against Monchester almost exactly reversed when using release build. Excellent stability on Linux, no time losses, no illegal moves, memory usage stably hovering at 16-17 MB. Performed 10724 10s+0 games in total -- 5000 (XBoard 4.9.1, no opening book) + 2000 (CuteChess GUI 1.2.0, no opening book) + 2724 (CuteChess GUI 1.2.0, UHO 2.0 opening book) + 1000 (CuteChess CLI 1.2.0, no opening book). Scores were around 80:20 for MCE 0.2.1 on CC GUI/CLI and 70:30 on XBoard.

Tech notes
  • There is mismatch between version printed at startup and reported as UCI id, depending on interface setups this can result in various engine version confusion in saved games, unless manually corrected.
  • When pipe input ends or end of file is received (Ctrl+D on Linux and IIRC Ctrl+Z on Windows), crash occurs. Nowadays that is less of a nuisance, as most distros are compiled the way core dumps are by default NOT written to disk, but only when dumps are explicitly enabled for the active shell. See below, repro should be the the same on Windows probably. Rare to happen with interfaces that in /most/ situations will send 'quit'.

Code: Select all

$ echo "uci" | ./MinimalChessEngine 
MinimalChess 0.2.1
id name MinimalChess 0.2
id author Thomas Jahn
uciok
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at MinimalChessEngine.Program.ParseUciCommand(String input) in /some_folder/MinimalChessEngine/MinimalChessEngine/Program.cs:line 25
   at MinimalChessEngine.Program.Main(String[] args) in /some_folder/MinimalChessEngine/MinimalChessEngine/Program.cs:line 17
   at MinimalChessEngine.Program.<Main>(String[] args)
Aborted (core dumped)

Gameplay notes

Most encountered blunders are "as advertised", except maybe the one below, where MCE 0.2.1 suddenly went 257... Kc6, allowing opponent to promote -- which it so far had smartly prevented since move 218. Seems not to be time trouble issue, as it managed to search to depth 5, so might be that prioritization of avoiding repetition draw or stalemate suddenly kicked in without a good reason.

[d]8/Pk6/8/2B1K3/8/8/8/8 b - - 78 257

Whole game:

[pgn]
[Event "Monchester 1.0.1-14-g84db4ed vs MinimalChess 0.2.1 (UHO 2.0) | TC 0:10+0 | CC-GUI 1.2.0 | Ubuntu 20.04.2 LTS"]
[Site "dncore"]
[Date "2021.02.19"]
[Round "15"]
[White "Monchester 1.0.1-14-g84db4ed"]
[Black "MinimalChess 0.2.1"]
[Result "1-0"]
[ECO "C60"]
[GameDuration "00:00:18"]
[GameEndTime "2021-02-19T19:57:41.872 EET"]
[GameStartTime "2021-02-19T19:57:22.914 EET"]
[Opening "Ruy Lopez"]
[PlyCount "527"]
[TimeControl "10"]
[Variation "Cozio defense, Paulsen Variation"]

1. e4 {book} e5 {book} 2. Nf3 {book} Nc6 {book} 3. Bb5 {book} Nge7 {book}
4. Nc3 {book} g6 {book} 5. Bxc6 {+1.45/4 0.10s} Nxc6 {-1.00/6 0.11s}
6. Nd5 {+1.17/4 0.080s} Bd6 {+1.00/5 0.054s} 7. O-O {+1.28/4 0.089s}
Bc5 {+1.00/5 0.25s} 8. Qe2 {+1.20/4 0.11s} a5 {+1.00/5 0.075s}
9. Qc4 {+1.17/4 0.16s} Ba7 {+1.00/5 0.083s} 10. Rd1 {+1.20/4 0.14s}
d6 {+2.00/5 0.083s} 11. Qf1 {-6.54/4 0.20s} Bg4 {+1.00/5 0.11s}
12. h3 {-0.88/4 0.17s} Bxf3 {+1.00/5 0.098s} 13. gxf3 {-0.97/4 0.14s}
Nd4 {0.00/6 0.20s} 14. Qd3 {-1.22/4 0.11s} c6 {+1.00/5 0.071s}
15. Nc3 {-1.08/4 0.14s} Qf6 {+2.00/5 0.059s} 16. b3 {-1.62/4 0.11s}
Nxf3+ {+4.00/5 0.061s} 17. Kg2 {-10.37/4 0.023s} Nh4+ {+4.00/5 0.053s}
18. Kh1 {-44.85/4 0.028s} Qxf2 {+5.00/5 0.22s} 19. Qe2 {-11.31/4 0.17s}
Qf6 {+3.00/5 0.18s} 20. Rb1 {-2.71/4 0.14s} Qf4 {+3.00/5 0.087s}
21. d3 {-2.42/4 0.17s} Qg3 {+3.00/5 0.11s} 22. Qg4 {-2.48/4 0.21s}
Qf2 {+5.00/5 0.16s} 23. Bd2 {-10.17/4 0.24s} h5 {+5.00/5 0.14s}
24. Qe2 {-11.25/4 0.24s} Qd4 {+3.00/5 0.16s} 25. Bg5 {-3.25/4 0.16s}
Qxc3 {+3.00/5 0.10s} 26. Bxh4 {-3.02/4 0.16s} Rg8 {+3.00/5 0.12s}
27. Be1 {-2.57/4 0.13s} Qc5 {+3.00/5 0.083s} 28. Qg2 {-2.65/4 0.11s}
Bb8 {+3.00/5 0.079s} 29. Qe2 {-2.77/4 0.10s} Kf8 {+3.00/5 0.058s}
30. Qd2 {-2.60/4 0.087s} Kg7 {+3.00/5 0.043s} 31. Bf2 {-2.60/4 0.089s}
Qa3 {+3.00/5 0.078s} 32. c4 {-2.80/4 0.11s} Rd8 {+3.00/5 0.075s}
33. Bb6 {-2.71/4 0.12s} Rd7 {+3.00/5 0.092s} 34. Be3 {-2.65/4 0.11s}
Kg8 {+3.00/5 0.052s} 35. Qc2 {-2.71/4 0.10s} Kg7 {+3.00/5 0.057s}
36. Qb2 {-2.65/4 0.099s} Qxb2 {+2.00/5 0.069s} 37. Rxb2 {-2.31/4 0.075s}
f5 {+2.00/5 0.17s} 38. exf5 {-2.14/4 0.070s} gxf5 {+1.00/6 0.12s}
39. Rg1+ {-2.31/4 0.061s} Kf7 {+1.00/6 0.13s} 40. Rf2 {-2.31/4 0.068s}
f4 {+1.00/6 0.12s} 41. Rg5 {-2.28/4 0.064s} h4 {+2.00/5 0.047s}
42. Rg4 {-2.31/4 0.049s} Ke7 {+2.00/5 0.045s} 43. Rg7+ {-1.88/4 0.048s}
Ke6 {0.00/6 0.056s} 44. Rxd7 {-2.37/4 0.053s} Kxd7 {+1.00/6 0.063s}
45. Bc1 {-2.37/4 0.021s} c5 {+1.00/6 0.081s} 46. Bd2 {-2.31/4 0.021s}
Bc7 {+1.00/6 0.058s} 47. Rg2 {-2.34/4 0.026s} Ke6 {+1.00/6 0.094s}
48. Rg7 {-2.00/4 0.036s} Rc8 {+2.00/5 0.14s} 49. Rh7 {-2.22/4 0.035s}
f3 {+1.00/5 0.039s} 50. Rxh4 {-1.42/4 0.024s} Ra8 {0.00/6 0.13s}
51. Rh6+ {-1.28/4 0.036s} Kf5 {+1.00/7 0.11s} 52. Bc1 {-1.31/4 0.028s}
Re8 {0.00/6 0.087s} 53. Rh5+ {-1.17/4 0.025s} Ke6 {0.00/6 0.13s}
54. Rh7 {-1.22/4 0.028s} Re7 {0.00/6 0.041s} 55. Rh6+ {-1.34/4 0.021s}
Kf5 {+1.00/7 0.10s} 56. Rh8 {-1.28/4 0.016s} Rf7 {0.00/6 0.11s}
57. Rg8 {-1.22/4 0.026s} f2 {+4.00/5 0.031s} 58. Kg2 {-17.37/4 0.037s}
b5 {+1.00/5 0.030s} 59. Kxf2 {-0.68/4 0.050s} Ke6+ {0.00/5 0.032s}
60. Kg2 {-0.31/4 0.013s} bxc4 {0.00/5 0.036s} 61. bxc4 {-0.28/4 0.056s}
Rh7 {+1.00/5 0.027s} 62. Ra8 {-0.54/4 0.039s} Kf7 {+1.00/5 0.12s}
63. Rc8 {-0.54/4 0.031s} Ke6 {+1.00/5 0.037s} 64. Kh2 {-0.54/4 0.032s}
Kd7 {-1.00/6 0.099s} 65. Rg8 {-0.57/4 0.022s} Bd8 {+1.00/5 0.023s}
66. Bd2 {-0.57/4 0.036s} Bb6 {+1.00/5 0.036s} 67. a3 {-0.54/4 0.047s}
Kc7 {+1.00/5 0.032s} 68. Be3 {-0.54/4 0.032s} Kd7 {-1.00/6 0.096s}
69. Kg2 {-0.57/4 0.039s} Bd8 {+1.00/5 0.022s} 70. Bf2 {-0.60/4 0.046s}
Bb6 {+1.00/5 0.029s} 71. Be1 {-0.60/4 0.037s} Bc7 {+1.00/5 0.027s}
72. Kh2 {-0.60/4 0.033s} Rh5 {+1.00/5 0.030s} 73. Rg6 {-0.54/4 0.028s}
Kc6 {-1.00/6 0.098s} 74. h4 {-0.57/4 0.021s} Rh7 {-1.00/6 0.075s}
75. Bg3 {-0.60/4 0.023s} Rh5 {-1.00/6 0.068s} 76. Rg5 {-0.57/4 0.012s}
Rh8 {-1.00/6 0.062s} 77. Rg6 {-0.57/4 0.019s} Kb6 {+1.00/5 0.026s}
78. Kh3 {-0.60/4 0.023s} Kb7 {-1.00/6 0.087s} 79. Rg7 {-0.62/4 0.033s}
Kb8 {-1.00/6 0.066s} 80. Be1 {-0.60/4 0.028s} Bb6 {-1.00/6 0.089s}
81. Rg6 {-0.54/4 0.031s} Bc7 {+1.00/5 0.090s} 82. Bc3 {-0.57/4 0.028s}
Ka8 {+1.00/5 0.088s} 83. Be1 {-0.57/4 0.037s} Ka7 {+1.00/5 0.027s}
84. Rg7 {-0.54/4 0.035s} Kb8 {-1.00/6 0.071s} 85. Rg6 {-0.60/4 0.028s}
a4 {+1.00/5 0.021s} 86. Re6 {-0.57/4 0.031s} Rh5 {+1.00/5 0.021s}
87. Kg4 {-0.54/4 0.015s} Rh8 {-1.00/6 0.075s} 88. Kg3 {-0.57/4 0.021s}
Ka8 {+1.00/5 0.023s} 89. Kf3 {-0.54/4 0.024s} Kb8 {+1.00/5 0.026s}
90. Rf6 {-0.57/4 0.030s} Kc8 {+1.00/5 0.020s} 91. Kg2 {-0.54/4 0.028s}
Kb7 {+1.00/5 0.030s} 92. Kg1 {-0.60/4 0.052s} Ka8 {+1.00/5 0.032s}
93. Kf1 {-0.57/4 0.031s} Ka7 {+1.00/5 0.030s} 94. Rf7 {-0.57/4 0.038s}
Kb6 {+1.00/5 0.022s} 95. Rg7 {-0.60/4 0.033s} Bb8 {+1.00/5 0.020s}
96. Kg1 {-0.54/4 0.029s} Ba7 {-1.00/6 0.061s} 97. Bf2 {-0.57/4 0.028s}
Bb8 {+1.00/5 0.020s} 98. Rg6 {-0.57/4 0.027s} Kc6 {+1.00/5 0.020s}
99. Be1 {-0.60/4 0.021s} Kb6 {+1.00/5 0.018s} 100. Rf6 {-0.57/4 0.027s}
Bc7 {+1.00/5 0.019s} 101. Kh1 {-0.57/4 0.026s} Kc6 {+1.00/5 0.020s}
102. Rf5 {-0.62/4 0.025s} Bd8 {+1.00/5 0.021s} 103. h5 {-0.71/4 0.027s}
Rh6 {+1.00/5 0.026s} 104. Kg1 {-0.65/4 0.023s} Kd7 {+1.00/5 0.026s}
105. Bd2 {-0.57/4 0.029s} Rh7 {+1.00/5 0.026s} 106. h6 {-0.62/4 0.033s}
Ke8 {+1.00/5 0.027s} 107. Rf3 {-0.60/4 0.025s} Rh8 {+1.00/5 0.021s}
108. Kf2 {-0.60/4 0.020s} Be7 {+1.00/5 0.019s} 109. Kf1 {-0.65/4 0.019s}
Kd7 {+1.00/5 0.022s} 110. Rf2 {-0.62/4 0.035s} Rb8 {+1.00/5 0.025s}
111. h7 {-0.54/4 0.044s} Rd8 {+1.00/5 0.035s} 112. Ke2 {-0.54/4 0.037s}
Ra8 {+1.00/5 0.025s} 113. Bc1 {-0.54/4 0.060s} Rh8 {+1.00/5 0.024s}
114. Rh2 {-0.60/4 0.038s} Ke8 {+1.00/5 0.020s} 115. Kf2 {-0.57/4 0.019s}
Bd8 {+1.00/5 0.023s} 116. Ke2 {-0.57/4 0.024s} Bf6 {+1.00/5 0.063s}
117. Kd1 {-0.57/4 0.028s} Kd7 {+1.00/5 0.018s} 118. Rh5 {-0.60/4 0.039s}
Kd8 {+1.00/5 0.024s} 119. Kc2 {-0.57/4 0.019s} Ke8 {+1.00/5 0.060s}
120. Kd1 {-0.57/4 0.018s} Bg7 {+1.00/5 0.018s} 121. Rh2 {-0.54/4 0.014s}
Bf8 {+1.00/5 0.058s} 122. Be3 {-0.54/4 0.014s} Bg7 {+1.00/5 0.015s}
123. Kc2 {-0.57/4 0.022s} Bf6 {+1.00/5 0.017s} 124. Rh6 {-0.57/4 0.026s}
Kf7 {+1.00/5 0.023s} 125. Kc1 {-0.57/4 0.033s} Ke7 {+1.00/5 0.021s}
126. Kc2 {-0.54/4 0.024s} Bg7 {-1.00/4 0.018s} 127. Rh2 {-0.57/4 0.046s}
Bf6 {+1.00/5 0.025s} 128. Bc1 {-0.60/4 0.044s} Ke8 {+1.00/5 0.019s}
129. Bd2 {-0.57/4 0.024s} Ke7 {+1.00/5 0.020s} 130. Rh6 {-0.54/4 0.036s}
Kf7 {+1.00/5 0.017s} 131. Rh1 {-0.54/4 0.032s} Ke8 {+1.00/5 0.017s}
132. Rh5 {-0.57/4 0.028s} Bg7 {+1.00/5 0.023s} 133. Bc3 {-0.57/4 0.020s}
Ke7 {+1.00/5 0.016s} 134. Rh1 {-0.62/4 0.032s} Ke6 {+1.00/5 0.018s}
135. Ba5 {-0.54/4 0.035s} Ke7 {+1.00/5 0.021s} 136. Rh3 {-0.57/4 0.041s}
Ke8 {+1.00/5 0.019s} 137. Kc1 {-0.57/4 0.015s} Bf8 {+1.00/5 0.049s}
138. Bd2 {-0.57/4 0.010s} Kd7 {+1.00/5 0.015s} 139. Kb2 {-0.60/4 0.015s}
Bg7 {+1.00/5 0.017s} 140. Kc2 {-0.60/4 0.031s} Kc8 {+1.00/5 0.020s}
141. Rh1 {-0.54/4 0.023s} Bf6 {+1.00/5 0.016s} 142. Rh6 {-0.54/4 0.035s}
Be7 {+1.00/5 0.018s} 143. Bc3 {-0.57/4 0.028s} Kd7 {+1.00/5 0.018s}
144. Bd2 {-0.57/4 0.035s} Bd8 {-1.00/4 0.010s} 145. Kb2 {-0.60/4 0.031s}
Kc6 {+1.00/5 0.020s} 146. Be3 {-0.54/4 0.024s} Be7 {+1.00/5 0.017s}
147. Kc2 {-0.62/4 0.028s} Kd7 {+1.00/5 0.020s} 148. Rh5 {-0.62/4 0.037s}
Ke8 {+1.00/5 0.025s} 149. Bd2 {-0.57/4 0.021s} Bf8 {+1.00/5 0.019s}
150. Rh2 {-0.57/4 0.014s} Bg7 {+1.00/5 0.015s} 151. Be1 {-0.54/4 0.019s}
Bf8 {+1.00/5 0.042s} 152. Ba5 {-0.57/4 0.014s} Bg7 {+1.00/5 0.015s}
153. Be1 {-0.54/4 0.017s} Kd7 {+1.00/5 0.014s} 154. Ba5 {-0.57/4 0.034s}
Kc6 {+1.00/5 0.017s} 155. Kd2 {-0.57/4 0.026s} d5 {+1.00/5 0.017s}
156. cxd5+ {-0.54/4 0.028s} Kxd5 {-1.00/6 0.032s} 157. Rh4 {-0.40/4 0.028s}
Kc6 {+1.00/5 0.030s} 158. Kc2 {-0.54/4 0.041s} Kb5 {-1.00/4 0.010s}
159. Bc3 {-0.60/4 0.030s} Bf6 {+1.00/5 0.020s} 160. Rh6 {-0.54/4 0.039s}
Bg7 {+1.00/5 0.021s} 161. Rh4 {-0.54/4 0.027s} Kc6 {-1.00/4 0.037s}
162. Rxa4 {-0.28/4 0.044s} Rxh7 {0.00/5 0.022s} 163. Ra7 {-0.34/4 0.040s}
Kb6 {0.00/5 0.026s} 164. Ra8 {-0.37/4 0.025s} Kb7 {0.00/5 0.028s}
165. Ra5 {-0.37/4 0.032s} Rh2+ {0.00/5 0.021s} 166. Kb3 {-0.40/4 0.006s}
Kb6 {0.00/5 0.023s} 167. Ra8 {-0.37/4 0.024s} Rh7 {0.00/5 0.032s}
168. Rd8 {-0.31/4 0.034s} Rh4 {0.00/5 0.031s} 169. Bd2 {-0.34/4 0.048s}
Rh1 {0.00/4 0.032s} 170. Rd7 {-0.31/4 0.059s} Bh8 {0.00/4 0.013s}
171. Rd6+ {-0.31/4 0.042s} Kc7 {0.00/5 0.015s} 172. Ra6 {-0.37/4 0.044s}
Rd1 {0.00/5 0.024s} 173. Ba5+ {-0.25/4 0.033s} Kd7 {0.00/5 0.010s}
174. Kc2 {-0.28/4 0.025s} Rf1 {0.00/5 0.018s} 175. Ra8 {-0.28/4 0.029s}
Rf2+ {0.00/5 0.022s} 176. Kc3 {-0.31/4 0.008s} Bg7 {-3.00/4 0.010s}
177. Ra7+ {+7.57/4 0.029s} Ke8 {-3.00/6 0.024s} 178. Rxg7 {+7.60/4 0.019s}
Ra2 {-3.00/5 0.020s} 179. Kb3 {+7.54/4 0.015s} Ra1 {-3.00/5 0.012s}
180. Kb2 {+7.71/4 0.020s} Rd1 {-3.00/5 0.016s} 181. Rg5 {+7.74/4 0.018s}
Rxd3 {-3.00/5 0.014s} 182. Rxe5+ {+7.65/4 0.026s} Kd7 {-4.00/6 0.025s}
183. Rxc5 {+8.45/4 0.026s} Kd6 {-4.00/5 0.017s} 184. Rb5 {+8.62/4 0.023s}
Ke7 {-4.00/5 0.015s} 185. a4 {+8.68/4 0.030s} Kd7 {-4.00/5 0.017s}
186. Rb6 {+8.65/4 0.042s} Rh3 {-4.00/5 0.018s} 187. Bb4 {+8.65/4 0.024s}
Rd3 {-4.00/4 0.008s} 188. Rb7+ {+8.68/4 0.024s} Ke8 {-4.00/5 0.013s}
189. Rg7 {+8.74/4 0.019s} Rd7 {-4.00/5 0.018s} 190. Rxd7 {+8.85/4 0.025s}
Kxd7 {-4.00/7 0.013s} 191. Ka3 {+8.94/4 0.003s} Kc6 {-4.00/7 0.009s}
192. Be1 {+8.85/4 0.002s} Kd5 {-4.00/7 0.008s} 193. Kb3 {+8.80/4 0.002s}
Kd6 {-4.00/7 0.014s} 194. Kc2 {+8.77/4 0.003s} Kc5 {-4.00/7 0.015s}
195. Bd2 {+8.77/4 0.002s} Kd5 {-4.00/7 0.016s} 196. Be3 {+8.80/4 0.004s}
Ke4 {-4.00/6 0.006s} 197. Bc5 {+8.77/4 0.003s} Kf5 {-4.00/6 0.006s}
198. a5 {+8.74/4 0.006s} Ke5 {-9.00/6 0.011s} 199. Kc3 {+8.88/4 0.004s}
Kd5 {-9.00/6 0.008s} 200. Bf8 {+8.82/4 0.003s} Kc6 {-4.00/6 0.006s}
201. Be7 {+8.80/4 0.002s} Kb5 {-4.00/7 0.015s} 202. Bd8 {+8.85/4 0.002s}
Ka6 {-4.00/6 0.006s} 203. Kd2 {+8.91/4 0.001s} Ka7 {-4.00/7 0.011s}
204. Bc7 {+9.00/4 0.001s} Kb7 {-4.00/7 0.013s} 205. Bb6 {+8.91/4 0.002s}
Kc8 {-4.00/7 0.013s} 206. Kc1 {+8.91/4 0.002s} Kb7 {-4.00/6 0.004s}
207. Kb2 {+8.85/4 0.001s} Ka8 {-4.00/6 0.006s} 208. a6 {+9.22/4 0s}
Kb8 {-4.00/7 0.015s} 209. Kc2 {+9.28/4 0s} Ka8 {-4.00/6 0.006s}
210. Kd2 {+9.25/4 0s} Kb8 {-4.00/7 0.016s} 211. Kd1 {+9.34/4 0s}
Ka8 {-4.00/7 0.010s} 212. Kd2 {+9.34/4 0s} Kb8 {-4.00/7 0.016s}
213. Ke1 {+9.25/4 0s} Ka8 {-4.00/6 0.004s} 214. Ke2 {+9.25/4 0s}
Kb8 {-12.00/6 0.016s} 215. Kf3 {+9.22/4 0.001s} Ka8 {-4.00/6 0.006s}
216. Be3 {+9.28/4 0s} Kb8 {-12.00/6 0.016s} 217. Bb6 {+9.11/4 0.001s}
Kc8 {-9.00/6 0.015s} 218. a7 {+8.88/4 0.001s} Kb7 {-12.00/6 0.004s}
219. Bd4 {+9.42/4 0.002s} Ka8 {-4.00/6 0.005s} 220. Ke3 {+9.14/4 0.001s}
Kb7 {-12.00/6 0.004s} 221. Ke2 {+9.40/4 0.003s} Ka8 {-4.00/6 0.005s}
222. Kd3 {+9.02/4 0.001s} Kb7 {-12.00/6 0.004s} 223. Kc2 {+9.37/4 0.003s}
Ka8 {-4.00/6 0.005s} 224. Kb1 {+9.11/4 0.001s} Kb7 {-12.00/6 0.014s}
225. Bg1 {+9.31/4 0.003s} Ka8 {-4.00/7 0.008s} 226. Bf2 {+8.91/4 0s}
Kb7 {-4.00/7 0.011s} 227. Be3 {+9.28/4 0.002s} Ka8 {-4.00/7 0.010s}
228. Kc2 {+8.94/4 0s} Kb7 {-12.00/6 0.004s} 229. Kb3 {+9.25/4 0.003s}
Ka8 {-4.00/6 0.005s} 230. Bb6 {+8.88/4 0s} Kb7 {-12.00/6 0.003s}
231. Bd4 {+9.22/4 0.002s} Ka8 {-4.00/6 0.005s} 232. Kc2 {+8.85/4 0.001s}
Kb7 {-12.00/6 0.005s} 233. Kc1 {+9.17/4 0.003s} Ka8 {-4.00/6 0.004s}
234. Bg1 {+8.82/4 0s} Kb7 {-4.00/7 0.009s} 235. Kd2 {+9.14/4 0.001s}
Ka8 {-4.00/6 0.003s} 236. Ke1 {+8.71/4 0s} Kb7 {-4.00/7 0.009s}
237. Bf2 {+9.11/4 0.001s} Ka8 {-4.00/6 0.003s} 238. Kd2 {+8.74/4 0s}
Kb7 {-12.00/6 0.003s} 239. Kd3 {+9.08/4 0.002s} Ka8 {-4.00/6 0.005s}
240. Be3 {+8.77/4 0s} Kb7 {-12.00/6 0.004s} 241. Bb6 {+9.02/4 0.002s}
Ka8 {-4.00/6 0.006s} 242. Bg1 {+8.65/4 0s} Kb7 {-12.00/6 0.003s}
243. Ke2 {+9.00/4 0.002s} Ka8 {-4.00/6 0.003s} 244. Kd3 {+8.71/4 0s}
Kb7 {-12.00/6 0.004s} 245. Kc4 {+8.97/4 0.002s} Ka8 {-4.00/6 0.003s}
246. Kd5 {+8.71/4 0.001s} Kb7 {-12.00/6 0.006s} 247. Bf2 {+8.94/4 0.002s}
Ka8 {-4.00/6 0.005s} 248. Kd6 {+8.91/4 0s} Kb7 {-12.00/6 0.003s}
249. Be3 {+8.91/4 0.002s} Ka8 {-4.00/6 0.004s} 250. Bg1 {+8.71/4 0s}
Kb7 {-12.00/6 0.002s} 251. Bd4 {+8.85/4 0.001s} Ka8 {-4.00/6 0.005s}
252. Bg1 {+8.48/4 0.001s} Kb7 {-12.00/6 0.011s} 253. Kd5 {+8.82/4 0.001s}
Ka8 {-4.00/6 0.004s} 254. Ke5 {+8.62/4 0s} Kb7 {-12.00/6 0.003s}
255. Bc5 {+8.80/4 0.002s} Ka8 {-4.00/6 0.005s} 256. Kf5 {+8.37/4 0s}
Kb7 {-12.00/6 0.005s} 257. Ke5 {+8.77/4 0.003s} Kc6 {-9.00/5 0.003s}
258. a8=Q+ {+42.91/4 0.006s} Kxc5 {-9.00/5 0.005s} 259. Qa4 {+43.08/3 0s}
Kb6 {-9.00/5 0.010s} 260. Kd6 {+43.20/3 0.001s} Kb7 {-9.00/5 0.006s}
261. Qc6+ {+43.22/4 0.004s} Ka7 {-9.00/5 0.006s} 262. Qb5 {+43.34/3 0s}
Ka8 {-99.99/5 0.002s} 263. Kc7 {+M3/3 0s} Ka7 {-99.99/3 0s}
264. Qb7# {+M1/1 0s, White mates} 1-0
[/pgn]
Monchester 1.0, chess engine playing at scholastic level: https://github.com/unserializable/monchester ("Daddy, it is gonna take your horsie!")
Tickle Monchester at: https://lichess.org/@/monchester
Guenther
Posts: 4718
Joined: Wed Oct 01, 2008 6:33 am
Location: Regensburg, Germany
Full name: Guenther Simon

Re: MinimalChess 0.2 released

Post by Guenther »

unserializable wrote: Sun Feb 21, 2021 3:33 pm
unserializable wrote: Sun Feb 14, 2021 7:31 pm ...
I used debug build of MCE because I had not yet figured out how to do release builds, but now I have and at the end of next week I will involve release build of MCE in some further testing to see whether numbers seem to match -- note that the time control that I used was 10s+0 (10 seconds per game, no increment), so any debug build slowdown could have been critical in that.
...
...
Gameplay notes

Most encountered blunders are "as advertised", except maybe the one below, where MCE 0.2.1 suddenly went 257... Kc6, allowing opponent to promote -- which it so far had smartly prevented since move 218. Seems not to be time trouble issue, as it managed to search to depth 5, so might be that prioritization of avoiding repetition draw or stalemate suddenly kicked in without a good reason.

[d]8/Pk6/8/2B1K3/8/8/8/8 b - - 78 257

Whole game:
fixed the Event header it seems it has elements problematic for the parser here.
[pgn]
[Event "Monchester 1.0.1-14-g84db4ed vs MinimalChess 0.2.1"]
[Site "dncore"]
[Date "2021.02.19"]
[Round "15"]
[White "Monchester 1.0.1-14-g84db4ed"]
[Black "MinimalChess 0.2.1"]
[Result "1-0"]
[ECO "C60"]
[GameDuration "00:00:18"]
[GameEndTime "2021-02-19T19:57:41.872 EET"]
[GameStartTime "2021-02-19T19:57:22.914 EET"]
[Opening "Ruy Lopez"]
[PlyCount "527"]
[TimeControl "10"]
[Variation "Cozio defense, Paulsen Variation"]

1. e4 {book} e5 {book} 2. Nf3 {book} Nc6 {book} 3. Bb5 {book} Nge7 {book}
4. Nc3 {book} g6 {book} 5. Bxc6 {+1.45/4 0.10s} Nxc6 {-1.00/6 0.11s}
6. Nd5 {+1.17/4 0.080s} Bd6 {+1.00/5 0.054s} 7. O-O {+1.28/4 0.089s}
Bc5 {+1.00/5 0.25s} 8. Qe2 {+1.20/4 0.11s} a5 {+1.00/5 0.075s}
9. Qc4 {+1.17/4 0.16s} Ba7 {+1.00/5 0.083s} 10. Rd1 {+1.20/4 0.14s}
d6 {+2.00/5 0.083s} 11. Qf1 {-6.54/4 0.20s} Bg4 {+1.00/5 0.11s}
12. h3 {-0.88/4 0.17s} Bxf3 {+1.00/5 0.098s} 13. gxf3 {-0.97/4 0.14s}
Nd4 {0.00/6 0.20s} 14. Qd3 {-1.22/4 0.11s} c6 {+1.00/5 0.071s}
15. Nc3 {-1.08/4 0.14s} Qf6 {+2.00/5 0.059s} 16. b3 {-1.62/4 0.11s}
Nxf3+ {+4.00/5 0.061s} 17. Kg2 {-10.37/4 0.023s} Nh4+ {+4.00/5 0.053s}
18. Kh1 {-44.85/4 0.028s} Qxf2 {+5.00/5 0.22s} 19. Qe2 {-11.31/4 0.17s}
Qf6 {+3.00/5 0.18s} 20. Rb1 {-2.71/4 0.14s} Qf4 {+3.00/5 0.087s}
21. d3 {-2.42/4 0.17s} Qg3 {+3.00/5 0.11s} 22. Qg4 {-2.48/4 0.21s}
Qf2 {+5.00/5 0.16s} 23. Bd2 {-10.17/4 0.24s} h5 {+5.00/5 0.14s}
24. Qe2 {-11.25/4 0.24s} Qd4 {+3.00/5 0.16s} 25. Bg5 {-3.25/4 0.16s}
Qxc3 {+3.00/5 0.10s} 26. Bxh4 {-3.02/4 0.16s} Rg8 {+3.00/5 0.12s}
27. Be1 {-2.57/4 0.13s} Qc5 {+3.00/5 0.083s} 28. Qg2 {-2.65/4 0.11s}
Bb8 {+3.00/5 0.079s} 29. Qe2 {-2.77/4 0.10s} Kf8 {+3.00/5 0.058s}
30. Qd2 {-2.60/4 0.087s} Kg7 {+3.00/5 0.043s} 31. Bf2 {-2.60/4 0.089s}
Qa3 {+3.00/5 0.078s} 32. c4 {-2.80/4 0.11s} Rd8 {+3.00/5 0.075s}
33. Bb6 {-2.71/4 0.12s} Rd7 {+3.00/5 0.092s} 34. Be3 {-2.65/4 0.11s}
Kg8 {+3.00/5 0.052s} 35. Qc2 {-2.71/4 0.10s} Kg7 {+3.00/5 0.057s}
36. Qb2 {-2.65/4 0.099s} Qxb2 {+2.00/5 0.069s} 37. Rxb2 {-2.31/4 0.075s}
f5 {+2.00/5 0.17s} 38. exf5 {-2.14/4 0.070s} gxf5 {+1.00/6 0.12s}
39. Rg1+ {-2.31/4 0.061s} Kf7 {+1.00/6 0.13s} 40. Rf2 {-2.31/4 0.068s}
f4 {+1.00/6 0.12s} 41. Rg5 {-2.28/4 0.064s} h4 {+2.00/5 0.047s}
42. Rg4 {-2.31/4 0.049s} Ke7 {+2.00/5 0.045s} 43. Rg7+ {-1.88/4 0.048s}
Ke6 {0.00/6 0.056s} 44. Rxd7 {-2.37/4 0.053s} Kxd7 {+1.00/6 0.063s}
45. Bc1 {-2.37/4 0.021s} c5 {+1.00/6 0.081s} 46. Bd2 {-2.31/4 0.021s}
Bc7 {+1.00/6 0.058s} 47. Rg2 {-2.34/4 0.026s} Ke6 {+1.00/6 0.094s}
48. Rg7 {-2.00/4 0.036s} Rc8 {+2.00/5 0.14s} 49. Rh7 {-2.22/4 0.035s}
f3 {+1.00/5 0.039s} 50. Rxh4 {-1.42/4 0.024s} Ra8 {0.00/6 0.13s}
51. Rh6+ {-1.28/4 0.036s} Kf5 {+1.00/7 0.11s} 52. Bc1 {-1.31/4 0.028s}
Re8 {0.00/6 0.087s} 53. Rh5+ {-1.17/4 0.025s} Ke6 {0.00/6 0.13s}
54. Rh7 {-1.22/4 0.028s} Re7 {0.00/6 0.041s} 55. Rh6+ {-1.34/4 0.021s}
Kf5 {+1.00/7 0.10s} 56. Rh8 {-1.28/4 0.016s} Rf7 {0.00/6 0.11s}
57. Rg8 {-1.22/4 0.026s} f2 {+4.00/5 0.031s} 58. Kg2 {-17.37/4 0.037s}
b5 {+1.00/5 0.030s} 59. Kxf2 {-0.68/4 0.050s} Ke6+ {0.00/5 0.032s}
60. Kg2 {-0.31/4 0.013s} bxc4 {0.00/5 0.036s} 61. bxc4 {-0.28/4 0.056s}
Rh7 {+1.00/5 0.027s} 62. Ra8 {-0.54/4 0.039s} Kf7 {+1.00/5 0.12s}
63. Rc8 {-0.54/4 0.031s} Ke6 {+1.00/5 0.037s} 64. Kh2 {-0.54/4 0.032s}
Kd7 {-1.00/6 0.099s} 65. Rg8 {-0.57/4 0.022s} Bd8 {+1.00/5 0.023s}
66. Bd2 {-0.57/4 0.036s} Bb6 {+1.00/5 0.036s} 67. a3 {-0.54/4 0.047s}
Kc7 {+1.00/5 0.032s} 68. Be3 {-0.54/4 0.032s} Kd7 {-1.00/6 0.096s}
69. Kg2 {-0.57/4 0.039s} Bd8 {+1.00/5 0.022s} 70. Bf2 {-0.60/4 0.046s}
Bb6 {+1.00/5 0.029s} 71. Be1 {-0.60/4 0.037s} Bc7 {+1.00/5 0.027s}
72. Kh2 {-0.60/4 0.033s} Rh5 {+1.00/5 0.030s} 73. Rg6 {-0.54/4 0.028s}
Kc6 {-1.00/6 0.098s} 74. h4 {-0.57/4 0.021s} Rh7 {-1.00/6 0.075s}
75. Bg3 {-0.60/4 0.023s} Rh5 {-1.00/6 0.068s} 76. Rg5 {-0.57/4 0.012s}
Rh8 {-1.00/6 0.062s} 77. Rg6 {-0.57/4 0.019s} Kb6 {+1.00/5 0.026s}
78. Kh3 {-0.60/4 0.023s} Kb7 {-1.00/6 0.087s} 79. Rg7 {-0.62/4 0.033s}
Kb8 {-1.00/6 0.066s} 80. Be1 {-0.60/4 0.028s} Bb6 {-1.00/6 0.089s}
81. Rg6 {-0.54/4 0.031s} Bc7 {+1.00/5 0.090s} 82. Bc3 {-0.57/4 0.028s}
Ka8 {+1.00/5 0.088s} 83. Be1 {-0.57/4 0.037s} Ka7 {+1.00/5 0.027s}
84. Rg7 {-0.54/4 0.035s} Kb8 {-1.00/6 0.071s} 85. Rg6 {-0.60/4 0.028s}
a4 {+1.00/5 0.021s} 86. Re6 {-0.57/4 0.031s} Rh5 {+1.00/5 0.021s}
87. Kg4 {-0.54/4 0.015s} Rh8 {-1.00/6 0.075s} 88. Kg3 {-0.57/4 0.021s}
Ka8 {+1.00/5 0.023s} 89. Kf3 {-0.54/4 0.024s} Kb8 {+1.00/5 0.026s}
90. Rf6 {-0.57/4 0.030s} Kc8 {+1.00/5 0.020s} 91. Kg2 {-0.54/4 0.028s}
Kb7 {+1.00/5 0.030s} 92. Kg1 {-0.60/4 0.052s} Ka8 {+1.00/5 0.032s}
93. Kf1 {-0.57/4 0.031s} Ka7 {+1.00/5 0.030s} 94. Rf7 {-0.57/4 0.038s}
Kb6 {+1.00/5 0.022s} 95. Rg7 {-0.60/4 0.033s} Bb8 {+1.00/5 0.020s}
96. Kg1 {-0.54/4 0.029s} Ba7 {-1.00/6 0.061s} 97. Bf2 {-0.57/4 0.028s}
Bb8 {+1.00/5 0.020s} 98. Rg6 {-0.57/4 0.027s} Kc6 {+1.00/5 0.020s}
99. Be1 {-0.60/4 0.021s} Kb6 {+1.00/5 0.018s} 100. Rf6 {-0.57/4 0.027s}
Bc7 {+1.00/5 0.019s} 101. Kh1 {-0.57/4 0.026s} Kc6 {+1.00/5 0.020s}
102. Rf5 {-0.62/4 0.025s} Bd8 {+1.00/5 0.021s} 103. h5 {-0.71/4 0.027s}
Rh6 {+1.00/5 0.026s} 104. Kg1 {-0.65/4 0.023s} Kd7 {+1.00/5 0.026s}
105. Bd2 {-0.57/4 0.029s} Rh7 {+1.00/5 0.026s} 106. h6 {-0.62/4 0.033s}
Ke8 {+1.00/5 0.027s} 107. Rf3 {-0.60/4 0.025s} Rh8 {+1.00/5 0.021s}
108. Kf2 {-0.60/4 0.020s} Be7 {+1.00/5 0.019s} 109. Kf1 {-0.65/4 0.019s}
Kd7 {+1.00/5 0.022s} 110. Rf2 {-0.62/4 0.035s} Rb8 {+1.00/5 0.025s}
111. h7 {-0.54/4 0.044s} Rd8 {+1.00/5 0.035s} 112. Ke2 {-0.54/4 0.037s}
Ra8 {+1.00/5 0.025s} 113. Bc1 {-0.54/4 0.060s} Rh8 {+1.00/5 0.024s}
114. Rh2 {-0.60/4 0.038s} Ke8 {+1.00/5 0.020s} 115. Kf2 {-0.57/4 0.019s}
Bd8 {+1.00/5 0.023s} 116. Ke2 {-0.57/4 0.024s} Bf6 {+1.00/5 0.063s}
117. Kd1 {-0.57/4 0.028s} Kd7 {+1.00/5 0.018s} 118. Rh5 {-0.60/4 0.039s}
Kd8 {+1.00/5 0.024s} 119. Kc2 {-0.57/4 0.019s} Ke8 {+1.00/5 0.060s}
120. Kd1 {-0.57/4 0.018s} Bg7 {+1.00/5 0.018s} 121. Rh2 {-0.54/4 0.014s}
Bf8 {+1.00/5 0.058s} 122. Be3 {-0.54/4 0.014s} Bg7 {+1.00/5 0.015s}
123. Kc2 {-0.57/4 0.022s} Bf6 {+1.00/5 0.017s} 124. Rh6 {-0.57/4 0.026s}
Kf7 {+1.00/5 0.023s} 125. Kc1 {-0.57/4 0.033s} Ke7 {+1.00/5 0.021s}
126. Kc2 {-0.54/4 0.024s} Bg7 {-1.00/4 0.018s} 127. Rh2 {-0.57/4 0.046s}
Bf6 {+1.00/5 0.025s} 128. Bc1 {-0.60/4 0.044s} Ke8 {+1.00/5 0.019s}
129. Bd2 {-0.57/4 0.024s} Ke7 {+1.00/5 0.020s} 130. Rh6 {-0.54/4 0.036s}
Kf7 {+1.00/5 0.017s} 131. Rh1 {-0.54/4 0.032s} Ke8 {+1.00/5 0.017s}
132. Rh5 {-0.57/4 0.028s} Bg7 {+1.00/5 0.023s} 133. Bc3 {-0.57/4 0.020s}
Ke7 {+1.00/5 0.016s} 134. Rh1 {-0.62/4 0.032s} Ke6 {+1.00/5 0.018s}
135. Ba5 {-0.54/4 0.035s} Ke7 {+1.00/5 0.021s} 136. Rh3 {-0.57/4 0.041s}
Ke8 {+1.00/5 0.019s} 137. Kc1 {-0.57/4 0.015s} Bf8 {+1.00/5 0.049s}
138. Bd2 {-0.57/4 0.010s} Kd7 {+1.00/5 0.015s} 139. Kb2 {-0.60/4 0.015s}
Bg7 {+1.00/5 0.017s} 140. Kc2 {-0.60/4 0.031s} Kc8 {+1.00/5 0.020s}
141. Rh1 {-0.54/4 0.023s} Bf6 {+1.00/5 0.016s} 142. Rh6 {-0.54/4 0.035s}
Be7 {+1.00/5 0.018s} 143. Bc3 {-0.57/4 0.028s} Kd7 {+1.00/5 0.018s}
144. Bd2 {-0.57/4 0.035s} Bd8 {-1.00/4 0.010s} 145. Kb2 {-0.60/4 0.031s}
Kc6 {+1.00/5 0.020s} 146. Be3 {-0.54/4 0.024s} Be7 {+1.00/5 0.017s}
147. Kc2 {-0.62/4 0.028s} Kd7 {+1.00/5 0.020s} 148. Rh5 {-0.62/4 0.037s}
Ke8 {+1.00/5 0.025s} 149. Bd2 {-0.57/4 0.021s} Bf8 {+1.00/5 0.019s}
150. Rh2 {-0.57/4 0.014s} Bg7 {+1.00/5 0.015s} 151. Be1 {-0.54/4 0.019s}
Bf8 {+1.00/5 0.042s} 152. Ba5 {-0.57/4 0.014s} Bg7 {+1.00/5 0.015s}
153. Be1 {-0.54/4 0.017s} Kd7 {+1.00/5 0.014s} 154. Ba5 {-0.57/4 0.034s}
Kc6 {+1.00/5 0.017s} 155. Kd2 {-0.57/4 0.026s} d5 {+1.00/5 0.017s}
156. cxd5+ {-0.54/4 0.028s} Kxd5 {-1.00/6 0.032s} 157. Rh4 {-0.40/4 0.028s}
Kc6 {+1.00/5 0.030s} 158. Kc2 {-0.54/4 0.041s} Kb5 {-1.00/4 0.010s}
159. Bc3 {-0.60/4 0.030s} Bf6 {+1.00/5 0.020s} 160. Rh6 {-0.54/4 0.039s}
Bg7 {+1.00/5 0.021s} 161. Rh4 {-0.54/4 0.027s} Kc6 {-1.00/4 0.037s}
162. Rxa4 {-0.28/4 0.044s} Rxh7 {0.00/5 0.022s} 163. Ra7 {-0.34/4 0.040s}
Kb6 {0.00/5 0.026s} 164. Ra8 {-0.37/4 0.025s} Kb7 {0.00/5 0.028s}
165. Ra5 {-0.37/4 0.032s} Rh2+ {0.00/5 0.021s} 166. Kb3 {-0.40/4 0.006s}
Kb6 {0.00/5 0.023s} 167. Ra8 {-0.37/4 0.024s} Rh7 {0.00/5 0.032s}
168. Rd8 {-0.31/4 0.034s} Rh4 {0.00/5 0.031s} 169. Bd2 {-0.34/4 0.048s}
Rh1 {0.00/4 0.032s} 170. Rd7 {-0.31/4 0.059s} Bh8 {0.00/4 0.013s}
171. Rd6+ {-0.31/4 0.042s} Kc7 {0.00/5 0.015s} 172. Ra6 {-0.37/4 0.044s}
Rd1 {0.00/5 0.024s} 173. Ba5+ {-0.25/4 0.033s} Kd7 {0.00/5 0.010s}
174. Kc2 {-0.28/4 0.025s} Rf1 {0.00/5 0.018s} 175. Ra8 {-0.28/4 0.029s}
Rf2+ {0.00/5 0.022s} 176. Kc3 {-0.31/4 0.008s} Bg7 {-3.00/4 0.010s}
177. Ra7+ {+7.57/4 0.029s} Ke8 {-3.00/6 0.024s} 178. Rxg7 {+7.60/4 0.019s}
Ra2 {-3.00/5 0.020s} 179. Kb3 {+7.54/4 0.015s} Ra1 {-3.00/5 0.012s}
180. Kb2 {+7.71/4 0.020s} Rd1 {-3.00/5 0.016s} 181. Rg5 {+7.74/4 0.018s}
Rxd3 {-3.00/5 0.014s} 182. Rxe5+ {+7.65/4 0.026s} Kd7 {-4.00/6 0.025s}
183. Rxc5 {+8.45/4 0.026s} Kd6 {-4.00/5 0.017s} 184. Rb5 {+8.62/4 0.023s}
Ke7 {-4.00/5 0.015s} 185. a4 {+8.68/4 0.030s} Kd7 {-4.00/5 0.017s}
186. Rb6 {+8.65/4 0.042s} Rh3 {-4.00/5 0.018s} 187. Bb4 {+8.65/4 0.024s}
Rd3 {-4.00/4 0.008s} 188. Rb7+ {+8.68/4 0.024s} Ke8 {-4.00/5 0.013s}
189. Rg7 {+8.74/4 0.019s} Rd7 {-4.00/5 0.018s} 190. Rxd7 {+8.85/4 0.025s}
Kxd7 {-4.00/7 0.013s} 191. Ka3 {+8.94/4 0.003s} Kc6 {-4.00/7 0.009s}
192. Be1 {+8.85/4 0.002s} Kd5 {-4.00/7 0.008s} 193. Kb3 {+8.80/4 0.002s}
Kd6 {-4.00/7 0.014s} 194. Kc2 {+8.77/4 0.003s} Kc5 {-4.00/7 0.015s}
195. Bd2 {+8.77/4 0.002s} Kd5 {-4.00/7 0.016s} 196. Be3 {+8.80/4 0.004s}
Ke4 {-4.00/6 0.006s} 197. Bc5 {+8.77/4 0.003s} Kf5 {-4.00/6 0.006s}
198. a5 {+8.74/4 0.006s} Ke5 {-9.00/6 0.011s} 199. Kc3 {+8.88/4 0.004s}
Kd5 {-9.00/6 0.008s} 200. Bf8 {+8.82/4 0.003s} Kc6 {-4.00/6 0.006s}
201. Be7 {+8.80/4 0.002s} Kb5 {-4.00/7 0.015s} 202. Bd8 {+8.85/4 0.002s}
Ka6 {-4.00/6 0.006s} 203. Kd2 {+8.91/4 0.001s} Ka7 {-4.00/7 0.011s}
204. Bc7 {+9.00/4 0.001s} Kb7 {-4.00/7 0.013s} 205. Bb6 {+8.91/4 0.002s}
Kc8 {-4.00/7 0.013s} 206. Kc1 {+8.91/4 0.002s} Kb7 {-4.00/6 0.004s}
207. Kb2 {+8.85/4 0.001s} Ka8 {-4.00/6 0.006s} 208. a6 {+9.22/4 0s}
Kb8 {-4.00/7 0.015s} 209. Kc2 {+9.28/4 0s} Ka8 {-4.00/6 0.006s}
210. Kd2 {+9.25/4 0s} Kb8 {-4.00/7 0.016s} 211. Kd1 {+9.34/4 0s}
Ka8 {-4.00/7 0.010s} 212. Kd2 {+9.34/4 0s} Kb8 {-4.00/7 0.016s}
213. Ke1 {+9.25/4 0s} Ka8 {-4.00/6 0.004s} 214. Ke2 {+9.25/4 0s}
Kb8 {-12.00/6 0.016s} 215. Kf3 {+9.22/4 0.001s} Ka8 {-4.00/6 0.006s}
216. Be3 {+9.28/4 0s} Kb8 {-12.00/6 0.016s} 217. Bb6 {+9.11/4 0.001s}
Kc8 {-9.00/6 0.015s} 218. a7 {+8.88/4 0.001s} Kb7 {-12.00/6 0.004s}
219. Bd4 {+9.42/4 0.002s} Ka8 {-4.00/6 0.005s} 220. Ke3 {+9.14/4 0.001s}
Kb7 {-12.00/6 0.004s} 221. Ke2 {+9.40/4 0.003s} Ka8 {-4.00/6 0.005s}
222. Kd3 {+9.02/4 0.001s} Kb7 {-12.00/6 0.004s} 223. Kc2 {+9.37/4 0.003s}
Ka8 {-4.00/6 0.005s} 224. Kb1 {+9.11/4 0.001s} Kb7 {-12.00/6 0.014s}
225. Bg1 {+9.31/4 0.003s} Ka8 {-4.00/7 0.008s} 226. Bf2 {+8.91/4 0s}
Kb7 {-4.00/7 0.011s} 227. Be3 {+9.28/4 0.002s} Ka8 {-4.00/7 0.010s}
228. Kc2 {+8.94/4 0s} Kb7 {-12.00/6 0.004s} 229. Kb3 {+9.25/4 0.003s}
Ka8 {-4.00/6 0.005s} 230. Bb6 {+8.88/4 0s} Kb7 {-12.00/6 0.003s}
231. Bd4 {+9.22/4 0.002s} Ka8 {-4.00/6 0.005s} 232. Kc2 {+8.85/4 0.001s}
Kb7 {-12.00/6 0.005s} 233. Kc1 {+9.17/4 0.003s} Ka8 {-4.00/6 0.004s}
234. Bg1 {+8.82/4 0s} Kb7 {-4.00/7 0.009s} 235. Kd2 {+9.14/4 0.001s}
Ka8 {-4.00/6 0.003s} 236. Ke1 {+8.71/4 0s} Kb7 {-4.00/7 0.009s}
237. Bf2 {+9.11/4 0.001s} Ka8 {-4.00/6 0.003s} 238. Kd2 {+8.74/4 0s}
Kb7 {-12.00/6 0.003s} 239. Kd3 {+9.08/4 0.002s} Ka8 {-4.00/6 0.005s}
240. Be3 {+8.77/4 0s} Kb7 {-12.00/6 0.004s} 241. Bb6 {+9.02/4 0.002s}
Ka8 {-4.00/6 0.006s} 242. Bg1 {+8.65/4 0s} Kb7 {-12.00/6 0.003s}
243. Ke2 {+9.00/4 0.002s} Ka8 {-4.00/6 0.003s} 244. Kd3 {+8.71/4 0s}
Kb7 {-12.00/6 0.004s} 245. Kc4 {+8.97/4 0.002s} Ka8 {-4.00/6 0.003s}
246. Kd5 {+8.71/4 0.001s} Kb7 {-12.00/6 0.006s} 247. Bf2 {+8.94/4 0.002s}
Ka8 {-4.00/6 0.005s} 248. Kd6 {+8.91/4 0s} Kb7 {-12.00/6 0.003s}
249. Be3 {+8.91/4 0.002s} Ka8 {-4.00/6 0.004s} 250. Bg1 {+8.71/4 0s}
Kb7 {-12.00/6 0.002s} 251. Bd4 {+8.85/4 0.001s} Ka8 {-4.00/6 0.005s}
252. Bg1 {+8.48/4 0.001s} Kb7 {-12.00/6 0.011s} 253. Kd5 {+8.82/4 0.001s}
Ka8 {-4.00/6 0.004s} 254. Ke5 {+8.62/4 0s} Kb7 {-12.00/6 0.003s}
255. Bc5 {+8.80/4 0.002s} Ka8 {-4.00/6 0.005s} 256. Kf5 {+8.37/4 0s}
Kb7 {-12.00/6 0.005s} 257. Ke5 {+8.77/4 0.003s} Kc6 {-9.00/5 0.003s}
258. a8=Q+ {+42.91/4 0.006s} Kxc5 {-9.00/5 0.005s} 259. Qa4 {+43.08/3 0s}
Kb6 {-9.00/5 0.010s} 260. Kd6 {+43.20/3 0.001s} Kb7 {-9.00/5 0.006s}
261. Qc6+ {+43.22/4 0.004s} Ka7 {-9.00/5 0.006s} 262. Qb5 {+43.34/3 0s}
Ka8 {-99.99/5 0.002s} 263. Kc7 {+M3/3 0s} Ka7 {-99.99/3 0s}
264. Qb7# {+M1/1 0s, White mates} 1-0
[/pgn]
https://rwbc-chess.de

[Trolls n'existent pas...]
User avatar
lithander
Posts: 915
Joined: Sun Dec 27, 2020 2:40 am
Location: Bremen, Germany
Full name: Thomas Jahn

Re: MinimalChess 0.2 released

Post by lithander »

I'm sorry for the late reply. I got so reliant on the notification system that I missed your response just because you weren't quoting me. :oops:
unserializable wrote: Sun Feb 21, 2021 3:33 pm Congrats on starting off at the very symbolic 666th place on CCRL 404 :mrgreen:.
If you can't make it to the 1st place (yet) I think this is the 2nd best ranking spot you can achieve. :twisted: I'm going to stop chess programming now!
unserializable wrote: Sun Feb 21, 2021 3:33 pm There is mismatch between version printed at startup and reported as UCI id
Ups. I'm going to define a 'VERSION' variable in the future so that kinda thing never happens again. Thanks for spotting it!
unserializable wrote: Sun Feb 21, 2021 3:33 pm When pipe input ends or end of file is received (Ctrl+D on Linux and IIRC Ctrl+Z on Windows), crash occurs.
Ctrl-C just quits the program without a crash on Windows. But the Callstack you provided should allow me to fix it in the next version. I might write you a PM then to ask you to confirm that fix! :)

Speaking of the release of a potential version 0.3 should I make a new thread or should I trust people interested in Minimal Chess to read new posts in this thread? What's the preferred way of updating the community without polluting the forum with new threads?
unserializable wrote: Sun Feb 21, 2021 3:33 pm Most encountered blunders are "as advertised", except maybe the one below, where MCE 0.2.1 suddenly went 257... Kc6, allowing opponent to promote -- which it so far had smartly prevented since move 218.
Starting a fresh instance of MMC on that position it would move 'b7a8' again. An early version of MMC often ended games in a draw through the threefold repetition rule. So I forbade it to repeat positions that had been previously encountered. So when MMC or it's opponent fails to convert an endgame and the history gets longer and longer after a while MMC will starts to blunder because all good moves would lead into the repetition of a previous position.
unserializable wrote: Sun Feb 21, 2021 3:33 pm Compared with debug build, I saw match score percentages against Monchester almost exactly reversed when using release build. Excellent stability on Linux, no time losses, no illegal moves, memory usage stably hovering at 16-17 MB. Performed 10724 10s+0 games in total -- 5000 (XBoard 4.9.1, no opening book) + 2000 (CuteChess GUI 1.2.0, no opening book) + 2724 (CuteChess GUI 1.2.0, UHO 2.0 opening book) + 1000 (CuteChess CLI 1.2.0, no opening book). Scores were around 80:20 for MCE 0.2.1 on CC GUI/CLI and 70:30 on XBoard.
Receiving such a favorable review on my first release is very encouraging! Thanks! :)
Also, thanks for running such extensive tests and spotting above issues.

For the 16-17MB you gotta credit the .NET garbage collector which is just incredibly good. Each position I explore is created via

Code: Select all

new Board(oldPosition, move)
and writing code that reuses the same instance(s) instead is not faster than letting the GC figure that out. Also my moves are generated into new List<Move> instances each time because calling Clear() on an existing list to reuse it is actually slower then just asking the runtime for a fresh one...
But beware, while allocations like that are fine in .NET, if you write C# for the Unity game engine, which still uses a Mono-based backend with the most crappy GC that could possibly be written (it's not even incremental and it runs on the main thread, delaying normal program flow for several milliseconds in big projects!!) then you pay a hefty price for writing what is otherwise considered best practice C# code.
Minimal Chess (simple, open source, C#) - Youtube & Github
Leorik (competitive, in active development, C#) - Github & Lichess
Sven
Posts: 4052
Joined: Thu May 15, 2008 9:57 pm
Location: Berlin, Germany
Full name: Sven Schüle

Re: MinimalChess 0.2 released

Post by Sven »

Why is clearing a list so slow? Shouldn't it just reset the size to 0 but leave the contents untouched since everything still hanging around beyond the current size can be considered as irrelevant?
Sven Schüle (engine author: Jumbo, KnockOut, Surprise)