packages feed

experimenter-0.1.0.0: src/Experimenter/Parameter/Type.hs

{-# LANGUAGE DefaultSignatures         #-}
{-# LANGUAGE DeriveAnyClass            #-}
{-# LANGUAGE DeriveGeneric             #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleInstances         #-}
{-# LANGUAGE TemplateHaskell           #-}
{-# LANGUAGE UndecidableInstances      #-}
module Experimenter.Parameter.Type where

import           Control.DeepSeq
import           Control.Lens
import qualified Data.ByteString as BS
import           Data.Serialize  as S
import qualified Data.Text       as T
import           GHC.Generics


data ExperimentDesign
  = FullFactory
  | SingleInstance
  deriving (Bounded, Enum, Eq, Ord, Generic, NFData)

data ParameterSetup a =
  forall b . (Show b, Ord b, Serialize b) =>
  ParameterSetup
  { parameterName         :: !T.Text                          -- ^ Name of parameter.
  , setParameter          :: !(b -> a -> a)                   -- ^ Set the parameter.
  , getParameter          :: !(a -> b)                        -- ^ Get the parameter from the current state.
  , modifyParameter       :: !(Maybe (b -> IO [b]))           -- ^ Either no modification or function.
  , bounds                :: !(Maybe (b, b))                  -- ^ Bounds (inclusive).
  , skipPreparationPhase  :: !(Maybe (b -> Bool))             -- ^ Skip the preparation phase if True (e.g. to skip learning phase). Default: False.
  , alterExperimentDesign :: !(Maybe (b -> ExperimentDesign)) -- ^ Change the experiment design. Default: Full-Factory design.
  }
-- makeLenses ''ParameterSetup  -- does not work with ExistentialQuantification


data ParameterSetting a =
  ParameterSetting
  { _parameterSettingName                 :: !T.Text
  , _parameterSettingValue                :: !BS.ByteString
  , _parameterSettingSkipPreparationPhase :: !Bool
  , _parameterSettingExperimentDesign     :: !ExperimentDesign
  } deriving (Eq, Generic, NFData)
makeLenses ''ParameterSetting


getParameterData :: ParameterSetup a -> a -> BS.ByteString
getParameterData (ParameterSetup _ _ getter _ _ _ _) a = runPut $ put $ getter a


mkParameterSetting :: ParameterSetup a -> a -> ParameterSetting a
mkParameterSetting (ParameterSetup n _ getter _ _ drp design) a = ParameterSetting n (runPut $ put aVal) (maybe False (\x -> x aVal) drp) (maybe FullFactory (\x -> x aVal) design)
  where aVal = getter a