Example #1
0
def test_run_and_measure_program__returns_results(
        client_configuration: QCSClientConfiguration):
    qvm_client = QVMClient(client_configuration=client_configuration)

    respx.post(
        url=client_configuration.profile.applications.pyquil.qvm_url,
        json={
            "type": "multishot-measure",
            "compiled-quil": "some-program",
            "qubits": [0, 1, 2],
            "trials": 1,
            "measurement-noise": (3.14, 1.61, 6.28),
            "gate-noise": (1.0, 2.0, 3.0),
            "rng-seed": 314,
        },
    ).respond(status_code=200, json=[[1, 0, 1]])

    request = RunAndMeasureProgramRequest(
        program="some-program",
        qubits=[0, 1, 2],
        trials=1,
        measurement_noise=(3.14, 1.61, 6.28),
        gate_noise=(1.0, 2.0, 3.0),
        seed=314,
    )
    assert qvm_client.run_and_measure_program(
        request) == RunAndMeasureProgramResponse(results=[[1, 0, 1]])
Example #2
0
def test_init__sets_base_url_and_timeout(
        client_configuration: QCSClientConfiguration):
    qvm_client = QVMClient(client_configuration=client_configuration,
                           request_timeout=3.14)

    assert qvm_client.base_url == client_configuration.profile.applications.pyquil.qvm_url
    assert qvm_client.timeout == 3.14
Example #3
0
    def __init__(
        self,
        noise_model: Optional[NoiseModel] = None,
        gate_noise: Optional[Tuple[float, float, float]] = None,
        measurement_noise: Optional[Tuple[float, float, float]] = None,
        random_seed: Optional[int] = None,
        timeout: float = 10.0,
        client_configuration: Optional[QCSClientConfiguration] = None,
    ) -> None:
        """
        A virtual machine that classically emulates the execution of Quil programs.

        :param noise_model: A noise model that describes noise to apply when emulating a program's
            execution.
        :param gate_noise: A tuple of three numbers [Px, Py, Pz] indicating the probability of an X,
           Y, or Z gate getting applied to each qubit after a gate application or reset. The
           default value of None indicates no noise.
        :param measurement_noise: A tuple of three numbers [Px, Py, Pz] indicating the probability
            of an X, Y, or Z gate getting applied before a measurement. The default value of
            None indicates no noise.
        :param random_seed: A seed for the QVM's random number generators. Either None (for an
            automatically generated seed) or a non-negative integer.
        :param timeout: Time limit for requests, in seconds.
        :param client_configuration: Optional client configuration. If none is provided, a default one will be loaded.
        """
        super().__init__()

        if (noise_model is not None) and (gate_noise is not None
                                          or measurement_noise is not None):
            raise ValueError("""
You have attempted to supply the QVM with both a Kraus noise model
(by supplying a `noise_model` argument), as well as either `gate_noise`
or `measurement_noise`. At this time, only one may be supplied.

To read more about supplying noise to the QVM, see
http://pyquil.readthedocs.io/en/latest/noise_models.html#support-for-noisy-gates-on-the-rigetti-qvm.
""")

        self.noise_model = noise_model

        validate_noise_probabilities(gate_noise)
        validate_noise_probabilities(measurement_noise)
        self.gate_noise = gate_noise
        self.measurement_noise = measurement_noise

        if random_seed is None:
            self.random_seed = None
        elif isinstance(random_seed, int) and random_seed >= 0:
            self.random_seed = random_seed
        else:
            raise TypeError("random_seed should be None or a non-negative int")

        client_configuration = client_configuration or QCSClientConfiguration.load(
        )
        self._qvm_client = QVMClient(client_configuration=client_configuration,
                                     request_timeout=timeout)
        self.connect()
Example #4
0
def test_get_version__returns_version(
        client_configuration: QCSClientConfiguration):
    qvm_client = QVMClient(client_configuration=client_configuration)

    respx.post(
        url=client_configuration.profile.applications.pyquil.qvm_url,
        json={
            "type": "version"
        },
    ).respond(status_code=200, text="1.2.3 [abc123]")

    assert qvm_client.get_version() == "1.2.3"
    def __init__(
        self,
        *,
        gate_noise: Optional[Tuple[float, float, float]] = None,
        measurement_noise: Optional[Tuple[float, float, float]] = None,
        random_seed: Optional[int] = None,
        timeout: float = 10.0,
        client_configuration: Optional[QCSClientConfiguration] = None,
    ) -> None:
        """
        A simulator that propagates a wavefunction representation of a quantum state.

        :param gate_noise: A tuple of three numbers [Px, Py, Pz] indicating the probability of an X,
            Y, or Z gate getting applied to each qubit after a gate application or reset.
        :param measurement_noise: A tuple of three numbers [Px, Py, Pz] indicating the probability
            of an X, Y, or Z gate getting applied before a measurement.
        :param random_seed: A seed for the simulator's random number generators. Either None (for
            an automatically generated seed) or a non-negative integer.
        :param timeout: Time limit for requests, in seconds.
        :param client_configuration: Optional client configuration. If none is provided, a default one will be loaded.
        """

        validate_noise_probabilities(gate_noise)
        validate_noise_probabilities(measurement_noise)
        self.gate_noise = gate_noise
        self.measurement_noise = measurement_noise

        if random_seed is None:
            self.random_seed = None
        elif isinstance(random_seed, int) and random_seed >= 0:
            self.random_seed = random_seed
        else:
            raise TypeError("random_seed should be None or a non-negative int")

        client_configuration = client_configuration or QCSClientConfiguration.load(
        )
        self._qvm_client = QVMClient(client_configuration=client_configuration,
                                     request_timeout=timeout)
Example #6
0
def test_get_wavefunction__returns_wavefunction(
        client_configuration: QCSClientConfiguration):
    qvm_client = QVMClient(client_configuration=client_configuration)

    respx.post(
        url=client_configuration.profile.applications.pyquil.qvm_url,
        json={
            "type": "wavefunction",
            "compiled-quil": "some-program",
            "measurement-noise": (3.14, 1.61, 6.28),
            "gate-noise": (1.0, 2.0, 3.0),
            "rng-seed": 314,
        },
    ).respond(status_code=200, text="some-wavefunction")

    request = GetWavefunctionRequest(
        program="some-program",
        measurement_noise=(3.14, 1.61, 6.28),
        gate_noise=(1.0, 2.0, 3.0),
        seed=314,
    )
    assert qvm_client.get_wavefunction(request) == GetWavefunctionResponse(
        wavefunction=b"some-wavefunction")
Example #7
0
def test_measure_expectation__returns_expectation(
        client_configuration: QCSClientConfiguration):
    qvm_client = QVMClient(client_configuration=client_configuration)

    respx.post(
        url=client_configuration.profile.applications.pyquil.qvm_url,
        json={
            "type": "expectation",
            "state-preparation": "some-program",
            "operators": ["some-op-program"],
            "rng-seed": 314,
        },
    ).respond(
        status_code=200,
        json=[0.161],
    )

    request = MeasureExpectationRequest(
        prep_program="some-program",
        pauli_operators=["some-op-program"],
        seed=314,
    )
    assert qvm_client.measure_expectation(
        request) == MeasureExpectationResponse(expectations=[0.161])