Source code for qnetvo.cost.magic_squares_game
from pennylane import math
from ..qnodes import joint_probs_qnode
[docs]
def magic_squares_game_cost_fn(network_ansatz, **qnode_kwargs):
"""Constructs a cost function that maximizes the winning probability for the magic squares game.
:param network_ansatz: A ``NetworkAnsatz`` class specifying the quantum network simulation.
:type network_ansatz: NetworkAnsatz
:return: A cost function evaluated as ``cost(*network_settings)`` where
the ``network_settings`` are obtained from the provided
``network_ansatz`` class.
:rtype: Function
"""
probs_qnode = joint_probs_qnode(network_ansatz, **qnode_kwargs)
static_prep_inputs = [[0] * len(layer_nodes) for layer_nodes in network_ansatz.layers[0:-1]]
def cost(*network_settings):
winning_probability = 0
for x in [0, 1, 2]:
for y in [0, 1, 2]:
settings = network_ansatz.qnode_settings(
network_settings, static_prep_inputs + [[x, y]]
)
probs = probs_qnode(settings)
for i in range(16):
bit_string = [int(x) for x in math.binary_repr(i, 4)]
A_parity_bit = 0 if (bit_string[0] + bit_string[1]) % 2 == 0 else 1
B_parity_bit = 1 if (bit_string[2] + bit_string[3]) % 2 == 0 else 0
A_bits = bit_string[0:2] + [A_parity_bit]
B_bits = bit_string[2:] + [B_parity_bit]
if A_bits[y] == B_bits[x]:
winning_probability += probs[i]
return -(winning_probability / 9)
return cost