Skip to main content
IBM Quantum Platform

Samplex

class samplomatic.samplex.Samplex

GitHub

Bases: object

Representa una distribución de probabilidad sobre los parámetros del circuito y otros campos.

Samplex es el tipo principal de la biblioteca Samplomatic. Es un acrónimo de «sampling complex».

En términos abstractos, un «samplex» representa una distribución de probabilidad paramétrica sobre los parámetros de un circuito modelo, así como otros campos con valores matriciales que se utilizarán en el posprocesamiento de los datos recopilados tras la ejecución del circuito modelo vinculado. En la práctica, implementa un método sample() que extrae valores de esta distribución para generar un conjunto de matrices que incluyen, como mínimo, una matriz de ángulos (aleatorios) válidos para el circuito de plantilla. Por ejemplo, una instancia de «samplex» podría implementar el «twirling» de Pauli en todas las capas de un circuito base, incluidas las mediciones finales, de modo que los ángulos obtenidos al tomar muestras del mismo se correspondan con puertas de Pauli compuestas con las puertas de un solo qubit que existan en el circuito base, junto con matrices booleanas que describan cómo invertir esos resultados de medición invertidos por el «twirling» de medición. Sin embargo, su semántica no se limita a esto, y su estructura es muy ampliable: se pueden añadir a la biblioteca nuevos tipos de grupos, nuevas distribuciones y nuevas técnicas de propagación de puertas virtuales.

Internamente, un «samplex» utiliza una representación en forma de grafo acíclico dirigido (DAG) que describe el proceso de muestreo de forma procedimental. Cada nodo del grafo interactúa con un conjunto de VirtualRegisters, y las conexiones entre nodos indican una dependencia de registros: si A→BA \rightarrow B, entonces BB requiere que AA haya actuado sobre los registros antes de que se le permita actuar. Esto implica que el flujo del grafo no es temporal en lo que respecta a la ejecución, como ocurre con el grafo dirigido sin dirección (DAG) de un circuito cuántico, sino que fluye desde los nodos encargados de generar aleatorizaciones hasta los nodos encargados de generar las aleatorizaciones procesadas como resultados. Hay tres tipos de nodos:

  • Los SamplingNodes se encargan de instanciar nuevos registros a partir de las entradas,
  • Los EvaluationNodes se encargan de transformar, combinar y eliminar registros,
  • CollectionNodes se encargan de leer los registros y de escribir los valores de salida de sample().

Los «samplexes» se generan normalmente pasando a la función build() un circuito base con instrucciones de cuadro anotadas. Es posible generar uno manualmente, aunque resulta tedioso, y el usuario también es responsable de construir un circuito cuántico paramétrico compatible para utilizarlo como circuito modelo. El siguiente ejemplo muestra un circuito sencillo creado a partir de un par de «samplex» y «template» mediante la función build() , y traza el DAG resultante del «samplex». Los tres tipos diferentes de nodos descritos anteriormente se representan mediante formas distintas.

>>> from samplomatic import build, Twirl
>>> from qiskit import QuantumCircuit
>>>
>>> circuit = QuantumCircuit(2)
>>> with circuit.box([Twirl()]):
...    circuit.cz(0, 1)
>>> with circuit.box([Twirl()]):
...     circuit.measure_all()
>>>
>>> template, samplex = build(circuit)
>>> samplex.draw()

Aunque el DAG es el componente principal del modelo de datos de este objeto, también se almacena otra información:

  • Los propios samplex pueden ser paramétricos (véase parameters) y evaluar expresiones de parámetros, todo lo cual queda almacenado en el samplex. Por ejemplo, cuando se construye mediante build(), un samplex admitirá valores para todos los parámetros que admite el circuito base.
  • Especificaciones de entrada y salida que describen exactamente qué valores se esperan como entrada en cada momento sample() y qué valores se devolverán; véanse y inputs() outputs().
  • Requisitos de los modelos de ruido que especifican qué tipos de modelos de ruido son compatibles con las necesidades de muestreo de un «samplex».

Resumen de atributos

Columna « 1 »
Columna « 2 »
num_parametersEl número de parámetros previstos en el momento del muestreo.
param_tableLas expresiones de parámetros propias ParameterExpressionTable de este «samplex».
parametersLos parámetros ordenados que esperan valores en el momento del muestreo.
passthrough_paramsLa asignación de índices que controla los parámetros de las plantillas de paso.

