settings.py
***********

Since the evolutionary framework requires several settings for each of the modules being used, a separate file is used to specify the correct settings for a run of an evolution.

This file contains functions, each of which generates a specific set of settings to run evolution on a specific problem

Fields
=======

All fields have to be set with some value or other. There are no default values in this framework, by design

algorithm
----------
The evolutionary algorithm to be run (defined in GA.py)

testmode
---------
Set this to true to run in-function assert statements that check contracts. False otherwise

maxGens
-------
The maximum number of generations for which evolution shall be run after which it will be stopped even if an optimal solution has not yet been discovered

targetscore
------------
The known optimal fitness score of the problem. Setting this to ``None`` or ``''`` will simulate negative and positive infinity, respectively

popsize
--------
The number of individuals in the population during evolution

numCrossovers
-------------
The number of crossover operations per generation

SCORES
------
A dictionary that remembers the fitness values of all individuals. This is used as an optimization. Usually, this is an empty dictionary
This can be deactivated by changing ``Individual.__hash__`` to something that will be unique to each individual, regardless of genetic makeup

genfunc
--------
The function that generates the initial population

genparams
----------
A tuple containing the parameters to send to ``genfunc`` in the correct order

scorefunc
----------
The function that returns the fitness evaluation of an individual. By default this is set to ``fitness.score``. 
.. note::

    It is advisable to leave this as ``fitness.score``, especially for multi-chromosome individuals.

scoreparams
------------
This is a 3-tuple

======	===================	========================================================================================================================
Index	Type			Description
======	===================	========================================================================================================================
0	list of functions	the `i` th function listed here will be used to compute the fitness of the `i` th chromosome of the individuals
1	list of tuples		the `i` th tuple listed here contains the parameters (in the correct order) for the `i` th function in the list in index 0
2	dictionary		``SCORES``
======	===================	========================================================================================================================

.. warning::

    The parameters listed do NOT include any reference to the individual whose fitness will be computed. The individual will be supplied by the main evolution function itself. This is because the individual is chosen by the selection function and therefore cannot be known at the time of making these settings

selectfunc
-----------
The selection function by which individuals will be selected for crossover

selectparams
-------------
A tuple of parameters (in the correct order) for the selection function

.. warning::

    The parameters listed do NOT include any reference to the population from which individuals will be selected. The population will be supplied by the main evolution function itself. This is because the population keeps changing over time and therefore cannot be known at the time of making these settings

crossfunc
----------
The function that performs crossover between two individuals

crossparams
------------
A tuple of parameters (in the correct order) for the crossover function

.. warning::

    The parameters listed do NOT include any reference to the individuals to be crossed over. These individuals will be supplied by the main evolution function itself. This is because the individuals are chosen by the selection function and therefore cannot be known at the time of making these settings

mutfunc
--------
The function that will mutate a given individual

mutparams
----------
A tuple of parameters (in the correct order) for the crossover function

.. warning::

    The parameters listed do NOT include any reference to the individual to be mutated. This individual will be supplied by the main evolution function itself. This is because the individual is chosen at random (with probability) and therefore cannot be known at the time of making these settings

crossprob
----------
The probability of crossover occurring. Represented as a float in [0, 1]

mutprob
--------
The probability of mutation occurring. Represented as a float in [0, 1]

rouletteWheelRequireres
------------------------
A set of functions that require a roulette wheel. This is used later in the automated computation some settings

getWheel
--------
A ``bool`` that determines whether the evolutionary algorithm must compute a roulette wheel for selection

.. warning::

    This is an automatically set parameter. Do not alter it.

visualize
----------
A boolean flag that determines if visualization is enabled

screenWidth
------------
The width of the screen created for visualization

screenHeight
-------------
The height of the screen created for visualization

makeScreenParams
-----------------
A tuple of parameters (in the correct order) required to make the screen on which the visualization will be drawn

drawParams
-----------
A tuple of parameters (in the correct order) required to draw the visualization on the screen

fon
----
The font with which any text should be written on screen during visualization

fontParams
-----------
The parameters for rendering font as a tuple 9in the correct order)

labelParams
-----------
A tuple of parameters (in the correct order) required to place any text in the correct place on screen during visualization

sanity
-------
A list of parameter names that should be present in the settings.
The settings are checked for the entries in ``sanity`` before any evolution is run, to ensure that all parameters are provided

answer
-------
A dictionary of the settings to run evolution

.. warning::

    It is generally a bad idea to alter statements that are not assignment statements. This is because they are automations that generate some settings, thus taking the responsibility of generating those settings away from the programmer. Altering them may have unintended side-effects

.. warning::

    It is generally a bad idea to alter statements that are inside the ``if visualize`` block. This is a block that automates the inclusion of settings (both into the returned settings and the sanity) for visualization if it is enabled