From 1879332ffbe1889d9e8b7c8d322cb6262822a444 Mon Sep 17 00:00:00 2001 From: "Jay M. Gambetta" Date: Sat, 13 May 2017 04:21:03 -0400 Subject: [PATCH 01/16] unitary simulatror fixed --- qiskit/extensions/standard/rx.py | 6 +- qiskit/extensions/standard/ry.py | 6 +- qiskit/extensions/standard/rz.py | 6 +- qiskit/simulators/__init__.py | 2 +- .../{unitary.py => _unitarysimulator.py} | 33 +++++--- qiskit/simulators/example.qasm | 12 --- qiskit/unroll/__init__.py | 1 + ...itarysimulator.py => _simulatorbackend.py} | 75 ++++++++++--------- {qiskit/simulators => test}/testsim.py | 8 +- 9 files changed, 69 insertions(+), 80 deletions(-) rename qiskit/simulators/{unitary.py => _unitarysimulator.py} (67%) delete mode 100644 qiskit/simulators/example.qasm rename qiskit/unroll/{_unitarysimulator.py => _simulatorbackend.py} (79%) rename {qiskit/simulators => test}/testsim.py (67%) diff --git a/qiskit/extensions/standard/rx.py b/qiskit/extensions/standard/rx.py index ef4b46d37f..b026e79196 100644 --- a/qiskit/extensions/standard/rx.py +++ b/qiskit/extensions/standard/rx.py @@ -1,8 +1,4 @@ -""" -Rotation around the x-axis. - -Author: Jay using andrew code. -""" +"""Rotation around the x-axis.""" from qiskit import QuantumRegister from qiskit import QuantumCircuit from qiskit import Gate diff --git a/qiskit/extensions/standard/ry.py b/qiskit/extensions/standard/ry.py index 54e2e5ba9a..26863a1b0c 100644 --- a/qiskit/extensions/standard/ry.py +++ b/qiskit/extensions/standard/ry.py @@ -1,8 +1,4 @@ -""" -Rotation around the y-axis. - -Author: Jay using andrew code. -""" +"""Rotation around the y-axis.""" from qiskit import QuantumRegister from qiskit import QuantumCircuit from qiskit import Gate diff --git a/qiskit/extensions/standard/rz.py b/qiskit/extensions/standard/rz.py index 55f5e1d2df..18fa790050 100644 --- a/qiskit/extensions/standard/rz.py +++ b/qiskit/extensions/standard/rz.py @@ -1,8 +1,4 @@ -""" -Rotation around the z-axis. - -Author: Jay using andrew code. -""" +"""Rotation around the z-axis.""" from qiskit import QuantumRegister from qiskit import QuantumCircuit from qiskit import Gate diff --git a/qiskit/simulators/__init__.py b/qiskit/simulators/__init__.py index 3d91ba7853..8b13789179 100644 --- a/qiskit/simulators/__init__.py +++ b/qiskit/simulators/__init__.py @@ -1 +1 @@ -from ._unitarysimulator import UnitarySimulator + diff --git a/qiskit/simulators/unitary.py b/qiskit/simulators/_unitarysimulator.py similarity index 67% rename from qiskit/simulators/unitary.py rename to qiskit/simulators/_unitarysimulator.py index 8358ee515b..c80dceb785 100755 --- a/qiskit/simulators/unitary.py +++ b/qiskit/simulators/_unitarysimulator.py @@ -1,12 +1,21 @@ """ -Quantum tools and common operators. +Contains a (slow) python simulator that makes the unitary of the circuit. These are simple methods for making common matrices used in quantum computing. -Author: Jay Gambetta + """ import numpy as np +class UnitarySimulator(object): + """ + Python implementation of a unitary computer simulator. + """ + + def __init__(self): + self._unitary_state = np.ones(1, dtype=complex) + self.number_of_qubits = 0 + def unitary_qi(gate, qubit, number_of_qubits): """Apply the single qubit gate. @@ -59,15 +68,17 @@ def unitary_qij(gate, qubit_1, qubit_2, number_of_qubits): def unitary_simulator(unitary_gates): + """Calculate the unitary for the gates.""" number_of_qubits = unitary_gates['number_of_qubits'] number_of_gates = unitary_gates['number_of_gates'] unitary_state = np.identity(2**(number_of_qubits)) - for key in sorted(unitary_gates['gates'].keys()): - gate = unitary_gates['gates'][key]['matrix'] - if unitary_gates['gates'][key]['qubits'] == 1: - unitary_state = unitary_qi(gate, unitary_gates['gates'][key] - ['elements'][0], number_of_qubits) * unitary_state - elif unitary_gates['gates'][key]['qubits'] == 2: - unitary_state = unitary_qij(gate, unitary_gates['gates'][key]['elements'][0], - unitary_gates['gates'][key]['elements'][1], number_of_qubits) * unitary_state - print(unitary_state) + for j in range(number_of_gates): + gate = unitary_gates['quantum_circuit'][j]['matrix'] + if unitary_gates['quantum_circuit'][j]['gate_size'] == 1: + unitary_state = np.dot(unitary_qi(gate, unitary_gates['quantum_circuit'][j] + ['indices'][0], number_of_qubits), unitary_state) + elif unitary_gates['quantum_circuit'][j]['gate_size'] == 2: + unitary_state = np.dot(unitary_qij(gate, unitary_gates['quantum_circuit'][j]['indices'][0], + unitary_gates['quantum_circuit'][j]['indices'][1], + number_of_qubits), unitary_state) + return unitary_state diff --git a/qiskit/simulators/example.qasm b/qiskit/simulators/example.qasm deleted file mode 100644 index c3bb27a062..0000000000 --- a/qiskit/simulators/example.qasm +++ /dev/null @@ -1,12 +0,0 @@ -OPENQASM 2.0; -include "qelib1.inc"; -qreg q[1]; -creg c[2]; -h q; -qreg v[1]; -h v; - - -cx q[0],v[0]; -h v; -h q; diff --git a/qiskit/unroll/__init__.py b/qiskit/unroll/__init__.py index 385807de51..cb6efbe6a5 100644 --- a/qiskit/unroll/__init__.py +++ b/qiskit/unroll/__init__.py @@ -4,3 +4,4 @@ from ._oneregisterbackend import OneRegisterBackend from ._printerbackend import PrinterBackend from ._unrollerbackend import UnrollerBackend from ._backendexception import BackendException +from ._simulatorbackend import SimulatorBackend diff --git a/qiskit/unroll/_unitarysimulator.py b/qiskit/unroll/_simulatorbackend.py similarity index 79% rename from qiskit/unroll/_unitarysimulator.py rename to qiskit/unroll/_simulatorbackend.py index 12613a6767..dc3779fbbe 100644 --- a/qiskit/unroll/_unitarysimulator.py +++ b/qiskit/unroll/_simulatorbackend.py @@ -1,36 +1,26 @@ """ Backend for the unroller that composes unitary matrices to simulate circuit. -Author: Andrew Cross and Jay Gambetta """ import numpy as np from qiskit.unroll import BackendException from qiskit.unroll import UnrollerBackend -# Jay, attach the backend to the unroller and run it: -# Take a look at ~/test/testsim.py -# I could not test it because QuantumProgram is hosed. -# You probably want "getters" to give back the final unitary matrix -# or print it in some nice way (not implemented): -# -# print(unroller.backend.get_unitary_matrix()) +class SimulatorBackend(UnrollerBackend): + """Backend for the unroller that composes unitary matrices.""" - -class UnitarySimulator(UnrollerBackend): - """ Backend for the unroller that composes unitary matrices. - - """ def __init__(self, basis=None): """Setup this backend. basis is a list of operation name strings. """ self.unitary_gates = {} - self.unitary_gates['gates'] = {} - self.unitaries = {} + self.unitary_gates['quantum_circuit'] = [] self.number_of_qubits = 0 + self.number_of_cbits = 0 self.qubit_order = {} + self.cbit_order = {} self.gate_order = 0 self.prec = 15 self.creg = None @@ -49,10 +39,6 @@ class UnitarySimulator(UnrollerBackend): """Set trace to True to enable.""" self.trace = trace - def get_unitary_gates(self): - """reteurns the dictionary of unitary gates.""" - return self.unitary_gates - def set_basis(self, basis): """Declare the set of user-defined gates to emit. @@ -88,6 +74,7 @@ class UnitarySimulator(UnrollerBackend): self.number_of_qubits += size # print(self.qubit_order) self.unitary_gates['number_of_qubits'] = self.number_of_qubits + self.unitary_gates['qubit_order'] = self.qubit_order if self.trace: print("added %d qubits from qreg %s giving a total of %d qubits" % (size, name, self.number_of_qubits)) @@ -98,7 +85,16 @@ class UnitarySimulator(UnrollerBackend): name = name of the register sz = size of the register """ - pass + assert size >= 0, "invalid creg size" + + for j in range(size): + self.cbit_order[(name, j)] = self.number_of_cbits + j + self.number_of_cbits += size + self.unitary_gates['number_of_cbits'] = self.number_of_cbits + self.unitary_gates['cbit_order'] = self.cbit_order + if self.trace: + print("added %d cbits from creg %s giving a total of %d qubits" % + (size, name, self.number_of_cbits)) def define_gate(self, name, gatedata): """Define a new quantum gate. @@ -128,18 +124,23 @@ class UnitarySimulator(UnrollerBackend): qubit[1])) if self.creg is not None: raise BackendException("UnitarySimulator does not support if") - element = self.qubit_order.get(qubit) - self.gate_order +=1 - gate = np.array([[np.cos(arg[0]/2.0), -np.exp(1j*arg[2])*np.sin(arg[0]/2.0)], [np.exp(1j*arg[1])*np.sin(arg[0]/2.0), np.exp(1j*arg[1])*np.exp(1j*arg[2])*np.cos(arg[0]/2.0)]]) + indices = [self.qubit_order.get(qubit)] + self.gate_order += 1 + # print(np.exp(1j*arg[2])*np.sin(arg[0]/2.0)) + gate = np.array([[np.cos(arg[0]/2.0), + -np.exp(1j*arg[2])*np.sin(arg[0]/2.0)], + [np.exp(1j*arg[1])*np.sin(arg[0]/2.0), + np.exp(1j*arg[1]+1j*arg[2])*np.cos(arg[0]/2.0)]]) self.unitary_gates['number_of_gates'] = self.gate_order - self.unitary_gates['gates'][self.gate_order] = { - 'qubits': 1, + self.unitary_gates['quantum_circuit'].append({ + # 'order': self.gate_order, + 'gate_size': 1, 'matrix': gate, - 'name' : "U(%s,%s,%s)" % (self._fs(arg[0]), - self._fs(arg[1]), - self._fs(arg[2])), - 'elements': [element] - } + 'name': "U(%s,%s,%s)" % (self._fs(arg[0]), + self._fs(arg[1]), + self._fs(arg[2])), + 'indices': indices + }) # print(self.unitary_gates) @@ -149,7 +150,6 @@ class UnitarySimulator(UnrollerBackend): qubit0 is (regname,idx) tuple for the control qubit. qubit1 is (regname,idx) tuple for the target qubit. """ - if self.listen: if "CX" not in self.basis: self.basis.append("CX") @@ -160,18 +160,19 @@ class UnitarySimulator(UnrollerBackend): qubit1[0], qubit1[1])) if self.creg is not None: raise BackendException("UnitarySimulator does not support if") - element = [self.qubit_order.get(qubit0), + indices = [self.qubit_order.get(qubit0), self.qubit_order.get(qubit1)] - self.gate_order +=1 + self.gate_order += 1 cx = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]]) self.unitary_gates['number_of_gates'] = self.gate_order - self.unitary_gates['gates'][self.gate_order] = { - 'qubits': 2, + self.unitary_gates['quantum_circuit'].append({ + # 'order': self.gate_order, + 'gate_size': 2, 'matrix': cx, 'name': 'CX', - 'elements': element, - } + 'indices': indices, + }) def measure(self, qubit, bit): """Measurement operation. diff --git a/qiskit/simulators/testsim.py b/test/testsim.py similarity index 67% rename from qiskit/simulators/testsim.py rename to test/testsim.py index edc1d3e606..0536902a0f 100644 --- a/qiskit/simulators/testsim.py +++ b/test/testsim.py @@ -1,13 +1,13 @@ """Quick test program for unitary simulator backend.""" import qiskit.unroll as unroll from qiskit.qasm import Qasm -from qiskit.simulators import UnitarySimulator -from unitary import unitary_simulator +from qiskit.unroll import SimulatorBackend +from qiskit.simulators._unitarysimulator import unitary_simulator basis = [] # empty basis, defaults to U, CX unroller = unroll.Unroller(Qasm(filename="example.qasm").parse(), - UnitarySimulator(basis)) + SimulatorBackend(basis)) unroller.backend.set_trace(False) # print calls as they happen unroller.execute() # Here is where simulation happens unitary_gates = unroller.backend.unitary_gates -unitary_simulator(unitary_gates) # print(unitary_gates) +print(unitary_simulator(unitary_gates)) From d2d93177dc3a6bc41dfc8526d9ef9952d86db455 Mon Sep 17 00:00:00 2001 From: "Jay M. Gambetta" Date: Sun, 14 May 2017 00:47:42 -0400 Subject: [PATCH 02/16] unitary and qasm simulator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I have added a unitary and a qasm simulator. The qasm simulator is dumb (i can make it faster) but it should work. At the top i have defined an input form for both (from the simulator unroller) and make a quick example in test to run it. I need to add a few more things (reset and if) but i will do them later. The backend should give you an error saying simulator does not support it. Question for ismael — how do we run it locally from quantum program --- qiskit/simulators/_qasmsimulator.py | 161 +++++++++++++++++++++++++ qiskit/simulators/_unitarysimulator.py | 156 ++++++++++++++---------- qiskit/unroll/_simulatorbackend.py | 82 ++++++++----- test/example.qasm | 15 +++ test/testsim.py | 26 +++- 5 files changed, 347 insertions(+), 93 deletions(-) create mode 100755 qiskit/simulators/_qasmsimulator.py create mode 100644 test/example.qasm diff --git a/qiskit/simulators/_qasmsimulator.py b/qiskit/simulators/_qasmsimulator.py new file mode 100755 index 0000000000..af808c8332 --- /dev/null +++ b/qiskit/simulators/_qasmsimulator.py @@ -0,0 +1,161 @@ +""" +Contains a (slow) python simulator that makes the qasm of the circuit. + +We advise using the c++ simulator or online for larger size systems + + +{'number_of_qubits': 2, +'number_of_cbits': 2, +'number_of_operations': 2 +'qubit_order': {('q', 0): 0, ('v', 0): 1} +'cbit_order': {('c', 1): 1, ('c', 0): 0}, +'qasm': [{ + 'type': 'gate', + 'name': 'U(1.570796326794897,0.000000000000000,3.141592653589793)', + 'qubit_indices': [0], + 'gate_size': 1, + 'matrix': array([[ 0.70710678 +0.00000000e+00j, + 0.70710678 -8.65956056e-17j], + [ 0.70710678 +0.00000000e+00j, + -0.70710678 +8.65956056e-17j]]) + }, + { + 'type': 'measure', + 'cbit_indices': [0], + 'qubit_indices': [0] + }], +'result': { + 'quantum_state': array([ 1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j]), + 'classical_state': 0 + } +} +""" +import numpy as np +import random + + +class QasmSimulator(object): + """ + Python implementation of a unitary computer simulator. + """ + + def __init__(self, circuit, random_seed): + self.circuit = circuit + self._number_of_qubits = self.circuit['number_of_qubits'] + self._number_of_cbits = self.circuit['number_of_cbits'] + self.circuit['result'] = {} + self._quantum_state = np.zeros(2**(self._number_of_qubits), + dtype=complex) + self._quantum_state[0] = 1 + self._classical_state = 0 + random.seed(random_seed) + self._number_of_operations = self.circuit['number_of_operations'] + + def _add_qasm_single(self, gate, qubit): + """Apply the single qubit gate. + + gate is the single qubit gate + qubit is the qubit to apply it on counts from 0 and order + is q_{n-1} ... otimes q_1 otimes q_0 + number_of_qubits is the number of qubits in the system + returns a complex numpy array + """ + temp_1 = np.identity(2**(self._number_of_qubits-qubit-1), + dtype=complex) + temp_2 = np.identity(2**(qubit), dtype=complex) + unitaty_add = np.kron(temp_1, np.kron(gate, temp_2)) + self._quantum_state = np.dot(unitaty_add, self._quantum_state) + + def _add_qasm_two(self, gate, qubit_1, qubit_2): + """Apply the two-qubit gate. + + gate is the two-qubit gate + qubit_1 is the first qubit (control) counts from 0 + qubit_2 is the second qubit (target) + number_of_qubits is the number of qubits in the system + returns a complex numpy array + """ + temp_1 = np.kron(np.identity(2**(self._number_of_qubits-2), + dtype=complex), gate) + unitaty_add = np.identity(2**(self._number_of_qubits), dtype=complex) + # print('here !!!!!!!!!!!!!!!') + for ii in range(2**self._number_of_qubits): + iistring = bin(ii)[2:] + bits = list(reversed(iistring.zfill(self._number_of_qubits))) + swap_1 = bits[0] + swap_2 = bits[1] + bits[0] = bits[qubit_1] + bits[1] = bits[qubit_2] + bits[qubit_1] = swap_1 + bits[qubit_2] = swap_2 + iistring = ''.join(reversed(bits)) + iip = int(iistring, 2) + for jj in range(2**self._number_of_qubits): + jjstring = bin(jj)[2:] + bits = list(reversed(jjstring.zfill(self._number_of_qubits))) + swap_1 = bits[0] + swap_2 = bits[1] + bits[0] = bits[qubit_1] + bits[1] = bits[qubit_2] + bits[qubit_1] = swap_1 + bits[qubit_2] = swap_2 + jjstring = ''.join(reversed(bits)) + jjp = int(jjstring, 2) + unitaty_add[iip, jjp] = temp_1[ii, jj] + self._quantum_state = np.dot(unitaty_add, self._quantum_state) + # print(self._quantum_state) + + def _add_qasm_measure(self, qubit, cbit): + """Apply the measurement qubit gate.""" + # print(cbit) + probability_zero = 0 + random_number = random.random() + # print(self._quantum_state) + for ii in range(2**self._number_of_qubits): + iistring = bin(ii)[2:] + bits = list(reversed(iistring.zfill(self._number_of_qubits))) + if bits[qubit] == '0': + # print(ii) + probability_zero += np.abs(self._quantum_state[ii])**2 + # if bits[qubit] == 1 : + # probability_one + = np.abs(self._quantum_state[ii])**2 + # print(probability_zero) + if random_number <= probability_zero: + outcome = '0' + norm = np.sqrt(probability_zero) + else: + outcome = '1' + norm = np.sqrt(1-probability_zero) + for ii in range(2**self._number_of_qubits): + # update quantum state + iistring = bin(ii)[2:] + bits = list(reversed(iistring.zfill(self._number_of_qubits))) + if bits[qubit] == outcome: + self._quantum_state[ii] = self._quantum_state[ii]/norm + else: + self._quantum_state[ii] = 0 + # update classical state + temp = bin(self._classical_state)[2:] + cbits_string = list(reversed(temp.zfill(self._number_of_cbits))) + cbits_string[cbit] = outcome + self._classical_state = int(''.join(reversed(cbits_string)), 2) + + def run(self): + """Run.""" + for j in range(self._number_of_operations): + if self.circuit['qasm'][j]['type'] == 'gate': + gate = self.circuit['qasm'][j]['matrix'] + if self.circuit['qasm'][j]['gate_size'] == 1: + qubit = self.circuit['qasm'][j]['qubit_indices'][0] + self._add_qasm_single(gate, qubit) + elif self.circuit['qasm'][j]['gate_size'] == 2: + qubit0 = self.circuit['qasm'][j]['qubit_indices'][0] + qubit1 = self.circuit['qasm'][j]['qubit_indices'][1] + self._add_qasm_two(gate, qubit0, qubit1) + elif self.circuit['qasm'][j]['type'] == 'measure': + qubit = self.circuit['qasm'][j]['qubit_indices'][0] + cbit = self.circuit['qasm'][j]['cbit_indices'][0] + self._add_qasm_measure(qubit, cbit) + self.circuit['result']['quantum_state'] = self._quantum_state + self.circuit['result']['classical_state'] = self._classical_state + return self.circuit diff --git a/qiskit/simulators/_unitarysimulator.py b/qiskit/simulators/_unitarysimulator.py index c80dceb785..8e95b05676 100755 --- a/qiskit/simulators/_unitarysimulator.py +++ b/qiskit/simulators/_unitarysimulator.py @@ -4,81 +4,113 @@ Contains a (slow) python simulator that makes the unitary of the circuit. These are simple methods for making common matrices used in quantum computing. + circuit = + { + 'number_of_qubits': 2, + 'number_of_operations': 2 + 'qubit_order': {('q', 0): 0, ('v', 0): 1} + 'qasm': [{ + 'type': 'gate', + 'name': 'U(1.570796326794897,0.000000000000000,3.141592653589793)', + 'qubit_indices': [0], + 'gate_size': 1, + 'matrix': array([[ 0.70710678 +0.00000000e+00j, + 0.70710678 -8.65956056e-17j], + [ 0.70710678 +0.00000000e+00j, + -0.70710678 +8.65956056e-17j]]) + }] + 'result': { + unitary: array([[ 0.70710678 +0.00000000e+00j, + 0.70710678 -8.65956056e-17j], + [ 0.70710678 +0.00000000e+00j, + -0.70710678 +8.65956056e-17j]]) + } + } """ import numpy as np + class UnitarySimulator(object): - """ - Python implementation of a unitary computer simulator. - """ + """UnitarySimulator class.""" - def __init__(self): - self._unitary_state = np.ones(1, dtype=complex) - self.number_of_qubits = 0 + def __init__(self, circuit): + self.circuit = circuit + self._number_of_qubits = self.circuit['number_of_qubits'] + self.circuit['result'] = {} + self._unitary_state = np.identity(2**(self._number_of_qubits), + dtype=complex) + self._number_of_operations = self.circuit['number_of_operations'] + # print(self._unitary_state) + def _add_unitary_single(self, gate, qubit): + """Apply the single qubit gate. -def unitary_qi(gate, qubit, number_of_qubits): - """Apply the single qubit gate. + gate is the single qubit gate + qubit is the qubit to apply it on counts from 0 and order + is q_{n-1} ... otimes q_1 otimes q_0 + number_of_qubits is the number of qubits in the system + returns a complex numpy array + """ + temp_1 = np.identity(2**(self._number_of_qubits-qubit-1), + dtype=complex) + temp_2 = np.identity(2**(qubit), dtype=complex) + unitaty_add = np.kron(temp_1, np.kron(gate, temp_2)) + self._unitary_state = np.dot(unitaty_add, self._unitary_state) - gate is the single qubit gate - qubit is the qubit to apply it on counts from 0 and order - is q_{n-1} ... otimes q_1 otimes q_0 - number_of_qubits is the number of qubits in the system - returns a complex numpy array - """ - return np.kron(np.identity(2**(number_of_qubits-qubit-1), dtype=complex), - np.kron(gate, np.identity(2**(qubit), dtype=complex))) + def _add_unitary_two(self, gate, qubit_1, qubit_2): + """Apply the two-qubit gate. - -def unitary_qij(gate, qubit_1, qubit_2, number_of_qubits): - """Apply the two-qubit gate. - - gate is the two-qubit gate - qubit_1 is the first qubit (control) counts from 0 - qubit_2 is the second qubit (target) - number_of_qubits is the number of qubits in the system - returns a complex numpy array - """ - temp_1 = np.kron(np.identity(2**(number_of_qubits-2), dtype=complex), gate) - temp_2 = np.identity(2**(number_of_qubits), dtype=complex) - for ii in range(2**number_of_qubits): - iistring = bin(ii)[2:] - bits = list(iistring.zfill(number_of_qubits)) - swap_1 = bits[0] - swap_2 = bits[1] - bits[0] = bits[qubit_1] - bits[1] = bits[qubit_2] - bits[qubit_1] = swap_1 - bits[qubit_2] = swap_2 - iistring = ''.join(bits) - iip = int(iistring, 2) - for jj in range(2**number_of_qubits): - jjstring = bin(jj)[2:] - bits = list(jjstring.zfill(number_of_qubits)) + gate is the two-qubit gate + qubit_1 is the first qubit (control) counts from 0 + qubit_2 is the second qubit (target) + number_of_qubits is the number of qubits in the system + returns a complex numpy array + """ + temp_1 = np.kron(np.identity(2**(self._number_of_qubits-2), + dtype=complex), gate) + unitaty_add = np.identity(2**(self._number_of_qubits), dtype=complex) + for ii in range(2**self._number_of_qubits): + iistring = bin(ii)[2:] + bits = list(reversed(iistring.zfill(self._number_of_qubits))) + # this is reverse order for assignement as list jut put it out + # 0001 is 4 qubit int 1 and this becomes [0,0,0,1] + # print(bits) swap_1 = bits[0] swap_2 = bits[1] bits[0] = bits[qubit_1] bits[1] = bits[qubit_2] bits[qubit_1] = swap_1 bits[qubit_2] = swap_2 - jjstring = ''.join(bits) - jjp = int(jjstring, 2) - temp_2[iip, jjp] = temp_1[ii, jj] - return temp_2 + iistring = ''.join(reversed(bits)) + iip = int(iistring, 2) + # print(iip) + for jj in range(2**self._number_of_qubits): + jjstring = bin(jj)[2:] + bits = list(reversed(jjstring.zfill(self._number_of_qubits))) + swap_1 = bits[0] + swap_2 = bits[1] + bits[0] = bits[qubit_1] + bits[1] = bits[qubit_2] + bits[qubit_1] = swap_1 + bits[qubit_2] = swap_2 + jjstring = ''.join(reversed(bits)) + jjp = int(jjstring, 2) + unitaty_add[iip, jjp] = temp_1[ii, jj] + self._unitary_state = np.dot(unitaty_add, self._unitary_state) - -def unitary_simulator(unitary_gates): - """Calculate the unitary for the gates.""" - number_of_qubits = unitary_gates['number_of_qubits'] - number_of_gates = unitary_gates['number_of_gates'] - unitary_state = np.identity(2**(number_of_qubits)) - for j in range(number_of_gates): - gate = unitary_gates['quantum_circuit'][j]['matrix'] - if unitary_gates['quantum_circuit'][j]['gate_size'] == 1: - unitary_state = np.dot(unitary_qi(gate, unitary_gates['quantum_circuit'][j] - ['indices'][0], number_of_qubits), unitary_state) - elif unitary_gates['quantum_circuit'][j]['gate_size'] == 2: - unitary_state = np.dot(unitary_qij(gate, unitary_gates['quantum_circuit'][j]['indices'][0], - unitary_gates['quantum_circuit'][j]['indices'][1], - number_of_qubits), unitary_state) - return unitary_state + def run(self): + """Apply the single qubit gate.""" + for j in range(self._number_of_operations): + if self.circuit['qasm'][j]['type'] == 'gate': + gate = self.circuit['qasm'][j]['matrix'] + if self.circuit['qasm'][j]['gate_size'] == 1: + qubit = self.circuit['qasm'][j]['qubit_indices'][0] + self._add_unitary_single(gate, qubit) + elif self.circuit['qasm'][j]['gate_size'] == 2: + qubit0 = self.circuit['qasm'][j]['qubit_indices'][0] + qubit1 = self.circuit['qasm'][j]['qubit_indices'][1] + self._add_unitary_two(gate, qubit0, qubit1) + elif self.circuit['qasm'][j]['type'] == 'measure': + print('Dropping measure from unitary simulator') + self.circuit['result']['unitary'] = self._unitary_state + return self.circuit diff --git a/qiskit/unroll/_simulatorbackend.py b/qiskit/unroll/_simulatorbackend.py index dc3779fbbe..972dd766a2 100644 --- a/qiskit/unroll/_simulatorbackend.py +++ b/qiskit/unroll/_simulatorbackend.py @@ -1,6 +1,26 @@ -""" -Backend for the unroller that composes unitary matrices to simulate circuit. +"""Backend for the unroller that composes unitary matrices to simulate circuit. + {'number_of_qubits': 2, + 'number_of_cbits': 2, + 'number_of_operations': 2 + 'qubit_order': {('q', 0): 0, ('v', 0): 1} + 'cbit_order': {('c', 1): 1, ('c', 0): 0}, + 'qasm': [{ + 'type': 'gate', + 'name': 'U(1.570796326794897,0.000000000000000,3.141592653589793)', + 'qubit_indices': [0], + 'gate_size': 1, + 'matrix': array([[ 0.70710678 +0.00000000e+00j, + 0.70710678 -8.65956056e-17j], + [ 0.70710678 +0.00000000e+00j, + -0.70710678 +8.65956056e-17j]]) + }, + { + 'type': 'measure', + 'cbit_indices': [0], + 'qubit_indices': [0] + }], + } """ import numpy as np from qiskit.unroll import BackendException @@ -15,13 +35,13 @@ class SimulatorBackend(UnrollerBackend): basis is a list of operation name strings. """ - self.unitary_gates = {} - self.unitary_gates['quantum_circuit'] = [] + self.circuit = {} + self.circuit['qasm'] = [] self.number_of_qubits = 0 self.number_of_cbits = 0 self.qubit_order = {} self.cbit_order = {} - self.gate_order = 0 + self.operation_order = 0 self.prec = 15 self.creg = None self.cval = None @@ -73,8 +93,8 @@ class SimulatorBackend(UnrollerBackend): self.qubit_order[(name, j)] = self.number_of_qubits + j self.number_of_qubits += size # print(self.qubit_order) - self.unitary_gates['number_of_qubits'] = self.number_of_qubits - self.unitary_gates['qubit_order'] = self.qubit_order + self.circuit['number_of_qubits'] = self.number_of_qubits + self.circuit['qubit_order'] = self.qubit_order if self.trace: print("added %d qubits from qreg %s giving a total of %d qubits" % (size, name, self.number_of_qubits)) @@ -90,8 +110,8 @@ class SimulatorBackend(UnrollerBackend): for j in range(size): self.cbit_order[(name, j)] = self.number_of_cbits + j self.number_of_cbits += size - self.unitary_gates['number_of_cbits'] = self.number_of_cbits - self.unitary_gates['cbit_order'] = self.cbit_order + self.circuit['number_of_cbits'] = self.number_of_cbits + self.circuit['cbit_order'] = self.cbit_order if self.trace: print("added %d cbits from creg %s giving a total of %d qubits" % (size, name, self.number_of_cbits)) @@ -124,22 +144,22 @@ class SimulatorBackend(UnrollerBackend): qubit[1])) if self.creg is not None: raise BackendException("UnitarySimulator does not support if") - indices = [self.qubit_order.get(qubit)] - self.gate_order += 1 + qubit_indices = [self.qubit_order.get(qubit)] + self.operation_order += 1 # print(np.exp(1j*arg[2])*np.sin(arg[0]/2.0)) gate = np.array([[np.cos(arg[0]/2.0), -np.exp(1j*arg[2])*np.sin(arg[0]/2.0)], [np.exp(1j*arg[1])*np.sin(arg[0]/2.0), np.exp(1j*arg[1]+1j*arg[2])*np.cos(arg[0]/2.0)]]) - self.unitary_gates['number_of_gates'] = self.gate_order - self.unitary_gates['quantum_circuit'].append({ - # 'order': self.gate_order, + self.circuit['number_of_operations'] = self.operation_order + self.circuit['qasm'].append({ + 'type': 'gate', 'gate_size': 1, 'matrix': gate, 'name': "U(%s,%s,%s)" % (self._fs(arg[0]), self._fs(arg[1]), self._fs(arg[2])), - 'indices': indices + 'qubit_indices': qubit_indices }) # print(self.unitary_gates) @@ -160,27 +180,35 @@ class SimulatorBackend(UnrollerBackend): qubit1[0], qubit1[1])) if self.creg is not None: raise BackendException("UnitarySimulator does not support if") - indices = [self.qubit_order.get(qubit0), - self.qubit_order.get(qubit1)] - self.gate_order += 1 - cx = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], - [0, 0, 1, 0]]) - self.unitary_gates['number_of_gates'] = self.gate_order - self.unitary_gates['quantum_circuit'].append({ - # 'order': self.gate_order, + qubit_indices = [self.qubit_order.get(qubit0), + self.qubit_order.get(qubit1)] + self.operation_order += 1 + cx = np.array([[1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], + [0, 1, 0, 0]]) + self.circuit['number_of_operations'] = self.operation_order + self.circuit['qasm'].append({ + 'type': 'gate', 'gate_size': 2, 'matrix': cx, 'name': 'CX', - 'indices': indices, + 'qubit_indices': qubit_indices, }) - def measure(self, qubit, bit): + def measure(self, qubit, cbit): """Measurement operation. qubit is (regname, idx) tuple for the input qubit. bit is (regname, idx) tuple for the output bit. """ - raise BackendException("UnitarySimulator does not support measurement") + self.operation_order += 1 + self.circuit['number_of_operations'] = self.operation_order + qubit_indices = [self.qubit_order.get(qubit)] + cbit_indices = [self.cbit_order.get(cbit)] + self.circuit['qasm'].append({ + 'type': 'measure', + 'qubit_indices': qubit_indices, + 'cbit_indices': cbit_indices + }) def barrier(self, qubitlists): """Barrier instruction. @@ -194,7 +222,7 @@ class SimulatorBackend(UnrollerBackend): qubit is a (regname, idx) tuple. """ - raise BackendException("UnitarySimulator does not support reset") + raise BackendException("Simulator does not support reset") def set_condition(self, creg, cval): """Attach a current condition. diff --git a/test/example.qasm b/test/example.qasm new file mode 100644 index 0000000000..8f47d9a45b --- /dev/null +++ b/test/example.qasm @@ -0,0 +1,15 @@ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q[1]; +creg c[2]; +h q; +qreg v[1]; + + + +cx q[0],v[0]; +// h v; + //h q; + +measure q[0] -> c[0]; +measure v[0] -> c[1]; diff --git a/test/testsim.py b/test/testsim.py index 0536902a0f..95a1da60e8 100644 --- a/test/testsim.py +++ b/test/testsim.py @@ -2,12 +2,30 @@ import qiskit.unroll as unroll from qiskit.qasm import Qasm from qiskit.unroll import SimulatorBackend -from qiskit.simulators._unitarysimulator import unitary_simulator +from qiskit.simulators._unitarysimulator import UnitarySimulator +from qiskit.simulators._qasmsimulator import QasmSimulator +import random +from collections import Counter + basis = [] # empty basis, defaults to U, CX unroller = unroll.Unroller(Qasm(filename="example.qasm").parse(), SimulatorBackend(basis)) unroller.backend.set_trace(False) # print calls as they happen unroller.execute() # Here is where simulation happens -unitary_gates = unroller.backend.unitary_gates -# print(unitary_gates) -print(unitary_simulator(unitary_gates)) + + +print('using the unirary simulator') +a = UnitarySimulator(unroller.backend.circuit).run() +print('\n\n Unitary = ') +print(a['result']['unitary']) + +print('\n\nusing the qasm simulator') +shots = 1024 +outcomes = [] +for i in range(shots): + # running the quantum_circuit + b = QasmSimulator(unroller.backend.circuit, random.random()).run() + outcomes.append(bin(b['result']['classical_state'])[2:].zfill(b['number_of_cbits'])) + +print('\n\n outcomes = ') +print(dict(Counter(outcomes))) From c99ce608d5ed95f0506bea8e76bbe487412be609 Mon Sep 17 00:00:00 2001 From: "Jay M. Gambetta" Date: Sun, 14 May 2017 02:58:15 -0400 Subject: [PATCH 03/16] adding reset to qasm simulator its ugly but should work. will add faster core later --- qiskit/simulators/_qasmsimulator.py | 57 ++++++++++++++++++++++----- qiskit/unroll/_simulatorbackend.py | 60 ++++++++++++++++------------- test/example.qasm | 12 ++++-- test/testsim.py | 2 + 4 files changed, 90 insertions(+), 41 deletions(-) diff --git a/qiskit/simulators/_qasmsimulator.py b/qiskit/simulators/_qasmsimulator.py index af808c8332..9780024a78 100755 --- a/qiskit/simulators/_qasmsimulator.py +++ b/qiskit/simulators/_qasmsimulator.py @@ -107,18 +107,14 @@ class QasmSimulator(object): def _add_qasm_measure(self, qubit, cbit): """Apply the measurement qubit gate.""" - # print(cbit) + # print(qubit) probability_zero = 0 random_number = random.random() - # print(self._quantum_state) for ii in range(2**self._number_of_qubits): iistring = bin(ii)[2:] bits = list(reversed(iistring.zfill(self._number_of_qubits))) if bits[qubit] == '0': - # print(ii) probability_zero += np.abs(self._quantum_state[ii])**2 - # if bits[qubit] == 1 : - # probability_one + = np.abs(self._quantum_state[ii])**2 # print(probability_zero) if random_number <= probability_zero: outcome = '0' @@ -126,6 +122,7 @@ class QasmSimulator(object): else: outcome = '1' norm = np.sqrt(1-probability_zero) + # print(outcome) for ii in range(2**self._number_of_qubits): # update quantum state iistring = bin(ii)[2:] @@ -134,11 +131,48 @@ class QasmSimulator(object): self._quantum_state[ii] = self._quantum_state[ii]/norm else: self._quantum_state[ii] = 0 - # update classical state - temp = bin(self._classical_state)[2:] - cbits_string = list(reversed(temp.zfill(self._number_of_cbits))) - cbits_string[cbit] = outcome - self._classical_state = int(''.join(reversed(cbits_string)), 2) + # update classical state + temp = bin(self._classical_state)[2:] + cbits_string = list(reversed(temp.zfill(self._number_of_cbits))) + cbits_string[cbit] = outcome + self._classical_state = int(''.join(reversed(cbits_string)), 2) + + def _add_qasm_reset(self, qubit): + """Apply the reset to the qubit. + + I to this by applying a measurment and ignoring the outcome""" + """Apply the measurement qubit gate.""" + # print(qubit) + probability_zero = 0 + random_number = random.random() + for ii in range(2**self._number_of_qubits): + iistring = bin(ii)[2:] + bits = list(reversed(iistring.zfill(self._number_of_qubits))) + if bits[qubit] == '0': + probability_zero += np.abs(self._quantum_state[ii])**2 + # print(probability_zero) + if random_number <= probability_zero: + outcome = '0' + norm = np.sqrt(probability_zero) + else: + outcome = '1' + norm = np.sqrt(1-probability_zero) + # print(outcome) + temp = self._quantum_state + for ii in range(2**self._number_of_qubits): + # update quantum state + iistring = bin(ii)[2:] + bits = list(reversed(iistring.zfill(self._number_of_qubits))) + if outcome == '0': + iip = ii + else: + bits[qubit] == '0' + iip = int(''.join(reversed(bits)), 2) + if bits[qubit] == '0': + self._quantum_state[iip] = temp[ii]/norm + else: + self._quantum_state[iip] = 0 + # print(self._quantum_state) def run(self): """Run.""" @@ -156,6 +190,9 @@ class QasmSimulator(object): qubit = self.circuit['qasm'][j]['qubit_indices'][0] cbit = self.circuit['qasm'][j]['cbit_indices'][0] self._add_qasm_measure(qubit, cbit) + elif self.circuit['qasm'][j]['type'] == 'reset': + qubit = self.circuit['qasm'][j]['qubit_indices'][0] + self._add_qasm_reset(qubit) self.circuit['result']['quantum_state'] = self._quantum_state self.circuit['result']['classical_state'] = self._classical_state return self.circuit diff --git a/qiskit/unroll/_simulatorbackend.py b/qiskit/unroll/_simulatorbackend.py index 972dd766a2..f6cbe32e7d 100644 --- a/qiskit/unroll/_simulatorbackend.py +++ b/qiskit/unroll/_simulatorbackend.py @@ -37,11 +37,11 @@ class SimulatorBackend(UnrollerBackend): """ self.circuit = {} self.circuit['qasm'] = [] - self.number_of_qubits = 0 - self.number_of_cbits = 0 - self.qubit_order = {} - self.cbit_order = {} - self.operation_order = 0 + self._number_of_qubits = 0 + self._number_of_cbits = 0 + self._qubit_order = {} + self._cbit_order = {} + self._operation_order = 0 self.prec = 15 self.creg = None self.cval = None @@ -90,14 +90,14 @@ class SimulatorBackend(UnrollerBackend): assert size >= 0, "invalid qreg size" for j in range(size): - self.qubit_order[(name, j)] = self.number_of_qubits + j - self.number_of_qubits += size + self._qubit_order[(name, j)] = self._number_of_qubits + j + self._number_of_qubits += size # print(self.qubit_order) - self.circuit['number_of_qubits'] = self.number_of_qubits - self.circuit['qubit_order'] = self.qubit_order + self.circuit['number_of_qubits'] = self._number_of_qubits + self.circuit['qubit_order'] = self._qubit_order if self.trace: print("added %d qubits from qreg %s giving a total of %d qubits" % - (size, name, self.number_of_qubits)) + (size, name, self._number_of_qubits)) def new_creg(self, name, size): """Create a new classical register. @@ -108,13 +108,13 @@ class SimulatorBackend(UnrollerBackend): assert size >= 0, "invalid creg size" for j in range(size): - self.cbit_order[(name, j)] = self.number_of_cbits + j - self.number_of_cbits += size - self.circuit['number_of_cbits'] = self.number_of_cbits - self.circuit['cbit_order'] = self.cbit_order + self._cbit_order[(name, j)] = self._number_of_cbits + j + self._number_of_cbits += size + self.circuit['number_of_cbits'] = self._number_of_cbits + self.circuit['cbit_order'] = self._cbit_order if self.trace: print("added %d cbits from creg %s giving a total of %d qubits" % - (size, name, self.number_of_cbits)) + (size, name, self._number_of_cbits)) def define_gate(self, name, gatedata): """Define a new quantum gate. @@ -144,14 +144,14 @@ class SimulatorBackend(UnrollerBackend): qubit[1])) if self.creg is not None: raise BackendException("UnitarySimulator does not support if") - qubit_indices = [self.qubit_order.get(qubit)] - self.operation_order += 1 + qubit_indices = [self._qubit_order.get(qubit)] + self._operation_order += 1 # print(np.exp(1j*arg[2])*np.sin(arg[0]/2.0)) gate = np.array([[np.cos(arg[0]/2.0), -np.exp(1j*arg[2])*np.sin(arg[0]/2.0)], [np.exp(1j*arg[1])*np.sin(arg[0]/2.0), np.exp(1j*arg[1]+1j*arg[2])*np.cos(arg[0]/2.0)]]) - self.circuit['number_of_operations'] = self.operation_order + self.circuit['number_of_operations'] = self._operation_order self.circuit['qasm'].append({ 'type': 'gate', 'gate_size': 1, @@ -180,12 +180,12 @@ class SimulatorBackend(UnrollerBackend): qubit1[0], qubit1[1])) if self.creg is not None: raise BackendException("UnitarySimulator does not support if") - qubit_indices = [self.qubit_order.get(qubit0), - self.qubit_order.get(qubit1)] - self.operation_order += 1 + qubit_indices = [self._qubit_order.get(qubit0), + self._qubit_order.get(qubit1)] + self._operation_order += 1 cx = np.array([[1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0]]) - self.circuit['number_of_operations'] = self.operation_order + self.circuit['number_of_operations'] = self._operation_order self.circuit['qasm'].append({ 'type': 'gate', 'gate_size': 2, @@ -200,10 +200,10 @@ class SimulatorBackend(UnrollerBackend): qubit is (regname, idx) tuple for the input qubit. bit is (regname, idx) tuple for the output bit. """ - self.operation_order += 1 - self.circuit['number_of_operations'] = self.operation_order - qubit_indices = [self.qubit_order.get(qubit)] - cbit_indices = [self.cbit_order.get(cbit)] + self._operation_order += 1 + self.circuit['number_of_operations'] = self._operation_order + qubit_indices = [self._qubit_order.get(qubit)] + cbit_indices = [self._cbit_order.get(cbit)] self.circuit['qasm'].append({ 'type': 'measure', 'qubit_indices': qubit_indices, @@ -222,7 +222,13 @@ class SimulatorBackend(UnrollerBackend): qubit is a (regname, idx) tuple. """ - raise BackendException("Simulator does not support reset") + self._operation_order += 1 + self.circuit['number_of_operations'] = self._operation_order + qubit_indices = [self._qubit_order.get(qubit)] + self.circuit['qasm'].append({ + 'type': 'reset', + 'qubit_indices': qubit_indices, + }) def set_condition(self, creg, cval): """Attach a current condition. diff --git a/test/example.qasm b/test/example.qasm index 8f47d9a45b..aa1f9da659 100644 --- a/test/example.qasm +++ b/test/example.qasm @@ -1,15 +1,19 @@ OPENQASM 2.0; include "qelib1.inc"; qreg q[1]; -creg c[2]; -h q; -qreg v[1]; - +creg c[3]; + h q[0]; +qreg v[2]; +h v[1]; cx q[0],v[0]; +//cx q[0],v[1]; // h v; //h q; +reset v[1]; + measure q[0] -> c[0]; measure v[0] -> c[1]; +measure v[1] -> c[2]; diff --git a/test/testsim.py b/test/testsim.py index 95a1da60e8..6fb150c55f 100644 --- a/test/testsim.py +++ b/test/testsim.py @@ -25,6 +25,8 @@ outcomes = [] for i in range(shots): # running the quantum_circuit b = QasmSimulator(unroller.backend.circuit, random.random()).run() + #print(b['result']['quantum_state']) + #print(b['result']['classical_state']) outcomes.append(bin(b['result']['classical_state'])[2:].zfill(b['number_of_cbits'])) print('\n\n outcomes = ') From ca20119dee4b46ad95c355007c333dc87eb5fd6e Mon Sep 17 00:00:00 2001 From: ismael faro Date: Sun, 14 May 2017 05:35:10 -0400 Subject: [PATCH 04/16] Add tutorial4Developers and fix/clean in quantum program --- README.md | 6 +- qiskit/_quantumprogram.py | 36 +- tutorial/index.ipynb | 5 +- tutorial/sections/tutorial4developer.ipynb | 660 +++++++++++++++++++++ 4 files changed, 682 insertions(+), 25 deletions(-) create mode 100644 tutorial/sections/tutorial4developer.ipynb diff --git a/README.md b/README.md index 2a4f5dd727..96dc85babe 100644 --- a/README.md +++ b/README.md @@ -12,13 +12,13 @@ Related external projects: ## Organization -The *scripts* directory contains Jupyter notebooks showing how to use the +The *tutorial* directory contains Jupyter notebooks showing how to use the [Python API](https://github.com/IBM/qiskit-api-py) with [OPENQASM](https://github.com/IBM/qiskit-openqasm). There are Jupyter notebooks demonstrating components of -the SDK in the *scripts* directory. There are also command line test scripts -in the *testscripts* directory. The root directory contains some miscellaneous +the SDK in the *tutorial* directory, and more python and qasm examples in the *examples* directory. There are also command line test scripts +in the *test* directory. The root directory contains some miscellaneous examples and an index Jupyter notebook. We want to reorganize the SDK so that it has a comfortable and intuitive diff --git a/qiskit/_quantumprogram.py b/qiskit/_quantumprogram.py index 6894a3c8a2..859a688138 100644 --- a/qiskit/_quantumprogram.py +++ b/qiskit/_quantumprogram.py @@ -168,16 +168,6 @@ class QuantumProgram(object): """ Set the API url """ self.set_api(url=url) - def get_job_list_status(self, jobids): - """Given a list of job ids, return a list of job status. - jobids is a list of id strings. - api is an IBMQuantumExperience object. - """ - status_list = [] - for i in jobids: - status_list.append(self.__api.get_job(i)['status']) - return status_list - def load_qasm(self, qasm_file, basis_gates=None): """ Load qasm file qasm_file qasm file name @@ -219,14 +209,14 @@ class QuantumProgram(object): qasm_circuits.append({'qasm': circuit.qasm()}) return qasm_circuits - def compile(self, circuits, device="simulator", shots=1024, max_credits=3, coupling_map=None): + def compile(self, circuits, device="simulator", shots=1024, max_credits=3, basis_gates=None, coupling_map=None): """ Compile unrole the code circuits are circuits to unroll basis_gates are the base gates by default are: u1,u2,u3,cx,id """ qasm_circuits = [] for circuit in circuits: - qasm_source, circuit_unrolled = self.unroller_code(circuit) + qasm_source, circuit_unrolled = self.unroller_code(circuit, basis_gates) if coupling_map: print("pre-mapping properties: %s" % circuit_unrolled.property_summary()) @@ -258,12 +248,8 @@ class QuantumProgram(object): def run(self, wait=5, timeout=60): """Run a program (a pre compiled quantum program). - program is a list of quantum_circuits - api the api for the device - device is a string for real or simulator - shots is the number of shots - max_credits is the credits of the experiments. - basis_gates are the base gates by default are: u1,u2,u3,cx,id + wait time to check if the job is Completed. + timeout time after that the execution stop """ backend = self.__qasm_compile['backend']['name'] @@ -301,8 +287,8 @@ class QuantumProgram(object): """ pass - def execute(self, circuits, device, shots, coupling_map=None, - max_credits=3, basis_gates=None, wait=5, timeout=60): + def execute(self, circuits, device, shots=1024, + max_credits=3, wait=5, timeout=60, basis_gates=None, coupling_map=None): """Execute, compile and run a program (array of quantum circuits). program is a list of quantum_circuits api the api for the device @@ -359,6 +345,16 @@ class QuantumProgram(object): return {"status": "Error", "result": "Time Out"} return job + def get_job_list_status(self, jobids): + """Given a list of job ids, return a list of job status. + jobids is a list of id strings. + api is an IBMQuantumExperience object. + """ + status_list = [] + for i in jobids: + status_list.append(self.__api.get_job(i)['status']) + return status_list + def wait_for_jobs(self, jobids, wait=5, timeout=60): """Wait until all status results are 'COMPLETED'. jobids is a list of id strings. diff --git a/tutorial/index.ipynb b/tutorial/index.ipynb index 27307dbab6..122d201b38 100644 --- a/tutorial/index.ipynb +++ b/tutorial/index.ipynb @@ -44,6 +44,7 @@ "## Introducing the tools\n", "\n", "These notebooks give an introduction to using the QISKit tools\n", + "* [Getting Started with QISKit SDK, Tutorial for Developers](sections/tutorial4developer.ipynb) shows how to use the the QISKit SDK tools. \n", "* [Getting Started with the Quantum Experience Web API](sections/getting_started_with_the_qx_api.ipynb) shows how to use the API to run your own quantum program on the QX. " ] }, @@ -111,7 +112,7 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python [default]", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -125,7 +126,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.6.0" } }, "nbformat": 4, diff --git a/tutorial/sections/tutorial4developer.ipynb b/tutorial/sections/tutorial4developer.ipynb new file mode 100644 index 0000000000..88d3fa5b4a --- /dev/null +++ b/tutorial/sections/tutorial4developer.ipynb @@ -0,0 +1,660 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\"Note: Trusted Notebook\" width=\"250 px\" align=\"left\">" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## _*Tutorial for Developers*_ \n", + "\n", + "For more information about how to use the Quantum Experience consult the [Quantum Experience tutorials](https://quantumexperience.ng.bluemix.net/qstage/#/tutorial?sectionId=c59b3710b928891a1420190148a72cce&pageIndex=0) or check-out the [community](https://quantumexperience.ng.bluemix.net/qstage/#/community).\n", + "\n", + "***\n", + "### Contributors\n", + "Ismael Faro, Jay Gambetta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Quantum QISKit SDK tutorial\n", + "\n", + "This tutorial has the focus to explain how use the QISKit SDK, from a developer point of view. We are to review how install, and start to use the SDK tools.\n", + "\n", + "QISKIt is a Python software development kit (SDK), that you can use to create your Quantum programs, based in circuits over [OpenQASM 2.0](https://github.com/IBM/qiskit-openqasm) Specs, compile and execute it in several Backends (Real Chips, Simulators online and Simulators in local). For the online Backend QISKit use our [python API connector](https://github.com/IBM/qiskit-api-py) to the [IBM Quantum Experience API project (http://quantumexperience.ng.bluemix.net/).\n", + "\n", + "We have other tutorials that introduce you to more complex concepts directly related with the Quantum.\n", + "\n", + "more examples:\n", + "[superposition and entanglement](superposition_and_entanglement.ipynb) we introduced you to the concept of entanglement.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Install QISKit\n", + "\n", + "the most easy way to install QISKit is using Anaconda python distribution.\n", + "\n", + "- Install Anaconda: https://www.continuum.io/downloads\n", + "\n", + "After that you need to install your QISKit from the git repository\n", + "\n", + "- Clone the repo:\n", + "\n", + "```sh\n", + "git clone https://github.ibm.com/IBMQuantum/qiskit-sdk-py-dev\n", + "cd qiskit-sdk-py-dev\n", + "```\n", + "\n", + "- Create the environment with the dependencies:\n", + "\n", + "```sh\n", + "make env\n", + "```\n", + "\n", + "## Use\n", + "\n", + "You can use the examples in an easy way with Jupyter or Python\n", + "\n", + "Add your API token to the file \"Qconfig.py\" (get it from [IBM Quantum Experience](https://quantumexperience.ng.bluemix.net) > Account):\n", + "\n", + "```sh\n", + "cp tutorial/Qconfig.py.default Qconfig.py\n", + "```\n", + "Run Jupyter notebook.\n", + "- Run it:\n", + "\n", + "```sh\n", + "make run\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Basic Concept\n", + "\n", + "### Create a Program\n", + "\n", + "Firts you need to import the QuantumProgram from QISKit" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import sys\n", + "sys.path.append(\"../../\") # solve the relative dependencies if you clone QISKit from the Git repo and use like a global.\n", + "\n", + "from qiskit import QuantumProgram\n", + "import Qconfig" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The basic elements that you need to create your first program are, the QuantumProgram, one Circuit, one Quantum Register and One Classical Register." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> quantum_registers created: qr 2\n", + ">> classical_registers created: cr 2\n" + ] + } + ], + "source": [ + "# Creating Programs\n", + "# create your first QuantumProgram object instance.\n", + "Q_program = QuantumProgram()\n", + "\n", + "# Creating Registers\n", + "# create your first Quantum Register called \"qr\" with 2 Qbit \n", + "qr = Q_program.create_quantum_registers(\"qr\", 2)\n", + "# create your first Classical Register called \"cr\" with 2 bit\n", + "cr = Q_program.create_classical_registers(\"cr\", 2)\n", + "\n", + "# Creating Circuits\n", + "# create your first Quantum Circuit called \"qc\" related with your Quantum Register \"qr\"\n", + "# and your Classical Register \"cr\"\n", + "qc = Q_program.create_circuit(\"qc\", [\"qr\"], [\"cr\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As another option to create your QuantumProgram instance you can define a Dictionary with all the component of your program." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "Q_SPECS = {\n", + " \"name\": \"Program-tutorial\",\n", + " \"circuits\": [{\n", + " \"name\": \"Circuit\",\n", + " \"quantum_registers\": [{\n", + " \"name\":\"qr\",\n", + " \"size\": 4\n", + " }],\n", + " \"classical_registers\": [{\n", + " \"name\":\"cr\",\n", + " \"size\": 4\n", + " }]}],\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One Program must to have a name, and one circuits array, any circuit must have a name and it can have several Quantum registers and several Classical Registers. Every register needs to have a name and the number of the elements (Qbits or bits).\n", + "\n", + "After that, you can use this dictionary definition like the specs of one QuantumProgram object to initialize it." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> quantum_registers created: qr 4\n", + ">> classical_registers created: cr 4\n" + ] + } + ], + "source": [ + "new_Q_program = QuantumProgram(specs=Q_SPECS)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can get every component from you new_Q_program to use." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#get the components.\n", + "\n", + "#get the circuit by Name\n", + "circuit = new_Q_program.circuit(\"Circuit\")\n", + "\n", + "#get the Quantum Register by Name\n", + "quantum_r = new_Q_program.quantum_registers(\"qr\")\n", + "\n", + "#get the Quantum Register by Name\n", + "classical_r = new_Q_program.classical_registers('cr')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "### add gates to your circuit\n", + "After create the circuit with its registers you can add gates to manipulate the registers. The next is the example of the all the gates that you can use.\n", + "\n", + "You can find extensive information about these gates and how use it into our [Quantum Experience User Guide](https://quantumexperience.ng.bluemix.net/qstage/#/tutorial?sectionId=71972f437b08e12d1f465a8857f4514c&pageIndex=2) " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# H (Hadamard) gate to the Qbit 0 in the Quantum Register \"qr\" \n", + "circuit.h(quantum_r[0])\n", + "\n", + "# Pauli X gate to the Qbit 1 in the Quantum Register \"qr\" \n", + "circuit.x(quantum_r[1])\n", + "\n", + "# Pauli Y gate to the Qbit 2 in the Quantum Register \"qr\" \n", + "circuit.y(quantum_r[2])\n", + "\n", + "# Pauli Z gate to the Qbit 3 in the Quantum Register \"qr\" \n", + "circuit.z(quantum_r[3])\n", + "\n", + "# Cnot (Controlled-NOT)gate from Qbit 0 to the Qbit 3\n", + "circuit.cx(quantum_r[0], quantum_r[3])\n", + "\n", + "# add a barrier to your circuit\n", + "circuit.barrier()\n", + "\n", + "# first physical gate: u1(lambda) to Qbit 0\n", + "circuit.u1(0.3, quantum_r[0])\n", + "\n", + "# second physical gate: u2(phi,lambda) to Qbit 1\n", + "circuit.u2(0.3, 0.2, quantum_r[1])\n", + "\n", + "# second physical gate: u3(theta,phi,lambda) to Qbit 2\n", + "circuit.u3(0.3, 0.2, 0.1, quantum_r[2])\n", + "\n", + "# S Phase gate to Qbit 0\n", + "circuit.s(quantum_r[0])\n", + "\n", + "# T Phase gate to Qbit 1\n", + "circuit.t(quantum_r[1])\n", + "\n", + "# identity gate to Qbit 1\n", + "circuit.iden(quantum_r[1])\n", + "\n", + "# Classical if, from Qbit2 gate Z to classical bit 1\n", + "circuit.z(quantum_r[2]).c_if(classical_r, 1)\n", + "\n", + "# measure gate from the Qbit 0 to Classical bit 0\n", + "circuit.measure(quantum_r[0], classical_r[0])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### extract QASM\n", + "\n", + "You can obtain a QASM representation of your code." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OPENQASM 2.0;\n", + "include \"qelib1.inc\";\n", + "qreg qr[4];\n", + "creg cr[4];\n", + "h qr[0];\n", + "x qr[1];\n", + "y qr[2];\n", + "z qr[3];\n", + "cx qr[0],qr[3];\n", + "barrier qr[0],qr[1],qr[2],qr[3];\n", + "u1(0.300000000000000) qr[0];\n", + "u2(0.300000000000000,0.200000000000000) qr[1];\n", + "u3(0.300000000000000,0.200000000000000,0.100000000000000) qr[2];\n", + "u1(1.570796326794897) qr[0];\n", + "u1(0.785398163397448) qr[1];\n", + "id qr[1];\n", + "if(cr==1) z qr[2];\n", + "measure qr[0] -> cr[0];\n", + "\n" + ] + } + ], + "source": [ + "# QASM from a circuit\n", + "\n", + "QASM_source = circuit.qasm()\n", + "\n", + "print (QASM_source)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OPENQASM 2.0;\n", + "include \"qelib1.inc\";\n", + "qreg qr[4];\n", + "creg cr[4];\n", + "u1(3.141592653589793) qr[3];\n", + "u3(3.141592653589793,1.5707963267948966,1.5707963267948966) qr[2];\n", + "u3(3.141592653589793,0.0,3.141592653589793) qr[1];\n", + "u2(0.0,3.141592653589793) qr[0];\n", + "cx qr[0],qr[3];\n", + "barrier qr[0],qr[1],qr[2],qr[3];\n", + "u1(0.3) qr[0];\n", + "u1(1.570796326794897) qr[0];\n", + "u2(0.3,0.2) qr[1];\n", + "u1(0.785398163397448) qr[1];\n", + "id qr[1];\n", + "u3(0.3,0.2,0.1) qr[2];\n", + "if(cr==1) u1(3.141592653589793) qr[2];\n", + "measure qr[0] -> cr[0];\n" + ] + } + ], + "source": [ + "# Qasm from a program\n", + "\n", + "QASM_source = new_Q_program.program_to_text()\n", + "\n", + "print (QASM_source)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "Note: you can appreciate that the both codes don't have the same notation, the second one return a conversion from every H, X, Y, Z gate the u1, u2 and u3 representation." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "### Compile & run or Execute" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "device = 'simulator' #Backed where execute your program, in this case in the online simulator\n", + "circuits = [circuit] #Group of circuits to exec\n", + "\n", + "Q_program.set_api(Qconfig.APItoken, Qconfig.config[\"url\"]) #set the APIToken and API url" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'qasm': 'OPENQASM 2.0;\\ninclude \"qelib1.inc\";\\nqreg qr[4];\\ncreg cr[4];\\nu1(3.141592653589793) qr[3];\\nu3(3.141592653589793,1.5707963267948966,1.5707963267948966) qr[2];\\nu3(3.141592653589793,0.0,3.141592653589793) qr[1];\\nu2(0.0,3.141592653589793) qr[0];\\ncx qr[0],qr[3];\\nbarrier qr[0],qr[1],qr[2],qr[3];\\nu1(0.3) qr[0];\\nu1(1.570796326794897) qr[0];\\nu2(0.3,0.2) qr[1];\\nu1(0.785398163397448) qr[1];\\nid qr[1];\\nu3(0.3,0.2,0.1) qr[2];\\nif(cr==1) u1(3.141592653589793) qr[2];\\nmeasure qr[0] -> cr[0];\\n'}\n", + "status = RUNNING (2 seconds)\n", + "status = RUNNING (4 seconds)\n", + "status = RUNNING (6 seconds)\n", + "{'qasms': [{'qasm': '\\ninclude \"qelib1.inc\";\\nqreg qr[4];\\ncreg cr[4];\\nu1(3.141592653589793) qr[3];\\nu3(3.141592653589793,1.5707963267948966,1.5707963267948966) qr[2];\\nu3(3.141592653589793,0.0,3.141592653589793) qr[1];\\nu2(0.0,3.141592653589793) qr[0];\\ncx qr[0],qr[3];\\nbarrier qr[0],qr[1],qr[2],qr[3];\\nu1(0.3) qr[0];\\nu1(1.570796326794897) qr[0];\\nu2(0.3,0.2) qr[1];\\nu1(0.785398163397448) qr[1];\\nid qr[1];\\nu3(0.3,0.2,0.1) qr[2];\\nif(cr==1) u1(3.141592653589793) qr[2];\\nmeasure qr[0] -> cr[0];\\n', 'status': 'DONE', 'executionId': '62c4667cf29a35ad009e8754baa85c80', 'result': {'date': '2017-05-14T08:45:36.552Z', 'data': {'time': 0.2707841396331787, 'counts': {'0000': 516, '0001': 508}}}}], 'shots': 1024, 'backend': {'name': 'simulator'}, 'status': 'COMPLETED', 'maxCredits': 3, 'usedCredits': 0, 'creationDate': '2017-05-14T08:45:35.262Z', 'deleted': False, 'id': '451903c7de63febb2614adbdeeaeb485', 'userId': '933a590a13327c52eb5310484d6bcf54'}\n" + ] + } + ], + "source": [ + "Q_program.compile(circuits, device) #Compile your program\n", + "\n", + "result = Q_program.run(wait=2, timeout=240) #Run your program in the device and check the execution result every 2 seconds \n", + "\n", + "print(result)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "When you run a program the result can be:\n", + "\n", + "```JSON\n", + "JOB_STATUS = {\n", + " inProgress: 'RUNNING',\n", + " errorOnCreate: 'ERROR_CREATING_JOB',\n", + " errorExecuting: 'ERROR_RUNNING_JOB',\n", + " completed: 'COMPLETED'\n", + " };\n", + "```\n", + "\n", + "The *run()* command waiting until timeout or when receive the \"COMPLETED\" or some error message.\n", + "\n", + "You can use the *execute()* to make the compile and run in a unique step." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'qasm': 'OPENQASM 2.0;\\ninclude \"qelib1.inc\";\\nqreg qr[4];\\ncreg cr[4];\\nu1(3.141592653589793) qr[3];\\nu3(3.141592653589793,1.5707963267948966,1.5707963267948966) qr[2];\\nu3(3.141592653589793,0.0,3.141592653589793) qr[1];\\nu2(0.0,3.141592653589793) qr[0];\\ncx qr[0],qr[3];\\nbarrier qr[0],qr[1],qr[2],qr[3];\\nu1(0.3) qr[0];\\nu1(1.570796326794897) qr[0];\\nu2(0.3,0.2) qr[1];\\nu1(0.785398163397448) qr[1];\\nid qr[1];\\nu3(0.3,0.2,0.1) qr[2];\\nif(cr==1) u1(3.141592653589793) qr[2];\\nmeasure qr[0] -> cr[0];\\n'}\n", + "status = RUNNING (2 seconds)\n", + "status = RUNNING (4 seconds)\n", + "status = RUNNING (6 seconds)\n" + ] + } + ], + "source": [ + "result = Q_program.execute(circuits, device, wait=2, timeout=240)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Compile parameters\n", + "Q_program.compile(circuits, device=\"simulator\", shots=1024, max_credits=3, basis_gates=None, coupling_map=None)\n", + " - circuits: Array of circuit to compile\n", + " - device: Backend \n", + " [\"simulator\", # Online simulator\n", + " \"qx5q\", # Online RealChip \n", + " \"qx5qv2\", # Online RealChip \n", + " \"qx16q\", # Online RealChip \n", + " \"local_unitary_simulator\"] # Local Simulator \n", + " - shots: Number of shots, only for real chips\n", + " - max_credits: Maximum number of the credits to spend in the executions. If the executions are more expensives, the job is aborted, only the real chips\n", + " - basis_gates: are the base gates, by default are: u1,u2,u3,cx,id\n", + " - coupling_map: Object that represent the physical/topological Layout in a chip.\n", + "#### Run parameters\n", + "Q_program.run(wait=5, timeout=60)\n", + " - wait: Time to wait to check if the execution is COMPLETED.\n", + " - timeout: Timeout of the execution.\n", + "#### Execute parameters \n", + "*the Execute has the combined parameters of Compile and Run*\n", + "\n", + "Q_program.execute(circuits, device, shots=1024,\n", + " max_credits=3, basis_gates=None, wait=5, timeout=60, basis_gates=None, coupling_map=None,)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Execute in a real chip" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'qasm': 'OPENQASM 2.0;\\ninclude \"qelib1.inc\";\\nqreg qr[4];\\ncreg cr[4];\\nu1(3.141592653589793) qr[3];\\nu3(3.141592653589793,1.5707963267948966,1.5707963267948966) qr[2];\\nu3(3.141592653589793,0.0,3.141592653589793) qr[1];\\nu2(0.0,3.141592653589793) qr[0];\\ncx qr[0],qr[3];\\nbarrier qr[0],qr[1],qr[2],qr[3];\\nu1(0.3) qr[0];\\nu1(1.570796326794897) qr[0];\\nu2(0.3,0.2) qr[1];\\nu1(0.785398163397448) qr[1];\\nid qr[1];\\nu3(0.3,0.2,0.1) qr[2];\\nif(cr==1) u1(3.141592653589793) qr[2];\\nmeasure qr[0] -> cr[0];\\n'}\n" + ] + } + ], + "source": [ + "device = 'qx5qv2' #Backed where execute your program, in this case in the Real Quantum Chip online \n", + "circuits = [circuit] #Group of circuits to exec\n", + "shots = 1024 #Number of Shots to run the program (experiment), Maximum 8192 shots.\n", + "max_credits=3 #Maximum number of the credits to spend in the executions. \n", + "\n", + "result = Q_program.execute(circuits, device, shots, max_credits=3, wait=10, timeout=240)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Result\n", + "You can access to the result in the element: qasms[n].result.data.counts " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'0000': 516, '0001': 508}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result['qasms'][0]['result']['data']['counts']" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "or you can use the function tool get_data(n) to obtain it directly" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'0000': 516, '0001': 508}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Q_program.get_data(result,0) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.0" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From 407cd91e1002175d97e107ef0df6108bbc065f53 Mon Sep 17 00:00:00 2001 From: "Jay M. Gambetta" Date: Sun, 14 May 2017 08:20:00 -0400 Subject: [PATCH 05/16] fix to reset in unitary and reset/measure in qasm adding ignore reset to unitary and reset/measure in qasm fixing repeated code --- qiskit/simulators/_qasmsimulator.py | 28 ++++++++++---------------- qiskit/simulators/_unitarysimulator.py | 4 +++- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/qiskit/simulators/_qasmsimulator.py b/qiskit/simulators/_qasmsimulator.py index 9780024a78..0850e57a83 100755 --- a/qiskit/simulators/_qasmsimulator.py +++ b/qiskit/simulators/_qasmsimulator.py @@ -105,8 +105,8 @@ class QasmSimulator(object): self._quantum_state = np.dot(unitaty_add, self._quantum_state) # print(self._quantum_state) - def _add_qasm_measure(self, qubit, cbit): - """Apply the measurement qubit gate.""" + def _add_qasm_decision(self, qubit): + """Apply the measurement/reset qubit gate.""" # print(qubit) probability_zero = 0 random_number = random.random() @@ -122,7 +122,14 @@ class QasmSimulator(object): else: outcome = '1' norm = np.sqrt(1-probability_zero) + return (outcome, norm) + + def _add_qasm_measure(self, qubit, cbit): + """Apply the measurement qubit gate.""" + + outcome, norm = self._add_qasm_decision(qubit) # print(outcome) + # print(norm) for ii in range(2**self._number_of_qubits): # update quantum state iistring = bin(ii)[2:] @@ -142,21 +149,8 @@ class QasmSimulator(object): I to this by applying a measurment and ignoring the outcome""" """Apply the measurement qubit gate.""" - # print(qubit) - probability_zero = 0 - random_number = random.random() - for ii in range(2**self._number_of_qubits): - iistring = bin(ii)[2:] - bits = list(reversed(iistring.zfill(self._number_of_qubits))) - if bits[qubit] == '0': - probability_zero += np.abs(self._quantum_state[ii])**2 - # print(probability_zero) - if random_number <= probability_zero: - outcome = '0' - norm = np.sqrt(probability_zero) - else: - outcome = '1' - norm = np.sqrt(1-probability_zero) + + outcome, norm = self._add_qasm_decision(qubit) # print(outcome) temp = self._quantum_state for ii in range(2**self._number_of_qubits): diff --git a/qiskit/simulators/_unitarysimulator.py b/qiskit/simulators/_unitarysimulator.py index 8e95b05676..eb9c2abc54 100755 --- a/qiskit/simulators/_unitarysimulator.py +++ b/qiskit/simulators/_unitarysimulator.py @@ -111,6 +111,8 @@ class UnitarySimulator(object): qubit1 = self.circuit['qasm'][j]['qubit_indices'][1] self._add_unitary_two(gate, qubit0, qubit1) elif self.circuit['qasm'][j]['type'] == 'measure': - print('Dropping measure from unitary simulator') + print('Warning have droped measure from unitary simulator') + elif self.circuit['qasm'][j]['type'] == 'reset': + print('Warning have droped reset from unitary simulator') self.circuit['result']['unitary'] = self._unitary_state return self.circuit From 94f15bd70aef8bdc585a1bf9353bf45f21891438 Mon Sep 17 00:00:00 2001 From: Andrew Cross Date: Sun, 14 May 2017 23:12:44 -0400 Subject: [PATCH 06/16] update README and unroller_backends images. --- README.md | 41 +++++++++++++++++------------------ images/unroller_backends.png | Bin 70066 -> 74436 bytes images/unroller_backends.svg | 36 +++++++++++++++++++----------- 3 files changed, 43 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 96dc85babe..a96c9d4866 100644 --- a/README.md +++ b/README.md @@ -18,45 +18,44 @@ The *tutorial* directory contains Jupyter notebooks showing how to use the There are Jupyter notebooks demonstrating components of the SDK in the *tutorial* directory, and more python and qasm examples in the *examples* directory. There are also command line test scripts -in the *test* directory. The root directory contains some miscellaneous -examples and an index Jupyter notebook. +in the *test* directory. -We want to reorganize the SDK so that it has a comfortable and intuitive -interface for developers. +Users can construct a *QuantumProgram* to create, modify, compile, and execute a collection of quantum circuits. -Users can create instances of *QuantumRegister* and *ClassicalRegister*, and -use these to construct a *QuantumCircuit*. They can then call methods of these -objects to apply gates within the circuit. The *extensions* directory extends -these objects as needed to support new gate sets and algorithms. The "cswap" -gate in the standard extension shows how to build gates that are sequences of +Each *QuantumCircuit* has some set of registers, *QuantumRegister* and *ClassicalRegister*, and methods of these objects are used to apply instructions within the circuit. The *extensions* directory extends +the quantum circuit as needed to support new gate sets and algorithms. For example, the "cswap" gate in the standard extension shows how to build gates that are sequences of other unitary gates. The Python file "header.py" shows how we append OPENQASM gate definitions as we import extensions. The *QuantumCircuit* can generate OPENQASM code that can flow through other components in the *qiskit* directory. The *qiskit* directory is the main Python module and contains the programming -interface objects *QuantumRegister*, *ClassicalRegister*, and *QuantumCircuit*. -The directory also contains a *qasm* module for parsing OPENQASM circuits, -an *unroll* module to flatten QASM for a target gate basis by expanding +interface objects *QuantumProgram*, *QuantumRegister*, *ClassicalRegister*, and *QuantumCircuit*. +The directory also contains internal modules: a *qasm* module for parsing OPENQASM circuits, +an *unroll* module to "flatten" QASM for a target gate basis by expanding gate subroutines as needed, a *circuit* module for working with circuits as -graphs, and a *localize* module for mapping all-to-all circuits to run on +graphs, and a *mapper* module for mapping all-to-all circuits to run on devices with fixed couplings. Quantum circuits flow through the components as follows. The programming interface is used to generate **OPENQASM** circuits. **OPENQASM** source, as a file or string, is passed into a *Qasm* object, whose *parse* method -produces an abstract syntax tree (**AST**) representation. The **AST** is +produces an abstract syntax tree (**AST**). The **AST** is passed to an *Unroller* that is attached to an *UnrollerBackend*. There is a *PrinterBackend* for outputting text and a *CircuitBackend* for constructing *Circuit* objects. The *Circuit* object represents an unrolled **OPENQASM** circuit as a directed acyclic graph (**DAG**). The *Circuit* provides methods for representing, transforming, and computing properties of a circuit as a **DAG** and outputting the results again as **OPENQASM**. The whole flow is -used by the *localize* module's *swap_mapper* method to insert SWAP gates -so a circuit can execute on a device with fixed couplings given by a -*CouplingGraph*. +used by the *mapper* module to rewrite a circuit to execute on a device +with fixed couplings given by a *CouplingGraph*. + +The circuit representations and how they are currently transformed into each other are summarized in ![](images/circuit_representations.png?raw=true). + +The unroller backends and their outputs are summarized in ![](images/circuit_representations.png?raw=true). + ## Install -- Intall Anaconda: https://www.continuum.io/downloads +- Install Anaconda: https://www.continuum.io/downloads - Clone the repo: ```sh @@ -86,7 +85,7 @@ make run ## FAQ -If you upgrade the dependencies and next error happens try with this fix: +If you upgrade the dependencies and next error happens try this fix: ```sh pip install --upgrade IBMQuantumExperience @@ -98,7 +97,7 @@ curl https://bootstrap.pypa.io/ez_setup.py -o - | python ## Developer guide -Please, use [GitHub pull requests](https://help.github.com/articles/using-pull-requests) to send the contributions. +Please, use [GitHub pull requests](https://help.github.com/articles/using-pull-requests) to send contributions. We use [Pylint](https://www.pylint.org) and [PEP 8](https://www.python.org/dev/peps/pep-0008) style guide. @@ -121,6 +120,6 @@ Note: You can get yout "putYourQExperienceTokenHere" from [IBM Quantum Experienc ### Commit messages rules -- It should be formed by a one-line subject, followed by one line of white space. Followed by one or more descriptive paragraphs, each separated by one line of white space. All of them finished by a dot. +- It should be formed by a one-line subject, followed by one line of white space. Followed by one or more descriptive paragraphs, each separated by one line of white space. All of them finished by a dot. - If it fixes an issue, it should include a reference to the issue ID in the first line of the commit. - It should provide enough information for a reviewer to understand the changes and their relation to the rest of the code. diff --git a/images/unroller_backends.png b/images/unroller_backends.png index 370dc640d24601ff8b3d008355348a849c2df484..8093749f5b13dffa9efb30328b06bc243bf11be6 100644 GIT binary patch literal 74436 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

