From a506d45e16922bbda123f92dad55959694ccc2df Mon Sep 17 00:00:00 2001 From: sanine Date: Wed, 29 Nov 2023 02:59:51 -0600 Subject: implement individual gene mutation functions --- test/GenomeTest.hs | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ test/Main.hs | 2 ++ 2 files changed, 74 insertions(+) create mode 100644 test/GenomeTest.hs (limited to 'test') diff --git a/test/GenomeTest.hs b/test/GenomeTest.hs new file mode 100644 index 0000000..0a27a94 --- /dev/null +++ b/test/GenomeTest.hs @@ -0,0 +1,72 @@ +module GenomeTest (suite) where + +import Test.Tasty +import Test.Tasty.HUnit +import qualified Mind as M +import Genome +import System.Random + +suite :: TestTree +suite = testGroup "genome tests" $ + [ mutationTests + ] + + +mutationTests :: TestTree +mutationTests = testGroup "mutations" $ + [ testCase "mutating the source of a gene" $ + let + rand = mkStdGen 1 -- randomR generates sequence (1, 2, 0, ...) + genome = Genome { numInput = 2, numInternal = 1, numOutput = 5, genes = [] } + sourceGene = Gene { source = M.Input 0, sink = M.Output 1, weight = 4 } + mutatedGenes = fst $ foldl + (\(list, r) g -> + let (g', r') = mutateGeneSource genome g r + in (list ++ [g'], r') + ) + ([], rand) + (replicate 3 sourceGene) + in + mutatedGenes @?= + [ Gene { source = M.Input 1, sink = M.Output 1, weight = 4 } + , Gene { source = M.Internal 0, sink = M.Output 1, weight = 4 } + , Gene { source = M.Input 0, sink = M.Output 1, weight = 4 } + ] + , testCase "mutating the sink of a gene" $ + let + rand = mkStdGen 1 -- randomR generates sequence (1, 2, 0, ...) + genome = Genome { numInput = 2, numInternal = 1, numOutput = 2, genes = [] } + sourceGene = Gene { source = M.Input 0, sink = M.Output 1, weight = 4 } + mutatedGenes = fst $ foldl + (\(list, r) g -> + let (g', r') = mutateGeneSink genome g r + in (list ++ [g'], r') + ) + ([], rand) + (replicate 3 sourceGene) + in + mutatedGenes @?= + [ Gene { source = M.Input 0, sink = M.Output 0, weight = 4 } + , Gene { source = M.Input 0, sink = M.Output 1, weight = 4 } + , Gene { source = M.Input 0, sink = M.Internal 0, weight = 4 } + ] + , testCase "mutating the weight of a gene" $ + let + rand = mkStdGen 0 -- randomR generates sequence (7.572357,-1.4116564,-7.2413177, ...) + genome = Genome { numInput = 2, numInternal = 1, numOutput = 2, genes = [] } + sourceGene = Gene { source = M.Input 0, sink = M.Output 1, weight = 4 } + mutatedGenes = fst $ foldl + (\(list, r) g -> + let (g', r') = mutateGeneWeight genome g r + in (list ++ [g'], r') + ) + ([], rand) + (replicate 3 sourceGene) + in + mutatedGenes @?= + [ Gene { source = M.Input 0, sink = M.Output 1, weight = 7.572357} + , Gene { source = M.Input 0, sink = M.Output 1, weight = -1.4116564 } + , Gene { source = M.Input 0, sink = M.Internal 1, weight = -7.2413177 } + ] + + ] diff --git a/test/Main.hs b/test/Main.hs index 8847a07..907bbdd 100644 --- a/test/Main.hs +++ b/test/Main.hs @@ -3,8 +3,10 @@ module Main (main) where import Test.Tasty import qualified MindTest +import qualified GenomeTest main :: IO () main = defaultMain $ testGroup "all tests" $ [ MindTest.suite + , GenomeTest.suite ] -- cgit v1.2.1