Skip to content

Commit 7b17cf8

Browse files
authored
Enable testing of cirq_google notebooks. (#5766)
- Removing outputs and skip notebooks for cirq_google - cirq_google notebooks _should_ run with virtual Engine objects.
1 parent 920bb1e commit 7b17cf8

File tree

5 files changed

+160
-269
lines changed

5 files changed

+160
-269
lines changed

cirq-google/cirq_google/engine/qcs_notebook.py

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -90,35 +90,40 @@ def get_qcs_objects_for_notebook(
9090
# set or `gcloud auth application-default login` was executed
9191
# already. For more information on using Application Default Credentials
9292
# see https://cloud.google.com/docs/authentication/production
93-
try:
94-
from google.colab import auth
95-
except ImportError:
96-
print("Not running in a colab kernel. Will use Application Default Credentials.")
97-
else:
98-
print("Getting OAuth2 credentials.")
99-
print("Press enter after entering the verification code.")
100-
try:
101-
auth.authenticate_user(clear_output=False)
102-
print("Authentication complete.")
103-
except Exception as exc:
104-
print(f"Authentication failed: {exc}")
105-
10693
# Attempt to connect to the Quantum Engine API, and use a simulator if unable to connect.
107-
if virtual:
108-
engine: AbstractEngine = create_noiseless_virtual_engine_from_latest_templates()
109-
signed_in = False
110-
is_simulator = True
111-
else:
94+
if not virtual:
95+
# Set up auth
96+
try:
97+
from google.colab import auth
98+
except ImportError:
99+
print("Not running in a colab kernel. Will use Application Default Credentials.")
100+
else:
101+
print("Getting OAuth2 credentials.")
102+
print("Press enter after entering the verification code.")
103+
try:
104+
a = auth.authenticate_user(clear_output=False)
105+
print(a)
106+
print("Authentication complete.")
107+
except Exception as exc:
108+
print(f"Authentication failed: {exc}")
109+
print(f"Using virtual engine instead.")
110+
virtual = True
111+
112+
if not virtual:
113+
# Set up production engine
112114
try:
113-
engine = get_engine(project_id)
115+
engine: AbstractEngine = get_engine(project_id)
114116
signed_in = True
115117
is_simulator = False
116118
except Exception as exc:
117119
print(f"Unable to connect to quantum engine: {exc}")
118120
print("Using a noisy simulator.")
119-
engine = create_noiseless_virtual_engine_from_latest_templates()
120-
signed_in = False
121-
is_simulator = True
121+
virtual = True
122+
if virtual:
123+
engine = create_noiseless_virtual_engine_from_latest_templates()
124+
signed_in = False
125+
is_simulator = True
126+
122127
if processor_id:
123128
processor = engine.get_processor(processor_id)
124129
else:

cirq-google/cirq_google/engine/qcs_notebook_test.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import sys
1516
import unittest.mock as mock
1617
import pytest
1718

@@ -95,3 +96,39 @@ def test_get_qcs_objects_for_notebook_no_processors(engine_mock):
9596
engine_mock.return_value = fake_engine
9697
with pytest.raises(ValueError, match='processors'):
9798
_ = get_qcs_objects_for_notebook()
99+
100+
101+
@mock.patch.dict('sys.modules', {'google.colab': mock.Mock()})
102+
@mock.patch('cirq_google.engine.qcs_notebook.get_engine')
103+
def test_get_qcs_objects_for_notebook_auth_succeeds(engine_mock):
104+
fake_processor = cg.engine.SimulatedLocalProcessor(
105+
processor_id='tester', project_name='mock_project', device=cg.Sycamore
106+
)
107+
fake_engine = cg.engine.SimulatedLocalEngine([fake_processor])
108+
engine_mock.return_value = fake_engine
109+
result = get_qcs_objects_for_notebook()
110+
_assert_correct_types(result)
111+
assert result.signed_in
112+
assert not result.is_simulator
113+
assert result.project_id == 'mock_project'
114+
assert len(result.device.metadata.qubit_set) == 54
115+
116+
117+
@mock.patch.dict('sys.modules', {'google.colab': mock.Mock()})
118+
@mock.patch('cirq_google.engine.qcs_notebook.get_engine')
119+
def test_get_qcs_objects_for_notebook_auth_fails(engine_mock):
120+
auth_mock = sys.modules['google.colab']
121+
122+
auth_mock.auth.authenticate_user = mock.Mock(side_effect=Exception('mock auth failure'))
123+
fake_processor = cg.engine.SimulatedLocalProcessor(
124+
processor_id='tester', project_name='mock_project', device=cg.Sycamore
125+
)
126+
fake_engine = cg.engine.SimulatedLocalEngine([fake_processor])
127+
engine_mock.return_value = fake_engine
128+
result = get_qcs_objects_for_notebook()
129+
130+
# Auth failed, default to simulator
131+
_assert_correct_types(result)
132+
assert not result.signed_in
133+
assert result.is_simulator
134+
assert result.project_id == 'fake_project'

dev_tools/notebooks/notebook_test.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,23 @@
2828

2929
SKIP_NOTEBOOKS = [
3030
# skipping vendor notebooks as we don't have auth sorted out
31-
"**/aqt/*.ipynb",
32-
"**/azure-quantum/*.ipynb",
33-
"**/ionq/*.ipynb",
34-
"**/google/*.ipynb",
35-
"**/pasqal/*.ipynb",
36-
"**/rigetti/*.ipynb",
31+
'**/aqt/*.ipynb',
32+
'**/azure-quantum/*.ipynb',
33+
'**/ionq/*.ipynb',
34+
'**/pasqal/*.ipynb',
35+
'**/rigetti/*.ipynb',
3736
# skipping fidelity estimation due to
3837
# https://github.com/quantumlib/Cirq/issues/3502
39-
"examples/*fidelity*",
38+
'examples/*fidelity*',
4039
# tutorials that use QCS and arent skipped due to one or more cleared output cells
40+
'docs/tutorials/google/identifying_hardware_changes.ipynb',
41+
'docs/tutorials/google/echoes.ipynb',
4142
'docs/noise/qcvv/xeb_calibration_example.ipynb',
4243
'docs/noise/calibration_api.ipynb',
4344
'docs/noise/floquet_calibration_example.ipynb',
45+
# temporary: need to fix QVM metrics and device spec
46+
'docs/tutorials/google/spin_echoes.ipynb',
47+
'docs/tutorials/google/visualizing_calibration_metrics.ipynb',
4448
# shouldn't have outputs generated for style reasons
4549
'docs/simulate/qvm_builder_code.ipynb',
4650
]

docs/tutorials/google/colab.ipynb

Lines changed: 21 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,12 @@
1111
},
1212
{
1313
"cell_type": "code",
14-
"execution_count": 1,
14+
"execution_count": null,
1515
"metadata": {
1616
"cellView": "form",
1717
"id": "2u6HZdKb4RXV"
1818
},
19-
"outputs": [
20-
{
21-
"name": "stdout",
22-
"output_type": "stream",
23-
"text": [
24-
"\n"
25-
]
26-
}
27-
],
19+
"outputs": [],
2820
"source": [
2921
"#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
3022
"# you may not use this file except in compliance with the License.\n",
@@ -82,19 +74,11 @@
8274
},
8375
{
8476
"cell_type": "code",
85-
"execution_count": 2,
77+
"execution_count": null,
8678
"metadata": {
8779
"id": "bd9529db1c0b"
8880
},
89-
"outputs": [
90-
{
91-
"name": "stdout",
92-
"output_type": "stream",
93-
"text": [
94-
"\n"
95-
]
96-
}
97-
],
81+
"outputs": [],
9882
"source": [
9983
"try:\n",
10084
" import cirq\n",
@@ -184,28 +168,20 @@
184168
},
185169
{
186170
"cell_type": "code",
187-
"execution_count": 3,
171+
"execution_count": null,
188172
"metadata": {
189-
"cellView": "both",
190173
"id": "wfHdoHW67EGh"
191174
},
192-
"outputs": [
193-
{
194-
"name": "stdout",
195-
"output_type": "stream",
196-
"text": [
197-
"Notebook is not executed with Colab, assuming Application Default Credentials are setup.\n",
198-
"Successful authentication to Google Cloud.\n"
199-
]
200-
}
201-
],
175+
"outputs": [],
202176
"source": [
203177
"# The Google Cloud Project id to use.\n",
204178
"project_id = '' #@param {type:\"string\"}\n",
205179
"processor_id = \"\" #@param {type:\"string\"}\n",
206180
"\n",
207181
"from cirq_google.engine.qcs_notebook import get_qcs_objects_for_notebook\n",
208-
"device_sampler = get_qcs_objects_for_notebook(project_id, processor_id)"
182+
"qcs_objects = get_qcs_objects_for_notebook(project_id, processor_id)\n",
183+
"engine = qcs_objects.engine\n",
184+
"processor_id = qcs_objects.processor_id"
209185
]
210186
},
211187
{
@@ -221,28 +197,24 @@
221197
},
222198
{
223199
"cell_type": "code",
224-
"execution_count": 4,
200+
"execution_count": null,
225201
"metadata": {
226202
"id": "HCb_9m_o8KEK"
227203
},
228-
"outputs": [
229-
{
230-
"name": "stdout",
231-
"output_type": "stream",
232-
"text": [
233-
"\n"
234-
]
235-
}
236-
],
204+
"outputs": [],
237205
"source": [
238206
"from google.auth.exceptions import DefaultCredentialsError\n",
239207
"from google.api_core.exceptions import PermissionDenied\n",
240208
"\n",
241209
"# Create an Engine object to use, providing the project id and the args\n",
242210
"try: \n",
243-
" engine = cirq_google.get_engine()\n",
244-
" engine.list_processors()\n",
211+
" if qcs_objects.signed_in: # This line only needed for colab testing.\n",
212+
" engine = cirq_google.get_engine()\n",
245213
" print(f\"Successful authentication using project {project_id}!\")\n",
214+
" print('Available Processors: ')\n",
215+
" print(engine.list_processors())\n",
216+
" print(f'Using processor: {processor_id}')\n",
217+
" processor = engine.get_processor(processor_id)\n",
246218
"except DefaultCredentialsError as err: \n",
247219
" print(\"Could not authenticate to Google Quantum Computing Service.\")\n",
248220
" print(\" Tips: If you are using Colab: make sure the previous cell was executed successfully.\")\n",
@@ -267,30 +239,19 @@
267239
},
268240
{
269241
"cell_type": "code",
270-
"execution_count": 5,
242+
"execution_count": null,
271243
"metadata": {
272244
"id": "xujtwGxt8fOA"
273245
},
274-
"outputs": [
275-
{
276-
"name": "stdout",
277-
"output_type": "stream",
278-
"text": [
279-
"Success! Results:\n",
280-
"0000001111010100111111000100000000011100001000000011110011101011101101100000101000000110010110011100001001000110001110100101010010101100011010110000010001011001111001111001110011111001100011110110001001101010000000000111101101010110101010011011011111110010111010000010001000101110101100111111111101110100100100000011110010010000110111100111010010101111010001111100011100100101010011111011100000000100100001001100110001000101000011010101010111110001000000011100100000001011011111111001001011000001100110101000000001100110000111000100110101110111101010100110001101001000010110011001011010000111111000111010101111100101100001011101100101000110001100001100010001001001110010000010001011111101101101111011101101100010110001000111001010101001011111011111100011001110001110010111000011010011101101000011100111011000001001010101010010001101011010101011001001010001000111100101000011000101011011110111011101001011001001011011001101111010010011110010011101011011010111001110110101010101010101010001100101000001000101101001010000101110101011011111101010001011111010111110011101111111010100000001100000001100100011001011110111011111110011101010111000011101100111111101100001111100001110100100001010011001110111010000011101110011010001111011110101010011010111011001000101111010000110000111010111110001101011010010100010111111100001011111000001010000001001101100110011001100001000101101001100101011101100011011000111100111000001001100001110100010110011101001111101011000100111010001111001111000110000101001000100010110110001011111001100110101110001110110101101010001010101110100100110100000101101000101010011000110101010101011110111011111110010111011111100000001000000011110101010100111110000010001000101000111011001100100011001101101010000101010001100000001010001110110000000000111100110000010101100001000101110101100010110000010101000110110100010110101001001010010001010111010001001100000000011101110110010111100000000010011001010010010111111010100001011010100101001001110101100000001011001100011100111110011001101111000001001101111100111010100111111101000011100100110111010100010010000001101111111100101111101000101101010000010010100000100111000000110101111101000101001010010001111101000000001011011000111110001111100111010000110000100000110010101110011010100110010010111111010101100101101001111001001000000000100011111000101101001011010110010100100000011001111100111101111111011010110010000111001000110000011001111111010010010100110000011100101011001000111011010101000001011100010001011001111001101000111011000110110001001110010000010111010110100100110000010011101001000100010010011100000010010110100100011011010111000110110110000001001011000000000100111000101110010110001111001001111001011011110010110010101010001100010101000100000110111010111001111000111000010000100101011001001100111100011111000001010110011110111000101000010000110011010110110101110100000101011011001011001110011001001101010001000000111110000101100001100101000110000011110001110000101001001100010101010000000100101100001101001111001001101000010100001011110011100000100000000100010101100111101100011101101010100010110000101010011011101011010100110111100110011001011001000110100001000100010111011011110111011011110100010010011100001011001111001010111000000010110110100001010111010000111110101000000110101100110001010001101110101001110100110110110011111100111101111111001010011011001101111000000110110111110111000010001011001011011010110000000010010100101000110110000100011011010011110100010101101101001001001100001100001011000110011011011110100100000010001011011111000010110010111010011110011110010000101111011100010010011101011110000101010010000011001110101111000001011110010111110001110110100101001001100000011001010010100011101001100110111000001011111011010000111100010111100000011000110001111010100000111000101100000011100100101111100101111100111011110100110011100011110100111010000010111000110100011001000010011100101111010010100110100100011101100111001100101111111110101101001010111100000110010000111100010100100110001010000010011101110111010110010100000110001111100001001000100001010001010110101110110110111100101110001110010010001010110000001000101010111110001100011111011100010110111011000000010101110111101100110000010000000010100111110011000010000001010101111010100000110001001011000010101111100001111110001101100011110110010010110011110110010001011100010010000000010000101010010111101001010101011001011110100000101111100111010010110010001110001010101000111001101110011100000010101101011000100010110011011011111100010110111110100111111101100001100000000000101000101011100111000000100110000010110110010001111000011000101110000010101110011011000010111110111110101101000000100000110101010001000100100000010000101010000011010001000001111001001010011101101001001100100101011111011010100101010001011110111110011101100001010111111110110111010000011111100001101101000010111010000110001111000101110010110110101110000100000111101001101100111100000110100011101101111011111010010001110010011011110101101100100001001000110100110110001010111011101101100101101000111001000110111101000000001011000100110100010011001000111110010101110010010011011011011001111110010000111011011101010001011011000011010111011100001011000111100101000011010101010010001000010000100001000101100111111111110000111110010011001000110110111010000000110110100100111101101011001111110011010100000111000100100110110000000001110110010000010100010100101001000001101101100101001111101000111100001111110011110001000110000011011100100110100000010111011011000000011000000001011101010110100111101001101100100001111000011101110011001111111011101011000100010011001101010100110000001100111000001011001010110100111001101111101101000100111110001111100001110010110000000100101011010111001001100011101110111011100111011111111111111010010101100111111100101011101101011011010111110011011110111011111100110101010000000000101111000010100100100000100001110011010011001001110111111110001101010001010000010110111111111011010000110101001010111111110110111000111011000101100001000011010111010010000111110110100110010111000011011100000110011000110100011111100110000101101111101001100101001010101001011111100010110110000100110111110010111100011010110000011001100111010010000111111011000010110100111111101000101101100110000001010011000011111101010000000010011101101101111000101100010100001100011011100001101111101011101010110001110000101011011100010100110011001100110001100001101001000000010101100001000000110101110111000110100100101000001110110111001000001101100011011000010101110011100001111000011101011001011010100001101101011111001000101001011101000010111011000101011101110110100011110111101110110011101111010111010111001001101110001011000100011101000111000001000000100100000101000100001001010101110111010010011000100000010000111101011000010100100111001111101111011001110101000000100001111111000111100100011101111111000001111111101100000110010001110110001111010100010000000010000010101010010101000001001000000011001101100001110111010001000101011001010000000100111101001111010010001011011101011011011101110100000110110001100001010010111000111010010011110010001001010001001000011110000001000001111001101001111011011100010110010010101000001011000000100000101000111110010001000100000000110111100001011100010011100001011100110100001000010101101010100001000000100100010101001000101110110111010111111000110000100010000011110100100111010100000011111101010110100110110100001000001001001010101011010101011110011111000011000000111101110100000100101111100111110110000100110100000011111110111110100001011010111010000100101010101110001100100101000101101101001011101010101100111001001101001000110101111111001111011110101011101001110100000010010001101101100000010110000011001100001110110010100000000011110111100000100001101011001100110110000001001000001101111001101101111001110011101101101010001101100110111110011110010001000110110010100100010100111000000100010111011100100110100100110111000110001010010000110000001101000010100011101110010110101100001101001101000000100100010000010000011110110101100000011110010101010010001100110101001100101000101100010101001010000111000111000000000001001100100110001111000110100001000000010001110011011001110000011001000011101010011110000101001101111100110000111110101111111111101011100101011001001010101101001100110110111000111110111011101000011001100101010111101100111010001001000001011001101101111110001001111111111110001000100011100101100110110101101100110110010110011111001101001011011111110001011110110000100010000101011110011001000100010100011101111100010011011010011100111110111000111100110000010011100111011100011001011001101101011001000001001010011101111010000101011010100011010011001111011010001111010010111001111000001000001111100100010110001000100011011110001010011101000110000100110010111110111110011000101001000111000001100001110010000011100010001111100011001110011100001100011010010000001000001100010100100110101001101110011001001010100011010110011111010101100111110010011100101101111001110001011001000101101100111010000100111101010101010100001100011001101011111111110010001111100111001001110010101100111001010000001000100000111101110111001110111100100110101000110000001100000101001010001111000001110110100000011100011011100011011100101010100110011111110110011110100100111100110110100111010100001011101010001000010011010011101010001010101000100011111110001010000000100100111101110100000100100110100000101001111011011011110011111101001011100010111110110100011001100000101000110100101101011001010111100000000111010101011101110101100100101001001111010001111100101010011011000101000111100010010010000001111001001100011110001000110011010110110100100111011100111010110111010110011010101010111100110000101101111101110010001010011000010111001110110000100100101010001001010110110001001001011001000010100111100010110110101000111100110010110001010010010000110010101111000010001100111010100010111100110000000010001101001011100110001011000100101000011101000010110100001110011010101111011101111110110011111111000111010010010100010011100100100100011111111011111110100110001100110\n"
281-
]
282-
}
283-
],
246+
"outputs": [],
284247
"source": [
285248
"# A simple example.\n",
286249
"q = cirq.GridQubit(5, 2)\n",
287250
"circuit = cirq.Circuit(cirq.X(q)**0.5, cirq.measure(q, key='m'))\n",
288251
"\n",
289-
"job = engine.run_sweep(\n",
252+
"job = processor.run_sweep(\n",
290253
" program=circuit,\n",
291-
" repetitions=10000,\n",
292-
" processor_ids=['rainbow'],\n",
293-
" gate_set=cirq_google.SYC_GATESET)\n",
254+
" repetitions=1000)\n",
294255
"\n",
295256
"results = [str(int(b)) for b in job.results()[0].measurements['m'][:, 0]]\n",
296257
"print('Success! Results:')\n",

0 commit comments

Comments
 (0)