Source code for qaoa.problems.maxCliqueInfrastr

"""
\********************************************************************************
* Copyright (c) 2023 the Qrisp authors
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the Eclipse
* Public License, v. 2.0 are satisfied: GNU General Public License, version 2
* with the GNU Classpath Exception which is
* available at https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
********************************************************************************/
"""

from qrisp import h, rz, rx , rzz
import itertools
import networkx as nx




[docs] def maxCliqueCostOp(G): """ | Based on PennyLane unconstrained mixer implementation. | Initial state in :math:`(|0>+|1>)^{\otimes n}` . | For explanation see the PennyLane implementation. Parameters ---------- G : nx.Graph Graph of the problem instance Returns ------- QuantumCircuit: qrisp.QuantumCircuit the Operator applied to the circuit-QuantumVariable """ G_compl = nx.complement(G) def partialcostMixer(qv, gamma): for pair in list(G_compl.edges()): #cx(qv[pair[0]], qv[pair[1]]) rzz(3*gamma, qv[pair[0]], qv[pair[1]]) rz(-gamma, qv[pair[0]]) rz(-gamma, qv[pair[1]]) rz(gamma, qv) #return qv return partialcostMixer
[docs] def maxCliqueCostfct(G): """ Parameters ---------- G : nx.Graph Graph of the problem instance Returns ------- Costfunction : function the classical function for the problem instance, which takes a dictionary of measurement results as input """ def aClcostFct(res_dic): tot_energy = 0.001 tot_counts = 0 for state in res_dic.keys(): # we assume solution is right temp = True energy = 0 intlist = [s for s in range(len(list(state))) if list(state)[s] == "1"] # get all combinations of vertices in graph that are marked as |1> by the solution combinations = list(itertools.combinations(intlist, 2)) # if any combination is found in the list of G.edges(), the solution is wrong, and energy == 0 for combination in combinations: if combination not in G.edges(): temp = False break # else we just add the number of marked as |1> nodes if temp: energy = -len(intlist) tot_energy += energy * res_dic[state] tot_counts += res_dic[state] #print(tot_energy/tot_counts) return tot_energy/tot_counts return aClcostFct
def init_state(qv): h(qv) return qv