From 22cff9d367d8e62f5c043a3751c18cb42f329549 Mon Sep 17 00:00:00 2001 From: Willem Melis Date: Thu, 3 May 2018 20:30:14 +0200 Subject: [PATCH 1/4] added first version of panoc, supporting box and costum constraints --- demos/demo_panoc.m | 40 ++++++++++++++++ external_library/forbes_panoc/bin/.gitignore | 1 + .../bin/PANOC_Windows64_VStudio.lib | Bin 0 -> 62238 bytes .../bin/PANOC_Windows64_VStudio.mexw64 | Bin 0 -> 24576 bytes external_library/forbes_panoc/bin/readme.md | 2 + external_library/setup.m | 26 ++++++++++ external_library/src_Matlab/readme.md | 1 + external_library/src_Matlab/solve_panoc.m | 45 ++++++++++++++++++ forbes.m | 44 +++++++++-------- library/indBox.m | 3 ++ 10 files changed, 143 insertions(+), 19 deletions(-) create mode 100644 demos/demo_panoc.m create mode 100644 external_library/forbes_panoc/bin/.gitignore create mode 100644 external_library/forbes_panoc/bin/PANOC_Windows64_VStudio.lib create mode 100644 external_library/forbes_panoc/bin/PANOC_Windows64_VStudio.mexw64 create mode 100644 external_library/forbes_panoc/bin/readme.md create mode 100644 external_library/setup.m create mode 100644 external_library/src_Matlab/readme.md create mode 100644 external_library/src_Matlab/solve_panoc.m diff --git a/demos/demo_panoc.m b/demos/demo_panoc.m new file mode 100644 index 0000000..f834915 --- /dev/null +++ b/demos/demo_panoc.m @@ -0,0 +1,40 @@ +% Only use this demo after installing the panoc library. This is only +% supported on Windows right now. Run ./external_library/setup.m to +% install panoc. + +clear all; +%% +f=@rosen; +g=indBox(-4,4); +x0=[0;0]; +aff=0; % not supported with panoc +opts.solver="panoc"; +opts.tol=1e-12; +opts.maxit=200; + +% g.name="blah"; % uncomment this line if you want to use the Matlab function constraint +tic +out = forbes(f, g, x0, aff, [], opts) % this problem should take 20 iterations +toc + +% double check the results +if(out.iterations~=20) + disp(['Error: not solved in 20 iterations as expected but in ' ... + num2str(out.iterations) 'iterations'] ); +end + +theoretical_solution = [1;1]; +if(norm(out.x-theoretical_solution)>opts.tol) + disp(['Error: solution not [1;1] as expected but[' ... + num2str(out.x(1)) ';' num2str(out.x(2)) ']' ]); +end +%% +function [function_value,gradient] = rosen(initial_point) + a=1; + b=100; + function_value =(a-initial_point(1))^2 + b*(initial_point(2)-initial_point(1))^2; + + if nargout > 1 + gradient = [-2*(a-(b+1)*initial_point(1)+b*initial_point(2)); 2*b*(initial_point(2)-initial_point(1)) ]; + end +end \ No newline at end of file diff --git a/external_library/forbes_panoc/bin/.gitignore b/external_library/forbes_panoc/bin/.gitignore new file mode 100644 index 0000000..4bc3005 --- /dev/null +++ b/external_library/forbes_panoc/bin/.gitignore @@ -0,0 +1 @@ +panoc.mexw64 \ No newline at end of file diff --git a/external_library/forbes_panoc/bin/PANOC_Windows64_VStudio.lib b/external_library/forbes_panoc/bin/PANOC_Windows64_VStudio.lib new file mode 100644 index 0000000000000000000000000000000000000000..8b04006d4bee4fa7983f865866f0b68e5c5f0c67 GIT binary patch literal 62238 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

