from __future__ import annotations import numpy as np import pandas as pd from .utils import infer_family def sample_base_designs(n=1000, seed=7) -> pd.DataFrame: rng = np.random.default_rng(seed) types = np.array([ "NC_pillbox_Lband", "SC_elliptical_1p3GHz", "NC_Cband_TW", "NC_Xband_SW", ]) probs = np.array([0.25, 0.20, 0.30, 0.25]) types_arr = rng.choice(types, size=n, p=probs) f = np.zeros(n) rq = np.zeros(n) q0 = np.zeros(n) eacc = np.zeros(n) length = np.zeros(n) beta = np.zeros(n) cryo = np.full(n, np.nan) for i, typ in enumerate(types_arr): if typ == "NC_pillbox_Lband": f[i] = rng.uniform(0.20e9, 0.80e9) rq[i] = rng.uniform(60, 150) q0[i] = rng.uniform(1e4, 8e4) eacc[i] = rng.uniform(8, 20) length[i] = rng.uniform(0.15, 0.60) beta[i] = rng.uniform(0.7, 2.5) elif typ == "SC_elliptical_1p3GHz": f[i] = rng.uniform(0.80e9, 1.60e9) rq[i] = rng.uniform(200, 400) q0[i] = rng.uniform(5e9, 2e10) eacc[i] = rng.uniform(10, 25) length[i] = rng.uniform(0.60, 1.20) beta[i] = rng.uniform(0.8, 2.0) cryo[i] = rng.uniform(1.8, 4.2) elif typ == "NC_Cband_TW": f[i] = rng.uniform(5.00e9, 6.00e9) rq[i] = rng.uniform(100, 280) q0[i] = rng.uniform(2e4, 8e4) eacc[i] = rng.uniform(12, 30) length[i] = rng.uniform(0.20, 0.60) beta[i] = rng.uniform(0.8, 3.0) else: f[i] = rng.uniform(9.00e9, 12.0e9) rq[i] = rng.uniform(80, 200) q0[i] = rng.uniform(1e4, 6e4) eacc[i] = rng.uniform(20, 45) length[i] = rng.uniform(0.15, 0.45) beta[i] = rng.uniform(0.8, 3.0) df = pd.DataFrame({ "type": types_arr, "freq_Hz": f, "freq_GHz": f * 1e-9, "R_over_Q_ohm": rq, "Q0": q0, "Eacc_MVpm": eacc, "L_m": length, "beta": beta, "cryo_temp_K": cryo, }) df["family"] = df["type"].map(infer_family) df["Vc_MV"] = df["Eacc_MVpm"] * df["L_m"] df["Q_loaded"] = df["Q0"] / (1.0 + df["beta"]) return df def sample_family_conditioned_operating_point(df: pd.DataFrame, seed=17) -> pd.DataFrame: rng = np.random.default_rng(seed) pulse_ns = np.zeros(len(df)) rep_hz = np.zeros(len(df)) p_aux_kW = np.zeros(len(df)) source_power_avail_kW = np.zeros(len(df)) cooling_capacity_kW = np.zeros(len(df)) surf_factor = np.zeros(len(df)) geom_factor = np.zeros(len(df)) freq_factor = np.zeros(len(df)) fab_sigma_um = np.zeros(len(df)) delta_allow_um = np.zeros(len(df)) s_f = np.zeros(len(df)) s_phi = np.zeros(len(df)) s_c = np.zeros(len(df)) for i, fam in enumerate(df["family"].values): if fam == "Lband": pulse_ns[i] = rng.uniform(800.0, 3000.0) rep_hz[i] = rng.uniform(100.0, 2000.0) p_aux_kW[i] = rng.uniform(0.4, 1.5) source_power_avail_kW[i] = rng.uniform(4.0, 8.0) cooling_capacity_kW[i] = rng.uniform(6.0, 12.0) surf_factor[i] = rng.uniform(0.9, 1.1) geom_factor[i] = rng.uniform(0.8, 1.1) freq_factor[i] = rng.uniform(0.9, 1.05) fab_sigma_um[i] = rng.uniform(10.0, 40.0) delta_allow_um[i] = rng.uniform(40.0, 100.0) s_f[i] = rng.uniform(0.003, 0.010) s_phi[i] = rng.uniform(0.002, 0.008) s_c[i] = rng.uniform(0.001, 0.006) elif fam == "Cband": pulse_ns[i] = rng.uniform(200.0, 800.0) rep_hz[i] = rng.uniform(50.0, 500.0) p_aux_kW[i] = rng.uniform(0.8, 2.2) source_power_avail_kW[i] = rng.uniform(9.0, 15.0) cooling_capacity_kW[i] = rng.uniform(10.0, 20.0) surf_factor[i] = rng.uniform(0.95, 1.20) geom_factor[i] = rng.uniform(0.9, 1.2) freq_factor[i] = rng.uniform(1.0, 1.15) fab_sigma_um[i] = rng.uniform(5.0, 20.0) delta_allow_um[i] = rng.uniform(15.0, 40.0) s_f[i] = rng.uniform(0.010, 0.025) s_phi[i] = rng.uniform(0.008, 0.020) s_c[i] = rng.uniform(0.006, 0.015) elif fam == "Xband": pulse_ns[i] = rng.uniform(50.0, 300.0) rep_hz[i] = rng.uniform(10.0, 200.0) p_aux_kW[i] = rng.uniform(1.0, 3.0) source_power_avail_kW[i] = rng.uniform(12.0, 20.0) cooling_capacity_kW[i] = rng.uniform(12.0, 24.0) surf_factor[i] = rng.uniform(1.0, 1.35) geom_factor[i] = rng.uniform(1.0, 1.3) freq_factor[i] = rng.uniform(1.1, 1.3) fab_sigma_um[i] = rng.uniform(2.0, 10.0) delta_allow_um[i] = rng.uniform(5.0, 18.0) s_f[i] = rng.uniform(0.020, 0.060) s_phi[i] = rng.uniform(0.015, 0.050) s_c[i] = rng.uniform(0.010, 0.035) elif fam == "SC": pulse_ns[i] = rng.uniform(5000.0, 100000.0) rep_hz[i] = rng.uniform(1.0, 100.0) p_aux_kW[i] = rng.uniform(4.0, 15.0) source_power_avail_kW[i] = rng.uniform(8.0, 20.0) cooling_capacity_kW[i] = rng.uniform(15.0, 40.0) surf_factor[i] = rng.uniform(0.9, 1.1) geom_factor[i] = rng.uniform(0.8, 1.0) freq_factor[i] = rng.uniform(0.9, 1.05) fab_sigma_um[i] = rng.uniform(10.0, 30.0) delta_allow_um[i] = rng.uniform(30.0, 80.0) s_f[i] = rng.uniform(0.004, 0.012) s_phi[i] = rng.uniform(0.003, 0.010) s_c[i] = rng.uniform(0.002, 0.008) else: pulse_ns[i] = rng.uniform(100.0, 1000.0) rep_hz[i] = rng.uniform(10.0, 500.0) p_aux_kW[i] = rng.uniform(1.0, 3.0) source_power_avail_kW[i] = rng.uniform(5.0, 15.0) cooling_capacity_kW[i] = rng.uniform(8.0, 16.0) surf_factor[i] = 1.0 geom_factor[i] = 1.0 freq_factor[i] = 1.0 fab_sigma_um[i] = 10.0 delta_allow_um[i] = 20.0 s_f[i] = 0.01 s_phi[i] = 0.01 s_c[i] = 0.01 out = df.copy() out["pulse_length_ns"] = pulse_ns out["rep_rate_Hz"] = rep_hz out["P_aux_kW"] = p_aux_kW out["source_power_avail_kW"] = source_power_avail_kW out["cooling_capacity_kW"] = cooling_capacity_kW out["surf_factor"] = surf_factor out["geom_factor"] = geom_factor out["freq_factor"] = freq_factor out["fab_sigma_um"] = fab_sigma_um out["delta_allow_um"] = delta_allow_um out["S_f"] = s_f out["S_phi"] = s_phi out["S_c"] = s_c return out