Changs in Arasan 25.2 (July 2025):
 1) Updated network, trained with 12B positions, using factorization and cosine LR scheduler
 2) Training script and training log commited to repo, along with the network
 3) Some changes to selfplay utility. Outputs W/L/D statistics now.
 4) Fixes to non-SIMD build
 5) Fixes for AVX512 build
 6) Use -DSIMD, -DSSE2 for GUI build
 7) Fixes for position learning. Rename "Learning file name" option to "Learning file."
 8) use -path for xboard BookPath option
 9) Fixes for loading/storing PGN files from the GUI
 10) Fixes for setting ARASAN_VERSION macro in the build
 11) Fix "bench" command so if given on the command line, it does complete initialization
 12) Implement finny tables to speed up eval
 13) Changes to book selection logic. Book will play a wider variety of moves by default.
 
Changes in Arasan 25.1 (May 2025):
 1) Fixes for time management in zero-increment games
 2) Changes to null move reduction formula
 3) New network with L1=1536
 4) Move NNUE code into the main source tree
 5) Use pure NNUE eval, no more HCE
 6) Changes to book selection logic
 7) Updates to selfplay utility
 8) Update match tools to use fastchess instead of cutechess-cli
 9) increase MaxCPUs to 512 (for TCEC)

Changes in Arasan 25.0 (Dec. 2024):
 1) Use a single "Book variety" option to control move selection from the book
 2) Some changes to move selection logic
 3) Fix Intel oneAPI compiler support. Add support for CSSPGO with Intel/clang.
 4) Fixes/updates to selfplay utility. Support output in the format used by bullet.
 5) Add SyzygyUse50MoveRule and SyzygyProbeDepth options for CECP
 6) Make NNUE usage non-optional. Fail on startup if network cannot be loaded.
 7) arasan.rc is no longer loaded by the engine, by default. Auto-loading (the
 prior behavior) can be enabled via the -a command-line option, or use -r to
 select a specific file.
 8) Make eval command evaluate current position, like Stockfish
 9) Change SyzygyTbPath option to SyzygyPath, for conformity to Stockfish
    and most other engines
 10) New network architecture and network
 11) Changes to history score computation
 12) Use capture history for move ordering
 13) Implement a parameter tuning framework for search parameters, tune some
 using Lakas (https://github.com/jdart1/Lakas)
 14) Changes to static null pruning, adjust margins
 15) Windows GUI sources are now included in the repo
 16) GUI can set some options formerly only settable via arasan.rc

Changes in Arasan 24.2.2 (April 2024):
 1) Fix learning in UCI mode with ponder off

Changes in Arasan 24.2.1 (April 2024):
 1) Fix issue #57: loss on time in tournaments
 2) Increase default move overhead
 3) Programmer's Guide update

Changes in Arasan 24.2 (April 2024):
 1) Various Makefile fixes/enhancements, including support for compilation on
 Windows with clang-cl
 2) Performance improvements to PGN reading code
 3) Remove log file support
 4) Make position learning work in UCI mode, make default learning file
 location a writeable directory
 5) Add option to set learn file location
 6) Read arasan.rc from the home directory on Windows, if present.
 7) Re-organize NNUE SIMD code for feature transformer, make it work properly
 when accumulator width is not an exact multiple of the register count
 8) Protocol fixes: in UCI mode, ignore illegal moves sent from interface
 (Arena can do this). Ignore move sent after game end in CECP mode.
 9) Build executables with clang
 10) Support compilation on ARM Linux with GCC (aarch64 architecture)

Changes in Arasan 24.1 (January 2024):
 1) Fix scoring for special case endgames (classical eval).
 2) Add HCE scoring for KRN vs KR and KRB vs KR.
 3) Fixes/tuning for strength reduction feature.
 4) Add option to override opening book path.
 5) Multiple fixes and updates to selfplay utility.
 6) Updated network, trained on approx. 4.7B self-play games.
 7) SIMD optimizations in NNUE feature transformer (significant
 performance increase, especially for Mac M1/M2 and AVX512).
 8) Bug fixes in NNUE code.

Changes in Arasan 24.0 (August 2023):
 1) New network architecture based on "Stockfish version 4" structure
 2) Cleanup shadow warnings + other misc. code cleanup.
 3) Multiple fixes/updates to selfplay utility
 4) Implement capture history and futility pruning for capture moves
 5) Fix #50. Add an OwnBook option to CECP options.
 6) Updates to test tools
 7) Fixes to engine debug output, fix problem with Shredder UI

Changes in Arasan 23.5 (April 2023):
 1) Fix bug that could cause over-long sequences to execute mate when mate-in-N found.
 2) Multiple changes and fixes to selfplay utility for generating training positions.
 3) Decrease null move reduction somewhat more in endgames
 4) Fixes to CMake file
 5) Fixes to build so it works with C++20 compile.
 6) Sync with latest Fathom and nnue changes
 7) Changes to book selection logic
 8) Don't use gold linker when Clang is the compiler. Fixes #44.
 9) Fixes for hash values out of bounds (Github issue #45).
 10) Fix Unix/Mac Makefile + CMake file to use -msse2, -mssse3.
 11) GUI supports XXLarge board size.

Changes in Arasan 23.4 (July 2022):
 1) Ignore CECP "accepted" and "rejected" input from the interface
 2) Fixes for occasional stalls especially in UCI mode
 3) Null move condition changes. Remove razoring.
 4) Optimize tuner memory allocation. Disable NNUE when parameter turning for HCE.
 5) Network update, re-tune with lambda=0.75
 6) Code cleanup, including fixes for MSYS2 build
 7) Enhancements to AVX512 support
 8) GUI fix: make "Can resign" option work correctly
 9) Bug fixes for "test" command when run multithreaded

Changes in Arasan 23.3 (Mar. 2022):
 1) Convert from using a separate polling thread to polling from the
    search itself, as was done earlier in Arasan development.
 2) Fix build problem with utility programs
 3) Fixes for errors and warnings in build of tuner.
 4) Some code cleanup. Remove spinlocks, replace with std::mutex.
 5) Change how extensions/reductions are handled.
 6) Use regex to parse .rc file. Tolerate/ignore blank lines in the file.
 7) Shift to using pure NNUE rather than mixed classical/NNUE eval in imbalanced positions.
 8) Changes to selfplay utility: -n sets position count not game
    count. Add -a flag to append to existing file.
 9) Add AVX512 support
 10) New network
 11) Changes/tuning to strength reduction feature.

Changes in Arasan 23.2 (Dec. 2021):
 1) Fixes to singular extension code.
 2) Change static null pruning margins.
 3) Fix compile errs in tracing code.
 4) Don't reset debug prefix when executing "new" command.
 5) Fix myname feature (for CECP mode).
 6) Package correct network file for Windows.
 7) Build fixes for Cygwin

Changes in Arasan 23.1 (Nov. 2021):
 1) Disable book when running the "bench" command. Ensure tablebases and NNUE are initialized before it runs.
 2) Support SIMD on older Intel/AMD chips. Default builds now assume at least SSE2 is available.
 3) Fix #34 - specify C++17 for clang.
 4) Various fixes to selfplay utility
 5) New network, based on reinforcement learning from 280m positions
 6) Singular extension changes. Allow some pre-search pruning during a singular search.
 7) Some code cleanup and refactoring.
 8) Fixes and cleanup to Makefiles, VC++ projects and CMakeLists.txt.
 9) Output error and info messages related to intialization to stdout not stderr, and use the
 appropriate prefix (e.g. "info" for UCI).

Changes in Arasan 23.0.1 (Sept. 2021):
 1) Fix default settings of NNUE options under UCI.

Changes in Arasan 23.0 (Sept. 2021):
 1) Add NNUE evaluation
 2) Changes to Makefile: use BUILD_TYPE to select instruction set(s)
 3) Code cleanup: put globals into namespace. Remove TbType because we only support Syzygy tablebases now.
 4) Code cleanup: qualify imports from std namespace (remove "using namespace std").
 5) Code cleanup: remove ASSERT macro, replace with standard assert.
 6) Fixes/updates to selfplay utility for NN position generation.
 7) Fix unit tests to account for score variance in draw positions.
 8) Fix for loading .rc file, book and network when program executable is found via PATH traversal.

Changes in Arasan 22.3 (May 2021):
 1) Change re-search logic.
 2) Add selfplay utility, to generate NNUE training positions.
 3) Changes to book selection logic.
 4) Allow piece values to be computed via Texel tuning, re-tune params.
 5) Add -mfma if avx2 enabled.
 6) Update history and killers on hash cutoff.
 7) Add small semi-random factor to draw score (idea from Stockfish).
 8) Various search changes to null move, ProbCut, futiliy pruning,
 static null pruning.
 9) Some cleanup and bug fixes in history code.
 10) Simplify qsearch hash code, changes to qsearch forward pruning.
 11) Fixes to CMakeLists.txt and VC++ project files.

