module GEP.MonadicGeneOperations where
import GEP.Rmonad
import GEP.GeneOperations
import GEP.Types
import GEP.Params
isTransposer :: Genome ->
SimParams ->
Chromosome ->
GEPMonad Chromosome
isTransposer genome params who =
do takelen <- nextR (maxISLen params)
takepos <- nextR ((geneLength genome)takelen)
whichgene <- nextR (numGenes genome)
putpos <- nextR ((headLength genome)1)
return $ transposeIS who genome (whichgene1) takepos takelen (putpos+1)
risTransposer :: Genome ->
SimParams ->
Chromosome ->
GEPMonad Chromosome
risTransposer genome params who =
do takelen <- nextR (maxRISLen params)
takepos <- nextR ((headLength genome)1)
genenum <- nextR (numGenes genome)
return $ transposeRIS who genome genenum (takepos+1) takelen
geneTransposer :: Genome ->
Chromosome ->
GEPMonad Chromosome
geneTransposer genome who =
do whichGene <- nextR (numGenes genome)
return $ transposeGene who genome whichGene
x1PHelper :: Genome ->
(Chromosome,Chromosome) ->
GEPMonad (Chromosome,Chromosome)
x1PHelper g pair =
do xoverPos <- nextR (geneLength g)
return $ crossover1pt pair xoverPos
x2PHelper :: Genome ->
(Chromosome,Chromosome) ->
GEPMonad (Chromosome,Chromosome)
x2PHelper g pair =
do xoverPos1 <- nextR (geneLength g)
xoverPos2 <- nextRDifferent (geneLength g) xoverPos1
return $ crossover2pt pair (min xoverPos1 xoverPos2)
(max xoverPos1 xoverPos2)
xGHelper :: Genome ->
(Chromosome, Chromosome) ->
GEPMonad (Chromosome,Chromosome)
xGHelper g pair | (numGenes g) == 1 = return pair
xGHelper g pair | otherwise = do
xoverGene <- nextR (numGenes g)
return $ crossoverGene pair xoverGene (geneLength g)