module HABQTlib
( TomState
, TomFun
, tomographyFun
, simulatedTomography
, streamResults
) where
import Control.Monad.State.Lazy
import Data.Validation
import HABQTlib.Data
import HABQTlib.MeasurementProcessing
import HABQTlib.UnsafeAPI
import Streaming (Of, Stream)
import qualified System.Random.MWC as MWC
validQMO ::
QBitNum
-> MHMCiter
-> OptIter
-> ( Validation [String] QBitNum
, Validation [String] MHMCiter
, Validation [String] OptIter)
validQMO nq' mi' oi' =
let nq = validQBitN nq'
mi = validMHMCiter mi'
oi = validOptIter oi'
in (nq, mi, oi)
tomographyFun ::
QBitNum
-> MHMCiter
-> OptIter
-> OutputVerb
-> MWC.GenIO
-> Validation [String] TomFun
tomographyFun nq' mi' oi' outv gen =
let (nq, mi, oi) = validQMO nq' mi' oi'
in tomographyFun' <$> nq <*> mi <*> oi <*> Success outv <*> Success gen
simulatedTomography ::
DensityMatrix
-> QBitNum
-> MHMCiter
-> OptIter
-> OutputVerb
-> MWC.GenIO
-> Validation [String] (StateT PurePOVM TomState Double)
simulatedTomography trueDM nq' mi' oi' outv gen =
let dm = validDM trueDM
(nq, mi, oi) = validQMO nq' mi' oi'
in simulatedTomography' <$> dm <*> nq <*> mi <*> oi <*> Success outv <*>
Success gen
streamResults ::
QBitNum
-> Rank
-> NumberOfParticles
-> MHMCiter
-> OptIter
-> OutputVerb
-> Validation [String] (Stream (Of Double) IO ())
streamResults nq' rank' pn' mi' oi' outv =
let (nq, mi, oi) = validQMO nq' mi' oi'
rank = validRank rank'
pn = validPartNum pn'
in streamResults' <$> nq <*> rank <*> pn <*> mi <*> oi <*> Success outv