forked from quantumlib/Cirq
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathact_on_args_test.py
97 lines (75 loc) · 2.82 KB
/
act_on_args_test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# Copyright 2021 The Cirq Developers
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import Any, Sequence
import numpy as np
import pytest
import cirq
from cirq.sim import act_on_args
class DummyArgs(cirq.ActOnArgs):
def __init__(self):
super().__init__(qubits=cirq.LineQubit.range(2))
def _perform_measurement(self, qubits):
return [5, 3]
def _act_on_fallback_(
self,
action: Any,
qubits: Sequence['cirq.Qid'],
allow_decompose: bool = True,
) -> bool:
return True
def test_measurements():
args = DummyArgs()
args.measure([cirq.LineQubit(0)], "test", [False])
assert args.log_of_measurement_results["test"] == [5]
def test_decompose():
class Composite(cirq.Gate):
def num_qubits(self) -> int:
return 1
def _decompose_(self, qubits):
yield cirq.X(*qubits)
args = DummyArgs()
assert act_on_args.strat_act_on_from_apply_decompose(Composite(), args, [cirq.LineQubit(0)])
def test_mapping():
args = DummyArgs()
assert list(iter(args)) == cirq.LineQubit.range(2)
r1 = args[cirq.LineQubit(0)]
assert args is r1
with pytest.raises(IndexError):
_ = args[cirq.LineQubit(2)]
def test_swap_bad_dimensions():
q0 = cirq.LineQubit(0)
q1 = cirq.LineQid(1, 3)
args = DummyArgs()
with pytest.raises(ValueError, match='Cannot swap different dimensions'):
args.swap(q0, q1)
def test_rename_bad_dimensions():
q0 = cirq.LineQubit(0)
q1 = cirq.LineQid(1, 3)
args = DummyArgs()
with pytest.raises(ValueError, match='Cannot rename to different dimensions'):
args.rename(q0, q1)
def test_transpose_qubits():
q0, q1, q2 = cirq.LineQubit.range(3)
args = DummyArgs()
assert args.transpose_to_qubit_order((q1, q0)).qubits == (q1, q0)
with pytest.raises(ValueError, match='Qubits do not match'):
args.transpose_to_qubit_order((q0, q2))
with pytest.raises(ValueError, match='Qubits do not match'):
args.transpose_to_qubit_order((q0, q1, q1))
def test_field_getters():
args = DummyArgs()
assert args.prng is np.random
assert args.qubit_map == {q: i for i, q in enumerate(cirq.LineQubit.range(2))}
with cirq.testing.assert_deprecated('always returns False', deadline='v0.16'):
assert not args.ignore_measurement_results