Freecell Solver's News File
===========================
Shlomi Fish <shlomif@cpan.org>
:Date: 2018-07-24
:Revision: $Id$

Version 5.0.0: (27-Oct-2018)
----------------------------

1. *Breaking change*: made the userland headers +fcs_user.h+, +fcs_cl.h+, etc.
includable only as +#include <freecell-solver/fcs_cl.h>+. The API and ABI
should otherwise remain the same.

2. Add the gen-multiple-pysol-layouts executable to generate several numbered
deals as separate files.

3. Added the experimental fc-solve-multi solver to solve several files in
one go (not installed by default).

4. Rename the AsciiDoc documents from +\*.txt+ to +\*.asciidoc+, in order to
please GitHub/etc. ; updated them and fixed some formatting.

Version 4.20.0: (25-Jul-2018)
-----------------------------

1. New --iter-output-step command-line flag.

2. New --hint-on-intractable command-line flag and functionality.

3. Add -DFCS_MAX_RANK=... compile time option to set the maximal rank below 13.

4. Add the -DFCS_BREAK_BACKWARD_COMPAT_2=1 compile-time option which improves
performance but breaks bug-to-bug backward compatibility.

5. Add the -DFCS_UNSAFE=1 option.

6. Converted the python-based testing scripts from TAP.Simple to pycotap.

7. Other speedups and refactorings.

Version 4.18.0: (22-Mar-2018)
-----------------------------

1. Convert the code in board_gen/ from the GPL to the MIT/Expat licence.

