{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
module Experimenter.Experiment where
import Control.DeepSeq
import Control.Monad.IO.Unlift
import Data.Serialize (Serialize)
import Data.Kind
import System.Random.MWC
import Experimenter.Parameter
import Experimenter.StepResult
type Period = Int
type ExperimentNumber = Int
type RepetitionNumber = Int
type ReplicationNumber = Int
data Phase
= PreparationPhase
| WarmUpPhase
| EvaluationPhase
deriving (Phase -> Phase -> Bool
(Phase -> Phase -> Bool) -> (Phase -> Phase -> Bool) -> Eq Phase
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Phase -> Phase -> Bool
$c/= :: Phase -> Phase -> Bool
== :: Phase -> Phase -> Bool
$c== :: Phase -> Phase -> Bool
Eq, Eq Phase
Eq Phase
-> (Phase -> Phase -> Ordering)
-> (Phase -> Phase -> Bool)
-> (Phase -> Phase -> Bool)
-> (Phase -> Phase -> Bool)
-> (Phase -> Phase -> Bool)
-> (Phase -> Phase -> Phase)
-> (Phase -> Phase -> Phase)
-> Ord Phase
Phase -> Phase -> Bool
Phase -> Phase -> Ordering
Phase -> Phase -> Phase
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Phase -> Phase -> Phase
$cmin :: Phase -> Phase -> Phase
max :: Phase -> Phase -> Phase
$cmax :: Phase -> Phase -> Phase
>= :: Phase -> Phase -> Bool
$c>= :: Phase -> Phase -> Bool
> :: Phase -> Phase -> Bool
$c> :: Phase -> Phase -> Bool
<= :: Phase -> Phase -> Bool
$c<= :: Phase -> Phase -> Bool
< :: Phase -> Phase -> Bool
$c< :: Phase -> Phase -> Bool
compare :: Phase -> Phase -> Ordering
$ccompare :: Phase -> Phase -> Ordering
$cp1Ord :: Eq Phase
Ord, Int -> Phase -> ShowS
[Phase] -> ShowS
Phase -> String
(Int -> Phase -> ShowS)
-> (Phase -> String) -> ([Phase] -> ShowS) -> Show Phase
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Phase] -> ShowS
$cshowList :: [Phase] -> ShowS
show :: Phase -> String
$cshow :: Phase -> String
showsPrec :: Int -> Phase -> ShowS
$cshowsPrec :: Int -> Phase -> ShowS
Show, Int -> Phase
Phase -> Int
Phase -> [Phase]
Phase -> Phase
Phase -> Phase -> [Phase]
Phase -> Phase -> Phase -> [Phase]
(Phase -> Phase)
-> (Phase -> Phase)
-> (Int -> Phase)
-> (Phase -> Int)
-> (Phase -> [Phase])
-> (Phase -> Phase -> [Phase])
-> (Phase -> Phase -> [Phase])
-> (Phase -> Phase -> Phase -> [Phase])
-> Enum Phase
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Phase -> Phase -> Phase -> [Phase]
$cenumFromThenTo :: Phase -> Phase -> Phase -> [Phase]
enumFromTo :: Phase -> Phase -> [Phase]
$cenumFromTo :: Phase -> Phase -> [Phase]
enumFromThen :: Phase -> Phase -> [Phase]
$cenumFromThen :: Phase -> Phase -> [Phase]
enumFrom :: Phase -> [Phase]
$cenumFrom :: Phase -> [Phase]
fromEnum :: Phase -> Int
$cfromEnum :: Phase -> Int
toEnum :: Int -> Phase
$ctoEnum :: Int -> Phase
pred :: Phase -> Phase
$cpred :: Phase -> Phase
succ :: Phase -> Phase
$csucc :: Phase -> Phase
Enum)
class (Monad (ExpM a), MonadUnliftIO (ExpM a), NFData a, NFData (InputState a), NFData (InputValue a), Serialize (InputValue a), Serialize (InputState a), Serialize (Serializable a)) => ExperimentDef a where
type ExpM a :: (Type -> Type)
type Serializable a :: Type
type InputValue a :: Type
type InputState a :: Type
generateInput :: GenIO -> a -> InputState a -> Period -> (ExpM a) (InputValue a, InputState a)
default generateInput :: (InputValue a ~ (), InputState a ~ ()) => GenIO -> a -> InputState a -> Period -> (ExpM a) (InputValue a, InputState a)
generateInput GenIO
_ a
_ InputState a
_ Int
_ = ((), ()) -> ExpM a ((), ())
forall (m :: * -> *) a. Monad m => a -> m a
return ((), ())
runStep :: Phase -> a -> InputValue a -> Period -> (ExpM a) ([StepResult], a)
parameters :: a -> [ParameterSetup a]
default parameters :: a -> [ParameterSetup a]
parameters a
_ = []
equalExperiments :: (a, InputState a) -> (a, InputState a) -> Bool
default equalExperiments :: (a, InputState a) -> (a, InputState a) -> Bool
equalExperiments (a, InputState a)
_ (a, InputState a)
_ = Bool
True
serialisable :: a -> ExpM a (Serializable a)
default serialisable :: (a ~ Serializable a) => a -> ExpM a (Serializable a)
serialisable = a -> ExpM a (Serializable a)
forall (m :: * -> *) a. Monad m => a -> m a
return
deserialisable :: Serializable a -> ExpM a a
default deserialisable :: (a ~ Serializable a) => Serializable a -> ExpM a a
deserialisable = Serializable a -> ExpM a a
forall (m :: * -> *) a. Monad m => a -> m a
return
beforePreparationHook :: ExperimentNumber -> RepetitionNumber -> GenIO -> a -> ExpM a a
default beforePreparationHook :: ExperimentNumber -> RepetitionNumber -> GenIO -> a -> ExpM a a
beforePreparationHook Int
_ Int
_ GenIO
_ = a -> ExpM a a
forall (m :: * -> *) a. Monad m => a -> m a
return
beforeWarmUpHook :: ExperimentNumber -> RepetitionNumber -> ReplicationNumber -> GenIO -> a -> ExpM a a
default beforeWarmUpHook :: ExperimentNumber -> RepetitionNumber -> ReplicationNumber -> GenIO -> a -> ExpM a a
beforeWarmUpHook Int
_ Int
_ Int
_ GenIO
_ = a -> ExpM a a
forall (m :: * -> *) a. Monad m => a -> m a
return
beforeEvaluationHook :: ExperimentNumber -> RepetitionNumber -> ReplicationNumber -> GenIO -> a -> ExpM a a
default beforeEvaluationHook :: ExperimentNumber -> RepetitionNumber -> ReplicationNumber -> GenIO -> a -> ExpM a a
beforeEvaluationHook Int
_ Int
_ Int
_ GenIO
_ = a -> ExpM a a
forall (m :: * -> *) a. Monad m => a -> m a
return
afterPreparationHook :: a -> ExperimentNumber -> RepetitionNumber -> IO ()
default afterPreparationHook :: a -> ExperimentNumber -> RepetitionNumber -> IO ()
afterPreparationHook a
_ Int
_ Int
_ = () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
afterWarmUpHook :: a -> ExperimentNumber -> RepetitionNumber -> ReplicationNumber -> IO ()
default afterWarmUpHook :: a -> ExperimentNumber -> RepetitionNumber -> ReplicationNumber -> IO ()
afterWarmUpHook a
_ Int
_ Int
_ Int
_ = () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
afterEvaluationHook :: a -> ExperimentNumber -> RepetitionNumber -> ReplicationNumber -> IO ()
default afterEvaluationHook :: a -> ExperimentNumber -> RepetitionNumber -> ReplicationNumber -> IO ()
afterEvaluationHook a
_ Int
_ Int
_ Int
_ = () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()