2023-04/03  David M. Warme  <david@warme.net>

	* GeoSteiner version 5.3.  (Updated version number in
	configure.ac, LICENSE, README and RELEASE_NOTES.)

	* Added support for ARM64 (at least on MacOS).  Split off
	architecture-specific code from fputils.[ch] into new files
	fputils_{cpu}.h and fputils_{cpu}_code.h, where {cpu} is x86 or
	arm64.

	* Fixed a serious bug in localcuts.c that produced invalid local
	cuts in certain rare situations.  When local cuts call
	gst_hg_solve() recursively to compute truly optimal max-weight
	forest 	sub-problems, it used the "backtrack search" algorithm for
	sufficiently small sub-problems.  But the backtrack search
	algorithm does not work correctly when any of the edge costs are
	negative, causing it to produce sub-optimal solutions in some
	cases.  This in turn can cause the local cut iteration to terminate
	before obtaining a truly valid local cut.  The fix is for local
	cuts to force use of the branch-and-cut algorithm on these
	recursive calls to gst_hg_solve().

	* Modified the backtrack search algorithm to immediately return an
	error code when any edges having negative weight are present.
	Added new error code GST_ERR_BACKTRACK_BAD_COSTS and solver exit
	reason GST_SOLVE_BACKTRACK_BAD_COSTS to support this change.

	* Fixed bug in _gst_branch_and_cut() whereby the "lp" local
	variable becomes invalid when handling of CPLEX "unscaled
	infeasibility" status causes the bbip->lp pointer to change.
	Also added comments warning about bbip->lp changing in
	_gst_solve_LP_over_constraint_pool().

	* Fixed memory leak in cut_off_existing_nodes().

	* Fixed bug whereby find_almost_integer_cycles() was generating
	subtour inequalities that were not actually violated.  This in
	turn caused a crash in compute_good_lower_bound() because
	do_separations() was returning (cp NE NULL), but no constraints
	actually get added to the LP (becasue none of them are violated).
	(Without FATALing on these conditions, and infinite loop would
	result.)

	* Added check_for_invalid_fsts() to prunefst.c, which makes sure
	the final set of "un-pruned" FSTs collectively span all
	terminals.  This can happen on some instances with the Uniform
	Directions FST generator (which does not have all of the same
	numeric stability enhancements that were made to the Euclidean FST
	generator).  Numeric errors in UFSTs lead to geometric
	inconsistencies that can trick the pruning code into discarding
	more FSTs than it should.  Better to crash than have the FST
	pruner produce invalid output while appearing to finish
	successfully.

	* Added new parameter GST_PARAM_LOCALCUTS_TRACE_STYLE that
	controls the style of trace output generated by the local cuts
	algorithm.  The "normal" setting (default) produces a new, much
	more concise style of output that produces only a single character
	of output for every 10 iterations of the local cut loop.  (That
	character is either '.' or 'x' depending upon whether the exact
	max-weight forest algorithm was used during any of the
	iterations.  The "verbose" setting produces the previous style
	that generates several lengthy lines of trace per iteration.

	* Added new gen_array() interface to Pseudo-Random Number
	generator object (struct PRNG_obj), and proper implementations
	within each generator.

	* Fixed bug where prng_new.c was declaring correct seed files
	to be invalid.

	* Added debugging routine _gst_debug_print_proplist().

	* Fixed a subtle -Wall issue in sll.c about 'ctr' possibly being
	used before set in fst_length() 4-terminal case.  (Code was
	correct, but compiler confused.)

	* Fixed ufst.c to handle >= 64k points.

	* Moved initialization of one-bits-in-byte tables to common
	routines in environment.[ch].

	* Assure that all documented API functions set their *status value
	in all cases.

	* Fixed some -Wall issues.

2022-11-18  David M. Warme  <david@warme.net>

	* GeoSteiner version 5.2.  (Updated version number in
	configure.ac, LICENSE, README and RELEASE_NOTES.)

	* New solver accessor functions: gst_get_solver_hypergraph(),
	gst_get_solver_param() and gst_get_solver_status().

	* New algorithm parameters: sparse_subtours,
	zero_weight_cutsets_method, bb_node_limit, bb_lp_limit,
	strengthen_reduce, generate_unstrengthened,
	initial_primal_heuristic, initial_primal_heur_stop.

	* Fully functional callback API: gst_set_bb_callback_func(),
	gst_node_get_solver(), gst_node_get_z(), gst_node_get_lb_status(),
	gst_node_get_node_index(), gst_node_get_parent_node_index(),
	gst_node_get_node_depth(), gst_node_get_node_branch_var(),
	gst_node_get_node_branch_direction(), gst_node_get_lp_index(),
	gst_node_get_solution(), gst_node_get_lb(), gst_node_get_ub(),
	the GST_BB_CALLBACK_ARGS macro, and wherefrom values:
	GST_CALLBACK_BB_LP_SOLVED, GST_CALLBACK_BB_NEW_UPPER_BOUND, and
	GST_CALLBACK_BB_NODE_COMPLETED.

	* Delete slack rows only when the LP objective has strictly
	improved (or just after the node has been created by branching).
	This prevents infinite loops and/or thrashing of rows.

	* Improved prelude.ps file to support much larger numbers of
	terminals than previously.  (Most Postscript interpreters do not
	permit arrays larger than 65536 elements.)  The new code uses
	arrays of at most 32768 to form a trie of terminals.

	* Definition of parameter values within geosteiner.h now matches
	the order in which these parameters are documented in the manual.

	* The default value of MAX_CUTSET_ENUMERATE_COMPS parameter was
	incorrectly documented to be 11 in the manual.  It now correctly
	specifies the default value of 5.

	* Fixed a looping bug in LOCAL_CUTS_MODE_SUBTOUR_COMPONENT mode.

	* Fixed a big O(n**2) memory waste relating to find_comps() in the
	zero-weight cutsets separation code.

	* Fixed a fairly serious bug in which all "strengthened" subtours
	were being thrown away, never entering either the constraint pool
	nor the LP.

	* Fixed a large number of compiler -Wall warnings detected by
	newer versions of GCC.

	* Removed -Werror from the default value of CFLAGS.  Using -Werror
	is quite useful for GeoSteiner developers, but most users don't
	like it when their build fails for reasons they don't understand,
	and might not know how to fix.  Added a --with-Werror argument to
	the configure script to turn -Werror on.  Also changed the default
	value of OPTFLAGS from -O2 to -O3.
