1.0: Initial release. 1.0.1: Fixed software packaging problem for tgz download: boost and Mersene Twister libraries were missing. Also statically linked gcc and stdc++ libraries for the Windows executable. Thanks to Stefan Westen for identifying these problems. 1.1.1: Fixed a ParityMonitor initialization problem that caused program crashes when all pieces of the puzzle had parity 0. Thanks to Andrew Juell for identifying this problem. Reworked both the Puzzle and Solver initialization so that initialization of the ParityMonitor and VolumeMonitor is skipped altogether if parity checks and volume checks are not requested by the user. Previously these monitors were always initialized (whether they were subsequently used or not). This is important because the amount of memory required by the VolumeMonitor grows geometrically with the number of uniquely sized pieces. Thanks to Andrew Juell for identifying this problem. Fixed a bug in solution numbering when rotationally unique solution filtering was activated. Previously the solution number was printed instead of the "unique" solution number. TEXT-ONLY changes: Added a couple of paragraphs to the README.txt file encouraging the use of the end-of-options declaration "--" on the command line. Added warnings to the help page on the memory requirements of the volume filter. Various documentation typo fixes. 1.1.2: August 11, 2012. In an early (unreleased) version of this software the piece id was a single character that doubled as the name. I subsequently introduced a separate string name field so that pieces could be assigned arbitrarily long names. The id field is now automatically assigned so that piece ids are numbered sequentially from 1 to N. I recently stumbled upon a few places in the software that were still working under the assumption that piece ids are user assigned and non-consecutive. Theoretically these flaws would cause program failure if you were to override the PIECEID_T preprocessor definition to increase the size of the pieceId data type from a char to a short and then try to solve a puzzle with more than 255 pieces, but I've never tested with such a large puzzle. Mostly it was just really confusing to anyone (including me) trying to read the code. I cleaned this stuff up. I modified Puzzle::genImageLists to throw an exception when you request automatic selection of a piece for rotational constraint when no uniquely shaped mobile piece is found. Previously, it silently ignored the user request in this case and just turned off rotational redundancy filtering. The boolean field Puzzle::redundancyComplexity was not getting set appropriately when complex rotational symmetries are identified in the puzzle. This can cause the rotational redundancy filter to fail for puzzles where stationary and mobile pieces share the same shape. I modified Puzzle::isSymmetric to set this field when complex rotational symmetries are detected. TEXT-ONLY changes: Various documentation fixes to README.txt, the generated help page and the software comments. 1.1.3 December 14, 2012 Fixed a bug in the parser that was causing crashes when parsing a line from a puzzle definition that consisted of only a comment. I added a couple of (unsigned) typecasts to ParityMonitor.hpp and VolumeMonitor.hpp to (hopefully) fix a build problem associated with 64 bit implementations of the STL. (I don't have a 64 bit build environment to verify this fix.) Thanks to Stefan Westen for reporting this problem. I fixed several problems related to performance metering: 1. I fixed a problem in the puzzle parsing loop where the puzzle "parsing" PerformanceMeter was running while it's parent meter ("all") was not. 2. To catch such blunders going forward, I modified PerformanceMeter::start() and PerformanceMeter::stop() to verify that the parent meter (if any) is running at the time of these calls. 3. The print output for a tree of PerformanceMeters that have never been started (and therefore have zero elapsed time) was displaying some ugly division-by-zero noise for child meters in the percent-of-total-time fields. I modified these outputs to just forcibly display zero percent. (The percentages are actually meaningless in this case, and so perhaps printing asterisks would be more correct, but I somehow find them distracting.) 4. You've always been able to dump the stats of a PerformanceMeter and it's children while they're running. In this case (since the stop time is not yet recorded) a live reading is taken from the system clock. This was previously done independently for each meter during a recursive print request. Because the parent is printed first, the children end up using later stop time values which can ultimately lead to the sum of elapsed time of child meters exceeding the elapsed time of the parent. This behavior was surely both undesirable and confusing. To remedy the problem, I overloaded the PerformanceMeter's getTime and print methods to allow the use of a user-supplied value for the currentTime. See the comments for exact details. 5. Previously, PerformanceMeter output was only generated inside the Solver by a call to Solver::dumpStats(). Solver::dumpStats() in turn was called from two places: from a signal handler in response to signal 10 (an asynchronous user request for progress information) and at the end of solver processing if the info config option was set. The latter case is intended to provide a good estimate of total program processing time, but since it is invoked by the Solver, it can't include Puzzle destruction time. So I moved the call to PerformanceRegistry::print from Solver::dumpStats to the end of the puzzle processing loop in main.c. I still wanted PerformanceMeter output to be displayed in response to signal 10, so I also added a call to PerformanceRegistry::print directly from that signal handler. 1.2 April 10, 2014 New Features 1. I added a simple (and somewhat crude) mechanism for splitting a large puzzle into a set of smaller puzzles. To use it, you configure the maximum number of pieces to be placed via the -g option (the goal). When the goal is met, the current puzzle state is output and a backtrack is forced. In this way, a spanning set of subpuzzles is generated each of which can be subsequently passed back into the program to find the solutions to that subpuzzle. Currently the process of distributing the subpuzzles to other instances of the program, and the collection of the solutions found is a manual process; and so this feature leaves much to be desired. But there is at least now some way to solve larger puzzles. Care must be taken to ensure rotational uniqueness among solutions found when using this feature. The new -R option can be of some help in this regard. When you activate the -R option the piece used to eliminate rotational redundancy from the puzzle is forcibly placed first. Assuming this is successful in removing rotational redundancy from the solution set, you can be assured that solutions found from the set of subordinate puzzles will be collectively rotationally unique. 2. The -c option (for coordinate piece output) is replaced with the more flexible -f output format option, which allows selection of one of several output formats. One format is the SUBPUZZLE output format which can be combined with the -g option to output puzzle definitions that are subpuzzles of the input puzzle. Read --help output for more information. 3. To change the size of the integer used to store the IDs of pieces you now must set the preprocessor definition of PIECEID_SIZE to one of 8, 16, or 32. (Previously, you set the datatype PIECEID_T directly, but this approach was less safe.) Bug fixes: 1. My attempt to fix the a typecasting error seen in 64 bit development environments was botched in the previous release. (I don't have a 64 bit machine to test with.) I think I have finally fixed this problem. Thanks to Daniele Disco (from Italy) for both reporting this problem and testing the fix for me. 2. The script I used to identify which boost headers might be required by various build environments was flawed and missed many operating-system-specific, library-specific, and compiler-specific headers. I've improved the script and have identified many more system-dependent headers and now include them in the package. I'm still not completely confident I've got them all. (Boost headers include bizarre preprocessor scripting the likes of which I've never seen, that ultimately pick headers to include -- I refuse to try to decipher them.) In any case, remember that if you see missing headers from the boost library while compiling, you can correct this problem by simply replacing the boost extract I include with a fresh copy of the entire boost software package. Thanks to Daniele Disco for both identifying this problem and testing the fix. 3. A warning message is now output to stderr if a user attempts to configure a filtering threshold that is lower than the deactivation level for the DLX algorithm. Filters can only be used with DLX and are automatically deactivated (regardless of the user's settings) when one of MCH, EMCH or de Bruijn are activated. Previously the software quietly modified the user setting to be consistent with the activation settings of these other algorithms, but now noisily makes these modifications which will hopefully eliminate confusion among users that can't understand why nothing is getting filtered. 4. An error is now generated if you try to load a puzzle that has more pieces than can be uniquely identified with the defined PIECEID_T data type. By default PIECEID_T is a uint8_t (8 bit unsigned integer) and supports at most 255 pieces. To load puzzles with more pieces, you can recompile with preprocessor definition PIECEID_SIZE set to either 16 or 32. Other cleanups: 1. I replaced a few arrays of booleans used as filter controls with simpler integer scalers that work as filter activation thresholds. 2. Fixed a few getters in MonteCarloConfig.hpp which should have been declared const. 3. Fixed a few more comment typos. 1.2.1 August 15, 2014 This release contains only documentation fixes. Corrected the help output for the -g and -R options which previously incorrectly referenced non-existent options. Modified the minimum description length for boost option_descriptions for better looking help output. Modified the paragraph formatting method of boost to eliminate some annoying leading spaces resulting from line breaks that happened to occur on sentence breaks. This change is cosmetic only and can be overwritten if you upgrade to a later release of boost.