Exemplo n.º 1
0
def assert_consistent_resolve_parameters(val: Any):
    names = cirq.parameter_names(val)
    symbols = cirq.parameter_symbols(val)

    assert {symbol.name for symbol in symbols} == names

    if not cirq.is_parameterized(val):
        assert not names
        assert not symbols
    else:
        # Try to resolve all parameters with numbers. This may fail if some of
        # the parameters want different types. But if resolution succeeds, the
        # object should report that it has no more parameters to resolve.
        try:
            resolved = cirq.resolve_parameters(val, {name: 0 for name in names})
        except Exception:
            pass
        else:
            assert not cirq.parameter_names(resolved)
            assert not cirq.parameter_symbols(resolved)

        # Try single-step resolution of parameters to names that map to zero.
        # All names should be preserved.
        param_dict: cirq.ParamDictType = {
            name: sympy.Symbol(name + '_CONSISTENCY_TEST') for name in names
        }
        param_dict.update({sympy.Symbol(name + '_CONSISTENCY_TEST'): 0 for name in names})
        resolver = cirq.ParamResolver(param_dict)  # type:ignore
        resolved = cirq.resolve_parameters_once(val, resolver)
        assert cirq.parameter_names(resolved) == set(name + '_CONSISTENCY_TEST' for name in names)
Exemplo n.º 2
0
def _ref_simulate_2q_xeb_circuit(task: Dict[str, Any]):
    """Helper function for simulating a given (circuit, cycle_depth)."""
    circuit_i = task['circuit_i']
    cycle_depth = task['cycle_depth']
    circuit = task['circuit']
    param_resolver = task['param_resolver']

    circuit_depth = cycle_depth * 2 + 1
    assert circuit_depth <= len(circuit)
    tcircuit = circuit[:circuit_depth]
    tcircuit = cirq.resolve_parameters_once(tcircuit, param_resolver=param_resolver)

    pure_sim = cirq.Simulator()
    psi = pure_sim.simulate(tcircuit)
    psi = psi.final_state_vector
    pure_probs = cirq.state_vector_to_probabilities(psi)

    return {'circuit_i': circuit_i, 'cycle_depth': cycle_depth, 'pure_probs': pure_probs}
Exemplo n.º 3
0
def test_recursive_resolve():
    a, b, c = [sympy.Symbol(l) for l in 'abc']
    resolver = cirq.ParamResolver({a: b + 3, b: c + 2, c: 1})
    assert cirq.resolve_parameters_once(a, resolver) == b + 3
    assert cirq.resolve_parameters(a, resolver) == 6
    assert cirq.resolve_parameters_once(b, resolver) == c + 2
    assert cirq.resolve_parameters(b, resolver) == 3
    assert cirq.resolve_parameters_once(c, resolver) == 1
    assert cirq.resolve_parameters(c, resolver) == 1

    assert cirq.resolve_parameters_once([a, b], {a: b, b: c}) == [b, c]
    assert cirq.resolve_parameters_once(a, {}) == a

    resolver = cirq.ParamResolver({a: b, b: a})
    assert cirq.resolve_parameters_once(a, resolver) == b
    with pytest.raises(RecursionError):
        _ = cirq.resolve_parameters(a, resolver)
Exemplo n.º 4
0
def test_protocols():
    t = sympy.Symbol('t')
    p = cirq.WaitGate(cirq.Duration(millis=5 * t))
    c = cirq.WaitGate(cirq.Duration(millis=2))
    q = cirq.LineQubit(0)

    cirq.testing.assert_implements_consistent_protocols(cirq.wait(q, nanos=0))
    cirq.testing.assert_implements_consistent_protocols(c.on(q))
    cirq.testing.assert_implements_consistent_protocols(p.on(q))

    assert cirq.has_unitary(p)
    assert cirq.has_unitary(c)
    assert cirq.is_parameterized(p)
    assert not cirq.is_parameterized(c)
    assert cirq.resolve_parameters(p, {'t': 2}) == cirq.WaitGate(cirq.Duration(millis=10))
    assert cirq.resolve_parameters(c, {'t': 2}) == c
    assert cirq.resolve_parameters_once(c, {'t': 2}) == c
    assert cirq.trace_distance_bound(p) == 0
    assert cirq.trace_distance_bound(c) == 0
    assert cirq.inverse(c) == c
    assert cirq.inverse(p) == p
    assert cirq.decompose(c.on(q)) == []
    assert cirq.decompose(p.on(q)) == []