Ht)1C zb{_`Bs>P^#u#pW$8zi)WcwfWaOnj7mEuET=+dhbVQ*nlOOFFwHwO+Epl(Yha(ZGzw zIE?p~63ZEE zY3BKA5&sl0_8RUdC?A#mk&)A5C&MS`Wl?%6otlTw8?+NWRc0gnLr>>44_T4OdmQ<~_>G63BQHT-*SxecG0!uSbr}Yyv%x_V8$30G z4W2TnY#`ZnG?deI{>E&qVQ$9$2%4ZF&A`&i0BPJ|44VDvWda|_%u|3{CA9l3W;N_$ z=_JQndi5i*zAuG;rgU^8zZKABxGQis55XK5##kNj5N?v>!PLYC-`X{|O=SRgg&M0V zydk`%4)Kuhp-`P4&cC^?#pf5n)Yg=^cTXjJ=6xtTg?AaeJn(j54M<$d3dlhBV=26f zDvTBIR;1)z3*Io~?Msn+2E3h+Go{GA1zrq1T4xg1h-zTq{iW;g`zT?V|JV0XwNk^{ zyM4jC>U{O9?x||<6|cJ|)UeX$$I-J$Df6?f0-Il5RbS<2j|fVL-CM(R2H1lsD z-xFyvru|Nzz1yM?0F0BDfg6?OrBc66+zTijGpt zA?&SN>96vyqrnznGoTQcvS60c*57|nml@BjbK4?QJXU;vZxngU0PA(U8SoFd zcSEN2CVZV>LtBy80{9GWs%s};Vn3L==cBz~5n}wUkRjNN`#InQP1w`!q;gXBwyAs5 z)O{=MXR~i%EDQ1khvK#aC%6#zRNw@c<8}jY1st4*pW_5>1N=waG2qVuF2hM^&i$}C z;9Iy!{}|xIcvtobB{RC+$c79d{neCm6#$6L{*rFLh5yd&4(zzYQ6J2XJ=-CwO)W zbOfHdAEkZjE4Z7%C)hF-(IW6xz`@gC1KWAB5T^lt|IrjG9b{E?2^rZe_K++>HH zfS=+f`PLbX{R?iwcLL741LFuXy@2-?3i%fRzram01aB&Wj!R%$z~^yK1^xoy)3Z=N zaQeMK`pw#pi*R>0xdo5p~T1a#u&eG2%Xj@JYJRL9>2Jc66b zJPO!a0vk{{fZxMS{BFP=9sdGw#@(hb`Qr@USEr^-d0b~qR~|W zPh(5dgFgRgTd2-eO*^Ne(KS`|0pI9ZGbbg>zB+TV{1l0=)IM|4Rl3fclx#Gz&zzL7 u=d3bUnal0=+;ewDg^v7JXgbqEc*b7(?#}P-dZGJ;V=sXC`}N<(0{;s;C(|+j literal 0 HcmV?d00001 diff --git a/external_library/forbes_panoc/bin/readme.md b/external_library/forbes_panoc/bin/readme.md new file mode 100644 index 0000000..429e7a3 --- /dev/null +++ b/external_library/forbes_panoc/bin/readme.md @@ -0,0 +1,2 @@ +# build folder panoc +This folder contains binary's of the draft panoc library: https://github.com/Zilleplus/draf_panoc. \ No newline at end of file diff --git a/external_library/setup.m b/external_library/setup.m new file mode 100644 index 0000000..4d28525 --- /dev/null +++ b/external_library/setup.m @@ -0,0 +1,26 @@ +% install external libs +lib_path = pwd; + +%% install panoc + +mex_file_destination = fullfile(lib_path,'forbes_panoc','bin','panoc.mexw64'); +if ismac + disp('Using mex interface Mac os'); + mex_file_location=fullfile(lib_path,'forbes_panoc','bin','panoc_Mac64LLVM.mexw64'); +elseif isunix + disp('Using mex interface Linux'); + mex_file_location=fullfile(lib_path,'forbes_panoc','bin','panoc_Linux64Gcc.mexw64'); +elseif ispc + disp('Using mex interface Windows'); + mex_file_location=fullfile(lib_path,'forbes_panoc','bin','panoc_Windows64VStudio.mexw64'); +else + disp('Platform not supported') +end +copyfile(mex_file_location,mex_file_destination); + + +%% add paths to path and save +addpath(fullfile(lib_path,'forbes_panoc','bin')); +addpath(fullfile(lib_path,'src_Matlab')); +savepath;% write away path variable + diff --git a/external_library/src_Matlab/readme.md b/external_library/src_Matlab/readme.md new file mode 100644 index 0000000..f3174ca --- /dev/null +++ b/external_library/src_Matlab/readme.md @@ -0,0 +1 @@ +#Matlab code that links external library's with forbes diff --git a/external_library/src_Matlab/solve_panoc.m b/external_library/src_Matlab/solve_panoc.m new file mode 100644 index 0000000..1cdfe06 --- /dev/null +++ b/external_library/src_Matlab/solve_panoc.m @@ -0,0 +1,45 @@ +function [ out ] = solve_panoc( f, g ,opt , intial_solution ) + %SOLVE_PANOC Solve problem with panoc lib + + if(~isfield(g,'name')) + g.name='costum'; + end + + % parse the options into the panoc format + problem.dimension = length(intial_solution); + + if(g.name=="box") + problem.constraint_type = 'box'; + + problem.upper_bound=g.upper_bound; + problem.lower_bound=g.lower_bound; + else % unknown function, use the matlab version provided by the user + disp(['WARNING: No C implementation found of the constraint ' ... + 'function using the matlab implementation,'... + ' this may impact performance.']); + problem.constraint_type = 'costum'; + + % convert the function into the right format and set gamma=0 + g_function = g.makeprox(); + constraint = @(x) g_function(x,0); + problem.constraint = constraint; + end + + solver_params.tolerance = opt.tol; + solver_params.buffer_size = 20; + solver_params.max_iterations = opt.maxit; + + % Solve the problem with panoc, + % copy over by value the initial position. + solution=zeros(problem.dimension,1); + for i=1:problem.dimension + solution(i)=intial_solution(i); + end + + panoc('init',problem,solver_params); + number_of_iterations = panoc('solve',solution,f); + panoc('cleanup'); + + out.x=solution; + out.iterations=number_of_iterations; +end \ No newline at end of file diff --git a/forbes.m b/forbes.m index e7e32de..e251bf2 100755 --- a/forbes.m +++ b/forbes.m @@ -105,27 +105,33 @@ if nargin < 4, aff = []; end if nargin < 5, constr = []; end if nargin < 6, opt = []; end + + if(opt.solver=="panoc") + disp('WARNING: Using external lib, not all options are supported here.'); + % constr is not supported by panoc, ignore it + out=solve_panoc( fs, gs ,opt , init ); + else + [prob, id] = Process_Problem(fs, gs, init, aff, constr); + opt = Process_Options(opt); + lsopt = Process_LineSearchOptions(opt); - [prob, id] = Process_Problem(fs, gs, init, aff, constr); - opt = Process_Options(opt); - lsopt = Process_LineSearchOptions(opt); - - preprocess = toc(t0); + preprocess = toc(t0); - out_solver = opt.solverfun(prob, opt, lsopt); + out_solver = opt.solverfun(prob, opt, lsopt); - out.message = out_solver.message; - out.flag = out_solver.flag; - if id == 1 - out.x = out_solver.x; - else - [out.x1, out.x2, out.z] = prob.Get_DualPoints(out_solver.x, out_solver.gam); - out.y = out_solver.x; + out.message = out_solver.message; + out.flag = out_solver.flag; + if id == 1 + out.x = out_solver.x; + else + [out.x1, out.x2, out.z] = prob.Get_DualPoints(out_solver.x, out_solver.gam); + out.y = out_solver.x; + end + out.solver = out_solver; + out.prob = prob; + out.opt = opt; + out.lsopt = lsopt; + out.preprocess = preprocess; + out.time = toc(t0); end - out.solver = out_solver; - out.prob = prob; - out.opt = opt; - out.lsopt = lsopt; - out.preprocess = preprocess; - out.time = toc(t0); end diff --git a/library/indBox.m b/library/indBox.m index afa4818..c89d26a 100755 --- a/library/indBox.m +++ b/library/indBox.m @@ -29,6 +29,9 @@ function obj = indBox(lower, upper) obj.isConvex = 1; obj.makeprox = @() @(x, gam) call_indBox_prox(x, lower, upper); + obj.name="box"; + obj.upper_bound=upper; + obj.lower_bound=lower; end function [prox, val] = call_indBox_prox(x, lower, upper) From 0201d44aa9e179f30dba8288bac825410c145ba7 Mon Sep 17 00:00:00 2001 From: Willem Melis Date: Mon, 7 May 2018 23:35:35 +0200 Subject: [PATCH 2/4] added gamma as variable to the constraint function --- .../bin/PANOC_Windows64_VStudio.lib | Bin 62238 -> 63248 bytes .../bin/PANOC_Windows64_VStudio.mexw64 | Bin 24576 -> 25088 bytes external_library/src_Matlab/solve_panoc.m | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/external_library/forbes_panoc/bin/PANOC_Windows64_VStudio.lib b/external_library/forbes_panoc/bin/PANOC_Windows64_VStudio.lib index 8b04006d4bee4fa7983f865866f0b68e5c5f0c67..be1f6f59079df940903a145fffebc36d4b88c112 100644 GIT binary patch delta 6807 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 SExCJLfj1Aopwqoay8Z_vRX?== delta 6627 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 MZ9@}0@Xe}!1IY*#F#rGn diff --git a/external_library/forbes_panoc/bin/PANOC_Windows64_VStudio.mexw64 b/external_library/forbes_panoc/bin/PANOC_Windows64_VStudio.mexw64 index 9f15be5e814b83a5fc3492e341d4c9619b18952d..19065110a2669b87f38718b64132a03d77dfaeb5 100644 GIT binary patch literal 25088 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

