qumat/cirq_backend.py (68 lines of code) (raw):

# # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # import cirq import sympy def initialize_backend(backend_config): # Assuming 'simulator_type' specifies the type of simulator in Cirq simulator_type = backend_config.get('backend_options', {}).get('simulator_type', 'default') if simulator_type != 'default': print(f"Simulator type '{simulator_type}' is not supported in Cirq. Ignoring this argument") return cirq.Simulator() def create_empty_circuit(num_qubits): return cirq.Circuit() def apply_not_gate(circuit, qubit_index): qubit = cirq.LineQubit(qubit_index) circuit.append(cirq.X(qubit)) def apply_hadamard_gate(circuit, qubit_index): qubit = cirq.LineQubit(qubit_index) circuit.append(cirq.H(qubit)) def apply_cnot_gate(circuit, control_qubit_index, target_qubit_index): control_qubit = cirq.LineQubit(control_qubit_index) target_qubit = cirq.LineQubit(target_qubit_index) circuit.append(cirq.CNOT(control_qubit, target_qubit)) def apply_toffoli_gate(circuit, control_qubit_index1, control_qubit_index2, target_qubit_index): control_qubit1 = cirq.LineQubit(control_qubit_index1) control_qubit2 = cirq.LineQubit(control_qubit_index2) target_qubit = cirq.LineQubit(target_qubit_index) circuit.append(cirq.CCX(control_qubit1, control_qubit2, target_qubit)) def apply_swap_gate(circuit, qubit_index1, qubit_index2): qubit1 = cirq.LineQubit(qubit_index1) qubit2 = cirq.LineQubit(qubit_index2) circuit.append(cirq.SWAP(qubit1, qubit2)) def apply_pauli_x_gate(circuit, qubit_index): qubit = cirq.LineQubit(qubit_index) circuit.append(cirq.X(qubit)) def apply_pauli_y_gate(circuit, qubit_index): qubit = cirq.LineQubit(qubit_index) circuit.append(cirq.Y(qubit)) def apply_pauli_z_gate(circuit, qubit_index): qubit = cirq.LineQubit(qubit_index) circuit.append(cirq.Z(qubit)) def execute_circuit(circuit, backend, backend_config): # Ensure measurement is added to capture the results if not circuit.has_measurements(): circuit.append(cirq.measure(*circuit.all_qubits(), key='result')) simulator = cirq.Simulator() parameter_values = backend_config.get('parameter_values', None) if parameter_values: # Convert parameter_values to applicable resolvers res = [cirq.ParamResolver(parameter_values)] results = simulator.run_sweep(circuit, repetitions=backend_config['backend_options'].get('shots', 1), params=res) return [result.histogram(key='result') for result in results] else: result = simulator.run(circuit, repetitions=backend_config['backend_options'].get('shots', 1)) return [result.histogram(key='result')] def draw_circuit(circuit): print(circuit) def apply_rx_gate(circuit, qubit_index, angle): param = sympy.Symbol(angle) if isinstance(angle, str) else angle qubit = cirq.LineQubit(qubit_index) circuit.append(cirq.rx(param).on(qubit)) def apply_ry_gate(circuit, qubit_index, angle): param = sympy.Symbol(angle) if isinstance(angle, str) else angle qubit = cirq.LineQubit(qubit_index) circuit.append(cirq.ry(param).on(qubit)) def apply_rz_gate(circuit, qubit_index, angle): param = sympy.Symbol(angle) if isinstance(angle, str) else angle qubit = cirq.LineQubit(qubit_index) circuit.append(cirq.rz(param).on(qubit)) def apply_u_gate(circuit, qubit_index, theta, phi, lambd): qubit = cirq.LineQubit(qubit_index) circuit.append(cirq.rz(lambd).on(qubit)) circuit.append(cirq.ry(phi).on(qubit)) circuit.append(cirq.rx(theta).on(qubit))