Exemplo n.º 1
0
    def run(self, run_input, **options):
        """
        Run the Tphi backend
        """
        self.options.update_options(**options)
        shots = 1000
        t1_circuits = []
        t2ramsey_circuits = []
        for circ in run_input:
            if circ.metadata["composite_metadata"][0]["experiment_type"] == "T1":
                t1_circuits.append(circ)
            elif circ.metadata["composite_metadata"][0]["experiment_type"] == "T2Ramsey":
                t2ramsey_circuits.append(circ)
            else:
                raise ValueError("Illegal name for circuit in Tphi")

        job_t1 = self._internal_backends["T1"].run(run_input=t1_circuits, shots=shots)
        job_t2ramsey = self._internal_backends["T2*"].run(run_input=t2ramsey_circuits, shots=shots)
        final_results = job_t1.result().results + job_t2ramsey.result().results
        result_for_fake = Result(
            backend_name="Tphi backend",
            backend_version="0",
            qobj_id="0",
            job_id="0",
            success=True,
            results=final_results,
            status="JobStatus.DONE",
        )
        return FakeJob(self, result_for_fake)
 def run(self, run_input, **options):
     result = {
         "backend_name": "Dummmy backend",
         "backend_version": "0",
         "qobj_id": uuid.uuid4().hex,
         "job_id": uuid.uuid4().hex,
         "success": True,
         "results": [],
     }
     return FakeJob(backend=self, result=Result.from_dict(result))
Exemplo n.º 3
0
    def run(self, run_input, **options):
        """Run the restless backend."""

        self.options.update_options(**options)
        shots = self.options.get("shots")
        meas_level = self.options.get("meas_level")

        result = {
            "backend_name": f"{self.__class__.__name__}",
            "backend_version": "0",
            "qobj_id": 0,
            "job_id": 0,
            "success": True,
            "results": [],
        }

        self._compute_outcome_probabilities(run_input)

        if run_input[0].num_qubits != 2:
            raise DataProcessorError(f"{self.__class__.__name__} is a two qubit mock device.")

        prev_outcome, state_strings = "00", self._get_state_strings(2)

        # Setup the list of dicts where each dict corresponds to a circuit.
        sorted_memory = [{"memory": [], "metadata": circ.metadata} for circ in run_input]

        for _ in range(shots):
            for circ_idx, _ in enumerate(run_input):
                probs = self._precomputed_probabilities[(circ_idx, prev_outcome)]
                # Generate the next shot dependent on the pre-computed probabilities.
                outcome = self._rng.choice(state_strings, p=probs)
                # Append the single shot to the memory of the corresponding circuit.
                sorted_memory[circ_idx]["memory"].append(hex(int(outcome, 2)))

                prev_outcome = outcome

        for idx, circ in enumerate(run_input):
            counts = {}
            for key1, key2 in zip(["00", "01", "10", "11"], ["0x0", "0x1", "0x2", "0x3"]):
                counts[key1] = sorted_memory[idx]["memory"].count(key2)
            run_result = {
                "shots": shots,
                "success": True,
                "header": {"metadata": circ.metadata},
                "meas_level": meas_level,
                "data": {
                    "counts": counts,
                    "memory": sorted_memory[idx]["memory"],
                },
            }

            result["results"].append(run_result)

        return FakeJob(self, Result.from_dict(result))
Exemplo n.º 4
0
    def run(self, run_input: List[QuantumCircuit], **options) -> FakeJob:
        """
        Run the IQ backend.
        Args:
            run_input(List[QuantumCircuit]): A list of QuantumCircuit for which the backend will generate
             data for.
            **options: Experiment options. the options that are supported in this backend are
             'meas_level' and 'meas_return'.
                'meas_level': To generate data in the IQ plain, 'meas_level' should be assigned 1 or
                    MeasLevel.KERNELED. If 'meas_level' is 2 or MeasLevel.CLASSIFIED, the generated data
                    will be in the form of 'counts'.
                'meas_return': This option will only take effect if 'meas_level' = MeasLevel.CLASSIFIED.
                    It can get either MeasReturnType.AVERAGE or MeasReturnType.SINGLE. For the value
                      MeasReturnType.SINGLE the data of each shot will be stored in the result. For
                      MeasReturnType.AVERAGE, an average of all the shots will be calculated and stored
                      in the result.

        Returns:
            FakeJob: A job that contains the simulated data.
        """

        self.options.update_options(**options)
        shots = self.options.get("shots")
        meas_level = self.options.get("meas_level")

        result = {
            "backend_name": f"{self.__class__.__name__}",
            "backend_version": "0",
            "qobj_id": "0",
            "job_id": "0",
            "success": True,
            "results": [],
        }
        prob_list = self.experiment_helper.compute_probabilities(run_input)
        for prob, circ in zip(prob_list, run_input):
            run_result = {
                "shots": shots,
                "success": True,
                "header": {"metadata": circ.metadata},
                "meas_level": meas_level,
            }

            run_result["data"] = self._generate_data(prob, circ)
            result["results"].append(run_result)

        return FakeJob(self, Result.from_dict(result))
