Skip to content

Commit

Permalink
Merge pull request #49 from ChitambarLab/pennylane-update-29
Browse files Browse the repository at this point in the history
updating pennylane to v0.29
  • Loading branch information
bdoolittle authored Mar 15, 2023
2 parents 5cea880 + a49ad73 commit 2c456fa
Show file tree
Hide file tree
Showing 29 changed files with 300 additions and 231 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ $ pip install qnetvo
Install PennyLane:

```
$ pip install pennylane==0.28
$ pip install pennylane==0.29
```

Import packages:
Expand All @@ -48,7 +48,7 @@ Note
</p>
<p>
For optimal use, qNetVO should be used with PennyLane.
QNetVO is currently compatible with PennyLane v0.28.
QNetVO is currently compatible with PennyLane v0.29.
</p>
</div>

Expand Down
291 changes: 237 additions & 54 deletions demos/training_a_teleportation_protocol.ipynb

Large diffs are not rendered by default.

4 changes: 0 additions & 4 deletions docs/source/utilities.rst
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,4 @@ File I/O
Data Conversions
----------------

.. autofunction:: settings_to_list

.. autofunction:: settings_to_np

.. autofunction:: mixed_base_num
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
pennylane==0.28
pennylane~=0.29
qiskit==0.34
pennylane-qiskit==0.20
tensorflow>=2.0,<3.0
Expand Down
4 changes: 2 additions & 2 deletions setup.cfg
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[metadata]
name = qNetVO
version = 0.4.1
version = 0.4.2
author = Brian Doolittle and Tom Bromley
author_email = [email protected]
description = The Quantum Network Variational Optimizer
Expand All @@ -20,7 +20,7 @@ package_dir =
packages = find:
python_requires = >=3.8
install_requires =
pennylane==0.28
pennylane~=0.29

[options.packages.find]
where = src
2 changes: 1 addition & 1 deletion src/qnetvo/cost/I_3322_bell_inequality.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def I_3322_bell_inequality_cost_fn(network_ansatz, **qnode_kwargs):