Ht)1C zb{_`Bs>P^#u#pW$8zi)WcwfWaOnj7mEuET=+dhbVQ*nlOOFFwHwO+Epl(Yha(ZGzw zIE?p~63ZEE zY3BKA5&sl0_8RUdC?A#mk&)A5C&MS`Wl?%6otlTw8?+NWRc0gnLr>>44_T4OdmQ<~_>G63BQHT-*SxecG0!uSbr}Yyv%x_V8$30G z4W2TnY#`ZnG?deI{>E&qVQ$9$2%4ZF&A`&i0BPJ|44VDvWda|_%u|3{CA9l3W;N_$ z=_JQndi5i*zAuG;rgU^8zZKABxGQis55XK5##kNj5N?v>!PLYC-`X{|O=SRgg&M0V zydk`%4)Kuhp-`P4&cC^?#pf5n)Yg=^cTXjJ=6xtTg?AaeJn(j54M<$d3dlhBV=26f zDvTBIR;1)z3*Io~?Msn+2E3h+Go{GA1zrq1T4xg1h-zTq{iW;g`zT?V|JV0XwNk^{ zyM4jC>U{O9?x||<6|cJ|)UeX$$I-J$Df6?f0-Il5RbS<2j|fVL-CM(R2H1lsD z-xFyvru|Nzz1yM?0F0BDfg6?OrBc66+zTijGpt zA?&SN>96vyqrnznGoTQcvS60c*57|nml@BjbK4?QJXU;vZxngU0PA(U8SoFd zcSEN2CVZV>LtBy80{9GWs%s};Vn3L==cBz~5n}wUkRjNN`#InQP1w`!q;gXBwyAs5 z)O{=MXR~i%EDQ1khvK#aC%6#zRNw@c<8}jY1st4*pW_5>1N=waG2qVuF2hM^&i$}C z;9Iy!{}|xIcvtobB{RC+$c79d{neCm6#$6L{*rFLh5yd&4(zzYQ6J2XJ=-CwO)W zbOfHdAEkZjE4Z7%C)hF-(IW6xz`@gC1KWAB5T^lt|IrjG9b{E?2^rZe_K++>HH zfS=+f`PLbX{R?iwcLL741LFuXy@2-?3i%fRzram01aB&Wj!R%$z~^yK1^xoy)3Z=N zaQeMK`pw#pi*R>0xdo5p~T1a#u&eG2%Xj@JYJRL9>2Jc66b zJPO!a0vk{{fZxMS{BFP=9sdGw#@(hb`Qr@USEr^-d0b~qR~|W zPh(5dgFgRgTd2-eO*^Ne(KS`|0pI9ZGbbg>zB+TV{1l0=)IM|4Rl3fclx#Gz&zzL7 u=d3bUnal0=+;ewDg^v7JXgbqEc*b7(?#}P-dZGJ;V=sXC`}N<(0{;s;C(|+j diff --git a/external_library/src_Matlab/solve_panoc.m b/external_library/src_Matlab/solve_panoc.m index 1cdfe06..fc6764d 100644 --- a/external_library/src_Matlab/solve_panoc.m +++ b/external_library/src_Matlab/solve_panoc.m @@ -21,7 +21,7 @@ % convert the function into the right format and set gamma=0 g_function = g.makeprox(); - constraint = @(x) g_function(x,0); + constraint = @(x,gamma) g_function(x,gamma); problem.constraint = constraint; end From fd3b52a841d2214333b8fcc9f51b8f16faea3ba6 Mon Sep 17 00:00:00 2001 From: Zilleplus Date: Wed, 9 May 2018 16:37:41 +0200 Subject: [PATCH 3/4] tested panoc on linux, Matlab 2016a --- demos/demo_panoc.m | 14 ++------------ demos/rosen.m | 9 +++++++++ .../forbes_panoc/bin/PANOC_linux64_gcc.mexa64 | Bin 0 -> 31512 bytes external_library/setup.m | 6 ++++-- external_library/src_Matlab/solve_panoc.m | 2 +- forbes.m | 2 +- library/indBox.m | 2 +- 7 files changed, 18 insertions(+), 17 deletions(-) create mode 100644 demos/rosen.m create mode 100755 external_library/forbes_panoc/bin/PANOC_linux64_gcc.mexa64 diff --git a/demos/demo_panoc.m b/demos/demo_panoc.m index f834915..a02414d 100644 --- a/demos/demo_panoc.m +++ b/demos/demo_panoc.m @@ -8,11 +8,11 @@ g=indBox(-4,4); x0=[0;0]; aff=0; % not supported with panoc -opts.solver="panoc"; +opts.solver='panoc'; opts.tol=1e-12; opts.maxit=200; -% g.name="blah"; % uncomment this line if you want to use the Matlab function constraint +% g.name='blah'; % uncomment this line if you want to use the Matlab function constraint tic out = forbes(f, g, x0, aff, [], opts) % this problem should take 20 iterations toc @@ -27,14 +27,4 @@ if(norm(out.x-theoretical_solution)>opts.tol) disp(['Error: solution not [1;1] as expected but[' ... num2str(out.x(1)) ';' num2str(out.x(2)) ']' ]); -end -%% -function [function_value,gradient] = rosen(initial_point) - a=1; - b=100; - function_value =(a-initial_point(1))^2 + b*(initial_point(2)-initial_point(1))^2; - - if nargout > 1 - gradient = [-2*(a-(b+1)*initial_point(1)+b*initial_point(2)); 2*b*(initial_point(2)-initial_point(1)) ]; - end end \ No newline at end of file diff --git a/demos/rosen.m b/demos/rosen.m new file mode 100644 index 0000000..ea855ec --- /dev/null +++ b/demos/rosen.m @@ -0,0 +1,9 @@ +function [function_value,gradient] = rosen(initial_point) + a=1; + b=100; + function_value =(a-initial_point(1))^2 + b*(initial_point(2)-initial_point(1))^2; + + if nargout > 1 + gradient = [-2*(a-(b+1)*initial_point(1)+b*initial_point(2)); 2*b*(initial_point(2)-initial_point(1)) ]; + end +end diff --git a/external_library/forbes_panoc/bin/PANOC_linux64_gcc.mexa64 b/external_library/forbes_panoc/bin/PANOC_linux64_gcc.mexa64 new file mode 100755 index 0000000000000000000000000000000000000000..387f3183e20a301f1e8ce4f33a3575341d26b607 GIT binary patch literal 31512 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 literal 0 HcmV?d00001 diff --git a/external_library/setup.m b/external_library/setup.m index 4d28525..26909c6 100644 --- a/external_library/setup.m +++ b/external_library/setup.m @@ -3,13 +3,15 @@ %% install panoc -mex_file_destination = fullfile(lib_path,'forbes_panoc','bin','panoc.mexw64'); + if ismac disp('Using mex interface Mac os'); mex_file_location=fullfile(lib_path,'forbes_panoc','bin','panoc_Mac64LLVM.mexw64'); + mex_file_destination = fullfile(lib_path,'forbes_panoc','bin','panoc.mexw64'); elseif isunix disp('Using mex interface Linux'); - mex_file_location=fullfile(lib_path,'forbes_panoc','bin','panoc_Linux64Gcc.mexw64'); + mex_file_location=fullfile(lib_path,'forbes_panoc','bin','PANOC_linux64_gcc.mexa64'); + mex_file_destination = fullfile(lib_path,'forbes_panoc','bin','panoc.mexa64'); elseif ispc disp('Using mex interface Windows'); mex_file_location=fullfile(lib_path,'forbes_panoc','bin','panoc_Windows64VStudio.mexw64'); diff --git a/external_library/src_Matlab/solve_panoc.m b/external_library/src_Matlab/solve_panoc.m index fc6764d..6cb8867 100644 --- a/external_library/src_Matlab/solve_panoc.m +++ b/external_library/src_Matlab/solve_panoc.m @@ -8,7 +8,7 @@ % parse the options into the panoc format problem.dimension = length(intial_solution); - if(g.name=="box") + if(strcmp(g.name,'box')) problem.constraint_type = 'box'; problem.upper_bound=g.upper_bound; diff --git a/forbes.m b/forbes.m index e251bf2..f06f46a 100755 --- a/forbes.m +++ b/forbes.m @@ -106,7 +106,7 @@ if nargin < 5, constr = []; end if nargin < 6, opt = []; end - if(opt.solver=="panoc") + if(strcmp(opt.solver,'panoc')) disp('WARNING: Using external lib, not all options are supported here.'); % constr is not supported by panoc, ignore it out=solve_panoc( fs, gs ,opt , init ); diff --git a/library/indBox.m b/library/indBox.m index c89d26a..55c7790 100755 --- a/library/indBox.m +++ b/library/indBox.m @@ -29,7 +29,7 @@ function obj = indBox(lower, upper) obj.isConvex = 1; obj.makeprox = @() @(x, gam) call_indBox_prox(x, lower, upper); - obj.name="box"; + obj.name='box'; obj.upper_bound=upper; obj.lower_bound=lower; end From 74ff2ba949a092c9e309941b0b04c4c124e5c3ad Mon Sep 17 00:00:00 2001 From: Melis Date: Tue, 15 May 2018 13:01:09 +0200 Subject: [PATCH 4/4] added Matlab2016a bin for mac OS --- .../bin/PANOC_Mac64_clang.mexmaci64 | Bin 0 -> 27036 bytes external_library/setup.m | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100755 external_library/forbes_panoc/bin/PANOC_Mac64_clang.mexmaci64 diff --git a/external_library/forbes_panoc/bin/PANOC_Mac64_clang.mexmaci64 b/external_library/forbes_panoc/bin/PANOC_Mac64_clang.mexmaci64 new file mode 100755 index 0000000000000000000000000000000000000000..bc3a066ddfc4c450085d27e41a6fa2d679f8d146 GIT binary patch literal 27036 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