Source code for quara.interface.qutip.conversion

from typing import List

import numpy as np
from qutip import Qobj

from quara.objects.composite_system import CompositeSystem
from quara.objects.state import State
from quara.objects.povm import Povm
from quara.objects.gate import Gate, convert_hs
from quara.objects.matrix_basis import (
    get_comp_basis,
    calc_hermitian_matrix_expansion_coefficient_hermitian_basis,
)
from quara.utils.matrix_util import calc_mat_from_vector_adjoint, truncate_hs


[docs]def convert_state_qutip_to_quara(qutip_qobj: Qobj, c_sys: CompositeSystem) -> State: """converts QuTiP Qobj to Quara State. Parameters ---------- qutip_qobj: Qobj Qobj representing quantum state. c_sys : CompositeSystem CompositeSystem containing state. Returns ------- State Quara State. Raises ------ ValueError Invalid Qobj type. ValueError Invalid argument for State constructor. """ data_array = qutip_qobj.data.toarray() if qutip_qobj.isket: density_mat = calc_mat_from_vector_adjoint(data_array.flatten()) print(density_mat) vec = calc_hermitian_matrix_expansion_coefficient_hermitian_basis( density_mat, c_sys.basis() ) quara_state = State(vec=vec, c_sys=c_sys) elif qutip_qobj.isoper: vec = calc_hermitian_matrix_expansion_coefficient_hermitian_basis( data_array, c_sys.basis() ) quara_state = State(vec=vec, c_sys=c_sys) else: raise ValueError("invalid Qobj type") return quara_state
[docs]def convert_state_quara_to_qutip(quara_state: State) -> Qobj: """converts Quara State to QuTiP Qobj. Parameters ---------- quara_state: State Quara State. Returns ------- Qobj Qobj representing quantum state. """ density_mat = quara_state.to_density_matrix() return Qobj(density_mat)
[docs]def convert_povm_qutip_to_quara( qutip_qobjs: List[Qobj], c_sys: CompositeSystem ) -> Povm: """converts QuTiP Qobj to Quara Povm. Parameters ---------- qutip_qobjs: List[Qobj] List of Qobj representing POVM. The type of Qobj has to be 'oper'. c_sys : CompositeSystem CompositeSystem containing POVM. Returns ------- Povm Quara Povm. Raises ------ ValueError Invalid argument for Povm constructor. """ vecs = [] for item in qutip_qobjs: matrix = item.data.toarray() vecs.append( calc_hermitian_matrix_expansion_coefficient_hermitian_basis( matrix, c_sys.basis() ) ) return Povm(c_sys, vecs)
[docs]def convert_povm_quara_to_qutip(quara_povm: Povm) -> List[Qobj]: """converts Quara Povm to QuTiP Qobj. Parameters ---------- quara_povm: Povm Quara Povm. Returns ------- List[Qobj] List of Qobj representing POVM. """ matrices = quara_povm.matrices() qutip_povm = [Qobj(matrix) for matrix in matrices] return qutip_povm
[docs]def convert_gate_qutip_to_quara(qutip_qobj: Qobj, c_sys: CompositeSystem) -> Gate: """converts QuTiP Qobj to Quara Gate. Parameters ---------- qutip_qobj: Qobj Qobj representing quantum gate in super representation. c_sys : CompositeSystem CompositeSystem containing gate. Returns ------- Gate Quara Gate. Raises ------ ValueError Invalid argument for Gate constructor. """ hs_matrix_column_major = qutip_qobj.data.toarray() dim = int(np.sqrt(qutip_qobj.shape[0])) comp_basis_column_major = get_comp_basis(dim, "column_major") hs_matrix_converted = convert_hs( hs_matrix_column_major, comp_basis_column_major, c_sys.basis() ) hs_matrix_truncated = truncate_hs(hs_matrix_converted) return Gate(c_sys=c_sys, hs=hs_matrix_truncated)
[docs]def convert_gate_quara_to_qutip(quara_gate: Gate) -> Qobj: """converts Quara Gate to QuTiP Qobj. Parameters ---------- quara_gate: Gate Quara Gate. Returns ------- Qobj Qobj representing quantum gate in super representation. """ comp_basis = get_comp_basis(quara_gate.dim, "column_major") hs_matrix = quara_gate.convert_basis(comp_basis) return Qobj(hs_matrix, type="super")