HABQT-0.1.0.0: src/HABQTlib.hs
{-|
Module : HABQTlib
This module contains functions for performing and simulating HABQT in Haskell.
Note: functions in this module simply call API from "HABQTlib.UnsafeAPI" after validating inputs.
-}
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)
-- | Given parameters such as output verbosity level and number of quantum
-- bits, set up the tomography function.
tomographyFun ::
QBitNum -- ^ Number of quantum bits under tomography
-> MHMCiter -- ^ Number of MHMC iterations to perform when resampling
-> OptIter -- ^ Number of POVM optimisation steps to perform
-> OutputVerb -- ^ Verbosity of stdout output
-> MWC.GenIO -- ^ IO generator for variates from "System.Random.MWC"
-> 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
-- | Given a true state's density matrix and parameters, set up a simulation of
-- quantum tomography that outputs infidelity between mean estimates and true
-- state.
simulatedTomography ::
DensityMatrix -- ^ True state's density matrix
-> QBitNum -- ^ Number of quantum bits under tomography
-> MHMCiter -- ^ Number of MHMC iterations to perform when resampling
-> OptIter -- ^ Number of POVM optimisation steps to perform
-> OutputVerb -- ^ Verbosity of stdout output
-> MWC.GenIO -- ^ IO generator for variates from "System.Random.MWC"
-> 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
-- | Stream simulated tomography results.
streamResults ::
QBitNum -- ^ Number of quantum bits under tomography
-> Rank -- ^ Rank of true state
-> NumberOfParticles -- ^ Number of particles (per rank) to use for tomography
-> MHMCiter -- ^ Number of MHMC iterations to perform when resampling
-> OptIter -- ^ Number of POVM optimisation steps to perform
-> OutputVerb -- ^ Verbosity of stdout output
-> 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