Skip to content

Instantly share code, notes, and snippets.

@bicycle1885
Created December 18, 2015 23:05
Show Gist options
  • Save bicycle1885/626f59ff9e0375573470 to your computer and use it in GitHub Desktop.
Save bicycle1885/626f59ff9e0375573470 to your computer and use it in GitHub Desktop.
JuliaTokyo#5 ハンズオン (佐藤建太)
Display the source blob
Display the rendered blob
Raw
{
"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
}
"""
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