module Main where

import AI.NEAT.Genome
import AI.NEAT.Population
import AI.NEAT.Organism
import AI.NEAT.Network

import Control.Monad

main :: IO ()
main = do loadNeatParams "test.ne"
          start_genome <- loadFromFile "xorstartgenes"
          pop <- newPopulation start_genome 150
          forM_ [1 .. gens] $ \gen ->
            do forEachOrganism pop xor_evaluate
               epoch pop gen
          net <- network =<< getOrganism pop 0
          let test values = do loadSensors net values
                               activate net
                               (print . map round) =<< outputs net
                               flush net
          test [1,0,0]
          test [1,1,0]
          test [1,0,1]
          test [1,1,1]
          return ()
    where gens = 100

xor_evaluate org
    = do net <- network org
         outs <- forM inputs $ \input ->
                 do loadSensors net input
                    activate net
                    out <- outputs net
                    flush net
                    return (head out)
         let results = outs
             errorsum = abs(results!!0)^2 +
                        abs(1-results!!1)^2 +
                        abs(1-results!!2)^2 +
                        abs(results!!3)^2
             fitness = (4-errorsum)^2
         setFitness org fitness
    where inputs = [[1,0,0]
                   ,[1,0,1]
                   ,[1,1,0]
                   ,[1,1,1]]

