Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 16 additions & 10 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from graphix.random_objects import rand_circuit
from graphix.sim.statevec import StatevectorBackend
from graphix.states import BasicStates
from graphix.transpiler import transpile_swaps
from numpy.random import Generator
from stim import PauliString
from typing_extensions import override
Expand All @@ -21,9 +22,10 @@ def test_standardize(self, fx_rng: Generator) -> None:
"""
nqubits = 2
depth = 2
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit
pattern = circuit.transpile().pattern
pattern.standardize()
pattern.minimize_space()

states = [BasicStates.PLUS for _ in pattern.input_nodes]

Expand All @@ -39,7 +41,7 @@ def test_minimize_space(self, fx_rng: Generator) -> None:
"""
nqubits = 3
depth = 5
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit
pattern = circuit.transpile().pattern
pattern.minimize_space()

Expand All @@ -56,7 +58,7 @@ def test_client_input(self, fx_rng: Generator) -> None:
# Generate random pattern
nqubits = 2
depth = 1
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit
pattern = circuit.transpile().pattern
pattern.standardize()

Expand All @@ -79,6 +81,7 @@ def test_r_secret_simulation(self, fx_rng: Generator) -> None:
for _i in range(10):
circuit = rand_circuit(nqubits, depth, fx_rng)
pattern = circuit.transpile().pattern
pattern = pattern.infer_pauli_measurements()
pattern.standardize()

state = circuit.simulate_statevector().statevec
Expand All @@ -100,6 +103,7 @@ def test_theta_secret_simulation(self, fx_rng: Generator) -> None:
for _i in range(10):
circuit = rand_circuit(nqubits, depth, fx_rng)
pattern = circuit.transpile().pattern
pattern = pattern.infer_pauli_measurements()
pattern.standardize()

secrets = Secrets(theta=True)
Expand Down Expand Up @@ -129,6 +133,7 @@ def test_a_secret_simulation(self, fx_rng: Generator) -> None:
for _ in range(10):
circuit = rand_circuit(nqubits, depth, fx_rng)
pattern = circuit.transpile().pattern
pattern = pattern.infer_pauli_measurements()
pattern.standardize()

secrets = Secrets(a=True)
Expand All @@ -154,7 +159,7 @@ def test_r_secret_results(self, fx_rng: Generator) -> None:
# Generate and standardize pattern
nqubits = 2
depth = 1
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit
pattern = circuit.transpile().pattern
pattern.standardize()
server_results = dict()
Expand Down Expand Up @@ -183,7 +188,7 @@ def store_measurement_outcome(self, node: int, result: Outcome) -> None:
def test_qubits_preparation(self, fx_rng: Generator) -> None:
nqubits = 2
depth = 1
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit
pattern = circuit.transpile().pattern
pattern.standardize()
secrets = Secrets(a=True, r=True, theta=True)
Expand All @@ -205,11 +210,10 @@ def test_UBQC(self, fx_rng: Generator) -> None:
# TODO : work on optimization of the quantum communication
depth = 15
for _ in range(10):
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit
pattern = circuit.transpile().pattern
# pattern.minimize_space()
# pattern.standardize(method="global")

secrets = Secrets(a=True, r=True, theta=True)

# Create a |+> state for each input node, and associate index
Expand All @@ -234,8 +238,9 @@ def test_UBQC(self, fx_rng: Generator) -> None:
def test_delegate_pattern(self, fx_rng: Generator) -> None:
nqubits = 5
depth = 10
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit
pattern = circuit.transpile().pattern
pattern.minimize_space()

client = Client(pattern=pattern, rng=fx_rng)

Expand All @@ -251,12 +256,13 @@ def test_graph_clifford_structure(self, fx_rng: Generator) -> None:
circuit = rand_circuit(nqubits, depth, fx_rng)
pattern = circuit.transpile().pattern
client = Client(pattern=pattern, rng=fx_rng)
n = len(client.clifford_structure)
for node in client.graph.nodes:
x_string = PauliString(["X" if i == node else "I" for i in client.graph.nodes])
x_string = PauliString(["X" if i == node else "I" for i in range(n)])
conjugated_string = client.clifford_structure.inverse()(x_string)
neighbors = set(client.graph.neighbors(node))
expected_conjugated_string = PauliString(
["X" if i == node else "Z" if i in neighbors else "I" for i in client.graph.nodes]
["X" if i == node else "Z" if i in neighbors else "I" for i in range(n)]
)
assert conjugated_string == expected_conjugated_string

Expand Down
16 changes: 11 additions & 5 deletions tests/test_protocols.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import pytest
from graphix.random_objects import rand_circuit
from graphix.sim.statevec import StatevectorBackend
from graphix.transpiler import transpile_swaps
from graphix_qasm_parser import OpenQASMParser

from veriphix.blinding import Secrets
Expand All @@ -30,8 +31,9 @@ def test_noiseless_all_protocols(
) -> None:
nqubits = 3
depth = 5
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit
pattern = circuit.transpile().pattern
pattern.minimize_space()

protocol = protocol_class()
client = Client(pattern=pattern, protocol=protocol, rng=fx_rng)
Expand All @@ -49,7 +51,7 @@ def test_FK(self, fx_rng: np.random.Generator, manual: bool) -> None:
parser = OpenQASMParser()

def load_pattern_from_circuit(circuit_label: str) -> Pattern:
circuit = parser.parse_file(Path("tests/test_circuits") / circuit_label)
circuit = transpile_swaps(parser.parse_file(Path("tests/test_circuits") / circuit_label)).circuit
pattern = circuit.transpile().pattern
pattern.minimize_space()
return pattern
Expand All @@ -71,10 +73,11 @@ def test_create_test_run_manual_fail(self, fx_rng: Generator) -> None:
# generate random circuit
nqubits = 2
depth = 1
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit
# transpile to pattern
pattern = circuit.transpile().pattern
pattern.standardize()
pattern.minimize_space()