Exemplo n.º 5
0
    def run(self, run_input, **options):
        """Run the IQ backend."""

        self.options.update_options(**options)
        shots = self.options.get("shots")
        meas_level = self.options.get("meas_level")
        meas_return = self.options.get("meas_return")

        result = {
            "backend_name": f"{self.__class__.__name__}",
            "backend_version": "0",
            "qobj_id": 0,
            "job_id": 0,
            "success": True,
            "results": [],
        }

        for circ in run_input:
            run_result = {
                "shots": shots,
                "success": True,
                "header": {
                    "metadata": circ.metadata
                },
                "meas_level": meas_level,
            }

            prob = self._compute_probability(circ)

            if meas_level == MeasLevel.CLASSIFIED:
                ones = np.sum(self._rng.binomial(1, prob, size=shots))
                run_result["data"] = {"counts": {"1": ones, "0": shots - ones}}
            else:
                phase = self._iq_phase(circ)
                memory = self._draw_iq_shots(prob, shots, phase)

                if meas_return == "avg":
                    memory = np.average(np.array(memory), axis=0).tolist()

                run_result["data"] = {"memory": memory}

            result["results"].append(run_result)

        return FakeJob(self, Result.from_dict(result))
    def run(self, run_input, **kwargs):
        """Hard-coded experiment result generation based on the series definition."""
        results = []
        shots = kwargs.get("shots", 1024)

        series_defs = cr_hamiltonian_analysis.CrossResonanceHamiltonianAnalysis.__series__
        filter_kwargs_list = [sdef.filter_kwargs for sdef in series_defs]

        for test_circ in run_input:
            metadata = {
                "control_state": test_circ.metadata["control_state"],
                "meas_basis": test_circ.metadata["meas_basis"],
            }
            curve_ind = filter_kwargs_list.index(metadata)
            xval = test_circ.metadata["xval"]

            expv = series_defs[curve_ind].fit_func(xval, **self.fit_func_args)
            popl = 0.5 * (1 - expv)
            one_count = int(np.round(shots * popl))
            results.append({
                "shots": shots,
                "success": True,
                "header": {
                    "metadata": test_circ.metadata
                },
                "data": {
                    "counts": {
                        "0": shots - one_count,
                        "1": one_count
                    }
                },
            })

        result = {
            "backend_name": self.name(),
            "backend_version": self.configuration().backend_version,
            "qobj_id": "12345",
            "job_id": "12345",
            "success": True,
            "results": results,
        }
        return FakeJob(backend=self, result=Result.from_dict(result))
Exemplo n.º 7
0
            def run(self, run_input, **options):
                results = []
                for circ, cnt in zip(run_input, counts):
                    results.append(
                        {
                            "shots": -1,
                            "success": True,
                            "header": {"metadata": circ.metadata},
                            "data": {"counts": cnt},
                        }
                    )

                res = {
                    "backend_name": "backend",
                    "backend_version": "0",
                    "qobj_id": uuid.uuid4().hex,
                    "job_id": uuid.uuid4().hex,
                    "success": True,
                    "results": results,
                }
                return FakeJob(backend=self, result=Result.from_dict(res))
Exemplo n.º 8
0
    def run(self, run_input, **options):
        """
        Run the T2Ramsey backend
        """
        self.options.update_options(**options)
        shots = self.options.get("shots")
        result = {
            "backend_name": "T2Ramsey backend",
            "backend_version": "0",
            "qobj_id": 0,
            "job_id": 0,
            "success": True,
            "results": [],
        }
        for circ in run_input:
            nqubits = circ.num_qubits
            qubit_indices = {bit: idx for idx, bit in enumerate(circ.qubits)}
            clbit_indices = {bit: idx for idx, bit in enumerate(circ.clbits)}
            counts = dict()
            if self._readout0to1 is None:
                ro01 = np.zeros(nqubits)
            else:
                ro01 = self._readout0to1
            if self._readout1to0 is None:
                ro10 = np.zeros(nqubits)
            else:
                ro10 = self._readout1to0
            for _ in range(shots):
                if self._initial_prob_plus is None:
                    prob_plus = np.ones(nqubits)
                else:
                    prob_plus = self._initial_prob_plus.copy()

                clbits = np.zeros(circ.num_clbits, dtype=int)
                for op, qargs, cargs in circ.data:
                    qubit = qubit_indices[qargs[0]]

                    if op.name == "delay":
                        delay = op.params[0]
                        t2ramsey = self._t2ramsey[
                            qubit] * self._conversion_factor
                        freq = self._freq[qubit]

                        prob_plus[qubit] = (
                            self._a_param[qubit] * np.exp(-delay / t2ramsey) *
                            np.cos(2 * np.pi * freq * delay + self._phi[qubit])
                            + self._b_param[qubit])

                    if op.name == "measure":
                        # we measure in |+> basis which is the same as measuring |0>
                        meas_res = self._rng.binomial(
                            1,
                            (1 - prob_plus[qubit]) * (1 - ro10[qubit]) +
                            prob_plus[qubit] * ro01[qubit],
                        )
                        clbit = clbit_indices[cargs[0]]
                        clbits[clbit] = meas_res

                clstr = ""
                for clbit in clbits[::-1]:
                    clstr = clstr + str(clbit)

                if clstr in counts:
                    counts[clstr] += 1
                else:
                    counts[clstr] = 1
            result["results"].append({
                "shots": shots,
                "success": True,
                "header": {
                    "metadata": circ.metadata
                },
                "data": {
                    "counts": counts
                },
            })
        return FakeJob(self, Result.from_dict(result))
