Skip to content

kno

Kerr Nonlinear Oscillator

KNO

Bases: Device

Kerr Nonlinear Oscillator Device.

Source code in jaxquantum/devices/superconducting/kno.py
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
@struct.dataclass
class KNO(Device):
    """
    Kerr Nonlinear Oscillator Device.
    """

    @classmethod
    def param_validation(cls, N, N_pre_diag, params, hamiltonian, basis):
        """This can be overridden by subclasses."""
        assert basis == BasisTypes.fock, (
            "Kerr Nonlinear Oscillator must be defined in the Fock basis."
        )
        assert hamiltonian == HamiltonianTypes.full, (
            "Kerr Nonlinear Oscillator uses a full Hamiltonian."
        )
        assert "ω" in params and "α" in params, (
            "Kerr Nonlinear Oscillator requires frequency 'ω' and anharmonicity 'α' as parameters."
        )

    def common_ops(self):
        ops = {}

        N = self.N
        ops["id"] = identity(N)
        ops["a"] = destroy(N)
        ops["a_dag"] = create(N)
        ops["phi"] = (ops["a"] + ops["a_dag"]) / jnp.sqrt(2)
        ops["n"] = 1j * (ops["a_dag"] - ops["a"]) / jnp.sqrt(2)
        return ops

    def get_linear_ω(self):
        """Get frequency of linear terms."""
        return self.params["ω"]

    def get_anharm(self):
        """Get anharmonicity."""
        return self.params["α"]

    def get_H_linear(self):
        """Return linear terms in H."""
        w = self.get_linear_ω()
        return w * self.linear_ops["a_dag"] @ self.linear_ops["a"]

    def get_H_full(self):
        """Return full H in linear basis."""
        α = self.get_anharm()

        return self.get_H_linear() + (α / 2) * (
            self.linear_ops["a_dag"]
            @ self.linear_ops["a_dag"]
            @ self.linear_ops["a"]
            @ self.linear_ops["a"]
        )

get_H_full()

Return full H in linear basis.

Source code in jaxquantum/devices/superconducting/kno.py
57
58
59
60
61
62
63
64
65
66
def get_H_full(self):
    """Return full H in linear basis."""
    α = self.get_anharm()

    return self.get_H_linear() + (α / 2) * (
        self.linear_ops["a_dag"]
        @ self.linear_ops["a_dag"]
        @ self.linear_ops["a"]
        @ self.linear_ops["a"]
    )

get_H_linear()

Return linear terms in H.

Source code in jaxquantum/devices/superconducting/kno.py
52
53
54
55
def get_H_linear(self):
    """Return linear terms in H."""
    w = self.get_linear_ω()
    return w * self.linear_ops["a_dag"] @ self.linear_ops["a"]

get_anharm()

Get anharmonicity.

Source code in jaxquantum/devices/superconducting/kno.py
48
49
50
def get_anharm(self):
    """Get anharmonicity."""
    return self.params["α"]

get_linear_ω()

Get frequency of linear terms.

Source code in jaxquantum/devices/superconducting/kno.py
44
45
46
def get_linear_ω(self):
    """Get frequency of linear terms."""
    return self.params["ω"]

param_validation(N, N_pre_diag, params, hamiltonian, basis) classmethod

This can be overridden by subclasses.

Source code in jaxquantum/devices/superconducting/kno.py
20
21
22
23
24
25
26
27
28
29
30
31
@classmethod
def param_validation(cls, N, N_pre_diag, params, hamiltonian, basis):
    """This can be overridden by subclasses."""
    assert basis == BasisTypes.fock, (
        "Kerr Nonlinear Oscillator must be defined in the Fock basis."
    )
    assert hamiltonian == HamiltonianTypes.full, (
        "Kerr Nonlinear Oscillator uses a full Hamiltonian."
    )
    assert "ω" in params and "α" in params, (
        "Kerr Nonlinear Oscillator requires frequency 'ω' and anharmonicity 'α' as parameters."
    )