Commit 0bce4a16 authored by Mccaskey, Alex's avatar Mccaskey, Alex
Browse files

adding ability for kernel builder to build from qiskit or qasm

parent 870d331c
Loading
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
import qiskit
from qcor import * 

# Generate 3-qubit GHZ state
circ = qiskit.QuantumCircuit(3, 3)
circ.h(0)
circ.cx(0, 1)
circ.cx(1, 2)
circ.measure([0, 1, 2], [0, 1 ,2])

src = circ.qasm()

builder = KernelBuilder()
builder.from_qasm(src)
test_from_qasm = builder.create()

q = qalloc(3)
test_from_qasm(q)
print(q.counts())

builder = KernelBuilder()
builder.from_qiskit(circ)
test_from_qk = builder.create()

q = qalloc(3)
test_from_qk(q)
print(q.counts())
+12 −3
Original line number Diff line number Diff line
@@ -723,6 +723,14 @@ class KernelBuilder(object):
        self.qjit_str += self.TAB+"{} = _internal_python_createObservable(\"{}\", \"{}\")\n".format(op_var_name, op_type, op_str)
        self.qjit_str += self.TAB+'exp_i_theta({}, {}, {})\n'.format(self.qreg_name, params_str, op_var_name)
   
    def from_qasm(self, qasm_str):
        xacc_ir = xacc.getCompiler('staq').compile(qasm_str).getComposites()[0]
        pyxasm = xacc.getCompiler('pyxasm').translate(xacc_ir, {'qreg_name':self.qreg_name, 'tab_prepend':self.TAB})
        processed_str = pyxasm        
        self.qjit_str += processed_str

    def from_qiskit(self, qk_circ):
        return self.from_qasm(qk_circ.qasm())
    
    # Synthesis from matrix, or from matrix generator
    # can provide method = [qsearch,qfast,kak, etc.]
@@ -781,9 +789,10 @@ class KernelBuilder(object):
        if inspect.stack()[-1].code_context is not None:
            kernel_name = inspect.stack()[-1].code_context[0].split(' = ')[0]

        args_str = 'q : qreg, ' + ', '.join(k+' : '+allowed_type_map[str(v)] for k,v in self.kernel_args.items())
        # FIXME optionally add , if we have kernel_args
        args_str = 'q : qreg'+ (', ' if len(self.kernel_args) else '') + ', '.join(k+' : '+allowed_type_map[str(v)] for k,v in self.kernel_args.items())
        func = 'def {}({}):\n'.format(kernel_name, args_str)+self.qjit_str
        print(func)
        # print(func)
        result = globals()
        exec(func, result)
        # print(result)