Resumen de los métodos

Columna « 1 »
Columna « 2 »
add_edge(a, b)Añade una arista al grafo de Samplex.
add_input(especificación)Añade una entrada de muestreo a este samplex.
add_node(nodo)Añade un nodo al grafo de Samplex.
add_output(especificación)Añade una salida de muestreo a este «samplex».
append_parameter_expression(expresión)Añade una expresión de parámetro al «samplex».
draw([cols, subgraph_idxs, layout_method])Dibuja la gráfica de este ejemplo utilizando el plot_graph() método.
finalize()Indica que se han añadido todos los nodos y aristas, y determina el orden de recorrido de los nodos.
inputs()Devuelve un objeto que especifica y ayuda a crear los datos de entrada necesarios para sample().
outputs()Devuelve un objeto que especifica los resultados prometidos de sample().
sample([samplex_input, num_randomizations, ...])Ejemplo.
set_passthrough_params(passthrough_params)Configura la asignación de los parámetros de paso directo.

Documentación sobre atributos

num_parameters

El número de parámetros previstos en el momento del muestreo.

param_table

Las expresiones de los parámetros de ParameterExpressionTable este «samplex».

Los nodos paramétricos se añaden a las entradas de referencia «samplex» de esta tabla por índice, y sample() evalúa la tabla en el momento del muestreo. En combinación con passthrough_params, los llamantes pueden evaluar únicamente el subconjunto determinista de los parámetros de la plantilla (por ejemplo, los ángulos RZZGate ) sin invocar sample(). Véase también y parameters append_parameter_expression().

parameters

Los parámetros ordenados que esperan valores en el momento del muestreo.

passthrough_params

La asignación de índices que controla los parámetros de las plantillas de paso.

Devuelve un par de matrices de enteros de igual longitud y alineadas posicionalmente (template_idxs, expression_idxs): el valor en el índice del parámetro de plantilla template_idxs[i] se establece durante la ejecución a partir sample() del valor de la param_table expresión en el índice expression_idxs[i] (véase set_passthrough_params()).

Ambos conjuntos estarán vacíos si no se ha registrado ningún parámetro de paso. Las matrices devueltas son copias independientes del estado interno.

Documentación sobre métodos

add_edge

add_edge(a: int, b: int) → int

GitHub

Añade una arista al grafo de Samplex.

Parámetros

  • a – El índice del nodo de origen.
  • b – El índice del nodo de destino.

Devuelve

El índice entero de la arista añadida.

add_input

add_input(specification: Specification)

GitHub

Añade una entrada de muestreo a este samplex.

Parámetros

especificación : una especificación del nombre y el tipo de la entrada.

add_node

add_node(node: Node) → int

GitHub

Añade un nodo al grafo de Samplex.

Parámetros

nodo : el nodo que se va a añadir.

Devuelve

El índice entero del nodo añadido.

add_output

add_output(specification: Specification)

GitHub

Añade una salida de muestreo a este «samplex».

Parámetros

especificación : una especificación del nombre y el tipo de la salida.

append_parameter_expression

append_parameter_expression(expression: ParameterExpression) → int

GitHub

Añade una expresión de parámetro al «samplex».

Es necesario añadir una expresión a un «samplex» antes de poder añadir un nodo que haga referencia a ella. Por cada nuevo parámetro que aparezca en la expresión de parámetros dada, se insertará una entrada en en parameters orden ordenado.

Parámetros

expresión : un parámetro o una expresión de parámetro.

Devuelve

Un índice que los nodos paramétricos pueden utilizar para hacer referencia a la expresión evaluada.

draw

draw(cols: int = 2, subgraph_idxs: None | int | Sequence[int] = None, layout_method: Literal['auto', 'spring', 'graphviz', 'graphviz_curved', 'graphviz_line'] | LayoutMethod = 'auto') → Figure

GitHub

Dibuja la gráfica de este ejemplo utilizando el plot_graph() método.

Parámetros

  • cols : el número de columnas de la figura resultante.
  • subgraph_idxs : los índices de los subgrafos que se van a incluir en el gráfico, o None bien todos los subgrafos.
  • layout_method : un método de diseño predefinido por su nombre, o una función que implemente un diseño.

