Source code for squadds.core.db_merge
"""Merge helpers for composing qubit and cavity datasets."""
from __future__ import annotations
from multiprocessing import Pool, cpu_count
import numpy as np
import pandas as pd
from tqdm import tqdm
from squadds.core.processing import merge_dfs
from squadds.core.utils import create_unified_design_options
[docs]
def add_merger_terms_columns(qubit_df: pd.DataFrame, cavity_df: pd.DataFrame, merger_terms: list[str]):
"""Populate merger-term columns using the legacy nested design-option lookups."""
for merger_term in merger_terms:
qubit_df[merger_term] = qubit_df["design_options"].map(
lambda x: x["connection_pads"]["readout"].get(merger_term)
)
cavity_df[merger_term] = cavity_df["design_options"].map(
lambda x: x["claw_opts"]["connection_pads"]["readout"].get(merger_term)
)
return qubit_df, cavity_df
[docs]
def create_qubit_cavity_dataframe(
qubit_df: pd.DataFrame,
cavity_df: pd.DataFrame,
merger_terms: list[str] | None = None,
parallelize: bool = False,
num_cpu=None,
) -> pd.DataFrame:
"""Merge qubit and cavity dataframes using the legacy SQuADDS_DB behavior."""
merger_terms = [] if merger_terms is None else merger_terms
qubit_df, cavity_df = add_merger_terms_columns(qubit_df, cavity_df, merger_terms)
qubit_df = qubit_df.reset_index().rename(columns={"index": "index_qc"})
if not merger_terms:
merged_df = qubit_df.merge(cavity_df, how="cross", suffixes=("_qubit", "_cavity_claw"))
elif parallelize:
n_cores = cpu_count() if num_cpu is None else num_cpu
qubit_df_splits = np.array_split(qubit_df, n_cores)
with Pool(n_cores) as pool:
merged_df_parts = list(
tqdm(
pool.starmap(merge_dfs, [(split, cavity_df, merger_terms) for split in qubit_df_splits]),
total=n_cores,
)
)
merged_df = pd.concat(merged_df_parts).reset_index(drop=True)
else:
merged_df = merge_dfs(qubit_df, cavity_df, merger_terms)
merged_df["design_options"] = merged_df.apply(create_unified_design_options, axis=1)
return merged_df