{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Train Variational Quantum Circuits by using f-evovaq and Qiskit" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "## 1) Training a Variational Quantum Classifier through a Memetic Algorithm" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "#### Importing modules" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "import numpy as np\n", "import cupy as cp\n", "from functools import partial\n", "from sklearn.datasets import load_iris\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import log_loss, accuracy_score\n", "from sklearn.preprocessing import MinMaxScaler\n", "from qiskit.circuit.library import TwoLocal\n", "from qiskit_aer.quantum_info import AerStatevector\n", "from qiskit import QuantumCircuit\n", "from qiskit.circuit import ParameterVector\n", "from fevovaq.problem import Problem\n", "from fevovaq.GeneticAlgorithm import GA\n", "from fevovaq.HillClimbing import HC\n", "from fevovaq.MemeticAlgorithm import MA\n", "from fevovaq.tools.operators import sel_tournament, cx_uniform, mut_gaussian, sel_best" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "#### Uploading the classical data" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "iris = load_iris()\n", "\n", "# For the sake of simplicity, we consider all the four features but only two classes\n", "iris_data = iris.data[:100, :4]\n", "iris_target = iris.target[:100] # 0 or 1\n", "\n", "# Split into train and test subsets\n", "train_data, test_data, train_labels, test_labels = train_test_split(iris_data, iris_target, test_size=0.2,\n", " random_state=42)\n", "\n", "# Pre-processing\n", "scaler = MinMaxScaler(feature_range=(-np.pi, np.pi))\n", "scaler.fit(train_data)\n", "train_data = scaler.transform(train_data)\n", "test_data = scaler.transform(test_data)" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "#### Building the Variational Quantum Classifier" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def AngleEncoding(n_qubits, rotation=\"ry\"):\n", " features = ParameterVector('f', n_qubits)\n", "\n", " qc = QuantumCircuit(n_qubits, 1)\n", "\n", " for i in range(n_qubits):\n", " if rotation == \"rx\":\n", " qc.rx(features[i], i)\n", " elif rotation == \"ry\":\n", " qc.ry(features[i], i)\n", " elif rotation == \"rz\":\n", " qc.rz(features[i], i)\n", " else:\n", " raise ValueError(\"rotation must be 'rx', 'ry', or 'rz'\")\n", "\n", " return qc" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/html": [ "
     ┌─────────────┐ ┌────────────────────┐                               »\n",
       "q_0: ┤ R(f[0],π/2) ├─┤ U3(θ[2],θ[1],θ[0]) ├───────────────────────────────»\n",
       "     ├─────────────┤ ├────────────────────┤                               »\n",
       "q_1: ┤ R(f[1],π/2) ├─┤ U3(θ[5],θ[4],θ[3]) ├──────────────────■────────────»\n",
       "     ├─────────────┤ ├────────────────────┤                ┌─┴─┐          »\n",
       "q_2: ┤ R(f[2],π/2) ├─┤ U3(θ[8],θ[7],θ[6]) ├───■────────────┤ X ├──────────»\n",
       "     ├─────────────┤┌┴────────────────────┴┐┌─┴─┐┌─────────┴───┴─────────┐»\n",
       "q_3: ┤ R(f[3],π/2) ├┤ U3(θ[11],θ[10],θ[9]) ├┤ X ├┤ U3(θ[23],θ[22],θ[21]) ├»\n",
       "     └─────────────┘└──────────────────────┘└───┘└───────────────────────┘»\n",
       "c: 1/═════════════════════════════════════════════════════════════════════»\n",
       "                                                                          »\n",
       "«                              ┌───────────────────────┐»\n",
       "«q_0: ────────────■────────────┤ U3(θ[14],θ[13],θ[12]) ├»\n",
       "«               ┌─┴─┐          ├───────────────────────┤»\n",
       "«q_1: ──────────┤ X ├──────────┤ U3(θ[17],θ[16],θ[15]) ├»\n",
       "«     ┌─────────┴───┴─────────┐└───────────────────────┘»\n",
       "«q_2: ┤ U3(θ[20],θ[19],θ[18]) ├────────────■────────────»\n",
       "«     └───────────────────────┘          ┌─┴─┐          »\n",
       "«q_3: ───────────────────────────────────┤ X ├──────────»\n",
       "«                                        └───┘          »\n",
       "«c: 1/══════════════════════════════════════════════════»\n",
       "«                                                       »\n",
       "«                                                       »\n",
       "«q_0: ─────────────────────────────────────■────────────»\n",
       "«                                        ┌─┴─┐          »\n",
       "«q_1: ────────────■──────────────────────┤ X ├──────────»\n",
       "«               ┌─┴─┐          ┌─────────┴───┴─────────┐»\n",
       "«q_2: ──────────┤ X ├──────────┤ U3(θ[32],θ[31],θ[30]) ├»\n",
       "«     ┌─────────┴───┴─────────┐└───────────────────────┘»\n",
       "«q_3: ┤ U3(θ[35],θ[34],θ[33]) ├─────────────────────────»\n",
       "«     └───────────────────────┘                         »\n",
       "«c: 1/══════════════════════════════════════════════════»\n",
       "«                                                       »\n",
       "«     ┌───────────────────────┐                         »\n",
       "«q_0: ┤ U3(θ[26],θ[25],θ[24]) ├─────────────────────────»\n",
       "«     ├───────────────────────┤                         »\n",
       "«q_1: ┤ U3(θ[29],θ[28],θ[27]) ├────────────■────────────»\n",
       "«     └───────────────────────┘          ┌─┴─┐          »\n",
       "«q_2: ────────────■──────────────────────┤ X ├──────────»\n",
       "«               ┌─┴─┐          ┌─────────┴───┴─────────┐»\n",
       "«q_3: ──────────┤ X ├──────────┤ U3(θ[47],θ[46],θ[45]) ├»\n",
       "«               └───┘          └───────────────────────┘»\n",
       "«c: 1/══════════════════════════════════════════════════»\n",
       "«                                                       »\n",
       "«                              ┌───────────────────────┐»\n",
       "«q_0: ────────────■────────────┤ U3(θ[38],θ[37],θ[36]) ├»\n",
       "«               ┌─┴─┐          ├───────────────────────┤»\n",
       "«q_1: ──────────┤ X ├──────────┤ U3(θ[41],θ[40],θ[39]) ├»\n",
       "«     ┌─────────┴───┴─────────┐└───────────────────────┘»\n",
       "«q_2: ┤ U3(θ[44],θ[43],θ[42]) ├────────────■────────────»\n",
       "«     └───────────────────────┘          ┌─┴─┐          »\n",
       "«q_3: ───────────────────────────────────┤ X ├──────────»\n",
       "«                                        └───┘          »\n",
       "«c: 1/══════════════════════════════════════════════════»\n",
       "«                                                       »\n",
       "«                                                       »\n",
       "«q_0: ─────────────────────────────────────■────────────»\n",
       "«                                        ┌─┴─┐          »\n",
       "«q_1: ────────────■──────────────────────┤ X ├──────────»\n",
       "«               ┌─┴─┐          ┌─────────┴───┴─────────┐»\n",
       "«q_2: ──────────┤ X ├──────────┤ U3(θ[56],θ[55],θ[54]) ├»\n",
       "«     ┌─────────┴───┴─────────┐└───────────────────────┘»\n",
       "«q_3: ┤ U3(θ[59],θ[58],θ[57]) ├─────────────────────────»\n",
       "«     └───────────────────────┘                         »\n",
       "«c: 1/══════════════════════════════════════════════════»\n",
       "«                                                       »\n",
       "«     ┌───────────────────────┐          \n",
       "«q_0: ┤ U3(θ[50],θ[49],θ[48]) ├───────■──\n",
       "«     ├───────────────────────┤     ┌─┴─┐\n",
       "«q_1: ┤ U3(θ[53],θ[52],θ[51]) ├──■──┤ X ├\n",
       "«     └───────────────────────┘┌─┴─┐└───┘\n",
       "«q_2: ────────────■────────────┤ X ├─────\n",
       "«               ┌─┴─┐          └───┘     \n",
       "«q_3: ──────────┤ X ├────────────────────\n",
       "«               └───┘                    \n",
       "«c: 1/═══════════════════════════════════\n",
       "«                                        
" ], "text/plain": [ " ┌─────────────┐ ┌────────────────────┐ »\n", "q_0: ┤ R(f[0],π/2) ├─┤ U3(θ[2],θ[1],θ[0]) ├───────────────────────────────»\n", " ├─────────────┤ ├────────────────────┤ »\n", "q_1: ┤ R(f[1],π/2) ├─┤ U3(θ[5],θ[4],θ[3]) ├──────────────────■────────────»\n", " ├─────────────┤ ├────────────────────┤ ┌─┴─┐ »\n", "q_2: ┤ R(f[2],π/2) ├─┤ U3(θ[8],θ[7],θ[6]) ├───■────────────┤ X ├──────────»\n", " ├─────────────┤┌┴────────────────────┴┐┌─┴─┐┌─────────┴───┴─────────┐»\n", "q_3: ┤ R(f[3],π/2) ├┤ U3(θ[11],θ[10],θ[9]) ├┤ X ├┤ U3(θ[23],θ[22],θ[21]) ├»\n", " └─────────────┘└──────────────────────┘└───┘└───────────────────────┘»\n", "c: 1/═════════════════════════════════════════════════════════════════════»\n", " »\n", "« ┌───────────────────────┐»\n", "«q_0: ────────────■────────────┤ U3(θ[14],θ[13],θ[12]) ├»\n", "« ┌─┴─┐ ├───────────────────────┤»\n", "«q_1: ──────────┤ X ├──────────┤ U3(θ[17],θ[16],θ[15]) ├»\n", "« ┌─────────┴───┴─────────┐└───────────────────────┘»\n", "«q_2: ┤ U3(θ[20],θ[19],θ[18]) ├────────────■────────────»\n", "« └───────────────────────┘ ┌─┴─┐ »\n", "«q_3: ───────────────────────────────────┤ X ├──────────»\n", "« └───┘ »\n", "«c: 1/══════════════════════════════════════════════════»\n", "« »\n", "« »\n", "«q_0: ─────────────────────────────────────■────────────»\n", "« ┌─┴─┐ »\n", "«q_1: ────────────■──────────────────────┤ X ├──────────»\n", "« ┌─┴─┐ ┌─────────┴───┴─────────┐»\n", "«q_2: ──────────┤ X ├──────────┤ U3(θ[32],θ[31],θ[30]) ├»\n", "« ┌─────────┴───┴─────────┐└───────────────────────┘»\n", "«q_3: ┤ U3(θ[35],θ[34],θ[33]) ├─────────────────────────»\n", "« └───────────────────────┘ »\n", "«c: 1/══════════════════════════════════════════════════»\n", "« »\n", "« ┌───────────────────────┐ »\n", "«q_0: ┤ U3(θ[26],θ[25],θ[24]) ├─────────────────────────»\n", "« ├───────────────────────┤ »\n", "«q_1: ┤ U3(θ[29],θ[28],θ[27]) ├────────────■────────────»\n", "« └───────────────────────┘ ┌─┴─┐ »\n", "«q_2: ────────────■──────────────────────┤ X ├──────────»\n", "« ┌─┴─┐ ┌─────────┴───┴─────────┐»\n", "«q_3: ──────────┤ X ├──────────┤ U3(θ[47],θ[46],θ[45]) ├»\n", "« └───┘ └───────────────────────┘»\n", "«c: 1/══════════════════════════════════════════════════»\n", "« »\n", "« ┌───────────────────────┐»\n", "«q_0: ────────────■────────────┤ U3(θ[38],θ[37],θ[36]) ├»\n", "« ┌─┴─┐ ├───────────────────────┤»\n", "«q_1: ──────────┤ X ├──────────┤ U3(θ[41],θ[40],θ[39]) ├»\n", "« ┌─────────┴───┴─────────┐└───────────────────────┘»\n", "«q_2: ┤ U3(θ[44],θ[43],θ[42]) ├────────────■────────────»\n", "« └───────────────────────┘ ┌─┴─┐ »\n", "«q_3: ───────────────────────────────────┤ X ├──────────»\n", "« └───┘ »\n", "«c: 1/══════════════════════════════════════════════════»\n", "« »\n", "« »\n", "«q_0: ─────────────────────────────────────■────────────»\n", "« ┌─┴─┐ »\n", "«q_1: ────────────■──────────────────────┤ X ├──────────»\n", "« ┌─┴─┐ ┌─────────┴───┴─────────┐»\n", "«q_2: ──────────┤ X ├──────────┤ U3(θ[56],θ[55],θ[54]) ├»\n", "« ┌─────────┴───┴─────────┐└───────────────────────┘»\n", "«q_3: ┤ U3(θ[59],θ[58],θ[57]) ├─────────────────────────»\n", "« └───────────────────────┘ »\n", "«c: 1/══════════════════════════════════════════════════»\n", "« »\n", "« ┌───────────────────────┐ \n", "«q_0: ┤ U3(θ[50],θ[49],θ[48]) ├───────■──\n", "« ├───────────────────────┤ ┌─┴─┐\n", "«q_1: ┤ U3(θ[53],θ[52],θ[51]) ├──■──┤ X ├\n", "« └───────────────────────┘┌─┴─┐└───┘\n", "«q_2: ────────────■────────────┤ X ├─────\n", "« ┌─┴─┐ └───┘ \n", "«q_3: ──────────┤ X ├────────────────────\n", "« └───┘ \n", "«c: 1/═══════════════════════════════════\n", "« " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Encode classical data in a quantum system through a FeatureMap\n", "reps = 5\n", "n_qubits = train_data.shape[1] # Number of qubits\n", "\n", "feature_map = AngleEncoding(n_qubits)\n", "\n", "# Define an Ansatz to be trained\n", "ansatz = TwoLocal(num_qubits=n_qubits, entanglement='reverse_linear', rotation_blocks='u3', reps=reps,\n", " entanglement_blocks='cx', skip_final_rotation_layer=True)\n", "\n", "# Put together our quantum classifier\n", "classifier = feature_map.compose(ansatz)\n", "\n", "classifier.decompose().draw()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "def get_label(params, classifier, test_data, problem):\n", " xp = problem.xp\n", " if xp.__name__ == 'cupy':\n", " params = xp.asnumpy(params)\n", "\n", " bound_circuit = classifier.assign_parameters(np.concatenate((test_data, params)))\n", " sv = AerStatevector(bound_circuit , device='GPU')\n", "\n", " probs = sv.probabilities([0])\n", " return 1 if probs[1] > 0.5 else 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Defining the cost function to be minimized" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "def cost_function(params, classifier, train_data, train_labels):\n", " n_samples = train_data.shape[0]\n", "\n", " # Convert CuPy array as NumPy because Qiskit doesn't support GPU-based arrays\n", " params = cp.asnumpy(params)\n", " params_reshaped = np.tile(params, (n_samples, 1))\n", " all_params_np = np.concatenate((train_data, params_reshaped), axis=1)\n", "\n", " preds = np.zeros(n_samples)\n", " for i, params_inst in enumerate(all_params_np):\n", " bound_circuits = classifier.assign_parameters(params_inst)\n", "\n", " sv = AerStatevector(bound_circuits , device='GPU')\n", "\n", " probs = sv.probabilities([0])\n", "\n", " preds[i] = probs[1]\n", "\n", " return log_loss(train_labels, preds)" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "#### Setting up the problem" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "cost_func = partial(cost_function, classifier=classifier, train_data=train_data, train_labels=train_labels)\n", "problem = Problem(n_params=ansatz.num_parameters, param_bounds=ansatz.parameter_bounds, init_range=(-cp.pi, cp.pi),\n", " obj_function=cost_func, backend='gpu', vectorized=False)" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "#### Defining a Memetic Algorithm" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "pycharm": { "is_executing": true, "name": "#%%\n" } }, "outputs": [], "source": [ "# Define the global search method\n", "global_search = GA(selection=sel_tournament, crossover=cx_uniform, mutation=mut_gaussian, sigma=0.2, mut_indpb=0.15,\n", " cxpb=0.9, tournsize=5)\n", "\n", "# Create a neighbour of a possible solution\n", "def get_neighbour(problem, current_solution):\n", " xp = problem.xp\n", " neighbour = current_solution.copy()\n", " index = xp.random.randint(0, problem.n_params, size=1)\n", " neighbour[index] = xp.random.uniform(-xp.pi, xp.pi, size=1)\n", " return neighbour\n", "\n", "# Define the local search method\n", "local_search = HC(generate_neighbour=get_neighbour)\n", "\n", "# Compose the global and local search method for a Memetic Algorithm \n", "optimizer = MA(global_search=global_search.evolve_population, sel_for_refinement=sel_best, local_search=local_search.stochastic_var, frequency=0.1, intensity=10)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Training our VQC" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Generations: 0%| | 0/10 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "num_nodes = 5\n", "edges = [(0, 1), (0, 2), (0, 3), (0, 4)]\n", "\n", "G = nx.Graph()\n", "G.add_nodes_from(range(num_nodes))\n", "G.add_edges_from(edges)\n", "nx.draw(G, with_labels=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Mapping the MaxCut problem in a QAOA circuit ansatz" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### 1 - Trasforming the MaxCut instance in a quadratic problem" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "pycharm": { "is_executing": true } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Problem name: Max-cut\n", "\n", "Maximize\n", " -2*x_0*x_1 - 2*x_0*x_2 - 2*x_0*x_3 - 2*x_0*x_4 + 4*x_0 + x_1 + x_2 + x_3 + x_4\n", "\n", "Subject to\n", " No constraints\n", "\n", " Binary variables (5)\n", " x_0 x_1 x_2 x_3 x_4\n", "\n" ] } ], "source": [ "maxcut_prob = Maxcut(G)\n", "maxcut_qp = maxcut_prob.to_quadratic_program()\n", "print(maxcut_qp.prettyprint())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### 2 - Defining the Hamiltonian by mapping the QUBO problem in an Ising Model" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "pycharm": { "is_executing": true } }, "outputs": [], "source": [ "# MaxCut problem to Hamiltonian operator\n", "hamiltonian, offset = maxcut_qp.to_ising()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### 3 - Building the QAOA circuit based on the MaxCut instance" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
        ┌─────────────┐                                                »\n",
       "   q_0: ┤ U3(π/2,0,π) ├──■────────────────────■─────────────────────■──»\n",
       "        ├─────────────┤┌─┴─┐┌──────────────┐┌─┴─┐┌───────────────┐  │  »\n",
       "   q_1: ┤ U3(π/2,0,π) ├┤ X ├┤ Rz(1.0*γ[0]) ├┤ X ├┤ R(2.0*β[0],0) ├──┼──»\n",
       "        ├─────────────┤└───┘└──────────────┘└───┘└───────────────┘┌─┴─┐»\n",
       "   q_2: ┤ U3(π/2,0,π) ├───────────────────────────────────────────┤ X ├»\n",
       "        ├─────────────┤                                           └───┘»\n",
       "   q_3: ┤ U3(π/2,0,π) ├────────────────────────────────────────────────»\n",
       "        ├─────────────┤                                                »\n",
       "   q_4: ┤ U3(π/2,0,π) ├────────────────────────────────────────────────»\n",
       "        └─────────────┘                                                »\n",
       "meas: 5/═══════════════════════════════════════════════════════════════»\n",
       "                                                                       »\n",
       "«                                                                        »\n",
       "«   q_0: ──────────────────■─────────────────────■────────────────────■──»\n",
       "«                          │                     │                    │  »\n",
       "«   q_1: ──────────────────┼─────────────────────┼────────────────────┼──»\n",
       "«        ┌──────────────┐┌─┴─┐┌───────────────┐  │                    │  »\n",
       "«   q_2: ┤ Rz(1.0*γ[0]) ├┤ X ├┤ R(2.0*β[0],0) ├──┼────────────────────┼──»\n",
       "«        └──────────────┘└───┘└───────────────┘┌─┴─┐┌──────────────┐┌─┴─┐»\n",
       "«   q_3: ──────────────────────────────────────┤ X ├┤ Rz(1.0*γ[0]) ├┤ X ├»\n",
       "«                                              └───┘└──────────────┘└───┘»\n",
       "«   q_4: ────────────────────────────────────────────────────────────────»\n",
       "«                                                                        »\n",
       "«meas: 5/════════════════════════════════════════════════════════════════»\n",
       "«                                                                        »\n",
       "«                                                   ┌───────────────┐     »\n",
       "«   q_0: ───────────────────■────────────────────■──┤ R(2.0*β[0],0) ├──■──»\n",
       "«                           │                    │  └───────────────┘┌─┴─┐»\n",
       "«   q_1: ───────────────────┼────────────────────┼───────────────────┤ X ├»\n",
       "«                           │                    │                   └───┘»\n",
       "«   q_2: ───────────────────┼────────────────────┼────────────────────────»\n",
       "«        ┌───────────────┐  │                    │                        »\n",
       "«   q_3: ┤ R(2.0*β[0],0) ├──┼────────────────────┼────────────────────────»\n",
       "«        └───────────────┘┌─┴─┐┌──────────────┐┌─┴─┐┌───────────────┐     »\n",
       "«   q_4: ─────────────────┤ X ├┤ Rz(1.0*γ[0]) ├┤ X ├┤ R(2.0*β[0],0) ├─────»\n",
       "«                         └───┘└──────────────┘└───┘└───────────────┘     »\n",
       "«meas: 5/═════════════════════════════════════════════════════════════════»\n",
       "«                                                                         »\n",
       "«                                                                              »\n",
       "«   q_0: ──────────────────■────■─────────────────────■────■───────────────────»\n",
       "«        ┌──────────────┐┌─┴─┐  │  ┌───────────────┐  │    │                   »\n",
       "«   q_1: ┤ Rz(1.0*γ[1]) ├┤ X ├──┼──┤ R(2.0*β[1],0) ├──┼────┼───────────────────»\n",
       "«        └──────────────┘└───┘┌─┴─┐└┬──────────────┤┌─┴─┐  │  ┌───────────────┐»\n",
       "«   q_2: ─────────────────────┤ X ├─┤ Rz(1.0*γ[1]) ├┤ X ├──┼──┤ R(2.0*β[1],0) ├»\n",
       "«                             └───┘ └──────────────┘└───┘┌─┴─┐└┬──────────────┤»\n",
       "«   q_3: ────────────────────────────────────────────────┤ X ├─┤ Rz(1.0*γ[1]) ├»\n",
       "«                                                        └───┘ └──────────────┘»\n",
       "«   q_4: ──────────────────────────────────────────────────────────────────────»\n",
       "«                                                                              »\n",
       "«meas: 5/══════════════════════════════════════════════════════════════════════»\n",
       "«                                                                              »\n",
       "«                                                        ┌───────────────┐ ░ »\n",
       "«   q_0: ──■─────────────────────■────────────────────■──┤ R(2.0*β[1],0) ├─░─»\n",
       "«          │                     │                    │  └───────────────┘ ░ »\n",
       "«   q_1: ──┼─────────────────────┼────────────────────┼────────────────────░─»\n",
       "«          │                     │                    │                    ░ »\n",
       "«   q_2: ──┼─────────────────────┼────────────────────┼────────────────────░─»\n",
       "«        ┌─┴─┐┌───────────────┐  │                    │                    ░ »\n",
       "«   q_3: ┤ X ├┤ R(2.0*β[1],0) ├──┼────────────────────┼────────────────────░─»\n",
       "«        └───┘└───────────────┘┌─┴─┐┌──────────────┐┌─┴─┐┌───────────────┐ ░ »\n",
       "«   q_4: ──────────────────────┤ X ├┤ Rz(1.0*γ[1]) ├┤ X ├┤ R(2.0*β[1],0) ├─░─»\n",
       "«                              └───┘└──────────────┘└───┘└───────────────┘ ░ »\n",
       "«meas: 5/════════════════════════════════════════════════════════════════════»\n",
       "«                                                                            »\n",
       "«        ┌─┐            \n",
       "«   q_0: ┤M├────────────\n",
       "«        └╥┘┌─┐         \n",
       "«   q_1: ─╫─┤M├─────────\n",
       "«         ║ └╥┘┌─┐      \n",
       "«   q_2: ─╫──╫─┤M├──────\n",
       "«         ║  ║ └╥┘┌─┐   \n",
       "«   q_3: ─╫──╫──╫─┤M├───\n",
       "«         ║  ║  ║ └╥┘┌─┐\n",
       "«   q_4: ─╫──╫──╫──╫─┤M├\n",
       "«         ║  ║  ║  ║ └╥┘\n",
       "«meas: 5/═╩══╩══╩══╩══╩═\n",
       "«         0  1  2  3  4 
" ], "text/plain": [ " ┌─────────────┐ »\n", " q_0: ┤ U3(π/2,0,π) ├──■────────────────────■─────────────────────■──»\n", " ├─────────────┤┌─┴─┐┌──────────────┐┌─┴─┐┌───────────────┐ │ »\n", " q_1: ┤ U3(π/2,0,π) ├┤ X ├┤ Rz(1.0*γ[0]) ├┤ X ├┤ R(2.0*β[0],0) ├──┼──»\n", " ├─────────────┤└───┘└──────────────┘└───┘└───────────────┘┌─┴─┐»\n", " q_2: ┤ U3(π/2,0,π) ├───────────────────────────────────────────┤ X ├»\n", " ├─────────────┤ └───┘»\n", " q_3: ┤ U3(π/2,0,π) ├────────────────────────────────────────────────»\n", " ├─────────────┤ »\n", " q_4: ┤ U3(π/2,0,π) ├────────────────────────────────────────────────»\n", " └─────────────┘ »\n", "meas: 5/═══════════════════════════════════════════════════════════════»\n", " »\n", "« »\n", "« q_0: ──────────────────■─────────────────────■────────────────────■──»\n", "« │ │ │ »\n", "« q_1: ──────────────────┼─────────────────────┼────────────────────┼──»\n", "« ┌──────────────┐┌─┴─┐┌───────────────┐ │ │ »\n", "« q_2: ┤ Rz(1.0*γ[0]) ├┤ X ├┤ R(2.0*β[0],0) ├──┼────────────────────┼──»\n", "« └──────────────┘└───┘└───────────────┘┌─┴─┐┌──────────────┐┌─┴─┐»\n", "« q_3: ──────────────────────────────────────┤ X ├┤ Rz(1.0*γ[0]) ├┤ X ├»\n", "« └───┘└──────────────┘└───┘»\n", "« q_4: ────────────────────────────────────────────────────────────────»\n", "« »\n", "«meas: 5/════════════════════════════════════════════════════════════════»\n", "« »\n", "« ┌───────────────┐ »\n", "« q_0: ───────────────────■────────────────────■──┤ R(2.0*β[0],0) ├──■──»\n", "« │ │ └───────────────┘┌─┴─┐»\n", "« q_1: ───────────────────┼────────────────────┼───────────────────┤ X ├»\n", "« │ │ └───┘»\n", "« q_2: ───────────────────┼────────────────────┼────────────────────────»\n", "« ┌───────────────┐ │ │ »\n", "« q_3: ┤ R(2.0*β[0],0) ├──┼────────────────────┼────────────────────────»\n", "« └───────────────┘┌─┴─┐┌──────────────┐┌─┴─┐┌───────────────┐ »\n", "« q_4: ─────────────────┤ X ├┤ Rz(1.0*γ[0]) ├┤ X ├┤ R(2.0*β[0],0) ├─────»\n", "« └───┘└──────────────┘└───┘└───────────────┘ »\n", "«meas: 5/═════════════════════════════════════════════════════════════════»\n", "« »\n", "« »\n", "« q_0: ──────────────────■────■─────────────────────■────■───────────────────»\n", "« ┌──────────────┐┌─┴─┐ │ ┌───────────────┐ │ │ »\n", "« q_1: ┤ Rz(1.0*γ[1]) ├┤ X ├──┼──┤ R(2.0*β[1],0) ├──┼────┼───────────────────»\n", "« └──────────────┘└───┘┌─┴─┐└┬──────────────┤┌─┴─┐ │ ┌───────────────┐»\n", "« q_2: ─────────────────────┤ X ├─┤ Rz(1.0*γ[1]) ├┤ X ├──┼──┤ R(2.0*β[1],0) ├»\n", "« └───┘ └──────────────┘└───┘┌─┴─┐└┬──────────────┤»\n", "« q_3: ────────────────────────────────────────────────┤ X ├─┤ Rz(1.0*γ[1]) ├»\n", "« └───┘ └──────────────┘»\n", "« q_4: ──────────────────────────────────────────────────────────────────────»\n", "« »\n", "«meas: 5/══════════════════════════════════════════════════════════════════════»\n", "« »\n", "« ┌───────────────┐ ░ »\n", "« q_0: ──■─────────────────────■────────────────────■──┤ R(2.0*β[1],0) ├─░─»\n", "« │ │ │ └───────────────┘ ░ »\n", "« q_1: ──┼─────────────────────┼────────────────────┼────────────────────░─»\n", "« │ │ │ ░ »\n", "« q_2: ──┼─────────────────────┼────────────────────┼────────────────────░─»\n", "« ┌─┴─┐┌───────────────┐ │ │ ░ »\n", "« q_3: ┤ X ├┤ R(2.0*β[1],0) ├──┼────────────────────┼────────────────────░─»\n", "« └───┘└───────────────┘┌─┴─┐┌──────────────┐┌─┴─┐┌───────────────┐ ░ »\n", "« q_4: ──────────────────────┤ X ├┤ Rz(1.0*γ[1]) ├┤ X ├┤ R(2.0*β[1],0) ├─░─»\n", "« └───┘└──────────────┘└───┘└───────────────┘ ░ »\n", "«meas: 5/════════════════════════════════════════════════════════════════════»\n", "« »\n", "« ┌─┐ \n", "« q_0: ┤M├────────────\n", "« └╥┘┌─┐ \n", "« q_1: ─╫─┤M├─────────\n", "« ║ └╥┘┌─┐ \n", "« q_2: ─╫──╫─┤M├──────\n", "« ║ ║ └╥┘┌─┐ \n", "« q_3: ─╫──╫──╫─┤M├───\n", "« ║ ║ ║ └╥┘┌─┐\n", "« q_4: ─╫──╫──╫──╫─┤M├\n", "« ║ ║ ║ ║ └╥┘\n", "«meas: 5/═╩══╩══╩══╩══╩═\n", "« 0 1 2 3 4 " ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# QAOA ansatz circuit\n", "qaoa_circuit = QAOAAnsatz(hamiltonian, reps=2)\n", "qaoa_circuit.measure_all()\n", "qaoa_circuit.decompose(reps=3).draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Setting up the Estimator and Sampler" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "quantum_backend = AerSimulator()\n", "\n", "# Set the transpiler\n", "pm = generate_preset_pass_manager(backend=quantum_backend, optimization_level=0)\n", "\n", "# Set the Estimator and Sampler\n", "estimator = Estimator(quantum_backend)\n", "sampler = Sampler(quantum_backend)" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "is_executing": true } }, "source": [ "#### Defining the cost function to be minimized" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "pycharm": { "is_executing": true } }, "outputs": [], "source": [ "def cost_function(params, circuit, hamiltonian, estimator, pm):\n", " # Transpile the circuit to ISA circuit\n", " params = cp.asnumpy(params)\n", " circuit_isa = pm.run(circuit)\n", " hamiltonian_isa = hamiltonian.apply_layout(circuit_isa.layout)\n", " pub = (circuit_isa, [hamiltonian_isa], [params])\n", "\n", " # Submit the circuit to estimator and get the result\n", " result = estimator.run(pubs=[pub]).result()\n", "\n", " # Extract the expectation value\n", " cost = result[0].data.evs[0]\n", " return cost" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Setting up the problem" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "cost_func = partial(cost_function, circuit=qaoa_circuit, hamiltonian=hamiltonian, estimator=estimator, pm=pm)\n", "problem = Problem(n_params=qaoa_circuit.num_parameters, param_bounds=qaoa_circuit.parameter_bounds,\n", " init_range=(0, 2* cp.pi), obj_function=cost_func, backend='gpu', vectorized=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Defining the CHC algorithm" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "optimizer = CHC(crossover=cx_blx_alpha, distance=fitness_l1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Training the QAOA circuit" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Fitness Evaluations: 18%|███▏ | 18/100 [00:00<00:00, 130.30nfev/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "********** Execution #1 **********\n", "gen nfev min max mean std\n", "----- ------ -------- -------- --------- --------\n", "0 10 -1.01929 0.398193 -0.397485 0.404733\n", "\n", "1 2 -1.01929 0.398193 -0.397485 0.404733\n", "\n", "2 6 -1.01929 -0.180908 -0.513013 0.278676\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Fitness Evaluations: 32%|██████ | 32/100 [00:00<00:00, 91.84nfev/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "3 6 -1.01929 -0.374512 -0.738574 0.230201\n", "\n", "4 4 -1.01929 -0.499756 -0.789917 0.198326\n", "\n", "5 2 -1.01929 -0.559326 -0.810059 0.176906\n", "\n", "6 2 -1.01929 -0.559326 -0.810059 0.176906\n", "\n", "7 4 -1.01929 -0.5625 -0.850708 0.160571\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Fitness Evaluations: 56%|██████████▋ | 56/100 [00:00<00:00, 79.03nfev/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "8 6 -1.01929 -0.61084 -0.878979 0.129153\n", "\n", "9 4 -1.01929 -0.660889 -0.883984 0.119255\n", "\n", "10 2 -1.01929 -0.660889 -0.883984 0.119255\n", "\n", "11 8 -1.01929 -0.701172 -0.894385 0.102736\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Fitness Evaluations: 79%|███████████████ | 79/100 [00:00<00:00, 76.97nfev/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "12 10 -1.01929 -0.841797 -0.938281 0.0651745\n", "\n", "13 13 -1.01929 0.190186 -0.485571 0.35726\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Fitness Evaluations: 99%|██████████████████▊| 99/100 [00:01<00:00, 77.06nfev/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "14 8 -1.01929 -0.227051 -0.597925 0.29594\n", "\n", "15 0 -1.01929 -0.227051 -0.597925 0.29594\n", "\n", "16 6 -1.40649 -0.386475 -0.795483 0.271876\n", "\n", "17 6 -1.5061 -0.566162 -0.907983 0.307864\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Fitness Evaluations: 105nfev [00:01, 80.39nfev/s] " ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "18 6 -1.5061 -0.566162 -0.907983 0.307864\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "data": { "text/plain": [ " fun: array(-1.50610352)\n", " gen: 19\n", " log: {'gen': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], 'nfev': [10, 2, 6, 6, 4, 2, 2, 4, 6, 4, 2, 8, 10, 13, 8, 0, 6, 6, 6], 'min': [array(-1.01928711), array(-1.01928711), array(-1.01928711), array(-1.01928711), array(-1.01928711), array(-1.01928711), array(-1.01928711), array(-1.01928711), array(-1.01928711), array(-1.01928711), array(-1.01928711), array(-1.01928711), array(-1.01928711), array(-1.01928711), array(-1.01928711), array(-1.01928711), array(-1.40649414), array(-1.50610352), array(-1.50610352)], 'max': [array(0.39819336), array(0.39819336), array(-0.1809082), array(-0.37451172), array(-0.49975586), array(-0.55932617), array(-0.55932617), array(-0.5625), array(-0.61083984), array(-0.66088867), array(-0.66088867), array(-0.70117188), array(-0.84179688), array(0.19018555), array(-0.22705078), array(-0.22705078), array(-0.38647461), array(-0.56616211), array(-0.56616211)], 'mean': [array(-0.39748535), array(-0.39748535), array(-0.5130127), array(-0.73857422), array(-0.78991699), array(-0.81005859), array(-0.81005859), array(-0.85070801), array(-0.87897949), array(-0.88398438), array(-0.88398438), array(-0.89438477), array(-0.93828125), array(-0.48557129), array(-0.5979248), array(-0.5979248), array(-0.7954834), array(-0.9079834), array(-0.9079834)], 'std': [array(0.40473292), array(0.40473292), array(0.27867585), array(0.23020122), array(0.19832642), array(0.17690649), array(0.17690649), array(0.16057095), array(0.12915256), array(0.11925523), array(0.11925523), array(0.10273635), array(0.06517446), array(0.35725997), array(0.29594042), array(0.29594042), array(0.27187597), array(0.30786416), array(0.30786416)]}\n", " nfev: 105\n", " x: array([5.11467318, 4.10246673, 4.38589537, 3.07366605])" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res = optimizer.optimize(problem, 10, max_nfev=100, seed=42)\n", "res" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Testing the optimal angles found" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/png": "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7rk7p2ORGtOzZ8/g7OyMmJgY9fe3LsVuD9CECRMwadIk9aGs2rVr4/79+5gzZw4GDBgAV1dXAMDjx481CqDHjx+jbt26WT6vtbU1rK2ttdotLS1haWmp0WZubg5zc3OtddPf3Lltz/y8+rbrWm5mZgYzM+1z3LPKvSiNKavcOSaOKbt2jolj4pgKf0y6KBSKYjEmrTxytVYRkpiYqLXhzM3N1dWhp6cnXF1dcfjwYfXy2NhY/PHHHwgKCjJorkRERFQ0Fbs9QJ07d8asWbPg5uaGmjVr4tKlS1i0aBEGDx4M4FUlOmbMGMycORNeXl7w9PTElClTUKFCBXTt2tW4yRMREVGRUOwKoK+//hpTpkzBhx9+iKioKFSoUAHvv/8+pk6dql7n448/RkJCAoYNG4YXL16gSZMm2LdvH0qUKGHEzImIiKioKHYnQRtKbGwsHB0dczyJytA8Ju3Octm9uSEGzISIiExFcfruye33d7E7B4iIiIgov1gAERERkclhAUREREQmhwUQERERmRwWQERERGRyWAARERGRyWEBRERERCaHBRARERGZHBZAREREZHJYABEREZHJYQFEREREJocFEBEREZkcFkBERERkclgAERERkclhAUREREQmhwUQERERmRwWQJStuXPnQqFQYMyYMeq2pKQkhIaGwtnZGXZ2dujevTseP35svCSJiIjyiAUQZen8+fP4/vvv4efnp9E+duxY/Pbbb9i8eTOOHz+OiIgIdOvWzUhZEhER5R0LINIpPj4effv2xY8//ojSpUur22NiYrBixQosWrQILVu2RP369bFq1SqcPn0aZ8+eNWLGREREuccCiHQKDQ1FSEgIWrdurdF+8eJFpKamarTXqFEDbm5uOHPmjKHTJCIi0ouFsROgomfjxo34888/cf78ea1lkZGRsLKyQqlSpTTay5Urh8jISANlSERElD8sgEhDeHg4Ro8ejYMHD6JEiRLGToeIiKhQ8BAYabh48SKioqJQr149WFhYwMLCAsePH8dXX30FCwsLlCtXDikpKXjx4oVG3OPHj+Hq6mqcpImIiPKIe4BIQ6tWrXDlyhWNtkGDBqFGjRqYOHEiKleuDEtLSxw+fBjdu3cHANy8eRMPHjxAUFCQMVImIiLKM+4BIg329vaoVauWxj9bW1s4OzujVq1acHR0xJAhQzBu3DgcPXoU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", "text/plain": [ "
" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Transpile the circuit to ISA circuit\n", "params = cp.asnumpy(res.x)\n", "qaoa_isa = pm.run(qaoa_circuit)\n", "pub = (qaoa_isa, params)\n", "\n", "# Submit the circuit to sampler\n", "job = sampler.run([pub])\n", "\n", "# Collect data to get the counts\n", "pub_results = job.result()[0]\n", "counts = pub_results.data.meas.get_counts()\n", "\n", "plot_histogram(counts, title='Distribution of the final counts')" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimal solution: [0 1 1 1 1]\n" ] } ], "source": [ "bitstring = maxcut_prob.sample_most_likely(counts)\n", "print('Optimal solution: ', bitstring)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAApQAAAHzCAYAAACe1o1DAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVRZJREFUeJzt3XdclXXj//HXAdzmTFPTypFm7iizLBFEcWG4J7lSc2XukVsEFbei4t5mqCSioAKKlubeM0u9TSX3Fgec3x/cd7++5T7Adcb7+Xjw0OC6rvPmvtXz5nN9Pp/LZDabzYiIiIiIvCInowOIiIiIiG1ToRQRERERi6hQioiIiIhFVChFRERExCIqlCIiIiJiERVKEREREbGICqWIiIiIWESFUkREREQsokIpIiIiIhZRoRQRERERi6hQioiIiIhFVChFRERExCIqlCIiIiJiERVKEREREbGICqWIiIiIWESFUkREREQsokIpIiIiIhZRoRQRERERi6hQioiIiIhFVChFRERExCIqlCIiIiJiERVKEREREbGICqWIiIiIWESFUkREREQsokIpIiIiIhZRoRQRERERi6hQioiIiIhFVChFRERExCIqlCIiIiJiERVKEREREbGICqWIiIiIWESFUkREREQsokIpIiIiIhZRoRQRERERi6hQioiIiIhFVChFRERExCIuRgcQERER6/XoEdy9C87OkCkTOGkoSp5AfyxERETkLwkJsG4dtGkDxYtD+vSQPTtkyZL08fnn0L8/nDxpdFKxJiaz2Ww2OoSIiIgYy2yGBQtg8GA4dw5cXODx4ycf+7+vVakCEydCyZKpGlWskAqliIiIg7t4EVq3hvXrX+48Z2cwmWDYMOjXT7fDHZkKpYiIiAM7fRoqVYK4uKePSL6I5s2TRjidnZMvm9gO/SwhIiLioK5cATc3y8skwNKl0KVL8uQS26NCKSIi4qA6d4YLFywvk5A0B3PGDFizxvJrie1RoRQREXFAq1fDDz8krep+sl1AF6AEkAl4C2gEPH15t5MTtG0Lt24lc1ixeiqUIiIiDmjkyOctohkNrASqAJOA9sAW4APg8BPPSExMuo2+aFHyZhXrp0U5IiIiDmb/fihX7nlHbQM+BNL+7XO/AqWABsDiJ55lMsG778Lx40m/F8egEUoREREHEx7+IquxP+X/lkmAd0m6BX7s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3z7mzJnDli1beO+99+jZsyfXrl0zOlqKGzt2LAMGDGDo0KEMGDDA6DgiIslCi3JExFB3795lwoQJjB49GhcXFwYOHEiXLl1Ily6d0dGS3aRJk/j2228ZMGAAfn5+mEwmoyOJiCQLFUoRsQp//vknw4YNY+bMmRQoUAB/f38aN26Mk5N93EiZNm0anTt3pnfv3owePVplUkTsin38Sy0iNu+NN95g2rRpHD58mDJlytCsWTMqVKjAli1bjI5msZkzZ9K5c2e+/fZblUkRsUsqlCJiVd577z1+/PFHYmNjAXBzc+OLL77g+PHjBid7NfPmzaNDhw506dKF8ePHq0yKiF1SoRQRq1SpUiV++eUXli1bxsGDBylZsiSdOnXizz//NDraC1u0aBFt27alQ4cOTJ48WWVSROyW5lCKiNV78OABU6dOxc/Pj8ePH9O3b1969OhBxowZjY72VMuWLaNFixa0bt2amTNn2s1cUBGRJ1GhFBGbce3aNUaOHMnUqVN5/fXX8fPz48svv8TZ2dnoaP/HihUraNKkCc2bN2fevHkqkyJi9/SvnIjYjBw5cjBu3DiOHTvG559/Tps2bShXrhzr1683OtpfVq9eTdOmTWnUqBFz585VmRQRh6ARShGxWTt37qRXr15s3bqVqlWrEhgYSJkyZSy76O3bsHs37NkDp0/Do0eQKROUKAEffgilSsFTRkTDw8OpV68ePj4+LF26FBcXF8uyiIjYCBVKEbFpZrOZsLAw+vbty8mTJ/nyyy/x8/Mjf/78L3eh/fthyhRYsgQePAAnp6TiaDaDyZRULAHy5YPOnaFdO8iV66/TIyMj+eKLL6hVqxbLly8nTZo0yfdNiohYORVKEbELjx49Yvbs2QwZMoTbt2/To0cP+vbtS5YsWZ594t270L9/Upl0cYHHj5//Yk5OkDkzTJsGzZoRFR1N7dq1qVatGitWrCBt2rTJ802JiNgIFUoRsSu3bt1izJgxjB8/nsyZMzNkyBDat2//5BHD338HT084exYSE1/uhUwmMJv508ODotu2UdHdndDQULt8ZKSIyPOoUIqIXfrjjz8YPHgw8+fP591332X06NF88cUX/38vyDNnoEIFuHr1xUYlnyIB+CVXLlx//530mTMnS3YREVuj5YciYpfy58/P3Llz2bdvH++88w5169alUqVK7NixI2k+pLe3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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "maxcut_prob.draw(bitstring)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Train Variational Quantum Classifiers by using f-evovaq and PennyLane\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Importing modules" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import cupy as cp\n", "from functools import partial\n", "from sklearn.datasets import load_iris\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import log_loss, accuracy_score\n", "from sklearn.preprocessing import MinMaxScaler\n", "from fevovaq.problem import Problem\n", "from fevovaq.GeneticAlgorithm import GA\n", "from fevovaq.tools.operators import sel_tournament, cx_uniform, mut_gaussian\n", "import pennylane as qml" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Defining functions" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def setup_pennylane_circuit(n_qubits, reps):\n", " dev = qml.device(\"default.qubit\", wires=n_qubits)\n", "\n", " @qml.qnode(dev, interface=None, diff_method=None)\n", " def circuit(inputs, weights):\n", " weights = cp.asnumpy(weights)\n", " qml.AngleEmbedding(inputs, wires=range(n_qubits), rotation='Y')\n", " weights = weights.reshape(reps, n_qubits, 3)\n", " qml.StronglyEntanglingLayers(weights, wires=range(n_qubits))\n", " return qml.probs(wires=0)\n", "\n", " return circuit\n", "\n", "\n", "def cost_function(params, qnode, train_data, train_labels):\n", " \"\"\"\n", " Compute the probability of being in state |1> and use it to compute log_loss.\n", " \"\"\"\n", " probs = qnode(train_data, params)\n", " return log_loss(train_labels, probs[:, 1])\n", "\n", "\n", "def get_label(params, qnode, test_data):\n", " \"Predict label for each test istance\"\n", " probs = qnode(test_data, params)\n", "\n", " return 1 if probs[1] > 0.5 else 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Loading dataset and quantum model" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of parameters involved: 60\n" ] } ], "source": [ "data = load_iris()\n", "features = data.data[:100, :]\n", "target = data.target[:100] # 0 or 1\n", "\n", "train_data, test_data, train_labels, test_labels = train_test_split(features, target, test_size=0.3,\n", " random_state=123, stratify=target)\n", "\n", "# Pre-processing\n", "scaler = MinMaxScaler(feature_range=(-np.pi, np.pi))\n", "scaler.fit(train_data)\n", "train_data = scaler.transform(train_data)\n", "test_data = scaler.transform(test_data)\n", "\n", "n_qubits = train_data.shape[1] # Number of qubits\n", "qnode = setup_pennylane_circuit(n_qubits, 5)\n", "\n", "n_params = 5 * n_qubits * 3 # Number of trainable parameters\n", "print('Number of parameters involved: {}'.format(n_params))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Setting up the problem and optimizer" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "cost_func = partial(cost_function, qnode=qnode,\n", " train_data=train_data, train_labels=train_labels)\n", "\n", "problem = Problem(n_params=n_params, param_bounds=(- cp.pi, cp.pi), init_range=(- cp.pi, cp.pi), obj_function=cost_func, backend='gpu', vectorized=False)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "optimizer = GA(\n", " selection=sel_tournament,\n", " crossover=cx_uniform,\n", " mutation=mut_gaussian,\n", " cxpb=0.9,\n", " mut_indpb=0.25\n", ")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Training the quantum classifier" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Generations: 10%|███ | 2/20 [00:00<00:00, 19.65gen/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "********** Execution #1 **********\n", "gen nfev min max mean std\n", "----- ------ -------- -------- -------- ---------\n", "0 10 0.650329 0.947386 0.747862 0.0918746\n", "\n", "1 10 0.64318 0.912444 0.72793 0.0802623\n", "\n", "2 10 0.601074 0.72883 0.662113 0.0372224\n", "\n", "3 10 0.601074 0.800428 0.677 0.0634095\n", "\n", "4 10 0.601074 0.902105 0.721889 0.100713\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Generations: 40%|████████████ | 8/20 [00:00<00:00, 20.03gen/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "5 10 0.598125 0.839488 0.702297 0.0793839\n", "\n", "6 10 0.598125 0.881257 0.72386 0.08676\n", "\n", "7 10 0.481134 0.798423 0.666046 0.0983832\n", "\n", "8 10 0.425562 0.76862 0.580563 0.0991216\n", "\n", "9 10 0.425562 0.816829 0.635246 0.152609\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Generations: 65%|██████████████████▊ | 13/20 [00:00<00:00, 19.97gen/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "10 10 0.40962 0.843335 0.642727 0.152564\n", "\n", "11 10 0.40962 0.927286 0.697986 0.14453\n", "\n", "12 10 0.40962 0.851464 0.643269 0.125917\n", "\n", "13 10 0.40962 0.727623 0.580227 0.113876\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Generations: 80%|███████████████████████▏ | 16/20 [00:00<00:00, 20.02gen/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "14 10 0.40962 0.831035 0.678999 0.11337\n", "\n", "15 10 0.40962 0.731908 0.585875 0.11345\n", "\n", "16 10 0.403068 0.87274 0.636615 0.157095\n", "\n", "17 10 0.403068 0.883448 0.666935 0.130822\n", "\n", "18 10 0.403068 0.916513 0.664277 0.139977\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Generations: 100%|█████████████████████████████| 20/20 [00:00<00:00, 20.01gen/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "19 10 0.403068 0.973204 0.666048 0.168796\n", "\n", "20 10 0.403068 0.907873 0.733743 0.140554\n" ] }, { "data": { "text/plain": [ " fun: array(0.40306812)\n", " gen: 20\n", " log: {'gen': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], 'nfev': [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10], 'min': [array(0.65032899), array(0.64318014), array(0.60107355), array(0.60107355), array(0.60107355), array(0.59812518), array(0.59812518), array(0.48113362), array(0.42556227), array(0.42556227), array(0.40962049), array(0.40962049), array(0.40962049), array(0.40962049), array(0.40962049), array(0.40962049), array(0.40306812), array(0.40306812), array(0.40306812), array(0.40306812), array(0.40306812)], 'max': [array(0.94738568), array(0.91244404), array(0.72883022), array(0.80042805), array(0.90210504), array(0.83948786), array(0.88125667), array(0.79842266), array(0.76862013), array(0.81682863), array(0.84333495), array(0.92728622), array(0.85146369), array(0.72762343), array(0.83103504), array(0.73190822), array(0.87274045), array(0.88344844), array(0.91651345), array(0.97320435), array(0.90787308)], 'mean': [array(0.74786231), array(0.7279299), array(0.66211314), array(0.67700046), array(0.72188874), array(0.70229746), array(0.72385966), array(0.66604589), array(0.58056319), array(0.63524576), array(0.64272742), array(0.69798579), array(0.64326899), array(0.58022692), array(0.67899866), array(0.58587547), array(0.63661526), array(0.66693506), array(0.66427675), array(0.66604819), array(0.7337426)], 'std': [array(0.09187462), array(0.08026233), array(0.03722244), array(0.06340954), array(0.10071281), array(0.07938394), array(0.08676), array(0.09838319), array(0.09912159), array(0.15260851), array(0.1525639), array(0.14452978), array(0.12591695), array(0.11387558), array(0.11337005), array(0.1134497), array(0.15709521), array(0.1308217), array(0.13997732), array(0.16879555), array(0.1405539)]}\n", " nfev: 210\n", " x: array([ 0.54125542, 3.14159274, -0.24208669, 2.68002074, -2.46419543,\n", " 2.3696741 , -2.97896107, 2.53024464, 1.41391799, 0.71072874,\n", " -1.138851 , 2.7430523 , 1.45057536, -1.89663949, 1.19214558,\n", " -0.61467061, -3.06813588, 0.60285057, -1.15169006, -3.14159274,\n", " -2.63604459, -0.43330107, -2.51216369, 3.14159274, 1.36701213,\n", " 0.69040062, 3.14159274, 0.31957977, -2.23431185, -0.97491111,\n", " 1.45299636, 1.72479951, 2.18279218, -3.14159274, 1.67944417,\n", " 0.17446883, 3.14159274, 1.30357679, 3.14159274, 2.30240089,\n", " 0.35430314, -0.66196917, -1.19970214, -3.1256582 , 3.14159274,\n", " -0.35936334, -1.77529513, 0.57313125, -2.31104951, -1.51527373,\n", " 0.2068915 , -0.86823637, -1.44865689, -3.14159274, 2.5004251 ,\n", " 3.14159274, -2.3795737 , -1.17744205, 0.99007205, 2.57084034])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res = optimizer.optimize(problem, pop_size=10, max_gen=20, seed=1, verbose=True)\n", "res" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Testing the obtained solution" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Test accuracy 0.9333333333333333\n" ] } ], "source": [ "test_preds = [get_label(res.x, qnode, feats) for feats in test_data]\n", "\n", "test_accuracy = accuracy_score(test_labels, test_preds)\n", "print(\"Test accuracy\", test_accuracy)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.14" } }, "nbformat": 4, "nbformat_minor": 4 }