Skip to content

Commit

Permalink
merge remote changes
Browse files Browse the repository at this point in the history
  • Loading branch information
Asa-Kosto-QTM committed Jan 25, 2024
2 parents ea4de8c + 093858b commit e3b726e
Show file tree
Hide file tree
Showing 3 changed files with 176 additions and 179 deletions.
169 changes: 28 additions & 141 deletions tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,48 @@

# mypy: disable-error-code="misc"

import base64
import hashlib
import json
import logging
from pathlib import Path
from tempfile import NamedTemporaryFile

import pytest

from pytket.circuit import Bit, Circuit
from pytket.phir.api import pytket_to_phir, qasm_to_phir
from pytket.phir.qtm_machine import QtmMachine
from pytket.wasm.wasm import WasmFileHandler

from .test_utils import QasmFile, WatFile, get_qasm_as_circuit, get_wat_as_wasm_bytes
from .test_utils import QasmFile, get_qasm_as_circuit

logger = logging.getLogger(__name__)


class TestApi:
def test_pytket_to_phir_no_machine(self) -> None:
"""Test case when no machine is present."""
circuit = get_qasm_as_circuit(QasmFile.baby)
assert pytket_to_phir(circuit)

@pytest.mark.parametrize("test_file", list(QasmFile))
def test_pytket_to_phir_no_machine_all(self, test_file: QasmFile) -> None:
"""Test case when no machine is present."""
circuit = get_qasm_as_circuit(test_file)

match test_file:
case QasmFile.big_gate:
with pytest.raises(KeyError, match=r".*CnX.*"):
assert pytket_to_phir(circuit)
case QasmFile.qv20_0:
with pytest.raises(KeyError, match=r".*U3.*"):
assert pytket_to_phir(circuit)
case _:
assert pytket_to_phir(circuit)

@pytest.mark.parametrize("test_file", list(QasmFile))
def test_pytket_to_phir_h1_1_all(self, test_file: QasmFile) -> None:
"""Standard case."""
circuit = get_qasm_as_circuit(test_file)

assert pytket_to_phir(circuit, QtmMachine.H1_1)

