diff --git a/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/.ipynb_checkpoints/Untitled-checkpoint.ipynb new file mode 100644 index 0000000..4e4b89a --- /dev/null +++ b/.ipynb_checkpoints/Untitled-checkpoint.ipynb @@ -0,0 +1,649 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "data (generic function with 2 methods)" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function data(a=0.5)\n", + " a = a\n", + "\t\tna = 3\n", + "\t\tnc = 4\n", + "\t\tns = 4\n", + "\t\tnss = 16\n", + "\t\tz1 = ones(4)\n", + "\t\tz2 = [0.72, 0.92, 1.12, 1.32]\n", + "\t\tz3 = [0.86, 0.96, 1.06, 1.16]\n", + " z = [16, 3]\n", + " z = [[1, i, j] for i in z2 for j in z3] # All possible payoffs\n", + " z = vcat(z'...)\n", + "\t\tp = ones(3)\n", + "\t\tpi = 1/16\n", + "\t\te = [2, 0, 0]\n", + "\n", + "\t\treturn Dict(\"a\"=>a,\"na\"=>na,\"nc\"=>nc,\"ns\"=>ns,\"nss\"=>nss,\"e\"=>e,\"p\"=>p,\"z\"=>z,\"pi\"=>pi)\n", + "end\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Dict{String,Any} with 9 entries:\n", + " \"na\" => 3\n", + " \"e\" => [2, 0, 0]\n", + " \"ns\" => 4\n", + " \"nc\" => 4\n", + " \"nss\" => 16\n", + " \"z\" => [1.0 0.72 0.86; 1.0 0.72 0.96; … ; 1.0 1.32 1.06; 1.0 1.32 1.16]\n", + " \"a\" => 0.5\n", + " \"p\" => [1.0, 1.0, 1.0]\n", + " \"pi\" => 0.0625" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d = data()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "┌ Info: Recompiling stale cache file C:\\Users\\lorenzo\\.julia\\compiled\\v1.1\\NLopt\\faRdv.ji for NLopt [76087f3c-5699-56af-9a33-bf431cd00edd]\n", + "└ @ Base loading.jl:1184\n" + ] + } + ], + "source": [ + "using NLopt" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "u (generic function with 1 method)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function u(x, data::Dict)\n", + " -exp(-data[\"a\"].*x)\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "obj (generic function with 1 method)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function obj(x::Vector, grad::Vector, data::Dict)\n", + " a = data[\"a\"]\n", + " z = data[\"z\"]\n", + " if length(grad) > 0\n", + " grad[1] = -a * u(x[1], data)\n", + " for i in 1:3\n", + " grad[i+1] = -a .* sum(data[\"pi\"] .* z[:, i] .* u.(z * x[2:end], Ref(data)))\n", + " end\n", + "end \n", + " return u(x[1], data) + sum(data[\"pi\"] .* u.(z * x[2:end], Ref(data)))\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4-element Array{Float64,1}:\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grad = zeros(4)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-0.8280607425183014" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "obj(ones(4), grad, d)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4-element Array{Float64,1}:\n", + " 0.3032653298563167 \n", + " 0.11076504140283401\n", + " 0.11021903217359377\n", + " 0.11118090020589945" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grad" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "constr (generic function with 1 method)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function constr(x::Vector,grad::Vector,data::Dict)\n", + " if length(grad) > 0\n", + " grad[1] = 1\n", + " grad[2:end] = d[\"p\"]\n", + " end\n", + " return x[1] + sum(d[\"p\"] .* (x[2:end] .- d[\"e\"]))\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.0" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "constr(ones(4), zeros(4), d)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "max_NLopt (generic function with 2 methods)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function max_NLopt(a=0.5)\n", + " d = data(a)\n", + " opt = Opt(:LD_MMA, 4)\n", + " lower_bounds!(opt, [0, -Inf, -Inf, -Inf]) # As cannot sell more then initial endowment\n", + " max_objective!(opt, (x,g) -> obj(x,g, d))\n", + " inequality_constraint!(opt, (x, g) -> constr(x, g, d))\n", + " ftol_rel!(opt, 1e-9)\n", + " NLopt.optimize(opt, [0,2,0,0])\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(-1.2082140916618629, [1.00797, -1.41217, 0.801299, 1.6029], :FTOL_REACHED)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "max_NLopt()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "┌ Info: Recompiling stale cache file C:\\Users\\lorenzo\\.julia\\compiled\\v1.1\\DataFrames\\AR9oZ.ji for DataFrames [a93c6f00-e57d-5684-b7b6-d8193f3e46c0]\n", + "└ @ Base loading.jl:1184\n" + ] + } + ], + "source": [ + "using DataFrames" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "table_NLopt (generic function with 1 method)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function table_NLopt()\n", + "\t\td = DataFrame(a=[0.5;1.0;5.0],c = zeros(3),omega1=zeros(3),omega2=zeros(3),omega3=zeros(3),fval=zeros(3))\n", + "\t\tfor i in 1:nrow(d)\n", + "\t\t\txx = max_NLopt(d[i,:a])\n", + "\t\t\tfor j in 2:ncol(d)-1\n", + "\t\t\t\td[i,j] = xx[2][j-1]\n", + "\t\t\tend\n", + "\t\t\td[i,end] = xx[1]\n", + "\t\tend\n", + "\t\treturn d\n", + "\tend" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

3 rows × 6 columns