7=x+u9D|Ig4__Dx|t_i5FVznF^ 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 Aga7~l diff --git a/images/unroller_backends.svg b/images/unroller_backends.svg index 09911ba8fe..6282330f58 100644 --- a/images/unroller_backends.svg +++ b/images/unroller_backends.svg @@ -9,9 +9,9 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="373.08823mm" - height="188.52194mm" - viewBox="0 0 1321.9661 667.99114" + width="373.08826mm" + height="188.52196mm" + viewBox="0 0 1321.9662 667.99119" id="svg2" version="1.1" inkscape:version="0.91 r13725" @@ -262,8 +262,8 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.49497475" - inkscape:cx="692.84134" - inkscape:cy="446.68561" + inkscape:cx="692.84131" + inkscape:cy="446.68564" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" @@ -292,7 +292,7 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(782.22436,66.629243)"> + transform="translate(782.22433,66.629243)"> UnitarySimulator + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">SimulatorBackend Simulator input data + style="font-size:25px;text-align:center;text-anchor:middle">Simulator input dataunroller.backend.circuit Date: Sun, 14 May 2017 23:13:49 -0400 Subject: [PATCH 07/16] fix line in README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a96c9d4866..6a7c1fb657 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ with fixed couplings given by a *CouplingGraph*. The circuit representations and how they are currently transformed into each other are summarized in ![](images/circuit_representations.png?raw=true). -The unroller backends and their outputs are summarized in ![](images/circuit_representations.png?raw=true). +The unroller backends and their outputs are summarized in ![](images/unroller_backends.png?raw=true). ## Install From cd2925aec8bb429fea4a3d702b6623e4499299b7 Mon Sep 17 00:00:00 2001 From: Andrew Cross Date: Sun, 14 May 2017 23:41:40 -0400 Subject: [PATCH 08/16] minor edits to python examples, delete old "bug" examples. --- examples/python/{localize.py => mapper.py} | 16 +++++++-------- examples/python/rippleadd.py | 4 ---- examples/python/test_jay_bug.py | 23 ---------------------- examples/python/test_jay_bug2.py | 16 --------------- examples/python/testsdkskel.py | 6 ++---- 5 files changed, 10 insertions(+), 55 deletions(-) rename examples/python/{localize.py => mapper.py} (90%) delete mode 100644 examples/python/test_jay_bug.py delete mode 100644 examples/python/test_jay_bug2.py diff --git a/examples/python/localize.py b/examples/python/mapper.py similarity index 90% rename from examples/python/localize.py rename to examples/python/mapper.py index 1c328f1df1..59f7dd15e7 100644 --- a/examples/python/localize.py +++ b/examples/python/mapper.py @@ -1,9 +1,9 @@ """ -Test script for localization of quantum circuits. +Test script for mapping quantum circuits. This script takes a QASM file and produces output that shows the -process of finding SWAP gates to map the circuit onto the coupling graph. -The final output is QASM source for a "localized" version of the input +process of mapping the circuit onto the coupling graph. +The final output is QASM source for a "mapped" version of the input circuit. The coupling graph and target basis are hard-coded into this script. @@ -106,14 +106,14 @@ def make_unrolled_circuit_from_data(dat, basis): if len(sys.argv) < 2: - print("localize.py \n") + print("mapper.py \n") print(" qasm = main circuit") print("") - print("Generates a new \"localized\" circuit matching the coupling.") + print("Generates a new \"mapped\" circuit matching the coupling.") sys.exit(1) # This is the QE basis -basis = "u1,u2,u3,cx" +basis = "u1,u2,u3,cx,id" layout_type = "qe5" # "qe5" or "2x8" @@ -148,7 +148,7 @@ elif layout_type == "2x8": # Three', expand swaps into cx gates c_prime = make_unrolled_circuit_from_data(c_prime.qasm(qeflag=True), - "cx,u1,u2,u3") + "cx,u1,u2,u3,id") # Fourth, do direction mapping c_dblp = mapper.direction_mapper(c_prime, coupling, verbose=True) @@ -156,5 +156,5 @@ print("c_dblp.qasm() = \n%s" % c_dblp.qasm(qeflag=True)) # Unroll again c_final = make_unrolled_circuit_from_data(c_dblp.qasm(qeflag=True), - "cx,u1,u2,u3") + "cx,u1,u2,u3,id") print("c_final.qasm() = \n%s" % c_final.qasm(qeflag=True)) diff --git a/examples/python/rippleadd.py b/examples/python/rippleadd.py index c9851b79fd..967b6dc53d 100644 --- a/examples/python/rippleadd.py +++ b/examples/python/rippleadd.py @@ -239,7 +239,3 @@ print("factors = %d" % C_directions_unrolled.num_tensor_factors()) print("operations:") for key, val in C_directions_unrolled.count_ops().items(): print(" %s: %d" % (key, val)) - -# TODO: test on examples using simulator -# TODO: understand swap_mapper with all-all -# TODO: simple unit tests for qasm, mapper, unroller, circuit diff --git a/examples/python/test_jay_bug.py b/examples/python/test_jay_bug.py deleted file mode 100644 index c84b066167..0000000000 --- a/examples/python/test_jay_bug.py +++ /dev/null @@ -1,23 +0,0 @@ -import sys -import os - -# We don't know from where the user is running the example, -# so we need a relative position from this file path. -# TODO: Relative imports for intra-package imports are highly discouraged. -# http://stackoverflow.com/a/7506006 -sys.path.append(os.path.join(os.path.dirname(__file__), '../..')) -from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit -from qiskit.extensions.standard import h, cx - -q2 = QuantumRegister("q", 2) -c2 = ClassicalRegister("c", 2) -bell = QuantumCircuit(q2, c2) -bell.h(q2[0]) -bell.cx(q2[0], q2[1]) - -measureIZ = QuantumCircuit(q2, c2) -measureIZ.measure(q2[0], c2[0]) - -c = bell + measureIZ - -print(c.qasm()) diff --git a/examples/python/test_jay_bug2.py b/examples/python/test_jay_bug2.py deleted file mode 100644 index 2abb16bc98..0000000000 --- a/examples/python/test_jay_bug2.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys -import os - -# We don't know from where the user is running the example, -# so we need a relative position from this file path. -# TODO: Relative imports for intra-package imports are highly discouraged. -# http://stackoverflow.com/a/7506006 -sys.path.append(os.path.join(os.path.dirname(__file__), '../..')) -from qiskit.qasm import Qasm - -badqasm = """ -OPENQASM 2.0; -qreg Q[5]; -""" - -ast = Qasm(data=badqasm).parse() diff --git a/examples/python/testsdkskel.py b/examples/python/testsdkskel.py index 6217716a8a..00e396ef82 100644 --- a/examples/python/testsdkskel.py +++ b/examples/python/testsdkskel.py @@ -19,10 +19,8 @@ from qiskit.extensions.standard import barrier, ubase, cxbase from qiskit.extensions.standard import h, cx, u1, u2, u3, iden, x, y, z, s from qiskit.extensions.standard import t, ccx, cswap -# Issues -# .q_if is not implemented, store controls on each gate, two methods - -# Ismael advice - keep it simple +# Issues: +# .q_if is not implemented n = 5 q = QuantumRegister("q", n) From 3dc768ff9625a57e16e3a992b0dae7f78090a0d5 Mon Sep 17 00:00:00 2001 From: ismael faro Date: Mon, 15 May 2017 01:30:15 -0400 Subject: [PATCH 09/16] FIX: add Real Chip last names. --- qiskit/_quantumprogram.py | 7 +++++-- tutorial/sections/tutorial4developer.ipynb | 10 +++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/qiskit/_quantumprogram.py b/qiskit/_quantumprogram.py index 859a688138..4cd2adb9c1 100644 --- a/qiskit/_quantumprogram.py +++ b/qiskit/_quantumprogram.py @@ -47,8 +47,8 @@ class QuantumProgram(object): """ Quantum Program Class Class internal properties """ - __online_devices = ["qx5q", "qx5qv2","simulator", "online_simulator"] - __local_devices = ["unitary_simulator"] + __online_devices = ["qx5qv2","ibmqx2", "ibmqx3", "ibmqx_qasm_simulator","simulator"] + __local_devices = ["local_unitary_simulator", "local_qasm_simulator"] __specs = {} __quantum_registers = {} @@ -536,6 +536,9 @@ class QuantumProgram(object): else: basicplotter.plot_qsphere(data, circuit_number) + def get_qasm_image(self,): + pass + def get_data(self, results, i): """Get the dict of labels and counts from the output of get_job.""" return results['qasms'][i]['result']['data']['counts'] diff --git a/tutorial/sections/tutorial4developer.ipynb b/tutorial/sections/tutorial4developer.ipynb index 88d3fa5b4a..335fcb8fae 100644 --- a/tutorial/sections/tutorial4developer.ipynb +++ b/tutorial/sections/tutorial4developer.ipynb @@ -517,11 +517,11 @@ "Q_program.compile(circuits, device=\"simulator\", shots=1024, max_credits=3, basis_gates=None, coupling_map=None)\n", " - circuits: Array of circuit to compile\n", " - device: Backend \n", - " [\"simulator\", # Online simulator\n", - " \"qx5q\", # Online RealChip \n", - " \"qx5qv2\", # Online RealChip \n", - " \"qx16q\", # Online RealChip \n", - " \"local_unitary_simulator\"] # Local Simulator \n", + " [\"ibmqx_qasm_simulator\", # Online simulator\n", + " \"ibmqx2\", # Online RealChip, 5Qbits\n", + " \"ibmqx3\", # Online RealChip, 16Qbits\n", + " \"local_unitary_simulator\", # Local unitary Simulator \n", + " \"local_qasm_simulator\"] # Local Simulator \n", " - shots: Number of shots, only for real chips\n", " - max_credits: Maximum number of the credits to spend in the executions. If the executions are more expensives, the job is aborted, only the real chips\n", " - basis_gates: are the base gates, by default are: u1,u2,u3,cx,id\n", From cb7ac05cec59fbb159a156bf2869049de00c5813 Mon Sep 17 00:00:00 2001 From: "Jay M. Gambetta" Date: Mon, 15 May 2017 01:34:09 -0400 Subject: [PATCH 10/16] small edits and fixing tutorial Superposition tutorial now runs with new SDK. Small edits to getting started. --- qiskit/extensions/standard/rx.py | 5 +- qiskit/extensions/standard/ry.py | 5 +- qiskit/extensions/standard/rz.py | 5 +- qiskit/simulators/_qasmsimulator.py | 1 + qiskit/simulators/_unitarysimulator.py | 1 + qiskit/unroll/_simulatorbackend.py | 2 + test/testsim.py | 5 +- tutorial/index.ipynb | 12 +- tutorial/sections/qelib1.inc | 95 ---- .../superposition_and_entanglement.ipynb | 421 ++++++++---------- tutorial/sections/tutorial4developer.ipynb | 75 ++-- 11 files changed, 263 insertions(+), 364 deletions(-) delete mode 100644 tutorial/sections/qelib1.inc diff --git a/qiskit/extensions/standard/rx.py b/qiskit/extensions/standard/rx.py index b026e79196..c95a2741dd 100644 --- a/qiskit/extensions/standard/rx.py +++ b/qiskit/extensions/standard/rx.py @@ -1,4 +1,7 @@ -"""Rotation around the x-axis.""" +"""Rotation around the x-axis. + +Author: Jay Gambetta and Andrew Cross +""" from qiskit import QuantumRegister from qiskit import QuantumCircuit from qiskit import Gate diff --git a/qiskit/extensions/standard/ry.py b/qiskit/extensions/standard/ry.py index 26863a1b0c..56777f1e71 100644 --- a/qiskit/extensions/standard/ry.py +++ b/qiskit/extensions/standard/ry.py @@ -1,4 +1,7 @@ -"""Rotation around the y-axis.""" +"""Rotation around the y-axis. + +Author: Jay Gambetta and Andrew Cross +""" from qiskit import QuantumRegister from qiskit import QuantumCircuit from qiskit import Gate diff --git a/qiskit/extensions/standard/rz.py b/qiskit/extensions/standard/rz.py index 18fa790050..995c6de4fa 100644 --- a/qiskit/extensions/standard/rz.py +++ b/qiskit/extensions/standard/rz.py @@ -1,4 +1,7 @@ -"""Rotation around the z-axis.""" +"""Rotation around the z-axis. + +Author: Jay Gambetta and Andrew Cross +""" from qiskit import QuantumRegister from qiskit import QuantumCircuit from qiskit import Gate diff --git a/qiskit/simulators/_qasmsimulator.py b/qiskit/simulators/_qasmsimulator.py index 0850e57a83..432108191f 100755 --- a/qiskit/simulators/_qasmsimulator.py +++ b/qiskit/simulators/_qasmsimulator.py @@ -3,6 +3,7 @@ Contains a (slow) python simulator that makes the qasm of the circuit. We advise using the c++ simulator or online for larger size systems +Author: Jay Gambetta {'number_of_qubits': 2, 'number_of_cbits': 2, diff --git a/qiskit/simulators/_unitarysimulator.py b/qiskit/simulators/_unitarysimulator.py index eb9c2abc54..ea8d514b2e 100755 --- a/qiskit/simulators/_unitarysimulator.py +++ b/qiskit/simulators/_unitarysimulator.py @@ -3,6 +3,7 @@ Contains a (slow) python simulator that makes the unitary of the circuit. These are simple methods for making common matrices used in quantum computing. +Author: Jay Gambetta circuit = { diff --git a/qiskit/unroll/_simulatorbackend.py b/qiskit/unroll/_simulatorbackend.py index f6cbe32e7d..ca44d0ff57 100644 --- a/qiskit/unroll/_simulatorbackend.py +++ b/qiskit/unroll/_simulatorbackend.py @@ -1,5 +1,7 @@ """Backend for the unroller that composes unitary matrices to simulate circuit. +Author: Jay Gambetta and Andrew Cross + {'number_of_qubits': 2, 'number_of_cbits': 2, 'number_of_operations': 2 diff --git a/test/testsim.py b/test/testsim.py index 6fb150c55f..e49d800f19 100644 --- a/test/testsim.py +++ b/test/testsim.py @@ -1,4 +1,7 @@ -"""Quick test program for unitary simulator backend.""" +"""Quick test program for unitary simulator backend. + +Author: Jay Gambetta +""" import qiskit.unroll as unroll from qiskit.qasm import Qasm from qiskit.unroll import SimulatorBackend diff --git a/tutorial/index.ipynb b/tutorial/index.ipynb index 122d201b38..05073da0c6 100644 --- a/tutorial/index.ipynb +++ b/tutorial/index.ipynb @@ -19,7 +19,7 @@ "\n", "***\n", "### Contributors\n", - "Jay M. Gambetta, Andrew Cross, Antonio Córcoles, Andreas Fuhrer" + "Jay M. Gambetta, Antonio Córcoles, Andrew Cross, Ismael Faro, Andreas Fuhrer " ] }, { @@ -45,7 +45,7 @@ "\n", "These notebooks give an introduction to using the QISKit tools\n", "* [Getting Started with QISKit SDK, Tutorial for Developers](sections/tutorial4developer.ipynb) shows how to use the the QISKit SDK tools. \n", - "* [Getting Started with the Quantum Experience Web API](sections/getting_started_with_the_qx_api.ipynb) shows how to use the API to run your own quantum program on the QX. " + "* Running the Local simulator " ] }, { @@ -57,9 +57,7 @@ "The next set of notebooks show how you explore some simple concepts of quantum information science. Currently we have:\n", "\n", "* [Superposition and entanglement](sections/superposition_and_entanglement.ipynb) - illustrates how to make simple quantum states on one and two qubits and shows concepts such as a quantum superpositions and entanglement. \n", - "* [Single qubit states: amplitude and phase](scripts/single_qubit_states_amplitude_and_phase.ipynb) illustrates more complicated single qubit states. \n", - "* [Superposition and entanglement](sections/superposition_and_entanglement.ipynb) - illustrates how to make simple quantum states on one and two qubits and shows concepts such as a quantum superpositions and entanglement. \n", - "* [Single qubit states: amplitude and phase](scripts/single_qubit_states_amplitude_and_phase.ipynb) TODO WITH JAY\n", + "* [Single qubit states: amplitude and phase](scripts/single_qubit_states_amplitude_and_phase.ipynb) illustrates more complicated single qubit states. \n", "* [Entanglement revisited](scripts/entanglement_revisited.ipynb) - illustrates the CHSH inequality and extensions for three qubits (Mermin). \n", "* Quantum sphere TODO WITH JAY\n", "* Quantum teleportation TODO WITH JAY\n", @@ -112,7 +110,7 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [default]", "language": "python", "name": "python3" }, @@ -126,7 +124,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.5.2" } }, "nbformat": 4, diff --git a/tutorial/sections/qelib1.inc b/tutorial/sections/qelib1.inc deleted file mode 100644 index a48461623c..0000000000 --- a/tutorial/sections/qelib1.inc +++ /dev/null @@ -1,95 +0,0 @@ -// Quantum Experience (QE) Standard Header -// file: qelib1.inc - -// --- QE Hardware primitives --- - -// 3-parameter 2-pulse single qubit gate -gate u3(theta,phi,lambda) q { U(theta,phi,lambda) q; } -// 2-parameter 1-pulse single qubit gate -gate u2(phi,lambda) q { U(pi/2,phi,lambda) q; } -// 1-parameter 0-pulse single qubit gate -gate u1(lambda) q { U(0,0,lambda) q; } -// controlled-NOT -gate cx c,t { CX c,t; } -// idle gate (identity) -gate id a { U(0,0,0) a; } - -// --- QE Standard Gates --- - -// Pauli gate: bit-flip -gate x a { u3(pi,0,pi) a; } -// Pauli gate: bit and phase flip -gate y a { u3(pi,pi/2,pi/2) a; } -// Pauli gate: phase flip -gate z a { u1(pi) a; } -// Clifford gate: Hadamard -gate h a { u2(0,pi) a; } -// Clifford gate: sqrt(Z) phase gate -gate s a { u1(pi/2) a; } -// Clifford gate: conjugate of sqrt(Z) -gate sdg a { u1(-pi/2) a; } -// C3 gate: sqrt(S) phase gate -gate t a { u1(pi/4) a; } -// C3 gate: conjugate of sqrt(S) -gate tdg a { u1(-pi/4) a; } - -// --- Standard rotations --- -// Rotation around X-axis -gate rx(theta) a { u3(theta, -pi/2,pi/2) a; } -// rotation around Y-axis -gate ry(theta) a { u3(theta,0,0) a; } -// rotation around Z axis -gate rz(phi) a { u1(phi) a; } - -// --- QE Standard User-Defined Gates --- - -// controlled-Phase -gate cz a,b { h b; cx a,b; h b; } -// controlled-Y -gate cy a,b { sdg b; cx a,b; s b; } -// controlled-H -gate ch a,b { -h b; sdg b; -cx a,b; -h b; t b; -cx a,b; -t b; h b; s b; x b; s a; -} -// C3 gate: Toffoli -gate ccx a,b,c -{ - h c; - cx b,c; tdg c; - cx a,c; t c; - cx b,c; tdg c; - cx a,c; t b; t c; h c; - cx a,b; t a; tdg b; - cx a,b; -} -// controlled rz rotation -gate crz(lambda) a,b -{ - u1(lambda/2) b; - cx a,b; - u1(-lambda/2) b; - cx a,b; -} -// controlled phase rotation -gate cu1(lambda) a,b -{ - u1(lambda/2) a; - cx a,b; - u1(-lambda/2) b; - cx a,b; - u1(lambda/2) b; -} -// controlled-U -gate cu3(theta,phi,lambda) c, t -{ - // implements controlled-U(theta,phi,lambda) with target t and control c - u1((lambda-phi)/2) t; - cx c,t; - u3(-theta/2,0,-(phi+lambda)/2) t; - cx c,t; - u3(theta/2,phi,0) t; -} diff --git a/tutorial/sections/superposition_and_entanglement.ipynb b/tutorial/sections/superposition_and_entanglement.ipynb index 5cae059426..d198adc37f 100644 --- a/tutorial/sections/superposition_and_entanglement.ipynb +++ b/tutorial/sections/superposition_and_entanglement.ipynb @@ -37,7 +37,7 @@ "metadata": {}, "source": [ "## Getting Started\n", - "Please see the [Getting Started with the Quantum Experience Web API](scripts/getting_started_with_the_qx_api.ipynb) if you would like to understand the API better. However for this script simply import the following preamble once you have made your own Qconfig.py file containing your token from Quantum Experience. " + "Please see the [Getting Started with QISKit](tutorial4developer.ipynb) if you would like to understand the QISKit SDK better. However for this script simply work your way though the tutorial. " ] }, { @@ -61,23 +61,14 @@ "%matplotlib inline\n", "import time\n", "\n", - "#importing the QX and QISKit \n", - "from IBMQuantumExperience import IBMQuantumExperience\n", "import sys\n", - "sys.path.append(\"..\")\n", - "from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit\n", - "from qiskit.extensions.standard import x, h, cx, barrier\n", - "\n", - "#some usefull functions for running a program, plotting, and getting the data\n", - "from qhelpers.misc import run_program\n", - "from qhelpers.misc import program_to_text\n", - "from qhelpers.misc import combine_jobs\n", - "from qhelpers.misc import get_data\n", - "from qhelpers.basicplotter import plot_histogram\n", - "\n", - "#Set up the API to communitcate to the QX\n", + "sys.path.append(\"../../\")\n", + "#importing the QISKit\n", + "from qiskit import QuantumProgram\n", "import Qconfig\n", - "api = IBMQuantumExperience.IBMQuantumExperience(Qconfig.APItoken, Qconfig.config)" + "\n", + "#import basic plot tools\n", + "from qiskit.basicplotter import plot_histogram" ] }, { @@ -166,22 +157,21 @@ "name": "stdout", "output_type": "stream", "text": [ + ">> quantum_registers created: qr 1\n", + ">> classical_registers created: cr 1\n", "OPENQASM 2.0;\n", "include \"qelib1.inc\";\n", - "qreg q[1];\n", - "creg c[1];\n", - "measure q[0] -> c[0];\n", + "qreg qr[1];\n", + "creg cr[1];\n", + "u3(3.141592653589793,0.0,3.141592653589793) qr[0];\n", + "measure qr[0] -> cr[0];\n", "\n", "\n", "OPENQASM 2.0;\n", "include \"qelib1.inc\";\n", - "qreg q[1];\n", - "creg c[1];\n", - "u3(3.141592653589793,0.0,3.141592653589793) q[0];\n", - "measure q[0] -> c[0];\n", - "\n", - "\n", - "\n" + "qreg qr[1];\n", + "creg cr[1];\n", + "measure qr[0] -> cr[0];\n" ] } ], @@ -189,20 +179,24 @@ "device = 'qx5qv2' # the device to run on\n", "shots = 1024 #the number of shots in the experiment. \n", "\n", + "Q_program = QuantumProgram()\n", + "Q_program.set_api(Qconfig.APItoken, Qconfig.config[\"url\"]) #set the APIToken and API url\n", + "\n", + "\n", + "# Creating Registers\n", + "qr = Q_program.create_quantum_registers(\"qr\", 1)\n", + "cr = Q_program.create_classical_registers(\"cr\", 1)\n", + "\n", "#Quantum circuit ground \n", - "q = QuantumRegister(\"q\", 1)\n", - "c = ClassicalRegister(\"c\", 1)\n", - "qc_ground = QuantumCircuit(q, c)\n", - "qc_ground.measure(q[0], c[0])\n", + "qc_ground = Q_program.create_circuit(\"ground\", [\"qr\"], [\"cr\"])\n", + "qc_ground.measure(qr[0], cr[0])\n", "\n", - "#Quantum circuit ground\n", - "qc_excited = QuantumCircuit(q, c)\n", - "qc_excited.x(q)\n", - "qc_excited.measure(q[0], c[0])\n", + "#Quantum circuit excited \n", + "qc_excited = Q_program.create_circuit(\"excited\", [\"qr\"], [\"cr\"])\n", + "qc_excited.x(qr)\n", + "qc_excited.measure(qr[0], cr[0])\n", "\n", - "program = [qc_ground,qc_excited]\n", - "\n", - "print(program_to_text(program))" + "print(Q_program.program_to_text())" ] }, { @@ -223,15 +217,29 @@ "name": "stdout", "output_type": "stream", "text": [ - "status = {'RUNNING': 1} (0 seconds)\n", - "status = {'COMPLETED': 1} (20 seconds)\n" + "status = RUNNING (10 seconds)\n", + "status = RUNNING (20 seconds)\n", + "status = RUNNING (30 seconds)\n", + "status = RUNNING (40 seconds)\n", + "status = RUNNING (50 seconds)\n", + "status = RUNNING (60 seconds)\n", + "status = RUNNING (70 seconds)\n", + "status = RUNNING (80 seconds)\n", + "status = RUNNING (90 seconds)\n", + "status = RUNNING (100 seconds)\n", + "status = RUNNING (110 seconds)\n", + "status = RUNNING (120 seconds)\n", + "status = RUNNING (130 seconds)\n", + "status = RUNNING (140 seconds)\n", + "status = RUNNING (150 seconds)\n", + "status = RUNNING (160 seconds)\n", + "status = RUNNING (170 seconds)\n" ] } ], "source": [ - "out = run_program(program,api,device,shots,max_credits=3)\n", - "jobids=[out['id']]\n", - "results=combine_jobs(jobids, api, wait=20, timeout=240)" + "circuits = [qc_ground, qc_excited]\n", + "results = Q_program.execute(circuits, device, shots, max_credits=3, wait=10, timeout=240)" ] }, { @@ -250,9 +258,9 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\nkSMZPXo0Z5xxBkuXLu3qr6DbGBCS9lnvvfcekydP5tFHH2Xp0qXMmjVrlz/Ajz76KMuXL2f58uXM\nnDmTq666qkPLrlmzhscff5zBgwe3tv34xz/m3XffZfHixTzzzDPcddddrF69mu3bt/PVr36VJ554\nghdeeIHm5mamTp0KwPjx41m8eDGLFi1iypQpfO1rX6vBN9M1DAhJ+6wFCxYwfPhwhg0bRt++fRk3\nbhxz587daczcuXO59NJLiQhOP/10Nm3axPr169td9pprruF73/seEdHaFhFs3ryZ7du3884779C3\nb1/69+9PZpKZbN68mczkrbfe4uijjwagf//+rctv3rx5p/fr6QwISfustWvXMmjQoNb5xsZG1q5d\n26Exe1p27ty5NDQ0MGrUqJ3e6+KLL6Zfv34MHDiQwYMHc+2113LEEUfQp08fpk+fzsiRIzn66KNZ\nunQpV1xxRety06ZN49hjj2XKlCnccccdXfoddCcDQpIqbNmyhe985zt861vf2qVvwYIF9OrVi3Xr\n1rFq1SpuvfVWVq5cybZt25g+fTrPPfcc69ato7m5eafjE5MnT+bll1/m5ptv5tvf/nYtP06nGBCS\n9lkNDQ2sWbOmdb6lpYWGhoYOjdld+8svv8yqVasYNWoUQ4YMoaWlhY985CP84Q9/4KGHHmLs2LH0\n6dOHD37wg3z84x9n4cKFLFq0CIBjjz2WiOALX/gCTz311C71jhs3jocffrirv4ZuY0BI2medcsop\nLF++nFWrVrF161Zmz57NBRdcsNOYCy64gAceeIDMZP78+Rx22GEMHDhwt8uOHDmS1157jdWrV7N6\n9WoaGxt59tln+dCHPsTgwYP51a9+BZSOJ8yfP58TTzyRhoYGli5dyoYNGwD4xS9+wUknnQTA8uXL\nW2v52c9+xnHHHVejb6fzetdqRRExFrgd6AXcnZk3temPcv/5wBbgbzPz2V3eSJLKevfuzdSpUznv\nvPN47733uPzyy2lqamLGjBkATJo0ifPPP5958+YxfPhwDj74YO699949LrsnkydPZsKECTQ1NZGZ\nTJgwgebmZgBuuOEGzjzzTPr06cMxxxzDfffdB8DUqVP55S9/SZ8+fXj/+9/P/fff331fSBeLzOz+\nlUT0An4PfApoAZ4GLsnMpRVjzge+TCkgTgNuz8zT9vS+Y8aMyYULF+5VTaO+P26vlhM8f+3sepcg\nqRMi4pnMHNPeuFrtYjoVWJGZKzNzKzAbuLDNmAuBB7JkPnB4RAysUX2SpDZqtYupAVhTMd9CaSuh\nvTENwPruLU1Svbglv/dqsSVfs2MQXSUiJgITy7NvR8RL9aynGx0JvF7vIorEf/2nepcg1UKP/Q1C\np3+Hx3RkUK0CYi0wqGK+sdxW7RgycyYws6sL7GkiYmFH9hFK6h7+Bmt3DOJp4LiIGBoRfYFxwCNt\nxjwCXBolpwNvZqa7lySpTmqyBZGZ2yPiauDnlE5zvSczl0TEpHL/DGAepTOYVlA6zXVCLWqTJBWr\nyWmuql5ETCzvTpNUB/4GDQhJ0m54qw1JUiEDQpJUyIDoBhFxRET8NCI2R8QrETG+ou/ciHgxIrZE\nxBMRcUxFX0TEzRGxsTzdHBVPF4mIIeVltpTf45Nt1ju+vL7NEfFwRBxRm08s9Sz1+A1GxMCIeCQi\n1kVERsSQWn3e7mJAdI9pwFbgKOBvgOkR0RQRRwJzgP8GHAEsBCqvdpkI/BUwCmgGPgf8XUX/LOA5\n4APAN4H/ExEDACKiCbgL+GJ5vVuAH3TT55N6upr/BoE/A48BF3XTZ6o5D1J3sYjoB7wBjMjM35fb\nHgDWASsp3aX2LyvGvg58ODNfjIingPt2nDkREZcDEzPz9Ig4HlgMHJmZ/1ru/w3wUGbOiIjvAEMy\nc3y571hgGfCBHeOlA0G9foMV6+8NbAOGZubqmnzobuIWRNc7Hti+4z/MsueBpvL0/I7GzNxM6bqP\nHfcY3qm/YrkdfSvb/LFv21/53i8D75brkQ4k9foN7ncMiK53CPBWm7a3gEPLfW/upo+C/reAQ8r7\nQKtdtm2/dKCo129wv2NAdL23gf5t2g4D/rWdvqJlDwPeztJ+wGqXbdsvHSjq9Rvc7xgQXe/3QO+I\nqHyu4ChgSXkataOxvP/z2HI7bfsrltvRNywiDt1Df+V7Hwv0LdcjHUjq9Rvc/2SmUxdPlB6INAvo\nB5xBabO0CRhQfn0RcBDwPWB+xXKTKB1YbihPS4FJFf3zge+Xl/1rYBMwoNzXRGlz9z+U1/sQMLve\n34WTUz2mevwGy/0HldeZwAnAQfX+Ljr1Pda7gP1xonT63MPAZuBVYHxF3yeBF4F3gF9TOvNoR1+U\n/4P9U3n6HuUzzcr9Q8rLvAO8BHyyzXrHl9e3GZgLHFHv78LJqR5THX+D2Xaq93fRmcnTXCVJhTwG\nIUkqZEBIkgoZEJKkQgaEJKmQASFJKmRASJIKGRCSpEIGhCSpkAEhSSr0/wG06PcQQaKTSgAAAABJ\nRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -260,9 +268,9 @@ }, { "data": { - "image/png": "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\nAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAD/CAYAAADrE0HrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGYhJREFUeJzt3XuwFeW55/Hv40biEUViRKMbCCIgFwWMqJwTY8RLAlaU\nY3Qi6sRbHKKlozVVetSamWRmctEYM5NMVAhx0OCUoIkEnQTJBaPmlFIKCl6IBAYwbDQRMXhBIhef\n+WMtmMWmYe8Fe6+12Xw/VV306vft1c9axeJHd7/dHZmJJEnN7VPvAiRJHZMBIUkqZEBIkgoZEJKk\nQgaEJKmQASFJKmRASJIKGRCSpEIGhCSpUJd6F7A7DjnkkOzbt2+9y5CkPcr8+fPfysyeLfXbowOi\nb9++zJs3r95lSNIeJSJea00/DzFJkgoZEJKkQgaEJKmQASFJKmRASJIKGRCSpEIGhCSpkAEhSSpk\nQEiSChkQkqRCBoQkqZABIUkqZEBIkgoZEJKkQgaEJKmQASFJKmRASNqjzZ49m6OPPpr+/ftz2223\nbdf+t7/9jXPPPZdhw4Zx4okn8vLLL29tW7t2Leeffz6DBg1i8ODBPPPMMwDceOONDBo0iGHDhnHu\nueeydu1aADZu3Mill17Ksccey+DBg7n11lu3vteDDz7IsGHDGDp0KDfddNPW5U899RSf/vSn6dKl\nCz//+c/b62toFwaEpD3W5s2bueaaa3jsscdYtGgR06ZNY9GiRdv0+c53vsOIESN48cUXmTp1Ktdf\nf/3Wtuuvv54xY8bw6quvsnDhQgYPHgzAmWeeycsvv8yLL77IwIEDtwbBz372Mz788ENeeukl5s+f\nz49//GNWrFjBmjVruPHGG5kzZw6vvPIKf/nLX5gzZw4Affr04b777uOiiy6q0bfSdgwISXusZ599\nlv79+9OvXz+6du3K+PHjeeSRR7bps2jRIk477TQABg0axIoVK/jrX//KO++8w1NPPcVXv/pVALp2\n7UqPHj0A+PznP0+XLqUnMo8aNYqmpiYAIoJ169axadMm1q9fT9euXenevTvLli1jwIAB9OxZeszz\nGWecwcMPPwyUHo08bNgw9tlnz/vnds+rWJLKVq1aRe/evbe+7tWrF6tWrdqmz/Dhw5kxYwZQCpTX\nXnuNpqYmli9fTs+ePbn88ss57rjjuPLKK1m3bt1225gyZQpjx44F4Pzzz6dbt24cfvjh9OnThxtu\nuIGDDz6Y/v37s3jxYlasWMGmTZuYOXMmK1eubMdPXhsGhKRO7eabb2bt2rWMGDGCH/3oRxx33HE0\nNDSwadMmnn/+ea6++mpeeOEFunXrtt05jG9/+9t06dKFiy++GCgFTENDA6+//jrLly/n+9//PsuW\nLePjH/84EydO5IILLuCzn/0sffv2paGhoR4ft011qXcBkrSrGhsbt/mfelNTE42Njdv06d69O/fe\ney8AmcmRRx5Jv379+OCDD+jVqxcnnXQSUNo7qAyI++67j1/+8pfMmTOHiADggQceYMyYMey7774c\neuihfOYzn2HevHn069ePs88+m7PPPhuAyZMnd4qAcA9C0h7rhBNOYMmSJSxfvpwNGzYwffp0zjnn\nnG36rF27lg0bNgBwzz33cMopp9C9e3c++clP0rt3bxYvXgzAnDlzGDJkCFAaGXX77bfz6KOPsv/+\n+299rz59+vD4448DsG7dOubOncugQYMAePPNN4HSqKm7776bK6+8sn0/fC1k5h47HX/88Slp7/ar\nX/0qBwwYkP369ctvfetbmZk5ceLEnDhxYmZmPv300zlgwIAcOHBgnnvuufn2229vXfeFF17I448/\nPo899tgcN27c1rajjjoqe/XqlcOHD8/hw4fn1772tczMfO+99/L888/PIUOG5ODBg/P222/f+l7j\nx4/PwYMH5+DBg3PatGlblz/77LPZ2NiY+++/fx588ME5ZMiQdv9OWgLMy1b8Gxulvu0rIqYAXwTe\nzMxjCtoD+CFwFvABcFlmPt/S+44cOTLnzZvX1uVKUqcWEfMzc2RL/Wp1iOk+YMxO2scCA8rTBGBi\nDWqSJO1ETQIiM58C3t5Jl3HA1PLez1ygR0QcXovaJEnFOspJ6kagctBwU3mZJKlOOkpAtFpETIiI\neRExb/Xq1fUuR5I6rY4SEKuA3hWve5WXbSczJ2fmyMwcueWydklS2+soAfEocEmUjALeycw36l2U\nJO3NanIldURMA04FDomIJuAbwL4AmTkJmEVpiOtSSsNcL69FXZKkHatJQGTmhS20J3BNLWqRJLVO\nRznEJEnqYAwISVIh7+YqqW6G3zG+3iXssRbeML3dt+EehCSpkAEhSSpkQEiSChkQkqRCBoQkqZAB\nIUkqZEBIkgoZEJKkQgaEJKmQASFJKmRASJIKGRCSpEIGhCSpkAEhSSpkQEiSChkQkqRCBoQkqZAB\n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\nhQwISVIhA0KSVMiAkCQVMiAkSYUMCElSIQNCklTIgJAkFTIgJEmFDAhJUiEDQpJUyICQJBUyIHbT\n7NmzOfroo+nfvz+33Xbbdu2ZyXXXXUf//v0ZNmwYzz//PAB///vfOfHEExk+fDhDhw7lG9/4xtZ1\nLrjgAkaMGMGIESPo27cvI0aMAGDNmjWMHj2aAw44gGuvvXab7cyfP59jjz2W/v37c91115GZALz2\n2mucfvrpDBs2jFNPPZWmpqb2+iokdTIGxG7YvHkz11xzDY899hiLFi1i2rRpLFq0aJs+jz32GEuW\nLGHJkiVMnjyZq6++GoCPfexjPP744yxcuJAFCxYwe/Zs5s6dC8CDDz7IggULWLBgAeeddx5f+tKX\nANhvv/345je/yR133LFdLVdffTU/+clPtm5r9uzZANxwww1ccsklvPjii3z961/nlltuac+vRFIn\nYkDshmeffZb+/fvTr18/unbtyvjx43nkkUe26fPII49wySWXEBGMGjWKtWvX8sYbbxARHHDAAQBs\n3LiRjRs3Un7U6laZyUMPPcSFF14IQLdu3Tj55JPZb7/9tun3xhtv8O677zJq1CgigksuuYSZM2cC\nsGjRIk477TQARo8evV19krQjBsRuWLVqFb179976ulevXqxatarVfTZv3syIESM49NBDOfPMMznp\npJO2WfcPf/gDhx12GAMGDGixjl69ehVuY/jw4cyYMQOAX/ziF7z33nusWbNmFz6tpL2NAVFHDQ0N\nLFiwgKamJp599llefvnlbdqnTZu2de9hV91xxx08+eSTHHfccTz55JM0NjbS0NCwW+8pae/Qpd4F\n7MkaGxtZuXLl1tdNTU00NjZW3adHjx6MHj2a2bNnc8wxxwCwadMmZsyYwfz581tVR+XJ58ptHHHE\nEVv3IN5//30efvhhevToUeUnlbQ3cg9iN5xwwgksWbKE5cuXs2HDBqZPn84555yzTZ9zzjmHqVOn\nkpnMnTuXgw46iMMPP5zVq1ezdu1aANavX89vf/tbBg0atHW93/3udwwaNGibQ0c7cvjhh9O9e3fm\nzp1LZjJ16lTGjRsHwFtvvcVHH30EwK233soVV1zRVh9fUifnHsRu6NKlC3feeSdf+MIX2Lx5M1dc\ncQVDhw5l0qRJAFx11VWcddZZzJo1i/79+7P//vtz7733AqUTy5deeimbN2/mo48+4stf/jJf/OIX\nt7739OnTCw8v9e3bl3fffZcNGzYwc+ZMfvOb3zBkyBDuvvtuLrvsMtavX8/YsWMZO3YsAE888QS3\n3HILEcEpp5zCXXfdVYNvRlJnEFvGy++JRo4cmfPmzat3GZJ20fA7xte7hD3Wwhum7/K6ETE/M0e2\n1M9DTJKkQnvtISb/57Lrdud/LpL2HO5BSJIKGRCSpEI1C4iIGBMRiyNiaUTcXNAeEfE/y+0vRsSn\na1WbJGl7NQmIiGgA7gLGAkOACyNiSLNuY4EB5WkCMLEWtUmSitVqD+JEYGlmLsvMDcB0YFyzPuOA\nqVkyF+gREYfXqD5JUjO1CohGYGXF66bysmr7SJJqZI8b5hoREygdggJ4PyIW17OednQI8Fa9iygS\nNz5Y7xKkWuiwv0HY7d/hp1rTqVYBsQroXfG6V3lZtX3IzMnA5LYusKOJiHmtudJRUvvwN1i7Q0zP\nAQMi4siI6AqMBx5t1udR4JLyaKZRwDuZ+UaN6pMkNVOTPYjM3BQR1wK/BhqAKZn5SkRcVW6fBMwC\nzgKWAh8Al9eiNklSsT36Zn2dWURMKB9Ok1QH/gYNCEnSDnirDUlSIQNCklTIgGgHEXFwRPwiItZF\nxGsRcVFF2+kR8WpEfBARv4+IT1W0RUR8NyLWlKfvRkRUtPctr/NB+T3OaLbdi8rbWxcRMyPi4Np8\nYqljqcdvMCIOj4hHI+L1iMiI6Furz9teDIj2cRewATgMuBiYGBFDI+IQYAbwn4GDgXlA5dUuE4B/\nBoYDw4Czga9VtE8DXgA+AfxH4OcR0RMgIoYCPwa+Ut7uB8Dd7fT5pI6u5r9B4CNgNnBeO32mmvMk\ndRuLiG7A34BjMvNP5WVTgdeBZcBlmflPFX3fAo7LzFcj4mngvi0jJyLiCmBCZo6KiIHAS8Ahmfle\nuf0p4IHMnBQR3wH6ZuZF5bajgD8Cn9jSX9ob1Os3WLH9LsBG4MjMXFGTD91O3INoewOBTVv+YpYt\nBIaWp4VbFmbmOkrXfQwtL9qmvWK9LW3Lmv1j37y98r3/L/BhuR5pb1Kv32CnY0C0vQOAd5stexc4\nsNz2zg7aKGh/FzigfAy02nWbt0t7i3r9BjsdA6LtvQ90b7bsIOC9FtqK1j0IeD9LxwGrXbd5u7S3\nqNdvsNMxINren4AuETGgYtlw4JXyNHzLwvLxz6PKy2neXrHelrZ+EXHgTtor3/sooGu5HmlvUq/f\nYOeTmU5tPFF6INI0oBtwMqXd0qFAz/L8ecB+wO3A3Ir1rqJ0YrmxPC0CrqponwvcUV73S8BaoGe5\nbSil3d3Plrf7ADC93t+Fk1M9pnr8Bsvt+5W3mcDRwH71/i5263usdwGdcaI0fG4msA74M3BRRdsZ\nwKvAeuAJSiOPtrRF+S/s2+XpdsojzcrtfcvrrAcWA2c02+5F5e2tAx4BDq73d+HkVI+pjr/BbD7V\n+7vYnclhrpKkQp6DkCQVMiAkSYUMCElSIQNCklTIgJAkFTIgJEmFDAhJUiEDQpJUyICQJBX6f6+g\n6GthwAxTAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -270,9 +278,9 @@ } ], "source": [ - "data0=get_data(results,0)\n", + "data0=Q_program.get_data(results,0)\n", "plot_histogram(data0)\n", - "data1=get_data(results,1)\n", + "data1=Q_program.get_data(results,1)\n", "plot_histogram(data1)" ] }, @@ -302,24 +310,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "OPENQASM 2.0;\n", - "include \"qelib1.inc\";\n", - "qreg q[1];\n", - "creg c[1];\n", - "u2(0.0,3.141592653589793) q[0];\n", - "measure q[0] -> c[0];\n", - "\n", - "\n", - "\n", - "status = {'RUNNING': 1} (0 seconds)\n", - "status = {'COMPLETED': 1} (20 seconds)\n" + "status = RUNNING (10 seconds)\n", + "status = RUNNING (20 seconds)\n", + "status = RUNNING (30 seconds)\n" ] }, { "data": { - "image/png": "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\nof8PS8BgHc9ViAUAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAD/CAYAAADrE0HrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGTNJREFUeJzt3X+01XWd7/Hn20PU+LsUagSRHwIKeg6DJ2i83JGyDG1M\nzVqDzi0zuwz5a3lXhq51a7zXuBlzW2GpwVjXlXnLM1koLEWcnNErZcWPEc2DvxBUoPLXJA5owoH3\n/WNvTpvNF87ZcM7eB3w+1vouvvvz+XzP973PYp/X/v6OzESSpGoHNLoASVLfZEBIkgoZEJKkQgaE\nJKmQASFJKmRASJIKGRCSpEJ1C4iImBIRT0XEqoi4ehdjJkfEiohoj4j/V6/aJEk7i3pcKBcRTcDT\nwEeAdcBS4LzMXFkx5nDgYWBKZr4QEQMz86VeL06SVKhfndYzAViVmasBIqINOAtYWTHmfGBeZr4A\n0J1wOPLII3Po0KE9X60k7ceWL1/+SmYO6GpcvQJiELC24vU6YGLVmFHAOyLiQeAQ4FuZ+YPqHxQR\n04BpAEOGDGHZsmW9UrAk7a8i4vnujOtLB6n7AScBHwM+CnwlIkZVD8rMmzOzNTNbBwzoMgAlSXuo\nXlsQ64GjK14PLrdVWge8mpmbgE0R8RDQQunYhSSpzuq1BbEUGBkRwyKiPzAVWFA1Zj4wKSL6RcSB\nlHZBPVGn+iRJVeqyBZGZHRFxKXAf0ATckpntETG93D83M5+IiEXAY8A24HuZ+Xg96pMk7awup7n2\nltbW1vQgtSTVJiKWZ2ZrV+P60kFqSVIfYkBIkgoZEJKkQgaEJKmQASFJKmRASJIKGRCSpEIGhCSp\nkAEhSSpkQEiSChkQkqRCBsReWrRoEaNHj+bYY4/l61//+k79Dz74IIcddhjjxo1j3LhxXHvttV0u\ne8cddzB27FgOOOCAHR6ItHnzZi688EJOPPFEWlpaePDBBzv7Jk+ezOjRozvX89JLpQfyzZ07lxNP\nPJFx48YxadIkVq6sfIifJO1GZu6z00knnZSN1NHRkcOHD89nn30233rrrWxubs729vYdxjzwwAP5\nsY99rKZlV65cmU8++WSecsopuXTp0s5lbrzxxvzsZz+bmZkvvvhijh8/Prdu3ZqZudPY7TZs2NA5\nP3/+/PzoRz+6929c6kPuvffeHDVqVI4YMSKvu+66XY5bsmRJNjU15R133NHZdv311+fYsWNzzJgx\nOXv27M72Rx55JCdOnJgtLS150kkn5a9//evOvq997Ws5YsSIHDVqVC5atGin9Zx55pk5duzYztdX\nXHFFtrS0ZEtLS44cOTIPO+ywvX3Lew1Ylt34G+sWxF5YsmQJxx57LMOHD6d///5MnTqV+fPn7/Wy\nxx9/PKNHj95pmZUrV/KhD30IgIEDB3L44Yd3+cjVQw89tHN+06ZNRER3357U523dupVLLrmEe++9\nl5UrV3L77bcXbiVv3bqVq666itNOO62z7fHHH+e73/0uS5Ys4dFHH+Xuu+9m1apVAMyYMYNrrrmG\nFStWcO211zJjxgyg9Blsa2ujvb2dRYsWcfHFF7N169bOnzlv3jwOPvjgHdY9e/ZsVqxYwYoVK7js\nssv4xCc+0Ru/il5hQOyF9evXc/TRf3pQ3uDBg1m/vvpBefDwww/T3NzM6aefTnt7e03LVmppaWHB\nggV0dHSwZs0ali9fztq1f3rU9wUXXMC4ceP46le/Slbcxv2mm25ixIgRzJgxg29/+9t7/H6lvqa7\nX9JuuOEGzj33XAYOHNjZ9sQTTzBx4kQOPPBA+vXrxymnnMK8efMAiAhef/11ADZs2MBRRx0FwPz5\n85k6dSrvfOc7GTZsGMceeyxLliwBYOPGjXzzm9/ky1/+8i7rvf322znvvPN67P33NgOil40fP54X\nXniBxx57jMsuu4yzzz57j3/W5z73OQYPHkxraytXXHEFJ598Mk1NTQD88Ic/pL29ncWLF7N48WJu\nu+22zuUuueQSnn32WWbNmsXMmTP3+j1JfUV3vmitX7+eO++8ky984Qs7tJ9wwgksXryYV199lTfe\neIOFCxd2fuG6/vrr+dKXvsTRRx/NlVdeyXXXXdfl+r7yla/wxS9+kQMPPLCw1ueff541a9Z07gXY\nFxgQe2HQoEE7fINft24dgwYN2mHMoYce2rnJecYZZ7BlyxZeeeWVbi1brV+/fp2bq/Pnz+e1115j\n1KhRnbUAHHLIIZx//vmd32oqTZ06lbvuumvP3qy0j7riiiuYNWsWBxyw45+7448/vnO305QpUxg3\nblznF645c+Ywe/Zs1q5dy+zZs7nooot2u44VK1bw7LPPcs455+xyTFtbG5/85Cc717EvMCD2wvvf\n/36eeeYZ1qxZw+bNm2lra+PjH//4DmN+//vfd+7uWbJkCdu2beOII47o1rLV3njjDTZt2gTAz372\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -327,19 +327,15 @@ } ], "source": [ - "qc = QuantumCircuit(q, c)\n", - "qc.h(q)\n", - "qc.measure(q[0], c[0])\n", + "#Quantum circuit superposition \n", + "qc_superposition = Q_program.create_circuit(\"superposition\", [\"qr\"], [\"cr\"])\n", + "qc_superposition.h(qr)\n", + "qc_superposition.measure(qr[0], cr[0])\n", "\n", - "program=[qc]\n", + "circuits = [qc_superposition]\n", + "results = Q_program.execute(circuits, device, shots, max_credits=3, wait=10, timeout=240)\n", "\n", - "print(program_to_text(program))\n", - "\n", - "out = run_program(program,api,device,shots,max_credits=3)\n", - "jobids=[out['id']]\n", - "results=combine_jobs(jobids, api, wait=20, timeout=240)\n", - "data=get_data(results,0)\n", - "plot_histogram(data)" + "plot_histogram(Q_program.get_data(results,0))" ] }, { @@ -360,26 +356,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "OPENQASM 2.0;\n", - "include \"qelib1.inc\";\n", - "qreg q[1];\n", - "creg c[1];\n", - "u2(0.0,3.141592653589793) q[0];\n", - "barrier q[0];\n", - "u2(0.0,3.141592653589793) q[0];\n", - "measure q[0] -> c[0];\n", - "\n", - "\n", - "\n", - "status = {'RUNNING': 1} (0 seconds)\n", - "status = {'COMPLETED': 1} (20 seconds)\n" + "status = RUNNING (10 seconds)\n", + "status = RUNNING (20 seconds)\n" ] }, { "data": { - "image/png": "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\ne5/vfve7HHLIIbS1tdHS0sJll13Grbfeypo1a2hpaWH16tU8/fTTnHrqqTz66KMMGjQIgHvvvZdh\nw4bt9H6zZ8/mq1/9KmeccQZLlixh9uzZLFu2DIATTjiBn/zkJzv1/8Mf/sANN9zA8uXLGTx4MFOn\nTuVDH/oQjY2N/fuD6SPuQUjaYy1fvpzGxkaOPPJIBg8ezLRp01i0aNFOfRYtWsSFF14IwMc+9jF+\n9atfkZksWrSIadOm8cY3vpEjjjiCxsbG9j2CrkQEL774IgCbNm1i+PDhu+z/yCOPcNxxx/GWt7yF\nuro6PvjBD3LXXXf14hNXlwEhaY+1fv16RowY0f68oaGB9evXd9mnrq6Ogw46iI0bN+5y24hgypQp\nvPe972XBggXtfa655houvfRSRowYwSWXXMJVV13Vvu6BBx5g4sSJnHHGGaxevRqA8ePHc//997Nx\n40a2bNnCkiVLeOqpp/r+B9FPPMQkSZ385je/ob6+nueee47TTjuNd73rXUyePJnrr7+eb33rW5xz\nzjncdtttzJgxg1/+8pccffTRPPHEEwwZMoQlS5bwkY98hLVr13LUUUdx2WWXMWXKFPbff38mTZrU\nfghrT+AehKQ9Vn19/U5/ka9bt476+vou+2zbto1NmzYxdOjQXW6749+3vvWtnH322e2Hnm666SY+\n+tGPAvDxj3+8vf3AAw9kyJAhAJx55pm8+uqrPP/88wDMmDGDlStXct9993HIIYcwevToPv859BcD\nQtIe65hjjmHt2rU89thjbN26lZaWFpqbm3fq09zczE033QTAHXfcwcknn0xE0NzcTEtLC6+88gqP\nPfYYa9eu5dhjj2Xz5s289NJLAGzevJmf//znjB8/HoDhw4fz61//GoB77rmHUaNGAfDMM8+QmUBp\nXOS1115j6NChADz33HMAPPnkk9x1111Mnz69n38qfadqh5giYipwLTAI+E5mXt1p/RuB7wHvBTYC\n52Xm49WqT9Kep66ujnnz5nH66aezfft2LrroIsaNG8ecOXNoamqiubmZGTNmcMEFF9DY2Mihhx5K\nS0sLAOPGjePcc89l7Nix1NXVMX/+fAYNGsSzzz7L2WefDZT2OKZPn87UqVMBuOGGG/jCF77Atm3b\neNOb3tQ+PnHHHXdw/fXXU1dXx5vf/GZaWlqICADOOeccNm7cyBve8Abmz5/PwQcfXIOf1O6JHanX\nr28SMQh4FDgNWAesAM7PzDUd+vw3YEJmfi4ipgFnZ+Z5u3rdpqambG1t3a2aJs6dtlvbCR6+pKXW\nJUjqhYhYmZlN3fWr1iGmY4G2zPxTZm4FWoCzOvU5C7ipvHwHcErsiGBJUtVV6xBTPdDx3K51wHFd\n9cnMbRGxCRgKPF+VCiVVnXvyu68ae/J73GmuETETmFl++nJE/LGW9fSjYQzQcIxLb611CVI1DNjv\nIPT6e/jOnnSqVkCsB0Z0eN5Qbivqsy4i6oCDKA1W7yQzFwALOrfvbSKitSfHCCX1D7+D1RuDWAGM\niogjImIwMA1Y3KnPYuDC8vLHgHuyGiPokqRCVdmDKI8pzALupnSa642ZuToirgRaM3Mx8F3g5oho\nA/6DUohIkmqkKqe5qnIRMbN8OE1SDfgdNCAkSV1wqg1JUiEDQpJUyIDoBxFxaET8KCI2R8QTETG9\nw7rp5bbNEfHjiDi0J9v1dltpX1Kj7+CsiGiNiFciYmFVPmg/MyD6x3xgK/A24O+A6yNiXESMA74N\nXFBetwW4rrvtAHqzrbQPqsV38Gnga8CN/fexqstB6j4WEfsDLwDjM/PRctvNlC4EfA0YmZnTy+1/\nAzxCaUqR17raLjO/FBH/tLvbVueTSwNDLb6DmflSh/f/GtCQmZ+sxuftT+5B9L3RwLYd/4OVPQyM\nKz8e3tGYmf+X0l8ro7vZjl5uK+1LavEd3CvtcXMx7QGGAC92atsEHABsLy93ta6r7Xa87u5uK+1L\navEd3CsZEH3vZeDATm0HAi9R2oXdnXW9eV1pX1OL7+BeyUNMfe9RoC4iRnVomwisLj8m7miMiCOB\nN5a32dV29HJbaV9Si+/gXslB6n4QES1AAp8GJgFLgPeXVz8A/C3we0pnRNRl5rRdbVeet2rc7m7b\n7x9YGmBq9B2so3RU5quUZqz+DKUxjW39/oH7S2b66OMHcCjwY2Az8CQwvcO66eW2zcAi4NCebNfb\nbX342JceNfoOXkEpXDo+rqj1z6I3D/cgJEmFHIOQJBUyICRJhQwISVIhA0KSVMiAkCQVMiAkSYUM\nCElSIQNCklTIgJAkFfr/A0Vvx/G3kcAAAAAASUVORK5CYII=\n", + "image/png": "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\nChkQkqRC/x/2+6s9praDYAAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -387,21 +372,17 @@ } ], "source": [ - "qc = QuantumCircuit(q, c)\n", - "qc.h(q[0])\n", - "qc.barrier()\n", - "qc.h(q[0])\n", - "qc.measure(q[0], c[0])\n", + "#Quantum circuit two Hadamard \n", + "qc_twohadamard = Q_program.create_circuit(\"twohadamard\", [\"qr\"], [\"cr\"])\n", + "qc_twohadamard.h(qr)\n", + "qc_twohadamard.barrier()\n", + "qc_twohadamard.h(qr)\n", + "qc_twohadamard.measure(qr[0], cr[0])\n", "\n", - "program=[qc]\n", + "circuits = [qc_twohadamard]\n", + "results = Q_program.execute(circuits, device, shots, max_credits=3, wait=10, timeout=240)\n", "\n", - "print(program_to_text(program))\n", - "out = run_program(program,api,device,shots,max_credits=3)\n", - "\n", - "jobids=[out['id']]\n", - "results=combine_jobs(jobids, api, wait=20, timeout=240) \n", - "data=get_data(results,0)\n", - "plot_histogram(data)" + "plot_histogram(Q_program.get_data(results,0))" ] }, { @@ -459,9 +440,9 @@ "outputs": [ { "data": { - "image/png": "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\nD4OZXgIvAAAAAElFTkSuQmCC\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -548,46 +529,118 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">> quantum_registers created: q2 2\n", + ">> classical_registers created: c2 2\n", + "OPENQASM 2.0;\n", + "include \"qelib1.inc\";\n", + "qreg q2[2];\n", + "creg c2[2];\n", + "u2(0.0,3.141592653589793) q2[0];\n", + "cx q2[0],q2[1];\n", + "measure q2[0] -> c2[0];\n", + "\n", + "\n", + "OPENQASM 2.0;\n", + "include \"qelib1.inc\";\n", + "qreg q2[2];\n", + "creg c2[2];\n", + "u2(0.0,3.141592653589793) q2[0];\n", + "cx q2[0],q2[1];\n", + "u2(0.0,3.141592653589793) q2[0];\n", + "measure q2[0] -> c2[0];\n", + "\n", + "\n", + "OPENQASM 2.0;\n", + "include \"qelib1.inc\";\n", + "qreg q2[2];\n", + "creg c2[2];\n", + "u2(0.0,3.141592653589793) q2[0];\n", + "cx q2[0],q2[1];\n", + "measure q2[1] -> c2[1];\n", + "\n", + "\n", + "OPENQASM 2.0;\n", + "include \"qelib1.inc\";\n", + "qreg q2[2];\n", + "creg c2[2];\n", + "u2(0.0,3.141592653589793) q2[0];\n", + "cx q2[0],q2[1];\n", + "u2(0.0,3.141592653589793) q2[1];\n", + "measure q2[1] -> c2[1];\n", + "\n", + "\n", + "OPENQASM 2.0;\n", + "include \"qelib1.inc\";\n", + "qreg q2[2];\n", + "creg c2[2];\n", + "u2(0.0,3.141592653589793) q2[0];\n", + "cx q2[0],q2[1];\n", + "measure q2[1] -> c2[1];\n", + "measure q2[0] -> c2[0];\n", + "\n", + "\n", + "OPENQASM 2.0;\n", + "include \"qelib1.inc\";\n", + "qreg q2[2];\n", + "creg c2[2];\n", + "u2(0.0,3.141592653589793) q2[0];\n", + "cx q2[0],q2[1];\n", + "u2(0.0,3.141592653589793) q2[1];\n", + "measure q2[1] -> c2[1];\n", + "u2(0.0,3.141592653589793) q2[0];\n", + "measure q2[0] -> c2[0];\n" + ] + } + ], "source": [ + "# Creating Registers\n", + "q2 = Q_program.create_quantum_registers(\"q2\", 2)\n", + "c2 = Q_program.create_classical_registers(\"c2\", 2)\n", + "\n", "#quantum circuit to make bell state \n", - "q2 = QuantumRegister(\"q\", 2)\n", - "c2 = ClassicalRegister(\"c\", 2)\n", - "bell = QuantumCircuit(q2, c2)\n", + "bell = Q_program.create_circuit(\"bell\", [\"q2\"], [\"c2\"])\n", "bell.h(q2[0])\n", - "bell.cx(q2[0],q2[1])\n", + "bell.cx(q2[0], q2[1])\n", + "\n", "\n", "#quantum circuit to measure q0 in standard basis\n", - "measureIZ = QuantumCircuit(q2, c2)\n", + "measureIZ = Q_program.create_circuit(\"measureIZ\", [\"q2\"], [\"c2\"])\n", "measureIZ.measure(q2[0], c2[0])\n", "\n", "#quantum circuit to measure q0 in superposition basis \n", - "measureIX = QuantumCircuit(q2, c2)\n", + "measureIX = Q_program.create_circuit(\"measureIX\", [\"q2\"], [\"c2\"])\n", "measureIX.h(q2[0])\n", "measureIX.measure(q2[0], c2[0])\n", "\n", "#quantum circuit to measure q1 in standard basis\n", - "measureZI = QuantumCircuit(q2, c2)\n", + "measureZI = Q_program.create_circuit(\"measureZI\", [\"q2\"], [\"c2\"])\n", "measureZI.measure(q2[1], c2[1])\n", "\n", "#quantum circuit to measure q1 in superposition basis \n", - "measureXI = QuantumCircuit(q2, c2)\n", + "measureXI = Q_program.create_circuit(\"measureXI\", [\"q2\"], [\"c2\"])\n", "measureXI.h(q2[1])\n", "measureXI.measure(q2[1], c2[1])\n", "\n", "# quantum circuit to measure q in standard basis \n", - "measureZZ = QuantumCircuit(q2, c2)\n", + "measureZZ = Q_program.create_circuit(\"measureZZ\", [\"q2\"], [\"c2\"])\n", "measureZZ.measure(q2[0], c2[0])\n", "measureZZ.measure(q2[1], c2[1])\n", "\n", "# quantum circuit to measure q in superposition basis \n", - "measureXX = QuantumCircuit(q2, c2)\n", + "measureXX = Q_program.create_circuit(\"measureXX\", [\"q2\"], [\"c2\"])\n", "measureXX.h(q2[0])\n", "measureXX.h(q2[1])\n", "measureXX.measure(q2[0], c2[0])\n", "measureXX.measure(q2[1], c2[1])\n", "\n", - "program = [bell+measureIZ, bell+measureIX, bell+measureZI, bell+measureXI, bell+measureZZ, bell+measureXX]" + "circuits = [bell+measureIZ, bell+measureIX, bell+measureZI, bell+measureXI, bell+measureZZ, bell+measureXX]\n", + "\n", + "print(Q_program.program_to_text(circuits))" ] }, { @@ -608,35 +661,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "OPENQASM 2.0;\n", - "include \"qelib1.inc\";\n", - "qreg q[2];\n", - "creg c[2];\n", - "u2(0.0,3.141592653589793) q[0];\n", - "cx q[0],q[1];\n", - "measure q[0] -> c[0];\n", - "\n", - "\n", - "OPENQASM 2.0;\n", - "include \"qelib1.inc\";\n", - "qreg q[2];\n", - "creg c[2];\n", - "u2(0.0,3.141592653589793) q[0];\n", - "cx q[0],q[1];\n", - "u2(0.0,3.141592653589793) q[0];\n", - "measure q[0] -> c[0];\n", - "\n", - "\n", - "\n", - "status = {'RUNNING': 1} (0 seconds)\n", - "status = {'COMPLETED': 1} (20 seconds)\n" + "status = RUNNING (10 seconds)\n", + "status = RUNNING (20 seconds)\n" ] }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAD/CAYAAADrE0HrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGURJREFUeJzt3XuU1XW9//HnWwbyeClvU0dBRG4qg+BlUvv180oqZmEn\nSZFKM43Ob0mdLLy0fqkdf5lZ3nKJmsdcevyp5FGPToWxWllLu5gMihl4IwZx0F8SRyWxI4y+f3/s\nzTQM32Fmw8zeAzwfa+3F9/v5fr7f/d6z2POa7+3zjcxEkqTOtql1AZKk/smAkCQVMiAkSYUMCElS\nIQNCklTIgJAkFTIgJEmFDAhJUiEDQpJUqK7WBWyK3XbbLYcNG1brMiRpszJv3ry/ZGZ9d/2qFhAR\nMRH4PjAAuCUzv1PQ5xTgm0ACT2Xm1A1tc9iwYTQ3N/dBtZK05YqIF3vSryoBEREDgJnAsUArMDci\nmjJzYYc+o4CvAx/OzNci4v3VqE2SVKxa5yAOARZl5uLMXA3MAk7q1OcLwMzMfA0gM1+tUm2SpALV\nCojBwEsd5lvLbR2NBkZHxG8i4rHyISlJUo30p5PUdcAo4ChgCPBIROyfma937BQR04BpAEOHDq12\njZK01ajWHsQyYM8O80PKbR21Ak2ZuSYzW4DnKQXGOjLz5sxszMzG+vpuT8JLkjZStQJiLjAqIvaO\niEHAFKCpU58HKO09EBG7UTrktLhK9UmSOqlKQGRmGzAdmAM8A9yTmQsi4tKImFTuNgdYERELgV8C\n52XmimrUJ0laX2zOjxxtbGxM74OQpMpExLzMbOyun0NtSJIKGRCSpEIGhCSpkAEhSSpkQEiSChkQ\nkqRCBoQkqZABIUkqZEBsop/97Gfss88+jBw5ku98Z71nIHHbbbdRX1/PAQccwAEHHMAtt9zSvmzi\nxInstNNOfOxjH1tnnZaWFg499FBGjhzJqaeeyurVqwE499xz27czevRodtppp3XWW7lyJUOGDGH6\n9OkAvPXWW5x44onsu+++NDQ0cOGFF/b2x5e0BTMgNsE777zDOeecw0MPPcTChQu5++67Wbhw4Xr9\nTj31VObPn8/8+fM5++yz29vPO+887rjjjvX6X3DBBZx77rksWrSInXfemR/+8IcAXHPNNe3b+dKX\nvsQnP/nJdda76KKLOOKII9ZpmzFjBs8++yxPPvkkv/nNb3jooYd646NL2goYEJvg8ccfZ+TIkQwf\nPpxBgwYxZcoUHnzwwR6vP2HCBHbcccd12jKThx9+mMmTJwNwxhln8MADD6y37t13381pp53WPj9v\n3jz+/Oc/c9xxx7W3bbfddhx99NEADBo0iIMOOojW1taKPqOkrZcBsQmWLVvGnnv+fRTzIUOGsGxZ\n51HM4b777mPcuHFMnjyZl156ab3lHa1YsYKddtqJurq6Lrf54osv0tLSwjHHHAPAu+++y9e+9jWu\nvPLKLrf7+uuv8+Mf/5gJEyb0+PNJ2roZEH3s4x//OEuWLOEPf/gDxx57LGecccYmb3PWrFlMnjyZ\nAQMGAHDDDTfw0Y9+lCFDhhT2b2tr47TTTuPLX/4yw4cP3+T3l7R16E9PlNvsDB48eJ09gtbWVgYP\nXvdJqrvuumv79Nlnn83555+/wW3uuuuuvP7667S1tVFXV1e4zVmzZjFz5sz2+d/97nc8+uij3HDD\nDbz55pusXr2aHXbYof2k+bRp0xg1ahRf+cpXNvqzStr6uAexCT74wQ/ywgsv0NLSwurVq5k1axaT\nJk1ap88rr7zSPt3U1MR+++23wW1GBEcffTT33nsvALfffjsnnXRS+/Jnn32W1157jQ996EPtbXfe\neSdLly5lyZIlXHnllZx++unt4fCNb3yDN954g2uvvXaTP6+krYsBsQnq6uq4/vrrOf7449lvv/04\n5ZRTaGho4OKLL6apqfTAvOuuu46GhgbGjx/Pddddx2233da+/uGHH86nPvUpfvGLXzBkyBDmzJkD\nwBVXXMHVV1/NyJEjWbFiBWeddVb7OrNmzWLKlClERLf1tba2ctlll7Fw4UIOOuig9S6zlaQNyszN\n9nXwwQenpK3bQw89lKNHj84RI0bk5Zdf3mW/e++9N4GcO3duZmauXr06Tz/99Bw7dmzuu++++e1v\nf7u977XXXpsNDQ05ZsyYvOaaa9rbZ8yYkfvss0/uv//++YlPfCJfe+21zMxsaWnJbbfdNsePH5/j\nx4/PL37xi+3r3HXXXTl27Njcf//98/jjj8/ly5f39o+gYkBz9uB3bM1/yW/Ky4CQtm5tbW05fPjw\n/NOf/pRvv/12jhs3LhcsWLBev5UrV+bhhx+ehx56aHtA3HnnnXnqqadmZuaqVatyr732ypaWlnz6\n6aezoaEhV61alWvWrMkJEybkCy+8kJmZc+bMyTVr1mRm5vnnn5/nn39+ZpYCoqGhYb33XbNmTdbX\n17eHwnnnnZeXXHJJr/8cKtXTgPAQk6TNVk/vRbrooou44IIL2HbbbdvbIoJVq1bR1tbG3/72NwYN\nGsR73/tennnmGQ499FC222476urqOPLII7n//vsBOO6449ovQT/ssMO6va9o7S/aVatWkZmsXLmS\nPfbYoxd/An3LgJC02erJvUhPPPEEL730EieeeOI67ZMnT2b77bdn9913Z+jQocyYMYNddtmFsWPH\n8uijj7JixQreeustZs+eXXj/0q233soJJ5zQPt/S0sKBBx7IkUceyaOPPgrAwIEDufHGG9l///3Z\nY489WLhw4TrnFPs7A0LSFuvdd9/lq1/9KlddddV6yx5//HEGDBjAyy+/TEtLC1dddRWLFy9mv/32\n44ILLuC4445j4sSJHHDAAe33HK112WWXUVdXx6c//WkAdt99d5YuXcqTTz7J1VdfzdSpU1m5ciVr\n1qzhxhtv5Mknn+Tll19m3LhxXH755VX57L3BgJC02eruXqS//vWv/PGPf+Soo45i2LBhPPbYY0ya\nNInm5mbuuusuJk6cyMCBA3n/+9/Phz/8YZqbmwE466yzmDdvHo888gg777wzo0ePbt/mbbfdxk9+\n8hPuvPPO9qsJ3/Oe97Tf83TwwQczYsQInn/+eebPnw/AiBEjiAhOOeUUfvvb3/b5z6W3GBCSNlvd\n3Yv0vve9j7/85S8sWbKEJUuWcNhhh9HU1ERjYyNDhw7l4YcfBmDVqlU89thj7LvvvgC8+uqrACxd\nupT777+fqVOnAqXRm7/73e/S1NTEdttt1/4+y5cv55133gFg8eLFvPDCCwwfPpzBgwezcOFCli9f\nDsDPf/7zbu+F6k+8k1rSZqvjvUjvvPMOn//859vvRWpsbFzvxtWOzjnnHM4880waGhrITM4880zG\njRsHwMknn8yKFSsYOHAgM2fObB9af/r06bz99tsce+yxQOlE9U033cQjjzzCxRdfzMCBA9lmm224\n6aab2GWXXQC45JJLOOKIIxg4cCB77bXXOvdC9XdRuuJp89TY2JhrdwklST0TEfMys7G7fh5ikiQV\nMiAkSYWqdg4iIiYC3wcGALdk5nc6Lf8c8D1g7UXM12dmnw0cNP7KKX216S3eUzNm1boESVVQlYCI\niAHATOBYoBWYGxFNmdn5+Zw/yszp1ahJkrRh1TrEdAiwKDMXZ+ZqYBZwUjfrSJJqqFoBMRjoeK96\n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\nRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAD/CAYAAADrE0HrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGXRJREFUeJzt3X+01XWd7/HnG074i7KroOlBBBQzMUQktbllkWmiTWqa\ngmVjlkQraplLzbWmW9q9TtE1nfIXwyjL0hVnHPNXDeJdOopOpnIclQR/ESgerFEaQRF/HXjfP/Y+\np302Xzhnyzl7H+D5WGsvv/vz+Xz3973PcvNa31+fb2QmkiRVG9DoAiRJ/ZMBIUkqZEBIkgoZEJKk\nQgaEJKmQASFJKmRASJIKGRCSpEIGhCSpUFOjC9gcQ4YMyREjRjS6DEnaojzyyCMrM3Nod+O26IAY\nMWIEra2tjS5DkrYoEfF8T8Z5iEmSVMiAkCQVqltARMQxEfF0RCyJiAs2MuaTEfFYRCyKiPn1qk2S\ntKG6nIOIiIHAlcBRQBuwICJuz8zFFWPeD1wFHJOZyyNit3rUJkkqVq89iEOBJZm5NDPfBlqA46vG\nnAbcnJnLATLzpTrVJkkqUK+AaAZeqHjfVm6rtB/wPyLi3oh4JCK+XKfaJEkF+tNlrk3AIcCRwA7A\n7yPiwcx8pnJQREwFpgIMHz687kVK0raiXnsQK4C9Kt4PK7dVagPuzMzXM3MlcB9wUPUHZeaszJyQ\nmROGDu32Pg9J0rtUr4BYAIyOiJERMQiYDNxeNeY24GMR0RQROwKHAU/WqT5JUpW6HGLKzPaImA7c\nCQwEZmfmooiYVu6fmZlPRsQ8YCGwHrgmM5+oR32SpA1FZja6hndtwoQJ6VQbklSbiHgkMyd0N847\nqSVJhQwISVIhA0KSVMiAkCQVMiAkSYUMiM00b948PvjBD7Lvvvvy4x//eIP+e++9l5133plx48Yx\nbtw4fvjDH3b2nXnmmey2224ceOCBXdY59dRTO8ePGDGCcePGAfDcc8+xww47dPZNmzYNgNdee62z\nbdy4cQwZMoSzzz4bgOXLlzNx4kQOPvhgxo4dy9y5c/vqTyFpa5OZW+zrkEMOyUZqb2/PUaNG5R//\n+Md86623cuzYsblo0aIuY+6555487rjjCtefP39+PvLIIzlmzJiNbuOcc87Jiy66KDMzly1btsmx\nHcaPH5/z58/PzMyzzjorr7rqqszMXLRoUe699949+WqStmJAa/bg31j3IDbDww8/zL777suoUaMY\nNGgQkydP5rbbbuvx+kcccQS77LLLRvszkxtvvJEpU6b0+DOfeeYZXnrpJT7+8Y8DEBG8+uqrAKxe\nvZo999yzx58ladtmQGyGFStWsNdef51iatiwYaxYUT3FFDzwwAOMHTuWSZMmsWjRoh5//v3338/u\nu+/O6NGjO9uWLVvGuHHj+MQnPsH999+/wTotLS2ceuqpRAQAF154ITfccAPDhg3j2GOP5fLLL6/l\nK0rahhkQfWz8+PEsX76chQsX8q1vfYsTTjihx+vOmTOny97DHnvswfLly3nssce49NJLOe200zr3\nDjq0tLR0WWfOnDmcccYZtLW1MXfuXE4//XTWr1+/+V9M0lbPgNgMzc3NvPDCXx9z0dbWRnNz18dc\nvO9972Pw4MEAHHvssbzzzjusXLmy289ub2/n5ptv5tRTT+1s22677dh1110BOOSQQ9hnn3145pm/\nzob++OOP097eziGHHNLZdu2113LKKacA8NGPfpQ333yzR9uXJANiM3zkIx/h2WefZdmyZbz99tu0\ntLTwuc99rsuYP//5z2R5vquHH36Y9evXd/4jvyl33XUX+++/P8OGDetse/nll1m3bh0AS5cu5dln\nn2XUqFGd/dV7HFB6Zsbdd98NwJNPPsmbb76J06RL6on+9MCgLU5TUxNXXHEFn/nMZ1i3bh1nnnkm\nY8aMYebMmQBMmzaNm266iauvvpqmpiZ22GEHWlpaOs8PTJkyhXvvvZeVK1cybNgwLrroIr761a8C\nGx4qArjvvvv4/ve/z3ve8x4GDBjAzJkzu5zkvvHGGze4jPWnP/0pZ511FpdddhkRwXXXXde5fUna\nFGdzlaRtjLO5SpI2iwEhSSpkQEiSChkQkqRCBoSkLVp3E2Z2WLBgAU1NTdx0002dbZdddhljxozh\nwAMPZMqUKbz55psAnHfeeey///6MHTuWE088kVWrVnX5rOXLlzN48GAuueQSANauXctxxx3H/vvv\nz5gxY7jgggs6x1566aUccMABjB07liOPPJLnn3++N79+nzIgJG2x1q1bxze/+U3uuOMOFi9ezJw5\nc1i8eHHhuO9+97scffTRnW0rVqzg5z//Oa2trTzxxBOsW7eOlpYWAI466iieeOIJFi5cyH777ceP\nfvSjLp93zjnnMGnSpC5t5557Lk899RSPPvoov/vd77jjjjsAOPjgg2ltbWXhwoWcfPLJnH/++b39\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -644,14 +677,8 @@ } ], "source": [ - "print(program_to_text(program[0:2]))\n", - "\n", - "out = run_program(program[0:2],api,device,shots,max_credits=3)\n", - "jobids=[out['id']]\n", - "results=combine_jobs(jobids, api, wait=20, timeout=240) \n", - "\n", - "data=get_data(results,0)\n", - "plot_histogram(data)" + "results = Q_program.execute(circuits[0:2], device, shots, max_credits=3, wait=10, timeout=240)\n", + "plot_histogram(Q_program.get_data(results,0))" ] }, { @@ -670,9 +697,9 @@ "outputs": [ { "data": { - "image/png": "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\nJKnQ/wc7QdV0dnkqcQAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -680,8 +707,7 @@ } ], "source": [ - "data=get_data(results,1)\n", - "plot_histogram(data)" + "plot_histogram(Q_program.get_data(results,1))" ] }, { @@ -702,35 +728,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "OPENQASM 2.0;\n", - "include \"qelib1.inc\";\n", - "qreg q[2];\n", - "creg c[2];\n", - "u2(0.0,3.141592653589793) q[0];\n", - "cx q[0],q[1];\n", - "measure q[1] -> c[1];\n", - "\n", - "\n", - "OPENQASM 2.0;\n", - "include \"qelib1.inc\";\n", - "qreg q[2];\n", - "creg c[2];\n", - "u2(0.0,3.141592653589793) q[0];\n", - "cx q[0],q[1];\n", - "u2(0.0,3.141592653589793) q[1];\n", - "measure q[1] -> c[1];\n", - "\n", - "\n", - "\n", - "status = {'RUNNING': 1} (0 seconds)\n", - "status = {'COMPLETED': 1} (20 seconds)\n" + "status = RUNNING (10 seconds)\n", + "status = RUNNING (20 seconds)\n" ] }, { "data": { - "image/png": "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\nICRJhf4/0/7RjkZvuzQAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAD/CAYAAADrE0HrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGVJJREFUeJzt3Xu0lXW97/H317W0nZomgqbAamHgbQmY4aV9yp3lBXAX\nmjYEKzPjsGlkl+MwcoxzTiNrt1NP57QrRTbbg6SZZCrIKNKGbrUYigJtxTAxAlTQjtL2sgUUVn7P\nH3Ou1WT6wFpT1pzrwvs1xhw88/f7PfP5LgZzfXguv+eJzESSpGp79HYBkqS+yYCQJBUyICRJhQwI\nSVIhA0KSVMiAkCQVMiAkSYUMCElSIQNCklSoubcL2BWDBw/O1tbW3i5DkvqV5cuXb8zMIV2N69cB\n0drayrJly3q7DEnqVyLiqe6Ma9ghpogYHxGrImJ1RFy2gzEfiohHImJlRNzfqNokSW/WkD2IiGgC\nrgFOA9YDSyNiYWY+XjHmncBMYHxmPh0RBzWiNklSsUbtQZwArM7MNZm5FZgHTKoacz5we2Y+DZCZ\nzzeoNklSgUYFxFDgmYr368ttlQ4HDoiI+yJieURc0KDaJEkF+tJJ6mbgfcBHgLcDD0bEksx8snJQ\nREwDpgG0tLQ0vEhJ2l00ag9iAzC84v2wclul9cBdmbkpMzcCvwbGVn9QZs7OzHGZOW7IkC6v0pIk\nvUWNCoilwKiIGBERewGTgYVVY+4APhARzRGxN3Ai8PsG1SdJqtKQQ0yZ2R4RFwN3AU3AnMxcGRHT\ny/2zMvP3EXEnsAJ4A7guM3/XiPokSW8W/fmZ1OPGjUsnyklSbSJieWaO62qc92KSJBUyICRJhQwI\nSVIhA0KSVMiAkCQVMiAkSYUMCElSIQNiF915550cccQRjBw5kiuuuOJN/ffddx/7778/xx57LMce\neyzf/OY3O/suuugiDjroII455pjt1vnqV7/KkUceyZgxYzj77LN56aWXOvtWrFjB+9//ftra2hg9\nejSvvfYaAD/96U8ZM2YMbW1tfO1rX+scP3fuXIYMGdK5/euuu66n/wokDVSZ2W9f73vf+7I3tbe3\n52GHHZZ//OMf8/XXX88xY8bkypUrtxtz77335plnnlm4/v3335/Lly/Ptra27drvuuuu3LZtW2Zm\nzpgxI2fMmJGZmdu2bcvRo0fnI488kpmZGzduzPb29ty4cWMOHz48n3/++czMvOCCC/Luu+/OzMzr\nr78+v/CFL/TcDy2p3wOWZTd+x7oHsQsefvhhRo4cyWGHHcZee+3F5MmTueOOO7q9/sknn8ygQYPe\n1H766afT3Fy6C8pJJ53E+vXrAfjVr37FmDFjGDu2dA/DAw88kKamJtasWcOoUaPouHnhqaeeym23\n3barP56k3ZwBsQs2bNjA8OF/vUntsGHD2LCh+ia18MADDzBmzBgmTJjAypUra9rGnDlzmDBhAgBP\nPvkkEcEZZ5zBcccdx1VXXQXAyJEjWbVqFevWraO9vZ0FCxbwzDN/ffzGbbfdxujRozn33HO3a5ek\nnTEg6uy4447j6aefZsWKFXzxi1/krLPO6va63/72t2lubuaTn/wkAO3t7SxevJibbrqJxYsXM3/+\nfO655x4OOOAArr32Ws477zw++MEP0traSlNTEwAf/ehHWbduHY899hinnXYan/nMZ+ryc0oaeAyI\nXTB06NDt/ke+fv16hg7d/kF5++23H/vuuy8AEydOZNu2bWzcuLHLz547dy4///nPuemmm4gIoLSH\ncvLJJzN48GD23ntvJk6cyG9/+1ugFAQPPfQQDz74IEcccQSHH344UDoM9ba3vQ2AqVOnsnz58l3/\nwSXtFgyIXXD88cfzhz/8gbVr17J161bmzZvHxz72se3G/OlPfyLLd8x9+OGHeeONNzjwwAN3+rl3\n3nknV111FQsXLmTvvffubD/jjDN47LHH2Lx5M+3t7dx///0cffTRADz/fOkR3i+++CIzZ85k6tSp\nADz33HOd6y9cuJCjjjpq139wSbuFvvTI0X6nubmZq6++mjPOOIO//OUvXHTRRbS1tTFr1iwApk+f\nzq233sq1115Lc3Mzb3/725k3b17nHsGUKVO477772LhxI8OGDePyyy/nc5/7HBdffDGvv/46p512\nGlA6UT1r1iwOOOAALrnkEo4//ngigokTJ3LmmWcC8OUvf5lHH30UgK9//eudexA/+MEPWLhwIc3N\nzQwaNIi5c+c2+G9JUn/l8yAkaTfj8yAk7Ra6mqzaYenSpTQ3N3Prrbd2tn3ve9+jra2NY445hilT\npnROPD3vvPM6J5e2trZy7LHHAqXDxB3tY8eOZf78+Z2ftXz5ckaPHs3IkSP50pe+1HlouV9PVu3O\nZIm++urtiXKSeld3Jqt2jDvllFNywoQJ+bOf/SwzM9evX5+tra25efPmzMz8xCc+kddff/2b1r3k\nkkvy8ssvz8zMTZs2dU5iffbZZ3PIkCGd748//vh88MEH84033sjx48fnokWLMrNvTlbFiXKSBrru\nTlb94Q9/yDnnnMNBBx20XXt7eztbtmyhvb2dzZs3c+ihh27Xn5nccsstTJkyBYC99967cxLra6+9\n1nk+8bnnnuOVV17hpJNOIiK44IILWLBgQT1+5IYyICT1W92ZrLphwwbmz5/P5z//+e3ahw4dyqWX\nXkpLSwuHHHII+++/P6effvp2Y37zm99w8MEHM2rUqM62hx56qPNeaLNmzaK5uZkNGzYwbNiwHdbR\nXyerGhCSBrSvfOUrXHnlleyxx/a/7l588UXuuOMO1q5dy7PPPsumTZv48Y9/vN2Ym2++uXPvocOJ\nJ57IypUrWbp0Kd/5znc6z1vsSH+erOplrpL6re5MVl22bBmTJ08GYOPGjSxatIjm5ma2bdvGiBEj\nOu9h9vGPf5wHHniAT33qU0Dp8NPtt9++w8mlRx11FPvuuy+/+93vGDp0aOc906rrqJz3NHXqVGbM\nmNEDP3ljuAchqd/qzmTVtWvXsm7dOtatW8e5557LzJkzOeuss2hpaWHJkiVs3ryZzOSee+7ZbiLp\n3XffzZFHHrndoaO1a9fS3t4OwFNPPcUTTzxBa2srhxxyCPvttx9LliwhM7nhhhuYNGkS0L8nq7oH\nIanf6s5k1R058cQTOffccznuuONobm7mve99L9OmTevsnzdv3psOLy1evJgrrriCPffckz322IOZ\nM2cyePBgAGbOnMmFF17Ili1bmDBhQudNNvvzZFUnyknSbsaJcpKkXdKwQ0wRMR74PtAEXJeZV1T1\nfwi4A1hbbro9M79JnYz97uR6ffSA9+il83q7BEkN0JCAiIgm4BrgNGA9sDQiFmbm41VDf5OZf9+I\nmiRJO9eoQ0wnAKszc01mbgXmAZMatG1J0lvQqIAYClROH1xfbqv2txGxIiJ+GRFtjSlNklSkL13m\n+lugJTNfjYiJwAJgVPWgiJgGTANoaWlpbIWStBtp1B7EBmB4xfth5bZOmflKZr5aXl4E7BkRg6s/\nKDNnZ+a4zBzXMQNSktTzGhUQS4FRETEiIvYCJgMLKwdExLuifGvEiDihXNufG1SfJKlKQw4xZWZ7\nRFwM3EXpMtc5mbkyIqaX+2cB5wKfj4h2YAswOfvzLD5J6ucadg6ifNhoUVXbrIrlq4GrG1WPJGnn\n+tJJakm7GSesvnWNmLDqrTYkSYUMCElSIQNCklTIgJAkFTIgJEmFDAhJUiEDQpJUyICQJBUyICRJ\nhQwISVIhA0KSVMiAkCQVMiAkSYUMCElSIQNCklTIgJAkFTIgJEmFDAhJUiEDQpJUyICQJBUyICRJ\nhQwISVIhA0KSVMiAkCQVMiAkSYUMCElSoYYFRESMj4hVEbE6Ii7bybjjI6I9Is5tVG2SpDdrSEBE\nRBNwDTABOBqYEhFH72DclcCvGlGXJGnHuh0QETEkIvYtLzdFxGcj4jMR0Z3POAFYnZlrMnMrMA+Y\nVDDui8BtwPPdrUuSVB+17EH8HBhVXv42cCnw34D/3Y11hwLPVLxfX27rFBFDgbOBa3f2QRExLSKW\nRcSyF154oZulS5JqVUtAHA48Ul7+FKXDRR8GJvdQLf8MfC0z39jZoMycnZnjMnPckCFDemjTkqRq\nzTWM/QuwV0QcDrycmU+XDy/t2411NwDDK94PK7dVGgfMiwiAwcDEiGjPzAU11ChJ6iG1BMQvgVuA\nAymdQ4DSCefqX/RFlgKjImJEefxk4PzKAZk5omM5IuYCPzccJKn31BIQU4HPANuAG8ttg4FvdLVi\nZrZHxMXAXUATMCczV0bE9HL/rFqKliTVX7cDIjNfB2aXDysdDDyXmffVsP4iYFFVW2EwZOaF3f1c\nSVJ91HKZ6zsj4ifAa8DqctvHIuIf61WcJKn31HIV0yzgZeDdwNZy24PAeT1dlCSp99VyDuIjwKGZ\nuS0iEiAzX4iIg+pTmiSpN9WyB/EypZPSnSKiBXiuRyuSJPUJtQTEdcBtEXEKsEdEvB/4EaVDT5Kk\nAaaWQ0xXAlso3XRvT2AO8C/A9+tQlySpl9VymWtSCgMDQZJ2AzsNiIg4OTN/XV7+8I7GZea/9XRh\nkqTe1dUexEzgmPLy/93BmAQO67GKJEl9wk4DIjOPqVgesbOxkqSBpZaZ1HfsoP32nitHktRX1HKZ\n6yk7aP9QD9QhSepjuryKKSK+WV7cq2K5w2HAUz1elSSp13XnMteOB/3swfYP/UlKjxH9Rg/XJEnq\nA7oMiMz8LEBEPJCZ/1r/kiRJfUFX8yBaM3Nd+e09EVF4OWtmrunpwiRJvaurPYjHgHeUl1dTOqwU\nVWOS0lPiJEkDSFfzIN5RsVzLFU+SpH7OX/qSpEJdnYP4DaVDSDuVmSf3WEWSpD6hq3MQ1zWkCklS\nn9PVOYgfNaoQSVLf0tUhpk9n5o3l5Yt2NC4z5/R0YZKk3tXVIaYpwI3l5U/vYExSerqcJGkA6eoQ\n08SK5R3drE+SNADV8kxqIuKdwJnAocCzwC8y86V6FCZJ6l21PA/iw8A64EvA8cAXgXUR8ZFurj8+\nIlZFxOqIuKygf1JErIiIRyJiWUR8oLu1SZJ6Xi17EFcD0zLzlo6GiPgEcA1w5M5WjIim8rjTgPXA\n0ohYmJmPVwy7B1iYmRkRY4BbuvpcSVL91DKT+lDgtqq2+cC7urHuCcDqzFyTmVuBecCkygGZ+Wpm\ndkzK24duTNCTJNVPLQFxI/CFqrbPAzd0Y92hlJ4d0WF9uW07EXF2RDwB/ALY4WW1kqT6q+VWG3sA\n0yNiBrCB0i/4g4ElPVVMZs4H5kfEycC3gFMLapoGTANoaWnpqU1LkqrUequNt/rAoA1s/zS6YeW2\nQpn564g4LCIGZ+bGqr7ZwGyAcePGeRhKkuqkUbfaWAqMiogRlIJhMnB+5YCIGAn8sXyS+jjgbcCf\ne2j7kqQa1ToP4mBKJ5wHU/HgoK5utZGZ7RFxMXAXpYcLzcnMlRExvdw/CzgHuCAitgFbgPMqTlpL\nkhqs2wEREWcBPwb+ALQBK4FjgMV041YbmbkIWFTVNqti+Urgyu7WI0mqr1quYvpH4LOZ+V5gU/nP\nacDyulQmSepVtQRES2b+rKrtR8AFPViPJKmPqCUgni+fg4DSLTbeD7yH0jkFSdIAU0tA/CvQcX+k\n7wH3Ao8CM3u6KElS7+v2SerySeSO5Rsi4j5gn8z8fT0KkyT1rlovc20CTuKvt/vusVnUkqS+pZbL\nXMcAC4C/oXQvpWHAaxFxdmY+Wqf6JEm9pJZzEHMo3bJ7aGaeQOleTFfj40YlaUCqJSAOB/65Y3Zz\n+c/vA6PqUZgkqXfVEhCLgI9VtX2U0q25JUkDTFe3+76Rv97uuwmYFxHLKT3bYTjwPuCOulYoSeoV\nXZ2kXl31/ncVy49TuvmeJGkA6up235c3qhBJUt9S6zyID1G699JQSs91uDEz761DXZKkXtbtk9QR\nMRW4BfgTcDvwHHBzRPzXOtUmSepFtexBzABOq5wUFxE/BW7jrT+KVJLUR9VymeuBlE5MV1oFDOq5\nciRJfUUtAbEY+D8RsTdAROwD/C/ggXoUJknqXbUExHRgDPByRPw/4CVgLPAP9ShMktS7unUOIiIC\neDvwEeBdlO/mmpnr61ibJKkXdSsgMjMj4jHgHeVQMBgkaYCr5RDTv1O6YZ8kaTdQy2Wu9wF3RsRc\nSvdi6rhHE5npLb8laYCpJSD+C7AW+Luq9sRnQkjSgNNlQJQva/0fwKvAb4F/yszX612YJKl3decc\nxDWUnvvwe+Ac4Lt1rUiS1Cd0JyDGA6dn5gxgAvD3b2VDETE+IlZFxOqIuKyg/5MRsSIiHouIByJi\n7FvZjiSpZ3QnIPbJzOcAMvMZYP9aNxIRTZT2RCYARwNTIuLoqmFrgb/LzNHAt4DZtW5HktRzunOS\nujkiTgFiB+/JzH/r4jNOAFZn5hqAiJgHTKLi3k6ZWXnLjiXAsG7UJkmqk+4ExPNsf5XSn6veJ3BY\nF58xlNKlsR3WAyfuZPzngF92ozZJUp10GRCZ2dqAOjqV904+B3xgB/3TgGkALS0tDaxMknYvtcyk\n3hUbgOEV74eV27YTEWOA64BJmfnnog/KzNmZOS4zxw0ZMqQuxUqSGhcQS4FRETEiIvYCJgMLKwdE\nRAulJ9V9OjOfbFBdkqQdqOmZ1G9VZrZHxMXAXUATMCczV0bE9HL/LODrlB5KNLN081jaM3NcI+qT\nJL1ZQwICIDMXAYuq2mZVLE8FpjaqHknSzjXqEJMkqZ8xICRJhQwISVIhA0KSVMiAkCQVMiAkSYUM\nCElSIQNCklTIgJAkFTIgJEmFDAhJUiEDQpJUyICQJBUyICRJhQwISVIhA0KSVMiAkCQVMiAkSYUM\nCElSIQNCklTIgJAkFTIgJEmFDAhJUiEDQpJUyICQJBUyICRJhQwISVKhhgVERIyPiFURsToiLivo\nPzIiHoyI1yPi0kbVJUkq1tyIjUREE3ANcBqwHlgaEQsz8/GKYf8BfAk4qxE1SZJ2rlF7ECcAqzNz\nTWZuBeYBkyoHZObzmbkU2NagmiRJO9GogBgKPFPxfn25rWYRMS0ilkXEshdeeKFHipMkvVm/O0md\nmbMzc1xmjhsyZEhvlyNJA1ajAmIDMLzi/bBymySpj2pUQCwFRkXEiIjYC5gMLGzQtiVJb0FDrmLK\nzPaIuBi4C2gC5mTmyoiYXu6fFRHvApYB+wFvRMRXgKMz85VG1ChJ2l5DAgIgMxcBi6raZlUs/4nS\noSdJUh/Q705SS5Iaw4CQJBUyICRJhQwISVIhA0KSVMiAkCQVMiAkSYUMCElSIQNCklTIgJAkFTIg\nJEmFDAhJUiEDQpJUyICQJBUyICRJhQwISVIhA0KSVMiAkCQVMiAkSYUMCElSIQNCklTIgJAkFTIg\nJEmFDAhJUiEDQpJUyICQJBVqWEBExPiIWBURqyPisoL+iIgflPtXRMRxjapNkvRmDQmIiGgCrgEm\nAEcDUyLi6KphE4BR5dc04NpG1CZJKtaoPYgTgNWZuSYztwLzgElVYyYBN2TJEuCdEXFIg+qTJFVp\nVEAMBZ6peL++3FbrGElSgzT3dgG1iohplA5BAbwaEat6s546Ggxs7O0iisRXf9rbJUiN0Ge/g7DL\n38N3d2dQowJiAzC84v2wclutY8jM2cDsni6wr4mIZZk5rrfrkHZXfgcbd4hpKTAqIkZExF7AZGBh\n1ZiFwAXlq5lOAl7OzOcaVJ8kqUpD9iAysz0iLgbuApqAOZm5MiKml/tnAYuAicBqYDPw2UbUJkkq\nFpnZ2zWoQERMKx9Ok9QL/A4aEJKkHfBWG5KkQgaEJKmQAVEHETEoIuZHxKaIeCoizq/o+0hEPBER\nmyPi3oh4d0VfRMSVEfHn8uvKiIiK/tbyOpvLn3Fq1XbPL29vU0QsiIhBjfmJpb6ljt/Bb0XEYxHR\nHhHfKNjugPoOGhD1cQ2wFTgY+CRwbUS0RcRg4HbgfwKDgGVA5WyXacBZwFhgDPBR4B8q+m8G/h04\nEPjvwK0RMQQgItqAfwE+Xd7uZmBmnX4+qa+r13dwNTAD+EX1Bgfid9CT1D0sIvYBXgSOycwny203\nAM8Ca4ALM/NvK8ZuBN6bmU9ExAPA3I4rJyLiImBaZp4UEYcDjwGDM/M/y/2/Bn6SmbMi4p+A1sw8\nv9z3HuD3wIEd46XdQb2+g1Xb+DGl+8t9o6JtwH0H3YPoeYcD7R3/MMseBdrKr0c7GjNzE6X/kbSV\nm7brr1ivo29N1T+06v7Kz/4j8Hq5Hml3Uq/vYFcG3HfQgOh5+wKvVLW9Aryj3PfyDvoo6H8F2Ld8\nDLTWdav7pd1Fvb6D3dnugPoOGhA971Vgv6q2/YH/7KKvaN39gVezdByw1nWr+6XdRb2+g7uy3X7J\ngOh5TwLNETGqom0ssLL8GtvRWD7++Z5yO9X9Fet19B0WEe/YSX/lZ78H2Ktcj7Q7qdd3sCsD7zuY\nmb56+EXpgUg3A/sAH6C029kGDCkvnwP8DXAVsKRivemUTmoNLb8eB6ZX9C8Bvlte9+PAS8CQcl8b\npd3ZD5a3+xNgXm//Xfjy1RuvOn4H9yyv9xPgH8vLTeW+Afcd7PUCBuKL0uVzC4BNwNPA+RV9pwJP\nAFuA+yhd9dDRF+V/sP9Rfl1F+Uqzcn9reZ0twCrg1Krtnl/e3ibgDmBQb/9d+PLVG686fgfnAln1\nurCif0B9B73MVZJUyHMQkqRCBoQkqZABIUkqZEBIkgoZEJKkQgaEJKmQASFJKmRASJIKGRCSpEL/\nH5RRxayc8jUvAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -738,9 +744,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAD/CAYAAADrE0HrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGfZJREFUeJzt3XuUXWWZ5/HvQ2LCcGlBUl5ywRCSALlDigRwgCgygIzF\nxTQGaUUkkxFhuhUR0muEJbTdg6I4Li4KAooZpUSxTTmmYVgQlqDYpLgTEAgkmAoIAQICjQlFnvnj\nnBQnlV2pOkmdU1XJ97PWWez97nfv8+zAyY+9332JzESSpM526OsCJEn9kwEhSSpkQEiSChkQkqRC\nBoQkqZABIUkqZEBIkgoZEJKkQgaEJKnQ4L4uYGsMGzYsR48e3ddlSNKAcu+9976YmQ3d9RvQATF6\n9GhaW1v7ugxJGlAi4pme9PMUkySpkAEhSSpkQEiSChkQkqRCBoQkqZABIUkqZEBIkgoZEJKkQgaE\nJKmQASFJKmRASJIKGRCSpEIGhCSpkAEhSSpkQEiSChkQkqRCBsRWuPnmm9lnn30YO3YsF1988SbL\nf/SjH9HQ0MC0adOYNm0a11xzDQCLFy/uaJs2bRo77rgjv/rVrwA45ZRT2GeffZg0aRKf+9zneOut\ntwD4yU9+wpQpU5g8eTKHHHIIDz74YMf3vPLKK8yePZt9992X/fbbj7vvvrtj2WWXXca+++7LxIkT\nOffcc2v5xyFpW5OZA/Yzffr07Cvt7e05ZsyYfOqpp3Lt2rU5ZcqUXLp06UZ9fvjDH+aZZ5652e28\n9NJLufvuu+cbb7yRmZm/+c1vcv369bl+/fqcM2dOXnnllZmZ+bvf/S5ffvnlzMxctGhRzpgxo2Mb\nn/nMZ/IHP/hBZmauXbs216xZk5mZt99+ex5xxBH517/+NTMzn3/++V7Yc0kDHdCaPfg71iOILXTP\nPfcwduxYxowZw5AhQ5gzZw4LFy6seju/+MUvOOaYY9hpp50A+NjHPkZEEBHMmDGDtrY2AA455BB2\n3313AA466KCO9ldffZXf/va3nH766QAMGTKE3XbbDYDvfe97zJ8/n6FDhwLw3ve+d+t2WtJ2xYDY\nQqtWrWLUqFEd8yNHjmTVqlWb9LvpppuYMmUKs2fPZuXKlZssb25u5uSTT96k/a233mLBggUcffTR\nmyy79tprOeaYYwBYvnw5DQ0NnHbaaey///7MnTuXN954A4AnnniCO++8k5kzZ3L44YezZMmSLd5f\nSdsfA6KGPv7xj7NixQoeeughjjzySE499dSNlj/33HM8/PDDHHXUUZus+4UvfIHDDjuMQw89dKP2\nxYsXc+211/KNb3wDgPb2du677z7OOOMM7r//fnbeeeeO8ZD29nZefvll/vCHP3DJJZdw0kknUTq6\nlKTuGRBbaMSIERsdEbS1tTFixIiN+uyxxx4dp3fmzp3Lvffeu9HyG2+8kRNOOIF3vetdG7VfeOGF\nrF69mksvvXSj9oceeoi5c+eycOFC9thjD6B05DJy5EhmzpwJwOzZs7nvvvs6lp144okdp6t22GEH\nXnzxxV7Ye0nbg7oFREQcHRGPR8SyiJjfRZ+TIuLRiFgaET+tV21b4sADD+TJJ59k+fLlrFu3jubm\nZpqamjbq89xzz3VMt7S0sN9++220/IYbbtjk9NI111zDLbfcwg033MAOO7zzr+dPf/oTJ554IgsW\nLGD8+PEd7e9///sZNWoUjz/+OAC33XYbEyZMAOD4449n8eLFQOl007p16xg2bFgv7L2k7UJPRrK3\n9gMMAp4CxgBDgAeBCZ36jAPuB3Yvz7+3u+325VVMmaUrjsaNG5djxozJr3/965mZef755+fChQsz\nM3P+/Pk5YcKEnDJlSs6aNSsfe+yxjnWXL1+ew4cPz7fffnujbQ4aNCjHjBmTU6dOzalTp+aFF16Y\nmZmnn3567rbbbh3tlft+//335/Tp03Py5Ml53HHHdVzttHbt2jzllFNy4sSJuf/+++dtt91W0z8P\nSQMDPbyKKbIO56Qj4mDga5l5VHn+H8vh9L8q+nwTeCIzr+npdhsbG7O1tbW3y5WkbVpE3JuZjd31\nq9cpphFA5SU8beW2SuOB8RHxu4j4Q0RsevmOJKluBvd1ARUGUzrNNAsYCfw2IiZn5iuVnSJiHjAP\nYM8996x3jZK03ajXEcQqYFTF/MhyW6U2oCUz38rM5cATlAJjI5l5dWY2ZmZjQ0NDzQqWpO1dvQJi\nCTAuIvaKiCHAHKClU59fUTp6ICKGUTrl9HSd6pMkdVKXgMjMduAs4BbgMeDGzFwaERdFxIZrQ28B\nXoqIR4HFwFcy86V61CdJ2lRdrmKqFa9ikqTq9bermCRJA4wBIUkqZEBIkgoZEJKkQv3pRrm6mvqt\nOX1dwoD14DnNfV2CpDrwCEKSVMiAkCQVMiAkSYUMCElSIQNCklTIgJAkFTIgJEmFDAhJUiEDQpJU\nyICQJBUyICRJhQwISVIhA0KSVMiAkCQVMiAkSYUMCElSIQNCklTIgJAkFapbQETE0RHxeEQsi4j5\nBcs/GxGrI+KB8mduvWqTJG2qLu+kjohBwBXAkUAbsCQiWjLz0U5df5aZZ9WjJknS5tXrCGIGsCwz\nn87MdUAzcFydvluStAXqFRAjgJUV823lts4+EREPRcQvImJU0YYiYl5EtEZE6+rVq2tRqySJ/jVI\n/WtgdGZOAW4Fri/qlJlXZ2ZjZjY2NDTUtUBJ2p7UKyBWAZVHBCPLbR0y86XMXFuevQaYXqfaJEkF\n6hUQS4BxEbFXRAwB5gAtlR0i4gMVs03AY3WqTZJUoC5XMWVme0ScBdwCDAKuy8ylEXER0JqZLcDf\nR0QT0A68DHy2HrVJkorVJSAAMnMRsKhT2wUV0/8I/GO96pEkbV5/GqSWJPUjBoSkAe3mm29mn332\nYezYsVx88cVd9rvpppuICFpbWwG49dZbmT59OpMnT2b69OncfvvtALz22mtMmzat4zNs2DC++MUv\nAvClL32po338+PHstttuADzzzDMccMABTJs2jYkTJ/L9739/k+9vampi0qRJvb37NVW3U0yS1Nve\nfvttzjzzTG699VZGjhzJgQceSFNTExMmTNio32uvvcZ3v/tdZs6c2dE2bNgwfv3rXzN8+HAeeeQR\njjrqKFatWsWuu+7KAw880NFv+vTpnHjiiQB85zvf6Wi/7LLLuP/++wH4wAc+wN13383QoUN5/fXX\nmTRpEk1NTQwfPhyAX/7yl+yyyy41+3OoFY8gJA1Y99xzD2PHjmXMmDEMGTKEOXPmsHDhwk36nX/+\n+Zx33nnsuOOOHW37779/x1/gEydO5M0332Tt2rUbrffEE0/wwgsvcOihh26yzRtuuIGTTz4ZgCFD\nhjB06FAA1q5dy/r16zv6vf7661x66aV89atf3fodrjMDQtKAtWrVKkaNeucWq5EjR7Jq1Ua3WHHf\nffexcuVKjj322C63c9NNN3HAAQd0/CW/QXNzM5/85CeJiI3an3nmGZYvX85HPvKRjraVK1cyZcoU\nRo0axXnnndcRPueffz5f/vKX2WmnnbZ4P/uKASFpm7V+/XrOPvtsvv3tb3fZZ+nSpZx33nlcddVV\nmyxrbm7uOEro3D579mwGDRrU0TZq1Cgeeughli1bxvXXX8/zzz/PAw88wFNPPcUJJ5zQOztUZ45B\nSBqwRowYwcqV7zzmra2tjREj3nnM22uvvcYjjzzCrFmzAPjzn/9MU1MTLS0tNDY20tbWxgknnMCP\nf/xj9t577422/eCDD9Le3s706Zs+1KG5uZkrrriisKbhw4czadIk7rzzTlavXk1rayujR4+mvb2d\nF154gVmzZnHHHXds/c7XgUcQkgasAw88kCeffJLly5ezbt06mpubaWpq6lj+7ne/mxdffJEVK1aw\nYsUKDjrooI5weOWVVzj22GO5+OKL+dCHPrTJtivHGCr98Y9/ZM2aNRx88MEdbW1tbbz55psArFmz\nhrvuuot99tmHM844g2effZYVK1Zw1113MX78+AETDmBASBrABg8ezOWXX85RRx3Ffvvtx0knncTE\niRO54IILaGlp2ey6l19+OcuWLeOiiy7quHT1hRde6Fh+4403dnl6ac6cORuNSzz22GPMnDmTqVOn\ncvjhh3POOecwefLk3tvRPhKZ2dc1bLHGxsbccE1ztaZ+a04vV7P9ePCc5r4uQdJWiIh7M7Oxu349\nPoKIiIaI2KU8PSgiTouIUyPCoxBJ2gZV85f7/wXGlaf/GTgH+BLQ9eUBkqQBq5qrmMYDG24v/Dvg\nEOB1YCmloJAkbUOqCYi3gSERMR54NTP/VD69NPDuH5ckdauagPg34EZgD2DDKOUEOr0ZTpK0bagm\nIOYCpwJvAQvKbcOAr/VyTZKkfqDHAVF+X/TV5dNK7wOey8w7alWYJKlv9TggImI34EpgNqWjiJ3L\nrwidkZkD7zGFkvqc9yNtuXrcj1TNZa7fB14FPgisK7fdDXyyt4uSJPW9asYgjgCGZ+ZbEZEAmbk6\nIt5bm9IkSX2pmiOIVykNSneIiD2B53q1IklSv1BNQFwD3BQRHwZ2iIiDgespnXqSJG1jqgmIbwA/\nA64A3gVcBywEvtuTlSPi6Ih4PCKWRcT8zfT7RERkRHT7IClJUu1Uc5lrUgqDHgVCpYgYRClYjgTa\ngCUR0ZKZj3bqtyvwD8C/V/sdkqTetdmAiIjDMvO35emPdNUvM2/v5ntmAMsy8+nytpqB44BHO/X7\nJ0pHKl/pZnuSpBrr7gjiSmBSefraLvokMKab7YwAVlbMtwEzKztExAHAqMz8TUQYEJLUxzYbEJk5\nqWJ6r1oVUb47+1Lgsz3oOw+YB7DnnnvWqiRJ2u5V88KghV20/7IHq68CRlXMj2Tjh/ztSulI5Y6I\nWAEcBLQUDVRn5tWZ2ZiZjQ0NDT0tX5JUpWquYvpwF+2zerDuEmBcROwVEUOAOUDHC2Mz89XMHJaZ\nozNzNPAHoCkzt+x9opKkrdbtVUwRcVF5ckjF9AZjgGe620ZmtkfEWcAtwCDgusxcWt5ea2Zu/u3i\nkqS668llrhtODe3AxqeJktLA89d68kWZuQhY1Kntgi76zurJNiVJtdNtQGTmaQAR8fvM/EHtS5Ik\n9Qfd3QcxOjNXlGdvi4jCy1k33N8gSdp2dHcE8TClK4wAllE6rRSd+iSlcQVJ0jaku/sgdq2YruaK\nJ0nSAOdf+pKkQt2NQdxJ6RTSZmXmYb1WkSSpX+huDOKaulQhSep3uhuDuL5ehUiS+pfuTjF9OjMX\nlKc/11W/zLyutwuTJPWt7k4xnQwsKE9/uos+SentcpKkbUh3p5g+VjHd1cP6JEnboB6/chQgInYD\njgWGA88Cv8nMV2pRmCSpb1XzPoiPACuAvwcOBP4HsCIijqhNaZKkvlTNEcTlwLzMvHFDQ0T8LXAF\nsG9vFyZJ6lvV3Ek9HLipU9u/Au/vvXIkSf1FNQGxADizU9sZwI97rxxJUn9RzaM2dgA+HxHnUnqf\n9AjgfZReDypJ2sZU+6gNXxgkSdsJH7UhSSpU7X0Q7wNmAMOoeHGQj9qQpG1PjwMiIo4H/g/wJDAR\nWApMAu7CR21I0janmquYvg6clpn7A2+U/zkPuLcmlUmS+lQ1AbFnZv68U9v1wGd6sR5JUj9RTUC8\nUB6DgNIjNg4G9gYG9WTliDg6Ih6PiGURMb9g+ecj4uGIeCAi7oqICVXUJknqZdUExA+A/1ye/g6w\nGHgQuLK7FSNiEKVHchwDTABOLgiAn2bm5MycBnwTuLSK2iRJvazHg9SZ+Y2K6R9HxB3Azpn5WA9W\nnwEsy8ynASKiGTgOeLRim3+p6L8zPXgXtiSpdqq9zHUQcBDvPO67p3dRjwBWVsy3ATMLtn8mcDYw\nBPhINbVJknpXNY/7nkLpEtefA18p//PJiJjaW8Vk5hWZuTdwHvDVLuqYFxGtEdG6evXq3vpqSVIn\n1YxBXEdpHGFEZs6gdFRwOT27B2IVMKpifmS5rSvNwPFFCzLz6sxszMzGhoaGHhUuSapeNQExHvjf\nmZkA5X9+FxjXg3WXAOMiYq+IGALMAVoqO0RE5XaOpXS0IknqI9WMQSwCmii9A2KDjwO/6W7FzGyP\niLOAWyhdFntdZi6NiIuA1sxsAc6KiI8CbwFrgFOrqE2S1Mu6e9z3At65mmgQ0BwR91IacB4FTAcW\n9uSLMnMRpZCpbLugYvofel62JKnWujuCWNZp/pGK6UcpHRFIkrZB3T3u+8J6FSJJ6l+qvQ9iFqVn\nL42gdBXSgsxcXIO6JEl9rJr7IOYCNwJ/Bn4JPAfcEBH/rUa1SZL6UDVHEOcCR2bmgxsaIuJnwE34\nKlJJ2uZUcx/EHlQ8O6nsceA9vVeOJKm/qCYg7gIujYidACJiZ+AS4Pe1KEyS1LeqCYjPA1OAVyPi\neeAVYCrw32tRmCSpb/VoDCIiAvhPwBHA+yk/zTUz22pYmySpD/UoIDIzI+JhYNdyKBgMkrSNq+YU\n0/2UHtgnSdoOVHOZ6x3AzRHxI0rPYup441tm9uSR35KkAaSagPgQsBw4vFN70rN3QkiSBpBuA6J8\nWetXgdeB+4B/ycy1tS5MktS3ejIGcQWl9z48BnwC+FZNK5Ik9Qs9CYijgf+SmecCxwD/tbYlSZL6\ng54ExM6Z+RxAZq4E3l3bkiRJ/UFPBqkHR8SHgehinsy8vRbFSZL6Tk8C4gU2vkrppU7zCYzpzaIk\nSX2v24DIzNF1qEOS1M9Ucye1JGk7YkBIkgoZEJKkQnULiIg4OiIej4hlETG/YPnZEfFoRDwUEbdF\nxAfrVZskaVN1CYiIGETpjuxjgAnAyRExoVO3+4HGzJwC/AL4Zj1qkyQVq9cRxAxgWWY+nZnrgGbg\nuMoOmbk4M/+jPPsHYGSdapMkFahXQIyg9IjwDdrKbV05Hfi3ogURMS8iWiOidfXq1b1YoiSpUr8b\npI6IvwMagUuKlmfm1ZnZmJmNDQ0N9S1OkrYj1bwPYmusAkZVzI8st20kIj4K/E/gcB8pLkl9q15H\nEEuAcRGxV0QMAeYALZUdImJ/4CqgKTNfqFNdkqQu1CUgMrMdOAu4hdJ7JW7MzKURcVFENJW7XQLs\nAvw8Ih6IiJYuNidJqoN6nWIiMxcBizq1XVAx/dF61SJJ6l6/G6SWJPUPBoQkqZABIUkqZEBIkgoZ\nEJKkQgaEJKmQASFJKmRASJIKGRCSpEIGhCSpkAEhSSpkQEiSChkQkqRCBoQkqZABIUkqZEBIkgoZ\nEJKkQgaEJKmQASFJKmRASJIKGRCSpEIGhCSpUN0CIiKOjojHI2JZRMwvWH5YRNwXEe0RMbtedUmS\nitUlICJiEHAFcAwwATg5IiZ06vYn4LPAT+tRkyRp8wbX6XtmAMsy82mAiGgGjgMe3dAhM1eUl62v\nU02SpM2o1ymmEcDKivm2cpskqZ8acIPUETEvIlojonX16tV9XY4kbbPqFRCrgFEV8yPLbVXLzKsz\nszEzGxsaGnqlOEnSpuoVEEuAcRGxV0QMAeYALXX6bknSFqhLQGRmO3AWcAvwGHBjZi6NiIsiogkg\nIg6MiDbgb4GrImJpPWqTJBWr11VMZOYiYFGntgsqppdQOvUkSeoHBtwgtSSpPgwISVIhA0KSVMiA\nkCQVMiAkSYUMCElSIQNCklTIgJAkFTIgJEmFDAhJUiEDQpJUyICQJBUyICRJhQwISVIhA0KSVMiA\nkCQVMiAkSYUMCElSIQNCklTIgJAkFTIgJEmFDAhJUiEDQpJUqG4BERFHR8TjEbEsIuYXLB8aET8r\nL//3iBhdr9okSZuqS0BExCDgCuAYYAJwckRM6NTtdGBNZo4FvgN8ox61SZKK1esIYgawLDOfzsx1\nQDNwXKc+xwHXl6d/ARwREVGn+iRJndQrIEYAKyvm28pthX0ysx14FdijLtVJkjYxuK8LqFZEzAPm\nlWdfj4jH+7KeGhoGvNjXRRSJr/ysr0uQ6qHf/gZhq3+HH+xJp3oFxCpgVMX8yHJbUZ+2iBgMvBt4\nqfOGMvNq4Ooa1dlvRERrZjb2dR3S9srfYP1OMS0BxkXEXhExBJgDtHTq0wKcWp6eDdyemVmn+iRJ\nndTlCCIz2yPiLOAWYBBwXWYujYiLgNbMbAGuBRZExDLgZUohIknqI+H/pPdPETGvfDpNUh/wN2hA\nSJK64KM2JEmFDAhJUiEDogYi4j0R8a8R8UZEPBMRn6pY9qly2xsR8auIeE9P1tvadaXtSS1+gxHx\ngYhoiYhnIyI7Py+u/Dy56yLiLxHx54g4ux77WksGRG1cAawD3gecAnwvIiZGxETgKuDT5WX/AVzZ\n3XoAW7OutB3q9d8gsB64GfhEF9/5NWAcpZvQPgycGxFH9+I+1Z2D1L0sInYG1gCTMvOJctsCSjcC\nrgdGZ+anyu17A49ReqTI+q7Wy8z5EfEvW7puffZc6h9q9Rus2P5g4C1gr8xcUdH+LPDZzPx/5fl/\nAsZl5oC9ZH/APWpjABgPtG/4D6zsQeBwSv8B/n5DY2Y+FRHryuus38x6ABO3Yl1pe1Kr32CXImJ3\n4APl/pXrHr+lO9EfGBC9bxfgL53aXgV2Bd4uT3e1rKv1Nmx3S9eVtie1+g12950b+le7br9lQPS+\n14G/6dT2N8BrlP4PZUuWbc12pe1NrX6D3X3nhv5/rXLdfstB6t73BDA4IsZVtE0FlpY/Uzc0RsQY\nYGh5nc2tx1auK21PavUb7FJmrgGeq9x2T9ftzxykroGIaAYSmAtMAxYBh5QX3w0cC9xH6WqKwRsG\nsbpar/zcqolbum7Nd1jqZ2rxGywv35HS8+ReB/YFnsnMv5aXXQwcTGnc4X3AYuC0zLy51vtbM5np\np5c/wHuAXwFvAH8CPlWx7FPltjeAhcB7erLe1q7rx8/29KnhbzA7fyqWDQWuozSO8Txwdl//OWzt\nxyMISVIhxyAkSYUMCElSIQNCklTIgJAkFTIgJEmFDAhJUiEDQpJUyICQJBUyICRJhf4/3/anX1FF\nvvgAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAD/CAYAAADrE0HrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGnlJREFUeJzt3X90FfWd//HnmwSqCEqFqF+S0EhBhGCCGEC7XQSRotIF\nrNhN8Vf9UYRT3XZb29qz7dat7QJ+/Ra7AmaxX4q6rWm1IBxFbI8KyFFLIgIaFI2AkqALuIKCArn4\n3j/uJL1chuReyZ2bhNfjnDnOzOczM+/kOHkxv83dERERSdYp2wWIiEjbpIAQEZFQCggREQmlgBAR\nkVAKCBERCaWAEBGRUAoIEREJpYAQEZFQCggREQmVm+0CjkWvXr28qKgo22WIiLQrL7300i53z2up\nX7sOiKKiIqqrq7NdhohIu2Jmb6fST6eYREQklAJCRERCKSBERCSUAkJEREIpIEREJJQCQkREQikg\nREQklAJCRERCKSBERCSUAkJEREIpIEREJJQCQkREQikgREQklAJCRERCKSBERCSUAkJEREIpII7R\n8uXLGTBgAP369WPmzJlHtK9YsYJTTjmFIUOGMGTIEH7+8583te3evZvJkydz9tlnM3DgQF544QUA\n1q1bx/nnn8+QIUMoKytjzZo1AKxZs6ZpPaWlpSxevLhpXaNGjWLAgAFN7Tt27ADg7bffZsyYMZSU\nlDBq1Cjq6uoy+esQkY7E3dvtcN5553k2xWIx79u3r7/11lt+4MABLykp8ZqamsP6PPvssz5+/PjQ\n5a+99lq///773d39wIED/sEHH7i7+9ixY33ZsmXu7v7EE0/4hRde6O7u+/bt84aGBnd33759u+fl\n5TVNX3jhhV5VVXXENiZPnuwLFy50d/enn37ar7766mP8qUWkvQOqPYW/sTqCOAZr1qyhX79+9O3b\nly5dulBeXs6SJUtSWnbPnj2sWrWKG2+8EYAuXbrQo0cPAMyMDz/8sKlf7969AejatSu5ufGvxO7f\nvx8za3E7Gzdu5KKLLgJg9OjRKdcnIqKAOAb19fUUFhY2TRcUFFBfX39Ev+eff56SkhIuvfRSampq\nANiyZQt5eXlcf/31nHvuudx0003s27cPgHvuuYcf/OAHFBYWcttttzFjxoymdf31r3+luLiYc845\nh4qKiqbAALjuuusYMmQId955J/F/JEBpaSmLFi0CYPHixXz00Ue8//77rf/LEJEORwGRYUOHDuWd\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -748,16 +754,9 @@ } ], "source": [ - "print(program_to_text(program[2:4]))\n", - "out = run_program(program[2:4],api,device,shots,max_credits=3)\n", - "jobids=[out['id']]\n", - "results=combine_jobs(jobids, api, wait=20, timeout=240) \n", - "\n", - "data=get_data(results,0)\n", - "plot_histogram(data)\n", - "\n", - "data=get_data(results,1)\n", - "plot_histogram(data)" + "results = Q_program.execute(circuits[2:4], device, shots, max_credits=3, wait=10, timeout=240)\n", + "plot_histogram(Q_program.get_data(results,0))\n", + "plot_histogram(Q_program.get_data(results,1))" ] }, { @@ -780,39 +779,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "OPENQASM 2.0;\n", - "include \"qelib1.inc\";\n", - "qreg q[2];\n", - "creg c[2];\n", - "u2(0.0,3.141592653589793) q[0];\n", - "cx q[0],q[1];\n", - "measure q[1] -> c[1];\n", - "measure q[0] -> c[0];\n", - "\n", - "\n", - "OPENQASM 2.0;\n", - "include \"qelib1.inc\";\n", - "qreg q[2];\n", - "creg c[2];\n", - "u2(0.0,3.141592653589793) q[0];\n", - "cx q[0],q[1];\n", - "u2(0.0,3.141592653589793) q[0];\n", - "u2(0.0,3.141592653589793) q[1];\n", - "measure q[1] -> c[1];\n", - "measure q[0] -> c[0];\n", - "\n", - "\n", - "\n", - "status = {'RUNNING': 1} (0 seconds)\n", - "status = {'COMPLETED': 1} (20 seconds)\n" + "status = RUNNING (10 seconds)\n", + "status = RUNNING (20 seconds)\n" ] } ], "source": [ - "print(program_to_text(program[4:6]))\n", - "out = run_program(program[4:6],api,device,shots,max_credits=3)\n", - "jobids=[out['id']]\n", - "results=combine_jobs(jobids, api, wait=20, timeout=240) " + "results = Q_program.execute(circuits[4:6], device, shots, max_credits=3, wait=10, timeout=240)" ] }, { @@ -824,9 +797,9 @@ "outputs": [ { "data": { - "image/png": "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\nRYsWkZOTQ25uLoMHD458jCwWFBAiItU4deoUkyZNYsWKFRQWFrJo0SIKC6v2MRr6OuXs2bMrfVO+\nVatWvPHGG3z44Ye8+OKL3HHHHQB8/vnnPPDAA6xZs4aCggL27t3LmjVrgNBHx2bMmMG7775LQUEB\nTz31FAB//etfeffdd/nggw/46KOP2LBhA2+//TZlZWXce++9vPXWW3zwwQfk5uZGPnUcCwoIEZFq\nrF+/nszMTDp37kxaWhqjRo1i6dKlZ5R75JFHmDp1Kk2aNIlM+853vsOll14KQHZ2Nl999RXHjx9n\n165ddOnShfKeIK6//vrI54mfffZZJk2aRPPmzYHQZ40BzIxjx45x4sQJjh8/zsmTJ7nkkktwd9yd\no0eP4u4cOnQoss1YUECIiFSjtLSU9u3/2UtQu3btKC2t1EsQmzdvpri4mKFDh1a7niVLltCrVy8u\nuOACMjMz2bZtG0VFRZSVlfH6669TXBzqy3T79u1s376dq666in79+rFy5UoA+vfvz8CBA2nbti1t\n27Zl0KBBZGVl0bhxY+bNm0dOTg6XXnophYWFjB8/Pmb7r4AQETlHp0+fZsqUKcyaNavaMgUFBUyd\nOpXf/e53ADRv3px58+YxcuRIrr76ajIyMkhJSQFCnzHesWMHa9euZdGiRfzgBz/gwIED7Ny5k48/\n/piSkhJKS0t58803eeeddzh58iTz5s1jy5Yt7Nmzh9zcXGbMmBGz/Wuw70GIiNQkPT098r97gJKS\nEtLT//mlgsOHD/PRRx9xzTXXALB3717y8/NZtmwZeXl5lJSUMHz4cH7/+9/z7W9/O7LcsGHDGDZs\nGADz58+PBES7du3o27cvjRs3plOnTnTt2jUSGP369aNp06YA3Hjjjbz33nuRS1rl6/7+979/1hvp\n0dIZhIhINfr06cOOHTvYvXs3J06cYPHixeTn50fmN2vWjP3791NUVERRURH9+vWLhMOBAwcYOnQo\nM2fO5Kqrrqq03s8++wyAL774gqeffpoJE0JfWL755ptZu3YtAPv372f79u107tyZDh06RG5Knzx5\nkrfffpusrCzS09MpLCyk/NMHq1evJisrK2b7rzMIEZFqpKamMmfOHAYNGsSpU6cYN24c2dnZTJs2\njby8vEphUdWcOXPYuXMn06dPZ/r06QCsWrWKNm3acO+997J161YApk2bRteuXQEYNGgQq1atonv3\n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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAD/CAYAAADrE0HrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHcNJREFUeJzt3Xt4VPW97/H3lwTKRijaDVJMwAEDSAIhhXBxH7WyBUVa\no0g3IB5tC8oGZdcLKP2jVs7RVuzWVjZXaaVU2xI9yq3u4KVufZAql6DBAlagEMttl8tGbooY/J4/\nZoiTZEEyMLMGks/refKw5rd+a9Z3fpknH2atNb9l7o6IiEh1jdJdgIiInJ0UECIiEkgBISIigRQQ\nIiISSAEhIiKBFBAiIhJIASEiIoEUECIiEkgBISIigTLTXcCZaNWqlUcikXSXISJyTlmzZs1ed29d\nW79zOiAikQilpaXpLkNE5JxiZh/VpZ8OMYmISCAFhIiIBFJAiIhIIAWEiIgEUkCIiEggBYSIiARS\nQIiISCAFhIiIBFJAiIhIIAWEiIgEUkCIiEggBYSIiARSQIiISCAFhIiIBFJAiIhIIAWEiIgEqvcB\n8fLLL9OlSxdycnKYMmXKSfutXr2azMxMXnjhhcq2qVOn0q1bN/Ly8njyyScr2++//34uvfRS8vPz\nGTJkCB9//DEA+/bto3///jRv3pzx48dXef758+fTvXt38vPzGTRoEHv37gXgb3/7G/379+cb3/gG\n+fn5lJSUJPPli4ictnodEMePH+euu+5i6dKlbNiwgfnz57Nhw4bAfpMmTeKaa66pbFu3bh2//OUv\nWbVqFWvXruWll15i8+bNAAwcOJB169bx/vvv07lzZx599FEAmjZtysMPP8zjjz9e5fkrKiq4++67\neeONN3j//ffJz89n+vTpADzyyCMMGzaM9957j+LiYu68885UDYeISELqdUCsWrWKnJwcOnbsSJMm\nTRgxYgSLFy+u0W/atGkMHTqUCy+8sLLtgw8+oG/fvjRr1ozMzEy++c1vsmDBAgCuueYaMjOjd2vt\n168f27dvB+C8887j8ssvp2nTplWe391xd44cOYK7c/DgQS666CIAzIyDBw8CcODAgcp2EZF0q9cB\nsWPHDtq1a1f5ODs7mx07dtTos3DhQsaNG1elvVu3brz11lvs27ePTz75hJKSErZt21ZjH3PnzuW6\n6647ZR2NGzdm1qxZdO/enYsuuogNGzYwevRoACZPnsxvf/tbsrOzGTx4MNOmTTvdlysiklT1OiDq\n4p577uGxxx6jUaOqQ9G1a9fKw06DBg2ioKCAjIyMKn1+8pOfkJmZyS233HLKfXz++efMmjWL9957\nj507d5Kfn195WGr+/Pl873vfY/v27ZSUlHDrrbfyxRdfJPdFioichnodEFlZWVX+1799+3aysrKq\n9CktLWXEiBFEIhFeeOEF7rzzThYtWgTA6NGjWbNmDcuWLeOCCy6gc+fOldvNmzePl156id/97neY\n2SnrKCsrA+CSSy7BzBg2bBhvv/02AE8//TTDhg0D4LLLLuPo0aOVJ7BFRNKpXgdE79692bRpE1u3\nbuXYsWMUFxdTVFRUpc/WrVspLy+nvLyc73znO8ycOZMbb7wRgN27dwPRK40WLFjAyJEjgeiVUT/7\n2c9YsmQJzZo1q7WOrKwsNmzYwJ49ewB47bXX6Nq1KwDt27fn9ddfB6LnPY4ePUrr1q2TMwAiImcg\nM90FpFJmZibTp0/n2muv5fjx44waNYq8vDxmz54NwNixY0+5/dChQ9m3bx+NGzdmxowZnH/++QCM\nHz+ezz77jIEDBwLRE9UnnjMSiXDw4EGOHTvGokWLePXVV8nNzeWhhx7iyiuvpHHjxlx88cXMmzcP\ngCeeeII77riDX/ziF5gZ8+bNq/UTiYhIGMzd013DaSssLPTS0tJ0lyEick4xszXuXlhbv3p9iElE\nRE6fAkJERAIpIEREJFBoAWFmg8zsQzPbbGY/DFh/lZkdMLOy2M+Pw6pNRERqCuUqJjPLAGYAA4Ht\nwGozW+Lu1SdGesvdvx1GTSIicmphfYLoA2x29y3ufgwoBm4Iad8iIqftTGaEjkQidO/enYKCAgoL\nv7xoaPLkyWRlZVFQUEBBQUGVWZwfffRRcnJy6NKlC6+88goAhw4dquxbUFBAq1atuOeee4DUzggd\n1vcgsoD4iYy2A30D+v2Tmb0P7AAmuvv6MIoTEQlyYkbo1157jezsbHr37k1RURG5ubk1+lWfEfqE\nN954g1atWtVov/fee5k4cWKVtg0bNlBcXMz69evZuXMnAwYMYOPGjbRo0aJyRgaAXr16cdNNNwFf\nzgg9btw4NmzYwODBgykvL0/Cqz+7TlK/C7R393xgGrAoqJOZjTGzUjMrPfHNZBGRVDiTGaFPx+LF\nixkxYgRf+cpX6NChAzk5OaxatapKn40bN7J7926uuOIKILUzQocVEDuAdnGPs2Ntldz9oLsfji2X\nAI3NrEbsuvscdy9090JNSSEiqXQmM0JD9I/3gAED6NWrF3PmzKmybtq0aeTn5zNq1Cj2799f5/0V\nFxczfPjwyhkXUjkjdFgBsRroZGYdzKwJMAJYEt/BzL5usVdsZn1ite0LqT4RkdNyshmhAZYvX05Z\nWRlLly5lxowZLFu2DIBx48axZcsWysrKaNu2LRMmTKjz/oqLi7n55psrH6dyRuhQzkG4e4WZjQde\nATKAue6+3szGxtbPBr4DjDOzCuBTYISncB6QHo+PSNVT18naicVp3b+I1C6RGaEB9u7dS0lJCZmZ\nmdx4442VfS+88EKGDBnCqlWruPLKK2nTpk3l9nfccQff/va367S/tWvXUlFRQa9evSrbnn76aV5+\n+WWg6ozQZ3q4C0I8B+HuJe7e2d0vcfefxNpmx8IBd5/u7nnu3sPd+7n722HVJiIS5ExmhD5y5AiH\nDh0C4MiRI7z66qt069YNgF27dlVuv3Dhwsr2oqIiiouL+eyzz9i6dSubNm2iT58+lX3nz59f5dMD\npHZG6Ho9m6uIyJk4kxmh//73vzNkyBAgel/6kSNHMmjQIAAeeOABysrKMDMikQhPPfUUAHl5eQwb\nNozc3FwyMzOZMWNGlRuVPf/88zUuY03ljNANdjZXHWISkYZKs7mKiMgZUUCIiEggBYSIiARSQIiI\nSCAFhIiIBFJAiIhIIAWEiIgEUkCIiEggBYSIiATSVBsiIqehIczGoE8QIiISSAEhIiKBFBAiIhJI\nASEiIoEUECIiEkgBISIigRQQIiISSAEhIiKBFBAiIhJIASEiIoEUECIiEkgBISIigRQQIiISSAEh\nIiKBFBAiIhJIASEiIoFCCwgzG2RmH5rZZjP74Sn69TazCjP7Tli1iYhITaEEhJllADOA64Bc4GYz\nyz1Jv8eAV8OoS0RETi6sTxB9gM3uvsXdjwHFwA0B/f4NeBHYHVJdIiJyEmEFRBawLe7x9lhbJTPL\nAoYAs0KqSURETuFsOkn9JDDJ3b84VSczG2NmpWZWumfPnpBKExFpeDJD2s8OoF3c4+xYW7xCoNjM\nAFoBg82swt0XxXdy9znAHIDCwkJPWcUiIg1cWAGxGuhkZh2IBsMIYGR8B3fvcGLZzOYBL1UPBxER\nCU8oAeHuFWY2HngFyADmuvt6MxsbWz87jDpERKTu6hwQZtYa+NTdD8cuR70N+AJ4trbzBgDuXgKU\nVGsLDAZ3/15d6xIRkdRI5CT1S0Cn2PJPgInAvcATyS5KRETSL5FDTJ2Bstjy/wb+CTgMrCcaFCIi\nUo8kEhDHgSZm1hk44O5/M7NGQPPUlCYiIumUSEAsBZ4H/pHoN6EhOm1G9ctVRUSkHkgkIG4Hvgt8\nDjwba2sFTE5yTSIichaoc0C4+2fAnNhhpTbALnd/M1WFiYhIetX5KiYzO9/Mfg8cBTbH2orM7JFU\nFSciIumTyGWus4EDwMXAsVjbO8DwZBclIiLpl8g5iKuBi9z9czNzAHffY2YXpqY0ERFJp0Q+QRwg\nelK6kpm1B3YltSIRETkrJBIQvwJeNLP+QCMzuwz4DdFDTyIiUs8kcojpMeBTorcObQzMBZ4Cpqag\nLhERSbNELnN1omGgQBARaQBOGRBmdqW7L4st//PJ+rn7fyW7MBERSa/aPkHMBLrFlp8+SR8HOiat\nIhEROSucMiDcvVvccodT9RURkfolkW9SLz5J+4LklSMiImeLRC5z7X+S9quSUIeIiJxlar2Kycz+\nb2yxSdzyCR2Bj5JelYiIpF1dLnNtF/u3UdwyRE9Ob0PTfYuI1Eu1BoS7fx/AzN5291+mviQRETkb\n1PY9iIi7l8cevm5mgZezuvuWZBcmIiLpVdsniD8DLWLLm4keVrJqfRzISHJdIiKSZrV9D6JF3HIi\nVzyJiMg5Tn/0RUQkUG3nIN4iegjplNz9yqRVJCIiZ4XazkH8KpQqRETkrFPbOYjfhFWIiIicXWo7\nxHSruz8bWx51sn7uPre2HZnZIKL3ksgAfuXuU6qtvwF4GPgCqADucffltb4CERFJidoOMd0MPBtb\nvvUkfZzo3eVOyswyiN6JbiCwHVhtZkvcfUNct9eBJe7uZpYPPA9cWkt9IiKSIrUdYhoct3yyyfrq\nog+w+cQX6sysGLgBqAwIdz8c1/886nByXEREUieRe1JjZucD3wIuAnYC/+nuH9dh0yyi8zadsB3o\nG/D8Q4BHgQtj+wmqYQwwBqB9+/aJlC8iIglI5H4Q/wyUAz8AegP/BpSb2dXJKsbdF7r7pcCNRM9H\nBPWZ4+6F7l7YunXrZO1aRESqSeQTxHRgjLs/f6LBzP6F6LmF2s4V7KDqTLDZsbZA7r7MzDqaWSt3\n35tAjSIikiSJfJP6IuDFam0Lga/XYdvVQCcz62BmTYARwJL4DmaWY2YWW+4JfAXYl0B9IiKSRIl8\ngngWuAv4j7i2ccAztW3o7hVmNh54hehlrnPdfb2ZjY2tnw0MBW4zs8+BT4Hh7q4T1SIiaZLIVBuN\ngLFm9gDRw0NZQBtgRV125O4lQEm1ttlxy48Bj9W5chERSalEp9rQDYNERBoITbUhIiKBEv0eRBui\nX3prRdyNg+oy1YaIiJxb6hwQZnYj8FtgE5AHrAe6AcupZaoNERE59yRymesjwPfd/RvAkdi/Y4A1\nKalMRETSKpGAaO/u/69a22+A25JYj4iInCUSCYjdsXMQEJ1i4zLgEqLfaxARkXomkYD4JXB5bPkX\nwBvAWmBmsosSEZH0q/NJ6tgX2U4sP2NmbwLnufsHqShMRETSK9HLXDOAfnw53XedvkUtIiLnnkQu\nc80HFgFNid7PIRs4amZD3H1tiuoTEZE0SeQcxFyiU3tnuXsfonMxTUffgRARqZcSCYjOwJMnZliN\n/TsV6JSKwkREJL0SCYgSoKha2/XAfyavHBEROVvUNt33s3w53XcGUGxma4jeX7od0AtYnNIKRUQk\nLWo7Sb252uN1ccsbiN4ASERE6qHapvv+P2EVIiIiZ5dEvwdxFdG5l7KI3lXuWXd/IwV1iYhImtX5\nJLWZ3Q48D/w3sADYBcw3sztSVJuIiKRRIp8gHgAGxn8pzsyeA15EtyIVEal3ErnM9R+JnpiO9yHw\nteSVIyIiZ4tEAmI58HMzawZgZucB/w68nYrCREQkvRIJiLFAPnDAzP4OfAz0AP41FYWJiEh61ekc\nhJkZ8A/A1cDXic3m6u7bU1ibiIikUZ0Cwt3dzP4MtIiFgoJBRKSeS+QQ03tEJ+wTEZEGIJHLXN8E\nXjazeUTnYjoxRxPurim/RUTqmUQC4n8BW4FvVmt3dE8IEZF6p9aAiF3W+iPgMPAu8FN3/yzRHZnZ\nIKL3j8gAfuXuU6qtvwWYBBhwCBinO9WJiKRPXc5BzCB634cPgKHA44nuJHYv6xnAdUAucLOZ5Vbr\nthX4prt3Bx4G5iS6HxERSZ66BMQg4Bp3f4DoH/hvn8Z++gCb3X2Lux8DioEb4ju4+9vuvj/2cAXR\ne16LiEia1CUgznP3XQDuvg1oeRr7ySJ6YvuE7bG2kxkNLA1aYWZjzKzUzEr37NlzGqWIiEhd1OUk\ndaaZ9Sd6biDoMe7+X8kqKPbco4HLg9a7+xxih58KCws9qI+IiJy5ugTEbqpepbSv2mMHOtbyHDuI\n3qL0hOxYWxVmlg/8CrjO3ffVoTYREUmRWgPC3SNJ2M9qoJOZdSAaDCOAkfEdzKw90ftM3OruG5Ow\nTxEROQMJ3VHudLl7hZmNJ3oP6wxgrruvN7OxsfWzgR8TnVJ8ZnTqJyrcvTCM+kREpKZQAgLA3UuA\nkmpts+OWbwduD6seERE5tUTmYhIRkQZEASEiIoEUECIiEkgBISIigRQQIiISSAEhIiKBFBAiIhJI\nASEiIoEUECIiEkgBISIigRQQIiISSAEhIiKBFBAiIhJIASEiIoEUECIiEkgBISIigRQQIiISSAEh\nIiKBFBAiIhJIASEiIoEUECIiEkgBISIigRQQIiISSAEhIiKBFBAiIhJIASEiIoEUECIiEii0gDCz\nQWb2oZltNrMfBqy/1MzeMbPPzGxiWHWJiEiwzDB2YmYZwAxgILAdWG1mS9x9Q1y3/wF+ANwYRk0i\nInJqYX2C6ANsdvct7n4MKAZuiO/g7rvdfTXweUg1iYjIKYQVEFnAtrjH22NtIiJyljrnTlKb2Rgz\nKzWz0j179qS7HBGReiusgNgBtIt7nB1rS5i7z3H3QncvbN26dVKKExGRmsIKiNVAJzPrYGZNgBHA\nkpD2LSIipyGUq5jcvcLMxgOvABnAXHdfb2ZjY+tnm9nXgVLgq8AXZnYPkOvuB8OoUUREqgolIADc\nvQQoqdY2O275v4keehIRkbPAOXeSWkREwqGAEBGRQAoIEREJpIAQEZFACggREQmkgBARkUAKCBER\nCaSAEBGRQAoIEREJpIAQEZFACggREQmkgBARkUAKCEmal19+mS5dupCTk8OUKVNqrHd3fvCDH5CT\nk0N+fj7vvvsuANu2baN///7k5uaSl5fH1KlTK7cZPnw4BQUFFBQUEIlEKCgoAGDVqlWV7T169GDh\nwoU19ldUVES3bt1qtL/44ouYGaWlpcl66aFLxVhPnjyZrKysynEtKYnOrXmqsX7uuefIz88nLy+P\nSZMmVbYvW7aMnj17kpmZyQsvvJCqYZAUC202V6nfjh8/zl133cVrr71GdnY2vXv3pqioiNzc3Mo+\nS5cuZdOmTWzatImVK1cybtw4Vq5cSWZmJk888QQ9e/bk0KFD9OrVi4EDB5Kbm8tzzz1Xuf2ECRNo\n2bIlAN26daO0tJTMzEx27dpFjx49uP7668nMjL6lFyxYQPPmzWvUeejQIaZOnUrfvn1TPCKpk6qx\nBrj33nuZOHFilf2dbKwPHDjA/fffz5o1a2jdujXf/e53ef3117n66qtp37498+bN4/HHHw91bCS5\n9AlCkmLVqlXk5OTQsWNHmjRpwogRI1i8eHGVPosXL+a2227DzOjXrx8ff/wxu3btom3btvTs2ROA\nFi1a0LVrV3bsqHrDQXfn+eef5+abbwagWbNmlWFw9OhRzKyy7+HDh/n5z3/Oj370oxp1Pvjgg0ya\nNImmTZsm9fWHKdVjXd3JxnrLli106tSJE3d2HDBgAC+++CIAkUiE/Px8GjXSn5hzmX57khQ7duyg\nXbsv7yqbnZ1d4w9PXfqUl5fz3nvv1fgf/ltvvUWbNm3o1KlTZdvKlSvJy8uje/fuzJ49u/KP2IMP\nPsiECRNo1qxZled499132bZtG9/61rfO7MWmWSrHetq0aeTn5zNq1Cj2799f2R401jk5OXz44YeU\nl5dTUVHBokWL2LZtW7JfrqSRAkLOGocPH2bo0KE8+eSTfPWrX62ybv78+ZWfHk7o27cv69evZ/Xq\n1Tz66KMcPXqUsrIy/vrXvzJkyJAqfb/44gvuu+8+nnjiiZS/jnNB0FiPGzeOLVu2UFZWRtu2bZkw\nYUJl/6CxvuCCC5g1axbDhw/niiuuIBKJkJGRka6XJCmggJCkyMrKqvK/x+3bt5OVlVXnPp9//jlD\nhw7llltu4aabbqqyXUVFBQsWLGD48OGB++7atSvNmzdn3bp1vPPOO5SWlhKJRLj88svZuHEjV111\nFYcOHWLdunVcddVVRCIRVqxYQVFR0Tl5ojpVY92mTRsyMjJo1KgRd9xxB6tWraqx7/ixBrj++utZ\nuXIl77zzDl26dKFz585Jfa2SXgoISYrevXuzadMmtm7dyrFjxyguLqaoqKhKn6KiIp555hncnRUr\nVtCyZUvatm2LuzN69Gi6du3KfffdV+O5//jHP3LppZeSnf3lHWm3bt1KRUUFAB999BF/+ctfiEQi\njBs3jp07d1JeXs7y5cvp3Lkzb775Ji1btmTv3r2Ul5dTXl5Ov379WLJkCYWFhakdmBRI1Vjv2rWr\ncnnhwoWVV4CdbKwBdu/eDcD+/fuZOXMmt99+e6petqSBrmKSpMjMzGT69Olce+21HD9+nFGjRpGX\nl8fs2dHbjo8dO5bBgwdTUlJCTk4OzZo149e//jUAf/rTn3j22Wfp3r175WWsP/3pTxk8eDAAxcXF\nNQ4vLV++nClTptC4cWMaNWrEzJkzadWqVYivOH1SNdYPPPAAZWVlmBmRSISnnnoKOPVY33333axd\nuxaAH//4x5WfIFavXs2QIUPYv38/f/jDH3jooYdYv359qOMkZ87cPd01nLbCwkI/3UMEPR4fkeRq\nErN2YnFa9y8iZ+Zc/htiZmvcvdaPzzrEJCIigXSISVLuXP6f1rlGYy3JpE8QIiISSAEhIiKBFBAi\nIhJIASEiIoEUECIiEii0gDCzQWb2oZltNrMfBqw3M/uP2Pr3zaxnWLWJiEhNoQSEmWUAM4DrgFzg\nZjPLrdbtOqBT7GcMMCuM2kREJFhYnyD6AJvdfYu7HwOKgRuq9bkBeMajVgDnm1nbkOoTEZFqwgqI\nLCB+ovjtsbZE+4iISEjOuW9Sm9kYooegAA6b2YdpKqUVsPd0N7b7n6u9k5ygsQ6Pxjo86Rzri+vS\nKayA2AG0i3ucHWtLtA/uPgeYk+wCE2VmpXWZ7ErOnMY6PBrr8JwLYx3WIabVQCcz62BmTYARwJJq\nfZYAt8WuZuoHHHD3XdWfSEREwhHKJwh3rzCz8cArQAYw193Xm9nY2PrZQAkwGNgMfAJ8P4zaREQk\nWGjnINy9hGgIxLfNjlt24K6w6kmCtB/makA01uHRWIfnrB/rc/qGQSIikjqaakNERAIpIEREJFCD\nDAgz+5qZLTSzI2b2kZmNjFt3tZn9xcw+MbM3zOziuHVmZo+Z2b7Yz2NmZnHrI7FtPok9x4Bq+x0Z\n298RM1tkZl8L5xWnTzrG2szamtkSM9tpZm5mkbBebzqlcKwfNrM/m1mFmU0O2K/e1yGMdVre1+7e\n4H6A+cBzQHPgcuAAkEf0iysHgH8BmgL/DqyI2+5fgQ+JfkcjC9gAjI1b/w7wc+AfgKHAx0Dr2Lo8\n4BBwZWy/vweK0z0W9XSs2wB3ApcBDkTSPQ7n+Fh/l+hcaYuBydX2qfd1eGMd+vs67QOdhl/secAx\noHNc2zPAFKLf0H67Wt9PgUtjj98GxsStH3Xilw90Bj4DWsStX3bilw/8FPh93LpLYnW0SObrO5t+\n0jXWcW2ZDSUgUjXW1fbx24A/WnpfhzTWcetCe183xENMnYEKd98Y17aWaPrnxZYBcPcjRL+XkRdr\nqrI+brsT67a4+6FTrI9/7r8S/SPX+Qxfz9ksXWPdEKVqrGuj93VUGGMduoYYEM2Bg9XaDgItYusO\nnGQdAesPAs1jxxAT3bb6+vooXWPdEKVqrOuy34b2u0jXWIeuIQbEYeCr1dpaEj2Oeqp1Qdu2BA57\n9HNfottWX18fpWusG6JUjfWZ7Le+StdYh64hBsRGINPMOsW19QDWx356nGg0s/OIHlNdH2uqsj5u\nuxPrOppZi1Osj3/uS4AmsXrqq3SNdUOUqrGujd7XUWGMdfjSfcInTSeZiolehXAeVa9AaB1bHkr0\nCoSfUfUKhLHAB0SvPgi6AmEF8Hhs25uoeRXTQeCK2H4bytUeoY91bH3T2D4d6AI0TfdYnMNj3Ti2\n3e+BR2LLGXpfhzvW6Xhfp32g0/TL/RqwCDgC/A0YGbduAPAXolcevEnclQKAxX7h/xP7+Rmx6Upi\n6yOxbT4leinbgGr7HRnb3xGil7F9Ld1jUY/H2qv/pHsszuGxnhcwnt+LW6/3dXhjHer7WnMxiYhI\noIZ4DkJEROpAASEiIoEUECIiEkgBISIigRQQIiISSAEhIiKBFBAiIhJIASEiIoEUECIiEuj/Ayh1\nYjGKqXsrAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -834,8 +807,7 @@ } ], "source": [ - "data=get_data(results,0)\n", - "plot_histogram(data)" + "plot_histogram(Q_program.get_data(results,0))" ] }, { @@ -856,9 +828,9 @@ "outputs": [ { "data": { - "image/png": "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\nNzmb6RmMAAAAAElFTkSuQmCC\n", + "image/png": "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\nRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -866,8 +838,7 @@ } ], "source": [ - "data=get_data(results,1)\n", - "plot_histogram(data)" + "plot_histogram(Q_program.get_data(results,1)) " ] }, { @@ -883,7 +854,7 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [default]", "language": "python", "name": "python3" }, @@ -897,7 +868,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.5.2" } }, "nbformat": 4, diff --git a/tutorial/sections/tutorial4developer.ipynb b/tutorial/sections/tutorial4developer.ipynb index 335fcb8fae..72ea0c208d 100644 --- a/tutorial/sections/tutorial4developer.ipynb +++ b/tutorial/sections/tutorial4developer.ipynb @@ -17,7 +17,7 @@ "\n", "***\n", "### Contributors\n", - "Ismael Faro, Jay Gambetta" + "Ismael Faro, Jay M. Gambetta" ] }, { @@ -26,7 +26,7 @@ "source": [ "## Quantum QISKit SDK tutorial\n", "\n", - "This tutorial has the focus to explain how use the QISKit SDK, from a developer point of view. We are to review how install, and start to use the SDK tools.\n", + "This tutorial focus is to explain how use the QISKit SDK, from a developer point of view. We review how install, and start to use the SDK tools.\n", "\n", "QISKIt is a Python software development kit (SDK), that you can use to create your Quantum programs, based in circuits over [OpenQASM 2.0](https://github.com/IBM/qiskit-openqasm) Specs, compile and execute it in several Backends (Real Chips, Simulators online and Simulators in local). For the online Backend QISKit use our [python API connector](https://github.com/IBM/qiskit-api-py) to the [IBM Quantum Experience API project (http://quantumexperience.ng.bluemix.net/).\n", "\n", @@ -179,7 +179,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "One Program must to have a name, and one circuits array, any circuit must have a name and it can have several Quantum registers and several Classical Registers. Every register needs to have a name and the number of the elements (Qbits or bits).\n", + "One Program must to have a name, and one circuits array, any circuit must have a name and it can have several Quantum registers and several Classical Registers. Every register needs to have a name and the number of the elements (qubits or bits).\n", "\n", "After that, you can use this dictionary definition like the specs of one QuantumProgram object to initialize it." ] @@ -208,7 +208,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "You can get every component from you new_Q_program to use." + "You can get every component from your new_Q_program to use." ] }, { @@ -238,7 +238,7 @@ }, "source": [ "### add gates to your circuit\n", - "After create the circuit with its registers you can add gates to manipulate the registers. The next is the example of the all the gates that you can use.\n", + "After you create the circuit with its registers you can add gates to manipulate the registers. The next is the example of the all the gates that you can use.\n", "\n", "You can find extensive information about these gates and how use it into our [Quantum Experience User Guide](https://quantumexperience.ng.bluemix.net/qstage/#/tutorial?sectionId=71972f437b08e12d1f465a8857f4514c&pageIndex=2) " ] @@ -253,7 +253,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 6, @@ -274,8 +274,8 @@ "# Pauli Z gate to the Qbit 3 in the Quantum Register \"qr\" \n", "circuit.z(quantum_r[3])\n", "\n", - "# Cnot (Controlled-NOT)gate from Qbit 0 to the Qbit 3\n", - "circuit.cx(quantum_r[0], quantum_r[3])\n", + "# Cnot (Controlled-NOT)gate from Qbit 0 to the Qbit 2\n", + "circuit.cx(quantum_r[0], quantum_r[2])\n", "\n", "# add a barrier to your circuit\n", "circuit.barrier()\n", @@ -299,7 +299,7 @@ "circuit.iden(quantum_r[1])\n", "\n", "# Classical if, from Qbit2 gate Z to classical bit 1\n", - "circuit.z(quantum_r[2]).c_if(classical_r, 1)\n", + "# circuit.z(quantum_r[2]).c_if(classical_r, 1)\n", "\n", "# measure gate from the Qbit 0 to Classical bit 0\n", "circuit.measure(quantum_r[0], classical_r[0])\n" @@ -333,7 +333,7 @@ "x qr[1];\n", "y qr[2];\n", "z qr[3];\n", - "cx qr[0],qr[3];\n", + "cx qr[0],qr[2];\n", "barrier qr[0],qr[1],qr[2],qr[3];\n", "u1(0.300000000000000) qr[0];\n", "u2(0.300000000000000,0.200000000000000) qr[1];\n", @@ -341,7 +341,6 @@ "u1(1.570796326794897) qr[0];\n", "u1(0.785398163397448) qr[1];\n", "id qr[1];\n", - "if(cr==1) z qr[2];\n", "measure qr[0] -> cr[0];\n", "\n" ] @@ -374,16 +373,15 @@ "u3(3.141592653589793,1.5707963267948966,1.5707963267948966) qr[2];\n", "u3(3.141592653589793,0.0,3.141592653589793) qr[1];\n", "u2(0.0,3.141592653589793) qr[0];\n", - "cx qr[0],qr[3];\n", + "cx qr[0],qr[2];\n", "barrier qr[0],qr[1],qr[2],qr[3];\n", - "u1(0.3) qr[0];\n", - "u1(1.570796326794897) qr[0];\n", "u2(0.3,0.2) qr[1];\n", "u1(0.785398163397448) qr[1];\n", "id qr[1];\n", - "u3(0.3,0.2,0.1) qr[2];\n", - "if(cr==1) u1(3.141592653589793) qr[2];\n", - "measure qr[0] -> cr[0];\n" + "u1(0.3) qr[0];\n", + "u1(1.570796326794897) qr[0];\n", + "measure qr[0] -> cr[0];\n", + "u3(0.3,0.2,0.1) qr[2];\n" ] } ], @@ -392,7 +390,7 @@ "\n", "QASM_source = new_Q_program.program_to_text()\n", "\n", - "print (QASM_source)" + "print(QASM_source)" ] }, { @@ -432,7 +430,7 @@ } ], "source": [ - "device = 'simulator' #Backed where execute your program, in this case in the online simulator\n", + "device = 'simulator' #Backend where execute your program, in this case it is the online simulator\n", "circuits = [circuit] #Group of circuits to exec\n", "\n", "Q_program.set_api(Qconfig.APItoken, Qconfig.config[\"url\"]) #set the APIToken and API url" @@ -449,11 +447,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'qasm': 'OPENQASM 2.0;\\ninclude \"qelib1.inc\";\\nqreg qr[4];\\ncreg cr[4];\\nu1(3.141592653589793) qr[3];\\nu3(3.141592653589793,1.5707963267948966,1.5707963267948966) qr[2];\\nu3(3.141592653589793,0.0,3.141592653589793) qr[1];\\nu2(0.0,3.141592653589793) qr[0];\\ncx qr[0],qr[3];\\nbarrier qr[0],qr[1],qr[2],qr[3];\\nu1(0.3) qr[0];\\nu1(1.570796326794897) qr[0];\\nu2(0.3,0.2) qr[1];\\nu1(0.785398163397448) qr[1];\\nid qr[1];\\nu3(0.3,0.2,0.1) qr[2];\\nif(cr==1) u1(3.141592653589793) qr[2];\\nmeasure qr[0] -> cr[0];\\n'}\n", "status = RUNNING (2 seconds)\n", "status = RUNNING (4 seconds)\n", - "status = RUNNING (6 seconds)\n", - "{'qasms': [{'qasm': '\\ninclude \"qelib1.inc\";\\nqreg qr[4];\\ncreg cr[4];\\nu1(3.141592653589793) qr[3];\\nu3(3.141592653589793,1.5707963267948966,1.5707963267948966) qr[2];\\nu3(3.141592653589793,0.0,3.141592653589793) qr[1];\\nu2(0.0,3.141592653589793) qr[0];\\ncx qr[0],qr[3];\\nbarrier qr[0],qr[1],qr[2],qr[3];\\nu1(0.3) qr[0];\\nu1(1.570796326794897) qr[0];\\nu2(0.3,0.2) qr[1];\\nu1(0.785398163397448) qr[1];\\nid qr[1];\\nu3(0.3,0.2,0.1) qr[2];\\nif(cr==1) u1(3.141592653589793) qr[2];\\nmeasure qr[0] -> cr[0];\\n', 'status': 'DONE', 'executionId': '62c4667cf29a35ad009e8754baa85c80', 'result': {'date': '2017-05-14T08:45:36.552Z', 'data': {'time': 0.2707841396331787, 'counts': {'0000': 516, '0001': 508}}}}], 'shots': 1024, 'backend': {'name': 'simulator'}, 'status': 'COMPLETED', 'maxCredits': 3, 'usedCredits': 0, 'creationDate': '2017-05-14T08:45:35.262Z', 'deleted': False, 'id': '451903c7de63febb2614adbdeeaeb485', 'userId': '933a590a13327c52eb5310484d6bcf54'}\n" + "{'status': 'COMPLETED', 'maxCredits': 3, 'qasms': [{'executionId': 'faa11aff490be561d7426b5ebaf48704', 'status': 'DONE', 'result': {'data': {'time': 0.10461997985839844, 'counts': {'0000': 516, '0001': 508}}, 'date': '2017-05-15T04:29:29.178Z'}, 'qasm': '\\ninclude \"qelib1.inc\";\\nqreg qr[4];\\ncreg cr[4];\\nu1(3.141592653589793) qr[3];\\nu3(3.141592653589793,1.5707963267948966,1.5707963267948966) qr[2];\\nu3(3.141592653589793,0.0,3.141592653589793) qr[1];\\nu2(0.0,3.141592653589793) qr[0];\\ncx qr[0],qr[2];\\nbarrier qr[0],qr[1],qr[2],qr[3];\\nu2(0.3,0.2) qr[1];\\nu1(0.785398163397448) qr[1];\\nid qr[1];\\nu1(0.3) qr[0];\\nu1(1.570796326794897) qr[0];\\nmeasure qr[0] -> cr[0];\\nu3(0.3,0.2,0.1) qr[2];\\n'}], 'creationDate': '2017-05-15T04:29:28.922Z', 'usedCredits': 0, 'id': '8707a08fb2a1d73c48e7765a1b9e01b1', 'userId': '6099d7c6f80f6767a307d0f4364d5307', 'deleted': False, 'backend': {'name': 'simulator'}, 'shots': 1024}\n" ] } ], @@ -489,7 +485,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "metadata": { "collapsed": false }, @@ -498,10 +494,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'qasm': 'OPENQASM 2.0;\\ninclude \"qelib1.inc\";\\nqreg qr[4];\\ncreg cr[4];\\nu1(3.141592653589793) qr[3];\\nu3(3.141592653589793,1.5707963267948966,1.5707963267948966) qr[2];\\nu3(3.141592653589793,0.0,3.141592653589793) qr[1];\\nu2(0.0,3.141592653589793) qr[0];\\ncx qr[0],qr[3];\\nbarrier qr[0],qr[1],qr[2],qr[3];\\nu1(0.3) qr[0];\\nu1(1.570796326794897) qr[0];\\nu2(0.3,0.2) qr[1];\\nu1(0.785398163397448) qr[1];\\nid qr[1];\\nu3(0.3,0.2,0.1) qr[2];\\nif(cr==1) u1(3.141592653589793) qr[2];\\nmeasure qr[0] -> cr[0];\\n'}\n", "status = RUNNING (2 seconds)\n", - "status = RUNNING (4 seconds)\n", - "status = RUNNING (6 seconds)\n" + "status = RUNNING (4 seconds)\n" ] } ], @@ -541,12 +535,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Execute in a real chip" + "### Execute in a real device" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 12, "metadata": { "collapsed": false }, @@ -555,7 +549,22 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'qasm': 'OPENQASM 2.0;\\ninclude \"qelib1.inc\";\\nqreg qr[4];\\ncreg cr[4];\\nu1(3.141592653589793) qr[3];\\nu3(3.141592653589793,1.5707963267948966,1.5707963267948966) qr[2];\\nu3(3.141592653589793,0.0,3.141592653589793) qr[1];\\nu2(0.0,3.141592653589793) qr[0];\\ncx qr[0],qr[3];\\nbarrier qr[0],qr[1],qr[2],qr[3];\\nu1(0.3) qr[0];\\nu1(1.570796326794897) qr[0];\\nu2(0.3,0.2) qr[1];\\nu1(0.785398163397448) qr[1];\\nid qr[1];\\nu3(0.3,0.2,0.1) qr[2];\\nif(cr==1) u1(3.141592653589793) qr[2];\\nmeasure qr[0] -> cr[0];\\n'}\n" + "status = RUNNING (10 seconds)\n", + "status = RUNNING (20 seconds)\n", + "status = RUNNING (30 seconds)\n", + "status = RUNNING (40 seconds)\n", + "status = RUNNING (50 seconds)\n", + "status = RUNNING (60 seconds)\n", + "status = RUNNING (70 seconds)\n", + "status = RUNNING (80 seconds)\n", + "status = RUNNING (90 seconds)\n", + "status = RUNNING (100 seconds)\n", + "status = RUNNING (110 seconds)\n", + "status = RUNNING (120 seconds)\n", + "status = RUNNING (130 seconds)\n", + "status = RUNNING (140 seconds)\n", + "status = RUNNING (150 seconds)\n", + "status = RUNNING (160 seconds)\n" ] } ], @@ -586,7 +595,7 @@ { "data": { "text/plain": [ - "{'0000': 516, '0001': 508}" + "{'00000': 555, '00001': 469}" ] }, "execution_count": 13, @@ -617,7 +626,7 @@ { "data": { "text/plain": [ - "{'0000': 516, '0001': 508}" + "{'00000': 555, '00001': 469}" ] }, "execution_count": 14, @@ -638,7 +647,7 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [default]", "language": "python", "name": "python3" }, @@ -652,7 +661,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.5.2" } }, "nbformat": 4, From de3b6396a421dd2459016c1eadcb543e9796fdca Mon Sep 17 00:00:00 2001 From: "Jay M. Gambetta" Date: Mon, 15 May 2017 01:42:47 -0400 Subject: [PATCH 11/16] corrected shots Shots applies to both qasm simulators and real devices. --- tutorial/sections/tutorial4developer.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorial/sections/tutorial4developer.ipynb b/tutorial/sections/tutorial4developer.ipynb index 72ea0c208d..5613e1c2fb 100644 --- a/tutorial/sections/tutorial4developer.ipynb +++ b/tutorial/sections/tutorial4developer.ipynb @@ -516,10 +516,10 @@ " \"ibmqx3\", # Online RealChip, 16Qbits\n", " \"local_unitary_simulator\", # Local unitary Simulator \n", " \"local_qasm_simulator\"] # Local Simulator \n", - " - shots: Number of shots, only for real chips\n", + " - shots: Number of shots, only for real chips and qasm simulators\n", " - max_credits: Maximum number of the credits to spend in the executions. If the executions are more expensives, the job is aborted, only the real chips\n", " - basis_gates: are the base gates, by default are: u1,u2,u3,cx,id\n", - " - coupling_map: Object that represent the physical/topological Layout in a chip.\n", + " - coupling_map: Object that represent the physical/topological Layout of a chip.\n", "#### Run parameters\n", "Q_program.run(wait=5, timeout=60)\n", " - wait: Time to wait to check if the execution is COMPLETED.\n", From d6f48ff104b9856041a83a5acd3dbb3de6b68559 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20P=C3=A9rez?= Date: Mon, 15 May 2017 09:23:12 +0200 Subject: [PATCH 12/16] Getting the QASM core libraries dinamically. --- qiskit/qasm/_qasmlexer.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/qiskit/qasm/_qasmlexer.py b/qiskit/qasm/_qasmlexer.py index 7a3f15d7fa..cb1c813041 100644 --- a/qiskit/qasm/_qasmlexer.py +++ b/qiskit/qasm/_qasmlexer.py @@ -4,16 +4,17 @@ OPENQASM Lexer. This is a wrapper around the PLY lexer to support the "include" statement by creating a stack of lexers. -Author: Jim Challenger +Authors: Jim Challenger + Jesus Perez """ + import os import ply.lex as lex from ._qasmexception import QasmException from . import _node as node CORE_LIBS_PATH = os.path.join(os.path.dirname(__file__), 'libs') -# TODO: Get dinamically from the folder "qasm/lib" -CORE_LIBS = ['qelib1.inc'] +CORE_LIBS = os.listdir(CORE_LIBS_PATH) class QasmLexer(object): From ac0e66bcf57f69849c75ea72cda17c7c1134ac96 Mon Sep 17 00:00:00 2001 From: "Jay M. Gambetta" Date: Mon, 15 May 2017 07:19:45 -0400 Subject: [PATCH 13/16] moving uncompleted notebooks moving uncompleted notebooks to to sort so i can make the completed directory organized. I will move each back when done. --- tutorial/index.ipynb | 7 +++++-- tutorial/{sections => tosort}/classical_optimization.ipynb | 0 tutorial/{sections => tosort}/entanglement_Qprogram.ipynb | 0 tutorial/{sections => tosort}/entanglement_revisited.ipynb | 0 .../getting_started_with_the_qx_api.ipynb | 0 tutorial/{ => tosort}/qhelpers/__init__.py | 0 tutorial/{ => tosort}/qhelpers/basicplotter.py | 0 tutorial/{ => tosort}/qhelpers/bloch.py | 0 tutorial/{ => tosort}/qhelpers/blocherror.py | 0 tutorial/{ => tosort}/qhelpers/misc.py | 0 tutorial/{ => tosort}/qhelpers/srb1.py | 0 tutorial/{ => tosort}/qhelpers/tomo1.py | 0 .../single_qubit_states_amplitude_and_phase.ipynb | 0 13 files changed, 5 insertions(+), 2 deletions(-) rename tutorial/{sections => tosort}/classical_optimization.ipynb (100%) rename tutorial/{sections => tosort}/entanglement_Qprogram.ipynb (100%) rename tutorial/{sections => tosort}/entanglement_revisited.ipynb (100%) rename tutorial/{sections => tosort}/getting_started_with_the_qx_api.ipynb (100%) rename tutorial/{ => tosort}/qhelpers/__init__.py (100%) rename tutorial/{ => tosort}/qhelpers/basicplotter.py (100%) rename tutorial/{ => tosort}/qhelpers/bloch.py (100%) rename tutorial/{ => tosort}/qhelpers/blocherror.py (100%) rename tutorial/{ => tosort}/qhelpers/misc.py (100%) rename tutorial/{ => tosort}/qhelpers/srb1.py (100%) rename tutorial/{ => tosort}/qhelpers/tomo1.py (100%) rename tutorial/{sections => tosort}/single_qubit_states_amplitude_and_phase.ipynb (100%) diff --git a/tutorial/index.ipynb b/tutorial/index.ipynb index 05073da0c6..5e4d3bdece 100644 --- a/tutorial/index.ipynb +++ b/tutorial/index.ipynb @@ -44,8 +44,11 @@ "## Introducing the tools\n", "\n", "These notebooks give an introduction to using the QISKit tools\n", - "* [Getting Started with QISKit SDK, Tutorial for Developers](sections/tutorial4developer.ipynb) shows how to use the the QISKit SDK tools. \n", - "* Running the Local simulator " + "* [Getting Started with QISKit SDK, Tutorial for Developers](sections/tutorial4developer.ipynb) shows how to use the the QISKit SDK tools. \n", + "* Running the Local simulator \n", + "* Running on a real chip\n", + "* load/save a quantum program\n", + "* Visualizing a quanutm state" ] }, { diff --git a/tutorial/sections/classical_optimization.ipynb b/tutorial/tosort/classical_optimization.ipynb similarity index 100% rename from tutorial/sections/classical_optimization.ipynb rename to tutorial/tosort/classical_optimization.ipynb diff --git a/tutorial/sections/entanglement_Qprogram.ipynb b/tutorial/tosort/entanglement_Qprogram.ipynb similarity index 100% rename from tutorial/sections/entanglement_Qprogram.ipynb rename to tutorial/tosort/entanglement_Qprogram.ipynb diff --git a/tutorial/sections/entanglement_revisited.ipynb b/tutorial/tosort/entanglement_revisited.ipynb similarity index 100% rename from tutorial/sections/entanglement_revisited.ipynb rename to tutorial/tosort/entanglement_revisited.ipynb diff --git a/tutorial/sections/getting_started_with_the_qx_api.ipynb b/tutorial/tosort/getting_started_with_the_qx_api.ipynb similarity index 100% rename from tutorial/sections/getting_started_with_the_qx_api.ipynb rename to tutorial/tosort/getting_started_with_the_qx_api.ipynb diff --git a/tutorial/qhelpers/__init__.py b/tutorial/tosort/qhelpers/__init__.py similarity index 100% rename from tutorial/qhelpers/__init__.py rename to tutorial/tosort/qhelpers/__init__.py diff --git a/tutorial/qhelpers/basicplotter.py b/tutorial/tosort/qhelpers/basicplotter.py similarity index 100% rename from tutorial/qhelpers/basicplotter.py rename to tutorial/tosort/qhelpers/basicplotter.py diff --git a/tutorial/qhelpers/bloch.py b/tutorial/tosort/qhelpers/bloch.py similarity index 100% rename from tutorial/qhelpers/bloch.py rename to tutorial/tosort/qhelpers/bloch.py diff --git a/tutorial/qhelpers/blocherror.py b/tutorial/tosort/qhelpers/blocherror.py similarity index 100% rename from tutorial/qhelpers/blocherror.py rename to tutorial/tosort/qhelpers/blocherror.py diff --git a/tutorial/qhelpers/misc.py b/tutorial/tosort/qhelpers/misc.py similarity index 100% rename from tutorial/qhelpers/misc.py rename to tutorial/tosort/qhelpers/misc.py diff --git a/tutorial/qhelpers/srb1.py b/tutorial/tosort/qhelpers/srb1.py similarity index 100% rename from tutorial/qhelpers/srb1.py rename to tutorial/tosort/qhelpers/srb1.py diff --git a/tutorial/qhelpers/tomo1.py b/tutorial/tosort/qhelpers/tomo1.py similarity index 100% rename from tutorial/qhelpers/tomo1.py rename to tutorial/tosort/qhelpers/tomo1.py diff --git a/tutorial/sections/single_qubit_states_amplitude_and_phase.ipynb b/tutorial/tosort/single_qubit_states_amplitude_and_phase.ipynb similarity index 100% rename from tutorial/sections/single_qubit_states_amplitude_and_phase.ipynb rename to tutorial/tosort/single_qubit_states_amplitude_and_phase.ipynb From 733c30834675c8212b9ecfae59f4c2c755022614 Mon Sep 17 00:00:00 2001 From: ismael faro Date: Mon, 15 May 2017 09:40:14 -0400 Subject: [PATCH 14/16] adding local simulator: WIP --- qiskit/_quantumprogram.py | 39 +++++++++++++++++++++++++++++++++++---- test/test.py | 15 +++++++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/qiskit/_quantumprogram.py b/qiskit/_quantumprogram.py index 4cd2adb9c1..5cbd713021 100644 --- a/qiskit/_quantumprogram.py +++ b/qiskit/_quantumprogram.py @@ -23,6 +23,7 @@ Authors: Andrew Cross, Jay M. Gambetta, Ismael Faro # pylint: disable=line-too-long import time +import random from collections import Counter # use the external IBMQuantumExperience Library from IBMQuantumExperience.IBMQuantumExperience import IBMQuantumExperience @@ -38,6 +39,10 @@ from . import unroll from . import qasm from . import mapper +from .unroll import SimulatorBackend +from .simulators._unitarysimulator import UnitarySimulator +from .simulators._qasmsimulator import QasmSimulator + import sys sys.path.append("..") from qiskit.extensions.standard import x, h, cx, s, ry, barrier @@ -47,8 +52,8 @@ class QuantumProgram(object): """ Quantum Program Class Class internal properties """ - __online_devices = ["qx5qv2","ibmqx2", "ibmqx3", "ibmqx_qasm_simulator","simulator"] - __local_devices = ["local_unitary_simulator", "local_qasm_simulator"] + __online_devices = ["qx5qv2", "ibmqx2", "ibmqx3", "ibmqx_qasm_simulator", "simulator"] + __local_devices = ["local_unitary_simulator", "local_qasm_simulator"] __specs = {} __quantum_registers = {} @@ -269,7 +274,8 @@ class QuantumProgram(object): if job_result['status'] == 'Error': return job_result else: - return {"status": "Error", "result": "Not local simulations"} + self.run_local() + # return {"status": "Error", "result": "Not local simulations"} self.__qasm_compile['compiled_circuits'] = job_result['qasms'] self.__qasm_compile['used_credits'] = job_result['usedCredits'] @@ -285,7 +291,32 @@ class QuantumProgram(object): max_credits is the credits of the experiments. basis_gates are the base gates by default are: u1,u2,u3,cx,id """ - pass + shots = self.__qasm_compile['shots'] + qasms = self.__qasm_compile['compiled_circuits'] + + # /print(qasms) + + outcomes = {'qasms':[]} + for qasm in qasms: + print('----------------') + print(qasm['qasm']) + print('----------------') + basis = [] + unroller = unroll.Unroller(qasm['qasm'],SimulatorBackend(basis)) + print('----%%-----') + unroller.backend.set_trace(False) + print('-----++-----') + unroller.execute() + print('------**-----') + for i in range(shots): + print('.................') + b = QasmSimulator(unroller.backend.circuit, random.random()).run() + print('.................') + print(b) + + # outcomes['qasms'].append(bin(b['result']['classical_state'])[2:].zfill(b['number_of_cbits'])) + print(outcomes) + return outcomes def execute(self, circuits, device, shots=1024, max_credits=3, wait=5, timeout=60, basis_gates=None, coupling_map=None): diff --git a/test/test.py b/test/test.py index 0c24b47371..e64364b816 100644 --- a/test/test.py +++ b/test/test.py @@ -339,6 +339,21 @@ class TestQISKit(unittest.TestCase): def test_last(self): QP_program = QuantumProgram(specs=QPS_SPECS) + qc, qr, cr = QP_program.quantum_elements() + qc2 = QP_program.create_circuit("qc2", ["qname"], ["cname"]) + qc3 = QP_program.create_circuit("qc3", ["qname"], ["cname"]) + qc2.h(qr[0]) + qc3.h(qr[0]) + circuits = [qc2, qc3] + + device = 'local_qasm_simulator' # the device to run on + shots = 1024 # the number of shots in the experiment. + credits = 3 + coupling_map = None + + result = QP_program.execute(circuits, device, shots) + self.assertEqual(result['status'], 'COMPLETED') + # QP_program.plotter() From 24a36329ac8e063e3d3da5f2231d1b20a7ef2225 Mon Sep 17 00:00:00 2001 From: ismael faro Date: Mon, 15 May 2017 09:43:18 -0400 Subject: [PATCH 15/16] update tutorial4developer.ipynb --- tutorial/sections/tutorial4developer.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorial/sections/tutorial4developer.ipynb b/tutorial/sections/tutorial4developer.ipynb index 5613e1c2fb..d4d35b28d0 100644 --- a/tutorial/sections/tutorial4developer.ipynb +++ b/tutorial/sections/tutorial4developer.ipynb @@ -647,7 +647,7 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python [default]", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -661,7 +661,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.6.0" } }, "nbformat": 4, From 6bfb0b478f2204bdffb73a6c7f458080449cd3bd Mon Sep 17 00:00:00 2001 From: ismael faro Date: Mon, 15 May 2017 09:45:36 -0400 Subject: [PATCH 16/16] update: tutorial4developer.ipynb --- tutorial/sections/tutorial4developer.ipynb | 203 +++------------------ 1 file changed, 25 insertions(+), 178 deletions(-) diff --git a/tutorial/sections/tutorial4developer.ipynb b/tutorial/sections/tutorial4developer.ipynb index d4d35b28d0..16078f71a3 100644 --- a/tutorial/sections/tutorial4developer.ipynb +++ b/tutorial/sections/tutorial4developer.ipynb @@ -92,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { "collapsed": false }, @@ -114,20 +114,11 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ">> quantum_registers created: qr 2\n", - ">> classical_registers created: cr 2\n" - ] - } - ], + "outputs": [], "source": [ "# Creating Programs\n", "# create your first QuantumProgram object instance.\n", @@ -154,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": { "collapsed": false }, @@ -186,20 +177,11 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ">> quantum_registers created: qr 4\n", - ">> classical_registers created: cr 4\n" - ] - } - ], + "outputs": [], "source": [ "new_Q_program = QuantumProgram(specs=Q_SPECS)" ] @@ -213,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": { "collapsed": false }, @@ -245,22 +227,11 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# H (Hadamard) gate to the Qbit 0 in the Quantum Register \"qr\" \n", "circuit.h(quantum_r[0])\n", @@ -316,36 +287,11 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "OPENQASM 2.0;\n", - "include \"qelib1.inc\";\n", - "qreg qr[4];\n", - "creg cr[4];\n", - "h qr[0];\n", - "x qr[1];\n", - "y qr[2];\n", - "z qr[3];\n", - "cx qr[0],qr[2];\n", - "barrier qr[0],qr[1],qr[2],qr[3];\n", - "u1(0.300000000000000) qr[0];\n", - "u2(0.300000000000000,0.200000000000000) qr[1];\n", - "u3(0.300000000000000,0.200000000000000,0.100000000000000) qr[2];\n", - "u1(1.570796326794897) qr[0];\n", - "u1(0.785398163397448) qr[1];\n", - "id qr[1];\n", - "measure qr[0] -> cr[0];\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# QASM from a circuit\n", "\n", @@ -356,35 +302,11 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "OPENQASM 2.0;\n", - "include \"qelib1.inc\";\n", - "qreg qr[4];\n", - "creg cr[4];\n", - "u1(3.141592653589793) qr[3];\n", - "u3(3.141592653589793,1.5707963267948966,1.5707963267948966) qr[2];\n", - "u3(3.141592653589793,0.0,3.141592653589793) qr[1];\n", - "u2(0.0,3.141592653589793) qr[0];\n", - "cx qr[0],qr[2];\n", - "barrier qr[0],qr[1],qr[2],qr[3];\n", - "u2(0.3,0.2) qr[1];\n", - "u1(0.785398163397448) qr[1];\n", - "id qr[1];\n", - "u1(0.3) qr[0];\n", - "u1(1.570796326794897) qr[0];\n", - "measure qr[0] -> cr[0];\n", - "u3(0.3,0.2,0.1) qr[2];\n" - ] - } - ], + "outputs": [], "source": [ "# Qasm from a program\n", "\n", @@ -413,22 +335,11 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "device = 'simulator' #Backend where execute your program, in this case it is the online simulator\n", "circuits = [circuit] #Group of circuits to exec\n", @@ -438,21 +349,11 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "status = RUNNING (2 seconds)\n", - "status = RUNNING (4 seconds)\n", - "{'status': 'COMPLETED', 'maxCredits': 3, 'qasms': [{'executionId': 'faa11aff490be561d7426b5ebaf48704', 'status': 'DONE', 'result': {'data': {'time': 0.10461997985839844, 'counts': {'0000': 516, '0001': 508}}, 'date': '2017-05-15T04:29:29.178Z'}, 'qasm': '\\ninclude \"qelib1.inc\";\\nqreg qr[4];\\ncreg cr[4];\\nu1(3.141592653589793) qr[3];\\nu3(3.141592653589793,1.5707963267948966,1.5707963267948966) qr[2];\\nu3(3.141592653589793,0.0,3.141592653589793) qr[1];\\nu2(0.0,3.141592653589793) qr[0];\\ncx qr[0],qr[2];\\nbarrier qr[0],qr[1],qr[2],qr[3];\\nu2(0.3,0.2) qr[1];\\nu1(0.785398163397448) qr[1];\\nid qr[1];\\nu1(0.3) qr[0];\\nu1(1.570796326794897) qr[0];\\nmeasure qr[0] -> cr[0];\\nu3(0.3,0.2,0.1) qr[2];\\n'}], 'creationDate': '2017-05-15T04:29:28.922Z', 'usedCredits': 0, 'id': '8707a08fb2a1d73c48e7765a1b9e01b1', 'userId': '6099d7c6f80f6767a307d0f4364d5307', 'deleted': False, 'backend': {'name': 'simulator'}, 'shots': 1024}\n" - ] - } - ], + "outputs": [], "source": [ "Q_program.compile(circuits, device) #Compile your program\n", "\n", @@ -485,20 +386,11 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "status = RUNNING (2 seconds)\n", - "status = RUNNING (4 seconds)\n" - ] - } - ], + "outputs": [], "source": [ "result = Q_program.execute(circuits, device, wait=2, timeout=240)" ] @@ -540,34 +432,11 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "status = RUNNING (10 seconds)\n", - "status = RUNNING (20 seconds)\n", - "status = RUNNING (30 seconds)\n", - "status = RUNNING (40 seconds)\n", - "status = RUNNING (50 seconds)\n", - "status = RUNNING (60 seconds)\n", - "status = RUNNING (70 seconds)\n", - "status = RUNNING (80 seconds)\n", - "status = RUNNING (90 seconds)\n", - "status = RUNNING (100 seconds)\n", - "status = RUNNING (110 seconds)\n", - "status = RUNNING (120 seconds)\n", - "status = RUNNING (130 seconds)\n", - "status = RUNNING (140 seconds)\n", - "status = RUNNING (150 seconds)\n", - "status = RUNNING (160 seconds)\n" - ] - } - ], + "outputs": [], "source": [ "device = 'qx5qv2' #Backed where execute your program, in this case in the Real Quantum Chip online \n", "circuits = [circuit] #Group of circuits to exec\n", @@ -587,22 +456,11 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'00000': 555, '00001': 469}" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "result['qasms'][0]['result']['data']['counts']" ] @@ -618,22 +476,11 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'00000': 555, '00001': 469}" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "Q_program.get_data(result,0) " ]