Medición de Cadena de Bits

El uso de with_sampling() instruye al backend a realizar nshots mediciones proyectivas en la base computacional y recopilar los recuentos de cadenas de bits.

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ámetros

  • nshots (int): Número de disparos de medición. Debe ser un entero positivo.

  • expand_samples (bool): Si se deben expandir las muestras, por defecto True. Si es True, las mediciones parciales se devolverán como «0_» donde el «_» indica un qubit no medido. Si es False, los qubits no medidos se eliminarán de la cadena de bits, por lo que «0_» se devolvería como «0».

Cuándo Usarlo

Use el muestreo cuando necesite la distribución completa de cadenas de bits, por ejemplo para evaluar una función de coste combinatoria, ejecutar el postprocesamiento de QAOA, o calcular tasas de error.

Muestras Expandidas

Cuando expand_samples se establece en True, las cadenas de bits en los resultados incluirán guiones bajos («_») para indicar qubits no medidos. Esto puede ser útil para la legibilidad, especialmente cuando solo se mide un subconjunto de qubits. Por ejemplo, si tiene un sistema de 4 qubits y solo mide el primero, segundo y cuarto qubit, una muestra se devolvería como «00_0» en lugar de «000», donde el guion bajo indica que el estado del tercer qubit no ha sido medido.

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())

Salida:

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

Observe cómo el primer resultado incluye el guion bajo para dejar claro qué qubits fueron ignorados, mientras que el segundo resultado es más compacto pero ambiguo a menos que se conozca la configuración de medición. Esto sería especialmente importante si hubiera mediciones a mitad del circuito, ya que se podría medir solo el qubit 1 al principio y luego solo el qubit 2 más tarde, por lo que la posición del guion bajo indicaría qué qubits fueron medidos en cada paso.