module Hopfield.Experiments.ExperimentUtil where
import qualified Data.Vector as V
import Hopfield.Analysis (computeErrorSuperAttractorNumbers)
import Hopfield.Common
import Hopfield.Hopfield
import Hopfield.Measurement
import Hopfield.SuperAttractors (Degree)
import Hopfield.Util
doHamming :: Pattern -> [Pattern] -> String -> String -> IO ()
doHamming p ps pName psName = do
let msg = unwords ["Hamming distance between", pName, "pattern and",
psName, "patterns:"]
putStrLn msg
let n = V.length p
hammingDists = map (hammingDistance p) ps
hammingPct = map (./. n) hammingDists :: [Double]
putStrLn $ prettyList hammingDists
putStrLn $ toPercents hammingPct ++ "\n"
doCheckFixed :: Show a => [ (a, HopfieldData) ] -> Int -> String -> IO ()
doCheckFixed pairs index labelsName = do
let patErrs = [ label | (label, net) <- pairs, not $ checkFixed net index]
msg = unwords ["WARNING: The following", labelsName,
"have produced networks where the pattern is NOT a fixed point:\n"]
if not $ null patErrs
then putStrLn $ msg ++ prettyList patErrs ++ "\n"
else putStrLn "Pattern is always a fixed point\n"
doErrorProb :: Int -> Int -> [Degree] -> IO ()
doErrorProb n p degrees = do
putStrLn $ "Expected network errors: "
let expErrs = [ computeErrorSuperAttractorNumbers d p n | d <- degrees ]
errorHeader = "Degree\tExpected error"
putStrLn $ attachLabels errorHeader $ [packL degrees, packL expErrs]