Changelog for bishbosh-0.1.0.0

2018-01-01 Dr. Alistair Ward bishbosh@functionalley.com

0.0.0.1

0.0.0.2

Minor changes required to build on Windows.

0.0.0.3

Added Paths_bishbosh to Other-modules section of cabal file.

0.0.0.4

Changed references to author's domain-name.

0.0.0.5

Added ability to specify the text-encoding used in a PGN-database file. Updated list of test-compilers.

0.0.0.6

Fixed failure to persist game-state after requesting that the game be restarted. Fixed parsing of TextEncoding in PGNOptions. Replaced module Distribution.Verbosity with BishBosh.Input.Verbosity.

0.0.0.7

Rewrote function BishBosh.Data.RoseTree.countTerminalNodes in accordance with the suggestions of David Feuer. Amended function BishBosh.State.EnPassantAbscissa.mkMaybeEnPassantAbscissa to guard against exposing one's King after En-passant capture.

0.0.0.8

Corrected the parsing of FEN when an Enpassant-destination defined on file b was erroneously interpreted as a bishop in the previous CastleableRooks field. Added parent class BishBosh.Property.ExtendedPositionDescription.EPD for Property.ForsythEdwards.FEN, for which the latter typically has a default implementation of both methods.

0.1.0.0

Bug-fixes:

* Upgraded the transposition-table in module **Search.DynamicMoveData**, from merely recording moves (which doesn't include the rank to which a Pawn is promoted), to recording qualified-moves.
* In function **Search.AlphaBeta.negaMax.descend.selectMax**, amended bound function **isFitter** to prefer shorter move-sequences where fitness is equal, & corrected the scenario in which all nodes were skipped because they were repetitious, but without ever defining alpha.

Features:

* Added the configurable runtime ability to asynchronously decompress PGN-databases, & to set a maximum number of games to read.
* Added a configuration-option to normalise the values of specified piece-square tables into the closed unit-interval.
* Modularised the packaged config-files, by defining XML **External Entities** in the DTD.
* Added suggestions on failure to parse a user-command, & created a module **Text.AutoComplete** to contain common code.
* Added runtime commands:
-----------------------------------------
Command				| Purpose
--------------------------------| -------
**availableMoves**		| to report all available moves from the current position.
**maxPositionInstances**	| to reveal the maximum number of instances any available position has been visited.
**reversiblePlyCount**		| to count the number of consecutive reversible plies that have been made.
-----------------------------------------
* Added **makefile** to facilitate common tasks.
* Removed the configuration-option **preferMovesTowardsCentre** & its implementation in function **Cartesian.Coordinates.radiusSquared**, because of it's conceptually wobbly foundations.

Command-line Options:

* Added a new module **Input.CategorisedCommandLineOptions** to improved the partitioning of command-line options into functional categories.
* Added a command-line option **--formatPieceSquareTableForGNUPlot** to print the piece-square tables in a format suitable for **GNUPlot**.

Performance:

* Included a compilation-flag **unboxedarrays**, to request the use of unboxed arrays where (infrequently) possible.
* Changed data-type **Component.PieceSquareByCoordinatesByRank.EitherPieceSquareValueByNPiecesByCoordinates**, bringing type **Cartesian.Coordinates.ByCoordinates** inside **Either**, leading to significant space/time gains.
* Constructed each large constant data-structure in parallel. Bracketed all data-parallel operations with CPP-conditionals controlled by the compilation-flag **threaded**.
* Parallelised function **Attribute.CriterionValue.calculateWeightedMean**.

Architectural:

* Added new modules:
-----------------------------------------
Module				| Purpose
--------------------------------| -------
**Component.CastlingMove**	| Forked from module **Component.Move**
**Data.Enum**			| Currently single-function.
**Data.Foldable**		| Currently single-function.
**Property.FixedMembership**	| Defines a class to which sum-types can conform.
**StateProperty.Censor**	| Relocated from directory **State/**
**StateProperty.Mutator**	| defines a class to express the dual implementations within **State.Board**.
**StateProperty.Seeker**	| defines a class to express the dual implementations within **State.Board**.
**Text.Case**			| Forked from **Text.ShowList** to contain case-related operations.
**Text.Prefix**			| Forked from **Text.ShowList** to define the constant prefixes of log-messages.
-----------------------------------------

Testing:

* Split **src-test/Main.hs** into **src-test/HUnit.hs** & **src-test/QuickCheck.hs**, each referenced independently from the cabal file.
* Added an executable **duel** (to coordinate a battle between two independently configured instances of **bishbosh**) & a corresponding section-1 man-page.
* Validated the list of ranks supplied to construct either **Attribute.RankValues.RankValues** or **Input.PieceSquareTable.PieceSquareTable**.

Refactoring:

* Flattened the nested array **Component.Zobrist.getRandomByCoordinatesByRankByLogicalColour**, by means of a composite index.
* Reimplemented function **Cartesian.Coordinates.getLogicalColourOfSquare**.
* Reimplemented function **Cartesian.Coordinates.interpolationsByDestinationBySource** in terms of function **Cartesian.Coordinates.extrapolationsByDirectionByCoordinates**.
* Used the **LambdaCase** language-extension.