Hi Nathan,
Agreed that you don't want stacked mutations, yes. I'm not sure whether mutation overlay in Python with msprime always/never/sometimes gives stacked mutations, or how that is controlled; that's another question for Peter. :->
I guess you want a stacking policy of "f" in an attempt to force all SNPs to be biallelic, but that won't actually achieve that goal, I don't think, will it? If a mutation A occurs at a given site in a given genome, the policy of "f" would prevent genomes containing A from mutating again, to B, say, or to B stacked over A. But it would NOT prevent other genomes that do not contain A from mutating to B, or to C, etc. For this reason, it does not prevent multiallelic SNPs from existing, it ONLY prevents stacking. If you want to force all SNPs to be biallelic, you will need to jump through some other hoop; I don't know whether the right approach to that problem would be to use a custom mutational model of some kind in Python, or to post-filter the mutations that get overlaid (removing all but one mutation at any given position), or what.
So stacking policy "f" only prevents stacking, it does not prevent SNPs from becoming multiallelic. Furthermore, once that fact is established, policy "f" is also a rather strange policy that is rarely biologically realistic, because it prevents stacking from occurring by keeping the FIRST mutation to occur at a given position in a given genome – it blocks any new mutations from changing an already-mutated site (for no obvious biological reason). When the goal is to prevent stacking, policy "l" is almost always what is wanted, since it prevents stacking from occurring by keeping the LAST mutation to occur at a given position in a given genome – it replaces the old mutation at a site with the new mutation (which makes much more sense, biologically, and indeed is how nucleotide-based models in SLiM always work). I realize that you want policy "f" in order to prevent new mutations from making SNPs multiallelic, but as I explained above, it doesn't achieve that goal anyway. Given that it doesn't achieve that goal anyway, policy "l" is almost always what one wants, if one wants to prevent stacking.
Apologies if you already understood all of this. :-> I'm just trying to clarify the terminology and what different options actually achieve, for other readers as much as for you. :-> Anyhow, the short answer is that I don't think stacking policy is the right knob to control what you want to control, and Peter will be able to give you guidance regarding what the correct knob might be. :-> And apologies, also, if I have misunderstood what you wrote and am totally off-base!
Cheers,
-B.
Benjamin C. Haller
Messer Lab
Cornell University