Changes in Arasan 22.2 (Dec. 2020):
 1) Cleanups and fixes in Makefile + CMakeLists.txt. Fix GCC version detection.
 Better detection of clang compiler. Support Intel oneAPI complier.
 2) Bug fixes in protocol class for cases where ponder search terminates early.
 3) Make check extension always 1 ply + make it unconditional.
 4) Bug fixes in hashing/retrieval of mate scores.
 5) Changes to material imbalance scoring.
 6) Fix bug preventing kibitzing of search info on chess servers.
 7) Update to latest Fathom.
 8) Bug fix: in MultiPV mode: apply correct aspiration window to search.
 9) Support optimization for AVX2 capable processors.
 10) Changes to time management code.
 11) Stop scoring based on castling history, add instead "trapped rook" eval term
 as in Stockfish.
 12) Clean up/simplify parameter tuning code.
 13) Fix improper hash table size computation for large hash sizes (>32G).
 14) Changes to pruning code including null move.
 15) Bug fix: Move check for forced move in search out of fail high/fail low loop.
 16) Simplify/modify singular extension code. Add multi-cut pruning.
 17) Add support for C++ 20 bit operations.
 
Changes in Arasan 22.1 (July 2020):
 1) Remove potential passer scoring.
 2) Tighten validation of hash/killer moves
 3) Fix Resign threshold option (CECP mode)
 4) Simplify lmp threshold computation. No longer different for PV.
 5) Modify formula for lmp count. Do not allow 0 as depth index.
 6) Increase razor margin and reduce razoring depth.
 7) Fixes to singular search code. Verify hash move before doing a singular search.
 8) If singular extension is triggered, do not compute any additional extension, or reduction.
 9) Implement bench command. Use bench command for PGO.
 10) Update test tools to use pentanomial model for SPRT.
 11) MultiPV bug fixes, including a fix for bad ponder move output in MultiPV mode.
 12) Fix accept draw logic (CECP mode)
 13) Do not update history on fail high of 1st quiet and low depth (idea from Ethereal).
 14) Fix possible crash: when iterating through the search threads,ensure any that have
 a null "work" pointer are skipped.
 15) Allow ProbCut while in check, and restrict recursive Probcut
 16) Optimization in seeSign() function
 17) Misc. code cleanup
 
Changes in Arasan 22.0 (Dec. 2019):
 1) Makefile fixes: add -flto to optimized builds. Fix PGO builds with clang.
    Don't use gold linker on MacOS (fixes #24).
 2) Don't allow termination due to hitting a time limit until at least
    one thread has completed an entire search iteration (to prevent
    failing low and having no move).
 3) Remove UCI logging feature (enabled with -DUCI_LOG). Support runtime
    debugging under UCI via the "debug" command.
 4) Allow LMR of capture/promotions past LMP threshold, with less
    reduction.
 5) Change bishop attack function w. transparency so that both Queens
    and Bishops are considered transparent. Re-tune.
 6) Simplify and modify king safety.
 7) Performance fix for tuner: Reduce locking by reading line under lock then parsing EPD.
 8) Remove byte typedef, to allow compilation under C++17.
 9) Use condition variable instead of polling to wait for threads to complete.
 10) Re-work threat scoring. Calculate full attack info for both sides
    before doing threat scoring. Change calculation of threats, now
    similar to Stockfish. Add scoring for threats by pawn push to safe squares.
 11) Fixes for repetition detection after null move: keep separate counter
    for plies from last null move, as in Stockfish.
 12) Changes to time management.
 13) Eval changes including passers, own pieces protecting king under attack, pawn
     storm.
 14) Fixes to singular extension code. Revert back to calling search recursively
    to do singular search. 
 15) Bug fixes in material scoring: 
    a. Don't apply material score corrections for pawnless endgames twice (once
    for each side).
    b. Exclude special-case endgames with non-tunable params from tuning.
 16) Score pawnless Q vs R + minor as draw.
 17) Change piece values. Re-tune.
 18) Update tools to be compatible with latest python-chess.
 19) don't set improving = true if in check or if previous ply score not avaialble
 20) Change history score calculation (similar to Laser). Modify history
     pruning thresholds.
 21) Add Cmake support (WIP).

Changes in Arasan 21.4:
 1) Update to use latest Fathom library with 7-man tb support.
 2) Use Fathom ranking API for tb moves at root.
 3) Changes to extension logic.
 4) Use IID score to improve eval value for pruning, as is done with
    hash scores.
 5) Change IID conditions.
 6) Fixes to singular extension code and rewrite to make it simpler.
 7) Allow pre-search pruning when in ProbCut search.
 8) Adjust LMP pruning thresholds, use higher threshold for PV nodes.
 9) Change material scoring for minors vs pawns. Re-tune params.
 10) Clear killers for successor nodes in search (idea from Ethereal).

Changes in Arasan 21.3 (Mar. 2019):
 1) Fix possible array overflow in search.
 2) Clean up draw code; fix bug where 2-fold repetition at root caused
    draw to be signalled.
 3) When a hash hit occurs in the qsearch, do a more correct check
    that the hash move meets conditiions for the current phase of
    the search, before using it. Also: remove pruning for hash
    moves in qsearch.
 4) Remove eval test before doing checks in qsearch.
 5) Simplify book selection logic. Add an additional option for
    controlling how important explicit book weights are.
 6) Fix bounds overflow in king proximity table.
 7) Remove some scoring parameters that were tuned to zero or near-zero.
 8) Reset controller stop flag before search. Fixes issue #21.
 9) For pruning decisions, use modified depth but not the same as
    LMR depth (idea from Laser). Allow pruning of non-root PV nodes.
 10) Store history scores on all moves including pruned ones.
 11) Use counter move and follow-up history for pruning like Stockfish.
 12) Omit futility pruning for moves with good history.
 13) Fixes/simplifications to ProbCut code. Reduce ProbCut margin.
 14) Adjust SEE pruning margin for non-quiet moves.
 15) Don't do quiet move pruning if side to move has no pieces.
 16) Assorted code cleanup. Add unit tests for search.

Changes in Arasan 21.2 (Dec. 2018):
 1) Add support for >64 cores.
 2) Rework NUMA support to use hwloc 2.x API. Add code to handle Windows
    processor groups (not really tested at present).
 3) Bug fix: don't access counter move arrays when previous move was null.
 4) Fix bug in thread usage reporting.
 5) Bug fix: beta could be outside MATE score range during singular search.
 6) Don't do check extension if outside late move pruning limit (like
    Stockfish).
 7) Make LMP dependent on improving flag.
 8) Set contempt based on ratings with sigmoid function: avoids
    excessively large contempt values.
 9) Improvements in time management.
 10) Fixes in Winboard protocol.
 11) Suppress trace information from the polling thread: fixes issues when
    running with trace flag (-t) on.
 12) Fix thread selection logic at end of search so that main search is not
    selected if it does not have a PV.
 13) Add some scoring for pawn storms (pawn advances near opposing
    king).
 14) Changes to "lazy SMP" thread depth distribution.
 15) Fix node count & time reporting for "test" command.

Changes in Arasan 21.1 (Oct. 2018):
 1) Fix bug in generateCaptures.
 2) Change depth resolution and check extension.
 3) Use improving status to adjust LMR values (like Stockfish). Adjust LMR
    logic.
 4) More depth-dependent reduction in null move search.
 5) Improvements to time management.
 6) Add move overhead option.
 7) Do see pruning at higher depths, with a margin (idea from Stockfish).
 8) Don't use conditional variable/mutex for handling the wait for
    all threads to complete at search end. Instead, just poll in the
    main thread.
 9) Major cleanup of UCI/Winboard protocol code. Fix some race conditions
    that could cause engine to not respond in rare cases.
 10) Enable singular extensions.
 11) Restructure history code and implement "follow up history" (Ethereal's
     term), similar to Stockfish continuation history.
 12) Convert main history table to butterfly boards.
 
Changes in Arasan 21.0 (June 2018):
 1) Implement LazySMP instead of YBWC for multi-threading (major re-structuring).
 2) Stricter/earlier validity checking on hash move.
 3) When failing low with a mate score, widen the aspiration window all
    the way to -Mate1. Fixes Github issue #16.
 4) Improvements to time management. When failing low, extend time based on
    how bad & how recent the fail low(s) were. When failing high, extend
    time but less than for a fail-low.
 5) When storing a hash entry that is an eval score, store the hash move
    also, if there is one. Remove an unnecessary test in qsearch.
 6) In Winboard mode, send a response to "ping" immediately when pondering. 
 7) Fix regression in "go searchmoves" command (Github issue #17).
 8) Reset search status (by calling "new" internally) after receiving
    "result." Fixes issues when running matches offline under xboard,
    which may start a new game w/o sending "new."
 9) Fixes to Winboard edit mode.
 10) Don't resign lost tb positions unless far behind in material.
 11) Apply filtering to root moves before forced move detection. Change
     forced move logic - terminate even if failing high/low.
 12) Simplify outpost scoring.
 13) Add scoring terms to encourage own piece proximity to King when King is
     under attack.
 14) Changes to book move selection logic and associated options.
 15) Fix a possible bug in handling of weight comments in makebook utility.
 16) Fix output of objective value from tuner. Bug fix in scaling of gradient -
     makes convergence faster.
 17) Increase probcut min depth.
 18) Fixes to Winboard "memory" command.
 19) Quite a bit of code cleanup and conversion to C++11 style. Add some unit
     tests.