Devuelve

Un gráfico de Plotly.

finalize

finalize() → Self

GitHub

Indica que se han añadido todos los nodos y aristas, y determina el orden de recorrido de los nodos.

Subidas

SamplexError : si se detectan conflictos de dependencias entre nodos.

Devuelve

La misma instancia, para el encadenamiento.

inputs

inputs() → TensorInterface

GitHub

Devuelve un objeto que especifica y ayuda a crear los datos de entrada necesarios para sample().

Devuelve

La interfaz de entrada para este samplex.

outputs

outputs() → TensorInterface

GitHub

Devuelve un objeto que especifica los resultados prometidos de sample().

Devuelve

La interfaz de salida de este samplex.

sample

sample(samplex_input: Mapping[str, Any] | None = None, num_randomizations: int = 1, rng: int | SeedSequence | Generator | None = None, keep_registers: bool = False, max_workers: int | None = None) → SamplexOutput

GitHub

Ejemplo.

En el siguiente ejemplo se integra un circuito sencillo con dos parámetros en un «samplex» para mostrar cómo se invoca este método. En particular, ten en cuenta que los datos de entrada obligatorios para los nodos «samplex», que incluyen tanto la información sobre el tipo como sobre la forma de la matriz, se enumeran en inputs(), y deben asignárseles valores.

>>> from samplomatic import build, Twirl
>>> from qiskit.circuit import QuantumCircuit, Parameter
>>>
>>> # quickly make a circuit and build it to construct an example simplex
>>> circuit = QuantumCircuit(2)
>>> with circuit.box([Twirl()]):
...     circuit.rx(Parameter("a"), 0)
...     circuit.rx(Parameter("b"), 0)
...     circuit.cz(0, 1)
>>> with circuit.box([Twirl()]):
...     circuit.measure_all()
>>>
>>> template, samplex = build(circuit)
>>>
>>> # query the samplex for the expected inputs at sample time, and note that we
>>> # are required to pass a length-2 vector of floats for 'a' and 'b' (alphabetical)
>>> print(inputs := samplex.inputs())
TensorInterface(<
    - 'parameter_values' <float64[2]>: Input parameter values to use during sampling.
>)
>>> # after binding required values, we can sample 123 randomizations
>>> samplex.sample(
...     inputs.bind(parameter_values=[0.1, 0.2]),
...     num_randomizations=123,
... )
SamplexOutput({'measurement_flips.meas': ..., 'parameter_values': ...})
>>> # alternatively, we can provide any mapping object directly to specify inputs
>>> samplex.sample(
...     {"parameter_values": [0.1, 0.2]},
...     num_randomizations=123,
... )
SamplexOutput({'measurement_flips.meas': ..., 'parameter_values': ...})

Parámetros

  • samplex_input : una correspondencia entre los nombres de las entradas y sus valores, tal y como se describe en inputs() (véase también la guía de entradas y salidas de Samplex ), o None si no se requiere ninguna entrada. Los nombres que contienen un punto pueden utilizar la expansión de diccionarios anidados. Ten en cuenta que TensorInterface es un objeto de mapeo y, por lo tanto, es un argumento de entrada válido cuando está completamente vinculado.
  • num_randomizations : el número de aleatorizaciones que se van a muestrear.
  • keep_registers – Indica si se deben conservar los registros virtuales utilizados durante el muestreo e incluirlos en la salida bajo la clave de metadatos "registers".
  • rng : un número entero para inicializar un generador de números aleatorios, el propio generador, o bien None para utilizar el generador predeterminado del módulo.
  • max_workers : el número máximo de subprocesos que se pueden utilizar para ejecutar en paralelo los nodos de muestreo, evaluación y recopilación.

set_passthrough_params

set_passthrough_params(passthrough_params: list[tuple[int | None, ParameterExpression]]) → int

GitHub

Configura la asignación de los parámetros de paso directo.

Algunos parámetros no se ven afectados por la propagación de la puerta virtual y no son configurados por los nodos de recogida. Estos parámetros solo se asignan a partir de los parámetros del circuito original a los parámetros del circuito de plantilla. Esta función establece la correspondencia de estos parámetros.

Parámetros

passthrough_params – ParamSpec para los parámetros de paso.

Devuelve: El índice máximo del parámetro de plantilla en passthrough\_params.

¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.