def test_pytket_classical_only(self) -> None:
c = Circuit(1)
a = c.add_c_register("a", 2)
Expand Down Expand Up @@ -64,138 +86,3 @@ def test_qasm_to_phir(self) -> None:
"""

assert qasm_to_phir(qasm, QtmMachine.H1_1)

def test_qasm_to_phir_with_wasm(self) -> None:
"""Test the qasm string entrypoint works with WASM."""
qasm = """
OPENQASM 2.0;
include "qelib1.inc";
qreg q[2];
h q;
ZZ q[1],q[0];
creg cr[3];
creg cs[3];
creg co[3];
measure q[0]->cr[0];
measure q[1]->cr[1];
cs = cr;
co = add(cr, cs);
"""

wasm_bytes = get_wat_as_wasm_bytes(WatFile.add)

wasm_uid = hashlib.sha256(base64.b64encode(wasm_bytes)).hexdigest()

phir_str = qasm_to_phir(qasm, QtmMachine.H1_1, wasm_bytes=wasm_bytes)
phir = json.loads(phir_str)

expected_metadata = {"ff_object": (f"WASM module uid: {wasm_uid}")}

assert phir["ops"][21] == {
"metadata": expected_metadata,
"cop": "ffcall",
"function": "add",
"args": ["cr", "cs"],
"returns": ["co"],
}

def test_pytket_with_wasm(self) -> None:
wasm_bytes = get_wat_as_wasm_bytes(WatFile.testfile)
phir_str: str
try:
wasm_file = NamedTemporaryFile(suffix=".wasm", delete=False)
wasm_file.write(wasm_bytes)
wasm_file.flush()
wasm_file.close()

w = WasmFileHandler(wasm_file.name)

c = Circuit(6, 6)
c0 = c.add_c_register("c0", 3)
c1 = c.add_c_register("c1", 4)
c2 = c.add_c_register("c2", 5)

c.add_wasm_to_reg("multi", w, [c0, c1], [c2])
c.add_wasm_to_reg("add_one", w, [c2], [c2])
c.add_wasm_to_reg("no_return", w, [c2], [])
c.add_wasm_to_reg("no_parameters", w, [], [c2])

c.add_wasm_to_reg("add_one", w, [c0], [c0], condition=c1[0])

phir_str = pytket_to_phir(c, QtmMachine.H1_1)
finally:
Path.unlink(Path(wasm_file.name))

phir = json.loads(phir_str)

expected_metadata = {"ff_object": (f"WASM module uid: {w!s}")}

assert phir["ops"][4] == {
"metadata": expected_metadata,
"cop": "ffcall",
"function": "multi",
"args": ["c0", "c1"],
"returns": ["c2"],
}
assert phir["ops"][7] == {
"metadata": expected_metadata,
"cop": "ffcall",
"function": "add_one",
"args": ["c2"],
"returns": ["c2"],
}
assert phir["ops"][9] == {
"block": "if",
"condition": {"cop": "==", "args": [["c1", 0], 1]},
"true_branch": [
{
"metadata": expected_metadata,
"cop": "ffcall",
"returns": ["c0"],
"function": "add_one",
"args": ["c1", "c0"],
}
],
}
assert phir["ops"][12] == {
"metadata": expected_metadata,
"cop": "ffcall",
"function": "no_return",
"args": ["c2"],
}
assert phir["ops"][15] == {
"metadata": expected_metadata,
"cop": "ffcall",
"function": "no_parameters",
"args": [],
"returns": ["c2"],
}

def test_pytket_to_phir_no_machine(self) -> None:
"""Test case when no machine is present."""
circuit = get_qasm_as_circuit(QasmFile.baby)
assert pytket_to_phir(circuit)

@pytest.mark.parametrize("test_file", list(QasmFile))
def test_pytket_to_phir_no_machine_all(self, test_file: QasmFile) -> None:
"""Test case when no machine is present."""
circuit = get_qasm_as_circuit(test_file)

match test_file:
case QasmFile.big_gate:
with pytest.raises(KeyError, match=r".*CnX.*"):
assert pytket_to_phir(circuit)
case QasmFile.qv20_0:
with pytest.raises(KeyError, match=r".*U3.*"):
assert pytket_to_phir(circuit)
case _:
assert pytket_to_phir(circuit)

@pytest.mark.parametrize("test_file", list(QasmFile))
def test_pytket_to_phir_h1_1_all(self, test_file: QasmFile) -> None:
"""Standard case."""
circuit = get_qasm_as_circuit(test_file)

assert pytket_to_phir(circuit, QtmMachine.H1_1)
51 changes: 13 additions & 38 deletions tests/test_parallelization.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,41 +90,16 @@ def test_single_qubit_circuit_with_parallel() -> None:
# for example Ry gets converted to R1XY
# compare angles and args instead

assert phir_with_parallel_phirgen["ops"][3]["qop"] == "R1XY"
assert phir_with_parallel_phirgen["ops"][5]["qop"] == "RZ"
assert phir_with_parallel_phirgen["ops"][7]["qop"] == "R1XY"
assert phir_with_parallel_phirgen["ops"][11]["qop"] == "R1XY"
assert phir_with_parallel_phirgen["ops"][13]["qop"] == "RZ"
assert phir_with_parallel_phirgen["ops"][15]["qop"] == "R1XY"

assert phir_with_standard_phirgen["ops"][3]["qop"] == "RY"
assert phir_with_standard_phirgen["ops"][5]["qop"] == "RZ"
assert phir_with_standard_phirgen["ops"][7]["qop"] == "RY"
assert phir_with_standard_phirgen["ops"][11]["qop"] == "RY"
assert phir_with_standard_phirgen["ops"][13]["qop"] == "RZ"
assert phir_with_standard_phirgen["ops"][15]["qop"] == "RY"

assert (
phir_with_parallel_phirgen["ops"][3]["args"]
== phir_with_standard_phirgen["ops"][3]["args"]
)
assert (
phir_with_parallel_phirgen["ops"][5]["args"]
== phir_with_standard_phirgen["ops"][5]["args"]
)
assert (
phir_with_parallel_phirgen["ops"][7]["args"]
== phir_with_standard_phirgen["ops"][7]["args"]
)
assert (
phir_with_parallel_phirgen["ops"][11]["args"]
== phir_with_standard_phirgen["ops"][11]["args"]
)
assert (
phir_with_parallel_phirgen["ops"][13]["args"]
== phir_with_standard_phirgen["ops"][13]["args"]
)
assert (
phir_with_parallel_phirgen["ops"][15]["args"]
== phir_with_standard_phirgen["ops"][15]["args"]
)
ops = (3, 5, 7, 11, 13, 15)

for i, qop in zip(ops, ("R1XY", "RZ", "R1XY", "R1XY", "RZ", "R1XY"), strict=True):
assert phir_with_parallel_phirgen["ops"][i]["qop"] == qop

for i, qop in zip(ops, ("RY", "RZ", "RY", "RY", "RZ", "RY"), strict=True):
assert phir_with_standard_phirgen["ops"][i]["qop"] == qop

for i in ops:
assert (
phir_with_parallel_phirgen["ops"][i]["args"]
== phir_with_standard_phirgen["ops"][i]["args"]
)
135 changes: 135 additions & 0 deletions tests/test_wasm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
##############################################################################
#
# Copyright (c) 2024 Quantinuum LLC All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
#
##############################################################################

# mypy: disable-error-code="misc"

import base64
import hashlib
import json
import logging
from pathlib import Path
from tempfile import NamedTemporaryFile

from pytket.circuit import Circuit
from pytket.phir.api import pytket_to_phir, qasm_to_phir
from pytket.phir.qtm_machine import QtmMachine
from pytket.wasm.wasm import WasmFileHandler

from .test_utils import WatFile, get_wat_as_wasm_bytes

logger = logging.getLogger(__name__)


class TestWASM:
def test_qasm_to_phir_with_wasm(self) -> None:
"""Test the qasm string entrypoint works with WASM."""
qasm = """
OPENQASM 2.0;
include "qelib1.inc";
qreg q[2];
h q;
ZZ q[1],q[0];
creg cr[3];
creg cs[3];
creg co[3];
measure q[0]->cr[0];
measure q[1]->cr[1];
cs = cr;
co = add(cr, cs);
"""

wasm_bytes = get_wat_as_wasm_bytes(WatFile.add)

wasm_uid = hashlib.sha256(base64.b64encode(wasm_bytes)).hexdigest()

phir_str = qasm_to_phir(qasm, QtmMachine.H1_1, wasm_bytes=wasm_bytes)
phir = json.loads(phir_str)

expected_metadata = {"ff_object": (f"WASM module uid: {wasm_uid}")}

assert phir["ops"][21] == {
"metadata": expected_metadata,
"cop": "ffcall",
"function": "add",
"args": ["cr", "cs"],
"returns": ["co"],
}

def test_pytket_with_wasm(self) -> None:
wasm_bytes = get_wat_as_wasm_bytes(WatFile.testfile)
phir_str: str
try:
wasm_file = NamedTemporaryFile(suffix=".wasm", delete=False)
wasm_file.write(wasm_bytes)
wasm_file.flush()
wasm_file.close()

w = WasmFileHandler(wasm_file.name)

c = Circuit(6, 6)
c0 = c.add_c_register("c0", 3)
c1 = c.add_c_register("c1", 4)
c2 = c.add_c_register("c2", 5)

c.add_wasm_to_reg("multi", w, [c0, c1], [c2])
c.add_wasm_to_reg("add_one", w, [c2], [c2])
c.add_wasm_to_reg("no_return", w, [c2], [])
c.add_wasm_to_reg("no_parameters", w, [], [c2])

c.add_wasm_to_reg("add_one", w, [c0], [c0], condition=c1[0])

phir_str = pytket_to_phir(c, QtmMachine.H1_1)
finally:
Path.unlink(Path(wasm_file.name))

phir = json.loads(phir_str)

expected_metadata = {"ff_object": (f"WASM module uid: {w!s}")}

assert phir["ops"][4] == {
"metadata": expected_metadata,
"cop": "ffcall",
"function": "multi",
"args": ["c0", "c1"],
"returns": ["c2"],
}
assert phir["ops"][7] == {
"metadata": expected_metadata,
"cop": "ffcall",
"function": "add_one",
"args": ["c2"],
"returns": ["c2"],
}
assert phir["ops"][9] == {
"block": "if",
"condition": {"cop": "==", "args": [["c1", 0], 1]},
"true_branch": [
{
"metadata": expected_metadata,
"cop": "ffcall",
"returns": ["c0"],
"function": "add_one",
"args": ["c1", "c0"],
}
],
}
assert phir["ops"][12] == {
"metadata": expected_metadata,
"cop": "ffcall",
"function": "no_return",
"args": ["c2"],
}
assert phir["ops"][15] == {
"metadata": expected_metadata,
"cop": "ffcall",
"function": "no_parameters",
"args": [],
"returns": ["c2"],
}

0 comments on commit e3b726e

Please sign in to comment.