Changes in Arasan 20.5:
 1) Have tuner output objective value to params file.
 2) Bug fix in more() function of RootMoveGenerator.
 3) Fixes to Syzygy code: enable locking when multi-threaded.
 4) Fix very shallow search when MultiPV greater than the number of legal moves.
 5) Fix UCI score output when tb hit at root - now outputs score based on tb score
    (worked with multipv but not when multipv == 1).
 6) Do not exit search for forced mate if UCI and search type is fixed depth or
    fixed time.
 7) Don't execute move after UCI "bestmove" Wait for GUI to send position.
 8) Remove Nalimov and Gaviota tb support.
 9) Fix mate score output in GUI.
 10) Add code to save/restore window flags and state in GUI.

Changes in Arasan 20.4.1 (Jan. 2017):
 1) Fixes to ensure tablebases are initalized before search in UCI GUIs.
 2) Fix to output correct TB scores in UCI multi-pv mode.

Changes in Arasan 20.4 (Jan. 2017):
 1) Fix Linux/Mac Makefile so PGO works with clang.
 2) Code cleanup. Replace NULL with nullptr in most places (except some C library calls).
 3) Fix serious bug in Syzygy tb code for handling cursed losses.
 4) Fix "ecocoder" target in Makefile and fix ecocoder code (sync with changes to Notation).
 5) Updates to "pgnselect" utility program.
 6) A few fixes in the tuner program. Remove ordinal objective (was not working properly).
 7) Add -d option to test command so can do fixed depth. Profile uses fixed depth now.
 8) Some updates to the label_positions.py tool.
 9) Re-tune parameters with larger traning set and more frequent PV updates.
 10) Bug fixes in "easy move" code.
 11) Some minor changes/fixes to root move ordering.
 12) Bug fixes for UCI multi-pv mode.
 13) Add UCI contempt option.

Changes in Arasan 20.3 (Nov. 2017):
 1) Change queen mobility scoring: square reach beyond 23 squares gets
    same score.
 2) Re-work scoring for material imbalance with pawns.
 3) Bug fixes for EPD/FEN handling (mostly affects utility programs).
 4) Bug fixes for bitbases. Mate scores from bitbases were not being
    transmitted to the search. Also bitbase scores were being added to
    other eval terms which are not relevant for KPK. 
 5) Syzygy code (Fathom) is imported as a git submodule now.
 6) Code restructuring, move piece values into Param class.
 7) Change eval scale so Pawn value = 128 (vs. 1000 in 20.2).
 8) Implement UCI "searchmoves" option to "go" command.
 9) Bug fixes in parameter tuner.
 10) If special-case endgame detected, skip other endgame scoring and
    just use the special-case code.
 11) In UCI MultiPV mode, ensure bestmove that is eventually sent is the
    highest-scoring move, and re-order PVs if necessary so that they are
    in decreasing score order.
 12) Implement BMI2 (PEXT/PDEP) attack computation.
 13) Change evasion pruning in qearch.
 14) Pack hash entries into 2 64-bits words instead of 3.

Changes in Arasan 20.2 (July 2017):
 1) Add probcut to search.
 2) Detect King and Rook pawn vs wrong-color Bishop configuration
    and score near draw, even if opponent has pawns.
 3) Change history score calculation (similar to Stockfish).
 4) Implement countermove history similar to Stockfish and use in move
    ordering. Consolidate history/refutation/countermove history stuff
    into SearchContext class and remove separate History and Refutations
    classes.
 5) Sync with changes to jdart1/Fathom. In particular, pick up a fix for
    crashes when running multithreaded.
 6) Changes/fixes to strength limitation feature.
 7) Fix possible out of range errors in razoring code.
 8) Fixes to king cover parameter tuning code. Re-tune parameters.
 9) Changes to LMR. Adjust LMR amount based on history values.
 10) Remove Util class and replace with std library functions.
 11) Allow null move at depth = 1 ply.
 12) Changes to futility, reverse futility, and razoring margins.
 13) Fix possible bug in output of time control increment to PGN.
 14) Separate scoring for outposts in middlegame/endgame.

Changes in Arasan 20.1 (April 2017):
 1) Fixes to UCI multipv handling.
 2) Fix logic for terminating search on tablebase hit.
 3) Bug fixes in parameter tuning code. Use actual sigmoid function when
    tuning king safety, not an approximated lookup table.
 4) Add file-dependent scoring for passed pawns.
 5) Fix bug in scoring for rooks behind passed pawns.
 6) Allow setting Arasan version string on make command line. Builds done
    between release tags now have versions generated from git commit # (if
    done from a git repository).
 7) In UCI mode, return a move even in cases where a legal draw position
    (according to 3-move rule) exists before search is started. Fixes problems
    with some UCI UIs.
 8) Allow LMR of some evasion moves.
 9) Remove "forced move" extension (1 single reply to check).
 10) More code cleanup and conversion to C++ 11.
 11) Some Android portability fixes. Note: Android build still not fully
     supported.

Changes in Arasan 20.0 (Jan. 2017):
 1) Fix to handling of UCI_LimitStrength and UCI_Elo options. These can now
    be processed in either order and will set the search strength correctly.
 2) Revised tuning program. Only the "Texel" method is supported now. Tuner
    uses a "mean-squared error" objective and takes a labeled EPD file
    as input. Various optimization methods can be selected. Optimization
    steps are scaled appropriately based on parameter ranges.
 3) Changes to king cover and king safety scoring.
 4) Bug fix: Ensure hash move is always checked for validity (was not being
    done for evasions).
 5) Fix possible race condition updating root PV.
 6) Add some utility programs and Python scripts to source package.
 7) Considerable code cleanup and fixing warnings and possible bugs, notably
    in Syzygy tb code.

Changes in Arasan 19.2:
 1) In UCI mode, don't set tb type when a tb path is received if that path
    is empty or the string "<empty>". Fixes issues under Shredder GUI.
 2) Fixes to Syzygy tablebase handling. Don't correct TABLEBASE_WIN scores
    for depth when storing/retrieving from the hash table. Adjust search
    scores based on the tablebase score, when available.
 3) Make UCI option handling insensitive to the case of the option name,
    per the UCI spec. Add some error handling for invalid option names.
 4) Remove threat extension and related code.
 5) Change razoring margins.
 6) Simplify king safety scoring and make most king safety parameters
    tunable.
 7) Tuner now uses the Texel method by default and supports the ADAM
    gradient descent algorithm.
 8) Changes to King cover calculation. Give bonus for King cover only if King
    on rank <=2, and do not rate cover relative to King rank.

Changes in Arasan 19.1:
 1) Change/fix root move reordering. After wide search phase, just move
    the pv move first and other moves down.
 2) Scoring change: limit range of KING_MOBILITY_ENDGAME array.
 3) Add scoring for threats of lower-valued pieces and pawns against
    higher-valued pieces (previously only pawn threats were scored).
 4) Add support for thread affinity via the hwloc library (not enabled
    in the release builds; must recompile from source to get this).
 5) Add restrictions on SEE pruning: don't prune evasions, and only prune
    checking moves if they are not discovered check.
 6) Change extension logic: extend checks if not losing or if discovered.
    Other checks can be pruned (SEE pruning) or reduced. Remove FORCED2
    extension (2 legal evasions).
 7) Pick up en passant fixes from Fathom library.
 8) Add fixes for Android compatibility (although note: Makefiles still do
    not support Android cross-compilation).
 9) Fix bugs in Syzygy probing to avoid non-progress in endgames where
    a repetition has occurred.
 10) Non-POPCNT builds use a better software POPCNT implementation.
 11) Change IID conditions: allow IID in check if in PV. In non-PV node,
     score must not be too bad (like Protector).
 12) In "wide" search mode do not shrink upper bound of search window.
 13) Small changes to LMR reduction formula.
 14) Fixes to terminate multithreaded searches faster when fail-high
 detected.
 15) Changes to draw score calculation when ratings are available and
 to logic for "accept draw."
 16) Fix MVV/LVA calculation for move ordering.

Changes in Arasan 19.0.1 (May 2016):
 1) Fix tablebase options in UCI mode. Comment out default path from
 arasan.rc.

Changes in Arasan 19.0 (Apr. 2016):
 1) Adjust scoring for some pawnless endgames.
 2) Add Syzygy tablebase support, using Fathom library.
 3) Convert codebase to C++ 11. Remove support for older compilers.
    Use standard types from stdint. Use platform bswap macros where
    available for byte re-ordering. Misc other code cleanups and
    portability fixes.
 4) Update killers on lower bound hash hit. But not if in check. Move
    guard conditions for killer/history update to search.cpp and make
    them consistent.
 5) Change qsearch pruning conditions.
 6) Limit threat move extension to low depth as Stockfish did.
 7) Fixes to IID. Change IID depth conditions. 
 8) Omit all forms of forward pruning (before the move gen/
    search loop) when any of IID, VERIFY or SINGULAR flags are set.
 9) Allow fractional (half-depth) reductions. Limit reductions so they
    don't hit the q-search. Don't set LMR flag if reduction is 0. Change
    min LMR search depth to 3 ply.
 10) Use only 2 killer moves (not also killers from previous ply as
    formerly).
 11) Do pruning after LMR and using reduced depth (except use non-reduced
    depth for LMP).
 12) Modify how history scores are maintained and used (similar to Texel).
 13) Make history & refutation tables local to threads.

