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]])
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
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()
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)
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")
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])