From ae4024c78603ae9aaf8e1a8a399443dbd8d159b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Fri, 26 Nov 2021 14:27:02 +0100 Subject: [PATCH 01/21] init: ajout des sources etu Co-authored-by: gdamms --- Knapsack.ipynb | 775 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 775 insertions(+) create mode 100644 Knapsack.ipynb diff --git a/Knapsack.ipynb b/Knapsack.ipynb new file mode 100644 index 0000000..43bc292 --- /dev/null +++ b/Knapsack.ipynb @@ -0,0 +1,775 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# TP 2-3 : Branch-and-bound applied to a knapsack problem" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Initialisation (à faire une seule fois)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `~/.julia/registries/General`\n", + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n" + ] + } + ], + "source": [ + "import Pkg; \n", + "Pkg.add(\"GraphRecipes\"); Pkg.add(\"Plots\"); \n", + "using GraphRecipes, Plots #only used to visualize the search tree at the end of the branch-and-bound" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Récupération des données" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "readKnaptxtInstance (generic function with 1 method)" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function readKnaptxtInstance(filename)\n", + " price=[]\n", + " weight=[]\n", + " KnapCap=[]\n", + " open(filename) do f\n", + " for i in 1:3\n", + " tok = split(readline(f))\n", + " if(tok[1] == \"ListPrices=\")\n", + " for i in 2:(length(tok)-1)\n", + " push!(price,parse(Int64, tok[i]))\n", + " end\n", + " elseif(tok[1] == \"ListWeights=\")\n", + " for i in 2:(length(tok)-1)\n", + " push!(weight,parse(Int64, tok[i]))\n", + " end\n", + " elseif(tok[1] == \"Capacity=\")\n", + " push!(KnapCap, parse(Int64, tok[2]))\n", + " else\n", + " println(\"Unknown read :\", tok)\n", + " end \n", + " end\n", + " end\n", + " capacity=KnapCap[1]\n", + " return price, weight, capacity\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Procédure d'application des tests de sondabilités TA, TO et TR pour le cas de la relaxation linéaire" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "TestsSondabilite_relaxlin (generic function with 1 method)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function TestsSondabilite_relaxlin(model2, x, varsbin, BestProfit, Bestsol)\n", + " TA, TO, TR = false, false, false\n", + " if(termination_status(model2) == MOI.INFEASIBLE)#Test de faisabilite\n", + " TA=true\n", + " println(\"TA\")\n", + " elseif(objective_value(model2) <= BestProfit) #Test d'optimalite\n", + " TO=true\n", + " println(\"TO\")\n", + " elseif( prod(abs.([round.(v, digits=0) for v in value.(varsbin)]-value.(varsbin)) .<= fill(10^-5, size(varsbin))) \n", + " ) #Test de resolution\n", + " TR=true\n", + " println(\"TR\")\n", + " #if (value(benef) >= BestProfit)\n", + " if (objective_value(model2) >= BestProfit)\n", + " Bestsol = value.(x)\n", + " #BestProfit=value(benef)\n", + " BestProfit=objective_value(model2)\n", + " end\n", + " else\n", + " println(\"non sondable\")\n", + " end\n", + " TA, TO, TR, Bestsol, BestProfit\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Procédure de séparation et stratégie d'exploration permettant de se placer au prochain noeud à traiter" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "ExplorerAutreNoeud_relaxlin (generic function with 1 method)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "function SeparerNoeud_relaxlin(varsshouldbebinary, listvars, listvals)\n", + " # le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds \n", + " # et choisir un noeud-fils le plus à gauche \n", + " \n", + " #find a fractionnal variable\n", + " i, var = 1, 0\n", + " while((i <= length(varsshouldbebinary)) && (var==0))\n", + " #if(varsshouldbebinary[i] ∉ listvars)\n", + " if(abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) ) >= 10^-5)\n", + " var=varsshouldbebinary[i]\n", + " end\n", + " i+=1\n", + " end\n", + " \n", + " #=\n", + " #find most fractionnal variable ?\n", + " i, var, maxfrac = -1, 0, 0.0\n", + " for i in 1:length(varsshouldbebinary)\n", + " if(abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) ) >= maxfrac) \n", + " #if a variable is more fractinonal\n", + " var=varsshouldbebinary[i]\n", + " maxfrac=abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) )\n", + " #println(i, \" \", var, \" \", maxfrac)\n", + " end\n", + " end\n", + " =#\n", + " \n", + "\n", + " set_lower_bound(var,1.0)\n", + " set_upper_bound(var,1.0)\n", + "\n", + " push!(listvars,var) #stocker l'identite de la variable choisie pour la séparation\n", + " push!(listvals,1.0) #stocker la branche choisie, identifiee par la valeur de la variable choisie\n", + " listvars, listvals\n", + "end\n", + "\n", + "\n", + "function ExplorerAutreNoeud_relaxlin(listvars, listvals, listnodes)\n", + " #this node is sondable, go back to parent node then right child if possible\n", + " \n", + " stop=false\n", + " #check if we are not at the root node\n", + " if (length(listvars)>= 1)\n", + " #go back to parent node\n", + " var=pop!(listvars)\n", + " theval=pop!(listvals)\n", + " tmp=pop!(listnodes)\n", + " set_lower_bound(var,0.0)\n", + " set_upper_bound(var,1.0)\n", + "\n", + " #go to right child if possible, otherwise go back to parent\n", + " while( (theval==0.0) && (length(listvars)>= 1))\n", + " var=pop!(listvars)\n", + " theval=pop!(listvals)\n", + " tmp=pop!(listnodes)\n", + " set_lower_bound(var,0.0) \n", + " set_upper_bound(var,1.0)\n", + " end\n", + " if theval==1.0\n", + " set_lower_bound(var,0.0)\n", + " set_upper_bound(var,0.0)\n", + " push!(listvars,var)\n", + " push!(listvals,0.0)\n", + " else\n", + " println(\"\\nFINISHED\")\n", + " stop=true\n", + " end\n", + " else\n", + " #the root node was sondable\n", + " println(\"\\nFINISHED\")\n", + " stop=true\n", + " end\n", + " listvars, listvals, listnodes, stop \n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Création de la relaxation linéaire (= modèle associé au noeud 0): SECTION A SUPPRIMER !!!! \n", + "\n", + " Cette section est à commenter/supprimer et remplacer par vos propres calculs de bornes supérieures et autres, par exemple basées sur les bornes 1 et 2 vues en cours, ou d'autres calculs de bornes de votre choix/conception validés au préalable par votre encadrant/e de TP " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n" + ] + } + ], + "source": [ + "Pkg.add(\"Clp\");\n", + "using JuMP, Clp" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "CreationModeleLP (generic function with 1 method)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function CreationModeleLP(price, weight, capacity)\n", + "# ROOT NODE\n", + " \n", + " model2 = Model(Clp.Optimizer) # set optimizer\n", + " set_optimizer_attribute(model2, \"LogLevel\", 0) #don't display anything during solve\n", + " set_optimizer_attribute(model2, \"Algorithm\", 4) #LP solver chosen is simplex\n", + "\n", + " # define x variables as CONTINUOUS (recall that it is not possible to define binary variables in Clp)\n", + " @variable(model2, 0 <= x[i in 1:4] <= 1)\n", + " varsshouldbebinary=[x[1] x[2] x[3] x[4]]\n", + "\n", + " # define objective function\n", + " @objective(model2, Max, sum(price[i]*x[i] for i in 1:4))\n", + "\n", + " # define the capacity constraint \n", + " @constraint(model2, sum(weight[i]*x[i] for i in 1:4) <= capacity)\n", + "\n", + " println(model2)\n", + "\n", + " return model2, x, varsshouldbebinary\n", + "end\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Boucle principale : résoudre la relaxation linéaire, appliquer les tests de sondabilité, identifier le prochain noeud, répéter." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "SolveKnapInstance (generic function with 1 method)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "function SolveKnapInstance(filename)\n", + "\n", + " if (split(filename,\"/\")[end] != \"test.opb.txt\")\n", + " println(\"This version of the code works only for the test instance !!!!\")\n", + " else\n", + " price, weight, capacity = readKnaptxtInstance(filename)\n", + " model2, x, varsshouldbebinary = CreationModeleLP(price, weight, capacity)\n", + " \n", + " #create the structure to memorize the search tree for visualization at the end\n", + " trParentnodes=Int64[] #will store orig node of arc in search tree\n", + " trChildnodes=Int64[] #will store destination node of arc in search tree\n", + " trNamenodes=[] #will store names of nodes in search tree\n", + " \n", + " #intermediate structure to navigate in the search tree\n", + " listvars=[]\n", + " listvals=[]\n", + " listnodes=[]\n", + "\n", + " BestProfit=-1\n", + " Bestsol=[]\n", + "\n", + " current_node_number=0\n", + " stop = false\n", + "\n", + " while(!stop)\n", + "\n", + " println(\"\\nNode number \", current_node_number, \": \\n-----\\n\", model2)\n", + "\n", + " #Update the search tree\n", + " push!(trNamenodes,current_node_number+1) \n", + " if(length(trNamenodes)>=2)\n", + " push!(trParentnodes,listnodes[end]+1) # +1 because the 1st node is \"node 0\"\n", + " push!(trChildnodes, current_node_number+1) # +1 because the 1st node is \"node 0\"\n", + " end\n", + " push!(listnodes, current_node_number)\n", + "\n", + "\n", + " print(\"Solve model2 to compute the bounds of the current node: start ... \")\n", + " status = optimize!(model2)\n", + " println(\"... end\")\n", + "\n", + " print(\"\\nSolution relax lin\"); \n", + " if(termination_status(model2) == MOI.INFEASIBLE)#(has_values(model2))\n", + " print(\" : NOT AVAILABLE (probably infeasible or ressources limit reached)\")\n", + " else\n", + " [print(\"\\t\", name(v),\"=\",value(v)) for v in all_variables(model2)] \n", + " end\n", + " println(\" \"); println(\"\\nPrevious Solution memorized \", Bestsol, \" with bestprofit \", BestProfit, \"\\n\")\n", + "\n", + " TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(model2, x, varsshouldbebinary, BestProfit, Bestsol)\n", + "\n", + " is_node_sondable = TA || TO || TR\n", + "\n", + " if(!is_node_sondable)\n", + " listvars, listvals = SeparerNoeud_relaxlin(varsshouldbebinary, listvars, listvals)\n", + " else\n", + " listvars, listvals, listnodes, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals, listnodes)\n", + " end\n", + "\n", + " current_node_number = current_node_number + 1\n", + " end\n", + "\n", + " println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n", + "\n", + " return BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes\n", + " end\n", + "\n", + "end\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Affichage du résultat final" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "\n", + "Node number 0: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.857142857142857\tx[2]=1.0\tx[3]=0.0\tx[4]=0.0 \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "non sondable\n", + "\n", + "Node number 1: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 1.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=1.0\tx[2]=0.7500000000000001\tx[3]=0.0\tx[4]=0.0 \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "non sondable\n", + "\n", + "Node number 2: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 1.0\n", + " x[2] ≥ 1.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "TA\n", + "\n", + "Node number 3: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 1.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 0.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=1.0\tx[2]=0.0\tx[3]=0.0\tx[4]=0.6 \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "non sondable\n", + "\n", + "Node number 4: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 1.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 1.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 0.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "TA\n", + "\n", + "Node number 5: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 1.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 0.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 0.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=1.0\tx[2]=0.0\tx[3]=1.0\tx[4]=0.0 \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "TR\n", + "\n", + "Node number 6: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=0.3333333333333332\tx[4]=1.0 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "non sondable\n", + "\n", + "Node number 7: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 1.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=1.0\tx[4]=0.6000000000000001 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "non sondable\n", + "\n", + "Node number 8: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 1.0\n", + " x[4] ≥ 1.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=0.5\tx[3]=1.0\tx[4]=1.0 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "non sondable\n", + "\n", + "Node number 9: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 1.0\n", + " x[3] ≥ 1.0\n", + " x[4] ≥ 1.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "TA\n", + "\n", + "Node number 10: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 1.0\n", + " x[4] ≥ 1.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 0.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=0.0\tx[3]=1.0\tx[4]=1.0 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "TO\n", + "\n", + "Node number 11: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 1.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 0.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=1.0\tx[4]=0.0 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "TO\n", + "\n", + "Node number 12: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 0.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=0.0\tx[4]=1.0 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "TR\n", + "\n", + "FINISHED\n", + "\n", + "******\n", + "\n", + "Optimal value = 65.0\n", + "\n", + "Optimal x=[0.0, 1.0, 0.0, 1.0]\n", + "\n", + "******\n", + "\n", + "Optimal value = 65.0\n", + "\n", + "Optimal x=[0.0, 1.0, 0.0, 1.0]\n" + ] + }, + { + "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\n\n\n\n\n\n\n" + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"instancesETU/KNAPnewformat/test.opb.txt\")\n", + "println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n", + "graphplot(trParentnodes, trChildnodes, names=trNamenodes, method=:tree)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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 +} From bdd5427fb1df19f461496a2fb2c70b31afa8bf79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Fri, 26 Nov 2021 14:35:37 +0100 Subject: [PATCH 02/21] style: changed "KNAPnewformat" to "data" --- Knapsack.ipynb | 68 ++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/Knapsack.ipynb b/Knapsack.ipynb index 43bc292..0446295 100644 --- a/Knapsack.ipynb +++ b/Knapsack.ipynb @@ -16,14 +16,13 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `~/.julia/registries/General`\n", "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", @@ -48,7 +47,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -57,7 +56,7 @@ "readKnaptxtInstance (generic function with 1 method)" ] }, - "execution_count": 2, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -70,7 +69,7 @@ " open(filename) do f\n", " for i in 1:3\n", " tok = split(readline(f))\n", - " if(tok[1] == \"ListPrices=\")\n", + " if (tok[1] == \"ListPrices=\")\n", " for i in 2:(length(tok)-1)\n", " push!(price,parse(Int64, tok[i]))\n", " end\n", @@ -99,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -108,7 +107,7 @@ "TestsSondabilite_relaxlin (generic function with 1 method)" ] }, - "execution_count": 3, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -116,13 +115,13 @@ "source": [ "function TestsSondabilite_relaxlin(model2, x, varsbin, BestProfit, Bestsol)\n", " TA, TO, TR = false, false, false\n", - " if(termination_status(model2) == MOI.INFEASIBLE)#Test de faisabilite\n", + " if (termination_status(model2) == MOI.INFEASIBLE)#Test de faisabilite\n", " TA=true\n", " println(\"TA\")\n", - " elseif(objective_value(model2) <= BestProfit) #Test d'optimalite\n", + " elseif (objective_value(model2) <= BestProfit) #Test d'optimalite\n", " TO=true\n", " println(\"TO\")\n", - " elseif( prod(abs.([round.(v, digits=0) for v in value.(varsbin)]-value.(varsbin)) .<= fill(10^-5, size(varsbin))) \n", + " elseif ( prod(abs.([round.(v, digits=0) for v in value.(varsbin)]-value.(varsbin)) .<= fill(10^-5, size(varsbin))) \n", " ) #Test de resolution\n", " TR=true\n", " println(\"TR\")\n", @@ -148,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -157,7 +156,7 @@ "ExplorerAutreNoeud_relaxlin (generic function with 1 method)" ] }, - "execution_count": 4, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -170,9 +169,9 @@ " \n", " #find a fractionnal variable\n", " i, var = 1, 0\n", - " while((i <= length(varsshouldbebinary)) && (var==0))\n", - " #if(varsshouldbebinary[i] ∉ listvars)\n", - " if(abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) ) >= 10^-5)\n", + " while ((i <= length(varsshouldbebinary)) && (var==0))\n", + " #if (varsshouldbebinary[i] ∉ listvars)\n", + " if (abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) ) >= 10^-5)\n", " var=varsshouldbebinary[i]\n", " end\n", " i+=1\n", @@ -182,7 +181,7 @@ " #find most fractionnal variable ?\n", " i, var, maxfrac = -1, 0, 0.0\n", " for i in 1:length(varsshouldbebinary)\n", - " if(abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) ) >= maxfrac) \n", + " if (abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) ) >= maxfrac) \n", " #if a variable is more fractinonal\n", " var=varsshouldbebinary[i]\n", " maxfrac=abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) )\n", @@ -215,7 +214,7 @@ " set_upper_bound(var,1.0)\n", "\n", " #go to right child if possible, otherwise go back to parent\n", - " while( (theval==0.0) && (length(listvars)>= 1))\n", + " while ( (theval==0.0) && (length(listvars)>= 1))\n", " var=pop!(listvars)\n", " theval=pop!(listvals)\n", " tmp=pop!(listnodes)\n", @@ -251,7 +250,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -271,7 +270,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -280,7 +279,7 @@ "CreationModeleLP (generic function with 1 method)" ] }, - "execution_count": 6, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -318,7 +317,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -327,7 +326,7 @@ "SolveKnapInstance (generic function with 1 method)" ] }, - "execution_count": 7, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -336,7 +335,7 @@ "\n", "function SolveKnapInstance(filename)\n", "\n", - " if (split(filename,\"/\")[end] != \"test.opb.txt\")\n", + " if (split(filename,\"/\")[end] != \"test.opb\")\n", " println(\"This version of the code works only for the test instance !!!!\")\n", " else\n", " price, weight, capacity = readKnaptxtInstance(filename)\n", @@ -358,13 +357,13 @@ " current_node_number=0\n", " stop = false\n", "\n", - " while(!stop)\n", + " while (!stop)\n", "\n", " println(\"\\nNode number \", current_node_number, \": \\n-----\\n\", model2)\n", "\n", " #Update the search tree\n", " push!(trNamenodes,current_node_number+1) \n", - " if(length(trNamenodes)>=2)\n", + " if (length(trNamenodes)>=2)\n", " push!(trParentnodes,listnodes[end]+1) # +1 because the 1st node is \"node 0\"\n", " push!(trChildnodes, current_node_number+1) # +1 because the 1st node is \"node 0\"\n", " end\n", @@ -376,7 +375,7 @@ " println(\"... end\")\n", "\n", " print(\"\\nSolution relax lin\"); \n", - " if(termination_status(model2) == MOI.INFEASIBLE)#(has_values(model2))\n", + " if (termination_status(model2) == MOI.INFEASIBLE)#(has_values(model2))\n", " print(\" : NOT AVAILABLE (probably infeasible or ressources limit reached)\")\n", " else\n", " [print(\"\\t\", name(v),\"=\",value(v)) for v in all_variables(model2)] \n", @@ -387,7 +386,7 @@ "\n", " is_node_sondable = TA || TO || TR\n", "\n", - " if(!is_node_sondable)\n", + " if (!is_node_sondable)\n", " listvars, listvals = SeparerNoeud_relaxlin(varsshouldbebinary, listvars, listvals)\n", " else\n", " listvars, listvals, listnodes, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals, listnodes)\n", @@ -413,7 +412,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 39, "metadata": {}, "outputs": [ { @@ -736,25 +735,18 @@ }, { "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\n\n\n\n\n\n\n" + "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\n\n\n\n\n\n\n" }, - "execution_count": 8, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"instancesETU/KNAPnewformat/test.opb.txt\")\n", + "BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/test.opb\")\n", "println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n", "graphplot(trParentnodes, trChildnodes, names=trNamenodes, method=:tree)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From e26e76572fc84cf7b429ebb1482f346aabe66548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Fri, 26 Nov 2021 14:51:01 +0100 Subject: [PATCH 03/21] style: rename notebooks --- Knapsack.ipynb | 767 ----------------------------------------- notebook-exemple.ipynb | 767 +++++++++++++++++++++++++++++++++++++++++ notebook.ipynb | 767 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1534 insertions(+), 767 deletions(-) delete mode 100644 Knapsack.ipynb create mode 100644 notebook-exemple.ipynb create mode 100644 notebook.ipynb diff --git a/Knapsack.ipynb b/Knapsack.ipynb deleted file mode 100644 index 0446295..0000000 --- a/Knapsack.ipynb +++ /dev/null @@ -1,767 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# TP 2-3 : Branch-and-bound applied to a knapsack problem" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Initialisation (à faire une seule fois)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", - "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n" - ] - } - ], - "source": [ - "import Pkg; \n", - "Pkg.add(\"GraphRecipes\"); Pkg.add(\"Plots\"); \n", - "using GraphRecipes, Plots #only used to visualize the search tree at the end of the branch-and-bound" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Récupération des données" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "readKnaptxtInstance (generic function with 1 method)" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "function readKnaptxtInstance(filename)\n", - " price=[]\n", - " weight=[]\n", - " KnapCap=[]\n", - " open(filename) do f\n", - " for i in 1:3\n", - " tok = split(readline(f))\n", - " if (tok[1] == \"ListPrices=\")\n", - " for i in 2:(length(tok)-1)\n", - " push!(price,parse(Int64, tok[i]))\n", - " end\n", - " elseif(tok[1] == \"ListWeights=\")\n", - " for i in 2:(length(tok)-1)\n", - " push!(weight,parse(Int64, tok[i]))\n", - " end\n", - " elseif(tok[1] == \"Capacity=\")\n", - " push!(KnapCap, parse(Int64, tok[2]))\n", - " else\n", - " println(\"Unknown read :\", tok)\n", - " end \n", - " end\n", - " end\n", - " capacity=KnapCap[1]\n", - " return price, weight, capacity\n", - "end" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Procédure d'application des tests de sondabilités TA, TO et TR pour le cas de la relaxation linéaire" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "TestsSondabilite_relaxlin (generic function with 1 method)" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "function TestsSondabilite_relaxlin(model2, x, varsbin, BestProfit, Bestsol)\n", - " TA, TO, TR = false, false, false\n", - " if (termination_status(model2) == MOI.INFEASIBLE)#Test de faisabilite\n", - " TA=true\n", - " println(\"TA\")\n", - " elseif (objective_value(model2) <= BestProfit) #Test d'optimalite\n", - " TO=true\n", - " println(\"TO\")\n", - " elseif ( prod(abs.([round.(v, digits=0) for v in value.(varsbin)]-value.(varsbin)) .<= fill(10^-5, size(varsbin))) \n", - " ) #Test de resolution\n", - " TR=true\n", - " println(\"TR\")\n", - " #if (value(benef) >= BestProfit)\n", - " if (objective_value(model2) >= BestProfit)\n", - " Bestsol = value.(x)\n", - " #BestProfit=value(benef)\n", - " BestProfit=objective_value(model2)\n", - " end\n", - " else\n", - " println(\"non sondable\")\n", - " end\n", - " TA, TO, TR, Bestsol, BestProfit\n", - "end" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Procédure de séparation et stratégie d'exploration permettant de se placer au prochain noeud à traiter" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "ExplorerAutreNoeud_relaxlin (generic function with 1 method)" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "function SeparerNoeud_relaxlin(varsshouldbebinary, listvars, listvals)\n", - " # le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds \n", - " # et choisir un noeud-fils le plus à gauche \n", - " \n", - " #find a fractionnal variable\n", - " i, var = 1, 0\n", - " while ((i <= length(varsshouldbebinary)) && (var==0))\n", - " #if (varsshouldbebinary[i] ∉ listvars)\n", - " if (abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) ) >= 10^-5)\n", - " var=varsshouldbebinary[i]\n", - " end\n", - " i+=1\n", - " end\n", - " \n", - " #=\n", - " #find most fractionnal variable ?\n", - " i, var, maxfrac = -1, 0, 0.0\n", - " for i in 1:length(varsshouldbebinary)\n", - " if (abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) ) >= maxfrac) \n", - " #if a variable is more fractinonal\n", - " var=varsshouldbebinary[i]\n", - " maxfrac=abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) )\n", - " #println(i, \" \", var, \" \", maxfrac)\n", - " end\n", - " end\n", - " =#\n", - " \n", - "\n", - " set_lower_bound(var,1.0)\n", - " set_upper_bound(var,1.0)\n", - "\n", - " push!(listvars,var) #stocker l'identite de la variable choisie pour la séparation\n", - " push!(listvals,1.0) #stocker la branche choisie, identifiee par la valeur de la variable choisie\n", - " listvars, listvals\n", - "end\n", - "\n", - "\n", - "function ExplorerAutreNoeud_relaxlin(listvars, listvals, listnodes)\n", - " #this node is sondable, go back to parent node then right child if possible\n", - " \n", - " stop=false\n", - " #check if we are not at the root node\n", - " if (length(listvars)>= 1)\n", - " #go back to parent node\n", - " var=pop!(listvars)\n", - " theval=pop!(listvals)\n", - " tmp=pop!(listnodes)\n", - " set_lower_bound(var,0.0)\n", - " set_upper_bound(var,1.0)\n", - "\n", - " #go to right child if possible, otherwise go back to parent\n", - " while ( (theval==0.0) && (length(listvars)>= 1))\n", - " var=pop!(listvars)\n", - " theval=pop!(listvals)\n", - " tmp=pop!(listnodes)\n", - " set_lower_bound(var,0.0) \n", - " set_upper_bound(var,1.0)\n", - " end\n", - " if theval==1.0\n", - " set_lower_bound(var,0.0)\n", - " set_upper_bound(var,0.0)\n", - " push!(listvars,var)\n", - " push!(listvals,0.0)\n", - " else\n", - " println(\"\\nFINISHED\")\n", - " stop=true\n", - " end\n", - " else\n", - " #the root node was sondable\n", - " println(\"\\nFINISHED\")\n", - " stop=true\n", - " end\n", - " listvars, listvals, listnodes, stop \n", - "end" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Création de la relaxation linéaire (= modèle associé au noeud 0): SECTION A SUPPRIMER !!!! \n", - "\n", - " Cette section est à commenter/supprimer et remplacer par vos propres calculs de bornes supérieures et autres, par exemple basées sur les bornes 1 et 2 vues en cours, ou d'autres calculs de bornes de votre choix/conception validés au préalable par votre encadrant/e de TP " - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n" - ] - } - ], - "source": [ - "Pkg.add(\"Clp\");\n", - "using JuMP, Clp" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "CreationModeleLP (generic function with 1 method)" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "function CreationModeleLP(price, weight, capacity)\n", - "# ROOT NODE\n", - " \n", - " model2 = Model(Clp.Optimizer) # set optimizer\n", - " set_optimizer_attribute(model2, \"LogLevel\", 0) #don't display anything during solve\n", - " set_optimizer_attribute(model2, \"Algorithm\", 4) #LP solver chosen is simplex\n", - "\n", - " # define x variables as CONTINUOUS (recall that it is not possible to define binary variables in Clp)\n", - " @variable(model2, 0 <= x[i in 1:4] <= 1)\n", - " varsshouldbebinary=[x[1] x[2] x[3] x[4]]\n", - "\n", - " # define objective function\n", - " @objective(model2, Max, sum(price[i]*x[i] for i in 1:4))\n", - "\n", - " # define the capacity constraint \n", - " @constraint(model2, sum(weight[i]*x[i] for i in 1:4) <= capacity)\n", - "\n", - " println(model2)\n", - "\n", - " return model2, x, varsshouldbebinary\n", - "end\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Boucle principale : résoudre la relaxation linéaire, appliquer les tests de sondabilité, identifier le prochain noeud, répéter." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "SolveKnapInstance (generic function with 1 method)" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "function SolveKnapInstance(filename)\n", - "\n", - " if (split(filename,\"/\")[end] != \"test.opb\")\n", - " println(\"This version of the code works only for the test instance !!!!\")\n", - " else\n", - " price, weight, capacity = readKnaptxtInstance(filename)\n", - " model2, x, varsshouldbebinary = CreationModeleLP(price, weight, capacity)\n", - " \n", - " #create the structure to memorize the search tree for visualization at the end\n", - " trParentnodes=Int64[] #will store orig node of arc in search tree\n", - " trChildnodes=Int64[] #will store destination node of arc in search tree\n", - " trNamenodes=[] #will store names of nodes in search tree\n", - " \n", - " #intermediate structure to navigate in the search tree\n", - " listvars=[]\n", - " listvals=[]\n", - " listnodes=[]\n", - "\n", - " BestProfit=-1\n", - " Bestsol=[]\n", - "\n", - " current_node_number=0\n", - " stop = false\n", - "\n", - " while (!stop)\n", - "\n", - " println(\"\\nNode number \", current_node_number, \": \\n-----\\n\", model2)\n", - "\n", - " #Update the search tree\n", - " push!(trNamenodes,current_node_number+1) \n", - " if (length(trNamenodes)>=2)\n", - " push!(trParentnodes,listnodes[end]+1) # +1 because the 1st node is \"node 0\"\n", - " push!(trChildnodes, current_node_number+1) # +1 because the 1st node is \"node 0\"\n", - " end\n", - " push!(listnodes, current_node_number)\n", - "\n", - "\n", - " print(\"Solve model2 to compute the bounds of the current node: start ... \")\n", - " status = optimize!(model2)\n", - " println(\"... end\")\n", - "\n", - " print(\"\\nSolution relax lin\"); \n", - " if (termination_status(model2) == MOI.INFEASIBLE)#(has_values(model2))\n", - " print(\" : NOT AVAILABLE (probably infeasible or ressources limit reached)\")\n", - " else\n", - " [print(\"\\t\", name(v),\"=\",value(v)) for v in all_variables(model2)] \n", - " end\n", - " println(\" \"); println(\"\\nPrevious Solution memorized \", Bestsol, \" with bestprofit \", BestProfit, \"\\n\")\n", - "\n", - " TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(model2, x, varsshouldbebinary, BestProfit, Bestsol)\n", - "\n", - " is_node_sondable = TA || TO || TR\n", - "\n", - " if (!is_node_sondable)\n", - " listvars, listvals = SeparerNoeud_relaxlin(varsshouldbebinary, listvars, listvals)\n", - " else\n", - " listvars, listvals, listnodes, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals, listnodes)\n", - " end\n", - "\n", - " current_node_number = current_node_number + 1\n", - " end\n", - "\n", - " println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n", - "\n", - " return BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes\n", - " end\n", - "\n", - "end\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Affichage du résultat final" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "\n", - "Node number 0: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.857142857142857\tx[2]=1.0\tx[3]=0.0\tx[4]=0.0 \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "non sondable\n", - "\n", - "Node number 1: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 1.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=1.0\tx[2]=0.7500000000000001\tx[3]=0.0\tx[4]=0.0 \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "non sondable\n", - "\n", - "Node number 2: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 1.0\n", - " x[2] ≥ 1.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "TA\n", - "\n", - "Node number 3: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 1.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 0.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=1.0\tx[2]=0.0\tx[3]=0.0\tx[4]=0.6 \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "non sondable\n", - "\n", - "Node number 4: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 1.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 1.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 0.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "TA\n", - "\n", - "Node number 5: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 1.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 0.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 0.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=1.0\tx[2]=0.0\tx[3]=1.0\tx[4]=0.0 \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "TR\n", - "\n", - "Node number 6: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=0.3333333333333332\tx[4]=1.0 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "non sondable\n", - "\n", - "Node number 7: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 1.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=1.0\tx[4]=0.6000000000000001 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "non sondable\n", - "\n", - "Node number 8: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 1.0\n", - " x[4] ≥ 1.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=0.5\tx[3]=1.0\tx[4]=1.0 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "non sondable\n", - "\n", - "Node number 9: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 1.0\n", - " x[3] ≥ 1.0\n", - " x[4] ≥ 1.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "TA\n", - "\n", - "Node number 10: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 1.0\n", - " x[4] ≥ 1.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 0.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=0.0\tx[3]=1.0\tx[4]=1.0 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "TO\n", - "\n", - "Node number 11: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 1.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 0.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=1.0\tx[4]=0.0 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "TO\n", - "\n", - "Node number 12: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 0.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=0.0\tx[4]=1.0 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "TR\n", - "\n", - "FINISHED\n", - "\n", - "******\n", - "\n", - "Optimal value = 65.0\n", - "\n", - "Optimal x=[0.0, 1.0, 0.0, 1.0]\n", - "\n", - "******\n", - "\n", - "Optimal value = 65.0\n", - "\n", - "Optimal x=[0.0, 1.0, 0.0, 1.0]\n" - ] - }, - { - "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\n\n\n\n\n\n\n" - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/test.opb\")\n", - "println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n", - "graphplot(trParentnodes, trChildnodes, names=trNamenodes, method=:tree)" - ] - } - ], - "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/notebook-exemple.ipynb b/notebook-exemple.ipynb new file mode 100644 index 0000000..fb5c308 --- /dev/null +++ b/notebook-exemple.ipynb @@ -0,0 +1,767 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# TP 2-3 : Branch-and-bound applied to a knapsack problem" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Initialisation (à faire une seule fois)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n" + ] + } + ], + "source": [ + "import Pkg; \n", + "Pkg.add(\"GraphRecipes\"); Pkg.add(\"Plots\"); \n", + "using GraphRecipes, Plots #only used to visualize the search tree at the end of the branch-and-bound" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Récupération des données" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "readKnaptxtInstance (generic function with 1 method)" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function readKnaptxtInstance(filename)\n", + " price=[]\n", + " weight=[]\n", + " KnapCap=[]\n", + " open(filename) do f\n", + " for i in 1:3\n", + " tok = split(readline(f))\n", + " if (tok[1] == \"ListPrices=\")\n", + " for i in 2:(length(tok)-1)\n", + " push!(price,parse(Int64, tok[i]))\n", + " end\n", + " elseif(tok[1] == \"ListWeights=\")\n", + " for i in 2:(length(tok)-1)\n", + " push!(weight,parse(Int64, tok[i]))\n", + " end\n", + " elseif(tok[1] == \"Capacity=\")\n", + " push!(KnapCap, parse(Int64, tok[2]))\n", + " else\n", + " println(\"Unknown read :\", tok)\n", + " end \n", + " end\n", + " end\n", + " capacity=KnapCap[1]\n", + " return price, weight, capacity\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Procédure d'application des tests de sondabilités TA, TO et TR pour le cas de la relaxation linéaire" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "TestsSondabilite_relaxlin (generic function with 1 method)" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function TestsSondabilite_relaxlin(model2, x, varsbin, BestProfit, Bestsol)\n", + " TA, TO, TR = false, false, false\n", + " if (termination_status(model2) == MOI.INFEASIBLE)#Test de faisabilite\n", + " TA=true\n", + " println(\"TA\")\n", + " elseif (objective_value(model2) <= BestProfit) #Test d'optimalite\n", + " TO=true\n", + " println(\"TO\")\n", + " elseif ( prod(abs.([round.(v, digits=0) for v in value.(varsbin)]-value.(varsbin)) .<= fill(10^-5, size(varsbin))) \n", + " ) #Test de resolution\n", + " TR=true\n", + " println(\"TR\")\n", + " #if (value(benef) >= BestProfit)\n", + " if (objective_value(model2) >= BestProfit)\n", + " Bestsol = value.(x)\n", + " #BestProfit=value(benef)\n", + " BestProfit=objective_value(model2)\n", + " end\n", + " else\n", + " println(\"non sondable\")\n", + " end\n", + " TA, TO, TR, Bestsol, BestProfit\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Procédure de séparation et stratégie d'exploration permettant de se placer au prochain noeud à traiter" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "ExplorerAutreNoeud_relaxlin (generic function with 1 method)" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "function SeparerNoeud_relaxlin(varsshouldbebinary, listvars, listvals)\n", + " # le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds \n", + " # et choisir un noeud-fils le plus à gauche \n", + " \n", + " #find a fractionnal variable\n", + " i, var = 1, 0\n", + " while ((i <= length(varsshouldbebinary)) && (var==0))\n", + " #if (varsshouldbebinary[i] ∉ listvars)\n", + " if (abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) ) >= 10^-5)\n", + " var=varsshouldbebinary[i]\n", + " end\n", + " i+=1\n", + " end\n", + " \n", + " #=\n", + " #find most fractionnal variable ?\n", + " i, var, maxfrac = -1, 0, 0.0\n", + " for i in 1:length(varsshouldbebinary)\n", + " if (abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) ) >= maxfrac) \n", + " #if a variable is more fractinonal\n", + " var=varsshouldbebinary[i]\n", + " maxfrac=abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) )\n", + " #println(i, \" \", var, \" \", maxfrac)\n", + " end\n", + " end\n", + " =#\n", + " \n", + "\n", + " set_lower_bound(var,1.0)\n", + " set_upper_bound(var,1.0)\n", + "\n", + " push!(listvars,var) #stocker l'identite de la variable choisie pour la séparation\n", + " push!(listvals,1.0) #stocker la branche choisie, identifiee par la valeur de la variable choisie\n", + " listvars, listvals\n", + "end\n", + "\n", + "\n", + "function ExplorerAutreNoeud_relaxlin(listvars, listvals, listnodes)\n", + " #this node is sondable, go back to parent node then right child if possible\n", + " \n", + " stop=false\n", + " #check if we are not at the root node\n", + " if (length(listvars)>= 1)\n", + " #go back to parent node\n", + " var=pop!(listvars)\n", + " theval=pop!(listvals)\n", + " tmp=pop!(listnodes)\n", + " set_lower_bound(var,0.0)\n", + " set_upper_bound(var,1.0)\n", + "\n", + " #go to right child if possible, otherwise go back to parent\n", + " while ( (theval==0.0) && (length(listvars)>= 1))\n", + " var=pop!(listvars)\n", + " theval=pop!(listvals)\n", + " tmp=pop!(listnodes)\n", + " set_lower_bound(var,0.0) \n", + " set_upper_bound(var,1.0)\n", + " end\n", + " if theval==1.0\n", + " set_lower_bound(var,0.0)\n", + " set_upper_bound(var,0.0)\n", + " push!(listvars,var)\n", + " push!(listvals,0.0)\n", + " else\n", + " println(\"\\nFINISHED\")\n", + " stop=true\n", + " end\n", + " else\n", + " #the root node was sondable\n", + " println(\"\\nFINISHED\")\n", + " stop=true\n", + " end\n", + " listvars, listvals, listnodes, stop \n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Création de la relaxation linéaire (= modèle associé au noeud 0): SECTION A SUPPRIMER !!!! \n", + "\n", + " Cette section est à commenter/supprimer et remplacer par vos propres calculs de bornes supérieures et autres, par exemple basées sur les bornes 1 et 2 vues en cours, ou d'autres calculs de bornes de votre choix/conception validés au préalable par votre encadrant/e de TP " + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n" + ] + } + ], + "source": [ + "Pkg.add(\"Clp\");\n", + "using JuMP, Clp" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "CreationModeleLP (generic function with 1 method)" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function CreationModeleLP(price, weight, capacity)\n", + "# ROOT NODE\n", + " \n", + " model2 = Model(Clp.Optimizer) # set optimizer\n", + " set_optimizer_attribute(model2, \"LogLevel\", 0) #don't display anything during solve\n", + " set_optimizer_attribute(model2, \"Algorithm\", 4) #LP solver chosen is simplex\n", + "\n", + " # define x variables as CONTINUOUS (recall that it is not possible to define binary variables in Clp)\n", + " @variable(model2, 0 <= x[i in 1:4] <= 1)\n", + " varsshouldbebinary=[x[1] x[2] x[3] x[4]]\n", + "\n", + " # define objective function\n", + " @objective(model2, Max, sum(price[i]*x[i] for i in 1:4))\n", + "\n", + " # define the capacity constraint \n", + " @constraint(model2, sum(weight[i]*x[i] for i in 1:4) <= capacity)\n", + "\n", + " println(model2)\n", + "\n", + " return model2, x, varsshouldbebinary\n", + "end\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Boucle principale : résoudre la relaxation linéaire, appliquer les tests de sondabilité, identifier le prochain noeud, répéter." + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "SolveKnapInstance (generic function with 1 method)" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "function SolveKnapInstance(filename)\n", + "\n", + " if (split(filename,\"/\")[end] != \"test.opb\")\n", + " println(\"This version of the code works only for the test instance !!!!\")\n", + " else\n", + " price, weight, capacity = readKnaptxtInstance(filename)\n", + " model2, x, varsshouldbebinary = CreationModeleLP(price, weight, capacity)\n", + " \n", + " #create the structure to memorize the search tree for visualization at the end\n", + " trParentnodes=Int64[] #will store orig node of arc in search tree\n", + " trChildnodes=Int64[] #will store destination node of arc in search tree\n", + " trNamenodes=[] #will store names of nodes in search tree\n", + " \n", + " #intermediate structure to navigate in the search tree\n", + " listvars=[]\n", + " listvals=[]\n", + " listnodes=[]\n", + "\n", + " BestProfit=-1\n", + " Bestsol=[]\n", + "\n", + " current_node_number=0\n", + " stop = false\n", + "\n", + " while (!stop)\n", + "\n", + " println(\"\\nNode number \", current_node_number, \": \\n-----\\n\", model2)\n", + "\n", + " #Update the search tree\n", + " push!(trNamenodes,current_node_number+1) \n", + " if (length(trNamenodes)>=2)\n", + " push!(trParentnodes,listnodes[end]+1) # +1 because the 1st node is \"node 0\"\n", + " push!(trChildnodes, current_node_number+1) # +1 because the 1st node is \"node 0\"\n", + " end\n", + " push!(listnodes, current_node_number)\n", + "\n", + "\n", + " print(\"Solve model2 to compute the bounds of the current node: start ... \")\n", + " status = optimize!(model2)\n", + " println(\"... end\")\n", + "\n", + " print(\"\\nSolution relax lin\"); \n", + " if (termination_status(model2) == MOI.INFEASIBLE)#(has_values(model2))\n", + " print(\" : NOT AVAILABLE (probably infeasible or ressources limit reached)\")\n", + " else\n", + " [print(\"\\t\", name(v),\"=\",value(v)) for v in all_variables(model2)] \n", + " end\n", + " println(\" \"); println(\"\\nPrevious Solution memorized \", Bestsol, \" with bestprofit \", BestProfit, \"\\n\")\n", + "\n", + " TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(model2, x, varsshouldbebinary, BestProfit, Bestsol)\n", + "\n", + " is_node_sondable = TA || TO || TR\n", + "\n", + " if (!is_node_sondable)\n", + " listvars, listvals = SeparerNoeud_relaxlin(varsshouldbebinary, listvars, listvals)\n", + " else\n", + " listvars, listvals, listnodes, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals, listnodes)\n", + " end\n", + "\n", + " current_node_number = current_node_number + 1\n", + " end\n", + "\n", + " println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n", + "\n", + " return BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes\n", + " end\n", + "\n", + "end\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Affichage du résultat final" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "\n", + "Node number 0: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.857142857142857\tx[2]=1.0\tx[3]=0.0\tx[4]=0.0 \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "non sondable\n", + "\n", + "Node number 1: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 1.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=1.0\tx[2]=0.7500000000000001\tx[3]=0.0\tx[4]=0.0 \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "non sondable\n", + "\n", + "Node number 2: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 1.0\n", + " x[2] ≥ 1.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "TA\n", + "\n", + "Node number 3: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 1.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 0.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=1.0\tx[2]=0.0\tx[3]=0.0\tx[4]=0.6 \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "non sondable\n", + "\n", + "Node number 4: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 1.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 1.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 0.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "TA\n", + "\n", + "Node number 5: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 1.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 0.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 0.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=1.0\tx[2]=0.0\tx[3]=1.0\tx[4]=0.0 \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "TR\n", + "\n", + "Node number 6: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=0.3333333333333332\tx[4]=1.0 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "non sondable\n", + "\n", + "Node number 7: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 1.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=1.0\tx[4]=0.6000000000000001 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "non sondable\n", + "\n", + "Node number 8: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 1.0\n", + " x[4] ≥ 1.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=0.5\tx[3]=1.0\tx[4]=1.0 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "non sondable\n", + "\n", + "Node number 9: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 1.0\n", + " x[3] ≥ 1.0\n", + " x[4] ≥ 1.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "TA\n", + "\n", + "Node number 10: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 1.0\n", + " x[4] ≥ 1.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 0.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=0.0\tx[3]=1.0\tx[4]=1.0 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "TO\n", + "\n", + "Node number 11: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 1.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 0.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=1.0\tx[4]=0.0 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "TO\n", + "\n", + "Node number 12: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 0.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=0.0\tx[4]=1.0 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "TR\n", + "\n", + "FINISHED\n", + "\n", + "******\n", + "\n", + "Optimal value = 65.0\n", + "\n", + "Optimal x=[0.0, 1.0, 0.0, 1.0]\n", + "\n", + "******\n", + "\n", + "Optimal value = 65.0\n", + "\n", + "Optimal x=[0.0, 1.0, 0.0, 1.0]\n" + ] + }, + { + "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\n\n\n\n\n\n\n" + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/test.opb\")\n", + "println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n", + "graphplot(trParentnodes, trChildnodes, names=trNamenodes, method=:tree)" + ] + } + ], + "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/notebook.ipynb b/notebook.ipynb new file mode 100644 index 0000000..fb5c308 --- /dev/null +++ b/notebook.ipynb @@ -0,0 +1,767 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# TP 2-3 : Branch-and-bound applied to a knapsack problem" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Initialisation (à faire une seule fois)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n" + ] + } + ], + "source": [ + "import Pkg; \n", + "Pkg.add(\"GraphRecipes\"); Pkg.add(\"Plots\"); \n", + "using GraphRecipes, Plots #only used to visualize the search tree at the end of the branch-and-bound" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Récupération des données" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "readKnaptxtInstance (generic function with 1 method)" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function readKnaptxtInstance(filename)\n", + " price=[]\n", + " weight=[]\n", + " KnapCap=[]\n", + " open(filename) do f\n", + " for i in 1:3\n", + " tok = split(readline(f))\n", + " if (tok[1] == \"ListPrices=\")\n", + " for i in 2:(length(tok)-1)\n", + " push!(price,parse(Int64, tok[i]))\n", + " end\n", + " elseif(tok[1] == \"ListWeights=\")\n", + " for i in 2:(length(tok)-1)\n", + " push!(weight,parse(Int64, tok[i]))\n", + " end\n", + " elseif(tok[1] == \"Capacity=\")\n", + " push!(KnapCap, parse(Int64, tok[2]))\n", + " else\n", + " println(\"Unknown read :\", tok)\n", + " end \n", + " end\n", + " end\n", + " capacity=KnapCap[1]\n", + " return price, weight, capacity\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Procédure d'application des tests de sondabilités TA, TO et TR pour le cas de la relaxation linéaire" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "TestsSondabilite_relaxlin (generic function with 1 method)" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function TestsSondabilite_relaxlin(model2, x, varsbin, BestProfit, Bestsol)\n", + " TA, TO, TR = false, false, false\n", + " if (termination_status(model2) == MOI.INFEASIBLE)#Test de faisabilite\n", + " TA=true\n", + " println(\"TA\")\n", + " elseif (objective_value(model2) <= BestProfit) #Test d'optimalite\n", + " TO=true\n", + " println(\"TO\")\n", + " elseif ( prod(abs.([round.(v, digits=0) for v in value.(varsbin)]-value.(varsbin)) .<= fill(10^-5, size(varsbin))) \n", + " ) #Test de resolution\n", + " TR=true\n", + " println(\"TR\")\n", + " #if (value(benef) >= BestProfit)\n", + " if (objective_value(model2) >= BestProfit)\n", + " Bestsol = value.(x)\n", + " #BestProfit=value(benef)\n", + " BestProfit=objective_value(model2)\n", + " end\n", + " else\n", + " println(\"non sondable\")\n", + " end\n", + " TA, TO, TR, Bestsol, BestProfit\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Procédure de séparation et stratégie d'exploration permettant de se placer au prochain noeud à traiter" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "ExplorerAutreNoeud_relaxlin (generic function with 1 method)" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "function SeparerNoeud_relaxlin(varsshouldbebinary, listvars, listvals)\n", + " # le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds \n", + " # et choisir un noeud-fils le plus à gauche \n", + " \n", + " #find a fractionnal variable\n", + " i, var = 1, 0\n", + " while ((i <= length(varsshouldbebinary)) && (var==0))\n", + " #if (varsshouldbebinary[i] ∉ listvars)\n", + " if (abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) ) >= 10^-5)\n", + " var=varsshouldbebinary[i]\n", + " end\n", + " i+=1\n", + " end\n", + " \n", + " #=\n", + " #find most fractionnal variable ?\n", + " i, var, maxfrac = -1, 0, 0.0\n", + " for i in 1:length(varsshouldbebinary)\n", + " if (abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) ) >= maxfrac) \n", + " #if a variable is more fractinonal\n", + " var=varsshouldbebinary[i]\n", + " maxfrac=abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) )\n", + " #println(i, \" \", var, \" \", maxfrac)\n", + " end\n", + " end\n", + " =#\n", + " \n", + "\n", + " set_lower_bound(var,1.0)\n", + " set_upper_bound(var,1.0)\n", + "\n", + " push!(listvars,var) #stocker l'identite de la variable choisie pour la séparation\n", + " push!(listvals,1.0) #stocker la branche choisie, identifiee par la valeur de la variable choisie\n", + " listvars, listvals\n", + "end\n", + "\n", + "\n", + "function ExplorerAutreNoeud_relaxlin(listvars, listvals, listnodes)\n", + " #this node is sondable, go back to parent node then right child if possible\n", + " \n", + " stop=false\n", + " #check if we are not at the root node\n", + " if (length(listvars)>= 1)\n", + " #go back to parent node\n", + " var=pop!(listvars)\n", + " theval=pop!(listvals)\n", + " tmp=pop!(listnodes)\n", + " set_lower_bound(var,0.0)\n", + " set_upper_bound(var,1.0)\n", + "\n", + " #go to right child if possible, otherwise go back to parent\n", + " while ( (theval==0.0) && (length(listvars)>= 1))\n", + " var=pop!(listvars)\n", + " theval=pop!(listvals)\n", + " tmp=pop!(listnodes)\n", + " set_lower_bound(var,0.0) \n", + " set_upper_bound(var,1.0)\n", + " end\n", + " if theval==1.0\n", + " set_lower_bound(var,0.0)\n", + " set_upper_bound(var,0.0)\n", + " push!(listvars,var)\n", + " push!(listvals,0.0)\n", + " else\n", + " println(\"\\nFINISHED\")\n", + " stop=true\n", + " end\n", + " else\n", + " #the root node was sondable\n", + " println(\"\\nFINISHED\")\n", + " stop=true\n", + " end\n", + " listvars, listvals, listnodes, stop \n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Création de la relaxation linéaire (= modèle associé au noeud 0): SECTION A SUPPRIMER !!!! \n", + "\n", + " Cette section est à commenter/supprimer et remplacer par vos propres calculs de bornes supérieures et autres, par exemple basées sur les bornes 1 et 2 vues en cours, ou d'autres calculs de bornes de votre choix/conception validés au préalable par votre encadrant/e de TP " + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n" + ] + } + ], + "source": [ + "Pkg.add(\"Clp\");\n", + "using JuMP, Clp" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "CreationModeleLP (generic function with 1 method)" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function CreationModeleLP(price, weight, capacity)\n", + "# ROOT NODE\n", + " \n", + " model2 = Model(Clp.Optimizer) # set optimizer\n", + " set_optimizer_attribute(model2, \"LogLevel\", 0) #don't display anything during solve\n", + " set_optimizer_attribute(model2, \"Algorithm\", 4) #LP solver chosen is simplex\n", + "\n", + " # define x variables as CONTINUOUS (recall that it is not possible to define binary variables in Clp)\n", + " @variable(model2, 0 <= x[i in 1:4] <= 1)\n", + " varsshouldbebinary=[x[1] x[2] x[3] x[4]]\n", + "\n", + " # define objective function\n", + " @objective(model2, Max, sum(price[i]*x[i] for i in 1:4))\n", + "\n", + " # define the capacity constraint \n", + " @constraint(model2, sum(weight[i]*x[i] for i in 1:4) <= capacity)\n", + "\n", + " println(model2)\n", + "\n", + " return model2, x, varsshouldbebinary\n", + "end\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Boucle principale : résoudre la relaxation linéaire, appliquer les tests de sondabilité, identifier le prochain noeud, répéter." + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "SolveKnapInstance (generic function with 1 method)" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "function SolveKnapInstance(filename)\n", + "\n", + " if (split(filename,\"/\")[end] != \"test.opb\")\n", + " println(\"This version of the code works only for the test instance !!!!\")\n", + " else\n", + " price, weight, capacity = readKnaptxtInstance(filename)\n", + " model2, x, varsshouldbebinary = CreationModeleLP(price, weight, capacity)\n", + " \n", + " #create the structure to memorize the search tree for visualization at the end\n", + " trParentnodes=Int64[] #will store orig node of arc in search tree\n", + " trChildnodes=Int64[] #will store destination node of arc in search tree\n", + " trNamenodes=[] #will store names of nodes in search tree\n", + " \n", + " #intermediate structure to navigate in the search tree\n", + " listvars=[]\n", + " listvals=[]\n", + " listnodes=[]\n", + "\n", + " BestProfit=-1\n", + " Bestsol=[]\n", + "\n", + " current_node_number=0\n", + " stop = false\n", + "\n", + " while (!stop)\n", + "\n", + " println(\"\\nNode number \", current_node_number, \": \\n-----\\n\", model2)\n", + "\n", + " #Update the search tree\n", + " push!(trNamenodes,current_node_number+1) \n", + " if (length(trNamenodes)>=2)\n", + " push!(trParentnodes,listnodes[end]+1) # +1 because the 1st node is \"node 0\"\n", + " push!(trChildnodes, current_node_number+1) # +1 because the 1st node is \"node 0\"\n", + " end\n", + " push!(listnodes, current_node_number)\n", + "\n", + "\n", + " print(\"Solve model2 to compute the bounds of the current node: start ... \")\n", + " status = optimize!(model2)\n", + " println(\"... end\")\n", + "\n", + " print(\"\\nSolution relax lin\"); \n", + " if (termination_status(model2) == MOI.INFEASIBLE)#(has_values(model2))\n", + " print(\" : NOT AVAILABLE (probably infeasible or ressources limit reached)\")\n", + " else\n", + " [print(\"\\t\", name(v),\"=\",value(v)) for v in all_variables(model2)] \n", + " end\n", + " println(\" \"); println(\"\\nPrevious Solution memorized \", Bestsol, \" with bestprofit \", BestProfit, \"\\n\")\n", + "\n", + " TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(model2, x, varsshouldbebinary, BestProfit, Bestsol)\n", + "\n", + " is_node_sondable = TA || TO || TR\n", + "\n", + " if (!is_node_sondable)\n", + " listvars, listvals = SeparerNoeud_relaxlin(varsshouldbebinary, listvars, listvals)\n", + " else\n", + " listvars, listvals, listnodes, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals, listnodes)\n", + " end\n", + "\n", + " current_node_number = current_node_number + 1\n", + " end\n", + "\n", + " println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n", + "\n", + " return BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes\n", + " end\n", + "\n", + "end\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Affichage du résultat final" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "\n", + "Node number 0: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.857142857142857\tx[2]=1.0\tx[3]=0.0\tx[4]=0.0 \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "non sondable\n", + "\n", + "Node number 1: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 1.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=1.0\tx[2]=0.7500000000000001\tx[3]=0.0\tx[4]=0.0 \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "non sondable\n", + "\n", + "Node number 2: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 1.0\n", + " x[2] ≥ 1.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "TA\n", + "\n", + "Node number 3: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 1.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 0.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=1.0\tx[2]=0.0\tx[3]=0.0\tx[4]=0.6 \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "non sondable\n", + "\n", + "Node number 4: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 1.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 1.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 0.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "TA\n", + "\n", + "Node number 5: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 1.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 1.0\n", + " x[2] ≤ 0.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 0.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=1.0\tx[2]=0.0\tx[3]=1.0\tx[4]=0.0 \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "TR\n", + "\n", + "Node number 6: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=0.3333333333333332\tx[4]=1.0 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "non sondable\n", + "\n", + "Node number 7: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 1.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=1.0\tx[4]=0.6000000000000001 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "non sondable\n", + "\n", + "Node number 8: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 1.0\n", + " x[4] ≥ 1.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=0.5\tx[3]=1.0\tx[4]=1.0 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "non sondable\n", + "\n", + "Node number 9: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 1.0\n", + " x[3] ≥ 1.0\n", + " x[4] ≥ 1.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "TA\n", + "\n", + "Node number 10: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 1.0\n", + " x[4] ≥ 1.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 0.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=0.0\tx[3]=1.0\tx[4]=1.0 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "TO\n", + "\n", + "Node number 11: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 1.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 1.0\n", + " x[4] ≤ 0.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=1.0\tx[4]=0.0 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "TO\n", + "\n", + "Node number 12: \n", + "-----\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Subject to\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " x[1] ≥ 0.0\n", + " x[2] ≥ 0.0\n", + " x[3] ≥ 0.0\n", + " x[4] ≥ 0.0\n", + " x[1] ≤ 0.0\n", + " x[2] ≤ 1.0\n", + " x[3] ≤ 0.0\n", + " x[4] ≤ 1.0\n", + "\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "\n", + "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=0.0\tx[4]=1.0 \n", + "\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "\n", + "TR\n", + "\n", + "FINISHED\n", + "\n", + "******\n", + "\n", + "Optimal value = 65.0\n", + "\n", + "Optimal x=[0.0, 1.0, 0.0, 1.0]\n", + "\n", + "******\n", + "\n", + "Optimal value = 65.0\n", + "\n", + "Optimal x=[0.0, 1.0, 0.0, 1.0]\n" + ] + }, + { + "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\n\n\n\n\n\n\n" + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/test.opb\")\n", + "println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n", + "graphplot(trParentnodes, trChildnodes, names=trNamenodes, method=:tree)" + ] + } + ], + "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 +} From 4a5e0a46de1563ed523fe78fb3b93430058eefb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Fri, 26 Nov 2021 16:58:55 +0100 Subject: [PATCH 04/21] =?UTF-8?q?chore:=20push=20fin=20de=20s=C3=A9ance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: gdamms --- notebook-exemple.ipynb | 337 ++++++++++++++++++++--- notebook.ipynb | 605 +++++------------------------------------ 2 files changed, 368 insertions(+), 574 deletions(-) diff --git a/notebook-exemple.ipynb b/notebook-exemple.ipynb index fb5c308..759e653 100644 --- a/notebook-exemple.ipynb +++ b/notebook-exemple.ipynb @@ -16,17 +16,42 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `~/.julia/registries/General`\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", - "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n" ] @@ -47,7 +72,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -56,9 +81,8 @@ "readKnaptxtInstance (generic function with 1 method)" ] }, - "execution_count": 49, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -98,7 +122,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -107,9 +131,8 @@ "TestsSondabilite_relaxlin (generic function with 1 method)" ] }, - "execution_count": 50, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -147,7 +170,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -156,9 +179,8 @@ "ExplorerAutreNoeud_relaxlin (generic function with 1 method)" ] }, - "execution_count": 51, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -250,14 +272,20 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n" ] @@ -270,7 +298,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -279,9 +307,8 @@ "CreationModeleLP (generic function with 1 method)" ] }, - "execution_count": 53, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -317,7 +344,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -326,9 +353,8 @@ "SolveKnapInstance (generic function with 1 method)" ] }, - "execution_count": 54, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -412,16 +438,30 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", " x[1] ≥ 0.0\n", " x[2] ≥ 0.0\n", " x[3] ≥ 0.0\n", @@ -446,15 +486,50 @@ " x[3] ≤ 1.0\n", " x[4] ≤ 1.0\n", "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", + "Solve model2 to compute the bounds of the current node: start ... " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "... end\n", "\n", - "Solution relax lin\tx[1]=0.857142857142857\tx[2]=1.0\tx[3]=0.0\tx[4]=0.0 \n", + "Solution relax lin\t" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x[1]=0.857142857142857\tx[2]=1.0\tx[3]=0.0\tx[4]=0.0 \n", "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", + "Previous Solution memorized " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Any[] with bestprofit -1\n", "\n", - "non sondable\n", + "non sondable" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "\n", - "Node number 1: \n", + "\n", + "Node number " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1: \n", "-----\n", "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", "Subject to\n", @@ -582,7 +657,14 @@ "\n", "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=0.3333333333333332\tx[4]=1.0 \n", "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "Previous Solution memorized " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", "\n", "non sondable\n", "\n", @@ -735,11 +817,200 @@ }, { "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\n\n\n\n\n\n\n" + "image/png": "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", + "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\n\n\n\n\n\n\n", + "text/html": [ + "\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", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] }, - "execution_count": 55, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ diff --git a/notebook.ipynb b/notebook.ipynb index fb5c308..6ab646a 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -16,13 +16,14 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `~/.julia/registries/General`\n", "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", @@ -47,25 +48,25 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "readKnaptxtInstance (generic function with 1 method)" + "(Any[42, 40, 12, 25], Any[7, 4, 3, 5], 10)" ] }, - "execution_count": 49, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "function readKnaptxtInstance(filename)\n", + "function readKnapInstance(filename)\n", " price=[]\n", " weight=[]\n", - " KnapCap=[]\n", + " capacity = -1\n", " open(filename) do f\n", " for i in 1:3\n", " tok = split(readline(f))\n", @@ -73,20 +74,23 @@ " for i in 2:(length(tok)-1)\n", " push!(price,parse(Int64, tok[i]))\n", " end\n", - " elseif(tok[1] == \"ListWeights=\")\n", + " elseif (tok[1] == \"ListWeights=\")\n", " for i in 2:(length(tok)-1)\n", " push!(weight,parse(Int64, tok[i]))\n", " end\n", - " elseif(tok[1] == \"Capacity=\")\n", - " push!(KnapCap, parse(Int64, tok[2]))\n", + " elseif (tok[1] == \"Capacity=\")\n", + " capacity = parse(Int64, tok[2])\n", " else\n", " println(\"Unknown read :\", tok)\n", " end \n", " end\n", " end\n", - " capacity=KnapCap[1]\n", + " \n", " return price, weight, capacity\n", - "end" + "end\n", + "\n", + "# readKnapInstance(\"data/test.opb\")\n", + "# readKnapInstance(\"data/almost_strongly_correlated/knapPI_5_50_1000_1_-2096.opb\")" ] }, { @@ -98,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -107,29 +111,28 @@ "TestsSondabilite_relaxlin (generic function with 1 method)" ] }, - "execution_count": 50, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "function TestsSondabilite_relaxlin(model2, x, varsbin, BestProfit, Bestsol)\n", + "function TestsSondabilite_relaxlin(x, price, weight, capacity, varsbin, BestProfit, Bestsol)\n", " TA, TO, TR = false, false, false\n", - " if (termination_status(model2) == MOI.INFEASIBLE)#Test de faisabilite\n", - " TA=true\n", + " if (!Constraints(x, weight, capacity)) # Test de faisabilite\n", + " TA = true\n", " println(\"TA\")\n", - " elseif (objective_value(model2) <= BestProfit) #Test d'optimalite\n", - " TO=true\n", + " elseif (Objective(x, price) <= BestProfit) # Test d'optimalite\n", + " TO = true\n", " println(\"TO\")\n", - " elseif ( prod(abs.([round.(v, digits=0) for v in value.(varsbin)]-value.(varsbin)) .<= fill(10^-5, size(varsbin))) \n", - " ) #Test de resolution\n", - " TR=true\n", + " elseif (AllDef(x)) # Test de resolution\n", + " TR = true\n", " println(\"TR\")\n", " #if (value(benef) >= BestProfit)\n", - " if (objective_value(model2) >= BestProfit)\n", - " Bestsol = value.(x)\n", + " if (Objective(x, price) >= BestProfit)\n", + " Bestsol = x\n", " #BestProfit=value(benef)\n", - " BestProfit=objective_value(model2)\n", + " BestProfit = Objective(x, price)\n", " end\n", " else\n", " println(\"non sondable\")\n", @@ -147,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -156,7 +159,7 @@ "ExplorerAutreNoeud_relaxlin (generic function with 1 method)" ] }, - "execution_count": 51, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -164,35 +167,15 @@ "source": [ "\n", "function SeparerNoeud_relaxlin(varsshouldbebinary, listvars, listvals)\n", - " # le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds \n", - " # et choisir un noeud-fils le plus à gauche \n", + " # le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds et choisir un noeud-fils le plus à gauche \n", " \n", - " #find a fractionnal variable\n", - " i, var = 1, 0\n", - " while ((i <= length(varsshouldbebinary)) && (var==0))\n", - " #if (varsshouldbebinary[i] ∉ listvars)\n", - " if (abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) ) >= 10^-5)\n", - " var=varsshouldbebinary[i]\n", - " end\n", - " i+=1\n", + " # Cas du noeud le plus à gauche\n", + " predX = first(listvars)\n", + " nextX0 = predX\n", + " for xi in predX\n", + " \n", " end\n", - " \n", - " #=\n", - " #find most fractionnal variable ?\n", - " i, var, maxfrac = -1, 0, 0.0\n", - " for i in 1:length(varsshouldbebinary)\n", - " if (abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) ) >= maxfrac) \n", - " #if a variable is more fractinonal\n", - " var=varsshouldbebinary[i]\n", - " maxfrac=abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) )\n", - " #println(i, \" \", var, \" \", maxfrac)\n", - " end\n", - " end\n", - " =#\n", - " \n", "\n", - " set_lower_bound(var,1.0)\n", - " set_upper_bound(var,1.0)\n", "\n", " push!(listvars,var) #stocker l'identite de la variable choisie pour la séparation\n", " push!(listvals,1.0) #stocker la branche choisie, identifiee par la valeur de la variable choisie\n", @@ -239,513 +222,53 @@ "end" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Création de la relaxation linéaire (= modèle associé au noeud 0): SECTION A SUPPRIMER !!!! \n", - "\n", - " Cette section est à commenter/supprimer et remplacer par vos propres calculs de bornes supérieures et autres, par exemple basées sur les bornes 1 et 2 vues en cours, ou d'autres calculs de bornes de votre choix/conception validés au préalable par votre encadrant/e de TP " - ] - }, { "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n" - ] - } - ], - "source": [ - "Pkg.add(\"Clp\");\n", - "using JuMP, Clp" - ] - }, - { - "cell_type": "code", - "execution_count": 53, + "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "CreationModeleLP (generic function with 1 method)" + "Constraints (generic function with 1 method)" ] }, - "execution_count": 53, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "function CreationModeleLP(price, weight, capacity)\n", - "# ROOT NODE\n", - " \n", - " model2 = Model(Clp.Optimizer) # set optimizer\n", - " set_optimizer_attribute(model2, \"LogLevel\", 0) #don't display anything during solve\n", - " set_optimizer_attribute(model2, \"Algorithm\", 4) #LP solver chosen is simplex\n", - "\n", - " # define x variables as CONTINUOUS (recall that it is not possible to define binary variables in Clp)\n", - " @variable(model2, 0 <= x[i in 1:4] <= 1)\n", - " varsshouldbebinary=[x[1] x[2] x[3] x[4]]\n", - "\n", - " # define objective function\n", - " @objective(model2, Max, sum(price[i]*x[i] for i in 1:4))\n", - "\n", - " # define the capacity constraint \n", - " @constraint(model2, sum(weight[i]*x[i] for i in 1:4) <= capacity)\n", - "\n", - " println(model2)\n", - "\n", - " return model2, x, varsshouldbebinary\n", - "end\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Boucle principale : résoudre la relaxation linéaire, appliquer les tests de sondabilité, identifier le prochain noeud, répéter." - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "SolveKnapInstance (generic function with 1 method)" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "function SolveKnapInstance(filename)\n", - "\n", - " if (split(filename,\"/\")[end] != \"test.opb\")\n", - " println(\"This version of the code works only for the test instance !!!!\")\n", - " else\n", - " price, weight, capacity = readKnaptxtInstance(filename)\n", - " model2, x, varsshouldbebinary = CreationModeleLP(price, weight, capacity)\n", - " \n", - " #create the structure to memorize the search tree for visualization at the end\n", - " trParentnodes=Int64[] #will store orig node of arc in search tree\n", - " trChildnodes=Int64[] #will store destination node of arc in search tree\n", - " trNamenodes=[] #will store names of nodes in search tree\n", - " \n", - " #intermediate structure to navigate in the search tree\n", - " listvars=[]\n", - " listvals=[]\n", - " listnodes=[]\n", - "\n", - " BestProfit=-1\n", - " Bestsol=[]\n", - "\n", - " current_node_number=0\n", - " stop = false\n", - "\n", - " while (!stop)\n", - "\n", - " println(\"\\nNode number \", current_node_number, \": \\n-----\\n\", model2)\n", - "\n", - " #Update the search tree\n", - " push!(trNamenodes,current_node_number+1) \n", - " if (length(trNamenodes)>=2)\n", - " push!(trParentnodes,listnodes[end]+1) # +1 because the 1st node is \"node 0\"\n", - " push!(trChildnodes, current_node_number+1) # +1 because the 1st node is \"node 0\"\n", - " end\n", - " push!(listnodes, current_node_number)\n", - "\n", - "\n", - " print(\"Solve model2 to compute the bounds of the current node: start ... \")\n", - " status = optimize!(model2)\n", - " println(\"... end\")\n", - "\n", - " print(\"\\nSolution relax lin\"); \n", - " if (termination_status(model2) == MOI.INFEASIBLE)#(has_values(model2))\n", - " print(\" : NOT AVAILABLE (probably infeasible or ressources limit reached)\")\n", - " else\n", - " [print(\"\\t\", name(v),\"=\",value(v)) for v in all_variables(model2)] \n", - " end\n", - " println(\" \"); println(\"\\nPrevious Solution memorized \", Bestsol, \" with bestprofit \", BestProfit, \"\\n\")\n", - "\n", - " TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(model2, x, varsshouldbebinary, BestProfit, Bestsol)\n", - "\n", - " is_node_sondable = TA || TO || TR\n", - "\n", - " if (!is_node_sondable)\n", - " listvars, listvals = SeparerNoeud_relaxlin(varsshouldbebinary, listvars, listvals)\n", - " else\n", - " listvars, listvals, listnodes, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals, listnodes)\n", - " end\n", - "\n", - " current_node_number = current_node_number + 1\n", + "# fonction objectif que l'on souhaite maximiser/minimiser\n", + "Objective(x, price) = \n", + " sum(\n", + " if x[i] < 0\n", + " 1\n", + " else\n", + " price[i]*x[i] \n", " end\n", + " for i in 1:length(x)\n", + " )\n", "\n", - " println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n", + "# fonction permettant de vérfier toutes les contraintes du modèle\n", + "Constraints(x, weight, capacity) =\n", + " sum(\n", + " if x[i] < 0\n", + " 0\n", + " else \n", + " weight[i]*x[i]\n", + " end\n", + " for i in 1:length(x)\n", + " ) <= capacity\n", "\n", - " return BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes\n", + "\n", + "AllDef(x) =\n", + " for xi in x\n", + " if xi < 0\n", + " return false\n", + " end\n", " end\n", - "\n", - "end\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Affichage du résultat final" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "\n", - "Node number 0: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.857142857142857\tx[2]=1.0\tx[3]=0.0\tx[4]=0.0 \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "non sondable\n", - "\n", - "Node number 1: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 1.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=1.0\tx[2]=0.7500000000000001\tx[3]=0.0\tx[4]=0.0 \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "non sondable\n", - "\n", - "Node number 2: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 1.0\n", - " x[2] ≥ 1.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "TA\n", - "\n", - "Node number 3: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 1.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 0.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=1.0\tx[2]=0.0\tx[3]=0.0\tx[4]=0.6 \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "non sondable\n", - "\n", - "Node number 4: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 1.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 1.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 0.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "TA\n", - "\n", - "Node number 5: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 1.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 0.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 0.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=1.0\tx[2]=0.0\tx[3]=1.0\tx[4]=0.0 \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "TR\n", - "\n", - "Node number 6: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=0.3333333333333332\tx[4]=1.0 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "non sondable\n", - "\n", - "Node number 7: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 1.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=1.0\tx[4]=0.6000000000000001 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "non sondable\n", - "\n", - "Node number 8: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 1.0\n", - " x[4] ≥ 1.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=0.5\tx[3]=1.0\tx[4]=1.0 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "non sondable\n", - "\n", - "Node number 9: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 1.0\n", - " x[3] ≥ 1.0\n", - " x[4] ≥ 1.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "TA\n", - "\n", - "Node number 10: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 1.0\n", - " x[4] ≥ 1.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 0.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=0.0\tx[3]=1.0\tx[4]=1.0 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "TO\n", - "\n", - "Node number 11: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 1.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 0.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=1.0\tx[4]=0.0 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "TO\n", - "\n", - "Node number 12: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 0.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=0.0\tx[4]=1.0 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "TR\n", - "\n", - "FINISHED\n", - "\n", - "******\n", - "\n", - "Optimal value = 65.0\n", - "\n", - "Optimal x=[0.0, 1.0, 0.0, 1.0]\n", - "\n", - "******\n", - "\n", - "Optimal value = 65.0\n", - "\n", - "Optimal x=[0.0, 1.0, 0.0, 1.0]\n" - ] - }, - { - "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\n\n\n\n\n\n\n" - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/test.opb\")\n", - "println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n", - "graphplot(trParentnodes, trChildnodes, names=trNamenodes, method=:tree)" + " return true" ] } ], From 21646a6fded6f8c5933647b5ba449137b9ceeddf Mon Sep 17 00:00:00 2001 From: gdamms Date: Fri, 26 Nov 2021 17:57:38 +0100 Subject: [PATCH 05/21] ca marche po --- notebook.ipynb | 254 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 206 insertions(+), 48 deletions(-) diff --git a/notebook.ipynb b/notebook.ipynb index 6ab646a..d59d948 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -27,9 +27,15 @@ "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", + "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", + "\u001b[32m ✓ \u001b[39mTestOptinum\n", + " 1 dependency successfully precompiled in 6 seconds (158 already precompiled)\n", "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n" + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", + "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", + "\u001b[32m ✓ \u001b[39mTestOptinum\n", + " 1 dependency successfully precompiled in 2 seconds (158 already precompiled)\n" ] } ], @@ -48,16 +54,16 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(Any[42, 40, 12, 25], Any[7, 4, 3, 5], 10)" + "readKnapInstance (generic function with 1 method)" ] }, - "execution_count": 9, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -117,7 +123,7 @@ } ], "source": [ - "function TestsSondabilite_relaxlin(x, price, weight, capacity, varsbin, BestProfit, Bestsol)\n", + "function TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol)\n", " TA, TO, TR = false, false, false\n", " if (!Constraints(x, weight, capacity)) # Test de faisabilite\n", " TA = true\n", @@ -130,6 +136,7 @@ " println(\"TR\")\n", " #if (value(benef) >= BestProfit)\n", " if (Objective(x, price) >= BestProfit)\n", + " println(\"oiuiiiiii\")\n", " Bestsol = x\n", " #BestProfit=value(benef)\n", " BestProfit = Objective(x, price)\n", @@ -166,74 +173,65 @@ ], "source": [ "\n", - "function SeparerNoeud_relaxlin(varsshouldbebinary, listvars, listvals)\n", + "function SeparerNoeud_relaxlin(price, listvars, listvals)\n", " # le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds et choisir un noeud-fils le plus à gauche \n", - " \n", + "\n", " # Cas du noeud le plus à gauche\n", " predX = first(listvars)\n", + " n = length(predX)\n", " nextX0 = predX\n", - " for xi in predX\n", - " \n", + " nextX1 = predX\n", + " val0 = 0\n", + " val1 = 0\n", + " for i in 1:n\n", + " if predX[i] == -1\n", + " nextX0[i] = 0\n", + " nextX1[i] = 1\n", + "\n", + " val0 = Objective(nextX0, price)\n", + " val1 = Objective(nextX1, price)\n", + " break\n", + " end\n", " end\n", "\n", - "\n", - " push!(listvars,var) #stocker l'identite de la variable choisie pour la séparation\n", - " push!(listvals,1.0) #stocker la branche choisie, identifiee par la valeur de la variable choisie\n", + " push!(listvars, nextX0)\n", + " push!(listvars, nextX1)\n", + " push!(listvals, val0)\n", + " push!(listvals, val1)\n", " listvars, listvals\n", "end\n", "\n", "\n", - "function ExplorerAutreNoeud_relaxlin(listvars, listvals, listnodes)\n", - " #this node is sondable, go back to parent node then right child if possible\n", + "function ExplorerAutreNoeud_relaxlin(listvars, listvals)\n", + " # this node is sondable, go back to parent node then right child if possible\n", " \n", - " stop=false\n", - " #check if we are not at the root node\n", - " if (length(listvars)>= 1)\n", - " #go back to parent node\n", - " var=pop!(listvars)\n", - " theval=pop!(listvals)\n", - " tmp=pop!(listnodes)\n", - " set_lower_bound(var,0.0)\n", - " set_upper_bound(var,1.0)\n", - "\n", - " #go to right child if possible, otherwise go back to parent\n", - " while ( (theval==0.0) && (length(listvars)>= 1))\n", - " var=pop!(listvars)\n", - " theval=pop!(listvals)\n", - " tmp=pop!(listnodes)\n", - " set_lower_bound(var,0.0) \n", - " set_upper_bound(var,1.0)\n", - " end\n", - " if theval==1.0\n", - " set_lower_bound(var,0.0)\n", - " set_upper_bound(var,0.0)\n", - " push!(listvars,var)\n", - " push!(listvals,0.0)\n", - " else\n", - " println(\"\\nFINISHED\")\n", - " stop=true\n", - " end\n", + " stop = false\n", + " # check if we are not at the root node\n", + " if (length(listvars) > 1)\n", + " # go back to parent node\n", + " var = pop!(listvars)\n", + " val = pop!(listvals)\n", " else\n", - " #the root node was sondable\n", + " # the root node was sondable\n", " println(\"\\nFINISHED\")\n", - " stop=true\n", + " stop = true\n", " end\n", - " listvars, listvals, listnodes, stop \n", + " listvars, listvals, stop \n", "end" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Constraints (generic function with 1 method)" + "true" ] }, - "execution_count": 10, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -270,6 +268,166 @@ " end\n", " return true" ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Node number 0: \n", + "-----\n", + "\n", + "\n", + "Noeud actuel\tx_1 = -1\tx_2 = -1\tx_3 = -1\tx_4 = -1 \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "non sondable\n", + "\n", + "Node number 1: \n", + "-----\n", + "\n", + "\n", + "Noeud actuel\tx_1 = 1\tx_2 = -1\tx_3 = -1\tx_4 = -1 \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "non sondable\n", + "\n", + "Node number 2: \n", + "-----\n", + "\n", + "\n", + "Noeud actuel : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "TA\n", + "\n", + "Node number 3: \n", + "-----\n", + "\n", + "\n", + "Noeud actuel : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "TA\n", + "\n", + "Node number 4: \n", + "-----\n", + "\n", + "\n", + "Noeud actuel : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "TA\n", + "\n", + "Node number 5: \n", + "-----\n", + "\n", + "\n", + "Noeud actuel : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "TA\n", + "\n", + "Node number 6: \n", + "-----\n", + "\n", + "\n", + "Noeud actuel : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", + "\n", + "Previous Solution memorized Any[] with bestprofit -1\n", + "\n", + "TA\n", + "\n", + "FINISHED\n", + "\n", + "******\n", + "\n", + "Optimal value = -1\n", + "\n", + "Optimal x=Any[]\n" + ] + }, + { + "data": { + "text/plain": [ + "(-1, Any[], Int64[], Int64[], Any[])" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function SolveKnapInstance(filename)\n", + "\n", + " price, weight, capacity = readKnapInstance(filename)\n", + "\n", + " #create the structure to memorize the search tree for visualization at the end\n", + " trParentnodes=Int64[] #will store orig node of arc in search tree\n", + " trChildnodes=Int64[] #will store destination node of arc in search tree\n", + " trNamenodes=[] #will store names of nodes in search tree\n", + " \n", + " #intermediate structure to navigate in the search tree\n", + " listvars=[]\n", + " listvals=[]\n", + "\n", + " BestProfit=-1\n", + " Bestsol=[]\n", + "\n", + " current_node_number=0\n", + " stop = false\n", + "\n", + " push!(listvars, [-1 for p in price])\n", + " push!(listvals, Objective(first(listvars), price))\n", + "\n", + " while (!stop)\n", + "\n", + " println(\"\\nNode number \", current_node_number, \": \\n-----\\n\")\n", + "\n", + " x = first(listvars)\n", + "\n", + " print(\"\\nNoeud actuel\"); \n", + " if (!Constraints(x, weight, capacity)) # (has_values(model2))\n", + " print(\" : NOT AVAILABLE (probably infeasible or ressources limit reached)\")\n", + " else\n", + " [print(\"\\tx_\", i, \" = \", x[i]) for i in 1:length(x)] \n", + " end\n", + " println(\" \");\n", + " println(\"\\nPrevious Solution memorized \", Bestsol, \" with bestprofit \", BestProfit, \"\\n\")\n", + "\n", + " TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol)\n", + " \n", + " is_node_sondable = TA || TO || TR\n", + "\n", + " if (!is_node_sondable)\n", + " listvars, listvals = SeparerNoeud_relaxlin(price, listvars, listvals)\n", + " else\n", + " listvars, listvals, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals)\n", + " end\n", + "\n", + " current_node_number += 1\n", + " end\n", + "\n", + " println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n", + "\n", + " return BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes\n", + "\n", + "end\n", + "\n", + "SolveKnapInstance(\"data/test.opb\")" + ] } ], "metadata": { @@ -282,7 +440,7 @@ "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", - "version": "1.6.3" + "version": "1.6.4" } }, "nbformat": 4, From 4a9cc998c64421be2dfd5e8f30b88c3e3f70b7a2 Mon Sep 17 00:00:00 2001 From: gdamms Date: Sat, 27 Nov 2021 11:20:11 +0100 Subject: [PATCH 06/21] il ne manque plus qu'a commenter --- notebook.ipynb | 217 ++++++++++++++++++------------------------------- 1 file changed, 80 insertions(+), 137 deletions(-) diff --git a/notebook.ipynb b/notebook.ipynb index d59d948..d299f27 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -35,7 +35,7 @@ "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", "\u001b[32m ✓ \u001b[39mTestOptinum\n", - " 1 dependency successfully precompiled in 2 seconds (158 already precompiled)\n" + " 1 dependency successfully precompiled in 3 seconds (158 already precompiled)\n" ] } ], @@ -54,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -63,7 +63,7 @@ "readKnapInstance (generic function with 1 method)" ] }, - "execution_count": 3, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -117,32 +117,49 @@ "TestsSondabilite_relaxlin (generic function with 1 method)" ] }, - "execution_count": 4, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "function TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol)\n", + "function TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich)\n", " TA, TO, TR = false, false, false\n", " if (!Constraints(x, weight, capacity)) # Test de faisabilite\n", " TA = true\n", - " println(\"TA\")\n", + " if affich\n", + " println(\"TA\")\n", + " end\n", " elseif (Objective(x, price) <= BestProfit) # Test d'optimalite\n", " TO = true\n", - " println(\"TO\")\n", + " if affich\n", + " println(\"TO\")\n", + " end\n", " elseif (AllDef(x)) # Test de resolution\n", " TR = true\n", - " println(\"TR\")\n", + " if affich\n", + " println(\"TR : solution \", \" de profit \", Objective(x, price))\n", + " end\n", " #if (value(benef) >= BestProfit)\n", " if (Objective(x, price) >= BestProfit)\n", - " println(\"oiuiiiiii\")\n", + " if affich\n", + " println(\"\\t-> Cette solution a un meilleur profit.\")\n", + " end\n", " Bestsol = x\n", " #BestProfit=value(benef)\n", " BestProfit = Objective(x, price)\n", + " else\n", + " if affich\n", + " println(\"\\t-> Cette solution est moins bonne.\")\n", + " end\n", " end\n", " else\n", - " println(\"non sondable\")\n", + " if affich \n", + " println(\"non sondable\")\n", + " end\n", + " end\n", + " if affich\n", + " println(\"\\n\")\n", " end\n", " TA, TO, TR, Bestsol, BestProfit\n", "end" @@ -157,7 +174,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -166,7 +183,7 @@ "ExplorerAutreNoeud_relaxlin (generic function with 1 method)" ] }, - "execution_count": 5, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -177,10 +194,10 @@ " # le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds et choisir un noeud-fils le plus à gauche \n", "\n", " # Cas du noeud le plus à gauche\n", - " predX = first(listvars)\n", + " predX = pop!(listvars)\n", " n = length(predX)\n", - " nextX0 = predX\n", - " nextX1 = predX\n", + " nextX0 = copy(predX)\n", + " nextX1 = copy(predX)\n", " val0 = 0\n", " val1 = 0\n", " for i in 1:n\n", @@ -193,11 +210,10 @@ " break\n", " end\n", " end\n", - "\n", - " push!(listvars, nextX0)\n", " push!(listvars, nextX1)\n", - " push!(listvals, val0)\n", + " push!(listvars, nextX0)\n", " push!(listvals, val1)\n", + " push!(listvals, val0)\n", " listvars, listvals\n", "end\n", "\n", @@ -222,16 +238,16 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "true" + "AllDef (generic function with 1 method)" ] }, - "execution_count": 6, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -241,7 +257,7 @@ "Objective(x, price) = \n", " sum(\n", " if x[i] < 0\n", - " 1\n", + " price[i]\n", " else\n", " price[i]*x[i] \n", " end\n", @@ -260,113 +276,34 @@ " ) <= capacity\n", "\n", "\n", - "AllDef(x) =\n", - " for xi in x\n", - " if xi < 0\n", + "function AllDef(x)\n", + " for i in 1:length(x)\n", + " if x[i] < 0\n", " return false\n", " end\n", " end\n", - " return true" + " return true\n", + "end" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Node number 0: \n", - "-----\n", - "\n", - "\n", - "Noeud actuel\tx_1 = -1\tx_2 = -1\tx_3 = -1\tx_4 = -1 \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "non sondable\n", - "\n", - "Node number 1: \n", - "-----\n", - "\n", - "\n", - "Noeud actuel\tx_1 = 1\tx_2 = -1\tx_3 = -1\tx_4 = -1 \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "non sondable\n", - "\n", - "Node number 2: \n", - "-----\n", - "\n", - "\n", - "Noeud actuel : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "TA\n", - "\n", - "Node number 3: \n", - "-----\n", - "\n", - "\n", - "Noeud actuel : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "TA\n", - "\n", - "Node number 4: \n", - "-----\n", - "\n", - "\n", - "Noeud actuel : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "TA\n", - "\n", - "Node number 5: \n", - "-----\n", - "\n", - "\n", - "Noeud actuel : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "TA\n", - "\n", - "Node number 6: \n", - "-----\n", - "\n", - "\n", - "Noeud actuel : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "TA\n", - "\n", - "FINISHED\n", - "\n", - "******\n", - "\n", - "Optimal value = -1\n", - "\n", - "Optimal x=Any[]\n" + "ename": "Error", + "evalue": "Session cannot generate requests", + "output_type": "error", + "traceback": [ + "Error: Session cannot generate requests", + "at S.executeCodeCell (/home/damien/.vscode/extensions/ms-toolsai.jupyter-2021.10.1101450599/out/client/extension.js:66:301742)", + "at S.execute (/home/damien/.vscode/extensions/ms-toolsai.jupyter-2021.10.1101450599/out/client/extension.js:66:300732)", + "at S.start (/home/damien/.vscode/extensions/ms-toolsai.jupyter-2021.10.1101450599/out/client/extension.js:66:296408)", + "at processTicksAndRejections (internal/process/task_queues.js:93:5)", + "at async t.CellExecutionQueue.executeQueuedCells (/home/damien/.vscode/extensions/ms-toolsai.jupyter-2021.10.1101450599/out/client/extension.js:66:312326)", + "at async t.CellExecutionQueue.start (/home/damien/.vscode/extensions/ms-toolsai.jupyter-2021.10.1101450599/out/client/extension.js:66:311862)" ] - }, - { - "data": { - "text/plain": [ - "(-1, Any[], Int64[], Int64[], Any[])" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -374,6 +311,8 @@ "\n", " price, weight, capacity = readKnapInstance(filename)\n", "\n", + " println(\"Capacity : \", capacity, \" | Number of objects : \", length(price), \"\\n\")\n", + "\n", " #create the structure to memorize the search tree for visualization at the end\n", " trParentnodes=Int64[] #will store orig node of arc in search tree\n", " trChildnodes=Int64[] #will store destination node of arc in search tree\n", @@ -388,46 +327,50 @@ "\n", " current_node_number=0\n", " stop = false\n", + " affich = false\n", "\n", " push!(listvars, [-1 for p in price])\n", - " push!(listvals, Objective(first(listvars), price))\n", + " push!(listvals, Objective(last(listvars), price))\n", "\n", " while (!stop)\n", + " x = last(listvars)\n", "\n", - " println(\"\\nNode number \", current_node_number, \": \\n-----\\n\")\n", - "\n", - " x = first(listvars)\n", - "\n", - " print(\"\\nNoeud actuel\"); \n", - " if (!Constraints(x, weight, capacity)) # (has_values(model2))\n", - " print(\" : NOT AVAILABLE (probably infeasible or ressources limit reached)\")\n", - " else\n", - " [print(\"\\tx_\", i, \" = \", x[i]) for i in 1:length(x)] \n", + " if affich\n", + " print(\"----------\\nNode n°\", current_node_number, \" : \")\n", + " println(\" \")\n", + " println(\"\\nPrevious Solution memorized \", \" with bestprofit \", BestProfit, \"\\n\")\n", " end\n", - " println(\" \");\n", - " println(\"\\nPrevious Solution memorized \", Bestsol, \" with bestprofit \", BestProfit, \"\\n\")\n", "\n", - " TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol)\n", + " TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich)\n", " \n", " is_node_sondable = TA || TO || TR\n", - "\n", " if (!is_node_sondable)\n", " listvars, listvals = SeparerNoeud_relaxlin(price, listvars, listvals)\n", " else\n", " listvars, listvals, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals)\n", " end\n", "\n", + " if current_node_number % 1000000 == 1000\n", + " affich = true\n", + " else\n", + " affich = false\n", + " end\n", " current_node_number += 1\n", " end\n", "\n", " println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n", "\n", - " return BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes\n", - "\n", "end\n", "\n", - "SolveKnapInstance(\"data/test.opb\")" + "SolveKnapInstance(\"data/subset_sum/knapPI_6_100_10000_2_-10726.opb\")" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From 75e9c40e9f52ae8c1229ac8bc51a0719f9afb621 Mon Sep 17 00:00:00 2001 From: gdamms Date: Sat, 27 Nov 2021 11:44:55 +0100 Subject: [PATCH 07/21] TP almost done | TODO : rapport, bonus --- notebook.ipynb | 94 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 33 deletions(-) diff --git a/notebook.ipynb b/notebook.ipynb index d299f27..7dda3e5 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -140,13 +140,12 @@ " if affich\n", " println(\"TR : solution \", \" de profit \", Objective(x, price))\n", " end\n", - " #if (value(benef) >= BestProfit)\n", - " if (Objective(x, price) >= BestProfit)\n", + " if (Objective(x, price) >= BestProfit) # Le profit de la solution trouvée est meilleur que les autres\n", " if affich\n", " println(\"\\t-> Cette solution a un meilleur profit.\")\n", " end\n", + " # On remplace la solution et le profit par les nouvelles valeurs\n", " Bestsol = x\n", - " #BestProfit=value(benef)\n", " BestProfit = Objective(x, price)\n", " else\n", " if affich\n", @@ -191,47 +190,60 @@ "source": [ "\n", "function SeparerNoeud_relaxlin(price, listvars, listvals)\n", - " # le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds et choisir un noeud-fils le plus à gauche \n", + " # Le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds \n", "\n", " # Cas du noeud le plus à gauche\n", + "\n", + " # On sépare le noeud actuel en 2 sous-noeuds\n", " predX = pop!(listvars)\n", - " n = length(predX)\n", " nextX0 = copy(predX)\n", " nextX1 = copy(predX)\n", + "\n", + " # On initialise leurs valeurs à zéro\n", " val0 = 0\n", " val1 = 0\n", + "\n", + " # On fixe la nouvelle variable des deux sous-noeuds\n", + " n = length(predX)\n", " for i in 1:n\n", " if predX[i] == -1\n", + " # L'un a zéro\n", " nextX0[i] = 0\n", + " # L'autre a un\n", " nextX1[i] = 1\n", "\n", + " # On calcule leurs valeurs\n", " val0 = Objective(nextX0, price)\n", " val1 = Objective(nextX1, price)\n", " break\n", " end\n", " end\n", + " # On ajoute les sous-noeuds a la pile des noeuds a explorer\n", " push!(listvars, nextX1)\n", " push!(listvars, nextX0)\n", + "\n", + " # On ajoute aussi leurs valeurs\n", " push!(listvals, val1)\n", " push!(listvals, val0)\n", + "\n", " listvars, listvals\n", "end\n", "\n", "\n", "function ExplorerAutreNoeud_relaxlin(listvars, listvals)\n", - " # this node is sondable, go back to parent node then right child if possible\n", + " # Le noeud est sondable, on l'enlève de la pile des noeuds à sonder\n", " \n", " stop = false\n", - " # check if we are not at the root node\n", " if (length(listvars) > 1)\n", - " # go back to parent node\n", + " # On passe au noeud suivant\n", " var = pop!(listvars)\n", " val = pop!(listvals)\n", " else\n", - " # the root node was sondable\n", + " # Il n'y a pas d'autre noeud\n", " println(\"\\nFINISHED\")\n", " stop = true\n", " end\n", + "\n", " listvars, listvals, stop \n", "end" ] @@ -253,7 +265,7 @@ } ], "source": [ - "# fonction objectif que l'on souhaite maximiser/minimiser\n", + "# Fonction objectif que l'on souhaite maximiser/minimiser (évalué dans le meilleur des cas)\n", "Objective(x, price) = \n", " sum(\n", " if x[i] < 0\n", @@ -264,7 +276,7 @@ " for i in 1:length(x)\n", " )\n", "\n", - "# fonction permettant de vérfier toutes les contraintes du modèle\n", + "# Fonction permettant de vérfier toutes les contraintes du modèle (dans le meilleur des cas)\n", "Constraints(x, weight, capacity) =\n", " sum(\n", " if x[i] < 0\n", @@ -275,7 +287,7 @@ " for i in 1:length(x)\n", " ) <= capacity\n", "\n", - "\n", + "# Fonction qui nous dis si toutes les variables de x sont fixées\n", "function AllDef(x)\n", " for i in 1:length(x)\n", " if x[i] < 0\n", @@ -288,21 +300,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [ { - "ename": "Error", - "evalue": "Session cannot generate requests", - "output_type": "error", - "traceback": [ - "Error: Session cannot generate requests", - "at S.executeCodeCell (/home/damien/.vscode/extensions/ms-toolsai.jupyter-2021.10.1101450599/out/client/extension.js:66:301742)", - "at S.execute (/home/damien/.vscode/extensions/ms-toolsai.jupyter-2021.10.1101450599/out/client/extension.js:66:300732)", - "at S.start (/home/damien/.vscode/extensions/ms-toolsai.jupyter-2021.10.1101450599/out/client/extension.js:66:296408)", - "at processTicksAndRejections (internal/process/task_queues.js:93:5)", - "at async t.CellExecutionQueue.executeQueuedCells (/home/damien/.vscode/extensions/ms-toolsai.jupyter-2021.10.1101450599/out/client/extension.js:66:312326)", - "at async t.CellExecutionQueue.start (/home/damien/.vscode/extensions/ms-toolsai.jupyter-2021.10.1101450599/out/client/extension.js:66:311862)" + "name": "stdout", + "output_type": "stream", + "text": [ + "Capacity : 994 | Number of objects : 50\n", + "\n", + "----------\n", + "Node n°1001 : \n", + "\n", + "Previous Solution memorized with bestprofit 994\n", + "\n", + "non sondable\n", + "\n", + "\n", + "\n", + "FINISHED\n", + "\n", + "******\n", + "\n", + "Optimal value = 994\n", + "\n", + "Optimal x=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n" ] } ], @@ -313,26 +335,26 @@ "\n", " println(\"Capacity : \", capacity, \" | Number of objects : \", length(price), \"\\n\")\n", "\n", - " #create the structure to memorize the search tree for visualization at the end\n", - " trParentnodes=Int64[] #will store orig node of arc in search tree\n", - " trChildnodes=Int64[] #will store destination node of arc in search tree\n", - " trNamenodes=[] #will store names of nodes in search tree\n", - " \n", - " #intermediate structure to navigate in the search tree\n", + " # Liste des variable pour naviguer de noeuds en noeuds\n", " listvars=[]\n", " listvals=[]\n", "\n", + " # La meilleur solution et sa valeur\n", " BestProfit=-1\n", " Bestsol=[]\n", "\n", - " current_node_number=0\n", + " # Compter le nombre de noeud explorés\n", + " current_node_number = 0\n", + "\n", " stop = false\n", " affich = false\n", "\n", + " # On ajoute le premier noeud à explorer (la racine)\n", " push!(listvars, [-1 for p in price])\n", " push!(listvals, Objective(last(listvars), price))\n", "\n", " while (!stop)\n", + " # Le noeud actuel\n", " x = last(listvars)\n", "\n", " if affich\n", @@ -341,20 +363,26 @@ " println(\"\\nPrevious Solution memorized \", \" with bestprofit \", BestProfit, \"\\n\")\n", " end\n", "\n", + " # Test de sondabilité du noeud actuel\n", + " # -> On mets a jour la solution et sa valeur si besoin\n", " TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich)\n", " \n", " is_node_sondable = TA || TO || TR\n", " if (!is_node_sondable)\n", + " # Le noeud n'est pas sondable, on le sépare en 2 sous-noeuds\n", " listvars, listvals = SeparerNoeud_relaxlin(price, listvars, listvals)\n", " else\n", + " # Le noeud est sondable, on passe au noeud suivant\n", " listvars, listvals, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals)\n", " end\n", "\n", - " if current_node_number % 1000000 == 1000\n", + " # On évite de spammer l'output donc on n'affiche pas tout les résultats\n", + " if current_node_number % 1000000 == 100\n", " affich = true\n", " else\n", " affich = false\n", " end\n", + "\n", " current_node_number += 1\n", " end\n", "\n", @@ -362,7 +390,7 @@ "\n", "end\n", "\n", - "SolveKnapInstance(\"data/subset_sum/knapPI_6_100_10000_2_-10726.opb\")" + "SolveKnapInstance(\"data/subset_sum/knapPI_6_50_1000_1_-994.opb\")" ] }, { From 1a74253aaa0251204e975d60f632714c9c137097 Mon Sep 17 00:00:00 2001 From: gdamms Date: Sat, 27 Nov 2021 16:33:20 +0100 Subject: [PATCH 08/21] ajout des graphs --- notebook-exemple.ipynb | 364 ++++++----------------------------------- notebook.ipynb | 112 ++++++++----- 2 files changed, 124 insertions(+), 352 deletions(-) diff --git a/notebook-exemple.ipynb b/notebook-exemple.ipynb index 759e653..46afd38 100644 --- a/notebook-exemple.ipynb +++ b/notebook-exemple.ipynb @@ -23,37 +23,19 @@ "name": "stderr", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `~/.julia/registries/General`\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `~/.julia/registries/General`\n", + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", + "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", + "\u001b[32m ✓ \u001b[39mTestOptinum\n", + " 1 dependency successfully precompiled in 6 seconds (158 already precompiled)\n", + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n" + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", + "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", + "\u001b[32m ✓ \u001b[39mTestOptinum\n", + " 1 dependency successfully precompiled in 2 seconds (158 already precompiled)\n" ] } ], @@ -81,8 +63,9 @@ "readKnaptxtInstance (generic function with 1 method)" ] }, + "execution_count": 2, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -131,8 +114,9 @@ "TestsSondabilite_relaxlin (generic function with 1 method)" ] }, + "execution_count": 3, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -179,8 +163,9 @@ "ExplorerAutreNoeud_relaxlin (generic function with 1 method)" ] }, + "execution_count": 4, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -272,22 +257,19 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n" + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", + "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", + "\u001b[32m ✓ \u001b[39mTestOptinum\n", + " 1 dependency successfully precompiled in 3 seconds (167 already precompiled)\n" ] } ], @@ -298,7 +280,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -307,8 +289,9 @@ "CreationModeleLP (generic function with 1 method)" ] }, + "execution_count": 10, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -344,7 +327,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -353,8 +336,9 @@ "SolveKnapInstance (generic function with 1 method)" ] }, + "execution_count": 11, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -438,30 +422,16 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", + "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", "Subject to\n", - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", + " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", " x[1] ≥ 0.0\n", " x[2] ≥ 0.0\n", " x[3] ≥ 0.0\n", @@ -486,50 +456,15 @@ " x[3] ≤ 1.0\n", " x[4] ≤ 1.0\n", "\n", - "Solve model2 to compute the bounds of the current node: start ... " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "... end\n", + "Solve model2 to compute the bounds of the current node: start ... ... end\n", "\n", - "Solution relax lin\t" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "x[1]=0.857142857142857\tx[2]=1.0\tx[3]=0.0\tx[4]=0.0 \n", + "Solution relax lin\tx[1]=0.857142857142857\tx[2]=1.0\tx[3]=0.0\tx[4]=0.0 \n", "\n", - "Previous Solution memorized " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Any[] with bestprofit -1\n", + "Previous Solution memorized Any[] with bestprofit -1\n", "\n", - "non sondable" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "non sondable\n", "\n", - "\n", - "Node number " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1: \n", + "Node number 1: \n", "-----\n", "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", "Subject to\n", @@ -657,14 +592,7 @@ "\n", "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=0.3333333333333332\tx[4]=1.0 \n", "\n", - "Previous Solution memorized " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", + "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", "\n", "non sondable\n", "\n", @@ -812,212 +740,28 @@ "\n", "Optimal value = 65.0\n", "\n", - "Optimal x=[0.0, 1.0, 0.0, 1.0]\n" + "Optimal x=[0.0, 1.0, 0.0, 1.0]\n", + "[1, 2, 2, 4, 4, 1, 7, 8, 9, 9, 8, 7]\n", + "[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]\n", + "Any[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]\n" ] - }, - { - "data": { - "image/png": "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", - "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\n\n\n\n\n\n\n", - "text/html": [ - "\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", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ "BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/test.opb\")\n", "println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n", - "graphplot(trParentnodes, trChildnodes, names=trNamenodes, method=:tree)" + "graphplot(trParentnodes, trChildnodes, names=trNamenodes, method=:tree)\n", + "println(trParentnodes)\n", + "println(trChildnodes)\n", + "println(trNamenodes)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -1030,7 +774,7 @@ "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", - "version": "1.6.3" + "version": "1.6.4" } }, "nbformat": 4, diff --git a/notebook.ipynb b/notebook.ipynb index 7dda3e5..07854f0 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -29,13 +29,13 @@ "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", "\u001b[32m ✓ \u001b[39mTestOptinum\n", - " 1 dependency successfully precompiled in 6 seconds (158 already precompiled)\n", + " 1 dependency successfully precompiled in 6 seconds (167 already precompiled)\n", "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", "\u001b[32m ✓ \u001b[39mTestOptinum\n", - " 1 dependency successfully precompiled in 3 seconds (158 already precompiled)\n" + " 1 dependency successfully precompiled in 3 seconds (167 already precompiled)\n" ] } ], @@ -54,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -63,7 +63,7 @@ "readKnapInstance (generic function with 1 method)" ] }, - "execution_count": 1, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -117,7 +117,7 @@ "TestsSondabilite_relaxlin (generic function with 1 method)" ] }, - "execution_count": 2, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -160,6 +160,7 @@ " if affich\n", " println(\"\\n\")\n", " end\n", + " \n", " TA, TO, TR, Bestsol, BestProfit\n", "end" ] @@ -173,7 +174,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -182,7 +183,7 @@ "ExplorerAutreNoeud_relaxlin (generic function with 1 method)" ] }, - "execution_count": 3, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -218,13 +219,14 @@ " break\n", " end\n", " end\n", + " \n", " # On ajoute les sous-noeuds a la pile des noeuds a explorer\n", - " push!(listvars, nextX1)\n", " push!(listvars, nextX0)\n", + " push!(listvars, nextX1)\n", "\n", " # On ajoute aussi leurs valeurs\n", - " push!(listvals, val1)\n", " push!(listvals, val0)\n", + " push!(listvals, val1)\n", "\n", " listvars, listvals\n", "end\n", @@ -250,7 +252,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -259,7 +261,7 @@ "AllDef (generic function with 1 method)" ] }, - "execution_count": 4, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -300,48 +302,41 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Capacity : 994 | Number of objects : 50\n", - "\n", - "----------\n", - "Node n°1001 : \n", - "\n", - "Previous Solution memorized with bestprofit 994\n", - "\n", - "non sondable\n", - "\n", - "\n", - "\n", - "FINISHED\n", - "\n", - "******\n", - "\n", - "Optimal value = 994\n", - "\n", - "Optimal x=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n" - ] + "data": { + "text/plain": [ + "SolveKnapInstance (generic function with 1 method)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ "function SolveKnapInstance(filename)\n", "\n", + " # Extraction des données\n", " price, weight, capacity = readKnapInstance(filename)\n", "\n", " println(\"Capacity : \", capacity, \" | Number of objects : \", length(price), \"\\n\")\n", "\n", + " # Pour dessiner le graph\n", + " trParentnodes = Int64[]\n", + " trChildnodes = Int64[]\n", + " trNamenodes = []\n", + "\n", " # Liste des variable pour naviguer de noeuds en noeuds\n", - " listvars=[]\n", - " listvals=[]\n", + " listvars = []\n", + " listvals = []\n", + " listnodes = []\n", "\n", " # La meilleur solution et sa valeur\n", - " BestProfit=-1\n", - " Bestsol=[]\n", + " BestProfit = -1\n", + " Bestsol = []\n", "\n", " # Compter le nombre de noeud explorés\n", " current_node_number = 0\n", @@ -352,8 +347,12 @@ " # On ajoute le premier noeud à explorer (la racine)\n", " push!(listvars, [-1 for p in price])\n", " push!(listvals, Objective(last(listvars), price))\n", + " push!(listnodes, 1)\n", + " push!(trNamenodes, 0)\n", + " newnodeid = 2\n", "\n", " while (!stop)\n", + "\n", " # Le noeud actuel\n", " x = last(listvars)\n", "\n", @@ -371,9 +370,28 @@ " if (!is_node_sondable)\n", " # Le noeud n'est pas sondable, on le sépare en 2 sous-noeuds\n", " listvars, listvals = SeparerNoeud_relaxlin(price, listvars, listvals)\n", + "\n", + " curnode = pop!(listnodes)\n", + "\n", + " push!(trParentnodes, curnode)\n", + " push!(trParentnodes, curnode)\n", + "\n", + " push!(listnodes, newnodeid+1)\n", + " push!(listnodes, newnodeid)\n", + "\n", + " push!(trChildnodes, newnodeid)\n", + " push!(trChildnodes, newnodeid+1)\n", + "\n", + " push!(trNamenodes, newnodeid-1)\n", + " push!(trNamenodes, newnodeid)\n", + "\n", + " newnodeid += 2\n", + "\n", " else\n", " # Le noeud est sondable, on passe au noeud suivant\n", " listvars, listvals, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals)\n", + "\n", + " pop!(listnodes)\n", " end\n", "\n", " # On évite de spammer l'output donc on n'affiche pas tout les résultats\n", @@ -386,11 +404,21 @@ " current_node_number += 1\n", " end\n", "\n", - " println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n", + " println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x = \", Bestsol)\n", "\n", - "end\n", + " trParentnodes, trChildnodes, trNamenodes\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/circle/knapPI_16_8_1000_1_-2291.opb\")\n", "\n", - "SolveKnapInstance(\"data/subset_sum/knapPI_6_50_1000_1_-994.opb\")" + "graphplot(trParentnodes, trChildnodes, names=trNamenodes, method=:tree)" ] }, { From c11a20d70bfbe23a99aa49814599a23c5d8fd8df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Sun, 5 Dec 2021 14:55:57 +0100 Subject: [PATCH 09/21] feat: ajout du sujet --- sujet.pdf | Bin 0 -> 124217 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 sujet.pdf diff --git a/sujet.pdf b/sujet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7f6863fd0ab52c38b8f85a9b9ecf2e0e1cd69f28 GIT binary patch literal 124217 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 z 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