Changes in Arasan 18.3 (Feb. 2016):
 1) Bug fix: properly handle "cores" and "memory" options for Winboard.
 2) Adjust futility margins and allow futility pruning up to depth 5.
 3) Modify pruning condiitions slightly.
 4) Bug fix: guard against null move in updateHistoryMove.
 5) Bug fix: fix locking for PV update.
 6) Properly handle errors opening files in tuner program. Don't allow
    validation (-V) when running multi-threaded (does not work). Some
    code cleanup in the tuner.
 7) Fix UCI tablebase type selection option. 
 8) Remove some restrictions on LMR.
 9) Fix padding in NodeInfo for better alignment.
10) Allow reduction of moves in the killer and refutations phases of
    movegen.
11) Bug fix: initialize child node from parent in searchSMP.

Changes in Arasan 18.2 (Dec. 2015):
 1) Make more parameters tunable, including TRADE_DOWN array. Fix gradient
    computation for Q + minor vs Q material param.
 2) Revise and simplify endgame scoring. Combine endgame score cache
    with king cover cache (since they can use the same hash signature).
    Allow larger values for king endgame scores. Add distance function to
    Scoring. Use local calc instead of array lookup for this function.
 3) Re-tune all parameters using latest rating gauntlet games as training
    file.
 4) Add value fields to effective hash (fixes possible crashes in endgame
    when running multi-threaded).
 5) Add MSVC project files to repository.
 6) For Linux builds with gcc, turn on Link Time Optimization along with PGO.
 7) Lots of book changes/improvements.

Changes in Arasan 18.1 (Nov. 2015):
 1) Less aggressive LMR and LMP.
 2) More parameters are made tunable.
 3) Tuning code revised to support MMTO and Texel methods and params
    adjusted via tuning.
 4) Bug fixes in potential passer scoring.
 5) Score Q + minor vs Q as draw.
 6) In a multi-threaded search, maintain a move index in the move generator
    and pass it to the threads, for better/more consistent move order-based
    pruning & reductions.
 7) Increase max split depth.
 8) Change how passed pawn blockers are scored and tune penalities.
 9) Fix scoring for two rooks on the 7th rank.
 10) After reduced depth search fails high, don't re-search with narrow
    window and no reduction, unless reduction was > 1 ply.
 11) Modify formula for time extension when failing low.
 12) Bug fix: do not ponder after draw claim in Winboard mode.
 13) Increase SEE pruning depth but disable if alpha is a mate score.

Changes in Arasan 18.0 (July 2015):
 1) Add refutation table, similar to Gull & Rodent. This is global and
    refutations are produced in the phase of move generation after killers.
 2) Major restructuring to support automated parameter tuning. Internal
    scores are now in millipawns (1/1000 pawn).
 3) Changes to material balance scoring: in particular, better evaluation
    of some "near draw" situations.
 4) Detect K vs K+B+wrong color pawns as draw with >1 pawn (on same file).
 5) When in UCI analysis mode, output a move even in legal draw situations
    (except stalemate).
 6) Changes to reduced-strength mode. Instead of randomizing eval, now at
    low strength settings the program will select sub-optimal moves
    occasionally.
 7) Changes to time management when search fails low.
 8) Changes to king safety scoring and tuning of related parameters.
 9) Change conditions for static null pruning and razoring. Adjust
    razor margins.
 10) LMR changes: reduce only by full ply increments. Adjust LMR
    reduction formula. 
 11) Replace eval-dependent null depth reduction with a strictly depth-
    dependent formula.
 12) Fix GUI bug: changing strength setting during a game was not working.

Changes in Arasan 17.5 (Jan. 2015):
 1) Modify and tune connected passer scoring.
 2) Fixes to book weight computation.
 3) Adjust queen mobility scoring.
 4) Fix slow unload under Windows.
 5) Add endgame mobility scoring for king (+3 ELO).
 6) Fix asymmetry in Knight outpost scores.
 7) More accurate eval of reduced-material endgames. Fix scoring for
 pawnless Q vs RN.
 8) Changes to time management. Extend time if failing low at end of search,
 but only long enough to resolve the fail-low. In addition, though: extend
 if score is dropping relative to last search - amt of extension now varies
 with how much score has dropped.
 9) Increase king position scores when opponent has very low material.
 10) Some tuning of scoring for blocked passed pawns. A penalty is given now
 if the pawn is blocked but not at the immediate square in front.
 11) Some fixes for Intel C++ (icc) compilation.

Changes in Arasan 17.4 (Oct. 2014):
 1) Deeper LMR (and different reduction formula). After a LMR search
    fails high, first re-search with no reduction but zero width bounds,
    then only do a full-width, full-depth search.
 2) Reduce q-search pruning margin.
 3) Bug fix for pondering in Winboard mode. Engine could fail to ponder
    again after a successful ponder.
 4) Bug fixes to Winboard analysis mode.
 5) Bug fix in Board::wouldAttack.
 6) Widen somewhat the range of conditions that will prevent
    a move from being pruned, based on the null-move threat (if
    there is one).
 7) Simpify & tune late-move pruning code and remove vestiges of history
    pruning.
 8) Add .EXPORT_ALL_VARIABLES target to Linux Makefile, to make build
    targets work that depend on redefining CC etc.

Changes in Arasan 17.3 (Sept. 2014):
 1) Reduce doubled pawn score in endgame.
 2) Fix some bugs involving hash size settings for UCI.
 3) Minor changes to outpost scores.
 4) Fix a couple bugs in "makebook" program.
 5) Some king safety enhancements.
 6) Tuning of futility pruning parameters.
 7) History pruning disabled.
 8) Fixes to history and killer move handling.
 9) Simplify capture extension code and disable "easy move" if
    capturing the last piece.
 10) Increase see pruning depth to 1.5 ply.

Changes in Arasan 17.2 (May 2014):
 1) Fix "st" command in Winboard protocol to interpret time as seconds
 2) Scoring changes: king safety, king cover, weak pawns

Changes in Arasan 17.1 (May 2014):
 1) Scoring changes: connected passer code, knight and bishop 
    piece square tables, new king safety scoring.
 2) Add special-case eval code for K vs K+R and K vs K+Q endgames.
 3) Bug fix: validate hash move in q-search before using it.
 4) Changes to handling of book selectivity option.
 5) Adjust variable strength option so bottom end of strength scale
    is lower (will blunder sometimes).
 6) Increase ply depth in reduced strength mode for very low material
    endgames (engine was having difficulty mating in these cases
    even at moderate strength settings). This also fixes some
    problems with playing into stalemate.
 7) Better handling of out-of-memory errors when allocating hashtable.
 8) GUI fix: initialize all engine options at start of game. Fixes
    problem with resignation setting not being obeyed.
 9) GUI fix: clear any previous game result and other details after
    loading a position file.

Changes in Arasan 17.0b (Apr. 2014):
 1) GUI fix: PGN reading was not working. Also fixed PGN reader to
 skip variations (if present).

Changes in Arasan 17.0a (Apr. 2014):
 1) GUI fix: takeback was not working properly.
 2) GUI fix: changing strength during a game was not working.

Changes in Arasan 17.0 (March 2013):
 1) A common hashtable is now used in both quiescence and non-
    quiescence search, instead of using a separate q-search eval
    cache (hashtable stores static evals so also serves as an
    eval cache).
 2) Scoring module no longer does lazy eval.
 3) Opening book format has changed. Manual tuned book file is
    now annotated PGN instead of a custom text format. Book code
    is simplified.
 4) Opening book is no longer modified at runtime by result and
    score learning. Only position learning (aka permanent brain)
    is supported now.
 5) Improvements to opening book and ECO classifier.
 6) Qsearch no longer does pre-selection of capture targets. 
    Qsearch forward pruning margin and logic changed.
 7) Bug Fix: correct time field of "post" output for Winboard/xboard
    (was off by factor of 10).
 8) Bug fix: declare on startup for UCI that the tablebase type
    option is "Tablebase type", not "TablebaseType".
 9) Bug fix: check for previous move legal before returning draw
    score.
 10) Bug fix: Don't apply history pruning to moves before the
    history phase of move generation.
 11) Bug fix to KP + wrong Bishop vs. K draw detection. 
 12) Bug fixes to lockless hashing. But also: restore validity
     check for moves fetched from hash, since lockless hashing
     is not 100% reliable. 
 13) A few evaluation changes.
 14) Improved debug output when -DSEARCH_STATS enabled.
 15) Performance fix: remove unneeded update of node count at end
     of search function.
 16) Change to time usage: generally uses more time in early phase
     of games.
 17) Changes to razoring.

