def mcry(relative_numbers): from unqomp.ancillaallocation import AncillaCircuit from qiskit import QuantumRegister, QuantumCircuit from unqomp.examples.mcx import makeQiskitMCRY n = 12 ctrls = QuantumRegister(n, 'ctrls') target = QuantumRegister(1, 'target') circuit1 = AncillaCircuit(ctrls, target) circuit1.mcry(2.0, ctrls, target) circuit1 = circuit1.circuitWithUncomputation() qiskitMCRY = makeQiskitMCRY(2.0, n) print('MCRY with regression bug ; ', end = '') #qiskit buggy ctrls2 = QuantumRegister(n, 'ctrls') target2 = QuantumRegister(1, 'target') anc = QuantumRegister(n - 2, 'anc') circuit2 = QuantumCircuit(ctrls2, target2, anc) circuit2.mcry(2.0, ctrls2,target2[0], anc, mode = 'basic') nb_qb_qi = circuit2.num_qubits nb_gates_qi = circuit2.decompose().decompose().decompose().decompose().decompose().count_ops() if not relative_numbers: print(str(nb_qb_qi) + ' ; ' + str(nb_gates_qi['cx'] + nb_gates_qi['u3']) + ' ; ' + str(nb_gates_qi['cx']) + str(' ; '), end = '') nb_qb_mi = circuit1.num_qubits nb_gates_mi = circuit1.decompose().decompose().decompose().decompose().decompose().count_ops() if not relative_numbers: print(str(nb_qb_mi) + ' ; ' + str(nb_gates_mi['cx'] + nb_gates_mi['u3']) + ' ; ' + str(nb_gates_mi['cx'])) if relative_numbers: print_relative_vals(nb_qb_qi, nb_gates_qi['cx'], nb_gates_qi['u3'], nb_qb_mi, nb_gates_mi['cx'], nb_gates_mi['u3']) #qiskit with bug fixed nb_qb_qi = qiskitMCRY.num_qubits nb_gates_qi = qiskitMCRY.decompose().decompose().decompose().decompose().decompose().count_ops() print('MCRY *, regression bug fixed ; ', end = '') if not relative_numbers: print(str(nb_qb_qi) + ' ; ' + str(nb_gates_qi['cx'] + nb_gates_qi['u3']) + ' ; '+ str(nb_gates_qi['cx']) + str(' ; '), end = '') print(str(nb_qb_mi) + ' ; ' + str(nb_gates_mi['cx'] + nb_gates_mi['u3']) + ' ; ' + str(nb_gates_mi['cx'])) else: print_relative_vals(nb_qb_qi, nb_gates_qi['cx'], nb_gates_qi['u3'], nb_qb_mi, nb_gates_mi['cx'], nb_gates_mi['u3'])
def mcry(nb_vars_max=40): from unqomp.ancillaallocation import AncillaCircuit from qiskit import QuantumRegister, QuantumCircuit from unqomp.examples.mcx import makeQiskitMCRY nb_vars_t = [] nb_qb_qi = [] nb_qb_mi = [] nb_qb_bq = [] nb_gates_qi = [] nb_gates_mi = [] nb_gates_bq = [] for nb_vars in range(3, nb_vars_max, 1): n = nb_vars ctrls = QuantumRegister(n, 'ctrls') target = QuantumRegister(1, 'target') circuit1 = AncillaCircuit(ctrls, target) circuit1.mcry(0.2, ctrls, target) circuit1 = circuit1.circuitWithUncomputation() qiskitMCX = makeQiskitMCRY(0.2, n) nb_vars_t.append(nb_vars) #qiskit nb_qb_qi.append(qiskitMCX.num_qubits) nb_gates_qi.append(qiskitMCX.decompose().decompose().decompose(). decompose().decompose().count_ops()) #mine nb_qb_mi.append(circuit1.num_qubits) nb_gates_mi.append(circuit1.decompose().decompose().decompose(). decompose().decompose().count_ops()) #qiskit buggy if n < 15: ctrls2 = QuantumRegister(n, 'ctrls') target2 = QuantumRegister(1, 'target') anc = QuantumRegister(n - 2, 'anc') circuit2 = QuantumCircuit(ctrls2, target2, anc) circuit2.mcry(0.2, ctrls2, target2[0], anc, mode='basic') nb_qb_bq.append(circuit2.num_qubits) nb_gates_bq.append(circuit2.decompose().decompose().decompose(). decompose().decompose().count_ops()) else: nb_qb_bq.append(0) nb_gates_bq.append({'u3': 0, 'cx': 0}) with open('evaluation/plot_values/mcry.csv', 'w') as f: sys.stdout = f print( "input size; n_qb Qiskit without regression bug; n_gates Qiskit without regression bug; n_cx_gates Qiskitwithout regression bug; n_qb Unqomp; n_gates Unqomp ; n_cx_gates Uncomp; n_qb Qiskit with regression bug; n_gates Qiskit with regression bug ; n_cx_gates Qiskit with regression bug" ) for i in range(len(nb_vars_t)): print(nb_vars_t[i], ";", nb_qb_qi[i], ";", nb_gates_qi[i]['u3'] + nb_gates_qi[i]['cx'], ";", nb_gates_qi[i]['cx'], ";", nb_qb_mi[i], ";", nb_gates_mi[i]['u3'] + nb_gates_mi[i]['cx'], ";", nb_gates_mi[i]['cx'], ";", nb_qb_bq[i], ";", nb_gates_bq[i]['u3'] + nb_gates_bq[i]['cx'], ";", nb_gates_bq[i]['cx']) sys.stdout = original_stdout
def makesPolyPauliRot(num_state_qubits=None, coeffs=None): # basis is y degree = len(coeffs) - 1 qr_state = QuantumRegister(num_state_qubits, name='state') qr_target = QuantumRegister(1, name='target') def _get_rotation_coefficients(): """Compute the coefficient of each monomial. Returns: A dictionary with pairs ``{control_state: rotation angle}`` where ``control_state`` is a tuple of ``0`` or ``1`` bits. """ # determine the control states all_combinations = list(product([0, 1], repeat=num_state_qubits)) valid_combinations = [] for combination in all_combinations: if 0 < sum(combination) <= degree: valid_combinations += [combination] rotation_coeffs = { control_state: 0 for control_state in valid_combinations } # compute the coefficients for the control states for i, coeff in enumerate(coeffs[1:]): i += 1 # since we skip the first element we need to increase i by one # iterate over the multinomial coefficients for comb, num_combs in _multinomial_coefficients( num_state_qubits, i).items(): control_state = () power = 1 for j, qubit in enumerate(comb): if qubit > 0: # means we control on qubit i control_state += (1, ) power *= 2**(j * qubit) else: control_state += (0, ) # Add angle rotation_coeffs[control_state] += coeff * num_combs * power return rotation_coeffs circuit = AncillaCircuit(qr_state, qr_target) rotation_coeffs = _get_rotation_coefficients() circuit.ry(coeffs[0], qr_target) for c in rotation_coeffs: qr_control = [] for i, _ in enumerate(c): if c[i] > 0: qr_control.append(qr_state[i]) # apply controlled rotations if len(qr_control) > 1: circuit.mcry(rotation_coeffs[c], qr_control, qr_target) elif len(qr_control) == 1: circuit.cry(rotation_coeffs[c], qr_control[0], qr_target) return circuit