packages feed

bishbosh-0.1.1.0: changelog.markdown

# 2018-01-01 Dr. Alistair Ward <bishbosh@functionalley.com>

## 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 **makefile** to facilitate common tasks.
* Removed the configuration-option **preferMovesTowardsCentre** & its implementation in function **Cartesian.Coordinates.radiusSquared**, because of it's conceptually wobbly foundations.

### New Runtime Cmmands:
-----------------------------------------
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.
-----------------------------------------

### 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**.

### 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.

## 0.1.1.0
### New Modules:
---------------------------------------------------------
New Module					| Purpose
------------------------------------------------| -------
**BishBosh.Time.StopWatch**			| Replaces module **BishBosh.Data.Time** to encapsulate interaction with module **Data.Time.Clock**.
**BishBosh.Time.GameClock**			| Contains two **BishBosh.Time.StopWatch**es to enable module **Duel.Process.Intermediary** to measure the time used by each player.
**BishBosh.Property.Switchable**		| Exports a type-class, which both **BishBosh.Time.StopWatch** & **BishBosh.Time.GameClock** implement, to expose their functionality.
**BishBosh.Property.SelfValidating**		| Exports a type-class, which both **BishBosh.Time.GameClock** & **Duel.Data.Options** implement, to validate themselves.
**BishBosh.Type.Countable**			| Defines newtypes to enhance type-safety, replacing type-synonyms for **Int**. There is a performance-degradation, so this enhancement can be disabled using a new cabal-flag.
**BishBosh.Type.Crypto**			| Self-documentation.
**BishBosh.Type.Length**			| Replaced the polymorphic type-parameters **row** & **column** with newtypes to enhance type-safety.
**BishBosh.Type.Mass**				| Self-documentation.
**BishBosh.Metric.RankValue**			| Replaced the polymorphic type-parameter **rankValue**, with a newtype & a smart-constructor to guard permissible bounds.

### Duel:
* Added command-line option **--verifyConfiguration**, to request that the mutual compatibility of the two configuration-files be verified before forwarding each to a forked instance of **bishbosh**.

### BishBosh:
* Created a new directory **Rule/** to which **Model.**{**DrawReason**, **GameTerminationReason**, **Result**} were relocated.
* Refactored functions **BishBosh.ContextualNotation.PositionHashQualifiedMoveTree.findNextOnymousQualifiedMovesForPosition**, **BishBosh.Model.MoveFrequency.insertMoves** & **BishBosh.Model.GameTree.toMoveFrequency**.
* Evaluation-criteria:
	+ Moved **BishBosh.Attribute.**{**CriterionValue**, **CriterionWeight**, **WeightedMeanAndCriterionValues**} to a new directory **Metric/**
	+ Implemented classes [**Num**, **Fractional**, **Real**] for data-types **BishBosh.Metric.**{**CriterionValue.CriterionValue**, **CriterionWeight.CriterionWeight**}, nullifying the requirement for exports.
	+ Replaced the pointless polymorphic payloads in data-types **BishBosh.Metric.**{**CriterionValue.CriterionValue**, **CriterionWeight.CriterionWeight**, **WeightedMeanAndCriterionValues.WeightedMeanAndCriterionValues**} with concrete types.
* Moved **BishBosh.Attribute.RankValues** to **BishBosh.Input**.
* Checked that (with the possible exception of the King) the Queen is configured as the most valuable rank.
* Avoided repeated calls from module **BishBosh.Evaluation.Fitness** to function **IBishBosh.nput.RankValues.calculateMaximumTotalValue** by adding the record-field **BishBosh.Input.EvaluationOptions.getMaximumTotalRankValue**.