Changes in Arasan 16.3 (Dec. 2013):
 1) Generate/search discovered checks in qsearch.
 2) Changes to forward pruning in qsearch: re-introduce futility +
    SEE pruning in addition to filtering capture targets in movegen.
    But do not prune discovered check candidates.
 3) Prune some non-capture evasions in qsearch.
 4) Changes to check and capture extensions.
 5) Refine extension logic when null move search shows there is
    a threat related to a previous move that was reduced. 
 6) Defer SEE pruning until a legal move has been found/searched
    (fixes bugs in mate + stalemate detection).
 7) Speed enhancements in SEE, pin detection, and check status
    computation.
 8) Changes to weak pawn and outpost scoring.
 9) Cleanup code and add some extra checks in the Notation class.
 10) Fix in move generator: do not repeat hash move in winning
     capture phase. 
 11) Use shorter time check interval for very short time controls.
     Convert timing code to use high-resolution timer.
 12) Change formula for computing min book weight from selectivity
     setting, to play a wider variety of opening moves.

Changes in Arasan 16.2 (Oct. 2013):
 1) Fix adjacent passed pawn code so bonus for this is independent of
    the connected passer bonus. Adjust various passed pawn related
    scoring params.
 2) Add engine console command for perft.
 3) Adjust scores for Rook on 7th and make dependent on game phase.
 4) Fixes to weak pawn scoring and outpost code.
 5) Simplify and fix SEE function. Use variant version with quick exit
    when only need to know if score is above or below a threshold.
 6) Improvements to move ordering for check evasions.
 7) Fix bad bug in lazy eval code of scoring module.
 8) Bug fix: don't set the retrieved hash entry type to Invalid in
    cases where the score is in bounds but moves have been pruned.
 9) Bug fix: remove redundant increment of parentNode->num_try in searchSMP.
 10) Further clean up & optimize pinned piece detection.
 11) Static null margins & futility margins adjusted.
 12) Fix KBPK draw detection.
 13) Makefile support added for a popcnt-enabled 64-bit Windows build.

Changes in Arasan 16.1 (Sept. 2013):
 1) Fix UCI protocol bug that could cause engine to hang in cases where
    ponder is on and game is terminating due to a draw by repetition
    or rule.
 2) Some speed optimizations for pin detection.
 3) Bug fix in razoring code (return razor value from search).
 4) Fix time & nps display for UCI (was off by factor of 10)
 5) Some pawn scoring changes.
 6) Bug fix: correct some of the constants in Attacks class. 
 7) Fix problem in UCI multi-PV analysis mode.
 8) Allow LMR for checking moves and recaptures if they do not
    meet the extension conditions (still disable LMR if side
    to move is in check).
 9) Fix console input handling in Windows.
 10) Add -o (output file) option to engine "test" command.
 11) GUI uses .chm help file format, for compatibility with Windows Vista, 7, 8.

Changes in Arasan 16.0 (July 2013):
 1) Improvements to multi-core and multi-processor performance: limit
    global memory usage, do dynamic adjustment of split depth.
 2) Change book format, book weights are 0..100 not 0..10 now. New
    larger opening book is included with Arasan binaries.
 3) Book selectivity logic changed (again).
 4) Fix bug in 50-move draw detection.
 5) Move sorting no longer uses node counts; now an initial sort is
    done by move score, then subsequently PV moves are moved to the front
    each iteration, keeping other moves in the same order.
 6) Check extensions are more limited now. Overall limit on extensions
    at high ply counts from root is removed.
 7) Search time can be extended more in case of fail-low or resolving a
    fail-high.
 8) Aspiration window changes. Fix bug that can cause array overflow in
    aspiration window code.
 9) Somewhat experimental self-play code added for testing (not enabled
    in release builds by default).
 10) Numerous adjustments to evaluation weights.
 11) Score pawnless KRB vs KR and KRN vs KR as draws.
 12) Bug fix: allow resignation when in fixed depth search and depth<=1.
 13) Fix bug in handling of fail_high_root flag.
 14) Convert to conditional variables for thread synchronizaton on Linux
     + Mac (fixes Mac OS problem where semaphores may not be cleaned up
     on exit).
 15) Fix stack size for threads on Mac OS (avoids bus error crash in deep
     searches).

Changes in Arasan 15.6 (May 2013):
 1) Bug fix in search (affects multi-core searching only).
 2) Book selectivity logic changed (50 setting is a bit more selective now).
 3) book.random option is fixed (was not working).
 4) Book move kibitz for ICS is fixed so that weights are shown normalized
    and the book selectivity rules are applied.
 5) Fix "makebook" program to handle comments after PGN result.

Changes in Arasan 15.5 (Apr. 2013):
 1) Fix bug that can cause illegal move from pondering.
 2) Check for checkmate before returning 50-move draw.
 3) Send Winboard variants in feature line (only "normal" is supported).

Changes in Arasan 15.4 (Apr. 2013):
 1) Internal time accouting is now in millseconds, not centiseconds.
 2) Fix time management to reduce losses on time in very fast games.
 3) Native GUI now recognizes "offer draw" command (fixes bug in draw
    detection). Also though engine now reverts to using result command
    in cases of draw by rule before a move is made.
 4) Remove extra quote from response to "protover" command in Winboard
    (so myname feature works).
 5) Modify how book selectivity setting works. Selectivity has to be lower
    now to select very rare moves.
 6) A few more code portability fixes.
 7) Fix UCI protocol bugs leading to occasional loss on time with ponder on.
 8) Fix strength option scaling so play is stronger at high values.

Changes in Arasan 15.3 (Apr. 2013):
 1) Fix a bug in king cover calculation.
 2) Modify root LMR logic.
 3) Reduce memory usage for "makebook" utility by shrinking/packing structures.
 4) Fix "makebook" so it works on Linux. 
 5) Improve makebook speed by optimizing Board::reset.
 6) Some tweaks to trade down scoring, especially to discourage trading down
    from a possibly winnable to a drawish endgame.
 7) Change hashtable replacement policy so exact hash code matches always
    replace existing entries.
 8) Main search probes q-search cache for a pv move if the main hash table
    does not provide one.
 9) Improved ordering of evasion moves.
 10) Add extra time to search if resolving a fail-high at the root.
 11) Thread limit raised to 64.
 12) Thread split depth is dynamic based on number of threads.
 13) Some code portability fixes, in particular fixing big-endian support.

Changes in Arasan 15.2 (Feb. 2013):
 1) Some speed improvements especially when multithreaded.
 2) Code cleanup and bug fixes related to draw handling (could lose on 
    time in server games, in rare cases, due to problems in this area).
 3) Some more code conversion to C++ style intead of C. Use STL pair template.
 4) Minimum search time changed to 10ms to better support very fast test
    games.
 5) Bug fix in code for checks in qsearch: ensure checking moves do not
    place own king in check.
 6) Some weights changed in scoring module based on CLOP.
 7) Simplified razoring code.
 8) Qsearch forward pruning changes. We use only pre-selection of captures
    now, not traditional forward pruning. Margins for this adjusted.
 9) Linux-specific bug fix for occasional crashes when >2 threads in use.
 10) Fix in aspiration window code for rare overflow condition when
    failing low with a mate score.
 11) Fix bug setting hash sizes > 2GB through Winboard/UCI.
 12) Somewhat more general Rook pawn vs wrong color Bishop draw detection.

Changes in Arasan 15.1 (Nov. 2012):
 1) Correctly parse Winboard "level" command that includes a fractional
    part in the time increment.
 2) Fix bug in result learning code: incorrect learn value when drawing
    a high-rated opponent as Black.
 3) Fixes to eval for potential passed pawns. Small increase in castling
    scores.
 4) Changes to "trade down" material scoring.
 5) Remove a redundant check for moving a pinned piece when searching
    checks in q-search.
 6) Fix UCI multipv output when there are fewer legal moves than the
    specified multipv count.
 7) Change max hash table size for GUI.

Changes in Arasan 15.0 (Sept. 2012):
 1) Increase static null pruning threshold at low depths.
 2) Scoring fixes/improvements: king cover, potential passed pawns,
    bad bishop.
 3) Fix code that tracks node count per ply 0 move, for move ordering.
 4) Changes to LMR reduction amounts and ply 0 reduction threshold. 
 5) Avoid null move if hash table info indicates it would fail to
    generate cutoff.
 6) Losing checks are no longer extended, in any case. Threat extension
    is now done differently, similar to Stockfish.
 7) Re-work of SMP code to increase thread usage by supporting the
    "helpful master" algorithm.
 8) Fix a bug in communicating with the Fritz interface, specifically
    the "process testsuite" command.
 9) Fix UCI and console score output so upperbound & lowerbound status
    displayed when appropriate.
 10) Fix setting Strength option from native GUI.
 11) Some GNU Makefile fixes for MingW support. clang is also supported
     now.

Changes in Arasan 14.3 (July 2012):
 1) King safety is scaled by the opponent's material value (fixing a bug).
 2) Adjustments and fixes to strength reduction feature.
 3) Fix to material scoring for R vs 2 minors.
 4) Do not terminate search after forced move if in analysis mode.

Changes in Arasan14.2a (June 2012):
 1) Another fix for "ping" handing in engine to cure hang problems in Arasan
    GUI.
 2) Strength reduction operates during pondering.

