packages feed

quipper-demos-0.9.0.0: Quipper/Demos/SynthesisTest.hs

-- | Some demos for "Quipper.Libraries.Synthesis".

import Quipper
import Quipper.Libraries.Synthesis

import Quantum.Synthesis.Ring
import Quantum.Synthesis.Matrix
import Quantum.Synthesis.MultiQubitSynthesis

import System.Random

-- ----------------------------------------------------------------------
-- * Some demos for Quipper.Libraries.Synthesis

-- | Import a compressed Clifford+/T/ operator as a Quipper circuit.
main1 :: IO ()
main1 = do
  print_simple Preview (exact_synthesis1 (0x1d00d27a0188b095b8cdd4ead9a244198d8b22e :: Integer))
  
-- | Exact synthesis of a Clifford+/T/ circuit from an exact matrix
-- representation.
main2 :: IO ()
main2 = do
  print_simple Preview (exact_synthesis1 op)
  where
    op :: Matrix Two Two DOmega
    op = roothalf^4 * matrix2x2 ( 1 - 2*roottwo,    2 + roottwo - i )
                                ( -2 - roottwo - i, 1 - 2*roottwo   )

-- | Exact synthesis of a multi-qubit Clifford+/T/ circuit from an
-- exact matrix representation.
main3 :: IO ()
main3 = do
  print_generic Preview (exact_synthesis_alt op) [qubit, qubit]
  where
    op :: Matrix Four Four DOmega
    op = matrix4x4 ( 1,  0,  0, 0 )
                   ( 0, -s,  s, 0 )
                   ( 0,  0,  0, 1 )
                   ( 0,  s,  s, 0 ) 
    s = roothalf
    
-- | Exact synthesis of a multi-qubit Clifford+/T/ circuit from an
-- exact matrix representation.
main3a :: IO ()
main3a = do
  print_generic Preview (exact_synthesis_alt op) [qubit, qubit, qubit]
  where
    op :: Matrix Eight Eight DOmega
    op = matrix [[ 1, 0,  0, 0, 0, 0, 0, 0 ],
                 [ 0, s, -s, 0, 0, 0, 0, 0 ],
                 [ 0, 0,  0, 1, 0, 0, 0, 0 ],
                 [ 0, s,  s, 0, 0, 0, 0, 0 ],
                 [ 0, 0,  0, 0, 1, 0, 0, 0 ],
                 [ 0, 0,  0, 0, 0, 1, 0, 0 ],
                 [ 0, 0,  0, 0, 0, 0, 0, 1 ],
                 [ 0, 0,  0, 0, 0, 0, 1, 0 ]] 
    s = roothalf
    
-- | Approximate synthesis of a /z/-rotation as a Clifford+/T/ circuit.
-- Angle θ = π\/128, precision ε = 10[sup −30].
main4 :: IO ()
main4 = do
  g <- newStdGen  -- a source of randomness
  print_simple Preview (approximate_synthesis_zrot prec (pi/128) g)
  where
    prec = 30 * digits

-- | Approximate synthesis of a global phase. 
-- Angle α = π\/128, precision ε = 10[sup −30].
main5 :: IO ()
main5 = do
  g <- newStdGen  -- a source of randomness
  print_simple Preview (approximate_synthesis_phase True prec (pi/128) g)
  where  
    prec = 30 * digits

-- | Approximate synthesis of an arbitrary single-qubit operator,
-- given by Euler angles. Precision ε = 2[sup −50].
main6 :: IO ()
main6 = do
  g <- newStdGen  -- a source of randomness
  let circ = approximate_synthesis_euler True prec (alpha, beta, gamma, delta) g
  print_simple Preview circ
  where
    prec = 50 * bits
    alpha = 0.1 * pi
    beta = 0.2 * pi
    gamma = 0.5 * pi
    delta = -0.6 * pi
    
-- | Approximate synthesis of an arbitrary single-qubit operator,
-- given as a matrix. The matrix is given in an exact notation.
-- Precision ε = 10[sup −10].
main7 :: IO ()
main7 = do
  g <- newStdGen  -- a source of randomness
  let circ = approximate_synthesis_u2 True prec op g
  print_simple Preview circ
  where
    prec = 10 * digits
    op = matrix2x2 ( 0.6, 0.8*i )
                   (-0.8, 0.6*i )

-- | Run any of the above main functions:
main = main3a