def generate_experiment_program(self) -> Program: """ Generate a parameterized program containing the main body program along with some additions to support the various state preparation, measurement, and symmetrization specifications of this ``Experiment``. State preparation and measurement are achieved via ZXZXZ-decomposed single-qubit gates, where the angles of each ``RZ`` rotation are declared parameters that can be assigned at runtime. Symmetrization is achieved by putting an ``RX`` gate (also parameterized by a declared value) before each ``MEASURE`` operation. In addition, a ``RESET`` operation is prepended to the ``Program`` if the experiment has active qubit reset enabled. Finally, each qubit specified in the settings is measured, and the number of shots is added. :return: Parameterized ``Program`` that is capable of collecting statistics for every ``ExperimentSetting`` in this ``Experiment``. """ meas_qubits = self.get_meas_qubits() p = Program() if self.reset: if any( isinstance(instr, (Reset, ResetQubit)) for instr in self.program): raise ValueError("RESET already added to program") p += RESET() for settings in self: assert len(settings) == 1 if ("X" in str(settings[0].in_state)) or ("Y" in str( settings[0].in_state)): if f"DECLARE preparation_alpha" in self.program.out(): raise ValueError( f'Memory "preparation_alpha" has been declared already.' ) if f"DECLARE preparation_beta" in self.program.out(): raise ValueError( f'Memory "preparation_beta" has been declared already.' ) if f"DECLARE preparation_gamma" in self.program.out(): raise ValueError( f'Memory "preparation_gamma" has been declared already.' ) p += parameterized_single_qubit_state_preparation(meas_qubits) break p += self.program for settings in self: assert len(settings) == 1 if ("X" in str(settings[0].out_operator)) or ("Y" in str( settings[0].out_operator)): if f"DECLARE measurement_alpha" in self.program.out(): raise ValueError( f'Memory "measurement_alpha" has been declared already.' ) if f"DECLARE measurement_beta" in self.program.out(): raise ValueError( f'Memory "measurement_beta" has been declared already.' ) if f"DECLARE measurement_gamma" in self.program.out(): raise ValueError( f'Memory "measurement_gamma" has been declared already.' ) p += parameterized_single_qubit_measurement_basis(meas_qubits) break if self.symmetrization != 0: if f"DECLARE symmetrization" in self.program.out(): raise ValueError( f'Memory "symmetrization" has been declared already.') p += parameterized_readout_symmetrization(meas_qubits) if "DECLARE ro" in self.program.out(): raise ValueError( 'Memory "ro" has already been declared for this program.') p += measure_qubits(meas_qubits) p.wrap_in_numshots_loop(self.shots) return p
def test_measure_qubits(): p = Program() ro = p.declare('ro', 'BIT', 2) p += MEASURE(0, ro[0]) p += MEASURE(1, ro[1]) assert measure_qubits([0, 1]).out() == p.out()