Changes in Arasan 14.2 (June 2012):
 1) The chess engine handled input from the the UI in several places
    and had duplicate code for scanning input and breaking it into lines.
    This is now centralized and simplifed.
 2) Some other code cleanup, especially conversion from C-style string
    handling to C++.
 3) Simplified code for lazy eval. Partial (lazy) scores are no longer
    cached in the scoring module (such scores were seldom used anyway).
 4) Outpost scores reduced.
 5) Tweaked threshold values for history pruning and late move pruning (due
    to a bug, 14.1 actually did only late move pruning above depth = 1 ply).
 6) Reduced thresholds for static null pruning.
 7) Some changes to LMR and root move reduction logic.
 8) Bug fix: ensure final stage of ply 0 search window widening sets a
    correct upper/lower bound.
 9) Improvement to logic for searching checks in q-search.
 10) Fix material eval adjustment for Q vs 2R.
 11) Support is added for varying the engine strength via UCI or Winboard
    options (Arasan GUI supports this too).
 12) GUI bug fix: search could hang when a "Go" command is issued when it
    is the user's turn to move, and the user then makes a manual move before
    the search completes.
 13) Winboard driver fixes: pings could be processed out of order in some
    cases. Also, an extra move could be sent after Winboard has send a
    "resign" or "result" command.

Changes in Arasan 14.1 (Apr. 2012):
 1) Fix (again) UCI promotion move formatting bug.
 2) Fix Winboard "memory" command.
 3) Support added for MingW environment (use Linux Makefile for this)
 4) Q-search selectively generates only moves that will likely reach
    futility threshold.
 5) Fix icc Makefile (on Windows).
 6) Fix bug in PV display in Windows GUI.

Changes in Arasan 14.0.1 (Mar. 2012):
 1) Fix for UCI promotion move formatting bug.

Changes in Arasan 14.0 (Mar. 2012):
 1) Board::wouldCheck function handles promotions.
 2) Much simplifed time management, functions better in particular under very
    short time controls.
 3) LMR is performed at root node (formerly was not).
 4) Null move uses R=3 with verification.
 5) Simplified hash table implementation.
 6) Move generator defers SEE test on captures until the move is used (this
    was done previously in the qsearch but not elsewhere). 
 7) Better sort algorithm in move generator.
 8) Fixes to learning code. Hash table (w/ learn info) was being cleared
    at each new game, now learn info is retained.
 10) Some code cleanup, esp. conversion from char * to C++ string usage.
 11) Arasan uses Gaviota tablebases. Fix tb probing when en passant
     capture possible. Tablebase hits now are cached in the hash table.
 12) Additional UCI & winboard options supported. GUI now uses the standard
     winboard options command to send options to the engine.
 13) Fix bug involving mate scores in UCI analysis mode.
 14) Makebook program can directly consume PGN.
 15) Arasan engine source is released under the MIT license (same license used
     by the Gaviota tablebase code).

Changes in Arasan 13.4:
 1) Fixes to UCI analysis mode.
 2) Fix handling of UCI Threads option.
 3) Arasan GUI allows changing thread count for search.
 4) Support "cores," "memory" and "egt" features in Winboard. Note: Arasan
    command-line switches take precedence over Winboard settings.
 5) Memory for the evaluation cache is now dynamically allocated and
    is sized relative to the main hash table.
 6) Some changes to pruning and lazy eval logic.
 7) Fixed faulty bitbase data. Fixed "eval" command to handle bitbase
    and tablebase probes properly.
 8) Improve UCI time management for very short time controls.

Changes in Arasan 13.3:
 1) In Winboard mode, Arasan still accepts but does not rely on the
    deprecated "white" and "black" commands to keep track of the
    computer's side of the game.
 2) Winboard "level" command accepts time of form mm:ss and allows decimal
    times.
 3) More general code for trapped bishop.
 4) Static null pruning is implemented.
 5) Dynamic null reduction based on score (aka "smooth scaling").
 6) Changes to razor & futility margins and related code.
 7) Fixes to history pruning. History table is global now, not per-thread.

Changes in Arasan 13.2:
 1) Fix in search to eliminate some unnecessary re-searches.
 2) Fixes to material scoring for unbalanced material positions.
 3) Simplified bonus code for Bishop in endgames with pawns on both sides.
 4) Revised bonus for trading material when ahead.
 5) Misc. scoring fixes, esp. for connected rook on 7th.
 6) Utility programs such as makebook now do not create a log file.
 7) Another/better fix for UCI output after a quick mate.

Changes in Arasan 13.1:
 1) KPK bitbases are now internal to the program, not stored in files.
 2) Minor change to checks in qsearch conditions.
 3) Fix bug in see pruning affecting stalemate detection.
 4) Fix bug where UCI PV output was omitted in case search terminated
    very rapidly (for example, in cases of a forced mate).
 5) Handle DOS-style CR/LF from chess interfaces such as SCID.
 6) Some book additions/fixes.

Changes in Arasan 13.0:
 1) History pruning and see pruning are implemented.
 2) Fixes to history code.
 3) Code cleanup and parameter tweaking in evaluation, especially to
    isolated pawns, pawn center scores, passed pawns, mobility, king safety.
 4) Fixed bug in adjacent passer code.
 5) Potential passer code is more accurate.
 6) Material scoring changes: queen value is higher, re-introduced some
    special case adjustments for bad trades.
 7) Check extensions have been reduced to 3/4 ply.
 8) Hash table code cleanup & bug fixes.
 9) Intel C++ supported under Windows.
 10) GUI edit menu allows paste of PGN and FEN from the clipboard into the GUI.
 11) fix GUI memory leak.
 12) By default, Arasan will play a somewhat wider variety of openings (the
 book selectivity option can be used to change this).

Changes in Arasan 12.3:
 1) Changes to move ordering in qsearch - formerly we used to call see()
    in the initial move sorting phase but now it is deferred until we
    are ready to use a move - this is how most programs do it.
 2) Linux version uses an ASM routine (if USE_ASM is defined) for
    bit extraction - this is much faster (on CPUs that support it).
 3) Small fix to pin detection.
 4) Bug fixes in scoring: specifically in adjustMaterialScoreNoPawns,
    outpost scoring, potential passer scoring, passer piece block.
 5) Reduce penalty for open files around king (was excessive)
 6) Qsearch futility prune margin increased back to 1 1/4 pawn. Changes
    to LMR reduction depth and thresholds.
 7) Endgame capture extension is made in more cases but is decreased to
    1/2 ply extra depth
 8) Several UCI protocol fixes.

Changes in Arasan 12.2 (Nov. 2010):
 1) Somewhat complex trade scoring has been removed - in favor of just
    adjusting piece values.
 2) More aggressive futility pruning, margin is adjusted at 1/2 ply increments.
 3) Changes to extension/pruning logic. LMR now done after futility. Extra
    LMR is done at high depths/move counts.
 4) King safety scoring changed - open files are now scored separately,
    score is based on opposing Rook + Queen count.
 5) Bishop pair score reduced (but increases in endgame).
 6) Changes to pawn scoring: outside pawn & doubled pawn scores reduced.
 7) Outside pawn calc is done via a table, like Crafty does.
 8) Penalty for own pieces ahead of passer; somewhat reduced bonus for rook
    behind passer.
 9) EGTB values are no longer hashed (seemed to cause problems).
 10) Minor GUI fix: remove trailing junk after game description.

Changes in Arasan 12.1 (Aug. 2010):
 1) Remove extra "quit" output on program termination
 2) Decrease thread wait time on exit
 3) Fix UCI tablebase support - enable tablebases when path is set
 4) Fix to outside passed pawn scoring
 5) Increase king attack scores

Changes in Arasan 12.0 (Aug. 2010):
 1) Eval code is changed to split eval terms more explicitly into 
    opening, middlegame and endgame terms and these are merged via
    a weighting function based on material. 
 2) Some eval changes to king safety, bishop pair, etc.
 3) King safety cache was also used for opponent pawn proximity - but 
    the hashing didn't account for opponent pawns. This is fixed by
    not storing proximity in the cache.
 4) Material score adjustment added for Q vs R + Pawns, and R vs pawns. 
 5) Some new "trade down" bonus code is present to encourage exchanging
    when ahead - there was some code for this earlier but less correct.
 6) Fix to futility pruning margin calculation.
 7) Fixed a Winboard/xboard driver bug where some "ping" commands from
    ICC were being ignored.
 8) Fix a rarely occurring bug in qsearch: generating a check
    that involves moving a pinned piece.
 9) Fix bug in razoring code that could cause array overflow at very
    large search depths (as in endgame).
 10) Fix display in GUI game list dialog & main window to include year of game

Changes in Arasan 11.7 (Feb. 2010):

 1) Fix in PGN parser for rare cases where moves need rank + file for
disambiguation.
 2) Changes to LMR and other pruning logic.
 3) Fix time measurement bug in Linux version.
 4) Fix thread deadlock problems on Linux.
 5) Convert to POSIX unnamed semaphores for Linux, to ensure semaphore
    cleanup on program exit.
 6) Multiple other code fixes and warning removal for Linux/Mac compiles. 
 7) Bug fix in Board::wouldCheck.
 8) Increased scores for bishop pair, Rook on 7th
 9) Fix UCI mate score output.
10) Fix crash bug in UCI mode on Vista, Windows 7

