Coverage for qpdk / models / __init__.py: 97%
38 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-02 17:50 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-02 17:50 +0000
1"""Model definitions for qpdk."""
3# ruff: noqa: E402
5import jax
6import sax
8from qpdk.models.capacitor import (
9 interdigital_capacitor,
10 plate_capacitor,
11)
12from qpdk.models.inductor import (
13 lumped_element_resonator,
14 meander_inductor,
15 meander_inductor_inductance_analytical,
16)
17from qpdk.models.junction import josephson_junction, squid_junction
19sax.set_port_naming_strategy("optical")
21from qpdk.models.constants import (
22 DEFAULT_FREQUENCY,
23)
24from qpdk.models.couplers import (
25 coupler_ring,
26 coupler_straight,
27 cpw_cpw_coupling_capacitance,
28)
29from qpdk.models.cpw import (
30 cpw_epsilon_eff,
31 cpw_parameters,
32 cpw_thickness_correction,
33 cpw_z0,
34 cpw_z0_from_cross_section,
35 microstrip_epsilon_eff,
36 microstrip_thickness_correction,
37 microstrip_z0,
38 propagation_constant,
39 transmission_line_s_params,
40)
41from qpdk.models.generic import (
42 admittance,
43 capacitor,
44 electrical_open,
45 electrical_short,
46 electrical_short_2_port,
47 gamma_0_load,
48 impedance,
49 inductor,
50 lc_resonator,
51 lc_resonator_coupled,
52 open,
53 series_impedance,
54 short,
55 short_2_port,
56 shunt_admittance,
57)
58from qpdk.models.perturbation import (
59 dispersive_shift,
60 dispersive_shift_to_coupling,
61 ej_ec_to_frequency_and_anharmonicity,
62 measurement_induced_dephasing,
63 purcell_decay_rate,
64 resonator_linewidth_from_q,
65)
66from qpdk.models.qubit import (
67 coupling_strength_to_capacitance,
68 double_island_transmon,
69 double_island_transmon_with_bbox,
70 double_island_transmon_with_resonator,
71 double_pad_transmon,
72 double_pad_transmon_with_bbox,
73 double_pad_transmon_with_resonator,
74 ec_to_capacitance,
75 ej_to_inductance,
76 el_to_inductance,
77 flipmon,
78 flipmon_with_bbox,
79 flipmon_with_resonator,
80 fluxonium,
81 fluxonium_coupled,
82 fluxonium_with_bbox,
83 fluxonium_with_resonator,
84 qubit_with_resonator,
85 shunted_transmon,
86 transmon_coupled,
87 transmon_with_resonator,
88 xmon_transmon,
89)
90from qpdk.models.resonator import (
91 quarter_wave_resonator_coupled,
92 resonator,
93 resonator_coupled,
94 resonator_frequency,
95 resonator_half_wave,
96 resonator_quarter_wave,
97)
98from qpdk.models.unimon import (
99 el_to_arm_inductance,
100 unimon_coupled,
101 unimon_energies,
102 unimon_frequency_and_anharmonicity,
103 unimon_hamiltonian,
104)
105from qpdk.models.waveguides import (
106 airbridge,
107 bend_circular,
108 bend_euler,
109 bend_s,
110 indium_bump,
111 launcher,
112 nxn,
113 rectangle,
114 straight,
115 straight_double_open,
116 straight_microstrip,
117 straight_open,
118 straight_shorted,
119 taper_cross_section,
120 tee,
121 tsv,
122)
124__all__ = [
125 "DEFAULT_FREQUENCY",
126 "admittance",
127 "airbridge",
128 "bend_circular",
129 "bend_euler",
130 "bend_s",
131 "capacitor",
132 "coupler_ring",
133 "coupler_straight",
134 "coupling_strength_to_capacitance",
135 "cpw_cpw_coupling_capacitance",
136 "cpw_epsilon_eff",
137 "cpw_parameters",
138 "cpw_thickness_correction",
139 "cpw_z0",
140 "cpw_z0_from_cross_section",
141 "dispersive_shift",
142 "dispersive_shift_to_coupling",
143 "double_island_transmon",
144 "double_island_transmon_with_bbox",
145 "double_island_transmon_with_resonator",
146 "double_pad_transmon",
147 "double_pad_transmon_with_bbox",
148 "double_pad_transmon_with_resonator",
149 "ec_to_capacitance",
150 "ej_ec_to_frequency_and_anharmonicity",
151 "ej_to_inductance",
152 "el_to_arm_inductance",
153 "el_to_inductance",
154 "electrical_open",
155 "electrical_short",
156 "electrical_short_2_port",
157 "flipmon",
158 "flipmon_with_bbox",
159 "flipmon_with_resonator",
160 "fluxonium",
161 "fluxonium_coupled",
162 "fluxonium_with_bbox",
163 "fluxonium_with_resonator",
164 "gamma_0_load",
165 "impedance",
166 "indium_bump",
167 "inductor",
168 "interdigital_capacitor",
169 "josephson_junction",
170 "launcher",
171 "lc_resonator",
172 "lc_resonator_coupled",
173 "lumped_element_resonator",
174 "meander_inductor",
175 "meander_inductor_inductance_analytical",
176 "measurement_induced_dephasing",
177 "microstrip_epsilon_eff",
178 "microstrip_thickness_correction",
179 "microstrip_z0",
180 "models",
181 "nxn",
182 "open",
183 "plate_capacitor",
184 "propagation_constant",
185 "purcell_decay_rate",
186 "quarter_wave_resonator_coupled",
187 "qubit_with_resonator",
188 "rectangle",
189 "resonator",
190 "resonator_coupled",
191 "resonator_frequency",
192 "resonator_half_wave",
193 "resonator_linewidth_from_q",
194 "resonator_quarter_wave",
195 "series_impedance",
196 "short",
197 "short_2_port",
198 "shunt_admittance",
199 "shunted_transmon",
200 "squid_junction",
201 "straight",
202 "straight_double_open",
203 "straight_microstrip",
204 "straight_open",
205 "straight_shorted",
206 "taper_cross_section",
207 "tee",
208 "transmission_line_s_params",
209 "transmon_coupled",
210 "transmon_with_resonator",
211 "tsv",
212 "unimon_coupled",
213 "unimon_energies",
214 "unimon_frequency_and_anharmonicity",
215 "unimon_hamiltonian",
216 "xmon_transmon",
217]
220def _is_sax_model(obj: object) -> bool:
221 """Check if an object is a SAX model function."""
222 if not callable(obj):
223 return False
225 # Skip functions that return jax.Array or tuple (these are Hamiltonian models)
226 if hasattr(obj, "__annotations__") and "return" in obj.__annotations__:
227 ret = obj.__annotations__["return"]
228 # If it returns jax.Array or a tuple of floats, it's not a SAX S-parameter model
229 if ret in {jax.Array, "jax.Array"}:
230 return False
231 # Match names like tuple[float, float]
232 if hasattr(ret, "__name__") and ret.__name__ == "tuple":
233 return False
234 if str(ret).startswith("tuple") or str(ret).startswith("Tuple"):
235 return False
237 # Check if return type is sax.SType or sax.SDict
238 for target in [obj, getattr(obj, "__wrapped__", None)]:
239 if target is None:
240 continue
241 if hasattr(target, "__annotations__") and "return" in target.__annotations__:
242 ret = target.__annotations__["return"]
243 if hasattr(ret, "__name__") and ret.__name__ in {"SType", "SDict"}:
244 return True
245 # Also check identity for standard cases
246 if ret in {sax.SType, sax.SDict}:
247 return True
248 return sax.try_into[sax.Model](obj) is not None
251models = {
252 k: v
253 for k, v in globals().items()
254 if k in __all__ and k != "models" and _is_sax_model(v)
255}