/* Math Pattern Hunter README : documentation for the Math Pattern Hunter;
 * Author: Maxie D. Schmidt (created 10/26/2006, last modified 12/20/2006) */

[README Contents]:

   (*) Liscencing and Copyright
   (*) Current Version
   (*) Program Overview
   (*) Installation
   (*) Usage and Runtime Options
   (*) Misc
   (*) Known Bugs
   (*) Feature Requests; Bug Reports; Feedback; Contact Info

[Liscencing and Copyright]:

The code for the Math Pattern Hunter is GPLed. The author of the program retains copyright: (C) Maxie D. Schmidt 2006 (maxieds(AT)gmail(DOT)com). The source code can be found on sourceforge (http://pattern-hunter.sf.net). Any copy, re-distribution, or modification of the code must be distributed with an un-altered form of this README.

[Current Version]: 0.4.3-beta (see CHANGELOG)

[Program Overview]:

The Math Pattern Hunter program is designed to find formulas for integer and rational sequences. The program is designed to be used on the commandline (see Runtime Options below) and so prints the findings of the program in text. The program takes an integer or rational sequence and a set of functions and transformations and brute forces every combination of the functions (every combination being defined by options at runtime) with a set of function templates to try to find a formula for the sequence.

[Installation]:

The following instructions have been tested on OpenBSD 3.9 and 4.0, and Gentoo Linux 2006.1, and should work for any modern flavor of Linux or Unix.

$ tar xvzf /path/to/patternhunter-<version>.tar.gz
$ cd patternhunter-<version>
$ [*] see note on debugging
$ make
$ su
# make install

[* Note On Debugging] : If you do not want the progress counters counters on
                        the experimental matching function templates then 
                        comment out a line in "patternhunter.h":
                        "#define DEBUGGING" => "//#define DEBUGGING".

[Usage and Runtime Options]:

The program usage is as follows:

$ pattern_hunter {1,2,3,4,...} [options]

The first argument to pattern_hunter is the sequence. Note that there should be no spaces between the commas in the sequence. The first argument should be expanded by whatever shell being used. It will definitely work for bash, ksh, and probably others. If for some reason the expansion in the braces doesn't work on your shell of choice, type the sequence with spaces between terms:

$ pattern_hunter 1 2 3 4 ... [options]

Math Pattern Hunter is designed to be run on the commandline. Due to this the program configuration can be fully specified at runtime. This allows the user to tweak the matching functions searched for and lets the user balance their own run of the program between features used (or disabled) and the runtime of the program. The program currently supports the following options that can be specified at runtime.

Program Configuration Options:
     (*) [--depth d] : the depth (number) of fn_terms (see input patterns below)
         used in the function templates
     (*) [--start-index i] : the start index to use as input to functions when
         searching for patterns. 
     (*) [--end-index i] : the ending index of variable input to functions 
         when searching for a pattern.
     (*) [--allow-lower-bounds] : enables when searching for matching functions
         functions that are with in a range (set by "--lower-bound-range" or
         "--bounds-range") indicating an lower bound of the actual sequence
         value these functions are also printed.
     (*) [--lower-bound-range r|n/d] : set the range that a potential matching
         function value must be within as a lower bound. This setting is 
         relevant when the "--allow-lower-bounds" option is set. The value
         can be specified as an integer or as a fraction "n/d" (internally in
         the program this value is stored as a fraction).
     (*) [--allow-upper-bounds] : enables when searching for matching functions
         functions that are with in a range (set by "--upper-bound-range" or
         "--bounds-range") indicating an upper bound of the actual sequence
         value these functions are also printed.
     (*) [--upper-bound-range r|n/d] : set the range that a potential matching
         function value must be within as an upper bound. This setting is 
         relevant when the "--allow-upper-bounds" option is set. The value
         can be specified as an integer or as a fraction "n/d" (internally in
         the program this value is stored as a fraction).
     (*) [--allow-approx] : consider matching functions where the function
         values are within some range of the input sequence (not
         necessarily a strictly upper or lower bound). The range relevant
         for this option can be set with "--approx-range". The value for
         use with the range option may either be an integer or a fraction
         (form: n/d with no spaces).
     (*) [--approx-range r|n/d] : set the range for use when considering
         approximate functions. This value can also be set with
         "--bounds-range". For either of these options the value can be given
         as an integer or as a fraction (n/d with no spaces).
     (*) [--bounds-range r|n/d] : sets the range value for both lower and
         upper bounds, and for an approx function (not necessarily a strictly
         upper or lower bound, but bounded within some range of the input
         sequence). Alternately the values can be set individually with the
         "--lower-bound-range", "--upper-bound-range", and
         "--approx-range" options. The value
         can be specified as an integer or as a fraction "n/d" (internally in
         the program this value is stored as a fraction).
     (*) [--max-num-vars n] : the maximum number of variables that can be used
         in formulas (the limit for this is 26). Note that as the number of
         variables increases, the runtime of the program increases.
     (*) [--calc-style-vars] : use variables that are commonly used in infinite
         calculus first (as in x,y,z,w,t) instead of the variables commonly
         used with integer sequences (as in n,j,i). Note that the variable
         name 'k' is not used in formulas (I reserved it for printing function
         names).
     (*) [--config-file file] : specify the config file to use. There is
         an example config file at "/usr/share/math_pattern_hunter/config.test".
         Most commandline options can be set from the file (this includes most
         of the config vars in patternhunter.h).
     (*) [--output-file file] : save the matching functions the matching
         functions to "file". Note that status messages and error messages
         are not saved to file (these messages get printed to stdout).
     (*) [--fnterm-input-patterns file] : specify the file where input patterns
         for fn_terms are stored. Note that this setting can be overridden
         by the "--all-terms-*" options.
     (*) [--fnterm-input-patterns-only] : only use the input patterns for
         fn_terms specified with "--fnterm-input-patterns-file".
     (*) [--sum-term-input-patterns file] : specify the file where input
         patterns for sum_terms are stored. Note that this setting can be
         overridden by the "--all-terms-*" options.
     (*) [--sum-term-input-patterns-only] : only use the input patterns for
         sum_terms specified with the "--sum-term-input-patterns-file" option.
     (*) [--all-terms-input-patterns file] : specify the file where input
         patterns for fn_terms, sum_terms, and mult_terms are stored. If
         the function template types are enabled (elsewhere with another option)
         this setting will yield patterns for all of the types. This setting
         will override the settings from "--fnterm-input-patterns-file",
         "--sum-term-input-patterns-file", and "--mult-term-input-patterns-file".
     (*) [--all-terms-input-patterns-only] : only use the input patterns for
         fn_terms, sum_terms, and mult_terms (only when these function
         template types are enabled elsewhere) when searching for matching
         functions.
     (*) [--nocolor] : do not print output in color (color printing is done
         using escape codes so it may be desirable to omit the colors if
         the terminal doesn't recognize the codes or for saving output to file).
         Note that `pattern_hunter [...] | less -r` will display the colors
         as long as the terminal supports them.
     (*) [--combos-chunk-size n] : sets the number of combinations to use at a
         time for the function templates. If the box this is run on has low
         memory modify this to a lower setting. Otherwise, read the source
         code to figure out how best to tweak this fro your setup
         ("fntemplates.cpp", function "print_matching_fns()").
     (*) [--fts-cache-size n] : sets the cache size for the function template
         called fn_term_sum. The default has this setting at 
         2 * COMBOS_CHUNK_SIZE. Read the source code to figure out how best
         to modify this setting for your setup ("fntemplates.cpp", function
         "print_matching_fns()").
     (*) [--ftm-cache-size n] : sets the object cache size for the function
         template called fterm_multiply. The default setting leaves this
         at 2 * COMBOS_CHUNK_SIZE. Read the source code ("fntemplates.cpp",
         function "print_matching_fns()") to figure out how best to tweak this 
         option for your setup.
     (*) [--ftms-cache-size n] : sets the cache size for the function template
         called ft_mult_sum. Currently there are no higher-level objects 
         that will use this cache, but this is left in the code for future
         expansion. The default setting leaves this option at "1". Setting it
         to a higher value at this point in time is a waste of memory.
     (*) [--ftsm-cache-size n] : sets the cache size for the function template
         called fts_multiply. Currenty there are no higher-level objects 
         that will use this cache, but it is left in the code for future
         expansion. The default setting leaves this at "1". At this point in
         time setting this option to a higher value is a waste of memory.
    (*) [--ftsms-cache-size n] : sets the cache size for the function template
         called fts_mult_sum. Currenty there are no higher-level objects 
         that will use this cache, but it is left in the code for future
         expansion. The default setting leaves this at "1". At this point in
         time setting this option to a higher value is a waste of memory.
     (*) [--sum-term-cache-size n] : sets the cache size for the function template
         called sum_term. 
     (*) [--sum-term-sum-cache-size n] : sets the cache size for the function template
         called sum_term_sum. Currenty there are no higher-level objects 
         that will use this cache, but it is left in the code for future
         expansion. The default setting leaves this at "1". At this point in
         time setting this option to a higher value is a waste of memory.
     (*) [--use-console-progress-bar] : this option enables the console
         progress bar. The console progress bar will display progress bars
         indicating the current point of the program in evaluating the
         different types. The progress bar displayed uses functions that may
         not work on every setup (most Linux terminals should work ...). 
         Additionally since the display is used for the progress bar, the
         output for matching functions will be written to file. If no file
         is specified with the "--output-file" option a date stamped file
         will be used in the current working directory.
     (*) [--print-summary] : this option enables printing a summary of
         the program run. The "--verbose" option will enable printing more
         detailed output. Examples of what is in the summary: the number of 
         functions (the actual functions list with "--verbose"), variables
         used, the number of terms of each type processed, etc.
     (*) [--verbose] : enables more detailed output. Currently this setting
         is only relevant when the option "--print-summary" (see above) is
         used.

Input Functions Options:
     (*) [--fn {1,2,3,4,...} --fn-name name] : this allows the user to specify
         a function at runtime (currently only in one dimension).
     (*) [--usefns-base {filenums}] : specify the file numbers of (OEIS)
         functions to be used when searching for patterns (see files/base*.txt).
     (*) [--usefns-core {filenums}] : specify the file numbers of (OEIS)
         functions to be used when searching for patterns (see files/core*.txt).
     (*) [--usefns-counting {filenums}] : specify the file numbers of (OEIS)
         functions to be used when searching for patterns 
         (see files/counting*.txt).
     (*) [--usefns-graphs-trees {filenums}] : specify the file numbers of (OEIS)
         functions to be used when searching for patterns 
         (see files/graphstrees*.txt).
     (*) [--usefns-misc {filenums}] : specify the file numbers of (OEIS)
         functions to be used when searching for patterns (see 
         files/misc*.txt).
     (*) [--usefns-primes-base {filenums}] : specify the file numbers of (OEIS)
         functions to be used when searching for patterns (see 
         files/primesbase*.txt).
     (*) [--usefns-primes-extra {filenums}] : specify the file numbers of (OEIS)
         functions to be used when searching for patterns (see 
         files/primesextra*.txt).
     (*) [--usefns-number-theory {filenums}] : specify the file numbers of (OEIS)
         functiond to be used when searching for patterns 
         (see files/numbertheory*.txt).
     (*) [--usefns-recurrences {filenums}] : specify the file numbers of (OEIS)
         functions to use when searching for patterns 
         (see files/recurrence*.txt).
     (*) [--usefns-trig {filenums}] : specify the file numbers of (OEIS)
         functions to use when searching for patterns (see files/trig*.txt).
     (*) [--usefns-user-input {filenames}] : specify the file names of input
         files created by the user to be used when searching for patterns. 
         Note that the files input be the user must match the formatting used
         by other files (see files/{base,core,counting,graphstrees,misc,
         primesbase,primesextra,numbertheory,recurrence,trig}*.txt).
     
Form Function Options:
     (*) [--use-fnform-constants] : add constant functions to the functions
         used when filling in the matching function templates. The range for
         these functions are given in the next two options. The exceptions
         (even when in range) are 0 and -1. The exceptions will not be covered
         by the constant functions.
     (*) [--constant-start-range n] : set the lower bound on the interval for
         constant functions. The values 0 and -1 are automatically excluded 
         from the interval.
     (*) [--constant-end-range n] : set the upper bound on the interval for
         constant functions. The values 0 and -1 are automatically excluded 
         from the interval.
     (*) [--poly-degree-start d] : start degree of polynomials used as functions
         (see note on form functions below). Note that if the start degree used
         is >= 1, then constant functions will not be used when searching for
         formulas.
     (*) [--poly-degree-end d] : end degree of polynomials used as functions 
         (see note in --poly-degree-start and on form functions below).
     (*) [--poly-coeff-start n] : the start of coefficients used in polynomial 
         functions (see note below about form functions).
     (*) [--poly-coeff-end n] : the end of the interval used for coefficients 
         when using polynomial functions in formula searches (see note on
         form functions below).
     (*) [--use-fnform-poly] : use the function form of polynomials. The 
         properties of the function form can be set using the above four
         commandline options.
     (*) [--r-coeff-start n] : 1-dimensional recurrence coefficient start of
         interval (see note on form functions below).
     (*) [--r-coeff-end n] : 1-dimensional recurrence coefficient end of 
         interval (see note on form functions below).
     (*) [--r-1dim-depth d] : the depth of the recurrence. For example if 
         depth = 2 there will be at most a difference of 2 in the terms, as
         in f(n) = k1 * f(n - 1) + k2 * f(n - 2). (Someone e-mail me the
         math term for this depth). See the note on form functions below.
     (*) [--r-init-val-start n] : the start of initial values for a 1-dimensional
         recurrence used as a function when searching for formulas. See the 
         note on form functions below.
     (*) [--r-init-val-end n] : the end of the initial values range when using
         the 1-dimensional form function(s). See the note on form functions 
         below.
     (*) [--use-fnform-1dim-recurrence] : use the form function for a 1-dim
         recurrence. See the note about form functions below and the five
         previous options.
     (*) [--ppoly-even-coeff-start n] : the start range of the even coefficient
         in the polynomial pattern for the function form prime polys. This 
         value must be >= 2.
     (*) [--ppoly-even-coeff-end n] : the end of the range for the even
         coefficient in the polynomial pattern for the form function prime
         polys. This value must be >= 2.
     (*) [--ppoly-odd-coeff-start n] : the start of the range for the odd
         coefficient in the form function for prime polys.
     (*) [--ppoly-odd-coeff-end n] : the end of the range for the odd 
         coefficient in the form function for prime polys.
     (*) [--use-fnform-ppoly] : use the form function for prime polys. Given
         an even and an odd coeff a ppoly function returns the nth prime of
         the form ((even_coeff) * k + (odd_coeff)). See the note about form
         functions below and the four previous options.
     (*) [--2dr-alpha-start n] : the start of the interval for the parameter
         alpha in the function form for 2-dimensional recurrences.
     (*) [--2dr-alpha-end n] : the end of the interval for the parameter alpha
         in the form function for 2-dimensional recurrences.
     (*) [--2dr-beta-start n] : the start of the interval for the beta parameter
         in the form function for 2-dimensional recurrences.
     (*) [--2dr-beta-end n] : the end of the interval for the beta parameter
         in the form function for 2-dimensional recurrences.
     (*) [--2dr-gamma-start n] : the start of the interval for the gamma
         parameter in the form function for 2-dimensional recurrences.
     (*) [--2dr-gamma-end n] : the end of the interval for the gamma parameter
         in the form function for 2-dimensional recurrences.
     (*) [--2dr-alpha-prime-start n] : the start of the interval for the alpha
         prime parameter in the form function for 2-dimensional recurrences.
     (*) [--2dr-alpha-prime-end n] : the end of the interval for the alpha
         prime parameter in the form function for 2-dimensional recurrences.
     (*) [--2dr-beta-prime-start n] : the start of the interval for the beta
         prime parameter in the form function for 2-dimensional recurrences.
     (*) [--2dr-beta-prime-end n] : the end of the interval for the beta
         prime parameter in the form function for 2-dimensional recurrences.
     (*) [--2dr-gamma-prime-start n] : the start of the interval for the gamma
         prime parameter in the form function for 2-dimensional recurrences.
     (*) [--2dr-gamma-prime-end n] : the end of the interval for the gamma
         prime parameter in the form function for 2-dimensional recurrences.
     (*) [--2dr-init-val-start n] : the start of the interval for the initial
         value in the form function for 2-dimensional recurrences.
     (*) [--2dr-init-val-end n] : the end of the interval for the initial value
         in the form function for 2-dimensional recurrences
     (*) [--use-fnform-2dr] : use the form function for 2-dimensional 
         recurrences. This recurrence / form function has seven parameters: 
         alpha, beta, gamma, alpha', beta', gamma' and the initial value. These
         parameters correspond to the recurrence:
         y(n, k) = (an+bk+g)y(n-1, k)+(a'n+b'k+g')y(n-1,k-1). 
     (*) [--2dr-special-cases] : use functions corresponding to the special
         cases of the 2d recurrence y(n, k) = (an+bk+g)y(n-1, k)+
         (a'n+b'k+g')y(n-1,k-1). Some of the notable special cases for this 
         recurrence are (a, b, g, a', b', g',
         init_val = 1) : Stirling numbers of the first kind (1, 0, -1, 0, 0, 1),
         Stirling numbers of the second kind (0, 1, 0, 0, 0, 1), Eulerian
         numbers (0, 1, 1, 1, -1, 0), "second-order Eulerian numbers"
         (0, 1, 1, 2, -1, -1), and binomial coefficients (0, 0, 1, 0, 0, 1). 

Function Transforms Options:
     (*) [--useft-fn-mod-fn] : use the function transform that take two 
         functions (including the --usefns-* fns) and returns f1 (mod f2).
     (*) [--useft-2convolution] : use the function transform that returns
         the convolution (SUM(k = 0 to k = n of f1(k) * f2(n - k))) of
         the two sequences / functions.
     (*) [--useft-sum-prev] : use the function transform that returns the
         sum of f1 values <= n where the indices are the output of a second
         function f2.
     (*) [--ft-fnpoly-num-fns-start n] : the start of the range for the number
         of functions to use in the fnpoly transform.
     (*) [--ft-fnpoly-num-fns-end n] : the end of the range for the number of
         functions to use in the fnpoly transform.
     (*) [--ft-fnpoly-coeff-start n] : the start of the range for the coeffs
         to use in the fnpoly transform. Note that the program automatically
         removes zero from the range to keep duplication of functions to a
         minimum.
     (*) [--ft-fnpoly-coeff-end n] : the end to the range for the coeffs to
         use in the fnpoly transform. The zero value is automatically discarded.
     (*) [--useft-fnpolys] : use the fnpoly transform. The transform takes in
         a number of functions (the range for this number can be set with the
         --ft-fn-poly-num-fns-* options; the minimum number of functions to
         use is two since using one would duplicate other functions used in the
         program) and makes polynomials of functions (the coeff range involved
         can be set using the --ft-fnpoly-coeff-* options). For example, given
         two functions, f1 and f2, and a coeff range of [-1, 1] (omitting zero)
         one poly is -f1 - f2, another is f1 - f2, and so on. The functions
         resulting from using this transform are all combinations of numbers
         of functions and coeffs given by the ranges set.
     (*) [--ft-compose-num-fns-start n] : the start range of the number of
         functions to use with the composition transform. This value must be
         >= 2 to avoid duplication of functions.
     (*) [--ft-compose-num-fns-end n] : the end of the range of the number of
         functions to use with the composition transform. This value must be 
         >= 2.
     (*) [--useft-compose-fns] : use the composition transform. This transform
         takes a number of functions (range specified by the 
         --ft-compose-num-fns-* options) and takes the composition of them.
         For example, given three functions, f1, f2, and f3, the transform
         produces a function with values of f1(f2(f3(n))).
     (*) [--useft-reverse-digits] : use the reverse digits transform. This
         transform takes a function and reverses the digits of its values.
     (*) [--useft-count-digits] : use the count digits transform. This
         transform takes a function and returns the number of digits in its
         values.
     (*) [--useft-cycle-digits] : use the cycle digits transform. This 
         transform takes a function and cycles the digits of its values. For
         example given a value 1234, cycling the digits one time yields 4123,
         two times yields 3412, and so on.
     (*) [--useft-digital-roots] : use the function transform for digital roots.
         Enabling this option generates functions that compute the digital root
         of other functions.
     
Function Templates / Types Options:
     (*) [--use-fnterm-sums] : use sums of fn_terms as potential matching
         functions. See also the "--useft-fnpoly" option.
     (*) [--fnterm-sum-max-depth d] : specify the maximum number of fn_terms
         to sum for fn_term_sums. This option is only relevant if the
         "--use-fnterm-sums" option is set (see above).
     (*) [--use-fnterm-mult] : use the form (function template) of fn_terms
         multiplied together. 
     (*) [--fnterm-mult-max-depth d] : set the depth for fnterm_mults. This
         value is the maximum number of terms multiplied together. The 
         "--use-fnterm-mult" option must be set for this value to have any 
         effect. The value must be >= 2 (if the value were 1 fn_terms would
         be duplicated).
     (*) [--use-fnterm-linear-combos] : use the function type / template of 
         fn_term_lc when searching for matching functions (see below for
         a description of this type).
     (*) [--fnterm-lc-max-depth n] : set the maximum (minimum: 2) number of
         fn_terms in each fn_term_lc.
     (*) [--fnterm-lc-coeff-start n] : set the minimum value of coeffs to
         use in fn_term_lcs.
     (*) [--fnterm-lc-coeff-end n] : set the maximum value of coeffs to
         use in fn_term_lcs.
     (*) [--fnterm-lc-print-lc] : this option sets the print style when
         printing matching fn_term_lcs. If set the fn_term_lcs will be
         printed in the style of a linear combination with the leading
         coeffs before each of the the fn_terms. Otherwise (default value)
         the fn_terms will be printed with the linear combination coeffs
         combined in with the fn_terms.

     /////// Note that the the following options are experimental as of
             version 0.3-beta ///////

     (*) [--use-fts-mults] : use the form of fn_term_sums multiplied
         together when searching for function matches. Setting this option
         will also enable fn_term_sums.
     (*) [--fts-mult-max-depth d] : set the maximum number of terms that can
         be multiplied together. This value must be >= 2 to avoid duplication
         with fn_term_sums.
     (*) [--use-ftsms] : use the function template / type of fts_mult_sum
         (see below for an explanation of this type) when searching for
         matching functions. Enabling this option will also enable
         fn_term_sums and fts_multiplys.
     (*) [--ftsms-max-depth n] : sets the maximum (minimum: 2) number of
         fts_multiplys used in any given fts_mult_sum.
     (*) [--use-sum-terms] : use the function template / type of sum_term (see
         below for an explanation of this type) when searching for matching
         functions. Enabling this option will also enable fn_term_sums.
     (*) [--sum-term-max-depth n] : sets the maximum number of non-NULL nodes
         attached to a given start sum_term (minimum: 2 to avoid duplication
         with fn_terms_sums).
     (*) [--use-sum-term-sums] : use the function template / type of
         sum_term_sum (see below for an explanation of this type) when
         searching for matching functions. Enabling this option will also
         enable sum_terms and fn_term_sums.
     (*) [--sum-term-sum-max-depth n] : sets the maximum (minimum: 2) number
         of sum_terms in any given sum_term_sum.
  
     /////// end experimental options 
     
The README (this README) is intended to give a brief overview of the program,
and mainly handle administrative issues such as installation and licsening.
This document is also intended to give a comprehensive listing of all of the
commandline options available for the program at runtime.

The other main source of documentation for the program is at the Example
Usage site (http://pattern-hunter.sf.net/example_usage.php). The example
usage document is intended to cover the concepts used in the program (types,
variations on functions, etc.) and give examples of the usage and configuration
of the program. See the example usage page for definitions and usage of the
terms / concepts function templates / types, variables, form functions, 
function transforms, input patterns, and more.

[Misc]:

(0) Utilities

The Math Pattern Hunter site has a utilities program page for programs that relate to the Pattern Hunter. The site is: http://pattern-hunter.sourceforge.net/utils.php. Currently there are programs for download that allow the user to download the OEIS database, search it for user-defined interesting sequences, and then format the chosen sequences for use with the Pattern Hunter.

(1) Places to look for more sequences to try with the program:
     (*) The On-line Encyclopedia of Integer Sequences 
         (http://www.research.att.com/~njas/sequences/)
     (*) The Concrete Math Book (full title Concrete Mathematics : A 
         Foundation for Computer Science) by Graham, Knuth, and Patashnik
     (*) Schaums Outline on Calculus of Finite Differences and Difference
         Equations by Speigel

(2) Variations on the Print Function:

                      fn()                               
       fn()          /                               fn()
    ----------- fn()^                     fn()      /    
          fn()                            ---- fn()^     
         /                              / fn()           
    fn()^                             /                  
-------------------------------- fn()^                   
                         fn()                            
              fn()      /                                
              ---- fn()^                                 
            / fn()                                       
fn()      /                                              
---- fn()^                                               
fn()                                                     

When the program checks for a function match to the input sequence, the formula gets simplified down to fractions. The simplify functions are useful to prevent printing messy duplicates, but the print function is actually capable of much more. The print function is capable of displaying fractions on fractions (and fractions over fractions, ...). The output may not be useful for finding formulas, but it does produce some cool-looking text graphics. If interested take a look at test_print.cpp ($ make test_print) for some examples. There are also some examples of the print function's capabilities on the program site: http://pattern-hunter.sf.net/example_formulae.php.

[Known Bugs]:

(1): [Note this bug should be mostly fixed starting with version 0.3-beta, however it is still possible to hit this bug if there a a large numbers of functions, variables, and forms (so it is left in the README)]
At times when there are a large number of functions, a large "--depth" option, or anything that creates large numbers of function templates to check, the program may sefault. This is due to the way the fill functions for the templates operate. Instead of hard-coding for loops to fill in the functions a recursive method is used to generate all possible combinations of functions and variables (for fn_terms) or all combinations of input fn_terms (for the fn_term_sum and fterm_multiply templates). When the number of combinations grows too large the function will crash out and give a segfault (abort). 

[Feature Requests; Bug Reports; Feedback; Contact Info]:

If there are any desirable features that have been left out of the latest release of the Math Pattern Hunter send me an e-mail (maxieds(AT)gmail(DOT)com) with a decent description of the new feature. If the features are reasonable and time permits I will add the new features to a future release of the program. There is also a TODO.txt file distributed with the source, so one might try looking there to see what features are in line to be added. If there are any bugs in the program send me an e-mail with a detailed description of the problem _AND_ how to reproduce the bug and I will do my best to fix it.

If any user finds an interesting formula from running the program I would like to hear about it and post it on the sf website (I will give you credit for discovering the formula). If there is anything missing from this document or parts of it that need correction let me know via e-mail. Additionally, if there are any function transformations that I have not included in the latest version of the code I would like to hear about them.

Enjoy the program and code. Happy Penguin / Pufferfish.