Exemplo n.º 5
0
def test_tagged_operation_forwards_protocols():
    """The results of all protocols applied to an operation with a tag should
    be equivalent to the result without tags.
    """
    q1 = cirq.GridQubit(1, 1)
    q2 = cirq.GridQubit(1, 2)
    h = cirq.H(q1)
    tag = 'tag1'
    tagged_h = cirq.H(q1).with_tags(tag)

    np.testing.assert_equal(cirq.unitary(tagged_h), cirq.unitary(h))
    assert cirq.has_unitary(tagged_h)
    assert cirq.decompose(tagged_h) == cirq.decompose(h)
    assert cirq.pauli_expansion(tagged_h) == cirq.pauli_expansion(h)
    assert cirq.equal_up_to_global_phase(h, tagged_h)
    assert np.isclose(cirq.channel(h), cirq.channel(tagged_h)).all()

    assert cirq.measurement_key(cirq.measure(q1, key='blah').with_tags(tag)) == 'blah'

    parameterized_op = cirq.XPowGate(exponent=sympy.Symbol('t'))(q1).with_tags(tag)
    assert cirq.is_parameterized(parameterized_op)
    resolver = cirq.study.ParamResolver({'t': 0.25})
    assert cirq.resolve_parameters(parameterized_op, resolver) == cirq.XPowGate(exponent=0.25)(
        q1
    ).with_tags(tag)
    assert cirq.resolve_parameters_once(parameterized_op, resolver) == cirq.XPowGate(exponent=0.25)(
        q1
    ).with_tags(tag)

    y = cirq.Y(q1)
    tagged_y = cirq.Y(q1).with_tags(tag)
    assert tagged_y ** 0.5 == cirq.YPowGate(exponent=0.5)(q1)
    assert tagged_y * 2 == (y * 2)
    assert 3 * tagged_y == (3 * y)
    assert cirq.phase_by(y, 0.125, 0) == cirq.phase_by(tagged_y, 0.125, 0)
    controlled_y = tagged_y.controlled_by(q2)
    assert controlled_y.qubits == (
        q2,
        q1,
    )
    assert isinstance(controlled_y, cirq.Operation)
    assert not isinstance(controlled_y, cirq.TaggedOperation)

    clifford_x = cirq.SingleQubitCliffordGate.X(q1)
    tagged_x = cirq.SingleQubitCliffordGate.X(q1).with_tags(tag)
    assert cirq.commutes(clifford_x, clifford_x)
    assert cirq.commutes(tagged_x, clifford_x)
    assert cirq.commutes(clifford_x, tagged_x)
    assert cirq.commutes(tagged_x, tagged_x)

    assert cirq.trace_distance_bound(y ** 0.001) == cirq.trace_distance_bound(
        (y ** 0.001).with_tags(tag)
    )

    flip = cirq.bit_flip(0.5)(q1)
    tagged_flip = cirq.bit_flip(0.5)(q1).with_tags(tag)
    assert cirq.has_mixture(tagged_flip)
    assert cirq.has_channel(tagged_flip)

    flip_mixture = cirq.mixture(flip)
    tagged_mixture = cirq.mixture(tagged_flip)
    assert len(tagged_mixture) == 2
    assert len(tagged_mixture[0]) == 2
    assert len(tagged_mixture[1]) == 2
    assert tagged_mixture[0][0] == flip_mixture[0][0]
    assert np.isclose(tagged_mixture[0][1], flip_mixture[0][1]).all()
    assert tagged_mixture[1][0] == flip_mixture[1][0]
    assert np.isclose(tagged_mixture[1][1], flip_mixture[1][1]).all()

    qubit_map = {q1: 'q1'}
    qasm_args = cirq.QasmArgs(qubit_id_map=qubit_map)
    assert cirq.qasm(h, args=qasm_args) == cirq.qasm(tagged_h, args=qasm_args)

    cirq.testing.assert_has_consistent_apply_unitary(tagged_h)