Skip to content

Commit 7655251

Browse files
augustehirthrht
authored andcommitted
Engine creator helper function (quantumlib#5658)
Add a helper function to create a virtual engine with a noisy simulator.
1 parent 71edec5 commit 7655251

File tree

3 files changed

+62
-1
lines changed

3 files changed

+62
-1
lines changed

cirq-google/cirq_google/engine/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
from cirq_google.engine.validating_sampler import ValidatingSampler
7373

7474
from cirq_google.engine.virtual_engine_factory import (
75+
create_default_noisy_quantum_virtual_machine,
7576
create_device_from_processor_id,
7677
create_noiseless_virtual_engine_from_device,
7778
create_noiseless_virtual_engine_from_proto,

cirq-google/cirq_google/engine/virtual_engine_factory.py

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,19 @@
1414

1515
"""Functions to instantiate SimulatedLocalEngines to simulate various Google Devices."""
1616
import json
17-
from typing import cast, Iterable, List, Optional, Union
17+
from typing import cast, Iterable, List, Optional, Union, Type
1818
import pathlib
1919
import time
2020

2121
import google.protobuf.text_format as text_format
2222
import cirq
23+
from cirq.sim.simulator import SimulatesSamples
2324
from cirq_google.api import v2
2425
from cirq_google.engine import calibration, engine_validator, simulated_local_processor, util
2526
from cirq_google.devices import grid_device
27+
from cirq_google.devices.google_noise_properties import NoiseModelFromGoogleNoiseProperties
2628
from cirq_google.serialization import serializable_gate_set
29+
from cirq_google.engine.calibration_to_noise_properties import noise_properties_from_calibration
2730
from cirq_google.engine.simulated_local_engine import SimulatedLocalEngine
2831
from cirq_google.engine.simulated_local_processor import SimulatedLocalProcessor
2932

@@ -367,3 +370,44 @@ def create_noiseless_virtual_engine_from_latest_templates() -> SimulatedLocalEng
367370
processor_ids = list(MOST_RECENT_TEMPLATES.keys())
368371
template_names = [MOST_RECENT_TEMPLATES[k] for k in processor_ids]
369372
return create_noiseless_virtual_engine_from_templates(processor_ids, template_names)
373+
374+
375+
def create_default_noisy_quantum_virtual_machine(
376+
processor_id: str, simulator_class: Type[SimulatesSamples] = None, **kwargs
377+
) -> SimulatedLocalEngine:
378+
"""Creates a virtual engine with a noisy simulator based on a processor id.
379+
380+
Args:
381+
processor_id: The string name of a processor that has available noise data.
382+
simulator_class: The class of the type of simulator to be initialized. The
383+
simulator class initializer needs to support the `noise` parameter.
384+
kwargs: Other arguments which are passed through to the simulator initializer.
385+
The 'noise' argument will be overwritten with a new noise model.
386+
387+
Returns:
388+
A SimulatedLocalEngine that uses a simulator of type simulator_class with a
389+
noise model based on available noise data for the processor processor_id.
390+
"""
391+
392+
if simulator_class is None:
393+
try: # coverage: ignore
394+
import qsimcirq # type: ignore
395+
396+
simulator_class = qsimcirq.Simulator # coverage: ignore
397+
except ImportError:
398+
simulator_class = cirq.Simulator # coverage: ignore
399+
400+
calibration = load_median_device_calibration(processor_id)
401+
noise_properties = noise_properties_from_calibration(calibration)
402+
noise_model = NoiseModelFromGoogleNoiseProperties(noise_properties)
403+
simulator = simulator_class(noise=noise_model, **kwargs) # type: ignore
404+
405+
device = create_device_from_processor_id(processor_id)
406+
simulated_processor = SimulatedLocalProcessor(
407+
processor_id=processor_id,
408+
sampler=simulator,
409+
device=device,
410+
calibrations={calibration.timestamp // 1000: calibration},
411+
)
412+
413+
return SimulatedLocalEngine([simulated_processor])

cirq-google/cirq_google/engine/virtual_engine_factory_test.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,3 +175,19 @@ def test_create_from_proto_no_qubits():
175175
_ = factory.create_noiseless_virtual_engine_from_device(
176176
'sycamore', cirq.UNCONSTRAINED_DEVICE
177177
)
178+
179+
180+
def test_create_default_noisy_quantum_virtual_machine():
181+
for processor_id in ["rainbow", "weber"]:
182+
engine = factory.create_default_noisy_quantum_virtual_machine(
183+
processor_id=processor_id, simulator_class=cirq.Simulator
184+
)
185+
processor = engine.get_processor(processor_id)
186+
bad_qubit = cirq.GridQubit(10, 10)
187+
circuit = cirq.Circuit(cirq.X(bad_qubit), cirq.measure(bad_qubit))
188+
with pytest.raises(ValueError, match='Qubit not on device'):
189+
_ = processor.run(circuit, repetitions=100)
190+
good_qubit = cirq.GridQubit(5, 4)
191+
circuit = cirq.Circuit(cirq.H(good_qubit), cirq.measure(good_qubit))
192+
with pytest.raises(ValueError, match='.* contains a gate which is not supported.'):
193+
_ = processor.run(circuit, repetitions=100)

0 commit comments

Comments
 (0)