diff --git a/openfermioncirq/gates/common_gates.py b/openfermioncirq/gates/common_gates.py index 7a581c41..de08b399 100644 --- a/openfermioncirq/gates/common_gates.py +++ b/openfermioncirq/gates/common_gates.py @@ -46,7 +46,7 @@ def _eigen_components(self): [0, 0, 0, 1]])), ] - def _canonical_exponent_period(self) -> Optional[float]: + def _period(self) -> Optional[float]: return 2 def _with_exponent(self, @@ -84,7 +84,7 @@ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs symbols = 'fswap', 'fswap' return cirq.CircuitDiagramInfo( wire_symbols=symbols, - exponent=self.half_turns) + exponent=self._diagram_exponent(args)) def __str__(self) -> str: if self.half_turns == 1: @@ -180,7 +180,7 @@ def _eigen_components(self): [0, 0, 0, 0]])) ] - def _canonical_exponent_period(self) -> Optional[float]: + def _period(self) -> Optional[float]: return 4 def _apply_unitary_to_tensor_(self, @@ -211,7 +211,7 @@ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs ) -> cirq.CircuitDiagramInfo: return cirq.CircuitDiagramInfo( wire_symbols=('XXYY', 'XXYY'), - exponent=self.half_turns) + exponent=self._diagram_exponent(args)) def __repr__(self): if self.half_turns == 1: @@ -316,7 +316,7 @@ def _apply_unitary_to_tensor_(self, slices=[zo, oz], out=available_buffer) - def _canonical_exponent_period(self) -> Optional[float]: + def _period(self) -> Optional[float]: return 4 def _with_exponent(self, exponent: Union[cirq.Symbol, float]) -> 'YXXYGate': @@ -332,7 +332,7 @@ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs ) -> cirq.CircuitDiagramInfo: return cirq.CircuitDiagramInfo( wire_symbols=('YXXY', '#2'), - exponent=self.half_turns) + exponent=self._diagram_exponent(args)) def __repr__(self): if self.half_turns == 1: @@ -435,7 +435,7 @@ def _eigen_components(self): (0.5, np.diag([0, 1, 1, 0])), ] - def _canonical_exponent_period(self) -> Optional[float]: + def _period(self) -> Optional[float]: return 2 def _with_exponent(self, @@ -446,7 +446,7 @@ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs ) -> cirq.CircuitDiagramInfo: return cirq.CircuitDiagramInfo( wire_symbols=('Z', 'Z'), - exponent=self.half_turns) + exponent=self._diagram_exponent(args)) def __repr__(self) -> str: if self.half_turns == 1: diff --git a/openfermioncirq/gates/common_gates_test.py b/openfermioncirq/gates/common_gates_test.py index 4b38dcd6..f200584a 100644 --- a/openfermioncirq/gates/common_gates_test.py +++ b/openfermioncirq/gates/common_gates_test.py @@ -56,7 +56,7 @@ def test_fswap_matrix(): [0, 0.5-0.5j, 0.5+0.5j, 0], [0, 0, 0, 1j]])) - cirq.testing.assert_apply_unitary_to_tensor_is_consistent_with_unitary( + cirq.testing.assert_has_consistent_apply_unitary_for_various_exponents( val=ofc.FSWAP, exponents=[1, -0.5, 0.5, 0.25, -0.25, 0.1, cirq.Symbol('s')]) @@ -64,7 +64,7 @@ def test_fswap_matrix(): def test_xxyy_init(): assert ofc.XXYYGate(half_turns=0.5).half_turns == 0.5 assert ofc.XXYYGate(half_turns=1.5).half_turns == 1.5 - assert ofc.XXYYGate(half_turns=5).half_turns == 1 + assert ofc.XXYYGate(half_turns=5).half_turns == 5 def test_xxyy_init_with_multiple_args_fails(): @@ -108,7 +108,7 @@ def test_xxyy_decompose(half_turns): def test_xxyy_matrix(): - cirq.testing.assert_apply_unitary_to_tensor_is_consistent_with_unitary( + cirq.testing.assert_has_consistent_apply_unitary_for_various_exponents( ofc.XXYY, exponents=[1, -0.5, 0.5, 0.25, -0.25, 0.1, cirq.Symbol('s')]) @@ -151,7 +151,7 @@ def test_xxyy_matrix(): def test_yxxy_init(): assert ofc.YXXYGate(half_turns=0.5).half_turns == 0.5 assert ofc.YXXYGate(half_turns=1.5).half_turns == 1.5 - assert ofc.YXXYGate(half_turns=5).half_turns == 1 + assert ofc.YXXYGate(half_turns=5).half_turns == 5 def test_yxxy_init_with_multiple_args_fails(): @@ -190,7 +190,7 @@ def test_yxxy_decompose(half_turns): def test_yxxy_matrix(): - cirq.testing.assert_apply_unitary_to_tensor_is_consistent_with_unitary( + cirq.testing.assert_has_consistent_apply_unitary_for_various_exponents( ofc.YXXY, exponents=[1, -0.5, 0.5, 0.25, -0.25, 0.1, cirq.Symbol('s')]) @@ -233,8 +233,8 @@ def test_yxxy_matrix(): def test_zz_init(): assert ofc.ZZGate(half_turns=0.5).half_turns == 0.5 - assert ofc.ZZGate(half_turns=1.5).half_turns == -0.5 - assert ofc.ZZGate(half_turns=5).half_turns == 1 + assert ofc.ZZGate(half_turns=1.5).half_turns == 1.5 + assert ofc.ZZGate(half_turns=5).half_turns == 5 def test_zz_init_with_multiple_args_fails(): @@ -267,7 +267,7 @@ def test_zz_repr(): def test_zz_matrix(): - cirq.testing.assert_apply_unitary_to_tensor_is_consistent_with_unitary( + cirq.testing.assert_has_consistent_apply_unitary_for_various_exponents( ofc.ZZ, exponents=[1, -0.5, 0.5, 0.25, -0.25, 0.1, cirq.Symbol('s')]) @@ -336,13 +336,11 @@ def test_zz_matrix(): ]) def test_two_qubit_rotation_gates_on_simulator( gate, half_turns, initial_state, correct_state, atol): - simulator = cirq.google.XmonSimulator() a, b = cirq.LineQubit.range(2) circuit = cirq.Circuit.from_ops(gate(a, b)**half_turns) - initial_state = initial_state.astype(numpy.complex64) - result = simulator.simulate(circuit, initial_state=initial_state) + result = circuit.apply_unitary_effect_to_state(initial_state) cirq.testing.assert_allclose_up_to_global_phase( - result.final_state, correct_state, atol=atol) + result, correct_state, atol=atol) def test_common_gate_text_diagrams(): @@ -361,11 +359,11 @@ def test_common_gate_text_diagrams(): b: ───×ᶠ───×ᶠ^0.5───XXYY───#2─────Z─── """) - assert circuit.to_text_diagram(use_unicode_characters=False).strip() == """ + cirq.testing.assert_has_diagram(circuit, """ a: ---fswap---fswap-------XXYY---YXXY---Z--- | | | | | b: ---fswap---fswap^0.5---XXYY---#2-----Z--- -""".strip() +""", use_unicode_characters=False) circuit = cirq.Circuit.from_ops( ofc.XXYY(a, b)**0.5, diff --git a/openfermioncirq/gates/four_qubit_gates.py b/openfermioncirq/gates/four_qubit_gates.py index c09d8552..41756646 100644 --- a/openfermioncirq/gates/four_qubit_gates.py +++ b/openfermioncirq/gates/four_qubit_gates.py @@ -33,7 +33,8 @@ def state_swap_eigen_component(x: str, y: str, sign: int = 1): └ ┘ Args: - x, y: The states to swap, as bitstrings. + x: The first state to swap, as a bitstring. + y: The second state to swap, as a bitstring. sign: The sign of the off-diagonal elements (indicated by +/-1). Returns: The eigen-component. @@ -136,7 +137,7 @@ def _apply_unitary_to_tensor_(self, slices=[a, b], out=available_buffer) - def _canonical_exponent_period(self) -> Optional[float]: + def _period(self) -> Optional[float]: return 2 def _with_exponent(self, @@ -187,8 +188,9 @@ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs '/\\ \/', '\/ /\\', '\/ /\\') - return cirq.CircuitDiagramInfo(wire_symbols=wire_symbols, - exponent=self.half_turns) + return cirq.CircuitDiagramInfo( + wire_symbols=wire_symbols, + exponent=self._diagram_exponent(args)) def __repr__(self): if self.half_turns == 1: @@ -262,7 +264,7 @@ def _eigen_components(self): # projector onto subspace spanned by basis states with # Hamming weight != 2 zero_component = np.diag([int(bin(i).count('1') != 2) - for i in range(16)]) + for i in range(16)]) state_pairs = (('1001', '0110'), ('0101', '1010'), @@ -271,12 +273,12 @@ def _eigen_components(self): plus_minus_components = tuple( (weight * sign / 2, state_swap_eigen_component(state_pair[0], state_pair[1], sign)) - for weight, state_pair in zip(self.weights, state_pairs) - for sign in (-1, 1)) + for weight, state_pair in zip(self.weights, state_pairs) + for sign in (-1, 1)) return ((0, zero_component),) + plus_minus_components - def _canonical_exponent_period(self) -> Optional[float]: + def _period(self) -> Optional[float]: return None def _with_exponent(self, @@ -339,7 +341,7 @@ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs else: wire_symbols = ('a*a*aa',) * 4 return cirq.CircuitDiagramInfo(wire_symbols=wire_symbols, - exponent=self.half_turns) + exponent=self._diagram_exponent(args)) def absorb_exponent_into_weights(self): self.weights = tuple((w * self._exponent) % 4 for w in self.weights) @@ -352,26 +354,28 @@ def _apply_unitary_to_tensor_(self, ) -> Union[np.ndarray, NotImplementedType]: if cirq.is_parameterized(self): return NotImplemented - inner_matrix = cirq.unitary(cirq.Rx(-np.pi*self.half_turns)) + am = cirq.unitary(cirq.Rx(-np.pi * self.half_turns * self.weights[0])) + bm = cirq.unitary(cirq.Rx(-np.pi * self.half_turns * self.weights[1])) + cm = cirq.unitary(cirq.Rx(-np.pi * self.half_turns * self.weights[2])) - a1 = cirq.slice_for_qubits_equal_to(axes, 0b0011) - b1 = cirq.slice_for_qubits_equal_to(axes, 0b1001) - c1 = cirq.slice_for_qubits_equal_to(axes, 0b0101) + a1 = cirq.slice_for_qubits_equal_to(axes, 0b1001) + b1 = cirq.slice_for_qubits_equal_to(axes, 0b0101) + c1 = cirq.slice_for_qubits_equal_to(axes, 0b0011) - a2 = cirq.slice_for_qubits_equal_to(axes, 0b1100) - b2 = cirq.slice_for_qubits_equal_to(axes, 0b0110) - c2 = cirq.slice_for_qubits_equal_to(axes, 0b1010) + a2 = cirq.slice_for_qubits_equal_to(axes, 0b0110) + b2 = cirq.slice_for_qubits_equal_to(axes, 0b1010) + c2 = cirq.slice_for_qubits_equal_to(axes, 0b1100) cirq.apply_matrix_to_slices(target_tensor, - inner_matrix, + am, slices=[a1, a2], out=available_buffer) cirq.apply_matrix_to_slices(available_buffer, - inner_matrix, + bm, slices=[b1, b2], out=target_tensor) return cirq.apply_matrix_to_slices(target_tensor, - inner_matrix, + cm, slices=[c1, c2], out=available_buffer) diff --git a/openfermioncirq/gates/four_qubit_gates_test.py b/openfermioncirq/gates/four_qubit_gates_test.py index 8821e064..e3885bd2 100644 --- a/openfermioncirq/gates/four_qubit_gates_test.py +++ b/openfermioncirq/gates/four_qubit_gates_test.py @@ -93,13 +93,13 @@ def test_double_excitation_decompose(half_turns): def test_apply_unitary(): - cirq.testing.assert_apply_unitary_to_tensor_is_consistent_with_unitary( + cirq.testing.assert_has_consistent_apply_unitary_for_various_exponents( DoubleExcitation, exponents=[1, -0.5, 0.5, 0.25, -0.25, 0.1, cirq.Symbol('s')], qubit_count=4) - cirq.testing.assert_apply_unitary_to_tensor_is_consistent_with_unitary( - CombinedDoubleExcitationGate(), + cirq.testing.assert_has_consistent_apply_unitary_for_various_exponents( + CombinedDoubleExcitationGate(weights=(0.2, 0.3, 0.4)), exponents=[1, -0.5, 0.5, 0.25, -0.25, 0.1, cirq.Symbol('s')], qubit_count=4) @@ -244,13 +244,11 @@ def test_weights_and_exponent(weights): def test_four_qubit_rotation_gates_on_simulator( gate, half_turns, initial_state, correct_state, atol): - simulator = cirq.google.XmonSimulator() a, b, c, d = cirq.LineQubit.range(4) circuit = cirq.Circuit.from_ops(gate(a, b, c, d)**half_turns) - initial_state = initial_state.astype(numpy.complex64) - result = simulator.simulate(circuit, initial_state=initial_state) + result = circuit.apply_unitary_effect_to_state(initial_state) cirq.testing.assert_allclose_up_to_global_phase( - result.final_state, correct_state, atol=atol) + result, correct_state, atol=atol) def test_double_excitation_gate_text_diagrams(): @@ -261,7 +259,7 @@ def test_double_excitation_gate_text_diagrams(): circuit = cirq.Circuit.from_ops( DoubleExcitation(a, b, c, d)) - assert circuit.to_text_diagram().strip() == """ + cirq.testing.assert_has_diagram(circuit, """ a: ───⇅─── │ b: ───⇅─── @@ -269,11 +267,11 @@ def test_double_excitation_gate_text_diagrams(): c: ───⇵─── │ d: ───⇵─── -""".strip() +""") circuit = cirq.Circuit.from_ops( DoubleExcitation(a, b, c, d)**-0.5) - assert circuit.to_text_diagram().strip() == """ + cirq.testing.assert_has_diagram(circuit, """ a: ───⇅──────── │ b: ───⇅──────── @@ -281,11 +279,11 @@ def test_double_excitation_gate_text_diagrams(): c: ───⇵──────── │ d: ───⇵^-0.5─── -""".strip() +""") circuit = cirq.Circuit.from_ops( DoubleExcitation(a, c, b, d)**0.2) - assert circuit.to_text_diagram().strip() == """ + cirq.testing.assert_has_diagram(circuit, """ a: ───⇅─────── │ b: ───⇵─────── @@ -293,11 +291,11 @@ def test_double_excitation_gate_text_diagrams(): c: ───⇅─────── │ d: ───⇵^0.2─── -""".strip() +""") circuit = cirq.Circuit.from_ops( DoubleExcitation(d, b, a, c)**0.7) - assert circuit.to_text_diagram().strip() == """ + cirq.testing.assert_has_diagram(circuit, """ a: ───⇵─────── │ b: ───⇅─────── @@ -305,11 +303,11 @@ def test_double_excitation_gate_text_diagrams(): c: ───⇵─────── │ d: ───⇅^0.7─── -""".strip() +""") circuit = cirq.Circuit.from_ops( DoubleExcitation(d, b, a, c)**2.3) - assert circuit.to_text_diagram().strip() == """ + cirq.testing.assert_has_diagram(circuit, """ a: ───⇵─────── │ b: ───⇅─────── @@ -317,7 +315,7 @@ def test_double_excitation_gate_text_diagrams(): c: ───⇵─────── │ d: ───⇅^0.3─── -""".strip() +""") def test_double_excitation_gate_text_diagrams_no_unicode(): @@ -328,7 +326,7 @@ def test_double_excitation_gate_text_diagrams_no_unicode(): circuit = cirq.Circuit.from_ops( DoubleExcitation(a, b, c, d)) - assert circuit.to_text_diagram(use_unicode_characters=False).strip() == """ + cirq.testing.assert_has_diagram(circuit, """ a: ---/\ \/--- | b: ---/\ \/--- @@ -336,11 +334,11 @@ def test_double_excitation_gate_text_diagrams_no_unicode(): c: ---\/ /\--- | d: ---\/ /\--- -""".strip() +""", use_unicode_characters=False) circuit = cirq.Circuit.from_ops( DoubleExcitation(a, b, c, d)**-0.5) - assert circuit.to_text_diagram(use_unicode_characters=False).strip() == """ + cirq.testing.assert_has_diagram(circuit, """ a: ---/\ \/-------- | b: ---/\ \/-------- @@ -348,11 +346,11 @@ def test_double_excitation_gate_text_diagrams_no_unicode(): c: ---\/ /\-------- | d: ---\/ /\^-0.5--- -""".strip() +""", use_unicode_characters=False) circuit = cirq.Circuit.from_ops( DoubleExcitation(a, c, b, d)**0.2) - assert circuit.to_text_diagram(use_unicode_characters=False).strip() == """ + cirq.testing.assert_has_diagram(circuit, """ a: ---/\ \/------- | b: ---\/ /\------- @@ -360,11 +358,11 @@ def test_double_excitation_gate_text_diagrams_no_unicode(): c: ---/\ \/------- | d: ---\/ /\^0.2--- -""".strip() +""", use_unicode_characters=False) circuit = cirq.Circuit.from_ops( DoubleExcitation(d, b, a, c)**0.7) - assert circuit.to_text_diagram(use_unicode_characters=False).strip() == """ + cirq.testing.assert_has_diagram(circuit, """ a: ---\/ /\------- | b: ---/\ \/------- @@ -372,11 +370,11 @@ def test_double_excitation_gate_text_diagrams_no_unicode(): c: ---\/ /\------- | d: ---/\ \/^0.7--- -""".strip() +""", use_unicode_characters=False) circuit = cirq.Circuit.from_ops( DoubleExcitation(d, b, a, c)**2.3) - assert circuit.to_text_diagram(use_unicode_characters=False).strip() == """ + cirq.testing.assert_has_diagram(circuit, """ a: ---\/ /\------- | b: ---/\ \/------- @@ -384,7 +382,7 @@ def test_double_excitation_gate_text_diagrams_no_unicode(): c: ---\/ /\------- | d: ---/\ \/^0.3--- -""".strip() +""", use_unicode_characters=False) @pytest.mark.parametrize('half_turns', [1.0, 0.5, 0.25, 0.1, 0.0, -0.5]) diff --git a/openfermioncirq/gates/three_qubit_gates.py b/openfermioncirq/gates/three_qubit_gates.py index d75c99e1..f3883a1f 100644 --- a/openfermioncirq/gates/three_qubit_gates.py +++ b/openfermioncirq/gates/three_qubit_gates.py @@ -83,7 +83,7 @@ def _eigen_components(self): (-0.5, minus_half_component), (0.5, plus_half_component)] - def _canonical_exponent_period(self) -> Optional[float]: + def _period(self) -> Optional[float]: return 4 def _with_exponent(self, @@ -105,7 +105,7 @@ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs ) -> cirq.CircuitDiagramInfo: return cirq.CircuitDiagramInfo( wire_symbols=('@', 'XXYY', 'XXYY'), - exponent=self.half_turns) + exponent=self._diagram_exponent(args)) def __repr__(self): if self.half_turns == 1: @@ -170,7 +170,7 @@ def _eigen_components(self): (-0.5, minus_half_component), (0.5, plus_half_component)] - def _canonical_exponent_period(self) -> Optional[float]: + def _period(self) -> Optional[float]: return 4 def _with_exponent(self, @@ -192,7 +192,7 @@ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs ) -> cirq.CircuitDiagramInfo: return cirq.CircuitDiagramInfo( wire_symbols=('@', 'YXXY', '#2'), - exponent=self.half_turns) + exponent=self._diagram_exponent(args)) def __repr__(self): if self.half_turns == 1: diff --git a/openfermioncirq/gates/three_qubit_gates_test.py b/openfermioncirq/gates/three_qubit_gates_test.py index 1ce1787e..1f0b008e 100644 --- a/openfermioncirq/gates/three_qubit_gates_test.py +++ b/openfermioncirq/gates/three_qubit_gates_test.py @@ -25,11 +25,11 @@ def test_cxxyy_init_with_multiple_args_fails(): def test_apply_unitary_effect(): - cirq.testing.assert_apply_unitary_to_tensor_is_consistent_with_unitary( + cirq.testing.assert_has_consistent_apply_unitary_for_various_exponents( ofc.CXXYY, exponents=[1, -0.5, 0.5, 0.25, -0.25, 0.1, cirq.Symbol('s')]) - cirq.testing.assert_apply_unitary_to_tensor_is_consistent_with_unitary( + cirq.testing.assert_has_consistent_apply_unitary_for_various_exponents( ofc.CYXXY, exponents=[1, -0.5, 0.5, 0.25, -0.25, 0.1, cirq.Symbol('s')]) @@ -165,21 +165,21 @@ def test_three_qubit_gate_text_diagrams(): circuit = cirq.Circuit.from_ops( ofc.CXXYY(a, b, c), ofc.CYXXY(a, b, c)) - assert circuit.to_text_diagram().strip() == """ + cirq.testing.assert_has_diagram(circuit, """ a: ───@──────@────── │ │ b: ───XXYY───YXXY─── │ │ c: ───XXYY───#2───── -""".strip() +""") circuit = cirq.Circuit.from_ops( ofc.CXXYY(a, b, c)**-0.5, ofc.CYXXY(a, b, c)**-0.5) - assert circuit.to_text_diagram().strip() == """ + cirq.testing.assert_has_diagram(circuit, """ a: ───@───────────@───────── │ │ b: ───XXYY────────YXXY────── │ │ c: ───XXYY^-0.5───#2^-0.5─── -""".strip() +""") diff --git a/openfermioncirq/primitives/swap_network_test.py b/openfermioncirq/primitives/swap_network_test.py index 7ba2b32f..b718db75 100644 --- a/openfermioncirq/primitives/swap_network_test.py +++ b/openfermioncirq/primitives/swap_network_test.py @@ -22,7 +22,7 @@ def test_swap_network(): circuit = cirq.Circuit.from_ops( swap_network(qubits, lambda i, j, q0, q1: XXYY(q0, q1)), strategy=cirq.InsertStrategy.EARLIEST) - assert circuit.to_text_diagram(transpose=False).strip() == """ + cirq.testing.assert_has_diagram(circuit, """ 0: ───XXYY───×──────────────XXYY───×────────────── │ │ │ │ 1: ───XXYY───×───XXYY───×───XXYY───×───XXYY───×─── @@ -30,13 +30,13 @@ def test_swap_network(): 2: ───XXYY───×───XXYY───×───XXYY───×───XXYY───×─── │ │ │ │ 3: ───XXYY───×──────────────XXYY───×────────────── -""".strip() +""") circuit = cirq.Circuit.from_ops( swap_network(qubits, lambda i, j, q0, q1: XXYY(q0, q1), fermionic=True, offset=True), strategy=cirq.InsertStrategy.EARLIEST) - assert circuit.to_text_diagram(transpose=True).strip() == """ + cirq.testing.assert_has_diagram(circuit, """ 0 1 2 3 │ │ │ │ │ XXYY─XXYY │ @@ -55,7 +55,7 @@ def test_swap_network(): │ │ │ │ ×ᶠ───×ᶠ ×ᶠ───×ᶠ │ │ │ │ -""".strip() +""", transpose=True) n_qubits = 5 qubits = cirq.LineQubit.range(n_qubits) @@ -64,7 +64,7 @@ def test_swap_network(): swap_network(qubits, lambda i, j, q0, q1: (), fermionic=True), strategy=cirq.InsertStrategy.EARLIEST) - assert circuit.to_text_diagram(transpose=False).strip() == """ + cirq.testing.assert_has_diagram(circuit, """ 0: ───×ᶠ────────×ᶠ────────×ᶠ─── │ │ │ 1: ───×ᶠ───×ᶠ───×ᶠ───×ᶠ───×ᶠ─── @@ -74,13 +74,13 @@ def test_swap_network(): 3: ───×ᶠ───×ᶠ───×ᶠ───×ᶠ───×ᶠ─── │ │ 4: ────────×ᶠ────────×ᶠ──────── -""".strip() +""") circuit = cirq.Circuit.from_ops( swap_network(qubits, lambda i, j, q0, q1: (), offset=True), strategy=cirq.InsertStrategy.EARLIEST) - assert circuit.to_text_diagram(transpose=True).strip() == """ + cirq.testing.assert_has_diagram(circuit, """ 0 1 2 3 4 │ │ │ │ │ │ ×─× ×─× @@ -93,4 +93,4 @@ def test_swap_network(): │ │ │ │ │ │ ×─× ×─× │ │ │ │ │ -""".strip() +""", transpose=True) diff --git a/openfermioncirq/trotter/algorithms/linear_swap_network_test.py b/openfermioncirq/trotter/algorithms/linear_swap_network_test.py index 08c11aa2..1a9549c2 100644 --- a/openfermioncirq/trotter/algorithms/linear_swap_network_test.py +++ b/openfermioncirq/trotter/algorithms/linear_swap_network_test.py @@ -32,76 +32,76 @@ def test_linear_swap_network_trotter_step_symmetric(): LINEAR_SWAP_NETWORK.symmetric( ones_hamiltonian).trotter_step(qubits, 1.0), strategy=cirq.InsertStrategy.EARLIEST) - assert circuit.to_text_diagram(transpose=True).strip() == """ -0 1 2 3 -│ │ │ │ -XXYY─────XXYY^0.318 XXYY───────XXYY^0.318 -│ │ │ │ -YXXY─────#2^0.0 YXXY───────#2^0.0 -│ │ │ │ -@────────@^-0.318 @──────────@^-0.318 -│ │ │ │ -×ᶠ───────×ᶠ ×ᶠ─────────×ᶠ -│ │ │ │ -│ XXYY───────XXYY^0.318 │ -│ │ │ │ -│ YXXY───────#2^0.0 │ -│ │ │ │ -│ @──────────@^-0.318 │ -│ │ │ │ -│ ×ᶠ─────────×ᶠ │ -│ │ │ │ -XXYY─────XXYY^0.318 XXYY───────XXYY^0.318 -│ │ │ │ -YXXY─────#2^0.0 YXXY───────#2^0.0 -│ │ │ │ -@────────@^-0.318 @──────────@^-0.318 -│ │ │ │ -×ᶠ───────×ᶠ ×ᶠ─────────×ᶠ -│ │ │ │ -Z^-0.637 XXYY───────XXYY^0.318 Z^-0.637 -│ │ │ │ -│ YXXY───────#2^0.0 │ -│ │ │ │ -│ @──────────@^-0.318 │ -│ │ │ │ -│ ×ᶠ─────────×ᶠ │ -│ │ │ │ -│ Z^-0.637 Z^-0.637 │ -│ │ │ │ -│ @──────────@^-0.318 │ -│ │ │ │ -│ #2─────────YXXY^0.0 │ -│ │ │ │ -│ XXYY───────XXYY^0.318 │ -│ │ │ │ -│ ×ᶠ─────────×ᶠ │ -│ │ │ │ -@────────@^-0.318 @──────────@^-0.318 -│ │ │ │ -#2───────YXXY^0.0 #2─────────YXXY^0.0 -│ │ │ │ -XXYY─────XXYY^0.318 XXYY───────XXYY^0.318 -│ │ │ │ -×ᶠ───────×ᶠ ×ᶠ─────────×ᶠ -│ │ │ │ -│ @──────────@^-0.318 │ -│ │ │ │ -│ #2─────────YXXY^0.0 │ -│ │ │ │ -│ XXYY───────XXYY^0.318 │ -│ │ │ │ -│ ×ᶠ─────────×ᶠ │ -│ │ │ │ -@────────@^-0.318 @──────────@^-0.318 -│ │ │ │ -#2───────YXXY^0.0 #2─────────YXXY^0.0 -│ │ │ │ -XXYY─────XXYY^0.318 XXYY───────XXYY^0.318 -│ │ │ │ -×ᶠ───────×ᶠ ×ᶠ─────────×ᶠ -│ │ │ │ -""".strip() + cirq.testing.assert_has_diagram(circuit, """ +0 1 2 3 +│ │ │ │ +XXYY────────XXYY^0.318 XXYY────────XXYY^0.318 +│ │ │ │ +YXXY────────#2^0.0 YXXY────────#2^0.0 +│ │ │ │ +@───────────@^-0.318 @───────────@^-0.318 +│ │ │ │ +×ᶠ──────────×ᶠ ×ᶠ──────────×ᶠ +│ │ │ │ +│ XXYY────────XXYY^0.318 │ +│ │ │ │ +│ YXXY────────#2^0.0 │ +│ │ │ │ +│ @───────────@^-0.318 │ +│ │ │ │ +│ ×ᶠ──────────×ᶠ │ +│ │ │ │ +XXYY────────XXYY^0.318 XXYY────────XXYY^0.318 +│ │ │ │ +YXXY────────#2^0.0 YXXY────────#2^0.0 +│ │ │ │ +@───────────@^-0.318 @───────────@^-0.318 +│ │ │ │ +×ᶠ──────────×ᶠ ×ᶠ──────────×ᶠ +│ │ │ │ +Rz(-0.637π) XXYY────────XXYY^0.318 Rz(-0.637π) +│ │ │ │ +│ YXXY────────#2^0.0 │ +│ │ │ │ +│ @───────────@^-0.318 │ +│ │ │ │ +│ ×ᶠ──────────×ᶠ │ +│ │ │ │ +│ Rz(-0.637π) Rz(-0.637π) │ +│ │ │ │ +│ @───────────@^-0.318 │ +│ │ │ │ +│ #2──────────YXXY^0.0 │ +│ │ │ │ +│ XXYY────────XXYY^0.318 │ +│ │ │ │ +│ ×ᶠ──────────×ᶠ │ +│ │ │ │ +@───────────@^-0.318 @───────────@^-0.318 +│ │ │ │ +#2──────────YXXY^0.0 #2──────────YXXY^0.0 +│ │ │ │ +XXYY────────XXYY^0.318 XXYY────────XXYY^0.318 +│ │ │ │ +×ᶠ──────────×ᶠ ×ᶠ──────────×ᶠ +│ │ │ │ +│ @───────────@^-0.318 │ +│ │ │ │ +│ #2──────────YXXY^0.0 │ +│ │ │ │ +│ XXYY────────XXYY^0.318 │ +│ │ │ │ +│ ×ᶠ──────────×ᶠ │ +│ │ │ │ +@───────────@^-0.318 @───────────@^-0.318 +│ │ │ │ +#2──────────YXXY^0.0 #2──────────YXXY^0.0 +│ │ │ │ +XXYY────────XXYY^0.318 XXYY────────XXYY^0.318 +│ │ │ │ +×ᶠ──────────×ᶠ ×ᶠ──────────×ᶠ +│ │ │ │ +""", transpose=True) def test_linear_swap_network_trotter_step_controlled_symmetric(): @@ -110,107 +110,107 @@ def test_linear_swap_network_trotter_step_controlled_symmetric(): ones_hamiltonian).trotter_step( qubits, 1.0, control), strategy=cirq.InsertStrategy.EARLIEST) - assert circuit.to_text_diagram(transpose=True).strip() == """ - -1 0 1 2 3 - │ │ │ │ │ - @────────XXYY─────XXYY^0.318 │ │ - │ │ │ │ │ - @────────YXXY─────#2^0.0 │ │ - │ │ │ │ │ - @────────@────────@^-0.318 │ │ -┌ │ │ │ │ │ ┐ -│ │ ×ᶠ───────×ᶠ │ │ │ -│ @────────┼────────┼──────────XXYY───────XXYY^0.318 │ -└ │ │ │ │ │ ┘ - @────────┼────────┼──────────YXXY───────#2^0.0 - │ │ │ │ │ - @────────┼────────┼──────────@──────────@^-0.318 - │ │ │ │ │ - │ │ │ ×ᶠ─────────×ᶠ - │ │ │ │ │ - @────────┼────────XXYY───────XXYY^0.318 │ - │ │ │ │ │ - @────────┼────────YXXY───────#2^0.0 │ - │ │ │ │ │ - @────────┼────────@──────────@^-0.318 │ - │ │ │ │ │ - │ │ ×ᶠ─────────×ᶠ │ - │ │ │ │ │ - @────────XXYY─────XXYY^0.318 │ │ - │ │ │ │ │ - @────────YXXY─────#2^0.0 │ │ - │ │ │ │ │ - @────────@────────@^-0.318 │ │ -┌ │ │ │ │ │ ┐ -│ │ ×ᶠ───────×ᶠ │ │ │ -│ @────────┼────────┼──────────XXYY───────XXYY^0.318 │ -└ │ │ │ │ │ ┘ - @────────┼────────┼──────────YXXY───────#2^0.0 - │ │ │ │ │ - @────────┼────────┼──────────@──────────@^-0.318 - │ │ │ │ │ - │ │ │ ×ᶠ─────────×ᶠ - │ │ │ │ │ - @────────┼────────XXYY───────XXYY^0.318 │ - │ │ │ │ │ - @────────┼────────YXXY───────#2^0.0 │ - │ │ │ │ │ - @────────┼────────@──────────@^-0.318 │ -┌ │ │ │ │ │ ┐ -│ │ │ ×ᶠ─────────×ᶠ │ │ -│ @────────┼────────┼──────────┼──────────@^-0.637 │ -└ │ │ │ │ │ ┘ - @────────┼────────┼──────────@^-0.637 │ - │ │ │ │ │ - @────────┼────────@^-0.637 │ │ - │ │ │ │ │ - @────────@^-0.637 │ │ │ - │ │ │ │ │ - @────────┼────────@──────────@^-0.318 │ - │ │ │ │ │ - @────────┼────────#2─────────YXXY^0.0 │ - │ │ │ │ │ - @────────┼────────XXYY───────XXYY^0.318 │ - │ │ │ │ │ - │ │ ×ᶠ─────────×ᶠ │ - │ │ │ │ │ - @────────┼────────┼──────────@──────────@^-0.318 - │ │ │ │ │ - @────────┼────────┼──────────#2─────────YXXY^0.0 - │ │ │ │ │ - @────────┼────────┼──────────XXYY───────XXYY^0.318 - │ │ │ │ │ - @────────@────────@^-0.318 ×ᶠ─────────×ᶠ - │ │ │ │ │ - @────────#2───────YXXY^0.0 │ │ - │ │ │ │ │ - @────────XXYY─────XXYY^0.318 │ │ - │ │ │ │ │ - │ ×ᶠ───────×ᶠ │ │ - │ │ │ │ │ - @────────┼────────@──────────@^-0.318 │ - │ │ │ │ │ - @────────┼────────#2─────────YXXY^0.0 │ - │ │ │ │ │ - @────────┼────────XXYY───────XXYY^0.318 │ - │ │ │ │ │ - │ │ ×ᶠ─────────×ᶠ │ - │ │ │ │ │ - @────────┼────────┼──────────@──────────@^-0.318 - │ │ │ │ │ - @────────┼────────┼──────────#2─────────YXXY^0.0 - │ │ │ │ │ - @────────┼────────┼──────────XXYY───────XXYY^0.318 - │ │ │ │ │ - @────────@────────@^-0.318 ×ᶠ─────────×ᶠ - │ │ │ │ │ - @────────#2───────YXXY^0.0 │ │ - │ │ │ │ │ - @────────XXYY─────XXYY^0.318 │ │ - │ │ │ │ │ - Z^-0.318 ×ᶠ───────×ᶠ │ │ - │ │ │ │ │ -""".strip() + cirq.testing.assert_has_diagram(circuit, """ + -1 0 1 2 3 + │ │ │ │ │ + @───────────XXYY─────XXYY^0.318 │ │ + │ │ │ │ │ + @───────────YXXY─────#2^0.0 │ │ + │ │ │ │ │ + @───────────@────────@^-0.318 │ │ +┌ │ │ │ │ │ ┐ +│ │ ×ᶠ───────×ᶠ │ │ │ +│ @───────────┼────────┼──────────XXYY───────XXYY^0.318 │ +└ │ │ │ │ │ ┘ + @───────────┼────────┼──────────YXXY───────#2^0.0 + │ │ │ │ │ + @───────────┼────────┼──────────@──────────@^-0.318 + │ │ │ │ │ + │ │ │ ×ᶠ─────────×ᶠ + │ │ │ │ │ + @───────────┼────────XXYY───────XXYY^0.318 │ + │ │ │ │ │ + @───────────┼────────YXXY───────#2^0.0 │ + │ │ │ │ │ + @───────────┼────────@──────────@^-0.318 │ + │ │ │ │ │ + │ │ ×ᶠ─────────×ᶠ │ + │ │ │ │ │ + @───────────XXYY─────XXYY^0.318 │ │ + │ │ │ │ │ + @───────────YXXY─────#2^0.0 │ │ + │ │ │ │ │ + @───────────@────────@^-0.318 │ │ +┌ │ │ │ │ │ ┐ +│ │ ×ᶠ───────×ᶠ │ │ │ +│ @───────────┼────────┼──────────XXYY───────XXYY^0.318 │ +└ │ │ │ │ │ ┘ + @───────────┼────────┼──────────YXXY───────#2^0.0 + │ │ │ │ │ + @───────────┼────────┼──────────@──────────@^-0.318 + │ │ │ │ │ + │ │ │ ×ᶠ─────────×ᶠ + │ │ │ │ │ + @───────────┼────────XXYY───────XXYY^0.318 │ + │ │ │ │ │ + @───────────┼────────YXXY───────#2^0.0 │ + │ │ │ │ │ + @───────────┼────────@──────────@^-0.318 │ +┌ │ │ │ │ │ ┐ +│ │ │ ×ᶠ─────────×ᶠ │ │ +│ @───────────┼────────┼──────────┼──────────@^-0.637 │ +└ │ │ │ │ │ ┘ + @───────────┼────────┼──────────@^-0.637 │ + │ │ │ │ │ + @───────────┼────────@^-0.637 │ │ + │ │ │ │ │ + @───────────@^-0.637 │ │ │ + │ │ │ │ │ + @───────────┼────────@──────────@^-0.318 │ + │ │ │ │ │ + @───────────┼────────#2─────────YXXY^0.0 │ + │ │ │ │ │ + @───────────┼────────XXYY───────XXYY^0.318 │ + │ │ │ │ │ + │ │ ×ᶠ─────────×ᶠ │ + │ │ │ │ │ + @───────────┼────────┼──────────@──────────@^-0.318 + │ │ │ │ │ + @───────────┼────────┼──────────#2─────────YXXY^0.0 + │ │ │ │ │ + @───────────┼────────┼──────────XXYY───────XXYY^0.318 + │ │ │ │ │ + @───────────@────────@^-0.318 ×ᶠ─────────×ᶠ + │ │ │ │ │ + @───────────#2───────YXXY^0.0 │ │ + │ │ │ │ │ + @───────────XXYY─────XXYY^0.318 │ │ + │ │ │ │ │ + │ ×ᶠ───────×ᶠ │ │ + │ │ │ │ │ + @───────────┼────────@──────────@^-0.318 │ + │ │ │ │ │ + @───────────┼────────#2─────────YXXY^0.0 │ + │ │ │ │ │ + @───────────┼────────XXYY───────XXYY^0.318 │ + │ │ │ │ │ + │ │ ×ᶠ─────────×ᶠ │ + │ │ │ │ │ + @───────────┼────────┼──────────@──────────@^-0.318 + │ │ │ │ │ + @───────────┼────────┼──────────#2─────────YXXY^0.0 + │ │ │ │ │ + @───────────┼────────┼──────────XXYY───────XXYY^0.318 + │ │ │ │ │ + @───────────@────────@^-0.318 ×ᶠ─────────×ᶠ + │ │ │ │ │ + @───────────#2───────YXXY^0.0 │ │ + │ │ │ │ │ + @───────────XXYY─────XXYY^0.318 │ │ + │ │ │ │ │ + Rz(-0.318π) ×ᶠ───────×ᶠ │ │ + │ │ │ │ │ +""", transpose=True) def test_linear_swap_network_trotter_step_asymmetric(): @@ -218,44 +218,44 @@ def test_linear_swap_network_trotter_step_asymmetric(): LINEAR_SWAP_NETWORK.asymmetric( ones_hamiltonian).trotter_step(qubits, 1.0), strategy=cirq.InsertStrategy.EARLIEST) - assert circuit.to_text_diagram(transpose=True).strip() == """ -0 1 2 3 -│ │ │ │ -XXYY─────XXYY^0.637 XXYY───────XXYY^0.637 -│ │ │ │ -YXXY─────#2^0.0 YXXY───────#2^0.0 -│ │ │ │ -@────────@^-0.637 @──────────@^-0.637 -│ │ │ │ -×ᶠ───────×ᶠ ×ᶠ─────────×ᶠ -│ │ │ │ -│ XXYY───────XXYY^0.637 │ -│ │ │ │ -│ YXXY───────#2^0.0 │ -│ │ │ │ -│ @──────────@^-0.637 │ -│ │ │ │ -│ ×ᶠ─────────×ᶠ │ -│ │ │ │ -XXYY─────XXYY^0.637 XXYY───────XXYY^0.637 -│ │ │ │ -YXXY─────#2^0.0 YXXY───────#2^0.0 -│ │ │ │ -@────────@^-0.637 @──────────@^-0.637 -│ │ │ │ -×ᶠ───────×ᶠ ×ᶠ─────────×ᶠ -│ │ │ │ -Z^-0.637 XXYY───────XXYY^0.637 Z^-0.637 -│ │ │ │ -│ YXXY───────#2^0.0 │ -│ │ │ │ -│ @──────────@^-0.637 │ -│ │ │ │ -│ ×ᶠ─────────×ᶠ │ -│ │ │ │ -│ Z^-0.637 Z^-0.637 │ -│ │ │ │ -""".strip() + cirq.testing.assert_has_diagram(circuit, """ +0 1 2 3 +│ │ │ │ +XXYY────────XXYY^0.637 XXYY────────XXYY^0.637 +│ │ │ │ +YXXY────────#2^0.0 YXXY────────#2^0.0 +│ │ │ │ +@───────────@^-0.637 @───────────@^-0.637 +│ │ │ │ +×ᶠ──────────×ᶠ ×ᶠ──────────×ᶠ +│ │ │ │ +│ XXYY────────XXYY^0.637 │ +│ │ │ │ +│ YXXY────────#2^0.0 │ +│ │ │ │ +│ @───────────@^-0.637 │ +│ │ │ │ +│ ×ᶠ──────────×ᶠ │ +│ │ │ │ +XXYY────────XXYY^0.637 XXYY────────XXYY^0.637 +│ │ │ │ +YXXY────────#2^0.0 YXXY────────#2^0.0 +│ │ │ │ +@───────────@^-0.637 @───────────@^-0.637 +│ │ │ │ +×ᶠ──────────×ᶠ ×ᶠ──────────×ᶠ +│ │ │ │ +Rz(-0.637π) XXYY────────XXYY^0.637 Rz(-0.637π) +│ │ │ │ +│ YXXY────────#2^0.0 │ +│ │ │ │ +│ @───────────@^-0.637 │ +│ │ │ │ +│ ×ᶠ──────────×ᶠ │ +│ │ │ │ +│ Rz(-0.637π) Rz(-0.637π) │ +│ │ │ │ +""", transpose=True) def test_linear_swap_network_trotter_step_controlled_asymmetric(): @@ -264,62 +264,62 @@ def test_linear_swap_network_trotter_step_controlled_asymmetric(): ones_hamiltonian).trotter_step( qubits, 1.0, control), strategy=cirq.InsertStrategy.EARLIEST) - assert circuit.to_text_diagram(transpose=True).strip() == """ - -1 0 1 2 3 - │ │ │ │ │ - @────────XXYY─────XXYY^0.637 │ │ - │ │ │ │ │ - @────────YXXY─────#2^0.0 │ │ - │ │ │ │ │ - @────────@────────@^-0.637 │ │ -┌ │ │ │ │ │ ┐ -│ │ ×ᶠ───────×ᶠ │ │ │ -│ @────────┼────────┼──────────XXYY───────XXYY^0.637 │ -└ │ │ │ │ │ ┘ - @────────┼────────┼──────────YXXY───────#2^0.0 - │ │ │ │ │ - @────────┼────────┼──────────@──────────@^-0.637 - │ │ │ │ │ - │ │ │ ×ᶠ─────────×ᶠ - │ │ │ │ │ - @────────┼────────XXYY───────XXYY^0.637 │ - │ │ │ │ │ - @────────┼────────YXXY───────#2^0.0 │ - │ │ │ │ │ - @────────┼────────@──────────@^-0.637 │ - │ │ │ │ │ - │ │ ×ᶠ─────────×ᶠ │ - │ │ │ │ │ - @────────XXYY─────XXYY^0.637 │ │ - │ │ │ │ │ - @────────YXXY─────#2^0.0 │ │ - │ │ │ │ │ - @────────@────────@^-0.637 │ │ -┌ │ │ │ │ │ ┐ -│ │ ×ᶠ───────×ᶠ │ │ │ -│ @────────┼────────┼──────────XXYY───────XXYY^0.637 │ -└ │ │ │ │ │ ┘ - @────────┼────────┼──────────YXXY───────#2^0.0 - │ │ │ │ │ - @────────┼────────┼──────────@──────────@^-0.637 - │ │ │ │ │ - │ │ │ ×ᶠ─────────×ᶠ - │ │ │ │ │ - @────────┼────────XXYY───────XXYY^0.637 │ - │ │ │ │ │ - @────────┼────────YXXY───────#2^0.0 │ - │ │ │ │ │ - @────────┼────────@──────────@^-0.637 │ -┌ │ │ │ │ │ ┐ -│ │ │ ×ᶠ─────────×ᶠ │ │ -│ @────────┼────────┼──────────┼──────────@^-0.637 │ -└ │ │ │ │ │ ┘ - @────────┼────────┼──────────@^-0.637 │ - │ │ │ │ │ - @────────┼────────@^-0.637 │ │ - │ │ │ │ │ - @────────@^-0.637 │ │ │ - │ │ │ │ │ - Z^-0.318 │ │ │ │ - │ │ │ │ │ -""".strip() + cirq.testing.assert_has_diagram(circuit, """ + -1 0 1 2 3 + │ │ │ │ │ + @───────────XXYY─────XXYY^0.637 │ │ + │ │ │ │ │ + @───────────YXXY─────#2^0.0 │ │ + │ │ │ │ │ + @───────────@────────@^-0.637 │ │ +┌ │ │ │ │ │ ┐ +│ │ ×ᶠ───────×ᶠ │ │ │ +│ @───────────┼────────┼──────────XXYY───────XXYY^0.637 │ +└ │ │ │ │ │ ┘ + @───────────┼────────┼──────────YXXY───────#2^0.0 + │ │ │ │ │ + @───────────┼────────┼──────────@──────────@^-0.637 + │ │ │ │ │ + │ │ │ ×ᶠ─────────×ᶠ + │ │ │ │ │ + @───────────┼────────XXYY───────XXYY^0.637 │ + │ │ │ │ │ + @───────────┼────────YXXY───────#2^0.0 │ + │ │ │ │ │ + @───────────┼────────@──────────@^-0.637 │ + │ │ │ │ │ + │ │ ×ᶠ─────────×ᶠ │ + │ │ │ │ │ + @───────────XXYY─────XXYY^0.637 │ │ + │ │ │ │ │ + @───────────YXXY─────#2^0.0 │ │ + │ │ │ │ │ + @───────────@────────@^-0.637 │ │ +┌ │ │ │ │ │ ┐ +│ │ ×ᶠ───────×ᶠ │ │ │ +│ @───────────┼────────┼──────────XXYY───────XXYY^0.637 │ +└ │ │ │ │ │ ┘ + @───────────┼────────┼──────────YXXY───────#2^0.0 + │ │ │ │ │ + @───────────┼────────┼──────────@──────────@^-0.637 + │ │ │ │ │ + │ │ │ ×ᶠ─────────×ᶠ + │ │ │ │ │ + @───────────┼────────XXYY───────XXYY^0.637 │ + │ │ │ │ │ + @───────────┼────────YXXY───────#2^0.0 │ + │ │ │ │ │ + @───────────┼────────@──────────@^-0.637 │ +┌ │ │ │ │ │ ┐ +│ │ │ ×ᶠ─────────×ᶠ │ │ +│ @───────────┼────────┼──────────┼──────────@^-0.637 │ +└ │ │ │ │ │ ┘ + @───────────┼────────┼──────────@^-0.637 │ + │ │ │ │ │ + @───────────┼────────@^-0.637 │ │ + │ │ │ │ │ + @───────────@^-0.637 │ │ │ + │ │ │ │ │ + Rz(-0.318π) │ │ │ │ + │ │ │ │ │ +""", transpose=True) diff --git a/openfermioncirq/trotter/algorithms/split_operator_test.py b/openfermioncirq/trotter/algorithms/split_operator_test.py index 31f8e148..38b542c6 100644 --- a/openfermioncirq/trotter/algorithms/split_operator_test.py +++ b/openfermioncirq/trotter/algorithms/split_operator_test.py @@ -32,64 +32,64 @@ def test_split_operator_trotter_step_symmetric(): SPLIT_OPERATOR.symmetric(ones_hamiltonian).trotter_step( qubits, 1.0), strategy=cirq.InsertStrategy.EARLIEST) - assert circuit.to_text_diagram(transpose=True).strip() == """ -0 1 2 3 -│ │ │ │ -Z^-0.159 Z^-0.159 Z^-0.159 Z^-0.796 -│ │ │ │ -Z Z^0.0 Z^0.0 Z^0.0 -│ │ │ │ -│ │ YXXY────────#2^-1 -│ │ │ │ -│ YXXY───────#2^-0.333 Z^0.0 -│ │ │ │ -YXXY─────#2^-1 Z^0.0 │ -│ │ │ │ -│ Z^0.0 YXXY────────#2^-0.301 -│ │ │ │ -│ YXXY───────#2^0.449 Z^0.0 -│ │ │ │ -@────────@^-0.637 Z^0.0 │ -│ │ │ │ -×────────× YXXY────────#2^-0.123 -│ │ │ │ -│ │ │ Z^0.0 -│ │ │ │ -│ │ @───────────@^-0.637 -│ │ │ │ -│ │ ×───────────× -│ │ │ │ -│ @──────────@^-0.637 │ -│ │ │ │ -│ ×──────────× │ -│ │ │ │ -@────────@^-0.637 @───────────@^-0.637 -│ │ │ │ -×────────× ×───────────× -│ │ │ │ -Z^0.0 @──────────@^-0.637 │ -│ │ │ │ -│ ×──────────× │ -│ │ │ │ -#2───────YXXY^0.123 │ │ -│ │ │ │ -Z^0.0 Z^0.0 │ │ -│ │ │ │ -│ #2─────────YXXY^-0.449 │ -│ │ │ │ -#2───────YXXY^0.301 Z^0.0 │ -│ │ │ │ -Z^0.0 Z^0.0 #2──────────YXXY -│ │ │ │ -│ #2─────────YXXY^0.333 Z^-1 -│ │ │ │ -#2───────YXXY Z^0.0 Z^-0.159 -│ │ │ │ -Z^0.0 Z^0.0 Z^-0.159 │ -│ │ │ │ -Z^-0.796 Z^-0.159 │ │ -│ │ │ │ -""".strip() + cirq.testing.assert_has_diagram(circuit, """ +0 1 2 3 +│ │ │ │ +Rz(-0.159π) Rz(-0.159π) Rz(-0.159π) Rz(-0.796π) +│ │ │ │ +Rz(π) Rz(0.0π) Rz(0.0π) Rz(0.0π) +│ │ │ │ +│ │ YXXY────────#2^-1 +│ │ │ │ +│ YXXY────────#2^-0.333 Z^0.0 +│ │ │ │ +YXXY────────#2^-1 Z^0.0 │ +│ │ │ │ +│ Z^0.0 YXXY────────#2^-0.301 +│ │ │ │ +│ YXXY────────#2^0.449 Z^0.0 +│ │ │ │ +@───────────@^-0.637 Z^0.0 │ +│ │ │ │ +×───────────× YXXY────────#2^-0.123 +│ │ │ │ +│ │ │ Z^0.0 +│ │ │ │ +│ │ @───────────@^-0.637 +│ │ │ │ +│ │ ×───────────× +│ │ │ │ +│ @───────────@^-0.637 │ +│ │ │ │ +│ ×───────────× │ +│ │ │ │ +@───────────@^-0.637 @───────────@^-0.637 +│ │ │ │ +×───────────× ×───────────× +│ │ │ │ +Z^-0.0 @───────────@^-0.637 │ +│ │ │ │ +│ ×───────────× │ +│ │ │ │ +#2──────────YXXY^0.123 │ │ +│ │ │ │ +Z^-0.0 Z^-0.0 │ │ +│ │ │ │ +│ #2──────────YXXY^-0.449 │ +│ │ │ │ +#2──────────YXXY^0.301 Z^-0.0 │ +│ │ │ │ +Z^-0.0 Z^-0.0 #2──────────YXXY +│ │ │ │ +│ #2──────────YXXY^0.333 Rz(-π) +│ │ │ │ +#2──────────YXXY Rz(-0.0π) Rz(-0.159π) +│ │ │ │ +Rz(-0.0π) Rz(-0.0π) Rz(-0.159π) │ +│ │ │ │ +Rz(-0.796π) Rz(-0.159π) │ │ +│ │ │ │ +""", transpose=True) def test_split_operator_trotter_step_controlled_symmetric(): @@ -97,85 +97,85 @@ def test_split_operator_trotter_step_controlled_symmetric(): SPLIT_OPERATOR.controlled_symmetric(ones_hamiltonian).trotter_step( qubits, 1.0, control), strategy=cirq.InsertStrategy.EARLIEST) - assert circuit.to_text_diagram(transpose=True).strip() == """ - -1 0 1 2 3 - │ │ │ │ │ - @────────@^-0.159 │ │ │ -┌ │ │ │ │ │ ┐ -│ @────────┼────────@^-0.159 │ │ │ -│ │ Z │ │ │ │ -└ │ │ │ │ │ ┘ -┌ │ │ │ │ │ ┐ -│ @────────┼────────┼──────────@^-0.159 │ │ -│ │ │ Z^0.0 │ │ │ -└ │ │ │ │ │ ┘ -┌ │ │ │ │ │ ┐ -│ @────────┼────────┼──────────┼───────────@^-0.796 │ -│ │ │ │ Z^0.0 │ │ -└ │ │ │ │ │ ┘ - │ │ │ │ Z^0.0 - │ │ │ │ │ - │ │ │ YXXY────────#2^-1 - │ │ │ │ │ - │ │ YXXY───────#2^-0.333 Z^0.0 - │ │ │ │ │ - │ YXXY─────#2^-1 Z^0.0 │ - │ │ │ │ │ - │ │ Z^0.0 YXXY────────#2^-0.301 - │ │ │ │ │ - │ │ YXXY───────#2^0.449 Z^0.0 - │ │ │ │ │ - @────────@────────@^-0.637 Z^0.0 │ - │ │ │ │ │ - │ ×────────× YXXY────────#2^-0.123 - │ │ │ │ │ - │ │ │ │ Z^0.0 - │ │ │ │ │ - @────────┼────────┼──────────@───────────@^-0.637 - │ │ │ │ │ - │ │ │ ×───────────× - │ │ │ │ │ - @────────┼────────@──────────@^-0.637 │ - │ │ │ │ │ - │ │ ×──────────× │ - │ │ │ │ │ - @────────@────────@^-0.637 │ │ -┌ │ │ │ │ │ ┐ -│ │ ×────────× │ │ │ -│ @────────┼────────┼──────────@───────────@^-0.637 │ -└ │ │ │ │ │ ┘ - │ Z^0.0 │ ×───────────× - │ │ │ │ │ - @────────┼────────@──────────@^-0.637 │ - │ │ │ │ │ - │ │ ×──────────× │ - │ │ │ │ │ - │ #2───────YXXY^0.123 │ │ - │ │ │ │ │ - │ Z^0.0 Z^0.0 │ │ - │ │ │ │ │ - │ │ #2─────────YXXY^-0.449 │ - │ │ │ │ │ - │ #2───────YXXY^0.301 Z^0.0 │ - │ │ │ │ │ - │ Z^0.0 Z^0.0 #2──────────YXXY - │ │ │ │ │ - │ │ #2─────────YXXY^0.333 Z^-1 -┌ │ │ │ │ │ ┐ -│ │ #2───────YXXY Z^0.0 │ │ -│ @────────┼────────┼──────────┼───────────@^-0.159 │ -└ │ │ │ │ │ ┘ -┌ │ │ │ │ │ ┐ -│ │ Z^0.0 Z^0.0 │ │ │ -│ @────────┼────────┼──────────@^-0.159 │ │ -└ │ │ │ │ │ ┘ - @────────┼────────@^-0.159 │ │ - │ │ │ │ │ - @────────@^-0.796 │ │ │ - │ │ │ │ │ - Z^-0.318 │ │ │ │ - │ │ │ │ │ -""".strip() + cirq.testing.assert_has_diagram(circuit, """ + -1 0 1 2 3 + │ │ │ │ │ + @───────────@^-0.159 │ │ │ +┌ │ │ │ │ │ ┐ +│ @───────────┼─────────@^-0.159 │ │ │ +│ │ Rz(π) │ │ │ │ +└ │ │ │ │ │ ┘ +┌ │ │ │ │ │ ┐ +│ @───────────┼─────────┼──────────@^-0.159 │ │ +│ │ │ Rz(0.0π) │ │ │ +└ │ │ │ │ │ ┘ +┌ │ │ │ │ │ ┐ +│ @───────────┼─────────┼──────────┼───────────@^-0.796 │ +│ │ │ │ Rz(0.0π) │ │ +└ │ │ │ │ │ ┘ + │ │ │ │ Rz(0.0π) + │ │ │ │ │ + │ │ │ YXXY────────#2^-1 + │ │ │ │ │ + │ │ YXXY───────#2^-0.333 Z^0.0 + │ │ │ │ │ + │ YXXY──────#2^-1 Z^0.0 │ + │ │ │ │ │ + │ │ Z^0.0 YXXY────────#2^-0.301 + │ │ │ │ │ + │ │ YXXY───────#2^0.449 Z^0.0 + │ │ │ │ │ + @───────────@─────────@^-0.637 Z^0.0 │ + │ │ │ │ │ + │ ×─────────× YXXY────────#2^-0.123 + │ │ │ │ │ + │ │ │ │ Z^0.0 + │ │ │ │ │ + @───────────┼─────────┼──────────@───────────@^-0.637 + │ │ │ │ │ + │ │ │ ×───────────× + │ │ │ │ │ + @───────────┼─────────@──────────@^-0.637 │ + │ │ │ │ │ + │ │ ×──────────× │ + │ │ │ │ │ + @───────────@─────────@^-0.637 │ │ +┌ │ │ │ │ │ ┐ +│ │ ×─────────× │ │ │ +│ @───────────┼─────────┼──────────@───────────@^-0.637 │ +└ │ │ │ │ │ ┘ + │ Z^-0.0 │ ×───────────× + │ │ │ │ │ + @───────────┼─────────@──────────@^-0.637 │ + │ │ │ │ │ + │ │ ×──────────× │ + │ │ │ │ │ + │ #2────────YXXY^0.123 │ │ + │ │ │ │ │ + │ Z^-0.0 Z^-0.0 │ │ + │ │ │ │ │ + │ │ #2─────────YXXY^-0.449 │ + │ │ │ │ │ + │ #2────────YXXY^0.301 Z^-0.0 │ + │ │ │ │ │ + │ Z^-0.0 Z^-0.0 #2──────────YXXY + │ │ │ │ │ + │ │ #2─────────YXXY^0.333 Rz(-π) +┌ │ │ │ │ │ ┐ +│ │ #2────────YXXY Rz(-0.0π) │ │ +│ @───────────┼─────────┼──────────┼───────────@^-0.159 │ +└ │ │ │ │ │ ┘ +┌ │ │ │ │ │ ┐ +│ │ Rz(-0.0π) Rz(-0.0π) │ │ │ +│ @───────────┼─────────┼──────────@^-0.159 │ │ +└ │ │ │ │ │ ┘ + @───────────┼─────────@^-0.159 │ │ + │ │ │ │ │ + @───────────@^-0.796 │ │ │ + │ │ │ │ │ + Rz(-0.318π) │ │ │ │ + │ │ │ │ │ +""", transpose=True) def test_split_operator_trotter_step_asymmetric(): @@ -183,62 +183,62 @@ def test_split_operator_trotter_step_asymmetric(): SPLIT_OPERATOR.asymmetric(ones_hamiltonian).trotter_step( qubits, 1.0), strategy=cirq.InsertStrategy.EARLIEST) - assert circuit.to_text_diagram(transpose=True).strip() == """ -0 1 2 3 -│ │ │ │ -@───────@^-0.637 @───────────@^-0.637 -│ │ │ │ -×───────× ×───────────× -│ │ │ │ -│ @───────────@^-0.637 │ -│ │ │ │ -│ ×───────────× │ -│ │ │ │ -@───────@^-0.637 @───────────@^-0.637 -│ │ │ │ -×───────× ×───────────× -│ │ │ │ -Z^0.0 @───────────@^-0.637 │ -│ │ │ │ -│ ×───────────× │ -│ │ │ │ -#2──────YXXY^0.123 │ │ -│ │ │ │ -Z^0.0 Z^0.0 │ │ -│ │ │ │ -│ #2──────────YXXY^-0.449 │ -│ │ │ │ -#2──────YXXY^0.301 Z^0.0 │ -│ │ │ │ -Z^0.0 Z^0.0 #2──────────YXXY -│ │ │ │ -│ #2──────────YXXY^0.333 Z^-1 -│ │ │ │ -#2──────YXXY Z^0.0 Z^-0.318 -│ │ │ │ -Z^0.0 Z^0.0 Z^-0.318 Z -│ │ │ │ -Z^-1.59 Z^-0.318 Z^0.0 │ -│ │ │ │ -Z^0.0 Z^0.0 │ │ -│ │ │ │ -#2──────YXXY^-1 │ │ -│ │ │ │ -Z^0.0 #2──────────YXXY^-0.333 │ -│ │ │ │ -│ Z^0.0 #2──────────YXXY^-1 -│ │ │ │ -#2──────YXXY^-0.301 Z^0.0 │ -│ │ │ │ -Z^0.0 #2──────────YXXY^0.449 │ -│ │ │ │ -│ Z^0.0 │ │ -│ │ │ │ -#2──────YXXY^-0.123 │ │ -│ │ │ │ -Z^0.0 │ │ │ -│ │ │ │ -""".strip() + cirq.testing.assert_has_diagram(circuit, """ +0 1 2 3 +│ │ │ │ +@───────────@^-0.637 @───────────@^-0.637 +│ │ │ │ +×───────────× ×───────────× +│ │ │ │ +│ @───────────@^-0.637 │ +│ │ │ │ +│ ×───────────× │ +│ │ │ │ +@───────────@^-0.637 @───────────@^-0.637 +│ │ │ │ +×───────────× ×───────────× +│ │ │ │ +Z^-0.0 @───────────@^-0.637 │ +│ │ │ │ +│ ×───────────× │ +│ │ │ │ +#2──────────YXXY^0.123 │ │ +│ │ │ │ +Z^-0.0 Z^-0.0 │ │ +│ │ │ │ +│ #2──────────YXXY^-0.449 │ +│ │ │ │ +#2──────────YXXY^0.301 Z^-0.0 │ +│ │ │ │ +Z^-0.0 Z^-0.0 #2──────────YXXY +│ │ │ │ +│ #2──────────YXXY^0.333 Rz(-π) +│ │ │ │ +#2──────────YXXY Rz(-0.0π) Rz(-0.318π) +│ │ │ │ +Rz(-0.0π) Rz(-0.0π) Rz(-0.318π) Rz(π) +│ │ │ │ +Rz(-1.592π) Rz(-0.318π) Rz(0.0π) │ +│ │ │ │ +Rz(0.0π) Rz(0.0π) │ │ +│ │ │ │ +#2──────────YXXY^-1 │ │ +│ │ │ │ +Z^0.0 #2──────────YXXY^-0.333 │ +│ │ │ │ +│ Z^0.0 #2──────────YXXY^-1 +│ │ │ │ +#2──────────YXXY^-0.301 Z^0.0 │ +│ │ │ │ +Z^0.0 #2──────────YXXY^0.449 │ +│ │ │ │ +│ Z^0.0 │ │ +│ │ │ │ +#2──────────YXXY^-0.123 │ │ +│ │ │ │ +Z^0.0 │ │ │ +│ │ │ │ +""", transpose=True) def test_split_operator_trotter_step_controlled_asymmetric(): @@ -246,69 +246,70 @@ def test_split_operator_trotter_step_controlled_asymmetric(): SPLIT_OPERATOR.controlled_asymmetric(ones_hamiltonian).trotter_step( qubits, 1.0, control), strategy=cirq.InsertStrategy.EARLIEST) - assert circuit.to_text_diagram(transpose=True).strip() == """ - -1 0 1 2 3 - │ │ │ │ │ - @────────@───────@^-0.637 │ │ -┌ │ │ │ │ │ ┐ -│ │ ×───────× │ │ │ -│ @────────┼───────┼───────────@───────────@^-0.637 │ -└ │ │ │ │ │ ┘ - │ │ │ ×───────────× - │ │ │ │ │ - @────────┼───────@───────────@^-0.637 │ - │ │ │ │ │ - │ │ ×───────────× │ - │ │ │ │ │ - @────────@───────@^-0.637 │ │ -┌ │ │ │ │ │ ┐ -│ │ ×───────× │ │ │ -│ @────────┼───────┼───────────@───────────@^-0.637 │ -└ │ │ │ │ │ ┘ - │ Z^0.0 │ ×───────────× - │ │ │ │ │ - @────────┼───────@───────────@^-0.637 │ - │ │ │ │ │ - │ │ ×───────────× │ - │ │ │ │ │ - │ #2──────YXXY^0.123 │ │ - │ │ │ │ │ - │ Z^0.0 Z^0.0 │ │ - │ │ │ │ │ - │ │ #2──────────YXXY^-0.449 │ - │ │ │ │ │ - │ #2──────YXXY^0.301 Z^0.0 │ - │ │ │ │ │ - │ Z^0.0 Z^0.0 #2──────────YXXY - │ │ │ │ │ - │ │ #2──────────YXXY^0.333 Z^-1 -┌ │ │ │ │ │ ┐ -│ │ #2──────YXXY Z^0.0 │ │ -│ @────────┼───────┼───────────┼───────────@^-0.318 │ -└ │ │ │ │ │ ┘ - │ Z^0.0 Z^0.0 │ Z - @────────┼───────┼───────────@^-0.318 │ - │ │ │ │ │ - @────────┼───────@^-0.318 Z^0.0 │ - │ │ │ │ │ - @────────@^0.408 Z^0.0 │ │ - │ │ │ │ │ - Z^-0.318 Z^0.0 │ │ │ - │ │ │ │ │ - │ #2──────YXXY^-1 │ │ - │ │ │ │ │ - │ Z^0.0 #2──────────YXXY^-0.333 │ - │ │ │ │ │ - │ │ Z^0.0 #2──────────YXXY^-1 - │ │ │ │ │ - │ #2──────YXXY^-0.301 Z^0.0 │ - │ │ │ │ │ - │ Z^0.0 #2──────────YXXY^0.449 │ - │ │ │ │ │ - │ │ Z^0.0 │ │ - │ │ │ │ │ - │ #2──────YXXY^-0.123 │ │ - │ │ │ │ │ - │ Z^0.0 │ │ │ - │ │ │ │ │ -""".strip() + cirq.testing.assert_has_diagram(circuit, """ + -1 0 1 2 3 + │ │ │ │ │ + @───────────@─────────@^-0.637 │ │ +┌ │ │ │ │ │ ┐ +│ │ ×─────────× │ │ │ +│ @───────────┼─────────┼───────────@───────────@^-0.637 │ +└ │ │ │ │ │ ┘ + │ │ │ ×───────────× + │ │ │ │ │ + @───────────┼─────────@───────────@^-0.637 │ + │ │ │ │ │ + │ │ ×───────────× │ + │ │ │ │ │ + @───────────@─────────@^-0.637 │ │ +┌ │ │ │ │ │ ┐ +│ │ ×─────────× │ │ │ +│ @───────────┼─────────┼───────────@───────────@^-0.637 │ +└ │ │ │ │ │ ┘ + │ Z^-0.0 │ ×───────────× + │ │ │ │ │ + @───────────┼─────────@───────────@^-0.637 │ + │ │ │ │ │ + │ │ ×───────────× │ + │ │ │ │ │ + │ #2────────YXXY^0.123 │ │ + │ │ │ │ │ + │ Z^-0.0 Z^-0.0 │ │ + │ │ │ │ │ + │ │ #2──────────YXXY^-0.449 │ + │ │ │ │ │ + │ #2────────YXXY^0.301 Z^-0.0 │ + │ │ │ │ │ + │ Z^-0.0 Z^-0.0 #2──────────YXXY + │ │ │ │ │ + │ │ #2──────────YXXY^0.333 Rz(-π) +┌ │ │ │ │ │ ┐ +│ │ #2────────YXXY Rz(-0.0π) │ │ +│ @───────────┼─────────┼───────────┼───────────@^-0.318 │ +└ │ │ │ │ │ ┘ + │ Rz(-0.0π) Rz(-0.0π) │ Rz(π) + @───────────┼─────────┼───────────@^-0.318 │ + │ │ │ │ │ + @───────────┼─────────@^-0.318 Rz(0.0π) │ + │ │ │ │ │ + @───────────@^0.408 Rz(0.0π) │ │ + │ │ │ │ │ + Rz(-0.318π) Rz(0.0π) │ │ │ + │ │ │ │ │ + │ #2────────YXXY^-1 │ │ + │ │ │ │ │ + │ Z^0.0 #2──────────YXXY^-0.333 │ + │ │ │ │ │ + │ │ Z^0.0 #2──────────YXXY^-1 + │ │ │ │ │ + │ #2────────YXXY^-0.301 Z^0.0 │ + │ │ │ │ │ + │ Z^0.0 #2──────────YXXY^0.449 │ + │ │ │ │ │ + │ │ Z^0.0 │ │ + │ │ │ │ │ + │ #2────────YXXY^-0.123 │ │ + │ │ │ │ │ + │ Z^0.0 │ │ │ + │ │ │ │ │ + +""", transpose=True) diff --git a/openfermioncirq/trotter/simulate_trotter_test.py b/openfermioncirq/trotter/simulate_trotter_test.py index bfe63b8e..a411cdd1 100644 --- a/openfermioncirq/trotter/simulate_trotter_test.py +++ b/openfermioncirq/trotter/simulate_trotter_test.py @@ -228,19 +228,20 @@ def test_simulate_trotter_omit_final_swaps(): algorithm=LINEAR_SWAP_NETWORK, omit_final_swaps=True)) - assert (circuit_with_swaps.to_text_diagram(transpose=True).strip() == - (circuit_without_swaps.to_text_diagram(transpose=True).strip() + """ -│ ×ᶠ─────────×ᶠ ×ᶠ─────────×ᶠ -│ │ │ │ │ -×ᶠ───────×ᶠ ×ᶠ─────────×ᶠ │ -│ │ │ │ │ -│ ×ᶠ─────────×ᶠ ×ᶠ─────────×ᶠ -│ │ │ │ │ -×ᶠ───────×ᶠ ×ᶠ─────────×ᶠ │ -│ │ │ │ │ -│ ×ᶠ─────────×ᶠ ×ᶠ─────────×ᶠ -│ │ │ │ │ -""").strip()) + cirq.testing.assert_has_diagram( + circuit_with_swaps, + circuit_without_swaps.to_text_diagram(transpose=True).strip() + """ +│ ×ᶠ──────────×ᶠ ×ᶠ──────────×ᶠ +│ │ │ │ │ +×ᶠ──────────×ᶠ ×ᶠ──────────×ᶠ │ +│ │ │ │ │ +│ ×ᶠ──────────×ᶠ ×ᶠ──────────×ᶠ +│ │ │ │ │ +×ᶠ──────────×ᶠ ×ᶠ──────────×ᶠ │ +│ │ │ │ │ +│ ×ᶠ──────────×ᶠ ×ᶠ──────────×ᶠ +│ │ │ │ │ +""", transpose=True) circuit_with_swaps = cirq.Circuit.from_ops( simulate_trotter( @@ -262,29 +263,30 @@ def test_simulate_trotter_omit_final_swaps(): omit_final_swaps=True), strategy=cirq.InsertStrategy.NEW) - assert (circuit_with_swaps.to_text_diagram(transpose=True).strip() == - (circuit_without_swaps.to_text_diagram(transpose=True).strip() + """ -│ │ │ ×────────────× -│ │ │ │ │ -│ ×───────────× │ │ -│ │ │ │ │ -│ │ ×───────────× │ -│ │ │ │ │ -×─────────× │ │ │ -│ │ │ │ │ -│ │ │ ×────────────× -│ │ │ │ │ -│ ×───────────× │ │ -│ │ │ │ │ -│ │ ×───────────× │ -│ │ │ │ │ -×─────────× │ │ │ -│ │ │ │ │ -│ │ │ ×────────────× -│ │ │ │ │ -│ ×───────────× │ │ -│ │ │ │ │ -""").strip()) + cirq.testing.assert_has_diagram( + circuit_with_swaps, + circuit_without_swaps.to_text_diagram(transpose=True).strip() + """ +│ │ │ ×───────────× +│ │ │ │ │ +│ ×───────────× │ │ +│ │ │ │ │ +│ │ ×───────────× │ +│ │ │ │ │ +×───────────× │ │ │ +│ │ │ │ │ +│ │ │ ×───────────× +│ │ │ │ │ +│ ×───────────× │ │ +│ │ │ │ │ +│ │ ×───────────× │ +│ │ │ │ │ +×───────────× │ │ │ +│ │ │ │ │ +│ │ │ ×───────────× +│ │ │ │ │ +│ ×───────────× │ │ +│ │ │ │ │ +""", transpose=True) hamiltonian = lih_hamiltonian qubits = cirq.LineQubit.range(4) diff --git a/openfermioncirq/variational/ansatzes/low_rank_test.py b/openfermioncirq/variational/ansatzes/low_rank_test.py index 59436e19..cf61af37 100644 --- a/openfermioncirq/variational/ansatzes/low_rank_test.py +++ b/openfermioncirq/variational/ansatzes/low_rank_test.py @@ -57,16 +57,16 @@ def test_low_rank_trotter_ansatz_circuit(): ansatz = LowRankTrotterAnsatz(lih_hamiltonian, final_rank=2) circuit = ansatz.circuit cirq.DropNegligible().optimize_circuit(circuit) - assert circuit.to_text_diagram(transpose=True).strip() == """ + cirq.testing.assert_has_diagram(circuit, """ 0 1 2 3 │ │ │ │ -Z Z Z Z +Rz(π) Rz(π) Rz(π) Rz(π) │ │ │ │ │ YXXY────────#2^-1 │ │ │ │ │ -YXXY──────#2^0.0813 │ │ +YXXY──────#2^0.081 │ │ │ │ │ │ -Z^U_0_0 │ YXXY────────#2^-0.0813 +Z^U_0_0 │ YXXY────────#2^-0.081 │ │ │ │ │ YXXY────────#2^-1 │ │ │ │ │ @@ -102,7 +102,7 @@ def test_low_rank_trotter_ansatz_circuit(): │ │ │ │ │ Z^U_2_0_0 Z^U_1_0_0 │ │ │ │ │ -│ Z Z │ +│ Rz(π) Rz(π) │ │ │ │ │ │ #2──────────YXXY^-1 │ │ │ │ │ @@ -132,7 +132,7 @@ def test_low_rank_trotter_ansatz_circuit(): │ │ │ │ │ Z^U_1_1_0 Z^U_2_1_0 │ │ │ │ │ -│ Z Z │ +│ Rz(π) Rz(π) │ │ │ │ │ │ YXXY────────#2^-1 │ │ │ │ │ @@ -142,7 +142,7 @@ def test_low_rank_trotter_ansatz_circuit(): │ │ │ │ │ YXXY────────#2^-1 │ │ │ │ │ -""".strip() +""", transpose=True) ansatz = LowRankTrotterAnsatz( lih_hamiltonian, @@ -152,112 +152,112 @@ def test_low_rank_trotter_ansatz_circuit(): iterations=2) circuit = ansatz.circuit cirq.DropNegligible().optimize_circuit(circuit) - assert circuit.to_text_diagram(transpose=True).strip() == """ -0 1 2 3 -│ │ │ │ -Z Z Z Z -│ │ │ │ -│ YXXY─────────#2^-1 │ -│ │ │ │ -YXXY──────#2^0.0813 │ │ -│ │ │ │ -Z^U_0_0 │ YXXY────────#2^-0.0813 -│ │ │ │ -│ YXXY─────────#2^-1 │ -│ │ │ │ -│ Z^U_1_0 │ Z^U_3_0 -│ │ │ │ -│ │ Z^U_2_0 │ -│ │ │ │ -│ YXXY─────────#2^-1 │ -│ │ │ │ -YXXY──────#2^-0.051 │ │ -│ │ │ │ -│ │ YXXY────────#2^0.051 -│ │ │ │ -│ YXXY─────────#2^-1 │ -│ │ │ │ -@─────────@^V_0_1_0_0 │ │ -│ │ │ │ -×─────────× @───────────@^V_2_3_0_0 -│ │ │ │ -│ │ ×───────────× -│ │ │ │ -│ @────────────@^V_0_3_0_0 │ -│ │ │ │ -│ ×────────────× │ -│ │ │ │ -@─────────@^V_1_3_0_0 @───────────@^V_0_2_0_0 -│ │ │ │ -×─────────× ×───────────× -│ │ │ │ -Z^U_3_0_0 @────────────@^V_1_2_0_0 Z^U_0_0_0 -│ │ │ │ -Z ×────────────× Z -│ │ │ │ -│ Z^U_2_0_0 Z^U_1_0_0 │ -│ │ │ │ -│ #2───────────YXXY^-1 │ -│ │ │ │ -│ │ #2──────────YXXY^0.132 -│ │ │ │ -#2────────YXXY^-0.132 │ Z -│ │ │ │ -│ #2───────────YXXY^-1 │ -│ │ │ │ -Z │ Z │ -│ │ │ │ -│ Z │ │ -│ │ │ │ -│ #2───────────YXXY^-1 │ -│ │ │ │ -│ │ #2──────────YXXY^0.0813 -│ │ │ │ -#2────────YXXY^-0.0813 │ Z^U_0_1 -│ │ │ │ -│ #2───────────YXXY^-1 │ -│ │ │ │ -Z^U_3_1 │ Z^U_1_1 │ -│ │ │ │ -│ Z^U_2_1 │ │ -│ │ │ │ -│ #2───────────YXXY^-1 │ -│ │ │ │ -│ │ #2──────────YXXY^-0.051 -│ │ │ │ -#2────────YXXY^0.051 │ │ -│ │ │ │ -│ #2───────────YXXY^-1 │ -│ │ │ │ -│ │ @───────────@^V_0_1_0_1 -│ │ │ │ -@─────────@^V_2_3_0_1 ×───────────× -│ │ │ │ -×─────────× │ │ -│ │ │ │ -│ @────────────@^V_0_3_0_1 │ -│ │ │ │ -│ ×────────────× │ -│ │ │ │ -@─────────@^V_0_2_0_1 @───────────@^V_1_3_0_1 -│ │ │ │ -×─────────× ×───────────× -│ │ │ │ -Z^U_0_0_1 @────────────@^V_1_2_0_1 Z^U_3_0_1 -│ │ │ │ -Z ×────────────× Z -│ │ │ │ -│ Z^U_1_0_1 Z^U_2_0_1 │ -│ │ │ │ -│ YXXY─────────#2^-1 │ -│ │ │ │ -YXXY──────#2^0.132 │ │ -│ │ │ │ -│ │ YXXY────────#2^-0.132 -│ │ │ │ -│ YXXY─────────#2^-1 │ -│ │ │ │ -""".strip() + cirq.testing.assert_has_diagram(circuit, """ +0 1 2 3 +│ │ │ │ +Rz(π) Rz(π) Rz(π) Rz(π) +│ │ │ │ +│ YXXY────────#2^-1 │ +│ │ │ │ +YXXY──────#2^0.081 │ │ +│ │ │ │ +Z^U_0_0 │ YXXY────────#2^-0.081 +│ │ │ │ +│ YXXY────────#2^-1 │ +│ │ │ │ +│ Z^U_1_0 │ Z^U_3_0 +│ │ │ │ +│ │ Z^U_2_0 │ +│ │ │ │ +│ YXXY────────#2^-1 │ +│ │ │ │ +YXXY──────#2^-0.051 │ │ +│ │ │ │ +│ │ YXXY────────#2^0.051 +│ │ │ │ +│ YXXY────────#2^-1 │ +│ │ │ │ +@─────────@^V_0_1_0_0 │ │ +│ │ │ │ +×─────────× @───────────@^V_2_3_0_0 +│ │ │ │ +│ │ ×───────────× +│ │ │ │ +│ @───────────@^V_0_3_0_0 │ +│ │ │ │ +│ ×───────────× │ +│ │ │ │ +@─────────@^V_1_3_0_0 @───────────@^V_0_2_0_0 +│ │ │ │ +×─────────× ×───────────× +│ │ │ │ +Z^U_3_0_0 @───────────@^V_1_2_0_0 Z^U_0_0_0 +│ │ │ │ +Rz(π) ×───────────× Rz(π) +│ │ │ │ +│ Z^U_2_0_0 Z^U_1_0_0 │ +│ │ │ │ +│ #2──────────YXXY^-1 │ +│ │ │ │ +│ │ #2──────────YXXY^0.132 +│ │ │ │ +#2────────YXXY^-0.132 │ Rz(π) +│ │ │ │ +│ #2──────────YXXY^-1 │ +│ │ │ │ +Rz(π) │ Rz(π) │ +│ │ │ │ +│ Rz(π) │ │ +│ │ │ │ +│ #2──────────YXXY^-1 │ +│ │ │ │ +│ │ #2──────────YXXY^0.081 +│ │ │ │ +#2────────YXXY^-0.081 │ Z^U_0_1 +│ │ │ │ +│ #2──────────YXXY^-1 │ +│ │ │ │ +Z^U_3_1 │ Z^U_1_1 │ +│ │ │ │ +│ Z^U_2_1 │ │ +│ │ │ │ +│ #2──────────YXXY^-1 │ +│ │ │ │ +│ │ #2──────────YXXY^-0.051 +│ │ │ │ +#2────────YXXY^0.051 │ │ +│ │ │ │ +│ #2──────────YXXY^-1 │ +│ │ │ │ +│ │ @───────────@^V_0_1_0_1 +│ │ │ │ +@─────────@^V_2_3_0_1 ×───────────× +│ │ │ │ +×─────────× │ │ +│ │ │ │ +│ @───────────@^V_0_3_0_1 │ +│ │ │ │ +│ ×───────────× │ +│ │ │ │ +@─────────@^V_0_2_0_1 @───────────@^V_1_3_0_1 +│ │ │ │ +×─────────× ×───────────× +│ │ │ │ +Z^U_0_0_1 @───────────@^V_1_2_0_1 Z^U_3_0_1 +│ │ │ │ +Rz(π) ×───────────× Rz(π) +│ │ │ │ +│ Z^U_1_0_1 Z^U_2_0_1 │ +│ │ │ │ +│ YXXY────────#2^-1 │ +│ │ │ │ +YXXY──────#2^0.132 │ │ +│ │ │ │ +│ │ YXXY────────#2^-0.132 +│ │ │ │ +│ YXXY────────#2^-1 │ +│ │ │ │ +""", transpose=True) def test_swap_network_trotter_ansatz_default_initial_params_length(): diff --git a/openfermioncirq/variational/ansatzes/split_operator_trotter_test.py b/openfermioncirq/variational/ansatzes/split_operator_trotter_test.py index 45f452b7..7965c487 100644 --- a/openfermioncirq/variational/ansatzes/split_operator_trotter_test.py +++ b/openfermioncirq/variational/ansatzes/split_operator_trotter_test.py @@ -70,119 +70,119 @@ def test_split_operator_trotter_ansatz_circuit(): include_all_z=True) circuit = complete_ansatz.circuit cirq.DropNegligible().optimize_circuit(circuit) - assert circuit.to_text_diagram(transpose=True).strip() == """ -0 1 2 3 4 -│ │ │ │ │ -│ │ │ YXXY─────────#2^0.5 -│ │ │ │ │ -│ │ YXXY────────#2^0.608 │ -│ │ │ │ │ -│ │ │ YXXY─────────#2^-0.5 -│ │ │ │ │ -│ YXXY────────#2^-0.0187 │ │ -│ │ │ │ │ -│ │ YXXY────────#2 │ -│ │ │ │ │ -YXXY────#2^-0.517 │ YXXY─────────#2 -│ │ │ │ │ -Z^-1 YXXY────────#2 │ │ -│ │ │ │ │ -Z^U_0_0 │ YXXY────────#2 │ -│ │ │ │ │ -Z Z^U_1_0 │ YXXY─────────#2^-0.423 -│ │ │ │ │ -│ │ Z^U_2_0 │ Z^-1 -│ │ │ │ │ -│ │ │ Z^U_3_0 Z^U_4_0 -│ │ │ │ │ -│ │ │ │ Z -│ │ │ │ │ -│ │ │ YXXY─────────#2^0.423 -│ │ │ │ │ -│ │ YXXY────────#2^-1 │ -│ │ │ │ │ -│ YXXY────────#2^-1 │ │ -│ │ │ │ │ -YXXY────#2^0.517 │ YXXY─────────#2^-1 -│ │ │ │ │ -│ │ YXXY────────#2^-1 │ -│ │ │ │ │ -│ YXXY────────#2^0.0187 │ │ -│ │ │ │ │ -@───────@^V_0_1_0 │ YXXY─────────#2^0.5 -│ │ │ │ │ -×───────× YXXY────────#2^-0.608 │ -│ │ │ │ │ -│ │ │ YXXY─────────#2^-0.5 -│ │ │ │ │ -│ │ @───────────@^V_2_3_0 │ -│ │ │ │ │ -│ │ ×───────────× │ -│ │ │ │ │ -│ @───────────@^V_0_3_0 @────────────@^V_2_4_0 -│ │ │ │ │ -│ ×───────────× ×────────────× -│ │ │ │ │ -@───────@^V_1_3_0 @───────────@^V_0_4_0 │ -│ │ │ │ │ -×───────× ×───────────× │ -│ │ │ │ │ -│ @───────────@^V_1_4_0 @────────────@^V_0_2_0 -│ │ │ │ │ -│ ×───────────× ×────────────× -│ │ │ │ │ -@───────@^V_3_4_0 @───────────@^V_1_2_0 │ -│ │ │ │ │ -×───────× ×───────────× │ -│ │ │ │ │ -#2──────YXXY^0.5 │ │ │ -│ │ │ │ │ -│ #2──────────YXXY^0.608 │ │ -│ │ │ │ │ -#2──────YXXY^-0.5 │ │ │ -│ │ │ │ │ -│ │ #2──────────YXXY^-0.0187 │ -│ │ │ │ │ -│ #2──────────YXXY │ │ -│ │ │ │ │ -#2──────YXXY │ #2───────────YXXY^-0.517 -│ │ │ │ │ -│ │ #2──────────YXXY Z^-1 -│ │ │ │ │ -│ #2──────────YXXY │ Z^U_0_0 -│ │ │ │ │ -#2──────YXXY^-0.423 │ Z^U_1_0 Z -│ │ │ │ │ -Z^-1 │ Z^U_2_0 │ │ -│ │ │ │ │ -Z^U_4_0 Z^U_3_0 │ │ │ -│ │ │ │ │ -Z │ │ │ │ -│ │ │ │ │ -#2──────YXXY^0.423 │ │ │ -│ │ │ │ │ -│ #2──────────YXXY^-1 │ │ -│ │ │ │ │ -│ │ #2──────────YXXY^-1 │ -│ │ │ │ │ -#2──────YXXY^-1 │ #2───────────YXXY^0.517 -│ │ │ │ │ -│ #2──────────YXXY^-1 │ │ -│ │ │ │ │ -│ │ #2──────────YXXY^0.0187 │ -│ │ │ │ │ -#2──────YXXY^0.5 │ │ │ -│ │ │ │ │ -│ #2──────────YXXY^-0.608 │ │ -│ │ │ │ │ -#2──────YXXY^-0.5 │ │ │ -│ │ │ │ │ -""".strip() + cirq.testing.assert_has_diagram(circuit, """ +0 1 2 3 4 +│ │ │ │ │ +│ │ │ YXXY────────#2^0.5 +│ │ │ │ │ +│ │ YXXY────────#2^0.608 │ +│ │ │ │ │ +│ │ │ YXXY────────#2^-0.5 +│ │ │ │ │ +│ YXXY────────#2^-0.019 │ │ +│ │ │ │ │ +│ │ YXXY────────#2 │ +│ │ │ │ │ +YXXY────#2^-0.517 │ YXXY────────#2 +│ │ │ │ │ +Rz(-π) YXXY────────#2 │ │ +│ │ │ │ │ +Z^U_0_0 │ YXXY────────#2 │ +│ │ │ │ │ +Rz(π) Z^U_1_0 │ YXXY────────#2^-0.423 +│ │ │ │ │ +│ │ Z^U_2_0 │ Rz(-π) +│ │ │ │ │ +│ │ │ Z^U_3_0 Z^U_4_0 +│ │ │ │ │ +│ │ │ │ Rz(π) +│ │ │ │ │ +│ │ │ YXXY────────#2^0.423 +│ │ │ │ │ +│ │ YXXY────────#2^-1 │ +│ │ │ │ │ +│ YXXY────────#2^-1 │ │ +│ │ │ │ │ +YXXY────#2^0.517 │ YXXY────────#2^-1 +│ │ │ │ │ +│ │ YXXY────────#2^-1 │ +│ │ │ │ │ +│ YXXY────────#2^0.019 │ │ +│ │ │ │ │ +@───────@^V_0_1_0 │ YXXY────────#2^0.5 +│ │ │ │ │ +×───────× YXXY────────#2^-0.608 │ +│ │ │ │ │ +│ │ │ YXXY────────#2^-0.5 +│ │ │ │ │ +│ │ @───────────@^V_2_3_0 │ +│ │ │ │ │ +│ │ ×───────────× │ +│ │ │ │ │ +│ @───────────@^V_0_3_0 @───────────@^V_2_4_0 +│ │ │ │ │ +│ ×───────────× ×───────────× +│ │ │ │ │ +@───────@^V_1_3_0 @───────────@^V_0_4_0 │ +│ │ │ │ │ +×───────× ×───────────× │ +│ │ │ │ │ +│ @───────────@^V_1_4_0 @───────────@^V_0_2_0 +│ │ │ │ │ +│ ×───────────× ×───────────× +│ │ │ │ │ +@───────@^V_3_4_0 @───────────@^V_1_2_0 │ +│ │ │ │ │ +×───────× ×───────────× │ +│ │ │ │ │ +#2──────YXXY^0.5 │ │ │ +│ │ │ │ │ +│ #2──────────YXXY^0.608 │ │ +│ │ │ │ │ +#2──────YXXY^-0.5 │ │ │ +│ │ │ │ │ +│ │ #2──────────YXXY^-0.019 │ +│ │ │ │ │ +│ #2──────────YXXY │ │ +│ │ │ │ │ +#2──────YXXY │ #2──────────YXXY^-0.517 +│ │ │ │ │ +│ │ #2──────────YXXY Rz(-π) +│ │ │ │ │ +│ #2──────────YXXY │ Z^U_0_0 +│ │ │ │ │ +#2──────YXXY^-0.423 │ Z^U_1_0 Rz(π) +│ │ │ │ │ +Rz(-π) │ Z^U_2_0 │ │ +│ │ │ │ │ +Z^U_4_0 Z^U_3_0 │ │ │ +│ │ │ │ │ +Rz(π) │ │ │ │ +│ │ │ │ │ +#2──────YXXY^0.423 │ │ │ +│ │ │ │ │ +│ #2──────────YXXY^-1 │ │ +│ │ │ │ │ +│ │ #2──────────YXXY^-1 │ +│ │ │ │ │ +#2──────YXXY^-1 │ #2──────────YXXY^0.517 +│ │ │ │ │ +│ #2──────────YXXY^-1 │ │ +│ │ │ │ │ +│ │ #2──────────YXXY^0.019 │ +│ │ │ │ │ +#2──────YXXY^0.5 │ │ │ +│ │ │ │ │ +│ #2──────────YXXY^-0.608 │ │ +│ │ │ │ │ +#2──────YXXY^-0.5 │ │ │ +│ │ │ │ │ +""", transpose=True) jellium_ansatz = SplitOperatorTrotterAnsatz(jellium_hamiltonian) circuit = jellium_ansatz.circuit cirq.DropNegligible().optimize_circuit(circuit) - assert circuit.to_text_diagram(transpose=True).strip() == """ + cirq.testing.assert_has_diagram(circuit, """ 0 1 2 3 │ │ │ │ │ │ YXXY────────#2^0.5 @@ -193,15 +193,15 @@ def test_split_operator_trotter_ansatz_circuit(): │ │ │ │ YXXY────#2^0.667 │ │ │ │ │ │ -Z^-1 YXXY────────#2 │ +Rz(-π) YXXY────────#2 │ │ │ │ │ -Z Z^-1 YXXY────────#2^-0.392 +Rz(π) Rz(-π) YXXY────────#2^-0.392 │ │ │ │ -│ Z^U_1_0 │ Z^-1 +│ Z^U_1_0 │ Rz(-π) │ │ │ │ -│ Z Z^U_2_0 Z^U_3_0 +│ Rz(π) Z^U_2_0 Z^U_3_0 │ │ │ │ -│ │ │ Z +│ │ │ Rz(π) │ │ │ │ │ │ YXXY────────#2^0.392 │ │ │ │ @@ -241,15 +241,15 @@ def test_split_operator_trotter_ansatz_circuit(): │ │ │ │ │ │ #2──────────YXXY^0.667 │ │ │ │ -│ #2──────────YXXY Z^-1 +│ #2──────────YXXY Rz(-π) │ │ │ │ -#2──────YXXY^-0.392 Z^-1 Z +#2──────YXXY^-0.392 Rz(-π) Rz(π) │ │ │ │ -Z^-1 │ Z^U_1_0 │ +Rz(-π) │ Z^U_1_0 │ │ │ │ │ -Z^U_3_0 Z^U_2_0 Z │ +Z^U_3_0 Z^U_2_0 Rz(π) │ │ │ │ │ -Z │ │ │ +Rz(π) │ │ │ │ │ │ │ #2──────YXXY^0.392 │ │ │ │ │ │ @@ -263,7 +263,7 @@ def test_split_operator_trotter_ansatz_circuit(): │ │ │ │ #2──────YXXY^-0.5 │ │ │ │ │ │ -""".strip() +""", transpose=True) def test_split_operator_trotter_ansatz_default_initial_params_length(): diff --git a/openfermioncirq/variational/ansatzes/swap_network_trotter_test.py b/openfermioncirq/variational/ansatzes/swap_network_trotter_test.py index 49e87b79..1b6fe58b 100644 --- a/openfermioncirq/variational/ansatzes/swap_network_trotter_test.py +++ b/openfermioncirq/variational/ansatzes/swap_network_trotter_test.py @@ -71,7 +71,7 @@ def test_swap_network_trotter_ansatz_circuit(): include_all_cz=True, include_all_z=True) circuit = complete_ansatz.circuit - assert circuit.to_text_diagram(transpose=True).strip() == """ + cirq.testing.assert_has_diagram(circuit, """ 0 1 2 3 │ │ │ │ XXYY────XXYY^T_0_1_0 XXYY─────────XXYY^T_2_3_0 @@ -140,11 +140,11 @@ def test_swap_network_trotter_ansatz_circuit(): │ │ │ │ ×ᶠ──────×ᶠ ×ᶠ───────────×ᶠ │ │ │ │ -""".strip() +""", transpose=True) hubbard_ansatz = SwapNetworkTrotterAnsatz(hubbard_hamiltonian, iterations=2) circuit = hubbard_ansatz.circuit - assert circuit.to_text_diagram(transpose=True).strip() == """ + cirq.testing.assert_has_diagram(circuit, """ 0 1 2 3 4 5 6 7 │ │ │ │ │ │ │ │ @────@^V_0_1_0 @────────────@^V_2_3_0 @──@^V_4_5_0 @────────────@^V_6_7_0 @@ -251,7 +251,7 @@ def test_swap_network_trotter_ansatz_circuit(): │ │ │ │ │ │ │ │ ×ᶠ───×ᶠ ×ᶠ───────────×ᶠ ×ᶠ─×ᶠ ×ᶠ───────────×ᶠ │ │ │ │ │ │ │ │ -""".strip() +""", transpose=True) def test_swap_network_trotter_ansatz_default_initial_params_length():