Examples
Examples of the implementation of the Bath Mapper's functionality can be found below.
from struqture_py import mixed_systems, spins, bosons  # type: ignore
from hqs_quantum_libraries.bath_mapper import (  # type: ignore
    coupling_to_spectral_function,
    SpinBRNoiseOperator,
    spectral_function_to_coupling,
)
import numpy as np
# Use three boson baths
bath_energies = [0, 1, 2]
# Use three boson baths
bath_broadenings = [0.1, 0.2, 0.3]
# Couplings to spin 0
couplings_0 = [0.3, 0.1, 0.3]
# Couplings to spin 1
couplings_1 = [0.2, 0.4, 0.2]
# Create a new mixed system with one spin and one boson subsystem
Hnew = mixed_systems.MixedLindbladOpenSystem(
    1,
    1,
    0,
)
# Set bath energies
for bath_index, be in enumerate(bath_energies):
    index = mixed_systems.HermitianMixedProduct(
        # Identity spin operator
        [spins.PauliProduct()],
        # Create a Boson occupation operator
        [bosons.BosonProduct([bath_index], [bath_index])],
        [],
    )
    Hnew.system_set(index, be)
# Set bath energies
for bath_index, bb in enumerate(bath_broadenings):
    # create the index for the Lindblad terms.
    # We have pure damping
    index = mixed_systems.MixedDecoherenceProduct(
        # Identity spin operator
        [spins.DecoherenceProduct()],
        # Create a Boson occupation operator
        [bosons.BosonProduct([], [bath_index])],
        [],
    )
    Hnew.noise_set((index, index), bb)
# Set couplings, use pure ZZ coupling
for bath_index, c in enumerate(couplings_0):
    index = mixed_systems.HermitianMixedProduct(
        # Identity spin operator
        [spins.PauliProduct().z(0)],
        # Create a Boson coupling  operator (always a + a^dagger)
        [bosons.BosonProduct([], [bath_index])],
        [],
    )
    Hnew.system_set(index, c)
# Set couplings, use pure ZZ coupling
for bath_index, c in enumerate(couplings_1):
    index = mixed_systems.HermitianMixedProduct(
        # Identity spin operator
        [spins.PauliProduct().z(1)],
        # Create a Boson coupling  operator (always a + a^dagger)
        [bosons.BosonProduct([], [bath_index])],
        [],
    )
    Hnew.system_set(index, c)
print("Newly created system")
print(Hnew.__repr__())
# Create a spectral function from Spin-Bath-System
frequencies = np.linspace(-0.5, 4, 100)
spectral_function = coupling_to_spectral_function(Hnew, frequencies)
print("Spectrum frequencies")
print(spectral_function.frequencies())
print("Spectrum for 0, 0 spin indices with Z-Z coupling")
print(spectral_function.get(("0Z", "0Z")))
print("Spectrum for 0, 1 spin indices with Z-Z coupling")
print(spectral_function.get(("0Z", "1Z")))
# Creating an empty spectral function
spectra = SpinBRNoiseOperator(frequencies)
calculated_coupling = spectral_function_to_coupling(spectra, 2)
print("Coupling obtained from spin function")
print(calculated_coupling)
For further examples, please see our Quantum Libraries Examples.