acomega1omega2omega3fval
Float64Float64Float64Float64Float64Float64
10.51.00797-1.412170.8012991.6029-1.20821
21.01.00401-0.2058670.4006890.801171-0.732819
35.01.00080.7587930.08014450.160263-0.013422
" + ], + "text/latex": [ + "\\begin{tabular}{r|cccccc}\n", + "\t& a & c & omega1 & omega2 & omega3 & fval\\\\\n", + "\t\\hline\n", + "\t& Float64 & Float64 & Float64 & Float64 & Float64 & Float64\\\\\n", + "\t\\hline\n", + "\t1 & 0.5 & 1.00797 & -1.41217 & 0.801299 & 1.6029 & -1.20821 \\\\\n", + "\t2 & 1.0 & 1.00401 & -0.205867 & 0.400689 & 0.801171 & -0.732819 \\\\\n", + "\t3 & 5.0 & 1.0008 & 0.758793 & 0.0801445 & 0.160263 & -0.013422 \\\\\n", + "\\end{tabular}\n" + ], + "text/plain": [ + "3×6 DataFrame\n", + "│ Row │ a │ c │ omega1 │ omega2 │ omega3 │ fval │\n", + "│ │ \u001b[90mFloat64\u001b[39m │ \u001b[90mFloat64\u001b[39m │ \u001b[90mFloat64\u001b[39m │ \u001b[90mFloat64\u001b[39m │ \u001b[90mFloat64\u001b[39m │ \u001b[90mFloat64\u001b[39m │\n", + "├─────┼─────────┼─────────┼───────────┼───────────┼──────────┼───────────┤\n", + "│ 1 │ 0.5 │ 1.00797 │ -1.41217 │ 0.801299 │ 1.6029 │ -1.20821 │\n", + "│ 2 │ 1.0 │ 1.00401 │ -0.205867 │ 0.400689 │ 0.801171 │ -0.732819 │\n", + "│ 3 │ 5.0 │ 1.0008 │ 0.758793 │ 0.0801445 │ 0.160263 │ -0.013422 │" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "table_NLopt()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `C:\\Users\\lorenzo\\.julia\\registries\\General`\n", + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m git-repo `https://github.com/JuliaRegistries/General.git`\n", + "\u001b[2K\u001b[?25h[1mFetching:\u001b[22m\u001b[39m [========================================>] 100.0 %.0 %1 %.7 %92.7 %\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m ZipFile ────── v0.8.1\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m CSVFiles ───── v0.15.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m PyCall ─────── v1.91.1\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m FileIO ─────── v1.0.6\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m TextParse ──── v0.9.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Clustering ─── v0.13.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m DoubleFloats ─ v0.7.18\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Documenter ─── v0.22.0\n", + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m `C:\\Users\\lorenzo\\.julia\\environments\\v1.1\\Project.toml`\n", + " \u001b[90m [49dc2e85]\u001b[39m\u001b[92m + Calculus v0.4.1\u001b[39m\n", + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m `C:\\Users\\lorenzo\\.julia\\environments\\v1.1\\Manifest.toml`\n", + " \u001b[90m [5d742f6a]\u001b[39m\u001b[93m ↑ CSVFiles v0.14.0 ⇒ v0.15.0\u001b[39m\n", + " \u001b[90m [aaaa29a8]\u001b[39m\u001b[93m ↑ Clustering v0.12.4 ⇒ v0.13.0\u001b[39m\n", + " \u001b[90m [e30172f5]\u001b[39m\u001b[93m ↑ Documenter v0.21.5 ⇒ v0.22.0\u001b[39m\n", + " \u001b[90m [497a8b3b]\u001b[39m\u001b[93m ↑ DoubleFloats v0.7.17 ⇒ v0.7.18\u001b[39m\n", + " \u001b[90m [5789e2e9]\u001b[39m\u001b[93m ↑ FileIO v1.0.5 ⇒ v1.0.6\u001b[39m\n", + " \u001b[90m [14197337]\u001b[39m\u001b[91m - GenericLinearAlgebra v0.1.0\u001b[39m\n", + " \u001b[90m [01680d73]\u001b[39m\u001b[92m + GenericSVD v0.2.1\u001b[39m\n", + " \u001b[90m [438e738f]\u001b[39m\u001b[93m ↑ PyCall v1.91.0 ⇒ v1.91.1\u001b[39m\n", + " \u001b[90m [e0df1984]\u001b[39m\u001b[93m ↑ TextParse v0.8.0 ⇒ v0.9.0\u001b[39m\n", + " \u001b[90m [a5390f91]\u001b[39m\u001b[93m ↑ ZipFile v0.8.0 ⇒ v0.8.1\u001b[39m\n", + "\u001b[32m\u001b[1m Building\u001b[22m\u001b[39m PyCall ─→ `C:\\Users\\lorenzo\\.julia\\packages\\PyCall\\a5Jd3\\deps\\build.log`\n", + "\u001b[32m\u001b[1m Building\u001b[22m\u001b[39m ZipFile → `C:\\Users\\lorenzo\\.julia\\packages\\ZipFile\\YHTbb\\deps\\build.log`\n" + ] + } + ], + "source": [ + "import Pkg; Pkg.add(\"Calculus\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "┌ Info: Recompiling stale cache file C:\\Users\\lorenzo\\.julia\\compiled\\v1.1\\Calculus\\G3wEN.ji for Calculus [49dc2e85-a5d0-5ad3-a950-438e2897f1b9]\n", + "└ @ Base loading.jl:1184\n" + ] + } + ], + "source": [ + "using Calculus" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4-element Array{Float64,1}:\n", + " 0.3032653298574901 \n", + " 0.11076504140290903\n", + " 0.11021903217009567\n", + " 0.11118090021276408" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Calculus.gradient(arg -> obj(arg, zeros(4), d), ones(4))" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "┌ Info: Recompiling stale cache file C:\\Users\\lorenzo\\.julia\\compiled\\v1.1\\JuMP\\DmXqY.ji for JuMP [4076af6c-e467-56ae-b986-b466b2749572]\n", + "└ @ Base loading.jl:1184\n", + "┌ Info: Recompiling stale cache file C:\\Users\\lorenzo\\.julia\\compiled\\v1.1\\Ipopt\\yMQMo.ji for Ipopt [b6b21f68-93f8-5de0-b562-5493be1d77c9]\n", + "└ @ Base loading.jl:1184\n" + ] + } + ], + "source": [ + "using JuMP\n", + "using Ipopt" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[32m\u001b[1m Status\u001b[22m\u001b[39m `C:\\Users\\lorenzo\\.julia\\environments\\v1.1\\Project.toml`\n", + " \u001b[90m [aae01518]\u001b[39m\u001b[37m BandedMatrices v0.8.1\u001b[39m\n", + " \u001b[90m [6e4b80f9]\u001b[39m\u001b[37m BenchmarkTools v0.4.2\u001b[39m\n", + " \u001b[90m [a134a8b2]\u001b[39m\u001b[37m BlackBoxOptim v0.4.0\u001b[39m\n", + " \u001b[90m [49dc2e85]\u001b[39m\u001b[37m Calculus v0.4.1\u001b[39m\n", + " \u001b[90m [324d7699]\u001b[39m\u001b[37m CategoricalArrays v0.5.2\u001b[39m\n", + " \u001b[90m [3da002f7]\u001b[39m\u001b[37m ColorTypes v0.7.5\u001b[39m\n", + " \u001b[90m [34da2185]\u001b[39m\u001b[37m Compat v1.4.0\u001b[39m\n", + " \u001b[90m [a93c6f00]\u001b[39m\u001b[37m DataFrames v0.17.0\u001b[39m\n", + " \u001b[90m [1313f7d8]\u001b[39m\u001b[37m DataFramesMeta v0.4.0\u001b[39m\n", + " \u001b[90m [5721bf48]\u001b[39m\u001b[37m DataVoyager v0.3.1\u001b[39m\n", + " \u001b[90m [01453d9d]\u001b[39m\u001b[37m DiffEqDiffTools v0.7.1\u001b[39m\n", + " \u001b[90m [31c24e10]\u001b[39m\u001b[37m Distributions v0.16.4\u001b[39m\n", + " \u001b[90m [63b64609]\u001b[39m\u001b[37m ExamplePackage v0.1.0 [`..\\..\\dev\\ExamplePackage`]\u001b[39m\n", + " \u001b[90m [2fe49d83]\u001b[39m\u001b[37m Expectations v1.0.2\u001b[39m\n", + " \u001b[90m [442a2c76]\u001b[39m\u001b[37m FastGaussQuadrature v0.3.2\u001b[39m\n", + " \u001b[90m [1a297f60]\u001b[39m\u001b[37m FillArrays v0.4.0\u001b[39m\n", + " \u001b[90m [9d5cd8c9]\u001b[39m\u001b[37m FixedEffectModels v0.7.1\u001b[39m\n", + " \u001b[90m [587475ba]\u001b[39m\u001b[37m Flux v0.7.1\u001b[39m\n", + " \u001b[90m [f6369f11]\u001b[39m\u001b[37m ForwardDiff v0.10.2\u001b[39m\n", + " \u001b[90m [38e38edf]\u001b[39m\u001b[37m GLM v1.1.0\u001b[39m\n", + " \u001b[90m [28b8d3ca]\u001b[39m\u001b[37m GR v0.37.0\u001b[39m\n", + " \u001b[90m [2aa259a0]\u001b[39m\u001b[37m HWconstrained v0.1.0 [`C:\\Users\\lorenzo\\.julia\\dev\\HWconstrained`]\u001b[39m\n", + " \u001b[90m [d8de2c54]\u001b[39m\u001b[37m HWunconstrained v0.1.0 [`C:\\Users\\lorenzo\\.julia\\dev\\HWunconstrained`]\u001b[39m\n", + " \u001b[90m [7073ff75]\u001b[39m\u001b[37m IJulia v1.16.0\u001b[39m\n", + " \u001b[90m [43edad99]\u001b[39m\u001b[37m InstantiateFromURL v0.2.1\u001b[39m\n", + " \u001b[90m [a98d9a8b]\u001b[39m\u001b[37m Interpolations v0.11.1\u001b[39m\n", + " \u001b[90m [b6b21f68]\u001b[39m\u001b[37m Ipopt v0.5.1\u001b[39m\n", + " \u001b[90m [4076af6c]\u001b[39m\u001b[37m JuMP v0.18.5\u001b[39m\n", + " \u001b[90m [e5e0dc1b]\u001b[39m\u001b[37m Juno v0.5.5\u001b[39m\n", + " \u001b[90m [5ab0869b]\u001b[39m\u001b[37m KernelDensity v0.5.1\u001b[39m\n", + " \u001b[90m [b964fa9f]\u001b[39m\u001b[37m LaTeXStrings v1.0.3\u001b[39m\n", + " \u001b[90m [23fbe1c1]\u001b[39m\u001b[37m Latexify v0.6.0\u001b[39m\n", + " \u001b[90m [5078a376]\u001b[39m\u001b[37m LazyArrays v0.5.1\u001b[39m\n", + " \u001b[90m [0fc2ff8b]\u001b[39m\u001b[37m LeastSquaresOptim v0.7.1\u001b[39m\n", + " \u001b[90m [093fc24a]\u001b[39m\u001b[37m LightGraphs v1.2.0\u001b[39m\n", + " \u001b[90m [76087f3c]\u001b[39m\u001b[37m NLopt v0.5.1\u001b[39m\n", + " \u001b[90m [2774e3e8]\u001b[39m\u001b[37m NLsolve v3.0.1\u001b[39m\n", + " \u001b[90m [429524aa]\u001b[39m\u001b[37m Optim v0.17.2\u001b[39m\n", + " \u001b[90m [d96e819e]\u001b[39m\u001b[37m Parameters v0.10.3\u001b[39m\n", + " \u001b[90m [14b8a8f1]\u001b[39m\u001b[37m PkgTemplates v0.4.1\u001b[39m\n", + " \u001b[90m [91a5bcdd]\u001b[39m\u001b[37m Plots v0.23.0\u001b[39m\n", + " \u001b[90m [f27b6e38]\u001b[39m\u001b[37m Polynomials v0.5.2\u001b[39m\n", + " \u001b[90m [92933f4c]\u001b[39m\u001b[37m ProgressMeter v0.9.0\u001b[39m\n", + " \u001b[90m [1fd47b50]\u001b[39m\u001b[37m QuadGK v2.0.3\u001b[39m\n", + " \u001b[90m [fcd29c91]\u001b[39m\u001b[37m QuantEcon v0.15.0\u001b[39m\n", + " \u001b[90m [1a8c2f83]\u001b[39m\u001b[37m Query v0.10.1\u001b[39m\n", + " \u001b[90m [612083be]\u001b[39m\u001b[37m Queryverse v0.2.0\u001b[39m\n", + " \u001b[90m [ce6b1742]\u001b[39m\u001b[37m RDatasets v0.6.1\u001b[39m\n", + " \u001b[90m [d519eb52]\u001b[39m\u001b[37m RegressionTables v0.2.0\u001b[39m\n", + " \u001b[90m [295af30f]\u001b[39m\u001b[37m Revise v1.0.2\u001b[39m\n", + " \u001b[90m [f2b01f46]\u001b[39m\u001b[37m Roots v0.7.4\u001b[39m\n", + " \u001b[90m [60ddc479]\u001b[39m\u001b[37m StatPlots v0.9.2\u001b[39m\n", + " \u001b[90m [90137ffa]\u001b[39m\u001b[37m StaticArrays v0.10.2\u001b[39m\n", + " \u001b[90m [2913bbd2]\u001b[39m\u001b[37m StatsBase v0.27.0\u001b[39m\n", + " \u001b[90m [3eaba693]\u001b[39m\u001b[37m StatsModels v0.5.0\u001b[39m\n", + " \u001b[90m [37b6cedf]\u001b[39m\u001b[37m Traceur v0.2.1\u001b[39m\n", + " \u001b[90m [0ae4a718]\u001b[39m\u001b[37m VegaDatasets v0.5.0\u001b[39m\n", + " \u001b[90m [112f6efa]\u001b[39m\u001b[37m VegaLite v0.5.2\u001b[39m\n", + " \u001b[90m [37e2e46d]\u001b[39m\u001b[37m LinearAlgebra \u001b[39m\n", + " \u001b[90m [3fa0cd96]\u001b[39m\u001b[37m REPL \u001b[39m\n", + " \u001b[90m [9a3f8284]\u001b[39m\u001b[37m Random \u001b[39m\n", + " \u001b[90m [2f01184e]\u001b[39m\u001b[37m SparseArrays \u001b[39m\n", + " \u001b[90m [10745b16]\u001b[39m\u001b[37m Statistics \u001b[39m\n", + " \u001b[90m [8dfed614]\u001b[39m\u001b[37m Test \u001b[39m\n" + ] + } + ], + "source": [ + "] st" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "ename": "UndefVarError", + "evalue": "UndefVarError: with_optimizer not defined", + "output_type": "error", + "traceback": [ + "UndefVarError: with_optimizer not defined", + "", + "Stacktrace:", + " [1] max_JuMP(::Float64) at .\\In[33]:3", + " [2] max_JuMP() at .\\In[33]:2", + " [3] top-level scope at In[33]:11" + ] + } + ], + "source": [ + "function max_JuMP(a=0.5)\n", + "\t\td = data(a)\n", + "\t\tm = Model(with_optimizer(Ipopt.Optimizer))\n", + "\t\t@variable(m, c >= 0)\n", + "\t\t@variable(m, x[1:3])\n", + "\t\t@NLconstraint(m, c + sum(d[\"p\"][i] * (x[i] - d[\"e\"][i]) for i in 1:3) == 0)\n", + "\t\t@NLobjective(m, Max, -exp(-a * c) + sum(-exp(-a * sum(d[\"za\"]'[j][i] * x[i] for i in 1:3)) * d[\"pi\"][j] for j in 1:16))\n", + "\t\tJuMP.optimize!(m)\n", + "\t\treturn Dict(\"obj\"=>objective_value(m),\"c\"=>value(c),\"omegas\"=>[value(x[i]) for i in 1:length(x)])\n", + "\tend\n", + "max_JuMP()" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "ename": "LoadError", + "evalue": "syntax: unexpected \"]\"", + "output_type": "error", + "traceback": [ + "syntax: unexpected \"]\"", + "" + ] + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.1.0", + "language": "julia", + "name": "julia-1.1" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.1.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Project.toml b/Project.toml index a987f1f..b63824c 100644 --- a/Project.toml +++ b/Project.toml @@ -3,6 +3,13 @@ uuid = "2aa259a0-4d4c-11e9-0909-ad9b1ef308f5" authors = ["florian oswald "] version = "0.1.0" +[deps] +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +Ipopt = "b6b21f68-93f8-5de0-b562-5493be1d77c9" +JuMP = "4076af6c-e467-56ae-b986-b466b2749572" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +NLopt = "76087f3c-5699-56af-9a33-bf431cd00edd" + [extras] Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" diff --git a/Untitled.ipynb b/Untitled.ipynb new file mode 100644 index 0000000..4e4b89a --- /dev/null +++ b/Untitled.ipynb @@ -0,0 +1,649 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "data (generic function with 2 methods)" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function data(a=0.5)\n", + " a = a\n", + "\t\tna = 3\n", + "\t\tnc = 4\n", + "\t\tns = 4\n", + "\t\tnss = 16\n", + "\t\tz1 = ones(4)\n", + "\t\tz2 = [0.72, 0.92, 1.12, 1.32]\n", + "\t\tz3 = [0.86, 0.96, 1.06, 1.16]\n", + " z = [16, 3]\n", + " z = [[1, i, j] for i in z2 for j in z3] # All possible payoffs\n", + " z = vcat(z'...)\n", + "\t\tp = ones(3)\n", + "\t\tpi = 1/16\n", + "\t\te = [2, 0, 0]\n", + "\n", + "\t\treturn Dict(\"a\"=>a,\"na\"=>na,\"nc\"=>nc,\"ns\"=>ns,\"nss\"=>nss,\"e\"=>e,\"p\"=>p,\"z\"=>z,\"pi\"=>pi)\n", + "end\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Dict{String,Any} with 9 entries:\n", + " \"na\" => 3\n", + " \"e\" => [2, 0, 0]\n", + " \"ns\" => 4\n", + " \"nc\" => 4\n", + " \"nss\" => 16\n", + " \"z\" => [1.0 0.72 0.86; 1.0 0.72 0.96; … ; 1.0 1.32 1.06; 1.0 1.32 1.16]\n", + " \"a\" => 0.5\n", + " \"p\" => [1.0, 1.0, 1.0]\n", + " \"pi\" => 0.0625" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d = data()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "┌ Info: Recompiling stale cache file C:\\Users\\lorenzo\\.julia\\compiled\\v1.1\\NLopt\\faRdv.ji for NLopt [76087f3c-5699-56af-9a33-bf431cd00edd]\n", + "└ @ Base loading.jl:1184\n" + ] + } + ], + "source": [ + "using NLopt" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "u (generic function with 1 method)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function u(x, data::Dict)\n", + " -exp(-data[\"a\"].*x)\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "obj (generic function with 1 method)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function obj(x::Vector, grad::Vector, data::Dict)\n", + " a = data[\"a\"]\n", + " z = data[\"z\"]\n", + " if length(grad) > 0\n", + " grad[1] = -a * u(x[1], data)\n", + " for i in 1:3\n", + " grad[i+1] = -a .* sum(data[\"pi\"] .* z[:, i] .* u.(z * x[2:end], Ref(data)))\n", + " end\n", + "end \n", + " return u(x[1], data) + sum(data[\"pi\"] .* u.(z * x[2:end], Ref(data)))\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4-element Array{Float64,1}:\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grad = zeros(4)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-0.8280607425183014" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "obj(ones(4), grad, d)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4-element Array{Float64,1}:\n", + " 0.3032653298563167 \n", + " 0.11076504140283401\n", + " 0.11021903217359377\n", + " 0.11118090020589945" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grad" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "constr (generic function with 1 method)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function constr(x::Vector,grad::Vector,data::Dict)\n", + " if length(grad) > 0\n", + " grad[1] = 1\n", + " grad[2:end] = d[\"p\"]\n", + " end\n", + " return x[1] + sum(d[\"p\"] .* (x[2:end] .- d[\"e\"]))\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.0" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "constr(ones(4), zeros(4), d)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "max_NLopt (generic function with 2 methods)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function max_NLopt(a=0.5)\n", + " d = data(a)\n", + " opt = Opt(:LD_MMA, 4)\n", + " lower_bounds!(opt, [0, -Inf, -Inf, -Inf]) # As cannot sell more then initial endowment\n", + " max_objective!(opt, (x,g) -> obj(x,g, d))\n", + " inequality_constraint!(opt, (x, g) -> constr(x, g, d))\n", + " ftol_rel!(opt, 1e-9)\n", + " NLopt.optimize(opt, [0,2,0,0])\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(-1.2082140916618629, [1.00797, -1.41217, 0.801299, 1.6029], :FTOL_REACHED)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "max_NLopt()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "┌ Info: Recompiling stale cache file C:\\Users\\lorenzo\\.julia\\compiled\\v1.1\\DataFrames\\AR9oZ.ji for DataFrames [a93c6f00-e57d-5684-b7b6-d8193f3e46c0]\n", + "└ @ Base loading.jl:1184\n" + ] + } + ], + "source": [ + "using DataFrames" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "table_NLopt (generic function with 1 method)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function table_NLopt()\n", + "\t\td = DataFrame(a=[0.5;1.0;5.0],c = zeros(3),omega1=zeros(3),omega2=zeros(3),omega3=zeros(3),fval=zeros(3))\n", + "\t\tfor i in 1:nrow(d)\n", + "\t\t\txx = max_NLopt(d[i,:a])\n", + "\t\t\tfor j in 2:ncol(d)-1\n", + "\t\t\t\td[i,j] = xx[2][j-1]\n", + "\t\t\tend\n", + "\t\t\td[i,end] = xx[1]\n", + "\t\tend\n", + "\t\treturn d\n", + "\tend" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

3 rows × 6 columns

acomega1omega2omega3fval
Float64Float64Float64Float64Float64Float64
10.51.00797-1.412170.8012991.6029-1.20821
21.01.00401-0.2058670.4006890.801171-0.732819
35.01.00080.7587930.08014450.160263-0.013422
" + ], + "text/latex": [ + "\\begin{tabular}{r|cccccc}\n", + "\t& a & c & omega1 & omega2 & omega3 & fval\\\\\n", + "\t\\hline\n", + "\t& Float64 & Float64 & Float64 & Float64 & Float64 & Float64\\\\\n", + "\t\\hline\n", + "\t1 & 0.5 & 1.00797 & -1.41217 & 0.801299 & 1.6029 & -1.20821 \\\\\n", + "\t2 & 1.0 & 1.00401 & -0.205867 & 0.400689 & 0.801171 & -0.732819 \\\\\n", + "\t3 & 5.0 & 1.0008 & 0.758793 & 0.0801445 & 0.160263 & -0.013422 \\\\\n", + "\\end{tabular}\n" + ], + "text/plain": [ + "3×6 DataFrame\n", + "│ Row │ a │ c │ omega1 │ omega2 │ omega3 │ fval │\n", + "│ │ \u001b[90mFloat64\u001b[39m │ \u001b[90mFloat64\u001b[39m │ \u001b[90mFloat64\u001b[39m │ \u001b[90mFloat64\u001b[39m │ \u001b[90mFloat64\u001b[39m │ \u001b[90mFloat64\u001b[39m │\n", + "├─────┼─────────┼─────────┼───────────┼───────────┼──────────┼───────────┤\n", + "│ 1 │ 0.5 │ 1.00797 │ -1.41217 │ 0.801299 │ 1.6029 │ -1.20821 │\n", + "│ 2 │ 1.0 │ 1.00401 │ -0.205867 │ 0.400689 │ 0.801171 │ -0.732819 │\n", + "│ 3 │ 5.0 │ 1.0008 │ 0.758793 │ 0.0801445 │ 0.160263 │ -0.013422 │" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "table_NLopt()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `C:\\Users\\lorenzo\\.julia\\registries\\General`\n", + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m git-repo `https://github.com/JuliaRegistries/General.git`\n", + "\u001b[2K\u001b[?25h[1mFetching:\u001b[22m\u001b[39m [========================================>] 100.0 %.0 %1 %.7 %92.7 %\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m ZipFile ────── v0.8.1\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m CSVFiles ───── v0.15.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m PyCall ─────── v1.91.1\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m FileIO ─────── v1.0.6\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m TextParse ──── v0.9.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Clustering ─── v0.13.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m DoubleFloats ─ v0.7.18\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Documenter ─── v0.22.0\n", + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m `C:\\Users\\lorenzo\\.julia\\environments\\v1.1\\Project.toml`\n", + " \u001b[90m [49dc2e85]\u001b[39m\u001b[92m + Calculus v0.4.1\u001b[39m\n", + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m `C:\\Users\\lorenzo\\.julia\\environments\\v1.1\\Manifest.toml`\n", + " \u001b[90m [5d742f6a]\u001b[39m\u001b[93m ↑ CSVFiles v0.14.0 ⇒ v0.15.0\u001b[39m\n", + " \u001b[90m [aaaa29a8]\u001b[39m\u001b[93m ↑ Clustering v0.12.4 ⇒ v0.13.0\u001b[39m\n", + " \u001b[90m [e30172f5]\u001b[39m\u001b[93m ↑ Documenter v0.21.5 ⇒ v0.22.0\u001b[39m\n", + " \u001b[90m [497a8b3b]\u001b[39m\u001b[93m ↑ DoubleFloats v0.7.17 ⇒ v0.7.18\u001b[39m\n", + " \u001b[90m [5789e2e9]\u001b[39m\u001b[93m ↑ FileIO v1.0.5 ⇒ v1.0.6\u001b[39m\n", + " \u001b[90m [14197337]\u001b[39m\u001b[91m - GenericLinearAlgebra v0.1.0\u001b[39m\n", + " \u001b[90m [01680d73]\u001b[39m\u001b[92m + GenericSVD v0.2.1\u001b[39m\n", + " \u001b[90m [438e738f]\u001b[39m\u001b[93m ↑ PyCall v1.91.0 ⇒ v1.91.1\u001b[39m\n", + " \u001b[90m [e0df1984]\u001b[39m\u001b[93m ↑ TextParse v0.8.0 ⇒ v0.9.0\u001b[39m\n", + " \u001b[90m [a5390f91]\u001b[39m\u001b[93m ↑ ZipFile v0.8.0 ⇒ v0.8.1\u001b[39m\n", + "\u001b[32m\u001b[1m Building\u001b[22m\u001b[39m PyCall ─→ `C:\\Users\\lorenzo\\.julia\\packages\\PyCall\\a5Jd3\\deps\\build.log`\n", + "\u001b[32m\u001b[1m Building\u001b[22m\u001b[39m ZipFile → `C:\\Users\\lorenzo\\.julia\\packages\\ZipFile\\YHTbb\\deps\\build.log`\n" + ] + } + ], + "source": [ + "import Pkg; Pkg.add(\"Calculus\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "┌ Info: Recompiling stale cache file C:\\Users\\lorenzo\\.julia\\compiled\\v1.1\\Calculus\\G3wEN.ji for Calculus [49dc2e85-a5d0-5ad3-a950-438e2897f1b9]\n", + "└ @ Base loading.jl:1184\n" + ] + } + ], + "source": [ + "using Calculus" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4-element Array{Float64,1}:\n", + " 0.3032653298574901 \n", + " 0.11076504140290903\n", + " 0.11021903217009567\n", + " 0.11118090021276408" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Calculus.gradient(arg -> obj(arg, zeros(4), d), ones(4))" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "┌ Info: Recompiling stale cache file C:\\Users\\lorenzo\\.julia\\compiled\\v1.1\\JuMP\\DmXqY.ji for JuMP [4076af6c-e467-56ae-b986-b466b2749572]\n", + "└ @ Base loading.jl:1184\n", + "┌ Info: Recompiling stale cache file C:\\Users\\lorenzo\\.julia\\compiled\\v1.1\\Ipopt\\yMQMo.ji for Ipopt [b6b21f68-93f8-5de0-b562-5493be1d77c9]\n", + "└ @ Base loading.jl:1184\n" + ] + } + ], + "source": [ + "using JuMP\n", + "using Ipopt" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[32m\u001b[1m Status\u001b[22m\u001b[39m `C:\\Users\\lorenzo\\.julia\\environments\\v1.1\\Project.toml`\n", + " \u001b[90m [aae01518]\u001b[39m\u001b[37m BandedMatrices v0.8.1\u001b[39m\n", + " \u001b[90m [6e4b80f9]\u001b[39m\u001b[37m BenchmarkTools v0.4.2\u001b[39m\n", + " \u001b[90m [a134a8b2]\u001b[39m\u001b[37m BlackBoxOptim v0.4.0\u001b[39m\n", + " \u001b[90m [49dc2e85]\u001b[39m\u001b[37m Calculus v0.4.1\u001b[39m\n", + " \u001b[90m [324d7699]\u001b[39m\u001b[37m CategoricalArrays v0.5.2\u001b[39m\n", + " \u001b[90m [3da002f7]\u001b[39m\u001b[37m ColorTypes v0.7.5\u001b[39m\n", + " \u001b[90m [34da2185]\u001b[39m\u001b[37m Compat v1.4.0\u001b[39m\n", + " \u001b[90m [a93c6f00]\u001b[39m\u001b[37m DataFrames v0.17.0\u001b[39m\n", + " \u001b[90m [1313f7d8]\u001b[39m\u001b[37m DataFramesMeta v0.4.0\u001b[39m\n", + " \u001b[90m [5721bf48]\u001b[39m\u001b[37m DataVoyager v0.3.1\u001b[39m\n", + " \u001b[90m [01453d9d]\u001b[39m\u001b[37m DiffEqDiffTools v0.7.1\u001b[39m\n", + " \u001b[90m [31c24e10]\u001b[39m\u001b[37m Distributions v0.16.4\u001b[39m\n", + " \u001b[90m [63b64609]\u001b[39m\u001b[37m ExamplePackage v0.1.0 [`..\\..\\dev\\ExamplePackage`]\u001b[39m\n", + " \u001b[90m [2fe49d83]\u001b[39m\u001b[37m Expectations v1.0.2\u001b[39m\n", + " \u001b[90m [442a2c76]\u001b[39m\u001b[37m FastGaussQuadrature v0.3.2\u001b[39m\n", + " \u001b[90m [1a297f60]\u001b[39m\u001b[37m FillArrays v0.4.0\u001b[39m\n", + " \u001b[90m [9d5cd8c9]\u001b[39m\u001b[37m FixedEffectModels v0.7.1\u001b[39m\n", + " \u001b[90m [587475ba]\u001b[39m\u001b[37m Flux v0.7.1\u001b[39m\n", + " \u001b[90m [f6369f11]\u001b[39m\u001b[37m ForwardDiff v0.10.2\u001b[39m\n", + " \u001b[90m [38e38edf]\u001b[39m\u001b[37m GLM v1.1.0\u001b[39m\n", + " \u001b[90m [28b8d3ca]\u001b[39m\u001b[37m GR v0.37.0\u001b[39m\n", + " \u001b[90m [2aa259a0]\u001b[39m\u001b[37m HWconstrained v0.1.0 [`C:\\Users\\lorenzo\\.julia\\dev\\HWconstrained`]\u001b[39m\n", + " \u001b[90m [d8de2c54]\u001b[39m\u001b[37m HWunconstrained v0.1.0 [`C:\\Users\\lorenzo\\.julia\\dev\\HWunconstrained`]\u001b[39m\n", + " \u001b[90m [7073ff75]\u001b[39m\u001b[37m IJulia v1.16.0\u001b[39m\n", + " \u001b[90m [43edad99]\u001b[39m\u001b[37m InstantiateFromURL v0.2.1\u001b[39m\n", + " \u001b[90m [a98d9a8b]\u001b[39m\u001b[37m Interpolations v0.11.1\u001b[39m\n", + " \u001b[90m [b6b21f68]\u001b[39m\u001b[37m Ipopt v0.5.1\u001b[39m\n", + " \u001b[90m [4076af6c]\u001b[39m\u001b[37m JuMP v0.18.5\u001b[39m\n", + " \u001b[90m [e5e0dc1b]\u001b[39m\u001b[37m Juno v0.5.5\u001b[39m\n", + " \u001b[90m [5ab0869b]\u001b[39m\u001b[37m KernelDensity v0.5.1\u001b[39m\n", + " \u001b[90m [b964fa9f]\u001b[39m\u001b[37m LaTeXStrings v1.0.3\u001b[39m\n", + " \u001b[90m [23fbe1c1]\u001b[39m\u001b[37m Latexify v0.6.0\u001b[39m\n", + " \u001b[90m [5078a376]\u001b[39m\u001b[37m LazyArrays v0.5.1\u001b[39m\n", + " \u001b[90m [0fc2ff8b]\u001b[39m\u001b[37m LeastSquaresOptim v0.7.1\u001b[39m\n", + " \u001b[90m [093fc24a]\u001b[39m\u001b[37m LightGraphs v1.2.0\u001b[39m\n", + " \u001b[90m [76087f3c]\u001b[39m\u001b[37m NLopt v0.5.1\u001b[39m\n", + " \u001b[90m [2774e3e8]\u001b[39m\u001b[37m NLsolve v3.0.1\u001b[39m\n", + " \u001b[90m [429524aa]\u001b[39m\u001b[37m Optim v0.17.2\u001b[39m\n", + " \u001b[90m [d96e819e]\u001b[39m\u001b[37m Parameters v0.10.3\u001b[39m\n", + " \u001b[90m [14b8a8f1]\u001b[39m\u001b[37m PkgTemplates v0.4.1\u001b[39m\n", + " \u001b[90m [91a5bcdd]\u001b[39m\u001b[37m Plots v0.23.0\u001b[39m\n", + " \u001b[90m [f27b6e38]\u001b[39m\u001b[37m Polynomials v0.5.2\u001b[39m\n", + " \u001b[90m [92933f4c]\u001b[39m\u001b[37m ProgressMeter v0.9.0\u001b[39m\n", + " \u001b[90m [1fd47b50]\u001b[39m\u001b[37m QuadGK v2.0.3\u001b[39m\n", + " \u001b[90m [fcd29c91]\u001b[39m\u001b[37m QuantEcon v0.15.0\u001b[39m\n", + " \u001b[90m [1a8c2f83]\u001b[39m\u001b[37m Query v0.10.1\u001b[39m\n", + " \u001b[90m [612083be]\u001b[39m\u001b[37m Queryverse v0.2.0\u001b[39m\n", + " \u001b[90m [ce6b1742]\u001b[39m\u001b[37m RDatasets v0.6.1\u001b[39m\n", + " \u001b[90m [d519eb52]\u001b[39m\u001b[37m RegressionTables v0.2.0\u001b[39m\n", + " \u001b[90m [295af30f]\u001b[39m\u001b[37m Revise v1.0.2\u001b[39m\n", + " \u001b[90m [f2b01f46]\u001b[39m\u001b[37m Roots v0.7.4\u001b[39m\n", + " \u001b[90m [60ddc479]\u001b[39m\u001b[37m StatPlots v0.9.2\u001b[39m\n", + " \u001b[90m [90137ffa]\u001b[39m\u001b[37m StaticArrays v0.10.2\u001b[39m\n", + " \u001b[90m [2913bbd2]\u001b[39m\u001b[37m StatsBase v0.27.0\u001b[39m\n", + " \u001b[90m [3eaba693]\u001b[39m\u001b[37m StatsModels v0.5.0\u001b[39m\n", + " \u001b[90m [37b6cedf]\u001b[39m\u001b[37m Traceur v0.2.1\u001b[39m\n", + " \u001b[90m [0ae4a718]\u001b[39m\u001b[37m VegaDatasets v0.5.0\u001b[39m\n", + " \u001b[90m [112f6efa]\u001b[39m\u001b[37m VegaLite v0.5.2\u001b[39m\n", + " \u001b[90m [37e2e46d]\u001b[39m\u001b[37m LinearAlgebra \u001b[39m\n", + " \u001b[90m [3fa0cd96]\u001b[39m\u001b[37m REPL \u001b[39m\n", + " \u001b[90m [9a3f8284]\u001b[39m\u001b[37m Random \u001b[39m\n", + " \u001b[90m [2f01184e]\u001b[39m\u001b[37m SparseArrays \u001b[39m\n", + " \u001b[90m [10745b16]\u001b[39m\u001b[37m Statistics \u001b[39m\n", + " \u001b[90m [8dfed614]\u001b[39m\u001b[37m Test \u001b[39m\n" + ] + } + ], + "source": [ + "] st" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "ename": "UndefVarError", + "evalue": "UndefVarError: with_optimizer not defined", + "output_type": "error", + "traceback": [ + "UndefVarError: with_optimizer not defined", + "", + "Stacktrace:", + " [1] max_JuMP(::Float64) at .\\In[33]:3", + " [2] max_JuMP() at .\\In[33]:2", + " [3] top-level scope at In[33]:11" + ] + } + ], + "source": [ + "function max_JuMP(a=0.5)\n", + "\t\td = data(a)\n", + "\t\tm = Model(with_optimizer(Ipopt.Optimizer))\n", + "\t\t@variable(m, c >= 0)\n", + "\t\t@variable(m, x[1:3])\n", + "\t\t@NLconstraint(m, c + sum(d[\"p\"][i] * (x[i] - d[\"e\"][i]) for i in 1:3) == 0)\n", + "\t\t@NLobjective(m, Max, -exp(-a * c) + sum(-exp(-a * sum(d[\"za\"]'[j][i] * x[i] for i in 1:3)) * d[\"pi\"][j] for j in 1:16))\n", + "\t\tJuMP.optimize!(m)\n", + "\t\treturn Dict(\"obj\"=>objective_value(m),\"c\"=>value(c),\"omegas\"=>[value(x[i]) for i in 1:length(x)])\n", + "\tend\n", + "max_JuMP()" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "ename": "LoadError", + "evalue": "syntax: unexpected \"]\"", + "output_type": "error", + "traceback": [ + "syntax: unexpected \"]\"", + "" + ] + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.1.0", + "language": "julia", + "name": "julia-1.1" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.1.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/HWconstrained.jl b/src/HWconstrained.jl index 3b6faa4..79afdc3 100644 --- a/src/HWconstrained.jl +++ b/src/HWconstrained.jl @@ -7,25 +7,37 @@ greet() = print("Hello World!") export data, table_NLopt, table_JuMP - function data(a=0.5) - - - - - - - - - +function data(a=0.5) + a = a + na = 3 + nc = 4 # Budget constraint + 3 nonnegativity constraints + ns = 4 + nss = 16 + z1 = ones(4) + z2 = [0.72, 0.92, 1.12, 1.32] + z3 = [0.86, 0.96, 1.06, 1.16] + z = [(1, i, j) for i in z2 for j in z3] # All possible payoffs + p = ones(3) + pi = repeat([1/16], nss) + e = [2, 0, 0] + return Dict("a"=>a,"na"=>na,"nc"=>nc,"ns"=>ns,"nss"=>nss,"e"=>e,"p"=>p,"z"=>z,"pi"=>pi) - end +end function max_JuMP(a=0.5) - - return Dict("obj"=>objective_value(m),"c"=>value(c),"omegas"=>[value(omega[i]) for i in 1:length(omega)]) + d = data(a) + m = Model(with_optimizer(Ipopt.Optimizer)) + + @variable(m, c>=0) + @variable(m, x[1:3]) + @NLconstraint(m, c + sum(d["p"][i] * (x[i] - d["e"][i]) for i in 1:3) == 0 ) + @NLobjective(m, Max, -exp(-a * c) + sum(-exp(-a * sum(d["z"][j][i] * x[i] for i in 1:3)) * d["pi"][j] for j in 1:16)) + JuMP.optimize!(m) + return Dict("obj"=>objective_value(m),"c"=>value(c),"omegas"=>[value(x[i]) for i in 1:length(x)]) end + function table_JuMP() d = DataFrame(a=[0.5;1.0;5.0],c = zeros(3),omega1=zeros(3),omega2=zeros(3),omega3=zeros(3),fval=zeros(3)) for i in 1:nrow(d) @@ -39,67 +51,42 @@ greet() = print("Hello World!") return d end - - - - - - - - function obj(x::Vector,grad::Vector,data::Dict) - - - - - - - - - - - - - - - - - - - - - - - - - end - function constr(x::Vector,grad::Vector,data::Dict) - - - - - - - - - - - - - - - end - function max_NLopt(a=0.5) - - - - - - - - - end + + +function obj(x::Vector, grad::Vector, data::Dict) + a = data["a"] + z = data["z"] + u(x) = -exp(-a * x) + if length(grad) > 0 + grad[1] = -a * u(x[1], data) + for i in 1:3 + grad[i+1] = -a .* sum(data["pi"] .* z[:, i] .* u.(z * x[2:end], Ref(data))) + end +end + return u(x[1], data) + sum(data["pi"] .* u.(z * x[2:end], Ref(data))) +end + + +function constr(x::Vector,grad::Vector,data::Dict) + if length(grad) > 0 + grad[1] = 1 + grad[2:end] = d["p"] + end + return x[1] + sum(d["p"] .* (x[2:end] .- d["e"])) +end + +function max_NLopt(a=0.5) + d = data(a) + opt = Opt(:LD_MMA, 4) + lower_bounds!(opt, [0, -Inf, -Inf, -Inf]) # As cannot sell more then initial endowment + max_objective!(opt, (x,g) -> obj(x,g, d)) + inequality_constraint!(opt, (x, g) -> constr(x, g, d)) + ftol_rel!(opt, 1e-9) + NLopt.optimize(opt, [0,2,0,0]) +end + function table_NLopt() d = DataFrame(a=[0.5;1.0;5.0],c = zeros(3),omega1=zeros(3),omega2=zeros(3),omega3=zeros(3),fval=zeros(3)) diff --git a/test/runtests.jl b/test/runtests.jl index 1793ffc..5476e99 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,26 +1,33 @@ using HWconstrained using Test +using Calculus @testset "HWconstrained.jl" begin @testset "testing components" begin @testset "tests gradient of objective function" begin - - - - - - + d = data() + grad = zeros(4) + obj(ones(4), zeros(4), d) + @test Calculus.gradient(arg -> obj(arg, zeros(4), d), ones(4)) == grad + + + + + end @testset "tests gradient of constraint function" begin - - - - - - + d = data() + grad = zeros(4) + constr(ones(4), zeros(4), d) + @test Calculus.gradient(arg -> constr(arg, zeros(4), d), ones(4)) == grad + + + + + end end