def test_scheduling_pulse(instructions, method, expected_length, random_shuffle, gates_schedule): circuit = QubitCircuit(4) for instruction in instructions: circuit.add_gate( Gate(instruction.name, instruction.targets, instruction.controls)) if random_shuffle: repeat_num = 5 else: repeat_num = 0 result0 = gate_sequence_product(circuit.propagators()) # run the scheduler scheduler = Scheduler(method) gate_cycle_indices = scheduler.schedule(instructions, gates_schedule=gates_schedule, repeat_num=repeat_num) # check if the scheduled length is expected assert (max(gate_cycle_indices) == expected_length) scheduled_gate = [[] for i in range(max(gate_cycle_indices) + 1)] # check if the scheduled circuit is correct for i, cycles in enumerate(gate_cycle_indices): scheduled_gate[cycles].append(circuit.gates[i]) circuit.gates = sum(scheduled_gate, []) result1 = gate_sequence_product(circuit.propagators()) assert (tracedist(result0 * result1.dag(), qeye(result0.dims[0])) < 1.0e-7)
def test_globalphase_gate_propagators(self): qc = QubitCircuit(2) qc.add_gate("GLOBALPHASE", arg_value=np.pi / 2) [gate] = qc.gates assert gate.name == "GLOBALPHASE" assert gate.arg_value == np.pi / 2 [U_expanded] = qc.propagators() assert U_expanded == 1j * qp.qeye([2, 2]) [U_unexpanded] = qc.propagators(expand=False) assert U_unexpanded == 1j * qp.qeye([2, 2])
def test_numerical_evolution(num_qubits, gates, device_class, kwargs): num_qubits = 2 circuit = QubitCircuit(num_qubits) for gate in gates: circuit.add_gate(gate) device = device_class(num_qubits, **kwargs) device.load_circuit(circuit) state = qutip.rand_ket(2**num_qubits) state.dims = [[2] * num_qubits, [1] * num_qubits] target = gate_sequence_product([state] + circuit.propagators()) if isinstance(device, DispersiveCavityQED): num_ancilla = len(device.dims) - num_qubits ancilla_indices = slice(0, num_ancilla) extra = qutip.basis(device.dims[ancilla_indices], [0] * num_ancilla) init_state = qutip.tensor(extra, state) elif isinstance(device, SCQubits): # expand to 3-level represetnation init_state = _ket_expaned_dims(state, device.dims) else: init_state = state options = qutip.Options(store_final_state=True, nsteps=50_000) result = device.run_state(init_state=init_state, analytical=False, options=options) numerical_result = result.final_state if isinstance(device, DispersiveCavityQED): target = qutip.tensor(extra, target) elif isinstance(device, SCQubits): target = _ket_expaned_dims(target, device.dims) assert _tol > abs(1 - qutip.metrics.fidelity(numerical_result, target))
def test_export_import(): qc = QubitCircuit(3) qc.add_gate("CRY", targets=1, controls=0, arg_value=np.pi) qc.add_gate("CRX", targets=1, controls=0, arg_value=np.pi) qc.add_gate("CRZ", targets=1, controls=0, arg_value=np.pi) qc.add_gate("CNOT", targets=1, controls=0) qc.add_gate("TOFFOLI", targets=2, controls=[0, 1]) # qc.add_gate("SQRTNOT", targets=0) qc.add_gate("CS", targets=1, controls=0) qc.add_gate("CT", targets=1, controls=0) qc.add_gate("SWAP", targets=[0, 1]) qc.add_gate("QASMU", targets=[0], arg_value=[np.pi, np.pi, np.pi]) qc.add_gate("RX", targets=[0], arg_value=np.pi) qc.add_gate("RY", targets=[0], arg_value=np.pi) qc.add_gate("RZ", targets=[0], arg_value=np.pi) qc.add_gate("SNOT", targets=[0]) qc.add_gate("X", targets=[0]) qc.add_gate("Y", targets=[0]) qc.add_gate("Z", targets=[0]) qc.add_gate("S", targets=[0]) qc.add_gate("T", targets=[0]) # qc.add_gate("CSIGN", targets=[0], controls=[1]) read_qc = read_qasm(circuit_to_qasm_str(qc), strmode=True) props = qc.propagators() read_props = read_qc.propagators() for u0, u1 in zip(props, read_props): assert (u0 - u1).norm() < 1e-12
def test_multi_gates(self): N = 2 H_d = tensor([sigmaz()]*2) H_c = [] test = OptPulseProcessor(N) test.add_drift(H_d, [0, 1]) test.add_control(sigmax(), cyclic_permutation=True) test.add_control(sigmay(), cyclic_permutation=True) test.add_control(tensor([sigmay(), sigmay()])) # qubits circuit with 3 gates setting_args = {"SNOT": {"num_tslots": 10, "evo_time": 1}, "SWAP": {"num_tslots": 30, "evo_time": 3}, "CNOT": {"num_tslots": 30, "evo_time": 3}} qc = QubitCircuit(N) qc.add_gate("SNOT", 0) qc.add_gate("SWAP", targets=[0, 1]) qc.add_gate('CNOT', controls=1, targets=[0]) test.load_circuit(qc, setting_args=setting_args, merge_gates=False) rho0 = rand_ket(4) # use random generated ket state rho0.dims = [[2, 2], [1, 1]] U = gate_sequence_product(qc.propagators()) rho1 = U * rho0 result = test.run_state(rho0) assert_(fidelity(result.states[-1], rho1) > 1-1.0e-6)
def test_user_gate(self): """ User defined gate for QubitCircuit """ def customer_gate1(arg_values): mat = np.zeros((4, 4), dtype=np.complex128) mat[0, 0] = mat[1, 1] = 1. mat[2:4, 2:4] = gates.rx(arg_values).full() return Qobj(mat, dims=[[2, 2], [2, 2]]) def customer_gate2(): mat = np.array([[1., 0], [0., 1.j]]) return Qobj(mat, dims=[[2], [2]]) qc = QubitCircuit(3) qc.user_gates = {"CTRLRX": customer_gate1, "T1": customer_gate2} qc.add_gate("CTRLRX", targets=[1, 2], arg_value=np.pi/2) qc.add_gate("T1", targets=[1]) props = qc.propagators() result1 = tensor(identity(2), customer_gate1(np.pi/2)) np.testing.assert_allclose(props[0].full(), result1.full()) result2 = tensor(identity(2), customer_gate2(), identity(2)) np.testing.assert_allclose(props[1].full(), result2.full())
def test_N_level_system(self): """ Test for circuit with N-level system. """ mat3 = qp.rand_unitary_haar(3) def controlled_mat3(arg_value): """ A qubit control an operator acting on a 3 level system """ control_value = arg_value dim = mat3.dims[0][0] return (tensor(fock_dm(2, control_value), mat3) + tensor(fock_dm(2, 1 - control_value), identity(dim))) qc = QubitCircuit(2, dims=[3, 2]) qc.user_gates = {"CTRLMAT3": controlled_mat3} qc.add_gate("CTRLMAT3", targets=[1, 0], arg_value=1) props = qc.propagators() final_fid = qp.average_gate_fidelity(mat3, ptrace(props[0], 0) - 1) assert pytest.approx(final_fid, 1.0e-6) == 1 init_state = basis([3, 2], [0, 1]) result = qc.run(init_state) final_fid = qp.fidelity(result, props[0] * init_state) assert pytest.approx(final_fid, 1.0e-6) == 1.
def testresolve(self, gate_from, gate_to, targets, controls): qc1 = QubitCircuit(2) qc1.add_gate(gate_from, targets=targets, controls=controls) U1 = gates.gate_sequence_product(qc1.propagators()) qc2 = qc1.resolve_gates(basis=gate_to) U2 = gates.gate_sequence_product(qc2.propagators()) assert _op_dist(U1, U2) < 1e-12
def test_numerical_evolution(num_qubits, gates, device_class, kwargs): num_qubits = 3 circuit = QubitCircuit(num_qubits) for gate in gates: circuit.add_gate(gate) device = device_class(num_qubits, **kwargs) device.load_circuit(circuit) state = qutip.rand_ket(2**num_qubits) state.dims = [[2] * num_qubits, [1] * num_qubits] target = gate_sequence_product([state] + circuit.propagators()) if len(device.dims) > num_qubits: num_ancilla = len(device.dims) - num_qubits ancilla_indices = slice(0, num_ancilla) extra = qutip.basis(device.dims[ancilla_indices], [0] * num_ancilla) init_state = qutip.tensor(extra, state) else: init_state = state options = qutip.Options(store_final_state=True, nsteps=50_000) result = device.run_state(init_state=init_state, analytical=False, options=options) if len(device.dims) > num_qubits: target = qutip.tensor(extra, target) assert _tol > abs(1 - qutip.metrics.fidelity(result.final_state, target))
def test_device_against_gate_sequence(num_qubits, gates, device_class, kwargs): circuit = QubitCircuit(num_qubits) for gate in gates: circuit.add_gate(gate) U_ideal = gate_sequence_product(circuit.propagators()) device = device_class(num_qubits) U_physical = gate_sequence_product(device.run(circuit)) assert (U_ideal - U_physical).norm() < _tol
def test_analytical_evolution(num_qubits, gates, device_class, kwargs): circuit = QubitCircuit(num_qubits) for gate in gates: circuit.add_gate(gate) state = qutip.rand_ket(2**num_qubits) state.dims = [[2] * num_qubits, [1] * num_qubits] ideal = gate_sequence_product([state] + circuit.propagators()) device = device_class(num_qubits) operators = device.run_state(init_state=state, qc=circuit, analytical=True) result = gate_sequence_product(operators) assert abs(qutip.metrics.fidelity(result, ideal) - 1) < _tol
def testFREDKINdecompose(self): """ FREDKIN to rotation and CNOT: compare unitary matrix for FREDKIN and product of resolved matrices in terms of rotation gates and CNOT. """ qc1 = QubitCircuit(3) qc1.add_gate("FREDKIN", targets=[0, 1], controls=[2]) U1 = gates.gate_sequence_product(qc1.propagators()) qc2 = qc1.resolve_gates() U2 = gates.gate_sequence_product(qc2.propagators()) assert _op_dist(U1, U2) < 1e-12
def testSNOTdecompose(self): """ SNOT to rotation: compare unitary matrix for SNOT and product of resolved matrices in terms of rotation gates. """ qc1 = QubitCircuit(1) qc1.add_gate("SNOT", targets=0) U1 = gates.gate_sequence_product(qc1.propagators()) qc2 = qc1.resolve_gates() U2 = gates.gate_sequence_product(qc2.propagators()) assert _op_dist(U1, U2) < 1e-12
def testadjacentgates(self): """ Adjacent Gates: compare unitary matrix for ISWAP and product of resolved matrices in terms of adjacent gates interaction. """ qc1 = QubitCircuit(3) qc1.add_gate("ISWAP", targets=[0, 2]) U1 = gates.gate_sequence_product(qc1.propagators()) qc0 = qc1.adjacent_gates() qc2 = qc0.resolve_gates(basis="ISWAP") U2 = gates.gate_sequence_product(qc2.propagators()) assert _op_dist(U1, U2) < 1e-12
def test_allow_permutation(): circuit = QubitCircuit(2) circuit.add_gate("X", 0) circuit.add_gate("CNOT", 0, 1) circuit.add_gate("X", 1) result0 = gate_sequence_product(circuit.propagators()) scheduler = Scheduler("ASAP", allow_permutation=True) gate_cycle_indices = scheduler.schedule(circuit) assert (max(gate_cycle_indices) + 1) == 2 scheduler = Scheduler("ASAP", allow_permutation=False) gate_cycle_indices = scheduler.schedule(circuit) assert (max(gate_cycle_indices) + 1) == 3
def test_scheduling_pulse(instructions, method, expected_length, random_shuffle, gates_schedule): circuit = QubitCircuit(4) for instruction in instructions: circuit.add_gate( Gate(instruction.name, instruction.targets, instruction.controls)) if random_shuffle: repeat_num = 5 else: repeat_num = 0 result0 = gate_sequence_product(circuit.propagators()) # run the scheduler scheduler = Scheduler(method) gate_cycle_indices = scheduler.schedule(instructions, gates_schedule=gates_schedule, repeat_num=repeat_num) assert max(gate_cycle_indices) == expected_length
def test_N_level_system(self): """ Test for circuit with N-level system. """ mat3 = rand_dm(3, density=1.) def controlled_mat3(arg_value): """ A qubit control an operator acting on a 3 level system """ control_value = arg_value dim = mat3.dims[0][0] return (tensor(fock_dm(2, control_value), mat3) + tensor(fock_dm(2, 1 - control_value), identity(dim))) qc = QubitCircuit(2, dims=[3, 2]) qc.user_gates = {"CTRLMAT3": controlled_mat3} qc.add_gate("CTRLMAT3", targets=[1, 0], arg_value=1) props = qc.propagators() np.testing.assert_allclose(mat3, ptrace(props[0], 0) - 1)
def test_add_gates(self, valid_input, correct_result): circuit = QubitCircuit(1) circuit.add_gates(valid_input) result = gate_sequence_product(circuit.propagators()) assert(result == correct_result)