Source code for piel.integration.sax_qutip
import qutip # NOQA : F401
import sax
from ..tools.qutip.unitary import matrix_to_qutip_qobj
from piel.tools.sax.utils import sax_to_s_parameters_standard_matrix
__all__ = [
"sax_to_ideal_qutip_unitary",
"verify_sax_model_is_unitary",
]
[docs]def sax_to_ideal_qutip_unitary(
sax_input: sax.SType, input_ports_order: tuple | None = None
):
"""
This function converts the calculated S-parameters into a standard Unitary matrix topology so that the shape and
dimensions of the matrix can be observed.
I think this means we need to transpose the output of the filtered sax SDense matrix to map it to a QuTip matrix.
Note that the documentation and formatting of the standard `sax` mapping to a S-parameter standard notation is
already in described in piel/piel/sax/utils.py.
From this stage we can implement a ``QObj`` matrix accordingly and perform simulations accordingly.
https://qutip.org/docs/latest/guide/qip/qip-basics.html#unitaries
For example, a ``qutip`` representation of an s-gate gate would be:
..code-block::
import numpy as np
import qutip
# S-Gate
s_gate_matrix = np.array([[1., 0], [0., 1.j]])
s_gate = qutip.Qobj(mat, dims=[[2], [2]])
In mathematical notation, this S-gate would be written as:
..math::
S = \\begin{bmatrix}
1 & 0 \\\\
0 & i \\\\
\\end{bmatrix}
Args:
sax_input (sax.SType): A dictionary of S-parameters in the form of a SDict from `sax`.
input_ports_order (tuple | None): The order of the input ports. If None, the default order is used.
Returns:
qobj_unitary (qutip.Qobj): A QuTip QObj representation of the S-parameters in a unitary matrix.
"""
# TODO make a function any SAX input.
(
s_parameters_standard_matrix,
input_ports_index_tuple_order,
) = sax_to_s_parameters_standard_matrix(
sax_input=sax_input, input_ports_order=input_ports_order
)
qobj_unitary = matrix_to_qutip_qobj(s_parameters_standard_matrix)
return qobj_unitary
[docs]def verify_sax_model_is_unitary(
model: sax.SType, input_ports_order: tuple | None = None
) -> bool:
"""
Verify that the model is unitary.
Args:
model (dict): The model to verify.
input_ports_order (tuple | None): The order of the input ports. If None, the default order is used.
Returns:
bool: True if the model is unitary, False otherwise.
"""
qobj = sax_to_ideal_qutip_unitary(model, input_ports_order=input_ports_order)
return qobj.check_isunitary()