Circuitos aleatorios
qiskit.circuit.random
Visión general
El módulo qiskit.circuit.random ofrece funciones que pueden utilizarse para generar circuitos arbitrarios con puertas seleccionadas aleatoriamente a partir de un conjunto dado de puertas.
Estos circuitos pueden utilizarse para evaluar el hardware cuántico existente y estimar el rendimiento de los transpiladores de circuitos cuánticos y la infraestructura de software. Las funciones que se indican a continuación pueden generar circuitos cuánticos a medida respetando diversas propiedades, como el número de qubits, la profundidad del circuito, el mapa de acoplamiento, el conjunto de puertas, etc.
Generación de circuitos arbitrarios
random_circuit
qiskit.circuit.random.random_circuit(num_qubits, depth, max_operands=4, measure=False, conditional=False, reset=False, seed=None, num_operand_distribution=None)
Generar circuitos aleatorios de tamaño y forma arbitrarios.
Esta función generará un circuito aleatorio seleccionando puertas al azar del conjunto de puertas estándar en qiskit.circuit.library.standard_gates. Por ejemplo:
from qiskit.circuit.random import random_circuit
circ = random_circuit(2, 2, measure=True)
circ.draw(output='mpl')
Parámetros
- num_qubits (int) – número de hilos cuánticos
- depth (int) – niveles de operaciones (es decir, la longitud de la ruta crítica)
- max_operands (int) – número máximo de operandos de qubits de cada puerta (entre 1 y 4)
- measure (bool) – si es True, medir todos los qubits al final
- conditional (bool) – si es True, insertar medidas intermedias y condicionales
- reset (bool) – si es True, insertar reinicios intermedios
- seed (int) – establece una semilla aleatoria (opcional)
- num_operand_distribution (dict) – una distribución de puertas que especifica la proporción de puertas de 1 qubit, 2 qubits, 3 qubits, …, n qubits en el circuito aleatorio. Es de esperar una desviación respecto a las proporciones especificadas que dependerá del tamaño del circuito aleatorio solicitado. (opcional)
Devuelve
circuito construido
Tipo de retorno
Raises
CircuitError - cuando se dan opciones no válidas
Generación de circuitos arbitrarios respetando el acoplamiento de qubits
random_circuit_from_graph
qiskit.circuit.random.random_circuit_from_graph(interaction_graph, min_2q_gate_per_edge=1, max_operands=2, measure=False, conditional=False, reset=False, seed=None, insert_1q_oper=True, prob_conditional=0.1, prob_reset=0.1)
Genera un circuito aleatorio de tamaño y forma arbitrarios que respeta estrictamente el grafo de interacción pasado como argumento. El grafo de interacción es un grafo G=(V, E) donde V son los qubits en el circuito, y, E es el conjunto de interacciones de puerta de dos qubits entre dos qubits particulares en el circuito.
Esta función generará un circuito aleatorio seleccionando al azar las compuertas 1Q y 2Q del conjunto de compuertas estándar en qiskit.circuit.library.standard_gates. El usuario puede adjuntar un valor numérico como metadato a la arista del gráfico indicando el peso de esa arista en particular. Estos pesos de arista se normalizarían con las probabilidades de que las aristas sean seleccionadas. Si todos los pesos de las aristas se pasan como Ninguno, entonces la probabilidad de que cada par de qubits sea seleccionado se establece en 1/N, donde N es el número de aristas en el grafo_de_interacción pasado, es decir, cada arista se dibuja uniformemente. Si cualquier peso de una arista se establece como cero, esa arista en particular no se incluirá en el circuito de salida.
Pasar una lista de tuplas de qubit de control, qubit de destino y probabilidad asociada también es aceptable como forma de especificar un grafo de interacción.
Si los valores numéricos están presentes como probabilidades, pero algunos/algunos son Ninguno, o negativos, cuando max_operands=2 esto planteará un ValueError.
Si max_operands se establece en 1, entonces no hay operaciones 2Q, por lo que no es necesario tener cuidado de los bordes, en tal caso la función devolverá un circuito de la función random_circuit, que se pasaría con el max_operands como 1.
Si max_operands se establece en 2, entonces en cada iteración while 2Q las puertas se eligen aleatoriamente, y los pares de qubits que existen en el grafo de interacción de entrada también se eligen aleatoriamente basándose en la probabilidad asociada al par de qubits. A continuación, en una iteración for 2Q se aplican puertas a los pares de qubits elegidos aleatoriamente con el objetivo de alcanzar el recuento de 2Q en cualquier par de qubits a min_2q_gate_per_edge criterios tan pronto como sea posible dentro de una iteración particular. Ahora, si algunos qubits siguen inactivos después de aplicar las compuertas 2Q para esa iteración en particular, entonces se aplican compuertas 1Q elegidas al azar a esos qubits inactivos si insert_1q_oper se establece en True.
Ejemplo:
from qiskit.circuit.random.utils import random_circuit_from_graph
import rustworkx as rx
pydi_graph = rx.PyDiGraph()
pydi_graph.add_nodes_from(range(7))
cp_map = [(0, 1, 0.18), (1, 2, 0.15), (2, 3, 0.15), (3, 4, 0.22), (4, 5, 0.13), (5, 6, 0.17)]
pydi_graph.add_edges_from(cp_map)
# cp_map can be passed in directly as interaction_graph
qc = random_circuit_from_graph(pydi_graph, min_2q_gate_per_edge=2, seed=12345)
qc.draw(output='mpl')
Parámetros
- interaction_graph (PyGraph | PyDiGraph | List[Tuple[int, int, float]]) – Gráfico de interacción
- min_2q_gate_per_edge (int) – Número mínimo de veces que cada par de qubits debe utilizarse en el circuito aleatorio. (opcional, default:1 )
- max_operands (int) – Número máximo de operandos de qubits de cada puerta (debe ser 1 o 2) (opcional, default:2 )
- measure (bool) – Si es True, mide todos los qubits al final. (opcional, valor predeterminado: False)
- conditional (bool) – Si es «True», inserta las medidas intermedias y las condiciones. (opcional, valor predeterminado: False)
- reset (bool) – Si el valor es True, se insertan reinicios intermedios. (opcional, valor predeterminado: False)
- seed (int) – establece una semilla aleatoria. (Si no se especifica, se elige una semilla aleatoria) (opcional)
- insert_1q_oper (bool) – Incorpora operaciones de « 1Q » al circuito. (opcional, valor predeterminado: True)
- prob_conditional (float) – Probabilidad inferior a 1.0; se utiliza para controlar la activación de las condiciones en el circuito. (opcional, por defecto: 0.1 )
- prob_reset (float) – Probabilidad inferior a 1.0; se utiliza para controlar la aparición de reinicios en el circuito. (opcional, por defecto: 0.1 )
Devuelve
circuito construido
Tipo de retorno
Raises
- CircuitError - Cuando max_operandos no es 1 o 2.
- CircuitError - Cuando max_operands se establece en 1, pero no se permiten operaciones 1Q estableciendo insert_1q_oper en false.
- CircuitError - Cuando el grafo de interacción no tiene aristas, por lo que sólo 1Q puertas son posibles en el circuito, pero insert_1q_oper se establece en False.
- CircuitError - Cuando se pasa un objeto gráfico de interacción no válido.
- ValueError - Dado max_operands=2, cuando alguna arista tiene probabilidad Ninguna pero no todas, o alguna de las probabilidades es negativa.
Generación de circuitos arbitrarios con puertas Clifford
random_clifford_circuit
qiskit.circuit.random.random_clifford_circuit(num_qubits, num_gates, gates='all', seed=None)
Generar un circuito Clifford pseudoaleatorio.
Esta función generará un circuito Clifford seleccionando aleatoriamente la cantidad elegida de compuertas Clifford del conjunto de compuertas estándar en qiskit.circuit.library.standard_gates. Por ejemplo:
from qiskit.circuit.random import random_clifford_circuit
circ = random_clifford_circuit(num_qubits=2, num_gates=6)
circ.draw(output='mpl')
Parámetros
- num_qubits (int) – número de hilos cuánticos.
- num_gates (int) – número de puertas del circuito.
- gates (list[str]) – lista opcional de nombres de puertas Clifford de los que tomar muestras aleatoriamente. Si
"all"(por defecto), utiliza todas las puertas Clifford de la biblioteca estándar. - seed (int | np.random.Generator) – establece la semilla/generador aleatorio (opcional).
Devuelve
circuito construido
Tipo de retorno