module Math.IRT.MLE.Fenced
  ( DF (..)
  , MLEResult (..)
  , mleEst
  ) where

import Data.Default.Class

import Statistics.Distribution

import Math.IRT.Internal.Distribution
import Math.IRT.Internal.LogLikelihood
import Math.IRT.MLE.Internal.Generic
import Math.IRT.Model.Generic


data DF = DF { steps                :: !Int
             , thetaEstimate        :: !Double
             , lower_fence          :: !Double
             , upper_fence          :: !Double
             , fence_discrimination :: !Double }

instance Default DF where
  def = DF 10 0.0 (-3.5) 3.5 3.0


mleEst :: (ContDistr d, DensityDeriv d, LogLikelihood d, GenericModel d) => DF -> [Bool] -> [d] -> MLEResult
mleEst (DF n vTheta lf uf fd) rs params =
    let resp = True : False : rs
        pars = fromThreePLM fd lf 0 : fromThreePLM fd uf 0 : params
    in generic_mleEst resp pars n vTheta