Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
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()