From d799fe7ad19a7808fa36158894b3be7977cf5593 Mon Sep 17 00:00:00 2001 From: Rodolfo Carobene Date: Thu, 1 Aug 2024 16:29:17 +0200 Subject: [PATCH 1/3] add total number of points to be acquired --- src/qibosoq/programs/base.py | 4 +- src/qibosoq/programs/sweepers.py | 63 +++++++++++++++++++------------- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/src/qibosoq/programs/base.py b/src/qibosoq/programs/base.py index 4e7edbf..fc55b50 100644 --- a/src/qibosoq/programs/base.py +++ b/src/qibosoq/programs/base.py @@ -44,6 +44,7 @@ def __init__( self.soc = soc self.soccfg = soc # this is used by qick + self.tot_sweeper_points = qpcfg.reps self.sequence = sequence self.pulse_sequence = [elem for elem in sequence if isinstance(elem, Pulse)] self.qubits = qubits @@ -269,9 +270,8 @@ def collect_shots(self) -> Tuple[list, list]: unique_adcs, adc_count = np.unique(adcs, return_counts=True) - len_acq = len(self.di_buf[0]) // len(unique_adcs) stacked = ( - np.stack((self.di_buf, self.dq_buf))[:, :, :len_acq] + np.stack((self.di_buf, self.dq_buf))[:, :, : self.tot_sweeper_points] / np.array(lengths)[:, np.newaxis] ) tot = [] diff --git a/src/qibosoq/programs/sweepers.py b/src/qibosoq/programs/sweepers.py index fa847fe..f837085 100644 --- a/src/qibosoq/programs/sweepers.py +++ b/src/qibosoq/programs/sweepers.py @@ -73,41 +73,52 @@ def validate(self, sweeper: Sweeper): "Sweepers on flux pulses are not implemented." ) - def add_sweep_info(self, sweeper: Sweeper): - """Register RfsocSweep objects. + def add_sweep_info_bias(self, sweeper: Sweeper) -> List[Sweeper]: + """Generate RfsocSweep objects for biases. Args: sweeper: single qibolab sweeper object to register """ - self.validate(sweeper) sweep_list = [] + for idx, jdx in enumerate(sweeper.indexes): + gen_ch = self.qubits[jdx].dac + if gen_ch is None: + raise ValueError("Qubit dac (flux bias) not provided.") + sweep_type = "gain" + std_register = self.get_gen_reg(gen_ch, sweep_type) + swept_register = self.new_gen_reg(gen_ch, name=f"sweep_bias_{gen_ch}") + self.bias_sweep_registers[gen_ch] = (swept_register, std_register) + + max_gain = int(self.soccfg["gens"][gen_ch]["maxv"]) + starts = (sweeper.starts * max_gain).astype(int) + stops = (sweeper.stops * max_gain).astype(int) - if sweeper.parameters[0] is Parameter.BIAS: - for idx, jdx in enumerate(sweeper.indexes): - gen_ch = self.qubits[jdx].dac - if gen_ch is None: - raise ValueError("Qubit dac (flux bias) not provided.") - sweep_type = "gain" - std_register = self.get_gen_reg(gen_ch, sweep_type) - swept_register = self.new_gen_reg(gen_ch, name=f"sweep_bias_{gen_ch}") - self.bias_sweep_registers[gen_ch] = (swept_register, std_register) + new_sweep = QickSweep( + self, + swept_register, # sweeper_register + starts[idx], # start + stops[idx], # stop + sweeper.expts, # number of points + ) + sweep_list.append(new_sweep) + return sweep_list - max_gain = int(self.soccfg["gens"][gen_ch]["maxv"]) - starts = (sweeper.starts * max_gain).astype(int) - stops = (sweeper.stops * max_gain).astype(int) + def add_sweep_info(self, sweeper: Sweeper): + """Register RfsocSweep objects. - new_sweep = QickSweep( - self, - swept_register, # sweeper_register - starts[idx], # start - stops[idx], # stop - sweeper.expts, # number of points - ) - sweep_list.append(new_sweep) + Args: + sweeper: single qibolab sweeper object to register + """ + self.validate(sweeper) - self.add_sweep(merge_sweeps(sweep_list)) + if sweeper.parameters[0] is Parameter.BIAS: + sweep_list = self.add_sweep_info_bias(sweeper) + merged = merge_sweeps(sweep_list) + self.tot_sweeper_points *= len(merged.get_sweep_pts()) + self.add_sweep(merged) return + sweep_list = [] for idx, jdx in enumerate(sweeper.indexes): pulse = self.sequence[jdx] gen_ch = pulse.dac @@ -136,7 +147,9 @@ def add_sweep_info(self, sweeper: Sweeper): ) sweep_list.append(new_sweep) - self.add_sweep(merge_sweeps(sweep_list)) + merged = merge_sweeps(sweep_list) + self.tot_sweeper_points *= len(merged.get_sweep_pts()) + self.add_sweep(merged) def initialize(self): """Declre nyquist zones for all the DACs and all the readout frequencies. From 698d23e2a2ba044c3700b83cc294ca9e0ebd3ee2 Mon Sep 17 00:00:00 2001 From: Rodolfo Carobene Date: Thu, 1 Aug 2024 17:26:06 +0200 Subject: [PATCH 2/3] fix different reshaped count --- src/qibosoq/programs/base.py | 13 ++++++------- src/qibosoq/programs/sweepers.py | 2 -- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/qibosoq/programs/base.py b/src/qibosoq/programs/base.py index fc55b50..52d714f 100644 --- a/src/qibosoq/programs/base.py +++ b/src/qibosoq/programs/base.py @@ -44,7 +44,6 @@ def __init__( self.soc = soc self.soccfg = soc # this is used by qick - self.tot_sweeper_points = qpcfg.reps self.sequence = sequence self.pulse_sequence = [elem for elem in sequence if isinstance(elem, Pulse)] self.qubits = qubits @@ -268,12 +267,7 @@ def collect_shots(self) -> Tuple[list, list]: lengths.append(self.soc.us2cycles(elem.duration, gen_ch=ro_ch)) adcs.append(adc_ch) - unique_adcs, adc_count = np.unique(adcs, return_counts=True) - - stacked = ( - np.stack((self.di_buf, self.dq_buf))[:, :, : self.tot_sweeper_points] - / np.array(lengths)[:, np.newaxis] - ) + _, adc_count = np.unique(adcs, return_counts=True) tot = [] for idx, count in enumerate(adc_count.astype(int)): @@ -291,6 +285,11 @@ def collect_shots(self) -> Tuple[list, list]: # (adc_channels, number_of_readouts, number_of_shots) shape = (2, count, self.reps) + stacked = ( + np.stack((self.di_buf[idx], self.dq_buf[idx]))[:, : np.prod(shape[1:])] + / np.array(lengths)[:, np.newaxis] + ) + tot.append(stacked[:, idx].reshape(shape).tolist()) return tuple(list(x) for x in zip(*tot)) # type: ignore diff --git a/src/qibosoq/programs/sweepers.py b/src/qibosoq/programs/sweepers.py index f837085..b49ed7d 100644 --- a/src/qibosoq/programs/sweepers.py +++ b/src/qibosoq/programs/sweepers.py @@ -114,7 +114,6 @@ def add_sweep_info(self, sweeper: Sweeper): if sweeper.parameters[0] is Parameter.BIAS: sweep_list = self.add_sweep_info_bias(sweeper) merged = merge_sweeps(sweep_list) - self.tot_sweeper_points *= len(merged.get_sweep_pts()) self.add_sweep(merged) return @@ -148,7 +147,6 @@ def add_sweep_info(self, sweeper: Sweeper): sweep_list.append(new_sweep) merged = merge_sweeps(sweep_list) - self.tot_sweeper_points *= len(merged.get_sweep_pts()) self.add_sweep(merged) def initialize(self): From 87ac72cdf73cb133b9277a90ff3cb321bab7511e Mon Sep 17 00:00:00 2001 From: Rodolfo Carobene Date: Thu, 1 Aug 2024 17:32:56 +0200 Subject: [PATCH 3/3] fix test --- src/qibosoq/programs/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibosoq/programs/base.py b/src/qibosoq/programs/base.py index 52d714f..2b8bce9 100644 --- a/src/qibosoq/programs/base.py +++ b/src/qibosoq/programs/base.py @@ -290,7 +290,7 @@ def collect_shots(self) -> Tuple[list, list]: / np.array(lengths)[:, np.newaxis] ) - tot.append(stacked[:, idx].reshape(shape).tolist()) + tot.append(stacked.reshape(shape).tolist()) return tuple(list(x) for x in zip(*tot)) # type: ignore