.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "gallery/circuit_simulation_example.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr_gallery_circuit_simulation_example.py: Circuit-Side Simulation Examples =================================== This example focuses on GraphQOMB's circuit-level simulation APIs, including MBQC-native circuits, macro-gate circuits, and phase gadgets. .. GENERATED FROM PYTHON SOURCE LINES 9-17 .. code-block:: Python import math import numpy as np from graphqomb.circuit import Circuit, MBQCCircuit from graphqomb.gates import CNOT, CZ, H, Rz, X from graphqomb.simulator import CircuitSimulator, SimulatorBackend .. GENERATED FROM PYTHON SOURCE LINES 18-21 Simple MBQC Circuit Example --------------------------- Create a simple MBQC circuit with basic J gates and CZ gates .. GENERATED FROM PYTHON SOURCE LINES 21-36 .. code-block:: Python circuit = MBQCCircuit(num_qubits=2) # Add some basic operations circuit.j(qubit=0, angle=math.pi / 4) circuit.j(qubit=1, angle=math.pi / 2) circuit.cz(qubit1=0, qubit2=1) circuit.j(qubit=0, angle=-math.pi / 4) print(f"Circuit has {circuit.num_qubits} qubits") instructions = circuit.instructions() print(f"Circuit has {len(instructions)} instructions:") for i, instr in enumerate(instructions): print(f" {i}: {instr}") .. rst-class:: sphx-glr-script-out .. code-block:: none Circuit has 2 qubits Circuit has 4 instructions: 0: J(qubit=0, angle=0.7853981633974483) 1: J(qubit=1, angle=1.5707963267948966) 2: CZ(qubits=(0, 1)) 3: J(qubit=0, angle=-0.7853981633974483) .. GENERATED FROM PYTHON SOURCE LINES 37-38 Simulate the MBQC circuit .. GENERATED FROM PYTHON SOURCE LINES 38-55 .. code-block:: Python simulator = CircuitSimulator(mbqc_circuit=circuit, backend=SimulatorBackend.StateVector) simulator.simulate() # Get final state final_state = simulator.state print(f"Final state shape: {final_state.state().shape}") print(f"Final state norm: {final_state.norm():.6f}") # Print final state vector state_vec = final_state.state() print("Final state vector:") flat_state = state_vec.ravel() TOLERANCE = 1e-10 for i, amp in enumerate(flat_state): if abs(amp) > TOLERANCE: print(f" |{i:02b}⟩: {amp:.6f}") .. rst-class:: sphx-glr-script-out .. code-block:: none Final state shape: (2, 2) Final state norm: 1.000000 Final state vector: |00⟩: 0.250000+0.250000j |01⟩: 0.603553-0.103553j |10⟩: 0.103553+0.603553j |11⟩: 0.250000-0.250000j .. GENERATED FROM PYTHON SOURCE LINES 56-59 Macro Gate Circuit Example -------------------------- Create a circuit with high-level macro gates .. GENERATED FROM PYTHON SOURCE LINES 59-75 .. code-block:: Python macro_circuit = Circuit(num_qubits=3) # Add macro gates macro_circuit.apply_macro_gate(H(qubit=0)) # Hadamard on qubit 0 macro_circuit.apply_macro_gate(X(qubit=1)) # Pauli-X on qubit 1 macro_circuit.apply_macro_gate(CNOT(qubits=(0, 1))) # CNOT gate macro_circuit.apply_macro_gate(Rz(qubit=2, angle=math.pi / 3)) # Rz rotation macro_circuit.apply_macro_gate(CZ(qubits=(1, 2))) # CZ gate print(f"Circuit has {macro_circuit.num_qubits} qubits") macro_instructions = macro_circuit.instructions() print(f"Circuit has {len(macro_instructions)} macro instructions:") for i, instr in enumerate(macro_instructions): print(f" {i}: {instr}") .. rst-class:: sphx-glr-script-out .. code-block:: none Circuit has 3 qubits Circuit has 5 macro instructions: 0: H(qubit=0) 1: X(qubit=1) 2: CNOT(qubits=(0, 1)) 3: Rz(qubit=2, angle=1.0471975511965976) 4: CZ(qubits=(1, 2)) .. GENERATED FROM PYTHON SOURCE LINES 76-77 Convert to unit gates for simulation .. GENERATED FROM PYTHON SOURCE LINES 77-82 .. code-block:: Python unit_instructions = macro_circuit.unit_instructions() print(f"Expanded to {len(unit_instructions)} unit instructions:") for i, instr in enumerate(unit_instructions): print(f" {i}: {instr}") .. rst-class:: sphx-glr-script-out .. code-block:: none Expanded to 9 unit instructions: 0: J(qubit=0, angle=0) 1: J(qubit=1, angle=0) 2: J(qubit=1, angle=3.141592653589793) 3: J(qubit=1, angle=0) 4: CZ(qubits=(0, 1)) 5: J(qubit=1, angle=0) 6: J(qubit=2, angle=1.0471975511965976) 7: J(qubit=2, angle=0) 8: CZ(qubits=(1, 2)) .. GENERATED FROM PYTHON SOURCE LINES 83-84 Simulate the macro circuit .. GENERATED FROM PYTHON SOURCE LINES 84-100 .. code-block:: Python simulator = CircuitSimulator(mbqc_circuit=macro_circuit, backend=SimulatorBackend.StateVector) simulator.simulate() # Get final state final_state = simulator.state print(f"Final state shape: {final_state.state().shape}") print(f"Final state norm: {final_state.norm():.6f}") # Print final state vector state_vec = final_state.state() print("Final state vector:") flat_state = state_vec.ravel() for i, amp in enumerate(flat_state): if abs(amp) > TOLERANCE: print(f" |{i:03b}⟩: {amp:.6f}") .. rst-class:: sphx-glr-script-out .. code-block:: none Final state shape: (2, 2, 2) Final state norm: 1.000000 Final state vector: |000⟩: 0.433013-0.250000j |001⟩: 0.433013+0.250000j |010⟩: 0.433013-0.250000j |011⟩: -0.433013-0.250000j .. GENERATED FROM PYTHON SOURCE LINES 101-104 Phase Gadget Circuit Example ---------------------------- Create a circuit with phase gadgets .. GENERATED FROM PYTHON SOURCE LINES 104-123 .. code-block:: Python circuit = MBQCCircuit(num_qubits=3) # Prepare initial state circuit.j(qubit=0, angle=math.pi / 2) circuit.j(qubit=1, angle=math.pi / 4) # Add phase gadget circuit.phase_gadget(qubits=[0, 1, 2], angle=math.pi / 6) # Final rotations circuit.j(qubit=2, angle=-math.pi / 3) print(f"Circuit has {circuit.num_qubits} qubits") instructions = circuit.instructions() print(f"Circuit has {len(instructions)} instructions:") for i, instr in enumerate(instructions): print(f" {i}: {instr}") .. rst-class:: sphx-glr-script-out .. code-block:: none Circuit has 3 qubits Circuit has 4 instructions: 0: J(qubit=0, angle=1.5707963267948966) 1: J(qubit=1, angle=0.7853981633974483) 2: PhaseGadget(qubits=[0, 1, 2], angle=0.5235987755982988) 3: J(qubit=2, angle=-1.0471975511965976) .. GENERATED FROM PYTHON SOURCE LINES 124-125 Simulate the phase gadget circuit .. GENERATED FROM PYTHON SOURCE LINES 125-142 .. code-block:: Python simulator = CircuitSimulator(mbqc_circuit=circuit, backend=SimulatorBackend.StateVector) simulator.simulate() # Get final state final_state = simulator.state print(f"Final state shape: {final_state.state().shape}") print(f"Final state norm: {final_state.norm():.6f}") # Calculate some expectation values pauli_z = np.array([[1, 0], [0, -1]], dtype=complex) expectation_z0 = final_state.expectation(pauli_z, 0) expectation_z1 = final_state.expectation(pauli_z, 1) expectation_z2 = final_state.expectation(pauli_z, 2) print(f"⟨Z₀⟩ = {expectation_z0:.6f}") print(f"⟨Z₁⟩ = {expectation_z1:.6f}") print(f"⟨Z₂⟩ = {expectation_z2:.6f}") .. rst-class:: sphx-glr-script-out .. code-block:: none Final state shape: (2, 2, 2) Final state norm: 1.000000 ⟨Z₀⟩ = 0.000000 ⟨Z₁⟩ = 0.707107 ⟨Z₂⟩ = 0.433013 .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 0.006 seconds) .. _sphx_glr_download_gallery_circuit_simulation_example.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: circuit_simulation_example.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: circuit_simulation_example.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: circuit_simulation_example.zip ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_