# 2018-01-01 Dr. Alistair Ward ## 0.0.0.1 * First version of the package. ## 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.