Mesura de Cadena de Bits

L’ús de with_sampling() instrueix el backend a realitzar nshots mesures projectives en la base computacional i recollir els recomptes de bitstring.

from qilisdk.readout import Readout
from qilisdk.backends import QiliSim
from qilisdk.digital import Circuit
from qilisdk.functionals import DigitalPropagation

backend = QiliSim()
functional = DigitalPropagation(Circuit(2))

spec = Readout().with_sampling(nshots=1000)
result = backend.execute(functional, readout=spec)

# Access the results
counts = result.get_samples()                # dict[str, int]  e.g. {"00": 512, "11": 488}
probs  = result.get_probabilities()    # dict[str, float] normalised to 1.0

# Top-k most probable outcomes
top3 = result.readout_results.sampling.get_probabilities(n=3)

Paràmetres

  • nshots (int): Nombre de shots de mesura. Ha de ser un enter positiu.

  • expand_samples (bool): Si s’han d’expandir les mostres, per defecte True. Si és True, les mesures parcials es retornaran com «0_» on el «_» indica un qubit no mesurat. Si és False, els qubits no mesurats s’eliminaran del bitstring, de manera que «0_» es retornaria com «0».

Quan Utilitzar-lo

Utilitzeu el sampling quan necessiteu la distribució completa de bitstring, per exemple per avaluar una funció de cost combinatòria, executar el post-processament de QAOA, o calcular taxes d’error.

Mostres Expandides

Quan expand_samples s’estableix a True, els bitstrings dels resultats inclouran guions baixos («_») per indicar qubits no mesurats. Això pot ser útil per a la llegibilitat, especialment quan només es mesura un subconjunt de qubits. Per exemple, si teniu un sistema de 4 qubits i només mesureu el primer, segon i quart qubit, una mostra es retornaria com «00_0» en lloc de «000», on el guió baix indica que l’estat del tercer qubit no es mesura.

from qilisdk.readout import Readout
from qilisdk.backends import QiliSim
from qilisdk.digital import Circuit, X, M
from qilisdk.functionals import DigitalPropagation

backend = QiliSim()
circuit = Circuit(3)

# Final state will be |100>
circuit.add(X(0))

# Measure only the first and last qubits
circuit.add(M(0))
circuit.add(M(2))

# Simulate the circuit with and without sample expansion
readout_with_expand = Readout().with_sampling(nshots=1000, expand_samples=True)
readout_without_expand = Readout().with_sampling(nshots=1000, expand_samples=False)
result_with_expand = backend.execute(DigitalPropagation(circuit), readout=readout_with_expand)
result_without_expand = backend.execute(DigitalPropagation(circuit), readout=readout_without_expand)
print("With expand_samples=True:")
print(result_with_expand.get_samples())
print("With expand_samples=False:")
print(result_without_expand.get_samples())

Sortida:

With expand_samples=True:
{'1_0': 1000}
With expand_samples=False:
{'10': 1000}

Observeu com el primer resultat inclou el guió baix per deixar clar quins qubits s’han ignorat, mentre que el segon resultat és més compacte però ambigu si no coneixeu la configuració de mesura. Això seria especialment important si hi hagués mesures a mig circuit, ja que podríeu mesurar només el qubit 1 al principi i després només el qubit 2 més tard, de manera que la posició del guió baix indicaria quins qubits es van mesurar a cada pas.