Awtomatikong paghahanap ng mga cut
Hakbang 1: Map
Gumawa ng circuit at observables
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "qiskit": "qiskit", "qiskit_addon_cutting": "qiskit-addon-cutting"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
import numpy as np
from qiskit.circuit.random import random_circuit
from qiskit.quantum_info import SparsePauliOp
circuit = random_circuit(7, 6, max_operands=2, seed=1242)
observable = SparsePauliOp(["ZIIIIII", "IIIZIII", "IIIIIIZ"])
circuit.draw("mpl", scale=0.8)

Hakbang 2: Optimize
Hanapin ang mga cut location, na may maximum na 4 qubit bawat subcircuit. Ang circuit na ito ay maaaring hatiin sa dalawa sa pamamagitan ng paggawa ng isang wire cut at pagputol ng isang CRZGate
from qiskit_addon_cutting.automated_cut_finding import (
find_cuts,
OptimizationParameters,
DeviceConstraints,
)
# Specify settings for the cut-finding optimizer
optimization_settings = OptimizationParameters(seed=111)
# Specify the size of the QPUs available
device_constraints = DeviceConstraints(qubits_per_subcircuit=4)
cut_circuit, metadata = find_cuts(circuit, optimization_settings, device_constraints)
print(
f'Found solution using {len(metadata["cuts"])} cuts with a sampling '
f'overhead of {metadata["sampling_overhead"]}.\n'
f'Lowest cost solution found: {metadata["minimum_reached"]}.'
)
for cut in metadata["cuts"]:
print(f"{cut[0]} at circuit instruction index {cut[1]}")
cut_circuit.draw("mpl", scale=0.8, fold=-1)
Found solution using 2 cuts with a sampling overhead of 127.06026169907257.
Lowest cost solution found: True.
Wire Cut at circuit instruction index 19
Gate Cut at circuit instruction index 28

Magdagdag ng mga ancilla para sa mga wire cut at palawakin ang mga observable upang isama ang mga ancilla qubit
from qiskit_addon_cutting import cut_wires, expand_observables
qc_w_ancilla = cut_wires(cut_circuit)
observables_expanded = expand_observables(observable.paulis, circuit, qc_w_ancilla)
qc_w_ancilla.draw("mpl", scale=0.8, fold=-1)

Hatiin ang circuit at observables sa mga subcircuit at subobservables. Kalkulahin ang sampling overhead na nakukuha sa pagputol ng mga gate at wire na ito.
from qiskit_addon_cutting import partition_problem
partitioned_problem = partition_problem(
circuit=qc_w_ancilla, observables=observables_expanded
)
subcircuits = partitioned_problem.subcircuits
subobservables = partitioned_problem.subobservables
print(
f"Sampling overhead: {np.prod([basis.overhead for basis in partitioned_problem.bases])}"
)
Sampling overhead: 127.06026169907257
subobservables
{0: PauliList(['IIII', 'IZII', 'IIIZ']),
1: PauliList(['ZIII', 'IIII', 'IIII'])}
subcircuits[0].draw("mpl", style="iqp", scale=0.8)

subcircuits[1].draw("mpl", style="iqp", scale=0.8)

Bumuo ng mga eksperimento na patatakbuhin sa backend.
from qiskit_addon_cutting import generate_cutting_experiments
subexperiments, coefficients = generate_cutting_experiments(
circuits=subcircuits, observables=subobservables, num_samples=1_000
)
print(
f"{len(subexperiments[0]) + len(subexperiments[1])} total subexperiments to run on backend."
)
96 total subexperiments to run on backend.
Ang Hakbang 3 at 4 ng isang Qiskit pattern ay maaaring isagawa tulad sa mga nakaraang tutorial.