module MeasurementPerformer
(
measure
)
where
import Numeric.LinearAlgebra hiding ( (|>) )
import Prelude hiding ((<*>),(<+>))
import System.Random
import Data.List
import Qubits
import Gates
noOfTests=1000
randomGeneratorSeed=(958036805781772734)
measure::Qubit->Qubit
measure q=createResultQubit
where
result=map(\c->(realPart (c*conjugate c),0)) (toList . flatten $ qubitState q)
qubitStates=collapseQubitState $ runTest (toInteger noOfTests) result
qubitStatesLength=length qubitStates
createResultQubit=Qubit((qubitStatesLength><1) qubitStates::Matrix C)
collapseQubitState::[(Double,Integer)]->[Complex Double]
collapseQubitState result=measure
where
index=elemIndices (maximum result) result
measure=let complexList=map(\i@(f,x)->(realToFrac f:+0.0,x)) result
in [if x==head index then 1.0:+0.0 else 0.0:+0.0 | x<-[0.. (length complexList)1]]
runTest::Integer->[(Double,Integer)]->[(Double,Integer)]
runTest 0 tx=tx
runTest n tx=do
let randomValue=getRandomValue randomGeneratorSeed
runTest (n1) $ selectInterval randomValue tx
selectInterval::Double->[(Double,Integer)]->[(Double,Integer)]
selectInterval randValue list=map (\p@(f, x) -> if f >= randValue then (f, x+1) else p) list
getRandomValue::Int->Double
getRandomValue seed=head (randoms (mkStdGen seed)::[Double])