Coverage for jaxquantum/devices/superconducting/ideal_qubit.py: 0%

32 statements  

« prev     ^ index     » next       coverage.py v7.9.2, created at 2025-07-17 21:51 +0000

1"""IdealQubit.""" 

2 

3from flax import struct 

4from jax import config 

5 

6 

7from jaxquantum.devices.base.base import Device, BasisTypes, HamiltonianTypes 

8from jaxquantum.core.operators import identity, sigmaz, sigmax, sigmay, sigmam, sigmap 

9 

10config.update("jax_enable_x64", True) 

11 

12 

13@struct.dataclass 

14class IdealQubit(Device): 

15 """ 

16 Ideal qubit Device. 

17 """ 

18 

19 @classmethod 

20 def param_validation(cls, N, N_pre_diag, params, hamiltonian, basis): 

21 """This can be overridden by subclasses.""" 

22 assert basis == BasisTypes.fock, ( 

23 "IdealQubit is a two-level system defined in the Fock basis." 

24 ) 

25 assert hamiltonian == HamiltonianTypes.full, ( 

26 "IdealQubit requires a full Hamiltonian." 

27 ) 

28 assert N == N_pre_diag == 2, "IdealQubit is a two-level system." 

29 assert "ω" in params, "IdealQubit requires a frequency parameter 'ω'." 

30 

31 def common_ops(self): 

32 """Written in the linear basis.""" 

33 ops = {} 

34 

35 assert self.N_pre_diag == 2 

36 assert self.N == 2 

37 

38 N = self.N_pre_diag 

39 ops["id"] = identity(N) 

40 ops["sigmaz"] = sigmaz() 

41 ops["sigmax"] = sigmax() 

42 ops["sigmay"] = sigmay() 

43 ops["sigmam"] = sigmam() 

44 ops["sigmap"] = sigmap() 

45 

46 return ops 

47 

48 def get_linear_ω(self): 

49 """Get frequency of linear terms.""" 

50 return self.params["ω"] 

51 

52 def get_H_linear(self): 

53 """Return linear terms in H.""" 

54 w = self.get_linear_ω() 

55 return (w / 2) * self.linear_ops["sigma_z"] 

56 

57 def get_H_full(self): 

58 """Return full H in linear basis.""" 

59 return self.get_H_linear()