Created
December 18, 2015 23:05
-
-
Save bicycle1885/626f59ff9e0375573470 to your computer and use it in GitHub Desktop.
JuliaTokyo#5 ハンズオン (佐藤建太)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Juliaチュートリアルハンズオン" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 目的\n", | |
"\n", | |
"* Juliaのコードが遅くなる原因を知る\n", | |
"* パフォーマンスチューニングのツールを知る" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Juliaのキホン\n", | |
"\n", | |
"1. ソースコードのパース\n", | |
"2. マクロ展開\n", | |
"3. 型推論\n", | |
"4. JITコンパイル\n", | |
"5. 実行\n", | |
"\n", | |
"**型推論**はJITコンパイルのための最重要ステップ!!\n", | |
"\n", | |
"**あいまいさ**はパフォーマンスの最大の敵!!\n", | |
"\n", | |
"型推論器に優しいプログラム => JITが速いコードを吐く" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"例: 配列の総和を求める関数" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"mysum (generic function with 1 method)" | |
] | |
}, | |
"execution_count": 1, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"function mysum(xs)\n", | |
" s = 0\n", | |
" for x in xs\n", | |
" s += x\n", | |
" end\n", | |
" return s\n", | |
"end" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"6" | |
] | |
}, | |
"execution_count": 2, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"mysum([1,2,3])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"xs = rand(100000);" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"49996.01279241448" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"mysum(xs)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"49996.0127924135" | |
] | |
}, | |
"execution_count": 5, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"sum(xs)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" 0.004252 seconds (200.15 k allocations: 3.062 MB)\n" | |
] | |
} | |
], | |
"source": [ | |
"@time mysum(xs);" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" 0.000074 seconds (5 allocations: 176 bytes)\n" | |
] | |
} | |
], | |
"source": [ | |
"@time sum(xs);" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"`mysum`は約40倍遅い" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"原因\n", | |
"\n", | |
"`mysum`の変数`s`の型が変わる\n", | |
"\n", | |
"* `xs` が整数の配列 => `s`は整数のまま\n", | |
"* `xs` が浮動小数点数の配列 => `s`の型は整数から浮動小数点数に変わる" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" 0.000105 seconds (5 allocations: 176 bytes)\n" | |
] | |
} | |
], | |
"source": [ | |
"xs = rand(0:100, 100000)\n", | |
"@time mysum(xs);" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"`s`は配列の要素と同じ型にする" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"mysum (generic function with 1 method)" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"function mysum(xs)\n", | |
" s = zero(eltype(xs))\n", | |
" for x in xs\n", | |
" s += x\n", | |
" end\n", | |
" return s\n", | |
"end" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"xs = rand(100000);" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"49884.78740359909" | |
] | |
}, | |
"execution_count": 11, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"mysum(xs); # JITコンパイル" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" 0.000134 seconds (5 allocations: 176 bytes)\n" | |
] | |
} | |
], | |
"source": [ | |
"@time mysum(xs);" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" 0.000078 seconds (5 allocations: 176 bytes)\n" | |
] | |
} | |
], | |
"source": [ | |
"@time sum(xs);" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"これくらい小さいコードなら慣れてくると見れば分かるが、実際のコードでは厳しい => **プロファイラ**を使おう!" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Nelder-Mead Algorithm" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"関数の最適化アルゴリズム (今日の題材)\n", | |
"\n", | |
"* アメーバのような動きで関数値の小さいところを探索する\n", | |
" * 反復して貪欲的に関数値を小さくしていく\n", | |
" * 本当は収束条件を満たしたときに停止するが、今回は回数固定\n", | |
"* 勾配情報要らない\n", | |
"* 決して速くはない\n", | |
" * 頑張って微分するか自動微分してBFGSを使おう\n", | |
" * 自動微分: https://github.com/JuliaDiff/ForwardDiff.jl\n", | |
" * BFGSなど: https://github.com/JuliaOpt/Optim.jl\n", | |
"* (参考) http://www.scholarpedia.org/article/Nelder-Mead_algorithm" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"https://commons.wikimedia.org/wiki/File:Nelder_Mead1.gif#/media/File:Nelder_Mead1.gif" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Rosenblock関数を最適化\n", | |
"\n", | |
"$$\n", | |
"\\mathrm{rosenblock}(\\boldsymbol{x}) = \\sum_{i=1}^{d/2} (a - x_{2i-1})^2 + b (x_{2i} - x_{2i-1}^2)^2\n", | |
"$$\n", | |
"\n", | |
"$a=1$なら$\\boldsymbol{x} = (1, 1, \\dots, 1)$で最小値$\\mathrm{rosenblock}(\\boldsymbol{x}) = 0$\n", | |
"https://en.wikipedia.org/wiki/Rosenbrock_function" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"初期状態" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": { | |
"collapsed": false, | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"\"\"\"\n", | |
"Nelder-Mead algorithm\n", | |
"\n", | |
" nelder_mead(f, x0, n)\n", | |
"\n", | |
"Arguments\n", | |
"---------\n", | |
"\n", | |
"* `f`: target function to optimize\n", | |
"* `x0`: initial value\n", | |
"* `n`: number of iterations\n", | |
"\n", | |
"See http://www.scholarpedia.org/article/Nelder-Mead_algorithm for the details.\n", | |
"\"\"\"\n", | |
"function nelder_mead(f, x0, n)\n", | |
" # initialize simplex\n", | |
" d = length(x0)\n", | |
" simplex = Vector{Float64}[x0]\n", | |
" fvalues = [f(x0)]\n", | |
" for j in 1:d\n", | |
" dx = zeros(x0)\n", | |
" dx[j] = 1\n", | |
" x = x0 + dx\n", | |
" push!(simplex, x)\n", | |
" push!(fvalues, f(x))\n", | |
" end\n", | |
"\n", | |
" # sort vertices\n", | |
" order = sortperm(fvalues)\n", | |
" simplex = simplex[order]\n", | |
" fvalues = fvalues[order]\n", | |
"\n", | |
" # start \"amoeba optimization\"\n", | |
" for i in 1:n\n", | |
" # l: lowest vertex\n", | |
" # s: second highest vertex\n", | |
" # h: highest vertex\n", | |
" f_l = fvalues[1]\n", | |
" f_s = fvalues[end-1]\n", | |
" x_h = simplex[end]\n", | |
" f_h = fvalues[end]\n", | |
" c = centroid(simplex)\n", | |
" x_r = c + alpha * (c - x_h)\n", | |
" f_r = f(x_r)\n", | |
" if f_l <= f_r < f_s\n", | |
" # Reflect\n", | |
" simplex[end] = x_r\n", | |
" elseif f_r < f_l\n", | |
" # Expand\n", | |
" x_e = c + gamma * (x_r - c)\n", | |
" f_e = f(x_e)\n", | |
" if f_e < f_r\n", | |
" simplex[end] = x_e\n", | |
" else\n", | |
" simplex[end] = x_r\n", | |
" end\n", | |
" elseif f_r >= f_s\n", | |
" # Contract\n", | |
" if f_s <= f_r < f_h\n", | |
" x_c = c + beta * (x_r - c)\n", | |
" f_c = f(x_c)\n", | |
" if f_c <= f_r\n", | |
" simplex[end] = x_c\n", | |
" else\n", | |
" simplex = shrink(simplex)\n", | |
" end\n", | |
" elseif f_r >= f_h\n", | |
" x_c = c + beta * (x_h - c)\n", | |
" f_c = f(x_c)\n", | |
" if f_c < f_h\n", | |
" simplex[end] = x_c\n", | |
" else\n", | |
" simplex = shrink(simplex)\n", | |
" end\n", | |
" else\n", | |
" simplex = shrink(simplex)\n", | |
" end\n", | |
" else\n", | |
" simplex = shrink(simplex)\n", | |
" end\n", | |
" # sort vertices\n", | |
" fvalues = [f(x) for x in simplex]\n", | |
" order = sortperm(fvalues)\n", | |
" simplex = simplex[order]\n", | |
" fvalues = fvalues[order]\n", | |
" end\n", | |
"\n", | |
" # return the location of the lowest vertex\n", | |
" return simplex[1]\n", | |
"end\n", | |
"\n", | |
"# the parameters of transformations\n", | |
"alpha = 1\n", | |
"beta = 1/2\n", | |
"gamma = 2\n", | |
"delta = 1/2\n", | |
"\n", | |
"# the centroid of the best side\n", | |
"function centroid(simplex)\n", | |
" c = zeros(simplex[1])\n", | |
" for x in simplex[1:end-1]\n", | |
" c += x\n", | |
" end\n", | |
" return c / (length(simplex) - 1)\n", | |
"end\n", | |
"\n", | |
"# shrink all vertices except the lowest one\n", | |
"function shrink(simplex)\n", | |
" x_l = simplex[1]\n", | |
" for j in 2:endof(simplex)\n", | |
" x_j = simplex[j]\n", | |
" simplex[j] = x_l + delta * (x_j - x_l)\n", | |
" end\n", | |
" return simplex\n", | |
"end\n", | |
"\n", | |
"# Rosenblock function\n", | |
"function rosenblock(x)\n", | |
" a = 1\n", | |
" b = 100\n", | |
" fval = 0.0\n", | |
" for i in 1:div(length(x), 2)\n", | |
" fval += (a - x[2i-1])^2 + b * (x[2i] - x[2i-1]^2)^2\n", | |
" end\n", | |
" return fval\n", | |
"end\n", | |
"\n", | |
"\n", | |
"if !isinteractive()\n", | |
" srand(12345)\n", | |
" x0 = randn(20)\n", | |
" @show nelder_mead(rosenblock, x0, 100000)\n", | |
" @time nelder_mead(rosenblock, x0, 100000)\n", | |
" @time nelder_mead(rosenblock, x0, 100000)\n", | |
" @time nelder_mead(rosenblock, x0, 100000)\n", | |
"end\n" | |
] | |
} | |
], | |
"source": [ | |
";cat nelder_mead.jl" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"include(\"nelder_mead.jl\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"srand(12345);" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"初期値" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"6-element Array{Float64,1}:\n", | |
" 1.17236 \n", | |
" 0.852707\n", | |
" 0.415565\n", | |
" 0.516425\n", | |
" 0.685759\n", | |
" 0.282272" | |
] | |
}, | |
"execution_count": 17, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"x0 = randn(6)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"43.03794020688765" | |
] | |
}, | |
"execution_count": 18, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"rosenblock(x0)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"10ステップ" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"6-element Array{Float64,1}:\n", | |
" 1.15924 \n", | |
" 1.06464 \n", | |
" 0.942893\n", | |
" 0.517711\n", | |
" 0.53446 \n", | |
" 0.494206" | |
] | |
}, | |
"execution_count": 19, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"nelder_mead(rosenblock, x0, 10)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"26.179189991800392" | |
] | |
}, | |
"execution_count": 20, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"rosenblock(ans)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"100ステップ" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"6-element Array{Float64,1}:\n", | |
" 1.11422 \n", | |
" 1.23976 \n", | |
" 0.728679\n", | |
" 0.528415\n", | |
" 0.609687\n", | |
" 0.357171" | |
] | |
}, | |
"execution_count": 23, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"nelder_mead(rosenblock, x0, 100)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 24, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"0.2611154410187147" | |
] | |
}, | |
"execution_count": 24, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"rosenblock(ans)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"1000ステップ" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"6-element Array{Float64,1}:\n", | |
" 1.0\n", | |
" 1.0\n", | |
" 1.0\n", | |
" 1.0\n", | |
" 1.0\n", | |
" 1.0" | |
] | |
}, | |
"execution_count": 26, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"nelder_mead(rosenblock, x0, 1000)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"8.16969005350168e-27" | |
] | |
}, | |
"execution_count": 27, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"rosenblock(ans)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"次元が大きいと難しい" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 28, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"20-element Array{Float64,1}:\n", | |
" -1.47708 \n", | |
" 0.126747 \n", | |
" 1.46647 \n", | |
" -0.158158 \n", | |
" 0.606808 \n", | |
" 2.00645 \n", | |
" -0.588508 \n", | |
" 0.0736438\n", | |
" 1.92585 \n", | |
" -1.30436 \n", | |
" 0.378353 \n", | |
" 1.21656 \n", | |
" 1.12871 \n", | |
" -0.341521 \n", | |
" -0.970332 \n", | |
" -0.995818 \n", | |
" -2.1476 \n", | |
" 0.045331 \n", | |
" -0.337099 \n", | |
" 0.0130945" | |
] | |
}, | |
"execution_count": 28, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"x0 = randn(20)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 29, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"6608.442644117987" | |
] | |
}, | |
"execution_count": 29, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"rosenblock(x0)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 30, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" " | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"20-element Array{Float64,1}:\n", | |
" 0.734996\n", | |
" 0.538659\n", | |
" 0.774076\n", | |
" 0.598324\n", | |
" 0.62828 \n", | |
" 0.392426\n", | |
" 1.0245 \n", | |
" 1.04968 \n", | |
" 0.932311\n", | |
" 0.868659\n", | |
" 0.946014\n", | |
" 0.894376\n", | |
" 0.885785\n", | |
" 0.7849 \n", | |
" 0.723964\n", | |
" 0.522211\n", | |
" 1.11645 \n", | |
" 1.2469 \n", | |
" 1.0235 \n", | |
" 1.04712 " | |
] | |
}, | |
"execution_count": 30, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"2.911332 seconds (14.26 M allocations: 931.772 MB, 2.54% gc time)\n" | |
] | |
} | |
], | |
"source": [ | |
"@time nelder_mead(rosenblock, x0, 100000)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"0.37222359514102016" | |
] | |
}, | |
"execution_count": 31, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"rosenblock(ans)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## プロファイリング\n", | |
"\n", | |
"* コードの何処に時間がかかっているかは分からない\n", | |
" * あらかじめ分かったらエスパー\n", | |
" * なので、プロファイリングをして**計測する**\n", | |
"* Juliaの標準ライブラリにある`Profile`モジュールを使う\n", | |
"* 使うツールは主に3つ\n", | |
" * `Profile.clear()`: プロファイル結果の削除\n", | |
" * `@profile`: コードのプロファイルをとるマクロ\n", | |
" * `Profile.print()`: プロファイル結果を表示\n", | |
"* プロファイラは、一定時間毎にスタックトレースをサンプリングする\n", | |
" * **相対的な**実行時間が分かる\n", | |
"* (Tips) 実行時間が長いとプロファイル結果をためるバッファがあふれるので、サンプリング間隔を`Profile.init()`で調整できる\n", | |
"* http://docs.julialang.org/en/release-0.4/manual/profile/" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 実践" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"`nelder_mead`関数を徐々に高速化する" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 1. 型の安定" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 32, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" 3.112122 seconds (14.26 M allocations: 931.772 MB, 2.64% gc time)\n", | |
" 2.947305 seconds (14.26 M allocations: 931.772 MB, 2.53% gc time)\n", | |
" 2.909218 seconds (14.26 M allocations: 931.772 MB, 2.47% gc time)\n" | |
] | |
} | |
], | |
"source": [ | |
"@time nelder_mead(rosenblock, x0, 100000)\n", | |
"@time nelder_mead(rosenblock, x0, 100000)\n", | |
"@time nelder_mead(rosenblock, x0, 100000);" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 33, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"1 ...4/lib/julia/sys.dylib; isless; (unknown line)\n", | |
"1 ...4/lib/julia/sys.dylib; setindex!; (unknown line)\n", | |
"1 arraymath.jl; -; line: 96\n", | |
"1 multidimensional.jl; _unsafe_getindex; line: 193\n", | |
"2529 task.jl; anonymous; line: 447\n", | |
" 2529 .../IJulia/src/IJulia.jl; eventloop; line: 141\n", | |
" 2529 ...rc/execute_request.jl; execute_request_0x535c5df2; line: 177\n", | |
" 2529 loading.jl; include_string; line: 266\n", | |
" 2528 profile.jl; anonymous; line: 16\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 34\n", | |
" 9 ...o/No5/nelder_mead.jl; nelder_mead; line: 38\n", | |
" 17 ...o/No5/nelder_mead.jl; nelder_mead; line: 39\n", | |
" 3 ...o/No5/nelder_mead.jl; nelder_mead; line: 40\n", | |
" 2 ...o/No5/nelder_mead.jl; nelder_mead; line: 41\n", | |
" 229 ...o/No5/nelder_mead.jl; nelder_mead; line: 42\n", | |
" 7 .../No5/nelder_mead.jl; centroid; line: 100\n", | |
" 10 .../No5/nelder_mead.jl; centroid; line: 101\n", | |
" 9 array.jl; getindex; line: 288\n", | |
" 5 array.jl; unsafe_getindex; line: 291\n", | |
" 4 array.jl; unsafe_getindex; line: 293\n", | |
" 4 array.jl; unsafe_copy!; line: 83\n", | |
" 195 .../No5/nelder_mead.jl; centroid; line: 102\n", | |
" 164 arraymath.jl; +; line: 96\n", | |
" 3 arraymath.jl; +; line: 97\n", | |
" 21 arraymath.jl; +; line: 98\n", | |
" 1 arraymath.jl; +; line: 100\n", | |
" 14 .../No5/nelder_mead.jl; centroid; line: 104\n", | |
" 11 arraymath.jl; ./; line: 49\n", | |
" 40 ...o/No5/nelder_mead.jl; nelder_mead; line: 43\n", | |
" 9 abstractarraymath.jl; *; line: 54\n", | |
" 7 arraymath.jl; .*; line: 118\n", | |
" 1 arraymath.jl; .*; line: 119\n", | |
" 1 arraymath.jl; .*; line: 120\n", | |
" 2 arraymath.jl; +; line: 96\n", | |
" 12 arraymath.jl; -; line: 96\n", | |
" 1 arraymath.jl; -; line: 98\n", | |
" 5 ...o/No5/nelder_mead.jl; nelder_mead; line: 44\n", | |
" 4 ...o/No5/nelder_mead.jl; nelder_mead; line: 45\n", | |
" 2 ...o/No5/nelder_mead.jl; nelder_mead; line: 48\n", | |
" 6 ...o/No5/nelder_mead.jl; nelder_mead; line: 50\n", | |
" 2 abstractarraymath.jl; *; line: 54\n", | |
" 2 arraymath.jl; .*; line: 118\n", | |
" 1 arraymath.jl; +; line: 96\n", | |
" 2 arraymath.jl; -; line: 96\n", | |
" 1 arraymath.jl; -; line: 98\n", | |
" 7 ...o/No5/nelder_mead.jl; nelder_mead; line: 53\n", | |
" 2 ...o/No5/nelder_mead.jl; nelder_mead; line: 60\n", | |
" 2 arraymath.jl; +; line: 96\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 63\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 68\n", | |
" 1721 ...o/No5/nelder_mead.jl; nelder_mead; line: 82\n", | |
" 4 .../No5/nelder_mead.jl; rosenblock; line: 122\n", | |
" 36 .../No5/nelder_mead.jl; rosenblock; line: 123\n", | |
" 2 ...lib/julia/sys.dylib; !; (unknown line)\n", | |
" 1 ...lib/julia/sys.dylib; ==; (unknown line)\n", | |
" 5 ...lib/julia/sys.dylib; call; (unknown line)\n", | |
" 7 ...lib/julia/sys.dylib; setindex!; (unknown line)\n", | |
" 17 array.jl; next; line: 276\n", | |
" 1062 tuple.jl; indexed_next; line: 21\n", | |
" 413 ...o/No5/nelder_mead.jl; nelder_mead; line: 83\n", | |
" 1 .../lib/julia/sys.dylib; call; (unknown line)\n", | |
" 1 .../lib/julia/sys.dylib; ord; (unknown line)\n", | |
" 294 .../lib/julia/sys.dylib; sort!; (unknown line)\n", | |
" 294 .../lib/julia/sys.dylib; sort!; (unknown line)\n", | |
" 294 ...lib/julia/sys.dylib; sort!; (unknown line)\n", | |
" 2 ...lib/julia/sys.dylib; &; (unknown line)\n", | |
" 12 ...lib/julia/sys.dylib; isless; (unknown line)\n", | |
" 1 ...lib/julia/sys.dylib; |; (unknown line)\n", | |
" 7 .../lib/julia/sys.dylib; vcat; (unknown line)\n", | |
" 30 ...o/No5/nelder_mead.jl; nelder_mead; line: 84\n", | |
" 26 abstractarray.jl; getindex; line: 488\n", | |
" 12 multidimensional.jl; _unsafe_getindex; line: 193\n", | |
" 7 multidimensional.jl; _unsafe_getindex; line: 195\n", | |
" 33 ...o/No5/nelder_mead.jl; nelder_mead; line: 85\n", | |
" 14 ...4/lib/julia/sys.dylib; _unsafe_getindex; (unknown line)\n" | |
] | |
} | |
], | |
"source": [ | |
"Profile.clear()\n", | |
"@profile nelder_mead(rosenblock, x0, 100000)\n", | |
"Profile.print()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"変数の型を知る" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 34, | |
"metadata": { | |
"collapsed": false, | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Variables:\n", | |
" f::F\n", | |
" x0::Array{Float64,1}\n", | |
" n::Int64\n", | |
" d::Int64\n", | |
" order::ANY\n", | |
" simplex::ANY\n", | |
" fvalues::ANY\n", | |
" #s40::Int64\n", | |
" i::Int64\n", | |
" f_l::ANY\n", | |
" f_s::ANY\n", | |
" x_h::ANY\n", | |
" f_h::ANY\n", | |
" c::ANY\n", | |
" x_r::ANY\n", | |
" f_r::ANY\n", | |
" #s35::ANY\n", | |
" x_e::ANY\n", | |
" f_e::ANY\n", | |
" #s34::ANY\n", | |
" x_c::ANY\n", | |
" f_c::ANY\n", | |
" #s39::Int64\n", | |
" #s38::ANY\n", | |
" #s37::Int64\n", | |
" #s36::ANY\n", | |
" #70#x::ANY\n", | |
" #s41::Int64\n", | |
" j::Int64\n", | |
" dx::Array{Float64,1}\n", | |
" #69#x::Array{Float64,1}\n", | |
" ##I#7785::Tuple{Array{Int64,1}}\n", | |
" ####I#7777#7786::Tuple{Array{Int64,1}}\n", | |
" ######I#7770#7778#7787::Tuple{Array{Int64,1}}\n", | |
" #########s29#7765#7771#7779#7788::Bool\n", | |
" ##########b#7761#7766#7772#7780#7789::Bool\n", | |
" ###########s28#7762#7767#7773#7781#7790::Int64\n", | |
" ##########i#7763#7768#7774#7782#7791::Int64\n", | |
" ##########_var0#7764#7769#7775#7783#7792::Bool\n", | |
" ######_var0#7776#7784#7793::Bool\n", | |
"\n", | |
"Body:\n", | |
" begin # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 17:\n", | |
" NewvarNode(:order)\n", | |
" d = (Base.arraylen)(x0::Array{Float64,1})::Int64 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 18:\n", | |
" simplex = (Main.getindex)(Array{Float64,1},x0::Array{Float64,1})::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 19:\n", | |
" fvalues = (top(vect))((f::F)(x0::Array{Float64,1})::ANY)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 20:\n", | |
" GenSym(4) = $(Expr(:new, UnitRange{Int64}, 1, :(((top(getfield))(Base.Intrinsics,:select_value)::I)((Base.sle_int)(1,d::Int64)::Bool,d::Int64,(Base.box)(Int64,(Base.sub_int)(1,1)))::Int64)))\n", | |
" #s41 = (top(getfield))(GenSym(4),:start)::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(#s41::Int64 === (Base.box)(Base.Int,(Base.add_int)((top(getfield))(GenSym(4),:stop)::Int64,1))::Bool)) goto 1\n", | |
" 2: \n", | |
" GenSym(31) = #s41::Int64\n", | |
" GenSym(32) = (Base.box)(Base.Int,(Base.add_int)(#s41::Int64,1))\n", | |
" j = GenSym(31)\n", | |
" #s41 = GenSym(32) # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 21:\n", | |
" GenSym(17) = (Base.arraysize)(x0::Array{Float64,1},1)::Int64\n", | |
" dx = (Base.fill!)((top(ccall))(:jl_alloc_array_1d,(top(apply_type))(Base.Array,Float64,1)::Type{Array{Float64,1}},(top(svec))(Base.Any,Base.Int)::SimpleVector,Array{Float64,1},0,GenSym(17),0)::Array{Float64,1},(Base.box)(Float64,(Base.sitofp)(Float64,0)))::Array{Float64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 22:\n", | |
" (Base.arrayset)(dx::Array{Float64,1},(Base.box)(Float64,(Base.sitofp)(Float64,1)),j::Int64)::Array{Float64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 23:\n", | |
" #69#x = x0::Array{Float64,1} + dx::Array{Float64,1}::Array{Float64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 24:\n", | |
" GenSym(19) = (Base.box)(UInt64,(Base.check_top_bit)(1))\n", | |
" (top(ccall))(:jl_array_grow_end,Base.Void,(top(svec))(Base.Any,Base.UInt)::SimpleVector,simplex::Array{Array{Float64,1},1},0,GenSym(19),0)::Void\n", | |
" GenSym(20) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" (Base.arrayset)(simplex::Array{Array{Float64,1},1},#69#x::Array{Float64,1},GenSym(20))::Array{Array{Float64,1},1}\n", | |
" simplex::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 25:\n", | |
" (Main.push!)(fvalues,(f::F)(#69#x::Array{Float64,1})::ANY)::ANY\n", | |
" 3: \n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(#s41::Int64 === (Base.box)(Base.Int,(Base.add_int)((top(getfield))(GenSym(4),:stop)::Int64,1))::Bool)))) goto 2\n", | |
" 1: \n", | |
" 0: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 29:\n", | |
" order = (Main.sortperm)(fvalues)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 30:\n", | |
" simplex = (Main.getindex)(simplex::Array{Array{Float64,1},1},order)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 31:\n", | |
" fvalues = (Main.getindex)(fvalues,order)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 34:\n", | |
" GenSym(6) = $(Expr(:new, UnitRange{Int64}, 1, :(((top(getfield))(Base.Intrinsics,:select_value)::I)((Base.sle_int)(1,n::Int64)::Bool,n::Int64,(Base.box)(Int64,(Base.sub_int)(1,1)))::Int64)))\n", | |
" #s40 = (top(getfield))(GenSym(6),:start)::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(#s40::Int64 === (Base.box)(Base.Int,(Base.add_int)((top(getfield))(GenSym(6),:stop)::Int64,1))::Bool)) goto 5\n", | |
" 6: \n", | |
" NewvarNode(symbol(\"#s35\"))\n", | |
" NewvarNode(:x_e)\n", | |
" NewvarNode(:f_e)\n", | |
" NewvarNode(symbol(\"#s34\"))\n", | |
" NewvarNode(:x_c)\n", | |
" NewvarNode(:f_c)\n", | |
" GenSym(33) = #s40::Int64\n", | |
" GenSym(34) = (Base.box)(Base.Int,(Base.add_int)(#s40::Int64,1))\n", | |
" i = GenSym(33)\n", | |
" #s40 = GenSym(34) # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 38:\n", | |
" f_l = (Main.getindex)(fvalues,1)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 39:\n", | |
" f_s = (Main.getindex)(fvalues,(top(endof))(fvalues)::ANY - 1::ANY)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 40:\n", | |
" x_h = (Main.getindex)(simplex,(top(endof))(simplex)::ANY)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 41:\n", | |
" f_h = (Main.getindex)(fvalues,(top(endof))(fvalues)::ANY)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 42:\n", | |
" c = (Main.centroid)(simplex)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 43:\n", | |
" x_r = c + Main.alpha * (c - x_h)::ANY::ANY::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 44:\n", | |
" f_r = (f::F)(x_r)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 45:\n", | |
" unless f_l <= f_r::ANY goto 8\n", | |
" #s35 = f_r < f_s::ANY\n", | |
" goto 9\n", | |
" 8: \n", | |
" #s35 = false\n", | |
" 9: \n", | |
" unless #s35 goto 10 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 47:\n", | |
" (Main.setindex!)(simplex,x_r,(top(endof))(simplex)::ANY)::ANY\n", | |
" goto 24\n", | |
" 10: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 48:\n", | |
" unless f_r < f_l::ANY goto 13 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 50:\n", | |
" x_e = c + Main.gamma * (x_r - c)::ANY::ANY::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 51:\n", | |
" f_e = (f::F)(x_e)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 52:\n", | |
" unless f_e < f_r::ANY goto 11 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 53:\n", | |
" (Main.setindex!)(simplex,x_e,(top(endof))(simplex)::ANY)::ANY\n", | |
" goto 12\n", | |
" 11: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 55:\n", | |
" (Main.setindex!)(simplex,x_r,(top(endof))(simplex)::ANY)::ANY\n", | |
" 12: \n", | |
" goto 24\n", | |
" 13: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 57:\n", | |
" unless f_r >= f_s::ANY goto 23 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 59:\n", | |
" unless f_s <= f_r::ANY goto 14\n", | |
" #s34 = f_r < f_h::ANY\n", | |
" goto 15\n", | |
" 14: \n", | |
" #s34 = false\n", | |
" 15: \n", | |
" unless #s34 goto 18 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 60:\n", | |
" x_c = c + Main.beta * (x_r - c)::ANY::ANY::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 61:\n", | |
" f_c = (f::F)(x_c)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 62:\n", | |
" unless f_c <= f_r::ANY goto 16 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 63:\n", | |
" (Main.setindex!)(simplex,x_c,(top(endof))(simplex)::ANY)::ANY\n", | |
" goto 17\n", | |
" 16: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 65:\n", | |
" simplex = (Main.shrink)(simplex)::ANY\n", | |
" 17: \n", | |
" goto 22\n", | |
" 18: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 67:\n", | |
" unless f_r >= f_h::ANY goto 21 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 68:\n", | |
" x_c = c + Main.beta * (x_h - c)::ANY::ANY::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 69:\n", | |
" f_c = (f::F)(x_c)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 70:\n", | |
" unless f_c < f_h::ANY goto 19 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 71:\n", | |
" (Main.setindex!)(simplex,x_c,(top(endof))(simplex)::ANY)::ANY\n", | |
" goto 20\n", | |
" 19: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 73:\n", | |
" simplex = (Main.shrink)(simplex)::ANY\n", | |
" 20: \n", | |
" goto 22\n", | |
" 21: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 76:\n", | |
" simplex = (Main.shrink)(simplex)::ANY\n", | |
" 22: \n", | |
" goto 24\n", | |
" 23: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 79:\n", | |
" simplex = (Main.shrink)(simplex)::ANY\n", | |
" 24: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 82:\n", | |
" GenSym(8) = simplex\n", | |
" GenSym(9) = (top(length))(GenSym(8))::ANY\n", | |
" 25: \n", | |
" GenSym(11) = call(top(Array),$(Expr(:static_typeof, GenSym(12))),GenSym(9))::ARRAY{T,N}\n", | |
" #s39 = 1\n", | |
" #s38 = (top(start))(GenSym(8))::ANY\n", | |
" #s37 = 0\n", | |
" unless !(#s37::Int64 == GenSym(9)::ANY)::ANY goto 27\n", | |
" 28: \n", | |
" #s37 = (Base.box)(Base.Int,(Base.add_int)(#s37::Int64,1))\n", | |
" GenSym(13) = (top(next))(GenSym(8),#s38)::ANY\n", | |
" #s36 = (top(start))(GenSym(13))::ANY\n", | |
" GenSym(14) = (top(indexed_next))(GenSym(13),1,#s36)::ANY\n", | |
" #70#x = (top(getfield))(GenSym(14),1)::ANY\n", | |
" #s36 = (top(getfield))(GenSym(14),2)::ANY\n", | |
" GenSym(15) = (top(indexed_next))(GenSym(13),2,#s36)::ANY\n", | |
" #s38 = (top(getfield))(GenSym(15),1)::ANY\n", | |
" #s36 = (top(getfield))(GenSym(15),2)::ANY\n", | |
" GenSym(12) = (f::F)(#70#x)::ANY\n", | |
" $(Expr(:type_goto, 25, GenSym(12)))\n", | |
" $(Expr(:boundscheck, false))\n", | |
" (top(setindex!))(GenSym(11),GenSym(12),#s39::Int64)::ARRAY{T,N}\n", | |
" $(Expr(:boundscheck, :(Main.pop)))\n", | |
" #s39 = (Base.box)(Base.Int,(Base.add_int)(#s39::Int64,1))\n", | |
" 29: \n", | |
" unless (top(!))(!(#s37::Int64 == GenSym(9)::ANY)::ANY)::ANY goto 28\n", | |
" 27: \n", | |
" 26: \n", | |
" GenSym(16) = GenSym(11)\n", | |
" fvalues = GenSym(16) # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 83:\n", | |
" order = (Main.sortperm)(fvalues::ARRAY{T,N})::Array{Int64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 84:\n", | |
" simplex = (Main.getindex)(simplex,order::Array{Int64,1})::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 85:\n", | |
" GenSym(22) = (Base.linearindexing)((Base.typeof)(fvalues::ARRAY{T,N})::TYPE{_<:ARRAY{T,N}})::Base.LinearFast\n", | |
" GenSym(21) = order::Array{Int64,1}\n", | |
" GenSym(23) = GenSym(21)\n", | |
" GenSym(24) = (Base.arraylen)(fvalues::ARRAY{T,N})::Int64\n", | |
" ##########b#7761#7766#7772#7780#7789 = true\n", | |
" ###########s28#7762#7767#7773#7781#7790 = 1\n", | |
" GenSym(27) = (Base.arraylen)(GenSym(23))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(###########s28#7762#7767#7773#7781#7790::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(27),1))::Bool)) goto 56\n", | |
" 52: \n", | |
" GenSym(29) = (Base.arrayref)(GenSym(23),###########s28#7762#7767#7773#7781#7790::Int64)::Int64\n", | |
" GenSym(30) = (Base.box)(Base.Int,(Base.add_int)(###########s28#7762#7767#7773#7781#7790::Int64,1))\n", | |
" ##########i#7763#7768#7774#7782#7791 = GenSym(29)\n", | |
" ###########s28#7762#7767#7773#7781#7790 = GenSym(30)\n", | |
" unless (Base.sle_int)(1,##########i#7763#7768#7774#7782#7791::Int64)::Bool goto 53\n", | |
" ##########_var0#7764#7769#7775#7783#7792 = (Base.sle_int)(##########i#7763#7768#7774#7782#7791::Int64,GenSym(24))::Bool\n", | |
" goto 54\n", | |
" 53: \n", | |
" ##########_var0#7764#7769#7775#7783#7792 = false\n", | |
" 54: \n", | |
" ##########b#7761#7766#7772#7780#7789 = (Base.box)(Base.Bool,(Base.and_int)(##########b#7761#7766#7772#7780#7789::Bool,##########_var0#7764#7769#7775#7783#7792::Bool))\n", | |
" 55: \n", | |
" GenSym(28) = (Base.arraylen)(GenSym(23))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(###########s28#7762#7767#7773#7781#7790::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(28),1))::Bool)))) goto 52\n", | |
" 56: \n", | |
" 57: \n", | |
" #########s29#7765#7771#7779#7788 = ##########b#7761#7766#7772#7780#7789::Bool\n", | |
" unless #########s29#7765#7771#7779#7788::Bool goto 58\n", | |
" ######_var0#7776#7784#7793 = #########s29#7765#7771#7779#7788::Bool\n", | |
" goto 59\n", | |
" 58: \n", | |
" ######_var0#7776#7784#7793 = (Base.throw_boundserror)(fvalues::ARRAY{T,N},GenSym(23))::UNION{}\n", | |
" 59: \n", | |
" ######_var0#7776#7784#7793::Bool\n", | |
" fvalues = (Base._unsafe_getindex)(GenSym(22),fvalues::ARRAY{T,N},GenSym(21))::ANY\n", | |
" 7: \n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(#s40::Int64 === (Base.box)(Base.Int,(Base.add_int)((top(getfield))(GenSym(6),:stop)::Int64,1))::Bool)))) goto 6\n", | |
" 5: \n", | |
" 4: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 89:\n", | |
" return (Main.getindex)(simplex,1)::ANY\n", | |
" end::ANY\n" | |
] | |
} | |
], | |
"source": [ | |
"@code_warntype nelder_mead(rosenblock, x0, 100000)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"* `fvalues::ANY`\n", | |
" * Juliaは`f`の返り値の型が分からない\n", | |
" * `fvalues`の型が不明で遅い" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"before:\n", | |
"```julia\n", | |
"fvalues = [f(x0)]\n", | |
"```\n", | |
"\n", | |
"after:\n", | |
"```julia\n", | |
"fvalues::Vector{Float64} = [f(x0)]\n", | |
"```" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 35, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"include(\"nelder_mead.jl\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 36, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Variables:\n", | |
" f::F\n", | |
" x0::Array{Float64,1}\n", | |
" n::Int64\n", | |
" d::Int64\n", | |
" order::Array{Int64,1}\n", | |
" simplex::Array{Array{Float64,1},1}\n", | |
" fvalues::Array{Float64,1}\n", | |
" #s40::Int64\n", | |
" i::Int64\n", | |
" f_l::Float64\n", | |
" f_s::Float64\n", | |
" x_h::Array{Float64,1}\n", | |
" f_h::Float64\n", | |
" c::Array{Float64,1}\n", | |
" x_r::ANY\n", | |
" f_r::ANY\n", | |
" #s35::ANY\n", | |
" x_e::ANY\n", | |
" f_e::ANY\n", | |
" #s34::ANY\n", | |
" x_c::ANY\n", | |
" f_c::ANY\n", | |
" #s39::Int64\n", | |
" #s38::Int64\n", | |
" #s37::Int64\n", | |
" #s36::Int64\n", | |
" #102#x::Array{Float64,1}\n", | |
" #s41::Int64\n", | |
" j::Int64\n", | |
" dx::Array{Float64,1}\n", | |
" #101#x::Array{Float64,1}\n", | |
" ##I#8822::Tuple{Array{Int64,1}}\n", | |
" ####I#7882#8823::Tuple{Array{Int64,1}}\n", | |
" ######I#7875#7883#8824::Tuple{Array{Int64,1}}\n", | |
" #########s29#7847#7876#7884#8825::Bool\n", | |
" ##########b#7843#7848#7877#7885#8826::Bool\n", | |
" ###########s28#7844#7849#7878#7886#8827::Int64\n", | |
" ##########i#7845#7850#7879#7887#8828::Int64\n", | |
" ##########_var0#7846#7851#7880#7888#8829::Bool\n", | |
" ######_var0#7881#7889#8830::Bool\n", | |
" ##I#8831::Tuple{Array{Int64,1}}\n", | |
" ####I#7949#8832::Tuple{Array{Int64,1}}\n", | |
" ######I#7942#7950#8833::Tuple{Array{Int64,1}}\n", | |
" #########s29#7914#7943#7951#8834::Bool\n", | |
" ##########b#7910#7915#7944#7952#8835::Bool\n", | |
" ###########s28#7911#7916#7945#7953#8836::Int64\n", | |
" ##########i#7912#7917#7946#7954#8837::Int64\n", | |
" ##########_var0#7913#7918#7947#7955#8838::Bool\n", | |
" ######_var0#7948#7956#8839::Bool\n", | |
" ##I#8840::Tuple{Array{Int64,1}}\n", | |
" ####I#7882#8841::Tuple{Array{Int64,1}}\n", | |
" ######I#7875#7883#8842::Tuple{Array{Int64,1}}\n", | |
" #########s29#7847#7876#7884#8843::Bool\n", | |
" ##########b#7843#7848#7877#7885#8844::Bool\n", | |
" ###########s28#7844#7849#7878#7886#8845::Int64\n", | |
" ##########i#7845#7850#7879#7887#8846::Int64\n", | |
" ##########_var0#7846#7851#7880#7888#8847::Bool\n", | |
" ######_var0#7881#7889#8848::Bool\n", | |
" ##I#8849::Tuple{Array{Int64,1}}\n", | |
" ####I#7949#8850::Tuple{Array{Int64,1}}\n", | |
" ######I#7942#7950#8851::Tuple{Array{Int64,1}}\n", | |
" #########s29#7914#7943#7951#8852::Bool\n", | |
" ##########b#7910#7915#7944#7952#8853::Bool\n", | |
" ###########s28#7911#7916#7945#7953#8854::Int64\n", | |
" ##########i#7912#7917#7946#7954#8855::Int64\n", | |
" ##########_var0#7913#7918#7947#7955#8856::Bool\n", | |
" ######_var0#7948#7956#8857::Bool\n", | |
"\n", | |
"Body:\n", | |
" begin # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 17:\n", | |
" NewvarNode(:order)\n", | |
" d = (Base.arraylen)(x0::Array{Float64,1})::Int64 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 18:\n", | |
" simplex = (Main.getindex)(Array{Float64,1},x0::Array{Float64,1})::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 19:\n", | |
" fvalues = (top(typeassert))((top(convert))(Array{Float64,1},(top(vect))((f::F)(x0::Array{Float64,1})::ANY)::ANY)::ANY,Array{Float64,1})::Array{Float64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 20:\n", | |
" GenSym(4) = $(Expr(:new, UnitRange{Int64}, 1, :(((top(getfield))(Base.Intrinsics,:select_value)::I)((Base.sle_int)(1,d::Int64)::Bool,d::Int64,(Base.box)(Int64,(Base.sub_int)(1,1)))::Int64)))\n", | |
" #s41 = (top(getfield))(GenSym(4),:start)::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(#s41::Int64 === (Base.box)(Base.Int,(Base.add_int)((top(getfield))(GenSym(4),:stop)::Int64,1))::Bool)) goto 1\n", | |
" 2: \n", | |
" GenSym(73) = #s41::Int64\n", | |
" GenSym(74) = (Base.box)(Base.Int,(Base.add_int)(#s41::Int64,1))\n", | |
" j = GenSym(73)\n", | |
" #s41 = GenSym(74) # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 21:\n", | |
" GenSym(17) = (Base.arraysize)(x0::Array{Float64,1},1)::Int64\n", | |
" dx = (Base.fill!)((top(ccall))(:jl_alloc_array_1d,(top(apply_type))(Base.Array,Float64,1)::Type{Array{Float64,1}},(top(svec))(Base.Any,Base.Int)::SimpleVector,Array{Float64,1},0,GenSym(17),0)::Array{Float64,1},(Base.box)(Float64,(Base.sitofp)(Float64,0)))::Array{Float64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 22:\n", | |
" (Base.arrayset)(dx::Array{Float64,1},(Base.box)(Float64,(Base.sitofp)(Float64,1)),j::Int64)::Array{Float64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 23:\n", | |
" #101#x = x0::Array{Float64,1} + dx::Array{Float64,1}::Array{Float64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 24:\n", | |
" GenSym(19) = (Base.box)(UInt64,(Base.check_top_bit)(1))\n", | |
" (top(ccall))(:jl_array_grow_end,Base.Void,(top(svec))(Base.Any,Base.UInt)::SimpleVector,simplex::Array{Array{Float64,1},1},0,GenSym(19),0)::Void\n", | |
" GenSym(20) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" (Base.arrayset)(simplex::Array{Array{Float64,1},1},#101#x::Array{Float64,1},GenSym(20))::Array{Array{Float64,1},1}\n", | |
" simplex::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 25:\n", | |
" (Main.push!)(fvalues::Array{Float64,1},(f::F)(#101#x::Array{Float64,1})::ANY)::Array{Float64,1}\n", | |
" 3: \n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(#s41::Int64 === (Base.box)(Base.Int,(Base.add_int)((top(getfield))(GenSym(4),:stop)::Int64,1))::Bool)))) goto 2\n", | |
" 1: \n", | |
" 0: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 29:\n", | |
" GenSym(21) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" order = (Base.Sort.sort!)((Base.vcat)($(Expr(:new, UnitRange{Int64}, 1, :(((top(getfield))(Base.Intrinsics,:select_value)::I)((Base.sle_int)(1,GenSym(21))::Bool,GenSym(21),(Base.box)(Int64,(Base.sub_int)(1,1)))::Int64))))::Array{Int64,1},Base.Sort.DEFAULT_UNSTABLE,call(Base.Sort.Perm,(Base.Sort.ord)(Base.Sort.isless,Base.Sort.identity,false,Base.Sort.Forward)::ANY,fvalues::Array{Float64,1})::BASE.ORDER.PERM{O<:BASE.ORDER.ORDERING,V<:ABSTRACTARRAY{T,1}})::Array{Int64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 30:\n", | |
" GenSym(22) = order::Array{Int64,1}\n", | |
" GenSym(23) = GenSym(22)\n", | |
" GenSym(24) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" ##########b#7843#7848#7877#7885#8826 = true\n", | |
" ###########s28#7844#7849#7878#7886#8827 = 1\n", | |
" GenSym(27) = (Base.arraylen)(GenSym(23))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(###########s28#7844#7849#7878#7886#8827::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(27),1))::Bool)) goto 48\n", | |
" 44: \n", | |
" GenSym(29) = (Base.arrayref)(GenSym(23),###########s28#7844#7849#7878#7886#8827::Int64)::Int64\n", | |
" GenSym(30) = (Base.box)(Base.Int,(Base.add_int)(###########s28#7844#7849#7878#7886#8827::Int64,1))\n", | |
" ##########i#7845#7850#7879#7887#8828 = GenSym(29)\n", | |
" ###########s28#7844#7849#7878#7886#8827 = GenSym(30)\n", | |
" unless (Base.sle_int)(1,##########i#7845#7850#7879#7887#8828::Int64)::Bool goto 45\n", | |
" ##########_var0#7846#7851#7880#7888#8829 = (Base.sle_int)(##########i#7845#7850#7879#7887#8828::Int64,GenSym(24))::Bool\n", | |
" goto 46\n", | |
" 45: \n", | |
" ##########_var0#7846#7851#7880#7888#8829 = false\n", | |
" 46: \n", | |
" ##########b#7843#7848#7877#7885#8826 = (Base.box)(Base.Bool,(Base.and_int)(##########b#7843#7848#7877#7885#8826::Bool,##########_var0#7846#7851#7880#7888#8829::Bool))\n", | |
" 47: \n", | |
" GenSym(28) = (Base.arraylen)(GenSym(23))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(###########s28#7844#7849#7878#7886#8827::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(28),1))::Bool)))) goto 44\n", | |
" 48: \n", | |
" 49: \n", | |
" #########s29#7847#7876#7884#8825 = ##########b#7843#7848#7877#7885#8826::Bool\n", | |
" unless #########s29#7847#7876#7884#8825::Bool goto 50\n", | |
" ######_var0#7881#7889#8830 = #########s29#7847#7876#7884#8825::Bool\n", | |
" goto 51\n", | |
" 50: \n", | |
" ######_var0#7881#7889#8830 = (Base.throw_boundserror)(simplex::Array{Array{Float64,1},1},GenSym(23))::UNION{}\n", | |
" 51: \n", | |
" ######_var0#7881#7889#8830::Bool\n", | |
" simplex = (Base._unsafe_getindex)($(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),simplex::Array{Array{Float64,1},1},GenSym(22))::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 31:\n", | |
" GenSym(31) = order::Array{Int64,1}\n", | |
" GenSym(32) = GenSym(31)\n", | |
" GenSym(33) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" ##########b#7910#7915#7944#7952#8835 = true\n", | |
" ###########s28#7911#7916#7945#7953#8836 = 1\n", | |
" GenSym(36) = (Base.arraylen)(GenSym(32))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(###########s28#7911#7916#7945#7953#8836::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(36),1))::Bool)) goto 57\n", | |
" 53: \n", | |
" GenSym(38) = (Base.arrayref)(GenSym(32),###########s28#7911#7916#7945#7953#8836::Int64)::Int64\n", | |
" GenSym(39) = (Base.box)(Base.Int,(Base.add_int)(###########s28#7911#7916#7945#7953#8836::Int64,1))\n", | |
" ##########i#7912#7917#7946#7954#8837 = GenSym(38)\n", | |
" ###########s28#7911#7916#7945#7953#8836 = GenSym(39)\n", | |
" unless (Base.sle_int)(1,##########i#7912#7917#7946#7954#8837::Int64)::Bool goto 54\n", | |
" ##########_var0#7913#7918#7947#7955#8838 = (Base.sle_int)(##########i#7912#7917#7946#7954#8837::Int64,GenSym(33))::Bool\n", | |
" goto 55\n", | |
" 54: \n", | |
" ##########_var0#7913#7918#7947#7955#8838 = false\n", | |
" 55: \n", | |
" ##########b#7910#7915#7944#7952#8835 = (Base.box)(Base.Bool,(Base.and_int)(##########b#7910#7915#7944#7952#8835::Bool,##########_var0#7913#7918#7947#7955#8838::Bool))\n", | |
" 56: \n", | |
" GenSym(37) = (Base.arraylen)(GenSym(32))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(###########s28#7911#7916#7945#7953#8836::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(37),1))::Bool)))) goto 53\n", | |
" 57: \n", | |
" 58: \n", | |
" #########s29#7914#7943#7951#8834 = ##########b#7910#7915#7944#7952#8835::Bool\n", | |
" unless #########s29#7914#7943#7951#8834::Bool goto 59\n", | |
" ######_var0#7948#7956#8839 = #########s29#7914#7943#7951#8834::Bool\n", | |
" goto 60\n", | |
" 59: \n", | |
" ######_var0#7948#7956#8839 = (Base.throw_boundserror)(fvalues::Array{Float64,1},GenSym(32))::UNION{}\n", | |
" 60: \n", | |
" ######_var0#7948#7956#8839::Bool\n", | |
" GenSym(40) = (Base._unsafe_getindex)($(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),fvalues::Array{Float64,1},GenSym(31))::Array{Float64,1}\n", | |
" fvalues = GenSym(40) # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 34:\n", | |
" GenSym(6) = $(Expr(:new, UnitRange{Int64}, 1, :(((top(getfield))(Base.Intrinsics,:select_value)::I)((Base.sle_int)(1,n::Int64)::Bool,n::Int64,(Base.box)(Int64,(Base.sub_int)(1,1)))::Int64)))\n", | |
" #s40 = (top(getfield))(GenSym(6),:start)::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(#s40::Int64 === (Base.box)(Base.Int,(Base.add_int)((top(getfield))(GenSym(6),:stop)::Int64,1))::Bool)) goto 5\n", | |
" 6: \n", | |
" NewvarNode(symbol(\"#s35\"))\n", | |
" NewvarNode(:x_e)\n", | |
" NewvarNode(:f_e)\n", | |
" NewvarNode(symbol(\"#s34\"))\n", | |
" NewvarNode(:x_c)\n", | |
" NewvarNode(:f_c)\n", | |
" GenSym(75) = #s40::Int64\n", | |
" GenSym(76) = (Base.box)(Base.Int,(Base.add_int)(#s40::Int64,1))\n", | |
" i = GenSym(75)\n", | |
" #s40 = GenSym(76) # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 38:\n", | |
" f_l = (Base.arrayref)(fvalues::Array{Float64,1},1)::Float64 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 39:\n", | |
" GenSym(41) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" f_s = (Base.arrayref)(fvalues::Array{Float64,1},(Base.box)(Int64,(Base.sub_int)(GenSym(41),1)))::Float64 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 40:\n", | |
" GenSym(42) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" x_h = (Base.arrayref)(simplex::Array{Array{Float64,1},1},GenSym(42))::Array{Float64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 41:\n", | |
" GenSym(43) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" f_h = (Base.arrayref)(fvalues::Array{Float64,1},GenSym(43))::Float64 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 42:\n", | |
" c = (Main.centroid)(simplex::Array{Array{Float64,1},1})::Array{Float64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 43:\n", | |
" x_r = c::Array{Float64,1} + Main.alpha * (c::Array{Float64,1} - x_h::Array{Float64,1})::Array{Float64,1}::ANY::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 44:\n", | |
" f_r = (f::F)(x_r)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 45:\n", | |
" unless f_l::Float64 <= f_r::ANY goto 8\n", | |
" #s35 = f_r < f_s::Float64::ANY\n", | |
" goto 9\n", | |
" 8: \n", | |
" #s35 = false\n", | |
" 9: \n", | |
" unless #s35 goto 10 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 47:\n", | |
" GenSym(44) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" (Base.arrayset)(simplex::Array{Array{Float64,1},1},(top(typeassert))((Base.convert)(Array{Float64,1},x_r)::ANY,Array{Float64,1})::Array{Float64,1},GenSym(44))::Array{Array{Float64,1},1}\n", | |
" goto 24\n", | |
" 10: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 48:\n", | |
" unless f_r < f_l::Float64::ANY goto 13 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 50:\n", | |
" x_e = c::Array{Float64,1} + Main.gamma * (x_r - c::Array{Float64,1})::ANY::ANY::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 51:\n", | |
" f_e = (f::F)(x_e)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 52:\n", | |
" unless f_e < f_r::ANY goto 11 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 53:\n", | |
" GenSym(45) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" (Base.arrayset)(simplex::Array{Array{Float64,1},1},(top(typeassert))((Base.convert)(Array{Float64,1},x_e)::ANY,Array{Float64,1})::Array{Float64,1},GenSym(45))::Array{Array{Float64,1},1}\n", | |
" goto 12\n", | |
" 11: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 55:\n", | |
" GenSym(46) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" (Base.arrayset)(simplex::Array{Array{Float64,1},1},(top(typeassert))((Base.convert)(Array{Float64,1},x_r)::ANY,Array{Float64,1})::Array{Float64,1},GenSym(46))::Array{Array{Float64,1},1}\n", | |
" 12: \n", | |
" goto 24\n", | |
" 13: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 57:\n", | |
" unless f_s::Float64 <= f_r::ANY goto 23 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 59:\n", | |
" unless f_s::Float64 <= f_r::ANY goto 14\n", | |
" #s34 = f_r < f_h::Float64::ANY\n", | |
" goto 15\n", | |
" 14: \n", | |
" #s34 = false\n", | |
" 15: \n", | |
" unless #s34 goto 18 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 60:\n", | |
" x_c = c::Array{Float64,1} + Main.beta * (x_r - c::Array{Float64,1})::ANY::ANY::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 61:\n", | |
" f_c = (f::F)(x_c)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 62:\n", | |
" unless f_c <= f_r::ANY goto 16 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 63:\n", | |
" GenSym(47) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" (Base.arrayset)(simplex::Array{Array{Float64,1},1},(top(typeassert))((Base.convert)(Array{Float64,1},x_c)::ANY,Array{Float64,1})::Array{Float64,1},GenSym(47))::Array{Array{Float64,1},1}\n", | |
" goto 17\n", | |
" 16: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 65:\n", | |
" simplex = (Main.shrink)(simplex::Array{Array{Float64,1},1})::Array{Array{Float64,1},1}\n", | |
" 17: \n", | |
" goto 22\n", | |
" 18: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 67:\n", | |
" unless f_h::Float64 <= f_r::ANY goto 21 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 68:\n", | |
" x_c = c::Array{Float64,1} + Main.beta * (x_h::Array{Float64,1} - c::Array{Float64,1})::Array{Float64,1}::ANY::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 69:\n", | |
" f_c = (f::F)(x_c)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 70:\n", | |
" unless f_c < f_h::Float64::ANY goto 19 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 71:\n", | |
" GenSym(48) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" (Base.arrayset)(simplex::Array{Array{Float64,1},1},(top(typeassert))((Base.convert)(Array{Float64,1},x_c)::ANY,Array{Float64,1})::Array{Float64,1},GenSym(48))::Array{Array{Float64,1},1}\n", | |
" goto 20\n", | |
" 19: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 73:\n", | |
" simplex = (Main.shrink)(simplex::Array{Array{Float64,1},1})::Array{Array{Float64,1},1}\n", | |
" 20: \n", | |
" goto 22\n", | |
" 21: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 76:\n", | |
" simplex = (Main.shrink)(simplex::Array{Array{Float64,1},1})::Array{Array{Float64,1},1}\n", | |
" 22: \n", | |
" goto 24\n", | |
" 23: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 79:\n", | |
" simplex = (Main.shrink)(simplex::Array{Array{Float64,1},1})::Array{Array{Float64,1},1}\n", | |
" 24: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 82:\n", | |
" GenSym(8) = simplex::Array{Array{Float64,1},1}\n", | |
" GenSym(9) = (Base.arraylen)(GenSym(8))::Int64\n", | |
" 25: \n", | |
" GenSym(11) = (top(ccall))(:jl_alloc_array_1d,(top(apply_type))(Base.Array,Any,1)::Type{Array{Any,1}},(top(svec))(Base.Any,Base.Int)::SimpleVector,Array{Any,1},0,GenSym(9),0)::Array{Any,1}\n", | |
" #s39 = 1\n", | |
" #s38 = 1\n", | |
" #s37 = 0\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(#s37::Int64 === GenSym(9)::Bool)) goto 27\n", | |
" 28: \n", | |
" #s37 = (Base.box)(Base.Int,(Base.add_int)(#s37::Int64,1))\n", | |
" GenSym(77) = (Base.arrayref)(GenSym(8),#s38::Int64)::Array{Float64,1}\n", | |
" GenSym(78) = (Base.box)(Base.Int,(Base.add_int)(#s38::Int64,1))\n", | |
" #s36 = 1\n", | |
" GenSym(79) = GenSym(77)\n", | |
" GenSym(80) = (Base.box)(Base.Int,(Base.add_int)(1,1))\n", | |
" #102#x = GenSym(79)\n", | |
" #s36 = GenSym(80)\n", | |
" GenSym(81) = GenSym(78)\n", | |
" GenSym(82) = (Base.box)(Base.Int,(Base.add_int)(2,1))\n", | |
" #s38 = GenSym(81)\n", | |
" #s36 = GenSym(82)\n", | |
" GenSym(12) = (f::F)(#102#x::Array{Float64,1})::ANY\n", | |
" $(Expr(:type_goto, 25, GenSym(12)))\n", | |
" $(Expr(:boundscheck, false))\n", | |
" (Base.arrayset)(GenSym(11),GenSym(12),#s39::Int64)::Array{Any,1}\n", | |
" $(Expr(:boundscheck, :(Main.pop)))\n", | |
" #s39 = (Base.box)(Base.Int,(Base.add_int)(#s39::Int64,1))\n", | |
" 29: \n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(#s37::Int64 === GenSym(9)::Bool)))) goto 28\n", | |
" 27: \n", | |
" 26: \n", | |
" GenSym(16) = GenSym(11)\n", | |
" GenSym(50) = (Base.arraysize)(GenSym(16),1)::Int64\n", | |
" GenSym(52) = (top(ccall))(:jl_alloc_array_1d,(top(apply_type))(Base.Array,Float64,1)::Type{Array{Float64,1}},(top(svec))(Base.Any,Base.Int)::SimpleVector,Array{Float64,1},0,GenSym(50),0)::Array{Float64,1}\n", | |
" fvalues = (Base.copy!)($(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),GenSym(52),$(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),GenSym(16))::Array{Float64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 83:\n", | |
" GenSym(53) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" order = (Base.Sort.sort!)((Base.vcat)($(Expr(:new, UnitRange{Int64}, 1, :(((top(getfield))(Base.Intrinsics,:select_value)::I)((Base.sle_int)(1,GenSym(53))::Bool,GenSym(53),(Base.box)(Int64,(Base.sub_int)(1,1)))::Int64))))::Array{Int64,1},Base.Sort.DEFAULT_UNSTABLE,call(Base.Sort.Perm,(Base.Sort.ord)(Base.Sort.isless,Base.Sort.identity,false,Base.Sort.Forward)::ANY,fvalues::Array{Float64,1})::BASE.ORDER.PERM{O<:BASE.ORDER.ORDERING,V<:ABSTRACTARRAY{T,1}})::Array{Int64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 84:\n", | |
" GenSym(54) = order::Array{Int64,1}\n", | |
" GenSym(55) = GenSym(54)\n", | |
" GenSym(56) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" ##########b#7843#7848#7877#7885#8844 = true\n", | |
" ###########s28#7844#7849#7878#7886#8845 = 1\n", | |
" GenSym(59) = (Base.arraylen)(GenSym(55))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(###########s28#7844#7849#7878#7886#8845::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(59),1))::Bool)) goto 107\n", | |
" 103: \n", | |
" GenSym(61) = (Base.arrayref)(GenSym(55),###########s28#7844#7849#7878#7886#8845::Int64)::Int64\n", | |
" GenSym(62) = (Base.box)(Base.Int,(Base.add_int)(###########s28#7844#7849#7878#7886#8845::Int64,1))\n", | |
" ##########i#7845#7850#7879#7887#8846 = GenSym(61)\n", | |
" ###########s28#7844#7849#7878#7886#8845 = GenSym(62)\n", | |
" unless (Base.sle_int)(1,##########i#7845#7850#7879#7887#8846::Int64)::Bool goto 104\n", | |
" ##########_var0#7846#7851#7880#7888#8847 = (Base.sle_int)(##########i#7845#7850#7879#7887#8846::Int64,GenSym(56))::Bool\n", | |
" goto 105\n", | |
" 104: \n", | |
" ##########_var0#7846#7851#7880#7888#8847 = false\n", | |
" 105: \n", | |
" ##########b#7843#7848#7877#7885#8844 = (Base.box)(Base.Bool,(Base.and_int)(##########b#7843#7848#7877#7885#8844::Bool,##########_var0#7846#7851#7880#7888#8847::Bool))\n", | |
" 106: \n", | |
" GenSym(60) = (Base.arraylen)(GenSym(55))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(###########s28#7844#7849#7878#7886#8845::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(60),1))::Bool)))) goto 103\n", | |
" 107: \n", | |
" 108: \n", | |
" #########s29#7847#7876#7884#8843 = ##########b#7843#7848#7877#7885#8844::Bool\n", | |
" unless #########s29#7847#7876#7884#8843::Bool goto 109\n", | |
" ######_var0#7881#7889#8848 = #########s29#7847#7876#7884#8843::Bool\n", | |
" goto 110\n", | |
" 109: \n", | |
" ######_var0#7881#7889#8848 = (Base.throw_boundserror)(simplex::Array{Array{Float64,1},1},GenSym(55))::UNION{}\n", | |
" 110: \n", | |
" ######_var0#7881#7889#8848::Bool\n", | |
" simplex = (Base._unsafe_getindex)($(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),simplex::Array{Array{Float64,1},1},GenSym(54))::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 85:\n", | |
" GenSym(63) = order::Array{Int64,1}\n", | |
" GenSym(64) = GenSym(63)\n", | |
" GenSym(65) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" ##########b#7910#7915#7944#7952#8853 = true\n", | |
" ###########s28#7911#7916#7945#7953#8854 = 1\n", | |
" GenSym(68) = (Base.arraylen)(GenSym(64))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(###########s28#7911#7916#7945#7953#8854::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(68),1))::Bool)) goto 116\n", | |
" 112: \n", | |
" GenSym(70) = (Base.arrayref)(GenSym(64),###########s28#7911#7916#7945#7953#8854::Int64)::Int64\n", | |
" GenSym(71) = (Base.box)(Base.Int,(Base.add_int)(###########s28#7911#7916#7945#7953#8854::Int64,1))\n", | |
" ##########i#7912#7917#7946#7954#8855 = GenSym(70)\n", | |
" ###########s28#7911#7916#7945#7953#8854 = GenSym(71)\n", | |
" unless (Base.sle_int)(1,##########i#7912#7917#7946#7954#8855::Int64)::Bool goto 113\n", | |
" ##########_var0#7913#7918#7947#7955#8856 = (Base.sle_int)(##########i#7912#7917#7946#7954#8855::Int64,GenSym(65))::Bool\n", | |
" goto 114\n", | |
" 113: \n", | |
" ##########_var0#7913#7918#7947#7955#8856 = false\n", | |
" 114: \n", | |
" ##########b#7910#7915#7944#7952#8853 = (Base.box)(Base.Bool,(Base.and_int)(##########b#7910#7915#7944#7952#8853::Bool,##########_var0#7913#7918#7947#7955#8856::Bool))\n", | |
" 115: \n", | |
" GenSym(69) = (Base.arraylen)(GenSym(64))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(###########s28#7911#7916#7945#7953#8854::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(69),1))::Bool)))) goto 112\n", | |
" 116: \n", | |
" 117: \n", | |
" #########s29#7914#7943#7951#8852 = ##########b#7910#7915#7944#7952#8853::Bool\n", | |
" unless #########s29#7914#7943#7951#8852::Bool goto 118\n", | |
" ######_var0#7948#7956#8857 = #########s29#7914#7943#7951#8852::Bool\n", | |
" goto 119\n", | |
" 118: \n", | |
" ######_var0#7948#7956#8857 = (Base.throw_boundserror)(fvalues::Array{Float64,1},GenSym(64))::UNION{}\n", | |
" 119: \n", | |
" ######_var0#7948#7956#8857::Bool\n", | |
" GenSym(72) = (Base._unsafe_getindex)($(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),fvalues::Array{Float64,1},GenSym(63))::Array{Float64,1}\n", | |
" fvalues = GenSym(72)\n", | |
" 7: \n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(#s40::Int64 === (Base.box)(Base.Int,(Base.add_int)((top(getfield))(GenSym(6),:stop)::Int64,1))::Bool)))) goto 6\n", | |
" 5: \n", | |
" 4: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 89:\n", | |
" return (Base.arrayref)(simplex::Array{Array{Float64,1},1},1)::Array{Float64,1}\n", | |
" end::Array{Float64,1}\n" | |
] | |
} | |
], | |
"source": [ | |
"@code_warntype nelder_mead(rosenblock, x0, 100000)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 37, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" 0.815193 seconds (10.60 M allocations: 801.442 MB, 9.02% gc time)\n", | |
" 0.809697 seconds (10.59 M allocations: 801.107 MB, 8.86% gc time)\n", | |
" 0.721166 seconds (10.59 M allocations: 801.107 MB, 8.73% gc time)\n" | |
] | |
} | |
], | |
"source": [ | |
"@time nelder_mead(rosenblock, x0, 100000)\n", | |
"@time nelder_mead(rosenblock, x0, 100000)\n", | |
"@time nelder_mead(rosenblock, x0, 100000);" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 2. オブジェクトのアロケーション回避&GC回避" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 38, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"1 arraymath.jl; +; line: 96\n", | |
"604 task.jl; anonymous; line: 447\n", | |
" 604 .../IJulia/src/IJulia.jl; eventloop; line: 141\n", | |
" 604 ...rc/execute_request.jl; execute_request_0x535c5df2; line: 177\n", | |
" 604 loading.jl; include_string; line: 266\n", | |
" 604 profile.jl; anonymous; line: 16\n", | |
" 2 ...o/No5/nelder_mead.jl; nelder_mead; line: 17\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 38\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 41\n", | |
" 169 ...o/No5/nelder_mead.jl; nelder_mead; line: 42\n", | |
" 3 .../No5/nelder_mead.jl; centroid; line: 100\n", | |
" 6 .../No5/nelder_mead.jl; centroid; line: 101\n", | |
" 5 array.jl; getindex; line: 288\n", | |
" 3 array.jl; unsafe_getindex; line: 291\n", | |
" 2 array.jl; unsafe_getindex; line: 293\n", | |
" 2 array.jl; unsafe_copy!; line: 83\n", | |
" 148 .../No5/nelder_mead.jl; centroid; line: 102\n", | |
" 132 arraymath.jl; +; line: 96\n", | |
" 3 arraymath.jl; +; line: 97\n", | |
" 7 arraymath.jl; +; line: 98\n", | |
" 12 .../No5/nelder_mead.jl; centroid; line: 104\n", | |
" 11 arraymath.jl; ./; line: 49\n", | |
" 28 ...o/No5/nelder_mead.jl; nelder_mead; line: 43\n", | |
" 1 abstractarraymath.jl; *; line: 54\n", | |
" 1 arraymath.jl; .*; line: 118\n", | |
" 6 arraymath.jl; +; line: 96\n", | |
" 2 arraymath.jl; +; line: 98\n", | |
" 1 arraymath.jl; -; line: 96\n", | |
" 3 arraymath.jl; -; line: 98\n", | |
" 6 ...o/No5/nelder_mead.jl; nelder_mead; line: 44\n", | |
" 2 ...o/No5/nelder_mead.jl; rosenblock; line: 123\n", | |
" 6 ...o/No5/nelder_mead.jl; nelder_mead; line: 45\n", | |
" 4 ...o/No5/nelder_mead.jl; nelder_mead; line: 47\n", | |
" 2 ...o/No5/nelder_mead.jl; nelder_mead; line: 48\n", | |
" 6 ...o/No5/nelder_mead.jl; nelder_mead; line: 50\n", | |
" 1 abstractarraymath.jl; *; line: 54\n", | |
" 1 arraymath.jl; .*; line: 118\n", | |
" 1 arraymath.jl; +; line: 96\n", | |
" 1 arraymath.jl; -; line: 96\n", | |
" 1 arraymath.jl; -; line: 98\n", | |
" 2 ...o/No5/nelder_mead.jl; nelder_mead; line: 55\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 59\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 60\n", | |
" 1 abstractarraymath.jl; *; line: 54\n", | |
" 1 arraymath.jl; .*; line: 118\n", | |
" 2 ...o/No5/nelder_mead.jl; nelder_mead; line: 68\n", | |
" 1 abstractarraymath.jl; *; line: 54\n", | |
" 1 arraymath.jl; .*; line: 118\n", | |
" 186 ...o/No5/nelder_mead.jl; nelder_mead; line: 82\n", | |
" 2 .../No5/nelder_mead.jl; rosenblock; line: 122\n", | |
" 30 .../No5/nelder_mead.jl; rosenblock; line: 123\n", | |
" 1 abstractarray.jl; copy!; line: 307\n", | |
" 111 abstractarray.jl; copy!; line: 310\n", | |
" 1 essentials.jl; convert; line: 59\n", | |
" 1 abstractarray.jl; copy!; line: 312\n", | |
" 157 ...o/No5/nelder_mead.jl; nelder_mead; line: 83\n", | |
" 13 .../lib/julia/sys.dylib; vcat; (unknown line)\n", | |
" 1 ordering.jl; call; line: 44\n", | |
" 21 sort.jl; sort!; line: 601\n", | |
" 4 sort.jl; fpsort!; line: 583\n", | |
" 1 sort.jl; nans2right!; line: 559\n", | |
" 2 sort.jl; nans2right!; line: 564\n", | |
" 1 sort.jl; nans2right!; line: 565\n", | |
" 1 sort.jl; fpsort!; line: 585\n", | |
" 6 sort.jl; fpsort!; line: 586\n", | |
" 1 sort.jl; fpsort!; line: 591\n", | |
" 1 sort.jl; sort!; line: 302\n", | |
" 8 sort.jl; fpsort!; line: 592\n", | |
" 7 sort.jl; sort!; line: 292\n", | |
" 4 sort.jl; sort!; line: 221\n", | |
" 1 sort.jl; sort!; line: 228\n", | |
" 1 sort.jl; sort!; line: 230\n", | |
" 1 sort.jl; fpsort!; line: 593\n", | |
" 18 ...o/No5/nelder_mead.jl; nelder_mead; line: 84\n", | |
" 3 multidimensional.jl; _unsafe_getindex; line: 193\n", | |
" 5 multidimensional.jl; _unsafe_getindex; line: 194\n", | |
" 3 .../lib/julia/sys.dylib; ==; (unknown line)\n", | |
" 2 multidimensional.jl; checksize; line: 267\n", | |
" 7 multidimensional.jl; _unsafe_getindex; line: 195\n", | |
" 12 ...o/No5/nelder_mead.jl; nelder_mead; line: 85\n", | |
" 7 multidimensional.jl; _unsafe_getindex; line: 193\n", | |
" 1 multidimensional.jl; _unsafe_getindex; line: 195\n" | |
] | |
} | |
], | |
"source": [ | |
"Profile.clear()\n", | |
"@profile nelder_mead(rosenblock, x0, 100000)\n", | |
"Profile.print()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"`centroid`の計算が遅そう" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 39, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"s = [rand(10000) for i in 1:10000];" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 40, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" 0.408371 seconds (40.01 k allocations: 764.008 MB, 16.50% gc time)\n", | |
"elapsed time (ns): 408371142\n", | |
"gc time (ns): 67378675\n", | |
"bytes allocated: 801120256\n", | |
"pool allocs: 30004\n", | |
"malloc() calls: 10002\n", | |
"GC pauses: 1\n", | |
"full collections: 1\n" | |
] | |
} | |
], | |
"source": [ | |
"@timev centroid(s);" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"メモリのアロケーションが多い" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Juliaでは、`+=`の計算はベクトルのコピーを作る\n", | |
"\n", | |
"before:\n", | |
"```julia\n", | |
"for x in xs\n", | |
" c += x\n", | |
"end\n", | |
"```\n", | |
"\n", | |
"after:\n", | |
"```julia\n", | |
"for x in xs\n", | |
" for i in 1:endof(x)\n", | |
" c[i] += x[i]\n", | |
" end\n", | |
"end\n", | |
"```" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 41, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"include(\"nelder_mead.jl\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 43, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" 0.132094 seconds (10 allocations: 234.719 KB)\n", | |
"elapsed time (ns): 132093869\n", | |
"bytes allocated: 240352\n", | |
"pool allocs: 7\n", | |
"malloc() calls: 3\n" | |
] | |
} | |
], | |
"source": [ | |
"@timev centroid(s);" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"動作チェック" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 45, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"4-element Array{Float64,1}:\n", | |
" 1.0\n", | |
" 1.0\n", | |
" 1.0\n", | |
" 1.0" | |
] | |
}, | |
"execution_count": 45, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"nelder_mead(rosenblock, randn(4), 1000)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 46, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" 0.703444 seconds (6.59 M allocations: 343.343 MB)\n", | |
" 0.705762 seconds (6.59 M allocations: 343.343 MB)\n", | |
" 0.702951 seconds (6.59 M allocations: 343.343 MB)\n" | |
] | |
} | |
], | |
"source": [ | |
"@time nelder_mead(rosenblock, x0, 100000);\n", | |
"@time nelder_mead(rosenblock, x0, 100000);\n", | |
"@time nelder_mead(rosenblock, x0, 100000);" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 3. アルゴリズムを理解して無駄な計算を減らす" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 47, | |
"metadata": { | |
"collapsed": false, | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"1 array.jl; getindex; line: 288\n", | |
"1 essentials.jl; convert; line: 59\n", | |
"593 task.jl; anonymous; line: 447\n", | |
" 593 .../IJulia/src/IJulia.jl; eventloop; line: 141\n", | |
" 593 ...rc/execute_request.jl; execute_request_0x535c5df2; line: 177\n", | |
" 593 loading.jl; include_string; line: 266\n", | |
" 592 profile.jl; anonymous; line: 16\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 17\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 40\n", | |
" 93 ...o/No5/nelder_mead.jl; nelder_mead; line: 42\n", | |
" 11 ...o/No5/nelder_mead.jl; centroid; line: 100\n", | |
" 11 ...o/No5/nelder_mead.jl; centroid; line: 101\n", | |
" 10 array.jl; getindex; line: 288\n", | |
" 7 array.jl; unsafe_getindex; line: 291\n", | |
" 3 array.jl; unsafe_getindex; line: 293\n", | |
" 3 array.jl; unsafe_copy!; line: 83\n", | |
" 5 ...o/No5/nelder_mead.jl; centroid; line: 102\n", | |
" 41 ...o/No5/nelder_mead.jl; centroid; line: 103\n", | |
" 25 ...o/No5/nelder_mead.jl; centroid; line: 106\n", | |
" 24 arraymath.jl; ./; line: 49\n", | |
" 52 ...o/No5/nelder_mead.jl; nelder_mead; line: 43\n", | |
" 10 abstractarraymath.jl; *; line: 54\n", | |
" 7 arraymath.jl; .*; line: 118\n", | |
" 2 arraymath.jl; .*; line: 120\n", | |
" 1 arraymath.jl; .*; line: 122\n", | |
" 9 arraymath.jl; +; line: 96\n", | |
" 8 arraymath.jl; +; line: 98\n", | |
" 7 arraymath.jl; -; line: 96\n", | |
" 4 arraymath.jl; -; line: 98\n", | |
" 5 ...o/No5/nelder_mead.jl; nelder_mead; line: 44\n", | |
" 1 ...o/No5/nelder_mead.jl; rosenblock; line: 125\n", | |
" 9 ...o/No5/nelder_mead.jl; nelder_mead; line: 45\n", | |
" 11 ...o/No5/nelder_mead.jl; nelder_mead; line: 47\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 48\n", | |
" 7 ...o/No5/nelder_mead.jl; nelder_mead; line: 50\n", | |
" 2 abstractarraymath.jl; *; line: 54\n", | |
" 2 arraymath.jl; .*; line: 118\n", | |
" 2 arraymath.jl; +; line: 96\n", | |
" 2 arraymath.jl; -; line: 96\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 51\n", | |
" 3 ...o/No5/nelder_mead.jl; nelder_mead; line: 52\n", | |
" 1 float.jl; <; line: 240\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 53\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 59\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 61\n", | |
" 1 ...o/No5/nelder_mead.jl; rosenblock; line: 125\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 68\n", | |
" 1 abstractarraymath.jl; *; line: 54\n", | |
" 1 arraymath.jl; .*; line: 120\n", | |
" 211 ...o/No5/nelder_mead.jl; nelder_mead; line: 82\n", | |
" 2 .../No5/nelder_mead.jl; rosenblock; line: 124\n", | |
" 41 .../No5/nelder_mead.jl; rosenblock; line: 125\n", | |
" 1 .../No5/nelder_mead.jl; rosenblock; line: 127\n", | |
" 108 abstractarray.jl; copy!; line: 310\n", | |
" 146 ...o/No5/nelder_mead.jl; nelder_mead; line: 83\n", | |
" 20 .../lib/julia/sys.dylib; vcat; (unknown line)\n", | |
" 1 ordering.jl; call; line: 44\n", | |
" 21 sort.jl; sort!; line: 601\n", | |
" 5 sort.jl; fpsort!; line: 583\n", | |
" 3 sort.jl; nans2right!; line: 564\n", | |
" 5 sort.jl; fpsort!; line: 586\n", | |
" 11 sort.jl; fpsort!; line: 592\n", | |
" 8 sort.jl; sort!; line: 292\n", | |
" 1 sort.jl; sort!; line: 217\n", | |
" 1 sort.jl; sort!; line: 219\n", | |
" 2 sort.jl; sort!; line: 221\n", | |
" 1 sort.jl; sort!; line: 222\n", | |
" 2 sort.jl; sort!; line: 228\n", | |
" 1 sort.jl; sort!; line: 230\n", | |
" 24 ...o/No5/nelder_mead.jl; nelder_mead; line: 84\n", | |
" 15 multidimensional.jl; _unsafe_getindex; line: 193\n", | |
" 1 multidimensional.jl; _unsafe_getindex; line: 194\n", | |
" 1 multidimensional.jl; checksize; line: 267\n", | |
" 1 .../lib/julia/sys.dylib; ==; (unknown line)\n", | |
" 3 multidimensional.jl; _unsafe_getindex; line: 195\n", | |
" 23 ...o/No5/nelder_mead.jl; nelder_mead; line: 85\n", | |
" 14 multidimensional.jl; _unsafe_getindex; line: 193\n", | |
" 2 multidimensional.jl; _unsafe_getindex; line: 194\n", | |
" 1 .../lib/julia/sys.dylib; ==; (unknown line)\n", | |
" 1 multidimensional.jl; checksize; line: 267\n", | |
" 1 .../lib/julia/sys.dylib; ==; (unknown line)\n", | |
" 5 multidimensional.jl; _unsafe_getindex; line: 195\n" | |
] | |
} | |
], | |
"source": [ | |
"Profile.clear()\n", | |
"@profile nelder_mead(rosenblock, x0, 100000)\n", | |
"Profile.print()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Nelder-Meadでは`shrink`以外で2頂点以上が同時に動くことはないので、全頂点で関数値の再計算は無駄\n", | |
"\n", | |
"```julia\n", | |
"fvalues = [f(x) for x in simplex]\n", | |
"```\n", | |
"\n", | |
"* 動いた頂点だけ、`fvalues`を更新\n", | |
"* `shrink`時のみ全頂点を再計算" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 48, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"include(\"nelder_mead.jl\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 49, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"4-element Array{Float64,1}:\n", | |
" 1.0\n", | |
" 1.0\n", | |
" 1.0\n", | |
" 1.0" | |
] | |
}, | |
"execution_count": 49, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"nelder_mead(rosenblock, randn(4), 1000)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 51, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" 0.372867 seconds (2.29 M allocations: 235.007 MB, 5.04% gc time)\n", | |
" 0.373457 seconds (2.29 M allocations: 235.007 MB, 4.93% gc time)\n", | |
" 0.356008 seconds (2.29 M allocations: 235.007 MB, 4.74% gc time)\n" | |
] | |
} | |
], | |
"source": [ | |
"@time nelder_mead(rosenblock, x0, 100000);\n", | |
"@time nelder_mead(rosenblock, x0, 100000);\n", | |
"@time nelder_mead(rosenblock, x0, 100000);" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### 他にできそうなチューニングは?" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 52, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"303 task.jl; anonymous; line: 447\n", | |
" 303 .../IJulia/src/IJulia.jl; eventloop; line: 141\n", | |
" 303 ...rc/execute_request.jl; execute_request_0x535c5df2; line: 177\n", | |
" 303 loading.jl; include_string; line: 266\n", | |
" 303 profile.jl; anonymous; line: 16\n", | |
" 79 ...o/No5/nelder_mead.jl; nelder_mead; line: 42\n", | |
" 4 ...o/No5/nelder_mead.jl; centroid; line: 108\n", | |
" 1 array.jl; fill!; line: 188\n", | |
" 15 ...o/No5/nelder_mead.jl; centroid; line: 109\n", | |
" 13 array.jl; getindex; line: 288\n", | |
" 7 array.jl; unsafe_getindex; line: 291\n", | |
" 6 array.jl; unsafe_getindex; line: 293\n", | |
" 2 array.jl; unsafe_copy!; line: 82\n", | |
" 3 array.jl; unsafe_copy!; line: 83\n", | |
" 5 ...o/No5/nelder_mead.jl; centroid; line: 110\n", | |
" 34 ...o/No5/nelder_mead.jl; centroid; line: 111\n", | |
" 21 ...o/No5/nelder_mead.jl; centroid; line: 114\n", | |
" 21 arraymath.jl; ./; line: 49\n", | |
" 1 .../lib/julia/sys.dylib; ==; (unknown line)\n", | |
" 25 ...o/No5/nelder_mead.jl; nelder_mead; line: 43\n", | |
" 11 abstractarraymath.jl; *; line: 54\n", | |
" 9 arraymath.jl; .*; line: 118\n", | |
" 1 arraymath.jl; .*; line: 119\n", | |
" 1 arraymath.jl; .*; line: 120\n", | |
" 4 arraymath.jl; +; line: 96\n", | |
" 1 arraymath.jl; +; line: 98\n", | |
" 2 arraymath.jl; -; line: 96\n", | |
" 1 arraymath.jl; -; line: 98\n", | |
" 6 ...o/No5/nelder_mead.jl; nelder_mead; line: 44\n", | |
" 2 ...o/No5/nelder_mead.jl; rosenblock; line: 133\n", | |
" 5 ...o/No5/nelder_mead.jl; nelder_mead; line: 45\n", | |
" 9 ...o/No5/nelder_mead.jl; nelder_mead; line: 47\n", | |
" 9 ...o/No5/nelder_mead.jl; nelder_mead; line: 48\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 49\n", | |
" 9 ...o/No5/nelder_mead.jl; nelder_mead; line: 51\n", | |
" 2 abstractarraymath.jl; *; line: 54\n", | |
" 2 arraymath.jl; .*; line: 118\n", | |
" 3 arraymath.jl; +; line: 96\n", | |
" 3 arraymath.jl; -; line: 96\n", | |
" 1 arraymath.jl; -; line: 98\n", | |
" 2 ...o/No5/nelder_mead.jl; nelder_mead; line: 52\n", | |
" 1 ...o/No5/nelder_mead.jl; rosenblock; line: 133\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 54\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 55\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 57\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 58\n", | |
" 3 ...o/No5/nelder_mead.jl; nelder_mead; line: 73\n", | |
" 1 abstractarraymath.jl; *; line: 54\n", | |
" 1 arraymath.jl; .*; line: 118\n", | |
" 1 arraymath.jl; -; line: 97\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 74\n", | |
" 1 ...o/No5/nelder_mead.jl; nelder_mead; line: 77\n", | |
" 122 ...o/No5/nelder_mead.jl; nelder_mead; line: 91\n", | |
" 4 .../lib/julia/sys.dylib; vcat; (unknown line)\n", | |
" 13 sort.jl; sort!; line: 601\n", | |
" 1 sort.jl; fpsort!; line: 583\n", | |
" 1 sort.jl; nans2right!; line: 564\n", | |
" 4 sort.jl; fpsort!; line: 586\n", | |
" 1 sort.jl; fpsort!; line: 591\n", | |
" 1 sort.jl; sort!; line: 302\n", | |
" 7 sort.jl; fpsort!; line: 592\n", | |
" 6 sort.jl; sort!; line: 292\n", | |
" 1 sort.jl; sort!; line: 217\n", | |
" 5 sort.jl; sort!; line: 221\n", | |
" 1 sort.jl; sort!; line: 302\n", | |
" 17 ...o/No5/nelder_mead.jl; nelder_mead; line: 92\n", | |
" 10 multidimensional.jl; _unsafe_getindex; line: 193\n", | |
" 3 multidimensional.jl; _unsafe_getindex; line: 195\n", | |
" 10 ...o/No5/nelder_mead.jl; nelder_mead; line: 93\n", | |
" 1 multidimensional.jl; _unsafe_getindex; line: 192\n", | |
" 7 multidimensional.jl; _unsafe_getindex; line: 193\n", | |
" 1 multidimensional.jl; _unsafe_getindex; line: 195\n" | |
] | |
} | |
], | |
"source": [ | |
"Profile.clear()\n", | |
"@profile nelder_mead(rosenblock, x0, 100000)\n", | |
"Profile.print()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 53, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Variables:\n", | |
" f::F\n", | |
" x0::Array{Float64,1}\n", | |
" n::Int64\n", | |
" d::Int64\n", | |
" order::Array{Int64,1}\n", | |
" simplex::Array{Array{Float64,1},1}\n", | |
" fvalues::Array{Float64,1}\n", | |
" #s40::Int64\n", | |
" i::Int64\n", | |
" f_l::Float64\n", | |
" f_s::Float64\n", | |
" x_h::Array{Float64,1}\n", | |
" f_h::Float64\n", | |
" c::Array{Float64,1}\n", | |
" x_r::ANY\n", | |
" f_r::ANY\n", | |
" #s23::ANY\n", | |
" x_e::ANY\n", | |
" f_e::ANY\n", | |
" #s22::ANY\n", | |
" x_c::ANY\n", | |
" f_c::ANY\n", | |
" #s27::Int64\n", | |
" #s26::Int64\n", | |
" #s25::Int64\n", | |
" #s24::Int64\n", | |
" #170#x::Array{Float64,1}\n", | |
" #s31::Int64\n", | |
" #s30::Int64\n", | |
" #s29::Int64\n", | |
" #s28::Int64\n", | |
" #169#x::Array{Float64,1}\n", | |
" #s35::Int64\n", | |
" #s34::Int64\n", | |
" #s33::Int64\n", | |
" #s32::Int64\n", | |
" #168#x::Array{Float64,1}\n", | |
" #s39::Int64\n", | |
" #s38::Int64\n", | |
" #s37::Int64\n", | |
" #s36::Int64\n", | |
" #167#x::Array{Float64,1}\n", | |
" #s41::Int64\n", | |
" j::Int64\n", | |
" dx::Array{Float64,1}\n", | |
" #166#x::Array{Float64,1}\n", | |
" ##I#8971::Tuple{Array{Int64,1}}\n", | |
" ####I#7882#8972::Tuple{Array{Int64,1}}\n", | |
" ######I#7875#7883#8973::Tuple{Array{Int64,1}}\n", | |
" #########s29#7847#7876#7884#8974::Bool\n", | |
" ##########b#7843#7848#7877#7885#8975::Bool\n", | |
" ###########s28#7844#7849#7878#7886#8976::Int64\n", | |
" ##########i#7845#7850#7879#7887#8977::Int64\n", | |
" ##########_var0#7846#7851#7880#7888#8978::Bool\n", | |
" ######_var0#7881#7889#8979::Bool\n", | |
" ##I#8980::Tuple{Array{Int64,1}}\n", | |
" ####I#7949#8981::Tuple{Array{Int64,1}}\n", | |
" ######I#7942#7950#8982::Tuple{Array{Int64,1}}\n", | |
" #########s29#7914#7943#7951#8983::Bool\n", | |
" ##########b#7910#7915#7944#7952#8984::Bool\n", | |
" ###########s28#7911#7916#7945#7953#8985::Int64\n", | |
" ##########i#7912#7917#7946#7954#8986::Int64\n", | |
" ##########_var0#7913#7918#7947#7955#8987::Bool\n", | |
" ######_var0#7948#7956#8988::Bool\n", | |
" ##I#8989::Tuple{Array{Int64,1}}\n", | |
" ####I#7882#8990::Tuple{Array{Int64,1}}\n", | |
" ######I#7875#7883#8991::Tuple{Array{Int64,1}}\n", | |
" #########s29#7847#7876#7884#8992::Bool\n", | |
" ##########b#7843#7848#7877#7885#8993::Bool\n", | |
" ###########s28#7844#7849#7878#7886#8994::Int64\n", | |
" ##########i#7845#7850#7879#7887#8995::Int64\n", | |
" ##########_var0#7846#7851#7880#7888#8996::Bool\n", | |
" ######_var0#7881#7889#8997::Bool\n", | |
" ##I#8998::Tuple{Array{Int64,1}}\n", | |
" ####I#7949#8999::Tuple{Array{Int64,1}}\n", | |
" ######I#7942#7950#9000::Tuple{Array{Int64,1}}\n", | |
" #########s29#7914#7943#7951#9001::Bool\n", | |
" ##########b#7910#7915#7944#7952#9002::Bool\n", | |
" ###########s28#7911#7916#7945#7953#9003::Int64\n", | |
" ##########i#7912#7917#7946#7954#9004::Int64\n", | |
" ##########_var0#7913#7918#7947#7955#9005::Bool\n", | |
" ######_var0#7948#7956#9006::Bool\n", | |
"\n", | |
"Body:\n", | |
" begin # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 17:\n", | |
" NewvarNode(:order)\n", | |
" d = (Base.arraylen)(x0::Array{Float64,1})::Int64 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 18:\n", | |
" simplex = (Main.getindex)(Array{Float64,1},x0::Array{Float64,1})::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 19:\n", | |
" fvalues = (top(typeassert))((top(convert))(Array{Float64,1},(top(vect))((f::F)(x0::Array{Float64,1})::ANY)::ANY)::ANY,Array{Float64,1})::Array{Float64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 20:\n", | |
" GenSym(4) = $(Expr(:new, UnitRange{Int64}, 1, :(((top(getfield))(Base.Intrinsics,:select_value)::I)((Base.sle_int)(1,d::Int64)::Bool,d::Int64,(Base.box)(Int64,(Base.sub_int)(1,1)))::Int64)))\n", | |
" #s41 = (top(getfield))(GenSym(4),:start)::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(#s41::Int64 === (Base.box)(Base.Int,(Base.add_int)((top(getfield))(GenSym(4),:stop)::Int64,1))::Bool)) goto 1\n", | |
" 2: \n", | |
" GenSym(117) = #s41::Int64\n", | |
" GenSym(118) = (Base.box)(Base.Int,(Base.add_int)(#s41::Int64,1))\n", | |
" j = GenSym(117)\n", | |
" #s41 = GenSym(118) # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 21:\n", | |
" GenSym(44) = (Base.arraysize)(x0::Array{Float64,1},1)::Int64\n", | |
" dx = (Base.fill!)((top(ccall))(:jl_alloc_array_1d,(top(apply_type))(Base.Array,Float64,1)::Type{Array{Float64,1}},(top(svec))(Base.Any,Base.Int)::SimpleVector,Array{Float64,1},0,GenSym(44),0)::Array{Float64,1},(Base.box)(Float64,(Base.sitofp)(Float64,0)))::Array{Float64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 22:\n", | |
" (Base.arrayset)(dx::Array{Float64,1},(Base.box)(Float64,(Base.sitofp)(Float64,1)),j::Int64)::Array{Float64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 23:\n", | |
" #166#x = x0::Array{Float64,1} + dx::Array{Float64,1}::Array{Float64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 24:\n", | |
" GenSym(46) = (Base.box)(UInt64,(Base.check_top_bit)(1))\n", | |
" (top(ccall))(:jl_array_grow_end,Base.Void,(top(svec))(Base.Any,Base.UInt)::SimpleVector,simplex::Array{Array{Float64,1},1},0,GenSym(46),0)::Void\n", | |
" GenSym(47) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" (Base.arrayset)(simplex::Array{Array{Float64,1},1},#166#x::Array{Float64,1},GenSym(47))::Array{Array{Float64,1},1}\n", | |
" simplex::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 25:\n", | |
" (Main.push!)(fvalues::Array{Float64,1},(f::F)(#166#x::Array{Float64,1})::ANY)::Array{Float64,1}\n", | |
" 3: \n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(#s41::Int64 === (Base.box)(Base.Int,(Base.add_int)((top(getfield))(GenSym(4),:stop)::Int64,1))::Bool)))) goto 2\n", | |
" 1: \n", | |
" 0: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 29:\n", | |
" GenSym(48) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" order = (Base.Sort.sort!)((Base.vcat)($(Expr(:new, UnitRange{Int64}, 1, :(((top(getfield))(Base.Intrinsics,:select_value)::I)((Base.sle_int)(1,GenSym(48))::Bool,GenSym(48),(Base.box)(Int64,(Base.sub_int)(1,1)))::Int64))))::Array{Int64,1},Base.Sort.DEFAULT_UNSTABLE,call(Base.Sort.Perm,(Base.Sort.ord)(Base.Sort.isless,Base.Sort.identity,false,Base.Sort.Forward)::ANY,fvalues::Array{Float64,1})::BASE.ORDER.PERM{O<:BASE.ORDER.ORDERING,V<:ABSTRACTARRAY{T,1}})::Array{Int64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 30:\n", | |
" GenSym(49) = order::Array{Int64,1}\n", | |
" GenSym(50) = GenSym(49)\n", | |
" GenSym(51) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" ##########b#7843#7848#7877#7885#8975 = true\n", | |
" ###########s28#7844#7849#7878#7886#8976 = 1\n", | |
" GenSym(54) = (Base.arraylen)(GenSym(50))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(###########s28#7844#7849#7878#7886#8976::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(54),1))::Bool)) goto 63\n", | |
" 59: \n", | |
" GenSym(56) = (Base.arrayref)(GenSym(50),###########s28#7844#7849#7878#7886#8976::Int64)::Int64\n", | |
" GenSym(57) = (Base.box)(Base.Int,(Base.add_int)(###########s28#7844#7849#7878#7886#8976::Int64,1))\n", | |
" ##########i#7845#7850#7879#7887#8977 = GenSym(56)\n", | |
" ###########s28#7844#7849#7878#7886#8976 = GenSym(57)\n", | |
" unless (Base.sle_int)(1,##########i#7845#7850#7879#7887#8977::Int64)::Bool goto 60\n", | |
" ##########_var0#7846#7851#7880#7888#8978 = (Base.sle_int)(##########i#7845#7850#7879#7887#8977::Int64,GenSym(51))::Bool\n", | |
" goto 61\n", | |
" 60: \n", | |
" ##########_var0#7846#7851#7880#7888#8978 = false\n", | |
" 61: \n", | |
" ##########b#7843#7848#7877#7885#8975 = (Base.box)(Base.Bool,(Base.and_int)(##########b#7843#7848#7877#7885#8975::Bool,##########_var0#7846#7851#7880#7888#8978::Bool))\n", | |
" 62: \n", | |
" GenSym(55) = (Base.arraylen)(GenSym(50))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(###########s28#7844#7849#7878#7886#8976::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(55),1))::Bool)))) goto 59\n", | |
" 63: \n", | |
" 64: \n", | |
" #########s29#7847#7876#7884#8974 = ##########b#7843#7848#7877#7885#8975::Bool\n", | |
" unless #########s29#7847#7876#7884#8974::Bool goto 65\n", | |
" ######_var0#7881#7889#8979 = #########s29#7847#7876#7884#8974::Bool\n", | |
" goto 66\n", | |
" 65: \n", | |
" ######_var0#7881#7889#8979 = (Base.throw_boundserror)(simplex::Array{Array{Float64,1},1},GenSym(50))::UNION{}\n", | |
" 66: \n", | |
" ######_var0#7881#7889#8979::Bool\n", | |
" simplex = (Base._unsafe_getindex)($(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),simplex::Array{Array{Float64,1},1},GenSym(49))::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 31:\n", | |
" GenSym(58) = order::Array{Int64,1}\n", | |
" GenSym(59) = GenSym(58)\n", | |
" GenSym(60) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" ##########b#7910#7915#7944#7952#8984 = true\n", | |
" ###########s28#7911#7916#7945#7953#8985 = 1\n", | |
" GenSym(63) = (Base.arraylen)(GenSym(59))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(###########s28#7911#7916#7945#7953#8985::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(63),1))::Bool)) goto 72\n", | |
" 68: \n", | |
" GenSym(65) = (Base.arrayref)(GenSym(59),###########s28#7911#7916#7945#7953#8985::Int64)::Int64\n", | |
" GenSym(66) = (Base.box)(Base.Int,(Base.add_int)(###########s28#7911#7916#7945#7953#8985::Int64,1))\n", | |
" ##########i#7912#7917#7946#7954#8986 = GenSym(65)\n", | |
" ###########s28#7911#7916#7945#7953#8985 = GenSym(66)\n", | |
" unless (Base.sle_int)(1,##########i#7912#7917#7946#7954#8986::Int64)::Bool goto 69\n", | |
" ##########_var0#7913#7918#7947#7955#8987 = (Base.sle_int)(##########i#7912#7917#7946#7954#8986::Int64,GenSym(60))::Bool\n", | |
" goto 70\n", | |
" 69: \n", | |
" ##########_var0#7913#7918#7947#7955#8987 = false\n", | |
" 70: \n", | |
" ##########b#7910#7915#7944#7952#8984 = (Base.box)(Base.Bool,(Base.and_int)(##########b#7910#7915#7944#7952#8984::Bool,##########_var0#7913#7918#7947#7955#8987::Bool))\n", | |
" 71: \n", | |
" GenSym(64) = (Base.arraylen)(GenSym(59))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(###########s28#7911#7916#7945#7953#8985::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(64),1))::Bool)))) goto 68\n", | |
" 72: \n", | |
" 73: \n", | |
" #########s29#7914#7943#7951#8983 = ##########b#7910#7915#7944#7952#8984::Bool\n", | |
" unless #########s29#7914#7943#7951#8983::Bool goto 74\n", | |
" ######_var0#7948#7956#8988 = #########s29#7914#7943#7951#8983::Bool\n", | |
" goto 75\n", | |
" 74: \n", | |
" ######_var0#7948#7956#8988 = (Base.throw_boundserror)(fvalues::Array{Float64,1},GenSym(59))::UNION{}\n", | |
" 75: \n", | |
" ######_var0#7948#7956#8988::Bool\n", | |
" GenSym(67) = (Base._unsafe_getindex)($(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),fvalues::Array{Float64,1},GenSym(58))::Array{Float64,1}\n", | |
" fvalues = GenSym(67) # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 34:\n", | |
" GenSym(6) = $(Expr(:new, UnitRange{Int64}, 1, :(((top(getfield))(Base.Intrinsics,:select_value)::I)((Base.sle_int)(1,n::Int64)::Bool,n::Int64,(Base.box)(Int64,(Base.sub_int)(1,1)))::Int64)))\n", | |
" #s40 = (top(getfield))(GenSym(6),:start)::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(#s40::Int64 === (Base.box)(Base.Int,(Base.add_int)((top(getfield))(GenSym(6),:stop)::Int64,1))::Bool)) goto 5\n", | |
" 6: \n", | |
" NewvarNode(symbol(\"#s23\"))\n", | |
" NewvarNode(:x_e)\n", | |
" NewvarNode(:f_e)\n", | |
" NewvarNode(symbol(\"#s22\"))\n", | |
" NewvarNode(:x_c)\n", | |
" NewvarNode(:f_c)\n", | |
" GenSym(119) = #s40::Int64\n", | |
" GenSym(120) = (Base.box)(Base.Int,(Base.add_int)(#s40::Int64,1))\n", | |
" i = GenSym(119)\n", | |
" #s40 = GenSym(120) # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 38:\n", | |
" f_l = (Base.arrayref)(fvalues::Array{Float64,1},1)::Float64 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 39:\n", | |
" GenSym(68) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" f_s = (Base.arrayref)(fvalues::Array{Float64,1},(Base.box)(Int64,(Base.sub_int)(GenSym(68),1)))::Float64 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 40:\n", | |
" GenSym(69) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" x_h = (Base.arrayref)(simplex::Array{Array{Float64,1},1},GenSym(69))::Array{Float64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 41:\n", | |
" GenSym(70) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" f_h = (Base.arrayref)(fvalues::Array{Float64,1},GenSym(70))::Float64 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 42:\n", | |
" c = (Main.centroid)(simplex::Array{Array{Float64,1},1})::Array{Float64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 43:\n", | |
" x_r = c::Array{Float64,1} + Main.alpha * (c::Array{Float64,1} - x_h::Array{Float64,1})::Array{Float64,1}::ANY::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 44:\n", | |
" f_r = (f::F)(x_r)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 45:\n", | |
" unless f_l::Float64 <= f_r::ANY goto 8\n", | |
" #s23 = f_r < f_s::Float64::ANY\n", | |
" goto 9\n", | |
" 8: \n", | |
" #s23 = false\n", | |
" 9: \n", | |
" unless #s23 goto 10 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 47:\n", | |
" GenSym(71) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" (Base.arrayset)(simplex::Array{Array{Float64,1},1},(top(typeassert))((Base.convert)(Array{Float64,1},x_r)::ANY,Array{Float64,1})::Array{Float64,1},GenSym(71))::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 48:\n", | |
" GenSym(72) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" (Base.arrayset)(fvalues::Array{Float64,1},(top(typeassert))((Base.convert)(Float64,f_r)::ANY,Float64)::Float64,GenSym(72))::Array{Float64,1}\n", | |
" goto 44\n", | |
" 10: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 49:\n", | |
" unless f_r < f_l::Float64::ANY goto 13 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 51:\n", | |
" x_e = c::Array{Float64,1} + Main.gamma * (x_r - c::Array{Float64,1})::ANY::ANY::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 52:\n", | |
" f_e = (f::F)(x_e)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 53:\n", | |
" unless f_e < f_r::ANY goto 11 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 54:\n", | |
" GenSym(73) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" (Base.arrayset)(simplex::Array{Array{Float64,1},1},(top(typeassert))((Base.convert)(Array{Float64,1},x_e)::ANY,Array{Float64,1})::Array{Float64,1},GenSym(73))::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 55:\n", | |
" GenSym(74) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" (Base.arrayset)(fvalues::Array{Float64,1},(top(typeassert))((Base.convert)(Float64,f_e)::ANY,Float64)::Float64,GenSym(74))::Array{Float64,1}\n", | |
" goto 12\n", | |
" 11: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 57:\n", | |
" GenSym(75) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" (Base.arrayset)(simplex::Array{Array{Float64,1},1},(top(typeassert))((Base.convert)(Array{Float64,1},x_r)::ANY,Array{Float64,1})::Array{Float64,1},GenSym(75))::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 58:\n", | |
" GenSym(76) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" (Base.arrayset)(fvalues::Array{Float64,1},(top(typeassert))((Base.convert)(Float64,f_r)::ANY,Float64)::Float64,GenSym(76))::Array{Float64,1}\n", | |
" 12: \n", | |
" goto 44\n", | |
" 13: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 60:\n", | |
" unless f_s::Float64 <= f_r::ANY goto 38 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 62:\n", | |
" unless f_s::Float64 <= f_r::ANY goto 14\n", | |
" #s22 = f_r < f_h::Float64::ANY\n", | |
" goto 15\n", | |
" 14: \n", | |
" #s22 = false\n", | |
" 15: \n", | |
" unless #s22 goto 23 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 63:\n", | |
" x_c = c::Array{Float64,1} + Main.beta * (x_r - c::Array{Float64,1})::ANY::ANY::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 64:\n", | |
" f_c = (f::F)(x_c)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 65:\n", | |
" unless f_c <= f_r::ANY goto 16 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 66:\n", | |
" GenSym(77) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" (Base.arrayset)(simplex::Array{Array{Float64,1},1},(top(typeassert))((Base.convert)(Array{Float64,1},x_c)::ANY,Array{Float64,1})::Array{Float64,1},GenSym(77))::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 67:\n", | |
" GenSym(78) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" (Base.arrayset)(fvalues::Array{Float64,1},(top(typeassert))((Base.convert)(Float64,f_c)::ANY,Float64)::Float64,GenSym(78))::Array{Float64,1}\n", | |
" goto 22\n", | |
" 16: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 69:\n", | |
" simplex = (Main.shrink)(simplex::Array{Array{Float64,1},1})::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 70:\n", | |
" GenSym(8) = simplex::Array{Array{Float64,1},1}\n", | |
" GenSym(9) = (Base.arraylen)(GenSym(8))::Int64\n", | |
" 17: \n", | |
" GenSym(11) = (top(ccall))(:jl_alloc_array_1d,(top(apply_type))(Base.Array,Any,1)::Type{Array{Any,1}},(top(svec))(Base.Any,Base.Int)::SimpleVector,Array{Any,1},0,GenSym(9),0)::Array{Any,1}\n", | |
" #s39 = 1\n", | |
" #s38 = 1\n", | |
" #s37 = 0\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(#s37::Int64 === GenSym(9)::Bool)) goto 19\n", | |
" 20: \n", | |
" #s37 = (Base.box)(Base.Int,(Base.add_int)(#s37::Int64,1))\n", | |
" GenSym(121) = (Base.arrayref)(GenSym(8),#s38::Int64)::Array{Float64,1}\n", | |
" GenSym(122) = (Base.box)(Base.Int,(Base.add_int)(#s38::Int64,1))\n", | |
" #s36 = 1\n", | |
" GenSym(123) = GenSym(121)\n", | |
" GenSym(124) = (Base.box)(Base.Int,(Base.add_int)(1,1))\n", | |
" #167#x = GenSym(123)\n", | |
" #s36 = GenSym(124)\n", | |
" GenSym(125) = GenSym(122)\n", | |
" GenSym(126) = (Base.box)(Base.Int,(Base.add_int)(2,1))\n", | |
" #s38 = GenSym(125)\n", | |
" #s36 = GenSym(126)\n", | |
" GenSym(12) = (f::F)(#167#x::Array{Float64,1})::ANY\n", | |
" $(Expr(:type_goto, 17, GenSym(12)))\n", | |
" $(Expr(:boundscheck, false))\n", | |
" (Base.arrayset)(GenSym(11),GenSym(12),#s39::Int64)::Array{Any,1}\n", | |
" $(Expr(:boundscheck, :(Main.pop)))\n", | |
" #s39 = (Base.box)(Base.Int,(Base.add_int)(#s39::Int64,1))\n", | |
" 21: \n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(#s37::Int64 === GenSym(9)::Bool)))) goto 20\n", | |
" 19: \n", | |
" 18: \n", | |
" GenSym(16) = GenSym(11)\n", | |
" GenSym(80) = (Base.arraysize)(GenSym(16),1)::Int64\n", | |
" GenSym(82) = (top(ccall))(:jl_alloc_array_1d,(top(apply_type))(Base.Array,Float64,1)::Type{Array{Float64,1}},(top(svec))(Base.Any,Base.Int)::SimpleVector,Array{Float64,1},0,GenSym(80),0)::Array{Float64,1}\n", | |
" fvalues = (Base.copy!)($(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),GenSym(82),$(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),GenSym(16))::Array{Float64,1}\n", | |
" 22: \n", | |
" goto 37\n", | |
" 23: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 72:\n", | |
" unless f_h::Float64 <= f_r::ANY goto 31 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 73:\n", | |
" x_c = c::Array{Float64,1} + Main.beta * (x_h::Array{Float64,1} - c::Array{Float64,1})::Array{Float64,1}::ANY::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 74:\n", | |
" f_c = (f::F)(x_c)::ANY # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 75:\n", | |
" unless f_c < f_h::Float64::ANY goto 24 # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 76:\n", | |
" GenSym(83) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" (Base.arrayset)(simplex::Array{Array{Float64,1},1},(top(typeassert))((Base.convert)(Array{Float64,1},x_c)::ANY,Array{Float64,1})::Array{Float64,1},GenSym(83))::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 77:\n", | |
" GenSym(84) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" (Base.arrayset)(fvalues::Array{Float64,1},(top(typeassert))((Base.convert)(Float64,f_c)::ANY,Float64)::Float64,GenSym(84))::Array{Float64,1}\n", | |
" goto 30\n", | |
" 24: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 79:\n", | |
" simplex = (Main.shrink)(simplex::Array{Array{Float64,1},1})::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 80:\n", | |
" GenSym(17) = simplex::Array{Array{Float64,1},1}\n", | |
" GenSym(18) = (Base.arraylen)(GenSym(17))::Int64\n", | |
" 25: \n", | |
" GenSym(20) = (top(ccall))(:jl_alloc_array_1d,(top(apply_type))(Base.Array,Any,1)::Type{Array{Any,1}},(top(svec))(Base.Any,Base.Int)::SimpleVector,Array{Any,1},0,GenSym(18),0)::Array{Any,1}\n", | |
" #s35 = 1\n", | |
" #s34 = 1\n", | |
" #s33 = 0\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(#s33::Int64 === GenSym(18)::Bool)) goto 27\n", | |
" 28: \n", | |
" #s33 = (Base.box)(Base.Int,(Base.add_int)(#s33::Int64,1))\n", | |
" GenSym(127) = (Base.arrayref)(GenSym(17),#s34::Int64)::Array{Float64,1}\n", | |
" GenSym(128) = (Base.box)(Base.Int,(Base.add_int)(#s34::Int64,1))\n", | |
" #s32 = 1\n", | |
" GenSym(129) = GenSym(127)\n", | |
" GenSym(130) = (Base.box)(Base.Int,(Base.add_int)(1,1))\n", | |
" #168#x = GenSym(129)\n", | |
" #s32 = GenSym(130)\n", | |
" GenSym(131) = GenSym(128)\n", | |
" GenSym(132) = (Base.box)(Base.Int,(Base.add_int)(2,1))\n", | |
" #s34 = GenSym(131)\n", | |
" #s32 = GenSym(132)\n", | |
" GenSym(21) = (f::F)(#168#x::Array{Float64,1})::ANY\n", | |
" $(Expr(:type_goto, 25, GenSym(21)))\n", | |
" $(Expr(:boundscheck, false))\n", | |
" (Base.arrayset)(GenSym(20),GenSym(21),#s35::Int64)::Array{Any,1}\n", | |
" $(Expr(:boundscheck, :(Main.pop)))\n", | |
" #s35 = (Base.box)(Base.Int,(Base.add_int)(#s35::Int64,1))\n", | |
" 29: \n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(#s33::Int64 === GenSym(18)::Bool)))) goto 28\n", | |
" 27: \n", | |
" 26: \n", | |
" GenSym(25) = GenSym(20)\n", | |
" GenSym(86) = (Base.arraysize)(GenSym(25),1)::Int64\n", | |
" GenSym(88) = (top(ccall))(:jl_alloc_array_1d,(top(apply_type))(Base.Array,Float64,1)::Type{Array{Float64,1}},(top(svec))(Base.Any,Base.Int)::SimpleVector,Array{Float64,1},0,GenSym(86),0)::Array{Float64,1}\n", | |
" fvalues = (Base.copy!)($(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),GenSym(88),$(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),GenSym(25))::Array{Float64,1}\n", | |
" 30: \n", | |
" goto 37\n", | |
" 31: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 83:\n", | |
" simplex = (Main.shrink)(simplex::Array{Array{Float64,1},1})::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 84:\n", | |
" GenSym(26) = simplex::Array{Array{Float64,1},1}\n", | |
" GenSym(27) = (Base.arraylen)(GenSym(26))::Int64\n", | |
" 32: \n", | |
" GenSym(29) = (top(ccall))(:jl_alloc_array_1d,(top(apply_type))(Base.Array,Any,1)::Type{Array{Any,1}},(top(svec))(Base.Any,Base.Int)::SimpleVector,Array{Any,1},0,GenSym(27),0)::Array{Any,1}\n", | |
" #s31 = 1\n", | |
" #s30 = 1\n", | |
" #s29 = 0\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(#s29::Int64 === GenSym(27)::Bool)) goto 34\n", | |
" 35: \n", | |
" #s29 = (Base.box)(Base.Int,(Base.add_int)(#s29::Int64,1))\n", | |
" GenSym(133) = (Base.arrayref)(GenSym(26),#s30::Int64)::Array{Float64,1}\n", | |
" GenSym(134) = (Base.box)(Base.Int,(Base.add_int)(#s30::Int64,1))\n", | |
" #s28 = 1\n", | |
" GenSym(135) = GenSym(133)\n", | |
" GenSym(136) = (Base.box)(Base.Int,(Base.add_int)(1,1))\n", | |
" #169#x = GenSym(135)\n", | |
" #s28 = GenSym(136)\n", | |
" GenSym(137) = GenSym(134)\n", | |
" GenSym(138) = (Base.box)(Base.Int,(Base.add_int)(2,1))\n", | |
" #s30 = GenSym(137)\n", | |
" #s28 = GenSym(138)\n", | |
" GenSym(30) = (f::F)(#169#x::Array{Float64,1})::ANY\n", | |
" $(Expr(:type_goto, 32, GenSym(30)))\n", | |
" $(Expr(:boundscheck, false))\n", | |
" (Base.arrayset)(GenSym(29),GenSym(30),#s31::Int64)::Array{Any,1}\n", | |
" $(Expr(:boundscheck, :(Main.pop)))\n", | |
" #s31 = (Base.box)(Base.Int,(Base.add_int)(#s31::Int64,1))\n", | |
" 36: \n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(#s29::Int64 === GenSym(27)::Bool)))) goto 35\n", | |
" 34: \n", | |
" 33: \n", | |
" GenSym(34) = GenSym(29)\n", | |
" GenSym(90) = (Base.arraysize)(GenSym(34),1)::Int64\n", | |
" GenSym(92) = (top(ccall))(:jl_alloc_array_1d,(top(apply_type))(Base.Array,Float64,1)::Type{Array{Float64,1}},(top(svec))(Base.Any,Base.Int)::SimpleVector,Array{Float64,1},0,GenSym(90),0)::Array{Float64,1}\n", | |
" fvalues = (Base.copy!)($(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),GenSym(92),$(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),GenSym(34))::Array{Float64,1}\n", | |
" 37: \n", | |
" goto 44\n", | |
" 38: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 87:\n", | |
" simplex = (Main.shrink)(simplex::Array{Array{Float64,1},1})::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 88:\n", | |
" GenSym(35) = simplex::Array{Array{Float64,1},1}\n", | |
" GenSym(36) = (Base.arraylen)(GenSym(35))::Int64\n", | |
" 39: \n", | |
" GenSym(38) = (top(ccall))(:jl_alloc_array_1d,(top(apply_type))(Base.Array,Any,1)::Type{Array{Any,1}},(top(svec))(Base.Any,Base.Int)::SimpleVector,Array{Any,1},0,GenSym(36),0)::Array{Any,1}\n", | |
" #s27 = 1\n", | |
" #s26 = 1\n", | |
" #s25 = 0\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(#s25::Int64 === GenSym(36)::Bool)) goto 41\n", | |
" 42: \n", | |
" #s25 = (Base.box)(Base.Int,(Base.add_int)(#s25::Int64,1))\n", | |
" GenSym(139) = (Base.arrayref)(GenSym(35),#s26::Int64)::Array{Float64,1}\n", | |
" GenSym(140) = (Base.box)(Base.Int,(Base.add_int)(#s26::Int64,1))\n", | |
" #s24 = 1\n", | |
" GenSym(141) = GenSym(139)\n", | |
" GenSym(142) = (Base.box)(Base.Int,(Base.add_int)(1,1))\n", | |
" #170#x = GenSym(141)\n", | |
" #s24 = GenSym(142)\n", | |
" GenSym(143) = GenSym(140)\n", | |
" GenSym(144) = (Base.box)(Base.Int,(Base.add_int)(2,1))\n", | |
" #s26 = GenSym(143)\n", | |
" #s24 = GenSym(144)\n", | |
" GenSym(39) = (f::F)(#170#x::Array{Float64,1})::ANY\n", | |
" $(Expr(:type_goto, 39, GenSym(39)))\n", | |
" $(Expr(:boundscheck, false))\n", | |
" (Base.arrayset)(GenSym(38),GenSym(39),#s27::Int64)::Array{Any,1}\n", | |
" $(Expr(:boundscheck, :(Main.pop)))\n", | |
" #s27 = (Base.box)(Base.Int,(Base.add_int)(#s27::Int64,1))\n", | |
" 43: \n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(#s25::Int64 === GenSym(36)::Bool)))) goto 42\n", | |
" 41: \n", | |
" 40: \n", | |
" GenSym(43) = GenSym(38)\n", | |
" GenSym(94) = (Base.arraysize)(GenSym(43),1)::Int64\n", | |
" GenSym(96) = (top(ccall))(:jl_alloc_array_1d,(top(apply_type))(Base.Array,Float64,1)::Type{Array{Float64,1}},(top(svec))(Base.Any,Base.Int)::SimpleVector,Array{Float64,1},0,GenSym(94),0)::Array{Float64,1}\n", | |
" fvalues = (Base.copy!)($(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),GenSym(96),$(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),GenSym(43))::Array{Float64,1}\n", | |
" 44: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 91:\n", | |
" GenSym(97) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" order = (Base.Sort.sort!)((Base.vcat)($(Expr(:new, UnitRange{Int64}, 1, :(((top(getfield))(Base.Intrinsics,:select_value)::I)((Base.sle_int)(1,GenSym(97))::Bool,GenSym(97),(Base.box)(Int64,(Base.sub_int)(1,1)))::Int64))))::Array{Int64,1},Base.Sort.DEFAULT_UNSTABLE,call(Base.Sort.Perm,(Base.Sort.ord)(Base.Sort.isless,Base.Sort.identity,false,Base.Sort.Forward)::ANY,fvalues::Array{Float64,1})::BASE.ORDER.PERM{O<:BASE.ORDER.ORDERING,V<:ABSTRACTARRAY{T,1}})::Array{Int64,1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 92:\n", | |
" GenSym(98) = order::Array{Int64,1}\n", | |
" GenSym(99) = GenSym(98)\n", | |
" GenSym(100) = (Base.arraylen)(simplex::Array{Array{Float64,1},1})::Int64\n", | |
" ##########b#7843#7848#7877#7885#8993 = true\n", | |
" ###########s28#7844#7849#7878#7886#8994 = 1\n", | |
" GenSym(103) = (Base.arraylen)(GenSym(99))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(###########s28#7844#7849#7878#7886#8994::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(103),1))::Bool)) goto 174\n", | |
" 170: \n", | |
" GenSym(105) = (Base.arrayref)(GenSym(99),###########s28#7844#7849#7878#7886#8994::Int64)::Int64\n", | |
" GenSym(106) = (Base.box)(Base.Int,(Base.add_int)(###########s28#7844#7849#7878#7886#8994::Int64,1))\n", | |
" ##########i#7845#7850#7879#7887#8995 = GenSym(105)\n", | |
" ###########s28#7844#7849#7878#7886#8994 = GenSym(106)\n", | |
" unless (Base.sle_int)(1,##########i#7845#7850#7879#7887#8995::Int64)::Bool goto 171\n", | |
" ##########_var0#7846#7851#7880#7888#8996 = (Base.sle_int)(##########i#7845#7850#7879#7887#8995::Int64,GenSym(100))::Bool\n", | |
" goto 172\n", | |
" 171: \n", | |
" ##########_var0#7846#7851#7880#7888#8996 = false\n", | |
" 172: \n", | |
" ##########b#7843#7848#7877#7885#8993 = (Base.box)(Base.Bool,(Base.and_int)(##########b#7843#7848#7877#7885#8993::Bool,##########_var0#7846#7851#7880#7888#8996::Bool))\n", | |
" 173: \n", | |
" GenSym(104) = (Base.arraylen)(GenSym(99))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(###########s28#7844#7849#7878#7886#8994::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(104),1))::Bool)))) goto 170\n", | |
" 174: \n", | |
" 175: \n", | |
" #########s29#7847#7876#7884#8992 = ##########b#7843#7848#7877#7885#8993::Bool\n", | |
" unless #########s29#7847#7876#7884#8992::Bool goto 176\n", | |
" ######_var0#7881#7889#8997 = #########s29#7847#7876#7884#8992::Bool\n", | |
" goto 177\n", | |
" 176: \n", | |
" ######_var0#7881#7889#8997 = (Base.throw_boundserror)(simplex::Array{Array{Float64,1},1},GenSym(99))::UNION{}\n", | |
" 177: \n", | |
" ######_var0#7881#7889#8997::Bool\n", | |
" simplex = (Base._unsafe_getindex)($(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),simplex::Array{Array{Float64,1},1},GenSym(98))::Array{Array{Float64,1},1} # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 93:\n", | |
" GenSym(107) = order::Array{Int64,1}\n", | |
" GenSym(108) = GenSym(107)\n", | |
" GenSym(109) = (Base.arraylen)(fvalues::Array{Float64,1})::Int64\n", | |
" ##########b#7910#7915#7944#7952#9002 = true\n", | |
" ###########s28#7911#7916#7945#7953#9003 = 1\n", | |
" GenSym(112) = (Base.arraylen)(GenSym(108))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)(###########s28#7911#7916#7945#7953#9003::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(112),1))::Bool)) goto 183\n", | |
" 179: \n", | |
" GenSym(114) = (Base.arrayref)(GenSym(108),###########s28#7911#7916#7945#7953#9003::Int64)::Int64\n", | |
" GenSym(115) = (Base.box)(Base.Int,(Base.add_int)(###########s28#7911#7916#7945#7953#9003::Int64,1))\n", | |
" ##########i#7912#7917#7946#7954#9004 = GenSym(114)\n", | |
" ###########s28#7911#7916#7945#7953#9003 = GenSym(115)\n", | |
" unless (Base.sle_int)(1,##########i#7912#7917#7946#7954#9004::Int64)::Bool goto 180\n", | |
" ##########_var0#7913#7918#7947#7955#9005 = (Base.sle_int)(##########i#7912#7917#7946#7954#9004::Int64,GenSym(109))::Bool\n", | |
" goto 181\n", | |
" 180: \n", | |
" ##########_var0#7913#7918#7947#7955#9005 = false\n", | |
" 181: \n", | |
" ##########b#7910#7915#7944#7952#9002 = (Base.box)(Base.Bool,(Base.and_int)(##########b#7910#7915#7944#7952#9002::Bool,##########_var0#7913#7918#7947#7955#9005::Bool))\n", | |
" 182: \n", | |
" GenSym(113) = (Base.arraylen)(GenSym(108))::Int64\n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(###########s28#7911#7916#7945#7953#9003::Int64 === (Base.box)(Base.Int,(Base.add_int)(GenSym(113),1))::Bool)))) goto 179\n", | |
" 183: \n", | |
" 184: \n", | |
" #########s29#7914#7943#7951#9001 = ##########b#7910#7915#7944#7952#9002::Bool\n", | |
" unless #########s29#7914#7943#7951#9001::Bool goto 185\n", | |
" ######_var0#7948#7956#9006 = #########s29#7914#7943#7951#9001::Bool\n", | |
" goto 186\n", | |
" 185: \n", | |
" ######_var0#7948#7956#9006 = (Base.throw_boundserror)(fvalues::Array{Float64,1},GenSym(108))::UNION{}\n", | |
" 186: \n", | |
" ######_var0#7948#7956#9006::Bool\n", | |
" GenSym(116) = (Base._unsafe_getindex)($(Expr(:new, :((top(getfield))(Base,:LinearFast)::Type{Base.LinearFast}))),fvalues::Array{Float64,1},GenSym(107))::Array{Float64,1}\n", | |
" fvalues = GenSym(116)\n", | |
" 7: \n", | |
" unless (Base.box)(Base.Bool,(Base.not_int)((Base.box)(Base.Bool,(Base.not_int)(#s40::Int64 === (Base.box)(Base.Int,(Base.add_int)((top(getfield))(GenSym(6),:stop)::Int64,1))::Bool)))) goto 6\n", | |
" 5: \n", | |
" 4: # /Users/kenta/Documents/talks/JuliaTokyo/No5/nelder_mead.jl, line 97:\n", | |
" return (Base.arrayref)(simplex::Array{Array{Float64,1},1},1)::Array{Float64,1}\n", | |
" end::Array{Float64,1}\n" | |
] | |
} | |
], | |
"source": [ | |
"@code_warntype nelder_mead(rosenblock, x0, 100000)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"* 頂点のソートが遅い\n", | |
" * 先ほどと同じように`shrink`以外では1頂点しか動かないので、挿入ソートにすると速い?\n", | |
" * 高次元になるほど差が出そう (∵ $O(n\\log(n))$ vs. $O(n)$)\n", | |
"* `x_r`や`x_e`の型が不明(`ANY`)\n", | |
" * `alpha`や`gamma`パラメータがグローバル変数だからか?\n", | |
" * パラメータをローカル変数にするか、`const`をつけて定数にする\n", | |
"* `shrink`は`simplex`をイチから作りなおしている\n", | |
" * in-placeな関数にすると良さそう\n", | |
" * 慣習的に`shrink!(simplex)`という名前が良い\n", | |
"* `x_r = c + alpha * (c - x_h)`のような計算でも一時オブジェクトが作られる\n", | |
" * 一時オブジェクトを作らないように`for`文に展開などすると速い?\n", | |
" * GCが走らないコードは速い\n", | |
"\n", | |
"\n", | |
"色々試してみよう! 多分ここからまだ数倍は速くできると思う!" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Julia 0.4.0", | |
"language": "julia", | |
"name": "julia-0.4" | |
}, | |
"language_info": { | |
"file_extension": ".jl", | |
"mimetype": "application/julia", | |
"name": "julia", | |
"version": "0.4.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Nelder-Mead algorithm | |
nelder_mead(f, x0, n) | |
Arguments | |
--------- | |
* `f`: target function to optimize | |
* `x0`: initial value | |
* `n`: number of iterations | |
See http://www.scholarpedia.org/article/Nelder-Mead_algorithm for the details. | |
""" | |
function nelder_mead(f, x0, n) | |
# initialize simplex | |
d = length(x0) | |
simplex = Vector{Float64}[x0] | |
fvalues = [f(x0)] | |
for j in 1:d | |
dx = zeros(x0) | |
dx[j] = 1 | |
x = x0 + dx | |
push!(simplex, x) | |
push!(fvalues, f(x)) | |
end | |
# sort vertices | |
order = sortperm(fvalues) | |
simplex = simplex[order] | |
fvalues = fvalues[order] | |
# start "amoeba optimization" | |
for i in 1:n | |
# l: lowest vertex | |
# s: second highest vertex | |
# h: highest vertex | |
f_l = fvalues[1] | |
f_s = fvalues[end-1] | |
x_h = simplex[end] | |
f_h = fvalues[end] | |
c = centroid(simplex) | |
x_r = c + alpha * (c - x_h) | |
f_r = f(x_r) | |
if f_l <= f_r < f_s | |
# Reflect | |
simplex[end] = x_r | |
elseif f_r < f_l | |
# Expand | |
x_e = c + gamma * (x_r - c) | |
f_e = f(x_e) | |
if f_e < f_r | |
simplex[end] = x_e | |
else | |
simplex[end] = x_r | |
end | |
elseif f_r >= f_s | |
# Contract | |
if f_s <= f_r < f_h | |
x_c = c + beta * (x_r - c) | |
f_c = f(x_c) | |
if f_c <= f_r | |
simplex[end] = x_c | |
else | |
simplex = shrink(simplex) | |
end | |
elseif f_r >= f_h | |
x_c = c + beta * (x_h - c) | |
f_c = f(x_c) | |
if f_c < f_h | |
simplex[end] = x_c | |
else | |
simplex = shrink(simplex) | |
end | |
else | |
simplex = shrink(simplex) | |
end | |
else | |
simplex = shrink(simplex) | |
end | |
# sort vertices | |
fvalues = [f(x) for x in simplex] | |
order = sortperm(fvalues) | |
simplex = simplex[order] | |
fvalues = fvalues[order] | |
end | |
# return the location of the lowest vertex | |
return simplex[1] | |
end | |
# the parameters of transformations | |
alpha = 1 | |
beta = 1/2 | |
gamma = 2 | |
delta = 1/2 | |
# the centroid of the best side | |
function centroid(simplex) | |
c = zeros(simplex[1]) | |
for x in simplex[1:end-1] | |
c += x | |
end | |
return c / (length(simplex) - 1) | |
end | |
# shrink all vertices except the lowest one | |
function shrink(simplex) | |
x_l = simplex[1] | |
for j in 2:endof(simplex) | |
x_j = simplex[j] | |
simplex[j] = x_l + delta * (x_j - x_l) | |
end | |
return simplex | |
end | |
# Rosenblock function | |
function rosenblock(x) | |
a = 1 | |
b = 100 | |
fval = 0.0 | |
for i in 1:div(length(x), 2) | |
fval += (a - x[2i-1])^2 + b * (x[2i] - x[2i-1]^2)^2 | |
end | |
return fval | |
end | |
if !isinteractive() | |
srand(12345) | |
x0 = randn(20) | |
@show nelder_mead(rosenblock, x0, 100000) | |
@time nelder_mead(rosenblock, x0, 100000) | |
@time nelder_mead(rosenblock, x0, 100000) | |
@time nelder_mead(rosenblock, x0, 100000) | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment