0 | module NN.Optimisers.Definition
3 | import Data.Container.Additive
20 | record DOptimiser {inputTy : Type}
21 | (paramCont : inputTy -> AddCont)
24 | constructor MkDOptimiser
26 | opt : (x : inputTy) ->
27 | (Const (paramCont x).Shp >< Const stateTy) =%> UC (paramCont x)
33 | (paramCont : AddCont)
36 | constructor MkOptimiser
37 | opt : Const paramCont.Shp >< Const stateTy =%> UC paramCont
39 | initState : IO stateTy
43 | (.fwd) : Optimiser p s -> (p.Shp, s) -> p.Shp
44 | (.fwd) (MkOptimiser opt _) = opt.fwd
47 | (.bwd) : (opt : Optimiser pCont stateTy) ->
48 | (ps : (pCont.Shp, stateTy)) ->
49 | (pCont.PosSet (opt.fwd ps)) ->
50 | (pCont.Shp, stateTy)
51 | (.bwd) (MkOptimiser opt _) = opt.bwd
56 | composeParallel : Optimiser pCont s ->
57 | Optimiser qCont t ->
58 | Optimiser (pCont >*< qCont) (s, t)
59 | composeParallel (MkOptimiser o1 initS) (MkOptimiser o2 initT) = MkOptimiser
60 | (!% \((p, q), (s, t)) => (
(o1.fwd (p, s), o2.fwd (q, t)) **
61 | \(p', q') => let (pUpdated, sUpdated) = o1.bwd (p, s) p'
62 | (qUpdated, tUpdated) = o2.bwd (q, t) q'
63 | in ((pUpdated, qUpdated), (sUpdated, tUpdated)))
)
64 | [| (initS, initT) |]