From ee86b373cc46939ba9fc76f3d09fcf3d9a2ebcba Mon Sep 17 00:00:00 2001 From: Oguzcan Kirmemis Date: Fri, 19 Nov 2021 06:14:48 +0300 Subject: [PATCH] Added WS-QAOA/R-WS-QAOA Demo Notebook Signed-off-by: Oguzcan Kirmemis --- Project.toml | 8 +- examples/img/wsqaoa-circuit.png | Bin 0 -> 60356 bytes examples/img/wsqaoa-cube.png | Bin 0 -> 52373 bytes examples/img/wsqaoa-neg-pos.png | Bin 0 -> 75271 bytes examples/wsqaoa_example.ipynb | 5266 +++++++++++++++++++++++++++++++ src/flux_integration.jl | 10 +- 6 files changed, 5280 insertions(+), 4 deletions(-) create mode 100644 examples/img/wsqaoa-circuit.png create mode 100644 examples/img/wsqaoa-cube.png create mode 100644 examples/img/wsqaoa-neg-pos.png create mode 100644 examples/wsqaoa_example.ipynb diff --git a/Project.toml b/Project.toml index 6333016..b56d1bb 100644 --- a/Project.toml +++ b/Project.toml @@ -5,8 +5,12 @@ version = "0.1.0" [deps] Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" +GPUCompiler = "61eb1bfa-7361-4325-ad38-22787b887f55" IterTools = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +LLVM = "929cbde3-209d-540e-8aea-75f648917ca0" +LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +MaxCut = "6af15267-3226-46fb-9d72-8bee1ad40623" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" Qaintessent = "9e6618a4-6605-11ea-2880-e931cf774ea8" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" @@ -14,9 +18,7 @@ Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" [compat] Flux = "0.12.1" -Zygote = "0.6.11" IterTools = "1.3.0" -Qaintessent = "0.1.1, 0.1.2" Plots = "1.15.3" +Zygote = "0.6.11" julia = "1.6.1, 1.6.0" - diff --git a/examples/img/wsqaoa-circuit.png b/examples/img/wsqaoa-circuit.png new file mode 100644 index 0000000000000000000000000000000000000000..21eb9c19f1514b8d12fa4bc5d8f2aa6f59e776cf GIT binary patch literal 60356 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%0AfBy6T?pt>9_;@D9`d0apo9Iz6 MR5X;6_8q_QKlo3=VgLXD literal 0 HcmV?d00001 diff --git a/examples/img/wsqaoa-cube.png b/examples/img/wsqaoa-cube.png new file mode 100644 index 0000000000000000000000000000000000000000..cf50eca9e29b4094abe7dfc8bef1a807ae7695a8 GIT binary patch literal 52373 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 z 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 Vy-Y%>!|DJ4002ovPDHLkV1hf)^`rm* literal 0 HcmV?d00001 diff --git a/examples/img/wsqaoa-neg-pos.png b/examples/img/wsqaoa-neg-pos.png new file mode 100644 index 0000000000000000000000000000000000000000..be635c639cfc5b53e8c86727809a0ec15cb25a72 GIT binary patch literal 75271 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 bYV0GbNPfUhKtwq06X2&LuPO(VF$wyA(Gdcm literal 0 HcmV?d00001 diff --git a/examples/wsqaoa_example.ipynb b/examples/wsqaoa_example.ipynb new file mode 100644 index 0000000..d24a378 --- /dev/null +++ b/examples/wsqaoa_example.ipynb @@ -0,0 +1,5266 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Qaintellect implementation of the Warm-Start Quantum Optimization Algorithm (WS-QAOA, R-WS-QAOA)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this example, we implement the optimization of a circuit based on the QAOA algorithm using a warm-start, demonstrated via the Max-Cut problem. Ideally the warm start is close to the optimal solution, which would lead to faster and better convergence than using normal QAOA. \n", + "\n", + "This notebook requires basic knowledge of the QAOA algorithm, which you can find on the other example notebook: 'qaoa_example.ipynb'\n", + "\n", + "Reference:\n", + "- Egger, Daniel J., Jakub Mareček, and Stefan Woerner “Warm-starting quantum optimization” Quantum 5 (June 2021): 479. [doi:10.22331](https://doi.org/10.22331/q-2021-06-17-479E) (2021)\n", + "\n", + "A WS-QAOA circuit for the Max-Cut problem looks like this:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\"N=8\"\n",\n", + "\n", + "The circuit of WS-QAOA is very similar to normal QAOA, the only change being the mixer gate and the preparation of the starting state.\n", + "We encode our warm-starting point using the angle θ:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\\begin{equation}\n", + "\\theta_i = 2 \\; arcsin(\\sqrt{c^{*}_i}) \\: \\textrm{if} \\: c^{*}_i \\in [\\epsilon, 1 - \\epsilon] \\\\\n", + "\\theta_i = 2 \\; arcsin(\\sqrt{\\epsilon}) \\: \\textrm{if} \\: c^{*}_i \\le \\epsilon \\\\\n", + "\\theta_i = 2 \\; arcsin(\\sqrt{1 - \\epsilon}) \\: \\textrm{if} \\: c^{*}_i \\ge 1 - \\epsilon \\\\\n", + "\\textrm{where} \\: c^{*}_i \\: \\textrm{is our warm-starting point and } \\hat{H_c} \\: \\textrm{is our already known cost operator from standard QAOA} \n", + "\\end{equation}\n", + "\n", + "The mixer gate is shown as a YZ-Decomposition of the following gate, and has our warm-start as an eigenstate:\n", + "(Details of why both representation equal to each other can be inspected at the original paper.\n", + "\n", + "\\begin{equation}\n", + "\\hat{H_M^{(ws)}} = \\sum_{i=0}^{n-1} \\hat{H_M^{(ws), i}} \\: \\textrm{where:} \\\\\n", + "\\hat{H_M^{(ws), i}} = \\big(\\begin{matrix} 2c_i^{*}-1 & -2\\sqrt{c_i^{*}(1-c_i^{*})} \\\\ -2\\sqrt{c_i^{*}(1-c_i^{*})} & 1-2c_i^{*} \\end{matrix}\\big)\n", + "\\end{equation}\n", + "\n", + " A nice property of this matrix is the fact that at ε = 0.5, the gate is mapped back to an X-Mixer gate, so it becomes essentially same as standard QAOA.\n", + " \n", + " Furthermore if the warm-starting point is rounded prior to the algorithm, the sign of the rotations in the mixer gate can be reversed to retain the original solution back. It might be the case that the original solution is actually closer to the optimal solution. Note however, the initial state is no longer the eigenstate of the mixer matrix, so the convergence is no longer guarenteed.\n", + " \n", + " For the implementation details of recursive WS-QAOA, please refer to Appendix E and G in the aforementioned paper. The main idea is to compute the correlation between nodes to find the maximum dependence between two nodes. This is used to reduce the graph into a smaller one. The procedure is then repeated until the graph is sufficiently small. To get back a solution to the original graph from the recursive call, we look at the maximum correlating edge. If the correlator is plus, that means the nodes in those edges must be in the same partition. If not, then they must be separated. In a sense, this can be seen as a greedy approach in a classical algorithm.\n", + " \n", + " Now let us take a look at the implementation of this gate in Qaintum. All the necessary gates are already implemented in the Qaintessent module, all we need to is to setup the initial state and optimize the circuit." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "using Qaintessent\n", + "using Qaintessent.MaxCutWSQAOA\n", + "using Qaintessent.QAOAHelperDataStructs\n", + "using Qaintellect\n", + "using LinearAlgebra\n", + "using Flux\n", + "using IterTools: ncycle\n", + "using MaxCut" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# visualization\n", + "using Plots\n", + "using LaTeXStrings" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "cut_size (generic function with 2 methods)" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function cut_size(graph::EdgeWeightedGraph, (partition1, partition2)::Tuple{Vector{Int64}, Vector{Int64}})\n", + " cutsize = 0.0\n", + " for ((v1, v2), w) in graph.edges\n", + " if (v1 ∈ partition1 && v2 ∈ partition2) || (v2 ∈ partition1 && v1 ∈ partition2)\n", + " cutsize += w\n", + " end\n", + " end\n", + " return cutsize\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "plot_result (generic function with 1 method)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function plot_result(result::Vector{ComplexF64})\n", + " result_arg_sorted = sortperm(abs2.(result))\n", + " first_arg = result_arg_sorted[length(result_arg_sorted)]\n", + " second_arg = result_arg_sorted[length(result_arg_sorted) - 1]\n", + " third_arg = result_arg_sorted[length(result_arg_sorted) - 2]\n", + " probs = [abs2(result[first_arg]), abs2(result[second_arg]), abs2(result[third_arg])]\n", + " tags = [join(reverse(digits(first_arg-1, pad = n, base = 2))), join(reverse(digits(second_arg-1, pad = n, base = 2))), join(reverse(digits(third_arg-1, pad = n, base = 2)))]\n", + " bar(tags, probs, xticks=:all, xrotation=45, ylabel=L\"|\\psi|^2\", legend=false, size=(300, 300))\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "ws_qaoa_maxcut_circuit (generic function with 1 method)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Prepares a ready to use WS-QAOA circuit\n", + "# The gates are implemented in Qaintessent.jl module\n", + "function ws_qaoa_maxcut_circuit(γs::Vector{Float64}, βs::Vector{Float64}, ws_partitioning::Vector{Float64}, \n", + " graph::EdgeWeightedGraph, ε::Float64, init_state_randomized::Bool)\n", + " gates::Vector{CircuitGate} = []\n", + " # ws-qaoa circuit\n", + " for (γ, β) in zip(γs, βs)\n", + " # Add the phase separation gate\n", + " phase_separation_gate = MaxCutPhaseSeparationGate(γ, graph)\n", + " push!(gates, CircuitGate(Tuple(1:graph.n), phase_separation_gate))\n", + " # Add WS-MaxCut Mixer\n", + " mixer_gate = WSQAOAMixerGate(β, ws_partitioning, ε, init_state_randomized)\n", + " # mixer_gate = RxMixerGate(β, graph.n)\n", + " push!(gates, CircuitGate(Tuple(1:graph.n), mixer_gate))\n", + " end\n", + " # One-hot encoding: each qubit represents one node exactly\n", + " Circuit{graph.n}(gates)\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "prepare_init_state (generic function with 1 method)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Prepares the init state from a given solution, can be continous or discrete (p. 3)\n", + "function prepare_init_state(ws_partitioning::Vector{Float64}, ε::Float64)\n", + " gates::Vector{CircuitGate} = []\n", + " n = length(ws_partitioning)\n", + " # prepare the initial state\n", + " for i in eachindex(ws_partitioning)\n", + " # calculate theta according to regularization parameter and partitioning: Sec. (2.2)\n", + " c_i = ws_partitioning[i]\n", + " c_i = c_i <= ε ? ε : c_i\n", + " c_i = c_i >= (1 - ε) ? (1 - ε) : c_i\n", + " theta_i = 2 * asin(sqrt(c_i))\n", + " push!(gates, CircuitGate(Tuple(i,), RyGate(theta_i)))\n", + " end\n", + " init_circ = Circuit{n}(gates)\n", + " # starting point: |0>\n", + " start_point = zeros(ComplexF64, 2^n)\n", + " start_point[1] = 1.0 + 0.0im\n", + " return apply(start_point, init_circ.moments)\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "optimize_ws_qaoa (generic function with 6 methods)" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Trains a WS-QAOA circuit and prints the objective function in every round\n", + "# Returns a tuple like this: (optimized_circuit, last_objective, total_rounds)\n", + "function optimize_ws_qaoa(graph::EdgeWeightedGraph, ws_partitioning::Vector{Float64}, ε::Float64, init_state_randomized::Bool, \n", + " p::Int, training_rounds::Int=10, learning_rate::Float64=0.005, \n", + " params::Tuple{Vector{Float64}, Vector{Float64}}=([0.0],[0.0]), init_stddev=1, logger::Any=nothing)\n", + " ((isnothing(p) || p > 0) && training_rounds > 0) ||\n", + " throw(DomainError(\"`p` and `training_rounds` must be positive integers.\"))\n", + " # Initialize circuit and wavefunction\n", + " (initial_γs, initial_βs) = params\n", + " if (initial_γs, initial_βs) == ([0.0], [0.0])\n", + " (initial_γs, initial_βs) = (2 * π * randn(p) * init_stddev, 2 * π * randn(p) * init_stddev)\n", + " end\n", + " circ = ws_qaoa_maxcut_circuit(initial_γs, initial_βs, ws_partitioning, graph, ε, init_state_randomized)\n", + " ws = prepare_init_state(ws_partitioning, ε)\n", + " H_P_diag = diag(max_cut_phase_separation_hamiltonian(graph)) # can't have `Diagonal` matrix type here (error in backprop)\n", + " # Set up optimization with Flux\n", + " params = Flux.params(circ)\n", + " data = repeat([()], training_rounds) # empty input data for `training_rounds` rounds of training\n", + " optimizer = ADAM(learning_rate)\n", + " objective = real(ws' * (H_P_diag .* ws))\n", + " println(\"Training, round 0: average objective = $(objective)\")\n", + " round = 1\n", + " # evaluate expectation to be minimized and print it\n", + " prev_objective = 0.0\n", + " counter = 0\n", + " max_counter = 30\n", + " expectation() = begin\n", + " par = Flux.params(circ)\n", + " ws_out = apply(ws, circ.moments)\n", + " objective = real(ws_out' * (H_P_diag .* ws_out))\n", + " if abs(objective - prev_objective) > 0.001\n", + " counter = 0\n", + " elseif counter >= max_counter\n", + " println(\"No significant improvement, early stopping...\")\n", + " Flux.stop()\n", + " else\n", + " counter += 1\n", + " end\n", + " prev_objective = objective\n", + " println(\"Training, round $(round): average objective=$(objective)\")\n", + " if !isnothing(logger)\n", + " log_qaoa(logger, round, ws_out, objective, params)\n", + " end\n", + " round += 1\n", + " return -objective\n", + " end\n", + " \n", + " # Perform training\n", + " Flux.train!(expectation, params, data, optimizer)\n", + " return (circ, prev_objective, round)\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "recursive_ws_qaoa (generic function with 5 methods)" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Implements the recursive version of the QAOA for MaxCut\n", + "# Returns a tuple like this: ((cut_size, (partition1, partition2)), total required rounds x qubits)\n", + "function recursive_ws_qaoa(graph::EdgeWeightedGraph, ws_partitioning::Vector{Float64}, ε::Float64, init_state_randomized::Bool, \n", + " p::Int, training_rounds::Int=10, learning_rate::Float64=0.01, \n", + " init_stddev=1, logger::Any=nothing) where {N}\n", + " if graph.n <= 2 || length(graph.edges) <= 1\n", + " # Initialize circuit and wavefunction\n", + " println(\"End of recursion!\")\n", + " println(\"graph n: $(graph.n), graph edges: $(graph.edges)\")\n", + " res = ([1], [2])\n", + " if length(graph.edges) == 1 && graph.n > 2\n", + " v = first(first(first(graph.edges))) # select the first node\n", + " res = ([v], setdiff(Vector(1:graph.n), [v]))\n", + " elseif graph.n > 2\n", + " res = (Int64[], Vector(1:graph.n))\n", + " end\n", + " cutsize = cut_size(graph, res)\n", + " cutsize_res_rounds_tuple = ((cutsize, res), 0)\n", + " println(\"res: $(cutsize_res_rounds_tuple)\")\n", + " return cutsize_res_rounds_tuple\n", + " end\n", + " ws = prepare_init_state(ws_partitioning, ε)\n", + " (initial_γs, initial_βs) = ([0.0], [0.0])\n", + " (opt_circ, _, rounds) = optimize_ws_qaoa(graph, ws_partitioning, ε, init_state_randomized,\n", + " p, training_rounds, learning_rate, (initial_γs, initial_βs), init_stddev, logger)\n", + " ws_out = apply(ws, opt_circ.moments)\n", + " # Calculate the correlators\n", + " # In a real quantum circuit, the correlator circuit must be run for every edge\n", + " # to compute the max correlator, which is the bottleneck of the recursive QAOA\n", + " (max_corr, corr_edge) = (0, (-1, -1))\n", + " for (edge, w) in graph.edges\n", + " correlator = kron((i ∈ edge ? matrix(Z) : I(2) for i in 1:graph.n)...)\n", + " corr = ws_out' * correlator * ws_out\n", + " if abs(corr) >= abs(max_corr)\n", + " max_corr = corr\n", + " corr_edge = edge\n", + " end\n", + " end\n", + " (v_out, v_k) = corr_edge\n", + " adj_mat = adjacency_matrix(graph)\n", + " reduced_edges::Vector{Tuple{Int, Int, Float64}} = []\n", + " # replace v_out with sign(max_corr)*v_k -> Appendix E and G\n", + " for (edge, w) in graph.edges\n", + " if !(v_out ∈ edge) \n", + " (v_i, v_j) = edge\n", + " v_i_updated = v_i > v_out ? v_i - 1 : v_i\n", + " v_j_updated = v_j > v_out ? v_j - 1 : v_j\n", + " extra_weight = 0.0\n", + " if v_i == v_k\n", + " extra_weight = sign(max_corr) * adj_mat[v_j, v_out]\n", + " elseif v_j == v_k\n", + " extra_weight = sign(max_corr) * adj_mat[v_i, v_out]\n", + " else\n", + " extra_weight = 0.0\n", + " end\n", + " push!(reduced_edges, (v_i_updated, v_j_updated, w + real(extra_weight)))\n", + " end\n", + " end\n", + " reduced_graph = EdgeWeightedGraph(graph.n - 1, reduced_edges)\n", + " reduced_partitioning = ws_partitioning[1:graph.n .!= v_out]\n", + " ((_, partitions), rec_rounds_x_qubits) = recursive_ws_qaoa(reduced_graph, reduced_partitioning, ε, \n", + " init_state_randomized, p, training_rounds, learning_rate, init_stddev, logger)\n", + " (partition1, partition2) = partitions\n", + " println(\"return from recursion\")\n", + " println(\"partitions: $(partitions)\")\n", + " println(\"v_out: $(v_out)\")\n", + " # Our current graph structure requires that node ids start from 0 and there are no gaps in between\n", + " # So after we make the recursive call, we have to restore back the reduced node with its correct id\n", + " for i in 1:length(partition1)\n", + " partition1[i] = partition1[i] >= v_out ? partition1[i] + 1 : partition1[i]\n", + " end\n", + " for i in 1:length(partition2)\n", + " partition2[i] = partition2[i] >= v_out ? partition2[i] + 1 : partition2[i]\n", + " end\n", + " if v_k ∈ partition1\n", + " if real(sign(max_corr)) <= 0\n", + " push!(partition2, v_out)\n", + " else\n", + " push!(partition1, v_out)\n", + " end\n", + " else\n", + " if real(sign(max_corr)) <= 0\n", + " push!(partition1, v_out)\n", + " else\n", + " push!(partition2, v_out)\n", + " end\n", + " end\n", + " return ((cut_size(graph, partitions), (partition1, partition2)), rec_rounds_x_qubits + rounds * graph.n)\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Normal QAOA vs. WS-QAOA\n", + "\n", + "To simulate a normal QAOA, we can set the regularization parameter to 0.5 and WS-QAOA will be mapped to normal QAOA (Eq. 2). However, for the reference, normal X-Mixer gate is also implemented. Feel free to check the QAOA library in the Qaintessent.jl modules for all the gates that are implemented." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With 8 qubits, we can construct a three-connected graph, which is basically a cube:\n", + "\n", + "\"N=8\"\n",\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(12, ([2, 4, 5, 7], [1, 3, 6, 8]))" + ] + }, + "execution_count": 134, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n = 8\n", + "edges = [(1, 2), (1, 4), (1, 5), (2, 3), (2, 6), (3, 4), (3, 7), (4, 8), (5, 6), (5, 8), (6, 7), (7, 8)];\n", + "graph = Graph(n, edges)\n", + "ws_partitioning = [1.0, 0.0, 1.0, 0.0, 0.0 ,1.0, 0.0, 0.0]\n", + "ε = 0.5\n", + "init_state_randomized = false\n", + "p = 10\n", + "rounds = 300\n", + "lr = 0.01\n", + "init_stddev = 1\n", + "(max_cut, max_partition) = maxcut(adjacency_matrix(to_edge_weighted_graph(graph)), iter=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's try to find the optimal cut in normal QAOA:" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 0: average objective = 6.0\n", + "Training, round 1: average objective=7.385254826702606\n", + "Training, round 2: average objective=7.669278937616486\n", + "Training, round 3: average objective=7.841525514956192\n", + "Training, round 4: average objective=7.975789801337562\n", + "Training, round 5: average objective=8.1110897365877\n", + "Training, round 6: average objective=8.253726528802238\n", + "Training, round 7: average objective=8.396070550125096\n", + "Training, round 8: average objective=8.534951260975452\n", + "Training, round 9: average objective=8.664294136294675\n", + "Training, round 10: average objective=8.773945529651671\n", + "Training, round 11: average objective=8.85824972316636\n", + "Training, round 12: average objective=8.921414209149647\n", + "Training, round 13: average objective=8.977062085950788\n", + "Training, round 14: average objective=9.03952783393435\n", + "Training, round 15: average objective=9.114432879537855\n", + "Training, round 16: average objective=9.200538723576486\n", + "Training, round 17: average objective=9.29445298223753\n", + "Training, round 18: average objective=9.393433590265147\n", + "Training, round 19: average objective=9.496632711269166\n", + "Training, round 20: average objective=9.605079038367942\n", + "Training, round 21: average objective=9.720438326650237\n", + "Training, round 22: average objective=9.843227383279263\n", + "Training, round 23: average objective=9.97187172863468\n", + "Training, round 24: average objective=10.10372054929681\n", + "Training, round 25: average objective=10.237063466592057\n", + "Training, round 26: average objective=10.371486682841807\n", + "Training, round 27: average objective=10.505857933553408\n", + "Training, round 28: average objective=10.637004611227656\n", + "Training, round 29: average objective=10.761101765285492\n", + "Training, round 30: average objective=10.875564248362174\n", + "Training, round 31: average objective=10.97907024234942\n", + "Training, round 32: average objective=11.070811086141825\n", + "Training, round 33: average objective=11.150591975666504\n", + "Training, round 34: average objective=11.218948454894411\n", + "Training, round 35: average objective=11.276485090579925\n", + "Training, round 36: average objective=11.323575132716785\n", + "Training, round 37: average objective=11.361129031790357\n", + "Training, round 38: average objective=11.39107296007125\n", + "Training, round 39: average objective=11.415613616692333\n", + "Training, round 40: average objective=11.436397264925146\n", + "Training, round 41: average objective=11.454372491615459\n", + "Training, round 42: average objective=11.469981212580308\n", + "Training, round 43: average objective=11.483425633169185\n", + "Training, round 44: average objective=11.494933977065163\n", + "Training, round 45: average objective=11.504764775162425\n", + "Training, round 46: average objective=11.513082571068757\n", + "Training, round 47: average objective=11.520048957611102\n", + "Training, round 48: average objective=11.525909195670039\n", + "Training, round 49: average objective=11.53086982303573\n", + "Training, round 50: average objective=11.535223926625722\n", + "Training, round 51: average objective=11.539667756426354\n", + "Training, round 52: average objective=11.545077246789702\n", + "Training, round 53: average objective=11.551811517212501\n", + "Training, round 54: average objective=11.559434424040449\n", + "Training, round 55: average objective=11.56712101477992\n", + "Training, round 56: average objective=11.574189334033266\n", + "Training, round 57: average objective=11.580385964295665\n", + "Training, round 58: average objective=11.585893522861987\n", + "Training, round 59: average objective=11.591040433674046\n", + "Training, round 60: average objective=11.595988169168248\n", + "Training, round 61: average objective=11.600751520856374\n", + "Training, round 62: average objective=11.605369503774881\n", + "Training, round 63: average objective=11.609930815462512\n", + "Training, round 64: average objective=11.614548983306994\n", + "Training, round 65: average objective=11.61934483117302\n", + "Training, round 66: average objective=11.624356048430053\n", + "Training, round 67: average objective=11.629514388646507\n", + "Training, round 68: average objective=11.634758419482553\n", + "Training, round 69: average objective=11.640071062918183\n", + "Training, round 70: average objective=11.645410882469957\n", + "Training, round 71: average objective=11.650680969943117\n", + "Training, round 72: average objective=11.65575082988139\n", + "Training, round 73: average objective=11.66052521090342\n", + "Training, round 74: average objective=11.665040095965377\n", + "Training, round 75: average objective=11.669437612929293\n", + "Training, round 76: average objective=11.673811349742806\n", + "Training, round 77: average objective=11.678120503538468\n", + "Training, round 78: average objective=11.68223915619449\n", + "Training, round 79: average objective=11.686057324150765\n", + "Training, round 80: average objective=11.689557682808683\n", + "Training, round 81: average objective=11.692805678773496\n", + "Training, round 82: average objective=11.695870331782746\n", + "Training, round 83: average objective=11.698782084681053\n", + "Training, round 84: average objective=11.70154983379328\n", + "Training, round 85: average objective=11.704184715390689\n", + "Training, round 86: average objective=11.706723254303535\n", + "Training, round 87: average objective=11.709229894640492\n", + "Training, round 88: average objective=11.711762834310305\n", + "Training, round 89: average objective=11.71434407670736\n", + "Training, round 90: average objective=11.716958761782518\n", + "Training, round 91: average objective=11.719566146623855\n", + "Training, round 92: average objective=11.72212411390024\n", + "Training, round 93: average objective=11.724612679786697\n", + "Training, round 94: average objective=11.727036684835815\n", + "Training, round 95: average objective=11.72941832474009\n", + "Training, round 96: average objective=11.731782936925809\n", + "Training, round 97: average objective=11.73414092527568\n", + "Training, round 98: average objective=11.736487514203727\n", + "Training, round 99: average objective=11.738815243079014\n", + "Training, round 100: average objective=11.741117155954125\n", + "Training, round 101: average objective=11.74338420337938\n", + "Training, round 102: average objective=11.745604693379654\n", + "Training, round 103: average objective=11.747769117277095\n", + "Training, round 104: average objective=11.749880177977683\n", + "Training, round 105: average objective=11.751952260832919\n", + "Training, round 106: average objective=11.754001344376011\n", + "Training, round 107: average objective=11.756038346074135\n", + "Training, round 108: average objective=11.758068315689265\n", + "Training, round 109: average objective=11.76009238127888\n", + "Training, round 110: average objective=11.762110137907897\n", + "Training, round 111: average objective=11.764117198940804\n", + "Training, round 112: average objective=11.766103862423169\n", + "Training, round 113: average objective=11.768059199742614\n", + "Training, round 114: average objective=11.769976138528254\n", + "Training, round 115: average objective=11.771854372670006\n", + "Training, round 116: average objective=11.773696901732439\n", + "Training, round 117: average objective=11.775503972754802\n", + "Training, round 118: average objective=11.777272171372093\n", + "Training, round 119: average objective=11.77899798693238\n", + "Training, round 120: average objective=11.780679749175267\n", + "Training, round 121: average objective=11.782317718718106\n", + "Training, round 122: average objective=11.783911908712167\n", + "Training, round 123: average objective=11.785462107532297\n", + "Training, round 124: average objective=11.786968531279697\n", + "Training, round 125: average objective=11.78843240680256\n", + "Training, round 126: average objective=11.789855635215996\n", + "Training, round 127: average objective=11.79124069928609\n", + "Training, round 128: average objective=11.792589540128944\n", + "Training, round 129: average objective=11.793903451174103\n", + "Training, round 130: average objective=11.795182725651898\n", + "Training, round 131: average objective=11.796427466672169\n", + "Training, round 132: average objective=11.797638464698785\n", + "Training, round 133: average objective=11.79881705648177\n", + "Training, round 134: average objective=11.799964959234586\n", + "Training, round 135: average objective=11.801083502413242\n", + "Training, round 136: average objective=11.802173709154479\n", + "Training, round 137: average objective=11.803236874418841\n", + "Training, round 138: average objective=11.80427471285655\n", + "Training, round 139: average objective=11.805289143132834\n", + "Training, round 140: average objective=11.80628204648178\n", + "Training, round 141: average objective=11.807255349678714\n", + "Training, round 142: average objective=11.808210997290722\n", + "Training, round 143: average objective=11.809150657152768\n", + "Training, round 144: average objective=11.810075340526971\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 145: average objective=11.81098576430138\n", + "Training, round 146: average objective=11.811882569583156\n", + "Training, round 147: average objective=11.812766551121609\n", + "Training, round 148: average objective=11.813638301252995\n", + "Training, round 149: average objective=11.814498261516324\n", + "Training, round 150: average objective=11.81534670018587\n", + "Training, round 151: average objective=11.816183913393148\n", + "Training, round 152: average objective=11.817010136014394\n", + "Training, round 153: average objective=11.817825427058331\n", + "Training, round 154: average objective=11.818629493904602\n", + "Training, round 155: average objective=11.819422180157606\n", + "Training, round 156: average objective=11.820203328959627\n", + "Training, round 157: average objective=11.820972946912002\n", + "Training, round 158: average objective=11.821731022773296\n", + "Training, round 159: average objective=11.822477588331473\n", + "Training, round 160: average objective=11.823212598901241\n", + "Training, round 161: average objective=11.823936001593644\n", + "Training, round 162: average objective=11.824647666981786\n", + "Training, round 163: average objective=11.825347499054349\n", + "Training, round 164: average objective=11.826035514043774\n", + "Training, round 165: average objective=11.826711537914518\n", + "Training, round 166: average objective=11.827375548353544\n", + "Training, round 167: average objective=11.82802756090771\n", + "Training, round 168: average objective=11.82866766784347\n", + "Training, round 169: average objective=11.829295901236788\n", + "No significant improvement, early stopping...\n" + ] + }, + { + "data": { + "text/plain": [ + "(\n", + " 8 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | | | | | \n", + " 7 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | | | | | \n", + " 6 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | | | | | \n", + " 5 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | | | | | \n", + " 4 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | | | | | \n", + " 3 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | | | | | \n", + " 2 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | | | | | \n", + " 1 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + ", 11.829295901236788, 170)" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p = 10\n", + "ε = 0.5\n", + "(initial_γs_10, initial_βs_10) = (2 * π * randn(p) * init_stddev, 2 * π * randn(p) * init_stddev)\n", + "(circ_opt_10, qaoa_10_objective, qaoa_10_rounds) = optimize_ws_qaoa(\n", + " to_edge_weighted_graph(graph), ws_partitioning, ε, init_state_randomized, p, rounds, lr, (initial_γs_10, initial_βs_10))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qaoa_10_objective_ratio = max_cut / qaoa_10_objective\n", + "result = apply(prepare_init_state(ws_partitioning, ε), circ_opt_10.moments)\n", + "plot_result(result)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 0: average objective = 6.0\n", + "Training, round 1: average objective=6.407570615400552\n", + "Training, round 2: average objective=6.701390726310021\n", + "Training, round 3: average objective=6.969652477465822\n", + "Training, round 4: average objective=7.21831110723317\n", + "Training, round 5: average objective=7.4481849402598295\n", + "Training, round 6: average objective=7.659635606573269\n", + "Training, round 7: average objective=7.855037143211743\n", + "Training, round 8: average objective=8.039319330401014\n", + "Training, round 9: average objective=8.2206434994685\n", + "Training, round 10: average objective=8.410517425546326\n", + "Training, round 11: average objective=8.616116938418577\n", + "Training, round 12: average objective=8.836029789147805\n", + "Training, round 13: average objective=9.063432630310036\n", + "Training, round 14: average objective=9.289906185362728\n", + "Training, round 15: average objective=9.508812995911999\n", + "Training, round 16: average objective=9.71665790483154\n", + "Training, round 17: average objective=9.911323240570072\n", + "Training, round 18: average objective=10.089254675682813\n", + "Training, round 19: average objective=10.244370602247415\n", + "Training, round 20: average objective=10.369627796586105\n", + "Training, round 21: average objective=10.460703963772275\n", + "Training, round 22: average objective=10.519496467114713\n", + "Training, round 23: average objective=10.554445370153818\n", + "Training, round 24: average objective=10.57683362765719\n", + "Training, round 25: average objective=10.59586180832719\n", + "Training, round 26: average objective=10.61658732840591\n", + "Training, round 27: average objective=10.641355370772189\n", + "Training, round 28: average objective=10.671542619948859\n", + "Training, round 29: average objective=10.707150815879112\n", + "Training, round 30: average objective=10.745993511761352\n", + "Training, round 31: average objective=10.78462747604747\n", + "Training, round 32: average objective=10.820444894901026\n", + "Training, round 33: average objective=10.853340659209756\n", + "Training, round 34: average objective=10.885384669044292\n", + "Training, round 35: average objective=10.918372148369077\n", + "Training, round 36: average objective=10.951741338509182\n", + "Training, round 37: average objective=10.982973636968964\n", + "Training, round 38: average objective=11.009576194396793\n", + "Training, round 39: average objective=11.030453042428904\n", + "Training, round 40: average objective=11.045589053943146\n", + "Training, round 41: average objective=11.055121038502612\n", + "Training, round 42: average objective=11.0594612250222\n", + "Training, round 43: average objective=11.060182536698449\n", + "Training, round 44: average objective=11.060018198785983\n", + "Training, round 45: average objective=11.061522746383359\n", + "Training, round 46: average objective=11.065817239832507\n", + "Training, round 47: average objective=11.072737981508254\n", + "Training, round 48: average objective=11.081877815133296\n", + "Training, round 49: average objective=11.093059173546402\n", + "Training, round 50: average objective=11.10590242005373\n", + "Training, round 51: average objective=11.119511258984604\n", + "Training, round 52: average objective=11.132930540588307\n", + "Training, round 53: average objective=11.145748659866591\n", + "Training, round 54: average objective=11.158017049674315\n", + "Training, round 55: average objective=11.169725937484506\n", + "Training, round 56: average objective=11.180672158925018\n", + "Training, round 57: average objective=11.190815207126928\n", + "Training, round 58: average objective=11.200455119570425\n", + "Training, round 59: average objective=11.20994226535341\n", + "Training, round 60: average objective=11.219368106544215\n", + "Training, round 61: average objective=11.228639814599127\n", + "Training, round 62: average objective=11.237737298479566\n", + "Training, round 63: average objective=11.246774274739348\n", + "Training, round 64: average objective=11.255861969709954\n", + "Training, round 65: average objective=11.265036776724866\n", + "Training, round 66: average objective=11.274344553049335\n", + "Training, round 67: average objective=11.28390228234852\n", + "Training, round 68: average objective=11.293809884136795\n", + "Training, round 69: average objective=11.304021606875025\n", + "Training, round 70: average objective=11.314353959080112\n", + "Training, round 71: average objective=11.324626446410441\n", + "Training, round 72: average objective=11.334765850091808\n", + "Training, round 73: average objective=11.344775858406283\n", + "Training, round 74: average objective=11.354651324894641\n", + "Training, round 75: average objective=11.364357859741778\n", + "Training, round 76: average objective=11.37386698244065\n", + "Training, round 77: average objective=11.383158170804101\n", + "Training, round 78: average objective=11.392173439055144\n", + "Training, round 79: average objective=11.400801440720679\n", + "Training, round 80: average objective=11.408931292727127\n", + "Training, round 81: average objective=11.416513906990941\n", + "Training, round 82: average objective=11.423558386516202\n", + "Training, round 83: average objective=11.430089996423462\n", + "Training, round 84: average objective=11.436136128632207\n", + "Training, round 85: average objective=11.44174183266238\n", + "Training, round 86: average objective=11.446967380934726\n", + "Training, round 87: average objective=11.45186314582746\n", + "Training, round 88: average objective=11.456467646862471\n", + "Training, round 89: average objective=11.460832653394021\n", + "Training, round 90: average objective=11.465031220180128\n", + "Training, round 91: average objective=11.469129384426271\n", + "Training, round 92: average objective=11.473160949764608\n", + "Training, round 93: average objective=11.477130341277121\n", + "Training, round 94: average objective=11.481018283804756\n", + "Training, round 95: average objective=11.484776282037657\n", + "Training, round 96: average objective=11.48833453411877\n", + "Training, round 97: average objective=11.49163105447388\n", + "Training, round 98: average objective=11.494633129222896\n", + "Training, round 99: average objective=11.497332670270653\n", + "Training, round 100: average objective=11.499738097676879\n", + "Training, round 101: average objective=11.501875995503093\n", + "Training, round 102: average objective=11.50378958730073\n", + "Training, round 103: average objective=11.50552678637187\n", + "Training, round 104: average objective=11.507134076218719\n", + "Training, round 105: average objective=11.508660249183894\n", + "Training, round 106: average objective=11.51015534505381\n", + "Training, round 107: average objective=11.511660837426122\n", + "Training, round 108: average objective=11.513203409735247\n", + "Training, round 109: average objective=11.514796128035512\n", + "Training, round 110: average objective=11.516438678023054\n", + "Training, round 111: average objective=11.518116879272677\n", + "Training, round 112: average objective=11.519808606087796\n", + "Training, round 113: average objective=11.521493406882634\n", + "Training, round 114: average objective=11.523157146718244\n", + "Training, round 115: average objective=11.524791361854115\n", + "Training, round 116: average objective=11.526393381200641\n", + "Training, round 117: average objective=11.527965789929368\n", + "Training, round 118: average objective=11.529513315204778\n", + "Training, round 119: average objective=11.531039481093861\n", + "Training, round 120: average objective=11.532546821271534\n", + "Training, round 121: average objective=11.534038026794667\n", + "Training, round 122: average objective=11.535515042418165\n", + "Training, round 123: average objective=11.536978369527226\n", + "Training, round 124: average objective=11.538427643524342\n", + "Training, round 125: average objective=11.539862460436384\n", + "Training, round 126: average objective=11.541281533426977\n", + "Training, round 127: average objective=11.542683401461518\n", + "Training, round 128: average objective=11.544067787863652\n", + "Training, round 129: average objective=11.545436240734473\n", + "Training, round 130: average objective=11.54679148139219\n", + "Training, round 131: average objective=11.54813675021736\n", + "Training, round 132: average objective=11.549475517467457\n", + "Training, round 133: average objective=11.550810557785288\n", + "Training, round 134: average objective=11.552143288503592\n", + "Training, round 135: average objective=11.553474108809262\n", + "Training, round 136: average objective=11.554803098033315\n", + "Training, round 137: average objective=11.556130141802974\n", + "Training, round 138: average objective=11.557455029667397\n", + "Training, round 139: average objective=11.558777840200824\n", + "Training, round 140: average objective=11.560098996187802\n", + "Training, round 141: average objective=11.561419021528362\n", + "Training, round 142: average objective=11.56273855204865\n", + "Training, round 143: average objective=11.56405847088288\n", + "Training, round 144: average objective=11.565379904916492\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 145: average objective=11.566703903510193\n", + "Training, round 146: average objective=11.568031344343535\n", + "Training, round 147: average objective=11.56936306326643\n", + "Training, round 148: average objective=11.57069954279873\n", + "Training, round 149: average objective=11.572040768086651\n", + "Training, round 150: average objective=11.573386715765032\n", + "Training, round 151: average objective=11.574737435149371\n", + "Training, round 152: average objective=11.576093129256872\n", + "Training, round 153: average objective=11.577454104153949\n", + "Training, round 154: average objective=11.57882081348015\n", + "Training, round 155: average objective=11.580193903083954\n", + "Training, round 156: average objective=11.581574001463721\n", + "Training, round 157: average objective=11.582961736073724\n", + "Training, round 158: average objective=11.584357740987233\n", + "Training, round 159: average objective=11.58576263035447\n", + "Training, round 160: average objective=11.587176973979425\n", + "Training, round 161: average objective=11.58860121457892\n", + "Training, round 162: average objective=11.59003579299813\n", + "Training, round 163: average objective=11.59148109621556\n", + "Training, round 164: average objective=11.592937353682746\n", + "Training, round 165: average objective=11.594404964681619\n", + "Training, round 166: average objective=11.595884303631767\n", + "Training, round 167: average objective=11.597375828135181\n", + "Training, round 168: average objective=11.598879930071938\n", + "Training, round 169: average objective=11.600397050335758\n", + "Training, round 170: average objective=11.601927640751718\n", + "Training, round 171: average objective=11.603472141495839\n", + "Training, round 172: average objective=11.605030935277519\n", + "Training, round 173: average objective=11.606604347003323\n", + "Training, round 174: average objective=11.608192893143503\n", + "Training, round 175: average objective=11.609796937075103\n", + "Training, round 176: average objective=11.611416813229408\n", + "Training, round 177: average objective=11.613052992009015\n", + "Training, round 178: average objective=11.614705942617974\n", + "Training, round 179: average objective=11.616376105636718\n", + "Training, round 180: average objective=11.618063920706195\n", + "Training, round 181: average objective=11.619769849107763\n", + "Training, round 182: average objective=11.621494305741368\n", + "Training, round 183: average objective=11.623237785869613\n", + "Training, round 184: average objective=11.625000643618918\n", + "Training, round 185: average objective=11.62678328866673\n", + "Training, round 186: average objective=11.62858609725912\n", + "Training, round 187: average objective=11.6304094426897\n", + "Training, round 188: average objective=11.6322536687969\n", + "Training, round 189: average objective=11.6341190736985\n", + "Training, round 190: average objective=11.63600607726299\n", + "Training, round 191: average objective=11.637914974856502\n", + "Training, round 192: average objective=11.639846034474518\n", + "Training, round 193: average objective=11.641799583979285\n", + "Training, round 194: average objective=11.643775886953673\n", + "Training, round 195: average objective=11.645775191063073\n", + "Training, round 196: average objective=11.64779771088381\n", + "Training, round 197: average objective=11.649843637593031\n", + "Training, round 198: average objective=11.651913057979488\n", + "Training, round 199: average objective=11.654006093194061\n", + "Training, round 200: average objective=11.656123009282247\n", + "Training, round 201: average objective=11.658263829443303\n", + "Training, round 202: average objective=11.660428536609611\n", + "Training, round 203: average objective=11.6626172082958\n", + "Training, round 204: average objective=11.664829695275792\n", + "Training, round 205: average objective=11.667066009080635\n", + "Training, round 206: average objective=11.669326031016412\n", + "Training, round 207: average objective=11.6716095413492\n", + "Training, round 208: average objective=11.673916426203352\n", + "Training, round 209: average objective=11.676246398247645\n", + "Training, round 210: average objective=11.678599165102694\n", + "Training, round 211: average objective=11.680974342165658\n", + "Training, round 212: average objective=11.683371494061745\n", + "Training, round 213: average objective=11.685790172380834\n", + "Training, round 214: average objective=11.688229813820161\n", + "Training, round 215: average objective=11.690689917515034\n", + "Training, round 216: average objective=11.69316973182924\n", + "Training, round 217: average objective=11.695668549695494\n", + "Training, round 218: average objective=11.698185691229215\n", + "Training, round 219: average objective=11.700720278789476\n", + "Training, round 220: average objective=11.703271381084477\n", + "Training, round 221: average objective=11.705838101746181\n", + "Training, round 222: average objective=11.70841934028466\n", + "Training, round 223: average objective=11.711014061897952\n", + "Training, round 224: average objective=11.713621187594054\n", + "Training, round 225: average objective=11.716239560763688\n", + "Training, round 226: average objective=11.718867983711936\n", + "Training, round 227: average objective=11.721505091499786\n", + "Training, round 228: average objective=11.724149626703724\n", + "Training, round 229: average objective=11.726800248259906\n", + "Training, round 230: average objective=11.729455393014248\n", + "Training, round 231: average objective=11.732113637261163\n", + "Training, round 232: average objective=11.734773594104961\n", + "Training, round 233: average objective=11.737433685238894\n", + "Training, round 234: average objective=11.740092360557561\n", + "Training, round 235: average objective=11.742748079750694\n", + "Training, round 236: average objective=11.745399219287851\n", + "Training, round 237: average objective=11.748044177070765\n", + "Training, round 238: average objective=11.75068134655782\n", + "Training, round 239: average objective=11.753309111970436\n", + "Training, round 240: average objective=11.755925796631196\n", + "Training, round 241: average objective=11.758529808672401\n", + "Training, round 242: average objective=11.761119513092769\n", + "Training, round 243: average objective=11.763693511089308\n", + "Training, round 244: average objective=11.76625005895853\n", + "Training, round 245: average objective=11.768787575906998\n", + "Training, round 246: average objective=11.771304666455947\n", + "Training, round 247: average objective=11.77379982121401\n", + "Training, round 248: average objective=11.776271555775264\n", + "Training, round 249: average objective=11.778718477771372\n", + "Training, round 250: average objective=11.781139248525955\n", + "Training, round 251: average objective=11.783532577014345\n", + "Training, round 252: average objective=11.785897313485544\n", + "Training, round 253: average objective=11.788232192143306\n", + "Training, round 254: average objective=11.790536054830158\n", + "Training, round 255: average objective=11.7928078571306\n", + "Training, round 256: average objective=11.79504659995073\n", + "Training, round 257: average objective=11.797251404884765\n", + "Training, round 258: average objective=11.799421397858838\n", + "Training, round 259: average objective=11.801555785269969\n", + "Training, round 260: average objective=11.803653834223345\n", + "Training, round 261: average objective=11.805714975968773\n", + "Training, round 262: average objective=11.80773860705957\n", + "Training, round 263: average objective=11.809724131487451\n", + "Training, round 264: average objective=11.811671205644107\n", + "Training, round 265: average objective=11.813579442050589\n", + "Training, round 266: average objective=11.8154485793914\n", + "Training, round 267: average objective=11.817278398251938\n", + "Training, round 268: average objective=11.819068754441274\n", + "Training, round 269: average objective=11.820819530350406\n", + "Training, round 270: average objective=11.822530844514974\n", + "Training, round 271: average objective=11.824202632167985\n", + "Training, round 272: average objective=11.8258351151827\n", + "Training, round 273: average objective=11.827428388726954\n", + "Training, round 274: average objective=11.828982775422276\n", + "Training, round 275: average objective=11.830498494859047\n", + "Training, round 276: average objective=11.831975871411096\n", + "Training, round 277: average objective=11.833415324256432\n", + "Training, round 278: average objective=11.834817307281828\n", + "Training, round 279: average objective=11.836182272779944\n", + "Training, round 280: average objective=11.837510749979941\n", + "Training, round 281: average objective=11.838803352218733\n", + "Training, round 282: average objective=11.840060632864413\n", + "Training, round 283: average objective=11.841283213643681\n", + "Training, round 284: average objective=11.84247177984244\n", + "Training, round 285: average objective=11.843626956402757\n", + "Training, round 286: average objective=11.844749404510477\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 287: average objective=11.845839901711553\n", + "Training, round 288: average objective=11.84689914394881\n", + "Training, round 289: average objective=11.847927907063763\n", + "Training, round 290: average objective=11.848926958144123\n", + "Training, round 291: average objective=11.84989708183504\n", + "Training, round 292: average objective=11.850839014832363\n", + "Training, round 293: average objective=11.851753565666481\n", + "Training, round 294: average objective=11.85264144662337\n", + "Training, round 295: average objective=11.853503458882765\n", + "Training, round 296: average objective=11.854340413366886\n", + "Training, round 297: average objective=11.855153064281065\n", + "Training, round 298: average objective=11.855942111907655\n", + "Training, round 299: average objective=11.856708354919414\n", + "Training, round 300: average objective=11.857452446374023\n" + ] + }, + { + "data": { + "text/plain": [ + "(\n", + " 8 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | \n", + " 7 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | \n", + " 6 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | \n", + " 5 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | \n", + " 4 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | \n", + " 3 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | \n", + " 2 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | \n", + " 1 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + ", 11.857452446374023, 301)" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p = 8\n", + "ε = 0.5\n", + "(initial_γs_8, initial_βs_8) = (2 * π * randn(p) * init_stddev, 2 * π * randn(p) * init_stddev)\n", + "(circ_opt_8, qaoa_8_objective, qaoa_8_rounds) = optimize_ws_qaoa(\n", + " to_edge_weighted_graph(graph), ws_partitioning, ε, init_state_randomized, p, rounds, lr, (initial_γs_8, initial_βs_8))" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qaoa_8_objective_ratio = max_cut / qaoa_8_objective\n", + "result = apply(prepare_init_state(ws_partitioning, ε), circ_opt_8.moments)\n", + "plot_result(result)" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 0: average objective = 6.0\n", + "Training, round 1: average objective=6.240166126711677\n", + "Training, round 2: average objective=6.292337186064236\n", + "Training, round 3: average objective=6.351557809056605\n", + "Training, round 4: average objective=6.4181836072809055\n", + "Training, round 5: average objective=6.492519531639076\n", + "Training, round 6: average objective=6.574807509578839\n", + "Training, round 7: average objective=6.665210297515538\n", + "Training, round 8: average objective=6.763792831943942\n", + "Training, round 9: average objective=6.870502244438817\n", + "Training, round 10: average objective=6.985147283497611\n", + "Training, round 11: average objective=7.107378204957211\n", + "Training, round 12: average objective=7.236668348187584\n", + "Training, round 13: average objective=7.372298602397888\n", + "Training, round 14: average objective=7.513346624368293\n", + "Training, round 15: average objective=7.658682697922565\n", + "Training, round 16: average objective=7.806973399867248\n", + "Training, round 17: average objective=7.956695953959706\n", + "Training, round 18: average objective=8.106165271253772\n", + "Training, round 19: average objective=8.253573945277367\n", + "Training, round 20: average objective=8.397048645258272\n", + "Training, round 21: average objective=8.534721322547549\n", + "Training, round 22: average objective=8.664816049965488\n", + "Training, round 23: average objective=8.785746963222405\n", + "Training, round 24: average objective=8.89622227172742\n", + "Training, round 25: average objective=8.99534267683011\n", + "Training, round 26: average objective=9.08268230936964\n", + "Training, round 27: average objective=9.15833409495954\n", + "Training, round 28: average objective=9.222903436815994\n", + "Training, round 29: average objective=9.277443517854575\n", + "Training, round 30: average objective=9.323334389426682\n", + "Training, round 31: average objective=9.362127462979585\n", + "Training, round 32: average objective=9.395380489039104\n", + "Training, round 33: average objective=9.424516808185952\n", + "Training, round 34: average objective=9.450725177118546\n", + "Training, round 35: average objective=9.474911244763948\n", + "Training, round 36: average objective=9.497693435252652\n", + "Training, round 37: average objective=9.519430944883993\n", + "Training, round 38: average objective=9.540270382331434\n", + "Training, round 39: average objective=9.560198617568131\n", + "Training, round 40: average objective=9.579096125554043\n", + "Training, round 41: average objective=9.596784762405346\n", + "Training, round 42: average objective=9.613069666667563\n", + "Training, round 43: average objective=9.627772340424643\n", + "Training, round 44: average objective=9.640756018186746\n", + "Training, round 45: average objective=9.651942094815396\n", + "Training, round 46: average objective=9.661317853323656\n", + "Training, round 47: average objective=9.66893681584533\n", + "Training, round 48: average objective=9.674912210017473\n", + "Training, round 49: average objective=9.679405806556886\n", + "Training, round 50: average objective=9.682613931847264\n", + "Training, round 51: average objective=9.684752150156196\n", + "Training, round 52: average objective=9.686040681482767\n", + "Training, round 53: average objective=9.686691696012556\n", + "Training, round 54: average objective=9.686899218638398\n", + "Training, round 55: average objective=9.686831672398728\n", + "Training, round 56: average objective=9.686627724620031\n", + "Training, round 57: average objective=9.686394309272742\n", + "Training, round 58: average objective=9.686207466930613\n", + "Training, round 59: average objective=9.686114742976454\n", + "Training, round 60: average objective=9.68613865636437\n", + "Training, round 61: average objective=9.686281436449004\n", + "Training, round 62: average objective=9.686530156156989\n", + "Training, round 63: average objective=9.686861591839488\n", + "Training, round 64: average objective=9.687247568732335\n", + "Training, round 65: average objective=9.687659091601606\n", + "Training, round 66: average objective=9.688069939247349\n", + "Training, round 67: average objective=9.688459226605826\n", + "Training, round 68: average objective=9.688813300926302\n", + "Training, round 69: average objective=9.689126213064457\n", + "Training, round 70: average objective=9.689399408689868\n", + "Training, round 71: average objective=9.689640561783833\n", + "Training, round 72: average objective=9.68986177312107\n", + "Training, round 73: average objective=9.690077494482328\n", + "Training, round 74: average objective=9.690302306582021\n", + "Training, round 75: average objective=9.690548987935092\n", + "Training, round 76: average objective=9.690826906787361\n", + "Training, round 77: average objective=9.691141018506109\n", + "Training, round 78: average objective=9.691491333806715\n", + "Training, round 79: average objective=9.691873184501757\n", + "Training, round 80: average objective=9.692277952097326\n", + "Training, round 81: average objective=9.692694089304696\n", + "Training, round 82: average objective=9.693108430552655\n", + "No significant improvement, early stopping...\n" + ] + }, + { + "data": { + "text/plain": [ + "(\n", + " 8 ——□—————□—————□—————□———\n", + " | | | | \n", + " 7 ——□—————□—————□—————□———\n", + " | | | | \n", + " 6 ——□—————□—————□—————□———\n", + " | | | | \n", + " 5 ——□—————□—————□—————□———\n", + " | | | | \n", + " 4 ——□—————□—————□—————□———\n", + " | | | | \n", + " 3 ——□—————□—————□—————□———\n", + " | | | | \n", + " 2 ——□—————□—————□—————□———\n", + " | | | | \n", + " 1 ——□—————□—————□—————□———\n", + ", 9.693108430552655, 83)" + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p = 2\n", + "ε = 0.5\n", + "(initial_γs_2, initial_βs_2) = (2 * π * randn(p) * init_stddev, 2 * π * randn(p) * init_stddev)\n", + "(circ_opt_2, qaoa_2_objective, qaoa_2_rounds) = optimize_ws_qaoa(\n", + " to_edge_weighted_graph(graph), ws_partitioning, ε, init_state_randomized, p, rounds, lr, (initial_γs_2, initial_βs_2))" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qaoa_2_objective_ratio = max_cut / qaoa_2_objective\n", + "result = apply(prepare_init_state(ws_partitioning, ε), circ_opt_2.moments)\n", + "plot_result(result)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Barely 60% chance that we get the optimal solution. Now let's try to find the optimal cut again in Warm-starting QAOA with less depth:" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(12, ([2, 4, 5, 7], [1, 3, 6, 8]))" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ws_partitioning = [1.0, 0.0, 1.0, 0.0, 0.0 ,1.0, 0.0, 0.5]\n", + "ε = 0.4\n", + "init_state_randomized = false\n", + "p = 8\n", + "rounds = 300\n", + "lr = 0.01\n", + "(max_cut, max_partition)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 0: average objective = 6.180000000000004\n", + "Training, round 1: average objective=6.232907546689349\n", + "Training, round 2: average objective=6.420117432798197\n", + "Training, round 3: average objective=6.60966612362207\n", + "Training, round 4: average objective=6.803166602336936\n", + "Training, round 5: average objective=6.996137873194142\n", + "Training, round 6: average objective=7.18335748995395\n", + "Training, round 7: average objective=7.363438039679869\n", + "Training, round 8: average objective=7.536964868332065\n", + "Training, round 9: average objective=7.701995899813048\n", + "Training, round 10: average objective=7.8547901029639995\n", + "Training, round 11: average objective=7.991693374354431\n", + "Training, round 12: average objective=8.110181909043412\n", + "Training, round 13: average objective=8.209987533066762\n", + "Training, round 14: average objective=8.293347633343933\n", + "Training, round 15: average objective=8.364113639532974\n", + "Training, round 16: average objective=8.426301868817328\n", + "Training, round 17: average objective=8.4829500764859\n", + "Training, round 18: average objective=8.535702185982093\n", + "Training, round 19: average objective=8.58498481751636\n", + "Training, round 20: average objective=8.630342831157925\n", + "Training, round 21: average objective=8.670778510372944\n", + "Training, round 22: average objective=8.705304006347756\n", + "Training, round 23: average objective=8.733657509961377\n", + "Training, round 24: average objective=8.756694882493587\n", + "Training, round 25: average objective=8.776125303240661\n", + "Training, round 26: average objective=8.793789463855868\n", + "Training, round 27: average objective=8.810981279842501\n", + "Training, round 28: average objective=8.828189769218099\n", + "Training, round 29: average objective=8.845335198000916\n", + "Training, round 30: average objective=8.862298446622315\n", + "Training, round 31: average objective=8.87940436428044\n", + "Training, round 32: average objective=8.89757256147828\n", + "Training, round 33: average objective=8.918061944504366\n", + "Training, round 34: average objective=8.941965699364117\n", + "Training, round 35: average objective=8.969747505999544\n", + "Training, round 36: average objective=9.001081924891366\n", + "Training, round 37: average objective=9.035054642360805\n", + "Training, round 38: average objective=9.070513225703479\n", + "Training, round 39: average objective=9.10625376908029\n", + "Training, round 40: average objective=9.140926807748077\n", + "Training, round 41: average objective=9.172916017308655\n", + "Training, round 42: average objective=9.200558223883696\n", + "Training, round 43: average objective=9.222727423728966\n", + "Training, round 44: average objective=9.239353679439867\n", + "Training, round 45: average objective=9.25144590598154\n", + "Training, round 46: average objective=9.260634414478448\n", + "Training, round 47: average objective=9.268656262819244\n", + "Training, round 48: average objective=9.277094609219732\n", + "Training, round 49: average objective=9.287273187559972\n", + "Training, round 50: average objective=9.300061902965856\n", + "Training, round 51: average objective=9.315660368150624\n", + "Training, round 52: average objective=9.333616763174192\n", + "Training, round 53: average objective=9.353073777126703\n", + "Training, round 54: average objective=9.373009666900678\n", + "Training, round 55: average objective=9.392360508691578\n", + "Training, round 56: average objective=9.410126855664355\n", + "Training, round 57: average objective=9.4255796649644\n", + "Training, round 58: average objective=9.43848716072412\n", + "Training, round 59: average objective=9.449188661918114\n", + "Training, round 60: average objective=9.458444832372255\n", + "Training, round 61: average objective=9.467153430750141\n", + "Training, round 62: average objective=9.47606485448916\n", + "Training, round 63: average objective=9.485575870989223\n", + "Training, round 64: average objective=9.495634590203437\n", + "Training, round 65: average objective=9.50578178601776\n", + "Training, round 66: average objective=9.515338801075924\n", + "Training, round 67: average objective=9.523686549911524\n", + "Training, round 68: average objective=9.530504319126635\n", + "Training, round 69: average objective=9.5358493772594\n", + "Training, round 70: average objective=9.540067631440705\n", + "Training, round 71: average objective=9.543629637481956\n", + "Training, round 72: average objective=9.54698960897412\n", + "Training, round 73: average objective=9.550493171572265\n", + "Training, round 74: average objective=9.554319224174687\n", + "Training, round 75: average objective=9.558466795310842\n", + "Training, round 76: average objective=9.562807930943126\n", + "Training, round 77: average objective=9.567180552803881\n", + "Training, round 78: average objective=9.57146265395017\n", + "Training, round 79: average objective=9.575593974991698\n", + "Training, round 80: average objective=9.579571070655827\n", + "Training, round 81: average objective=9.583440459367669\n", + "Training, round 82: average objective=9.587283149828309\n", + "Training, round 83: average objective=9.591177112969644\n", + "Training, round 84: average objective=9.595158971844494\n", + "Training, round 85: average objective=9.59921752163239\n", + "Training, round 86: average objective=9.603322542125404\n", + "Training, round 87: average objective=9.607451873140953\n", + "Training, round 88: average objective=9.611595509217462\n", + "Training, round 89: average objective=9.615746903326805\n", + "Training, round 90: average objective=9.619903161889109\n", + "Training, round 91: average objective=9.624070758672183\n", + "Training, round 92: average objective=9.62826406889463\n", + "Training, round 93: average objective=9.63249801273357\n", + "Training, round 94: average objective=9.63678731982453\n", + "Training, round 95: average objective=9.64115426603935\n", + "Training, round 96: average objective=9.645632293659714\n", + "Training, round 97: average objective=9.650262261607898\n", + "Training, round 98: average objective=9.655087634780973\n", + "Training, round 99: average objective=9.660154044639327\n", + "Training, round 100: average objective=9.665507837549221\n", + "Training, round 101: average objective=9.671192149901636\n", + "Training, round 102: average objective=9.677245462259298\n", + "Training, round 103: average objective=9.683707770812848\n", + "Training, round 104: average objective=9.69062588848767\n", + "Training, round 105: average objective=9.698054703872222\n", + "Training, round 106: average objective=9.70605642582029\n", + "Training, round 107: average objective=9.714701317359172\n", + "Training, round 108: average objective=9.724067682939097\n", + "Training, round 109: average objective=9.73423855607528\n", + "Training, round 110: average objective=9.745298369050966\n", + "Training, round 111: average objective=9.757334314117534\n", + "Training, round 112: average objective=9.770440806546073\n", + "Training, round 113: average objective=9.784722355420856\n", + "Training, round 114: average objective=9.8002941856146\n", + "Training, round 115: average objective=9.817280973960353\n", + "Training, round 116: average objective=9.83581316375157\n", + "Training, round 117: average objective=9.856019544548925\n", + "Training, round 118: average objective=9.87801503497346\n", + "Training, round 119: average objective=9.901888208862673\n", + "Training, round 120: average objective=9.927687219606057\n", + "Training, round 121: average objective=9.955406961038348\n", + "Training, round 122: average objective=9.984976243241078\n", + "Training, round 123: average objective=10.016248612806578\n", + "Training, round 124: average objective=10.048994707689554\n", + "Training, round 125: average objective=10.082900465528182\n", + "Training, round 126: average objective=10.11757344425079\n", + "Training, round 127: average objective=10.152559210000936\n", + "Training, round 128: average objective=10.187367661383806\n", + "Training, round 129: average objective=10.22150347608371\n", + "Training, round 130: average objective=10.254500285117565\n", + "Training, round 131: average objective=10.285951874900078\n", + "Training, round 132: average objective=10.31553960642343\n", + "Training, round 133: average objective=10.343058209396194\n", + "Training, round 134: average objective=10.368440243545376\n", + "Training, round 135: average objective=10.391774895395335\n", + "Training, round 136: average objective=10.413311154729426\n", + "Training, round 137: average objective=10.433437135616614\n", + "Training, round 138: average objective=10.452634843848893\n", + "Training, round 139: average objective=10.471413890546419\n", + "Training, round 140: average objective=10.49023817764435\n", + "Training, round 141: average objective=10.509458845285717\n", + "Training, round 142: average objective=10.529265457536852\n", + "Training, round 143: average objective=10.54966598136112\n", + "Training, round 144: average objective=10.570501482135487\n", + "Training, round 145: average objective=10.591490060971402\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 146: average objective=10.612287781139761\n", + "Training, round 147: average objective=10.6325507030798\n", + "Training, round 148: average objective=10.651984606846192\n", + "Training, round 149: average objective=10.670376663096244\n", + "Training, round 150: average objective=10.687606450618743\n", + "Training, round 151: average objective=10.703640825255704\n", + "Training, round 152: average objective=10.71851574888912\n", + "Training, round 153: average objective=10.732312016201899\n", + "Training, round 154: average objective=10.745131224790429\n", + "Training, round 155: average objective=10.757073166430084\n", + "Training, round 156: average objective=10.768218280407652\n", + "Training, round 157: average objective=10.77861594047651\n", + "Training, round 158: average objective=10.78828150991492\n", + "Training, round 159: average objective=10.797200810371447\n", + "Training, round 160: average objective=10.805343381865354\n", + "Training, round 161: average objective=10.812678297660167\n", + "Training, round 162: average objective=10.819188985371825\n", + "Training, round 163: average objective=10.824881001923046\n", + "Training, round 164: average objective=10.829783578230204\n", + "Training, round 165: average objective=10.83394534478155\n", + "Training, round 166: average objective=10.837428723287351\n", + "Training, round 167: average objective=10.8403031179747\n", + "Training, round 168: average objective=10.842639814269866\n", + "Training, round 169: average objective=10.844508342548643\n", + "Training, round 170: average objective=10.845973717782961\n", + "Training, round 171: average objective=10.847095289804827\n", + "Training, round 172: average objective=10.8479265532551\n", + "Training, round 173: average objective=10.848515208570728\n", + "Training, round 174: average objective=10.848903737212206\n", + "Training, round 175: average objective=10.849130245876045\n", + "Training, round 176: average objective=10.849229237520396\n", + "Training, round 177: average objective=10.849232354860359\n", + "Training, round 178: average objective=10.849168674800941\n", + "Training, round 179: average objective=10.849064433722313\n", + "Training, round 180: average objective=10.8489425441589\n", + "Training, round 181: average objective=10.848822259883688\n", + "Training, round 182: average objective=10.848718981981403\n", + "Training, round 183: average objective=10.848644618868262\n", + "Training, round 184: average objective=10.848607429332436\n", + "Training, round 185: average objective=10.8486119672777\n", + "Training, round 186: average objective=10.84865902563861\n", + "Training, round 187: average objective=10.848745773275835\n", + "Training, round 188: average objective=10.848866284706155\n", + "Training, round 189: average objective=10.84901254484707\n", + "Training, round 190: average objective=10.849175689689577\n", + "Training, round 191: average objective=10.84934691216113\n", + "Training, round 192: average objective=10.849518531334938\n", + "Training, round 193: average objective=10.84968445493076\n", + "Training, round 194: average objective=10.849840484493408\n", + "Training, round 195: average objective=10.8499843177667\n", + "Training, round 196: average objective=10.85011525395359\n", + "Training, round 197: average objective=10.850233805508601\n", + "Training, round 198: average objective=10.85034130113494\n", + "Training, round 199: average objective=10.850439476209907\n", + "Training, round 200: average objective=10.850530072738861\n", + "Training, round 201: average objective=10.850614640034607\n", + "No significant improvement, early stopping...\n" + ] + }, + { + "data": { + "text/plain": [ + "(\n", + " 8 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | \n", + " 7 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | \n", + " 6 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | \n", + " 5 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | \n", + " 4 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | \n", + " 3 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | \n", + " 2 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | \n", + " 1 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + ", 10.850614640034607, 202)" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(circ_opt_ws_8, ws_qaoa_8_objective, ws_qaoa_8_rounds) = optimize_ws_qaoa(\n", + " to_edge_weighted_graph(graph), ws_partitioning, ε, init_state_randomized, p, rounds, lr, (initial_γs_8, initial_βs_8))" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ws_qaoa_8_objective_ratio = max_cut / ws_qaoa_8_objective\n", + "result = apply(prepare_init_state(ws_partitioning, ε), circ_opt_ws_8.moments)\n", + "plot_result(result)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Interestingly, as you see here, the warm-start does not scale well with high depth. If the depth is good enough for the normal QAOA, WS-QAOA should actually at least perform as good as normal QAOA. However, the problem might lie in our gradient calculation. When the warm-starting is used, the derivative of the mixer matrix becomes really complicated, and the gradient calculation (the current method is a single forward difference) is not stable enough to represent that complexity.\n", + "\n", + "However, if we lower the depth furthermore:" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 0: average objective = 7.124999999999999\n", + "Training, round 1: average objective=4.868432206135017\n", + "Training, round 2: average objective=4.978986129469034\n", + "Training, round 3: average objective=5.104069238065331\n", + "Training, round 4: average objective=5.2420584551602705\n", + "Training, round 5: average objective=5.391231273145956\n", + "Training, round 6: average objective=5.549738418014611\n", + "Training, round 7: average objective=5.715593875288891\n", + "Training, round 8: average objective=5.886682160182411\n", + "Training, round 9: average objective=6.060782935167382\n", + "Training, round 10: average objective=6.235613360358924\n", + "Training, round 11: average objective=6.408889490955291\n", + "Training, round 12: average objective=6.578408058112851\n", + "Training, round 13: average objective=6.742149161917303\n", + "Training, round 14: average objective=6.898398463354793\n", + "Training, round 15: average objective=7.045880055567503\n", + "Training, round 16: average objective=7.183878580598064\n", + "Training, round 17: average objective=7.312313471854775\n", + "Training, round 18: average objective=7.43171857773152\n", + "Training, round 19: average objective=7.543101729410033\n", + "Training, round 20: average objective=7.647718784331684\n", + "Training, round 21: average objective=7.74684753538925\n", + "Training, round 22: average objective=7.841640053241269\n", + "Training, round 23: average objective=7.933073335126274\n", + "Training, round 24: average objective=8.021967043708639\n", + "Training, round 25: average objective=8.109023462667079\n", + "Training, round 26: average objective=8.19486244193931\n", + "Training, round 27: average objective=8.280040243180943\n", + "Training, round 28: average objective=8.365052721745371\n", + "Training, round 29: average objective=8.450327391662729\n", + "Training, round 30: average objective=8.536210482576298\n", + "Training, round 31: average objective=8.622953073654383\n", + "Training, round 32: average objective=8.71070034171047\n", + "Training, round 33: average objective=8.799485083428415\n", + "Training, round 34: average objective=8.889227266915238\n", + "Training, round 35: average objective=8.979739536283418\n", + "Training, round 36: average objective=9.070737769148366\n", + "Training, round 37: average objective=9.161855145070525\n", + "Training, round 38: average objective=9.252659691461524\n", + "Training, round 39: average objective=9.342674463439558\n", + "Training, round 40: average objective=9.431397814874732\n", + "Training, round 41: average objective=9.518323946551625\n", + "Training, round 42: average objective=9.602963222696296\n", + "Training, round 43: average objective=9.684860982389718\n", + "Training, round 44: average objective=9.76361431171479\n", + "Training, round 45: average objective=9.838886093702328\n", + "Training, round 46: average objective=9.910416321961385\n", + "Training, round 47: average objective=9.978029458457797\n", + "Training, round 48: average objective=10.041637741568206\n", + "Training, round 49: average objective=10.10124116000063\n", + "Training, round 50: average objective=10.156922418042544\n", + "Training, round 51: average objective=10.208838831371772\n", + "Training, round 52: average objective=10.257210502091421\n", + "Training, round 53: average objective=10.302306279044055\n", + "Training, round 54: average objective=10.344428582871423\n", + "Training, round 55: average objective=10.383897324523382\n", + "Training, round 56: average objective=10.421034223760111\n", + "Training, round 57: average objective=10.456149524447465\n", + "Training, round 58: average objective=10.489531023783636\n", + "Training, round 59: average objective=10.521435118035717\n", + "Training, round 60: average objective=10.552082162430251\n", + "Training, round 61: average objective=10.581653614086004\n", + "Training, round 62: average objective=10.610292809644562\n", + "Training, round 63: average objective=10.638107592120097\n", + "Training, round 64: average objective=10.665174142971454\n", + "Training, round 65: average objective=10.691542876536314\n", + "Training, round 66: average objective=10.717243883850685\n", + "Training, round 67: average objective=10.74229147209832\n", + "Training, round 68: average objective=10.766689516528736\n", + "Training, round 69: average objective=10.790436220780885\n", + "Training, round 70: average objective=10.813527378847706\n", + "Training, round 71: average objective=10.835958370198435\n", + "Training, round 72: average objective=10.85772612024046\n", + "Training, round 73: average objective=10.8788302137225\n", + "Training, round 74: average objective=10.899273280338948\n", + "Training, round 75: average objective=10.919060839687296\n", + "Training, round 76: average objective=10.938201017811448\n", + "Training, round 77: average objective=10.95670404177814\n", + "Training, round 78: average objective=10.974581519922642\n", + "Training, round 79: average objective=10.9918461805885\n", + "Training, round 80: average objective=11.008510723695473\n", + "Training, round 81: average objective=11.0245878189171\n", + "Training, round 82: average objective=11.040089176127239\n", + "Training, round 83: average objective=11.055025780480017\n", + "Training, round 84: average objective=11.06940750886439\n", + "Training, round 85: average objective=11.083243205188356\n", + "Training, round 86: average objective=11.096540580807904\n", + "Training, round 87: average objective=11.10930658469426\n", + "Training, round 88: average objective=11.121547435150735\n", + "Training, round 89: average objective=11.133269085970277\n", + "Training, round 90: average objective=11.144477463644883\n", + "Training, round 91: average objective=11.155178597963737\n", + "Training, round 92: average objective=11.165379076541292\n", + "Training, round 93: average objective=11.175086138768123\n", + "Training, round 94: average objective=11.184307882849389\n", + "Training, round 95: average objective=11.193053489282173\n", + "Training, round 96: average objective=11.201333224153581\n", + "Training, round 97: average objective=11.209158323344395\n", + "Training, round 98: average objective=11.216541088065249\n", + "Training, round 99: average objective=11.223494672812542\n", + "Training, round 100: average objective=11.230033033637111\n", + "Training, round 101: average objective=11.236170716567784\n", + "Training, round 102: average objective=11.241922812429\n", + "Training, round 103: average objective=11.247304609318057\n", + "Training, round 104: average objective=11.252331565276577\n", + "Training, round 105: average objective=11.257019175917033\n", + "Training, round 106: average objective=11.261382853086515\n", + "Training, round 107: average objective=11.26543792931706\n", + "Training, round 108: average objective=11.269199537782255\n", + "Training, round 109: average objective=11.27268263093827\n", + "Training, round 110: average objective=11.275901933445944\n", + "Training, round 111: average objective=11.278871990628538\n", + "Training, round 112: average objective=11.28160713376362\n", + "Training, round 113: average objective=11.28412152640389\n", + "Training, round 114: average objective=11.286429038103984\n", + "Training, round 115: average objective=11.28854335915227\n", + "Training, round 116: average objective=11.290477904452263\n", + "Training, round 117: average objective=11.292245753740097\n", + "Training, round 118: average objective=11.293859604434232\n", + "Training, round 119: average objective=11.295331700500256\n", + "Training, round 120: average objective=11.296673793460315\n", + "Training, round 121: average objective=11.297897077842713\n", + "Training, round 122: average objective=11.299012176304368\n", + "Training, round 123: average objective=11.300029050967602\n", + "Training, round 124: average objective=11.300957010023602\n", + "Training, round 125: average objective=11.301804722652705\n", + "Training, round 126: average objective=11.302580204885356\n", + "Training, round 127: average objective=11.303290843221864\n", + "Training, round 128: average objective=11.303943437121712\n", + "Training, round 129: average objective=11.304544222095004\n", + "Training, round 130: average objective=11.305098933030722\n", + "Training, round 131: average objective=11.305612830419\n", + "Training, round 132: average objective=11.306090726588348\n", + "Training, round 133: average objective=11.306537036978664\n", + "Training, round 134: average objective=11.30695581334878\n", + "Training, round 135: average objective=11.307350748869442\n", + "Training, round 136: average objective=11.307725245173106\n", + "Training, round 137: average objective=11.308082375348453\n", + "Training, round 138: average objective=11.30842494524091\n", + "Training, round 139: average objective=11.308755501400574\n", + "Training, round 140: average objective=11.30907632775913\n", + "Training, round 141: average objective=11.30938946185438\n", + "Training, round 142: average objective=11.309696719464434\n", + "Training, round 143: average objective=11.309999755276806\n", + "Training, round 144: average objective=11.310300026792001\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 145: average objective=11.310598842609167\n", + "Training, round 146: average objective=11.310897352401422\n", + "Training, round 147: average objective=11.311196594743981\n", + "Training, round 148: average objective=11.311497501166546\n", + "Training, round 149: average objective=11.311800900527075\n", + "Training, round 150: average objective=11.312107539484593\n", + "Training, round 151: average objective=11.312418111328617\n", + "Training, round 152: average objective=11.312733210397814\n", + "Training, round 153: average objective=11.313053428414056\n", + "No significant improvement, early stopping...\n" + ] + }, + { + "data": { + "text/plain": [ + "(\n", + " 8 ——□—————□—————□—————□———\n", + " | | | | \n", + " 7 ——□—————□—————□—————□———\n", + " | | | | \n", + " 6 ——□—————□—————□—————□———\n", + " | | | | \n", + " 5 ——□—————□—————□—————□———\n", + " | | | | \n", + " 4 ——□—————□—————□—————□———\n", + " | | | | \n", + " 3 ——□—————□—————□—————□———\n", + " | | | | \n", + " 2 ——□—————□—————□—————□———\n", + " | | | | \n", + " 1 ——□—————□—————□—————□———\n", + ", 11.313053428414056, 154)" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p = 2\n", + "ε = 0.25\n", + "(circ_opt_ws_2, ws_qaoa_2_objective, ws_qaoa_2_rounds) = optimize_ws_qaoa(\n", + " to_edge_weighted_graph(graph), ws_partitioning, ε, init_state_randomized, p, rounds, lr)" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ws_qaoa_2_objective_ratio = max_cut / ws_qaoa_2_objective\n", + "result = apply(prepare_init_state(ws_partitioning, ε), circ_opt_ws_2.moments, (initial_γs_2, initial_βs_2))\n", + "plot_result(result)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we see the real benefit of warm-starting, it can find the solution with high probability even at depth 4, where normal QAOA cannot. Also, as you can see, now the algorithm finds with high probability, only one of the solutions. This is the effect of warm-starting, since the initial state is closer to one of the optimal solutions, our state collapses directly into its closest optimal solution." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is even possible to further lower the depth, if we switch to recursive WS-QAOA. It might however be a bit unstable sometimes, so you may need to run it again." + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 0: average objective = 6.749999999999998\n", + "Training, round 1: average objective=5.909349354332559\n", + "Training, round 2: average objective=5.943285566724649\n", + "Training, round 3: average objective=5.9801773743044375\n", + "Training, round 4: average objective=6.019985824249795\n", + "Training, round 5: average objective=6.062665250033914\n", + "Training, round 6: average objective=6.1081593038469215\n", + "Training, round 7: average objective=6.156397406381562\n", + "Training, round 8: average objective=6.207291523388058\n", + "Training, round 9: average objective=6.260733566974559\n", + "Training, round 10: average objective=6.316593134812104\n", + "Training, round 11: average objective=6.3747155921088545\n", + "Training, round 12: average objective=6.4349206460931825\n", + "Training, round 13: average objective=6.497001440452132\n", + "Training, round 14: average objective=6.560724135926652\n", + "Training, round 15: average objective=6.625828097526497\n", + "Training, round 16: average objective=6.692027253801672\n", + "Training, round 17: average objective=6.75901180894655\n", + "Training, round 18: average objective=6.826451819665978\n", + "Training, round 19: average objective=6.894001382277629\n", + "Training, round 20: average objective=6.961304838902009\n", + "Training, round 21: average objective=7.0280048250953575\n", + "Training, round 22: average objective=7.093751899271992\n", + "Training, round 23: average objective=7.158216633967527\n", + "Training, round 24: average objective=7.2211041212774045\n", + "Training, round 25: average objective=7.2821704007449055\n", + "Training, round 26: average objective=7.341240338959166\n", + "Training, round 27: average objective=7.398225347686743\n", + "Training, round 28: average objective=7.4531392683904585\n", + "Training, round 29: average objective=7.506108739833122\n", + "Training, round 30: average objective=7.557374359524378\n", + "Training, round 31: average objective=7.607279199136142\n", + "Training, round 32: average objective=7.6562427918417155\n", + "Training, round 33: average objective=7.704722801701468\n", + "Training, round 34: average objective=7.7531694806067195\n", + "Training, round 35: average objective=7.801980692093453\n", + "Training, round 36: average objective=7.851466668315839\n", + "Training, round 37: average objective=7.901828085500659\n", + "Training, round 38: average objective=7.9531490940399845\n", + "Training, round 39: average objective=8.005402444944398\n", + "Training, round 40: average objective=8.058464319386342\n", + "Training, round 41: average objective=8.112131970910621\n", + "Training, round 42: average objective=8.166143789603044\n", + "Training, round 43: average objective=8.220198564196394\n", + "Training, round 44: average objective=8.273973267013988\n", + "Training, round 45: average objective=8.327139339631266\n", + "Training, round 46: average objective=8.379376473037999\n", + "Training, round 47: average objective=8.430385709924217\n", + "Training, round 48: average objective=8.479899605038566\n", + "Training, round 49: average objective=8.52769155624732\n", + "Training, round 50: average objective=8.573582353848144\n", + "Training, round 51: average objective=8.617444480327203\n", + "Training, round 52: average objective=8.659203306271388\n", + "Training, round 53: average objective=8.698835281519646\n", + "Training, round 54: average objective=8.736363179702868\n", + "Training, round 55: average objective=8.771848289717177\n", + "Training, round 56: average objective=8.805380233791226\n", + "Training, round 57: average objective=8.837065553442415\n", + "Training, round 58: average objective=8.86701614750941\n", + "Training, round 59: average objective=8.895338666353585\n", + "Training, round 60: average objective=8.922126021104926\n", + "Training, round 61: average objective=8.947451895155542\n", + "Training, round 62: average objective=8.97136805142264\n", + "Training, round 63: average objective=8.993905151181496\n", + "Training, round 64: average objective=9.015075665627574\n", + "Training, round 65: average objective=9.034879416438937\n", + "Training, round 66: average objective=9.053309308241795\n", + "Training, round 67: average objective=9.070358027953784\n", + "Training, round 68: average objective=9.086023919323548\n", + "Training, round 69: average objective=9.100315955281658\n", + "Training, round 70: average objective=9.11325736077093\n", + "Training, round 71: average objective=9.12488742136118\n", + "Training, round 72: average objective=9.135261780053069\n", + "Training, round 73: average objective=9.144450948060907\n", + "Training, round 74: average objective=9.152537663603756\n", + "Training, round 75: average objective=9.159613254382366\n", + "Training, round 76: average objective=9.16577358324232\n", + "Training, round 77: average objective=9.171114975178511\n", + "Training, round 78: average objective=9.175730389246116\n", + "Training, round 79: average objective=9.179706516573502\n", + "Training, round 80: average objective=9.18312175606409\n", + "Training, round 81: average objective=9.186045092616506\n", + "Training, round 82: average objective=9.188535973332986\n", + "Training, round 83: average objective=9.190644881014503\n", + "Training, round 84: average objective=9.192414720778284\n", + "Training, round 85: average objective=9.193882074007682\n", + "Training, round 86: average objective=9.195079012567136\n", + "Training, round 87: average objective=9.196034511968637\n", + "Training, round 88: average objective=9.19677566635605\n", + "Training, round 89: average objective=9.197328555259098\n", + "Training, round 90: average objective=9.197718680880065\n", + "Training, round 91: average objective=9.1979711021472\n", + "Training, round 92: average objective=9.198110242966528\n", + "Training, round 93: average objective=9.198159491815078\n", + "Training, round 94: average objective=9.198140698207283\n", + "Training, round 95: average objective=9.1980736377195\n", + "Training, round 96: average objective=9.197975591085465\n", + "Training, round 97: average objective=9.197861033002752\n", + "Training, round 98: average objective=9.197741500689569\n", + "Training, round 99: average objective=9.197625644464374\n", + "Training, round 100: average objective=9.197519431834836\n", + "Training, round 101: average objective=9.197426497129875\n", + "Training, round 102: average objective=9.197348605136435\n", + "Training, round 103: average objective=9.197286051485108\n", + "Training, round 104: average objective=9.197238209705386\n", + "Training, round 105: average objective=9.197203904955279\n", + "Training, round 106: average objective=9.197181715147707\n", + "Training, round 107: average objective=9.197170259930328\n", + "Training, round 108: average objective=9.197168370683151\n", + "Training, round 109: average objective=9.197175100176064\n", + "Training, round 110: average objective=9.19718973305175\n", + "Training, round 111: average objective=9.19721172685628\n", + "Training, round 112: average objective=9.197240616301688\n", + "Training, round 113: average objective=9.197275928817842\n", + "Training, round 114: average objective=9.197317099950071\n", + "Training, round 115: average objective=9.19736340793214\n", + "Training, round 116: average objective=9.197413983154568\n", + "No significant improvement, early stopping...\n", + "Training, round 0: average objective = 4.125\n", + "Training, round 1: average objective=4.612025189178821\n", + "Training, round 2: average objective=4.62397972379445\n", + "Training, round 3: average objective=4.635970192878759\n", + "Training, round 4: average objective=4.647942952272187\n", + "Training, round 5: average objective=4.659841967732499\n", + "Training, round 6: average objective=4.67160905668486\n", + "Training, round 7: average objective=4.6831845696880405\n", + "Training, round 8: average objective=4.694508089928961\n", + "Training, round 9: average objective=4.705519178517808\n", + "Training, round 10: average objective=4.716158755187285\n", + "Training, round 11: average objective=4.726370537133088\n", + "Training, round 12: average objective=4.736102489261638\n", + "Training, round 13: average objective=4.745309071583\n", + "Training, round 14: average objective=4.753953148075098\n", + "Training, round 15: average objective=4.762008410769205\n", + "Training, round 16: average objective=4.769461498326782\n", + "Training, round 17: average objective=4.77631359877502\n", + "Training, round 18: average objective=4.782581416158115\n", + "Training, round 19: average objective=4.7882970307682164\n", + "Training, round 20: average objective=4.79350605360253\n", + "Training, round 21: average objective=4.798264197839964\n", + "Training, round 22: average objective=4.802632858200791\n", + "Training, round 23: average objective=4.806673629365623\n", + "Training, round 24: average objective=4.810443414265995\n", + "Training, round 25: average objective=4.813990541319041\n", + "Training, round 26: average objective=4.817352233844016\n", + "Training, round 27: average objective=4.82055388026988\n", + "Training, round 28: average objective=4.823609424495121\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 29: average objective=4.826522944400405\n", + "Training, round 30: average objective=4.829290596830843\n", + "Training, round 31: average objective=4.8319027006430355\n", + "Training, round 32: average objective=4.834346040876888\n", + "Training, round 33: average objective=4.836605797711579\n", + "Training, round 34: average objective=4.838667361737879\n", + "Training, round 35: average objective=4.840518063807275\n", + "Training, round 36: average objective=4.842148454581338\n", + "Training, round 37: average objective=4.843553472262902\n", + "Training, round 38: average objective=4.844733292788668\n", + "Training, round 39: average objective=4.845693725731072\n", + "Training, round 40: average objective=4.84644638007799\n", + "Training, round 41: average objective=4.847008289848958\n", + "Training, round 42: average objective=4.847401145057797\n", + "Training, round 43: average objective=4.8476501405334815\n", + "Training, round 44: average objective=4.847782502057576\n", + "Training, round 45: average objective=4.847825843461652\n", + "Training, round 46: average objective=4.847806539061569\n", + "Training, round 47: average objective=4.847748293185889\n", + "Training, round 48: average objective=4.847671046815922\n", + "Training, round 49: average objective=4.847590324728552\n", + "Training, round 50: average objective=4.847517034653663\n", + "Training, round 51: average objective=4.847457714805998\n", + "Training, round 52: average objective=4.847415122090899\n", + "Training, round 53: average objective=4.847389047945832\n", + "Training, round 54: average objective=4.847377256095227\n", + "Training, round 55: average objective=4.847376368428847\n", + "Training, round 56: average objective=4.847382729446506\n", + "Training, round 57: average objective=4.847393014669648\n", + "Training, round 58: average objective=4.847404687072766\n", + "Training, round 59: average objective=4.847416244632307\n", + "Training, round 60: average objective=4.847427213531169\n", + "Training, round 61: average objective=4.847438082060623\n", + "Training, round 62: average objective=4.8474499939064035\n", + "Training, round 63: average objective=4.847464423448473\n", + "Training, round 64: average objective=4.847482886886075\n", + "Training, round 65: average objective=4.847506656189201\n", + "Training, round 66: average objective=4.847536502833394\n", + "Training, round 67: average objective=4.847572574770487\n", + "Training, round 68: average objective=4.847614344321801\n", + "No significant improvement, early stopping...\n", + "Training, round 0: average objective = 2.7499999999999996\n", + "Training, round 1: average objective=2.7868982489486305\n", + "Training, round 2: average objective=2.8053594747119863\n", + "Training, round 3: average objective=2.825337013965052\n", + "Training, round 4: average objective=2.846783385047353\n", + "Training, round 5: average objective=2.8696508987766025\n", + "Training, round 6: average objective=2.8938896574086623\n", + "Training, round 7: average objective=2.919445847587407\n", + "Training, round 8: average objective=2.946260356904716\n", + "Training, round 9: average objective=2.974267683482314\n", + "Training, round 10: average objective=3.0033950735567956\n", + "Training, round 11: average objective=3.033561925178045\n", + "Training, round 12: average objective=3.064679311698571\n", + "Training, round 13: average objective=3.0966498141790018\n", + "Training, round 14: average objective=3.129367481445974\n", + "Training, round 15: average objective=3.162718014361195\n", + "Training, round 16: average objective=3.1965791902963714\n", + "Training, round 17: average objective=3.2308214823845094\n", + "Training, round 18: average objective=3.2653089168698433\n", + "Training, round 19: average objective=3.299900105958609\n", + "Training, round 20: average objective=3.3344497428054187\n", + "Training, round 21: average objective=3.3688100096661993\n", + "Training, round 22: average objective=3.402832476291093\n", + "Training, round 23: average objective=3.436370173983698\n", + "Training, round 24: average objective=3.469279663286055\n", + "Training, round 25: average objective=3.5014236553929976\n", + "Training, round 26: average objective=3.532673389694016\n", + "Training, round 27: average objective=3.562911227686372\n", + "Training, round 28: average objective=3.5920332977600475\n", + "Training, round 29: average objective=3.619951883046837\n", + "Training, round 30: average objective=3.6465976193258394\n", + "Training, round 31: average objective=3.671921419905926\n", + "Training, round 32: average objective=3.695895968814797\n", + "Training, round 33: average objective=3.718516501169872\n", + "Training, round 34: average objective=3.739800815927925\n", + "Training, round 35: average objective=3.7597886460105654\n", + "Training, round 36: average objective=3.7785400296112863\n", + "Training, round 37: average objective=3.7961328686989884\n", + "Training, round 38: average objective=3.8126595713645526\n", + "Training, round 39: average objective=3.828223163337221\n", + "Training, round 40: average objective=3.842932871094935\n", + "Training, round 41: average objective=3.856899528617066\n", + "Training, round 42: average objective=3.870231070420651\n", + "Training, round 43: average objective=3.883028403300673\n", + "Training, round 44: average objective=3.895381896244613\n", + "Training, round 45: average objective=3.9073686527380804\n", + "Training, round 46: average objective=3.9190507321501826\n", + "Training, round 47: average objective=3.9304743539902622\n", + "Training, round 48: average objective=3.941669886223864\n", + "Training, round 49: average objective=3.9526527247522054\n", + "Training, round 50: average objective=3.963424893820939\n", + "Training, round 51: average objective=3.9739768285695067\n", + "Training, round 52: average objective=3.984289858111744\n", + "Training, round 53: average objective=3.9943386239726015\n", + "Training, round 54: average objective=4.004093681115417\n", + "Training, round 55: average objective=4.013523870062576\n", + "Training, round 56: average objective=4.022598560467801\n", + "Training, round 57: average objective=4.031289732741523\n", + "Training, round 58: average objective=4.039573526026974\n", + "Training, round 59: average objective=4.0474316268701385\n", + "Training, round 60: average objective=4.05485207203307\n", + "Training, round 61: average objective=4.06182976400765\n", + "Training, round 62: average objective=4.0683665037309735\n", + "Training, round 63: average objective=4.074470685839733\n", + "Training, round 64: average objective=4.080156653410958\n", + "Training, round 65: average objective=4.085443789442712\n", + "Training, round 66: average objective=4.090355347754207\n", + "Training, round 67: average objective=4.094917241305463\n", + "Training, round 68: average objective=4.099156752565595\n", + "Training, round 69: average objective=4.1031013204830895\n", + "Training, round 70: average objective=4.1067774398306565\n", + "Training, round 71: average objective=4.11020977598279\n", + "Training, round 72: average objective=4.113420471896408\n", + "Training, round 73: average objective=4.11642876531581\n", + "Training, round 74: average objective=4.119250775914792\n", + "Training, round 75: average objective=4.121899572844127\n", + "Training, round 76: average objective=4.124385417808636\n", + "Training, round 77: average objective=4.12671616858026\n", + "Training, round 78: average objective=4.128897731846889\n", + "Training, round 79: average objective=4.13093466628513\n", + "Training, round 80: average objective=4.132830678059603\n", + "Training, round 81: average objective=4.134589116346044\n", + "Training, round 82: average objective=4.136213408709659\n", + "Training, round 83: average objective=4.137707377623189\n", + "Training, round 84: average objective=4.1390754572841475\n", + "Training, round 85: average objective=4.140322863660425\n", + "Training, round 86: average objective=4.141455561236329\n", + "Training, round 87: average objective=4.142480222741257\n", + "Training, round 88: average objective=4.143404091438363\n", + "Training, round 89: average objective=4.144234801453875\n", + "Training, round 90: average objective=4.144980182927852\n", + "Training, round 91: average objective=4.145648049625162\n", + "Training, round 92: average objective=4.146246001727059\n", + "Training, round 93: average objective=4.146781259137721\n", + "Training, round 94: average objective=4.147260521333463\n", + "Training, round 95: average objective=4.147689879868279\n", + "Training, round 96: average objective=4.148074759823411\n", + "Training, round 97: average objective=4.148419901721635\n", + "Training, round 98: average objective=4.148729408748862\n", + "Training, round 99: average objective=4.149006785537064\n", + "Training, round 100: average objective=4.1492550045305885\n", + "Training, round 101: average objective=4.149476608445041\n", + "Training, round 102: average objective=4.149673780162485\n", + "Training, round 103: average objective=4.14984845495502\n", + "Training, round 104: average objective=4.150002371279175\n", + "Training, round 105: average objective=4.150137153276929\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 106: average objective=4.150254356313917\n", + "Training, round 107: average objective=4.150355494593267\n", + "Training, round 108: average objective=4.150442060922428\n", + "Training, round 109: average objective=4.150515527461601\n", + "Training, round 110: average objective=4.150577341982667\n", + "Training, round 111: average objective=4.150628915703721\n", + "Training, round 112: average objective=4.150671602098852\n", + "Training, round 113: average objective=4.15070667417461\n", + "Training, round 114: average objective=4.150735305862078\n", + "Training, round 115: average objective=4.150758557712123\n", + "Training, round 116: average objective=4.150777365774422\n", + "Training, round 117: average objective=4.150792538961684\n", + "No significant improvement, early stopping...\n", + "Training, round 0: average objective = 1.9999999999999996\n", + "Training, round 1: average objective=2.889856446992135\n", + "Training, round 2: average objective=2.898698249904757\n", + "Training, round 3: average objective=2.906462208708748\n", + "Training, round 4: average objective=2.91320438122845\n", + "Training, round 5: average objective=2.9191275339985694\n", + "Training, round 6: average objective=2.924579643015572\n", + "Training, round 7: average objective=2.9298872129937394\n", + "Training, round 8: average objective=2.935185845368708\n", + "Training, round 9: average objective=2.940435862981557\n", + "Training, round 10: average objective=2.945522477850517\n", + "Training, round 11: average objective=2.950327843199146\n", + "Training, round 12: average objective=2.954767497241028\n", + "Training, round 13: average objective=2.958807515630658\n", + "Training, round 14: average objective=2.962468017511295\n", + "Training, round 15: average objective=2.965809585471794\n", + "Training, round 16: average objective=2.9689039735977545\n", + "Training, round 17: average objective=2.971803193726041\n", + "Training, round 18: average objective=2.9745238808029715\n", + "Training, round 19: average objective=2.9770513931897025\n", + "Training, round 20: average objective=2.9793552881043803\n", + "Training, round 21: average objective=2.9814068386161736\n", + "Training, round 22: average objective=2.983192427247648\n", + "Training, round 23: average objective=2.9847200307210313\n", + "Training, round 24: average objective=2.9860173820707425\n", + "Training, round 25: average objective=2.9871228281174504\n", + "Training, round 26: average objective=2.9880730566524667\n", + "Training, round 27: average objective=2.9888934399026277\n", + "Training, round 28: average objective=2.989595009861305\n", + "Training, round 29: average objective=2.9901781360891766\n", + "Training, round 30: average objective=2.9906399126551646\n", + "Training, round 31: average objective=2.9909815802470776\n", + "Training, round 32: average objective=2.991213170663901\n", + "Training, round 33: average objective=2.991353644486515\n", + "Training, round 34: average objective=2.9914269257458206\n", + "Training, round 35: average objective=2.991455879492637\n", + "Training, round 36: average objective=2.9914572434682443\n", + "Training, round 37: average objective=2.991439692802803\n", + "Training, round 38: average objective=2.991405531112134\n", + "Training, round 39: average objective=2.991354466488768\n", + "Training, round 40: average objective=2.9912876188349307\n", + "Training, round 41: average objective=2.9912097254280092\n", + "Training, round 42: average objective=2.991128881262812\n", + "Training, round 43: average objective=2.9910542753553897\n", + "Training, round 44: average objective=2.990993214628215\n", + "Training, round 45: average objective=2.990949108175073\n", + "Training, round 46: average objective=2.990921236033743\n", + "Training, round 47: average objective=2.9909063024867963\n", + "Training, round 48: average objective=2.990900624794415\n", + "Training, round 49: average objective=2.990902021193472\n", + "Training, round 50: average objective=2.99091039406244\n", + "Training, round 51: average objective=2.9909270235005567\n", + "Training, round 52: average objective=2.9909530909381097\n", + "Training, round 53: average objective=2.9909883616139608\n", + "Training, round 54: average objective=2.9910308228269185\n", + "Training, round 55: average objective=2.991077256019654\n", + "No significant improvement, early stopping...\n", + "Training, round 0: average objective = 0.9999999999999999\n", + "Training, round 1: average objective=1.0749463341340126\n", + "Training, round 2: average objective=1.0850258224168594\n", + "Training, round 3: average objective=1.095331582295735\n", + "Training, round 4: average objective=1.1058480792419916\n", + "Training, round 5: average objective=1.116558760771503\n", + "Training, round 6: average objective=1.1274460252941358\n", + "Training, round 7: average objective=1.1384912166589691\n", + "Training, round 8: average objective=1.1496746402319697\n", + "Training, round 9: average objective=1.1609756157739626\n", + "Training, round 10: average objective=1.1723725813531103\n", + "Training, round 11: average objective=1.183843224559245\n", + "Training, round 12: average objective=1.1953646544406749\n", + "Training, round 13: average objective=1.2069136573180614\n", + "Training, round 14: average objective=1.218466973715215\n", + "Training, round 15: average objective=1.2300016733285295\n", + "Training, round 16: average objective=1.241495565816309\n", + "Training, round 17: average objective=1.252927644211913\n", + "Training, round 18: average objective=1.264278605268547\n", + "Training, round 19: average objective=1.2755313256904177\n", + "Training, round 20: average objective=1.286671336267192\n", + "Training, round 21: average objective=1.2976871360626971\n", + "Training, round 22: average objective=1.3085703457902267\n", + "Training, round 23: average objective=1.3193155797027603\n", + "Training, round 24: average objective=1.3299199861476074\n", + "Training, round 25: average objective=1.34038244720431\n", + "Training, round 26: average objective=1.3507025819004972\n", + "Training, round 27: average objective=1.3608795625508678\n", + "Training, round 28: average objective=1.3709110121032664\n", + "Training, round 29: average objective=1.3807920900070978\n", + "Training, round 30: average objective=1.3905148996573553\n", + "Training, round 31: average objective=1.4000683095843305\n", + "Training, round 32: average objective=1.4094380124058394\n", + "Training, round 33: average objective=1.4186069226732998\n", + "Training, round 34: average objective=1.4275557113697954\n", + "Training, round 35: average objective=1.4362634203199198\n", + "Training, round 36: average objective=1.4447081168023597\n", + "Training, round 37: average objective=1.4528675575365435\n", + "Training, round 38: average objective=1.4607198190008868\n", + "Training, round 39: average objective=1.468243859788469\n", + "Training, round 40: average objective=1.4754201079798674\n", + "Training, round 41: average objective=1.4822309400601803\n", + "Training, round 42: average objective=1.4886611361043405\n", + "Training, round 43: average objective=1.4946983165533854\n", + "Training, round 44: average objective=1.5003332560367186\n", + "Training, round 45: average objective=1.5055601767097255\n", + "Training, round 46: average objective=1.510376961641444\n", + "Training, round 47: average objective=1.5147853106043163\n", + "Training, round 48: average objective=1.518790783707608\n", + "Training, round 49: average objective=1.522402714055106\n", + "Training, round 50: average objective=1.5256340332113418\n", + "Training, round 51: average objective=1.5285010024836003\n", + "Training, round 52: average objective=1.5310228121532052\n", + "Training, round 53: average objective=1.5332210888951565\n", + "Training, round 54: average objective=1.5351193491533188\n", + "Training, round 55: average objective=1.5367423780091711\n", + "Training, round 56: average objective=1.5381156062989756\n", + "Training, round 57: average objective=1.5392645074063593\n", + "Training, round 58: average objective=1.5402140463269927\n", + "Training, round 59: average objective=1.5409882066640659\n", + "Training, round 60: average objective=1.541609630436961\n", + "Training, round 61: average objective=1.5420993336767923\n", + "Training, round 62: average objective=1.542476559703053\n", + "Training, round 63: average objective=1.5427587000934868\n", + "Training, round 64: average objective=1.5429613145008445\n", + "Training, round 65: average objective=1.5430981986631376\n", + "Training, round 66: average objective=1.5431814994560478\n", + "Training, round 67: average objective=1.5432218498225057\n", + "Training, round 68: average objective=1.5432285167398812\n", + "Training, round 69: average objective=1.5432095478875136\n", + "Training, round 70: average objective=1.5431719059085947\n", + "Training, round 71: average objective=1.543121588824377\n", + "Training, round 72: average objective=1.543063734121512\n", + "Training, round 73: average objective=1.5430027030707083\n", + "Training, round 74: average objective=1.5429421540494523\n", + "Training, round 75: average objective=1.5428850943723345\n", + "Training, round 76: average objective=1.5428339265274142\n", + "Training, round 77: average objective=1.542790490625708\n", + "Training, round 78: average objective=1.5427560988781468\n", + "Training, round 79: average objective=1.5427315705602749\n", + "Training, round 80: average objective=1.5427172726495235\n", + "Training, round 81: average objective=1.5427131641376448\n", + "Training, round 82: average objective=1.5427188483866758\n", + "Training, round 83: average objective=1.5427336216670953\n", + "Training, round 84: average objective=1.5427565332364845\n", + "Training, round 85: average objective=1.5427864490939789\n", + "Training, round 86: average objective=1.5428221065686978\n", + "Training, round 87: average objective=1.5428621852084812\n", + "No significant improvement, early stopping...\n", + "End of recursion!\n", + "graph n: 3, graph edges: Set{Tuple{Set{Int64}, Float64}}()\n", + "res: ((0.0, (Int64[], [1, 2, 3])), 0)\n", + "return from recursion\n", + "partitions: (Int64[], [1, 2, 3])\n", + "v_out: 3\n", + "return from recursion\n", + "partitions: ([3], [1, 2, 4])\n", + "v_out: 2\n", + "return from recursion\n", + "partitions: ([4, 2], [1, 3, 5])\n", + "v_out: 5\n", + "return from recursion\n", + "partitions: ([4, 2, 5], [1, 3, 6])\n", + "v_out: 4\n", + "return from recursion\n", + "partitions: ([5, 2, 6, 4], [1, 3, 7])\n", + "v_out: 6\n" + ] + }, + { + "data": { + "text/plain": [ + "(12.0, ([5, 2, 7, 4], [1, 3, 8, 6]))" + ] + }, + "execution_count": 137, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p = 1\n", + "ε = 0.25\n", + "((ws_rqaoa_objective, (p1, p2)), ws_rqaoa_total_rounds_x_qubits) = recursive_ws_qaoa(to_edge_weighted_graph(graph), ws_partitioning, ε, init_state_randomized, p, rounds, lr)\n", + "ws_rqaoa_objective_ratio = max_cut / ws_rqaoa_objective\n", + "(ws_rqaoa_objective, (p1,p2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Overall Convergence vs. Qubits x Parameter x Rounds Comparison" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 140, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ws_rqaoa_time = ws_rqaoa_total_rounds_x_qubits * ws_rqaoa_objective_ratio\n", + "ws_qaoa_8_time = graph.n * ws_qaoa_8_rounds * ws_qaoa_8_objective_ratio\n", + "ws_qaoa_2_time = graph.n * ws_qaoa_2_rounds * ws_qaoa_2_objective_ratio\n", + "qaoa_10_time = graph.n * qaoa_10_rounds * qaoa_10_objective_ratio\n", + "qaoa_8_time = graph.n * qaoa_8_rounds * qaoa_8_objective_ratio\n", + "qaoa_2_time = graph.n * qaoa_2_rounds * qaoa_2_objective_ratio\n", + "\n", + "qaoa_times = [ws_rqaoa_time, ws_qaoa_8_time, ws_qaoa_2_time, qaoa_10_time, qaoa_8_time, qaoa_2_time]\n", + "tags = [\"R-WS-QAOA-1\", \"WS-QAOA-8\", \"WS-QAOA-2\", \"QAOA-10\", \"QAOA-8\", \"QAOA-2\"]\n", + "bar(tags, qaoa_times, xticks=:all, xrotation=15, ylabel=\"Qubits x Paramaters x Rounds x Max-Accuracy / Accuracy\", legend=false, size=(600, 600))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It looks like the recursive warm-start QAOA is faster than some of the other variants. However, in general, this is truly not the case. On a real quantum computer, a measurement is needed to be done for every edge in the graph. To make the simulation faster, this was avoided here.\n", + "\n", + "While the WS-QAOA offers actual speed-up for the convergence, R-WS-QAOA actually offers a trade-off between time and circuit complexity. It can solve bigger-sized problems where the normal methods fail, since the depth cannot be increased after some point.\n", + "\n", + "It is also important to note that even though QAOA-2 has the lowest lowest \"time\", it did not converge and stopped early. The metrics you see above only makes sense when the methods had reached similar objective function scores. Another way to compare them would be to fix the iterations in the gradient descent." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# WS-QAOA vs. R-WS-QAOA\n", + "\n", + "It turns out, this example cannot be optimally solved with WS-QAOA even at depth 20!\n", + "\n", + "\"N=8\"\n",\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "300" + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Example graph with negative/positive edge weights, shown at: Fig (9)\n", + "edges = [\n", + " (1, 2, 3.0), (1, 3, 3.0), (1, 4, 6.0), (1, 5, 9.0), (1, 6, 1.0),\n", + " (2, 3, 4.0), (2, 4, 4.0), (2, 5, -8.0), (2, 6, 4.0),\n", + " (3, 4, 3.0), (3, 5, -7.0), (3, 6, 1.0),\n", + " (4, 5, -7.0), (4, 6, 6.0),\n", + " (5, 6, -5.0)\n", + "]\n", + "n = 6\n", + "graph = EdgeWeightedGraph(n, edges)\n", + "ws_partitioning = [0.0, 0.0, 1.0, 1.0, 1.0, 1.0]\n", + "ε = 0.25\n", + "init_state_randomized = true\n", + "lr = 0.01\n", + "p = 20\n", + "rounds = 300" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 0: average objective = 91.25\n", + "Training, round 1: average objective=87.97574639361969\n", + "Training, round 2: average objective=91.2294089019583\n", + "Training, round 3: average objective=92.90830041961844\n", + "Training, round 4: average objective=93.36892903973192\n", + "Training, round 5: average objective=93.42351912619316\n", + "Training, round 6: average objective=94.5566878038019\n", + "Training, round 7: average objective=95.15710377235892\n", + "Training, round 8: average objective=95.4689199470034\n", + "Training, round 9: average objective=95.71287035383459\n", + "Training, round 10: average objective=96.65595078762098\n", + "Training, round 11: average objective=96.50136592618793\n", + "Training, round 12: average objective=96.21651588545649\n", + "Training, round 13: average objective=96.38058654090523\n", + "Training, round 14: average objective=96.8054438213336\n", + "Training, round 15: average objective=97.45110398300729\n", + "Training, round 16: average objective=97.54194232799827\n", + "Training, round 17: average objective=97.41516126762468\n", + "Training, round 18: average objective=97.50316530298659\n", + "Training, round 19: average objective=97.760073410923\n", + "Training, round 20: average objective=98.01882883882931\n", + "Training, round 21: average objective=97.98646175198861\n", + "Training, round 22: average objective=98.13102461795546\n", + "Training, round 23: average objective=98.29445117127392\n", + "Training, round 24: average objective=98.36865145941604\n", + "Training, round 25: average objective=98.4381474062274\n", + "Training, round 26: average objective=98.51503853287201\n", + "Training, round 27: average objective=98.65210590270847\n", + "Training, round 28: average objective=98.68074864668739\n", + "Training, round 29: average objective=98.80694204920789\n", + "Training, round 30: average objective=98.87632435090956\n", + "Training, round 31: average objective=98.92200985288065\n", + "Training, round 32: average objective=98.9258049120166\n", + "Training, round 33: average objective=98.9937584521307\n", + "Training, round 34: average objective=99.08098307013387\n", + "Training, round 35: average objective=99.15584320084925\n", + "Training, round 36: average objective=99.2034948171667\n", + "Training, round 37: average objective=99.23921983778641\n", + "Training, round 38: average objective=99.31836290690806\n", + "Training, round 39: average objective=99.37094285830209\n", + "Training, round 40: average objective=99.40224517523578\n", + "Training, round 41: average objective=99.42928736861236\n", + "Training, round 42: average objective=99.49881717570113\n", + "Training, round 43: average objective=99.53720872218567\n", + "Training, round 44: average objective=99.56728984692776\n", + "Training, round 45: average objective=99.61250169312896\n", + "Training, round 46: average objective=99.67578800364473\n", + "Training, round 47: average objective=99.71383357580697\n", + "Training, round 48: average objective=99.75452927910132\n", + "Training, round 49: average objective=99.79978236483848\n", + "Training, round 50: average objective=99.86642830726288\n", + "Training, round 51: average objective=99.92391496126768\n", + "Training, round 52: average objective=99.9670001128543\n", + "Training, round 53: average objective=100.01454202321813\n", + "Training, round 54: average objective=100.06474488566462\n", + "Training, round 55: average objective=100.09343165951594\n", + "Training, round 56: average objective=100.11505807861629\n", + "Training, round 57: average objective=100.14209462417921\n", + "Training, round 58: average objective=100.1704640759182\n", + "Training, round 59: average objective=100.18413605964872\n", + "Training, round 60: average objective=100.1945194785944\n", + "Training, round 61: average objective=100.20815371106292\n", + "Training, round 62: average objective=100.2264041469085\n", + "Training, round 63: average objective=100.24017501048434\n", + "Training, round 64: average objective=100.25601506761157\n", + "Training, round 65: average objective=100.27691139698422\n", + "Training, round 66: average objective=100.29647822023182\n", + "Training, round 67: average objective=100.30981689819475\n", + "Training, round 68: average objective=100.32760027778775\n", + "Training, round 69: average objective=100.34639427366903\n", + "Training, round 70: average objective=100.36347586992667\n", + "Training, round 71: average objective=100.37791290181644\n", + "Training, round 72: average objective=100.39406403510759\n", + "Training, round 73: average objective=100.40722181492873\n", + "Training, round 74: average objective=100.41796652902684\n", + "Training, round 75: average objective=100.42791530384967\n", + "Training, round 76: average objective=100.4382507731885\n", + "Training, round 77: average objective=100.44838722468401\n", + "Training, round 78: average objective=100.45859724807417\n", + "Training, round 79: average objective=100.46865877772571\n", + "Training, round 80: average objective=100.47722810594034\n", + "Training, round 81: average objective=100.4855946645905\n", + "Training, round 82: average objective=100.49237253622007\n", + "Training, round 83: average objective=100.49703048746666\n", + "Training, round 84: average objective=100.50068571165906\n", + "Training, round 85: average objective=100.50349407177356\n", + "Training, round 86: average objective=100.50464275143506\n", + "Training, round 87: average objective=100.50485217176956\n", + "Training, round 88: average objective=100.50543195241718\n", + "Training, round 89: average objective=100.50598868637057\n", + "Training, round 90: average objective=100.5067740758683\n", + "Training, round 91: average objective=100.50805005405591\n", + "Training, round 92: average objective=100.50930232175254\n", + "Training, round 93: average objective=100.51048745717677\n", + "Training, round 94: average objective=100.51188250146328\n", + "Training, round 95: average objective=100.51338544624802\n", + "Training, round 96: average objective=100.51469328709439\n", + "Training, round 97: average objective=100.51615025868355\n", + "Training, round 98: average objective=100.51758641255994\n", + "Training, round 99: average objective=100.51871829704814\n", + "Training, round 100: average objective=100.51983669876097\n", + "Training, round 101: average objective=100.5208713487006\n", + "Training, round 102: average objective=100.52170922442649\n", + "Training, round 103: average objective=100.52239829900907\n", + "Training, round 104: average objective=100.52309952474063\n", + "Training, round 105: average objective=100.52385961429947\n", + "Training, round 106: average objective=100.52454823159347\n", + "Training, round 107: average objective=100.52527131155108\n", + "Training, round 108: average objective=100.52605524630397\n", + "Training, round 109: average objective=100.52685785814319\n", + "Training, round 110: average objective=100.52769442668061\n", + "Training, round 111: average objective=100.52856923218992\n", + "Training, round 112: average objective=100.5294597974722\n", + "Training, round 113: average objective=100.53027608871884\n", + "Training, round 114: average objective=100.53105012286488\n", + "Training, round 115: average objective=100.53181563511423\n", + "Training, round 116: average objective=100.53254168496473\n", + "Training, round 117: average objective=100.5332528011298\n", + "Training, round 118: average objective=100.53399288527591\n", + "Training, round 119: average objective=100.53476445085528\n", + "Training, round 120: average objective=100.53557733913233\n", + "Training, round 121: average objective=100.53644986111144\n", + "Training, round 122: average objective=100.53736114684312\n", + "Training, round 123: average objective=100.53829327675496\n", + "Training, round 124: average objective=100.53924273486001\n", + "Training, round 125: average objective=100.54022250638255\n", + "Training, round 126: average objective=100.54123114162343\n", + "Training, round 127: average objective=100.542276577818\n", + "Training, round 128: average objective=100.54337287107502\n", + "Training, round 129: average objective=100.5445126034125\n", + "Training, round 130: average objective=100.54570184018993\n", + "Training, round 131: average objective=100.54694917989184\n", + "Training, round 132: average objective=100.54826220880236\n", + "Training, round 133: average objective=100.54965034305246\n", + "Training, round 134: average objective=100.5511176408427\n", + "Training, round 135: average objective=100.5526724109278\n", + "Training, round 136: average objective=100.55432346008372\n", + "Training, round 137: average objective=100.55607632416087\n", + "Training, round 138: average objective=100.55794394875515\n", + "Training, round 139: average objective=100.55993760427644\n", + "Training, round 140: average objective=100.56206539679306\n", + "Training, round 141: average objective=100.5643429101417\n", + "Training, round 142: average objective=100.5667897449078\n", + "Training, round 143: average objective=100.56942794660785\n", + "Training, round 144: average objective=100.5722830340336\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 145: average objective=100.5753846393322\n", + "Training, round 146: average objective=100.57876818363852\n", + "Training, round 147: average objective=100.58247010368859\n", + "Training, round 148: average objective=100.58653676406513\n", + "Training, round 149: average objective=100.5910238917799\n", + "Training, round 150: average objective=100.59598757020956\n", + "Training, round 151: average objective=100.60149552959342\n", + "Training, round 152: average objective=100.6076236949615\n", + "Training, round 153: average objective=100.61444296169506\n", + "Training, round 154: average objective=100.62202325483359\n", + "Training, round 155: average objective=100.63041635680284\n", + "Training, round 156: average objective=100.63963617689707\n", + "Training, round 157: average objective=100.64965547852333\n", + "Training, round 158: average objective=100.66037508400177\n", + "Training, round 159: average objective=100.67162230840347\n", + "Training, round 160: average objective=100.68316175688017\n", + "Training, round 161: average objective=100.69471327785479\n", + "Training, round 162: average objective=100.70599743662919\n", + "Training, round 163: average objective=100.71675829189601\n", + "Training, round 164: average objective=100.72677393366439\n", + "Training, round 165: average objective=100.73584815529088\n", + "Training, round 166: average objective=100.74381078905392\n", + "Training, round 167: average objective=100.75052705078468\n", + "Training, round 168: average objective=100.755948337466\n", + "Training, round 169: average objective=100.7601452375433\n", + "Training, round 170: average objective=100.76331296965556\n", + "Training, round 171: average objective=100.76573364616985\n", + "Training, round 172: average objective=100.76771844623862\n", + "Training, round 173: average objective=100.7695380497714\n", + "Training, round 174: average objective=100.77137177081636\n", + "Training, round 175: average objective=100.77327616422264\n", + "Training, round 176: average objective=100.77520579956958\n", + "Training, round 177: average objective=100.77706584602099\n", + "Training, round 178: average objective=100.77876494884462\n", + "Training, round 179: average objective=100.78025155287116\n", + "Training, round 180: average objective=100.78151172691071\n", + "Training, round 181: average objective=100.78255492137036\n", + "Training, round 182: average objective=100.78340532828418\n", + "Training, round 183: average objective=100.78410680449008\n", + "Training, round 184: average objective=100.78472722740487\n", + "Training, round 185: average objective=100.78535102660945\n", + "Training, round 186: average objective=100.78606132801119\n", + "Training, round 187: average objective=100.7869252609112\n", + "Training, round 188: average objective=100.78797297155742\n", + "Training, round 189: average objective=100.78919290487983\n", + "Training, round 190: average objective=100.79053680024353\n", + "Training, round 191: average objective=100.7919296066969\n", + "Training, round 192: average objective=100.79329524999528\n", + "Training, round 193: average objective=100.79458021440482\n", + "Training, round 194: average objective=100.79576115554343\n", + "Training, round 195: average objective=100.79684247782298\n", + "Training, round 196: average objective=100.79784251828292\n", + "Training, round 197: average objective=100.79878106776282\n", + "Training, round 198: average objective=100.79967688547723\n", + "Training, round 199: average objective=100.80054595507724\n", + "Training, round 200: average objective=100.80140220318782\n" + ] + }, + { + "data": { + "text/plain": [ + "(\n", + " 8 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \n", + " 7 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \n", + " 6 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \n", + " 5 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \n", + " 4 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \n", + " 3 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \n", + " 2 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + " | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \n", + " 1 ——□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□—————□———\n", + ", 100.80140220318782, 201)" + ] + }, + "execution_count": 128, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p = 20\n", + "(circ_opt_fail, _, _) = optimize_ws_qaoa(graph, ws_partitioning, ε, init_state_randomized, p, rounds, lr)" + ] + }, + { + "cell_type": "code", + "execution_count": 255, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "execution_count": 255, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result = apply(prepare_init_state(ws_partitioning, ε), circ_opt_fail.moments)\n", + "plot_result(result)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "However, using a recursive WS-QAOA with a depth of 5 does the trick:" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 0: average objective = 6.125000000000001\n", + "Training, round 1: average objective=9.754365059996735\n", + "Training, round 2: average objective=11.157493295112674\n", + "Training, round 3: average objective=11.664664015416946\n", + "Training, round 4: average objective=11.672165408685082\n", + "Training, round 5: average objective=11.70023265533952\n", + "Training, round 6: average objective=11.836337205186972\n", + "Training, round 7: average objective=12.064202065644961\n", + "Training, round 8: average objective=12.348058737188548\n", + "Training, round 9: average objective=12.601721950539154\n", + "Training, round 10: average objective=12.758272190687604\n", + "Training, round 11: average objective=12.840675484435986\n", + "Training, round 12: average objective=12.93039669638964\n", + "Training, round 13: average objective=13.0785033333506\n", + "Training, round 14: average objective=13.265183392630131\n", + "Training, round 15: average objective=13.425592491055763\n", + "Training, round 16: average objective=13.50656371511037\n", + "Training, round 17: average objective=13.513680648988817\n", + "Training, round 18: average objective=13.50424823949588\n", + "Training, round 19: average objective=13.529027363842772\n", + "Training, round 20: average objective=13.594379166531787\n", + "Training, round 21: average objective=13.672465748340013\n", + "Training, round 22: average objective=13.73041929642828\n", + "Training, round 23: average objective=13.75183808185434\n", + "Training, round 24: average objective=13.742338276320982\n", + "Training, round 25: average objective=13.72381712052728\n", + "Training, round 26: average objective=13.71904088729677\n", + "Training, round 27: average objective=13.735711883841999\n", + "Training, round 28: average objective=13.76324413067016\n", + "Training, round 29: average objective=13.783711188824338\n", + "Training, round 30: average objective=13.787660750970538\n", + "Training, round 31: average objective=13.78158479766661\n", + "Training, round 32: average objective=13.780677327467766\n", + "Training, round 33: average objective=13.794699895027179\n", + "Training, round 34: average objective=13.820279856585206\n", + "Training, round 35: average objective=13.845145843423204\n", + "Training, round 36: average objective=13.85929859583712\n", + "Training, round 37: average objective=13.862929379553233\n", + "Training, round 38: average objective=13.864198847701742\n", + "Training, round 39: average objective=13.87036341253349\n", + "Training, round 40: average objective=13.882036708526805\n", + "Training, round 41: average objective=13.894893634570487\n", + "Training, round 42: average objective=13.90459628288134\n", + "Training, round 43: average objective=13.90978663322262\n", + "Training, round 44: average objective=13.912031032063592\n", + "Training, round 45: average objective=13.91385972717831\n", + "Training, round 46: average objective=13.916453985853385\n", + "Training, round 47: average objective=13.91884684187693\n", + "Training, round 48: average objective=13.919602042401705\n", + "Training, round 49: average objective=13.919037651531696\n", + "Training, round 50: average objective=13.91909407981809\n", + "Training, round 51: average objective=13.92104038904645\n", + "Training, round 52: average objective=13.923991880704179\n", + "Training, round 53: average objective=13.926047740422788\n", + "Training, round 54: average objective=13.926565463091993\n", + "Training, round 55: average objective=13.926738582461448\n", + "Training, round 56: average objective=13.92782918735831\n", + "Training, round 57: average objective=13.929462181979027\n", + "Training, round 58: average objective=13.930209936065323\n", + "Training, round 59: average objective=13.929526910510013\n", + "Training, round 60: average objective=13.92842678105708\n", + "Training, round 61: average objective=13.9281917234465\n", + "Training, round 62: average objective=13.928934860972563\n", + "Training, round 63: average objective=13.929690934465148\n", + "Training, round 64: average objective=13.92963258711433\n", + "Training, round 65: average objective=13.928890647141952\n", + "Training, round 66: average objective=13.92826354142646\n", + "Training, round 67: average objective=13.928352967420336\n", + "Training, round 68: average objective=13.929023813597711\n", + "Training, round 69: average objective=13.929650214305024\n", + "Training, round 70: average objective=13.929852241017988\n", + "Training, round 71: average objective=13.929890140329917\n", + "Training, round 72: average objective=13.930239636401286\n", + "Training, round 73: average objective=13.930926307292276\n", + "Training, round 74: average objective=13.931516113099137\n", + "Training, round 75: average objective=13.93171215523087\n", + "Training, round 76: average objective=13.931688100831288\n", + "Training, round 77: average objective=13.931769164650905\n", + "Training, round 78: average objective=13.932012639483093\n", + "Training, round 79: average objective=13.932239940848737\n", + "Training, round 80: average objective=13.932336101761681\n", + "Training, round 81: average objective=13.932358262803092\n", + "Training, round 82: average objective=13.932399789758648\n", + "Training, round 83: average objective=13.932470361887688\n", + "Training, round 84: average objective=13.932521882507494\n", + "Training, round 85: average objective=13.932535433708608\n", + "Training, round 86: average objective=13.932552654173676\n", + "Training, round 87: average objective=13.932619850156406\n", + "Training, round 88: average objective=13.932715921943117\n", + "Training, round 89: average objective=13.932771399200629\n", + "Training, round 90: average objective=13.932765450099032\n", + "No significant improvement, early stopping...\n", + "Training, round 0: average objective = 31.0\n", + "Training, round 1: average objective=33.03691717820615\n", + "Training, round 2: average objective=34.32592135152626\n", + "Training, round 3: average objective=35.09057589163609\n", + "Training, round 4: average objective=35.28565395782158\n", + "Training, round 5: average objective=35.20673694907782\n", + "Training, round 6: average objective=35.32572142794332\n", + "Training, round 7: average objective=35.606226010430916\n", + "Training, round 8: average objective=35.8689865389115\n", + "Training, round 9: average objective=36.08401804924702\n", + "Training, round 10: average objective=36.230640210479365\n", + "Training, round 11: average objective=36.327287575893436\n", + "Training, round 12: average objective=36.4390045823842\n", + "Training, round 13: average objective=36.604337576638024\n", + "Training, round 14: average objective=36.79962514556674\n", + "Training, round 15: average objective=36.95763574905215\n", + "Training, round 16: average objective=37.029358970350785\n", + "Training, round 17: average objective=37.03358029647916\n", + "Training, round 18: average objective=37.03367389924921\n", + "Training, round 19: average objective=37.07080096278469\n", + "Training, round 20: average objective=37.13699276551719\n", + "Training, round 21: average objective=37.19766886413401\n", + "Training, round 22: average objective=37.22606001021762\n", + "Training, round 23: average objective=37.222951882766566\n", + "Training, round 24: average objective=37.21066360633203\n", + "Training, round 25: average objective=37.21036296370576\n", + "Training, round 26: average objective=37.2255537481851\n", + "Training, round 27: average objective=37.24427324851142\n", + "Training, round 28: average objective=37.25335940575721\n", + "Training, round 29: average objective=37.25050502793056\n", + "Training, round 30: average objective=37.24463191372301\n", + "Training, round 31: average objective=37.24682520379484\n", + "Training, round 32: average objective=37.26201192296037\n", + "Training, round 33: average objective=37.287661485575704\n", + "Training, round 34: average objective=37.31793568722917\n", + "Training, round 35: average objective=37.34871223492958\n", + "Training, round 36: average objective=37.379931219076596\n", + "Training, round 37: average objective=37.41414973250964\n", + "Training, round 38: average objective=37.45294427838664\n", + "Training, round 39: average objective=37.49445675781283\n", + "Training, round 40: average objective=37.53451167530572\n", + "Training, round 41: average objective=37.57043747093111\n", + "Training, round 42: average objective=37.60391593203773\n", + "Training, round 43: average objective=37.63976772824607\n", + "Training, round 44: average objective=37.68208747847295\n", + "Training, round 45: average objective=37.73282104323859\n", + "Training, round 46: average objective=37.79473894278502\n", + "Training, round 47: average objective=37.87434410496046\n", + "Training, round 48: average objective=37.97973426480914\n", + "Training, round 49: average objective=38.11373974626961\n", + "Training, round 50: average objective=38.26585367782559\n", + "Training, round 51: average objective=38.40707734603154\n", + "Training, round 52: average objective=38.49607263577062\n", + "Training, round 53: average objective=38.50551144138289\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 54: average objective=38.453329013909034\n", + "Training, round 55: average objective=38.39849937710748\n", + "Training, round 56: average objective=38.394661933061776\n", + "Training, round 57: average objective=38.4511846046757\n", + "Training, round 58: average objective=38.53689627406152\n", + "Training, round 59: average objective=38.608052062370824\n", + "Training, round 60: average objective=38.635291311890356\n", + "Training, round 61: average objective=38.619726559356074\n", + "Training, round 62: average objective=38.588176900602335\n", + "Training, round 63: average objective=38.569817182154075\n", + "Training, round 64: average objective=38.578285451011524\n", + "Training, round 65: average objective=38.60907797731036\n", + "Training, round 66: average objective=38.64364491933901\n", + "Training, round 67: average objective=38.66220223448947\n", + "Training, round 68: average objective=38.65910662278005\n", + "Training, round 69: average objective=38.643518184327874\n", + "Training, round 70: average objective=38.628984057013064\n", + "Training, round 71: average objective=38.626638991443954\n", + "Training, round 72: average objective=38.64013858757162\n", + "Training, round 73: average objective=38.66189551891257\n", + "Training, round 74: average objective=38.67854018707011\n", + "Training, round 75: average objective=38.68270430086623\n", + "Training, round 76: average objective=38.67791637729658\n", + "Training, round 77: average objective=38.67218274362382\n", + "Training, round 78: average objective=38.67119478313965\n", + "Training, round 79: average objective=38.6770942505602\n", + "Training, round 80: average objective=38.68745168218899\n", + "Training, round 81: average objective=38.69579075017116\n", + "Training, round 82: average objective=38.697617358761065\n", + "Training, round 83: average objective=38.69476426337287\n", + "Training, round 84: average objective=38.691926219443054\n", + "Training, round 85: average objective=38.69176779370982\n", + "Training, round 86: average objective=38.69446520988916\n", + "Training, round 87: average objective=38.698676239100536\n", + "Training, round 88: average objective=38.701921483849915\n", + "Training, round 89: average objective=38.70243691650278\n", + "Training, round 90: average objective=38.701014571457236\n", + "Training, round 91: average objective=38.699718538464026\n", + "Training, round 92: average objective=38.699840335061154\n", + "Training, round 93: average objective=38.70166454683315\n", + "Training, round 94: average objective=38.70443042394956\n", + "Training, round 95: average objective=38.70644932710212\n", + "Training, round 96: average objective=38.706697045918\n", + "Training, round 97: average objective=38.70585930878049\n", + "Training, round 98: average objective=38.70516956119632\n", + "Training, round 99: average objective=38.70526350449114\n", + "Training, round 100: average objective=38.70620243306968\n", + "Training, round 101: average objective=38.70741170770462\n", + "Training, round 102: average objective=38.70797444931332\n", + "Training, round 103: average objective=38.707715332456424\n", + "Training, round 104: average objective=38.70729818305398\n", + "Training, round 105: average objective=38.70720663032199\n", + "Training, round 106: average objective=38.70748223487627\n", + "Training, round 107: average objective=38.70802385899241\n", + "Training, round 108: average objective=38.70851029198296\n", + "Training, round 109: average objective=38.70860453980082\n", + "Training, round 110: average objective=38.70837915183908\n", + "Training, round 111: average objective=38.70812670278144\n", + "Training, round 112: average objective=38.70803425291547\n", + "Training, round 113: average objective=38.70818663238718\n", + "Training, round 114: average objective=38.70848158708158\n", + "Training, round 115: average objective=38.70865025287351\n", + "Training, round 116: average objective=38.70859390943909\n", + "Training, round 117: average objective=38.70844895750348\n", + "Training, round 118: average objective=38.70835026781364\n", + "Training, round 119: average objective=38.708374643405804\n", + "Training, round 120: average objective=38.708518980409124\n", + "Training, round 121: average objective=38.708645060394\n", + "Training, round 122: average objective=38.70864926963493\n", + "Training, round 123: average objective=38.70858796070817\n", + "Training, round 124: average objective=38.70854141652048\n", + "Training, round 125: average objective=38.70854031644203\n", + "Training, round 126: average objective=38.708597974521055\n", + "Training, round 127: average objective=38.7086752400495\n", + "Training, round 128: average objective=38.708707576331584\n", + "Training, round 129: average objective=38.70869086001318\n", + "Training, round 130: average objective=38.70865938886996\n", + "Training, round 131: average objective=38.7086441307765\n", + "No significant improvement, early stopping...\n", + "Training, round 0: average objective = 32.37499999999999\n", + "Training, round 1: average objective=23.390438888396794\n", + "Training, round 2: average objective=27.37205226448412\n", + "Training, round 3: average objective=29.978249194655053\n", + "Training, round 4: average objective=30.903117531054043\n", + "Training, round 5: average objective=31.296382842792966\n", + "Training, round 6: average objective=31.626202826607745\n", + "Training, round 7: average objective=32.04774017286191\n", + "Training, round 8: average objective=32.891253877097704\n", + "Training, round 9: average objective=34.421155649342055\n", + "Training, round 10: average objective=36.465190853459255\n", + "Training, round 11: average objective=38.31099222221893\n", + "Training, round 12: average objective=39.297550339647366\n", + "Training, round 13: average objective=39.552897544588276\n", + "Training, round 14: average objective=39.50987584254683\n", + "Training, round 15: average objective=39.41200522264674\n", + "Training, round 16: average objective=39.41726702421007\n", + "Training, round 17: average objective=39.62216299681465\n", + "Training, round 18: average objective=40.00259377435171\n", + "Training, round 19: average objective=40.427142796388274\n", + "Training, round 20: average objective=40.756928550227755\n", + "Training, round 21: average objective=40.94075383425766\n", + "Training, round 22: average objective=41.01866238535911\n", + "Training, round 23: average objective=41.05563732276815\n", + "Training, round 24: average objective=41.089417798594255\n", + "Training, round 25: average objective=41.12940416431316\n", + "Training, round 26: average objective=41.18229016703043\n", + "Training, round 27: average objective=41.26208292583193\n", + "Training, round 28: average objective=41.37332473239319\n", + "Training, round 29: average objective=41.49795955213075\n", + "Training, round 30: average objective=41.60406371514284\n", + "Training, round 31: average objective=41.665937325423535\n", + "Training, round 32: average objective=41.67980893619673\n", + "Training, round 33: average objective=41.66428033850215\n", + "Training, round 34: average objective=41.64621287189155\n", + "Training, round 35: average objective=41.64457536545061\n", + "Training, round 36: average objective=41.66331652059561\n", + "Training, round 37: average objective=41.694047711337305\n", + "Training, round 38: average objective=41.72357099957446\n", + "Training, round 39: average objective=41.741494722187255\n", + "Training, round 40: average objective=41.74478019460085\n", + "Training, round 41: average objective=41.737826070927696\n", + "Training, round 42: average objective=41.72898153185663\n", + "Training, round 43: average objective=41.72606885609923\n", + "Training, round 44: average objective=41.73330678199592\n", + "Training, round 45: average objective=41.75050332435058\n", + "Training, round 46: average objective=41.774080753068226\n", + "Training, round 47: average objective=41.79907875913568\n", + "Training, round 48: average objective=41.82135053353797\n", + "Training, round 49: average objective=41.839191317113105\n", + "Training, round 50: average objective=41.85370713226981\n", + "Training, round 51: average objective=41.86770257719772\n", + "Training, round 52: average objective=41.883688638168685\n", + "Training, round 53: average objective=41.90220460867317\n", + "Training, round 54: average objective=41.92147560006369\n", + "Training, round 55: average objective=41.938547135094076\n", + "Training, round 56: average objective=41.95109515264208\n", + "Training, round 57: average objective=41.95875745903746\n", + "Training, round 58: average objective=41.963252505944716\n", + "Training, round 59: average objective=41.96735567958559\n", + "Training, round 60: average objective=41.97343726634792\n", + "Training, round 61: average objective=41.982409724928516\n", + "Training, round 62: average objective=41.993594109648626\n", + "Training, round 63: average objective=42.00542284032115\n", + "Training, round 64: average objective=42.016413023228814\n", + "Training, round 65: average objective=42.02580036285748\n", + "Training, round 66: average objective=42.03358927976112\n", + "Training, round 67: average objective=42.040214818530245\n", + "Training, round 68: average objective=42.04617396978163\n", + "Training, round 69: average objective=42.05182407178707\n", + "Training, round 70: average objective=42.05733585053374\n", + "Training, round 71: average objective=42.06271939075677\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 72: average objective=42.06789651126124\n", + "Training, round 73: average objective=42.072804321259696\n", + "Training, round 74: average objective=42.0774620239048\n", + "Training, round 75: average objective=42.0819444582055\n", + "Training, round 76: average objective=42.086300741414476\n", + "Training, round 77: average objective=42.0905162447082\n", + "Training, round 78: average objective=42.09454108312883\n", + "Training, round 79: average objective=42.09831358222435\n", + "Training, round 80: average objective=42.10174069460806\n", + "Training, round 81: average objective=42.104695263938744\n", + "Training, round 82: average objective=42.107096895497065\n", + "Training, round 83: average objective=42.10902217627124\n", + "Training, round 84: average objective=42.11071432004262\n", + "Training, round 85: average objective=42.112452931201474\n", + "Training, round 86: average objective=42.11439280600957\n", + "Training, round 87: average objective=42.11650362576371\n", + "Training, round 88: average objective=42.11862990970552\n", + "Training, round 89: average objective=42.120599616321286\n", + "Training, round 90: average objective=42.12231500163989\n", + "Training, round 91: average objective=42.12379222069852\n", + "Training, round 92: average objective=42.125132641294464\n", + "Training, round 93: average objective=42.12644122576501\n", + "Training, round 94: average objective=42.12775718785372\n", + "Training, round 95: average objective=42.129057332479356\n", + "Training, round 96: average objective=42.13031259615288\n", + "Training, round 97: average objective=42.13152341004648\n", + "Training, round 98: average objective=42.13270471498939\n", + "Training, round 99: average objective=42.13385857416893\n", + "Training, round 100: average objective=42.13497333725785\n", + "Training, round 101: average objective=42.13603809643296\n", + "Training, round 102: average objective=42.13704870554362\n", + "Training, round 103: average objective=42.13800530554578\n", + "Training, round 104: average objective=42.13891035743602\n", + "Training, round 105: average objective=42.13976586451675\n", + "Training, round 106: average objective=42.140569014596906\n", + "Training, round 107: average objective=42.14131470877027\n", + "Training, round 108: average objective=42.14200504842161\n", + "Training, round 109: average objective=42.14265006516954\n", + "Training, round 110: average objective=42.14325454264233\n", + "Training, round 111: average objective=42.14380945577139\n", + "Training, round 112: average objective=42.14430177208507\n", + "Training, round 113: average objective=42.144730647313295\n", + "Training, round 114: average objective=42.145110786544514\n", + "Training, round 115: average objective=42.145462950967584\n", + "Training, round 116: average objective=42.14580336299947\n", + "Training, round 117: average objective=42.146138218218475\n", + "Training, round 118: average objective=42.14646396536206\n", + "Training, round 119: average objective=42.14677269986242\n", + "Training, round 120: average objective=42.14705978149446\n", + "Training, round 121: average objective=42.14732615954904\n", + "Training, round 122: average objective=42.14757421281462\n", + "Training, round 123: average objective=42.14780485617108\n", + "Training, round 124: average objective=42.14801905986626\n", + "Training, round 125: average objective=42.14821949972625\n", + "Training, round 126: average objective=42.14840847938032\n", + "Training, round 127: average objective=42.14858570152948\n", + "Training, round 128: average objective=42.148749328714814\n", + "Training, round 129: average objective=42.1488983124276\n", + "Training, round 130: average objective=42.149033395902904\n", + "Training, round 131: average objective=42.14915683215814\n", + "Training, round 132: average objective=42.149271335762336\n", + "No significant improvement, early stopping...\n", + "Training, round 0: average objective = 2.749999999999999\n", + "Training, round 1: average objective=2.561408935059429\n", + "Training, round 2: average objective=2.7935070426394466\n", + "Training, round 3: average objective=3.0358743027083843\n", + "Training, round 4: average objective=3.268767438877786\n", + "Training, round 5: average objective=3.477338131200303\n", + "Training, round 6: average objective=3.6527632472670657\n", + "Training, round 7: average objective=3.789335186102381\n", + "Training, round 8: average objective=3.887978896019332\n", + "Training, round 9: average objective=3.957507475224209\n", + "Training, round 10: average objective=4.010945308057203\n", + "Training, round 11: average objective=4.0613690344674955\n", + "Training, round 12: average objective=4.119209035559831\n", + "Training, round 13: average objective=4.1912179996451675\n", + "Training, round 14: average objective=4.2806113045503364\n", + "Training, round 15: average objective=4.3876022097691\n", + "Training, round 16: average objective=4.509950900224082\n", + "Training, round 17: average objective=4.643497860967729\n", + "Training, round 18: average objective=4.782732025636502\n", + "Training, round 19: average objective=4.921410604398284\n", + "Training, round 20: average objective=5.053206745795676\n", + "Training, round 21: average objective=5.172356579774151\n", + "Training, round 22: average objective=5.274296181802994\n", + "Training, round 23: average objective=5.356264144148532\n", + "Training, round 24: average objective=5.417750100269238\n", + "Training, round 25: average objective=5.460566107309905\n", + "Training, round 26: average objective=5.488369653439177\n", + "Training, round 27: average objective=5.505724778586146\n", + "Training, round 28: average objective=5.517060483035985\n", + "Training, round 29: average objective=5.5259203195461915\n", + "Training, round 30: average objective=5.534677857943686\n", + "Training, round 31: average objective=5.544642439996528\n", + "Training, round 32: average objective=5.55636925593692\n", + "Training, round 33: average objective=5.570009345567033\n", + "Training, round 34: average objective=5.585599012664767\n", + "Training, round 35: average objective=5.603242268005678\n", + "Training, round 36: average objective=5.623173047557503\n", + "Training, round 37: average objective=5.645706548981149\n", + "Training, round 38: average objective=5.671113175546314\n", + "Training, round 39: average objective=5.699471290809498\n", + "Training, round 40: average objective=5.730560906703315\n", + "Training, round 41: average objective=5.763843852655613\n", + "Training, round 42: average objective=5.798538523936808\n", + "Training, round 43: average objective=5.83376588103403\n", + "Training, round 44: average objective=5.868720276738344\n", + "Training, round 45: average objective=5.902815955193107\n", + "Training, round 46: average objective=5.935771630442858\n", + "Training, round 47: average objective=5.967616688000347\n", + "Training, round 48: average objective=5.9986266287624455\n", + "Training, round 49: average objective=6.0292146009111365\n", + "Training, round 50: average objective=6.059812606441324\n", + "Training, round 51: average objective=6.090773484902747\n", + "Training, round 52: average objective=6.122312269776422\n", + "Training, round 53: average objective=6.154493704208393\n", + "Training, round 54: average objective=6.1872587915700406\n", + "Training, round 55: average objective=6.220475684540048\n", + "Training, round 56: average objective=6.253994842279919\n", + "Training, round 57: average objective=6.287690012849164\n", + "Training, round 58: average objective=6.32147230152488\n", + "Training, round 59: average objective=6.355274278786359\n", + "Training, round 60: average objective=6.389011884996786\n", + "Training, round 61: average objective=6.422539800341824\n", + "Training, round 62: average objective=6.45562036953244\n", + "Training, round 63: average objective=6.487921183174111\n", + "Training, round 64: average objective=6.5190464052470105\n", + "Training, round 65: average objective=6.548596854678628\n", + "Training, round 66: average objective=6.576239835773281\n", + "Training, round 67: average objective=6.601769216583134\n", + "Training, round 68: average objective=6.62513659969092\n", + "Training, round 69: average objective=6.646446878719502\n", + "Training, round 70: average objective=6.665921741824009\n", + "Training, round 71: average objective=6.683845114131342\n", + "Training, round 72: average objective=6.700507588834515\n", + "Training, round 73: average objective=6.7161627975236495\n", + "Training, round 74: average objective=6.731002677305289\n", + "Training, round 75: average objective=6.745150570040646\n", + "Training, round 76: average objective=6.758667595881423\n", + "Training, round 77: average objective=6.771565487939896\n", + "Training, round 78: average objective=6.78382067020234\n", + "Training, round 79: average objective=6.795387195652828\n", + "Training, round 80: average objective=6.806207597281117\n", + "Training, round 81: average objective=6.816223069152007\n", + "Training, round 82: average objective=6.82538364680908\n", + "Training, round 83: average objective=6.833658673184886\n", + "Training, round 84: average objective=6.841046347133756\n", + "Training, round 85: average objective=6.847580225448873\n", + "Training, round 86: average objective=6.853330423513274\n", + "Training, round 87: average objective=6.858398241339309\n", + "Training, round 88: average objective=6.8629045096230445\n", + "Training, round 89: average objective=6.8669743495837725\n", + "Training, round 90: average objective=6.870721999237595\n", + "Training, round 91: average objective=6.874239644552764\n", + "Training, round 92: average objective=6.877592303861793\n", + "Training, round 93: average objective=6.880819397108418\n", + "Training, round 94: average objective=6.883940866308485\n", + "Training, round 95: average objective=6.886965014444747\n", + "Training, round 96: average objective=6.88989496710325\n", + "Training, round 97: average objective=6.892732020092195\n", + "Training, round 98: average objective=6.895475703087188\n", + "Training, round 99: average objective=6.898121907434893\n", + "Training, round 100: average objective=6.900660821389571\n", + "Training, round 101: average objective=6.9030765629705435\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 102: average objective=6.905349233300482\n", + "Training, round 103: average objective=6.907459043986028\n", + "Training, round 104: average objective=6.909391236548693\n", + "Training, round 105: average objective=6.911140028824676\n", + "Training, round 106: average objective=6.9127102864658205\n", + "Training, round 107: average objective=6.914116282776867\n", + "Training, round 108: average objective=6.915378231625927\n", + "Training, round 109: average objective=6.916517627144282\n", + "Training, round 110: average objective=6.917552891235051\n", + "Training, round 111: average objective=6.918496600775837\n", + "Training, round 112: average objective=6.919354793798813\n", + "Training, round 113: average objective=6.920128326324616\n", + "Training, round 114: average objective=6.920815454783043\n", + "Training, round 115: average objective=6.9214146854845895\n", + "Training, round 116: average objective=6.9219271717141915\n", + "Training, round 117: average objective=6.9223578711257545\n", + "Training, round 118: average objective=6.922715443310869\n", + "Training, round 119: average objective=6.923011134596212\n", + "Training, round 120: average objective=6.923257043887173\n", + "Training, round 121: average objective=6.923464386638502\n", + "Training, round 122: average objective=6.923642206388125\n", + "Training, round 123: average objective=6.923796777866324\n", + "Training, round 124: average objective=6.923931769024971\n", + "Training, round 125: average objective=6.924048951732385\n", + "Training, round 126: average objective=6.924149121399289\n", + "Training, round 127: average objective=6.924233042608229\n", + "Training, round 128: average objective=6.924302011304167\n", + "Training, round 129: average objective=6.924358081265159\n", + "Training, round 130: average objective=6.924403894169483\n", + "Training, round 131: average objective=6.924442257014585\n", + "Training, round 132: average objective=6.9244757129295085\n", + "Training, round 133: average objective=6.924506195508574\n", + "Training, round 134: average objective=6.924534901908585\n", + "Training, round 135: average objective=6.924562403208094\n", + "Training, round 136: average objective=6.924588857233566\n", + "Training, round 137: average objective=6.924614286044376\n", + "Training, round 138: average objective=6.924638762410059\n", + "Training, round 139: average objective=6.924662487533473\n", + "Training, round 140: average objective=6.9246857435117075\n", + "No significant improvement, early stopping...\n", + "End of recursion!\n", + "graph n: 2, graph edges: Set(Tuple{Set{Int64}, Float64}[(Set([2, 1]), 7.0)])\n", + "res: ((7.0, ([1], [2])), 0)\n", + "return from recursion\n", + "partitions: ([1], [2])\n", + "v_out: 3\n", + "return from recursion\n", + "partitions: ([1, 3], [2])\n", + "v_out: 3\n", + "return from recursion\n", + "partitions: ([1, 4], [2, 3])\n", + "v_out: 4\n", + "return from recursion\n", + "partitions: ([1, 5], [2, 3, 4])\n", + "v_out: 5\n" + ] + }, + { + "data": { + "text/plain": [ + "((27.0, ([1, 6], [2, 3, 4, 5])), 2161)" + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p = 5\n", + "ws_rqaoa_result = recursive_ws_qaoa(graph, ws_partitioning, ε, init_state_randomized, p, rounds, lr)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " # Goemans-Williamson (Best known classical randomized solver) vs R-WS-QAOA\n", + " \n", + " We are now going to try to improve the solution of the GW-Algorithm in a fully connected graph of 8 nodes. It is important to note that this example is as minimal as it gets. For a graph size below 8, GW-Algorithm almost always finds the optimal solution. It also usually manages to produce the correct cut for the example below, but for demonstration purposes we've chosen a run, where it could not, and tried to improve it with R-WS-QAOA.\n", + " \n", + " If your machine is powerful enough, you could also try this with much bigger graphs, where the result would be more meaningful. For the reference, this example was run on a Intel Core i7-7700 HQ machine with Nvidia GTX 1070 graphics card." + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Max iterations reached.\n" + ] + }, + { + "data": { + "text/plain": [ + "(104, ([2, 3, 5, 6, 8], [1, 4, 7]))" + ] + }, + "execution_count": 126, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "edges = [\n", + " (1, 2, 3.0), (1, 3, 5.0), (1, 4, 3.0), (1, 5, 7.0), (1, 6, 8.0), (1, 7, 1.0), (1, 8, 3.0),\n", + " (2, 3, 14.0), (2, 4, 8.0), (2, 5, 6.0), (2, 6, 4.0), (2, 7, 3.0), (2, 8, 1.0),\n", + " (3, 4, 11.0), (3, 5, 12.0), (3, 6, 5.0), (3, 7, 5.0), (3, 8, 9.0),\n", + " (4, 5, 6.0), (4, 6, 16.0), (4, 7, 8.0), (4, 8, 3.0),\n", + " (5, 6, 7.0), (5, 7, 8.0), (5, 8, 3.0),\n", + " (6, 7, 8.0), (6, 8, 1.0),\n", + " (7, 8, 10.0)\n", + "] # max cut size 123: 2,5,6,8 / 1,3,4,7, fully connected graph of 8 nodes\n", + "n = 8\n", + "graph = EdgeWeightedGraph(n, edges)\n", + "ws_partitioning = [0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0] # cut size 104, got with GW\n", + "ε = 0.25\n", + "init_state_randomized = true\n", + "p = 5\n", + "rounds = 300\n", + "lr = 0.1\n", + "ws = prepare_init_state(ws_partitioning, ε)\n", + "max_cut, max_partition = maxcut(adjacency_matrix(graph), iter=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 0: average objective = 91.25\n", + "Training, round 1: average objective=91.24999999999967\n", + "Training, round 2: average objective=91.2499999999997\n", + "Training, round 3: average objective=92.40766294846817\n", + "Training, round 4: average objective=95.23745665082373\n", + "Training, round 5: average objective=97.6205551313503\n", + "Training, round 6: average objective=99.21164991956721\n", + "Training, round 7: average objective=101.4130184093026\n", + "Training, round 8: average objective=103.90434729217827\n", + "Training, round 9: average objective=105.08938894490628\n", + "Training, round 10: average objective=104.96997302603836\n", + "Training, round 11: average objective=105.21986185796513\n", + "Training, round 12: average objective=105.28393785989257\n", + "Training, round 13: average objective=105.05411471194381\n", + "Training, round 14: average objective=105.19125639587975\n", + "Training, round 15: average objective=105.98709666440402\n", + "Training, round 16: average objective=107.18521005361626\n", + "Training, round 17: average objective=108.22286140121633\n", + "Training, round 18: average objective=108.57068200274449\n", + "Training, round 19: average objective=108.26202182966678\n", + "Training, round 20: average objective=108.05073536751422\n", + "Training, round 21: average objective=108.41675995155083\n", + "Training, round 22: average objective=109.11900751333096\n", + "Training, round 23: average objective=109.71389583633876\n", + "Training, round 24: average objective=109.97328221946728\n", + "Training, round 25: average objective=109.96592384566472\n", + "Training, round 26: average objective=109.91005809978165\n", + "Training, round 27: average objective=109.9856066051438\n", + "Training, round 28: average objective=110.24782388849516\n", + "Training, round 29: average objective=110.63783106706276\n", + "Training, round 30: average objective=111.03210131338088\n", + "Training, round 31: average objective=111.31434252756225\n", + "Training, round 32: average objective=111.45859111132344\n", + "Training, round 33: average objective=111.55115384870687\n", + "Training, round 34: average objective=111.69592969058658\n", + "Training, round 35: average objective=111.90758856622745\n", + "Training, round 36: average objective=112.12001467024422\n", + "Training, round 37: average objective=112.26734866440188\n", + "Training, round 38: average objective=112.3393065327327\n", + "Training, round 39: average objective=112.3791456603272\n", + "Training, round 40: average objective=112.44474501858053\n", + "Training, round 41: average objective=112.56821405271438\n", + "Training, round 42: average objective=112.73926164545969\n", + "Training, round 43: average objective=112.91673302076262\n", + "Training, round 44: average objective=113.05653326157832\n", + "Training, round 45: average objective=113.13917017849752\n", + "Training, round 46: average objective=113.18116093121563\n", + "Training, round 47: average objective=113.22028522151189\n", + "Training, round 48: average objective=113.28369584394714\n", + "Training, round 49: average objective=113.36737199150694\n", + "Training, round 50: average objective=113.44548885048987\n", + "Training, round 51: average objective=113.49680025173396\n", + "Training, round 52: average objective=113.52132411879563\n", + "Training, round 53: average objective=113.5363531856307\n", + "Training, round 54: average objective=113.56152764411618\n", + "Training, round 55: average objective=113.60728064993019\n", + "Training, round 56: average objective=113.67226200724194\n", + "Training, round 57: average objective=113.74706262460194\n", + "Training, round 58: average objective=113.82014504085873\n", + "Training, round 59: average objective=113.88334446898288\n", + "Training, round 60: average objective=113.93483278408041\n", + "Training, round 61: average objective=113.97821557549618\n", + "Training, round 62: average objective=114.01881666774013\n", + "Training, round 63: average objective=114.05996926741685\n", + "Training, round 64: average objective=114.1015546489649\n", + "Training, round 65: average objective=114.14106654253068\n", + "Training, round 66: average objective=114.1759095399778\n", + "Training, round 67: average objective=114.20524556823565\n", + "Training, round 68: average objective=114.23036349766802\n", + "Training, round 69: average objective=114.25367111732727\n", + "Training, round 70: average objective=114.2772152177011\n", + "Training, round 71: average objective=114.30163921668077\n", + "Training, round 72: average objective=114.32602954370074\n", + "Training, round 73: average objective=114.34858607107176\n", + "Training, round 74: average objective=114.36772585115705\n", + "Training, round 75: average objective=114.38304845153695\n", + "Training, round 76: average objective=114.3956458163979\n", + "Training, round 77: average objective=114.40755639876875\n", + "Training, round 78: average objective=114.4206775988784\n", + "Training, round 79: average objective=114.43580104902092\n", + "Training, round 80: average objective=114.45234754847138\n", + "Training, round 81: average objective=114.46891482353121\n", + "Training, round 82: average objective=114.48421930120537\n", + "Training, round 83: average objective=114.49781545963114\n", + "Training, round 84: average objective=114.51020547908267\n", + "Training, round 85: average objective=114.52240162672149\n", + "Training, round 86: average objective=114.53532191078773\n", + "Training, round 87: average objective=114.54939894756014\n", + "Training, round 88: average objective=114.56451793127053\n", + "Training, round 89: average objective=114.58020089656353\n", + "Training, round 90: average objective=114.595868689128\n", + "Training, round 91: average objective=114.61105844731591\n", + "Training, round 92: average objective=114.62556298458068\n", + "Training, round 93: average objective=114.63948125288265\n", + "Training, round 94: average objective=114.65316916535006\n", + "Training, round 95: average objective=114.66709001383637\n", + "Training, round 96: average objective=114.681610361554\n", + "Training, round 97: average objective=114.69683697070687\n", + "Training, round 98: average objective=114.71259644815922\n", + "Training, round 99: average objective=114.72857503098031\n", + "Training, round 100: average objective=114.744512354919\n", + "Training, round 101: average objective=114.76033103773779\n", + "Training, round 102: average objective=114.77611917004853\n", + "Training, round 103: average objective=114.7920290052708\n", + "Training, round 104: average objective=114.80818370400695\n", + "Training, round 105: average objective=114.82464205249471\n", + "Training, round 106: average objective=114.8414078571355\n", + "Training, round 107: average objective=114.85842807511048\n", + "Training, round 108: average objective=114.87558517932419\n", + "Training, round 109: average objective=114.89271344087024\n", + "Training, round 110: average objective=114.90964696909319\n", + "Training, round 111: average objective=114.92626957332955\n", + "Training, round 112: average objective=114.94251687483168\n", + "Training, round 113: average objective=114.9583418909084\n", + "Training, round 114: average objective=114.97368260414129\n", + "Training, round 115: average objective=114.98845178390424\n", + "Training, round 116: average objective=115.00254950607575\n", + "Training, round 117: average objective=115.01587353826609\n", + "Training, round 118: average objective=115.02833047015417\n", + "Training, round 119: average objective=115.0398526262619\n", + "Training, round 120: average objective=115.05041298907878\n", + "Training, round 121: average objective=115.06002728271844\n", + "Training, round 122: average objective=115.0687375528978\n", + "Training, round 123: average objective=115.07659455994289\n", + "Training, round 124: average objective=115.08365496104685\n", + "Training, round 125: average objective=115.08998300931358\n", + "Training, round 126: average objective=115.09564506517569\n", + "Training, round 127: average objective=115.10070751933806\n", + "Training, round 128: average objective=115.1052396960571\n", + "Training, round 129: average objective=115.1093213551622\n", + "Training, round 130: average objective=115.11303762647765\n", + "Training, round 131: average objective=115.11646724097793\n", + "Training, round 132: average objective=115.11967427901897\n", + "Training, round 133: average objective=115.12270796063517\n", + "Training, round 134: average objective=115.12561030934177\n", + "Training, round 135: average objective=115.12841513319023\n", + "Training, round 136: average objective=115.13114604537145\n", + "Training, round 137: average objective=115.13381638758815\n", + "Training, round 138: average objective=115.13643104678526\n", + "Training, round 139: average objective=115.1389884589933\n", + "Training, round 140: average objective=115.14147983747434\n", + "Training, round 141: average objective=115.14389249302727\n", + "Training, round 142: average objective=115.14621373912766\n", + "Training, round 143: average objective=115.1484319720783\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 144: average objective=115.1505379072231\n", + "Training, round 145: average objective=115.1525241782897\n", + "Training, round 146: average objective=115.1543857103681\n", + "Training, round 147: average objective=115.15611885987374\n", + "Training, round 148: average objective=115.15772046532618\n", + "Training, round 149: average objective=115.15918762072545\n", + "Training, round 150: average objective=115.16052186682225\n", + "Training, round 151: average objective=115.16172848245239\n", + "Training, round 152: average objective=115.16281528740723\n", + "Training, round 153: average objective=115.1637915437066\n", + "Training, round 154: average objective=115.16466667622355\n", + "Training, round 155: average objective=115.16545019745988\n", + "Training, round 156: average objective=115.16615101166718\n", + "Training, round 157: average objective=115.16677748879692\n", + "Training, round 158: average objective=115.16733764852576\n", + "Training, round 159: average objective=115.16783944657412\n", + "Training, round 160: average objective=115.16828968851704\n", + "Training, round 161: average objective=115.16869458583072\n", + "Training, round 162: average objective=115.16905933187813\n", + "Training, round 163: average objective=115.16938844840533\n", + "Training, round 164: average objective=115.16968564305864\n", + "Training, round 165: average objective=115.16995379027061\n", + "Training, round 166: average objective=115.1701954068487\n", + "Training, round 167: average objective=115.17041272355826\n", + "Training, round 168: average objective=115.17060774285716\n", + "Training, round 169: average objective=115.17078206451642\n", + "Training, round 170: average objective=115.17093719156529\n", + "Training, round 171: average objective=115.17107444654486\n", + "Training, round 172: average objective=115.17119515769251\n", + "Training, round 173: average objective=115.17130083009683\n", + "Training, round 174: average objective=115.17139294012618\n", + "Training, round 175: average objective=115.17147286264535\n", + "Training, round 176: average objective=115.17154184168179\n", + "Training, round 177: average objective=115.1716010760831\n", + "Training, round 178: average objective=115.17165166972794\n", + "Training, round 179: average objective=115.17169466054163\n", + "Training, round 180: average objective=115.1717310657051\n", + "Training, round 181: average objective=115.1717617527793\n", + "Training, round 182: average objective=115.17178752459422\n", + "No significant improvement, early stopping...\n", + "Training, round 0: average objective = 47.25000000000001\n", + "Training, round 1: average objective=47.2499999999999\n", + "Training, round 2: average objective=47.24999999999991\n", + "Training, round 3: average objective=45.728224657518304\n", + "Training, round 4: average objective=47.22671694983241\n", + "Training, round 5: average objective=46.38738422730309\n", + "Training, round 6: average objective=46.27363895106964\n", + "Training, round 7: average objective=47.037788883403685\n", + "Training, round 8: average objective=47.44693882868228\n", + "Training, round 9: average objective=47.56182262626285\n", + "Training, round 10: average objective=48.20970286276386\n", + "Training, round 11: average objective=49.227269799645036\n", + "Training, round 12: average objective=50.44576535968549\n", + "Training, round 13: average objective=51.95084402029717\n", + "Training, round 14: average objective=53.941137545068834\n", + "Training, round 15: average objective=56.44482590346532\n", + "Training, round 16: average objective=58.56070687164872\n", + "Training, round 17: average objective=59.52663272477087\n", + "Training, round 18: average objective=60.82645452319972\n", + "Training, round 19: average objective=61.647015616950995\n", + "Training, round 20: average objective=61.37816137803338\n", + "Training, round 21: average objective=61.06383795070191\n", + "Training, round 22: average objective=60.99132909774288\n", + "Training, round 23: average objective=60.88871268160888\n", + "Training, round 24: average objective=60.77104443985937\n", + "Training, round 25: average objective=61.04009210314051\n", + "Training, round 26: average objective=61.885784281446135\n", + "Training, round 27: average objective=62.920267503899524\n", + "Training, round 28: average objective=63.62703581499285\n", + "Training, round 29: average objective=63.83149204844459\n", + "Training, round 30: average objective=63.76446850982024\n", + "Training, round 31: average objective=63.74611921560303\n", + "Training, round 32: average objective=63.84104624422261\n", + "Training, round 33: average objective=63.97134716579522\n", + "Training, round 34: average objective=64.1132871081089\n", + "Training, round 35: average objective=64.28613599466792\n", + "Training, round 36: average objective=64.48854891065398\n", + "Training, round 37: average objective=64.67166538063321\n", + "Training, round 38: average objective=64.76397193909592\n", + "Training, round 39: average objective=64.74709394100434\n", + "Training, round 40: average objective=64.6981525283519\n", + "Training, round 41: average objective=64.70452268819298\n", + "Training, round 42: average objective=64.76677113645931\n", + "Training, round 43: average objective=64.84432235934432\n", + "Training, round 44: average objective=64.93493931717464\n", + "Training, round 45: average objective=65.0590677179165\n", + "Training, round 46: average objective=65.20866248926262\n", + "Training, round 47: average objective=65.34518747030637\n", + "Training, round 48: average objective=65.43876955607477\n", + "Training, round 49: average objective=65.49511465952634\n", + "Training, round 50: average objective=65.53831020503361\n", + "Training, round 51: average objective=65.57863855418319\n", + "Training, round 52: average objective=65.6113953903432\n", + "Training, round 53: average objective=65.63693976312831\n", + "Training, round 54: average objective=65.66587115031648\n", + "Training, round 55: average objective=65.70613112284599\n", + "Training, round 56: average objective=65.75354367913943\n", + "Training, round 57: average objective=65.79639089836304\n", + "Training, round 58: average objective=65.82622086976639\n", + "Training, round 59: average objective=65.84392031434717\n", + "Training, round 60: average objective=65.85729508946875\n", + "Training, round 61: average objective=65.87385840525084\n", + "Training, round 62: average objective=65.89644551921307\n", + "Training, round 63: average objective=65.92502139309994\n", + "Training, round 64: average objective=65.95970366392908\n", + "Training, round 65: average objective=66.0000761497198\n", + "Training, round 66: average objective=66.04295998860933\n", + "Training, round 67: average objective=66.08320157721191\n", + "Training, round 68: average objective=66.11748746905133\n", + "Training, round 69: average objective=66.14688164761743\n", + "Training, round 70: average objective=66.1751829506995\n", + "Training, round 71: average objective=66.20533797084396\n", + "Training, round 72: average objective=66.23808867529183\n", + "Training, round 73: average objective=66.27343905514942\n", + "Training, round 74: average objective=66.31194864203455\n", + "Training, round 75: average objective=66.35405459257522\n", + "Training, round 76: average objective=66.39887990626724\n", + "Training, round 77: average objective=66.4445463016737\n", + "Training, round 78: average objective=66.48962376367672\n", + "Training, round 79: average objective=66.53364483189026\n", + "Training, round 80: average objective=66.5760128826742\n", + "Training, round 81: average objective=66.61507155365325\n", + "Training, round 82: average objective=66.64886746322713\n", + "Training, round 83: average objective=66.67668867220078\n", + "Training, round 84: average objective=66.69950621776658\n", + "Training, round 85: average objective=66.71899874609977\n", + "Training, round 86: average objective=66.73659805021802\n", + "Training, round 87: average objective=66.75366249212081\n", + "Training, round 88: average objective=66.77188911592731\n", + "Training, round 89: average objective=66.79261412456316\n", + "Training, round 90: average objective=66.81574839358173\n", + "Training, round 91: average objective=66.8400306277772\n", + "Training, round 92: average objective=66.86428190909469\n", + "Training, round 93: average objective=66.88797003143509\n", + "Training, round 94: average objective=66.91072927176782\n", + "Training, round 95: average objective=66.93194288044543\n", + "Training, round 96: average objective=66.95099826836254\n", + "Training, round 97: average objective=66.96769217521367\n", + "Training, round 98: average objective=66.98221648210199\n", + "Training, round 99: average objective=66.99493340154959\n", + "Training, round 100: average objective=67.0063792443949\n", + "Training, round 101: average objective=67.01735559131603\n", + "Training, round 102: average objective=67.02868894149431\n", + "Training, round 103: average objective=67.04076916640487\n", + "Training, round 104: average objective=67.0534025012314\n", + "Training, round 105: average objective=67.06612295593364\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 106: average objective=67.07854172005392\n", + "Training, round 107: average objective=67.09040755708601\n", + "Training, round 108: average objective=67.1015385434306\n", + "Training, round 109: average objective=67.11186637438355\n", + "Training, round 110: average objective=67.12148916386195\n", + "Training, round 111: average objective=67.13056586676501\n", + "Training, round 112: average objective=67.13916947387764\n", + "Training, round 113: average objective=67.14731439894537\n", + "Training, round 114: average objective=67.15509886167109\n", + "Training, round 115: average objective=67.162726288771\n", + "Training, round 116: average objective=67.17037456288148\n", + "Training, round 117: average objective=67.17809799260864\n", + "Training, round 118: average objective=67.18583822315867\n", + "Training, round 119: average objective=67.19345126337211\n", + "Training, round 120: average objective=67.20072428879753\n", + "Training, round 121: average objective=67.2074591895084\n", + "Training, round 122: average objective=67.21359598489025\n", + "Training, round 123: average objective=67.21924229425579\n", + "Training, round 124: average objective=67.22457955096127\n", + "Training, round 125: average objective=67.22976121638251\n", + "Training, round 126: average objective=67.23487840352942\n", + "Training, round 127: average objective=67.23995178842205\n", + "Training, round 128: average objective=67.24492597764007\n", + "Training, round 129: average objective=67.24970066258092\n", + "Training, round 130: average objective=67.25419700565519\n", + "Training, round 131: average objective=67.25839297823059\n", + "Training, round 132: average objective=67.26230103305342\n", + "Training, round 133: average objective=67.26593999625935\n", + "Training, round 134: average objective=67.2693343386455\n", + "Training, round 135: average objective=67.27251583427586\n", + "Training, round 136: average objective=67.27551051858894\n", + "Training, round 137: average objective=67.27833528370036\n", + "Training, round 138: average objective=67.2810083595177\n", + "Training, round 139: average objective=67.28354555924003\n", + "Training, round 140: average objective=67.28594366487609\n", + "Training, round 141: average objective=67.28818152288315\n", + "Training, round 142: average objective=67.29023889900051\n", + "Training, round 143: average objective=67.29211047262947\n", + "Training, round 144: average objective=67.2938057523618\n", + "Training, round 145: average objective=67.29534731786354\n", + "Training, round 146: average objective=67.29676726077219\n", + "Training, round 147: average objective=67.29809358594312\n", + "Training, round 148: average objective=67.29933819622028\n", + "Training, round 149: average objective=67.30049953491555\n", + "Training, round 150: average objective=67.30157356235881\n", + "Training, round 151: average objective=67.30255800978829\n", + "Training, round 152: average objective=67.30345385143562\n", + "Training, round 153: average objective=67.3042674227403\n", + "Training, round 154: average objective=67.30500874422457\n", + "Training, round 155: average objective=67.30568706353432\n", + "Training, round 156: average objective=67.30630923125219\n", + "Training, round 157: average objective=67.3068826320726\n", + "Training, round 158: average objective=67.3074154184331\n", + "Training, round 159: average objective=67.30791374164237\n", + "Training, round 160: average objective=67.3083808451155\n", + "Training, round 161: average objective=67.30881802613824\n", + "Training, round 162: average objective=67.309225222581\n", + "Training, round 163: average objective=67.30960189344468\n", + "Training, round 164: average objective=67.30994955851438\n", + "Training, round 165: average objective=67.3102728289636\n", + "Training, round 166: average objective=67.31057704545344\n", + "Training, round 167: average objective=67.31086643122715\n", + "Training, round 168: average objective=67.31114334906601\n", + "Training, round 169: average objective=67.3114087128886\n", + "Training, round 170: average objective=67.3116625124726\n", + "Training, round 171: average objective=67.31190454175993\n", + "Training, round 172: average objective=67.31213558131005\n", + "Training, round 173: average objective=67.31235681472167\n", + "Training, round 174: average objective=67.31256908645537\n", + "Training, round 175: average objective=67.31277324084726\n", + "Training, round 176: average objective=67.3129701426766\n", + "Training, round 177: average objective=67.31316066586498\n", + "Training, round 178: average objective=67.31334577600673\n", + "Training, round 179: average objective=67.31352633864334\n", + "Training, round 180: average objective=67.31370288104688\n", + "No significant improvement, early stopping...\n", + "Training, round 0: average objective = 68.75\n", + "Training, round 1: average objective=68.74999999999984\n", + "Training, round 2: average objective=68.74999999999986\n", + "Training, round 3: average objective=68.38045308475148\n", + "Training, round 4: average objective=69.46852023042963\n", + "Training, round 5: average objective=70.33989684283338\n", + "Training, round 6: average objective=70.798226823608\n", + "Training, round 7: average objective=72.17998939651274\n", + "Training, round 8: average objective=74.2299698842576\n", + "Training, round 9: average objective=75.31305648764362\n", + "Training, round 10: average objective=76.50108239218586\n", + "Training, round 11: average objective=78.23179586612417\n", + "Training, round 12: average objective=78.81502994809485\n", + "Training, round 13: average objective=79.06909785319876\n", + "Training, round 14: average objective=79.52266804718309\n", + "Training, round 15: average objective=79.39286128415824\n", + "Training, round 16: average objective=78.7089364965101\n", + "Training, round 17: average objective=78.48373963938728\n", + "Training, round 18: average objective=78.51159581440518\n", + "Training, round 19: average objective=78.5760143408383\n", + "Training, round 20: average objective=78.953606272095\n", + "Training, round 21: average objective=79.61120745732558\n", + "Training, round 22: average objective=80.12577118224706\n", + "Training, round 23: average objective=80.12289237415717\n", + "Training, round 24: average objective=79.77707809092925\n", + "Training, round 25: average objective=79.60462686550615\n", + "Training, round 26: average objective=79.79705151456702\n", + "Training, round 27: average objective=80.18046181747026\n", + "Training, round 28: average objective=80.54640831659069\n", + "Training, round 29: average objective=80.83748867245163\n", + "Training, round 30: average objective=81.10170961867644\n", + "Training, round 31: average objective=81.37296147885849\n", + "Training, round 32: average objective=81.60334594106594\n", + "Training, round 33: average objective=81.69374301239327\n", + "Training, round 34: average objective=81.61598782264083\n", + "Training, round 35: average objective=81.48816491690562\n", + "Training, round 36: average objective=81.4446996577032\n", + "Training, round 37: average objective=81.48702994420184\n", + "Training, round 38: average objective=81.56945848998708\n", + "Training, round 39: average objective=81.70295219816224\n", + "Training, round 40: average objective=81.88001634437937\n", + "Training, round 41: average objective=82.01990317322239\n", + "Training, round 42: average objective=82.05583930792902\n", + "Training, round 43: average objective=82.02034939492768\n", + "Training, round 44: average objective=81.99480450336065\n", + "Training, round 45: average objective=82.01351260452431\n", + "Training, round 46: average objective=82.06235836971976\n", + "Training, round 47: average objective=82.1289087956867\n", + "Training, round 48: average objective=82.21547170959823\n", + "Training, round 49: average objective=82.31811786317022\n", + "Training, round 50: average objective=82.41392351793547\n", + "Training, round 51: average objective=82.47404977469775\n", + "Training, round 52: average objective=82.4890048970148\n", + "Training, round 53: average objective=82.47751770125191\n", + "Training, round 54: average objective=82.4676086406346\n", + "Training, round 55: average objective=82.474377255241\n", + "Training, round 56: average objective=82.49895682910557\n", + "Training, round 57: average objective=82.53832742891089\n", + "Training, round 58: average objective=82.58731943900699\n", + "Training, round 59: average objective=82.63619428784872\n", + "Training, round 60: average objective=82.67497359262057\n", + "Training, round 61: average objective=82.70176714104207\n", + "Training, round 62: average objective=82.7238356551914\n", + "Training, round 63: average objective=82.74950455051439\n", + "Training, round 64: average objective=82.78118722229365\n", + "Training, round 65: average objective=82.81670819197475\n", + "Training, round 66: average objective=82.85444642273926\n", + "Training, round 67: average objective=82.89506289308075\n", + "Training, round 68: average objective=82.93910639474632\n", + "Training, round 69: average objective=82.9847749371972\n", + "Training, round 70: average objective=83.02885442481818\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 71: average objective=83.06956022276717\n", + "Training, round 72: average objective=83.10781578691163\n", + "Training, round 73: average objective=83.14556602235953\n", + "Training, round 74: average objective=83.18341549079648\n", + "Training, round 75: average objective=83.22036481468969\n", + "Training, round 76: average objective=83.25527854127336\n", + "Training, round 77: average objective=83.28772124506307\n", + "Training, round 78: average objective=83.3174015703494\n", + "Training, round 79: average objective=83.34363349974656\n", + "Training, round 80: average objective=83.36585451176643\n", + "Training, round 81: average objective=83.38443132057841\n", + "Training, round 82: average objective=83.40048233973272\n", + "Training, round 83: average objective=83.4147969723602\n", + "Training, round 84: average objective=83.42716286939334\n", + "Training, round 85: average objective=83.43684110861165\n", + "Training, round 86: average objective=83.44348552424238\n", + "Training, round 87: average objective=83.44743069670045\n", + "Training, round 88: average objective=83.44926321720861\n", + "Training, round 89: average objective=83.44944833598927\n", + "Training, round 90: average objective=83.44845570028826\n", + "Training, round 91: average objective=83.44700381538175\n", + "Training, round 92: average objective=83.4459003421511\n", + "Training, round 93: average objective=83.44560768989417\n", + "Training, round 94: average objective=83.44609272490639\n", + "Training, round 95: average objective=83.44713164096031\n", + "Training, round 96: average objective=83.44864682172728\n", + "Training, round 97: average objective=83.4507027254985\n", + "Training, round 98: average objective=83.4532872520808\n", + "Training, round 99: average objective=83.45622837513656\n", + "Training, round 100: average objective=83.45932458838081\n", + "Training, round 101: average objective=83.46246686199859\n", + "Training, round 102: average objective=83.46560265003691\n", + "Training, round 103: average objective=83.46864482521914\n", + "Training, round 104: average objective=83.47148376848659\n", + "Training, round 105: average objective=83.47407401979882\n", + "Training, round 106: average objective=83.47644752405138\n", + "Training, round 107: average objective=83.47862722175483\n", + "Training, round 108: average objective=83.48056585048323\n", + "Training, round 109: average objective=83.48219251230162\n", + "Training, round 110: average objective=83.48349560531034\n", + "Training, round 111: average objective=83.48453511343799\n", + "Training, round 112: average objective=83.48538631361401\n", + "Training, round 113: average objective=83.48610131558178\n", + "Training, round 114: average objective=83.48672511772449\n", + "Training, round 115: average objective=83.48731685957009\n", + "Training, round 116: average objective=83.4879324109552\n", + "Training, round 117: average objective=83.48859567051414\n", + "Training, round 118: average objective=83.48930223663751\n", + "Training, round 119: average objective=83.49004849670001\n", + "Training, round 120: average objective=83.49084218230897\n", + "Training, round 121: average objective=83.49168158078528\n", + "Training, round 122: average objective=83.49253903954491\n", + "Training, round 123: average objective=83.49337458304214\n", + "Training, round 124: average objective=83.49415987740664\n", + "Training, round 125: average objective=83.49488502541625\n", + "Training, round 126: average objective=83.49554816294423\n", + "Training, round 127: average objective=83.49615079965653\n", + "Training, round 128: average objective=83.4967037489603\n", + "Training, round 129: average objective=83.49722817903344\n", + "Training, round 130: average objective=83.49774614889722\n", + "Training, round 131: average objective=83.49827118494878\n", + "Training, round 132: average objective=83.49881043492971\n", + "Training, round 133: average objective=83.49937134770742\n", + "Training, round 134: average objective=83.49996054838937\n", + "Training, round 135: average objective=83.50057844970758\n", + "Training, round 136: average objective=83.50121723066698\n", + "Training, round 137: average objective=83.50186638200196\n", + "Training, round 138: average objective=83.50251774108966\n", + "Training, round 139: average objective=83.50316510115093\n", + "Training, round 140: average objective=83.50380270837711\n", + "Training, round 141: average objective=83.50442705960592\n", + "No significant improvement, early stopping...\n", + "Training, round 0: average objective = 17.500000000000007\n", + "Training, round 1: average objective=17.499999999999975\n", + "Training, round 2: average objective=17.499999999999975\n", + "Training, round 3: average objective=17.286568495594796\n", + "Training, round 4: average objective=17.438947229839375\n", + "Training, round 5: average objective=17.66005384778152\n", + "Training, round 6: average objective=18.344679044233487\n", + "Training, round 7: average objective=19.209660342049062\n", + "Training, round 8: average objective=20.201458207992154\n", + "Training, round 9: average objective=21.62766375964301\n", + "Training, round 10: average objective=23.499199697510036\n", + "Training, round 11: average objective=25.306003798051762\n", + "Training, round 12: average objective=26.86271234624514\n", + "Training, round 13: average objective=28.46557126612334\n", + "Training, round 14: average objective=30.00469205413887\n", + "Training, round 15: average objective=31.062846591694097\n", + "Training, round 16: average objective=31.938578972092824\n", + "Training, round 17: average objective=32.806216729778036\n", + "Training, round 18: average objective=33.315307774766985\n", + "Training, round 19: average objective=33.63730374264579\n", + "Training, round 20: average objective=33.9292202415593\n", + "Training, round 21: average objective=33.92301882859927\n", + "Training, round 22: average objective=33.78143411498768\n", + "Training, round 23: average objective=33.700019784236034\n", + "Training, round 24: average objective=33.50532035153996\n", + "Training, round 25: average objective=33.32522071581333\n", + "Training, round 26: average objective=33.27788003477212\n", + "Training, round 27: average objective=33.20750523843539\n", + "Training, round 28: average objective=33.193960597529106\n", + "Training, round 29: average objective=33.27980435104346\n", + "Training, round 30: average objective=33.3240245462656\n", + "Training, round 31: average objective=33.37911289971724\n", + "Training, round 32: average objective=33.45740327974307\n", + "Training, round 33: average objective=33.46731876928947\n", + "Training, round 34: average objective=33.47318218768425\n", + "Training, round 35: average objective=33.50096799466356\n", + "Training, round 36: average objective=33.50843091085437\n", + "Training, round 37: average objective=33.53943240421603\n", + "Training, round 38: average objective=33.58810673071423\n", + "Training, round 39: average objective=33.607155668376045\n", + "Training, round 40: average objective=33.629855478595786\n", + "Training, round 41: average objective=33.658527758673515\n", + "Training, round 42: average objective=33.6666482776073\n", + "Training, round 43: average objective=33.68814060389924\n", + "Training, round 44: average objective=33.721076203568465\n", + "Training, round 45: average objective=33.745789977812024\n", + "Training, round 46: average objective=33.78420604105864\n", + "Training, round 47: average objective=33.82085921849439\n", + "Training, round 48: average objective=33.84735258230408\n", + "Training, round 49: average objective=33.8809563621568\n", + "Training, round 50: average objective=33.90360193577322\n", + "Training, round 51: average objective=33.924672477708924\n", + "Training, round 52: average objective=33.948722662429795\n", + "Training, round 53: average objective=33.96454566745389\n", + "Training, round 54: average objective=33.98723007411208\n", + "Training, round 55: average objective=34.006642517259316\n", + "Training, round 56: average objective=34.026538701075786\n", + "Training, round 57: average objective=34.049667360456304\n", + "Training, round 58: average objective=34.06737432597157\n", + "Training, round 59: average objective=34.08755342648711\n", + "Training, round 60: average objective=34.10195857146289\n", + "Training, round 61: average objective=34.113898179049926\n", + "Training, round 62: average objective=34.12375074857512\n", + "Training, round 63: average objective=34.1289323208435\n", + "Training, round 64: average objective=34.13587587203256\n", + "Training, round 65: average objective=34.141354588333556\n", + "Training, round 66: average objective=34.14942016851089\n", + "Training, round 67: average objective=34.159612337447356\n", + "Training, round 68: average objective=34.17019187474232\n", + "Training, round 69: average objective=34.18279756787524\n", + "Training, round 70: average objective=34.19368689530742\n", + "Training, round 71: average objective=34.20455489119726\n", + "Training, round 72: average objective=34.21424752331376\n", + "Training, round 73: average objective=34.22279892213231\n", + "Training, round 74: average objective=34.23178350580666\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 75: average objective=34.239979983757834\n", + "Training, round 76: average objective=34.24909718227553\n", + "Training, round 77: average objective=34.257925450525676\n", + "Training, round 78: average objective=34.2667031503198\n", + "Training, round 79: average objective=34.27530852286928\n", + "Training, round 80: average objective=34.28281942000409\n", + "Training, round 81: average objective=34.289979809508125\n", + "Training, round 82: average objective=34.29613916062894\n", + "Training, round 83: average objective=34.30204736343511\n", + "Training, round 84: average objective=34.30791003087706\n", + "Training, round 85: average objective=34.31366763080896\n", + "Training, round 86: average objective=34.319830823466624\n", + "Training, round 87: average objective=34.32586908703864\n", + "Training, round 88: average objective=34.331889634456786\n", + "Training, round 89: average objective=34.33767618745543\n", + "Training, round 90: average objective=34.343016832575834\n", + "Training, round 91: average objective=34.34821174572725\n", + "Training, round 92: average objective=34.35310349763341\n", + "Training, round 93: average objective=34.35799967702678\n", + "Training, round 94: average objective=34.36295948907389\n", + "Training, round 95: average objective=34.36794927913872\n", + "Training, round 96: average objective=34.37310889839813\n", + "Training, round 97: average objective=34.37825520019936\n", + "Training, round 98: average objective=34.38347492370839\n", + "Training, round 99: average objective=34.38872783749784\n", + "Training, round 100: average objective=34.393972724053526\n", + "Training, round 101: average objective=34.39932244588525\n", + "Training, round 102: average objective=34.40473079127675\n", + "Training, round 103: average objective=34.410296580829495\n", + "Training, round 104: average objective=34.416061302609414\n", + "Training, round 105: average objective=34.422040554728426\n", + "Training, round 106: average objective=34.428341755906885\n", + "Training, round 107: average objective=34.43496657501049\n", + "Training, round 108: average objective=34.44197942367748\n", + "Training, round 109: average objective=34.449430715139435\n", + "Training, round 110: average objective=34.457338904375725\n", + "Training, round 111: average objective=34.46580977699543\n", + "Training, round 112: average objective=34.47493587920625\n", + "Training, round 113: average objective=34.48486543719363\n", + "Training, round 114: average objective=34.49577164276327\n", + "Training, round 115: average objective=34.50780007287533\n", + "Training, round 116: average objective=34.52115837344056\n", + "Training, round 117: average objective=34.53608755935756\n", + "Training, round 118: average objective=34.5529138574106\n", + "Training, round 119: average objective=34.57209549545967\n", + "Training, round 120: average objective=34.594201420225204\n", + "Training, round 121: average objective=34.619984362820276\n", + "Training, round 122: average objective=34.650424320735084\n", + "Training, round 123: average objective=34.686794117132195\n", + "Training, round 124: average objective=34.73072647193527\n", + "Training, round 125: average objective=34.784119574324976\n", + "Training, round 126: average objective=34.84883218964665\n", + "Training, round 127: average objective=34.92576631118021\n", + "Training, round 128: average objective=35.013020689525014\n", + "Training, round 129: average objective=35.1037357754353\n", + "Training, round 130: average objective=35.186272796618084\n", + "Training, round 131: average objective=35.24992771708126\n", + "Training, round 132: average objective=35.29432354913486\n", + "Training, round 133: average objective=35.33447803822923\n", + "Training, round 134: average objective=35.39306820947938\n", + "Training, round 135: average objective=35.482521852201096\n", + "Training, round 136: average objective=35.58936766424284\n", + "Training, round 137: average objective=35.673238450541156\n", + "Training, round 138: average objective=35.69190447489406\n", + "Training, round 139: average objective=35.64538743024878\n", + "Training, round 140: average objective=35.590526449174426\n", + "Training, round 141: average objective=35.58897861883664\n", + "Training, round 142: average objective=35.649217816264496\n", + "Training, round 143: average objective=35.72810181559668\n", + "Training, round 144: average objective=35.773402373103934\n", + "Training, round 145: average objective=35.771357765843774\n", + "Training, round 146: average objective=35.746096293809295\n", + "Training, round 147: average objective=35.73071783896546\n", + "Training, round 148: average objective=35.74317178912612\n", + "Training, round 149: average objective=35.77530961482712\n", + "Training, round 150: average objective=35.810588708366964\n", + "Training, round 151: average objective=35.833341896070394\n", + "Training, round 152: average objective=35.84201685620947\n", + "Training, round 153: average objective=35.84445073457549\n", + "Training, round 154: average objective=35.849066278721\n", + "Training, round 155: average objective=35.85757040043207\n", + "Training, round 156: average objective=35.86746118191938\n", + "Training, round 157: average objective=35.87598729783205\n", + "Training, round 158: average objective=35.88259206133711\n", + "Training, round 159: average objective=35.889672831389724\n", + "Training, round 160: average objective=35.897066910959836\n", + "Training, round 161: average objective=35.9031073553867\n", + "Training, round 162: average objective=35.90539500445555\n", + "Training, round 163: average objective=35.90547887611161\n", + "Training, round 164: average objective=35.907768797002376\n", + "Training, round 165: average objective=35.91372330200212\n", + "Training, round 166: average objective=35.9205752939244\n", + "Training, round 167: average objective=35.923363097911775\n", + "Training, round 168: average objective=35.92111986215591\n", + "Training, round 169: average objective=35.91778925645946\n", + "Training, round 170: average objective=35.91791948777826\n", + "Training, round 171: average objective=35.92207502220398\n", + "Training, round 172: average objective=35.926575060589\n", + "Training, round 173: average objective=35.92800677958411\n", + "Training, round 174: average objective=35.92630408704412\n", + "Training, round 175: average objective=35.924458107337905\n", + "Training, round 176: average objective=35.92508345778997\n", + "Training, round 177: average objective=35.92793336067433\n", + "Training, round 178: average objective=35.9306929435767\n", + "Training, round 179: average objective=35.931406485663956\n", + "Training, round 180: average objective=35.93047669398033\n", + "Training, round 181: average objective=35.9297566931586\n", + "Training, round 182: average objective=35.93056022761458\n", + "Training, round 183: average objective=35.93247458701605\n", + "Training, round 184: average objective=35.9340625750991\n", + "Training, round 185: average objective=35.93457966812858\n", + "Training, round 186: average objective=35.934462299765485\n", + "Training, round 187: average objective=35.934689005593995\n", + "Training, round 188: average objective=35.935622161695946\n", + "Training, round 189: average objective=35.93678628610749\n", + "Training, round 190: average objective=35.93757628680135\n", + "Training, round 191: average objective=35.937885603112896\n", + "Training, round 192: average objective=35.938159662100034\n", + "Training, round 193: average objective=35.938768254524135\n", + "Training, round 194: average objective=35.93965209934747\n", + "Training, round 195: average objective=35.94045557307712\n", + "Training, round 196: average objective=35.94097830356401\n", + "Training, round 197: average objective=35.941383477752744\n", + "Training, round 198: average objective=35.941942980465136\n", + "Training, round 199: average objective=35.9427342118149\n", + "Training, round 200: average objective=35.943558747374354\n", + "Training, round 0: average objective = -1.7499999999999991\n", + "Training, round 1: average objective=-1.7499999999999956\n", + "Training, round 2: average objective=-1.7499999999999956\n", + "Training, round 3: average objective=-1.6458352260142202\n", + "Training, round 4: average objective=-0.9579387284664909\n", + "Training, round 5: average objective=0.17361080728862643\n", + "Training, round 6: average objective=1.247153100488379\n", + "Training, round 7: average objective=2.1481007462099164\n", + "Training, round 8: average objective=3.1087252595993347\n", + "Training, round 9: average objective=4.104622371235348\n", + "Training, round 10: average objective=4.88266874405566\n", + "Training, round 11: average objective=5.205809279124664\n", + "Training, round 12: average objective=5.3500863881359555\n", + "Training, round 13: average objective=5.441271246629764\n", + "Training, round 14: average objective=5.313523914583702\n", + "Training, round 15: average objective=5.050933039513756\n", + "Training, round 16: average objective=4.847869348280835\n", + "Training, round 17: average objective=4.766079055780644\n", + "Training, round 18: average objective=4.787557306886491\n", + "Training, round 19: average objective=4.879506119459073\n", + "Training, round 20: average objective=5.031610165370009\n", + "Training, round 21: average objective=5.245809796077858\n", + "Training, round 22: average objective=5.488698052851663\n", + "Training, round 23: average objective=5.697126950950395\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 24: average objective=5.827817369766759\n", + "Training, round 25: average objective=5.879993406428971\n", + "Training, round 26: average objective=5.878818441411395\n", + "Training, round 27: average objective=5.852689330668856\n", + "Training, round 28: average objective=5.825790826395215\n", + "Training, round 29: average objective=5.8195719199763\n", + "Training, round 30: average objective=5.850320507536283\n", + "Training, round 31: average objective=5.922601955369967\n", + "Training, round 32: average objective=6.027293422569237\n", + "Training, round 33: average objective=6.147722616412867\n", + "Training, round 34: average objective=6.268354894487405\n", + "Training, round 35: average objective=6.378717511288163\n", + "Training, round 36: average objective=6.47176515654596\n", + "Training, round 37: average objective=6.542371750044595\n", + "Training, round 38: average objective=6.589843422735159\n", + "Training, round 39: average objective=6.6211200334615095\n", + "Training, round 40: average objective=6.648564637669447\n", + "Training, round 41: average objective=6.682695971981806\n", + "Training, round 42: average objective=6.727311716983312\n", + "Training, round 43: average objective=6.781071155308332\n", + "Training, round 44: average objective=6.8412558431720445\n", + "Training, round 45: average objective=6.904568656197117\n", + "Training, round 46: average objective=6.9660885393223335\n", + "Training, round 47: average objective=7.020536515673854\n", + "Training, round 48: average objective=7.065553418143645\n", + "Training, round 49: average objective=7.102688333790321\n", + "Training, round 50: average objective=7.135004833968614\n", + "Training, round 51: average objective=7.164879465123637\n", + "Training, round 52: average objective=7.19427075093825\n", + "Training, round 53: average objective=7.225628014265957\n", + "Training, round 54: average objective=7.261178801250246\n", + "Training, round 55: average objective=7.301370310011948\n", + "Training, round 56: average objective=7.344647387003839\n", + "Training, round 57: average objective=7.388756982402839\n", + "Training, round 58: average objective=7.431911788751634\n", + "Training, round 59: average objective=7.472934934320987\n", + "Training, round 60: average objective=7.511151784786074\n", + "Training, round 61: average objective=7.5467850512981265\n", + "Training, round 62: average objective=7.581320437725855\n", + "Training, round 63: average objective=7.616940326523643\n", + "Training, round 64: average objective=7.655304616704049\n", + "Training, round 65: average objective=7.696871395722413\n", + "Training, round 66: average objective=7.741215146449349\n", + "Training, round 67: average objective=7.787647664121658\n", + "Training, round 68: average objective=7.835505402715092\n", + "Training, round 69: average objective=7.884286851837511\n", + "Training, round 70: average objective=7.933987678115768\n", + "Training, round 71: average objective=7.985336188987455\n", + "Training, round 72: average objective=8.039356970934334\n", + "Training, round 73: average objective=8.096443772426332\n", + "Training, round 74: average objective=8.155834002521642\n", + "Training, round 75: average objective=8.215862729733125\n", + "Training, round 76: average objective=8.274473832813708\n", + "Training, round 77: average objective=8.329582598582112\n", + "Training, round 78: average objective=8.379443997890732\n", + "Training, round 79: average objective=8.422981846066861\n", + "Training, round 80: average objective=8.459767424808742\n", + "Training, round 81: average objective=8.489901820427889\n", + "Training, round 82: average objective=8.514275373713318\n", + "Training, round 83: average objective=8.534840754513624\n", + "Training, round 84: average objective=8.554251913035205\n", + "Training, round 85: average objective=8.575043993272548\n", + "Training, round 86: average objective=8.598851330060237\n", + "Training, round 87: average objective=8.62585945982946\n", + "Training, round 88: average objective=8.654815424045456\n", + "Training, round 89: average objective=8.683788316754782\n", + "Training, round 90: average objective=8.711091537354559\n", + "Training, round 91: average objective=8.735722690171052\n", + "Training, round 92: average objective=8.757396565628296\n", + "Training, round 93: average objective=8.776404415120004\n", + "Training, round 94: average objective=8.793342383974494\n", + "Training, round 95: average objective=8.808906480902124\n", + "Training, round 96: average objective=8.823891498325759\n", + "Training, round 97: average objective=8.839171465934456\n", + "Training, round 98: average objective=8.855488117144503\n", + "Training, round 99: average objective=8.87318871724571\n", + "Training, round 100: average objective=8.892087056964073\n", + "Training, round 101: average objective=8.91152123950935\n", + "Training, round 102: average objective=8.930648089756282\n", + "Training, round 103: average objective=8.948855262508353\n", + "Training, round 104: average objective=8.966003802460284\n", + "Training, round 105: average objective=8.982366700738558\n", + "Training, round 106: average objective=8.998404014325182\n", + "Training, round 107: average objective=9.014545742460271\n", + "Training, round 108: average objective=9.031070302290187\n", + "Training, round 109: average objective=9.048109391165926\n", + "Training, round 110: average objective=9.06570001214793\n", + "Training, round 111: average objective=9.083785303378928\n", + "Training, round 112: average objective=9.102201800437964\n", + "Training, round 113: average objective=9.120718909340486\n", + "Training, round 114: average objective=9.139113365122018\n", + "Training, round 115: average objective=9.157256201241642\n", + "Training, round 116: average objective=9.175174522459027\n", + "Training, round 117: average objective=9.193020034583565\n", + "Training, round 118: average objective=9.21096168391222\n", + "Training, round 119: average objective=9.229098692260724\n", + "Training, round 120: average objective=9.247443560390522\n", + "Training, round 121: average objective=9.265960827421086\n", + "Training, round 122: average objective=9.284610221329242\n", + "Training, round 123: average objective=9.30334271801147\n", + "Training, round 124: average objective=9.32207855184792\n", + "Training, round 125: average objective=9.340727123528186\n", + "Training, round 126: average objective=9.359235182268495\n", + "Training, round 127: average objective=9.377613379362993\n", + "Training, round 128: average objective=9.395914479241885\n", + "Training, round 129: average objective=9.414177948662356\n", + "Training, round 130: average objective=9.43239972371972\n", + "Training, round 131: average objective=9.450552789681494\n", + "Training, round 132: average objective=9.468614427061283\n", + "Training, round 133: average objective=9.48656346423084\n", + "Training, round 134: average objective=9.504359622301234\n", + "Training, round 135: average objective=9.521938759611746\n", + "Training, round 136: average objective=9.539241875993412\n", + "Training, round 137: average objective=9.556241906346147\n", + "Training, round 138: average objective=9.572932732089196\n", + "Training, round 139: average objective=9.589302924261752\n", + "Training, round 140: average objective=9.60532855018261\n", + "Training, round 141: average objective=9.620987385722836\n", + "Training, round 142: average objective=9.636267245279978\n", + "Training, round 143: average objective=9.651152399418176\n", + "Training, round 144: average objective=9.665611570379687\n", + "Training, round 145: average objective=9.67960869678863\n", + "Training, round 146: average objective=9.693118116900301\n", + "Training, round 147: average objective=9.706124337551978\n", + "Training, round 148: average objective=9.718612735352139\n", + "Training, round 149: average objective=9.730569149314853\n", + "Training, round 150: average objective=9.741987760893435\n", + "Training, round 151: average objective=9.75287081671085\n", + "Training, round 152: average objective=9.763219675030383\n", + "Training, round 153: average objective=9.773032958812948\n", + "Training, round 154: average objective=9.782312611937552\n", + "Training, round 155: average objective=9.791066125676952\n", + "Training, round 156: average objective=9.799301916894297\n", + "Training, round 157: average objective=9.807027301929576\n", + "Training, round 158: average objective=9.814253651334244\n", + "Training, round 159: average objective=9.820998539388224\n", + "Training, round 160: average objective=9.827281373079192\n", + "Training, round 161: average objective=9.833120488079022\n", + "Training, round 162: average objective=9.838535561730232\n", + "Training, round 163: average objective=9.843549278703883\n", + "Training, round 164: average objective=9.848184779399695\n", + "Training, round 165: average objective=9.852463420077772\n", + "Training, round 166: average objective=9.85640659939073\n", + "Training, round 167: average objective=9.860036520410532\n", + "Training, round 168: average objective=9.863374886392391\n", + "Training, round 169: average objective=9.866442226496767\n", + "Training, round 170: average objective=9.869259117442848\n", + "Training, round 171: average objective=9.871846636462754\n", + "Training, round 172: average objective=9.874224866427616\n", + "Training, round 173: average objective=9.876412507369857\n", + "Training, round 174: average objective=9.878427711919153\n", + "Training, round 175: average objective=9.880288047715805\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training, round 176: average objective=9.88200962222224\n", + "Training, round 177: average objective=9.883606897830724\n", + "Training, round 178: average objective=9.88509340917287\n", + "Training, round 179: average objective=9.886481828762873\n", + "Training, round 180: average objective=9.887783597282109\n", + "Training, round 181: average objective=9.889009013874901\n", + "Training, round 182: average objective=9.890167602427395\n", + "Training, round 183: average objective=9.891267949425739\n", + "Training, round 184: average objective=9.892317670929138\n", + "Training, round 185: average objective=9.89332352150073\n", + "Training, round 186: average objective=9.894291544511606\n", + "Training, round 187: average objective=9.895227030311588\n", + "Training, round 188: average objective=9.89613446204453\n", + "Training, round 189: average objective=9.897017670221818\n", + "Training, round 190: average objective=9.897879925469436\n", + "Training, round 191: average objective=9.898723979902076\n", + "Training, round 192: average objective=9.899552111133815\n", + "Training, round 193: average objective=9.900366201774094\n", + "Training, round 194: average objective=9.901167794903833\n", + "Training, round 195: average objective=9.901958150831067\n", + "Training, round 196: average objective=9.902738289785376\n", + "Training, round 197: average objective=9.903508952617958\n", + "Training, round 198: average objective=9.904270681957842\n", + "Training, round 199: average objective=9.905023913952704\n", + "Training, round 200: average objective=9.905768906494128\n", + "Training, round 0: average objective = -1.2500000000000009\n", + "Training, round 1: average objective=-1.2499999999999993\n", + "Training, round 2: average objective=-1.2499999999999993\n", + "Training, round 3: average objective=-1.1840651279352714\n", + "Training, round 4: average objective=-0.883645307068715\n", + "Training, round 5: average objective=-0.3330604441956308\n", + "Training, round 6: average objective=0.30175705492126237\n", + "Training, round 7: average objective=0.7765325061549754\n", + "Training, round 8: average objective=1.060366433089833\n", + "Training, round 9: average objective=1.289937767423585\n", + "Training, round 10: average objective=1.5328071990025671\n", + "Training, round 11: average objective=1.7728387226082098\n", + "Training, round 12: average objective=1.9360300900359944\n", + "Training, round 13: average objective=1.9324008351788164\n", + "Training, round 14: average objective=1.7574943661614313\n", + "Training, round 15: average objective=1.5677080132145993\n", + "Training, round 16: average objective=1.5031724639716548\n", + "Training, round 17: average objective=1.5487072165627649\n", + "Training, round 18: average objective=1.6255850897849509\n", + "Training, round 19: average objective=1.6868343732319808\n", + "Training, round 20: average objective=1.7401391608415215\n", + "Training, round 21: average objective=1.8081662735870918\n", + "Training, round 22: average objective=1.8907626121999863\n", + "Training, round 23: average objective=1.9655113310155061\n", + "Training, round 24: average objective=2.0061947318745443\n", + "Training, round 25: average objective=2.001103252087801\n", + "Training, round 26: average objective=1.9622182243028128\n", + "Training, round 27: average objective=1.9172903444985212\n", + "Training, round 28: average objective=1.8900785788695398\n", + "Training, round 29: average objective=1.8876851539422226\n", + "Training, round 30: average objective=1.9031458465348723\n", + "Training, round 31: average objective=1.9253073631378235\n", + "Training, round 32: average objective=1.9468203336711063\n", + "Training, round 33: average objective=1.966449772376347\n", + "Training, round 34: average objective=1.9862753003133864\n", + "Training, round 35: average objective=2.0070321383413448\n", + "Training, round 36: average objective=2.0253950118040085\n", + "Training, round 37: average objective=2.0353826396254355\n", + "Training, round 38: average objective=2.033190658407085\n", + "Training, round 39: average objective=2.021660712659586\n", + "Training, round 40: average objective=2.0095815809250674\n", + "Training, round 41: average objective=2.0053030261360445\n", + "Training, round 42: average objective=2.0107517079470414\n", + "Training, round 43: average objective=2.0217309088136344\n", + "Training, round 44: average objective=2.033060185678328\n", + "Training, round 45: average objective=2.0425900388037825\n", + "Training, round 46: average objective=2.0509056591209234\n", + "Training, round 47: average objective=2.0586854022521317\n", + "Training, round 48: average objective=2.065217884606481\n", + "Training, round 49: average objective=2.0692378632735737\n", + "Training, round 50: average objective=2.0706918620228465\n", + "Training, round 51: average objective=2.0714991394898234\n", + "Training, round 52: average objective=2.07456520956484\n", + "Training, round 53: average objective=2.0819629394912207\n", + "Training, round 54: average objective=2.093876083530347\n", + "Training, round 55: average objective=2.109069766640226\n", + "Training, round 56: average objective=2.126288400085585\n", + "Training, round 57: average objective=2.1453921346451024\n", + "Training, round 58: average objective=2.1675268968100116\n", + "Training, round 59: average objective=2.1945256153156745\n", + "Training, round 60: average objective=2.2282546814021345\n", + "Training, round 61: average objective=2.2704394206047396\n", + "Training, round 62: average objective=2.3229090579073928\n", + "Training, round 63: average objective=2.387692992284666\n", + "Training, round 64: average objective=2.4662584996976054\n", + "Training, round 65: average objective=2.5574284082900007\n", + "Training, round 66: average objective=2.6543542393150816\n", + "Training, round 67: average objective=2.743028487661999\n", + "Training, round 68: average objective=2.8075449806947557\n", + "Training, round 69: average objective=2.8440974779346644\n", + "Training, round 70: average objective=2.8696435512371687\n", + "Training, round 71: average objective=2.905695039514801\n", + "Training, round 72: average objective=2.954242778316633\n", + "Training, round 73: average objective=3.0014072522624025\n", + "Training, round 74: average objective=3.0422401181840177\n", + "Training, round 75: average objective=3.089057209304997\n", + "Training, round 76: average objective=3.151394717691359\n", + "Training, round 77: average objective=3.220592769050391\n", + "Training, round 78: average objective=3.280378896202727\n", + "Training, round 79: average objective=3.3242083215782356\n", + "Training, round 80: average objective=3.3564319432464855\n", + "Training, round 81: average objective=3.381056120553067\n", + "Training, round 82: average objective=3.3979391395326424\n", + "Training, round 83: average objective=3.409525923634993\n", + "Training, round 84: average objective=3.4225076650501194\n", + "Training, round 85: average objective=3.4396991441525566\n", + "Training, round 86: average objective=3.455285699817663\n", + "Training, round 87: average objective=3.461239304278279\n", + "Training, round 88: average objective=3.456719887974402\n", + "Training, round 89: average objective=3.447954676072822\n", + "Training, round 90: average objective=3.439874283941828\n", + "Training, round 91: average objective=3.4331663617395547\n", + "Training, round 92: average objective=3.428856968790842\n", + "Training, round 93: average objective=3.4294447941640436\n", + "Training, round 94: average objective=3.434509998828604\n", + "Training, round 95: average objective=3.43962116713185\n", + "Training, round 96: average objective=3.441249942999792\n", + "Training, round 97: average objective=3.440213324541901\n", + "Training, round 98: average objective=3.438936772333687\n", + "Training, round 99: average objective=3.438126048373494\n", + "Training, round 100: average objective=3.4379177815169983\n", + "Training, round 101: average objective=3.4395278675522762\n", + "Training, round 102: average objective=3.443658347959982\n", + "Training, round 103: average objective=3.44893861612806\n", + "Training, round 104: average objective=3.4533997300630164\n", + "Training, round 105: average objective=3.456503094263152\n", + "Training, round 106: average objective=3.4587705837058826\n", + "Training, round 107: average objective=3.460437706004354\n", + "Training, round 108: average objective=3.461568529986179\n", + "Training, round 109: average objective=3.4626974056289144\n", + "Training, round 110: average objective=3.464303046366616\n", + "Training, round 111: average objective=3.4660423466839694\n", + "Training, round 112: average objective=3.467165714777968\n", + "Training, round 113: average objective=3.46741836495928\n", + "Training, round 114: average objective=3.467106088795485\n", + "Training, round 115: average objective=3.4665683854506373\n", + "Training, round 116: average objective=3.466025889558403\n", + "Training, round 117: average objective=3.465745203403049\n", + "Training, round 118: average objective=3.465919099553456\n", + "Training, round 119: average objective=3.4663932883373567\n", + "Training, round 120: average objective=3.4667719826155254\n", + "Training, round 121: average objective=3.466822746884974\n", + "Training, round 122: average objective=3.4666309995995\n", + "Training, round 123: average objective=3.4663858112843684\n", + "Training, round 124: average objective=3.4662053116864957\n", + "Training, round 125: average objective=3.466180436376938\n", + "Training, round 126: average objective=3.4663895129598323\n", + "Training, round 127: average objective=3.4667925891280023\n", + "Training, round 128: average objective=3.4672269032172154\n", + "Training, round 129: average objective=3.4675631334023915\n", + "Training, round 130: average objective=3.467797715898201\n", + "Training, round 131: average objective=3.4679807827432727\n", + "Training, round 132: average objective=3.468140499844573\n", + "Training, round 133: average objective=3.4682998171488926\n", + "Training, round 134: average objective=3.4684867940362496\n", + "Training, round 135: average objective=3.468690109289448\n", + "Training, round 136: average objective=3.468853317349497\n", + "Training, round 137: average objective=3.468940226087174\n", + "Training, round 138: average objective=3.468972352324035\n", + "Training, round 139: average objective=3.468990032208027\n", + "Training, round 140: average objective=3.469013463026867\n", + "Training, round 141: average objective=3.4690520346884166\n", + "Training, round 142: average objective=3.469113235291445\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No significant improvement, early stopping...\n", + "End of recursion!\n", + "graph n: 2, graph edges: Set(Tuple{Set{Int64}, Float64}[(Set([2, 1]), 4.0)])\n", + "res: ((4.0, ([1], [2])), 0)\n", + "return from recursion\n", + "partitions: ([1], [2])\n", + "v_out: 2\n", + "return from recursion\n", + "partitions: ([1, 2], [3])\n", + "v_out: 2\n", + "return from recursion\n", + "partitions: ([1, 3], [4, 2])\n", + "v_out: 4\n", + "return from recursion\n", + "partitions: ([1, 3], [5, 2, 4])\n", + "v_out: 4\n", + "return from recursion\n", + "partitions: ([1, 3, 4], [6, 2, 5])\n", + "v_out: 7\n", + "return from recursion\n", + "partitions: ([1, 3, 4], [6, 2, 5, 7])\n", + "v_out: 7\n" + ] + }, + { + "data": { + "text/plain": [ + "((123.0, ([1, 3, 4, 7], [6, 2, 5, 8])), 5821)" + ] + }, + "execution_count": 127, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p = 5\n", + "rounds = 200\n", + "lr = 0.01\n", + "init_stddev = 0.00000000000000000001\n", + "recursive_ws_qaoa(graph, ws_partitioning, ε, init_state_randomized, p, rounds, lr, init_stddev)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.6.3", + "language": "julia", + "name": "julia-1.6" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/flux_integration.jl b/src/flux_integration.jl index 2fa5806..2d95adb 100644 --- a/src/flux_integration.jl +++ b/src/flux_integration.jl @@ -1,3 +1,5 @@ +using Qaintessent.MaxCutWSQAOA +using Qaintessent.MaxKColSubgraphQAOA # let Flux discover the trainable parameters @@ -14,7 +16,13 @@ Flux.@functor CircuitGate Flux.@functor Moment Flux.@functor MeasurementOperator Flux.@functor Circuit - +Flux.@functor ParityRingMixerGate +Flux.@functor RNearbyValuesMixerGate +Flux.@functor PartitionMixerGate +Flux.@functor MaxKColSubgraphPhaseSeparationGate +Flux.@functor MaxCutPhaseSeparationGate +Flux.@functor WSQAOAMixerGate (β,) +Flux.@functor RxMixerGate function collect_gradients(cx::Zygote.Context, q, dq) # special cases: circuit gate chain