def test_flattener_value_of(): flattener = flatten_expressions._ParamFlattener({'c': 5, 'x1': 'x1'}) assert flattener.value_of(9) == 9 assert flattener.value_of('c') == 5 assert flattener.value_of(sympy.Symbol('c')) == 5 # Twice assert (flattener.value_of(sympy.Symbol('c') / 2 + 1) == sympy.Symbol('<c/2 + 1>')) assert (flattener.value_of(sympy.Symbol('c') / 2 + 1) == sympy.Symbol('<c/2 + 1>')) # Collisions between the string representation of different expressions # This tests the unusual case where str(expr1) == str(expr2) doesn't imply # expr1 == expr2. In this case it would be incorrect to flatten to the same # symbol because the two expression will evaluate to different values. # Also tests that '_#' is appended when avoiding collisions. assert (flattener.value_of( sympy.Symbol('c') / sympy.Symbol('2 + 1')) == sympy.Symbol('<c/2 + 1>_1')) assert (flattener.value_of(sympy.Symbol('c/2') + 1) == sympy.Symbol('<c/2 + 1>_2')) assert (cirq.flatten([sympy.Symbol('c') / 2 + 1, sympy.Symbol('c/2') + 1])[0] == [ sympy.Symbol('<c/2 + 1>'), sympy.Symbol('<c/2 + 1>_1') ])
def test_flatten_circuit(): qubit = cirq.LineQubit(0) a = sympy.Symbol('a') circuit = cirq.Circuit(cirq.X(qubit)**a, cirq.X(qubit)**(1 + a / 2)) c_flat, expr_map = cirq.flatten(circuit) c_expected = cirq.Circuit( cirq.X(qubit)**a, cirq.X(qubit)**sympy.Symbol('<a/2 + 1>')) assert c_flat == c_expected assert isinstance(expr_map, cirq.ExpressionMap) assert expr_map == {a: a, 1 + a / 2: sympy.Symbol('<a/2 + 1>')}