Changes in Arasan 11.6 (Nov. 2009):
 1) Several speed improvements:
    a. Greater use of lazy eval + partial evals are now cached.
    b. Best move and score in eval cache can be independently updated.
    c. Eval cache is shared across threads.
    d. better alignment/sizing of structures
 2) Scoring changes:
    a. Bishop pair bonus decreased a bit
    b. Mobility scores tweaked
    c. Outpost scoring tweaked
    d. Some king safety changes esp. for enemy pawns near King
 3) Search changes:
    a. Now using variable reduction null move again.
    b. Allow reduce/prune on moves regardless of history, except the
       two moves with best history are exempt.

Changes in Arasan 11.5 (Sept. 2009):
 1) King safety scores are tapered off so they don't reach extreme values.
 2) Mobility calculation improvements.
 3) Changes to razoring logic.
 4) Profile Guided Optimization (PGO) build uses deeper search on
    fewer positions.

Changes in Arasan 11.4 (June 2009):
 1) Fix to KBP draw code.
 2) Fix Winboard/xboard driver to send "O-O" not "o-o" for castling.
 3) Fix time calculation in tournament mode.
 4) Scoring changes, fixes for Rook mobility & rooks on open files.
 5) Scoring change in king safety: don't count Bishops more highly
    than Knights in evaluating king attacks.
 6) The usual book fixes/additions.

Changes in Arasan 11.3 (March 2009):
 1) Fix bug that caused occasional early search termination.
 2) Fix Winboard communication to use a thread for greater reliablity.
 3) Keep game file open - fixes some occasional failures to save games.
 4) Fix Makefile to build "pgn2book" utility (some code fixes in this too).
 5) Some search changes: Lessen futility margin. Enable additional extensions at ply 0. Enable a version of razoring.
 6) Improved move ordering based on node counts.
 7) Bug fix in outpost scoring.
 8) Passed pawn scores increased.
 9) Bug fix in GUI: bad PV display at high search depths.
 10) Larger opening book.

Changes in Arasan 11.2 (Dec. 2008):
 1) Fix square colors in mono mode in GUI display.
 2) More Linux compile fixes.
 3) Fixes for compilation on MacOS.
 4) Bug fixes in scoring module (array overrun).
 5) Some pawn race code added (ported from version 10.4).
 6) Fixes to contempt factor based on ICC rating.
 7) Bug fix in book learning.

Changes in Arasan 11.1 (Dec. 2008):
 1) Fix mono mode in GUI display.
 2) Fix compile problem with 32-bit Linux
 3) Fix deadlock problem under Linux.
 4) Some bug fixes in search.
 5) Fix bug - contempt factor based on rating diff (when on a chess server)
    was not being set.
 6) Uninstaller removes .lrn file.

Changes in Arasan 11.0 (Nov. 2008):
 1) Re-work to use "magic" bitboard logic instead of rotated bitboards. About
    20-25% speedup from this.
 2) Eval re-written to use bitboard attack functions for king safety, mobility.
 3) Some changes and fixes to search (especially LMR).
 4) Check extensions are done at ply=0 now.
 5) Substantial code cleanup, more consistent variable/function naming,
    remove obsolete or redundant code. 
 6) g++ 3.2 and earlier are no longer supported.
 7) Various scoring changes, including fixes to outside passed pawn scoring.
 8) Remove unsafe optimization for q-search when in check.
 9) Remove lock on main hash table - speeds up multi-threaded searches (thanks
    to Bob Hyatt).
 10) New position learning system - keeps learn data in a text file vs a
    book file. Learn data is loaded into the main hash table (simpler and
    avoids locking). Fixes to position learn code. 
 11) Fixes for loss on time with very short time controls.

Changes in Arasan 10.4 (June 2008):
 1) Speedup illegal move detection in search.
 2) Speedups in move generation.
 3) Improved move ordering for check evasions.
 4) Use IID more sparingly.
 5) Several scoring changes, esp. fixes/improvements to material scoring.
 6) Fix to "bk" command (to list opening book moves).
 7) Time usage fixes/improvements.
 8) A couple of locking fixes for more stable SMP operation.
 9) Fix for invalid moves propagated to pv list
 10) Clear history data before each search in testsuite mode.

Changes in Arasan 10.3 (Mar. 2008):
 1) Fix bad search bug which caused different behavior in SMP and single
    thread search code and unstable searches with 1 cpu.
 2) Another search bug fix - caused problems in statemate detection.
 3) Couple of scoring fixes.
 4) Support Threads option in UCI mode.

Changes in Arasan 10.2 (Feb. 2008):
 1) Fix possible crash bug: check for previous illegal move before hash
    cutoff.
 2) Forced move extension in q-search removed - caused some searches to
    blow up (excessive nodes searched).
 3) Limited razoring removed - in its place, wider use of LMR. Consolidate
    reduction + pruning code. Disable recapture extension by default.
 4) Some pawn scoring changes. Fixed asymmetric king center score in endgame.
 5) Bug fixes in bad trade scoring. 
 6) Greater use of R=3 in null move.
 7) Linux bug fix: free semaphores on exit.

Changes in Arasan 10.1:
 1) Substantially more efficient SMP support, keeps threads more active.
 2) Some bug fixes in scoring and checking move generation, thanks to
    Keiichiro Tashiro.
 3) King safety and endgame scoring changes & fixes.
 4) Fixed bug that could cause failure to move when there is a single
    legal move from the tablebases.
 5) Fix bug that could lead to illegal moves in pv display.
 6) Fix long-existing move sorting bug.
 7) Use narrower bounds on re-search (Negascout algorithm). Reduce re-search
    frequency by setting flag when score is exact.
 8) Fix bad search bug involving illegal move detection - in some cases a
    valid score was returned after a previous illegal move. One symptom
    was problems with stalemate detection.

Changes in Arasan 10.0:
 1) Fix to pawn scoring: a doubled pawn behind a passed pawn is no longer
    counted as passed also.
 2) Changes to king safety and mobility scoring. Bishop and queen attacks
    and mobility are now checked in all directions (was formerly only the
    "forward" direction).
 3) Other scoring changes, including adjustments to piece trade scoring.
 4) Multi-core/multi-procesor (SMP) support is now working, using the YBWC
    algorithm. However the "helpful master" concept is not yet implemented.
 5) Now supports 6-man tablebases. Some fixes added to better tolerate
    incomplete 6-man tb sets.
 6) Checks in q-search are on by default now. Checking moves are generated
    for 1st two plies of q-search (configurable), but can be extended in
    some cases.
 7) Forced move extension tweaked - move generator marks move as forced
    when a singular check evasion that is not a winning capture exists.
 8) Some changes also to late move reduction and recapture extension code.
 9) Null move verification search was broken - it works now.
 10) Another fix for draw scoring - avoid draw when opponent is lower rated  
 11) Arasan outputs more information to UCI clients during a search.
 12) UCI time management fixes.

Changes in Arasan 9.5:
 1) Fix bad mate scores from EGTB hit.
 2) Numerous UCI fixes:
    a) Fix notation for pv
    b) Fix multipv output under Chessbase GUI.
    c) Fix UCI pv output during ponder.
    d) Fixes for hang under Shredder UI
 3) Some additonal book fixes

Changes in Arasan 9.4:
 1) Some speed enhancements. For example, check evasion is incremental now.
 2) Q-search has special code for check evasion. Checking move generation
    can be enabled in the q-search (off by default).
 3) Scoring changes: king safety, passed pawn, piece placement, bad trade.
 4) Engine will kibitz if on ICC and opponent is a computer.
 5) Fix for PV display under Arena with UCI: use O-O, O-O-O for castling.
 6) Fix result learning information in arasan.log.
 7) Fix draw accept logic - was erroneously accepting draws from lower
    ranked players on ICC in some situations.
 8) Fix tablebase probe logic - probes in more cases now.
 9) The usual book additions/fixes.

Changes in Arasan 9.3:
 1) Another KBP vs K draw fix.
 2) Bug fixed in pawn race scoring.
 3) Passed pawn scoring changes.
 4) King safety changes.
 5) Some search changes. Reductions now not done in pv.
 6) GUI fix: Fix Edit|Copy Game to Cliboard.
 7) GUI fix: "Hint" command shows book moves.
 8) GUI fix: Auto-saved games show computer side correctly.
 9) Some Linux and Windows x64 specific fixes.
 10) Larger opening book, book fixes.

Changes in Arasan 9.2:
 1) Fix illegal move after promotion under UCI.

Changes in Arasan 9.1:
 1) UCI protocol fixes
 2) Fix tablebase/hashtable interaction problem
 3) Some book additions/fixes

Changes in Arasan 9.0:
 1) New king safety scoring routine.
 2) Increased bonus for mobility in scoring module. 
 3) Disabled buggy code for wrong bishop draw (still recognizes
    some simple cases).
 4) A couple of rare crash bugs fixed. 
 5) Extension after repetition added.
 6) "History pruning" added.
 7) There is experimenal support for multi-threading, not
    enabled in the compiled binaries.
 8) The Linux version now compiles with gcc 4.0 and above.
 9) Improved, larger opening book. Book selection logic has
    been changed, so that Arasan will play a somewhat wider
    selection of openings.
10) UCI protocol support.
11) GUI fixes to work on 120DPI displays. Also some fixes put in for
    GUI occasionally getting out of sync with engine.

