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 > <https://cs.gmu.edu/~eclab/projects/ecj/docs/classdocs/ec/vector/FloatVectorSpecies.html> > . > > 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 > http://mason.gmu.edu/~escott8/ > -- Ph.D student in Computer Science George Mason University http://mason.gmu.edu/~escott8/