From 681923bd1273a2355dc086a9c643451ca2915850 Mon Sep 17 00:00:00 2001 From: H.G. Muller Date: Wed, 15 Feb 2012 10:29:12 +0100 Subject: [PATCH] Add tournament-manager description to 4.6.0 pages --- whats_new/4.6.0/TM.html | 306 +++++++++++++++++++++++++++++++++++++++++++ whats_new/4.6.0/Tourney.png | Bin 16890 -> 17235 bytes whats_new/4.6.0/index.html | 2 +- 3 files changed, 307 insertions(+), 1 deletions(-) create mode 100644 whats_new/4.6.0/TM.html diff --git a/whats_new/4.6.0/TM.html b/whats_new/4.6.0/TM.html new file mode 100644 index 0000000..277c994 --- /dev/null +++ b/whats_new/4.6.0/TM.html @@ -0,0 +1,306 @@ + +XBoard - Tournament manager + + + + +

XBoard tourney-manager function

+

+XBoard now has a built-in tournament manager, +that can be used to make it play engine tournaments with more than two participants. +To run such a tourney, XBoard will have to create a 'tournament file'. +This can be done through the Match Options dialog. +The tournament file is a special type of settings file, +which contains all option settings needed to specify the tournament: +the list of partcipating engines, the tournament type +(round-robin, (multi-)gauntlet or Swiss), +the number of games per pairing, the number of cycles, etc. +This information is put in a file, rather than kept in XBoard's memory, for two reasons: +so that you can easily resume the tournament should it get somehow interrupted, +and to share it between different XBoards playing games in parallel for the same tourney. +

+For the rest a tournament behaves just like XBoard -matchMode. +In fact it is just a special kind of match, +where not all games are between the same two engines that you started with, +but where new players can be selected before each game, +and the tournament file tells XBoard how to do that. +

+All the tourney parameters that are kept in the tourney file +can in principle also be specified from the command line, through options, +but that still would not cause XBoard to run a tourney. +It is realy essential that XBoard has a tournament file for that, +because it uses the latter also for recording the progress of the tourney: +which games have already been played (and how they ended), +and which games are currently in progress. +With the aid of this information, XBoard will be able to resume a tourney that has been interrupted (by quitting XBoard). +It only requires re-starting XBoard with the existing tournament file: +

+xbooard -mm -tf MyTourney.trn
+
+This will make XBoard pick up where it left off. +XBoard is installed in such a way that the above command is automatically issued +whenever you double-click a tourney file. +

+This design makes it also possible to have multiple instances of XBoard work on playing the tourney games. +E.g. when you have a quad-core computer, and you are playing single-CPU engines in ponder-off games, +one core is enough to completely handle a single game, so that you can run four games simultaneously. +By starting multiple instances of XBoard with the same tourney file, +these instances will then cooperate on completing the tourney. +Each one will 'grab' a game from the tourney file that has not yet been played and is not in progress, +mark it as being in progress, and starts playing it. +When that game then finishes, The XBoard instance that had been playing it +will replace the "in-progress" mark in the tourney file by the game result, +and grab the next game that has not had any attention yet. +This continues until the entire tourney is done. +(Note there are options to delay starting games from a new round or cycle +until the previous one has been completed.) +

+

+An XBoard tournament is organized as a number of cycles, +where each cycle is a complete repetition of the previous one. +The cycle is sub-divided into rounds, where each player plays a single other one. +A round consists of a number of pairings, where one player plays one other. +A pairing, finally, consists of a number of consecutively played games between the same players. +So you can, for instance, do a 5-cycle round-robin with 8 players and two games per pairing. +Players will then play two consecutive games against each other (with reversed colors) +before the next pairing, with two other players, will start. +After 4 such pairings (8 games) every player will have played two games against one opponent, +and a round is completed. +After 7 such rounds, everyone has played everyone, which completes one tourney cycle. +This will then be repeated 5 times, so that in the end everyone will have played everyone else 10 times. +

+

New command-line options

+

+To specify the tourney, some new command-line options have been defined in XBoard. +Normally the user will not be exposed to these at all, +as they are purely designed for storing the corresponding settings in the tournament files. +They would not even be stored in the normal settings file (i.e. they are volatile options). +New options are -participants, (which holds a list of engines, one per line), +-tourneyType, -tourneyCycles, and -results. +The latter specifies which games have already been played, as a string of +-=* characters, +where an asterisk signifies the game is currently in progress. +The -tourneyType can be 0 for a round-robin, an integer N > 0 for (multi-)gauntlets, +(where the first N participants of the list each play all others), +or -1 for Swiss. +(The Swiss needs an external pairing engine; more about that later.) +

