Operador
class qiskit.quantum_info.Operator(data, input_dims=None, output_dims=None)
Bases: LinearOp
Clase de operador matricial
Esto representa un operador matricial que evolve() a Statevector por multiplicación matriz-vector
y se evolve() a DensityMatrix por multiplicación izquierda y derecha
Por ejemplo, el siguiente operador aplicado al estado cero lo cambia al estado uno :
>>> import numpy as np
>>> from qiskit.quantum_info import Operator
>>> op = Operator(np.array([[0.0, 1.0], [1.0, 0.0]])) # Represents Pauli X operator>>> from qiskit.quantum_info import Statevector
>>> sv = Statevector(np.array([1.0, 0.0]))
>>> sv.evolve(op)
Statevector([0.+0.j, 1.+0.j],
dims=(2,))>>> from qiskit.quantum_info import DensityMatrix
>>> dm = DensityMatrix(np.array([[1.0, 0.0], [0.0, 0.0]]))
>>> dm.evolve(op)
DensityMatrix([[0.+0.j, 0.+0.j],
[0.+0.j, 1.+0.j]],
dims=(2,))Inicializar un objeto operador.
Parámetros
- data (QuantumCircuit |Operation | BaseOperator | np.ndarray) – datos para inicializar el operador.
- input_dims (tuple | None) – las dimensiones del subsistema de entrada.
- output_dims (tuple | None) – las dimensiones del subsistema de salida.
Eleva
QiskitError - si los datos de entrada no pueden inicializarse como un operador.
Información adicional:
Si las dimensiones de entrada o salida son Ninguna, se determinarán automáticamente a partir de los datos de entrada. Si los datos de entrada son una matriz Numpy de forma ( 2**N, 2**N ) se utilizarán sistemas qubit. Si el operador de entrada no es un operador N-qubit, asignará un único subsistema con dimensión especificada por la forma de la entrada. Nótese que dos operadores inicializados mediante este método sólo se consideran equivalentes si coinciden en su orden canónico de qubits (o: permutación). Véase Operator.from_circuit() para especificar una permutación de qubits diferente.
Atributos
atol
Valor predeterminado: 1e-08
data
El array Numpy subyacente.
dim
Devuelve una tupla (forma_entrada, forma_salida).
num_qubits
Devuelve el número de qubits si es un operador N-qubit o Ninguno en caso contrario.
qargs
Devuelve los qargs para el operador.
rtol
Valor predeterminado: 1e-05
settings
Devuelve los ajustes del operador.
Métodos
adjoint
apply_permutation
apply_permutation(perm, front=False)
Modifica los datos del operador componiéndolos con una permutación.
Parámetros
- perm (list) – patrón de permutación, que describe qué qubits ocupan las posiciones 0, 1, 2, etc. tras aplicar la permutación.
- front (bool) – Cuando se establece en
Truela permutación se aplica antes del operador, cuando se establece enFalsela permutación se aplica después del operador.
Devuelve
El operador modificado.
Tipo de retorno
Eleva
QiskitError - si el tamaño del patrón de permutación no coincide con las dimensiones del operador.
compose
compose(other, qargs=None, front=False)
Devuelve la composición del operador con otro Operador.
Parámetros
- other (Operator) – un objeto Operador.
- qargs (list or None) – una lista de posiciones de subsistemas a las que aplicar otras. Si se aplica «None» a todos los subsistemas (valor predeterminado: None).
- front (bool) – Si es True compone usando el operador derecho de multiplicación, en lugar del izquierdo [por defecto: Falso].
Devuelve
El operador compuesto.
Tipo de retorno
Eleva
QiskitError - si otro no puede convertirse en operador o tiene dimensiones incompatibles para los subsistemas especificados.
La composición (&) se define por defecto como multiplicación matricial izquierda para los operadores matriciales, mientras que @ (equivalente a dot()) se define como multiplicación matricial derecha. Es decir, que A & B == A.compose(B) es equivalente a B @ A == B.dot(A) cuando A y B son del mismo tipo.
Si se configura el parámetro front=True kwarg, la multiplicación de matrices a la derecha es equivalente al método dot() método A.dot(B) == A.compose(B, front=True).
conjugate
copy
dot
dot(other, qargs=None)
Devuelve el operador multiplicado por la derecha self * other.
Parámetros
- other (Operator) – un objeto operador.
- qargs (list or None) – una lista de posiciones de subsistemas a las que aplicar otras. Si se aplica «None» a todos los subsistemas (valor predeterminado: None).
Devuelve
La matriz derecha multiplicada Operador.
Tipo de retorno
El producto punto puede obtenerse utilizando el operador binario @ . Por tanto, a.dot(b) es equivalente a a @ b.
draw
draw(output=None, **drawer_args)
Devuelve una visualización del Operador.
repr : Cadena del estado __repr__.
texto : ASCII TextMatrix que se puede imprimir en la consola.
latex : Un objeto IPython Latex para mostrar en Jupyter Notebooks.
latex_source : Fuente ASCII sin compilar para generar matrices utilizando LaTeX.
Parámetros
- output (str) – Seleccione el método de salida que se utilizará para dibujar el estado. Las opciones válidas son repr, text, latex, latex_source, Por defecto es repr.
- drawer_args - Argumentos que se pasarán directamente a la función de dibujo o constructor relevante ( TextMatrix( ), array_to_latex()). Consulte la documentación de la función correspondiente en qiskit.visualization.
Devuelve
Dibujo del operador.
Tipo de retorno
str o TextMatrix o IPython.display.Latex
Eleva
- ValueError - cuando se selecciona un método de salida no válido.
- MissingOptionalLibrary - Si SymPy no está instalado y se selecciona
'latex'o'latex_source'paraoutput.
equiv
equiv(other, rtol=None, atol=None)
Devuelve True si los operadores son equivalentes hasta la fase global.
Parámetros
- other (Operator) – un objeto operador.
- rtol (float) – valor relativo de tolerancia para la comparación.
- atol (float) – valor absoluto de tolerancia para la comparación.
Devuelve
Verdadero si los operadores son equivalentes hasta la fase global.
Tipo de retorno
expand
expand(other)
Devuelve el producto tensorial de orden inverso con otro Operador.
Parámetros
other (Operator) – un objeto Operador.
Devuelve
el producto tensorial , donde
es el Operador actual, y es el otro Operador.
Tipo de retorno
from_circuit
classmethod from_circuit(circuit, ignore_set_layout=False, layout=None, final_layout=None)
Crear un nuevo objeto Operador a partir de un QuantumCircuit
Mientras que un QuantumCircuit puede pasarse directamente como data al constructor de la clase, esto no proporciona opciones sobre cómo se utiliza el circuito para crear un objeto Operator. Este método constructor le permite controlar cómo se crea el Operator de modo que pueda ajustarse a un caso de uso concreto.
Por defecto, este método constructor permutará los qubits basándose en una disposición inicial configurada (es decir, después de haber sido transpilada). También proporciona una opción para proporcionar manualmente un Layout objeto directamente.
Parámetros
- circuit (QuantumCircuit) – La dirección
QuantumCircuitpara crear un objeto Operador. - ignore_set_layout (bool) – Cuando se establece en
Truesi la entradacircuittiene un diseño establecido será ignorado - layout (Layout) – Si se especifica este kwarg se puede utilizar para especificar un diseño particular a utilizar para permutar los qubits en el creado
Operator. Si se especifica esto, se utilizará en lugar de un diseño contenido en la entradacircuit. Si se especifica los bits virtuales en laLayoutdeben estar presentes en la entradacircuit. - final_layout (Layout) – Si se especifica, este kwarg se puede utilizar para representar la permutación de salida causada por las inserciones de intercambio durante la etapa de enrutamiento del transpilador.
Devuelve
Un operador que representa el circuito de entrada
Tipo de retorno
from_label
classmethod from_label(label)
Devuelve un producto tensorial de operadores single-qubit.
Parámetros
label (string) – cadena de operadores monocubitales.
Devuelve
El operador N-qubit.
Tipo de retorno
Eleva
QiskitError - si la etiqueta contiene caracteres no válidos, o la longitud de la etiqueta es mayor que un num_qubits especificado explícitamente.
Información adicional:
Las etiquetas corresponden a las matrices de un solo qubit: 'I': [ [1, 0], [0, 1] ] 'X': [ [0, 1], [1, 0] ] 'Y': [ [0, -1j], [1j, 0] ] 'Z': [ [1, 0], [0, -1] ] 'H': [ [1, 1], [1, -1] ] / sqrt(2) 'S': [ [1, 0], [0, 1j] ] 'T': [ [1, 0], [0, ( 1+1j ) / sqrt(2)] ] '0': [ [1, 0], [0, 0] ] '1': [ [0, 0], [0, 1] ] '+': [ [0.5, 0.5], 0.5 [0.5 0.5] ] '-': [ [0.5, -0.5], [-0.5, 0.5] ] 'r': [ [0.5, -0.5j], [0.5j, 0.5] ] 'l': [ [0.5, 0.5j], [-0.5j, 0.5] ]
input_dims
is_unitary
output_dims
power
power(n, branch_cut_rotation=3.141592653589793e-12, assume_unitary=False)
Devuelve la potencia matricial del operador.
Las potencias no enteras de operadores con un valor propio cuya fase compleja es tienen un corte de rama en el plano complejo, lo que hace que el cálculo de la raíz principal alrededor de este corte esté sujeto a precisión / diferencias en la implementación de BLAS. Por ejemplo, la raíz cuadrada de Pauli Y puede devolver la rotación o Y dependiendo de si el -1 eigenvalue se encuentra como complex(-1, tiny) o complex(-1, -tiny). Tales valores propios son realmente comunes en la información cuántica, por lo que esta función primero rota en fase la matriz de entrada para desplazar el corte de rama a un punto mucho menos común. Los problemas de precisión numérica subyacentes en torno al punto de corte de rama se mantienen, si un operador tiene un valor propio cercano a esta fase. La magnitud de esta rotación puede controlarse con el parámetro branch_cut_rotation .
La elección de branch_cut_rotation afecta a la raíz principal que se encuentra. Por ejemplo, la raíz cuadrada de ZGate se calculará como SGate o SdgGate dependiendo del sentido de la rotación:
from qiskit.circuit import library
from qiskit.quantum_info import Operator
z_op = Operator(library.ZGate())
assert z_op.power(0.5, branch_cut_rotation=1e-3) == Operator(library.SGate())
assert z_op.power(0.5, branch_cut_rotation=-1e-3) == Operator(library.SdgGate())Parámetros
- n (float) – el poder de elevar la matriz a.
- branch_cut_rotation (float) – El ángulo de rotación a aplicar al corte de la rama en el plano complejo. Esto aleja el corte de la rama del punto común de , pero puede hacer que se seleccione una raíz diferente como raíz principal. La rotación es en sentido contrario a las agujas del reloj, siguiendo la convención estándar para la fase compleja.
- assume_unitary (bool) – si
True, se supone que el operador es unitario. En este caso, para potencias fraccionarias empleamos una implementación más rápida basada en la descomposición de Schur.
Devuelve
el operador resultante O ** n.
Tipo de retorno
Eleva
QiskitError - si las dimensiones de entrada y salida del operador no son iguales.
Sólo es seguro fijar el argumento assume_unitary en True cuando el operador es unitario (o, más generalmente, normal). De lo contrario, la función devolverá un resultado incorrecto.
reshape
reshape(input_dims=None, output_dims=None, num_qubits=None)
Devuelve una copia superficial con las dimensiones de los subsistemas de entrada y salida remodeladas.
Parámetros
- input_dims (None or tuple) – nuevas dimensiones de entrada del subsistema. Si es Ninguno, se conservarán las atenuaciones de entrada originales [Por defecto: Ninguno].
- output_dims (None or tuple) – nuevas dimensiones de salida del subsistema. Si es Ninguno, se conservarán las atenuaciones de salida originales. [Predeterminado: Ninguno].
- num_qubits (None or int) – remodelar a un operador N-qubit [Por defecto: Ninguno].
Devuelve
devuelve self con las dimensiones de entrada y salida reformadas.
Tipo de retorno
BaseOperator
Eleva
QiskitError - si el tamaño combinado de todas las dimensiones de entrada del subsistema o las dimensiones de salida del subsistema no es constante.
reverse_qargs
reverse_qargs()
Devuelve un Operador con el orden de los subsistemas invertido.
Para un operador de producto tensorial, esto equivale a invertir el orden de los subsistemas del producto tensorial. Para un operador el operador devuelto será .
Devuelve
el operador con el orden de los subsistemas invertido.
Tipo de retorno
tensor
tensor(other)
Devuelve el producto tensorial con otro Operador.
Parámetros
other (Operator) – un objeto Operador.
Devuelve
el producto tensorial , donde
es el Operador actual, y es el otro Operador.
Tipo de retorno
El producto tensorial puede obtenerse utilizando el operador binario ^ . Por tanto, a.tensor(b) es equivalente a a ^ b.