{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE TypeFamilies #-} {-# LINE 1 "Quipper/Algorithms/USV/Simulate.hs" #-} -- | This module contains functions for simulating and -- debugging the USV algorithm and some of its subroutines. module Quipper.Algorithms.USV.Simulate where import Quipper import Quipper.Libraries.Arith import Quipper.Libraries.Simulation import Quipper.Algorithms.USV.USV import Quipper.Algorithms.USV.Definitions import Quipper.Utils.Sampling -- $ For the coherent arithmetic subroutines defined -- in "Quipper.Algorithms.USV.USV", compare the classical -- implementation (implemented using Haskell -- functions) and the quantum one (simulated). -- ===================================================================================== -- * Testing for subroutine /h/ -- | Given an integer /n/, print the table comparing the output values -- of the functions 'h_classical' and 'h_quantum' on every possible -- vector in (ℤ[sub 2[sup 4/n/]])[sup /n/]. h_test :: Int -> IO () h_test n = do -- Compute a table containing: -- Intput | Output of h_classical | Output of (simulated) h_quantum let h_table_n = [ "h table for n = " ++ (show n) ++ ":" , "" , "v h(v)_C h(v)_Q "] ++ [ (show (map integer_of_intm_unsigned w)) ++ " " ++ (show y) ++ " " ++ (show z) ++ flag | w <- (sample_all0 (replicate n (intm (4*n) (2^(4*n)-1)))) , let y = integer_of_intm_unsigned $ h_classical w , let z = integer_of_intm_unsigned $ (run_classical_generic h_quantum) w , let flag = if y /= z then " **MISMATCH**" else ""] ++ ["",""] --Print the table mapM putStrLn $ h_table_n return ()