quipper-demos-0.9.0.0: Quipper/Demos/QFTAdder.hs
import Quipper
import Quipper.Libraries.Arith
import Quipper.Libraries.QFTAdd
import Quipper.Libraries.Simulation
import Quipper.Libraries.Unboxing
import System.Environment
------ Functions for testing the QFTAdd circuit --------
-- | Output a preview of the qft_add_in_place circuit for quantum integers of
-- the given size
print_qft_add :: Int -> IO ()
print_qft_add m = print_generic Preview qft_add_in_place (qdint_shape m) (qdint_shape m)
-- | Simulate the running of the qft_add_in_place circuit for the given IntM inputs
run_qft_add :: IntM -> IntM -> IO (IntM,IntM)
run_qft_add = run_generic_io (undefined :: Double) (unbox qft_add_in_place)
-- | A wrapper around 'run_qft_add' so that it can be used with standard Integer
-- arguments.
test_add :: Integer -> Integer -> IO Integer
test_add a b = if (a < 0) || (b < 0) then error "test_add: negative argument" else
do
let m = 2 + ceiling (log (fromInteger (a+b)) / log 2) -- a slight cheat to work out how many qubits to use
let a' = intm m a
let b' = intm m b
(_,ab) <- run_qft_add a' b'
return (fromIntegral ab)
-- | A datatype for the possible command line arguments
data Args = Usage | One Int | Two Integer Integer
-- | A function to parse the command line arguments
parseArgs :: [String] -> Args
parseArgs [s1] = case reads s1 of
[(x1,_)] -> One x1
_ -> Usage
parseArgs [s1,s2] = case (reads s1,reads s2) of
([(x1,_)],[(x2,_)]) -> Two x1 x2
_ -> Usage
parseArgs _ = Usage
-- | The main function calls either test_add or print_qft_add depending upon
-- command line arguments.
main :: IO ()
main = do
args <- getArgs
case parseArgs args of
Usage -> usage
One x -> print_qft_add x
Two x1 x2 -> do
res <- test_add x1 x2
putStrLn (show x1 ++ " + " ++ show x2 ++ " = " ++ show res)
usage :: IO ()
usage = do
name <- getProgName
putStrLn ("usage: " ++ name ++ " num1 <num2>")
putStrLn " - one argument:"
putStrLn " preview the circuit for quantum integers of that length"
putStrLn " - two arguments:"
putStrLn " simulate the circuit for adding the two numbers"
putStrLn " (note that quantum simulation is not efficient)"