module AI.HNN.Layer where
import AI.HNN.Neuron
import Control.Arrow
import Data.Array.Vector
import Data.List
createSigmoidLayerU :: Int -> Double -> UArr Double -> [Neuron]
createSigmoidLayerU n threshold weights =
let neuron = createNeuronSigmoidU threshold weights in
take n . repeat $ neuron
createHeavysideLayerU :: Int -> Double -> UArr Double -> [Neuron]
createHeavysideLayerU n threshold weights =
let neuron = createNeuronSigmoidU threshold weights in
take n . repeat $ neuron
createSigmoidLayer :: Int -> Double -> [Double] -> [Neuron]
createSigmoidLayer n threshold = createSigmoidLayerU n threshold . toU
createHeavysideLayer :: Int -> Double -> [Double] -> [Neuron]
createHeavysideLayer n threshold = createHeavysideLayerU n threshold . toU
computeLayerU :: [Neuron] -> UArr Double -> UArr Double
computeLayerU ns inputs = toU $ map (\n -> computeU n inputs) ns
computeLayer :: [Neuron] -> [Double] -> [Double]
computeLayer ns = fromU . computeLayerU ns . toU
learnSampleLayerU :: Double -> [Neuron] -> (UArr Double, UArr Double) -> [Neuron]
learnSampleLayerU alpha ns (xs, ys) = zipWith (\n y -> learnSampleU alpha n (xs, y)) ns (fromU ys)
learnSampleLayer :: Double -> [Neuron] -> ([Double], [Double]) -> [Neuron]
learnSampleLayer alpha ns = learnSampleLayerU alpha ns . (toU *** toU)
learnSamplesLayerU :: Double -> [Neuron] -> [(UArr Double, UArr Double)] -> [Neuron]
learnSamplesLayerU alpha = foldl' (learnSampleLayerU alpha)
learnSamplesLayer :: Double -> [Neuron] -> [([Double], [Double])] -> [Neuron]
learnSamplesLayer alpha ns = learnSamplesLayerU alpha ns . map (toU *** toU)
quadErrorU :: [Neuron] -> (UArr Double, UArr Double) -> Double
quadErrorU ns (xs, ys) = let os = computeLayerU ns xs
in (/2) $ sumU $ zipWithU (\o y -> (y o)**2) os ys
quadError :: [Neuron] -> ([Double], [Double]) -> Double
quadError ns = quadErrorU ns . (toU *** toU)