Added Project and Report
This commit is contained in:
176
project/testing/L-BFGS/BFGS.ipynb
generated
Normal file
176
project/testing/L-BFGS/BFGS.ipynb
generated
Normal file
@ -0,0 +1,176 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"include(\"../../L-BFGS/OracleFunction.jl\")\n",
|
||||
"include(\"../../L-BFGS/BFGS.jl\")\n",
|
||||
"include(\"../../utilities/genFunc.jl\")\n",
|
||||
"using .BFGS\n",
|
||||
"using .OracleFunction\n",
|
||||
"using LinearAlgebra, BenchmarkTools, CSV, DataFrames\n",
|
||||
"\n",
|
||||
"baseDir = joinpath(\"../\", \"results/LBFGS/comparison_BFGS/\")\n",
|
||||
"mkpath(baseDir);"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"LeastSquaresF{Float64, Main.OracleFunction.var\"#f#1\"{Matrix{Float64}, Vector{Float64}}, Main.OracleFunction.var\"#df#2\"{Matrix{Float64}, Vector{Float64}}}(OracleF{Float64, Main.OracleFunction.var\"#f#1\"{Matrix{Float64}, Vector{Float64}}, Main.OracleFunction.var\"#df#2\"{Matrix{Float64}, Vector{Float64}}}([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 … 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], Main.OracleFunction.var\"#f#1\"{Matrix{Float64}, Vector{Float64}}([0.6269851049934334 -0.9953855131718308 … 0.26819190323331954 -0.6780465661809252; -0.9332327939739362 0.8084805224537295 … 0.28452273460460176 0.9029306010736042; … ; 0.0 0.0 … 10.0 0.0; 0.0 0.0 … 0.0 10.0], [-10.186364190714537, -1.6231132115458327, 15.375526057866429, 1.5006156140417093, -14.546392908739245, -4.939853634188801, -0.2053418568399169, 20.47017872706546, 1.0276498922046493, -12.900436004701787 … 3.3479087325325874, 4.529977532247315, 9.395681468606902, -9.098074604739619, -8.545976276298948, 5.1912832757085265, -8.133605566489734, -7.81791180224994, 8.53647733342897, 0.2170916132884937]), Main.OracleFunction.var\"#df#2\"{Matrix{Float64}, Vector{Float64}}([0.6269851049934334 -0.9953855131718308 … 0.26819190323331954 -0.6780465661809252; -0.9332327939739362 0.8084805224537295 … 0.28452273460460176 0.9029306010736042; … ; 0.0 0.0 … 10.0 0.0; 0.0 0.0 … 0.0 10.0], [-10.186364190714537, -1.6231132115458327, 15.375526057866429, 1.5006156140417093, -14.546392908739245, -4.939853634188801, -0.2053418568399169, 20.47017872706546, 1.0276498922046493, -12.900436004701787 … 3.3479087325325874, 4.529977532247315, 9.395681468606902, -9.098074604739619, -8.545976276298948, 5.1912832757085265, -8.133605566489734, -7.81791180224994, 8.53647733342897, 0.2170916132884937])), [0.6269851049934334 -0.9953855131718308 … 0.26819190323331954 -0.6780465661809252; -0.9332327939739362 0.8084805224537295 … 0.28452273460460176 0.9029306010736042; … ; 0.0 0.0 … 10.0 0.0; 0.0 0.0 … 0.0 10.0], [-10.186364190714537, -1.6231132115458327, 15.375526057866429, 1.5006156140417093, -14.546392908739245, -4.939853634188801, -0.2053418568399169, 20.47017872706546, 1.0276498922046493, -12.900436004701787 … 3.3479087325325874, 4.529977532247315, 9.395681468606902, -9.098074604739619, -8.545976276298948, 5.1912832757085265, -8.133605566489734, -7.81791180224994, 8.53647733342897, 0.2170916132884937], [106.26650786511657 -1.0664727828949865 … 2.4445684049045426 0.0322174082238121; -1.0664727828949865 106.1318558809136 … -0.6525752258209305 1.2988114776625301; … ; 2.4445684049045426 -0.6525752258209305 … 106.71985607542891 0.16719323022752428; 0.0322174082238121 1.2988114776625301 … 0.16719323022752428 105.42561554395674], [2.0243350631400165 57.59287736844317 … 68.90017274988415 -7.460256118037204])"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# parameters for exact LS vs AWLS vs quadratic function \n",
|
||||
"λ = 10^1\n",
|
||||
"ϵ = 10^-14\n",
|
||||
"maxIters = 1:200\n",
|
||||
"m = 1000\n",
|
||||
"n = 20\n",
|
||||
"num_trials = 10\n",
|
||||
"\n",
|
||||
"gf = genFunc(:exactRandDataset, λ=λ, m=m, n=n)\n",
|
||||
"non_quadratic = OracleF(ones(size(gf[:X_hat], 2)),\n",
|
||||
" (x) -> norm(gf[:X_hat] * x - gf[:y_hat]),\n",
|
||||
" (x) -> inv(norm(gf[:X_hat] * x - gf[:y_hat])) * gf[:X_hat]' * (gf[:X_hat] * x - gf[:y_hat])\n",
|
||||
" )\n",
|
||||
"quadratic = OracleF(ones(size(gf[:X_hat], 2)),\n",
|
||||
" (x) -> norm(gf[:X_hat] * x - gf[:y_hat]) ^ 2,\n",
|
||||
" (x) -> 2 * gf[:X_hat]' * (gf[:X_hat] * x - gf[:y_hat])\n",
|
||||
" )\n",
|
||||
"ls = LeastSquaresF(gf)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Done trial 1\n",
|
||||
"Done trial 2\n",
|
||||
"Done trial 3\n",
|
||||
"Done trial 4\n",
|
||||
"Done trial 5\n",
|
||||
"Done trial 6\n",
|
||||
"Done trial 7\n",
|
||||
"Done trial 8\n",
|
||||
"Done trial 9\n",
|
||||
"Done trial 10\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"\"../results/LBFGS/comparison_BFGS/statisticsBFGS-iterations-m1000n20--error-norm.csv\""
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"### residual, relative error and norm of gradient with respect to iterations with exact line search\n",
|
||||
"using Statistics, CSV\n",
|
||||
"\n",
|
||||
"# Preallocate arrays\n",
|
||||
"num_iterations = length(maxIters)\n",
|
||||
"\n",
|
||||
"gradients = zeros(num_trials, num_iterations)\n",
|
||||
"residuals = zeros(num_trials, num_iterations)\n",
|
||||
"relative_errors = zeros(num_trials, num_iterations)\n",
|
||||
"\n",
|
||||
"for trial in 1:num_trials\n",
|
||||
"\n",
|
||||
" gf = genFunc(:exactRandDataset, λ=λ, m=m, n=n)\n",
|
||||
" ls = LeastSquaresF(gf)\n",
|
||||
"\n",
|
||||
" for (i, maxIter) in enumerate(maxIters)\n",
|
||||
" t = BroydenFletcherGoldfarbShanno(ls, ϵ=ϵ, MaxEvaluations=maxIter)\n",
|
||||
"\n",
|
||||
" relative_errors[trial, i] = norm(t[:x] - gf[:w_star]) / norm(gf[:w_star])\n",
|
||||
" residuals[trial, i] = norm(gf[:X_hat] * t[:x] - gf[:y_hat]) / norm(gf[:y_hat])\n",
|
||||
" gradients[trial, i] = norm(t[:grad])\n",
|
||||
" end\n",
|
||||
"\n",
|
||||
" println(\"Done trial \", trial)\n",
|
||||
" \n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"# Calculate mean and standard deviation\n",
|
||||
"mean_relative = mean(relative_errors, dims=1)'\n",
|
||||
"std_relative = std(relative_errors, dims=1)'\n",
|
||||
"mean_residual = mean(residuals, dims=1)'\n",
|
||||
"std_residual = std(residuals, dims=1)'\n",
|
||||
"mean_gradient = mean(gradients, dims=1)'\n",
|
||||
"std_gradient = std(gradients, dims=1)'\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Write results to CSV\n",
|
||||
"outputvsc = joinpath(baseDir, \"statisticsBFGS-iterations-m\" * string(m) * \"n\" * string(n) * \"--error-norm.csv\");\n",
|
||||
"\n",
|
||||
"accData = Dict(\n",
|
||||
" :maxiterations => Array{Int64}(undef, 0),\n",
|
||||
" :mean_relative => Array{Float64}(undef, 0),\n",
|
||||
" :std_relative => Array{Float64}(undef, 0),\n",
|
||||
" :mean_residual => Array{Float64}(undef, 0),\n",
|
||||
" :std_residual => Array{Float64}(undef, 0),\n",
|
||||
" :mean_gradient => Array{Float64}(undef, 0),\n",
|
||||
" :std_gradient => Array{Float64}(undef, 0)\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"# create dataframe with columns from arrays\n",
|
||||
"for maxIter ∈ maxIters\n",
|
||||
" push!(accData[:maxiterations], maxIter)\n",
|
||||
" push!(accData[:mean_relative], mean_relative[maxIter])\n",
|
||||
" push!(accData[:std_relative], std_relative[maxIter])\n",
|
||||
" push!(accData[:mean_residual], mean_residual[maxIter])\n",
|
||||
" push!(accData[:std_residual], std_residual[maxIter])\n",
|
||||
" push!(accData[:mean_gradient], mean_gradient[maxIter])\n",
|
||||
" push!(accData[:std_gradient], std_gradient[maxIter])\n",
|
||||
"\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, accData)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.9.3",
|
||||
"language": "julia",
|
||||
"name": "julia-1.9"
|
||||
},
|
||||
"language_info": {
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.9.3"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
291
project/testing/L-BFGS/LBFGS_3D.ipynb
generated
Normal file
291
project/testing/L-BFGS/LBFGS_3D.ipynb
generated
Normal file
@ -0,0 +1,291 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"id": "7b26750c-46f3-4650-aad9-759312cb7486",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"include(\"../../L-BFGS/OracleFunction.jl\")\n",
|
||||
"include(\"../../L-BFGS/LBFGS.jl\")\n",
|
||||
"include(\"../../utilities/genFunc.jl\")\n",
|
||||
"using .LBFGS\n",
|
||||
"using .OracleFunction\n",
|
||||
"using LinearAlgebra, BenchmarkTools, CSV, DataFrames\n",
|
||||
"\n",
|
||||
"baseDir = joinpath(\"../\", \"results/LBFGS/3D/\")\n",
|
||||
"mkpath(baseDir);"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "468b2db2",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## 3D PLOTS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "f96101fb-0029-48c9-b5f0-4b9b9f45feb6",
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"### time with respect to lambda and epsilon\n",
|
||||
"\n",
|
||||
"# parameters\n",
|
||||
"lambdas = 10. .^(-15:6)\n",
|
||||
"epss = 10. .^(-15:-6)\n",
|
||||
"memsize = 7\n",
|
||||
"m = 300\n",
|
||||
"n = 20\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"statisticsLBFGS-lambda-eps-m\" * string(m) * \"n\" * string(n) * \"--time.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :lambda => Array{Float64}(undef, 0),\n",
|
||||
" :epsilon => Array{Float64}(undef, 0),\n",
|
||||
" :memsize => Array{Int64}(undef, 0),\n",
|
||||
" :meantime => Array{Float64}(undef, 0),\n",
|
||||
" :stdtime => Array{Float64}(undef, 0)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"# computation\n",
|
||||
"for (λ, ϵ) ∈ Iterators.product(lambdas, epss) |> collect\n",
|
||||
" ls = genFunc(:exactRandDataset, λ=λ, m=m, n=n) |> LeastSquaresF\n",
|
||||
"\n",
|
||||
" t = @benchmark begin\n",
|
||||
" _ = LimitedMemoryBFGS($ls, ϵ=$ϵ, m=memsize)\n",
|
||||
" end samples=10 evals=1\n",
|
||||
"\n",
|
||||
" push!(accData[:lambda], λ)\n",
|
||||
" push!(accData[:epsilon], ϵ)\n",
|
||||
" push!(accData[:memsize], memsize)\n",
|
||||
" push!(accData[:meantime], mean(t.times))\n",
|
||||
" push!(accData[:stdtime], std(t.times))\n",
|
||||
" println(\"Done: λ \" * string(λ) * \" - ϵ \" * string(ϵ))\n",
|
||||
" flush(stdout)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "5b36db4f-2659-4591-8640-cd5071788f67",
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"### iterations with respect to lambda and epsilon\n",
|
||||
"\n",
|
||||
"# parameters\n",
|
||||
"lambdas = 10. .^(-15:6)\n",
|
||||
"epss = 10. .^(-15:-6)\n",
|
||||
"memsize = 7\n",
|
||||
"maxIter = 10000\n",
|
||||
"m = 300\n",
|
||||
"n = 20\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"statisticsLBFGS-lambda-eps-m\" * string(m) * \"n\" * string(n) * \"--iterations.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :lambda => Array{Float64}(undef, 0),\n",
|
||||
" :epsilon => Array{Float64}(undef, 0),\n",
|
||||
" :memsize => Array{Int64}(undef, 0),\n",
|
||||
" :iterations => Array{Int64}(undef, 0)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"# computation\n",
|
||||
"for (λ, ϵ) ∈ Iterators.product(lambdas, epss) |> collect\n",
|
||||
" ls = genFunc(:exactRandDataset, λ=λ, m=m, n=n) |> LeastSquaresF\n",
|
||||
"\n",
|
||||
" t = maxIter - LimitedMemoryBFGS(ls, ϵ=ϵ, MaxEvaluations=maxIter, m=memsize)[:RemainingEvaluations]\n",
|
||||
"\n",
|
||||
" push!(accData[:lambda], λ)\n",
|
||||
" push!(accData[:epsilon], ϵ)\n",
|
||||
" push!(accData[:memsize], memsize)\n",
|
||||
" push!(accData[:iterations], t)\n",
|
||||
" println(\"Done: λ \" * string(λ) * \" - ϵ \" * string(ϵ))\n",
|
||||
" flush(stdout)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "f3bb9382-8e68-49aa-81ac-6e3e3fcdf85b",
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"### error with respect to lambda and epsilon\n",
|
||||
"\n",
|
||||
"# parameters\n",
|
||||
"lambdas = 10. .^(-15:6)\n",
|
||||
"epss = 10. .^(-15:-6)\n",
|
||||
"memsize = 7\n",
|
||||
"maxIter = 10000\n",
|
||||
"m = 300\n",
|
||||
"n = 20\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"statisticsLBFGS-lambda-eps-m\" * string(m) * \"n\" * string(n) * \"--error.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :lambda => Array{Float64}(undef, 0),\n",
|
||||
" :epsilon => Array{Float64}(undef, 0),\n",
|
||||
" :memsize => Array{Int64}(undef, 0),\n",
|
||||
" :relative => Array{Float64}(undef, 0),\n",
|
||||
" :residual => Array{Float64}(undef, 0)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"# computation\n",
|
||||
"for (λ, ϵ) ∈ Iterators.product(lambdas, epss) |> collect\n",
|
||||
" gf = genFunc(:exactRandDataset, λ=λ, m=m, n=n)\n",
|
||||
" ls = LeastSquaresF(gf)\n",
|
||||
"\n",
|
||||
" t = LimitedMemoryBFGS(ls, ϵ=ϵ, MaxEvaluations=maxIter, m=memsize)\n",
|
||||
"\n",
|
||||
" relative_error = norm(t[:x] - gf[:w_star]) / norm(gf[:w_star])\n",
|
||||
" residual = norm(gf[:X_hat] * t[:x] - gf[:y_hat]) / norm(gf[:y_hat])\n",
|
||||
"\n",
|
||||
" push!(accData[:lambda], λ)\n",
|
||||
" push!(accData[:epsilon], ϵ)\n",
|
||||
" push!(accData[:memsize], memsize)\n",
|
||||
" push!(accData[:relative], relative_error)\n",
|
||||
" push!(accData[:residual], residual)\n",
|
||||
" println(\"Done: λ \" * string(λ) * \" - ϵ \" * string(ϵ))\n",
|
||||
" flush(stdout)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "cff97997-96a4-4223-bed9-00663a9a2a6c",
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"### iterations with respect to epsilon and memory size\n",
|
||||
"\n",
|
||||
"# parameters\n",
|
||||
"λ = 10^-3\n",
|
||||
"epss = 10. .^(-15:-6)\n",
|
||||
"memsizes = [1, 3, 5, 7, 9, 11, 15, 20, 40, 60]\n",
|
||||
"maxIter = 10000\n",
|
||||
"m = 300\n",
|
||||
"n = 20\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"statisticsLBFGS-eps-mem-m\" * string(m) * \"n\" * string(n) * \"--iterations.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :lambda => Array{Float64}(undef, 0),\n",
|
||||
" :epsilon => Array{Float64}(undef, 0),\n",
|
||||
" :memsize => Array{Int64}(undef, 0),\n",
|
||||
" :iterations => Array{Int64}(undef, 0)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"# computation\n",
|
||||
"for (ϵ, memsize) ∈ Iterators.product(epss, memsizes) |> collect\n",
|
||||
" gf = genFunc(:exactRandDataset, λ=λ, m=m, n=n)\n",
|
||||
" ls = LeastSquaresF(gf)\n",
|
||||
"\n",
|
||||
" t = maxIter - LimitedMemoryBFGS(ls, ϵ=ϵ, MaxEvaluations=maxIter, m=memsize)[:RemainingEvaluations]\n",
|
||||
"\n",
|
||||
" push!(accData[:lambda], λ)\n",
|
||||
" push!(accData[:epsilon], ϵ)\n",
|
||||
" push!(accData[:memsize], memsize)\n",
|
||||
" push!(accData[:iterations], t)\n",
|
||||
" println(\"Done: mem \" * string(memsize) * \" - ϵ \" * string(ϵ))\n",
|
||||
" flush(stdout)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "65a5b24b-ad25-4f13-8ebc-433e5e91eb75",
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"### error with respect to epsilon and memory size\n",
|
||||
"\n",
|
||||
"# parameters\n",
|
||||
"λ = 10^-3\n",
|
||||
"epss = 10. .^(-15:-6)\n",
|
||||
"memsizes = [1, 3, 5, 7, 9, 11, 15, 20, 40, 60]\n",
|
||||
"maxIter = 10000\n",
|
||||
"m = 300\n",
|
||||
"n = 20\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"statisticsLBFGS-eps-mem-m\" * string(m) * \"n\" * string(n) * \"--error.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :lambda => Array{Float64}(undef, 0),\n",
|
||||
" :epsilon => Array{Float64}(undef, 0),\n",
|
||||
" :memsize => Array{Int64}(undef, 0),\n",
|
||||
" :relative => Array{Float64}(undef, 0),\n",
|
||||
" :residual => Array{Float64}(undef, 0)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"# computation\n",
|
||||
"for (ϵ, memsize) ∈ Iterators.product(epss, memsizes) |> collect\n",
|
||||
" gf = genFunc(:exactRandDataset, λ=λ, m=m, n=n)\n",
|
||||
" ls = LeastSquaresF(gf)\n",
|
||||
"\n",
|
||||
" t = LimitedMemoryBFGS(ls, ϵ=ϵ, MaxEvaluations=maxIter, m=memsize)\n",
|
||||
"\n",
|
||||
" relative_error = norm(t[:x] - gf[:w_star]) / norm(gf[:w_star])\n",
|
||||
" residual = norm(gf[:X_hat] * t[:x] - gf[:y_hat]) / norm(gf[:y_hat])\n",
|
||||
"\n",
|
||||
" push!(accData[:lambda], λ)\n",
|
||||
" push!(accData[:epsilon], ϵ)\n",
|
||||
" push!(accData[:memsize], memsize)\n",
|
||||
" push!(accData[:relative], relative_error)\n",
|
||||
" push!(accData[:residual], residual)\n",
|
||||
" println(\"Done: mem \" * string(memsize) * \" - ϵ \" * string(ϵ))\n",
|
||||
" flush(stdout)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.9.3",
|
||||
"language": "julia",
|
||||
"name": "julia-1.9"
|
||||
},
|
||||
"language_info": {
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.9.3"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
240
project/testing/L-BFGS/LBFGS_ill.ipynb
generated
Normal file
240
project/testing/L-BFGS/LBFGS_ill.ipynb
generated
Normal file
@ -0,0 +1,240 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"include(\"../../L-BFGS/OracleFunction.jl\")\n",
|
||||
"include(\"../../L-BFGS/LBFGS.jl\")\n",
|
||||
"include(\"../../utilities/genFunc.jl\")\n",
|
||||
"using .LBFGS\n",
|
||||
"using .OracleFunction\n",
|
||||
"using LinearAlgebra, BenchmarkTools, CSV, DataFrames\n",
|
||||
"\n",
|
||||
"baseDir = joinpath(\"../\", \"results/LBFGS/ill_conditioned/\")\n",
|
||||
"mkpath(baseDir);"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"LeastSquaresF{Float64, Main.OracleFunction.var\"#f#1\"{Matrix{Float64}, Vector{Float64}}, Main.OracleFunction.var\"#df#2\"{Matrix{Float64}, Vector{Float64}}}(OracleF{Float64, Main.OracleFunction.var\"#f#1\"{Matrix{Float64}, Vector{Float64}}, Main.OracleFunction.var\"#df#2\"{Matrix{Float64}, Vector{Float64}}}([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 … 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], Main.OracleFunction.var\"#f#1\"{Matrix{Float64}, Vector{Float64}}([0.2592586022640595 0.6963535943217778 … 0.2686596970120587 -0.36678046257922436; 0.514702105566236 -0.7473274556601393 … 0.19887814981786733 0.8663661527822621; … ; 0.0 0.0 … 1.0e-12 0.0; 0.0 0.0 … 0.0 1.0e-12], [7.689547521112595, -23.188865118086323, 13.727391619018281, -4.242513852908478, 23.90743053982707, 1.8343747758964255, -1.159884201591351, 2.216694337124031, 2.730975021441503, -19.180979473592664 … -6.088266825619777e-13, 1.1943252953272254e-13, 4.048371886383304e-13, -6.926115820555791e-13, 3.8752674617747763e-13, 6.919446457660259e-13, 5.147174879596801e-13, -5.887351028568868e-13, 6.537120155767028e-13, 3.946146858948962e-13]), Main.OracleFunction.var\"#df#2\"{Matrix{Float64}, Vector{Float64}}([0.2592586022640595 0.6963535943217778 … 0.2686596970120587 -0.36678046257922436; 0.514702105566236 -0.7473274556601393 … 0.19887814981786733 0.8663661527822621; … ; 0.0 0.0 … 1.0e-12 0.0; 0.0 0.0 … 0.0 1.0e-12], [7.689547521112595, -23.188865118086323, 13.727391619018281, -4.242513852908478, 23.90743053982707, 1.8343747758964255, -1.159884201591351, 2.216694337124031, 2.730975021441503, -19.180979473592664 … -6.088266825619777e-13, 1.1943252953272254e-13, 4.048371886383304e-13, -6.926115820555791e-13, 3.8752674617747763e-13, 6.919446457660259e-13, 5.147174879596801e-13, -5.887351028568868e-13, 6.537120155767028e-13, 3.946146858948962e-13])), [0.2592586022640595 0.6963535943217778 … 0.2686596970120587 -0.36678046257922436; 0.514702105566236 -0.7473274556601393 … 0.19887814981786733 0.8663661527822621; … ; 0.0 0.0 … 1.0e-12 0.0; 0.0 0.0 … 0.0 1.0e-12], [7.689547521112595, -23.188865118086323, 13.727391619018281, -4.242513852908478, 23.90743053982707, 1.8343747758964255, -1.159884201591351, 2.216694337124031, 2.730975021441503, -19.180979473592664 … -6.088266825619777e-13, 1.1943252953272254e-13, 4.048371886383304e-13, -6.926115820555791e-13, 3.8752674617747763e-13, 6.919446457660259e-13, 5.147174879596801e-13, -5.887351028568868e-13, 6.537120155767028e-13, 3.946146858948962e-13], [6.711447540940819 -2.307272578298896 … 1.2541719054073133 -1.8639946218858157; -2.307272578298896 8.480411930046433 … -1.627313075365743 0.5078496705429104; … ; 1.2541719054073133 -1.627313075365743 … 7.4470442813402595 -4.4848817373554315; -1.8639946218858157 0.5078496705429104 … -4.4848817373554315 6.7106397848856], [-3.33043813332588 57.71972704197855 … 26.336102875181652 -62.14554952332052])"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# parameters for exact LS vs AWLS vs quadratic function \n",
|
||||
"λ = 10^-12\n",
|
||||
"ϵ = 10^-14\n",
|
||||
"memsize = 7\n",
|
||||
"maxIters = 1:200\n",
|
||||
"m = 1000\n",
|
||||
"n = 20\n",
|
||||
"num_trials = 20\n",
|
||||
"\n",
|
||||
"gf = genFunc(:exactRandDataset, λ=λ, m=m, n=n)\n",
|
||||
"non_quadratic = OracleF(ones(size(gf[:X_hat], 2)),\n",
|
||||
" (x) -> norm(gf[:X_hat] * x - gf[:y_hat]),\n",
|
||||
" (x) -> inv(norm(gf[:X_hat] * x - gf[:y_hat])) * gf[:X_hat]' * (gf[:X_hat] * x - gf[:y_hat])\n",
|
||||
" )\n",
|
||||
"quadratic = OracleF(ones(size(gf[:X_hat], 2)),\n",
|
||||
" (x) -> norm(gf[:X_hat] * x - gf[:y_hat])^2,\n",
|
||||
" (x) -> 2 * gf[:X_hat]' * (gf[:X_hat] * x - gf[:y_hat])\n",
|
||||
" )\n",
|
||||
"ls = LeastSquaresF(gf)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Done trial 1\n",
|
||||
"Done trial 2\n",
|
||||
"Done trial 3\n",
|
||||
"Done trial 4\n",
|
||||
"Done trial 5\n",
|
||||
"Done trial 6\n",
|
||||
"Done trial 7\n",
|
||||
"Done trial 8\n",
|
||||
"Done trial 9\n",
|
||||
"Done trial 10\n",
|
||||
"Done trial 11\n",
|
||||
"Done trial 12\n",
|
||||
"Done trial 13\n",
|
||||
"Done trial 14\n",
|
||||
"Done trial 15\n",
|
||||
"Done trial 16\n",
|
||||
"Done trial 17\n",
|
||||
"Done trial 18\n",
|
||||
"Done trial 19\n",
|
||||
"Done trial 20\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"\"../results/LBFGS/ill_conditioned/statisticsLBFGS-iterations-m1000n20--error-norm.csv\""
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"### residual, relative error and norm of gradient with respect to iterations with exact line search\n",
|
||||
"using Statistics, CSV\n",
|
||||
"\n",
|
||||
"# Preallocate arrays\n",
|
||||
"num_iterations = length(maxIters)\n",
|
||||
"\n",
|
||||
"gradients = zeros(num_trials, num_iterations)\n",
|
||||
"residuals = zeros(num_trials, num_iterations)\n",
|
||||
"relative_errors = zeros(num_trials, num_iterations)\n",
|
||||
"\n",
|
||||
"for trial in 1:num_trials\n",
|
||||
"\n",
|
||||
" gf = genFunc(:exactRandDataset, λ=λ, m=m, n=n)\n",
|
||||
" ls = LeastSquaresF(gf)\n",
|
||||
"\n",
|
||||
" for (i, maxIter) in enumerate(maxIters)\n",
|
||||
" t = LimitedMemoryBFGS(ls, ϵ=ϵ, MaxEvaluations=maxIter, m=memsize)\n",
|
||||
"\n",
|
||||
" relative_errors[trial, i] = norm(t[:x] - gf[:w_star]) / norm(gf[:w_star])\n",
|
||||
" residuals[trial, i] = norm(gf[:X_hat] * t[:x] - gf[:y_hat]) / norm(gf[:y_hat])\n",
|
||||
" gradients[trial, i] = norm(t[:grad])\n",
|
||||
" end\n",
|
||||
"\n",
|
||||
" println(\"Done trial \", trial)\n",
|
||||
" \n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"# Calculate mean and standard deviation\n",
|
||||
"mean_relative = mean(relative_errors, dims=1)'\n",
|
||||
"std_relative = std(relative_errors, dims=1)'\n",
|
||||
"mean_residual = mean(residuals, dims=1)'\n",
|
||||
"std_residual = std(residuals, dims=1)'\n",
|
||||
"mean_gradient = mean(gradients, dims=1)'\n",
|
||||
"std_gradient = std(gradients, dims=1)'\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Write results to CSV\n",
|
||||
"outputvsc = joinpath(baseDir, \"statisticsLBFGS-iterations-m\" * string(m) * \"n\" * string(n) * \"--error-norm.csv\");\n",
|
||||
"\n",
|
||||
"accData = Dict(\n",
|
||||
" :lambda => Array{Float64}(undef, 0),\n",
|
||||
" :epsilon => Array{Float64}(undef, 0),\n",
|
||||
" :memsize => Array{Int64}(undef, 0),\n",
|
||||
" :maxiterations => Array{Int64}(undef, 0),\n",
|
||||
" :mean_relative => Array{Float64}(undef, 0),\n",
|
||||
" :std_relative => Array{Float64}(undef, 0),\n",
|
||||
" :mean_residual => Array{Float64}(undef, 0),\n",
|
||||
" :std_residual => Array{Float64}(undef, 0),\n",
|
||||
" :mean_gradient => Array{Float64}(undef, 0),\n",
|
||||
" :std_gradient => Array{Float64}(undef, 0)\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"# create dataframe with columns from arrays\n",
|
||||
"for maxIter ∈ maxIters\n",
|
||||
" push!(accData[:lambda], λ)\n",
|
||||
" push!(accData[:epsilon], ϵ)\n",
|
||||
" push!(accData[:memsize], memsize)\n",
|
||||
" push!(accData[:maxiterations], maxIter)\n",
|
||||
" push!(accData[:mean_relative], mean_relative[maxIter])\n",
|
||||
" push!(accData[:std_relative], std_relative[maxIter])\n",
|
||||
" push!(accData[:mean_residual], mean_residual[maxIter])\n",
|
||||
" push!(accData[:std_residual], std_residual[maxIter])\n",
|
||||
" push!(accData[:mean_gradient], mean_gradient[maxIter])\n",
|
||||
" push!(accData[:std_gradient], std_gradient[maxIter])\n",
|
||||
"\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, accData)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"### relative error with respect to iterations and memeory size\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"statisticsLBFGS-iterations-m\" * string(m) * \"n\" * string(n) * \"--memsize.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" :memsize => Array{Int64}(undef, 0),\n",
|
||||
" :iterations => Array{Int64}(undef, 0),\n",
|
||||
" :maxiterations => Array{Int64}(undef, 0),\n",
|
||||
" :relative => Array{Float64}(undef, 0),\n",
|
||||
" :residual => Array{Float64}(undef, 0),\n",
|
||||
" :gradient => Array{Float64}(undef, 0)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"memsizes = [1 3 5 7 9 11]\n",
|
||||
"\n",
|
||||
"for memsize ∈ memsizes\n",
|
||||
" gf = genFunc(:exactRandDataset, λ=λ, m=m, n=n)\n",
|
||||
" ls = LeastSquaresF(gf)\n",
|
||||
" for maxIter ∈ maxIters\n",
|
||||
"\n",
|
||||
" t = LimitedMemoryBFGS(ls, ϵ=ϵ, MaxEvaluations=maxIter, m=memsize)\n",
|
||||
"\n",
|
||||
" relative_error = norm(t[:x] - gf[:w_star]) / norm(gf[:w_star])\n",
|
||||
" residual = norm(gf[:X_hat] * t[:x] - gf[:y_hat]) / norm(gf[:y_hat])\n",
|
||||
"\n",
|
||||
" iterations = maxIter - t[:RemainingEvaluations]\n",
|
||||
"\n",
|
||||
" push!(accData[:memsize], memsize)\n",
|
||||
" push!(accData[:iterations], iterations)\n",
|
||||
" push!(accData[:maxiterations], maxIter)\n",
|
||||
" push!(accData[:relative], relative_error)\n",
|
||||
" push!(accData[:residual], residual)\n",
|
||||
" push!(accData[:gradient], norm(t[:grad]))\n",
|
||||
" flush(stdout)\n",
|
||||
" end\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.9.3",
|
||||
"language": "julia",
|
||||
"name": "julia-1.9"
|
||||
},
|
||||
"language_info": {
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.9.3"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
1678
project/testing/L-BFGS/LBFGS_well.ipynb
generated
Normal file
1678
project/testing/L-BFGS/LBFGS_well.ipynb
generated
Normal file
File diff suppressed because it is too large
Load Diff
176
project/testing/QR/QR.ipynb
generated
Normal file
176
project/testing/QR/QR.ipynb
generated
Normal file
@ -0,0 +1,176 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "57a2b335-a7f3-4ace-a2d8-52219c4febc5",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"include(\"../../QR/housQR.jl\")\n",
|
||||
"include(\"../../utilities/genFunc.jl\")\n",
|
||||
"using .housQR\n",
|
||||
"using LinearAlgebra, BenchmarkTools, CSV, DataFrames\n",
|
||||
"\n",
|
||||
"baseDir = joinpath(\"../\", \"results/QR\")\n",
|
||||
"mkpath(baseDir);"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "356e3edd",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"### time with respect to lambda\n",
|
||||
"\n",
|
||||
"# parameters\n",
|
||||
"lambdas = 10. .^(-15:6)\n",
|
||||
"epss = [nothing]\n",
|
||||
"m = 300\n",
|
||||
"n = 20\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"statisticsQR-lambda-m\" * string(m) * \"n\" * string(n) * \"--time.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :lambda => Array{Float64}(undef, 0),\n",
|
||||
" :meantime => Array{Float64}(undef, 0),\n",
|
||||
" :stdtime => Array{Float64}(undef, 0)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"# computation\n",
|
||||
"for (λ, ϵ) ∈ Iterators.product(lambdas, epss) |> collect\n",
|
||||
" gf = genFunc(:exactRandDataset, λ=λ, m=m, n=n)\n",
|
||||
"\n",
|
||||
" t = @benchmark begin\n",
|
||||
" QR = qrfact($gf[:X_hat])\n",
|
||||
" w = QR \\ $gf[:y_hat]\n",
|
||||
" end\n",
|
||||
"\n",
|
||||
" push!(accData[:lambda], λ)\n",
|
||||
" push!(accData[:meantime], mean(t.times))\n",
|
||||
" push!(accData[:stdtime], std(t.times))\n",
|
||||
" println(\"Done: λ \" * string(λ))\n",
|
||||
" flush(stdout)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "8b3d71f8-2f4f-44f0-8c97-dd9d78706163",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"### error with respect to lambda\n",
|
||||
"\n",
|
||||
"# parameters\n",
|
||||
"lambdas = 10. .^(-15:6)\n",
|
||||
"epss = [nothing]\n",
|
||||
"m = 300\n",
|
||||
"n = 20\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"statisticsQR-lambda-m\" * string(m) * \"n\" * string(n) * \"--error.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :lambda => Array{Float64}(undef, 0),\n",
|
||||
" :relative => Array{Float64}(undef, 0),\n",
|
||||
" :residual => Array{Float64}(undef, 0),\n",
|
||||
" :stability => Array{Float64}(undef, 0)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"# computation\n",
|
||||
"for (λ, ϵ) ∈ Iterators.product(lambdas, epss) |> collect\n",
|
||||
" gf = genFunc(:exactRandDataset, λ=λ, m=m, n=n)\n",
|
||||
"\n",
|
||||
" QR = qrfact(gf[:X_hat])\n",
|
||||
" w = QR \\ gf[:y_hat]\n",
|
||||
" \n",
|
||||
" relative_error = norm(w - gf[:w_star]) / norm(gf[:w_star])\n",
|
||||
" residual = norm(gf[:X_hat] * w - gf[:y_hat]) / norm(gf[:y_hat])\n",
|
||||
" stability = norm(Q_times_R - gf[:X_hat]) / norm(gf[:X_hat])\n",
|
||||
"\n",
|
||||
" push!(accData[:lambda], λ)\n",
|
||||
" push!(accData[:relative], relative_error)\n",
|
||||
" push!(accData[:residual], residual)\n",
|
||||
" push!(accData[:stability], stability)\n",
|
||||
" println(\"Done: λ \" * string(λ))\n",
|
||||
" flush(stdout)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "387520b7",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"### error with respect to lambda\n",
|
||||
"\n",
|
||||
"# parameters\n",
|
||||
"lambdas = 10. .^(-15:6)\n",
|
||||
"epss = [nothing]\n",
|
||||
"m = 300\n",
|
||||
"n = 20\n",
|
||||
"perturbation = 1e-10\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"statisticsQR-forward-m\" * string(m) * \"n\" * string(n) * \"--error.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :lambda => Array{Float64}(undef, 0),\n",
|
||||
" :forwardQ => Array{Float64}(undef, 0),\n",
|
||||
" :forwardR => Array{Float64}(undef, 0),\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"# computation\n",
|
||||
"for (λ, ϵ) ∈ Iterators.product(lambdas, epss) |> collect\n",
|
||||
" gf = genFunc(:exactRandDataset, λ=λ, m=m, n=n)\n",
|
||||
"\n",
|
||||
" QR = qrfact(gf[:X_hat])\n",
|
||||
" w = QR \\ gf[:y_hat]\n",
|
||||
"\n",
|
||||
" X_hat_p = gf[:X_hat] + perturbation * randn(size(gf[:X_hat]))\n",
|
||||
" cond(gf[:X_hat]) |> display\n",
|
||||
" # cond(X_hat_p) |> display\n",
|
||||
" QR_p = qrfact(X_hat_p)\n",
|
||||
"\n",
|
||||
" forwardQ = norm(QR.Q - QR_p.Q)\n",
|
||||
" forwardR = norm(QR.R - QR_p.R) / norm(QR.R)\n",
|
||||
"\n",
|
||||
" push!(accData[:lambda], λ)\n",
|
||||
" push!(accData[:forwardQ], forwardQ)\n",
|
||||
" push!(accData[:forwardR], forwardR)\n",
|
||||
"\n",
|
||||
" println(\"Done: λ \" * string(λ))\n",
|
||||
" flush(stdout)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.9.3",
|
||||
"language": "julia",
|
||||
"name": "julia-1.9"
|
||||
},
|
||||
"language_info": {
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.9.3"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
674
project/testing/comparison.ipynb
generated
Normal file
674
project/testing/comparison.ipynb
generated
Normal file
@ -0,0 +1,674 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"include(\"../QR/housQR.jl\")\n",
|
||||
"include(\"../utilities/genFunc.jl\")\n",
|
||||
"include(\"../L-BFGS/OracleFunction.jl\")\n",
|
||||
"include(\"../L-BFGS/LBFGS.jl\")\n",
|
||||
"include(\"../L-BFGS/BFGS.jl\")\n",
|
||||
"include(\"../L-BFGS/SR1.jl\")\n",
|
||||
"using .LBFGS\n",
|
||||
"using .BFGS\n",
|
||||
"using .SR1\n",
|
||||
"using .OracleFunction\n",
|
||||
"using .housQR\n",
|
||||
"using LinearAlgebra, BenchmarkTools, CSV, DataFrames\n",
|
||||
"\n",
|
||||
"baseDir = \"results/comparison\";\n",
|
||||
"mkpath(baseDir);"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# QR vs LBFGS running time comparison with respect to n, fixing m, on ill-conditioned matrix\n",
|
||||
"λ = 1e-12\n",
|
||||
"m = 200\n",
|
||||
"runs = 10\n",
|
||||
"\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"QRvsLBFGS-n-m\" * string(m) * \"-illcond--time.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :n => Array{Float64}(undef, 0),\n",
|
||||
" :meantimeLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meantimeQR => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeQR => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsQR => Array{Float64}(undef, 0)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"for n ∈ (0:runs) .* 500 .+ 500\n",
|
||||
" gf = genFunc(:exactRandDataset, λ=λ, m=m, n=n)\n",
|
||||
"\n",
|
||||
" t_qr = @benchmark qrfact($gf[:X_hat]) \\ $gf[:y_hat] samples=10 evals=1\n",
|
||||
"\n",
|
||||
" ls = LeastSquaresF(gf)\n",
|
||||
"\n",
|
||||
" t_lbfgs = @benchmark LimitedMemoryBFGS($ls) samples=10 evals=1\n",
|
||||
" \n",
|
||||
" push!(accData[:n], n)\n",
|
||||
" push!(accData[:meantimeLBFGS], mean(t_lbfgs.times))\n",
|
||||
" push!(accData[:stdtimeLBFGS], std(t_lbfgs.times))\n",
|
||||
" push!(accData[:meanallocsLBFGS], mean(t_lbfgs.memory))\n",
|
||||
" push!(accData[:meantimeQR], mean(t_qr.times))\n",
|
||||
" push!(accData[:stdtimeQR], std(t_qr.times))\n",
|
||||
" push!(accData[:meanallocsQR], mean(t_qr.memory))\n",
|
||||
" println(\"Done: n \" * string(n))\n",
|
||||
" flush(stdout)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"# CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# QR vs LBFGS running time comparison with respect to n, fixing m, on well-conditioned matrix\n",
|
||||
"λ = 1e-4\n",
|
||||
"m = 200\n",
|
||||
"runs = 10\n",
|
||||
"\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"QRvsLBFGS-n-m\" * string(m) * \"-wellcond--time.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :n => Array{Float64}(undef, 0),\n",
|
||||
" :meantimeLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meantimeQR => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeQR => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsQR => Array{Float64}(undef, 0)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"for n ∈ (0:runs) .* 500 .+ 500\n",
|
||||
" gf = genFunc(:exactRandDataset, λ=λ, m=m, n=n)\n",
|
||||
"\n",
|
||||
" t_qr = @benchmark qrfact($gf[:X_hat]) \\ $gf[:y_hat] samples=10 evals=1\n",
|
||||
"\n",
|
||||
" ls = LeastSquaresF(gf)\n",
|
||||
"\n",
|
||||
" t_lbfgs = @benchmark LimitedMemoryBFGS($ls) samples=10 evals=1\n",
|
||||
" \n",
|
||||
" push!(accData[:n], n)\n",
|
||||
" push!(accData[:meantimeLBFGS], mean(t_lbfgs.times))\n",
|
||||
" push!(accData[:stdtimeLBFGS], std(t_lbfgs.times))\n",
|
||||
" push!(accData[:meanallocsLBFGS], mean(t_lbfgs.memory))\n",
|
||||
" push!(accData[:meantimeQR], mean(t_qr.times))\n",
|
||||
" push!(accData[:stdtimeQR], std(t_qr.times))\n",
|
||||
" push!(accData[:meanallocsQR], mean(t_qr.memory))\n",
|
||||
" println(\"Done: n \" * string(n))\n",
|
||||
" flush(stdout)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"# CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Done: n 500\n",
|
||||
"Done: n 1000\n",
|
||||
"Done: n 1500\n",
|
||||
"Done: n 2000\n",
|
||||
"Done: n 2500\n",
|
||||
"Done: n 3000\n",
|
||||
"Done: n 3500\n",
|
||||
"Done: n 4000\n",
|
||||
"Done: n 4500\n",
|
||||
"Done: n 5000\n",
|
||||
"Done: n 5500\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# BFGS vs LBFGS running time comparison with respect to n, fixing m, on well-conditioned matrix\n",
|
||||
"λ = 1e-4\n",
|
||||
"m = 200\n",
|
||||
"runs = 10\n",
|
||||
"\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"BFGSvsLBFGS-n-m\" * string(m) * \"--time.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :n => Array{Float64}(undef, 0),\n",
|
||||
" :meantimeLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meantimeBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsBFGS => Array{Float64}(undef, 0)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"for i ∈ 0:runs\n",
|
||||
" n = 500 + i * 500\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" t_lbfgs = @benchmark LimitedMemoryBFGS(ls) setup=(ls = (genFunc(:randDataset, λ=$λ, m=$m, n=$n) |> LeastSquaresF)) samples=10 evals=1\n",
|
||||
" t_bfgs = @benchmark BroydenFletcherGoldfarbShanno(ls) setup=(ls = (genFunc(:randDataset, λ=$λ, m=$m, n=$n) |> LeastSquaresF)) samples=10 evals=1\n",
|
||||
"\n",
|
||||
" push!(accData[:n], n)\n",
|
||||
" push!(accData[:meantimeLBFGS], mean(t_lbfgs.times))\n",
|
||||
" push!(accData[:stdtimeLBFGS], std(t_lbfgs.times))\n",
|
||||
" push!(accData[:meanallocsLBFGS], mean(t_lbfgs.memory))\n",
|
||||
" push!(accData[:meantimeBFGS], mean(t_bfgs.times))\n",
|
||||
" push!(accData[:stdtimeBFGS], std(t_bfgs.times))\n",
|
||||
" push!(accData[:meanallocsBFGS], mean(t_bfgs.memory))\n",
|
||||
" println(\"Done: n \" * string(n))\n",
|
||||
" flush(stdout)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Done: m 500\n",
|
||||
"Done: m 1000\n",
|
||||
"Done: m 1500\n",
|
||||
"Done: m 2000\n",
|
||||
"Done: m 2500\n",
|
||||
"Done: m 3000\n",
|
||||
"Done: m 3500\n",
|
||||
"Done: m 4000\n",
|
||||
"Done: m 4500\n",
|
||||
"Done: m 5000\n",
|
||||
"Done: m 5500\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# BFGS vs LBFGS running time comparison with respect to m, fixing n, on well-conditioned matrix\n",
|
||||
"λ = 1e-4\n",
|
||||
"n = 50\n",
|
||||
"runs = 10\n",
|
||||
"\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"BFGSvsLBFGS-m-n\" * string(n) * \"--time.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :m => Array{Float64}(undef, 0),\n",
|
||||
" :meantimeLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meantimeBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsBFGS => Array{Float64}(undef, 0)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"for i ∈ 0:runs\n",
|
||||
" m = 500 + i * 500\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" t_lbfgs = @benchmark LimitedMemoryBFGS(ls) setup=(ls = (genFunc(:randDataset, λ=$λ, m=$m, n=$n) |> LeastSquaresF)) samples=10 evals=1\n",
|
||||
" t_bfgs = @benchmark BroydenFletcherGoldfarbShanno(ls) setup=(ls = (genFunc(:randDataset, λ=$λ, m=$m, n=$n) |> LeastSquaresF)) samples=10 evals=1\n",
|
||||
"\n",
|
||||
" push!(accData[:m], m)\n",
|
||||
" push!(accData[:meantimeLBFGS], mean(t_lbfgs.times))\n",
|
||||
" push!(accData[:stdtimeLBFGS], std(t_lbfgs.times))\n",
|
||||
" push!(accData[:meanallocsLBFGS], mean(t_lbfgs.memory))\n",
|
||||
" push!(accData[:meantimeBFGS], mean(t_bfgs.times))\n",
|
||||
" push!(accData[:stdtimeBFGS], std(t_bfgs.times))\n",
|
||||
" push!(accData[:meanallocsBFGS], mean(t_bfgs.memory))\n",
|
||||
" println(\"Done: m \" * string(m))\n",
|
||||
" flush(stdout)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# QR vs LBFGS running time comparison with respect to m, fixing n, on well-conditioned matrix\n",
|
||||
"λ = 1e-4\n",
|
||||
"n = 50\n",
|
||||
"runs = 10\n",
|
||||
"\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"QRvsLBFGS-m-n\" * string(n) * \"-wellcond--time.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :m => Array{Float64}(undef, 0),\n",
|
||||
" :meantimeLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meantimeQR => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeQR => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsQR => Array{Float64}(undef, 0)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"# warm up\n",
|
||||
"qrfact([0. 1; 1 0]) \\ [1.; 1]\n",
|
||||
"\n",
|
||||
"for i ∈ 0:runs\n",
|
||||
" m = 500 + i * 500\n",
|
||||
" gf = genFunc(:exactRandDataset, λ=λ, m=m, n=n)\n",
|
||||
"\n",
|
||||
" t_qr = @benchmark begin\n",
|
||||
" QR = qrfact($gf[:X_hat])\n",
|
||||
" w = QR \\ $gf[:y_hat]\n",
|
||||
" end samples=10 evals=1\n",
|
||||
"\n",
|
||||
" ls = LeastSquaresF(gf)\n",
|
||||
"\n",
|
||||
" t_lbfgs = @benchmark begin\n",
|
||||
" LimitedMemoryBFGS($ls)\n",
|
||||
" end samples=10 evals=1\n",
|
||||
" \n",
|
||||
" push!(accData[:m], m)\n",
|
||||
" push!(accData[:meantimeLBFGS], mean(t_lbfgs.times))\n",
|
||||
" push!(accData[:stdtimeLBFGS], std(t_lbfgs.times))\n",
|
||||
" push!(accData[:meanallocsLBFGS], mean(t_lbfgs.memory))\n",
|
||||
" push!(accData[:meantimeQR], mean(t_qr.times))\n",
|
||||
" push!(accData[:stdtimeQR], std(t_qr.times))\n",
|
||||
" push!(accData[:meanallocsQR], mean(t_qr.memory))\n",
|
||||
" println(\"Done: m \" * string(m))\n",
|
||||
" flush(stdout)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# QR vs LBFGS running time comparison with respect to m, fixing n, on ill-conditioned matrix\n",
|
||||
"λ = 1e-12\n",
|
||||
"n = 50\n",
|
||||
"runs = 10\n",
|
||||
"\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"QRvsLBFGS-m-n\" * string(n) * \"-illcond--time.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :m => Array{Float64}(undef, 0),\n",
|
||||
" :meantimeLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meantimeQR => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeQR => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsQR => Array{Float64}(undef, 0)\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"# warm up\n",
|
||||
"qrfact([0. 1; 1 0]) \\ [1.; 1]\n",
|
||||
"\n",
|
||||
"for i ∈ 0:runs\n",
|
||||
" m = 500 + i * 500\n",
|
||||
" gf = genFunc(:exactRandDataset, λ=λ, m=m, n=n)\n",
|
||||
"\n",
|
||||
" t_qr = @benchmark begin\n",
|
||||
" QR = qrfact($gf[:X_hat])\n",
|
||||
" w = QR \\ $gf[:y_hat]\n",
|
||||
" end samples=10 evals=1\n",
|
||||
"\n",
|
||||
" ls = LeastSquaresF(gf)\n",
|
||||
"\n",
|
||||
" t_lbfgs = @benchmark begin\n",
|
||||
" LimitedMemoryBFGS($ls)\n",
|
||||
" end samples=10 evals=1\n",
|
||||
" \n",
|
||||
" push!(accData[:m], m)\n",
|
||||
" push!(accData[:meantimeLBFGS], mean(t_lbfgs.times))\n",
|
||||
" push!(accData[:stdtimeLBFGS], std(t_lbfgs.times))\n",
|
||||
" push!(accData[:meanallocsLBFGS], mean(t_lbfgs.memory))\n",
|
||||
" push!(accData[:meantimeQR], mean(t_qr.times))\n",
|
||||
" push!(accData[:stdtimeQR], std(t_qr.times))\n",
|
||||
" push!(accData[:meanallocsQR], mean(t_qr.memory))\n",
|
||||
" println(\"Done: m \" * string(m))\n",
|
||||
" flush(stdout)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Comparison of all quasi newton methods"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Done: m 500\n",
|
||||
"Done: m 1000\n",
|
||||
"Done: m 1500\n",
|
||||
"Done: m 2000\n",
|
||||
"Done: m 2500\n",
|
||||
"Done: m 3000\n",
|
||||
"Done: m 3500\n",
|
||||
"Done: m 4000\n",
|
||||
"Done: m 4500\n",
|
||||
"Done: m 5000\n",
|
||||
"Done: m 5500\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Quasi newton methods running time comparison, fixing n and varying m, on ill-conditioned matrix\n",
|
||||
"λ = 1e-12\n",
|
||||
"n = 50\n",
|
||||
"runs = 10\n",
|
||||
"samples = 10\n",
|
||||
"\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"Quasi-Newton-Comparison-time-illcond.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :m => Array{Float64}(undef, 0),\n",
|
||||
"\n",
|
||||
" :meantimeLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :accuracyLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsLBFGS => Array{Float64}(undef, 0),\n",
|
||||
"\n",
|
||||
" :meantimeBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :accuracyBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsBFGS => Array{Float64}(undef, 0),\n",
|
||||
"\n",
|
||||
" :meantimeBFGSDogleg => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeBFGSDogleg => Array{Float64}(undef, 0),\n",
|
||||
" :accuracyBFGSDogleg => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsBFGSDogleg => Array{Float64}(undef, 0),\n",
|
||||
"\n",
|
||||
" :meantimeDFP => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeDFP => Array{Float64}(undef, 0),\n",
|
||||
" :accuracyDFP => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsDFP => Array{Float64}(undef, 0),\n",
|
||||
"\n",
|
||||
" :meantimeDFPDogleg => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeDFPDogleg => Array{Float64}(undef, 0),\n",
|
||||
" :accuracyDFPDogleg => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsDFPDogleg => Array{Float64}(undef, 0),\n",
|
||||
"\n",
|
||||
" :meantimeSR1 => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeSR1 => Array{Float64}(undef, 0),\n",
|
||||
" :accuracySR1 => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsSR1 => Array{Float64}(undef, 0)\n",
|
||||
" \n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"for i ∈ 0:runs\n",
|
||||
" m = 500 + i * 500\n",
|
||||
"\n",
|
||||
" gf = genFunc(:randDataset, λ=λ, m=m, n=n)\n",
|
||||
" ls = LeastSquaresF(gf)\n",
|
||||
"\n",
|
||||
" t_lbfgs = @benchmark begin\n",
|
||||
" LimitedMemoryBFGS($ls)\n",
|
||||
" end samples=samples evals=1\n",
|
||||
" res_lbfgs = LimitedMemoryBFGS(ls)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" BFGS.BFGSorDFP = :BFGS\n",
|
||||
"\n",
|
||||
" t_bfgs = @benchmark begin\n",
|
||||
" BroydenFletcherGoldfarbShanno($ls)\n",
|
||||
" end samples=samples evals=1\n",
|
||||
" res_bfgs = BroydenFletcherGoldfarbShanno(ls)\n",
|
||||
"\n",
|
||||
" t_bfgs_dogleg = @benchmark begin\n",
|
||||
" BroydenFletcherGoldfarbShannoDogleg($ls)\n",
|
||||
" end samples=samples evals=1\n",
|
||||
" res_bfgs_dogleg = BroydenFletcherGoldfarbShannoDogleg(ls)\n",
|
||||
"\n",
|
||||
" BFGS.BFGSorDFP = :DFP\n",
|
||||
"\n",
|
||||
" t_dfp = @benchmark begin\n",
|
||||
" BroydenFletcherGoldfarbShanno($ls)\n",
|
||||
" end samples=samples evals=1\n",
|
||||
" res_dfp = BroydenFletcherGoldfarbShanno(ls)\n",
|
||||
"\n",
|
||||
" t_dfp_dogleg = @benchmark begin\n",
|
||||
" BroydenFletcherGoldfarbShannoDogleg($ls)\n",
|
||||
" end samples=samples evals=1\n",
|
||||
" res_dfp_dogleg = BroydenFletcherGoldfarbShannoDogleg(ls)\n",
|
||||
"\n",
|
||||
" t_sr1 = @benchmark begin\n",
|
||||
" SymmetricRank1($ls)\n",
|
||||
" end samples=samples evals=1\n",
|
||||
" res_sr1 = SymmetricRank1(ls)\n",
|
||||
" \n",
|
||||
" push!(accData[:m], m)\n",
|
||||
" push!(accData[:meantimeLBFGS], mean(t_lbfgs.times))\n",
|
||||
" push!(accData[:stdtimeLBFGS], std(t_lbfgs.times))\n",
|
||||
" push!(accData[:accuracyLBFGS], norm(res_lbfgs.x - gf[:w_star]) / norm(gf[:w_star]))\n",
|
||||
" push!(accData[:meanallocsLBFGS], mean(t_lbfgs.memory))\n",
|
||||
"\n",
|
||||
" push!(accData[:meantimeBFGS], mean(t_bfgs.times))\n",
|
||||
" push!(accData[:stdtimeBFGS], std(t_bfgs.times))\n",
|
||||
" push!(accData[:accuracyBFGS], norm(res_bfgs.x - gf[:w_star]) / norm(gf[:w_star]))\n",
|
||||
" push!(accData[:meanallocsBFGS], mean(t_bfgs.memory))\n",
|
||||
"\n",
|
||||
" push!(accData[:meantimeBFGSDogleg], mean(t_bfgs_dogleg.times))\n",
|
||||
" push!(accData[:stdtimeBFGSDogleg], std(t_bfgs_dogleg.times))\n",
|
||||
" push!(accData[:accuracyBFGSDogleg], norm(res_bfgs_dogleg.x - gf[:w_star]) / norm(gf[:w_star]))\n",
|
||||
" push!(accData[:meanallocsBFGSDogleg], mean(t_bfgs_dogleg.memory))\n",
|
||||
"\n",
|
||||
" push!(accData[:meantimeDFP], mean(t_dfp.times))\n",
|
||||
" push!(accData[:stdtimeDFP], std(t_dfp.times))\n",
|
||||
" push!(accData[:accuracyDFP], norm(res_dfp.x - gf[:w_star]) / norm(gf[:w_star]))\n",
|
||||
" push!(accData[:meanallocsDFP], mean(t_dfp.memory))\n",
|
||||
"\n",
|
||||
" push!(accData[:meantimeDFPDogleg], mean(t_dfp_dogleg.times))\n",
|
||||
" push!(accData[:stdtimeDFPDogleg], std(t_dfp_dogleg.times))\n",
|
||||
" push!(accData[:accuracyDFPDogleg], norm(res_dfp_dogleg.x - gf[:w_star]) / norm(gf[:w_star]))\n",
|
||||
" push!(accData[:meanallocsDFPDogleg], mean(t_dfp_dogleg.memory))\n",
|
||||
"\n",
|
||||
" push!(accData[:meantimeSR1], mean(t_sr1.times))\n",
|
||||
" push!(accData[:stdtimeSR1], std(t_sr1.times))\n",
|
||||
" push!(accData[:accuracySR1], norm(res_sr1.x - gf[:w_star]) / norm(gf[:w_star]))\n",
|
||||
" push!(accData[:meanallocsSR1], mean(t_sr1.memory))\n",
|
||||
" println(\"Done: m \" * string(m))\n",
|
||||
" flush(stdout)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Done: m 500\n",
|
||||
"Done: m 1000\n",
|
||||
"Done: m 1500\n",
|
||||
"Done: m 2000\n",
|
||||
"Done: m 2500\n",
|
||||
"Done: m 3000\n",
|
||||
"Done: m 3500\n",
|
||||
"Done: m 4000\n",
|
||||
"Done: m 4500\n",
|
||||
"Done: m 5000\n",
|
||||
"Done: m 5500\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Quasi newton methods running time comparison, fixing n and varying m, on well-conditioned matrix\n",
|
||||
"λ = 1e-4\n",
|
||||
"n = 50\n",
|
||||
"runs = 10\n",
|
||||
"samples = 10\n",
|
||||
"\n",
|
||||
"# output csv\n",
|
||||
"outputvsc = joinpath(baseDir, \"Quasi-Newton-Comparison-time-wellcond.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :m => Array{Float64}(undef, 0),\n",
|
||||
"\n",
|
||||
" :meantimeLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :accuracyLBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsLBFGS => Array{Float64}(undef, 0),\n",
|
||||
"\n",
|
||||
" :meantimeBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :accuracyBFGS => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsBFGS => Array{Float64}(undef, 0),\n",
|
||||
"\n",
|
||||
" :meantimeBFGSDogleg => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeBFGSDogleg => Array{Float64}(undef, 0),\n",
|
||||
" :accuracyBFGSDogleg => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsBFGSDogleg => Array{Float64}(undef, 0),\n",
|
||||
"\n",
|
||||
" :meantimeDFP => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeDFP => Array{Float64}(undef, 0),\n",
|
||||
" :accuracyDFP => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsDFP => Array{Float64}(undef, 0),\n",
|
||||
"\n",
|
||||
" :meantimeDFPDogleg => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeDFPDogleg => Array{Float64}(undef, 0),\n",
|
||||
" :accuracyDFPDogleg => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsDFPDogleg => Array{Float64}(undef, 0),\n",
|
||||
"\n",
|
||||
" :meantimeSR1 => Array{Float64}(undef, 0),\n",
|
||||
" :stdtimeSR1 => Array{Float64}(undef, 0),\n",
|
||||
" :accuracySR1 => Array{Float64}(undef, 0),\n",
|
||||
" :meanallocsSR1 => Array{Float64}(undef, 0)\n",
|
||||
" \n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"for i ∈ 0:runs\n",
|
||||
" m = 500 + i * 500\n",
|
||||
"\n",
|
||||
" gf = genFunc(:randDataset, λ=λ, m=m, n=n)\n",
|
||||
" ls = LeastSquaresF(gf)\n",
|
||||
"\n",
|
||||
" t_lbfgs = @benchmark begin\n",
|
||||
" LimitedMemoryBFGS($ls)\n",
|
||||
" end samples=samples evals=1\n",
|
||||
" res_lbfgs = LimitedMemoryBFGS(ls)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" BFGS.BFGSorDFP = :BFGS\n",
|
||||
"\n",
|
||||
" t_bfgs = @benchmark begin\n",
|
||||
" BroydenFletcherGoldfarbShanno($ls)\n",
|
||||
" end samples=samples evals=1\n",
|
||||
" res_bfgs = BroydenFletcherGoldfarbShanno(ls)\n",
|
||||
"\n",
|
||||
" t_bfgs_dogleg = @benchmark begin\n",
|
||||
" BroydenFletcherGoldfarbShannoDogleg($ls)\n",
|
||||
" end samples=samples evals=1\n",
|
||||
" res_bfgs_dogleg = BroydenFletcherGoldfarbShannoDogleg(ls)\n",
|
||||
"\n",
|
||||
" BFGS.BFGSorDFP = :DFP\n",
|
||||
"\n",
|
||||
" t_dfp = @benchmark begin\n",
|
||||
" BroydenFletcherGoldfarbShanno($ls)\n",
|
||||
" end samples=samples evals=1\n",
|
||||
" res_dfp = BroydenFletcherGoldfarbShanno(ls)\n",
|
||||
"\n",
|
||||
" t_dfp_dogleg = @benchmark begin\n",
|
||||
" BroydenFletcherGoldfarbShannoDogleg($ls)\n",
|
||||
" end samples=samples evals=1\n",
|
||||
" res_dfp_dogleg = BroydenFletcherGoldfarbShannoDogleg(ls)\n",
|
||||
"\n",
|
||||
" t_sr1 = @benchmark begin\n",
|
||||
" SymmetricRank1($ls)\n",
|
||||
" end samples=samples evals=1\n",
|
||||
" res_sr1 = SymmetricRank1(ls)\n",
|
||||
" \n",
|
||||
" push!(accData[:m], m)\n",
|
||||
" push!(accData[:meantimeLBFGS], mean(t_lbfgs.times))\n",
|
||||
" push!(accData[:stdtimeLBFGS], std(t_lbfgs.times))\n",
|
||||
" push!(accData[:accuracyLBFGS], norm(res_lbfgs.x - gf[:w_star]) / norm(gf[:w_star]))\n",
|
||||
" push!(accData[:meanallocsLBFGS], mean(t_lbfgs.memory))\n",
|
||||
"\n",
|
||||
" push!(accData[:meantimeBFGS], mean(t_bfgs.times))\n",
|
||||
" push!(accData[:stdtimeBFGS], std(t_bfgs.times))\n",
|
||||
" push!(accData[:accuracyBFGS], norm(res_bfgs.x - gf[:w_star]) / norm(gf[:w_star]))\n",
|
||||
" push!(accData[:meanallocsBFGS], mean(t_bfgs.memory))\n",
|
||||
"\n",
|
||||
" push!(accData[:meantimeBFGSDogleg], mean(t_bfgs_dogleg.times))\n",
|
||||
" push!(accData[:stdtimeBFGSDogleg], std(t_bfgs_dogleg.times))\n",
|
||||
" push!(accData[:accuracyBFGSDogleg], norm(res_bfgs_dogleg.x - gf[:w_star]) / norm(gf[:w_star]))\n",
|
||||
" push!(accData[:meanallocsBFGSDogleg], mean(t_bfgs_dogleg.memory))\n",
|
||||
"\n",
|
||||
" push!(accData[:meantimeDFP], mean(t_dfp.times))\n",
|
||||
" push!(accData[:stdtimeDFP], std(t_dfp.times))\n",
|
||||
" push!(accData[:accuracyDFP], norm(res_dfp.x - gf[:w_star]) / norm(gf[:w_star]))\n",
|
||||
" push!(accData[:meanallocsDFP], mean(t_dfp.memory))\n",
|
||||
"\n",
|
||||
" push!(accData[:meantimeDFPDogleg], mean(t_dfp_dogleg.times))\n",
|
||||
" push!(accData[:stdtimeDFPDogleg], std(t_dfp_dogleg.times))\n",
|
||||
" push!(accData[:accuracyDFPDogleg], norm(res_dfp_dogleg.x - gf[:w_star]) / norm(gf[:w_star]))\n",
|
||||
" push!(accData[:meanallocsDFPDogleg], mean(t_dfp_dogleg.memory))\n",
|
||||
"\n",
|
||||
" push!(accData[:meantimeSR1], mean(t_sr1.times))\n",
|
||||
" push!(accData[:stdtimeSR1], std(t_sr1.times))\n",
|
||||
" push!(accData[:accuracySR1], norm(res_sr1.x - gf[:w_star]) / norm(gf[:w_star]))\n",
|
||||
" push!(accData[:meanallocsSR1], mean(t_sr1.memory))\n",
|
||||
" println(\"Done: m \" * string(m))\n",
|
||||
" flush(stdout)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"CSV.write(outputvsc, DataFrame(accData));"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.9.3",
|
||||
"language": "julia",
|
||||
"name": "julia-1.9"
|
||||
},
|
||||
"language_info": {
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.9.3"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
64
project/testing/conditioning.ipynb
generated
Normal file
64
project/testing/conditioning.ipynb
generated
Normal file
@ -0,0 +1,64 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"include(\"../../utilities/dataset.jl\")\n",
|
||||
"using CSV, DataFrames\n",
|
||||
"\n",
|
||||
"baseDir = joinpath(\"../\", \"results/conditioning\")\n",
|
||||
"mkpath(baseDir);"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"lambdas = 10. .^(-15:6)\n",
|
||||
"\n",
|
||||
"outputvsc = joinpath(baseDir, \"conditioning.csv\");\n",
|
||||
"accData = Dict(\n",
|
||||
" :lambda => Array{Float64}(undef, 0),\n",
|
||||
" :condnum => Array{Float64}(undef, 0),\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"for lambda in lambdas\n",
|
||||
" X_hat, _, _, _ = get_dataset(\"../data_for_testing/dataset.csv\", lambda)\n",
|
||||
" condnum = cond(X_hat)\n",
|
||||
" push!(accData[:lambda], lambda)\n",
|
||||
" push!(accData[:condnum], condnum)\n",
|
||||
"end\n",
|
||||
"\n",
|
||||
"df = DataFrame(accData)\n",
|
||||
"# CSV.write(outputvsc, df);"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Julia 1.9.3",
|
||||
"language": "julia",
|
||||
"name": "julia-1.9"
|
||||
},
|
||||
"language_info": {
|
||||
"file_extension": ".jl",
|
||||
"mimetype": "application/julia",
|
||||
"name": "julia",
|
||||
"version": "1.9.3"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
Reference in New Issue
Block a user