Okay, attached is a diff patch and JUnit tests for a version of FloatVectorSpecies that implements my idea of what it would mean to automagically scale the stdev.

The patch does two things:
  1. Fixes an issue with setting gene-specific mutation parameters.  Before, if you attempted to set a gene-specific mutation parameter in the following way, it would be ignored:
    pop.subpop.0.species.mutation-type =    gauss
    pop.subpop.0.species.mutation-stdev =   0.1
    pop.subpop.0.species.mutation-stdev.0 =   0.5

    You had to add this redundant line to get the gene-specific value to register:

    pop.subpop.0.species.mutation-type.0 =   gauss

    Now this line is optional.

  2. Adds a Boolean parameter named "mutation-stdev-scale-to-range" for toggling scaling at the global, gene or segment level.  When it's set to true, the stdev parameter is interpreted as a relative standard deviation (i.e. the value of stdev is replaced with stdev*(max-gene - min-gene).  If it's set to false or omitted, the behavior is the same as the original.
So this is one way of doing it.  With this feature I don't have to hand-calculate reasonable standard deviations if I don't want to. I can tweak the stdev for all the parameters by changing one number.

Now, in my personal projects, I prefer to do things a different way:  I augment my parameter language so that no additional Java code is necessary for this kind of thing.  I would allow expressions made up of references to other parameters, so my settings for each gene would look like this:

pop.subpop.0.species.stdev = 0.1

pop.subpop.0.species.min-gene.0 = 0
pop.subpop.0.species.max-gene.0 = 100
pop.subpop.0.species.stdev.0 = $(%pop.subpop.0.species.stdev*(%pop.subpop.0.species.max-gene.0 - %pop.subpop.0.species.min-gene.0))

pop.subpop.0.species.min-gene.1 = 2
pop.subpop.0.species.max-gene.1 = 3
pop.subpop.0.species.stdev.1 = $(%pop.subpop.0.species.stdev*(%pop.subpop.0.species.max-gene.1 - %pop.subpop.0.species.min-gene.1))

Here the scaling is done right in the parameter specification.  It makes for a messier properties file, but would allow users to hand-specify what ever kind of scaling they want for this or other parameters.

Allowing references and arithmetic expressions in the parameter language would be a major change to ECJ, though.  There are pros and cons to blurring the line between a parameters file and a declarative programming language.

Siggy

On Thu, Jun 4, 2015 at 12:32 PM, Eric 'Siggy' Scott <[log in to unmask]> wrote:
It's not in the manual, it's at the top of the Javadoc for FloatVectorSpecies.

On Wed, Jun 3, 2015 at 9:08 PM, Sean Luke <[log in to unmask]> wrote:
I don't see in the documentation where it says that standard deviation is scaled.  Could you point it out?  Please use the current PDF of the manual on the SVN repository.

Sean

On Jun 3, 2015, at 5:04 PM, Eric Scott <[log in to unmask]> wrote:

> All good questions.  That's why I was looking at the code -- to see how exactly "the standard deviation is scaled to reflect each gene's range."
>
> I can specify mutation-stdev's manually for each gene in my application, not a problem.  I suggest that the sentence about scaling be removed from the JavaDoc, as it seems to be erroneous.
>
> Thanks!
> Siggy
>
> On Wed, Jun 3, 2015 at 3:38 PM, Sean Luke <[log in to unmask]> wrote:
> No, wait, it's *not* a bug.  ECJ's stdev is not scaled to fit in bounds.  You'd have to say:
>
> >> pop.subpop.0.species.mutation-stdev.0 =   0.0001
>
> [or whatever]
>
> I understand your intuition here, but stdev is a fixed quantity.  Imagine if someone had the stdev set and then they needed to change the min/max gene, and found that the stdev magically changed as well.  And if it were a relative quantity, what min/max width range would it be relative *to*?
>
> Maybe I might be able to add some parameter like mutation-rstdev which sets the stdev on a per-gene basis based on the min and max genes.  But you'd need to give me exactly what it should be relative to and how you think it should be scaled.
>
> Sean
>
> On Jun 3, 2015, at 8:16 AM, Sean Luke <[log in to unmask]> wrote:
>
> > Then that must be a bug.  I can look into it, but if you want to beat me to it, you might check out FloatVectorSpecies.
> >
> > Sean
> >
> > On Jun 3, 2015, at 4:20 AM, Eric Scott <[log in to unmask]> wrote:
> >
> >> Dear Wizards,
> >>
> >> The JavaDoc for FloatVectorSpecies claims that when using Guassian mutation, "if the gene-by-gene range is used, than the standard deviation is scaled to reflect each gene's range."
> >>
> >> As far as I can tell, however, this doesn't actually happen.  Stepping through the debugger with the following mutation parameters, I can watch DoubleVectorIndividual.gaussianMutation() as it samples from a std of 0.1 when mutation gene 0.  I would have expected it to scale the std to be 0.0001 or such.
> >>
> >> pop.subpop.0.species.min-gene =         -1.0
> >> pop.subpop.0.species.max-gene =         1.0
> >> pop.subpop.0.species.min-gene.0 =         -.001
> >> pop.subpop.0.species.max-gene.0 =         .001
> >> pop.subpop.0.species.mutation-type =    gauss
> >> pop.subpop.0.species.mutation-stdev =   0.1
> >> pop.subpop.0.species.mutation-bounded = true
> >> pop.subpop.0.species.mutation-prob =    0.03
> >>
> >> Is this an error in the documentation? Or am I missing something?
> >>
> >> Thanks,
> >> Siggy
> >>
> >> --
> >>
> >> Ph.D student in Computer Science
> >> George Mason University
> >> http://mason.gmu.edu/~escott8/
>
>
>
> --
>
> Ph.D student in Computer Science
> George Mason University
> http://mason.gmu.edu/~escott8/



--

Ph.D student in Computer Science
George Mason University



--

Ph.D student in Computer Science
George Mason University
http://mason.gmu.edu/~escott8/