IS7p$Y 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 literal 0 HcmV?d00001 From ce320c4a77c3f1fbbfb861a3ccb5d1645cb306a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Sun, 5 Dec 2021 15:25:55 +0100 Subject: [PATCH 10/21] feat: doc + test readKnapInstance --- notebook-exemple.ipynb | 444 ++--------------------------------------- notebook.ipynb | 131 +++++------- 2 files changed, 62 insertions(+), 513 deletions(-) diff --git a/notebook-exemple.ipynb b/notebook-exemple.ipynb index 46afd38..0dd00f6 100644 --- a/notebook-exemple.ipynb +++ b/notebook-exemple.ipynb @@ -16,29 +16,9 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `~/.julia/registries/General`\n", - "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", - "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", - "\u001b[32m ✓ \u001b[39mTestOptinum\n", - " 1 dependency successfully precompiled in 6 seconds (158 already precompiled)\n", - "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", - "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", - "\u001b[32m ✓ \u001b[39mTestOptinum\n", - " 1 dependency successfully precompiled in 2 seconds (158 already precompiled)\n" - ] - } - ], + "outputs": [], "source": [ "import Pkg; \n", "Pkg.add(\"GraphRecipes\"); Pkg.add(\"Plots\"); \n", @@ -54,20 +34,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "readKnaptxtInstance (generic function with 1 method)" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "function readKnaptxtInstance(filename)\n", " price=[]\n", @@ -105,20 +74,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "TestsSondabilite_relaxlin (generic function with 1 method)" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "function TestsSondabilite_relaxlin(model2, x, varsbin, BestProfit, Bestsol)\n", " TA, TO, TR = false, false, false\n", @@ -154,20 +112,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "ExplorerAutreNoeud_relaxlin (generic function with 1 method)" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "\n", "function SeparerNoeud_relaxlin(varsshouldbebinary, listvars, listvals)\n", @@ -257,22 +204,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", - "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", - "\u001b[32m ✓ \u001b[39mTestOptinum\n", - " 1 dependency successfully precompiled in 3 seconds (167 already precompiled)\n" - ] - } - ], + "outputs": [], "source": [ "Pkg.add(\"Clp\");\n", "using JuMP, Clp" @@ -280,20 +214,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "CreationModeleLP (generic function with 1 method)" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "function CreationModeleLP(price, weight, capacity)\n", "# ROOT NODE\n", @@ -327,20 +250,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "SolveKnapInstance (generic function with 1 method)" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "\n", "function SolveKnapInstance(filename)\n", @@ -422,331 +334,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "\n", - "Node number 0: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.857142857142857\tx[2]=1.0\tx[3]=0.0\tx[4]=0.0 \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "non sondable\n", - "\n", - "Node number 1: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 1.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=1.0\tx[2]=0.7500000000000001\tx[3]=0.0\tx[4]=0.0 \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "non sondable\n", - "\n", - "Node number 2: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 1.0\n", - " x[2] ≥ 1.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "TA\n", - "\n", - "Node number 3: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 1.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 0.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=1.0\tx[2]=0.0\tx[3]=0.0\tx[4]=0.6 \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "non sondable\n", - "\n", - "Node number 4: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 1.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 1.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 0.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "TA\n", - "\n", - "Node number 5: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 1.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 1.0\n", - " x[2] ≤ 0.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 0.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=1.0\tx[2]=0.0\tx[3]=1.0\tx[4]=0.0 \n", - "\n", - "Previous Solution memorized Any[] with bestprofit -1\n", - "\n", - "TR\n", - "\n", - "Node number 6: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=0.3333333333333332\tx[4]=1.0 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "non sondable\n", - "\n", - "Node number 7: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 1.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=1.0\tx[4]=0.6000000000000001 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "non sondable\n", - "\n", - "Node number 8: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 1.0\n", - " x[4] ≥ 1.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=0.5\tx[3]=1.0\tx[4]=1.0 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "non sondable\n", - "\n", - "Node number 9: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 1.0\n", - " x[3] ≥ 1.0\n", - " x[4] ≥ 1.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "TA\n", - "\n", - "Node number 10: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 1.0\n", - " x[4] ≥ 1.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 0.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=0.0\tx[3]=1.0\tx[4]=1.0 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "TO\n", - "\n", - "Node number 11: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 1.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 1.0\n", - " x[4] ≤ 0.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=1.0\tx[4]=0.0 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "TO\n", - "\n", - "Node number 12: \n", - "-----\n", - "Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n", - "Subject to\n", - " 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n", - " x[1] ≥ 0.0\n", - " x[2] ≥ 0.0\n", - " x[3] ≥ 0.0\n", - " x[4] ≥ 0.0\n", - " x[1] ≤ 0.0\n", - " x[2] ≤ 1.0\n", - " x[3] ≤ 0.0\n", - " x[4] ≤ 1.0\n", - "\n", - "Solve model2 to compute the bounds of the current node: start ... ... end\n", - "\n", - "Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=0.0\tx[4]=1.0 \n", - "\n", - "Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n", - "\n", - "TR\n", - "\n", - "FINISHED\n", - "\n", - "******\n", - "\n", - "Optimal value = 65.0\n", - "\n", - "Optimal x=[0.0, 1.0, 0.0, 1.0]\n", - "\n", - "******\n", - "\n", - "Optimal value = 65.0\n", - "\n", - "Optimal x=[0.0, 1.0, 0.0, 1.0]\n", - "[1, 2, 2, 4, 4, 1, 7, 8, 9, 9, 8, 7]\n", - "[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]\n", - "Any[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]\n" - ] - } - ], + "outputs": [], "source": [ "BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/test.opb\")\n", "println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n", @@ -774,7 +364,7 @@ "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", - "version": "1.6.4" + "version": "1.6.3" } }, "nbformat": 4, diff --git a/notebook.ipynb b/notebook.ipynb index 07854f0..7ab2f3d 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -16,32 +16,32 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `~/.julia/registries/General`\n", "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", "\u001b[32m ✓ \u001b[39mTestOptinum\n", - " 1 dependency successfully precompiled in 6 seconds (167 already precompiled)\n", + " 1 dependency successfully precompiled in 4 seconds (270 already precompiled)\n", "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", "\u001b[32m ✓ \u001b[39mTestOptinum\n", - " 1 dependency successfully precompiled in 3 seconds (167 already precompiled)\n" + " 1 dependency successfully precompiled in 3 seconds (270 already precompiled)\n" ] } ], "source": [ "import Pkg; \n", - "Pkg.add(\"GraphRecipes\"); Pkg.add(\"Plots\"); \n", + "Pkg.add(\"GraphRecipes\");\n", + "Pkg.add(\"Plots\"); \n", "using GraphRecipes, Plots #only used to visualize the search tree at the end of the branch-and-bound" ] }, @@ -54,21 +54,21 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "readKnapInstance (generic function with 1 method)" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ + "\"\"\"Open and read a KnapFile.\n", + "\n", + "Args:\n", + " filename (String): the name of the file to read.\n", + "\n", + "Returns:\n", + " price (Vector{Int64}): prices of items to put in the KnapSack.\n", + " weight (Vector{Int64}): weights of items to put in the KnapSack.\n", + " capacity (Int64): the maximum capacity of the KnapSack.\n", + "\n", + "\"\"\"\n", "function readKnapInstance(filename)\n", " price=[]\n", " weight=[]\n", @@ -91,12 +91,24 @@ " end \n", " end\n", " end\n", - " \n", " return price, weight, capacity\n", - "end\n", - "\n", - "# readKnapInstance(\"data/test.opb\")\n", - "# readKnapInstance(\"data/almost_strongly_correlated/knapPI_5_50_1000_1_-2096.opb\")" + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# on teste de lire tous les fichiers .opb\n", + "for (root, dirs, files) in walkdir(\"data\")\n", + " for file in files\n", + " if endswith(file, \".opb\")\n", + " readKnapInstance(root * \"/\" * file)\n", + " end\n", + " end\n", + "end" ] }, { @@ -108,20 +120,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "TestsSondabilite_relaxlin (generic function with 1 method)" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "function TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich)\n", " TA, TO, TR = false, false, false\n", @@ -174,22 +175,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "ExplorerAutreNoeud_relaxlin (generic function with 1 method)" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "\n", "function SeparerNoeud_relaxlin(price, listvars, listvals)\n", " # Le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds \n", "\n", @@ -252,20 +241,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "AllDef (generic function with 1 method)" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Fonction objectif que l'on souhaite maximiser/minimiser (évalué dans le meilleur des cas)\n", "Objective(x, price) = \n", @@ -302,20 +280,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "SolveKnapInstance (generic function with 1 method)" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "function SolveKnapInstance(filename)\n", "\n", @@ -412,21 +379,13 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/circle/knapPI_16_8_1000_1_-2291.opb\")\n", - "\n", "graphplot(trParentnodes, trChildnodes, names=trNamenodes, method=:tree)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -439,7 +398,7 @@ "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", - "version": "1.6.4" + "version": "1.6.3" } }, "nbformat": 4, From 2d33f5fa986a0cc38ba872f1028ca669f09beb97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Sun, 5 Dec 2021 16:21:15 +0100 Subject: [PATCH 11/21] feat: encore plus de doc et de test --- notebook.ipynb | 334 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 245 insertions(+), 89 deletions(-) diff --git a/notebook.ipynb b/notebook.ipynb index 7ab2f3d..50b6b6a 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -11,37 +11,38 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Initialisation (à faire une seule fois)" + "## Initialisation (à faire une seule fois)" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `~/.julia/registries/General`\n", "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", "\u001b[32m ✓ \u001b[39mTestOptinum\n", - " 1 dependency successfully precompiled in 4 seconds (270 already precompiled)\n", + " 1 dependency successfully precompiled in 7 seconds (270 already precompiled)\n", "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", "\u001b[32m ✓ \u001b[39mTestOptinum\n", - " 1 dependency successfully precompiled in 3 seconds (270 already precompiled)\n" + " 1 dependency successfully precompiled in 4 seconds (270 already precompiled)\n" ] } ], "source": [ - "import Pkg; \n", + "import Pkg;\n", "Pkg.add(\"GraphRecipes\");\n", - "Pkg.add(\"Plots\"); \n", + "Pkg.add(\"Plots\");\n", "using GraphRecipes, Plots #only used to visualize the search tree at the end of the branch-and-bound" ] }, @@ -49,46 +50,56 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Récupération des données" + "## Récupération des données" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "readKnapInstance" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "\"\"\"Open and read a KnapFile.\n", "\n", - "Args:\n", - " filename (String): the name of the file to read.\n", - "\n", - "Returns:\n", - " price (Vector{Int64}): prices of items to put in the KnapSack.\n", - " weight (Vector{Int64}): weights of items to put in the KnapSack.\n", - " capacity (Int64): the maximum capacity of the KnapSack.\n", + "Args: \\\\\n", + " - filename (String): the name of the file to read.\n", "\n", + "Returns: \\\\\n", + " - price (Vector{Integer}): prices of items to put in the KnapSack. \\\\\n", + " - weight (Vector{Integer}): weights of items to put in the KnapSack. \\\\\n", + " - capacity (Integer): the maximum capacity of the KnapSack.\n", "\"\"\"\n", "function readKnapInstance(filename)\n", - " price=[]\n", - " weight=[]\n", + " price = []\n", + " weight = []\n", " capacity = -1\n", " open(filename) do f\n", - " for i in 1:3\n", + " for i = 1:3\n", " tok = split(readline(f))\n", " if (tok[1] == \"ListPrices=\")\n", - " for i in 2:(length(tok)-1)\n", - " push!(price,parse(Int64, tok[i]))\n", + " for i = 2:(length(tok)-1)\n", + " push!(price, parse(Int64, tok[i]))\n", " end\n", " elseif (tok[1] == \"ListWeights=\")\n", - " for i in 2:(length(tok)-1)\n", - " push!(weight,parse(Int64, tok[i]))\n", + " for i = 2:(length(tok)-1)\n", + " push!(weight, parse(Int64, tok[i]))\n", " end\n", " elseif (tok[1] == \"Capacity=\")\n", " capacity = parse(Int64, tok[2])\n", " else\n", " println(\"Unknown read :\", tok)\n", - " end \n", + " end\n", " end\n", " end\n", " return price, weight, capacity\n", @@ -97,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -115,54 +126,82 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Procédure d'application des tests de sondabilités TA, TO et TR pour le cas de la relaxation linéaire" + "## Procédure d'application des tests de sondabilités TA, TO et TR pour le cas de la relaxation linéaire" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "TestsSondabilite_relaxlin" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ + "\"\"\"Test if a node should be pruned.\n", + "\n", + "Args: \\\\\n", + " - x (Vector{Integer}): the node to be tested. \\\\\n", + " - price (Vector{Integer}): prices of items to put in the KnapSack. \\\\\n", + " - weight (Vector{Integer}): weights of items to put in the KnapSack. \\\\\n", + " - capacity (Integer): the maximum capacity of the KnapSack. \\\\\n", + " - BestProfit (Integer): the current BestProfit value. \\\\\n", + " - Bestsol (Integer): the current BestSol values. \\\\\n", + " - affich (Bool): determine if the function should print to stdout.\n", + "\n", + "Returns: \\\\\n", + " - TA (Bool): true if the node is feasible. \\\\\n", + " - TO (Bool): true if the node is optimal. \\\\\n", + " - TR (Bool): true if the node is resolvable. \\\\\n", + " - BestProfit (Integer): the updated value of BestProfit. \\\\\n", + " - Bestsol (Vector{Integer}): the updated values of BestSol.\n", + "\"\"\"\n", "function TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich)\n", " TA, TO, TR = false, false, false\n", + "\n", " if (!Constraints(x, weight, capacity)) # Test de faisabilite\n", " TA = true\n", " if affich\n", - " println(\"TA\")\n", + " println(\"TA\\n\")\n", " end\n", + "\n", " elseif (Objective(x, price) <= BestProfit) # Test d'optimalite\n", " TO = true\n", " if affich\n", - " println(\"TO\")\n", + " println(\"TO\\n\")\n", " end\n", + "\n", " elseif (AllDef(x)) # Test de resolution\n", " TR = true\n", " if affich\n", - " println(\"TR : solution \", \" de profit \", Objective(x, price))\n", + " println(\"TR : solution \", \" de profit \", Objective(x, price), \"\\n\")\n", " end\n", " if (Objective(x, price) >= BestProfit) # Le profit de la solution trouvée est meilleur que les autres\n", " if affich\n", - " println(\"\\t-> Cette solution a un meilleur profit.\")\n", + " println(\"\\t-> Cette solution a un meilleur profit.\\n\")\n", " end\n", " # On remplace la solution et le profit par les nouvelles valeurs\n", " Bestsol = x\n", " BestProfit = Objective(x, price)\n", " else\n", " if affich\n", - " println(\"\\t-> Cette solution est moins bonne.\")\n", + " println(\"\\t-> Cette solution est moins bonne.\\n\")\n", " end\n", " end\n", - " else\n", - " if affich \n", - " println(\"non sondable\")\n", - " end\n", + "\n", + " elseif affich\n", + " println(\"non sondable\\n\")\n", " end\n", - " if affich\n", - " println(\"\\n\")\n", - " end\n", - " \n", - " TA, TO, TR, Bestsol, BestProfit\n", + "\n", + " return TA, TO, TR, Bestsol, BestProfit\n", "end" ] }, @@ -170,15 +209,37 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Procédure de séparation et stratégie d'exploration permettant de se placer au prochain noeud à traiter" + "## Procédure de séparation et stratégie d'exploration permettant de se placer au prochain noeud à traiter" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "SeparerNoeud_relaxlin" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ + "\"\"\"Split a node in two.\n", + "\n", + "Args: \\\\\n", + " - price (Vector{Integer}): prices of items to put in the KnapSack. \\\\\n", + " - listvars (Vector{Vector{Integer}}): the current values of listvars. \\\\\n", + " - listvals (Vector{Integer}): the current values of listvals.\n", + "\n", + "Returns: \\\\\n", + " - listvars (Vector{Vector{Integer}}): the updated values of listvars. \\\\\n", + " - listvals (Vector{Integer}): the updated values of listvals.\n", + "\"\"\"\n", "function SeparerNoeud_relaxlin(price, listvars, listvals)\n", " # Le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds \n", "\n", @@ -195,7 +256,7 @@ "\n", " # On fixe la nouvelle variable des deux sous-noeuds\n", " n = length(predX)\n", - " for i in 1:n\n", + " for i = 1:n\n", " if predX[i] == -1\n", " # L'un a zéro\n", " nextX0[i] = 0\n", @@ -208,7 +269,7 @@ " break\n", " end\n", " end\n", - " \n", + "\n", " # On ajoute les sous-noeuds a la pile des noeuds a explorer\n", " push!(listvars, nextX0)\n", " push!(listvars, nextX1)\n", @@ -217,13 +278,42 @@ " push!(listvals, val0)\n", " push!(listvals, val1)\n", "\n", - " listvars, listvals\n", - "end\n", + " return listvars, listvals\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "ExplorerAutreNoeud_relaxlin" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"Pop node fom the list to explore another node.\n", "\n", + "Args: \\\\\n", + " - price (Vector{Integer}): prices of items to put in the KnapSack. \\\\\n", + " - listvars (Vector{Vector{Integer}}): the current values of listvars. \\\\\n", + " - listvals (Vector{Integer}): the current values of listvals.\n", "\n", + "Returns: \\\\\n", + " - listvars (Vector{Vector{Integer}}): the updated values of listvars. \\\\\n", + " - listvals (Vector{Integer}): the updated values of listvals. \\\\\n", + " - stop (Bool): true if the tree search is finished.\n", + "\"\"\"\n", "function ExplorerAutreNoeud_relaxlin(listvars, listvals)\n", " # Le noeud est sondable, on l'enlève de la pile des noeuds à sonder\n", - " \n", + "\n", " stop = false\n", " if (length(listvars) > 1)\n", " # On passe au noeud suivant\n", @@ -231,29 +321,46 @@ " val = pop!(listvals)\n", " else\n", " # Il n'y a pas d'autre noeud\n", - " println(\"\\nFINISHED\")\n", " stop = true\n", " end\n", "\n", - " listvars, listvals, stop \n", + " return listvars, listvals, stop\n", "end" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], + "source": [ + "## Fonctions décrivant l'objectif et les contraintes" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AllDef (generic function with 1 method)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Fonction objectif que l'on souhaite maximiser/minimiser (évalué dans le meilleur des cas)\n", - "Objective(x, price) = \n", + "Objective(x, price) =\n", " sum(\n", " if x[i] < 0\n", " price[i]\n", " else\n", - " price[i]*x[i] \n", + " price[i] * x[i]\n", " end\n", - " for i in 1:length(x)\n", + " for i = 1:length(x)\n", " )\n", "\n", "# Fonction permettant de vérfier toutes les contraintes du modèle (dans le meilleur des cas)\n", @@ -261,15 +368,15 @@ " sum(\n", " if x[i] < 0\n", " 0\n", - " else \n", - " weight[i]*x[i]\n", + " else\n", + " weight[i] * x[i]\n", " end\n", - " for i in 1:length(x)\n", + " for i = 1:length(x)\n", " ) <= capacity\n", "\n", "# Fonction qui nous dis si toutes les variables de x sont fixées\n", "function AllDef(x)\n", - " for i in 1:length(x)\n", + " for i = 1:length(x)\n", " if x[i] < 0\n", " return false\n", " end\n", @@ -279,17 +386,50 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ + "## Résolution du problème KnapSack" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "SolveKnapInstance" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"Solve the KnapSack problem for the data contained in `filename`.\n", + "\n", + "Args: \\\\\n", + " - filename (String): the name of the file to read.\n", + "\n", + "Returns: \\\\\n", + " - trParentnodes (Vector{Integer}): the parents nodes, to plot the tree.\n", + " - trChildnodes (Vector{Integer}): the child nodes, to plot the tree.\n", + " - trNamenodes (Vector{Integer}): the name of the nodes, to plot the tree.\n", + "\"\"\"\n", "function SolveKnapInstance(filename)\n", "\n", + " stop = false\n", + " affich = false\n", + "\n", " # Extraction des données\n", " price, weight, capacity = readKnapInstance(filename)\n", "\n", - " println(\"Capacity : \", capacity, \" | Number of objects : \", length(price), \"\\n\")\n", + " if affich\n", + " println(\"Capacity : \", capacity, \" | Number of objects : \", length(price), \"\\n\")\n", + " end\n", "\n", " # Pour dessiner le graph\n", " trParentnodes = Int64[]\n", @@ -308,9 +448,6 @@ " # Compter le nombre de noeud explorés\n", " current_node_number = 0\n", "\n", - " stop = false\n", - " affich = false\n", - "\n", " # On ajoute le premier noeud à explorer (la racine)\n", " push!(listvars, [-1 for p in price])\n", " push!(listvals, Objective(last(listvars), price))\n", @@ -323,16 +460,15 @@ " # Le noeud actuel\n", " x = last(listvars)\n", "\n", - " if affich\n", - " print(\"----------\\nNode n°\", current_node_number, \" : \")\n", - " println(\" \")\n", - " println(\"\\nPrevious Solution memorized \", \" with bestprofit \", BestProfit, \"\\n\")\n", + " if affich && current_node_number % 10000 == 0\n", + " println(\"----------\\nNode n°\", current_node_number, \" :\\n\")\n", + " println(\"Previous Solution memorized \", \" with bestprofit \", BestProfit, \"\\n\")\n", " end\n", "\n", " # Test de sondabilité du noeud actuel\n", " # -> On mets a jour la solution et sa valeur si besoin\n", " TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich)\n", - " \n", + "\n", " is_node_sondable = TA || TO || TR\n", " if (!is_node_sondable)\n", " # Le noeud n'est pas sondable, on le sépare en 2 sous-noeuds\n", @@ -343,13 +479,13 @@ " push!(trParentnodes, curnode)\n", " push!(trParentnodes, curnode)\n", "\n", - " push!(listnodes, newnodeid+1)\n", + " push!(listnodes, newnodeid + 1)\n", " push!(listnodes, newnodeid)\n", "\n", " push!(trChildnodes, newnodeid)\n", - " push!(trChildnodes, newnodeid+1)\n", + " push!(trChildnodes, newnodeid + 1)\n", "\n", - " push!(trNamenodes, newnodeid-1)\n", + " push!(trNamenodes, newnodeid - 1)\n", " push!(trNamenodes, newnodeid)\n", "\n", " newnodeid += 2\n", @@ -361,30 +497,50 @@ " pop!(listnodes)\n", " end\n", "\n", - " # On évite de spammer l'output donc on n'affiche pas tout les résultats\n", - " if current_node_number % 1000000 == 100\n", - " affich = true\n", - " else\n", - " affich = false\n", - " end\n", - "\n", " current_node_number += 1\n", " end\n", "\n", - " println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x = \", Bestsol)\n", - "\n", - " trParentnodes, trChildnodes, trNamenodes\n", + " if affich\n", + " println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x = \", Bestsol)\n", + " end\n", + " \n", + " return trParentnodes, trChildnodes, trNamenodes\n", "end" ] }, + { + "cell_type": "code", + "execution_count": 17, + "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\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": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/test.opb\")\n", + "graphplot(trParentnodes, trChildnodes, names = trNamenodes, method = :tree)" + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/circle/knapPI_16_8_1000_1_-2291.opb\")\n", - "graphplot(trParentnodes, trChildnodes, names=trNamenodes, method=:tree)" + "# # on teste de résoudre tous les fichiers .opb\n", + "# for (root, dirs, files) in walkdir(\"data\")\n", + "# for file in files\n", + "# if endswith(file, \".opb\")\n", + "# SolveKnapInstance(root * \"/\" * file)\n", + "# end\n", + "# end\n", + "# end" ] } ], From 576268b0613df43c3a87639e829159ab1439d58d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Thu, 9 Dec 2021 08:25:20 +0100 Subject: [PATCH 12/21] chore: created prog.jl from notebook Co-authored-by: gdamms --- notebook-exemple.ipynb | 10 +- notebook.ipynb | 70 ++++------ prog.jl | 310 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 339 insertions(+), 51 deletions(-) create mode 100644 prog.jl diff --git a/notebook-exemple.ipynb b/notebook-exemple.ipynb index 0dd00f6..0ca813d 100644 --- a/notebook-exemple.ipynb +++ b/notebook-exemple.ipynb @@ -21,7 +21,8 @@ "outputs": [], "source": [ "import Pkg; \n", - "Pkg.add(\"GraphRecipes\"); Pkg.add(\"Plots\"); \n", + "Pkg.add(\"GraphRecipes\");\n", + "Pkg.add(\"Plots\"); \n", "using GraphRecipes, Plots #only used to visualize the search tree at the end of the branch-and-bound" ] }, @@ -345,13 +346,6 @@ "println(trChildnodes)\n", "println(trNamenodes)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/notebook.ipynb b/notebook.ipynb index 50b6b6a..053249b 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -16,26 +16,25 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `~/.julia/registries/General`\n", "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.7/Project.toml`\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.7/Manifest.toml`\n", "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", "\u001b[32m ✓ \u001b[39mTestOptinum\n", - " 1 dependency successfully precompiled in 7 seconds (270 already precompiled)\n", + " 1 dependency successfully precompiled in 2 seconds (262 already precompiled, 2 skipped during auto due to previous errors)\n", "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.7/Project.toml`\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.7/Manifest.toml`\n", "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", "\u001b[32m ✓ \u001b[39mTestOptinum\n", - " 1 dependency successfully precompiled in 4 seconds (270 already precompiled)\n" + " 1 dependency successfully precompiled in 1 seconds (262 already precompiled, 2 skipped during auto due to previous errors)\n" ] } ], @@ -55,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -64,9 +63,8 @@ "readKnapInstance" ] }, - "execution_count": 2, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -108,7 +106,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 42, "metadata": {}, "outputs": [], "source": [ @@ -131,7 +129,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 43, "metadata": {}, "outputs": [ { @@ -140,9 +138,8 @@ "TestsSondabilite_relaxlin" ] }, - "execution_count": 4, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -214,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 44, "metadata": {}, "outputs": [ { @@ -223,9 +220,8 @@ "SeparerNoeud_relaxlin" ] }, - "execution_count": 5, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -284,7 +280,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 45, "metadata": {}, "outputs": [ { @@ -293,9 +289,8 @@ "ExplorerAutreNoeud_relaxlin" ] }, - "execution_count": 13, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -337,7 +332,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 46, "metadata": {}, "outputs": [ { @@ -346,9 +341,8 @@ "AllDef (generic function with 1 method)" ] }, - "execution_count": 14, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -394,7 +388,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 47, "metadata": {}, "outputs": [ { @@ -403,9 +397,8 @@ "SolveKnapInstance" ] }, - "execution_count": 15, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -510,21 +503,12 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 48, "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\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": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/test.opb\")\n", - "graphplot(trParentnodes, trChildnodes, names = trNamenodes, method = :tree)" + "trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/circle/knapPI_16_10000_1000_5_-912198.opb\")\n", + "# graphplot(trParentnodes, trChildnodes, names = trNamenodes, method = :tree)" ] }, { @@ -546,15 +530,15 @@ ], "metadata": { "kernelspec": { - "display_name": "Julia 1.6.3", + "display_name": "Julia 1.7.0", "language": "julia", - "name": "julia-1.6" + "name": "julia-1.7" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", - "version": "1.6.3" + "version": "1.7.0" } }, "nbformat": 4, diff --git a/prog.jl b/prog.jl new file mode 100644 index 0000000..4b4995e --- /dev/null +++ b/prog.jl @@ -0,0 +1,310 @@ +import Pkg; +Pkg.add("GraphRecipes"); +Pkg.add("Plots"); +using GraphRecipes, Plots #only used to visualize the search tree at the end of the branch-and-bound + +"""Open and read a KnapFile. + +Args: \\ + - filename (String): the name of the file to read. + +Returns: \\ + - price (Vector{Integer}): prices of items to put in the KnapSack. \\ + - weight (Vector{Integer}): weights of items to put in the KnapSack. \\ + - capacity (Integer): the maximum capacity of the KnapSack. +""" +function readKnapInstance(filename) + price = [] + weight = [] + capacity = -1 + open(filename) do f + for i = 1:3 + tok = split(readline(f)) + if (tok[1] == "ListPrices=") + for i = 2:(length(tok)-1) + push!(price, parse(Int64, tok[i])) + end + elseif (tok[1] == "ListWeights=") + for i = 2:(length(tok)-1) + push!(weight, parse(Int64, tok[i])) + end + elseif (tok[1] == "Capacity=") + capacity = parse(Int64, tok[2]) + else + println("Unknown read :", tok) + end + end + end + return price, weight, capacity +end + +"""Test if a node should be pruned. + +Args: \\ + - x (Vector{Integer}): the node to be tested. \\ + - price (Vector{Integer}): prices of items to put in the KnapSack. \\ + - weight (Vector{Integer}): weights of items to put in the KnapSack. \\ + - capacity (Integer): the maximum capacity of the KnapSack. \\ + - BestProfit (Integer): the current BestProfit value. \\ + - Bestsol (Integer): the current BestSol values. \\ + - affich (Bool): determine if the function should print to stdout. + +Returns: \\ + - TA (Bool): true if the node is feasible. \\ + - TO (Bool): true if the node is optimal. \\ + - TR (Bool): true if the node is resolvable. \\ + - BestProfit (Integer): the updated value of BestProfit. \\ + - Bestsol (Vector{Integer}): the updated values of BestSol. +""" +function TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich) + TA, TO, TR = false, false, false + + if (!Constraints(x, weight, capacity)) # Test de faisabilite + TA = true + if affich + println("TA\n") + end + + elseif (Objective(x, price) <= BestProfit) # Test d'optimalite + TO = true + if affich + println("TO\n") + end + + elseif (AllDef(x)) # Test de resolution + TR = true + if affich + println("TR : solution ", " de profit ", Objective(x, price), "\n") + end + if (Objective(x, price) >= BestProfit) # Le profit de la solution trouvée est meilleur que les autres + if affich + println("\t-> Cette solution a un meilleur profit.\n") + end + # On remplace la solution et le profit par les nouvelles valeurs + Bestsol = x + BestProfit = Objective(x, price) + else + if affich + println("\t-> Cette solution est moins bonne.\n") + end + end + + elseif affich + println("non sondable\n") + end + + return TA, TO, TR, Bestsol, BestProfit +end + +"""Split a node in two. + +Args: \\ + - price (Vector{Integer}): prices of items to put in the KnapSack. \\ + - listvars (Vector{Vector{Integer}}): the current values of listvars. \\ + - listvals (Vector{Integer}): the current values of listvals. + +Returns: \\ + - listvars (Vector{Vector{Integer}}): the updated values of listvars. \\ + - listvals (Vector{Integer}): the updated values of listvals. +""" +function SeparerNoeud_relaxlin(price, listvars, listvals) + # Le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds + + # Cas du noeud le plus à gauche + + # On sépare le noeud actuel en 2 sous-noeuds + predX = pop!(listvars) + nextX0 = copy(predX) + nextX1 = copy(predX) + + # On initialise leurs valeurs à zéro + val0 = 0 + val1 = 0 + + # On fixe la nouvelle variable des deux sous-noeuds + n = length(predX) + for i = 1:n + if predX[i] == -1 + # L'un a zéro + nextX0[i] = 0 + # L'autre a un + nextX1[i] = 1 + + # On calcule leurs valeurs + val0 = Objective(nextX0, price) + val1 = Objective(nextX1, price) + break + end + end + + # On ajoute les sous-noeuds a la pile des noeuds a explorer + push!(listvars, nextX0) + push!(listvars, nextX1) + + # On ajoute aussi leurs valeurs + push!(listvals, val0) + push!(listvals, val1) + + return listvars, listvals +end + +"""Pop node fom the list to explore another node. + +Args: \\ + - price (Vector{Integer}): prices of items to put in the KnapSack. \\ + - listvars (Vector{Vector{Integer}}): the current values of listvars. \\ + - listvals (Vector{Integer}): the current values of listvals. + +Returns: \\ + - listvars (Vector{Vector{Integer}}): the updated values of listvars. \\ + - listvals (Vector{Integer}): the updated values of listvals. \\ + - stop (Bool): true if the tree search is finished. +""" +function ExplorerAutreNoeud_relaxlin(listvars, listvals) + # Le noeud est sondable, on l'enlève de la pile des noeuds à sonder + + stop = false + if (length(listvars) > 1) + # On passe au noeud suivant + var = pop!(listvars) + val = pop!(listvals) + else + # Il n'y a pas d'autre noeud + stop = true + end + + return listvars, listvals, stop +end + +# Fonction objectif que l'on souhaite maximiser/minimiser (évalué dans le meilleur des cas) +Objective(x, price) = + sum( + if x[i] < 0 + price[i] + else + price[i] * x[i] + end + for i = 1:length(x) + ) + +# Fonction permettant de vérfier toutes les contraintes du modèle (dans le meilleur des cas) +Constraints(x, weight, capacity) = + sum( + if x[i] < 0 + 0 + else + weight[i] * x[i] + end + for i = 1:length(x) + ) <= capacity + +# Fonction qui nous dis si toutes les variables de x sont fixées +function AllDef(x) + for i = 1:length(x) + if x[i] < 0 + return false + end + end + return true +end + +"""Solve the KnapSack problem for the data contained in `filename`. + +Args: \\ + - filename (String): the name of the file to read. + +Returns: \\ + - trParentnodes (Vector{Integer}): the parents nodes, to plot the tree. + - trChildnodes (Vector{Integer}): the child nodes, to plot the tree. + - trNamenodes (Vector{Integer}): the name of the nodes, to plot the tree. +""" +function SolveKnapInstance(filename) + + stop = false + affich = false + + # Extraction des données + price, weight, capacity = readKnapInstance(filename) + + if affich + println("Capacity : ", capacity, " | Number of objects : ", length(price), "\n") + end + + # Pour dessiner le graph + trParentnodes = Int64[] + trChildnodes = Int64[] + trNamenodes = [] + + # Liste des variable pour naviguer de noeuds en noeuds + listvars = [] + listvals = [] + listnodes = [] + + # La meilleur solution et sa valeur + BestProfit = -1 + Bestsol = [] + + # Compter le nombre de noeud explorés + current_node_number = 0 + + # On ajoute le premier noeud à explorer (la racine) + push!(listvars, [-1 for p in price]) + push!(listvals, Objective(last(listvars), price)) + push!(listnodes, 1) + push!(trNamenodes, 0) + newnodeid = 2 + + while (!stop) + + # Le noeud actuel + x = last(listvars) + + if affich && current_node_number % 10000 == 0 + println("----------\nNode n°", current_node_number, " :\n") + println("Previous Solution memorized ", " with bestprofit ", BestProfit, "\n") + end + + # Test de sondabilité du noeud actuel + # -> On mets a jour la solution et sa valeur si besoin + TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich) + + is_node_sondable = TA || TO || TR + if (!is_node_sondable) + # Le noeud n'est pas sondable, on le sépare en 2 sous-noeuds + listvars, listvals = SeparerNoeud_relaxlin(price, listvars, listvals) + + curnode = pop!(listnodes) + + push!(trParentnodes, curnode) + push!(trParentnodes, curnode) + + push!(listnodes, newnodeid + 1) + push!(listnodes, newnodeid) + + push!(trChildnodes, newnodeid) + push!(trChildnodes, newnodeid + 1) + + push!(trNamenodes, newnodeid - 1) + push!(trNamenodes, newnodeid) + + newnodeid += 2 + + else + # Le noeud est sondable, on passe au noeud suivant + listvars, listvals, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals) + + pop!(listnodes) + end + + current_node_number += 1 + end + + if affich + println("\n******\n\nOptimal value = ", BestProfit, "\n\nOptimal x = ", Bestsol) + end + + return trParentnodes, trChildnodes, trNamenodes +end + +trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance("data/circle/knapPI_16_10000_1000_5_-912198.opb") +# graphplot(trParentnodes, trChildnodes, names = trNamenodes, method = :tree) \ No newline at end of file From 055048dbaea1ac2a74e93bd39b47a19150c0f097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Thu, 9 Dec 2021 11:54:09 +0100 Subject: [PATCH 13/21] f5 Co-authored-by: gdamms --- notebook.ipynb | 1695 +++++++++++++++++++++++++++++++++++++++++++- prog.jl => test.jl | 67 -- 2 files changed, 1675 insertions(+), 87 deletions(-) rename prog.jl => test.jl (71%) diff --git a/notebook.ipynb b/notebook.ipynb index 053249b..a19819c 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -54,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -106,7 +106,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -129,7 +129,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -211,13 +211,13 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "SeparerNoeud_relaxlin" + "SeparerNoeud" ] }, "metadata": {}, @@ -236,7 +236,7 @@ " - listvars (Vector{Vector{Integer}}): the updated values of listvars. \\\\\n", " - listvals (Vector{Integer}): the updated values of listvals.\n", "\"\"\"\n", - "function SeparerNoeud_relaxlin(price, listvars, listvals)\n", + "function SeparerNoeud(price, listvars, listvals)\n", " # Le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds \n", "\n", " # Cas du noeud le plus à gauche\n", @@ -265,7 +265,7 @@ " break\n", " end\n", " end\n", - "\n", + " \n", " # On ajoute les sous-noeuds a la pile des noeuds a explorer\n", " push!(listvars, nextX0)\n", " push!(listvars, nextX1)\n", @@ -280,7 +280,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -332,7 +332,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -388,7 +388,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -416,9 +416,17 @@ "\n", " stop = false\n", " affich = false\n", - "\n", + " \n", " # Extraction des données\n", " price, weight, capacity = readKnapInstance(filename)\n", + " \n", + " tri = false\n", + " if tri\n", + " couples = zip(price, weight)\n", + " couples = sort(collect(couples), by = x -> x[1] / x[2])\n", + " unzip(a) = map(x->getfield.(a, x), fieldnames(eltype(a)))\n", + " price, weight = unzip(couples)\n", + " end\n", "\n", " if affich\n", " println(\"Capacity : \", capacity, \" | Number of objects : \", length(price), \"\\n\")\n", @@ -493,9 +501,9 @@ " current_node_number += 1\n", " end\n", "\n", - " if affich\n", - " println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x = \", Bestsol)\n", - " end\n", + " \n", + " println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x = \", Bestsol)\n", + " \n", " \n", " return trParentnodes, trChildnodes, trNamenodes\n", "end" @@ -503,17 +511,1511 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 24, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "******\n", + "\n", + "Optimal value = 2\n", + "\n", + "Optimal x = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n" + ] + }, + { + "data": { + "text/plain": [ + "([1, 1, 2, 2, 5, 5, 7, 7, 9, 9 … 93, 93, 100, 100, 103, 103, 101, 101, 106, 106], [2, 3, 4, 5, 6, 7, 8, 9, 10, 11 … 100, 101, 102, 103, 104, 105, 106, 107, 108, 109], Any[0, 1, 2, 3, 4, 5, 6, 7, 8, 9 … 99, 100, 101, 102, 103, 104, 105, 106, 107, 108])" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/circle/knapPI_16_10000_1000_5_-912198.opb\")\n", - "# graphplot(trParentnodes, trChildnodes, names = trNamenodes, method = :tree)" + "trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/test_perso/2max.opb\")\n", + "# trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/subset_sum/knapPI_6_50_1000_1_-994.opb\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "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\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\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\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\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\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\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\n\n\n\n\n\n\n", + "text/html": [ + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "graphplot(trParentnodes, trChildnodes, names = trNamenodes, method = :tree)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nombres de noeuds explorés : 109\n" + ] + } + ], + "source": [ + "println(\"nombres de noeuds explorés : \", length(trNamenodes))" + ] + }, + { + "cell_type": "code", + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -526,6 +2028,159 @@ "# end\n", "# end" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Rapport\n", + "\n", + "- Quelques détails sur les points clés et non triviaux de votre implémentation\n", + "- Une courte argumentation de l’adéquation du résultat avec l’instance résolue\n", + "- Quelques éléments d’analyse, par exemple :\n", + "- Analyser l’impact des différents paramètres de la PSE sur la performance en terme de vitesse/délais (en temps cpu et nombre de noeuds explorés) pour l’obtention d’une solution réalisable, pour l’obtention de la meilleure solution, pour l’obtention de bornes supérieures de qualité et pour la complétion de l’algorithme\n", + "\n", + "## Notre implémentation\n", + "\n", + "Pour l'implémentation de notre `branch and bound`, nous avons gardé la même même architecture que celle du sujet. Nous avons simplement ré-écrit les fonctions qui calculent la valeur objectif et la valeur de la capacité. \\\n", + "Notre vecteur de décision $x$ est tel que $x\\in\\{-1,0,1\\}^n$ avec $n$ le nombre d'objets disponibles. $1$ et $0$ représente, respectivement, un objet non-pris ou non-pris. La valeur $-1$ représente un objet ou la décision n'a pas encore été faite.\n", + "Dans la fonction `Objetive`, si la valeur est a $-1$, on fait comme-ci elle était à $1$ pourcalculer une borne supérieur. Dans la fonction `Constraints` les $-1$ sont concidéré comme des $0$ pour avoir une borne inférieur de notre problème. \\\n", + "
\n", + "Pour l'exploration et la création de noeud, nous faisons une exploration des noeuds avec le plus de $1$ en premier. \\\n", + "Lorsque nous arrivons sur un noeud, nous l'enlevons de la pile des noeuds. Nous calculons ensuite si il est \"trivial\" ou si il dépasse déjà l'une des bornes ou si il est divisible. Dans le cas ou il est \"trivial\", nous calculons sa valeur et remplaçons la meilleure valeur si nécessaire. Dans le cas ou il dépasse une borne, nous l'abandonnons. Et enfin, si il est séparable, nous le séparons en deux en ajoutant la pile des noeuds les deux sous noeuds. \\\n", + "Exemple : $[(0,-1,-1)]$ -> $[(0,0,-1) ; (0,1,-1)]$\n", + "\n", + "## Justification de nos résultats\n", + "\n", + "Notre algorithme trouve bien les solutions idéales (comme indiqué dans le nom du fichier). Pour le test `uncorrelated_span/knapPI_11_20_1000_1_-1428` Nous avons trouvé la valeur optimale qui est de `1428` en `2131` exploration de noeuds la ou un algorithme classique de parcours de l'ensemble des noeuds aurait exploré `1048576` noeuds.\n", + "\n", + "## Analyse\n", + "\n", + "```\n", + "lfainsin@bonite:~/2A/RO/tp2$ time julia test.jl data/weakly_correlated/knapPI_2_50_1000_1_-1396.opb\n", + "---data/weakly_correlated/knapPI_2_50_1000_1_-1396.opb---\n", + "Capacity = 995\n", + "Number of objects = 50\n", + "Expected optimal value = 1396\n", + "Maximum number of nodes = 1125899906842624\n", + "\n", + "Node n°96: BestProfit = 825\n", + "Node n°169: BestProfit = 844\n", + "Node n°243: BestProfit = 919\n", + "Node n°297: BestProfit = 943\n", + "Node n°1126: BestProfit = 946\n", + "Node n°1224: BestProfit = 1030\n", + "Node n°1456: BestProfit = 1045\n", + "Node n°2960: BestProfit = 1105\n", + "Node n°3342: BestProfit = 1120\n", + "Node n°4596: BestProfit = 1126\n", + "Node n°6129: BestProfit = 1207\n", + "Node n°10462: BestProfit = 1212\n", + "Node n°24382: BestProfit = 1278\n", + "Node n°418695: BestProfit = 1288\n", + "Node n°422566: BestProfit = 1308\n", + "Node n°436804: BestProfit = 1329\n", + "Node n°443759: BestProfit = 1337\n", + "Node n°446051: BestProfit = 1352\n", + "Node n°916081: BestProfit = 1360\n", + "Node n°1044425: BestProfit = 1396\n", + "\n", + "--------------------------------------------------\n", + "Expected optimal value = 1396\n", + "Optimal value = 1396\n", + "Optimal x = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]\n", + "Maximum number of nodes = 1125899906842624\n", + "Nodes explored = 3053865\n", + "\n", + "real 0m29,301s\n", + "user 0m29,372s\n", + "sys 0m0,809s\n", + "```\n", + "\n", + "```\n", + "lfainsin@bonite:~/2A/RO/tp2$ time julia test.jl data/weakly_correlated/knapPI_2_50_1000_1_-1396.opb\n", + "---data/weakly_correlated/knapPI_2_50_1000_1_-1396.opb---\n", + "Capacity = 995\n", + "Number of objects = 50\n", + "Expected optimal value = 1396\n", + "Maximum number of nodes = 1125899906842624\n", + "\n", + "Node n°93: BestProfit = 487\n", + "Node n°175: BestProfit = 626\n", + "Node n°293: BestProfit = 705\n", + "Node n°544: BestProfit = 810\n", + "Node n°1671: BestProfit = 815\n", + "Node n°1871: BestProfit = 836\n", + "Node n°2019: BestProfit = 872\n", + "Node n°2074: BestProfit = 886\n", + "Node n°3204: BestProfit = 918\n", + "Node n°4406: BestProfit = 950\n", + "Node n°4708: BestProfit = 952\n", + "Node n°4770: BestProfit = 978\n", + "Node n°8898: BestProfit = 990\n", + "Node n°9214: BestProfit = 1049\n", + "Node n°18160: BestProfit = 1059\n", + "Node n°18616: BestProfit = 1095\n", + "Node n°25906: BestProfit = 1099\n", + "Node n°27015: BestProfit = 1104\n", + "Node n°27130: BestProfit = 1119\n", + "Node n°27585: BestProfit = 1121\n", + "Node n°28076: BestProfit = 1125\n", + "Node n°43768: BestProfit = 1132\n", + "Node n°44203: BestProfit = 1134\n", + "Node n°59004: BestProfit = 1142\n", + "Node n°59465: BestProfit = 1144\n", + "Node n°59964: BestProfit = 1148\n", + "Node n°65923: BestProfit = 1154\n", + "Node n°66110: BestProfit = 1156\n", + "Node n°71779: BestProfit = 1186\n", + "Node n°71992: BestProfit = 1188\n", + "Node n°73054: BestProfit = 1190\n", + "Node n°73127: BestProfit = 1197\n", + "Node n°73146: BestProfit = 1241\n", + "Node n°152150: BestProfit = 1249\n", + "Node n°154060: BestProfit = 1251\n", + "Node n°179062: BestProfit = 1260\n", + "Node n°181638: BestProfit = 1261\n", + "Node n°181907: BestProfit = 1281\n", + "Node n°192060: BestProfit = 1298\n", + "Node n°202348: BestProfit = 1330\n", + "Node n°203862: BestProfit = 1341\n", + "Node n°206773: BestProfit = 1351\n", + "Node n°399253: BestProfit = 1365\n", + "Node n°619338: BestProfit = 1375\n", + "Node n°619695: BestProfit = 1377\n", + "Node n°842654: BestProfit = 1394\n", + "Node n°844341: BestProfit = 1396\n", + "\n", + "--------------------------------------------------\n", + "Expected optimal value = 1396\n", + "Optimal value = 1396\n", + "Optimal x = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1]\n", + "Maximum number of nodes = 1125899906842624\n", + "Nodes explored = 846447\n", + "\n", + "real 0m4,348s\n", + "user 0m4,480s\n", + "sys 0m0,747s\n", + "```\n", + "\n", + "Nous avaons réalisé les calcules de deux manières différentes : \\\n", + "La première fois, nous mettions a jour les coordonnées de $x$ dans l'ordre des indices. \\\n", + "La deuxième fois, nous avons d'abbord trié les vecteurs `weight` et `price` par leur rapport $prix / poids$. Cela revient a mettre a jour les coordonnées de $x$ dans l'ordre du meilleur rapport $prix / poids$. (NB : le vecteur résultat n'est pas ré-ordonné comme l'était les `price` et `weight` initialement) \\\n", + "
\n", + "Pour le fichier `weakly_correlated/knapPI_2_50_1000_1_-1396`, nous avons comparé les résultats :\n", + "| Valeurs | Sans tri | Avec tri |\n", + "| :- | :- | :- |\n", + "| Optimal value | 1396 | 1396 |\n", + "| user | 29.372s | 4.480s |\n", + "| Nodes explored | 3053865 | 846447 |\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] } ], "metadata": { diff --git a/prog.jl b/test.jl similarity index 71% rename from prog.jl rename to test.jl index 4b4995e..53c8c8b 100644 --- a/prog.jl +++ b/test.jl @@ -1,18 +1,3 @@ -import Pkg; -Pkg.add("GraphRecipes"); -Pkg.add("Plots"); -using GraphRecipes, Plots #only used to visualize the search tree at the end of the branch-and-bound - -"""Open and read a KnapFile. - -Args: \\ - - filename (String): the name of the file to read. - -Returns: \\ - - price (Vector{Integer}): prices of items to put in the KnapSack. \\ - - weight (Vector{Integer}): weights of items to put in the KnapSack. \\ - - capacity (Integer): the maximum capacity of the KnapSack. -""" function readKnapInstance(filename) price = [] weight = [] @@ -38,24 +23,6 @@ function readKnapInstance(filename) return price, weight, capacity end -"""Test if a node should be pruned. - -Args: \\ - - x (Vector{Integer}): the node to be tested. \\ - - price (Vector{Integer}): prices of items to put in the KnapSack. \\ - - weight (Vector{Integer}): weights of items to put in the KnapSack. \\ - - capacity (Integer): the maximum capacity of the KnapSack. \\ - - BestProfit (Integer): the current BestProfit value. \\ - - Bestsol (Integer): the current BestSol values. \\ - - affich (Bool): determine if the function should print to stdout. - -Returns: \\ - - TA (Bool): true if the node is feasible. \\ - - TO (Bool): true if the node is optimal. \\ - - TR (Bool): true if the node is resolvable. \\ - - BestProfit (Integer): the updated value of BestProfit. \\ - - Bestsol (Vector{Integer}): the updated values of BestSol. -""" function TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich) TA, TO, TR = false, false, false @@ -96,17 +63,6 @@ function TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bests return TA, TO, TR, Bestsol, BestProfit end -"""Split a node in two. - -Args: \\ - - price (Vector{Integer}): prices of items to put in the KnapSack. \\ - - listvars (Vector{Vector{Integer}}): the current values of listvars. \\ - - listvals (Vector{Integer}): the current values of listvals. - -Returns: \\ - - listvars (Vector{Vector{Integer}}): the updated values of listvars. \\ - - listvals (Vector{Integer}): the updated values of listvals. -""" function SeparerNoeud_relaxlin(price, listvars, listvals) # Le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds @@ -148,18 +104,6 @@ function SeparerNoeud_relaxlin(price, listvars, listvals) return listvars, listvals end -"""Pop node fom the list to explore another node. - -Args: \\ - - price (Vector{Integer}): prices of items to put in the KnapSack. \\ - - listvars (Vector{Vector{Integer}}): the current values of listvars. \\ - - listvals (Vector{Integer}): the current values of listvals. - -Returns: \\ - - listvars (Vector{Vector{Integer}}): the updated values of listvars. \\ - - listvals (Vector{Integer}): the updated values of listvals. \\ - - stop (Bool): true if the tree search is finished. -""" function ExplorerAutreNoeud_relaxlin(listvars, listvals) # Le noeud est sondable, on l'enlève de la pile des noeuds à sonder @@ -208,16 +152,6 @@ function AllDef(x) return true end -"""Solve the KnapSack problem for the data contained in `filename`. - -Args: \\ - - filename (String): the name of the file to read. - -Returns: \\ - - trParentnodes (Vector{Integer}): the parents nodes, to plot the tree. - - trChildnodes (Vector{Integer}): the child nodes, to plot the tree. - - trNamenodes (Vector{Integer}): the name of the nodes, to plot the tree. -""" function SolveKnapInstance(filename) stop = false @@ -307,4 +241,3 @@ function SolveKnapInstance(filename) end trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance("data/circle/knapPI_16_10000_1000_5_-912198.opb") -# graphplot(trParentnodes, trChildnodes, names = trNamenodes, method = :tree) \ No newline at end of file From 329cd2a67b379a4f57d56ae256916078dcdc0cb4 Mon Sep 17 00:00:00 2001 From: Laurent Fainsin Date: Thu, 9 Dec 2021 11:56:07 +0100 Subject: [PATCH 14/21] spam incomming, sry la dsi Co-authored-by: gdamms --- distrib.py | 17 +++ machines.txt | 252 +++++++++++++++++++++++++++++++++++++++++++++ prog.jl => test.jl | 138 +++++++------------------ 3 files changed, 304 insertions(+), 103 deletions(-) create mode 100644 distrib.py create mode 100644 machines.txt rename prog.jl => test.jl (58%) diff --git a/distrib.py b/distrib.py new file mode 100644 index 0000000..c6ec638 --- /dev/null +++ b/distrib.py @@ -0,0 +1,17 @@ +PATH = "data" + +import os +result = [os.path.join(dp, f) for dp, dn, filenames in os.walk(PATH) for f in filenames if os.path.splitext(f)[1] == '.opb'] + +with open("machines.txt") as file: + machines = file.readlines() + machines = [machine.rstrip() for machine in machines] + +i = 0 +while len(result) > 0: + knap = result.pop()[:-4] + victime = machines[i % len(machines)] + i+=1 + cmd = f"""ssh lfainsin@{victime} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" "cd 2A/RO/tp2/ && tmux new-session -d 'julia test.jl {knap}.opb > {knap}.stdout'" """ + print(cmd) + os.system(cmd) diff --git a/machines.txt b/machines.txt new file mode 100644 index 0000000..4d9414e --- /dev/null +++ b/machines.txt @@ -0,0 +1,252 @@ +ablette.enseeiht.fr +acdc.enseeiht.fr +ackbar.enseeiht.fr +actinium.enseeiht.fr +ader.enseeiht.fr +aerosmith.enseeiht.fr +alose.enseeiht.fr +anguille.enseeiht.fr +antimoine.enseeiht.fr +apollinaire.enseeiht.fr +aragorn.enseeiht.fr +archimede.enseeiht.fr +arryn.enseeiht.fr +arwen.enseeiht.fr +aspicot.enseeiht.fr +aston.enseeiht.fr +atanasoff.enseeiht.fr +atkinson.enseeiht.fr +azote.enseeiht.fr +babagge.enseeiht.fr +backus.enseeiht.fr +banshee.enseeiht.fr +baratheon.enseeiht.fr +basilic.enseeiht.fr +bastie.enseeiht.fr +baudelaire.enseeiht.fr +behemot.enseeiht.fr +bilbo.enseeiht.fr +bishop.enseeiht.fr +bleriot.enseeiht.fr +bobafett.enseeiht.fr +boeing.enseeiht.fr +bonite.enseeiht.fr +boole.enseeiht.fr +boromir.enseeiht.fr +bouba.enseeiht.fr +boucher.enseeiht.fr +brassens.enseeiht.fr +bravoos.enseeiht.fr +brochet.enseeiht.fr +bulbizarre.enseeiht.fr +cable.enseeiht.fr +calimero.enseeiht.fr +candy.enseeiht.fr +carapuce.enseeiht.fr +carbone.enseeiht.fr +carmack.enseeiht.fr +carpe.enseeiht.fr +casimir.enseeiht.fr +chenipan.enseeiht.fr +chevesne.enseeiht.fr +chewie.enseeiht.fr +clapton.enseeiht.fr +clash.enseeiht.fr +clementine.enseeiht.fr +cobalt.enseeiht.fr +colossus.enseeiht.fr +cooper.enseeiht.fr +copernic.enseeiht.fr +corb.enseeiht.fr +cyclope.enseeiht.fr +dagobah.enseeiht.fr +darwin.enseeiht.fr +daurade.enseeiht.fr +dazzler.enseeiht.fr +deeppurple.enseeiht.fr +demusset.enseeiht.fr +descartes.enseeiht.fr +diabolo.enseeiht.fr +dijkstra.enseeiht.fr +doors.enseeiht.fr +dorne.enseeiht.fr +dragon.enseeiht.fr +dylan.enseeiht.fr +eagles.enseeiht.fr +edison.enseeiht.fr +einsten.enseeiht.fr +elrond.enseeiht.fr +eomer.enseeiht.fr +eowyn.enseeiht.fr +eperlan.enseeiht.fr +epica.enseeiht.fr +esteban.enseeiht.fr +ewok.enseeiht.fr +farman.enseeiht.fr +fermat.enseeiht.fr +ferre.enseeiht.fr +fletan.enseeiht.fr +fluor.enseeiht.fr +forge.enseeiht.fr +frodon.enseeiht.fr +galilee.enseeiht.fr +galium.enseeiht.fr +gambit.enseeiht.fr +gandalf.enseeiht.fr +gardon.enseeiht.fr +garros.enseeiht.fr +gautier.enseeiht.fr +gimli.enseeiht.fr +gobelin.enseeiht.fr +gobie.enseeiht.fr +goldorak.enseeiht.fr +gorgone.enseeiht.fr +gosling.enseeiht.fr +goujon.enseeiht.fr +greyjoy.enseeiht.fr +griffon.enseeiht.fr +grove.enseeiht.fr +guynemer.enseeiht.fr +havok.enseeiht.fr +hawking.enseeiht.fr +heidi.enseeiht.fr +hendrix.enseeiht.fr +hippogriffe.enseeiht.fr +hopper.enseeiht.fr +hugo.enseeiht.fr +hydre.enseeiht.fr +hypotrempe.enseeiht.fr +iceberg.enseeiht.fr +iode.enseeiht.fr +jabba.enseeiht.fr +jeangrey.enseeiht.fr +jobs.enseeiht.fr +jubele.enseeiht.fr +kenobi.enseeiht.fr +kepler.enseeiht.fr +kernighan.enseeiht.fr +kiss.enseeiht.fr +knuth.enseeiht.fr +ladyoscar.enseeiht.fr +lafontaine.enseeiht.fr +lamartine.enseeiht.fr +lando.enseeiht.fr +lannister.enseeiht.fr +latecoere.enseeiht.fr +legolas.enseeiht.fr +leia.enseeiht.fr +lindbergh.enseeiht.fr +liskov.enseeiht.fr +loureed.enseeiht.fr +lovelace.enseeiht.fr +luke.enseeiht.fr +magicarpe.enseeiht.fr +magma.enseeiht.fr +magneto.enseeiht.fr +malicia.enseeiht.fr +mallarme.enseeiht.fr +manticore.enseeiht.fr +marcheursblancs.enseeiht.fr +martell.enseeiht.fr +maupassant.enseeiht.fr +maya.enseeiht.fr +meeren.enseeiht.fr +melofee.enseeiht.fr +mermoz.enseeiht.fr +merry.enseeiht.fr +messerschmitt.enseeiht.fr +metallica.enseeiht.fr +minotaure.enseeiht.fr +mordocet.enseeiht.fr +motorhead.enseeiht.fr +murdock.enseeiht.fr +muse.enseeiht.fr +mystique.enseeiht.fr +neon.enseeiht.fr +nerophis.enseeiht.fr +neumann.enseeiht.fr +newton.enseeiht.fr +nickel.enseeiht.fr +nymphe.enseeiht.fr +ohm.enseeiht.fr +omble.enseeiht.fr +orphie.enseeiht.fr +oxygene.enseeiht.fr +palomete.enseeiht.fr +palpatine.enseeiht.fr +pascal.enseeiht.fr +pegase.enseeiht.fr +phenix.enseeiht.fr +phosphore.enseeiht.fr +piafabec.enseeiht.fr +pikachu.enseeiht.fr +pinkfloyd.enseeiht.fr +pippin.enseeiht.fr +poe.enseeiht.fr +polaris.enseeiht.fr +polonium.enseeiht.fr +portreal.enseeiht.fr +prevert.enseeiht.fr +psykokwak.enseeiht.fr +psylocke.enseeiht.fr +queen.enseeiht.fr +r2d2.enseeiht.fr +rattata.enseeiht.fr +rimbaud.enseeiht.fr +rocket.enseeiht.fr +rondoudou.enseeiht.fr +roucool.enseeiht.fr +rouget.enseeiht.fr +saintexupery.enseeiht.fr +salameche.enseeiht.fr +sam.enseeiht.fr +sand.enseeiht.fr +sandre.enseeiht.fr +sar.enseeiht.fr +sauvageons.enseeiht.fr +scorpion.enseeiht.fr +scoubidou.enseeiht.fr +shadowcat.enseeiht.fr +shannon.enseeiht.fr +silure.enseeiht.fr +snorki.enseeiht.fr +snow.enseeiht.fr +socrate.enseeiht.fr +sodium.enseeiht.fr +solo.enseeiht.fr +stallman.enseeiht.fr +stark.enseeiht.fr +stones.enseeiht.fr +succube.enseeiht.fr +sunfire.enseeiht.fr +superbus.enseeiht.fr +swartz.enseeiht.fr +tacaud.enseeiht.fr +tanche.enseeiht.fr +tao.enseeiht.fr +targaryen.enseeiht.fr +taupiqueur.enseeiht.fr +tesla.enseeiht.fr +titane.enseeiht.fr +tornade.enseeiht.fr +torvalds.enseeiht.fr +truite.enseeiht.fr +turing.enseeiht.fr +tyrell.enseeiht.fr +uranium.enseeiht.fr +vador.enseeiht.fr +vairon.enseeiht.fr +verlaine.enseeiht.fr +voisin.enseeiht.fr +volantis.enseeiht.fr +volta.enseeiht.fr +winterfell.enseeiht.fr +wright.enseeiht.fr +wyvern.enseeiht.fr +xorn.enseeiht.fr +yoda.enseeiht.fr +z6po.enseeiht.fr +zemanek.enseeiht.fr +zia.enseeiht.fr +zirconium.enseeiht.fr +zztop.enseeiht.fr diff --git a/prog.jl b/test.jl similarity index 58% rename from prog.jl rename to test.jl index 4b4995e..73803fe 100644 --- a/prog.jl +++ b/test.jl @@ -1,18 +1,3 @@ -import Pkg; -Pkg.add("GraphRecipes"); -Pkg.add("Plots"); -using GraphRecipes, Plots #only used to visualize the search tree at the end of the branch-and-bound - -"""Open and read a KnapFile. - -Args: \\ - - filename (String): the name of the file to read. - -Returns: \\ - - price (Vector{Integer}): prices of items to put in the KnapSack. \\ - - weight (Vector{Integer}): weights of items to put in the KnapSack. \\ - - capacity (Integer): the maximum capacity of the KnapSack. -""" function readKnapInstance(filename) price = [] weight = [] @@ -38,24 +23,6 @@ function readKnapInstance(filename) return price, weight, capacity end -"""Test if a node should be pruned. - -Args: \\ - - x (Vector{Integer}): the node to be tested. \\ - - price (Vector{Integer}): prices of items to put in the KnapSack. \\ - - weight (Vector{Integer}): weights of items to put in the KnapSack. \\ - - capacity (Integer): the maximum capacity of the KnapSack. \\ - - BestProfit (Integer): the current BestProfit value. \\ - - Bestsol (Integer): the current BestSol values. \\ - - affich (Bool): determine if the function should print to stdout. - -Returns: \\ - - TA (Bool): true if the node is feasible. \\ - - TO (Bool): true if the node is optimal. \\ - - TR (Bool): true if the node is resolvable. \\ - - BestProfit (Integer): the updated value of BestProfit. \\ - - Bestsol (Vector{Integer}): the updated values of BestSol. -""" function TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich) TA, TO, TR = false, false, false @@ -96,22 +63,9 @@ function TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bests return TA, TO, TR, Bestsol, BestProfit end -"""Split a node in two. - -Args: \\ - - price (Vector{Integer}): prices of items to put in the KnapSack. \\ - - listvars (Vector{Vector{Integer}}): the current values of listvars. \\ - - listvals (Vector{Integer}): the current values of listvals. - -Returns: \\ - - listvars (Vector{Vector{Integer}}): the updated values of listvars. \\ - - listvals (Vector{Integer}): the updated values of listvals. -""" function SeparerNoeud_relaxlin(price, listvars, listvals) # Le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds - # Cas du noeud le plus à gauche - # On sépare le noeud actuel en 2 sous-noeuds predX = pop!(listvars) nextX0 = copy(predX) @@ -148,18 +102,6 @@ function SeparerNoeud_relaxlin(price, listvars, listvals) return listvars, listvals end -"""Pop node fom the list to explore another node. - -Args: \\ - - price (Vector{Integer}): prices of items to put in the KnapSack. \\ - - listvars (Vector{Vector{Integer}}): the current values of listvars. \\ - - listvals (Vector{Integer}): the current values of listvals. - -Returns: \\ - - listvars (Vector{Vector{Integer}}): the updated values of listvars. \\ - - listvals (Vector{Integer}): the updated values of listvals. \\ - - stop (Bool): true if the tree search is finished. -""" function ExplorerAutreNoeud_relaxlin(listvars, listvals) # Le noeud est sondable, on l'enlève de la pile des noeuds à sonder @@ -208,32 +150,34 @@ function AllDef(x) return true end -"""Solve the KnapSack problem for the data contained in `filename`. - -Args: \\ - - filename (String): the name of the file to read. - -Returns: \\ - - trParentnodes (Vector{Integer}): the parents nodes, to plot the tree. - - trChildnodes (Vector{Integer}): the child nodes, to plot the tree. - - trNamenodes (Vector{Integer}): the name of the nodes, to plot the tree. -""" function SolveKnapInstance(filename) stop = false - affich = false + affich = true # Extraction des données price, weight, capacity = readKnapInstance(filename) - if affich - println("Capacity : ", capacity, " | Number of objects : ", length(price), "\n") + tri = true + if tri + couples = zip(price, weight) + couples = sort(collect(couples), by = x -> x[1] / x[2]) + unzip(a) = map(x->getfield.(a, x), fieldnames(eltype(a))) + price, weight = unzip(couples) end - # Pour dessiner le graph - trParentnodes = Int64[] - trChildnodes = Int64[] - trNamenodes = [] + expected = split(split(filename, "-")[2], ".")[1] + nodes_nb = length(price) + nodes_max = 2^nodes_nb + + if affich + println("---", filename, "---") + println("Capacity = ", capacity) + println("Number of objects = ", nodes_nb) + println("Expected optimal value = ", expected) + println("Maximum number of nodes = ", nodes_max) + println() + end # Liste des variable pour naviguer de noeuds en noeuds listvars = [] @@ -242,6 +186,7 @@ function SolveKnapInstance(filename) # La meilleur solution et sa valeur BestProfit = -1 + LastBestProfit = -1 Bestsol = [] # Compter le nombre de noeud explorés @@ -251,7 +196,6 @@ function SolveKnapInstance(filename) push!(listvars, [-1 for p in price]) push!(listvals, Objective(last(listvars), price)) push!(listnodes, 1) - push!(trNamenodes, 0) newnodeid = 2 while (!stop) @@ -259,52 +203,40 @@ function SolveKnapInstance(filename) # Le noeud actuel x = last(listvars) - if affich && current_node_number % 10000 == 0 - println("----------\nNode n°", current_node_number, " :\n") - println("Previous Solution memorized ", " with bestprofit ", BestProfit, "\n") + if affich && LastBestProfit != BestProfit + println("Node n°", current_node_number, ": \tBestProfit = ", BestProfit) + LastBestProfit = BestProfit end # Test de sondabilité du noeud actuel # -> On mets a jour la solution et sa valeur si besoin - TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich) + TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, false) is_node_sondable = TA || TO || TR if (!is_node_sondable) # Le noeud n'est pas sondable, on le sépare en 2 sous-noeuds listvars, listvals = SeparerNoeud_relaxlin(price, listvars, listvals) - - curnode = pop!(listnodes) - - push!(trParentnodes, curnode) - push!(trParentnodes, curnode) - - push!(listnodes, newnodeid + 1) - push!(listnodes, newnodeid) - - push!(trChildnodes, newnodeid) - push!(trChildnodes, newnodeid + 1) - - push!(trNamenodes, newnodeid - 1) - push!(trNamenodes, newnodeid) - newnodeid += 2 - else # Le noeud est sondable, on passe au noeud suivant listvars, listvals, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals) - - pop!(listnodes) end current_node_number += 1 end - if affich - println("\n******\n\nOptimal value = ", BestProfit, "\n\nOptimal x = ", Bestsol) + println("\n--------------------------------------------------") + println("Expected optimal value = ", expected) + println("Optimal value = ", BestProfit) + println("Optimal x = ", Bestsol) + println("Maximum number of nodes = ", nodes_max) + println("Nodes explored = ", current_node_number) + if parse(Int64, expected) == BestProfit + return 0 + else + return 1 end - return trParentnodes, trChildnodes, trNamenodes end -trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance("data/circle/knapPI_16_10000_1000_5_-912198.opb") -# graphplot(trParentnodes, trChildnodes, names = trNamenodes, method = :tree) \ No newline at end of file +SolveKnapInstance(ARGS[1]) From a5fdac8a7a4217ad2ee91aa98a646d33efeda6ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Thu, 9 Dec 2021 12:03:00 +0100 Subject: [PATCH 15/21] =?UTF-8?q?fin=20de=20TP=20de=20m=C3=A9taprog=20mdr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- distrib.py | 2 +- notebook.ipynb | 139 +++++++------------------------------------------ 2 files changed, 21 insertions(+), 120 deletions(-) diff --git a/distrib.py b/distrib.py index c6ec638..4bba1f0 100644 --- a/distrib.py +++ b/distrib.py @@ -12,6 +12,6 @@ while len(result) > 0: knap = result.pop()[:-4] victime = machines[i % len(machines)] i+=1 - cmd = f"""ssh lfainsin@{victime} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" "cd 2A/RO/tp2/ && tmux new-session -d 'julia test.jl {knap}.opb > {knap}.stdout'" """ + cmd = f"""ssh lfainsin@{victime} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null" "cd 2A/RO/tp2/ && tmux new-session -d 'julia test.jl {knap}.opb > {knap}.stdout'" """ print(cmd) os.system(cmd) diff --git a/notebook.ipynb b/notebook.ipynb index a19819c..171bdbc 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -2042,12 +2042,16 @@ "\n", "## Notre implémentation\n", "\n", - "Pour l'implémentation de notre `branch and bound`, nous avons gardé la même même architecture que celle du sujet. Nous avons simplement ré-écrit les fonctions qui calculent la valeur objectif et la valeur de la capacité. \\\n", + "Pour l'implémentation de notre `branch and bound`, nous avons gardé la même même architecture que celle du sujet. Nous avons simplement ré-écrit les fonctions qui calculent la valeur objectif et la valeur de la capacité.\n", + "\n", "Notre vecteur de décision $x$ est tel que $x\\in\\{-1,0,1\\}^n$ avec $n$ le nombre d'objets disponibles. $1$ et $0$ représente, respectivement, un objet non-pris ou non-pris. La valeur $-1$ représente un objet ou la décision n'a pas encore été faite.\n", - "Dans la fonction `Objetive`, si la valeur est a $-1$, on fait comme-ci elle était à $1$ pourcalculer une borne supérieur. Dans la fonction `Constraints` les $-1$ sont concidéré comme des $0$ pour avoir une borne inférieur de notre problème. \\\n", + "Dans la fonction `Objetive`, si la valeur est a $-1$, on fait comme-ci elle était à $1$ pourcalculer une borne supérieur. Dans la fonction `Constraints` les $-1$ sont concidéré comme des $0$ pour avoir une borne inférieur de notre problème.\n", + "\n", "
\n", - "Pour l'exploration et la création de noeud, nous faisons une exploration des noeuds avec le plus de $1$ en premier. \\\n", - "Lorsque nous arrivons sur un noeud, nous l'enlevons de la pile des noeuds. Nous calculons ensuite si il est \"trivial\" ou si il dépasse déjà l'une des bornes ou si il est divisible. Dans le cas ou il est \"trivial\", nous calculons sa valeur et remplaçons la meilleure valeur si nécessaire. Dans le cas ou il dépasse une borne, nous l'abandonnons. Et enfin, si il est séparable, nous le séparons en deux en ajoutant la pile des noeuds les deux sous noeuds. \\\n", + "Pour l'exploration et la création de noeud, nous faisons une exploration des noeuds avec le plus de $1$ en premier.\n", + "\n", + "Lorsque nous arrivons sur un noeud, nous l'enlevons de la pile des noeuds. Nous calculons ensuite si il est \"trivial\" ou si il dépasse déjà l'une des bornes ou si il est divisible. Dans le cas ou il est \"trivial\", nous calculons sa valeur et remplaçons la meilleure valeur si nécessaire. Dans le cas ou il dépasse une borne, nous l'abandonnons. Et enfin, si il est séparable, nous le séparons en deux en ajoutant la pile des noeuds les deux sous noeuds.\n", + "\n", "Exemple : $[(0,-1,-1)]$ -> $[(0,0,-1) ; (0,1,-1)]$\n", "\n", "## Justification de nos résultats\n", @@ -2056,125 +2060,22 @@ "\n", "## Analyse\n", "\n", - "```\n", - "lfainsin@bonite:~/2A/RO/tp2$ time julia test.jl data/weakly_correlated/knapPI_2_50_1000_1_-1396.opb\n", - "---data/weakly_correlated/knapPI_2_50_1000_1_-1396.opb---\n", - "Capacity = 995\n", - "Number of objects = 50\n", - "Expected optimal value = 1396\n", - "Maximum number of nodes = 1125899906842624\n", + "Nous avaons réalisé les calcules de deux manières différentes :\n", "\n", - "Node n°96: BestProfit = 825\n", - "Node n°169: BestProfit = 844\n", - "Node n°243: BestProfit = 919\n", - "Node n°297: BestProfit = 943\n", - "Node n°1126: BestProfit = 946\n", - "Node n°1224: BestProfit = 1030\n", - "Node n°1456: BestProfit = 1045\n", - "Node n°2960: BestProfit = 1105\n", - "Node n°3342: BestProfit = 1120\n", - "Node n°4596: BestProfit = 1126\n", - "Node n°6129: BestProfit = 1207\n", - "Node n°10462: BestProfit = 1212\n", - "Node n°24382: BestProfit = 1278\n", - "Node n°418695: BestProfit = 1288\n", - "Node n°422566: BestProfit = 1308\n", - "Node n°436804: BestProfit = 1329\n", - "Node n°443759: BestProfit = 1337\n", - "Node n°446051: BestProfit = 1352\n", - "Node n°916081: BestProfit = 1360\n", - "Node n°1044425: BestProfit = 1396\n", + "- La première fois, nous mettions a jour les coordonnées de $x$ dans l'ordre des indices.\n", "\n", - "--------------------------------------------------\n", - "Expected optimal value = 1396\n", - "Optimal value = 1396\n", - "Optimal x = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]\n", - "Maximum number of nodes = 1125899906842624\n", - "Nodes explored = 3053865\n", + "- La deuxième fois, nous avons d'abbord trié les vecteurs `weight` et `price` par leur rapport $prix / poids$. Cela revient a mettre a jour les coordonnées de $x$ dans l'ordre du meilleur rapport $prix / poids$. (NB : le vecteur résultat n'est pas ré-ordonné comme l'était les `price` et `weight` initialement)\n", "\n", - "real 0m29,301s\n", - "user 0m29,372s\n", - "sys 0m0,809s\n", - "```\n", - "\n", - "```\n", - "lfainsin@bonite:~/2A/RO/tp2$ time julia test.jl data/weakly_correlated/knapPI_2_50_1000_1_-1396.opb\n", - "---data/weakly_correlated/knapPI_2_50_1000_1_-1396.opb---\n", - "Capacity = 995\n", - "Number of objects = 50\n", - "Expected optimal value = 1396\n", - "Maximum number of nodes = 1125899906842624\n", - "\n", - "Node n°93: BestProfit = 487\n", - "Node n°175: BestProfit = 626\n", - "Node n°293: BestProfit = 705\n", - "Node n°544: BestProfit = 810\n", - "Node n°1671: BestProfit = 815\n", - "Node n°1871: BestProfit = 836\n", - "Node n°2019: BestProfit = 872\n", - "Node n°2074: BestProfit = 886\n", - "Node n°3204: BestProfit = 918\n", - "Node n°4406: BestProfit = 950\n", - "Node n°4708: BestProfit = 952\n", - "Node n°4770: BestProfit = 978\n", - "Node n°8898: BestProfit = 990\n", - "Node n°9214: BestProfit = 1049\n", - "Node n°18160: BestProfit = 1059\n", - "Node n°18616: BestProfit = 1095\n", - "Node n°25906: BestProfit = 1099\n", - "Node n°27015: BestProfit = 1104\n", - "Node n°27130: BestProfit = 1119\n", - "Node n°27585: BestProfit = 1121\n", - "Node n°28076: BestProfit = 1125\n", - "Node n°43768: BestProfit = 1132\n", - "Node n°44203: BestProfit = 1134\n", - "Node n°59004: BestProfit = 1142\n", - "Node n°59465: BestProfit = 1144\n", - "Node n°59964: BestProfit = 1148\n", - "Node n°65923: BestProfit = 1154\n", - "Node n°66110: BestProfit = 1156\n", - "Node n°71779: BestProfit = 1186\n", - "Node n°71992: BestProfit = 1188\n", - "Node n°73054: BestProfit = 1190\n", - "Node n°73127: BestProfit = 1197\n", - "Node n°73146: BestProfit = 1241\n", - "Node n°152150: BestProfit = 1249\n", - "Node n°154060: BestProfit = 1251\n", - "Node n°179062: BestProfit = 1260\n", - "Node n°181638: BestProfit = 1261\n", - "Node n°181907: BestProfit = 1281\n", - "Node n°192060: BestProfit = 1298\n", - "Node n°202348: BestProfit = 1330\n", - "Node n°203862: BestProfit = 1341\n", - "Node n°206773: BestProfit = 1351\n", - "Node n°399253: BestProfit = 1365\n", - "Node n°619338: BestProfit = 1375\n", - "Node n°619695: BestProfit = 1377\n", - "Node n°842654: BestProfit = 1394\n", - "Node n°844341: BestProfit = 1396\n", - "\n", - "--------------------------------------------------\n", - "Expected optimal value = 1396\n", - "Optimal value = 1396\n", - "Optimal x = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1]\n", - "Maximum number of nodes = 1125899906842624\n", - "Nodes explored = 846447\n", - "\n", - "real 0m4,348s\n", - "user 0m4,480s\n", - "sys 0m0,747s\n", - "```\n", - "\n", - "Nous avaons réalisé les calcules de deux manières différentes : \\\n", - "La première fois, nous mettions a jour les coordonnées de $x$ dans l'ordre des indices. \\\n", - "La deuxième fois, nous avons d'abbord trié les vecteurs `weight` et `price` par leur rapport $prix / poids$. Cela revient a mettre a jour les coordonnées de $x$ dans l'ordre du meilleur rapport $prix / poids$. (NB : le vecteur résultat n'est pas ré-ordonné comme l'était les `price` et `weight` initialement) \\\n", - "
\n", "Pour le fichier `weakly_correlated/knapPI_2_50_1000_1_-1396`, nous avons comparé les résultats :\n", - "| Valeurs | Sans tri | Avec tri |\n", - "| :- | :- | :- |\n", - "| Optimal value | 1396 | 1396 |\n", - "| user | 29.372s | 4.480s |\n", - "| Nodes explored | 3053865 | 846447 |\n" + "```\n", + "| Valeurs | Sans tri | Avec tri |\n", + "| :------------- | :------- | :------- |\n", + "| Optimal value | 1396 | 1396 |\n", + "| Temps | 29.372 s | 4.480 s |\n", + "| Nodes explored | 3053865 | 846447 |\n", + "```\n", + "\n", + "\n" ] }, { From 0c68cbcfaaba230fa5e036c5600e00941e00cd8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Thu, 9 Dec 2021 15:43:05 +0100 Subject: [PATCH 16/21] feat: conversion de tous les .opb en .lp pour glpk --- .gitignore | 3 +++ distrib.py | 12 ++++++++++++ notebook.ipynb | 32 +++++++++++++++++++++++++++----- 3 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cd0d6d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.lp +*.stdout +*.sol diff --git a/distrib.py b/distrib.py index 4bba1f0..3545ad0 100644 --- a/distrib.py +++ b/distrib.py @@ -15,3 +15,15 @@ while len(result) > 0: cmd = f"""ssh lfainsin@{victime} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null" "cd 2A/RO/tp2/ && tmux new-session -d 'julia test.jl {knap}.opb > {knap}.stdout'" """ print(cmd) os.system(cmd) + +i = 0 +while len(result) > 0: + knap = result.pop()[:-4] + victime = machines[i % len(machines)] + i+=1 + cmd = f"""ssh lfainsin@{victime} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null" "cd 2A/RO/tp2/ && tmux new-session -d 'glpsol --lp {knap}.lp -o {knap}.sol'" """ + print(cmd) + os.system(cmd) + +# for machine in machines: +# os.system(f"""ssh lfainsin@{machine} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null" "tmux kill-server" """) diff --git a/notebook.ipynb b/notebook.ipynb index 171bdbc..17a5646 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -54,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -106,15 +106,38 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "# on teste de lire tous les fichiers .opb\n", + "# on convert tous les .opb en .lp pour les utiliser dans glpk\n", "for (root, dirs, files) in walkdir(\"data\")\n", " for file in files\n", " if endswith(file, \".opb\")\n", - " readKnapInstance(root * \"/\" * file)\n", + " price, weight, capacity = readKnapInstance(root * \"/\" * file)\n", + " filename = splitext(file)[1]\n", + " f = open(root * \"/\" * filename * \".lp\", \"w\");\n", + " write(f, \"Maximize\\n\")\n", + " write(f, \" Knap: \")\n", + " for (i, p) in enumerate(price)\n", + " write(f, \"+ \" * string(p) * \" obj\" * string(i) * \" \")\n", + " end\n", + " write(f, \"\\n\")\n", + "\n", + " write(f, \"\\nSubject To\\n\")\n", + " write(f, \" MaxKnap: \")\n", + " for (i, w) in enumerate(weight)\n", + " write(f, \"+ \" * string(w) * \" obj\" * string(i) * \" \")\n", + " end\n", + " write(f, \"\\n\")\n", + "\n", + " write(f, \"\\nBinary\\n\")\n", + " for (i, p) in enumerate(price)\n", + " write(f, \" obj\" * string(i) * \"\\n\")\n", + " end\n", + "\n", + " write(f, \"\\nEnd\\n\")\n", + " close(f)\n", " end\n", " end\n", "end" @@ -2047,7 +2070,6 @@ "Notre vecteur de décision $x$ est tel que $x\\in\\{-1,0,1\\}^n$ avec $n$ le nombre d'objets disponibles. $1$ et $0$ représente, respectivement, un objet non-pris ou non-pris. La valeur $-1$ représente un objet ou la décision n'a pas encore été faite.\n", "Dans la fonction `Objetive`, si la valeur est a $-1$, on fait comme-ci elle était à $1$ pourcalculer une borne supérieur. Dans la fonction `Constraints` les $-1$ sont concidéré comme des $0$ pour avoir une borne inférieur de notre problème.\n", "\n", - "
\n", "Pour l'exploration et la création de noeud, nous faisons une exploration des noeuds avec le plus de $1$ en premier.\n", "\n", "Lorsque nous arrivons sur un noeud, nous l'enlevons de la pile des noeuds. Nous calculons ensuite si il est \"trivial\" ou si il dépasse déjà l'une des bornes ou si il est divisible. Dans le cas ou il est \"trivial\", nous calculons sa valeur et remplaçons la meilleure valeur si nécessaire. Dans le cas ou il dépasse une borne, nous l'abandonnons. Et enfin, si il est séparable, nous le séparons en deux en ajoutant la pile des noeuds les deux sous noeuds.\n", From a52719c0c4a96e23c8130d514981a9e541f91be6 Mon Sep 17 00:00:00 2001 From: Laurent Fainsin Date: Thu, 9 Dec 2021 15:48:12 +0100 Subject: [PATCH 17/21] feat: ajout du glpk install script --- .gitignore | 1 + install_glpk.sh | 22 ++++++++++++++++++++++ notebook.ipynb | 5 +++-- 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100755 install_glpk.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d6e044a --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +solveurGLPK/ \ No newline at end of file diff --git a/install_glpk.sh b/install_glpk.sh new file mode 100755 index 0000000..beb7526 --- /dev/null +++ b/install_glpk.sh @@ -0,0 +1,22 @@ +mkdir solveurGLPK +cd solveurGLPK +mkdir sources +cd sources + +wget ftp://ftp.gnu.org/gnu/glpk/glpk-5.0.tar.gz +tar -xzvf glpk-5.0.tar.gz +cd glpk-5.0 + +./configure --disable-shared +make +#make --jobs=4 +make check + +cd ../.. +mkdir executables +cp sources/glpk-5.0/examples/glpsol executables/. +cp sources/glpk-5.0/doc/glpk.pdf executables/. +cp sources/glpk-5.0/doc/gmpl.pdf executables/. + +cd executables +./glpsol --help diff --git a/notebook.ipynb b/notebook.ipynb index a19819c..a21fd59 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -110,11 +110,12 @@ "metadata": {}, "outputs": [], "source": [ - "# on teste de lire tous les fichiers .opb\n", + "# on convert tous les .opb et .lp\n", "for (root, dirs, files) in walkdir(\"data\")\n", " for file in files\n", " if endswith(file, \".opb\")\n", - " readKnapInstance(root * \"/\" * file)\n", + " price, weight, capacity = readKnapInstance(root * \"/\" * file)\n", + " \n", " end\n", " end\n", "end" From 1bb77b7ec1c46ee27b18bb289a177ade1b9b2496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Thu, 9 Dec 2021 15:53:39 +0100 Subject: [PATCH 18/21] fix: broken notebook ;( --- notebook.ipynb | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/notebook.ipynb b/notebook.ipynb index a21fd59..df61f18 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -110,12 +110,34 @@ "metadata": {}, "outputs": [], "source": [ - "# on convert tous les .opb et .lp\n", + "# on convert tous les .opb en .lp pour les utiliser dans glpk\n", "for (root, dirs, files) in walkdir(\"data\")\n", " for file in files\n", " if endswith(file, \".opb\")\n", " price, weight, capacity = readKnapInstance(root * \"/\" * file)\n", - " \n", + " filename = splitext(file)[1]\n", + " f = open(root * \"/\" * filename * \".lp\", \"w\");\n", + " write(f, \"Maximize\\n\")\n", + " write(f, \" Knap: \")\n", + " for (i, p) in enumerate(price)\n", + " write(f, \"+ \" * string(p) * \" obj\" * string(i) * \" \")\n", + " end\n", + " write(f, \"\\n\")\n", + "\n", + " write(f, \"\\nSubject To\\n\")\n", + " write(f, \" MaxKnap: \")\n", + " for (i, w) in enumerate(weight)\n", + " write(f, \"+ \" * string(w) * \" obj\" * string(i) * \" \")\n", + " end\n", + " write(f, \"\\n\")\n", + "\n", + " write(f, \"\\nBinary\\n\")\n", + " for (i, p) in enumerate(price)\n", + " write(f, \" obj\" * string(i) * \"\\n\")\n", + " end\n", + "\n", + " write(f, \"\\nEnd\\n\")\n", + " close(f)\n", " end\n", " end\n", "end" From 0432661aeb8693b40f2840e20ea75fa73a2f1e42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Thu, 9 Dec 2021 16:43:14 +0100 Subject: [PATCH 19/21] feat: fin du projet ? --- distrib.py | 16 +- notebook.ipynb | 35071 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 33973 insertions(+), 1114 deletions(-) diff --git a/distrib.py b/distrib.py index 3545ad0..eb57e46 100644 --- a/distrib.py +++ b/distrib.py @@ -16,14 +16,14 @@ while len(result) > 0: print(cmd) os.system(cmd) -i = 0 -while len(result) > 0: - knap = result.pop()[:-4] - victime = machines[i % len(machines)] - i+=1 - cmd = f"""ssh lfainsin@{victime} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null" "cd 2A/RO/tp2/ && tmux new-session -d 'glpsol --lp {knap}.lp -o {knap}.sol'" """ - print(cmd) - os.system(cmd) +# i = 0 +# while len(result) > 0: +# knap = result.pop()[:-4] +# victime = machines[i % len(machines)] +# i+=1 +# cmd = f"""ssh lfainsin@{victime} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null" "cd 2A/RO/tp2/ && tmux new-session -d 'glpsol --lp {knap}.lp -o {knap}.sol'" """ +# print(cmd) +# os.system(cmd) # for machine in machines: # os.system(f"""ssh lfainsin@{machine} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null" "tmux kill-server" """) diff --git a/notebook.ipynb b/notebook.ipynb index df61f18..d0f038c 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -16,9 +16,22 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 14, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---data/subset_sum/knapPI_6_50_1000_1_-994.opb---\n", + "Capacity = 994\n", + "Number of objects = 50\n", + "Expected optimal value = 994\n", + "Maximum number of nodes = 1125899906842624\n", + "\n", + "Node n°0: \tBestProfit = -1\n" + ] + }, { "name": "stderr", "output_type": "stream", @@ -54,7 +67,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -106,41 +119,41 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ - "# on convert tous les .opb en .lp pour les utiliser dans glpk\n", - "for (root, dirs, files) in walkdir(\"data\")\n", - " for file in files\n", - " if endswith(file, \".opb\")\n", - " price, weight, capacity = readKnapInstance(root * \"/\" * file)\n", - " filename = splitext(file)[1]\n", - " f = open(root * \"/\" * filename * \".lp\", \"w\");\n", - " write(f, \"Maximize\\n\")\n", - " write(f, \" Knap: \")\n", - " for (i, p) in enumerate(price)\n", - " write(f, \"+ \" * string(p) * \" obj\" * string(i) * \" \")\n", - " end\n", - " write(f, \"\\n\")\n", + "# # on convert tous les .opb en .lp pour les utiliser dans glpk\n", + "# for (root, dirs, files) in walkdir(\"data\")\n", + "# for file in files\n", + "# if endswith(file, \".opb\")\n", + "# price, weight, capacity = readKnapInstance(root * \"/\" * file)\n", + "# filename = splitext(file)[1]\n", + "# f = open(root * \"/\" * filename * \".lp\", \"w\");\n", + "# write(f, \"Maximize\\n\")\n", + "# write(f, \" Knap: \")\n", + "# for (i, p) in enumerate(price)\n", + "# write(f, \"+ \" * string(p) * \" obj\" * string(i) * \" \")\n", + "# end\n", + "# write(f, \"\\n\")\n", "\n", - " write(f, \"\\nSubject To\\n\")\n", - " write(f, \" MaxKnap: \")\n", - " for (i, w) in enumerate(weight)\n", - " write(f, \"+ \" * string(w) * \" obj\" * string(i) * \" \")\n", - " end\n", - " write(f, \"\\n\")\n", + "# write(f, \"\\nSubject To\\n\")\n", + "# write(f, \" MaxKnap: \")\n", + "# for (i, w) in enumerate(weight)\n", + "# write(f, \"+ \" * string(w) * \" obj\" * string(i) * \" \")\n", + "# end\n", + "# write(f, \"<= \" * string(capacity) * \"\\n\")\n", "\n", - " write(f, \"\\nBinary\\n\")\n", - " for (i, p) in enumerate(price)\n", - " write(f, \" obj\" * string(i) * \"\\n\")\n", - " end\n", + "# write(f, \"\\nBinary\\n\")\n", + "# for (i, p) in enumerate(price)\n", + "# write(f, \" obj\" * string(i) * \"\\n\")\n", + "# end\n", "\n", - " write(f, \"\\nEnd\\n\")\n", - " close(f)\n", - " end\n", - " end\n", - "end" + "# write(f, \"\\nEnd\\n\")\n", + "# close(f)\n", + "# end\n", + "# end\n", + "# end" ] }, { @@ -152,13 +165,13 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "TestsSondabilite_relaxlin" + "TestsSondabilite" ] }, "metadata": {}, @@ -184,7 +197,7 @@ " - BestProfit (Integer): the updated value of BestProfit. \\\\\n", " - Bestsol (Vector{Integer}): the updated values of BestSol.\n", "\"\"\"\n", - "function TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich)\n", + "function TestsSondabilite(x, price, weight, capacity, BestProfit, Bestsol, affich)\n", " TA, TO, TR = false, false, false\n", "\n", " if (!Constraints(x, weight, capacity)) # Test de faisabilite\n", @@ -234,7 +247,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -303,13 +316,13 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "ExplorerAutreNoeud_relaxlin" + "ExplorerAutreNoeud" ] }, "metadata": {}, @@ -329,7 +342,7 @@ " - listvals (Vector{Integer}): the updated values of listvals. \\\\\n", " - stop (Bool): true if the tree search is finished.\n", "\"\"\"\n", - "function ExplorerAutreNoeud_relaxlin(listvars, listvals)\n", + "function ExplorerAutreNoeud(listvars, listvals)\n", " # Le noeud est sondable, on l'enlève de la pile des noeuds à sonder\n", "\n", " stop = false\n", @@ -355,7 +368,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -411,7 +424,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -438,12 +451,12 @@ "function SolveKnapInstance(filename)\n", "\n", " stop = false\n", - " affich = false\n", - " \n", + " affich = true\n", + "\n", " # Extraction des données\n", " price, weight, capacity = readKnapInstance(filename)\n", - " \n", - " tri = false\n", + "\n", + " tri = true\n", " if tri\n", " couples = zip(price, weight)\n", " couples = sort(collect(couples), by = x -> x[1] / x[2])\n", @@ -451,9 +464,17 @@ " price, weight = unzip(couples)\n", " end\n", "\n", + " expected = split(split(filename, \"-\")[2], \".\")[1]\n", + " nodes_nb = length(price)\n", + " nodes_max = 2^nodes_nb\n", + "\n", " if affich\n", - " println(\"Capacity : \", capacity, \" | Number of objects : \", length(price), \"\\n\")\n", - " end\n", + " println(\"---\", filename, \"---\")\n", + " println(\"Capacity = \", capacity)\n", + " println(\"Number of objects = \", nodes_nb)\n", + " println(\"Expected optimal value = \", expected)\n", + " println(\"Maximum number of nodes = \", nodes_max)\n", + " println() end\n", "\n", " # Pour dessiner le graph\n", " trParentnodes = Int64[]\n", @@ -485,18 +506,18 @@ " x = last(listvars)\n", "\n", " if affich && current_node_number % 10000 == 0\n", - " println(\"----------\\nNode n°\", current_node_number, \" :\\n\")\n", - " println(\"Previous Solution memorized \", \" with bestprofit \", BestProfit, \"\\n\")\n", + " println(\"Node n°\", current_node_number, \": \\tBestProfit = \", BestProfit)\n", + " LastBestProfit = BestProfit\n", " end\n", "\n", " # Test de sondabilité du noeud actuel\n", " # -> On mets a jour la solution et sa valeur si besoin\n", - " TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich)\n", + " TA, TO, TR, Bestsol, BestProfit = TestsSondabilite(x, price, weight, capacity, BestProfit, Bestsol, false)\n", "\n", " is_node_sondable = TA || TO || TR\n", " if (!is_node_sondable)\n", " # Le noeud n'est pas sondable, on le sépare en 2 sous-noeuds\n", - " listvars, listvals = SeparerNoeud_relaxlin(price, listvars, listvals)\n", + " listvars, listvals = SeparerNoeud(price, listvars, listvals)\n", "\n", " curnode = pop!(listnodes)\n", "\n", @@ -516,7 +537,7 @@ "\n", " else\n", " # Le noeud est sondable, on passe au noeud suivant\n", - " listvars, listvals, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals)\n", + " listvars, listvals, stop = ExplorerAutreNoeud(listvars, listvals)\n", "\n", " pop!(listnodes)\n", " end\n", @@ -524,9 +545,12 @@ " current_node_number += 1\n", " end\n", "\n", - " \n", - " println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x = \", Bestsol)\n", - " \n", + " println(\"\\n--------------------------------------------------\")\n", + " println(\"Expected optimal value = \", expected)\n", + " println(\"Optimal value = \", BestProfit)\n", + " println(\"Optimal x = \", Bestsol)\n", + " println(\"Maximum number of nodes = \", nodes_max)\n", + " println(\"Nodes explored = \", current_node_number) \n", " \n", " return trParentnodes, trChildnodes, trNamenodes\n", "end" @@ -534,25 +558,33 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "---data/weakly_correlated_span/knapPI_12_20_1000_1_-970.opb---\n", + "Capacity = 970\n", + "Number of objects = 20\n", + "Expected optimal value = 970\n", + "Maximum number of nodes = 1048576\n", "\n", - "******\n", + "Node n°0: \tBestProfit = -1\n", "\n", - "Optimal value = 2\n", - "\n", - "Optimal x = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n" + "--------------------------------------------------\n", + "Expected optimal value = 970\n", + "Optimal value = 970\n", + "Optimal x = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0]\n", + "Maximum number of nodes = 1048576\n", + "Nodes explored = 2637\n" ] }, { "data": { "text/plain": [ - "([1, 1, 2, 2, 5, 5, 7, 7, 9, 9 … 93, 93, 100, 100, 103, 103, 101, 101, 106, 106], [2, 3, 4, 5, 6, 7, 8, 9, 10, 11 … 100, 101, 102, 103, 104, 105, 106, 107, 108, 109], Any[0, 1, 2, 3, 4, 5, 6, 7, 8, 9 … 99, 100, 101, 102, 103, 104, 105, 106, 107, 108])" + "([1, 1, 2, 2, 5, 5, 6, 6, 9, 9 … 2623, 2623, 2621, 2621, 2630, 2630, 2631, 2631, 2634, 2634], [2, 3, 4, 5, 6, 7, 8, 9, 10, 11 … 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635, 2636, 2637], Any[0, 1, 2, 3, 4, 5, 6, 7, 8, 9 … 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635, 2636])" ] }, "metadata": {}, @@ -560,1455 +592,34318 @@ } ], "source": [ - "trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/test_perso/2max.opb\")\n", - "# trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/subset_sum/knapPI_6_50_1000_1_-994.opb\")" + "trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/weakly_correlated_span/knapPI_12_20_1000_1_-970.opb\")" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 30, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", - "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\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\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\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\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\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\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\n\n\n\n\n\n\n", + "image/png": "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", + "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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\n\n\n\n\n\n\n", "text/html": [ "\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", - "\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", - "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", - "\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", - "\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", - "\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", - "\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", - "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\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", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ] }, "metadata": {}, @@ -2019,39 +34914,6 @@ "graphplot(trParentnodes, trChildnodes, names = trNamenodes, method = :tree)" ] }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nombres de noeuds explorés : 109\n" - ] - } - ], - "source": [ - "println(\"nombres de noeuds explorés : \", length(trNamenodes))" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# # on teste de résoudre tous les fichiers .opb\n", - "# for (root, dirs, files) in walkdir(\"data\")\n", - "# for file in files\n", - "# if endswith(file, \".opb\")\n", - "# SolveKnapInstance(root * \"/\" * file)\n", - "# end\n", - "# end\n", - "# end" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -2065,9 +34927,9 @@ "\n", "## Notre implémentation\n", "\n", - "Pour l'implémentation de notre `branch and bound`, nous avons gardé la même même architecture que celle du sujet. Nous avons simplement ré-écrit les fonctions qui calculent la valeur objectif et la valeur de la capacité. \\\n", + "Pour l'implémentation de notre `branch and bound`, nous avons gardé la même architecture que celle du sujet. Nous avons simplement ré-écrit les fonctions qui calculent la valeur objectif et la valeur de la capacité. \\\n", "Notre vecteur de décision $x$ est tel que $x\\in\\{-1,0,1\\}^n$ avec $n$ le nombre d'objets disponibles. $1$ et $0$ représente, respectivement, un objet non-pris ou non-pris. La valeur $-1$ représente un objet ou la décision n'a pas encore été faite.\n", - "Dans la fonction `Objetive`, si la valeur est a $-1$, on fait comme-ci elle était à $1$ pourcalculer une borne supérieur. Dans la fonction `Constraints` les $-1$ sont concidéré comme des $0$ pour avoir une borne inférieur de notre problème. \\\n", + "Dans la fonction `Objetive`, si la valeur est a $-1$, on fait comme-ci elle était à $1$ pour calculer une borne supérieur. Dans la fonction `Constraints` les $-1$ sont concidéré comme des $0$ pour avoir une borne inférieur de notre problème. \\\n", "
\n", "Pour l'exploration et la création de noeud, nous faisons une exploration des noeuds avec le plus de $1$ en premier. \\\n", "Lorsque nous arrivons sur un noeud, nous l'enlevons de la pile des noeuds. Nous calculons ensuite si il est \"trivial\" ou si il dépasse déjà l'une des bornes ou si il est divisible. Dans le cas ou il est \"trivial\", nous calculons sa valeur et remplaçons la meilleure valeur si nécessaire. Dans le cas ou il dépasse une borne, nous l'abandonnons. Et enfin, si il est séparable, nous le séparons en deux en ajoutant la pile des noeuds les deux sous noeuds. \\\n", @@ -2075,7 +34937,7 @@ "\n", "## Justification de nos résultats\n", "\n", - "Notre algorithme trouve bien les solutions idéales (comme indiqué dans le nom du fichier). Pour le test `uncorrelated_span/knapPI_11_20_1000_1_-1428` Nous avons trouvé la valeur optimale qui est de `1428` en `2131` exploration de noeuds la ou un algorithme classique de parcours de l'ensemble des noeuds aurait exploré `1048576` noeuds.\n", + "Notre algorithme trouve bien les solutions idéales (comme indiqué dans le nom du fichier). Pour le test `uncorrelated_span/knapPI_11_20_1000_1_-1428` Nous avons trouvé la valeur optimale qui est de `1428` en `2131` exploration de noeuds là ou un algorithme classique de parcours de l'ensemble des noeuds aurait exploré `1048576` noeuds.\n", "\n", "## Analyse\n", "\n", @@ -2197,13 +35059,10 @@ "| :- | :- | :- |\n", "| Optimal value | 1396 | 1396 |\n", "| user | 29.372s | 4.480s |\n", - "| Nodes explored | 3053865 | 846447 |\n" + "| Nodes explored | 3053865 | 846447 |\n", + "\n", + "Il serait finalement possible d'optimiser encore plus notre algorithme en ne stockant que les changements de valeurs dans l'abre, au lieu de stocker le vecteurs $x$ en entier à chaque noeud de l'arbre." ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] } ], "metadata": { From e1018a3c0c7896264fa622fc1456d91b37d7e5ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Fri, 10 Dec 2021 11:07:22 +0100 Subject: [PATCH 20/21] feat: rajout comparaison glpk --- .gitignore | 3 +- distrib.py | 32 +++++------ notebook.ipynb | 146 ++++++++----------------------------------------- 3 files changed, 40 insertions(+), 141 deletions(-) diff --git a/.gitignore b/.gitignore index 99cba1d..fc991d4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ solveurGLPK/ +*.stdout_glpk +*.stdout_lp *.lp -*.stdout *.sol diff --git a/distrib.py b/distrib.py index eb57e46..353421f 100644 --- a/distrib.py +++ b/distrib.py @@ -1,29 +1,29 @@ -PATH = "data" - import os -result = [os.path.join(dp, f) for dp, dn, filenames in os.walk(PATH) for f in filenames if os.path.splitext(f)[1] == '.opb'] + +result = [os.path.join(dp, f) for dp, dn, filenames in os.walk("data") for f in filenames if os.path.splitext(f)[1] == '.opb'] with open("machines.txt") as file: - machines = file.readlines() - machines = [machine.rstrip() for machine in machines] - -i = 0 -while len(result) > 0: - knap = result.pop()[:-4] - victime = machines[i % len(machines)] - i+=1 - cmd = f"""ssh lfainsin@{victime} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null" "cd 2A/RO/tp2/ && tmux new-session -d 'julia test.jl {knap}.opb > {knap}.stdout'" """ - print(cmd) - os.system(cmd) + machines = [machine.rstrip() for machine in file.readlines()] # i = 0 # while len(result) > 0: # knap = result.pop()[:-4] # victime = machines[i % len(machines)] # i+=1 -# cmd = f"""ssh lfainsin@{victime} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null" "cd 2A/RO/tp2/ && tmux new-session -d 'glpsol --lp {knap}.lp -o {knap}.sol'" """ +# cmd = f"""ssh lfainsin@{victime} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null" "cd 2A/RO/tp2/ && tmux new-session -d 'julia test.jl {knap}.opb > {knap}.stdout_jl'" """ +# print(cmd) +# os.system(cmd) + +# i = 0 +# while len(result) > 0: +# knap = result.pop()[:-4] +# victime = machines[i % len(machines)] +# i+=1 +# cmd = f"""ssh lfainsin@{victime} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null" "cd 2A/RO/tp2/ && tmux new-session -d 'glpsol --lp {knap}.lp -o {knap}.sol > {knap}.stdout_lp'" """ # print(cmd) # os.system(cmd) # for machine in machines: -# os.system(f"""ssh lfainsin@{machine} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null" "tmux kill-server" """) +# cmd = f"""ssh lfainsin@{machine} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null" "tmux kill-server" """ +# print(cmd) +# os.system(cmd) diff --git a/notebook.ipynb b/notebook.ipynb index d0f038c..0b5ebb4 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -34928,140 +34928,38 @@ "## Notre implémentation\n", "\n", "Pour l'implémentation de notre `branch and bound`, nous avons gardé la même architecture que celle du sujet. Nous avons simplement ré-écrit les fonctions qui calculent la valeur objectif et la valeur de la capacité. \\\n", - "Notre vecteur de décision $x$ est tel que $x\\in\\{-1,0,1\\}^n$ avec $n$ le nombre d'objets disponibles. $1$ et $0$ représente, respectivement, un objet non-pris ou non-pris. La valeur $-1$ représente un objet ou la décision n'a pas encore été faite.\n", - "Dans la fonction `Objetive`, si la valeur est a $-1$, on fait comme-ci elle était à $1$ pour calculer une borne supérieur. Dans la fonction `Constraints` les $-1$ sont concidéré comme des $0$ pour avoir une borne inférieur de notre problème. \\\n", - "
\n", + "Notre vecteur de décision $x$ est tel que $x\\in\\{-1,0,1\\}^n$ avec $n$ le nombre d'objets disponibles. $1$ et $0$ représentent, respectivement, un objet pris ou non-pris. La valeur $-1$ représente un objet ou la décision n'a pas encore été faite. \\\n", + "Dans la fonction `Objective`, si la valeur est a $-1$, on fait comme-ci elle était à $1$ pour calculer une borne supérieur. Dans la fonction `Constraints` les $-1$ sont concidérés comme des $0$ pour avoir une borne inférieur de notre problème. \\\n", + "\n", "Pour l'exploration et la création de noeud, nous faisons une exploration des noeuds avec le plus de $1$ en premier. \\\n", - "Lorsque nous arrivons sur un noeud, nous l'enlevons de la pile des noeuds. Nous calculons ensuite si il est \"trivial\" ou si il dépasse déjà l'une des bornes ou si il est divisible. Dans le cas ou il est \"trivial\", nous calculons sa valeur et remplaçons la meilleure valeur si nécessaire. Dans le cas ou il dépasse une borne, nous l'abandonnons. Et enfin, si il est séparable, nous le séparons en deux en ajoutant la pile des noeuds les deux sous noeuds. \\\n", - "Exemple : $[(0,-1,-1)]$ -> $[(0,0,-1) ; (0,1,-1)]$\n", + "Lorsque nous arrivons sur un noeud, nous l'enlevons de la pile des noeuds. Nous calculons ensuite s'il est \"trivial\", s'il dépasse déjà l'une des bornes ou s'il est divisible.\n", + "- Dans le cas ou il est \"trivial\", nous calculons sa valeur et remplaçons la meilleure valeur si nécessaire.\n", + "- Dans le cas ou il dépasse une borne, nous l'abandonnons.\n", + "- Et enfin, si il est séparable, nous le séparons en deux en ajoutant la pile des noeuds les deux sous noeuds. Exemple : $[(0,-1,-1)]$ -> $[(0,0,-1) ; (0,1,-1)]$\n", "\n", "## Justification de nos résultats\n", "\n", - "Notre algorithme trouve bien les solutions idéales (comme indiqué dans le nom du fichier). Pour le test `uncorrelated_span/knapPI_11_20_1000_1_-1428` Nous avons trouvé la valeur optimale qui est de `1428` en `2131` exploration de noeuds là ou un algorithme classique de parcours de l'ensemble des noeuds aurait exploré `1048576` noeuds.\n", + "Notre algorithme trouve bien les solutions idéales. Pour le test `uncorrelated_span/knapPI_11_20_1000_1_-1428` Nous avons trouvé la valeur optimale qui est de `1428` en `2131` exploration de noeuds là ou un algorithme classique de parcours de l'ensemble des noeuds aurait exploré `1048576` noeuds, et ce sans dépasser la capacité maximale du sac bien evidemment.\n", "\n", "## Analyse\n", "\n", - "```\n", - "lfainsin@bonite:~/2A/RO/tp2$ time julia test.jl data/weakly_correlated/knapPI_2_50_1000_1_-1396.opb\n", - "---data/weakly_correlated/knapPI_2_50_1000_1_-1396.opb---\n", - "Capacity = 995\n", - "Number of objects = 50\n", - "Expected optimal value = 1396\n", - "Maximum number of nodes = 1125899906842624\n", + "Nous avaons réalisé les calculs de deux manières différentes:\n", + "- La première fois, nous mettions a jour les coordonnées de $x$ dans l'ordre des indices.\n", + "- La deuxième fois, nous avons d'abbord trié les vecteurs `weight` et `price` par leur rapport $prix / poids$. Cela revient à mettre à jour les coordonnées de $x$ dans l'ordre du meilleur rapport $prix / poids$. (NB : le vecteur résultat n'est pas ré-ordonné comme l'était les `price` et `weight` initialement)\n", "\n", - "Node n°96: BestProfit = 825\n", - "Node n°169: BestProfit = 844\n", - "Node n°243: BestProfit = 919\n", - "Node n°297: BestProfit = 943\n", - "Node n°1126: BestProfit = 946\n", - "Node n°1224: BestProfit = 1030\n", - "Node n°1456: BestProfit = 1045\n", - "Node n°2960: BestProfit = 1105\n", - "Node n°3342: BestProfit = 1120\n", - "Node n°4596: BestProfit = 1126\n", - "Node n°6129: BestProfit = 1207\n", - "Node n°10462: BestProfit = 1212\n", - "Node n°24382: BestProfit = 1278\n", - "Node n°418695: BestProfit = 1288\n", - "Node n°422566: BestProfit = 1308\n", - "Node n°436804: BestProfit = 1329\n", - "Node n°443759: BestProfit = 1337\n", - "Node n°446051: BestProfit = 1352\n", - "Node n°916081: BestProfit = 1360\n", - "Node n°1044425: BestProfit = 1396\n", - "\n", - "--------------------------------------------------\n", - "Expected optimal value = 1396\n", - "Optimal value = 1396\n", - "Optimal x = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]\n", - "Maximum number of nodes = 1125899906842624\n", - "Nodes explored = 3053865\n", - "\n", - "real 0m29,301s\n", - "user 0m29,372s\n", - "sys 0m0,809s\n", - "```\n", - "\n", - "```\n", - "lfainsin@bonite:~/2A/RO/tp2$ time julia test.jl data/weakly_correlated/knapPI_2_50_1000_1_-1396.opb\n", - "---data/weakly_correlated/knapPI_2_50_1000_1_-1396.opb---\n", - "Capacity = 995\n", - "Number of objects = 50\n", - "Expected optimal value = 1396\n", - "Maximum number of nodes = 1125899906842624\n", - "\n", - "Node n°93: BestProfit = 487\n", - "Node n°175: BestProfit = 626\n", - "Node n°293: BestProfit = 705\n", - "Node n°544: BestProfit = 810\n", - "Node n°1671: BestProfit = 815\n", - "Node n°1871: BestProfit = 836\n", - "Node n°2019: BestProfit = 872\n", - "Node n°2074: BestProfit = 886\n", - "Node n°3204: BestProfit = 918\n", - "Node n°4406: BestProfit = 950\n", - "Node n°4708: BestProfit = 952\n", - "Node n°4770: BestProfit = 978\n", - "Node n°8898: BestProfit = 990\n", - "Node n°9214: BestProfit = 1049\n", - "Node n°18160: BestProfit = 1059\n", - "Node n°18616: BestProfit = 1095\n", - "Node n°25906: BestProfit = 1099\n", - "Node n°27015: BestProfit = 1104\n", - "Node n°27130: BestProfit = 1119\n", - "Node n°27585: BestProfit = 1121\n", - "Node n°28076: BestProfit = 1125\n", - "Node n°43768: BestProfit = 1132\n", - "Node n°44203: BestProfit = 1134\n", - "Node n°59004: BestProfit = 1142\n", - "Node n°59465: BestProfit = 1144\n", - "Node n°59964: BestProfit = 1148\n", - "Node n°65923: BestProfit = 1154\n", - "Node n°66110: BestProfit = 1156\n", - "Node n°71779: BestProfit = 1186\n", - "Node n°71992: BestProfit = 1188\n", - "Node n°73054: BestProfit = 1190\n", - "Node n°73127: BestProfit = 1197\n", - "Node n°73146: BestProfit = 1241\n", - "Node n°152150: BestProfit = 1249\n", - "Node n°154060: BestProfit = 1251\n", - "Node n°179062: BestProfit = 1260\n", - "Node n°181638: BestProfit = 1261\n", - "Node n°181907: BestProfit = 1281\n", - "Node n°192060: BestProfit = 1298\n", - "Node n°202348: BestProfit = 1330\n", - "Node n°203862: BestProfit = 1341\n", - "Node n°206773: BestProfit = 1351\n", - "Node n°399253: BestProfit = 1365\n", - "Node n°619338: BestProfit = 1375\n", - "Node n°619695: BestProfit = 1377\n", - "Node n°842654: BestProfit = 1394\n", - "Node n°844341: BestProfit = 1396\n", - "\n", - "--------------------------------------------------\n", - "Expected optimal value = 1396\n", - "Optimal value = 1396\n", - "Optimal x = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1]\n", - "Maximum number of nodes = 1125899906842624\n", - "Nodes explored = 846447\n", - "\n", - "real 0m4,348s\n", - "user 0m4,480s\n", - "sys 0m0,747s\n", - "```\n", - "\n", - "Nous avaons réalisé les calcules de deux manières différentes : \\\n", - "La première fois, nous mettions a jour les coordonnées de $x$ dans l'ordre des indices. \\\n", - "La deuxième fois, nous avons d'abbord trié les vecteurs `weight` et `price` par leur rapport $prix / poids$. Cela revient a mettre a jour les coordonnées de $x$ dans l'ordre du meilleur rapport $prix / poids$. (NB : le vecteur résultat n'est pas ré-ordonné comme l'était les `price` et `weight` initialement) \\\n", - "
\n", "Pour le fichier `weakly_correlated/knapPI_2_50_1000_1_-1396`, nous avons comparé les résultats :\n", - "| Valeurs | Sans tri | Avec tri |\n", - "| :- | :- | :- |\n", - "| Optimal value | 1396 | 1396 |\n", - "| user | 29.372s | 4.480s |\n", - "| Nodes explored | 3053865 | 846447 |\n", + "| Valeurs | Sans tri | Avec tri |\n", + "| :------------- | :------- | :------- |\n", + "| Optimal value | 1396 | 1396 |\n", + "| Nodes explored | 3053865 | 846447 |\n", + "| time | 29.372s | 4.480s |\n", "\n", - "Il serait finalement possible d'optimiser encore plus notre algorithme en ne stockant que les changements de valeurs dans l'abre, au lieu de stocker le vecteurs $x$ en entier à chaque noeud de l'arbre." + "Il serait possible d'optimiser encore plus notre algorithme en ne stockant que les changements de valeurs dans l'abre, au lieu de stocker le vecteurs $x$ en entier à chaque noeud de l'arbre. Cela permetterait d'économiser pas mal de RAM.\n", + "\n", + "## Bonus: Comparaison avec GLPK\n", + "\n", + "La huitième cellule de ce notebook permet de convertir les `.opb` en `.lp`, et permet ainsi de résoudre les problèmes en utilisant GLPK.\n", + "Via les fichiers `test.jl` et `distrib.py` on lance sur toutes les machines de l'enseeiht (la nuit), la résolution de chaque problème via GLPK et via notre implémentation. On observe alors que l'on obtient la même valeur `Objective` optimale finale, de même le nombre de noeuds explorés par GLPK ainsi que son temps d'execution sont nettement inférieur à ceux de notre algorithme." ] } ], From 6e87639c544597e0d08a39a9854633956010d2bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Fri, 10 Dec 2021 11:24:14 +0100 Subject: [PATCH 21/21] feat: fin du projet ? --- notebook.ipynb | 34486 +---------------------------------------------- 1 file changed, 236 insertions(+), 34250 deletions(-) diff --git a/notebook.ipynb b/notebook.ipynb index 0b5ebb4..2ddbd64 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -16,41 +16,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---data/subset_sum/knapPI_6_50_1000_1_-994.opb---\n", - "Capacity = 994\n", - "Number of objects = 50\n", - "Expected optimal value = 994\n", - "Maximum number of nodes = 1125899906842624\n", - "\n", - "Node n°0: \tBestProfit = -1\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.7/Project.toml`\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.7/Manifest.toml`\n", - "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", - "\u001b[32m ✓ \u001b[39mTestOptinum\n", - " 1 dependency successfully precompiled in 2 seconds (262 already precompiled, 2 skipped during auto due to previous errors)\n", - "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.7/Project.toml`\n", - "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.7/Manifest.toml`\n", - "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", - "\u001b[32m ✓ \u001b[39mTestOptinum\n", - " 1 dependency successfully precompiled in 1 seconds (262 already precompiled, 2 skipped during auto due to previous errors)\n" - ] - } - ], + "outputs": [], "source": [ "import Pkg;\n", "Pkg.add(\"GraphRecipes\");\n", @@ -67,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -119,7 +87,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -165,7 +133,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -247,7 +215,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -316,7 +284,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -368,7 +336,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -424,7 +392,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -558,33 +526,33 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "---data/weakly_correlated_span/knapPI_12_20_1000_1_-970.opb---\n", - "Capacity = 970\n", - "Number of objects = 20\n", - "Expected optimal value = 970\n", - "Maximum number of nodes = 1048576\n", + "---data/test-65.opb---\n", + "Capacity = 10\n", + "Number of objects = 4\n", + "Expected optimal value = 65\n", + "Maximum number of nodes = 16\n", "\n", "Node n°0: \tBestProfit = -1\n", "\n", "--------------------------------------------------\n", - "Expected optimal value = 970\n", - "Optimal value = 970\n", - "Optimal x = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0]\n", - "Maximum number of nodes = 1048576\n", - "Nodes explored = 2637\n" + "Expected optimal value = 65\n", + "Optimal value = 65\n", + "Optimal x = [0, 1, 0, 1]\n", + "Maximum number of nodes = 16\n", + "Nodes explored = 23\n" ] }, { "data": { "text/plain": [ - "([1, 1, 2, 2, 5, 5, 6, 6, 9, 9 … 2623, 2623, 2621, 2621, 2630, 2630, 2631, 2631, 2634, 2634], [2, 3, 4, 5, 6, 7, 8, 9, 10, 11 … 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635, 2636, 2637], Any[0, 1, 2, 3, 4, 5, 6, 7, 8, 9 … 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635, 2636])" + "([1, 1, 2, 2, 4, 4, 7, 7, 5, 5 … 3, 3, 14, 14, 17, 17, 15, 15, 20, 20], [2, 3, 4, 5, 6, 7, 8, 9, 10, 11 … 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], Any[0, 1, 2, 3, 4, 5, 6, 7, 8, 9 … 13, 14, 15, 16, 17, 18, 19, 20, 21, 22])" ] }, "metadata": {}, @@ -592,34318 +560,336 @@ } ], "source": [ - "trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/weakly_correlated_span/knapPI_12_20_1000_1_-970.opb\")" + "trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/test-65.opb\")" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 10, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", - "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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\n\n\n\n\n\n\n", + "image/png": "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", + "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\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", "text/html": [ "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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", - "\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" ] }, "metadata": {}, @@ -34911,7 +897,7 @@ } ], "source": [ - "graphplot(trParentnodes, trChildnodes, names = trNamenodes, method = :tree)" + "# graphplot(trParentnodes, trChildnodes, names = trNamenodes, method = :tree)" ] }, { @@ -34959,7 +945,7 @@ "## Bonus: Comparaison avec GLPK\n", "\n", "La huitième cellule de ce notebook permet de convertir les `.opb` en `.lp`, et permet ainsi de résoudre les problèmes en utilisant GLPK.\n", - "Via les fichiers `test.jl` et `distrib.py` on lance sur toutes les machines de l'enseeiht (la nuit), la résolution de chaque problème via GLPK et via notre implémentation. On observe alors que l'on obtient la même valeur `Objective` optimale finale, de même le nombre de noeuds explorés par GLPK ainsi que son temps d'execution sont nettement inférieur à ceux de notre algorithme." + "Via les fichiers `test.jl` et `distrib.py` on lance sur toutes les machines de l'enseeiht (la nuit), la résolution de chaque problème via GLPK et via notre implémentation. On observe alors que GLPK obtient la même valeur optimale finale que notre implémentation, cependant le nombre de noeuds explorés par GLPK ainsi que son temps d'exécution sont nettement inférieur à ceux de notre algorithme." ] } ],