This is called on each candidate position vector. Generally, it is
used to restrict the possible solution space by folding position vectors
that escape outside the solution space back into the solution space.
It can also allow for symmetries in equations.
Formally, it defines a convex region. All vectors outside the region
are mapped into the region, and the mapping must be continuous at the
boundary. (More precisely, logp(fixer(x)) must be continuous
everywhere that logp(x) is continuous, including the
boundary.) For instance, mapping x[0] into
abs(x[0]) defines a convex region (the positive halfspace),
and the mapping is continuous near x[0]=0 .
Additionally, it may renormalize parameters at will subject to the
restriction that logp(fixer(x))==logp(x) . For instance, it
can implement a constraint that sum(x)==0 by mapping
x into x  average(x) , so long as the value of
logp() is unaffected by that substitution. Other folds can
sometimes lead to problems.
 Parameters:
x (numpy.ndarray)  a parameter vector
 Returns: numpy.ndarray
 a (possibly modified) parameter vector.
 Raises:
NotGoodPosition  This exception is used to indicate that the position x is not
valid. Fixer has the option of either mapping invalid parameter
vectors into valid ones or raising this exception.
 Overrides:
problem_definition.fixer
Attention:
Within a convex region (presumably one that contains the optimal
x ), fixer must not change the value of logp():
logp(fixer(x)) == logp(x).
