コード例 #1
0
    def run_sweep_iter(
        self, program: 'cirq.AbstractCircuit', params: 'cirq.Sweepable', repetitions: int = 1
    ) -> Iterator['cirq.Result']:
        """Runs the supplied Circuit, mimicking quantum hardware.

        In contrast to run, this allows for sweeping over different parameter
        values.

        Args:
            program: The circuit to simulate.
            params: Parameters to run with the program.
            repetitions: The number of repetitions to simulate.

        Returns:
            Result list for this run; one for each possible parameter
            resolver.

        Raises:
            ValueError: If the circuit has no measurements.
        """
        if not program.has_measurements():
            raise ValueError("Circuit has no measurements to sample.")

        for param_resolver in study.to_resolvers(params):
            records = {}
            if repetitions == 0:
                for _, op, _ in program.findall_operations_with_gate_type(ops.MeasurementGate):
                    records[protocols.measurement_key_name(op)] = np.empty([0, 1, 1])
            else:
                records = self._run(
                    circuit=program, param_resolver=param_resolver, repetitions=repetitions
                )
            yield study.ResultDict(params=param_resolver, records=records)
コード例 #2
0
    def run_sweep(
        self,
        program: 'cirq.AbstractCircuit',
        params: study.Sweepable,
        repetitions: int = 1,
    ) -> List[study.Result]:
        """Samples circuit as if every measurement resulted in zero.

        Args:
            program: The circuit to sample from.
            params: Parameters to run with the program.
            repetitions: The number of times to sample.

        Returns:
            Result list for this run; one for each possible parameter
            resolver.

        Raises:
            ValueError: circuit is not valid for the sampler, due to invalid
            repeated keys or incompatibility with the sampler's device.
        """
        if self.device:
            self.device.validate_circuit(program)
        shapes = self._get_measurement_shapes(program)
        return [
            study.ResultDict(
                params=param_resolver,
                records={
                    k: np.zeros((repetitions, num_instances, len(qid_shape)),
                                dtype=int)
                    for k, (num_instances, qid_shape) in shapes.items()
                },
            ) for param_resolver in study.to_resolvers(params)
        ]
コード例 #3
0
ファイル: simulator.py プロジェクト: towynlin/Cirq
    def run_sweep_iter(
        self,
        program: 'cirq.AbstractCircuit',
        params: 'cirq.Sweepable',
        repetitions: int = 1,
    ) -> Iterator['cirq.Result']:
        """Runs the supplied Circuit, mimicking quantum hardware.

        In contrast to run, this allows for sweeping over different parameter
        values.

        Args:
            program: The circuit to simulate.
            params: Parameters to run with the program.
            repetitions: The number of repetitions to simulate.

        Returns:
            Result list for this run; one for each possible parameter
            resolver.

        Raises:
            ValueError: If the circuit has no measurements.
        """
        if not program.has_measurements():
            raise ValueError("Circuit has no measurements to sample.")

        for param_resolver in study.to_resolvers(params):
            records = {}
            if repetitions == 0:
                for _, op, _ in program.findall_operations_with_gate_type(
                        ops.MeasurementGate):
                    records[protocols.measurement_key_name(op)] = np.empty(
                        [0, 1, 1])
            else:
                records = self._run(circuit=program,
                                    param_resolver=param_resolver,
                                    repetitions=repetitions)
                flat_records = False
                for k, v in records.items():
                    if v.ndim == 2:
                        flat_records = True
                        records[k] = v.reshape((v.shape[0], 1, v.shape[1]))
                if flat_records:
                    warnings.warn(
                        ('Starting in Cirq v0.15, values in the output of simulator._run must '
                         'be 3D instead of 2D, with a new dimension between the existing two '
                         'to capture "instances" of a key.'),
                        DeprecationWarning,
                    )
            yield study.ResultDict(params=param_resolver, records=records)
コード例 #4
0
    def run_sweep(
        self,
        program: cirq.Circuit,
        params: cirq.Sweepable,
        repetitions: int = 1,
    ) -> list[cirq.Result]:
        # verify that qubit_mapping covers all qubits in the circuit
        circuit_qubits = set(qubit.name for qubit in program.all_qubits())
        diff = circuit_qubits - set(self._qubit_mapping)
        if diff:
            raise ValueError(
                f'The qubits {diff} are not found in the provided qubit mapping.'
            )

        # apply qubit_mapping
        qubit_map = {
            cirq.NamedQubit(k): cirq.NamedQubit(v)
            for k, v in self._qubit_mapping.items()
        }
        mapped = program.transform_qubits(qubit_map)

        # validate the circuit for the device
        # check that the circuit connectivity fits in the device connectivity
        self._device.validate_circuit(mapped)

        resolvers = list(cirq.to_resolvers(params))

        circuits = [
            cirq.protocols.resolve_parameters(program, res)
            for res in resolvers
        ] if resolvers else [program]

        measurements = self._send_circuits(circuits, repetitions=repetitions)
        return [
            study.ResultDict(params=res, measurements=mes)
            for res, mes in zip(resolvers, measurements)
        ]