+
+

+The previously existing option -defaultMatchGames is used to indicate the number of games per pairing, +so that the total number of games per pairing will be the product of the value of -defaultMatchGames and -tourneyCycles. +The -loadGameFile and -loadPositionFile, and the corresponding index specification +-loadGameIndex, -loadPositionIndex and -rewindIndex are used during the games of a pairing +in the same way as they would be used in a simple match between two engines, +and are also specified in the tourney file. +

+

Setting up a tournament from the menu

+

+To start a tourney you can start XBoard with or without engine, +and summon the Match Options dialog from the Options menu. +There the most important thing you should do is specify a tournament file. +If the file you specify already existed, (e.g. by using the browse button for it), it is all you have to specify, +as all other settings will then be taken from that file. +(This is what you would do to resume an interrupted tourney, or add a playing agent to an existing one.) +If the file did not exist yet, it will be created as soon as you OK the dialog, +but you have to complete the other parameters in the dialog first. +XBoard is by default configured to propose a non-existing file, by deriving a name from the date and time. +Unless you want the name to be more easily recognizable for later reference, you can accept that one. +

+So usually you will start picking the participants, +and a combobox in the dialog allows you to pick any installed engine as often as you want. +The engines you select this way will be added to the displayed partcipants list. +Note this participants list is a normal text edit, +so that you can delete engines to correct mistakes, +shuffle the order, etc. +(Do not type the name of non-installed engines there, or change the names, though: +they will then not be recognized!) +After 'OK' all the settings will be written on the specified tourney file, +with -results last, (automatically set to an empty string, +to indicate none of the games has been played yet), +and XBoard will then switch to match mode to run the tourney. +

+Games played during the tourney will be saved as usual on the -saveGameFile, +depending on your option settings for this. +You don't have to save the PGN, if you don't want to. +

+
+ +
+ +
+
+-participants {glaurung
+Fruit 2.1
+Fairy-Max 4.8
+Crafty 20.14
+}
+-tourneyType 0
+-tourneyCycles 1
+-defaultMatchGames 2
+-syncAfterRound true
+-syncAfterCycle true
+-saveGameFile "tm.pgn"
+-loadGameFile ""
+-loadGameIndex 0
+-loadPositionFile ""
+-loadPositionIndex 1
+-rewindIndex 0
+-results "=-+*"
+
+
+

+To the left you see an example of a tournament file of a (small) tourney in progress. +Three games have been played, the fourth is in progress, +as you can see in the -results string. +When another XBoard instance starts a match with this tournament file specified, +it will start playing the fifth game, +and the -results string in the tourney file would change to "=-+**". +

+

+When you would then quit the XBoard instance that is (apparently) playing game #4, +it would change the result string to

-results "=+- *"
before it exits, +indicating that game #4 is no longer in progress, but not yet played either. +The XBoard instance that is still running +(or a new one you start on this tournament file) +will then grab it the next time. +

+
+