2. Convert the hash function to xxHash ( https://cyan4973.github.io/xxHash/ )
for improved performance.

3. Eliminate several GCC warnings and other cleanups and speedups.

Version 4.16.0: (21-Jan-2018)
-----------------------------

1. Add a new +-l looking-glass+ command line preset, which provides improved
speed.

2. Add some programs to find the deal index of a card layout.

3. Remove "freecell-solver-config" - one should use pkg-config instead.

4. Many small optimizations and cleanups.

Version 4.14.1: (06-Oct-2017)
-----------------------------

1. Fix the compilation and tests when +__int128+ is not available (e.g: on
x86-32 systems).

2. Fix a double-free error in certain conditions. Thanks to Theodore Pringle.
See: https://groups.yahoo.com/neo/groups/fc-solve-discuss/conversations/messages/1554

Version 4.14.0: (02-Oct-2017)
-----------------------------

1. Add a new 'j' move of moving cards from freecells to empty columns and
immediately putting cards on top.

2. Add a new +-l cookie-monster+ command line preset based on it which sports
improved speed.

3. Fixed a bug with a potential hang with two identically-depthed +-dto2+
flags:
https://groups.yahoo.com/neo/groups/fc-solve-discuss/conversations/messages/1549

Version 4.12.1: (10-Jun-2017)
-----------------------------

1. Fix dealing of high indexed (above 2G) deals on some 32-bit and/or
MS Windows platforms.

Version 4.12.0: (09-Jun-2017)
-----------------------------

1. Fix a problem where the fc-pro-range-solver ignored game parameters such
as +--freecells-num 0+. (Thanks to Larry).

2. Enable building an MS Windows 32-bit installer using AppVeyor. This will
facilitate releasing them along with the source.

3. Some more minor cleanups and optimizations.

Version 4.10.0: (31-May-2017)
-----------------------------

1. Add some new compile-time options that may make the runtime faster, but
may remove or break functionality.

2. Convert the python-based automated tests to use cffi, which is more modern
and recommended, instead of ctypes.

3. Many code cleanups, refactorings, and optimizations.

Version 4.8.0: (20-Jan-2017)
----------------------------

1. Fix a crash when doing +fc-solve -g [non-existent-game]+ (with tests):
https://github.com/shlomif/fc-solve/issues/11 .

2. Mention the final parameter name (instead of just saying "(null)") when
it accepts a non-given argument:
https://github.com/shlomif/fc-solve/issues/12 .

3. Remove DEBUG_STATES - it was slow and not really helpful and caused bloat.

4. Implement condition variables instead of usleep in the depth_dbm_solver .
https://github.com/shlomif/fc-solve/issues/8 . It now also supports processing
batches of items from the queue in a single transaction.

5. Got a test suite to pass on MS-Windows / AppVeyor:
https://ci.appveyor.com/project/shlomif/fc-solve .

6. Many large and small code cleanups and refactorings.

Version 4.6.1: (14-Jan-2017)
----------------------------

1. Fix for building the package in certain conditions (originally created for
the Mageia Linux package).

Version 4.6.0: (04-Dec-2016)
----------------------------

1. Got the production code and tests to pass on ARM Linux. Previously
+fc-solve+ just hanged there.

2. Fix the tests and +depth_dbm_fc_solver+ on 32-bit platforms.

3. Apply the large Freecell Pro seeds deals generation to the board generators
and range solvers.

4. Option to use +$$_$$$$_$$int128+ instead of libGMP for the DBM solvers - a
significant speed-up, see
http://fc-solve.shlomifish.org/charts/dbm-solver-__int128-optimisation/ .

5. Revise some awkward phrasing in the README .

6. Many small and larger cleanups.

Version 4.4.0: (22-Sep-2016)
----------------------------

1. Add the +-l one-big-family+, or +-l obf+ for short, preset which improves
the average performance for solving Freecell deals.

2. Add the +transpose-freecell-board.py+ utility to transpose a board from
having stacks-in-columns to a stacks-in-lines format acceptable by fc-solve.

3. Fix a bug where using a flare-based scan while incrementally increasing
the iterations limit could have created a situation where one scan gets all
the iterations.

4. Remove make-gnome-freecell-board (GNOME Freecell was discontinued)
and make-aisleriot-freecell-board (as AisleRiot no longer has numbered deals).

5. Fix some crashes that were found using
http://lcamtuf.coredump.cx/afl/[American Fuzzy Lop], caused due to misuse of
the command line arguments or the input board format.

6. Fix a major regression bug in the +depth_dbm_fc_solve+ and possibly related
solvers that prevented it from making progress.

7. Some optimisations for improving general performance on all presets.

8. Many code cleanups and refactorings.

Version 4.2.0: (25-Mar-2016)
----------------------------

1. New command-line preset +-l conspiracy-theory+ or +-l ct+ for short that is
faster than +-l as+ on average.

2. Bug fix: some error messages are not emitted to STDERR instead of STDOUT.
Furthermore, the exit code on some failures is now non-zero.

3. Bug fix: flares names in the flares plan is now their exact strings instead
of any possible beginning of them.

4. Add a compile-time option to not compile the FC-Pro moves count (used
primarily for determining the shortest flares). It is
+-DFCS_WITHOUT_FC_PRO_MOVES_COUNT=1+ .

5. Bug fix: properly clean-up solution_moves on recycle.

6. Bug fix: fix the output of the Freecell's dashes in non-parsable output.

7. Add a compile-time option (+-DFCS_BREAK_BACKWARD_COMPAT_1+) to break some
backward compatibility, such as old functions, cards with "10" instead of "T",
trailing whitespace in output, and the non-"-p" output of states. This makes
the binaries smaller and faster but may break some existing functionality.
Enabling it is not recommended.

8. Freecell Solver now uses https://travis-ci.org/[Travis-CI] to build and
test the code in several configurations on each commit. This is part of the
so-called “Continuous Integration” practice.

9. Added support for clang to the PGO (= profile-guided-optimizations)
scripts.

10. Moved away or deleted many scripts and other cruft.

11. Remove FCS_STATE_STORAGE_INDIRECT - it was old and slow and the hash lookup
or a balanced binary tree should be used instead.

12. Remove the experimental flipping support and made the default for cards
not to be flippable at all. (The code did not build with it enabled anyway.)

13. Many small and large cleanups, optimizations and refactorings - hopefully
without breaking backward-compatibility.

Version 4.0.2: (14-Jan-2016)
----------------------------

1. Correct tarball release - 4.0.1 should not be used.

Version 4.0.1: (14-Jan-2016)
----------------------------

1. Fix the tests for the new Games-Solitaire-Verify (0.1601).

2. Apply a patch from http://www.mageia.org/[Mageia] to prevent underlinking
during build. Thanks!

3. Disable linking to the gperftools’ tcmalloc library if the test suite
is enabled due to https://github.com/gperftools/gperftools/issues/758 .

Version 4.0.0: (27-Sep-2015)
----------------------------

1. Integrate the scans of Tom Holroyd’s patsolve, for a faster atomic
moves-based solver. See the +--method patsolve+, +--patsolve-x-param+
and +--patsolve-y-param+ options in the +USAGE.txt+ file.

2. Add the +-dto2+ / +--depth-tests-order2+ flag to provide a corrected
version of the depth-tests-order feature without the depth string and comma
being prefixed to the tests order due to an oversight.

3. Convert the Python code (tests + board generation) to Python 3, because
it seems that Python 2 is going away. To run it, we require the "random2"
module from PyPI : https://pypi.python.org/pypi/random2 .

4. Many small cleanups and optimisations.

5. Source tarball is now “.tar.xz”.

Version 3.26.0: (19-May-2014)
-----------------------------

1. Remove the documents (e.g: +README+, +COPYING+, +AUTHORS+), which
have duplicates with a .txt extension from the source distribution, to save
space. They are still being copied to their location in the BINARY_DIR
where cmake is invoked from.

2. Fix a division/modulo by zero problem that yielded a floating-point
exception, as reported by the Mayhem team to the Debian bug tracker:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=715914 . Thanks!

3. Fix +board_gen/pi-make-microsoft-freecell-board+
+board_gen/make-aisleriot-freecell-board+ and +
+board_gen/make-gnome-freecell-board+ from crashing if only a single "-t"
flag is given. A crash was reported by the Mayhem team to the Debian
bug tracker: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=716097 . Thanks!

4. Fix the automated tests, so they will support the new versions of
Games::Solitaire::Verify[http://fc-solve.shlomifish.org/verify-code/] .

5. Remove +make_microsoft_freecell_board.c+ - it is not useful and
+pi-make-microsoft-freecell-board+ or +make_pysol_freecell_board.py+ should
be used instead.

6. Fix the build process for version 4.9.x of the GCC compiler.

7. Add the pseudo-DFS solver in +pseudo_dfs_atomic_moves_solver.c+ ,
which is another attempt at solving hard two freecell deals. It runs,
but generates a very large stack with the deal in question (MS #384243 ).

8. The +summarize-fc-solve+ script now accepts some game parameters followed
by a double-dash ("--"), followed by preset parameters for the solver.

9. Various fixes for warnings and errors for the build process, while using
CMake-3.0.0-rc3 (what will become CMake-3.0.0).

10. Some cleanups, refactorings, modernisations, and minor optimisations.

Version 3.24.0: (23-Feb-2014)
-----------------------------

1. This release is dedicated to the memory of Adrian Ettlinger (see
https://en.wikipedia.org/wiki/Adrian_Ettlinger ) who passed away on
23 October 2013, who was a good Internet friend of the primary maintainer of
Freecell Solver (= Shlomi Fish), and who contributed a great deal to Freecell
Solver and to Freecell research and programming in general (among other
life achievements, and contributions). You can find an obituary of
Mr. Ettlinger by Shlomi Fish here:
https://groups.yahoo.com/neo/groups/fc-solve-discuss/conversations/messages/1379
and the +video-editing+ preset (see below) was named in honor of his previous
work in pioneering non-linear video editing.

2. Handle board/layout inputs without a trailing newline character on the last
line properly (thanks to someone who reported it via E-mail with respect to
the JavaScript-based solver).

3. Add the +-l video-editing+ or +-l ve+ flare-based preset for shorter
solutions (on average).

4. The distribution now contains the sources for the so-called
split-fcc-solver, which was originally conceived as an attempt to
determine whether the Windows Freecell deal No. 384,243 is solvable with
two freecells or not. The attempt failed because the split-FCC-solver
generated large intermediate outputs, but it may prove of some utility
in the future (while being experimental).

Version 3.22.0: (05-Oct-2013)
-----------------------------

1. Made sure unknown options which have a prefix that is a recognised option
(e.g: +--resetjunk+ vs. +--reset+), will be reported as such instead of
processed as the prefix automagically.

2. Fix the Win32 NSIS package, so it will build, run and process the presets.

3. The JavaScript-based solver now accepts arbitrary fc-solve command line
parameters, so it can solve any of the supported variants of Solitaire.

Version 3.20.1: (01-Jul-2013)
-----------------------------

1. Fix the build and silenced some warnings on MinGW/GCC/Win32.

Version 3.20.0: (26-Jun-2013)
-----------------------------

1. Major speedups to the Simple Simon code - including order of complexity
ones where a lookup is now O(1) instead of O(num_cards). The Simple Simon
code was in general heavily refactored and cleaned up.

2. Some bugs in the Simple Simon algorithms were fixed, slightly modifying
the outputted solutions.

3. Add missing BuildRequires to the RPM .spec .

4. Add the +qualified-seed-improved+ preset.

5. Fix the run-time display of the iteration count during
+pkill -USR1 fc-solve+.

6. Some minor refactorings and optimisations.

Version 3.18.1: (30-May-2013)
-----------------------------

1. Fix "make install" - there were some problems with the generation of
the man pages.

2. Fix the RPM .spec building.

Version 3.18.0: (30-May-2013)
-----------------------------

1. Add a JavaScript port that uses Emscripten
( https://github.com/kripken/emscripten ) to compile the C code into
JavaScript. See +Makefile.to-javascript.mak+ and the contents of
The +/fc-solve/site/wml+ directory of the repository.

2. Convert the CMake build system to the common +cmake/Shlomif_Common.cmake+
file, which will facilitate cross-project maintenance. It is included inside
the archive.

3. Added a +--help+ flag for the summarize-fc-solve executable.

4. Got the test suite and the +dbm_fc_solver+ and the +depth_dbm_fc_solver+
to run properly on 32-bit architectures.

5. The default rpm spec now runs the test suite.

6. Add http://en.wikipedia.org/wiki/Const-correctness[const] annotations and
moved declarations to where they are first assigned.

Version 3.16.0: (30-Nov-2012)
-----------------------------

1. Add the +-l micro-finance-improved+ preset (or +-l mfi+ for short),
which somewhat improves the length of the solutions of the +micro-finance+
preset.

2. Add the +--flares-choice+ option, which determines how the winning flare
is chosen.

3. Add the +--flares-iters-factor+ option (or +-fif+ for short), which
specifies a factor to multiply the flares quotas.

4. Add the +-l qualified-seed+ preset (or +-l qs+ for short),
which somewhat improves the length of the solutions of the
+-l micro-finance-improved+ preset.

5. The individual flares are now recycled and their memory is reused when
they are no longer needed. This is a RAM optimisation, which is applicable
only for flares-based presets.

Version 3.14.1: (01-Nov-2012)
-----------------------------

1. Fix the build on Windows with DWIM Perl and its Mingw32 (+strndup()+
was missing).

Version 3.14.0: (31-Oct-2012)
-----------------------------

1. Got the tests to pass with +cmake -DFCS_WITHOUT_DEPTH_FIELD=1+ by making
the library behave the same as without it. This also affected the behaviour of
+./fc-solve -l mo+ with attempting to solve Baker’s Dozen deals.

2. On UNIX platforms, +fc-solve+ now exits gracefully with the message
“Iterations count exceeded.”, upon receiving a SIGABRT signal. Can be
triggered by executing +pkill -ABRT fc-solve+.

3. The game states’ input routines now accept regular columns that start with
a leading colon (":"). As a result, one can input the states as output from
the solver with the +-p+ and +-t+ flags directly there.

4. Added a 6th BeFS weight (see the +-asw+ flag) of the inverse of the number
of cards not above parents. Using
+./freecell-solver-range-parallel-solve 1 32000 1 -p -t -sam --method a-star -to 0123467589 -asw 1,0,0,0,0,1 -sp r:tf -mi 100000+
appears to be interesting.

5. Allow test groups inside the +-to+ and +-dto+ flags to be ordered using
the +=asw(…)+ function and its parameters, based on the BeFS (Best-first
search) weights calculation.

6. Added the +-l amateur-star+ (or +-l as+ for short) preset, based on the
+=asw(…)+ ordering that is the fastest preset yet.

7. Added the +-l micro-finance+ (or +-l mf+ for short) preset, based on the
6th BeFS weight.

8. Implement a Prune for games whose columns cannot be filled by any card
(such as Baker’s Dozen), where moving the last card on a column to a
different column is pointless. For more information, see
https://groups.yahoo.com/neo/groups/fc-solve-discuss/conversations/topics/1121 .

9. In +dbm_fc_solver+ and +depth_dbm_fc_solver+, implement the “DeBondt”
encoding method for Freecell and Baker’s Dozen, which allows for an even more
compact representation of the encoded states.

10. The libfreecell-solver code is now 64-bit-enabled and many of the limits
were converted to allow for 64-bit systems.

11. Dropped support for Microsoft Visual C++ (+CL.EXE+) and other compilers
that don't support C99/gnu99.

12. Add +scripts/convert-dbm-fc-solver-solution-to-fc-solve-solution.pl+
to convert a solution output of the dbm_fc_solver to one compatible with
fc-solve.

Version 3.12.0: (12-Jun-2012)
-----------------------------

1. Add the +--show-exceeded-limits+ / +-sel+ flag that removes some ambiguity
in the output.

2. Fix invoking the solver with +--set-pruning r:tf+ in conjunction
with +-opt+.

3. Add the +-l three-eighty+ preset.

4. Many +dbm_solver.c+ improvements including the implementations of kaztree
and libavl2-derived backends, several major reductions of the memory
consumption, and many code cleanups and bug fixes.

5. Add support for building and testing the distribution in an out-of-tree
build (e.g:
+mkdir build ; cd build ; cmake -DFCS_WITH_SUITE=1 .. ; make ; make test+
).

6. A new experimental +fcc_solver.c+ which aims to reduce memory consumption
in exhaustive scans even further.

7. Removed many #ifdefs from the code by creating common abstractions.

8. Eliminate many GCC warnings with certain GCC compile flags.

Version 3.10.0: (15-Jan-2012)
-----------------------------

1. Convert the references to the web-site and repository away from berlios.de,
as it was announced it will become offline.

2. Bug fix: correct the handling of foundations with values 0 (e.g: +H-0+,
+S-0+ ).

3. Bug fix: made the +-mi+/+--max-iters+ flag global for all instances.
Previously, it affected only the last one.

4. Add an experimental +delta_states.c+ implementation and
+dbm_solver.c+ that uses it to drive a Freecell Solver scan with an on-disk
database (currently Google LevelDB and Berkeley DB are supported). So far
it seems that with a limited cache size, this does not scale too well.

5. Add the experimental +pruner-main.c+ (not installed by default).

6. Add support for generating "all_in_a_row" deals to
+make_pysol_freecll_board.py+ .

7. Many small optimizations and cleanups.

Version 3.8.0: (01-Jul-2011)
----------------------------

1. Fix the crashes when using +--trim-max-stored-states+.

2. Add a man page generated by AsciiDoc instead of the token man page
that was present previously.

3. The number of states in the collection is now preserved if the verdict
was unsolved.

4. Add a +--solutions-directory+ argument to +test_multi_parallel.c+ .

5. Fix the rpm spec - +%\{version\}+ instead of +%\{PACKAGE_VERSION\}+ .

6. Add +scripts/parallel-range-solver-total+ to solve a range of deals in
parallel by splitting them into chunks.

7. Add +-DFCS_BUILD_DOCS=+ to CMake to avoid building documentation.

8. Add a way to dump the valid outputs in
+t/t/lib/Games/Solitaire/FC_Solve/CheckResults.pm+ to files.

9. Add an environment flag to filter out the valgrind test when running
+make test+.

10. Many refactorings.

Version 3.6.0: (01-Feb-2011)
----------------------------

1. Now installing the +fcs_dllexport.h+ header file. It is needed for use
of libfreecell-solver in third-party programs, so previously including
+fcs_user.h+ did not work.

2. Add the +--tracemem+ compile-time option for tracing the amount of RAM
and time used by Freecell Solver as a function of the iterations count.

3. Bug fix for incrementally increasing the limits.

4. Add a modified version of kazlib's balanced binary search tree to the
distribution so one will be available built-in. It can be used for both
the states' storage and for the --rcs LRU cache.

5. Revamped the various range solvers, while extracting common functionality
into header files, functions and macros.

6. Some relatively minor optimisations and code cleanups.

Version 3.4.0: (05-Dec-2010)
----------------------------

1. Compiling without card flipping on by default now (finally it makes
the code a little faster instead of slower.)

2. Added the +--set-pruning+ / +-sp+ flag to turn on pruning. This sets the
Horne play prune of moving cards that can no longer be used to build other
cards upon to the foundations.

3. New preset +-l enlightened-ostrich+ / +-l eo+ based on it, which is
significantly faster than +-l foss-nessy+. Amadiro, who helped me with the
Black Hole Solitaire solver picked the name.

4. New preset +-l maliciously-obscure+ / +-l mo+ for short solutions.

5. There's now an option to set a different hard-coded freecells' num at
compile-time.

6. Add an experimental flag of "--trim-max-stored-states". Currently may
crash the solver. (See the +Known_Bugs.txt+ file).

7. Added support for -fwhole-program and static linking the Freecell Solver
executables. This yielded another speed boost.

8. Forward ported the Google Dense Hash / Google Sparse Hash support for
the positions and columns.

9. Forward ported COMPACT_STATES.

10. Add the +--ms+ / +-M+ flags to +make_pysol_freecell_board.py+ to generate
MS Deals even for the higher numbers (> 32,000 which are not used for that in
PySol and PySol FC).

11. Add a compile-time option to use RCS-like states storage:
http://fc-solve.shlomifish.org/to-do.html#rcs_state_storage - this conserves
a lot of RAM.

12. Add a flag to get rid of visited_iter.

13. Add FCS_WITHOUT_DEPTH_FIELD to get rid of depth if fcs_state_extra_info_t.

14. Convert num_active_children to an unsigned short.

15. Forward ported the FCS_STATE_STORAGE_LIBAVL2_TREE to the new fc-solve and
the FCS_RCS_STATES. It seems to scale much better for FCS_RCS_STATES than
FCS_STATE_STORAGE_INTERNAL_HASH.

16. Converted the allocation of the BrFS queue items to alloc.{c,h} . This
wastes less memory.

17. Implement FCS_WITHOUT_LOCS_FIELDS . This removes the fc_locs / stack_locs
from the extra_info's to conserve more space. It also makes solving faster.

18. Reduced the size of num_moves in move_stack_t.

19. Add support for the internal compact moves to the Tatzer script.

20. Added /trunk/fc-solve/scripts/automatic-build-for-982-2fc-solving/Makefile
which automatically builds and runs fc-solve for solving the two-freecell MS
deal No. 982.

21. Updated the cmake configuration to use lib${LIB_SUFFIX} so it can be
built on some 64-bit systems.

22. Many small optimisations.

Version 3.2.0: (14-Jul-2010)
----------------------------

1. Add the +--depth-tests-order+ (or +-dto+ for short) flag that allows
varying the tests' order based on the depth. This gives way for interesting
(and faster) searches.

2. Add the +the-iglu-cabal+ , +foss-nessy+ and +tea-for-two+ presets.
The latter is optimized for two freecell deals.

3. Fixed a bug where when specifying the +--max-iters+ flag it did not
yield an +FCS_STATE_SUSPEND_PROCESS+ return code.

4. Fix a crash when using a --prelude with a soft thread with a NULL name.

5. Add support for Google's Dense Hash for the states' storage and the stacks
storage. It does not perform as well as our own custom hash.

6. Internals: defined a boolean data type +fcs_bool_t+ with two constants
+TRUE+ and +FALSE+ , so it can be semantically different.

7. Some optimizations.

Version 3.0.0: (23-May-2010)
----------------------------

1. Implement the flares API (see +USAGE.txt+), which allows running several
alternative scans and then picking up the one with the shortest solution.

2. Add the +-l children-playing-ball+ and +-l sentient-pearls+ presets
that optimize on solution length (based on flares).

3. Add +scripts/tag-fc-solve-release.bash+ to tag using svn.

4. Updated the CMake version in the build-on-win32.pl script.

5. Add +scripts/stat-analysis-2.pl+ which is a faster version of the
script for statistical analysis of the solution length.

6. Refactored the +split_cmd_line.c+ module.

7. Renamed many "a_star" and "A*" occurrences in the code to "BeFS", because
what was thought to be the A* scan was actually Best-First-Search.

8. Convert the soft-DFS tests' order to a list-of-lists-of-tests, and no
longer recalculating the tests_list on any recycling.

Version 2.42.0: (27-March-2010)
-------------------------------

1. Add the +-o+ / +--output+ flag to +fc-solve+ to output to a file.

2. Now installing the new executables ( freecell-solver-fc-pro-range-solve ,
freecell-solver-multi-thread-solve , freecell-solver-range-parallel-solve ,
etc.) by default.

3. Bug fix: added a missing break after a case in cmd_line.c.

4. Fixed the Makefile's "pdfs" target.

5. Converted many +char *+ data types in the interface to
+freecell_solver_string_t+, which can be +const char *+. The default is
+const char *+.

6. +pqueue.h+ was converted to the MIT/Expat license, with the permission of
its author. Freecell Solver is now fully MIT/Expat.

7. Fixed a Best-First-Search recycling memory leak that was reported by
valgrind.

8. Bug fix: now continuing a solution if a is_a_complete_scan thread terminates
with the scans synergy set to +dead-end-marks+. This was done to avoid states
reported as falsely unsolvable such as MS 254,076 with +-l by+.

9. Added a forking range solver - not installed by default. See:
https://groups.yahoo.com/neo/groups/fc-solve-discuss/conversations/topics/1038 . Sometimes
it yields somewhat better performance.

10. Disabled tcmalloc in debug mode because it messes things up.

11. Various internals cleanups and optimizations.

Version 2.40.0: (27-Jan-2010)
-----------------------------

1. make_pysol_freecell_board.py now has support for "Black Hole" dealing. See:
http://www.shlomifish.org/open-source/projects/black-hole-solitaire-solver/ .

2. Added the "Scan:" header to indicate the current scan / soft-thread
when using the -s -i flags.

3. *Security*: Fixed a string overflow bug in +cmd_line.c+ with the +-asw+
weights. As a result of this problem, Freecell Solver can write several NUL
characters ('\0') to after the string specifying the command line argument.
+
Now unspecified +-asw+ are set to 0.

4. Fixed an off-by-1 iterations count report when a board was found to be
solvable.

5. iter_handler is now applied globally across all instances.

6. Add the +-l blue-yonder+ / +-l by+ preset that is extra fast at solving
the Microsoft 32,00 based on running the optimization algorithm:
+
https://groups.yahoo.com/neo/groups/fc-solve-discuss/conversations/topics/1027 .

7. Added a compile-time option to reduce the size of the internal move token
structs. This may make memory consumption smaller, but definitely makes
Freecell Solver run slower, so it is off by default.

Version 2.38.0: (29-Dec-2009)
-----------------------------

1. Made sure that one can build Freecell Solver outside the source directory
without needing AsciiDoc. (That was a major build-system problem).

2. Add a missing newline at the end of one of the lines of the help.

3. Add the "-F"/"--pysolfc" flag to board_gen/make_pysol_freecell_board.py
for generating PySolFC deals.

Version 2.36.0: (27-Nov-2009)
-----------------------------

1. Converted the +README+ / +USAGE+ / +NEWS+ etc. files to
http://www.methods.co.nz/asciidoc/[AsciiDoc] . The sources are in .txt
and they are copied to their non-.txt files. The PDF build is still a bit
broken due to a strange CMake problem.

2. Simplified the test suite and benchmarking process. (Thanks to
http://pythack.com/[LECA Dimitri (Pythack)] for the inspiration).

3. Many documents were otherwise enhanced with examples and other enhancements.

4. Inlined the hash comparison and several other functions in the code.
This made the code a little faster.

5. Clarified the documentation for broken versions of CMake (cmake-2.6.2)
like the one that ships with some versions of Ubuntu.

6. Fixed the tests for a valgrind regression.

Version 2.34.0: (10-Jul-2009)
-----------------------------

1. Added generation and installation of a libfreecell-solver.pc pkg-config
file.

2. Added the preset "toons-for-twenty-somethings".
+
It is an atomic moves preset that can solve the MS 32K deals.

3. Re-implemented the missing --next-instance/-ni flag.

4. Added the "-l the-last-mohican"/"-l tlm" theme for Simple Simon
that can solve more boards.

5. Now can rpmbuild -tb a tar.bz2.

6. Added information on running the test suite to the "HACKING" file.

7. Added a Python ctypes example under examples/ .

8. Added support for Sun Studio to Makefile.gnu. the -fast flag yields worse
results than gcc.

9. Fixed some typos in the --help and the "USAGE" files.

10. Some internal changes:
    - The soft_thread structure now uses a union.
    - Added some tests to the command line-like argument splitting.
        - fixed a minor bug with it.


Version 2.32.1: (25-Jun-2009)
-----------------------------

1. Added a "#define BUILDING_DLL 1" so fcs_dllexport.h will work fine on
Microsoft Visual C++.

2. Normalised the DLLEXPORT modifiers.

3. Some fixes to the CMake build system:
    - CHECK_C_COMPILER_FLAG now uses a different variable for each flag,
    since the variable was cached.
    - tcmalloc is now truly optional.

4. Moved the declaration of the strncasecmp(a,b,c) macro for WIN32 systems
to before its first use.

5. All of this was done to fix many build/compilation problems.

Version 2.32.0: (24-Jun-2009)
-----------------------------

1. Added meaningful heading comments to the *.c and *.h files where they
were absent.

2. Many small memory/speed optimisations.

3. Removed a lot of unnecessary code and merged a lot of code. Used:
scripts/find-ids.rb for finding uncommonly occurring identifiers.

4. Converted many macros to inline functions.

5. Now calculating the bit-width of the 'int' data type in the CMake version.
There's a fallback logic for it in config.h.

6. Extracted empty_two_cols_from_new_state() in freecell.c.

7. Restored the max_depth functionality. Currently not working very well.

8. Now supporting inline on non-GCC compilers using CMake.

9. Made many functions that were used only once or twice inline.

10. Added the --iters-update-on option to the threaded range solver.

11. Fixed some CMake bugs (especially wrong compiler flags to check).

12. Optionally link with Google's tcmalloc, which yields better performance
(especially for the multi-threaded solver).

13. Added the support for DLLEXPORT to not export fc_solve_* from the DLL.
This reduces the size of the .so / .dll considerably.

    - Added -fvisibility=hidden to the build.

14. Got rid of using preset.c for FCS_FREECELL_ONLY.

Version 2.30.0: (07-Jun-2009)
-----------------------------

1. Added the presets "gooey-unknown-thing", "sand-stone" and "slick-rock"
to minimize the resultant solutions' length.

2. The Freecell Solver states storage and columns storage can now be
made to use any of the trees provided by libavl2
( http://www.stanford.edu/~blp/avl/ ) . The results seem to be somewhat
slower than libJudy and much slower than our own custom hash.

3. Fixed the auto-moves calculation in fc_pro_iface.c .
+
It was too pessimistic before, and had an off-by-one error. A card
can be automatically moved if all foundations of opposite color are -2
and the opposite foundation is -3.

4. Now one can exclude the Simple Simon-related move routines and logic from
the binaries during compilation. See "FCS_DISABLE_SIMPLE_SIMON" in the
CMake configuration.

5. Added scripts/measure-binaries-sizes.rb to measure the sizes of the binaries
in various configurations.

6. Merged Makefile.icc , Makefile.tendra , Makefile.tcc , Makefile.pcc
and Makefile.lcc into Makefile.gnu. Which compiler can be specified using
the Makefile.gnu COMPILER variable.

7. Added the threaded_range_solver "--worker-step $N" argument.
+
What is does is allow allocating uniform quotas to the different threads
to process. So far increasing the quotas from 1 to 16 does not seem to improve
the situation.

8. Fixed many warnings reported by the Intel C++ compiler (icc)

9. Re-organized the code - renamed many files, moved declarations and
definitions to different files, and did a lot of overhaul.

10. Got rid of FCS_DEBUG_MOVES - it was never used and became obnoxious.

11. Added scripts/verify-simple-simon-range.pl and
scripts/simple-simon-stats-analysis.pl .

12. Added a regression test for verifying the validity of a
Simple Simon solution.

13. Fixed Makefile.gnu to propagate CFLAGS to CREATE_SHARED.

14. Implemented FCS_WITHOUT_CARD_FLIPPING to exclude a lot of card flipping
code at build time. It is disabled by default because strangely it seems
to make the execution speed worse.

Version 2.28.1 (18-May-2009)
----------------------------

1. Added a fix to an off-by-one-error in alloc.h that caused a segfault
on x86-64. (Thanks to Ido Kanner).

Version 2.28.0 (17-May-2009)
----------------------------

1. Several cleanups, refactoring and optimizations - especially to the
freecell.c file.

2. Converted more move functions to positions_by_rank.

3. Changed the hash function from Bob Jenkins's to perl 5's and inlined it.
These were substantial optimizations.

4. Unified many macros in state.h instead of having duplicate definitions
for every state type. Verified that the alternative state types (
COMPACT_STATES and DEBUG_STATES) build correctly.

5. Added the optional -Werror=implicit-function-declarations flag to the
compiler.

6. Added tests for some Simple Simon boards.

7. Created an fcs_cards_column_t type and converted the internals to use it.

8. Added the threaded range solver - freecell-solver-multi-thread-solve .
It performs better than the serial one on my machine.  It is built only if
pthreads (POSIX threads) is found.

9. Add the HACKING file with some information on benchmarking.

10. Renamed the configuration script to "Tatzer" so people who are used
to Autoconf's "./configure ; make ; make install" won't use it.

11. Got rid of all the max_num_$something in the dynamically-growing
arrays because num_$something is enough to tell where the limit is and grow it
if necessary. There's now a lot of bit-fiddling logic to grow the
dynamically-growing arrays when necessary.

12. Added support for adding the gcc -fomit-frame-pointer and -march=$CPU_ARCH
flags.

13. Added the following makefiles for alternative Linux compilers:
+
    - Makefile.icc
    - Makefile.tcc
    - Makefile.tendra
    - Makefile.lcc
    - Makefile.pcc
+
So far only Intel's icc and TenDRA produce working executables that
pass all the tests. The code had to be adapted to be compiled using TenDRA.

14. Added scripts/fcs-win32-create-package.pl that provides some guidance
in creating a package under Windows.

Version 2.26.0 (27-Apr-2009)
----------------------------

1. Now Freecell Solver can be compiled with gcc-2.95 (again). It was needed
to test it with this old gcc version.

2. Some fixes to CMakeLists.txt.

3. fcs_hash.c: now the secondary hash value calculation is optional
and should be enabled explicitly. Without it, Freecell Solver is faster:
    - https://groups.yahoo.com/neo/groups/fc-solve-discuss/conversations/topics/941

4. Surgically removed fcs_hash.c's "optimizing_for_cache" which made a small
speed improvement.
    - https://groups.yahoo.com/neo/groups/fc-solve-discuss/conversations/topics/942

5. Made t/Makefile generated by CMake, so the tests can be run from the
packages source distribution. (Previously t/Makefile was excluded, and
since it was not generated, was not available).

6. Eliminated BUILD_TYPE=release warnings.

7. Optimized fc_solve_sfs_move_freecell_cards_on_top_of_stacks() . This
involved a lot of refactoring and re-structuring of the internals. Now
Freecell Solver is significantly faster.
    - https://groups.yahoo.com/neo/groups/fc-solve-discuss/conversations/topics/943

8. Fixed the testing targets and the building of the rpm from the tar.gz
archive.

Version 2.24.0 (18-Apr-2009)
----------------------------

1. Many code cleanups and internal changes. Reduced the size of the library
considerably.

2. Added Makefile.llvm to build LLVM bitcodes from the Freecell Solver
sources. So far, they seem significantly slower than the native code compiled
using gcc-4.3.2.

3. Implemented "cmake -DCMAKE_BUILD_TYPE=profile" . Can be activated using
"./configure --profile"

4. Now build (but not installing) freecell-solver-fc-pro-range-solve , which
runs a range of MS-Freecell / Freecell Pro boards using the solver and outputs
the number of FCS moves, the number of FC-Pro moves, and the FC-Pro moves
in standard notation.

5. Fixed some bugs (crashes, leaks, etc.) when running -opt on a range
of boards (or recycling instances with -opt in general).

6. Some CMake / Build system cleanups and improvements. Among them, trimmed
the distribution from unnecessary files.

Version 2.22.0 (31-Mar-2009)
----------------------------

1. Various improvements to the CMake build process:
    - Updated freecell-solver-config
    - Fixed the building if build from a different directory.
        (e.g: mkdir build ; cd build ; cmake ..)
    - Now also building a static library by default. There's a cmake option
    to trigger it off.
    - Thanks to RISKO Gergely (the maintainer of the Freecell Solver Debian
    package) for a contributed patch.

2. Fixed the rpmbuild -tb process on Mandriva Linux Cooker (and
possibly other systems).

3. Removed some old, unnecessary and/or no-longer-working files.

4. Converted the package from the Public Domain to the MIT/Expat Licence
( http://en.wikipedia.org/wiki/MIT_License ). This change was done due to
the many problems with licensing source code under the public domain:

    - http://linuxmafia.com/faq/Licensing_and_Law/public-domain.html

Version 2.20.0 (26-Mar-2009)
----------------------------

1. Updated the "NEWS" file (this file) with all the previous versions up
to 0.4 (the first release after the first initial release).

2. Many fixes to the Win32 NSIS Package creation process of CMake/CPack .
The NSIS package is now built and installed properly.

3. Fixed a bug with the recycling logic of the optimization thread.
+
This influenced "freecell-solver-range-parallel-solve 1 2 1 -opt" among other
things. In the process, I refactored the code a bit after trying to follow
some false leads.

4. Fixed the --prefix flag in ./configure to be treated as a string instead
of a boolean.

5. Fixed the running of the executables under a specified PREFIX
( http://www.cmake.org/Wiki/CMake_RPATH_handling )

6. Minor changes to "README", "INSTALL" and "USAGE".

Version 2.18.0 (19-Mar-2009)
----------------------------

1. Added the FCS_FREECELL_ONLY compile-time flag to hard-code the settings
for Freecell and thus allow faster run-time. On a Pentium 4-2.4GHz machine
running Mandriva Linux Cooker, this allows one to solve the Microsoft 32,000 in
194.56353 seconds ( 164 deals / second ) instead of
228.84 seconds for the generic version ( 140 deals / second ).

2. Fixed using libredblack ( http://libredblack.sourceforge.net/ ) for states
and stacks storage. (Compile-time options)

3. Added an option to use libJudy ( http://judy.sourceforge.net/ ) for states
and stacks storage. Yields better performance than libredblack, but worse
than the internal hash.

4. Added the -Wall by default for gcc in CMake.

5. Added the boards target to generate 24.board and 1941.board.

6. Updated the TODO file.

7. Added previous NEWS items for previous versions (in this file).

8. Now documenting the --version flag in USAGE.

9. Added an experimental ./configure convenience script (written in
Perl) to run CMake using some configuration options. NOTE: Please don't
use it to build packages.

10. Added "scripts/time-fcs.pl" to help time a
freecell-solver-range-parallel-solve dump.

11. Got rid of the hard_dfs() scan. It is still accepted as an argument, but
is now using the soft_dfs() routines instead.

12. Many internal refactorings, cleanups tweaks and fine-tunings.

13. Moved away change_ver.sh to scripts/old/change_ver.sh - it does not
seem to be used any longer.

Version 2.16.0 (15-Mar-2009)
----------------------------

1. Made sure the indexes of the iterations when the "-s -i" flags are specified
are consecutive. Previously, they were much more inconsistent.

2. (Internals) Split ptr_state_with_locations_t into ptr_state_t (the key)
and ptr_state_extra_info_t (the value). Not all code inside the #ifdef's
(like the libavl / libredblack code) was ported to use it instead.

Version 2.14.0 (25-Jan-2009)
----------------------------

1. Fixed the compilation with profiling information in Makefile.gnu (should be
of concern only to developers).

2. Optimized move_stack_cards_to_different_stacks, yielding a substantial
speed increase.

3. Converted the identifiers from starting with freecell_solver_ to
starting with fc_solve_ , which is shorter and saner.
+
freecell_solver_user_ is still used in the API in order to not break
compatibility.

4. Made sure the effect of the "--sequence-move unlimited" option is not
dependent on other options, so the sequence move will always be unlimited.
(Thanks to larrysan for reporting this bug).

5. Fixed run-tests.pl (and as a result also ctest -V and make test) to
run properly after a raw unpacking.

Version 2.12.0 (10-Dec-2008)
----------------------------

1. A New Configuration and build system based on CMake
( http://www.cmake.org/ ) which results in faster configurations
and builds, and a much reduced archive size.

2. There's a new suite of automated tests. See the file README for details
how to run them.

3. There's a new --version flag that prints the version of the library.

4. A speed optimization to the command line processing based on a radix-tree.

5. Many bug-fixes since 2.8.0. (Released as 2.8.x).

Version 2.8.0 (28-Sep-2002)
---------------------------

1. Better documentation and help screens. See:
+
http://freshmeat.net/articles/time-to-rethink-your-help-flag

2. A preset system - see the "-l" flag in USAGE.

3. An option to read parameters from files. See "--read-from-file" in USAGE.

4. Finally, it is now possible to run one instance of the solver after the
other in case the other one has returned a negative verdict. This is useful
for example to run an atomic moves preset after a meta-moves one, as the
latter cannot guarantee an accurate false verdict.

Version 2.6.0 (12-Jul-2002)
---------------------------

1. Atomic moves and some atomic moves presets have been added. Solving
using atomic moves guarantees that there will be no false negatives, but
is slower than the Meta-moves-based presets. (At least for now). It also
yields less interesting solutions.

2. There is now a "--prelude" switch (see USAGE) that allows running a
static order of quotas at the beginning of the scan for the participating
soft threads. It makes constructing faster solving presets easier, especially
after utilising this code:
+
http://code.google.com/p/fc-solve/source/browse/#svn%2Ffc-solve%2Ftrunk%2Ffc-solve%2Fpresets
+
Also see the "--st-name" option.

3. The PySol "Fan" game preset was added to make_pysol_freecell_board.py and
to Freecell Solver itself. Note that the game is played with 18
columns/stacks , so Freecell Solver will usually need to be recompiled.

4. Several other command line options:
+
    - "--reparent-states"
    - "--calc-real-depth"
    - "--optimization-tests-order"
    - "--scans-synergy"
+
See the "USAGE" file for more information.

5. The internal code has undergone several speed boosts that made Freecell
Solver much faster. Now the INDIRECT_STACK_STATES is a bit faster than
COMPACT_STATES.

6. Updated the TODO list.

Version 2.4.0 (29-Mar-2002)
---------------------------

1. Now several scans are to operate on the same states' collection. This is
done using a mechanism called "soft threads", which is switched in user-land
and does not require system multi-threading. In the file "USAGE" see:
+
    - "-nst"  / "--next-soft-thread"
    - "-nht"  / "--next-hard-thread"
    - "-step" / "--soft-thread-step"

2. fcs_cl.h was included in the RPM .spec.

Version 2.2.0 (18-Feb-2002)
---------------------------

1. Freecell Solver's version is now kept in the file ver.txt

2. Added manual pages symbolic links for the following command-line board
generators:
+
    - make-gnome-freecell-board
    - make_pysol_freecell_board.py
    - make-aisleriot-freecell-board
    - pi-make-microsoft-freecell-board

3. Moved more declarations of functions to header files (ending with .h)

4. Added some compiler-optional inline annotations for functions.

5. The identifiers of the library are now all residing under freecell_solver_

6. New flag:
+
    - "--max-stored-states"

7. The package can now be built as an RPM for Red Hat Linux and compatible
systems by running rpmbuild -ta on the archive.

8. Several speed-ups.

Version 2.0.0 (19-Dec-2001)
---------------------------

1. Added some presets for the PySol games "Beleaguered Castle", "Citadel"
and "Streets and Alleys".

2. Re-factoring of the scans code to make it simpler.

3. Added many functions to the external API.

4. fc-solve now uses it, so it is fully loosely-coupled with the library
it is linked against.

5. Added a randomized DFS scan (with a user-defined seed).

6. Win32 Makefile can now generate a working DLL.

Version 1.10.0 (02-Oct-2001)
----------------------------

Added support for solving deals of "Simple Simon" in addition to
all the freecell-like variants that it could solve before.

Version 1.8.0 (31-Aug-2001)
---------------------------

1. A new build and configuration process based on the GNU Autotools (Autoconf,
Automake and libtool). This allows portably build shared and static libraries
and stuff like that.

2. The GNOME AisleRiot board-generation program can generate the boards of
the more Solitaire variants which are supported by Freecell Solver.

Version 1.6.0 (11-Apr-2001)
---------------------------

1. Freecell Solver now has a solution optimization scan. Check it out
by adding the "-opt" flag.

2. Many comments were added to the code, and you are welcome to go over
it and see if you understand everything that goes on there. If you don't,
contact me and I'll add some more comments.

3. Several speed optimizations were done in the internal hash, so I think
it should run at least a little faster.

Version 1.4.0 (07-Feb-2001)
---------------------------

1. Many fixes for bugs and memory leaks.

2. A Soft-DFS scan - Depth-First Search that does not use procedural recursion
was introduced.

3. A New Best-first Search Scan (called A* in the code and documentation) was
introduced.

4. A New Breadth-First-Search (BFS or BrFS) scan was introduced. It's not
very practical.

The choice between all those scans can be specified at run-time using
command-line arguments.

Version 1.2.0 (21-Dec-2000)
---------------------------

1. Several moves were improved or added, so it can solve more layouts.

2. A more robust command-line argument handling, so less segfaults can be
expected if it's improperly used.

Version 1.0.0 (19-Nov-2000)
---------------------------

1. Added support for solving more game types.

2. Can be compiled so it will be less memory intensive (INDIRECT_STACK_STATES).

3. There's an API for use by third-party developers. It supports
suspending a solution process and resuming it from its last position.

4. Several random bug-fixes.

Version 0.10.0 (09-Oct-2000)
----------------------------

1. Support was added for several Solitaire variants besides Freecell, such as
Forecell, Seahaven Towers and Eight Off.

2. It now can emits the moves themselves, instead of just the intermediate
solutions.

3. Several bug-fixes.

Version 0.8.0 (28-Aug-2000)
---------------------------

1. Some bug-fixes.

2. Support for a variable number of freecells, columns, and cards per column.

3. Board generators for Microsoft Freecell, Freecell Pro and PySol.

4. An option to use the balanced binary tree implementations of libavl
( http://adtinfo.org/ ), glib ( http://en.wikipedia.org/wiki/GLib ), or
libredblack ( http://libredblack.sourceforge.net/ ). Using them makes
Freecell Solver about 33% faster.

5. Support for using "T" instead of "10" in board input/output.

6. Improved Documentation.

Version 0.6 (28-Jul-2000)
-------------------------

1. An extra movement that allows Freecell Solver to solve some boards which
it could not solve previously.

2. The order of the stacks and freecells is preserved throughout the
solutions.

3. There is now an option to limit to a certain number of iterations (so
Freecell Solver will stop before it consumes too much memory)

4. Specify the order of the moves that will be tested. Usually, a test
order can be found that will solve a given board really quickly.

Version 0.4 (06-Jun-2000)
-------------------------

1. Three major code optimizations. Freecell Solver now runs much faster.

2. Freecell Solver is now able to start solving from a non-initial board.