Exemplo n.º 9
0
    def run(self, run_input, **options):
        """
        Run the T2Hahn backend
        """
        self.options.update_options(**options)
        shots = self.options.get("shots")
        result = {
            "backend_name": "T2Hahn backend",
            "backend_version": "0",
            "qobj_id": 0,
            "job_id": 0,
            "success": True,
            "results": [],
        }
        for circ in run_input:
            nqubits = circ.num_qubits
            qubit_indices = {bit: idx for idx, bit in enumerate(circ.qubits)}
            clbit_indices = {bit: idx for idx, bit in enumerate(circ.clbits)}
            counts = dict()

            for _ in range(shots):
                qubit_state = self._qubit_initialization(
                    nqubits=nqubits
                )  # for parallel need to make an array
                clbits = np.zeros(circ.num_clbits, dtype=int)
                for op, qargs, cargs in circ.data:
                    qubit = qubit_indices[qargs[0]]

                    # The noise will only be applied if we are in the XY plane.
                    if op.name == "delay":
                        delay = op.params[0]
                        t2hahn = self._t2hahn[qubit]
                        freq = self._frequency[qubit]
                        qubit_state[qubit] = self._delay_gate(
                            qubit_state=qubit_state[qubit],
                            delay=delay,
                            t2hahn=t2hahn,
                            frequency=freq,
                        )
                    elif op.name == "rx":
                        qubit_state[qubit] = self._rx_gate(qubit_state[qubit], op.params[0])
                    elif op.name == "measure":
                        meas_res = self._measurement_gate(qubit_state[qubit])
                        clbit = clbit_indices[cargs[0]]
                        clbits[clbit] = meas_res

                clstr = ""
                for clbit in clbits[::-1]:
                    clstr = clstr + str(clbit)

                if clstr in counts:
                    counts[clstr] += 1
                else:
                    counts[clstr] = 1
            result["results"].append(
                {
                    "shots": shots,
                    "success": True,
                    "header": {"metadata": circ.metadata},
                    "data": {"counts": counts},
                }
            )
        return FakeJob(self, Result.from_dict(result))
Exemplo n.º 10
0
    def run(self, run_input, **options):
        """
        Run the T1 backend
        """
        self.options.update_options(**options)
        shots = self.options.get("shots")

        result = {
            "backend_name": "T1 backend",
            "backend_version": "0",
            "qobj_id": "0",
            "job_id": "0",
            "success": True,
            "results": [],
        }

        for circ in run_input:
            nqubits = circ.num_qubits
            qubit_indices = {bit: idx for idx, bit in enumerate(circ.qubits)}
            clbit_indices = {bit: idx for idx, bit in enumerate(circ.clbits)}
            counts = dict()

            if self._readout0to1 is None:
                ro01 = np.zeros(nqubits)
            else:
                ro01 = self._readout0to1

            if self._readout1to0 is None:
                ro10 = np.zeros(nqubits)
            else:
                ro10 = self._readout1to0

            for _ in range(shots):
                if self._initial_prob1 is None:
                    prob1 = np.zeros(nqubits)
                else:
                    prob1 = self._initial_prob1.copy()

                clbits = np.zeros(circ.num_clbits, dtype=int)

                for op, qargs, cargs in circ.data:
                    qubit = qubit_indices[qargs[0]]
                    if op.name == "x":
                        prob1[qubit] = 1 - prob1[qubit]
                    elif op.name == "delay":
                        delay = op.params[0]
                        prob1[qubit] = prob1[qubit] * np.exp(
                            -delay / self._t1[qubit])
                    elif op.name == "measure":
                        meas_res = self._rng.binomial(
                            1, prob1[qubit] * (1 - ro10[qubit]) +
                            (1 - prob1[qubit]) * ro01[qubit])
                        clbit = clbit_indices[cargs[0]]
                        clbits[clbit] = meas_res
                        prob1[qubit] = meas_res

                clstr = ""
                for clbit in clbits[::-1]:
                    clstr = clstr + str(clbit)

                if clstr in counts:
                    counts[clstr] += 1
                else:
                    counts[clstr] = 1

            result["results"].append({
                "shots": shots,
                "success": True,
                "header": {
                    "metadata": circ.metadata
                },
                "data": {
                    "counts": counts
                },
            })
        return FakeJob(backend=self, result=Result.from_dict(result))