+Note that XBoard has no windows (yet?) to show you the standings or the cross table of the tournament. +The idea is that there exist already plenty programs to generate those from the PGN file. +When you let all XBoard instances save the games they play to the same file, +(this XBoard version uses file locking to make sure this can't cause problems!), +you can use your favorite PGN-to-cross-table utility on it any time you want. +

+ +

Synchronization in concurrent play

+

+When you use multiple instances of XBoard to concurrently work on playing a tourney, +the option -syncAfterRound can be used to prevent XBoard from starting games from a new round, +when there are still unfnished games of a previous round. +XBoard will then wait until all these games are finished, +and automatically resume after that with the game of the next round it already picked. +This way you can guarantee that the rounds appear well-ordered in the PGN file. +There is a similar option -syncAfterCycle. +But as a cycle end coincides with the end of a round, this option is only meaningful when -syncAfterRound is false. +There are checkboxes near the top of the Match Options dialog where you can select if you want such synchronization, +but when you do not plan to use concurrency in playing the tourney, you can of course completely ignore them. +

+ +

Substituting participants during a tourney

+

+You can substitute one participant for another in a tourney that is already in progress. +(What you cannot do, however, is change the number of participants, +as this would mess up the entire tournament schedule.) +The Match Options dialog provides two buttons for that: Upgrade and Replace. +The way it works is this: +when you open the dialog while the tournament is playing, +(in an XBoard that is actually playing it), +you will see the list of participants and other tourney parameters of the current tourney already in their respective fields of the dialog. +All you have to do is to replace one (and not more!) of the participant names by another, +by editing the participants field. +After that, you press one of the two buttons, and that is it! +Upgrade will cause XBoard to use the new participant in stead of the old one in all future games, +while Replace would also erase all game results of the participant you replaced, +so that these games will be replayed. +This can be done while the tourney is running, there is no need to pause it in any way. +The only restriction currently is that you cannot use Replace on an engine that is currently playing +because XBoard would not know how to erase the result of the game in progress, +as it is not in yet, and another XBoard instance might be playing it. +

+Replacing one participant name by that of a new engine could be a bit tricky, +as you would have to use the exact nickname under which the engine is installed. +(XBoard performs lots of checks to see if there is a mistake there, +but it is better not to run into error popups all the time, +and having to do it again.) +The recommended way for doing this is just select the substitute from the combobox, +so that it will be added to the bottom of the list. +You can then simply use drag and drop editing to move that bottom line +to below the name of the engine you want to replace +(because the order of the engines in the list must be preserved!), +and then delete the line with the nickname of the participant to be replaced. +

+ +

Running the same tourney as before

+

+Sometimes you want to run a tourney with the same or nearly the same participants over and over again. +This occurs, for instance, when you are testing an engine under development, by playing it against a fixed set of opponents. +It would be a pain to have to pick all these oponents from the list +every time you want to repeat this gauntlet with a new version of the engine you want to test. +(The participants list could be very long!) +

+

+To solve this, a 'Clone Tourney' button is provided in the Match Options dialog. +All you have to do is select an existing tournament file (usually through the browse button), +which can be of a completed tourney. +But in stead of pressing OK after you have done that (which would attempt to resume that tourney), +you now press 'Clone Tourney'. +This copies all the parameters of the indicated tourneyfile (except the -results), +so they appear in their dialog fields. +At the same time it switches the name in the tourney-file field back to the one that was +originally proposed when you opened the dialog. +So that when you would press OK now, you would start a new tourney, +with exactly the same parameters as the cloned one. +

+

+Usually you would want to change some of the paramters first, however. +Like replacing the name of the gauntlet engine in the 'participants' field by that of the newer version. +Basicaly you can change anything you like, without restriction, +as you are really setting up a completely new and independent tourney. +The cloning was just a convenient way to quickly get some default settings for all of the parameters loaded into the dialog. +

+ +

Editing tourney files

+ +

+Although this is not recommended for a novice user, (and should also not be needed in normal applications), +an experienced user that understands very well how things work might see some benefits in editing the tourney file. +Remember that the tourney file is read by every XBoard instance playing on that tourney, before every game. +So the tourney file is an ideal place to 'broadcast' a setting to all XBoards playing for that tourney, and none other. +If you thus want to have some special setting of XBoard just for that tournament, +which is not stored in the tourney file by default, +you could simply add it there. +

+You would then automatically force this setting on all XBoards playing for the tourney, +even those you will start up only tomorrow, +even if in the mean time you have changed the settings XBoard uses at startup by doing something else with it in the mean time. +For instance, you could write a '-variant fischerandom' option in the tourney file, +if not all engines are installed to automatically play Chess960. +Or specify that the engine-output window should be closed, or Shogi pixmaps should be used for the pieces, or whatever. +The only thing you have to keep in mind is that the -results option should always remain the last one in the file. +So NEVER, NEVER append anything to the end of a tourney file! +It would also be good practice to always keep the -participants option the first one in the file. +(As this is used by the OS to determine mime-type of the file.) +

+ + + + + + + diff --git a/whats_new/4.6.0/Tourney.png b/whats_new/4.6.0/Tourney.png index 93f6ff5c4d261c8f0b2cb4828ccde02203b651e1..12ef691c3a199a3a0e41063aab9f5a49c35f2fc3 100644 GIT binary patch literal 17235 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. +For a more elaborate description, look here.

-- 1.7.0.4