# initialise client
protocol = FK12(manual_colouring=(set([0]), set()))
Expand All @@ -90,10 +93,12 @@ def test_create_test_run_manual_fail_improper(self, fx_rng: Generator) -> None:
# generate random circuit
nqubits = 2
depth = 1
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit

# transpile to pattern
pattern = circuit.transpile().pattern
pattern.standardize()
pattern.minimize_space()

nodes = pattern.extract_nodes()

Expand All @@ -111,8 +116,9 @@ def test_random_traps(self, fx_rng: np.random.Generator) -> None:
"""
nqubits = 3
depth = 5
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit
pattern = circuit.transpile().pattern
pattern.minimize_space()

secrets = Secrets(r=True, a=True, theta=True)
protocol = RandomTraps()
Expand Down
21 changes: 15 additions & 6 deletions tests/test_vbqc.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from graphix.sim.density_matrix import DensityMatrixBackend
from graphix.sim.statevec import StatevectorBackend
from graphix.states import BasicStates
from graphix.transpiler import transpile_swaps
from graphix_qasm_parser import OpenQASMParser

from veriphix.blinding import Secrets
Expand All @@ -25,7 +26,7 @@

def load_pattern_from_circuit(circuit_label: str) -> Pattern:
parser = OpenQASMParser()
circuit = parser.parse_file(Path("tests/test_circuits") / circuit_label)
circuit = transpile_swaps(parser.parse_file(Path("tests/test_circuits") / circuit_label)).circuit
pattern = circuit.transpile().pattern
pattern.minimize_space()
return pattern
Expand All @@ -36,8 +37,9 @@ class TestVBQC:
def test_trap_delegated(self, fx_rng: np.random.Generator, blind: bool) -> None:
nqubits = 3
depth = 5
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit
pattern = circuit.transpile().pattern
pattern.minimize_space()

secrets = Secrets(r=blind, a=blind, theta=blind)
client = Client(pattern=pattern, secrets=secrets, rng=fx_rng)
Expand All @@ -49,8 +51,9 @@ def test_trap_delegated(self, fx_rng: np.random.Generator, blind: bool) -> None:
def test_sample_canvas(self, fx_rng: Generator) -> None:
nqubits = 3
depth = 5
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit
pattern = circuit.transpile().pattern
pattern.minimize_space()

client = Client(pattern=pattern, rng=fx_rng)

Expand All @@ -60,8 +63,9 @@ def test_sample_canvas(self, fx_rng: Generator) -> None:
def test_delegate_canvas(self, fx_rng: Generator) -> None:
nqubits = 3
depth = 5
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit
pattern = circuit.transpile().pattern
pattern.minimize_space()

svbackend = StatevectorBackend()
simulated_pattern_output = pattern.simulate_pattern(backend=svbackend, rng=fx_rng)
Expand Down Expand Up @@ -96,8 +100,9 @@ def test_delegate_canvas(self, fx_rng: Generator) -> None:
def test_analyze_outcomes(self, fx_rng: Generator, blind: bool) -> None:
nqubits = 3
depth = 3
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit
pattern = circuit.transpile().pattern
pattern.minimize_space()

secrets = Secrets(r=blind, a=blind, theta=blind)

Expand All @@ -118,6 +123,8 @@ def test_BQP_circuit(self, fx_rng: Generator, blind: bool) -> None:
circuits = [name for name, prob in table.items()]
for circuit_label in circuits:
pattern = load_pattern_from_circuit(circuit_label=circuit_label)
pattern.standardize()
pattern.minimize_space()

secrets = Secrets(r=blind, a=blind, theta=blind)

Expand All @@ -136,6 +143,7 @@ def test_noiseless(self, fx_rng: Generator, blind: bool) -> None:
nqubits = 3
depth = 3
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(circuit).circuit
pattern = circuit.transpile().pattern

states = [BasicStates.PLUS for _ in pattern.input_nodes]
Expand All @@ -159,8 +167,9 @@ def test_noiseless(self, fx_rng: Generator, blind: bool) -> None:
def test_noisy(self, fx_rng: Generator) -> None:
nqubits = 3
depth = 3
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit
pattern = circuit.transpile().pattern
pattern.minimize_space()

states = [BasicStates.PLUS for _ in pattern.input_nodes]

Expand Down
4 changes: 3 additions & 1 deletion tests/test_verifying.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import numpy as np
from graphix.random_objects import rand_circuit
from graphix.sim.statevec import StatevectorBackend
from graphix.transpiler import transpile_swaps

from veriphix.client import Client
from veriphix.verifying import TestRun
Expand All @@ -10,8 +11,9 @@ class TestVerifying:
def test_delegate_test(self, fx_rng: np.random.Generator) -> None:
nqubits = 3
depth = 5
circuit = rand_circuit(nqubits, depth, fx_rng)
circuit = transpile_swaps(rand_circuit(nqubits, depth, fx_rng)).circuit
pattern = circuit.transpile().pattern
pattern.minimize_space()

client = Client(pattern=pattern, rng=fx_rng)

Expand Down
1 change: 1 addition & 0 deletions veriphix/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ def remove_flow(pattern: Pattern) -> Pattern:
# pattern types will become more precise in the near future.
# See https://github.com/TeamGraphix/graphix/issues/266
clean_pattern.add(cast("Command", new_cmd))
clean_pattern.reorder_output_nodes(pattern.output_nodes)
return clean_pattern


Expand Down