def test_x_z_same_col(): a = cirq.NamedQubit('a') b = cirq.NamedQubit('b') circuit = cirq.Circuit.from_ops(cirq.X(a), cirq.Z(b)) assert circuit_to_quirk_url(circuit, escape_url=False) == """ http://algassert.com/quirk#circuit={"cols":[["X","Z"]]} """.strip() assert circuit_to_quirk_url(circuit) == ( 'http://algassert.com/quirk#circuit=' '%7B%22cols%22%3A%5B%5B%22X%22%2C%22Z%22%5D%5D%7D')
def test_x_z_same_col(): a = cirq.NamedQubit('a') b = cirq.NamedQubit('b') circuit = cirq.Circuit.from_ops(cirq.X(a), cirq.Z(b)) assert circuit_to_quirk_url(circuit, escape_url=False) == """ http://algassert.com/quirk#circuit={"cols":[["X","Z"]]} """.strip() assert circuit_to_quirk_url(circuit) == ( 'http://algassert.com/quirk#circuit=' '%7B%22cols%22%3A%5B%5B%22X%22%2C%22Z%22%5D%5D%7D')
def test_unknown_gate(): class UnknownGate(cirq.SingleQubitGate): pass a = cirq.NamedQubit('a') circuit = cirq.Circuit(UnknownGate()(a)) with pytest.raises(TypeError): _ = circuit_to_quirk_url(circuit) with pytest.raises(TypeError): _ = circuit_to_quirk_url(circuit, escape_url=False) assert_links_to(circuit, """ http://algassert.com/quirk#circuit={"cols":[["UNKNOWN"]]} """, prefer_unknown_gate_to_failure=True, escape_url=False)
def test_unknown_gate(): class UnknownGate(ops.Gate): pass a = cirq.NamedQubit('a') circuit = cirq.Circuit.from_ops(UnknownGate()(a)) with pytest.raises(TypeError): _ = circuit_to_quirk_url(circuit) with pytest.raises(TypeError): _ = circuit_to_quirk_url(circuit, escape_url=False) assert circuit_to_quirk_url(circuit, prefer_unknown_gate_to_failure=True, escape_url=False) == """ http://algassert.com/quirk#circuit={"cols":[["UNKNOWN"]]} """.strip()
def test_unknown_gate(): class UnknownGate(cirq.Gate): pass a = cirq.NamedQubit('a') circuit = cirq.Circuit.from_ops(UnknownGate()(a)) with pytest.raises(TypeError): _ = circuit_to_quirk_url(circuit) with pytest.raises(TypeError): _ = circuit_to_quirk_url(circuit, escape_url=False) assert circuit_to_quirk_url(circuit, prefer_unknown_gate_to_failure=True, escape_url=False) == """ http://algassert.com/quirk#circuit={"cols":[["UNKNOWN"]]} """.strip()
def test_various_unknown_gate_types(): a = cirq.NamedQubit('a') b = cirq.NamedQubit('b') circuit = cirq.Circuit.from_ops( cirq.X(a)**(1/5), cirq.Y(a)**(1/5), cirq.Z(a)**(1/5), cirq.CZ(a, b)**(1/5), cirq.google.ExpWGate(axis_half_turns=0.25)(a), cirq.google.ExpWGate(half_turns=1, axis_half_turns=cirq.Symbol('r'))(a) ) assert circuit_to_quirk_url(circuit, escape_url=False, prefer_unknown_gate_to_failure=True) == """ http://algassert.com/quirk#circuit={"cols":[ [{"id":"?", "matrix":"{{0.904508+0.293893i, 0.095492-0.293893i}, {0.095492-0.293893i, 0.904508+0.293893i}}"}], [{"id":"?", "matrix":"{{0.904508+0.293893i, 0.293893+0.095492i}, {-0.293893-0.095492i, 0.904508+0.293893i}}"}], [{"id":"?", "matrix":"{{1, 0}, {0, 0.809017+0.587785i}}"}], ["UNKNOWN", "UNKNOWN"], [{"id":"?", "matrix":"{{0, 0.707107+0.707107i}, {0.707107-0.707107i, 0}}"}], ["UNKNOWN"] ]} """.replace('\n', '').replace(' ', '')
def test_various_unknown_gate_types(): a = cirq.NamedQubit('a') b = cirq.NamedQubit('b') circuit = cirq.Circuit.from_ops( cirq.X(a)**(1/5), cirq.Y(a)**(1/5), cirq.Z(a)**(1/5), cirq.CZ(a, b)**(1/5), cirq.PhasedXPowGate(phase_exponent=0.25)(a), cirq.PhasedXPowGate(exponent=1, phase_exponent=cirq.Symbol('r'))(a), cirq.PhasedXPowGate(exponent=0.001, phase_exponent=0.1)(a) ) assert circuit_to_quirk_url(circuit, escape_url=False, prefer_unknown_gate_to_failure=True) == """ http://algassert.com/quirk#circuit={"cols":[ [{"id":"?", "matrix":"{{0.904508+0.293893i, 0.095492-0.293893i}, {0.095492-0.293893i, 0.904508+0.293893i}}"}], [{"id":"?", "matrix":"{{0.904508+0.293893i, 0.293893+0.095492i}, {-0.293893-0.095492i, 0.904508+0.293893i}}"}], [{"id":"?", "matrix":"{{1, 0}, {0, 0.809017+0.587785i}}"}], ["UNKNOWN", "UNKNOWN"], [{"id":"?", "matrix":"{{0, 0.707107+0.707107i}, {0.707107-0.707107i, 0}}"}], ["UNKNOWN"], [{"id":"?", "matrix":"{{0.999998+0.001571i,0.000488-0.001493i}, {-0.000483-0.001495i,0.999998+0.001571i}}"}] ]} """.replace('\n', '').replace(' ', '')
def test_various_unknown_gate_types(): a = cirq.NamedQubit('a') b = cirq.NamedQubit('b') circuit = cirq.Circuit.from_ops( cirq.X(a)**(1/5), cirq.Y(a)**(1/5), cirq.Z(a)**(1/5), cirq.CZ(a, b)**(1/5), cirq.google.ExpWGate(axis_half_turns=0.25)(a), cirq.google.ExpWGate(half_turns=1, axis_half_turns=cirq.Symbol('r'))(a) ) assert circuit_to_quirk_url(circuit, escape_url=False, prefer_unknown_gate_to_failure=True) == """ http://algassert.com/quirk#circuit={"cols":[ [{"id":"?", "matrix":"{{0.904508+0.293893i, 0.095492-0.293893i}, {0.095492-0.293893i, 0.904508+0.293893i}}"}], [{"id":"?", "matrix":"{{0.904508+0.293893i, 0.293893+0.095492i}, {-0.293893-0.095492i, 0.904508+0.293893i}}"}], [{"id":"?", "matrix":"{{1, 0}, {0, 0.809017+0.587785i}}"}], ["UNKNOWN", "UNKNOWN"], [{"id":"?", "matrix":"{{0, 0.707107+0.707107i}, {0.707107-0.707107i, 0}}"}], ["UNKNOWN"] ]} """.replace('\n', '').replace(' ', '')
def test_cz_cnot_split_cols(): a = cirq.NamedQubit('a') b = cirq.NamedQubit('b') c = cirq.NamedQubit('c') circuit = cirq.Circuit.from_ops(cirq.CNOT(a, b), cirq.CZ(b, c)) assert circuit_to_quirk_url(circuit, escape_url=False) == """ http://algassert.com/quirk#circuit={"cols":[["•","X"],[1,"•","Z"]]} """.strip()
def test_cz_cnot_split_cols(): a = cirq.NamedQubit('a') b = cirq.NamedQubit('b') c = cirq.NamedQubit('c') circuit = cirq.Circuit.from_ops(cirq.CNOT(a, b), cirq.CZ(b, c)) assert circuit_to_quirk_url(circuit, escape_url=False) == """ http://algassert.com/quirk#circuit={"cols":[["•","X"],[1,"•","Z"]]} """.strip()
def test_unrecognized_single_qubit_gate_with_matrix(): a = cirq.NamedQubit('a') circuit = cirq.Circuit.from_ops(cirq.X(a)**0.2731, ) assert circuit_to_quirk_url(circuit, escape_url=False) == """ http://algassert.com/quirk#circuit={"cols":[[{ "id":"?", "matrix":"{ {0.826988+0.378258i, 0.173012-0.378258i}, {0.173012-0.378258i, 0.826988+0.378258i} }"}]]} """.replace('\n', '').replace(' ', '')
def test_unrecognized_single_qubit_gate_with_matrix(): a = cirq.NamedQubit('a') circuit = cirq.Circuit.from_ops( cirq.X(a)**0.2731, ) assert circuit_to_quirk_url(circuit, escape_url=False) == """ http://algassert.com/quirk#circuit={"cols":[[{ "id":"?", "matrix":"{ {0.826988+0.378258i, 0.173012-0.378258i}, {0.173012-0.378258i, 0.826988+0.378258i} }"}]]} """.replace('\n', '').replace(' ', '')
def test_parameterized_gates(): a = cirq.LineQubit(0) s = sympy.Symbol('s') t = sympy.Symbol('t') assert_links_to( cirq.Circuit(cirq.X(a)**t), """ http://algassert.com/quirk#circuit={"cols":[ ["X^t"] ]} """, escape_url=False, ) assert_links_to( cirq.Circuit(cirq.Y(a)**t), """ http://algassert.com/quirk#circuit={"cols":[ ["Y^t"] ]} """, escape_url=False, ) assert_links_to( cirq.Circuit(cirq.Z(a)**t), """ http://algassert.com/quirk#circuit={"cols":[ ["Z^t"] ]} """, escape_url=False, ) assert_links_to( cirq.Circuit(cirq.Z(a)**(2 * t)), """ http://algassert.com/quirk#circuit={"cols":[ [{"arg":"2*t","id":"Z^ft"}] ]} """, escape_url=False, ) with pytest.raises(ValueError, match='Symbol other than "t"'): _ = circuit_to_quirk_url(cirq.Circuit(cirq.X(a)**s))
def test_various_unknown_gate_types(): a = cirq.NamedQubit('a') b = cirq.NamedQubit('b') circuit = cirq.Circuit.from_ops( MysteryOperation(b), cirq.SWAP(a, b)**0.5, cirq.H(a)**0.5, cirq.SingleQubitCliffordGate.X_sqrt.merged_with( cirq.SingleQubitCliffordGate.Z_sqrt).on(a), cirq.X(a)**(1/5), cirq.Y(a)**(1/5), cirq.Z(a)**(1/5), cirq.CZ(a, b)**(1/5), cirq.PhasedXPowGate(phase_exponent=0.25)(a), cirq.PhasedXPowGate(exponent=1, phase_exponent=cirq.Symbol('r'))(a), cirq.PhasedXPowGate(exponent=0.001, phase_exponent=0.1)(a) ) actual = circuit_to_quirk_url( circuit, escape_url=False, prefer_unknown_gate_to_failure=True) assert actual == """ http://algassert.com/quirk#circuit={"cols":[ [1,"UNKNOWN"], ["UNKNOWN", "UNKNOWN"], [{"id":"?","matrix":"{{0.853553+0.146447i,0.353553-0.353553i}, {0.353553-0.353553i,0.146447+0.853553i}}"}], [{"id":"?","matrix":"{{0.5+0.5i,0.5+0.5i},{0.5-0.5i,-0.5+0.5i}}"}], [{"id":"?", "matrix":"{{0.904508+0.293893i, 0.095492-0.293893i}, {0.095492-0.293893i, 0.904508+0.293893i}}"}], [{"id":"?", "matrix":"{{0.904508+0.293893i, 0.293893+0.095492i}, {-0.293893-0.095492i, 0.904508+0.293893i}}"}], [{"id":"?", "matrix":"{{1, 0}, {0, 0.809017+0.587785i}}"}], ["UNKNOWN", "UNKNOWN"], [{"id":"?", "matrix":"{{0, 0.707107+0.707107i}, {0.707107-0.707107i, 0}}"}], ["UNKNOWN"], [{"id":"?", "matrix":"{{0.999998+0.001571i,0.000488-0.001493i}, {-0.000483-0.001495i,0.999998+0.001571i}}"}] ]} """.replace('\n', '').replace(' ', ''), actual.replace('],[', '],\n[')
def test_formulaic_rotation_xyz_export(): a = cirq.LineQubit(0) t = sympy.Symbol('t') assert_links_to( cirq.Circuit( cirq.rx(sympy.pi / 2).on(a), cirq.ry(sympy.pi * t).on(a), cirq.rz(-sympy.pi * t).on(a) ), """ http://algassert.com/quirk#circuit={"cols":[ [{"arg":"(1/2)pi","id":"Rxft"}], [{"arg":"(t)pi","id":"Ryft"}], [{"arg":"(-t)pi","id":"Rzft"}] ]} """, escape_url=False, ) with pytest.raises(ValueError, match='unsupported'): _ = circuit_to_quirk_url(cirq.Circuit(cirq.rx(sympy.FallingFactorial(t, t)).on(a)))
def test_various_known_gate_types(): a = cirq.NamedQubit('a') b = cirq.NamedQubit('b') circuit = cirq.Circuit.from_ops( cirq.google.ExpWGate(axis_half_turns=0).on(a), cirq.google.ExpWGate(axis_half_turns=0.5).on(a), cirq.X(a), cirq.X(a)**0.25, cirq.X(a)**-0.5, cirq.Z(a), cirq.Z(a)**0.5, cirq.Y(a), cirq.Y(a)**-0.25, cirq.RotYGate(half_turns=cirq.Symbol('t')).on(a), cirq.H(a), cirq.measure(a), cirq.measure(a, b, key='not-relevant'), cirq.SWAP(a, b), cirq.CNOT(a, b), cirq.CNOT(b, a), cirq.CZ(a, b), ) assert circuit_to_quirk_url(circuit, escape_url=False) == """ http://algassert.com/quirk#circuit={"cols":[ ["X"], ["Y"], ["X"], ["X^¼"], ["X^-½"], ["Z"], ["Z^½"], ["Y"], ["Y^-¼"], ["Y^t"], ["H"], ["Measure"], ["Measure","Measure"], ["Swap","Swap"], ["•","X"], ["X","•"], ["•","Z"]]} """.replace('\n', '').replace(' ', '')
def test_various_known_gate_types(): a = cirq.NamedQubit('a') b = cirq.NamedQubit('b') circuit = cirq.Circuit.from_ops( cirq.google.ExpWGate(axis_half_turns=0).on(a), cirq.google.ExpWGate(axis_half_turns=0.5).on(a), cirq.X(a), cirq.X(a)**0.25, cirq.X(a)**-0.5, cirq.Z(a), cirq.Z(a)**0.5, cirq.Y(a), cirq.Y(a)**-0.25, cirq.RotYGate(half_turns=cirq.Symbol('t')).on(a), cirq.H(a), cirq.measure(a), cirq.measure(a, b, key='not-relevant'), cirq.SWAP(a, b), cirq.CNOT(a, b), cirq.CNOT(b, a), cirq.CZ(a, b), ) assert circuit_to_quirk_url(circuit, escape_url=False) == """ http://algassert.com/quirk#circuit={"cols":[ ["X"], ["Y"], ["X"], ["X^¼"], ["X^-½"], ["Z"], ["Z^½"], ["Y"], ["Y^-¼"], ["Y^t"], ["H"], ["Measure"], ["Measure","Measure"], ["Swap","Swap"], ["•","X"], ["X","•"], ["•","Z"]]} """.replace('\n', '').replace(' ', '')
def assert_links_to(circuit: cirq.Circuit, expected: str, **kwargs): actual = circuit_to_quirk_url(circuit, **kwargs) actual = actual.replace('\n', '').replace(' ', '').strip() expected = expected.replace('],[', '],\n[').strip() expected = expected.replace('\n', '').replace(' ', '') assert actual == expected