def assert_optimizes(before: cirq.Circuit, expected: cirq.Circuit, **kwargs): """Check that optimizing the circuit ``before`` produces the circuit ``expected``. The optimized circuit is cleaned up with follow up optimizations to make the comparison more robust to extra moments or extra gates nearly equal to identity that don't matter. Args: before: The input circuit to optimize. expected: The expected result of optimization to compare against. kwargs: Any extra arguments to pass to the ``MergeInteractionsToSqrtIswap`` constructor. """ actual = before.copy() opt = cirq.MergeInteractionsToSqrtIswap(**kwargs) opt.optimize_circuit(actual) # Ignore differences that would be caught by follow-up optimizations. followup_optimizations: List[Callable[[cirq.Circuit], None]] = [ cirq.merge_single_qubit_gates_into_phased_x_z, cirq.EjectPhasedPaulis().optimize_circuit, cirq.EjectZ().optimize_circuit, cirq.DropNegligible().optimize_circuit, cirq.DropEmptyMoments().optimize_circuit, ] for post in followup_optimizations: post(actual) post(expected) assert actual == expected, f'ACTUAL {actual} : EXPECTED {expected}'
def _get_common_cleanup_optimizers( tolerance: float) -> List[Callable[[cirq.Circuit], None]]: return [ cirq.EjectPhasedPaulis(tolerance=tolerance).optimize_circuit, cirq.EjectZ(tolerance=tolerance).optimize_circuit, cirq.DropNegligible(tolerance=tolerance).optimize_circuit, ]
def assert_optimizes(before: cirq.Circuit, expected: cirq.Circuit, compare_unitaries: bool = True): opt = cirq.EjectPhasedPaulis() circuit = before.copy() opt.optimize_circuit(circuit) # They should have equivalent effects. if compare_unitaries: cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent( circuit, expected, 1e-8) # And match the expected circuit. assert circuit == expected, ( "Circuit wasn't optimized as expected.\n" "INPUT:\n" "{}\n" "\n" "EXPECTED OUTPUT:\n" "{}\n" "\n" "ACTUAL OUTPUT:\n" "{}\n" "\n" "EXPECTED OUTPUT (detailed):\n" "{!r}\n" "\n" "ACTUAL OUTPUT (detailed):\n" "{!r}").format(before, expected, circuit, expected, circuit) # And it should be idempotent. opt.optimize_circuit(circuit) assert circuit == expected
def assert_optimizes( before: cirq.Circuit, expected: cirq.Circuit, compare_unitaries: bool = True, eject_parameterized: bool = False, ): with cirq.testing.assert_deprecated("Use cirq.eject_phased_paulis", deadline='v1.0'): opt = cirq.EjectPhasedPaulis(eject_parameterized=eject_parameterized) circuit = before.copy() expected = cirq.drop_empty_moments(expected) opt.optimize_circuit(circuit) # They should have equivalent effects. if compare_unitaries: if cirq.is_parameterized(circuit): for a in (0, 0.1, 0.5, -1.0, np.pi, np.pi / 2): params: cirq.ParamDictType = {'x': a, 'y': a / 2, 'z': -2 * a} (cirq.testing. assert_circuits_with_terminal_measurements_are_equivalent( cirq.resolve_parameters(circuit, params), cirq.resolve_parameters(expected, params), 1e-8, )) else: (cirq.testing. assert_circuits_with_terminal_measurements_are_equivalent( circuit, expected, 1e-8)) # And match the expected circuit. assert circuit == expected, ("Circuit wasn't optimized as expected.\n" "INPUT:\n" "{}\n" "\n" "EXPECTED OUTPUT:\n" "{}\n" "\n" "ACTUAL OUTPUT:\n" "{}\n" "\n" "EXPECTED OUTPUT (detailed):\n" "{!r}\n" "\n" "ACTUAL OUTPUT (detailed):\n" "{!r}").format(before, expected, circuit, expected, circuit) # And it should be idempotent. opt.optimize_circuit(circuit) assert circuit == expected
def optimize(c): cirq.ConvertToCzAndSingleGates().optimize_circuit(circuit=c) cirq.MergeSingleQubitGates().optimize_circuit(circuit=c) cirq.EjectZ().optimize_circuit(circuit=c) cirq.EjectPhasedPaulis().optimize_circuit(circuit=c) cirq.MergeSingleQubitGates().optimize_circuit(circuit=c) cirq.DropNegligible().optimize_circuit(circuit=c) cirq.DropEmptyMoments().optimize_circuit(circuit=c) c2=cirq.Circuit() for g in c: for g2 in g: # print(g2) c2.append(g2,strategy=cirq.InsertStrategy.EARLIEST) return c2
def assert_optimizes(before: cirq.Circuit, expected: cirq.Circuit): actual = cirq.Circuit(before) opt = cirq.MergeInteractions() opt.optimize_circuit(actual) # Ignore differences that would be caught by follow-up optimizations. followup_optimizations: List[Callable[[cirq.Circuit], None]] = [ cirq.merge_single_qubit_gates_into_phased_x_z, cirq.EjectPhasedPaulis().optimize_circuit, cirq.EjectZ().optimize_circuit, cirq.DropNegligible().optimize_circuit, cirq.DropEmptyMoments().optimize_circuit, ] for post in followup_optimizations: post(actual) post(expected) assert actual == expected, f'ACTUAL {actual} : EXPECTED {expected}'
def assert_optimizes(before: cirq.Circuit, expected: cirq.Circuit): actual = cirq.Circuit(before) opt = cirq.MergeInteractions() opt.optimize_circuit(actual) # Ignore differences that would be caught by follow-up optimizations. followup_optimizations = [ cg.MergeRotations(), cirq.EjectPhasedPaulis(), cirq.EjectZ(), cirq.DropNegligible(), cirq.DropEmptyMoments() ] for post in followup_optimizations: post.optimize_circuit(actual) post.optimize_circuit(expected) if actual != expected: # coverage: ignore print('ACTUAL') print(actual) print('EXPECTED') print(expected) assert actual == expected