Benchmarking.ipynb 9.8 KB

import sys
import time
import pandas as pd
import numpy as np

# QCGPU Imports
import qcgpu

# ProjectQ Imports
from projectq import MainEngine
import projectq.ops as ops
from projectq.backends import Simulator
from projectq.types import Qureg

# Qiskit Imports
from qiskit import ClassicalRegister, QuantumRegister
from qiskit import QuantumCircuit, execute
def bench_qcgpu(n, depth):
    state = qcgpu.State(n)

    h = qcgpu.gate.h()
    x = qcgpu.gate.x()
    t = qcgpu.gate.t()

    print('started')
    start = time.time()

    for level in range(depth):
        for q in range(n):
    
            state.apply_gate(h, q)
            state.apply_gate(t, q)

            if q != 0:
                state.apply_controlled_gate(x, q, 0)
        
    runtime = time.time() - start
    print('ended: ', runtime)
    return runtime
    
def bench_projectq(n, depth):
    eng = MainEngine(backend=Simulator(gate_fusion=True), engine_list=[])
    qbits = eng.allocate_qureg(n)

    print('started')
    start = time.time()

    for level in range(depth):
        print(depth-level)
        for q in qbits:
            ops.H | q
            ops.T | q
            if q != qbits[0]:
                ops.CNOT | (q, qbits[0])

    runtime = time.time() - start
    print('ended: ', runtime)

    for q in qbits:
        ops.Measure | q
    eng.flush()
    return runtime

def bench_qiskit(n, depth):
    q = QuantumRegister(n)
    c = ClassicalRegister(n)
    qc = QuantumCircuit(q, c)

    
    
    for level in range(depth):
        for i in range(n):
            qc.h(q[i])
            qc.t(q[i])

            if i != 0:
                qc.cx(q[i], q[0])
        
    
    
    qc.measure(q, c)

    print('started')
    start = time.time()
    
    job_sim = execute(qc, "local_qasm_simulator")
    
    runtime = time.time() - start
    print('ended: ', runtime)
    return runtime
bench_qcgpu(28,3)
bench_projectq(28,3)
started
3
2
1
ended:  29.044461727142334
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-4-b9a8dfdc5180> in <module>
----> 1 bench_projectq(28,3)

<ipython-input-2-c605d8ba83af> in bench_projectq(n, depth)
     41 
     42     for q in qbits:
---> 43         ops.Measure | q
     44     eng.flush()
     45     return runtime

~/.local/lib/python3.6/site-packages/projectq/ops/_gates.py in __or__(self, qubits)
    282                 num_qubits += 1
    283                 cmd = self.generate_command(([qubit],))
--> 284                 apply_command(cmd)
    285         if num_qubits > 1:
    286             warnings.warn("Pending syntax change in future versions of "

~/.local/lib/python3.6/site-packages/projectq/ops/_command.py in apply_command(cmd)
     56     """
     57     engine = cmd.engine
---> 58     engine.receive([cmd])
     59 
     60 

~/.local/lib/python3.6/site-packages/projectq/cengines/_main.py in receive(self, command_list)
    264                 then send on)
    265         """
--> 266         self.send(command_list)
    267 
    268     def send(self, command_list):

~/.local/lib/python3.6/site-packages/projectq/cengines/_main.py in send(self, command_list)
    286                                              "\n" + repr(last_line[-2]))
    287                 compact_exception.__cause__ = None
--> 288                 raise compact_exception  # use verbose=True for more info
    289 
    290     def flush(self, deallocate_qubits=False):

KeyboardInterrupt: 
 raised in:
'  File "/home/adam/.local/lib/python3.6/site-packages/projectq/backends/_sim/_simulator.py", line 366, in _handle'
'    out = self._simulator.measure_qubits(ids)'
bench_qiskit(28,3)
started
ended:  0.684215784072876
0.684215784072876