-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Use Boolean Hamiltonian Gate for QAOA #3989
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Closed
Closed
Changes from 14 commits
Commits
Show all changes
190 commits
Select commit
Hold shift + click to select a range
914f3d5
Hamiltonian representation of binary functions
tonybruguier a0c19ef
Allow for multiple expressions
tonybruguier 9192792
De-dupe names
tonybruguier 739734b
Add to existing circuit
tonybruguier 579dc33
Add to existing circuit
tonybruguier b89192a
Merge branch 'hamiltonian' of github.com:tonybruguier/Cirq into hamil…
tonybruguier 78d3969
fix coverage and formatting
tonybruguier 499083e
add missing file
tonybruguier 5251a78
Modify QAOA
tonybruguier 715a7dd
Attempt to fix unit test
tonybruguier 70ac1df
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier b812040
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 34a1d08
Sort indices
tonybruguier db6a261
More comments
tonybruguier 99f33b2
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 3bf90e6
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier f2fa497
Address comments
tonybruguier 0e1980f
Make float for weights
tonybruguier e7c99ec
Attempt to mypy fix
tonybruguier d8ede30
Faster exec
tonybruguier 078f91a
Better test coverage
tonybruguier 4954bc4
nit add missing \n
tonybruguier ae20cdf
Address more comments
tonybruguier f757a77
mypy attempt at fixing
tonybruguier 05d8972
Not a default dict
tonybruguier 8cd10df
mypy
tonybruguier 48d3ba4
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 4cadd86
Address comments
tonybruguier 71e4316
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier bb59cb9
Address comments
tonybruguier c1ce450
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier a36f8bb
more unit tests
tonybruguier a2641fc
Even more tests
tonybruguier 42ecdd3
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 9d6fbae
Add an alternate way of building the CNOTs
tonybruguier 9b64e6c
mypy
tonybruguier 007eb2e
lint
tonybruguier d9fc1b6
Add some simplification
tonybruguier abce039
Re-add missing coverage
tonybruguier 5e155d9
nits
tonybruguier f199f1f
Implement equation 11.
tonybruguier a2aeb50
Merge branch 'master' into hamiltonian
tonybruguier 167b4f5
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 7057d9b
Address comments
tonybruguier 89239e4
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier b487c06
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier dfc3ffc
Address comments
tonybruguier 9f0a416
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 99a3dc5
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 152a731
Merge branch 'master' into hamiltonian
tonybruguier ad62478
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 05d8268
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 5338e61
Add a TODO
tonybruguier 473fa2b
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier c18bec6
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier d110091
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 1524845
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 5372cab
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier cb6da19
Revert some files
tonybruguier 167a1db
Update examples/hamiltonian_representation.py
tonybruguier 6403294
Rename file
tonybruguier f4e7658
Rename file
tonybruguier 396ea47
Make a gate
tonybruguier a3d7291
Add gate
tonybruguier 21ff825
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier fac49e3
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 4a994c4
Address some comments
tonybruguier 1105d2b
Rename gate
tonybruguier d9f462f
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 6cd9366
execute TODO
tonybruguier 4dea601
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier a0c700f
More unit tests
tonybruguier dacf48f
nits
tonybruguier 28c96ce
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 6821aaa
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 96422c5
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier d0d5f25
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 997ac56
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 57c0f7a
Update cirq-core/cirq/ops/boolean_hamiltonian_operation.py
tonybruguier 09c98d3
Update cirq-core/cirq/ops/boolean_hamiltonian_operation.py
tonybruguier 3a3ad6a
Update cirq-core/cirq/ops/boolean_hamiltonian_operation.py
tonybruguier 06a2ccc
Merge branch 'master' into hamiltonian
tonybruguier 47bb1a1
Update cirq-core/cirq/ops/boolean_hamiltonian_operation.py
tonybruguier 4a9cba4
nit
tonybruguier 20b5896
Rename BooleanHamiltonianOperation to BooleanHamiltonian
tonybruguier 15f1ae0
Merge branch 'hamiltonian' of github.com:tonybruguier/Cirq into hamil…
tonybruguier 789d656
fix some errors, hopefully
tonybruguier 83a2fff
fix import
tonybruguier e7340a9
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier c513e47
New base class
tonybruguier 7a510b7
Make get_name_to_id() private
tonybruguier ccf429c
Use PauliString
tonybruguier e93bd01
Some fixes
tonybruguier f46efe8
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 51d2478
de-brittle unit test
tonybruguier e1069cf
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 03a5226
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier fa3b754
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 3aadaa5
Intermediate addressing of comments
tonybruguier 17086bc
Address more comments
tonybruguier df9e733
Attempt to fix types
tonybruguier 37f791c
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 5252349
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier e3e783c
Update cirq-core/cirq/ops/boolean_hamiltonian.py
tonybruguier 67a8bb8
Update cirq-core/cirq/ops/boolean_hamiltonian.py
tonybruguier ce57671
Update cirq-core/cirq/ops/boolean_hamiltonian.py
tonybruguier 2e33032
Add some unit tests. More to do.
tonybruguier 609cf08
Merge branch 'hamiltonian' of github.com:tonybruguier/Cirq into hamil…
tonybruguier d45e5de
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 778a4c2
Address more comments
tonybruguier 1cbb63f
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier f7cdf12
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 5bad288
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier e7e6399
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier bb06b8a
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier e295225
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 2a6ffde
Update cirq-core/cirq/ops/boolean_hamiltonian.py
tonybruguier 08cac1a
Update examples/qaoa.py
tonybruguier ce98939
Update examples/qaoa.py
tonybruguier a02b6f2
Update cirq-core/cirq/ops/boolean_hamiltonian.py
tonybruguier 0afb1f4
Address some comments
tonybruguier 1ea6b91
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 2362d9d
Add back the examples
tonybruguier 661504e
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 1505292
Merge branch 'hamiltonian' of github.com:tonybruguier/Cirq into hamil…
tonybruguier 06e1c03
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 138795d
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier a06dfa4
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier dbb0275
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 9457433
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 2baf674
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier a6b1c8e
Update cirq-core/cirq/ops/boolean_hamiltonian.py
tonybruguier 3fe8a12
Find min gate num
tonybruguier a296051
Merge branch 'hamiltonian' of github.com:tonybruguier/Cirq into hamil…
tonybruguier cfea2a7
Update cirq-core/cirq/ops/boolean_hamiltonian.py
tonybruguier 4354469
nit
tonybruguier de8463f
attempt fix mypy
tonybruguier 03c3281
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier c60c522
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 4ba558e
Remove ladder
tonybruguier a8687a6
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 4b6b912
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 5446463
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 5611632
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier bfa68d4
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier d2e9ce8
Merge changes
tonybruguier e93b472
Actually call simplification code
tonybruguier 48e2722
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 394c376
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier af95a3a
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 94eb92d
nit
tonybruguier 45c6b79
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 9fcd3ac
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 5443558
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 26a4ec7
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier e998615
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 3d74c02
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 05a7996
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 874914f
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 78b66da
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 2f5f127
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 51afec4
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 0e1504d
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier f3149a1
Remove boolean hamiltonian
tonybruguier abd3a64
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 52ed083
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 42662c9
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier b887282
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 53bb242
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 5db505d
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 1542069
Obliterate diffs so that I can start over
tonybruguier 277850f
Refactor to use both approaches
tonybruguier 66ec921
Nits
tonybruguier d33bbe3
nit
tonybruguier b728fa7
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 90e3b65
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier fcb12ad
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 9acd5d8
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier dce65cd
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier b7c19d3
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 084c804
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 28ebd17
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier c76b9fd
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier fe8bd8b
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier fbce71e
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier f587e60
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 854622f
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 21da5a1
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier 78de9e4
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier eaee8f4
Merge branch 'master' of github.com:quantumlib/Cirq into hamiltonian
tonybruguier File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
import math | ||
from typing import Dict, Tuple | ||
|
||
from sympy.logic.boolalg import And, Not, Or, Xor | ||
from sympy.core.symbol import Symbol | ||
|
||
import cirq | ||
|
||
# References: | ||
# [1] On the representation of Boolean and real functions as Hamiltonians for quantum computing | ||
# by Stuart Hadfield | ||
# [2] https://www.youtube.com/watch?v=AOKM9BkweVU is a useful intro | ||
# [3] https://github.com/rsln-s/IEEE_QW_2020/blob/master/Slides.pdf | ||
|
||
|
||
class HamiltonianList: | ||
"""A container class of Boolean function as equation (2) or [1]""" | ||
|
||
def __init__(self, hamiltonians: Dict[Tuple[int, ...], float]): | ||
# The representation is Tuple[int, ...] to weights. The tuple contains the integers of | ||
# where Z_i is present. For example, Z_0.Z_3 would be (0, 3), and I is the empty tuple. | ||
self.hamiltonians = {h: w for h, w in hamiltonians.items() if math.fabs(w) > 1e-12} | ||
tonybruguier marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
def __str__(self): | ||
tonybruguier marked this conversation as resolved.
Show resolved
Hide resolved
|
||
# For run-to-run identicalness, we sort the keys lexicographically. | ||
return "; ".join( | ||
f"{self.hamiltonians[h]:.2f}.{'.'.join('Z_%d' % d for d in h) if h else 'I'}" | ||
tonybruguier marked this conversation as resolved.
Show resolved
Hide resolved
|
||
for h in sorted(self.hamiltonians) | ||
) | ||
|
||
def __add__(self, other): | ||
tonybruguier marked this conversation as resolved.
Show resolved
Hide resolved
|
||
return self._signed_add(other, 1.0) | ||
|
||
def __sub__(self, other): | ||
return self._signed_add(other, -1.0) | ||
|
||
def _signed_add(self, other, sign: float): | ||
tonybruguier marked this conversation as resolved.
Show resolved
Hide resolved
|
||
hamiltonians = self.hamiltonians.copy() | ||
for h, w in other.hamiltonians.items(): | ||
if h not in hamiltonians: | ||
hamiltonians[h] = 0 | ||
hamiltonians[h] += sign * w | ||
tonybruguier marked this conversation as resolved.
Show resolved
Hide resolved
|
||
return HamiltonianList(hamiltonians) | ||
|
||
def __rmul__(self, other: float): | ||
return HamiltonianList({k: other * w for k, w in self.hamiltonians.items()}) | ||
|
||
def __mul__(self, other): | ||
hamiltonians = {} | ||
for h1, w1 in self.hamiltonians.items(): | ||
for h2, w2 in other.hamiltonians.items(): | ||
h = tuple(sorted(set(h1).symmetric_difference(h2))) | ||
tonybruguier marked this conversation as resolved.
Show resolved
Hide resolved
|
||
w = w1 * w2 | ||
if h not in hamiltonians: | ||
hamiltonians[h] = 0 | ||
hamiltonians[h] += w | ||
return HamiltonianList(hamiltonians) | ||
|
||
@staticmethod | ||
def O(): | ||
return HamiltonianList({}) | ||
|
||
@staticmethod | ||
def I(): | ||
return HamiltonianList({(): 1.0}) | ||
|
||
@staticmethod | ||
def Z(i: int): | ||
return HamiltonianList({(i,): 1.0}) | ||
|
||
|
||
def build_hamiltonian_from_boolean(boolean_expr, name_to_id) -> HamiltonianList: | ||
"""Builds the Hamiltonian representation of Boolean expression as per [1]: | ||
|
||
Args: | ||
boolean_expr: A Sympy expression containing symbols and Boolean operations | ||
name_to_id: A dictionary from symbol name to an integer, typically built by calling | ||
get_name_to_id(). | ||
|
||
Return: | ||
The HamiltonianList that represents the Boolean expression. | ||
""" | ||
|
||
if isinstance(boolean_expr, (And, Not, Or, Xor)): | ||
sub_hamiltonians = [ | ||
tonybruguier marked this conversation as resolved.
Show resolved
Hide resolved
|
||
build_hamiltonian_from_boolean(sub_boolean_expr, name_to_id) | ||
for sub_boolean_expr in boolean_expr.args | ||
] | ||
# We apply the equalities of theorem 1 of [1]. | ||
if isinstance(boolean_expr, And): | ||
hamiltonian = HamiltonianList.I() | ||
for sub_hamiltonian in sub_hamiltonians: | ||
hamiltonian = hamiltonian * sub_hamiltonian | ||
elif isinstance(boolean_expr, Not): | ||
assert len(sub_hamiltonians) == 1 | ||
hamiltonian = HamiltonianList.I() - sub_hamiltonians[0] | ||
elif isinstance(boolean_expr, Or): | ||
hamiltonian = HamiltonianList.O() | ||
for sub_hamiltonian in sub_hamiltonians: | ||
hamiltonian = hamiltonian + sub_hamiltonian - hamiltonian * sub_hamiltonian | ||
elif isinstance(boolean_expr, Xor): | ||
hamiltonian = HamiltonianList.O() | ||
for sub_hamiltonian in sub_hamiltonians: | ||
hamiltonian = hamiltonian + sub_hamiltonian - 2.0 * hamiltonian * sub_hamiltonian | ||
return hamiltonian | ||
elif isinstance(boolean_expr, Symbol): | ||
# Table 1 of [1], entry for 'x' is '1/2.I - 1/2.Z' | ||
i = name_to_id[boolean_expr.name] | ||
return 0.5 * HamiltonianList.I() - 0.5 * HamiltonianList.Z(i) | ||
else: | ||
raise ValueError(f'Unsupported type: {type(boolean_expr)}') | ||
tonybruguier marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
|
||
def get_name_to_id(boolean_exprs): | ||
# For run-to-run identicalness, we sort the symbol name lexicographically. | ||
symbol_names = sorted( | ||
{symbol.name for boolean_expr in boolean_exprs for symbol in boolean_expr.free_symbols} | ||
) | ||
return {symbol_name: i for i, symbol_name in enumerate(symbol_names)} | ||
|
||
|
||
def build_circuit_from_hamiltonians(hamiltonians, qubits, theta): | ||
tonybruguier marked this conversation as resolved.
Show resolved
Hide resolved
tonybruguier marked this conversation as resolved.
Show resolved
Hide resolved
|
||
circuit = cirq.Circuit() | ||
for hamiltonian in hamiltonians: | ||
for h, w in hamiltonian.hamiltonians.items(): | ||
tonybruguier marked this conversation as resolved.
Show resolved
Hide resolved
|
||
for i in range(1, len(h)): | ||
circuit.append(cirq.CNOT(qubits[h[i]], qubits[h[0]])) | ||
tonybruguier marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
if len(h) >= 1: | ||
circuit.append(cirq.Rz(rads=(theta * w)).on(qubits[h[0]])) | ||
tonybruguier marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
for i in range(1, len(h)): | ||
circuit.append(cirq.CNOT(qubits[h[i]], qubits[h[0]])) | ||
|
||
return circuit |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
import math | ||
|
||
import numpy as np | ||
import pytest | ||
from sympy.parsing.sympy_parser import parse_expr | ||
tonybruguier marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
import cirq | ||
import examples.hamiltonian_representation as hr | ||
|
||
# These are some of the entries of table 1. | ||
tonybruguier marked this conversation as resolved.
Show resolved
Hide resolved
|
||
@pytest.mark.parametrize( | ||
'boolean_expr,hamiltonian', | ||
[ | ||
('x', '0.50.I; -0.50.Z_0'), | ||
('~x', '0.50.I; 0.50.Z_0'), | ||
('x0 ^ x1', '0.50.I; -0.50.Z_0.Z_1'), | ||
('x0 & x1', '0.25.I; -0.25.Z_0; 0.25.Z_0.Z_1; -0.25.Z_1'), | ||
('x0 | x1', '0.75.I; -0.25.Z_0; -0.25.Z_0.Z_1; -0.25.Z_1'), | ||
('x0 ^ x1 ^ x2', '0.50.I; -0.50.Z_0.Z_1.Z_2'), | ||
], | ||
) | ||
def test_build_hamiltonian_from_boolean(boolean_expr, hamiltonian): | ||
boolean = parse_expr(boolean_expr) | ||
name_to_id = hr.get_name_to_id([boolean]) | ||
actual = hr.build_hamiltonian_from_boolean(boolean, name_to_id) | ||
assert hamiltonian == str(actual) | ||
|
||
|
||
def test_unsupported_op(): | ||
not_a_boolean = parse_expr('x * x') | ||
name_to_id = hr.get_name_to_id([not_a_boolean]) | ||
with pytest.raises(ValueError, match='Unsupported type'): | ||
hr.build_hamiltonian_from_boolean(not_a_boolean, name_to_id) | ||
|
||
|
||
@pytest.mark.parametrize( | ||
'boolean_expr, expected', | ||
[ | ||
('x', [False, True]), | ||
('~x', [True, False]), | ||
('x0 ^ x1', [False, True, True, False]), | ||
('x0 & x1', [False, False, False, True]), | ||
('x0 | x1', [False, True, True, True]), | ||
('x0 & ~x1 & x2', [False, False, False, False, False, True, False, False]), | ||
], | ||
) | ||
def test_circuit(boolean_expr, expected): | ||
boolean = parse_expr(boolean_expr) | ||
name_to_id = hr.get_name_to_id([boolean]) | ||
hamiltonian = hr.build_hamiltonian_from_boolean(boolean, name_to_id) | ||
|
||
qubits = [cirq.NamedQubit(name) for name in name_to_id.keys()] | ||
circuit = cirq.Circuit() | ||
circuit.append(cirq.H.on_each(*qubits)) | ||
|
||
theta = 0.1 * math.pi | ||
circuit += hr.build_circuit_from_hamiltonians([hamiltonian], qubits, theta) | ||
|
||
phi = cirq.Simulator().simulate(circuit, qubit_order=qubits, initial_state=0).state_vector() | ||
actual = np.arctan2(phi.real, phi.imag) - math.pi / 2.0 > 0.0 | ||
|
||
np.testing.assert_array_equal(actual, expected) |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.