def cost(*network_settings):
score = 0
for (x, y, mult) in [
for x, y, mult in [
(0, 0, 1),
(0, 1, 1),
(0, 2, 1),
Expand Down
1 change: 0 additions & 1 deletion src/qnetvo/cost/chsh_inequality.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ def chsh_inequality_cost_fn(network_ansatz, parallel=False, **qnode_kwargs):
chsh_qnode = global_parity_expval_qnode(network_ansatz, **qnode_kwargs)

def chsh_cost(*network_settings):

xy_settings = [
network_ansatz.qnode_settings(network_settings, network_input)
for network_input in network_inputs
Expand Down
2 changes: 1 addition & 1 deletion src/qnetvo/cost/linear_inequalities.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ def linear_probs_cost_fn(network_ansatz, game, postmap=np.array([]), qnode_kwarg

def cost(*network_settings):
score = 0
for (i, input_id_set) in enumerate(node_input_ids):
for i, input_id_set in enumerate(node_input_ids):
settings = network_ansatz.qnode_settings(network_settings, input_id_set)

raw_probs = probs_qnode(settings)
Expand Down
2 changes: 0 additions & 2 deletions src/qnetvo/cost/mermin_klyshko_inequality.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,13 +79,11 @@ def mermin_klyshko_cost_fn(ansatz, **qnode_kwargs):
static_prep_inputs = [[0] * len(layer_nodes) for layer_nodes in ansatz.layers[0:-1]]

def cost(*network_settings):

score = 0

num_correlators = len(meas_inputs_list)

for i in range(num_correlators):

meas_inputs = meas_inputs_list[i]
scalar = scalars_list[i]

Expand Down
2 changes: 1 addition & 1 deletion src/qnetvo/cost/mutual_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ def mutual_info_cost_fn(ansatz, priors, postmap=np.array([]), **qnode_kwargs):
def cost(*network_settings):
Hxy = 0
py_vec = np.zeros(net_num_out)
for (i, input_id_set) in enumerate(node_input_ids):
for i, input_id_set in enumerate(node_input_ids):
settings = ansatz.qnode_settings(network_settings, input_id_set)
p_net = postmap @ probs_qnode(settings)

Expand Down
5 changes: 0 additions & 5 deletions src/qnetvo/cost/nlocal_chain_bell_inequality.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ def chain_I22_fn(network_ansatz, parallel=False, **qnode_kwargs):
I22_xy_inputs = [[x_a] + [0 for i in range(num_interior_nodes)] + [x_b] for x_a, x_b in xy_vals]

def I22(*network_settings):

I22_xy_settings = [
network_ansatz.qnode_settings(network_settings, static_prep_inputs + [meas_inputs])
for meas_inputs in I22_xy_inputs
Expand Down Expand Up @@ -91,7 +90,6 @@ def chain_J22_fn(network_ansatz, parallel=False, **qnode_kwargs):
J22_xy_inputs = [[x_a] + [1 for i in range(num_interior_nodes)] + [x_b] for x_a, x_b in xy_vals]

def J22(*network_settings):

J22_xy_settings = [
network_ansatz.qnode_settings(network_settings, static_prep_inputs + [meas_inputs])
for meas_inputs in J22_xy_inputs
Expand Down Expand Up @@ -158,7 +156,6 @@ def nlocal_chain_22_cost_fn(network_ansatz, parallel=False, **qnode_kwargs):
J22 = chain_J22_fn(network_ansatz, parallel=parallel, **qnode_kwargs)

def cost(*network_settings):

I22_score = I22(*network_settings)
J22_score = J22(*network_settings)

Expand Down Expand Up @@ -218,7 +215,6 @@ def _nat_grad_fn(settings, qnode):
grad_fn = _nat_grad_fn if natural_grad else _grad_fn

def nlocal_chain_grad_fn(*network_settings):

I22_score = I22(*network_settings)
J22_score = J22(*network_settings)

Expand Down Expand Up @@ -249,7 +245,6 @@ def nlocal_chain_grad_fn(*network_settings):
J22_scalar = -(1 / 4) * math.sign(J22_score) / math.sqrt(math.abs(J22_score))

for i in range(4):

x = I22_xy_meas_inputs[i][0]
y = I22_xy_meas_inputs[i][-1]
J22_sign = (-1) ** (x + y)
Expand Down
4 changes: 0 additions & 4 deletions src/qnetvo/cost/nlocal_star_bell_inequality.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ def star_I22_fn(network_ansatz, parallel=False, nthreads=4, **qnode_kwargs):
star_qnode = global_parity_expval_qnode(network_ansatz, **qnode_kwargs)

def I22(*network_settings):

I22_x_settings = [
network_ansatz.qnode_settings(network_settings, network_inputs)
for network_inputs in network_input_x_vals
Expand Down Expand Up @@ -132,7 +131,6 @@ def star_J22_fn(network_ansatz, parallel=False, nthreads=4, **qnode_kwargs):
star_qnode = global_parity_expval_qnode(network_ansatz, **qnode_kwargs)

def J22(*network_settings):

J22_x_settings = [
network_ansatz.qnode_settings(network_settings, network_inputs)
for network_inputs in network_input_x_vals
Expand Down Expand Up @@ -207,7 +205,6 @@ def nlocal_star_22_cost_fn(network_ansatz, parallel=False, nthreads=4, **qnode_k
J22 = star_J22_fn(network_ansatz, parallel=parallel, nthreads=nthreads, **qnode_kwargs)

def cost(*network_settings):

I22_score = I22(*network_settings)
J22_score = J22(*network_settings)

Expand Down Expand Up @@ -280,7 +277,6 @@ def _ng(qnode, settings):
_grad = _ng if natural_grad else _g

def nlocal_star_grad(*network_settings):

I22_score = I22(*network_settings)
J22_score = J22(*network_settings)

Expand Down
2 changes: 1 addition & 1 deletion src/qnetvo/information.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ def behavior_fn(network_ansatz, postmap=np.array([]), qnode_kwargs={}):

def behavior(network_settings):
raw_behavior = np.zeros((raw_net_num_out, net_num_in))
for (i, input_id_set) in enumerate(node_input_ids):
for i, input_id_set in enumerate(node_input_ids):
settings = network_ansatz.qnode_settings(
network_settings,
[input_id_set[0 : len(num_in_prep_nodes)], input_id_set[len(num_in_prep_nodes) :]],
Expand Down
1 change: 0 additions & 1 deletion src/qnetvo/network_ansatz.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,6 @@ def get_network_parameter_partitions(self):
for i, layer in enumerate(self.layers):
parameter_partitions += [[]]
for j, node in enumerate(layer):

parameter_partitions[i] += [[]]
for _ in range(node.num_in):
stop_id = start_id + node.num_settings
Expand Down
39 changes: 2 additions & 37 deletions src/qnetvo/utilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,9 @@ def write_optimization_json(opt_dict, filename):

opt_dict_json["opt_score"] = float(opt_dict_json["opt_score"])
opt_dict_json["scores"] = [float(score) for score in opt_dict_json["scores"]]
opt_dict_json["opt_settings"] = settings_to_list(opt_dict_json["opt_settings"])
opt_dict_json["opt_settings"] = [float(setting) for setting in opt_dict_json["opt_settings"]]
opt_dict_json["settings_history"] = [
settings_to_list(settings) for settings in opt_dict_json["settings_history"]
[float(setting) for setting in settings] for settings in opt_dict_json["settings_history"]
]

with open(filename + ".json", "w") as file:
Expand All @@ -130,44 +130,9 @@ def read_optimization_json(filepath):
with open(filepath) as file:
opt_dict = json.load(file)

opt_dict["opt_settings"] = settings_to_np(opt_dict["opt_settings"])
opt_dict["settings_history"] = [
settings_to_np(settings) for settings in opt_dict["settings_history"]
]

return opt_dict


def settings_to_list(np_network_settings):
"""Converts the numpy array in scenario settings to lists.
This function is intended for printing purposes.
:param np_network_settings: The scenario settings structure for a `NetworkAnsatz`.
:returns: The same nested array elements and structure using lists.
"""

list_prep_settings = [node_settings.tolist() for node_settings in np_network_settings[0]]
list_meas_settings = [node_settings.tolist() for node_settings in np_network_settings[1]]

return [list_prep_settings, list_meas_settings]


def settings_to_np(list_network_settings):
"""Converts the nested list elements in the scenario settings to numpy arrays.
This function is intended for printing purposes.
:param list_network_settings: The scenario settings structure for a `NetworkAnsatz`.
:returns: The same nested array elements and structure using numpy arrays.
"""

np_prep_settings = [qnp.array(node_settings) for node_settings in list_network_settings[0]]
np_meas_settings = [qnp.array(node_settings) for node_settings in list_network_settings[1]]

return [np_prep_settings, np_meas_settings]


def mixed_base_num(n, base_digits):
"""Converts a base-10 number ``n`` into a mixed base number with digit
values described by the ``base_digits`` array.
Expand Down
4 changes: 0 additions & 4 deletions test/ansatz_library_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,6 @@ def match_expval(noise_param):
return qml.expval(obs(wires=[0]))

for noise_param in np.arange(0, 1.001, 1 / 10):

assert np.isclose(test_expval(noise_param), match_expval(noise_param), atol=1e-7)

@pytest.mark.parametrize(
Expand Down Expand Up @@ -340,12 +339,10 @@ def match_expval(noise_param):
return qml.expval(obs(wires=[0]))

for noise_param in np.arange(0, 1.001, 1 / 10):

assert np.isclose(test_expval(noise_param), match_expval(noise_param), atol=1e-7)

@pytest.mark.parametrize("gamma", np.arange(-0.1, 1.11, 0.1))
def test_two_qubit_depolarizing(self, gamma):

dev = qml.device("default.mixed", wires=[0, 1])

@qml.qnode(dev)
Expand Down Expand Up @@ -373,7 +370,6 @@ def test_noise(gamma):

@pytest.mark.parametrize("gamma", np.arange(-0.1, 1.11, 0.1))
def test_colored_noise(self, gamma):

dev = qml.device("default.mixed", wires=[0, 1])

@qml.qnode(dev)
Expand Down
1 change: 0 additions & 1 deletion test/cost/I_3322_bell_inequality_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

class TestCostI3322BellInequality:
def test_post_process_I_3322_joint_probs(self):

probs_vec = np.array([0.1, 0.2, 0.3, 0.4])
P00xy = qnet.post_process_I_3322_joint_probs(probs_vec)
assert P00xy == 0.1
Expand Down
1 change: 0 additions & 1 deletion test/cost/chsh_inequality_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
class TestCHSHInequalityCost:
@pytest.mark.parametrize("parallel_flag", [False, True])
def test_chsh_inequality_cost_fn(self, parallel_flag):

prep_nodes = [qnet.PrepareNode(1, [0, 1], qnet.ghz_state, 0)]
meas_nodes = [
qnet.MeasureNode(2, 2, [0], qnet.local_RY, 1),
Expand Down
1 change: 0 additions & 1 deletion test/cost/magic_squares_game_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

class TestCostMagicSquaresGame:
def test_magic_squares_game_cost_fn(self):

prep_nodes = [qnet.PrepareNode(1, range(4), qnet.bell_state_copies, 0)]
meas_nodes = [
qnet.MeasureNode(3, 4, [0, 1], qml.templates.subroutines.ArbitraryUnitary, 15),
Expand Down
2 changes: 0 additions & 2 deletions test/cost/mermin_klyshko_inequality_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ class TestMerminKlyshkoInequality:
],
)
def test_mermin_klyshko_inputs_scalars(self, n, match_inputs, match_scalars):

meas_inputs_list, scalars_list = qnet.mermin_klyshko_inputs_scalars(n)

assert scalars_list == match_scalars
Expand All @@ -55,7 +54,6 @@ def test_num_terms_mermin_klyshk_inputs_scalars(self, n):
assert len(scalars_list) == num_terms

def test_mermin_klyshko_inequality_fn_CHSH_scenario(self):

prep_nodes = [qnet.PrepareNode(1, [0, 1], qnet.ghz_state, 0)]

meas_nodes = [
Expand Down
3 changes: 0 additions & 3 deletions test/cost/mutual_info_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ class TestMutualInfoCostFn:
],
)
def test_mutual_info_cost_qubit_33(self, network_settings, priors, postmap, match):

ansatz = qnet.NetworkAnsatz(
[qnet.PrepareNode(3, [0], qnet.local_RY, 1)],
[qnet.MeasureNode(1, 3, [0], qnet.local_RY, 1)],
Expand All @@ -41,7 +40,6 @@ def test_mutual_info_cost_qubit_33(self, network_settings, priors, postmap, matc
assert np.isclose(mutual_info(*network_settings), match)

def test_mutual_info_2_senders(self):

ansatz = qnet.NetworkAnsatz(
[
qnet.PrepareNode(2, [0], qnet.local_RY, 1),
Expand All @@ -62,7 +60,6 @@ class TestMutualInfoOptimimzation:
"priors,match", [([np.ones(3) / 3], 0.9182), ([np.array([0.5, 0.5, 0])], 1)]
)
def test_mutual_info_opt_qubit_33(self, priors, match):

ansatz = qnet.NetworkAnsatz(
[qnet.PrepareNode(3, [0], qnet.local_RY, 1)],
[qnet.MeasureNode(1, 3, [0], qnet.local_RY, 1)],
Expand Down
5 changes: 2 additions & 3 deletions test/cost/nlocal_chain_bell_inequality_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ def test_nlocal_chain_22_cost_fn(self, parallel_flag):
)
@flaky(max_runs=5, min_passes=1)
def test_parallel_nlocal_chain_grad_fn(self, natural_grad, prep_nodes, meas_nodes):

chain_ansatz = qnet.NetworkAnsatz(prep_nodes, meas_nodes)

np.random.seed(45)
Expand All @@ -82,8 +81,8 @@ def test_parallel_nlocal_chain_grad_fn(self, natural_grad, prep_nodes, meas_node
assert np.allclose(grad, grad_match)

@pytest.mark.parametrize("parallel_flag", [True, False])
@flaky(max_runs=5, min_passes=1)
def test_chain_J22_fn(self, parallel_flag):

prep_nodes = [
qnet.PrepareNode(1, [0, 1], qnet.local_RY, 2),
qnet.PrepareNode(1, [2, 3], qnet.local_RY, 2),
Expand Down Expand Up @@ -133,8 +132,8 @@ def test_chain_J22_fn(self, parallel_flag):
assert np.isclose(4, J22(*settings))

@pytest.mark.parametrize("parallel_flag", [True, False])
@flaky(max_runs=5, min_passes=1)
def test_chain_I22_fn(self, parallel_flag):

prep_nodes = [
qnet.PrepareNode(1, [0, 1], qnet.local_RY, 2),
qnet.PrepareNode(1, [2, 3], qnet.local_RY, 2),
Expand Down
2 changes: 2 additions & 0 deletions test/cost/nlocal_star_bell_inequality_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ def trilocal_star_ry_ansatz(self):
return qnet.NetworkAnsatz(prep_nodes, meas_nodes)

@pytest.mark.parametrize("parallel_flag, nthreads", [(False, 4), (True, 4), (True, 3)])
@flaky(max_runs=5, min_passes=1)
def test_bilocal_star_22_cost(self, parallel_flag, nthreads):
bilocal_star_ansatz = self.bilocal_star_ry_ansatz()
bilocal_22_cost = qnet.nlocal_star_22_cost_fn(
Expand All @@ -54,6 +55,7 @@ def test_bilocal_star_22_cost(self, parallel_flag, nthreads):
assert np.isclose(bilocal_22_cost(*ideal_settings), -(np.sqrt(2)))

@pytest.mark.parametrize("parallel_flag, nthreads", [(False, 4), (True, 4), (True, 5)])
@flaky(max_runs=5, min_passes=1)
def test_trilocal_star_cost(self, parallel_flag, nthreads):
trilocal_star_ansatz = self.trilocal_star_ry_ansatz()
trilocal_22_cost = qnet.nlocal_star_22_cost_fn(
Expand Down
2 changes: 0 additions & 2 deletions test/cost/qnodes_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ def test_parity_observable(self):
assert qubit3_obs.wires == qml.wires.Wires([0, 1, 2])

def test_local_parity_observables(self):

measure_nodes = [
qnet.MeasureNode(2, 2, range(3 * i, 3 * i + 3), lambda settings, wires: None, 3)
for i in range(3)
Expand Down Expand Up @@ -60,7 +59,6 @@ def test_local_parity_expval_qnode(self):
assert np.all(qnode([np.pi, np.pi, np.pi, 0]) == [1, -1])

def test_global_parity_expval_qnode(self):

prep_nodes = [
qnet.PrepareNode(
1, [0, 1, 2, 3], lambda settings, wires: qml.BasisState(settings, wires=wires), 4
Expand Down
Loading

0 comments on commit 2c456fa

Please sign in to comment.