Changes in Arasan 8.4:
 1) Bug fixes in pin detection
 2) Scoring changes
 3) Better lazy eval in scoring module.
 4) Improved pawn race scoring, handles more cases.
 5) More liberal use of null move in endgames (but less aggressive use
    of R=3).
 6) "make install" target added to Linux Makefile.
 7) use feature done=0/done=1 to bracket tablebase initialization.

Changes in Arasan 8.3:
 1) Small king safety change in eval
 2) Fix for crash on make move after "undo" in UI.
 3) Some misc. code cleanup. 

Changes in Arasan 8.2:
 1) Fixes to draw by repetition detection.
 2) Several endgame scoring and bug fixes. Pawn race code is more accurate.
 3) Remove losing moves (leading to mate) from move list - was supposed
    to do this before but it works now.
 4) KPK endgame is now computed using bitbases.
 5) Some speed improvements in check evasion code.

Changes in Arasan 8.1 (Sept. 2004):
 1) Fixed bad bug related to pawn promotions, giving unstable score with
    promotion moves.
 2) Some asymmetric eval added to avoid "locked" pawn positions
 3) Pawn scoring changes.
 4) Killer move phase now uses killers at ply-2.
 5) GUI fix: "Think When Idle" option didn't work properly.

Changes in Arasan 8.0 (Aug. 2004):
 1) Extended futility pruning is implemented now. Futility pruning and
    razoring can be combined.
 2) Passed pawns are scored higher.
 3) "Capture" extension is now disabled by default.
 4) Fixed some bugs in king-pawn hash table code
 5) Minor changes to hash probe code. 
 6) Default tablebases cache size increased, changes to tablebase probe
    logic. Generally this version does fewer probes.
 7) New egtb code from Eugene Nalimov & Andrew Kadatch.
 8) Significant changes to evaluation. Evaluation is simpler and 
    faster. A small evaluation cache is used.
 9) Various speed enhancements, in move generator and elsewhere.
 10) Some fixes to 50-move draw handling.
 11) "makebook" program can now filter moves so that only moves
     occurring with a minimum frequency will be included. New book
     uses minimum frequency of 6 from a large PGN game collection.
 12) a few minor GUI fixes.

Changes in Arasan 7.4:
 1) King safety and knight centrality scoring fixes (knight centrality
    was actually backwards - White table was used for Black).
 2) Speed improvement: routine wouldCheck handles more cases, allowing
    more cases of forward pruning before doMove.
 3) Fix GUI bug re "hint" being given for the wrong side.
 4) Fix GUI bug: next/previous game could crash if engine reply comes
    after the command.
 5) Fix GUI bug: takeback while engine is searching could sometimes 
    result in pieces changing color and other strange behavior.
 6) GUI: Fix some BoundsChecker errors/warnings.
 7) A new "options.book_enabled" flag is in arasan.rc: setting this
    false disables the opening book.
 8) Fix Linux spec file so it can build a binary RPM correctly.
 9) Linux version installs to /usr/local/bin, not /usr/bin

Changes in Arasan 7.3:
 1) Fixes to KB+rook P draw detection (w/o tablebases).
 2) Fix to "bad trade" scoring (Q vs N/B+R)
 3) Some other small evaluation fixes.
 4) Fix GUI bug - clock display problems after Takeback/Forward.
 5) Fix GUI bug - problem loading PGN file with non-standard starting
    position (FEN tag).
 6) Fix behavior when draw detected at root node.
 7) Some time management fixes.
 8) Fix bug involving wrong result claim after being mated, with
    tablebases enabled (thanks to Volker Pittlik for reporting this).
 9) Fixes in Linux version to support a wider range of GCC versions.

Changes in Arasan 7.2:
 1) Fixed a couple GUI/engine bugs that could cause crashes when
browsing a game or switching from browsing to playing.
 2) Fix for faster/more reliable termination when Arasan is checkmated
or stalemated.
 3) Move ordering improvements
 4) Null move R=3 is used somewhat more frequently.
 5) Pawn scoring changes
 6) Fix bug in handling resign threshold option.

Changes in Arasan 7.1:
 1) Fixed GUI bug where player info was not displayed correctly after
    loading a new game from a file.
 2) Fixed GUI bug re "think when idle" setting not being passed to
    engine.
 3) Incomplete games were not saved with an incomplete ("*") result - 
    this is fixed.
 4) Removed "Custom" option in installer - caused problems.
 5) Some minor search improvements.
 6) Some opening book fixes.

Changes in Arasan 7.0:

 1) Fixed a bug in handling of the "en passant target" square when
    loading a FEN position file.
 2) Numerous speed improvements in the engine. Move generation is
    incremental now.
 3) Razoring has been modified.
 4) Fixes and ehancements have been made to tablebase use in the
    endgame. Tablebase hits are now cached, for faster speed.
 5) Several endgame scoring fixes and improvements have been made.
 6) Mate scores in the winboard driver are normalized to 100.
 7) GUI can set board colors now, like Arasan 5.4.
 8) GUI repaint has been optimized for faster speed.
 9) Misc. other GUI fixes.

Changes in Arasan 6.3:

 1) More changes to king safety
 2) Fixes to tablebase support, to work better with 5-man tablebases.
 3) Some move ordering improvements and speedups.
 4) GUI now ignores engine moves received when in "force" mode -
    fixes problems with takeback command while the engine is
    searching.
 5) Sometimes Arasan could hang on ICC when it receives a move
    without a carriage return. There was code to fix this, but
    it had to be updated now that Winboard can use SAN for moves.
 6) Windows installer now uses InstallShield Express version 4.

Changes in Arasan 6.2:

 1) More fixes to time management.
 2) Several positional scoring changes have been made. King safety
    is somewhat different in this version. Lazy evaluation in the
    scoring module has been made more efficient.
 3) Some recoding has been done in the quiescence search for
    faster speed. A somewhat different forward pruning technique
    is used in the q-search.
 4) This verison does "adaptive null pruning" similar to that
    described by Ernst Heinz.
 5) The "bad trade" scoring is now tapered off as material drops -
    this fixes some bad behavior at the threshold of bad trade scoring.
 6) There were problems with the GUI only partially initializing
    before trying to read a file specified on the command line.
    This is fixed. 
 7) Some fixes were made in Winboard analysis mode. In particular,
    Arasan would go into a tight loop when it hit a mate score.
    Now it stops analyzing and waits for a command.
 8) Some GUI and engine fixes were made to fix bugs with switching
    sides using "Computer Plays White" menu item.

Changes in Arasan 6.1:

 1) Some speed improvements were made in several areas.
 2) Some opening book additions and corrections were made.
 3) The GUI showed the letter coordinates backwards when
    the board was turned - this is fixed.
 4) GUI display of mate scores was incorrect - this is fixed.
 5) In the GUI, loading a new PGN file after one has already 
    been loaded left the engine in an incorrect state - this
    is fixed.
 6) Game results could be shown backwards (e.g. a White win
    instead of Black) in some circumstances. This is fixed.
 7) Some king safety scoring improvements and fixes were made.
 8) Arasan 6.0 could lose on time, especially in short
    time control games with pondering enabled. Some fixes
    have been made to make this less likely to happen.

Changes in Arasan 6.0.1:

Patch to fix problem with initializing tablebases (Windows only).

Changes in Arasan 6.0:

 1) A Linux version is now available. 
 2) The king safety routine has been rewritten for greater
speed and accuracy.
 3) The search routine has been recoded. Futility
pruning as described by Ernst Heinz is implemented. Razoring
is now done in the main search routine and not in a separate
one as in 5.4. Extensions have been changed.
 4) More elaborate lazy evaluation is done in the scoring
module and more aggressive forward pruning in the quiescence
search.
 5) Passed pawn scores have been increased, as have bonuses
for king centrality in the endgame (plus king near pawns,
if the pawns are on one side of the board).
 6) Lots of fixes in the Winboard/xboard driver (arasanx.cpp),
for greater reliability and to get it to work under Linux using
xboard. One bug fix is that pondering took place
without the global move list being updated: this broke
3-time repetition detection and could result in the program
playing into a draw when it shouldn't.
 7) A bad bug was fixed in the opening book code - an integer
overflow in the frequency field of a book entry. This caused
problems, but only in multi-megabyte sized books. Note: the
book format has changed for this version. Older binary book
files will not work with version 6.0. 
 8) A rare but annoying bug was fixed - sometimes the castling
status was set incorrectly after a rook move. 
 9) In version 5.4, after loading a position from a file (e.g.
from the xboard -lpf command), the opening book could fail to
work because the castling status was incorrect. A fix for this
has been made in bhash.cpp.
10) A smaller hand-tuned book is provided with this version.
11) Book learning based on game results is implemented. Some fixes
and enhancements were also made to positional learning.
12) An "arasan.rc" file can be used to tweak many program
parameters.
13) Winboard/xboard analyze mode is supported.
14) This version has been tested with Winboard 4.2.6. The "new"
Winboard protocol is supported.
15) Arasan can use compressed Nalimov tablebases. 
Eugene Nalimov and Andrew Kadatch retain copyright to the
portions of the code that implement tablebase handling and
decompression. It is included in the Arasan source 
distribution with permission.
16) The Windows version has a new simplified GUI that runs
the chess engine as a separate process, like Winboard.
TrueType fonts are now used instead of bitmaps for the
pieces.
