From a1ac5a19dc1d16665b5578dcc689b8a4f97711bc Mon Sep 17 00:00:00 2001 From: Miroslav Shaltev <shaltev@l3s.de> Date: Thu, 1 Jun 2017 16:31:12 +0200 Subject: [PATCH] separate sgtelib --- configure.ac | 4 +- ext/sgtelib/example/X.txt | 48 - ext/sgtelib/example/XX.txt | 7 - ext/sgtelib/example/Z.txt | 49 - ext/sgtelib/example/ZZ.txt | 7 - .../comparison/main_metrics_comparison.m | 33 - .../comparison/plot_metrics_comparison.m | 259 -- .../sgtelib_example_compare_models_1D.m | 101 - .../sgtelib_example_SurrogateBasedOptim.m | 114 - .../sgtelib_example_SurrogateBasedOptim_EI.m | 140 - ext/sgtelib/example/sgtelib_example_plot1D.m | 65 - .../example/sgtelib_example_plot2D_cat.m | 55 - .../example/sgtelib_example_plot2D_compare.m | 100 - .../example/sgtelib_example_plot2D_edge.m | 63 - .../example/sgtelib_example_plot2D_single.m | 42 - ext/sgtelib/example/sgtelib_example_plotND.m | 47 - ext/sgtelib/matlab_server/sgtelib_server_cv.m | 19 - .../matlab_server/sgtelib_server_example.m | 35 - .../matlab_server/sgtelib_server_info.m | 12 - .../matlab_server/sgtelib_server_metric.m | 21 - .../matlab_server/sgtelib_server_newdata.m | 20 - .../matlab_server/sgtelib_server_ping.m | 24 - .../matlab_server/sgtelib_server_predict.m | 22 - .../sgtelib_server_read_matrix.m | 43 - .../matlab_server/sgtelib_server_ready.m | 3 - .../matlab_server/sgtelib_server_reset.m | 16 - .../matlab_server/sgtelib_server_start.m | 89 - .../matlab_server/sgtelib_server_stop.m | 4 - .../matlab_server/sgtelib_server_wait_file.m | 30 - .../sgtelib_server_write_matrix.m | 26 - ext/sgtelib/src/Defines.hpp | 98 - ext/sgtelib/src/Exception.hpp | 65 - ext/sgtelib/src/Kernel.cpp | 322 -- ext/sgtelib/src/Kernel.hpp | 69 - ext/sgtelib/src/Matrix.cpp | 2969 ----------------- ext/sgtelib/src/Matrix.hpp | 401 --- ext/sgtelib/src/Surrogate.cpp | 1664 --------- ext/sgtelib/src/Surrogate.hpp | 237 -- ext/sgtelib/src/Surrogate_CN.cpp | 191 -- ext/sgtelib/src/Surrogate_CN.hpp | 68 - ext/sgtelib/src/Surrogate_Ensemble.cpp | 1061 ------ ext/sgtelib/src/Surrogate_Ensemble.hpp | 130 - ext/sgtelib/src/Surrogate_Factory.cpp | 133 - ext/sgtelib/src/Surrogate_Factory.hpp | 56 - ext/sgtelib/src/Surrogate_KS.cpp | 314 -- ext/sgtelib/src/Surrogate_KS.hpp | 64 - ext/sgtelib/src/Surrogate_Kriging.cpp | 324 -- ext/sgtelib/src/Surrogate_Kriging.hpp | 111 - ext/sgtelib/src/Surrogate_LOWESS.cpp | 709 ---- ext/sgtelib/src/Surrogate_LOWESS.hpp | 83 - ext/sgtelib/src/Surrogate_PRS.cpp | 278 -- ext/sgtelib/src/Surrogate_PRS.hpp | 85 - ext/sgtelib/src/Surrogate_PRS_CAT.cpp | 139 - ext/sgtelib/src/Surrogate_PRS_CAT.hpp | 61 - ext/sgtelib/src/Surrogate_PRS_EDGE.cpp | 134 - ext/sgtelib/src/Surrogate_PRS_EDGE.hpp | 59 - ext/sgtelib/src/Surrogate_Parameters.cpp | 1221 ------- ext/sgtelib/src/Surrogate_Parameters.hpp | 150 - ext/sgtelib/src/Surrogate_RBF.cpp | 303 -- ext/sgtelib/src/Surrogate_RBF.hpp | 107 - ext/sgtelib/src/Surrogate_Utils.cpp | 735 ---- ext/sgtelib/src/Surrogate_Utils.hpp | 210 -- ext/sgtelib/src/Tests.cpp | 1580 --------- ext/sgtelib/src/Tests.hpp | 74 - ext/sgtelib/src/TrainingSet.cpp | 1436 -------- ext/sgtelib/src/TrainingSet.hpp | 232 -- ext/sgtelib/src/header.txt | 24 - ext/sgtelib/src/makefile | 97 - ext/sgtelib/src/sgtelib.cpp | 782 ----- ext/sgtelib/src/sgtelib.hpp | 46 - ext/sgtelib/src/sgtelib_help.cpp | 516 --- ext/sgtelib/src/sgtelib_help.hpp | 44 - ext/sgtelib/user_guide/sgtelib_user_guide.pdf | Bin 108063 -> 0 bytes src/Makefile.am | 11 +- src/Makefile.in | 1575 --------- 75 files changed, 10 insertions(+), 20456 deletions(-) delete mode 100644 ext/sgtelib/example/X.txt delete mode 100644 ext/sgtelib/example/XX.txt delete mode 100644 ext/sgtelib/example/Z.txt delete mode 100644 ext/sgtelib/example/ZZ.txt delete mode 100644 ext/sgtelib/example/comparison/main_metrics_comparison.m delete mode 100644 ext/sgtelib/example/comparison/plot_metrics_comparison.m delete mode 100644 ext/sgtelib/example/comparison/sgtelib_example_compare_models_1D.m delete mode 100644 ext/sgtelib/example/sgtelib_example_SurrogateBasedOptim.m delete mode 100644 ext/sgtelib/example/sgtelib_example_SurrogateBasedOptim_EI.m delete mode 100644 ext/sgtelib/example/sgtelib_example_plot1D.m delete mode 100644 ext/sgtelib/example/sgtelib_example_plot2D_cat.m delete mode 100644 ext/sgtelib/example/sgtelib_example_plot2D_compare.m delete mode 100644 ext/sgtelib/example/sgtelib_example_plot2D_edge.m delete mode 100644 ext/sgtelib/example/sgtelib_example_plot2D_single.m delete mode 100644 ext/sgtelib/example/sgtelib_example_plotND.m delete mode 100644 ext/sgtelib/matlab_server/sgtelib_server_cv.m delete mode 100644 ext/sgtelib/matlab_server/sgtelib_server_example.m delete mode 100644 ext/sgtelib/matlab_server/sgtelib_server_info.m delete mode 100644 ext/sgtelib/matlab_server/sgtelib_server_metric.m delete mode 100644 ext/sgtelib/matlab_server/sgtelib_server_newdata.m delete mode 100644 ext/sgtelib/matlab_server/sgtelib_server_ping.m delete mode 100644 ext/sgtelib/matlab_server/sgtelib_server_predict.m delete mode 100644 ext/sgtelib/matlab_server/sgtelib_server_read_matrix.m delete mode 100644 ext/sgtelib/matlab_server/sgtelib_server_ready.m delete mode 100644 ext/sgtelib/matlab_server/sgtelib_server_reset.m delete mode 100644 ext/sgtelib/matlab_server/sgtelib_server_start.m delete mode 100644 ext/sgtelib/matlab_server/sgtelib_server_stop.m delete mode 100644 ext/sgtelib/matlab_server/sgtelib_server_wait_file.m delete mode 100644 ext/sgtelib/matlab_server/sgtelib_server_write_matrix.m delete mode 100644 ext/sgtelib/src/Defines.hpp delete mode 100644 ext/sgtelib/src/Exception.hpp delete mode 100644 ext/sgtelib/src/Kernel.cpp delete mode 100644 ext/sgtelib/src/Kernel.hpp delete mode 100644 ext/sgtelib/src/Matrix.cpp delete mode 100644 ext/sgtelib/src/Matrix.hpp delete mode 100644 ext/sgtelib/src/Surrogate.cpp delete mode 100644 ext/sgtelib/src/Surrogate.hpp delete mode 100644 ext/sgtelib/src/Surrogate_CN.cpp delete mode 100644 ext/sgtelib/src/Surrogate_CN.hpp delete mode 100644 ext/sgtelib/src/Surrogate_Ensemble.cpp delete mode 100644 ext/sgtelib/src/Surrogate_Ensemble.hpp delete mode 100644 ext/sgtelib/src/Surrogate_Factory.cpp delete mode 100644 ext/sgtelib/src/Surrogate_Factory.hpp delete mode 100644 ext/sgtelib/src/Surrogate_KS.cpp delete mode 100644 ext/sgtelib/src/Surrogate_KS.hpp delete mode 100644 ext/sgtelib/src/Surrogate_Kriging.cpp delete mode 100644 ext/sgtelib/src/Surrogate_Kriging.hpp delete mode 100644 ext/sgtelib/src/Surrogate_LOWESS.cpp delete mode 100644 ext/sgtelib/src/Surrogate_LOWESS.hpp delete mode 100644 ext/sgtelib/src/Surrogate_PRS.cpp delete mode 100644 ext/sgtelib/src/Surrogate_PRS.hpp delete mode 100644 ext/sgtelib/src/Surrogate_PRS_CAT.cpp delete mode 100644 ext/sgtelib/src/Surrogate_PRS_CAT.hpp delete mode 100644 ext/sgtelib/src/Surrogate_PRS_EDGE.cpp delete mode 100644 ext/sgtelib/src/Surrogate_PRS_EDGE.hpp delete mode 100644 ext/sgtelib/src/Surrogate_Parameters.cpp delete mode 100644 ext/sgtelib/src/Surrogate_Parameters.hpp delete mode 100644 ext/sgtelib/src/Surrogate_RBF.cpp delete mode 100644 ext/sgtelib/src/Surrogate_RBF.hpp delete mode 100644 ext/sgtelib/src/Surrogate_Utils.cpp delete mode 100644 ext/sgtelib/src/Surrogate_Utils.hpp delete mode 100644 ext/sgtelib/src/Tests.cpp delete mode 100644 ext/sgtelib/src/Tests.hpp delete mode 100644 ext/sgtelib/src/TrainingSet.cpp delete mode 100644 ext/sgtelib/src/TrainingSet.hpp delete mode 100644 ext/sgtelib/src/header.txt delete mode 100644 ext/sgtelib/src/makefile delete mode 100644 ext/sgtelib/src/sgtelib.cpp delete mode 100644 ext/sgtelib/src/sgtelib.hpp delete mode 100644 ext/sgtelib/src/sgtelib_help.cpp delete mode 100644 ext/sgtelib/src/sgtelib_help.hpp delete mode 100644 ext/sgtelib/user_guide/sgtelib_user_guide.pdf delete mode 100644 src/Makefile.in diff --git a/configure.ac b/configure.ac index 9ab8eb4..cadfab9 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT(nomad, 3.7.2, miroslav.shaltev@shaltev.de) +AC_INIT(nomad, 3.8.1, miroslav.shaltev@shaltev.de) AC_PREREQ([2.63]) AC_CONFIG_HEADERS([config.h]) @@ -51,6 +51,8 @@ if test "x$mpi" = "xtrue"; then fi NOMAD_ENABLE_MODULE([MPI],[mpi]) +PKG_CHECK_MODULES(SGTELIB, sgtelib) + AC_PROG_CPP AC_CONFIG_FILES([Makefile src/Makefile docs/Makefile nomad.pc nomadmpi.pc]) AC_OUTPUT diff --git a/ext/sgtelib/example/X.txt b/ext/sgtelib/example/X.txt deleted file mode 100644 index 0552ec4..0000000 --- a/ext/sgtelib/example/X.txt +++ /dev/null @@ -1,48 +0,0 @@ -X = [ 0 25 ; - 0 50 ; - 0 55 ; - 0 57 ; - 0 83 ; - 0 92 ; - 1 47 ; - 1 48 ; - 1 66 ; - 1 75 ; - 1 93 ; - 1 96 ; - 2 5 ; - 2 8 ; - 2 13 ; - 2 25 ; - 2 55 ; - 2 57 ; - 2 70 ; - 2 75 ; - 3 12 ; - 3 34 ; - 3 47 ; - 3 62 ; - 3 76 ; - 3 84 ; - 3 93 ; - 4 1 ; - 4 15 ; - 4 20 ; - 4 28 ; - 4 29 ; - 4 34 ; - 4 35 ; - 4 53 ; - 4 78 ; - 4 81 ; - 4 89 ; - 5 14 ; - 5 16 ; - 5 22 ; - 5 24 ; - 5 26 ; - 5 38 ; - 5 51 ; - 5 59 ; - 5 68 ; -] diff --git a/ext/sgtelib/example/XX.txt b/ext/sgtelib/example/XX.txt deleted file mode 100644 index a13c2a8..0000000 --- a/ext/sgtelib/example/XX.txt +++ /dev/null @@ -1,7 +0,0 @@ -XX = [ - 1 2.2 ; - 2 1.5 ; - 2 1.2 ; - 4 3.4 ; -]; - diff --git a/ext/sgtelib/example/Z.txt b/ext/sgtelib/example/Z.txt deleted file mode 100644 index 713ccaa..0000000 --- a/ext/sgtelib/example/Z.txt +++ /dev/null @@ -1,49 +0,0 @@ -Z = [ 0 ; - 0 ; - 0 ; - 0 ; - 0 ; - 0 ; - 2209 ; - 3481 ; - 4356 ; - 5625 ; - 8649 ; - 9216 ; - -50 ; - -128 ; - -338 ; - -1250 ; - -6050 ; - -6498 ; - -9800 ; - -11250 ; - 432 ; - 3468 ; - 6627 ; - 11532 ; - 17328 ; - 21168 ; - 25947 ; - -4 ; - -900 ; - -1600 ; - -3136 ; - -3364 ; - -4624 ; - -4900 ; - -11236 ; - -24336 ; - -26244 ; - -31684 ; - 980 ; - 1280 ; - 2420 ; - 2880 ; - 3380 ; - 7220 ; - 13005 ; - 17405 ; - 23120 ; -]; - diff --git a/ext/sgtelib/example/ZZ.txt b/ext/sgtelib/example/ZZ.txt deleted file mode 100644 index 3faee72..0000000 --- a/ext/sgtelib/example/ZZ.txt +++ /dev/null @@ -1,7 +0,0 @@ - -ZZ=[ - 2.5 ; - 3.4 ; - 3.5 ; - 5.5 ; -]; diff --git a/ext/sgtelib/example/comparison/main_metrics_comparison.m b/ext/sgtelib/example/comparison/main_metrics_comparison.m deleted file mode 100644 index 7a13681..0000000 --- a/ext/sgtelib/example/comparison/main_metrics_comparison.m +++ /dev/null @@ -1,33 +0,0 @@ -close all -clear all -clc - - -output_dir = '.'; - - - -input_file = 'output_hartman3.txt'; -output_file = [output_dir 'metric_comparison_hartman3.pdf']; -plot_metrics_comparison(input_file,output_file); -close all; - -input_file = 'output_hartman6.txt'; -output_file = [output_dir 'metric_comparison_hartman6.pdf']; -plot_metrics_comparison(input_file,output_file); -close all; - -input_file = 'output_braninhoo.txt'; -output_file = [output_dir 'metric_comparison_braninhoo.pdf']; -plot_metrics_comparison(input_file,output_file); -close all; - -input_file = 'output_camelback.txt'; -output_file = [output_dir 'metric_comparison_camelback.pdf']; -plot_metrics_comparison(input_file,output_file); -close all; - -input_file = 'output_rosenbrock.txt'; -output_file = [output_dir 'metric_comparison_rosenbrock.pdf']; -plot_metrics_comparison(input_file,output_file); -close all; diff --git a/ext/sgtelib/example/comparison/plot_metrics_comparison.m b/ext/sgtelib/example/comparison/plot_metrics_comparison.m deleted file mode 100644 index 300440a..0000000 --- a/ext/sgtelib/example/comparison/plot_metrics_comparison.m +++ /dev/null @@ -1,259 +0,0 @@ -function plot_metrics_comparison(input_file,output_file) -% output_dir = '/home/bastien/Bureau/MUSU/MUSU_2015_01_01_WorkingPaper/figs/'; -% input_file = 'output_hartman6.txt'; -% output_dir = '/home/bastien/Bureau/MUSU/PAPER_OrderErrorForEnsembles/figs/'; -% output_file = [output_dir 'metric_comparison_hartman6.pdf']; -%close all - - - -texOptions = {'fontname','times','fontsize',14}; - - - - - -m_order = [1 2 3 4]; - - -model_list = cell(0); -metric_list = cell(0); -tab = []; - -fid = fopen(input_file); -line = fgetl(fid); -while ischar(line) - - if isempty(line) - line = fgetl(fid); - continue; - end - line = cleanSpaces(line); - - w = getWords(line); - if isempty(w{end}) - w(end)=[]; - end - - if strcmp(w{1},'metrics') - w(1) = []; - vs = zeros(1,length(w)); - for i = 1:length(w) - vs(1,i) = str2num(w{i}); - end - tab = [tab ; vs]; - % disregard data and delete last model - if max(vs)<-1 - model_list(end) = []; - tab(end,:) = []; - end - elseif strcmp(w{1},'list_metrics') - w(1) = []; - metric_list = w; - disp(metric_list); - elseif strcmp(w{1},'output') - % nothing - elseif strcmp(w{1},'TYPE') - disp('=================') - line - - line = cleanSpaces(line); - line - line = strrep(line,'TYPE',''); - line = strrep(line,'DEGREE',''); - line = strrep(line,'KERNEL_COEF -1','OPT'); - line = strrep(line,'KERNEL_COEF',''); - line = strrep(line,'KERNEL_',''); - line = strrep(line,'D1',''); - line = strrep(line,'WEIGHT',''); - line = strrep(line,'METRIC',''); - line = strrep(line,'ENSEMBLE','Ens.'); - line = strrep(line,'OPTIM','Optim.'); - line = strrep(line,'SELECT','Select'); - line = strrep(line,'RIDGE 0.001','Ridge 1e-3'); - line = strrep(line,'RIDGE 0',''); - line = cleanSpaces(line); - line = strrep(line,'RBFI I','RBFI PolyH. '); - line = strrep(line,'PRESET',' '); - line = cleanSpaces(line); - model_list{end+1} = line; - else - disp(line) - error('line not recognized'); - end - - line = fgetl(fid); -end - -fclose(fid); - - - -% Count -NM = length(metric_list); -NS = length(model_list); - -% Reorder -metric_list = metric_list(m_order); -tab = tab(:,m_order); - -% Build fancy names -metric_fancy_names = metric_list; -metric_fancy_names = strrep(metric_fancy_names,'LOO','RMSE'); -metric_fancy_names = strrep(metric_fancy_names,'RMSECV','PRESS'); -metric_fancy_names = strrep(metric_fancy_names,'OETP','OE'); - - -xmin = zeros(1,NM); -xmax = zeros(1,NM); -for nm=1:NM - e = tab(:,nm); - xmin(nm) = min(e(e>0)); - if any(e==0) - xmin(nm) = xmin(nm)/10; - end - xmax(nm) = max(e); -end - -xmin = 10.^floor(log10(xmin)); -xmax = 10.^ceil (log10(xmax)); - -% -% -% xmin(:) = 0.0; -% xmax(:) = 1; - - - - - -MODEL_TYPES = {'PRS','KS','RBFI','LOWESS','Ens.'}; - -%MODEL_TYPES = {'PRS','KS','RBFI','RBFI PolyH'}; - - -%figure('color','w','position',[959 19 932 945]); -%figure('color','w','position',[949 483 932 481]); -%figure('color','w','position',[793 14 648 770]); -%figure('color','w','position',[509 574 932 210]); -figure('color','w','position',[586 408 847 374]); -set(gcf,'units','normalized'); - -coladd = 2.5 -height = 0.85; -width = 0.7; -for nm=1:NM - - % ORder - t = tab(:,nm) - [t,t] = sort(t); - t(t) = (1:length(t)) - - pos = [ (nm+coladd-1)/(NM+coladd) (1-height)/2 width/(NM+coladd) height]; - subplot('position',pos); hold on; - for ns=1:NS - w = getWords(model_list{ns}); - c = -1; - for i=1:length(MODEL_TYPES) - if ~isempty(strfind(model_list{ns},MODEL_TYPES{i})) - c = i; - end - end - if c==-1 - w{1} - MODEL_TYPES - error('not recognised...'); - end - c = get_color(c+1,length(MODEL_TYPES)+1); - c = 1-0.7*(1-c); - fill([xmin(nm)*[1 1] tab(ns,nm)*[1 1]],ns+[-0.4 +0.4 +0.4 -0.4],c); - text(0.75,ns,num2str(t(ns))); - %text(0.75,ns, num2str(t(ns))); - end - - - set(gca,'units','normalized'); - title(metric_fancy_names{nm},texOptions{:}); - if nm==1 - disp('Modify ytick'); - set(gca,'ytick',(1:NS),'yticklabel',model_list,texOptions{:}); - else - set(gca,'ytick',[],'yticklabel',[],texOptions{:}); - end - %set(gca,'xscale','log'); - %xlim([xmin(nm) xmax(nm)]); - %set(gca,'xtick',[xmin(nm) xmax(nm)]); - set(gca,'ydir','reverse','xgrid','on','xminorgrid','off','box','on'); - ylim([0.5 NS+0.5]); - - - - -end - -export_fig([output_file],'-pdf'); - - - - - - - - - - - - - -output_file = strrep(output_file,'.pdf','_correlation.tex'); -fid = fopen(output_file,'w'); -newline = char(10); - -s = '\begin{tabular}{| c ||'; -for i=1:NM - s = [s ' c |']; -end -fwrite(fid,[s '}' newline]); -fwrite(fid,['\hline' newline]); -s = ''; -for i=1:NM - s = [s ' & ' metric_fancy_names{i} ]; -end -fwrite(fid,[s ' \\' newline]); -fwrite(fid,['\hline\hline' newline]); -for i=1:NM - mi = tab(:,i); - fwrite(fid,[metric_fancy_names{i} newline]); - for j=1:NM - if j>=i - mj = tab(:,j); - c = corr([mi mj]); - c = c(2,1); - c = 0.01*round(c*100); - s = num2str(c); - if abs(c)~=1 && c~=0 && 10*c==round(10*c) - s = [s '0']; - if isempty(find(s=='.')) - error('PROBLEM...'); - end - end - else - s = ' '; - end - if j==NM - s = [s ' \\']; - end - fwrite(fid,[ ' & ' s newline]); - end - fwrite(fid,['\hline' newline]); -end -fwrite(fid,'\end{tabular}'); -fclose(fid); -%edit(output_file); - - - - - - - diff --git a/ext/sgtelib/example/comparison/sgtelib_example_compare_models_1D.m b/ext/sgtelib/example/comparison/sgtelib_example_compare_models_1D.m deleted file mode 100644 index 592c245..0000000 --- a/ext/sgtelib/example/comparison/sgtelib_example_compare_models_1D.m +++ /dev/null @@ -1,101 +0,0 @@ -close all -%clear all -clc -disp('=========== EXPLORER ============='); - -addpath('../Matlab_Server'); - -! make -j 4 - -model=cell(0,1); - - model{end+1} = 'TYPE LOWESS SHAPE_COEF -1 PRESET DEN ' - model{end+1} = 'TYPE LOWESS SHAPE_COEF -1 PRESET DGN ' - - - texOptions = {'fontname','times','fontsize',14}; - - - -disp('=========== START ============='); - - -% GOOD!! - - - -X = randn(50,1); -Z = sin(2*pi*X)+0.1*randn(size(X)); - -Z = cos(pi*X).*sign(X); - -%figure('color','w','position',[1466 527 455 437]); hold on; -figure('color','w','position',[198 95 933 639]); hold on; -pointer(1) = plot(X,Z,'ok','linewidth',2); - - -NN = 1000; -zoom = 1.0; -XX = sort([linspace(zoom*min(X),zoom*max(X),NN)' ; X ]); -%XX = 0.5; - -metric = inf*ones(length(model),2); - -for i=1:length(model) - disp('Model : '); - model{i} - disp('Init'); - sgtelib_server_start(model{i},true) - sgtelib_server_ping; - disp('Data'); - sgtelib_server_newdata(X,Z); - disp('Predict'); - [ZZ,std,ei,cdf] = sgtelib_server_predict(XX); - metric(i,1) = sgtelib_server_metric('RMSECV'); - metric(i,2) = sgtelib_server_metric('OECV'); - marker = '';%get_marker(i,length(model)); - pointer(i+1) = plot(XX,ZZ,['-' marker],'color',get_color(i+1,length(model)+1)); - sgtelib_server_stop; -end - - - - -legend_txt = {'Training points'}; -for i=1:length(model) - name = model{i}; - name = strrep(name,'TYPE ENSEMBLE WEIGHT SELECT METRIC','Select'); - name = strrep(name,'RMSECV','PRESS'); - name = strrep(name,'KERNEL_COEF ',' $\lambda$='); - name = strrep(name,'TYPE',' '); - name = strrep(name,'DEGREE','Degree'); - name = strrep(name,'RIDGE 0.001','Ridge 1e-3'); - name = strrep(name,'RIDGE 0.0',' '); - name = strrep(name,'SHAPE_COEF',' '); - name = strrep(name,'PRESET',' '); - name = strrep(name,'Degree 2',' '); - name = cleanSpaces(name); - legend_txt{i+1} = name; -end -legend(pointer,legend_txt,'location','best','interpreter','latex'); -%shift_legend_size([-0.15 0 +0.1 0]); -%axis([0 +1 -1.5 +1.5]) - -xlabel('x',texOptions{:}); -ylabel('y',texOptions{:}); - -set(gca,texOptions{:}); - - output_dir = './'; - output_file = [output_dir 'plot_function_2.pdf']; -export_fig([output_file],'-pdf'); - -for i=1:length(model) - disp(legend_txt{i+1}); - s = ' '; - s = [s num2str(metric(i,1),8)]; - s(20) = ' '; - s = [s num2str(metric(i,2),8)]; - disp(s); - -end \ No newline at end of file diff --git a/ext/sgtelib/example/sgtelib_example_SurrogateBasedOptim.m b/ext/sgtelib/example/sgtelib_example_SurrogateBasedOptim.m deleted file mode 100644 index 2a55c52..0000000 --- a/ext/sgtelib/example/sgtelib_example_SurrogateBasedOptim.m +++ /dev/null @@ -1,114 +0,0 @@ -close all -clear all -clc -disp('=========== EXPLORER ============='); - -addpath('../Matlab_Server'); - -WRITE = false; - -! make -j 4 -model = 'TYPE KRIGING' - -sgtelib_server_start(model) - - - -disp('=========== START ============='); -sgtelib_server_ping; - - -f = @(x) sin(5*x) + 1.5*x + x.^2; -xmin = -2; -xmax = +1.5; -zmin = -3; -zmax = +5; - -X = [ -2 ; -1 ; 0.5 ; 1.5 ]; -Z = f(X); - -XX = linspace(xmin,xmax,1000)'; - -ZZtrue = f(XX); - - - -figure('color','w'); hold on; -pointer = []; -leg_txt = cell(0); -k = 0; - -pointer(1) = plot(XX,ZZtrue,'--b'); -leg_txt{1} = 'True function f(x) (unknown)'; -legend(pointer,leg_txt,'location','northwest'); legend('boxoff'); -axis([xmin xmax zmin zmax]); -xlabel('x') -drawnow -if WRITE - export_fig(['SurrogateBasedOptim_A' sprintf('%02d',k) '.pdf'],'-pdf'); k=k+1; -end - -pointer(2) = plot(X,Z,'ok'); -leg_txt{2} = 'Observations'; -legend(pointer,leg_txt,'location','northwest'); legend('boxoff'); -axis([xmin xmax zmin zmax]); -drawnow -if WRITE - export_fig(['SurrogateBasedOptim_A' sprintf('%02d',k) '.pdf'],'-pdf'); k=k+1; -end -set(legend,'box','off') - - -sgtelib_server_newdata(X,Z); - -for ii=1:8 - - [ZZ,std,ei,cdf] = sgtelib_server_predict(XX); - pointer(3) = plot(XX,ZZ,'r'); - if ii==1 - leg_txt{3} = 'Surrogate model'; - else - leg_txt{3} = 'Updated surrogate model'; - end - legend(pointer,leg_txt,'location','northwest'); legend('boxoff'); - axis([xmin xmax zmin zmax]); - drawnow - if WRITE - export_fig(['SurrogateBasedOptim_A' sprintf('%02d',k) '.pdf'],'-pdf'); k=k+1; - end - - [ZZmin,imin] = min(ZZ); - XXmin = XX(imin); - - - - - pointer(4) = plot(XXmin,ZZmin,'or'); - leg_txt{4} = ['Candidate: x=' num2str(XXmin,3) ]; - legend(pointer,leg_txt,'location','northwest'); legend('boxoff'); - axis([xmin xmax zmin zmax]); - drawnow - if WRITE - export_fig(['SurrogateBasedOptim_A' sprintf('%02d',k) '.pdf'],'-pdf'); k=k+1; - end - - Xnew = XXmin; - Znew = f(Xnew); - pointer(5) = plot(Xnew,Znew,'ob'); - leg_txt{5} = ['True value of candidate: f(' num2str(XXmin,3) ') = ' num2str(Znew,3)]; - legend(pointer,leg_txt,'location','northwest'); legend('boxoff'); - axis([xmin xmax zmin zmax]); - drawnow - if WRITE - export_fig(['SurrogateBasedOptim_A' sprintf('%02d',k) '.pdf'],'-pdf'); k=k+1; - end - - delete(pointer(3:5)); - pointer(3:5) = []; - leg_txt(3:5) = []; - plot(Xnew,Znew,'ko'); - sgtelib_server_newdata(Xnew,Znew); - -end - -sgtelib_server_stop; diff --git a/ext/sgtelib/example/sgtelib_example_SurrogateBasedOptim_EI.m b/ext/sgtelib/example/sgtelib_example_SurrogateBasedOptim_EI.m deleted file mode 100644 index 72b4e58..0000000 --- a/ext/sgtelib/example/sgtelib_example_SurrogateBasedOptim_EI.m +++ /dev/null @@ -1,140 +0,0 @@ -close all -clear all -clc -disp('=========== EXPLORER ============='); - -addpath('../Matlab_Server'); - -WRITE = false; - -! make -j 4 -model = 'TYPE KRIGING' - - -sgtelib_server_start(model); - - -disp('=========== START ============='); -sgtelib_server_ping; - - -f = @(x) sin(8*x) + 1.5*x + x.^2 ; -xmin = -2; -xmax = +1.5; -zmin = -3; -zmax = +5; - -X = [ -2 ; -1.4 ; -0.6 ; 0.8; 1.5 ]; -Z = f(X); -Zmin = min(Z); - -XX = linspace(xmin,xmax,1000)'; - -ZZtrue = f(XX); - - - -figure('color','w'); hold on; -pointer = []; -leg_txt = cell(0); -k = 0; - -pointer(1) = plot(XX,ZZtrue,'--b'); -leg_txt{1} = 'True function f(x) (unknown)'; -legend(pointer,leg_txt,'location','northwest'); legend('boxoff'); -axis([xmin xmax zmin zmax]); -xlabel('x') -drawnow -if WRITE - export_fig(['SurrogateBasedOptim_B' sprintf('%02d',k) '.pdf'],'-pdf'); k=k+1; -end - - -pointer(2) = plot(X,Z,'ok'); -leg_txt{2} = 'Observations'; -legend(pointer,leg_txt,'location','northwest'); legend('boxoff'); -axis([xmin xmax zmin zmax]); -drawnow -if WRITE - export_fig(['SurrogateBasedOptim_B' sprintf('%02d',k) '.pdf'],'-pdf'); k=k+1; -end -set(legend,'box','off') - - -sgtelib_server_newdata(X,Z); - - -for ii=1:50 - -[ZZ,std,ei,cdf] = sgtelib_server_predict(XX); -pointer(3) = plot(XX,ZZ,'r'); -if ii==1 - leg_txt{3} = 'Surrogate model'; -else - leg_txt{3} = 'Updated surrogate model'; -end - -std = std/max(std); -pointer_sup(1) = plot(XX,ZZ+std,'--r'); -pointer_sup(2) = plot(XX,ZZ-std,'--r'); -drawnow - -u = (Zmin-ZZ)./std; -ei = std.*( u.*normcdf(u)+normpdf(u) ); -if max(ei)>0 - ei = ei/max(ei); -end - - -pointer(4) = plot(XX,ei,'k'); -leg_txt{4} = 'Expected Improvement'; - -legend(pointer,leg_txt,'location','northwest'); legend('boxoff'); -axis([xmin xmax zmin zmax]); -drawnow -if WRITE - export_fig(['SurrogateBasedOptim_B' sprintf('%02d',k) '.pdf'],'-pdf'); k=k+1; -end - -pause(0.3) - -if min(ei)==max(ei) - break; -end -[eimin,imin] = max(ei); -XXmin = XX(imin); -drawnow - -pointer(5) = plot(XXmin,eimin,'ok'); -leg_txt{5} = ['Candidate: x=' num2str(XXmin,3) ]; -legend(pointer,leg_txt,'location','northwest'); legend('boxoff'); -axis([xmin xmax zmin zmax]); -drawnow -if WRITE - export_fig(['SurrogateBasedOptim_B' sprintf('%02d',k) '.pdf'],'-pdf'); k=k+1; -end - - -Xnew = XXmin; -Znew = f(Xnew); -Zmin = min(Zmin,Znew); -pointer(6) = plot(Xnew,Znew,'ob'); -leg_txt{6} = ['True value of candidate: f(' num2str(XXmin,3) ') = ' num2str(Znew,3)]; -legend(pointer,leg_txt,'location','northwest'); legend('boxoff'); -axis([xmin xmax zmin zmax]); -drawnow -if WRITE - export_fig(['SurrogateBasedOptim_B' sprintf('%02d',k) '.pdf'],'-pdf'); k=k+1; -end - -delete(pointer(3:6)); -delete(pointer_sup); -pointer(3:6) = []; -leg_txt(3:6) = []; -plot(Xnew,Znew,'ko'); -sgtelib_server_newdata(Xnew,Znew); -drawnow -pause(0.3); -end - -sgtelib_server_stop; diff --git a/ext/sgtelib/example/sgtelib_example_plot1D.m b/ext/sgtelib/example/sgtelib_example_plot1D.m deleted file mode 100644 index fd752ab..0000000 --- a/ext/sgtelib/example/sgtelib_example_plot1D.m +++ /dev/null @@ -1,65 +0,0 @@ -close all -clear all -clc - -model = 'TYPE ENSEMBLE WEIGHT OPTIM METRIC OECV'; -sgtelib_server_start(model,true) -sgtelib_server_ping; - - -P = 100; -X = sort(randn(P,1)); - - -Z(:,1) = X.^2-X-3; -Z(:,2) = sign(X).*cos(X) + 0.1*randn(size(X)); -Z(:,3) = mod(round(X),2)-0.5; -M = size(Z,2); -sgtelib_server_newdata(X,Z); - - - -PP = 1000; -XX = sort([linspace(min(X)-1,max(X)+1,PP)' ; X]); - - - -figure; -hold on; -for i=1:M - plot(X,Z(:,i),'o','color',get_color(i,M)); -end - - - -[ZZ,std,ei,cdf] = sgtelib_server_predict(XX); -disp('metrics...') -sgtelib_server_metric('RMSE') -sgtelib_server_metric('RMSECV') -sgtelib_server_metric('OECV') - -for i=1:M - plot(XX,ZZ(:,i),'-','color',get_color(i,M),'linewidth',2); - plot(XX,ZZ(:,i)+std(:,i),'--','color',get_color(i,M)); - plot(XX,ZZ(:,i)-std(:,i),'--','color',get_color(i,M)); -end - -% plot(xlim,[0 0],'--k'); -% disp('Get CV values'); -% [Zh,Sh,Zv,Sv] = sgtelib_server_cv; -% for i=1:M -% plot(X,Zv(:,i),'o','color',get_color(i,M)); -% for j=1:P -% plot(X(j)*[1 1],Zv(j,i)+Sv(j,i)*[-1 +1],'-','color',get_color(i,M)); -% end -% end - - -% disp('Plot EFI'); -% figure; -% efi = ei(:,1).*prod(cdf(:,2:end),2); -% efi = max(1e-16,efi); -% plot(XX,efi,'g'); -% set(gca,'yscale','log') - - diff --git a/ext/sgtelib/example/sgtelib_example_plot2D_cat.m b/ext/sgtelib/example/sgtelib_example_plot2D_cat.m deleted file mode 100644 index 708f982..0000000 --- a/ext/sgtelib/example/sgtelib_example_plot2D_cat.m +++ /dev/null @@ -1,55 +0,0 @@ -close all -%clear all -clc -disp('=========== EXPLORER ============='); - - -model = 'TYPE ENSEMBLE WEIGHT SELECT METRIC OECV DISTANCE OPTIM' - -model = 'TYPE KS DISTANCE OPTIM' -model = 'TYPE ENSEMBLE WEIGHT SELECT METRIC OECV DISTANCE OPTIM' - -%model = 'TYPE PRS_CAT DEGREE 3' -%model = 'TYPE RBF DISTANCE OPTIM' - -model = 'TYPE LOWESS DISTANCE OPTIM' - - -f = @(x) x(:,2).^2 .* x(:,1) .* ( 2*mod(x(:,1),2)-1 ) - -% f = @(x) 40*(x(:,1)==0)+... -% 35*(x(:,2)==0)+... -% 35*cos(x(:,1)/4)+... -% 30*sin(x(:,2)/9); - -% Data points -x1max = 5; -x2max = 100; - -p = 50; -X = [round(rand(p,1)*x1max) round(rand(p,1)*x2max) ]; -X = unique(X,'rows'); -Z = f(X); - - -sgtelib_server_start(model,true) -sgtelib_server_ping; -sgtelib_server_newdata(X,Z); - -% Prediction -[x1,x2] = meshgrid( (0:x1max) , (0:x2max) ); -XX = [x1(:) x2(:)]; -[ZZ,std,ei,cdf] = sgtelib_server_predict(XX); -ZZ = reshape(ZZ,x2max+1,x1max+1); - - -figure('color','w'); hold on; -surf(x1,x2,ZZ,'facealpha',0.5); -plot3(X(:,1),X(:,2),Z,'ko','linewidth',3,'markersize',5); -dv = max(Z)-min(Z); -zlim([min(Z)-dv/3,max(Z)+dv/3]); -set(gca,'view',[116 50]); -xlabel('x1'); -ylabel('x2'); - -sgtelib_server_stop; diff --git a/ext/sgtelib/example/sgtelib_example_plot2D_compare.m b/ext/sgtelib/example/sgtelib_example_plot2D_compare.m deleted file mode 100644 index 5ff9530..0000000 --- a/ext/sgtelib/example/sgtelib_example_plot2D_compare.m +++ /dev/null @@ -1,100 +0,0 @@ -close all -clear all -clc -disp('=========== EXPLORER ============='); - -! make -j 4 -model = 'TYPE LOWESS DISTANCE OPTIM KERNEL_SHAPE OPTIM KERNEL_TYPE OPTIM RIDGE OPTIM METRIC OECV' - -model = 'TYPE KRIGING DISTANCE NORM2_IS0 METRIC OECV' - -% creation of model -sgtelib_server_start(model,true) -sgtelib_server_ping; - - - -% Test function -%f = @(x) cos(sqrt(0.5*x(:,1))).*cos(0.1*x(:,2)); - -f = @(x) 40*(x(:,1)==0)+... - 35*(x(:,2)==0)+... - 35*cos(x(:,1)/4)+... - 30*sin(x(:,2)/9); - - -% Dimension -N = 2; -% Number of sampling points along each dimension -PP1 = 25; -PP2 = 20; -% Bounds along each dimension -x1min = 0; -x1max = +30; -x2min = 0; -x2max = +30; - -% Create data -scale_x1 = linspace(x1min,x1max,PP1) -scale_x2 = linspace(x2min,x2max,PP2) -[x1,x2] = meshgrid( scale_x1 , scale_x2 ); -XX = [x1(:) x2(:)]; -PP = (PP1)*(PP2); -ZZ = f(XX); - - -% Selection of some training points -P = 30; -i = randperm(PP); -i = i(1:P); -X = XX(i,:); -Z = ZZ(i,:); - - -% Sending data -sgtelib_server_newdata(X,Z); - -% Prediction -[ZZ,std,ei,cdf] = sgtelib_server_predict(XX); - - - -figure -subplot(2,2,1);hold on; -plot3(X(:,1),X(:,2),Z,'k.'); -surf(x1,x2,reshape(f(XX),PP2,PP1)); -set(gca,'view',[-37.5000 30.0000]); -set(gca,'ydir','normal') -xlabel('Real Z'); -xlim([min(scale_x1) max(scale_x1)]); -ylim([min(scale_x2) max(scale_x2)]); -%zlim([-2 +2]); - - -subplot(2,2,2);hold on; -plot3(X(:,1),X(:,2),Z,'k.'); -surf(x1,x2,reshape(ZZ,PP2,PP1)); -set(gca,'view',[-37.5000 30.0000]); -xlabel('Zh'); -xlim([min(scale_x1) max(scale_x1)]); -ylim([min(scale_x2) max(scale_x2)]); -%zlim([-2 +2]); - -subplot(2,2,3);hold on; -imagesc(scale_x1,scale_x2,reshape(f(XX),PP2,PP1)); -set(gca,'ydir','normal'); -plot(X(:,1),X(:,2),'k.'); -axis([min(scale_x1) max(scale_x1) min(scale_x2) max(scale_x2)]) - -subplot(2,2,4);hold on; -imagesc(scale_x1,scale_x2,reshape(ZZ,PP2,PP1)); -set(gca,'ydir','normal'); -plot(X(:,1),X(:,2),'k.'); -axis([min(scale_x1) max(scale_x1) min(scale_x2) max(scale_x2)]) - - - -disp('metric:') -sgtelib_server_metric('AOECV') - -sgtelib_server_stop; diff --git a/ext/sgtelib/example/sgtelib_example_plot2D_edge.m b/ext/sgtelib/example/sgtelib_example_plot2D_edge.m deleted file mode 100644 index 4171c09..0000000 --- a/ext/sgtelib/example/sgtelib_example_plot2D_edge.m +++ /dev/null @@ -1,63 +0,0 @@ -close all -clear all -clc -disp('=========== EXPLORER ============='); - -! make -j 4 - -%model = 'TYPE PRS' - -model = 'TYPE ENSEMBLE DISTANCE OPTIM WEIGHT SELECT ' - -model = 'TYPE KRIGING DISTANCE OPTIM METRIC OECV' - - -%model = 'TYPE ENSEMBLE WEIGHT SELECT METRIC OECV DISTANCE OPTIM PRESET SUPER1' -%model = 'TYPE LOWESS KERNEL_TYPE OPTIM DISTANCE OPTIM' -%model = 'TYPE KS DISTANCE IS0' -%model = 'TYPE ENSEMBLE WEIGHT SELECT METRIC OECV DISTANCE IS0 PRESET SUPER1' - - -f = @(x) 40*(x(:,1)==0)+... - 35*(x(:,2)==0)+... - 35*cos(x(:,1)/4)+... - 30*sin(x(:,2)/9); - - -% Data points -x1max = 30; -x2max = 35; - - -p1 = 5; -p2 = 12; -p = 10; -X = [ - zeros(p1,1) round(rand(p1,1)*x2max) ;... - round(rand(p2,1 )*x1max) zeros(p2,1) ;... - round(rand(p,1)*x1max) round(rand(p,1)*x2max) ]; -X = unique(X,'rows'); -Z = f(X); - - -sgtelib_server_start(model,true) -sgtelib_server_ping; -sgtelib_server_newdata(X,Z); - -% Prediction -[x1,x2] = meshgrid( (0:x1max) , (0:x2max) ); -XX = [x1(:) x2(:)]; -[ZZ,std,ei,cdf] = sgtelib_server_predict(XX); -ZZ = reshape(ZZ,x2max+1,x1max+1); - - -figure('color','w'); hold on; -surf(x1,x2,ZZ,'facealpha',0.5); -plot3(X(:,1),X(:,2),Z,'ko','linewidth',3,'markersize',5); -dv = max(Z)-min(Z); -zlim([min(Z)-dv/3,max(Z)+dv/3]); -set(gca,'view',[116 50]); -xlabel('x1'); -ylabel('x2'); - -sgtelib_server_stop; diff --git a/ext/sgtelib/example/sgtelib_example_plot2D_single.m b/ext/sgtelib/example/sgtelib_example_plot2D_single.m deleted file mode 100644 index 92ffd5c..0000000 --- a/ext/sgtelib/example/sgtelib_example_plot2D_single.m +++ /dev/null @@ -1,42 +0,0 @@ -close all -clear all -clc -disp('=========== EXPLORER ============='); - -! make -j 4 - -model = 'TYPE ENSEMBLE PRESET SUPER1 WEIGHT SELECT METRIC RMSE ' - -f = @(x) cos(sqrt(4*x(:,1))).*cos(3*x(:,2))+(x(:,1)>0.5)+(x(:,2)>0.5); - - - -% Number of data points -P = 50; -% Data points -X = rand(P,2); -Z = f(X); - -% Create model -PP = 50; -[x1,x2] = meshgrid( linspace(0,1,PP) , linspace(0,1,PP) ); -XX = [x1(:) x2(:)]; - - -sgtelib_server_start(model,true) -sgtelib_server_ping; -sgtelib_server_newdata(X,Z); -[ZZ,std,ei,cdf] = sgtelib_server_predict(XX); - - - -figure('color','w'); hold on; -surf(x1,x2,reshape(ZZ,PP,PP)); -plot3(X(:,1),X(:,2),Z,'ko','linewidth',3,'markersize',5); - - -set(gca,'view',[-36 66]); - - - -sgtelib_server_stop; diff --git a/ext/sgtelib/example/sgtelib_example_plotND.m b/ext/sgtelib/example/sgtelib_example_plotND.m deleted file mode 100644 index 8b8b29d..0000000 --- a/ext/sgtelib/example/sgtelib_example_plotND.m +++ /dev/null @@ -1,47 +0,0 @@ -close all -clear all -clc -disp('=========== EXPLORER ============='); - -%rand('twister',3) - -! make -j 4 -model = 'TYPE PRS DEGREE 2 RIDGE 0.01' -%model = 'TYPE RBF DISTANCE_TYPE NORM2_IS0 KERNEL_COEF 2 KERNEL_TYPE D2' -%model = 'TYPE KS DISTANCE_TYPE NORM2_IS0 KERNEL_COEF 10 KERNEL_TYPE D2' -%model = 'TYPE ENSEMBLE WEIGHT SELECT METRIC RMSECV' -model = 'TYPE ENSEMBLE WEIGHT SELECT METRIC OECV' -% model = 'TYPE KS' -% model = 'TYPE LOWESS' - - -%f = @(x) sum(x.^2,2); - -N = 10; -P = 100; - - -M = 1; -X = randn(P,N); -Z = randn(P,M); - -toBeDelData; -M = size(Z,2); - -PP = 100; - -dx = 0.1; -XX = zeros(PP,N); -for i=2:PP - r = randn(1,N); - r = dx*r/norm(r); - XX(i,:) = XX(i-1,:)+r; -end - - -sgtelib_server_start(model,true) -sgtelib_server_ping; - -sgtelib_server_newdata(X,Z); -[ZZmodel,std,ei,cdf] = sgtelib_server_predict(XX); -m = sgtelib_server_metric('RMSECV') diff --git a/ext/sgtelib/matlab_server/sgtelib_server_cv.m b/ext/sgtelib/matlab_server/sgtelib_server_cv.m deleted file mode 100644 index e80778b..0000000 --- a/ext/sgtelib/matlab_server/sgtelib_server_cv.m +++ /dev/null @@ -1,19 +0,0 @@ -function [Zh,Sh,Zv,Sv] = sgtelib_server_cv - -% sgtelib_server_ping; - -% Remove flags -system('rm -f flag_cv_* 2>/dev/null'); - -% Create flag -system('touch flag_cv_transmit'); - -% Wait for reception flag -sgtelib_server_wait_file('flag_cv_finished'); - -% Read Output file -[Zh,Sh,Zv,Sv] = sgtelib_server_read_matrix('flag_cv_finished'); - -% Remove all flags -system('rm -f flag_cv_* 2>/dev/null'); - diff --git a/ext/sgtelib/matlab_server/sgtelib_server_example.m b/ext/sgtelib/matlab_server/sgtelib_server_example.m deleted file mode 100644 index b4633d1..0000000 --- a/ext/sgtelib/matlab_server/sgtelib_server_example.m +++ /dev/null @@ -1,35 +0,0 @@ -close all -clear all - -% Start server -model = 'TYPE PRS DEGREE 2'; -model = 'TYPE ENSEMBLE METRIC LINV WEIGHTS OPTIM' -sgtelib_server_start('TYPE PRS DEGREE 2',true) - -% Test if server is ok and ready -sgtelib_server_ping; - -% Build data points -N = 2; -M = 1; -P = 100; -X = rand(P,N); -Z = rand(P,M); - -% Feed server -sgtelib_server_newdata(X,Z); - -% Prediction points -PXX = 1000; -XX = rand(PXX,N); - -%Prediction -[ZZ,std,ei,cdf] = sgtelib_server_predict(XX); - -% Plot -figure; hold on; -plot3(X(:,1),X(:,2),Z,'*k'); -plot3(XX(:,1),XX(:,2),ZZ,'or') - -% Stop server -sgtelib_server_stop; \ No newline at end of file diff --git a/ext/sgtelib/matlab_server/sgtelib_server_info.m b/ext/sgtelib/matlab_server/sgtelib_server_info.m deleted file mode 100644 index 322265e..0000000 --- a/ext/sgtelib/matlab_server/sgtelib_server_info.m +++ /dev/null @@ -1,12 +0,0 @@ -function M = sgtelib_server_info - -% sgtelib_server_ping; - -% Remove flags -system('rm -f flag_info_* 2>/dev/null'); - -% Write infoion point -system('touch flag_info_transmit'); - -% Wait for reception flag -sgtelib_server_wait_file('flag_info_finished'); diff --git a/ext/sgtelib/matlab_server/sgtelib_server_metric.m b/ext/sgtelib/matlab_server/sgtelib_server_metric.m deleted file mode 100644 index a418a28..0000000 --- a/ext/sgtelib/matlab_server/sgtelib_server_metric.m +++ /dev/null @@ -1,21 +0,0 @@ -function M = sgtelib_server_metric(metric_str) - -% sgtelib_server_ping; - -% Remove flags -system('rm -f flag_metric_* 2>/dev/null'); - -% Write metricion point -system(['echo ' metric_str ' >> flag_metric_create']); - -% Create flag -system('mv flag_metric_create flag_metric_transmit'); - -% Wait for reception flag -sgtelib_server_wait_file('flag_metric_finished'); - -% Read Output file -M = importdata('flag_metric_finished'); - -% Remove all flags -system('rm -f flag_metric_* 2>/dev/null'); diff --git a/ext/sgtelib/matlab_server/sgtelib_server_newdata.m b/ext/sgtelib/matlab_server/sgtelib_server_newdata.m deleted file mode 100644 index c8d9b25..0000000 --- a/ext/sgtelib/matlab_server/sgtelib_server_newdata.m +++ /dev/null @@ -1,20 +0,0 @@ -function sgtelib_server_newdata(X,Z) - -% sgtelib_server_ping; - -% Remove all flags -system('rm -f flag_new_data_* 2>/dev/null'); - -% Write matrices -sgtelib_server_write_matrix(X,'X','new_data_x.txt'); - -sgtelib_server_write_matrix(Z,'Z','new_data_z.txt'); - -% Create flag -system('touch flag_new_data_transmit'); - -% Wait for reception flag -sgtelib_server_wait_file('flag_new_data_received'); - -% Remove all flags -system('rm -f flag_new_data_* 2>/dev/null'); diff --git a/ext/sgtelib/matlab_server/sgtelib_server_ping.m b/ext/sgtelib/matlab_server/sgtelib_server_ping.m deleted file mode 100644 index dd7d433..0000000 --- a/ext/sgtelib/matlab_server/sgtelib_server_ping.m +++ /dev/null @@ -1,24 +0,0 @@ -function ready = sgtelib_server_ping - -system('touch flag_ping'); - -% Wait for reception flag - -i = sgtelib_server_wait_file('flag_pong',0.1); -if i==0 - disp('Retry ping...'); - system('touch flag_ping'); - i = sgtelib_server_wait_file('flag_pong',0.5); -end - -if i - ready = importdata('flag_pong'); - system('rm -f flag_pong'); - %disp('ping ok!'); -else - disp('=====================SGTELIB_SERVER ERROR=========================='); - disp('sgtelib_server not responding'); - error('We tried to "ping" sgtelib (server), but it is off or not responding'); -end - - diff --git a/ext/sgtelib/matlab_server/sgtelib_server_predict.m b/ext/sgtelib/matlab_server/sgtelib_server_predict.m deleted file mode 100644 index ab3999f..0000000 --- a/ext/sgtelib/matlab_server/sgtelib_server_predict.m +++ /dev/null @@ -1,22 +0,0 @@ -function [Z,std,ei,cdf] = sgtelib_server_predict(X) - -% sgtelib_server_ping; - -% Remove flags -system('rm -f flag_predict_* 2>/dev/null'); - -% Write prediction point -sgtelib_server_write_matrix(X,'X','flag_predict_create'); - -% Create flag -system('mv flag_predict_create flag_predict_transmit'); - -% Wait for reception flag -sgtelib_server_wait_file('flag_predict_finished'); - -% Read Output file -[Z,std,ei,cdf] = sgtelib_server_read_matrix('flag_predict_finished'); - -% Remove all flags -system('rm -f flag_predict_* 2>/dev/null'); - diff --git a/ext/sgtelib/matlab_server/sgtelib_server_read_matrix.m b/ext/sgtelib/matlab_server/sgtelib_server_read_matrix.m deleted file mode 100644 index 3017935..0000000 --- a/ext/sgtelib/matlab_server/sgtelib_server_read_matrix.m +++ /dev/null @@ -1,43 +0,0 @@ -function [varargout] = sgtelib_server_read_matrix(file) - - -% Get matrices names from the file -NAMES = cell(0,0); -fid = fopen(file); -line = fgetl(fid); -while ischar(line) - if ~isempty(line) - if any(line=='=') - i = find(line=='='); - line = line(1:i-1); - line=strrep(line,' ',''); - NAMES{end+1} = line; - end - end - line = fgetl(fid); -end - -N = length(NAMES); - -% Check that the number of output is smaller than the number -% of matrices in the file -if N<nargout - disp(['File name: ' file]); - disp(['Nb of matrices in the file: ' num2str(N)]); - disp(['Nb of matrices required in output: ' num2str(nargout)]); - error('The file does not contain enough matrices'); -end - -% Convert the file in .m file and evaluate it. -mfile = ['matlab_' file num2str(rand,12)]; -mfile = strrep(mfile,'.',''); -mfile = strrep(mfile,'-',''); -copyfile(file,[mfile '.m']); -eval(mfile); -delete([mfile '.m']); - -% Affect the matrices in varargout -for i=1:N - varargout{i} = eval(NAMES{i}); -end - diff --git a/ext/sgtelib/matlab_server/sgtelib_server_ready.m b/ext/sgtelib/matlab_server/sgtelib_server_ready.m deleted file mode 100644 index 06a595c..0000000 --- a/ext/sgtelib/matlab_server/sgtelib_server_ready.m +++ /dev/null @@ -1,3 +0,0 @@ -function ready = sgtelib_server_ready - -ready = sgtelib_server_ping; diff --git a/ext/sgtelib/matlab_server/sgtelib_server_reset.m b/ext/sgtelib/matlab_server/sgtelib_server_reset.m deleted file mode 100644 index eb425b5..0000000 --- a/ext/sgtelib/matlab_server/sgtelib_server_reset.m +++ /dev/null @@ -1,16 +0,0 @@ -function sgtelib_server_reset - -% sgtelib_server_ping; - -% Remove flags -system('rm -f flag_reset_* 2>/dev/null'); - -% Create flag -system(['touch flag_reset_transmit']); - -% Wait for reception flag -sgtelib_server_wait_file('flag_reset_finished'); - -% Remove all flags -system('rm -f flag_reset_* 2>/dev/null'); - diff --git a/ext/sgtelib/matlab_server/sgtelib_server_start.m b/ext/sgtelib/matlab_server/sgtelib_server_start.m deleted file mode 100644 index 07d748f..0000000 --- a/ext/sgtelib/matlab_server/sgtelib_server_start.m +++ /dev/null @@ -1,89 +0,0 @@ -function sgtelib_server_start(model,keepopen) - -sgtelib_server_stop; -if nargin==1 - keepopen=false; -end - -disp('Start sgtelib.exe in server mode.'); - - -% Selection of the terminal software -TERMINAL_SOFTWARE_LIST = { 'gnome-terminal' 'lxterm' 'uxterm' 'xterm' 'konsole'}; -for i=1:length(TERMINAL_SOFTWARE_LIST) - termprog = TERMINAL_SOFTWARE_LIST{i}; - if ~system(['which ' termprog]); - break; - else - disp(['Could not find terminal software: ' termprog]); - termprog = 'bg'; - end -end - -termprog = 'bg' - -disp(['Selected terminal software: ' termprog]); - - -% Option to start sgtelib in gdb -gdboption = ' '; -% Verbose option of sgtelib. -verboseoption = ' '; -% Option of keep open -if keepopen - if ~system('which gdb') - gdboption = ' gdb -q -ex run --args '; - end - verboseoption = ' -verbose '; -end -% command to start sgtelib. -sgtelibcmd = [' ./sgtelib.exe -server -model ' model verboseoption]; - - -% Reset ld_library_path -old_ld_library_path = getenv('LD_LIBRARY_PATH'); -setenv('LD_LIBRARY_PATH','.'); - -switch termprog - case 'gnome-terminal' - termoption = ' -t sgtelib_server --hide-menubar -e '; - % Command to run after the end of sgtelib - if keepopen - endoption = ' ; exec /bin/bash -i '; - else - endoption = ' '; - end - command = [termprog termoption '"/bin/bash -c '' ' gdboption sgtelibcmd endoption '''" &']; - case {'xterm','lxterm','uxterm'} - if keepopen - termoption = ' -hold -e '; - else - termoption = ' -e '; - end - command = [termprog termoption gdboption sgtelibcmd ' &']; - case 'konsole' - if keepopen - termoption = ' --hold -e '; - else - termoption = ' -e '; - end - command = [termprog termoption gdboption sgtelibcmd ' &']; - case 'bg' - command = [sgtelibcmd ' &']; -end - -disp(command) -[status,response] = system(command); -if keepopen - pause(1); -end -if status || ~isempty(response) - disp(command); - disp(status) - disp(response) -end -pause(1); - -% Old LD_LIBRARY_PATH -setenv('LD_LIBRARY_PATH',old_ld_library_path); - diff --git a/ext/sgtelib/matlab_server/sgtelib_server_stop.m b/ext/sgtelib/matlab_server/sgtelib_server_stop.m deleted file mode 100644 index 2bb574c..0000000 --- a/ext/sgtelib/matlab_server/sgtelib_server_stop.m +++ /dev/null @@ -1,4 +0,0 @@ -function sgtelib_server_stop -disp('Kill sgtelib.exe'); -!touch flag_quit -%!killName sgtelib.exe diff --git a/ext/sgtelib/matlab_server/sgtelib_server_wait_file.m b/ext/sgtelib/matlab_server/sgtelib_server_wait_file.m deleted file mode 100644 index 053a9ce..0000000 --- a/ext/sgtelib/matlab_server/sgtelib_server_wait_file.m +++ /dev/null @@ -1,30 +0,0 @@ -function i = sgtelib_server_wait_file(name,wait_tmax) - -if ~iscell(name) - name = {name}; -end - -if nargin==1 - wait_tmax = 1000; -end -wait_dt = 0.001; -wait_t = 0; - -while wait_t < wait_tmax - pause(wait_dt); - wait_t = wait_t+wait_dt; - - % Check if there is a new input file - for i=1:length(name) - if exist(name{i},'file') - return; - end - end -end - -i = 0; -if length(name)==1 - disp(['sgtelib_server_wait_file: file "' name{1} '" not found within time limit']); -else - disp(['sgtelib_server_wait_file: file not found within time limit']); -end diff --git a/ext/sgtelib/matlab_server/sgtelib_server_write_matrix.m b/ext/sgtelib/matlab_server/sgtelib_server_write_matrix.m deleted file mode 100644 index 40876e8..0000000 --- a/ext/sgtelib/matlab_server/sgtelib_server_write_matrix.m +++ /dev/null @@ -1,26 +0,0 @@ -function sgtelib_server_write_matrix(M,name,file) - -% fid = fopen(file,'w'); -% -% newline = char(10); -% fwrite(fid,[name '=[' newline]); -% -% for i=1:size(M,1) -% Mi = num2str(M(i,:),12); -% s = [' ' Mi ' ; ' newline]; -% fwrite(fid,s); -% end -% fwrite(fid,'];'); -% fclose(fid); - - -fid = fopen(file,'w'); -fprintf(fid,'%s=[\n',name); - -for i=1:size(M,1) - fprintf(fid,'%12.12f ',M(i,:)); - fprintf(fid,';\n'); -end - -fwrite(fid,'];'); -fclose(fid); \ No newline at end of file diff --git a/ext/sgtelib/src/Defines.hpp b/ext/sgtelib/src/Defines.hpp deleted file mode 100644 index f35301c..0000000 --- a/ext/sgtelib/src/Defines.hpp +++ /dev/null @@ -1,98 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_DEFINES__ -#define __SGTELIB_DEFINES__ - -#include <iostream> -#include <iomanip> -#include <cmath> -#include <sstream> -#include <string.h> - -#include <limits> -#include <limits.h> - -// debug flag: -//#define SGTELIB_DEBUG -//#define ENSEMBLE_DEBUG - -namespace SGTELIB { - - const double EPSILON = 1E-13; - const double PI = 3.141592654; - const double INF = std::numeric_limits<double>::max(); ///< Infinity - const double NaN = std::numeric_limits<double>::quiet_NaN(); - - const bool APPROX_CDF = true; - // If true, then the lower bound of standard deviation is EPSILON. - // This allows to avoid flat EI and P functions. - - enum scaling_t { - SCALING_NONE , - SCALING_MEANSTD , - SCALING_BOUNDS - }; - - const scaling_t scaling_method = SCALING_MEANSTD; - //const scaling_t scaling_method = SCALING_NONE; - - - // model output type: - enum model_output_t { - NORMAL_OUTPUT , - FIXED_OUTPUT , - BINARY_OUTPUT - }; - - // model output type: - enum bbo_t { - BBO_OBJ , // Objective - BBO_CON , // Constraint - BBO_DUM // Dummy - }; - - enum param_domain_t { - PARAM_DOMAIN_CONTINUOUS, - PARAM_DOMAIN_INTEGER, - PARAM_DOMAIN_BOOL, - PARAM_DOMAIN_CAT, - PARAM_DOMAIN_MISC - }; - - // FIXED => Parameter is set once and for all - // OPTIM => Parameter is optimized so as to minimize a metric - // MODEL_DEFINED => The surrogate model is able to define/chose the parameter - enum param_status_t { - STATUS_FIXED, - STATUS_OPTIM, - STATUS_MODEL_DEFINED - }; - - - -} - -#endif diff --git a/ext/sgtelib/src/Exception.hpp b/ext/sgtelib/src/Exception.hpp deleted file mode 100644 index c3a64c0..0000000 --- a/ext/sgtelib/src/Exception.hpp +++ /dev/null @@ -1,65 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_EXCEPTION__ -#define __SGTELIB_EXCEPTION__ - -#include <iostream> -#include <sstream> -#include <cstdlib> - -namespace SGTELIB { - - class Exception : public std::exception { - - private: - - std::string _file; - int _line; - std::string _err_msg; - - mutable std::string _tmp; - - public: - - virtual const char * what ( void ) const throw() { - std::ostringstream oss; - oss << _file << ":" << _line << " (" << _err_msg << ")"; - _tmp = oss.str(); - return _tmp.c_str(); - } - - Exception ( const std::string & file , - int line , - const std::string & err_msg ) - : _file(file) , _line(line) , _err_msg(err_msg) {} - - virtual ~Exception ( void ) throw() {} - }; -} - -// usage: throw SGTELIB::Exception ( "file.cpp" , __LINE__ , "error message" ); - -#endif diff --git a/ext/sgtelib/src/Kernel.cpp b/ext/sgtelib/src/Kernel.cpp deleted file mode 100644 index dc6665e..0000000 --- a/ext/sgtelib/src/Kernel.cpp +++ /dev/null @@ -1,322 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "Kernel.hpp" - - - - -/*----------------------------------------------------------*/ -std::string SGTELIB::kernel_type_to_str ( SGTELIB::kernel_t kt ) { -/*----------------------------------------------------------*/ - switch ( kt ) { - case SGTELIB::KERNEL_D1: return "D1"; //Gaussian - case SGTELIB::KERNEL_D2: return "D2"; //Inverse Quadratic - case SGTELIB::KERNEL_D3: return "D3"; //Inverse Multiquadratic - case SGTELIB::KERNEL_D4: return "D4"; //Bi-quadratic - case SGTELIB::KERNEL_D5: return "D5"; //Tri-Cubique - case SGTELIB::KERNEL_D6: return "D6"; //Exp(-sqrt) - case SGTELIB::KERNEL_D7: return "D7"; //Epanechnikov - case SGTELIB::KERNEL_I0: return "I0"; //Multiquadratic - case SGTELIB::KERNEL_I1: return "I1"; //Polyharmonic Spline, k=1 - case SGTELIB::KERNEL_I2: return "I2"; //Polyharmonic Spline, k=2 - case SGTELIB::KERNEL_I3: return "I3"; //Polyharmonic Spline, k=3 - case SGTELIB::KERNEL_I4: return "I4"; //Polyharmonic Spline, k=4 - default : - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "kernel_type_to_str: undefined kernel type" ); - return "undefined"; - } -} - - - - -/*----------------------------------------------------------*/ -bool SGTELIB::kernel_is_decreasing ( const SGTELIB::kernel_t kt ) { -/*----------------------------------------------------------*/ - // nb: "D" stands for decreasing, meaning that phi(r) tends toward 0 - // when r tends toward +infinity. - switch ( kt ) { - case SGTELIB::KERNEL_D1: - case SGTELIB::KERNEL_D2: - case SGTELIB::KERNEL_D3: - case SGTELIB::KERNEL_D4: - case SGTELIB::KERNEL_D5: - case SGTELIB::KERNEL_D6: - case SGTELIB::KERNEL_D7: - return true; - case SGTELIB::KERNEL_I0: - case SGTELIB::KERNEL_I1: - case SGTELIB::KERNEL_I2: - case SGTELIB::KERNEL_I3: - case SGTELIB::KERNEL_I4: - return false; - default : - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "kernel_is_decreasing: undefined kernel type" ); - return false; - } -}// - -/*----------------------------------------------------------*/ -bool SGTELIB::kernel_has_parameter ( const SGTELIB::kernel_t kt ) { -/*----------------------------------------------------------*/ - switch ( kt ) { - case SGTELIB::KERNEL_D1: - case SGTELIB::KERNEL_D2: - case SGTELIB::KERNEL_D3: - case SGTELIB::KERNEL_D4: - case SGTELIB::KERNEL_D5: - case SGTELIB::KERNEL_D6: - case SGTELIB::KERNEL_D7: - case SGTELIB::KERNEL_I0: - return true; - case SGTELIB::KERNEL_I2: - case SGTELIB::KERNEL_I1: - case SGTELIB::KERNEL_I3: - case SGTELIB::KERNEL_I4: - return false; - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "kernel_has_parameter: undefined kernel type" ); - return false; - } -}// - -/*----------------------------------------------------------*/ -int SGTELIB::kernel_dmin ( const SGTELIB::kernel_t kt ) { -/*----------------------------------------------------------*/ - switch ( kt ) { - case SGTELIB::KERNEL_D1: - case SGTELIB::KERNEL_D2: - case SGTELIB::KERNEL_D3: - case SGTELIB::KERNEL_D4: - case SGTELIB::KERNEL_D5: - case SGTELIB::KERNEL_D6: - case SGTELIB::KERNEL_D7: - return -1; - case SGTELIB::KERNEL_I0: - case SGTELIB::KERNEL_I1: - return 0; - case SGTELIB::KERNEL_I2: - case SGTELIB::KERNEL_I3: - case SGTELIB::KERNEL_I4: - return 1; - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "kernel_dmin: undefined kernel type" ); - return false; - } -}// - - -/*----------------------------------------------------------*/ -SGTELIB::kernel_t SGTELIB::str_to_kernel_type ( const std::string & s ) { -/*----------------------------------------------------------*/ - if ( s=="D1" ){ return SGTELIB::KERNEL_D1; } - if ( s=="GAUSSIAN" ){ return SGTELIB::KERNEL_D1; } - - if ( s=="D2" ){ return SGTELIB::KERNEL_D2; } - if ( s=="INVERSE_QUAD" ){ return SGTELIB::KERNEL_D2; } - if ( s=="INVERSEQUAD" ){ return SGTELIB::KERNEL_D2; } - - if ( s=="D3" ){ return SGTELIB::KERNEL_D3; } - if ( s=="INVERSE_MULTI_QUAD" ){ return SGTELIB::KERNEL_D3; } - if ( s=="INVERSEMULTIQUAD" ){ return SGTELIB::KERNEL_D3; } - - if ( s=="D4" ){ return SGTELIB::KERNEL_D4; } - if ( s=="BIQUADRATIC" ){ return SGTELIB::KERNEL_D4; } - if ( s=="BI_QUADRATIC" ){ return SGTELIB::KERNEL_D4; } - if ( s=="BI-QUADRATIC" ){ return SGTELIB::KERNEL_D4; } - if ( s=="BIQUAD" ){ return SGTELIB::KERNEL_D4; } - - if ( s=="D5" ){ return SGTELIB::KERNEL_D5; } - if ( s=="TRICUBIC" ){ return SGTELIB::KERNEL_D5; } - if ( s=="TRI_CUBIC" ){ return SGTELIB::KERNEL_D5; } - if ( s=="TRI-CUBIC" ){ return SGTELIB::KERNEL_D5; } - if ( s=="TRICUB" ){ return SGTELIB::KERNEL_D5; } - - if ( s=="D6" ){ return SGTELIB::KERNEL_D6; } - if ( s=="EXPSQRT" ){ return SGTELIB::KERNEL_D6; } - - if ( s=="D7" ){ return SGTELIB::KERNEL_D7; } - if ( s=="EPANECHNIKOV" ){ return SGTELIB::KERNEL_D7; } - if ( s=="EPA" ){ return SGTELIB::KERNEL_D7; } - - if ( s=="I0" ){ return SGTELIB::KERNEL_I0; } - if ( s=="MULTIQUADRATIC" ){ return SGTELIB::KERNEL_I0; } - if ( s=="MULTI-QUADRATIC" ){ return SGTELIB::KERNEL_I0; } - if ( s=="MULTI_QUADRATIC" ){ return SGTELIB::KERNEL_I0; } - if ( s=="MULTIQUAD" ){ return SGTELIB::KERNEL_I0; } - - if ( s=="I1" ){ return SGTELIB::KERNEL_I1; } - if ( s=="POLY1" ){ return SGTELIB::KERNEL_I1; } - if ( s=="SPLINE1" ){ return SGTELIB::KERNEL_I1; } - if ( s=="PHS1" ){ return SGTELIB::KERNEL_I1; } - - if ( s=="I2" ){ return SGTELIB::KERNEL_I2; } - if ( s=="POLY2" ){ return SGTELIB::KERNEL_I2; } - if ( s=="SPLINE2" ){ return SGTELIB::KERNEL_I2; } - if ( s=="PHS2" ){ return SGTELIB::KERNEL_I2; } - - if ( s=="I3" ){ return SGTELIB::KERNEL_I3; } - if ( s=="POLY3" ){ return SGTELIB::KERNEL_I3; } - if ( s=="SPLINE3" ){ return SGTELIB::KERNEL_I3; } - if ( s=="PHS3" ){ return SGTELIB::KERNEL_I3; } - - if ( s=="I4" ){ return SGTELIB::KERNEL_I4; } - if ( s=="POLY4" ){ return SGTELIB::KERNEL_I4; } - if ( s=="SPLINE4" ){ return SGTELIB::KERNEL_I4; } - if ( s=="PHS4" ){ return SGTELIB::KERNEL_I4; } - - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "str_to_kernel_type: unrecognised string \""+s+"\"" ); -}// - -/*----------------------------------------------------------*/ -SGTELIB::kernel_t SGTELIB::int_to_kernel_type ( const int i ) { -/*----------------------------------------------------------*/ - if ( (i<0) || (i>=SGTELIB::NB_KERNEL_TYPES) ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "int_to_kernel_type: invalid integer "+itos(i) ); - } - switch ( i ){ - case 0: return SGTELIB::KERNEL_D1; - case 1: return SGTELIB::KERNEL_D2; - case 2: return SGTELIB::KERNEL_D3; - case 3: return SGTELIB::KERNEL_D4; - case 4: return SGTELIB::KERNEL_D5; - case 5: return SGTELIB::KERNEL_D6; - case 6: return SGTELIB::KERNEL_D7; - case 7: return SGTELIB::KERNEL_I0; - case 8: return SGTELIB::KERNEL_I1; - case 9: return SGTELIB::KERNEL_I2; - case 10: return SGTELIB::KERNEL_I3; - case 11: return SGTELIB::KERNEL_I4; - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "int_to_kernel_type: invalid integer "+itos(i) ); - } -}// - -/*----------------------------------------------*/ -/* Compute the value of the kernel */ -/*----------------------------------------------*/ -double SGTELIB::kernel ( const SGTELIB::kernel_t kt , - const double ks , - const double r ){ - // kt : kernel type - // ks : kernel shape - // r : radius - - switch (kt){ - case SGTELIB::KERNEL_D1: - // Gaussian - return exp(-PI*ks*ks*r*r); - case SGTELIB::KERNEL_D2: - // Inverse Quadratic - return 1.0/(1.0+ks*ks*r*r); - case SGTELIB::KERNEL_D3: - // Inverse Multiquadratic - return 1.0/sqrt(1.0+ks*ks*r*r); - case SGTELIB::KERNEL_D4: - // Bi-quadratic - { - double ksr = fabs(ks*r)*16.0/15.0; - if (ksr<=1){ - double d = (1-ksr*ksr); - return d*d; - } - } - return 0.0; - case SGTELIB::KERNEL_D5: - // Tri-cubic - { - double ksr = fabs(ks*r)*162.0/140.0; - if (ksr<=1.0){ - double d = (1-ksr*ksr*ksr); - return d*d*d; - } - } - return 0.0; - case SGTELIB::KERNEL_D6: - // Exp-Root - return exp(-sqrt(ks*r)); - case SGTELIB::KERNEL_D7: - // Epa - { - double ksr = fabs(ks*r); - if (ksr<=1.0) return 0.75*(1-ksr*ksr); - } - return 0.0; - case SGTELIB::KERNEL_I0: - // Multiquadratic - return sqrt(1.0+ks*ks*r*r); - case SGTELIB::KERNEL_I1: - // Polyharmonique spline (k=1) - return r; - case SGTELIB::KERNEL_I2: - // Polyharmonique spline (k=2) (Thin Plate Splin) - if (r==0.0) return 0.0; - return log(r)*r*r; - case SGTELIB::KERNEL_I3: - // Polyharmonique spline (k=3) - return r*r*r; - case SGTELIB::KERNEL_I4: - // Polyharmonique spline (k=4) - if (r==0.0) return 0.0; - { - double r2 = r*r; - return r2*r2*log(r); - } - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "kernel: undefined kernel type" ); - return 0.0; - } // end switch -}// - -/*----------------------------------------------*/ -/* Compute the value of the kernel */ -/*----------------------------------------------*/ -SGTELIB::Matrix SGTELIB::kernel ( const SGTELIB::kernel_t kt , - const double ks , - SGTELIB::Matrix R ){ - - const int nbRows = R.get_nb_rows(); - const int nbCols = R.get_nb_cols(); - int i,j; - for (i=0 ; i<nbRows ; i++){ - for (j=0 ; j<nbCols ; j++){ - R.set(i,j,kernel(kt,ks,R.get(i,j))); - } - } - return R; -}// - - - - diff --git a/ext/sgtelib/src/Kernel.hpp b/ext/sgtelib/src/Kernel.hpp deleted file mode 100644 index de86ea9..0000000 --- a/ext/sgtelib/src/Kernel.hpp +++ /dev/null @@ -1,69 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __KERNEL__ -#define __KERNEL__ - -#include "Defines.hpp" -#include "Exception.hpp" -#include "Matrix.hpp" -namespace SGTELIB { - - // kernel type: - enum kernel_t { - KERNEL_D1 , - KERNEL_D2 , - KERNEL_D3 , - KERNEL_D4 , - KERNEL_D5 , - KERNEL_D6 , - KERNEL_D7 , - KERNEL_I0 , - KERNEL_I1 , - KERNEL_I2 , - KERNEL_I3 , - KERNEL_I4 - }; - const int NB_KERNEL_TYPES = 11; - const int NB_DECREASING_KERNEL_TYPES = 6; - - // kernel - double kernel ( const SGTELIB::kernel_t kt , const double ks ,const double r ); - SGTELIB::Matrix kernel ( const SGTELIB::kernel_t kt , const double ks , SGTELIB::Matrix R ); - // kernel is decreasing ? - bool kernel_is_decreasing ( const SGTELIB::kernel_t kt ); - // kernel has a shape parameter ? - bool kernel_has_parameter ( const SGTELIB::kernel_t kt ); - // kernel has a shape parameter ? - int kernel_dmin ( const SGTELIB::kernel_t kt ); - // Kernel to str - std::string kernel_type_to_str ( SGTELIB::kernel_t ); - // string to kernel type - SGTELIB::kernel_t str_to_kernel_type ( const std::string & s ); - SGTELIB::kernel_t int_to_kernel_type ( const int i ); -} - -#endif - diff --git a/ext/sgtelib/src/Matrix.cpp b/ext/sgtelib/src/Matrix.cpp deleted file mode 100644 index a729103..0000000 --- a/ext/sgtelib/src/Matrix.cpp +++ /dev/null @@ -1,2969 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "Matrix.hpp" - -/*---------------------------*/ -/* constructor 1 */ -/*---------------------------*/ -SGTELIB::Matrix::Matrix ( const std::string & name , - int nbRows , - int nbCols ) : - _name ( name ) , - _nbRows ( nbRows ) , - _nbCols ( nbCols ) { -#ifdef SGTELIB_DEBUG - if ( _nbRows < 0 || _nbCols < 0 ) - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::constructor 1: bad dimensions" ); -#endif - - int i , j; - - _X = new double * [_nbRows]; - for ( i = 0 ; i < _nbRows ; ++i ) { - _X[i] = new double [_nbCols]; - for ( j = 0 ; j < _nbCols ; ++j ) - _X[i][j] = 0.0; - } -}// - -/*---------------------------*/ -/* constructor 2 */ -/*---------------------------*/ -SGTELIB::Matrix::Matrix ( const std::string & name , - int nbRows , - int nbCols , - double ** A ) : - _name ( name ) , - _nbRows ( nbRows ) , - _nbCols ( nbCols ) { -#ifdef SGTELIB_DEBUG - if ( _nbRows < 0 || _nbCols < 0 ) - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::constructor 2: bad dimensions" ); -#endif - - int i , j; - - _X = new double * [_nbRows]; - for ( i = 0 ; i < _nbRows ; ++i ) { - _X[i] = new double [_nbCols]; - for ( j = 0 ; j < _nbCols ; ++j ) - _X[i][j] = A[i][j]; - } -}// - -/*---------------------------*/ -/* constructor 3 */ -/*---------------------------*/ -SGTELIB::Matrix::Matrix ( const std::string & file_name ) : - _name ( "no_name" ) , - _nbRows ( 0 ) , - _nbCols ( 0 ) , - _X ( NULL ) { - *this = import_data(file_name); -}// - - -/*---------------------------*/ -/* constructor 4 */ -/*---------------------------*/ -SGTELIB::Matrix::Matrix (void) : - _name ( "" ) , - _nbRows ( 0 ) , - _nbCols ( 0 ) { - _X = new double * [0]; -}// - -/*---------------------------*/ -/* copy constructor */ -/*---------------------------*/ -SGTELIB::Matrix::Matrix ( const SGTELIB::Matrix & A ) : - _name ( A._name ) , - _nbRows ( A._nbRows ) , - _nbCols ( A._nbCols ) { - int i , j; - _X = new double * [_nbRows]; - for ( i = 0 ; i < _nbRows ; ++i ) { - _X[i] = new double [_nbCols]; - for ( j = 0 ; j < _nbCols ; ++j ) - _X[i][j] = A._X[i][j]; - } -}// - - - - -/*---------------------------*/ -/* affectation operator */ -/*---------------------------*/ -SGTELIB::Matrix & SGTELIB::Matrix::operator = ( const SGTELIB::Matrix & A ) { - - if ( this == &A ) - return *this; - - int i , j; - - if ( _nbRows != A._nbRows || _nbCols != A._nbCols ) { - - for ( i = 0 ; i < _nbRows ; ++i ) - delete [] _X[i]; - delete [] _X; - - _nbRows = A._nbRows; - _nbCols = A._nbCols; - - _X = new double * [_nbRows]; - for ( i = 0 ; i < _nbRows ; ++i ) { - _X[i] = new double [_nbCols]; - for ( j = 0 ; j < _nbCols ; ++j ) - _X[i][j] = A._X[i][j]; - } - } - else { - for ( i = 0 ; i < _nbRows ; ++i ) - for ( j = 0 ; j < _nbCols ; ++j ) - _X[i][j] = A._X[i][j]; - } - - _name = A._name; - - return *this; -}// - - - -/*---------------------------*/ -/* import data */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::import_data ( const std::string & file_name ){ - - std::ifstream in ( file_name.c_str() ); - - if ( in.fail() ) { - in.close(); - std::ostringstream oss; - oss << "SGTELIB::Matrix::import_data: cannot open file " << file_name; - throw SGTELIB::Exception ( __FILE__ , __LINE__ , oss.str() ); - } - - std::string s; - std::string line; - while (std::getline(in, line)) s += line+";"; - - return string_to_matrix(s); - -}// - - -/*---------------------------------------*/ -/* affectation operator from string */ -/*---------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::string_to_matrix ( std::string s ) { - - // Replace tabs, newline etc. - std::replace( s.begin(), s.end(), '\t', ' '); - std::replace( s.begin(), s.end(), '\n', ';'); - std::replace( s.begin(), s.end(), '\r', ';'); - std::replace( s.begin(), s.end(), ',' , ' '); - - // Remove extra spaces - s = SGTELIB::deblank(s); - size_t i; - std::string curline; - - // Find name - std::string name = "MAT"; // default name - i = std::min(s.find("="),s.find("[")); - if (i!=std::string::npos){ - curline = SGTELIB::deblank(s.substr(0,i)); - if (curline.size()){ - name = curline; - } - s = s.substr(i+1); - } - - // Replace closing brakets by semi-colon. - std::replace( s.begin(), s.end(), '=', ' '); - std::replace( s.begin(), s.end(), '[', ' '); - std::replace( s.begin(), s.end(), ']', ' '); - - // Read data - int nbCols=-1; - SGTELIB::Matrix M; - while (true){ - - i = s.find(";"); - if (i==std::string::npos) break; - curline = SGTELIB::deblank(s.substr(0,i)); - s = s.substr(i+1); - if (curline.size()){ - if (nbCols==-1){ - nbCols= SGTELIB::count_words(curline); - M = SGTELIB::Matrix(name,0,nbCols); - } - M.add_rows(SGTELIB::Matrix::string_to_row(curline,nbCols)); - } - - } - return M; - -}// - -/*------------------------------*/ -/* convert string to row vector */ -/*------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::string_to_row ( const std::string & s , int nbCols ){ - if (nbCols<=0){ - nbCols = count_words(s); - } - SGTELIB::Matrix row("r",1,nbCols); - double v; - std::stringstream ss( s ); - int i=0; - while( ss >> v ) row._X[0][i++] = v; - if (i++!=nbCols){ - std::cout << "In line \"" << s << "\"\n"; - std::cout << "Found " << i << " components\n"; - std::cout << "Expected " << nbCols << " components\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::string_to_row : cannot read line "+s ); - } - return row; -}// - -/*---------------------------*/ -/* operators */ -/*---------------------------*/ -SGTELIB::Matrix operator * (const SGTELIB::Matrix & A , const SGTELIB::Matrix & B) { - return SGTELIB::Matrix::product(A,B); -} -SGTELIB::Matrix operator * (const SGTELIB::Matrix & A , const double v) { - int nbCols = A.get_nb_rows(); - int nbRows = A.get_nb_cols(); - SGTELIB::Matrix B(SGTELIB::dtos(v)+"*"+A.get_name(),nbCols,nbRows); - int i,j; - for ( i = 0 ; i < nbCols ; ++i ) { - for ( j = 0 ; j < nbRows ; ++j ) { - B.set(i,j,v*A.get(i,j)); - } - } - return B; -} -SGTELIB::Matrix operator * (const double v , const SGTELIB::Matrix & A) { - return A*v; -} -SGTELIB::Matrix operator + (const SGTELIB::Matrix & A , const SGTELIB::Matrix & B) { - return SGTELIB::Matrix::add(A,B); -}// -SGTELIB::Matrix operator + (const SGTELIB::Matrix & A , const double v) { - const int nbCols = A.get_nb_rows(); - const int nbRows = A.get_nb_cols(); - SGTELIB::Matrix B(SGTELIB::dtos(v)+"+"+A.get_name(),nbCols,nbRows); - int i,j; - for ( i = 0 ; i < nbCols ; ++i ) { - for ( j = 0 ; j < nbRows ; ++j ) { - B.set(i,j,v+A.get(i,j)); - } - } - return B; -}// - -SGTELIB::Matrix operator + (const double v , const SGTELIB::Matrix & A) { - return A+v; -}// - -SGTELIB::Matrix operator - (const SGTELIB::Matrix & A , const SGTELIB::Matrix & B) { - return SGTELIB::Matrix::sub(A,B); -}// - -SGTELIB::Matrix operator - (const SGTELIB::Matrix & A) { - SGTELIB::Matrix M = A*(-1.0); - M.set_name("(-"+A.get_name()+")"); - return M; -}// - -SGTELIB::Matrix operator - (const double v , const SGTELIB::Matrix & A) { - return v+(-A); -}// - -SGTELIB::Matrix operator - (const SGTELIB::Matrix & A , const double v) { - return A+(-v); -}// - -SGTELIB::Matrix operator / (const SGTELIB::Matrix & A , const double v) { - if (v==0){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::operator /: divide by 0" ); - } - return A * (1.0/v); -}// - -/*---------------------------*/ -/* destructor */ -/*---------------------------*/ -SGTELIB::Matrix::~Matrix ( void ) { - //std::cout << "Delete " << _name << "\n"; - std::cout.flush(); - for ( int i = 0 ; i < _nbRows ; ++i ) - delete [] _X[i]; - delete [] _X; -}// - -/*---------------------------*/ -/* add one row */ -/*---------------------------*/ -void SGTELIB::Matrix::add_row ( const double * row ) { - - double ** new_X = new double * [_nbRows+1]; - - for ( int i = 0 ; i < _nbRows ; ++i ) - new_X[i] = _X[i]; - - new_X[_nbRows] = new double [_nbCols]; - for ( int j = 0 ; j < _nbCols ; ++j ) - new_X[_nbRows][j] = row[j]; - - delete [] _X; - _X = new_X; - ++_nbRows; -}// - -/*-------------------------------*/ -/* add rows */ -/*---------------------------*/ -void SGTELIB::Matrix::add_rows ( const Matrix & A ) { - - if ( A._nbCols != _nbCols ) - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::add_rows(): bad dimensions" ); - - int i , j; - int new_nbRows = _nbRows + A._nbRows; - - double ** new_X = new double * [new_nbRows]; - - for ( i = 0 ; i < _nbRows ; ++i ) - new_X[i] = _X[i]; - - for ( i = _nbRows ; i < new_nbRows ; ++i ) { - new_X[i] = new double [_nbCols]; - for ( j = 0 ; j < _nbCols ; ++j ) - new_X[i][j] = A._X[i-_nbRows][j]; - } - - delete [] _X; - _X = new_X; - _nbRows = new_nbRows; -}// - -/*---------------------------*/ -/* add rows */ -/*---------------------------*/ -void SGTELIB::Matrix::add_cols ( const Matrix & A ) { - - if ( A._nbRows != _nbRows ) - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::add_cols(): bad dimensions" ); - - int i , j; - int new_nbCols = _nbCols + A._nbCols; - double * x; - - for ( i = 0 ; i < _nbRows ; ++i ) { - // Complete line - x = new double [new_nbCols]; - // Original columns - for ( j = 0 ; j < _nbCols ; ++j ) - x[j] = _X[i][j]; - // Additional columns - for ( j = _nbCols ; j < new_nbCols ; ++j ) - x[j] = A._X[i][j-_nbCols]; - // Remove original line - delete [] _X[i]; - // Put new line - _X[i] = x; - } - - _nbCols = new_nbCols; -}// - -/*---------------------------------*/ -/* add empty rows */ -/*---------------------------------*/ -void SGTELIB::Matrix::add_rows ( const int p ) { - - int i , j; - int new_nbRows = _nbRows + p; - - double ** new_X = new double * [new_nbRows]; - - for ( i = 0 ; i < _nbRows ; ++i ) - new_X[i] = _X[i]; - - for ( i = _nbRows ; i < new_nbRows ; ++i ) { - new_X[i] = new double [_nbCols]; - for ( j = 0 ; j < _nbCols ; ++j ) - new_X[i][j] = 0.0; - } - - delete [] _X; - - _X = new_X; - _nbRows = new_nbRows; -}// - -/*---------------------------------*/ -/* remove last rows */ -/*---------------------------------*/ -void SGTELIB::Matrix::remove_rows ( const int p ) { - - int i; - int new_nbRows = _nbRows - p; - - double ** new_X = new double * [new_nbRows]; - - for ( i = 0 ; i < new_nbRows ; ++i ) - new_X[i] = _X[i]; - - for ( i = new_nbRows ; i < _nbRows ; ++i ) - delete [] _X[i]; - - delete [] _X; - _X = new_X; - _nbRows = new_nbRows; -}// - -/*---------------------------------*/ -/* add empty cols */ -/*---------------------------------*/ -void SGTELIB::Matrix::add_cols ( const int p ) { - - int i , j; - int new_nbCols = _nbCols + p; - - double * x; - - for ( i = 0 ; i < _nbRows ; ++i ) { - x = new double [new_nbCols]; - for ( j = 0 ; j < _nbCols ; ++j ) - x[j] = _X[i][j]; - for ( j = _nbCols ; j < new_nbCols ; ++j ) - x[j] = 0.0; - delete [] _X[i]; - _X[i] = x; - } - - _nbCols = new_nbCols; -}// - -/*-----------------------------------------*/ -/* get the fix columns (fixed variables) */ -/*-----------------------------------------*/ -void SGTELIB::Matrix::get_fix_columns ( std::list<int> & fix_col ) const { - fix_col.clear(); - for ( int j = 0 ; j < _nbCols ; ++j ) - if ( get_nb_diff_values(j) == 1 ) - fix_col.push_back(j); -}// - - -/*-----------------------------------------*/ -/* is the matrix symmetric */ -/*-----------------------------------------*/ -bool SGTELIB::Matrix::is_sym ( void ) const { - if (_nbCols!=_nbRows) return false; - int i,j; - for ( i = 0 ; i < _nbRows ; ++i ) { - for ( j = i+1 ; j < _nbCols ; ++j ) { - if (_X[i][j]!=_X[j][i]){ - return false; - } - } - } - return true; -}// - - -/*-------------------------------*/ -/* set the matrix randomly */ -/*---------------------------*/ -void SGTELIB::Matrix::set_random ( double l , double u , bool round ) { - int i , j; - for ( i = 0 ; i < _nbRows ; ++i ){ - for ( j = 0 ; j < _nbCols ; ++j ){ - _X[i][j] = l + (u-l) * SGTELIB::uniform_rand(); - if ( round ) - _X[i][j] = SGTELIB::round ( _X[i][j] ); - } - } -}// - -/*---------------------------*/ -/* fill with value v */ -/*---------------------------*/ -void SGTELIB::Matrix::fill ( double v ) { - int i , j; - for ( i = 0 ; i < _nbRows ; ++i ){ - for ( j = 0 ; j < _nbCols ; ++j ){ - _X[i][j] = v; - } - } -}// - -/*---------------------------*/ -/* set element (i,j) */ -/*---------------------------*/ -void SGTELIB::Matrix::set ( const int i , const int j , const double d ) { - #ifdef SGTELIB_DEBUG - if ( i < 0 || i >= _nbRows || j < 0 || j >= _nbCols ){ - display(std::cout); - std::cout << "Error: try to set (" << i << "," << j << ") while dim is [" << _nbRows << "," << _nbCols << "]\n"; - std::cout.flush(); - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::set(i,j): bad index" ); - } - #endif - _X[i][j] = d; -}// - -void SGTELIB::Matrix::set_row (const SGTELIB::Matrix & T , const int i){ - #ifdef SGTELIB_DEBUG - if ( i < 0 || i >= _nbRows || T.get_nb_rows()!=1 || T.get_nb_cols()!=_nbCols ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::set_row: bad index" ); - } - #endif - for (int j=0 ; j<_nbCols ; j++){ - _X[i][j] = T.get(0,j); - } -}// - -void SGTELIB::Matrix::set_col (const SGTELIB::Matrix & T , const int j){ - #ifdef SGTELIB_DEBUG - if ( j < 0 || j >= _nbCols || T.get_nb_rows()!=_nbRows || T.get_nb_cols()!=1 ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::set_col: bad index" ); - } - #endif - for (int i=0 ; i<_nbRows ; i++){ - _X[i][j] = T.get(i,0); - } -}// - -void SGTELIB::Matrix::set_row (const double v , const int i){ - #ifdef SGTELIB_DEBUG - if ( i < 0 || i >= _nbRows ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::set_row: bad index" ); - } - #endif - for (int j=0 ; j<_nbCols ; j++){ - _X[i][j] = v; - } -}// - -void SGTELIB::Matrix::set_col (const double v , const int j){ - #ifdef SGTELIB_DEBUG - if ( j < 0 || j >= _nbCols ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::set_col: bad index" ); - } - #endif - for (int i=0 ; i<_nbRows ; i++){ - _X[i][j] = v; - } -}// - -void SGTELIB::Matrix::permute (const int i1 , const int j1 , const int i2 , const int j2 ){ - #ifdef SGTELIB_DEBUG - if ( i1 < 0 || i1 >= _nbRows || j1 < 0 || j1 >= _nbCols || i2 < 0 || i2 >= _nbRows || j2 < 0 || j2 >= _nbCols ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::permut: bad index" ); - } - #endif - double buffer = _X[i1][j1]; - _X[i1][j1] = _X[i2][j2]; - _X[i2][j2] = buffer; -}// - -void SGTELIB::Matrix::multiply_row (const double v , const int i){ - #ifdef SGTELIB_DEBUG - if ( i < 0 || i >= _nbRows ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::set_row: bad index" ); - } - #endif - for (int j=0 ; j<_nbCols ; j++){ - _X[i][j] *= v; - } -}// - -void SGTELIB::Matrix::multiply_col (const double v , const int j){ - #ifdef SGTELIB_DEBUG - if ( j < 0 || j >= _nbCols ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::set_col: bad index" ); - } - #endif - for (int i=0 ; i<_nbRows ; i++){ - _X[i][j] *= v; - } -}// - -/*---------------------------*/ -/* access to element (k) */ -/*---------------------------*/ -double SGTELIB::Matrix::get ( const int k ) const { - return (*this)[k]; -}// - - -const double & SGTELIB::Matrix::operator [] ( int k ) const { - int i = 0 , j = 0; - if (_nbRows==1) j=k; - else if (_nbCols==1) i=k; - else throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::[k]: the matrix is not a vector" ); - return _X[i][j]; -}// -double & SGTELIB::Matrix::operator [] ( int k ){ - int i = 0 , j = 0; - if (_nbRows==1) j=k; - else if (_nbCols==1) i=k; - else throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::[k]: the matrix is not a vector" ); - return _X[i][j]; -}// - -/*---------------------------*/ -/* access to element (i,j) */ -/*---------------------------*/ -double SGTELIB::Matrix::get ( const int i , const int j ) const { - #ifdef SGTELIB_DEBUG - if ( i < 0 || i >= _nbRows || j < 0 || j >= _nbCols ){ - display(std::cout); - std::cout << "Error: try to access (" << i << "," << j << ") while dim is [" << _nbRows << "," << _nbCols << "]\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::get(i,j): bad index" ); - } - #endif - return _X[i][j]; -}// - -/*------------------------------------------*/ -/* get (access to a subpart of the matrix */ -/*------------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::get (const std::list<int> & list_cols , const std::list<int> & list_rows) const { - return get_rows(list_rows).get_cols(list_cols); -}// - -/*---------------------------*/ -/* get row */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::get_row (const int i) const { - #ifdef SGTELIB_DEBUG - if ( i < 0 || i >= _nbRows ) - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::get_row(i): bad index" ); - #endif - SGTELIB::Matrix A (_name+"(i,:)",1,_nbCols); - for (int j=0 ; j<_nbCols ; j++){ - A._X[0][j] = _X[i][j]; - } - return A; -}// - -/*---------------------------*/ -/* get col */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::get_col (const int j) const { - #ifdef SGTELIB_DEBUG - if ( j < 0 || j >= _nbCols ) - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::get_row(i): bad index" ); - #endif - SGTELIB::Matrix A (_name+"(:,j)",_nbRows,1); - for (int i=0 ; i<_nbRows ; i++){ - A._X[i][0] = _X[i][j]; - } - return A; -}// - -/*---------------------------*/ -/* get_rows */ -/* get rows from i1 to i2-1 */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::get_rows (const int i1, const int i2) const { - - if ( (i1<0) || (i1>_nbRows) || (i2<0) || (i2>_nbRows) || (i1>=i2) ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::get_rows: bad index" ); - } - - // Otherwise, select the rows - const int nbRows = i2-i1; - const int nbCols = _nbCols; - SGTELIB::Matrix A (_name+"(i1:i2-1,:)",nbRows,nbCols); - - int i,k=0; - for ( i=i1 ; i<i2 ; i++ ) - A.set_row(get_row(i),k++); - return A; -}// - -/*---------------------------*/ -/* get_cols */ -/* get rows from i1 to i2-1 */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::get_cols (const int i1, const int i2) const { - - if ( (i1<0) || (i1>_nbCols) || (i2<0) || (i2>_nbCols) || (i1>=i2) ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::get_cols: bad index" ); - } - - // Otherwise, select the rows - const int nbCols = i2-i1; - const int nbRows = _nbRows; - SGTELIB::Matrix A (_name+"(:,i1:i2-1)",nbRows,nbCols); - - int i,k=0; - for ( i=i1 ; i<i2 ; i++ ) - A.set_col(get_col(i),k++); - return A; -}// - -/*---------------------------*/ -/* get_rows */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::get_rows (const std::list<int> & list_rows) const { - - // If the list has only one element and this element is -1, then all rows are returned. - if ( (list_rows.size()==1) && (list_rows.front()==-1) ){ - return *this; - } - - // Otherwise, select the rows - const int nbRows = static_cast<int>(list_rows.size()); - const int nbCols = _nbCols; - SGTELIB::Matrix A (_name+"_get_rows",nbRows,nbCols); - - std::list<int>::const_iterator it; - - int k=0; - for ( it = list_rows.begin() ; it != list_rows.end() ; ++it ) { - if ( *it < 0 || *it >= _nbRows ) { - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::get_rows: bad index" ); - } - A.set_row(get_row(*it),k++); - } - return A; -}// - -/*---------------------------*/ -/* get_cols */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::get_cols (const std::list<int> & list_cols) const { - - // If the list has only one element and this element is -1, then all rows are returned. - if ( (list_cols.size()==1) && (list_cols.front()==-1) ){ - return *this; - } - - // Otherwise, select the rows - const int nbRows = _nbRows; - const int nbCols = static_cast<int>(list_cols.size()); - SGTELIB::Matrix A (_name+"_get_cols",nbRows,nbCols); - - std::list<int>::const_iterator it; - - int k=0; - for ( it = list_cols.begin() ; it != list_cols.end() ; ++it ) { - if ( *it < 0 || *it >= _nbCols ) { - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::get_rows: bad index" ); - } - A.set_col(get_col(*it),k++); - } - - return A; -}// - -/*----------------------------------------------------*/ -/* count the number of different values in column j */ -/*----------------------------------------------------*/ -int SGTELIB::Matrix::get_nb_diff_values ( int j ) const { - std::set<double> s; - for ( int i = 0 ; i < _nbRows ; ++i ){ - s.insert ( _X[i][j] ); - } - return static_cast<int> ( s.size() ); -}// - -/*---------------------------*/ -/* display */ -/*---------------------------*/ -void SGTELIB::Matrix::display ( std::ostream & out ) const { - int i , j; - out << std::endl << _name << "=[\n"; - for ( i = 0 ; i < _nbRows ; ++i ) { - for ( j = 0 ; j < _nbCols ; ++j ) - out << "\t" << std::setw(10) << _X[i][j] << " "; - out << ";" << std::endl; - } - out << "];" << std::endl; -}// - -/*---------------------------*/ -/* display */ -/*---------------------------*/ -void SGTELIB::Matrix::display_short ( std::ostream & out ) const { - if (get_numel()<5) display(out); - else{ - out << std::endl << _name << " ( " << _nbRows << " x " << _nbCols << " ) =\n["; - out << "\t" << std::setw(10) << _X[0][0] << " "; - if (_nbCols>2) out << "... "; - out << "\t" << std::setw(10) << _X[0][_nbCols] << "\n"; - if (_nbRows>2) out << "\t ..."; - if (_nbCols>2) out << " "; - if (_nbRows>2) out << "\t ...\n"; - out << "\t" << std::setw(10) << _X[_nbRows-1][0] << " "; - if (_nbCols>2) out << "... "; - out << "\t" << std::setw(10) << _X[_nbRows-1][_nbCols] << "]\n"; - } -}// - -/*---------------------------*/ -/* write */ -/*---------------------------*/ -void SGTELIB::Matrix::write ( const std::string & file_name ) const { - std::ofstream output_file; - output_file.open (file_name.c_str()); - display(output_file); - output_file.close(); -}// - -/*-------------------------------*/ -/* display_size */ -/*-------------------------------*/ -void SGTELIB::Matrix::display_size ( std::ostream & out ) const { - out << "Matrix " << _name << " : " << _nbRows << " , " << _nbCols << "\n"; -}// - -/*---------------------------*/ -/* double * to column vector */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::col_vector ( const double * v, - const int n ) { - if ( ! v){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::column_vector: v is null" ); - } - SGTELIB::Matrix V("V",n,1); - for (int i=0 ; i<n ; i++){ - V._X[i][0] = v[i]; - } - return V; -}// - -/*---------------------------*/ -/* double * to row vector */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::row_vector ( const double * v, - const int n ) { - if ( ! v){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::column_vector: v is null" ); - } - SGTELIB::Matrix V("V",1,n); - for (int i=0 ; i<n ; i++){ - V._X[0][i] = v[i]; - } - return V; -}// - -/*---------------------------*/ -/* product */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::product ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B ) { - - if (A.get_nb_cols()!=B.get_nb_rows()){ - std::cout << "A (" << A.get_name() << ") : " << A.get_nb_rows() << " , " << A.get_nb_cols() << "\n"; - std::cout << "B (" << B.get_name() << ") : " << B.get_nb_rows() << " , " << B.get_nb_cols() << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::product(A,B): dimension error" ); - } - - // Init matrix - SGTELIB::Matrix C(A.get_name()+"*"+B.get_name(),A.get_nb_rows(),B.get_nb_cols()); - - // Compute - int i,j,k; - const int nb_rows = C.get_nb_rows(); - const int nb_cols = C.get_nb_cols(); - const int nb_inter= A.get_nb_cols(); - //double v; - for ( i = 0 ; i < nb_rows ; ++i ) { - for ( j = 0 ; j < nb_cols ; ++j ){ - C._X[i][j] = 0; - for ( k = 0 ; k < nb_inter; ++k ){ - C._X[i][j] += A._X[i][k]*B._X[k][j]; - } - } - } - return C; -}// - -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::product ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B, - const SGTELIB::Matrix & C){ - return product(A,product(B,C)); -}// -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::product ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B, - const SGTELIB::Matrix & C, - const SGTELIB::Matrix & D){ - return product(product(A,B),product(C,D)); -}// -/*---------------------------*/ - -/*---------------------------------------------------*/ -/* Subset product */ -/* multiply */ -/* the p first rows and q first columns of A */ -/* with the q first rows and r first columns of B. */ -/* Result is a matrix of size p/r. */ -/*---------------------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::subset_product (const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B, - int p, - int q, - int r){ - - // Default p value - if (p==-1){ - p=A.get_nb_rows(); - } - // Otherwise, need to check the number of rows. - else if (A.get_nb_rows()<p){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::subset_product: dimension error" ); - } - - // Default q value - if ( (q==-1) & (A.get_nb_cols()==B.get_nb_rows()) ){ - q = A.get_nb_cols(); - } - else{ - // Check for q - if (A.get_nb_cols()<q){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::subset_product: dimension error" ); - } - if (B.get_nb_rows()<q){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::subset_product: dimension error" ); - } - } - - // Default r value - if (r==-1){ - r = B.get_nb_cols(); - } - else if (B.get_nb_cols()<r){ - // Check for r - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::subset_product: dimension error" ); - } - - SGTELIB::Matrix C("A*B",p,r); - for (int i=0 ; i<p ; i++){ - for (int j=0 ; j<r ; j++){ - for (int k=0 ; k<q ; k++){ - C._X[i][j] += A._X[i][k]*B._X[k][j]; - } - } - } - return C; - -}// - -/*---------------------------*/ -/* Hadamard product */ -/* (Term to term product) */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::hadamard_product ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B ) { - const int nb_rows = A.get_nb_rows(); - const int nb_cols = A.get_nb_cols(); - - if (B.get_nb_rows()!=nb_rows){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::hadamard_product(A,B): dimension error" ); - } - if (B.get_nb_cols()!=nb_cols){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::hadamard_product(A,B): dimension error" ); - } - - // Init matrix - SGTELIB::Matrix C(A.get_name()+".*"+B.get_name(),nb_rows,nb_cols); - - // Compute - int i,j; - for ( i = 0 ; i < nb_rows ; ++i ) { - for ( j = 0 ; j < nb_cols ; ++j ){ - C.set(i,j,A.get(i,j)*B.get(i,j)); - } - } - return C; -}// - -/*---------------------------*/ -/* Hadamard square */ -/* (Term to term square) */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::hadamard_square ( const SGTELIB::Matrix & A ) { - const int nb_rows = A.get_nb_rows(); - const int nb_cols = A.get_nb_cols(); - - // Init matrix - SGTELIB::Matrix C("("+A.get_name()+").^2",nb_rows,nb_cols); - - // Compute - int i,j; - double a; - for ( i = 0 ; i < nb_rows ; ++i ) { - for ( j = 0 ; j < nb_cols ; ++j ){ - a = A._X[i][j]; - C._X[i][j] = a*a; - } - } - return C; -}// - -/*---------------------------*/ -/* Hadamard square */ -/* (Term to term square) */ -/*---------------------------*/ -void SGTELIB::Matrix::hadamard_square ( void ) { - // change name - _name = "("+_name+").^2"; - // Compute - int i,j; - for ( i = 0 ; i < _nbRows ; ++i ) { - for ( j = 0 ; j < _nbCols ; ++j ){ - _X[i][j] *= _X[i][j]; - } - } -}// - -/*---------------------------*/ -/* Hadamard inverse */ -/* (Term to term inverse) */ -/*---------------------------*/ -void SGTELIB::Matrix::hadamard_inverse ( void ) { - // change name - _name = "("+_name+").^-1"; - // Compute - int i,j; - for ( i = 0 ; i < _nbRows ; ++i ) { - for ( j = 0 ; j < _nbCols ; ++j ){ - _X[i][j] = 1/_X[i][j]; - } - } -}// - -/*---------------------------*/ -/* Hadamard sqrt */ -/* (Term to term sqrt) */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::hadamard_sqrt ( const SGTELIB::Matrix & A ) { - const int nb_rows = A.get_nb_rows(); - const int nb_cols = A.get_nb_cols(); - - // Init matrix - SGTELIB::Matrix C("sqrt("+A.get_name()+")",nb_rows,nb_cols); - - // Compute - int i,j; - for ( i = 0 ; i < nb_rows ; ++i ) { - for ( j = 0 ; j < nb_cols ; ++j ){ - C._X[i][j] = sqrt(fabs(A._X[i][j])); - } - } - return C; -}// - -/*---------------------------*/ -/* Hadamard power */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::hadamard_power ( const SGTELIB::Matrix & A , const double e ) { - - if (e==1.0) return A; - - const int nb_rows = A.get_nb_rows(); - const int nb_cols = A.get_nb_cols(); - - // Init matrix - SGTELIB::Matrix C("pow("+A.get_name()+","+dtos(e)+")",nb_rows,nb_cols); - - // Compute - int i,j; - for ( i = 0 ; i < nb_rows ; ++i ) { - for ( j = 0 ; j < nb_cols ; ++j ){ - C._X[i][j] = pow(A._X[i][j],e); - } - } - return C; -}// - -/*---------------------------*/ -/* Hadamard sqrt */ -/* (Term to term sqrt) */ -/*---------------------------*/ -void SGTELIB::Matrix::hadamard_sqrt ( void ) { - // change name - _name = "sqrt("+_name+")"; - // Compute - int i,j; - for ( i = 0 ; i < _nbRows ; ++i ) { - for ( j = 0 ; j < _nbCols ; ++j ){ - _X[i][j] = sqrt(fabs(_X[i][j])); - } - } -}// - -/*---------------------------------------*/ -/* diagA_product */ -/* Product A*B, considering */ -/* that A is diag (no verif on this) */ -/*---------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::diagA_product ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B ) { - - // Init matrix - const int na = A.get_nb_rows(); - const int ma = A.get_nb_cols(); - const int n = B.get_nb_rows(); - const int m = B.get_nb_cols(); - SGTELIB::Matrix C(A.get_name()+"*"+B.get_name(),n,m); - - int i,j; - double Aii; - - if ( (na==ma) || (ma==n) ){ - // A is square, use the diag terms - for ( i = 0 ; i < n ; i++ ) { - Aii = A._X[i][i]; - for ( j = 0 ; j < m ; j++ ) { - C._X[i][j] = Aii*B._X[i][j]; - } - } - return C; - } - else if ( (na==1) && (ma==n) ){ - // A is a line vector - for ( i = 0 ; i < n ; i++ ) { - Aii = A._X[0][i]; - for ( j = 0 ; j < m ; j++ ) { - C._X[i][j] = Aii*B._X[i][j]; - } - } - return C; - } - else if ( (na==n) && (ma==1) ){ - // A is a col vector - for ( i = 0 ; i < n ; i++ ) { - Aii = A._X[i][0]; - for ( j = 0 ; j < m ; j++ ) { - C._X[i][j] = Aii*B._X[i][j]; - } - } - return C; - } - else { - std::cout << "A (" << A.get_name() << ") : " << A.get_nb_rows() << " , " << A.get_nb_cols() << "\n"; - std::cout << "B (" << B.get_name() << ") : " << B.get_nb_rows() << " , " << B.get_nb_cols() << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::diagA_product(A,B): dimension error" ); - } - -}// - -/*---------------------------------------*/ -/* diagB_product */ -/* Product A*B, considering */ -/* that B is diag (no verif on this) */ -/*---------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::diagB_product ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B ) { - - // Init matrix - const int n = A.get_nb_rows(); - const int m = A.get_nb_cols(); - const int nb = B.get_nb_rows(); - const int mb = B.get_nb_cols(); - SGTELIB::Matrix C(A.get_name()+"*"+B.get_name(),n,m); - - int i,j; - double Bjj; - - if ( (nb==mb) && (mb==n) ){ - // B is square, use the diag terms - for ( j = 0 ; j < m ; j++ ) { - Bjj = B._X[j][j]; - for ( i = 0 ; i < n ; i++ ) { - C._X[i][j] = A._X[i][j]*Bjj; - } - } - return C; - } - else if ( (nb==1) && (mb==m) ){ - // B is a line vector - for ( j = 0 ; j < m ; j++ ) { - Bjj = B._X[0][j]; - for ( i = 0 ; i < n ; i++ ) { - C._X[i][j] = A._X[i][j]*Bjj; - } - } - return C; - } - else if ( (nb==m) && (mb==1) ){ - // B is a col vector - for ( j = 0 ; j < m ; j++ ) { - Bjj = B._X[j][0]; - for ( i = 0 ; i < n ; i++ ) { - C._X[i][j] = A._X[i][j]*Bjj; - } - } - return C; - } - else { - std::cout << "A (" << A.get_name() << ") : " << A.get_nb_rows() << " , " << A.get_nb_cols() << "\n"; - std::cout << "B (" << B.get_name() << ") : " << B.get_nb_rows() << " , " << B.get_nb_cols() << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::diagB_product(A,B): dimension error" ); - } -}// - - -/*-------------------------------------*/ -/* transposeA_product */ -/* Product A'*B */ -/*-------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::transposeA_product ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B ) { - - if (A.get_nb_rows()!=B.get_nb_rows()){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::transposeA_product(A,B): dimension error" ); - } - - // Init matrix - SGTELIB::Matrix C(A.get_name()+"'*"+B.get_name(),A.get_nb_cols(),B.get_nb_cols()); - - // Compute - int i,j,k; - const int nb_rows = C.get_nb_rows(); - const int nb_cols = C.get_nb_cols(); - const int nb_inter= A.get_nb_rows(); - //double v; - for ( i = 0 ; i < nb_rows ; ++i ) { - for ( j = 0 ; j < nb_cols ; ++j ){ - C._X[i][j] = 0; - for ( k = 0 ; k < nb_inter; ++k ){ - C._X[i][j] += A._X[k][i]*B._X[k][j]; - } - } - } - return C; - -}// - - - -/*---------------------------*/ -/* get matrix P */ -/* P = I - H*Ai*H' */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::get_matrix_P ( const SGTELIB::Matrix & Ai, - const SGTELIB::Matrix & H ){ - const int p = H.get_nb_rows(); - std::cout << "Function get_matrix_P should be avoided !!\n"; - return identity(p) - (H * Ai * H.transpose()); -}// - -/*---------------------------*/ -/* compute P*Zs */ -/* where P = I - H*Ai*H' */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::get_matrix_PZs ( const SGTELIB::Matrix & Ai, - const SGTELIB::Matrix & H , - const SGTELIB::Matrix & Zs){ - //return Zs - H * Ai * H' * Zs; - return Zs - (H * Ai) * transposeA_product(H,Zs); -}// - -/*---------------------------*/ -/* get matrix dPi */ -/* dPi = diag(P)^-1 */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::get_matrix_dPi ( const SGTELIB::Matrix & Ai, - const SGTELIB::Matrix & H ){ - const int p = H.get_nb_rows(); - SGTELIB::Matrix dPi ("dPi",p,p); - SGTELIB::Matrix h; - double v; - - for ( int i = 0 ; i < p ; ++i ) { - h = H.get_row(i); - v = (h*Ai*h.transpose()).get(0,0); - v = 1.0/( 1.0 - v ); - dPi.set(i,i,v); - } - return dPi; -}// - -/*---------------------------*/ -/* compute dPi*P*Zs */ -/* where P = I - H*Ai*H' */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::get_matrix_dPiPZs ( const SGTELIB::Matrix & Ai, - const SGTELIB::Matrix & H , - const SGTELIB::Matrix & Zs){ - - const SGTELIB::Matrix HAi = H*Ai; - //SGTELIB::Matrix dPiPZs = Zs - HAi * (H.transpose()*Zs); - SGTELIB::Matrix dPiPZs = Zs - HAi * transposeA_product(H,Zs); - - // Take dPi into account - const int p = H.get_nb_rows(); - const int q = H.get_nb_cols(); - double v; - int i,j; - for ( i = 0 ; i < p ; i++ ) { - v = 0; - for ( j = 0 ; j < q ; j++) v += HAi._X[i][j]*H._X[i][j]; - v = 1.0/( 1.0 - v ); - dPiPZs.multiply_row ( v , i ); - } - - return dPiPZs; -}// - -/*---------------------------*/ -/* compute dPi*P*Zs */ -/* where P = I - H*Ai*H' */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::get_matrix_dPiPZs ( const SGTELIB::Matrix & Ai, - const SGTELIB::Matrix & H , - const SGTELIB::Matrix & Zs, - const SGTELIB::Matrix & ALPHA){ - - const SGTELIB::Matrix HAi = H*Ai; - //SGTELIB::Matrix dPiPZs = Zs - HAi * (H.transpose()*Zs); - SGTELIB::Matrix dPiPZs = Zs - H*ALPHA; - - // Take dPi into account - const int p = H.get_nb_rows(); - const int q = H.get_nb_cols(); - double v; - int i,j; - for ( i = 0 ; i < p ; i++ ) { - v = 0; - for ( j = 0 ; j < q ; j++) v += HAi._X[i][j]*H._X[i][j]; - v = 1.0/( 1.0 - v ); - dPiPZs.multiply_row ( v , i ); - } - - return dPiPZs; -}// - - - - -/*---------------------------*/ -/* get trace P */ -/*---------------------------*/ -double SGTELIB::Matrix::get_trace_P ( const SGTELIB::Matrix & Ai, - const SGTELIB::Matrix & H ){ - const int p = H.get_nb_rows(); - SGTELIB::Matrix h; - double v; - double trace = 0; - - for ( int i = 0 ; i < p ; ++i ) { - h = H.get_row(i); - v = (h*Ai*h.transpose()).get(0,0); - trace += v; - } - return trace; -}// - -/*---------------------------*/ -/* addition */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::add ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B ) { - - if (A.get_nb_cols()!=B.get_nb_cols()){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::add(A,B): dimension error" ); - } - if (A.get_nb_rows()!=B.get_nb_rows()){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::add(A,B): dimension error" ); - } - - const int nb_rows = A.get_nb_rows(); - const int nb_cols = A.get_nb_cols(); - - // Init matrix - SGTELIB::Matrix C(A.get_name()+"+"+B.get_name(),nb_rows,nb_cols); - - // Compute - int i,j; - for ( i = 0 ; i < nb_rows ; ++i ) { - for ( j = 0 ; j < nb_cols ; ++j ){ - C._X[i][j] = A._X[i][j]+B._X[i][j]; - } - } - return C; -}// - -/*---------------------------*/ -/* addition */ -/*---------------------------*/ -void SGTELIB::Matrix::add ( const SGTELIB::Matrix & B ) { - - if ( _nbCols != B.get_nb_cols() ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Matrix::add(B): dimension error" ); - } - if ( _nbRows != B.get_nb_rows() ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Matrix::add(B): dimension error" ); - } - - // Compute - int i,j; - for ( i = 0 ; i < _nbRows ; ++i ) { - for ( j = 0 ; j < _nbCols ; ++j ){ - _X[i][j] += B.get(i,j); - } - } -}// - -/*---------------------------*/ -/* add and fill with 0 */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::add_fill ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B ) { - - const int nb_rows = std::max(A.get_nb_rows(),B.get_nb_rows()); - const int nb_cols = std::max(A.get_nb_cols(),B.get_nb_cols()); - - // Init matrix - SGTELIB::Matrix C(A.get_name()+"+"+B.get_name(),nb_rows,nb_cols); - - // Compute - int i,j; - for ( i = 0 ; i < A.get_nb_rows() ; ++i ) { - for ( j = 0 ; j < A.get_nb_cols() ; ++j ){ - C._X[i][j] = A._X[i][j]; - } - } - for ( i = 0 ; i < B.get_nb_rows() ; ++i ) { - for ( j = 0 ; j < B.get_nb_cols() ; ++j ){ - C._X[i][j] += B._X[i][j]; - } - } - return C; -}// - -/*---------------------------*/ -/* substraction */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::sub ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B ) { - - if (A.get_nb_cols()!=B.get_nb_cols()){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::sub(A,B): dimension error" ); - } - if (A.get_nb_rows()!=B.get_nb_rows()){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::sub(A,B): dimension error" ); - } - - int nb_rows = A.get_nb_rows(); - int nb_cols = A.get_nb_cols(); - - // Init matrix - SGTELIB::Matrix C(A.get_name()+"-"+B.get_name(),nb_rows,nb_cols); - - // Compute - int i,j; - for ( i = 0 ; i < nb_rows ; ++i ) { - for ( j = 0 ; j < nb_cols ; ++j ){ - C.set(i,j,A.get(i,j)-B.get(i,j)); - } - } - return C; -}// - -/*---------------------------*/ -/* substraction */ -/*---------------------------*/ -void SGTELIB::Matrix::sub ( const SGTELIB::Matrix & B ) { - - if ( _nbCols != B.get_nb_cols() ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Matrix::sub(B): dimension error" ); - } - if ( _nbRows != B.get_nb_rows() ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Matrix::sub(B): dimension error" ); - } - - // Compute - int i,j; - for ( i = 0 ; i < _nbRows ; ++i ) { - for ( j = 0 ; j < _nbCols ; ++j ){ - _X[i][j] -= B._X[i][j]; - } - } -}// - -/*---------------------------*/ -/* identity */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::identity ( const int n ) { - - // Init matrix - SGTELIB::Matrix I("I",n,n); - // Fill with 0.0 - I.fill(0.0); - // Put one on the diag - for ( int i = 0 ; i < n ; ++i ) { - I.set(i,i,1.0); - } - return I; -}// - -/*---------------------------*/ -/* ones */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::ones ( const int nbRows , const int nbCols ) { - // Init matrix - SGTELIB::Matrix matrixOnes("Ones",nbRows,nbCols); - // Fill with 1.0 - matrixOnes.fill(1.0); - return matrixOnes; -}// - -/*---------------------------*/ -/* random permutation matrix */ -/*---------------------------*/ -// Create a square matrix of size nbCols, with one 1.0 randomly -// placed in each col and in each row -SGTELIB::Matrix SGTELIB::Matrix::random_permutation_matrix ( const int n ) { - // Init matrix - SGTELIB::Matrix perm("perm",n,n); - - // Create random integer permutation - std::vector<int> v; - - // Create order vector - for (int i=0; i<n; ++i) v.push_back(i); // 1 2 3 4 5 6 7 8 9 - - // shuffle - std::random_shuffle ( v.begin(), v.end() ); - - // Fill matrix - for (int i=0; i<n; ++i) perm.set(i,v.at(i),1.0); - - return perm; -}// - -/*---------------------------*/ -/* rank */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::rank ( void ) const { - - // TODO: use faster method... - if ((_nbRows>1) && (_nbCols>1)) - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Matrix::rank: dimension error" ); - - SGTELIB::Matrix R; - if (_nbRows>1){ - R = this->transpose().rank(); - R = R.transpose(); - } - else{ - const int m = _nbCols; - SGTELIB::Matrix D = *this; - R = SGTELIB::Matrix("R",1,m); - double dmin; - int i,j,jmin=0; - for (i=0 ; i<m ; i++){ - dmin = +INF; - for (j=0 ; j<m ; j++){ - if (D._X[0][j]<dmin){ - jmin = j; - dmin = D._X[0][j]; - } - } - R.set(0,jmin,double(i)); - D.set(0,jmin,INF); - } - } - return R; -}// - -/*---------------------------*/ -/* Trace */ -/*---------------------------*/ -double SGTELIB::Matrix::trace ( void ) const{ - int min_nm = std::min(_nbCols,_nbRows); - double v = 0; - for (int i=0 ; i<min_nm ; i++){ - // get diagonal term - v += get(i,i); - } - return v; -}// - -/*---------------------------*/ -/* Rmse */ -/*---------------------------*/ -double SGTELIB::Matrix::rmse ( void ) const{ - double v = 0; - - // Compute - int i,j; - double xij; - for ( i = 0 ; i < _nbRows ; ++i ) { - for ( j = 0 ; j < _nbCols ; ++j ){ - xij = _X[i][j]; - v += xij*xij; - } - } - v /= _nbRows * _nbCols; - v = sqrt(v); - return v; -}// - -/*---------------------------*/ -/* norm */ -/*---------------------------*/ -double SGTELIB::Matrix::normsquare ( void ) const{ - double v = 0; - // Compute - int i,j; - double xij; - for ( i = 0 ; i < _nbRows ; ++i ) { - for ( j = 0 ; j < _nbCols ; ++j ){ - xij = _X[i][j]; - v += xij*xij; - } - } - return v; -}// - -/*----------------------------------------*/ -/* normalize_cols */ -/* Normalizes each column so that the sum */ -/* of the terms on this column is 1 */ -/*----------------------------------------*/ -void SGTELIB::Matrix::normalize_cols ( void ){ - int i,j; - double d; - for ( j = 0 ; j < _nbCols ; ++j ){ - d = 0; - - for ( i = 0 ; i < _nbRows ; ++i ) - d += _X[i][j]; - - if (d==0){ - for ( i = 0 ; i < _nbRows ; ++i ) - _X[i][j] = 1/_nbRows; - } - else{ - for ( i = 0 ; i < _nbRows ; ++i ) - _X[i][j] /= d; - } - } -}// - - - -/*---------------------------*/ -/* square norm */ -/*---------------------------*/ -double SGTELIB::Matrix::norm ( void ) const{ - return sqrt(normsquare()); -}// - -/*---------------------------*/ -/* sum */ -/*---------------------------*/ -double SGTELIB::Matrix::sum ( void ) const{ - double v = 0; - - // Compute - int i,j; - for ( i = 0 ; i < _nbRows ; ++i ) { - for ( j = 0 ; j < _nbCols ; ++j ){ - v += _X[i][j]; - } - } - return v; -}// - -/*-------------------------------------------------*/ -/* sum */ -/* Sum the element along one of the two directions */ -/* direction == 1 => return the sum for each row */ -/* direction == 2 => return the sum for each col */ -/*-------------------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::sum ( const int direction ) const{ - - double v; - int i,j; - - if (direction == 1){ - SGTELIB::Matrix S ("S",1,_nbCols); - for ( j = 0 ; j < _nbCols ; ++j ){ - v = 0; - for ( i = 0 ; i < _nbRows ; ++i ) { - v += _X[i][j]; - } - S._X[0][j] = v; - } - return S; - } - else if (direction == 2){ - SGTELIB::Matrix S ("S",_nbRows,1); - for ( i = 0 ; i < _nbRows ; ++i ) { - v = 0; - for ( j = 0 ; j < _nbCols ; ++j ){ - v += _X[i][j]; - } - S._X[i][0] = v; - } - return S; - } - else{ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::sum(direction): direction must be 1 or 2" ); - } -}// - -/*---------------------------*/ -/* mean */ -/*---------------------------*/ -double SGTELIB::Matrix::mean ( void ) const{ - return sum()/(_nbRows*_nbCols); -}// - -/*---------------------------*/ -/* count */ -/* Number of non null values */ -/*---------------------------*/ -int SGTELIB::Matrix::count ( void ) const{ - int v = 0; - - // Compute - int i,j; - const int nb_rows = get_nb_rows(); - const int nb_cols = get_nb_cols(); - for ( i = 0 ; i < nb_rows ; ++i ) { - for ( j = 0 ; j < nb_cols ; ++j ){ - v += (fabs(_X[i][j])>EPSILON)? 1:0 ; - } - } - return v; -}// - -/*---------------------------*/ -/* Diag inverse */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::diag_inverse ( void ) const{ - // Return a new matrix such that: - // Non diagonal terms are null - // Diagonal terms are the inverse of the original ones. - // Works for square and non-square matrices. - // - // Does not work if a diag term is 0. - - // New matrix - SGTELIB::Matrix DI("diag("+_name+")^-1",_nbCols,_nbRows); - // nb: this constructor initializes the matrix to 0.0 - - const int min_nm = std::min(_nbCols,_nbRows); - - double v = 0; - for (int i=0 ; i<min_nm ; i++){ - // get diagonal term - v = get(i,i); - DI.set(i,i,1/v); - } - return DI; -}// - -/*------------------------------------------------*/ -/* solve linear system with conjugate gradient */ -/*------------------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::conjugate_solve ( const SGTELIB::Matrix & A , - const SGTELIB::Matrix & b , - const SGTELIB::Matrix & x0 , - const double tol) { - - const int n = x0.get_nb_rows(); - SGTELIB::Matrix x = x0; - SGTELIB::Matrix r = b-A*x; - double rr = r.normsquare(); - SGTELIB::Matrix p = r; - SGTELIB::Matrix Ap; - double rr_old,alpha,pAp; - int iter = 0; - while (iter < 100){ - Ap = A*p; - pAp = 0; - for (int i=0 ; i<n ; i++) pAp += p._X[i][0]*Ap._X[i][0]; - alpha = rr/pAp; - x = x+alpha*p; - rr_old = rr; - r = r-alpha*Ap; - rr = r.normsquare(); - if (rr < tol) break; - p = r + (rr/rr_old)*p; - - Ap.set_name("Ap"); - x.set_name("x"); - r.set_name("r"); - p.set_name("p"); - } - return x; -}// - -/*---------------------------*/ -/* cholesky decomposition */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::cholesky ( void ) const { - - if (get_nb_rows()!=get_nb_cols()){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::cholesky(): dimension error" ); - } - - const int n = get_nb_rows(); - SGTELIB::Matrix L ("L",n,n); - - double s; - int i,j,k; - for (i = 0; i < n; i++) { - for (j = 0; j < (i+1); j++) { - s = 0; - for (k = 0; k < j; k++){ - s += L._X[i][k] * L._X[j][k]; - } - L._X[i][j] = (i == j) ? - sqrt(_X[i][i] - s) : - (1.0 / L._X[j][j] * (_X[i][j] - s)); - } - } - return L; -}// - -/*---------------------------*/ -/* cholesky inverse */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::cholesky_inverse ( void ) const { - return cholesky_inverse(NULL); -} - - -SGTELIB::Matrix SGTELIB::Matrix::cholesky_inverse ( double * det ) const { - SGTELIB::Matrix L = cholesky(); - SGTELIB::Matrix Li = tril_inverse(L); - - const int n = _nbRows; - - // Compute A = Li'*Li - // Note: by taking into account the fact that Li is tri inf, - // It is possible to divide the cost of the computation - // of Li'*Li by 3. - SGTELIB::Matrix A ("A",n,n); - int i,j,k,kmin; - for (i=0 ; i<n ; i++){ - for (j=0 ; j<n ; j++){ - A._X[i][j] = 0; - kmin = std::max(i,j); - for (k=kmin ; k<n ; k++){ - A._X[i][j] += Li._X[k][i]*Li._X[k][j]; - } - } - } - - if (det){ - double v = 1; - for (i=0 ; i<n ; i++) v *= L._X[i][i]; - v *= v; - if ( isnan(v)) v=+INF; - *det = v; - } - - return A; -}// - -/*-----------------------------------------*/ -/* Solve Upper Triangular Linear system */ -/*-----------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::triu_solve( const SGTELIB::Matrix & U , - const SGTELIB::Matrix & b ){ - const int n = U.get_nb_rows(); - if (n!=U.get_nb_cols()){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::triu_solve(): dimension error" ); - } - if (n!=b.get_nb_rows()){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::triu_solve(): dimension error" ); - } - if (1!=b.get_nb_cols()){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::triu_solve(): dimension error" ); - } - - SGTELIB::Matrix x = b; - - for (int i=n-1 ; i>=0 ; i--){ - for (int j=i+1 ; j<n ; j++){ - x._X[i][0] -= U._X[i][j]*x._X[j][0]; - } - x._X[i][0] /= U._X[i][i]; - } - - return x; -}// - -/*-----------------------------------------*/ -/* Inverse Lower Triangular Matrix */ -/*-----------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::tril_inverse( const SGTELIB::Matrix & L ){ - const int n = L.get_nb_rows(); - SGTELIB::Matrix Li = L; - SGTELIB::Matrix b ("b",n,1); - - for (int i=0 ; i<n ; i++){ - b.set(i,0,1.0); - Li.set_col( SGTELIB::Matrix::tril_solve(L,b) , i); - b.set(i,0,0.0); - } - - return Li; -}// - -/*-----------------------------------------*/ -/* Solve Lower Triangular Linear system */ -/*-----------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::tril_solve( const SGTELIB::Matrix & L , - const SGTELIB::Matrix & b ){ - const int n = L.get_nb_rows(); - if (n!=L.get_nb_cols()){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::tril_solve(): dimension error" ); - } - if (n!=b.get_nb_rows()){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::tril_solve(): dimension error" ); - } - if (1!=b.get_nb_cols()){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::tril_solve(): dimension error" ); - } - - SGTELIB::Matrix x = b; - - for (int i=0 ; i<n ; i++){ - for (int j=0 ; j<i ; j++){ - x._X[i][0] -= L._X[i][j]*x._X[j][0]; - } - x._X[i][0] /= L._X[i][i]; - } - - return x; -}// - -/*-----------------------------------------*/ -/* Solve System with Cholesky */ -/*-----------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::cholesky_solve ( const SGTELIB::Matrix & A , - const SGTELIB::Matrix & b ) { - SGTELIB::Matrix L = A.cholesky(); - SGTELIB::Matrix y = tril_solve(L,b); - SGTELIB::Matrix x = triu_solve(L.transpose(),y); - return x; -}// - -/*---------------------------*/ -/* SVD inverse */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::SVD_inverse ( void ) const { - - if (get_nb_rows()!=get_nb_cols()){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Matrix::SVD_inverse(): dimension error" ); - } - - // Init SVD matrices - SGTELIB::Matrix * U; - SGTELIB::Matrix * W; - SGTELIB::Matrix * V; - - // Perform SVD - std::string error_msg; - SVD_decomposition ( error_msg , U, W, V, 1000000000 ); - - // Inverse diag terms of W. - for (int i=0 ; i<W->get_nb_rows() ; i++){ - W->set(i,i,1/W->get(i,i)); - } - - *U = U->transpose(); - SGTELIB::Matrix INVERSE (product ( *V , *W , *U )); - INVERSE.set_name("inv("+_name+")"); - delete V; - delete W; - delete U; - return INVERSE; -}// - -/*---------------------------*/ -/* transpose */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::transpose ( void ) const{ - SGTELIB::Matrix A (_name+"'",_nbCols,_nbRows); - for (int i=0 ; i<_nbCols ; i++){ - for (int j=0 ; j<_nbRows ; j++){ - A.set(i,j,_X[j][i]); - } - } - return A; -}// - -/*---------------------------*/ -/* diag */ -/*---------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::diag ( void ) const{ - - SGTELIB::Matrix A; - if (_nbCols==_nbRows){ - A = SGTELIB::Matrix("A",_nbRows,1); - for (int i=0 ; i<_nbCols ; i++) A.set(i,0,_X[i][i]); - } - else if ( (_nbCols==1) || (_nbRows==1) ){ - const int n=std::max(_nbCols,_nbRows); - A = SGTELIB::Matrix("A",_nbRows,1); - for (int i=0 ; i<n ; i++) A.set(i,i,get(i)); - } - else{ - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Matrix::diag(): dimension error" ); - } - - A.set_name("diag("+_name+")"); - return A; -}// - -/*--------------------------------------------------------------*/ -/* SVD decomposition */ -/* inspired and recoded from an old numerical recipes version */ -/*--------------------------------------------------------------*/ -/* */ -/* M = U . W . V' (M: current matrix object) */ -/* */ -/* M ( nbRows x nbCols ) */ -/* U ( nbRows x nbCols ) */ -/* W ( nbCols x nbCols ) */ -/* V ( nbCols x nbCols ) */ -/* */ -/* U.U' = U'.U = I if nbRows = nbCols */ -/* U'.U = I if nbRows > nbCols */ -/* */ -/* V.V' = V'.V = I */ -/* */ -/* W diagonal, given as a size-nbCols vector */ -/* */ -/* V is given, not V' */ -/* */ -/*--------------------------------------------------------------*/ - -bool SGTELIB::Matrix::SVD_decomposition ( std::string & error_msg , - SGTELIB::Matrix *& MAT_U, // OUT, nbRows x nbCols - SGTELIB::Matrix *& MAT_W, // OUT, nbCols x nbCols, diagonal - SGTELIB::Matrix *& MAT_V, // OUT, nbCols x nbCols - int max_mpn ) const { - - // Dimension - const int nbRows = _nbRows; - const int nbCols = _nbCols; - - // init matrices for SVD - double ** U = new double *[nbRows]; - double * W = new double [nbCols]; - double ** V = new double *[nbCols]; - for (int i = 0 ; i < nbCols ; ++i ) { - U[i] = new double[nbCols]; - V[i] = new double[nbCols]; - } - - // call SVD - bool result; - result = this->SVD_decomposition ( error_msg , U , W , V , max_mpn ); - - // Init matrix for result - MAT_U = new SGTELIB::Matrix ("MAT_U",nbRows,nbCols); - MAT_W = new SGTELIB::Matrix ("MAT_W",nbCols,nbCols); - MAT_V = new SGTELIB::Matrix ("MAT_V",nbCols,nbCols); - - // Fill matrices - for (int i=0 ; i<nbRows ; i++){ - for (int j=0 ; j<nbCols ; j++){ - MAT_U->set(i,j,U[i][j]); - } - } - for (int i=0 ; i<nbCols ; i++){ - for (int j=0 ; j<nbCols ; j++){ - MAT_V->set(i,j,V[i][j]); - MAT_W->set(i,j,0.0); - } - MAT_W->set(i,i,W[i]); - } - - // Delete U, V, W - for (int i=0 ; i<nbRows ; i++){ - delete [] U[i]; - } - delete [] U; - for (int j=0 ; j<nbCols ; j++){ - delete [] V[j]; - } - delete [] V; - delete [] W; - - return result; -}// - -bool SGTELIB::Matrix::SVD_decomposition ( std::string & error_msg , - double ** U , // OUT, nbRows x nbCols - double * W , // OUT, nbCols x nbCols, diagonal - double ** V , // OUT, nbCols x nbCols - int max_mpn ) const { - const int nbRows = _nbRows; - const int nbCols = _nbCols; - - error_msg.clear(); - - if ( max_mpn > 0 && nbRows+nbCols > max_mpn ) { - error_msg = "SVD_decomposition() error: nbRows+nbCols > " + SGTELIB::itos ( max_mpn ); - return false; - } - - double * rv1 = new double[nbCols]; - double scale = 0.0; - double g = 0.0; - double norm = 0.0; - - int nm1 = nbCols - 1; - - bool flag; - int i , j , k , l = 0 , its , jj , nm = 0; - double s , f , h , tmp , c , x , y , z , absf , absg , absh; - - const int NITER = 30; - - // copy the current matrix into U: - for ( i = 0 ; i < nbRows ; ++i ) - for ( j = 0 ; j < nbCols ; ++j ) - U[i][j] = _X[i][j]; - - // Householder reduction to bidiagonal form: - for ( i = 0 ; i < nbCols ; ++i ) { - l = i + 1; - rv1[i] = scale * g; - g = s = scale = 0.0; - if ( i < nbRows ) { - for ( k = i ; k < nbRows ; ++k ) - scale += fabs ( U[k][i] ); - if ( scale != 0.0 ) { - for ( k = i ; k < nbRows ; ++k ) { - U[k][i] /= scale; - s += U[k][i] * U[k][i]; - } - f = U[i][i]; - g = ( f >= 0.0 ) ? -fabs(sqrt(s)) : fabs(sqrt(s)); - h = f * g - s; - U[i][i] = f - g; - for ( j = l ; j < nbCols ; ++j ) { - for ( s = 0.0 , k = i ; k < nbRows ; ++k ) - s += U[k][i] * U[k][j]; - f = s / h; - for ( k = i ; k < nbRows ; ++k ) - U[k][j] += f * U[k][i]; - } - for ( k = i ; k < nbRows ; ++k ) - U[k][i] *= scale; - } - } - W[i] = scale * g; - g = s = scale = 0.0; - if ( i < nbRows && i != nm1 ) { - for ( k = l ; k < nbCols ; ++k ) - scale += fabs ( U[i][k] ); - if ( scale != 0.0 ) { - for ( k = l ; k < nbCols ; ++k ) { - U[i][k] /= scale; - s += U[i][k] * U[i][k]; - } - f = U[i][l]; - g = ( f >= 0.0 ) ? -fabs(sqrt(s)) : fabs(sqrt(s)); - h = f * g - s; - U[i][l] = f - g; - for ( k = l ; k < nbCols ; ++k ) - rv1[k] = U[i][k] / h; - for ( j = l ; j < nbRows ; ++j ) { - for ( s=0.0,k=l ; k < nbCols ; ++k ) - s += U[j][k] * U[i][k]; - for ( k=l ; k < nbCols ; ++k ) - U[j][k] += s * rv1[k]; - } - for ( k = l ; k < nbCols ; ++k ) - U[i][k] *= scale; - } - } - tmp = fabs ( W[i] ) + fabs ( rv1[i] ); - norm = ( norm > tmp ) ? norm : tmp; - } - - // accumulation of right-hand transformations: - for ( i = nm1 ; i >= 0 ; --i ) { - if ( i < nm1 ) { - if ( g != 0.0 ) { - for ( j = l ; j < nbCols ; ++j ) - V[j][i] = ( U[i][j] / U[i][l] ) / g; - for ( j = l ; j < nbCols ; ++j ) { - for ( s = 0.0 , k = l ; k < nbCols ; ++k ) - s += U[i][k] * V[k][j]; - for ( k = l ; k < nbCols ; ++k ) - V[k][j] += s * V[k][i]; - } - } - for ( j = l ; j < nbCols ; ++j ) - V[i][j] = V[j][i] = 0.0; - } - V[i][i] = 1.0; - g = rv1[i]; - l = i; - } - - // accumulation of left-hand transformations: - for ( i = ( ( nbRows < nbCols ) ? nbRows : nbCols ) - 1 ; i >= 0 ; --i ) { - l = i + 1; - g = W[i]; - for ( j = l ; j < nbCols ; ++j ) - U[i][j] = 0.0; - if ( g != 0.0 ) { - g = 1.0 / g; - for ( j = l ; j < nbCols ; ++j ) { - for ( s = 0.0 , k = l ; k < nbRows ; ++k ) - s += U[k][i] * U[k][j]; - f = ( s / U[i][i] ) * g; - for ( k = i ; k < nbRows ; ++k ) - U[k][j] += f * U[k][i]; - } - for ( j = i ; j < nbRows ; ++j ) - U[j][i] *= g; - } - else - for ( j = i ; j < nbRows ; ++j ) - U[j][i] = 0.0; - ++U[i][i]; - } - - // diagonalization of the bidiagonal form: - for ( k = nm1 ; k >= 0 ; --k ) { - for ( its = 1 ; its <= NITER ; its++ ) { - flag = true; - for ( l = k ; l >= 0 ; l-- ) { - nm = l - 1; - if ( nm < 0 || fabs ( rv1[l]) + norm == norm ) { - flag = false; - break; - } - if ( fabs ( W[nm] ) + norm == norm ) - break; - } - if ( flag ) { - c = 0.0; - s = 1.0; - for ( i = l ; i <= k ; i++ ) { - f = s * rv1[i]; - rv1[i] = c * rv1[i]; - if ( fabs(f) + norm == norm ) - break; - g = W[i]; - - absf = fabs(f); - absg = fabs(g); - h = ( absf > absg ) ? - absf * sqrt ( 1.0 + pow ( absg/absf , 2.0 ) ) : - ( ( absg==0 ) ? 0.0 : absg * sqrt ( 1.0 + pow ( absf/absg , 2.0 ) ) ); - - W[i] = h; - h = 1.0 / h; - c = g * h; - s = -f * h; - for ( j = 0 ; j < nbRows ; ++j ) { - y = U[j][nm]; - z = U[j][ i]; - U[j][nm] = y * c + z * s; - U[j][ i] = z * c - y * s; - } - } - } - z = W[k]; - if ( l == k) { - if ( z < 0.0 ) { - W[k] = -z; - for ( j = 0 ; j < nbCols ; j++ ) - V[j][k] = -V[j][k]; - } - break; // this 'break' is always active if k==0 - } - if ( its == NITER ) { - error_msg = "SVD_decomposition() error: no convergence in " + - SGTELIB::itos ( NITER ) + " iterations"; - delete [] rv1; - return false; - } - x = W[l]; - nm = k - 1; - y = W[nm]; - g = rv1[nm]; - h = rv1[k]; - f = ( (y-z) * (y+z) + (g-h) * (g+h) ) / ( 2.0 * h * y ); - - absf = fabs(f); - g = ( absf > 1.0 ) ? - absf * sqrt ( 1.0 + pow ( 1.0/absf , 2.0 ) ) : - sqrt ( 1.0 + pow ( absf , 2.0 ) ); - - f = ( (x-z) * (x+z) + - h * ( ( y / ( f + ( (f >= 0)? fabs(g) : -fabs(g) ) ) ) - h ) ) / x; - c = s = 1.0; - - for ( j = l ; j <= nm ; ++j ) { - i = j + 1; - g = rv1[i]; - y = W[i]; - h = s * g; - g = c * g; - - absf = fabs(f); - absh = fabs(h); - z = ( absf > absh ) ? - absf * sqrt ( 1.0 + pow ( absh/absf , 2.0 ) ) : - ( ( absh==0 ) ? 0.0 : absh * sqrt ( 1.0 + pow ( absf/absh , 2.0 ) ) ); - - rv1[j] = z; - c = f / z; - s = h / z; - f = x * c + g * s; - g = g * c - x * s; - h = y * s; - y *= c; - for ( jj = 0 ; jj < nbCols ; ++jj ) { - x = V[jj][j]; - z = V[jj][i]; - V[jj][j] = x * c + z * s; - V[jj][i] = z * c - x * s; - } - - absf = fabs(f); - absh = fabs(h); - z = ( absf > absh ) ? - absf * sqrt ( 1.0 + pow ( absh/absf , 2.0 ) ) : - ( ( absh==0 ) ? 0.0 : absh * sqrt ( 1.0 + pow ( absf/absh , 2.0 ) ) ); - - W[j] = z; - - if ( z ) { - z = 1.0 / z; - c = f * z; - s = h * z; - } - f = c * g + s * y; - x = c * y - s * g; - for ( jj = 0 ; jj < nbRows ; ++jj ) { - y = U[jj][j]; - z = U[jj][i]; - U[jj][j] = y * c + z * s; - U[jj][i] = z * c - y * s; - } - } - rv1[l] = 0.0; - rv1[k] = f; - W [k] = x; - } - } - - delete [] rv1; - return true; -}// - -/*--------------------------------*/ -/* is there any NaN in the matrix */ -/*--------------------------------*/ -bool SGTELIB::Matrix::has_nan ( void ) const { - int i , j; - for ( i = 0 ; i < _nbRows ; ++i ){ - for ( j = 0 ; j < _nbCols ; ++j ){ - if ( isnan(_X[i][j])){ - return true; - } - } - } - return false; -}// - -/*--------------------------------*/ -/* is there any NaN in the matrix */ -/*--------------------------------*/ -bool SGTELIB::Matrix::has_inf ( void ) const { - int i , j; - for ( i = 0 ; i < _nbRows ; ++i ){ - for ( j = 0 ; j < _nbCols ; ++j ){ - if ( isinf(_X[i][j])){ - return true; - } - } - } - return false; -}// - -/*--------------------------------*/ -/* is there any NaN in the matrix */ -/*--------------------------------*/ -void SGTELIB::Matrix::replace_nan ( double d ) { - int i , j; - for ( i = 0 ; i < _nbRows ; ++i ){ - for ( j = 0 ; j < _nbCols ; ++j ){ - if ( isnan(_X[i][j])){ - _X[i][j] = d; - } - } - } -}// - -/*-------------------------------------------------*/ -/* return the index of the largest value */ -/*-------------------------------------------------*/ -int SGTELIB::Matrix::get_max_index (void ) { - int i,j,k=0,kmax=0; - double vmax = -SGTELIB::INF; - // We use the same mono-indexation as in matlab: - // 1 4 - // 2 5 - // 3 6 - for ( j = 0 ; j < _nbCols ; ++j ){ - for ( i = 0 ; i < _nbRows ; ++i ){ - if (_X[i][j] > vmax){ - vmax = _X[i][j]; - kmax = k; - } - k++; - } - } - return kmax; -}// - -/*-------------------------------------------------*/ -/* min & max of a matrix */ -/*-------------------------------------------------*/ -double SGTELIB::Matrix::min (void) { - double d = +INF; - int i,j; - for ( j = 0 ; j < _nbCols ; ++j ){ - for ( i = 0 ; i < _nbRows ; ++i ){ - d = std::min(d,_X[i][j]); - } - } - return d; -}// - -double SGTELIB::Matrix::max (void) { - double d = -INF; - int i,j; - for ( j = 0 ; j < _nbCols ; ++j ){ - for ( i = 0 ; i < _nbRows ; ++i ){ - d = std::max(d,_X[i][j]); - } - } - return d; -}// - -/*-------------------------------------------------*/ -/* min and max of two matrices */ -/*-------------------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::max ( const SGTELIB::Matrix & A , - const SGTELIB::Matrix & B ){ - const int nb_rows = A.get_nb_rows(); - const int nb_cols = A.get_nb_cols(); - - if (B.get_nb_rows()!=nb_rows){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::max(A,B): dimension error" ); - } - if (B.get_nb_cols()!=nb_cols){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::max(A,B): dimension error" ); - } - - // Init matrix - SGTELIB::Matrix C("max("+A.get_name()+";"+B.get_name()+")",nb_rows,nb_cols); - - // Compute - int i,j; - for ( i = 0 ; i < nb_rows ; ++i ) { - for ( j = 0 ; j < nb_cols ; ++j ){ - C._X[i][j] = std::max( A._X[i][j] , B._X[i][j] ); - } - } - return C; -}// - -SGTELIB::Matrix SGTELIB::Matrix::min ( const SGTELIB::Matrix & A , - const SGTELIB::Matrix & B ){ - const int nb_rows = A.get_nb_rows(); - const int nb_cols = A.get_nb_cols(); - - if (B.get_nb_rows()!=nb_rows){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::min(A,B): dimension error" ); - } - if (B.get_nb_cols()!=nb_cols){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Matrix::min(A,B): dimension error" ); - } - - // Init matrix - SGTELIB::Matrix C("min("+A.get_name()+";"+B.get_name()+")",nb_rows,nb_cols); - - // Compute - int i,j; - for ( i = 0 ; i < nb_rows ; ++i ) { - for ( j = 0 ; j < nb_cols ; ++j ){ - C._X[i][j] = std::min( A._X[i][j] , B._X[i][j] ); - } - } - return C; -}// - -/*-------------------------------------------------*/ -/* return the index of the smallest value */ -/*-------------------------------------------------*/ -int SGTELIB::Matrix::get_min_index (void ) { - int i,j,k=0,kmin=0; - double vmin = +SGTELIB::INF; - // We use the same mono-indexation as in matlab: - // 1 4 - // 2 5 - // 3 6 - for ( j = 0 ; j < _nbCols ; ++j ){ - for ( i = 0 ; i < _nbRows ; ++i ){ - if (_X[i][j] < vmin){ - vmin = _X[i][j]; - kmin = k; - } - k++; - } - } - return kmin; -}// - -/*-------------------------------------------------*/ -/* return the index of the smallest value on row i */ -/*-------------------------------------------------*/ -int SGTELIB::Matrix::get_min_index_row ( const int i ) { - int j, jmin=0; - double vmin = +SGTELIB::INF; - for ( j = 0 ; j < _nbCols ; ++j ){ - if (_X[i][j] < vmin){ - vmin = _X[i][j]; - jmin = j; - } - } - return jmin; -}// - -/*-------------------------------------------------*/ -/* return the index of the smallest value on row i */ -/*-------------------------------------------------*/ -int SGTELIB::Matrix::get_min_index_col ( const int j ) { - int i, imin=0; - double vmin = +SGTELIB::INF; - for ( i = 0 ; i < _nbRows ; ++i ){ - if (_X[i][j] < vmin){ - vmin = _X[i][j]; - imin = i; - } - } - return imin; -}// - -/*-------------------------------------------------*/ -/* Return NORM2 distance */ -/*-------------------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::get_distances_norm2 ( const SGTELIB::Matrix & A , - const SGTELIB::Matrix & B ){ - const int n = A.get_nb_cols(); - if ( B.get_nb_cols()!=n ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "get_distances_norm2: dimension error" ); - } - - const int pa = A.get_nb_rows(); - const int pb = B.get_nb_rows(); - SGTELIB::Matrix D = SGTELIB::Matrix("D",pa,pb); - double v,d; - int ia, ib, j; - - for (ia=0 ; ia < pa ; ia++){ - for (ib=0 ; ib < pb ; ib++){ - // Distance between the point ia of the cache and the point ib of the matrix XXs - v = 0; - for (j=0 ; j < n ; j++){ - d = A._X[ia][j]-B._X[ib][j]; - v += d*d; - } - D._X[ia][ib] = sqrt(v); - } - } - return D; -}// - -/*-------------------------------------------------*/ -/* Return NORM1 distance */ -/*-------------------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::get_distances_norm1 ( const SGTELIB::Matrix & A , - const SGTELIB::Matrix & B ){ - const int n = A.get_nb_cols(); - if ( B.get_nb_cols()!=n ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "get_distances_norm2: dimension error" ); - } - - const int pa = A.get_nb_rows(); - const int pb = B.get_nb_rows(); - SGTELIB::Matrix D = SGTELIB::Matrix("D",pa,pb); - double v; - int ia, ib, j; - - for (ia=0 ; ia < pa ; ia++){ - for (ib=0 ; ib < pb ; ib++){ - // Distance between the point ia of the cache and the point ib of the matrix XXs - v = 0; - for (j=0 ; j < n ; j++){ - v += fabs(A._X[ia][j]-B._X[ib][j]); - } - D._X[ia][ib] = v; - } - } - return D; -}// - -/*-------------------------------------------------*/ -/* Return NORMINF distance */ -/*-------------------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::get_distances_norminf ( const SGTELIB::Matrix & A , - const SGTELIB::Matrix & B ){ - const int n = A.get_nb_cols(); - if ( B.get_nb_cols()!=n ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "get_distances_norm2: dimension error" ); - } - - const int pa = A.get_nb_rows(); - const int pb = B.get_nb_rows(); - SGTELIB::Matrix D = SGTELIB::Matrix("D",pa,pb); - double v; - int ia, ib, j; - - for (ia=0 ; ia < pa ; ia++){ - for (ib=0 ; ib < pb ; ib++){ - // Distance between the point ia of the cache and the point ib of the matrix XXs - v = 0; - for (j=0 ; j < n ; j++){ - v = std::max( v , fabs(A._X[ia][j]-B._X[ib][j]) ); - } - D._X[ia][ib] = v; - } - } - return D; -}// - - -/*-------------------------------------------------*/ -/* find_row */ -/* Check if the matrix has a row identical to R */ -/*-------------------------------------------------*/ -int SGTELIB::Matrix::find_row (SGTELIB::Matrix & R){ - - // If the matrix is empty, return false. - if (_nbRows==0) return -1; - - // Then, check dimensions. - if (R.get_nb_rows()!=1) - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "find_row: dimension error" ); - if (R.get_nb_cols()!=_nbCols) - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "find_row: dimension error" ); - - // Look for the row. - int i,j; - bool diff; - for (i=0 ; i<_nbRows ; i++){ - diff = false; - for (j=0 ; j<_nbCols ; j++){ - if (_X[i][j]!=R._X[0][j]){ - diff = true; - break; - } - } - if ( ! diff) return i; - } - return -1; - - - - -}// - - -/*-------------------------------------------------*/ -/* Generate poll directions */ -/*-------------------------------------------------*/ -SGTELIB::Matrix SGTELIB::Matrix::get_poll_directions ( const SGTELIB::Matrix scaling, - const SGTELIB::param_domain_t * domain, - double psize ) { - - int i,j,k; - // i : index of the poll direction (rows of D and POLL) - // (Each line of D and POLL is a poll direction) - // j : index of the optimization variable (columns of D and POLL) - // k : integer buffer, when needed. - double d; - - // Number of variables - const int N = scaling.get_nb_cols(); - SGTELIB::Matrix D("D",N,N); - - // Number of continuous variables - int Ncont = 0; - for (j=0 ; j<N ; j++){ - if (domain[j]==SGTELIB::PARAM_DOMAIN_CONTINUOUS) Ncont++; - } - - // Generate directions for continuous variables - if (Ncont>0){ - // Generate one random direction - SGTELIB::Matrix v("v",1,N); - for (j=0 ; j<N ; j++){ - if (domain[j]==SGTELIB::PARAM_DOMAIN_CONTINUOUS){ - v._X[0][j] = SGTELIB::quick_norm_rand(); - } - } - - // Normalize v (Euclidian Norm) - v = v/v.norm(); - - // Build D (Householder matrix) - for (i=0 ; i<N ; i++){ - if (domain[i]==SGTELIB::PARAM_DOMAIN_CONTINUOUS){ - for (j=0 ; j<N ; j++){ - D._X[i][j] = double(i==j)-2*v[i]*v[j]; - } - } - } - } // END if (Ncont>0) - - - - double msize = std::min(psize*psize,psize); - double rho = psize/msize; - // Normalize directions - for (i=0 ; i<N ; i++){ - - // Fill continous dimensions with rand if necessary - if (domain[i]!=SGTELIB::PARAM_DOMAIN_CONTINUOUS){ - for (j=0 ; j<N ; j++){ - if (domain[j]==SGTELIB::PARAM_DOMAIN_CONTINUOUS){ - D._X[i][j] = 2*uniform_rand()-1; - } - } - } - - // Find max asb - d = 0; - for (j=0 ; j<N ; j++) d = std::max( d , fabs(D._X[i][j]) ); - - // Scale continuous dimensions - for (j=0 ; j<N ; j++){ - if (domain[j]==SGTELIB::PARAM_DOMAIN_CONTINUOUS){ - D._X[i][j] = scaling[j]*msize*SGTELIB::rceil(rho*D._X[i][j]/d); - } - } - - // Add extended POLL for discrete values - if ( (domain[i]==SGTELIB::PARAM_DOMAIN_INTEGER) || - (domain[i]==SGTELIB::PARAM_DOMAIN_BOOL) ){ - D._X[i][i] = (i%2==0)?-1:+1; - } - else if (domain[i]==SGTELIB::PARAM_DOMAIN_CAT){ - D._X[i][i] = SGTELIB::rceil(uniform_rand()*scaling[i]); - } - - } - - - // Add opposite directions and sort - SGTELIB::Matrix POLL("POLL-DIR",2*N,N); - k = 0; - for (i=0 ; i<N ; i++){ - if (domain[i]==SGTELIB::PARAM_DOMAIN_CONTINUOUS){ - POLL.set_row(D.get_row(i),k++); - POLL.set_row(-D.get_row(i),k++); - } - } - for (i=0 ; i<N ; i++){ - if (domain[i]!=SGTELIB::PARAM_DOMAIN_CONTINUOUS){ - POLL.set_row(D.get_row(i),k++); - POLL.set_row(-D.get_row(i),k++); - } - } - - if (k!=2*N){ - std::cout << "k,N : " << k << " " << N << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Unconcistency in the value of k." ); - } - - return POLL; -}// - -/*-------------------------------------------------*/ -/* Swap two rows */ -/*-------------------------------------------------*/ -void SGTELIB::Matrix::swap_rows(const int i1 , const int i2){ - double buffer; - for (int j=0 ; j<_nbCols ; j++){ - buffer = _X[i1][j]; - _X[i1][j] = _X[i2][j]; - _X[i2][j] = buffer; - } -}// - -/*-------------------------------------------------*/ -/* LU inverse */ -/*-------------------------------------------------*/ - -SGTELIB::Matrix SGTELIB::Matrix::lu_inverse ( void ) const { - return lu_inverse(NULL); -} - -SGTELIB::Matrix SGTELIB::Matrix::lu_inverse ( double * det ) const{ - - const int N = _nbRows; - SGTELIB::Matrix A (*this); - - int i,j,k,ip=0; - double pivot,pivot_max; - - // Permuation vector - int * P = new int [N]; - for (i=0 ; i<N ; i++) P[i]=i; - - // LU factorization (in-place) - for (k=0 ; k<N-1 ; k++){ - - // Find pivot - pivot_max = -1; - for (i=k ; i<N ; i++){ - pivot = A._X[k][i]; - if (pivot<0) pivot*=-1; - if (pivot>pivot_max){ - ip = i; - pivot_max = pivot; - } - } - - // Swap rows of A and P - if (ip!=k){ - A.swap_rows(ip,k); - i=P[ip]; P[ip]=P[k]; P[k]=i; - } - - // Gaussian elimination - for (j=k+1 ; j<N ; j++){ - pivot = A._X[j][k]/A._X[k][k]; - A._X[j][k] = pivot; - for (i=k+1 ; i<N ; i++) A._X[j][i] -= pivot*A._X[k][i]; - } - } - - // Construct the whole matrix P (under the name Ai) - SGTELIB::Matrix Ai ("Ai",N,N); - for (i=0 ; i<N; i++) Ai._X[i][P[i]] = 1; - - - - if (det){ - // Compute the determinant of the matrix that is inverted - double v = 1; - // Compute the determinant of U - for (i=0 ; i<N ; i++) v *= A._X[i][i]; - // Comput ethe determinant of P - i = 0; - while (i<N){ - if (P[i]!=i){ - j = P[i]; - P[i] = P[j]; - P[j] = j; - v *= -1; - } - else i++; - } - *det = v; - } - - // Triangular inversion for each column of Ai. - SGTELIB::Matrix y; - for (k=0 ; k<N; k++){ - y = Ai.get_col(k); - - // Tri-L solve - for (i=0 ; i<N ; i++){ - for (j=0 ; j<i ; j++){ - y._X[i][0] -= A._X[i][j]*y._X[j][0]; - } - } - - // Tri-U solve - for (int i=N-1 ; i>=0 ; i--){ - for (int j=i+1 ; j<N ; j++){ - y._X[i][0] -= A._X[i][j]*y._X[j][0]; - } - y._X[i][0] /= A._X[i][i]; - } - - Ai.set_col(y,k); - } - - delete [] P; - - Ai.set_name(_name+"^-1"); - return Ai; - -}// - - - diff --git a/ext/sgtelib/src/Matrix.hpp b/ext/sgtelib/src/Matrix.hpp deleted file mode 100644 index d98c65b..0000000 --- a/ext/sgtelib/src/Matrix.hpp +++ /dev/null @@ -1,401 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_MATRIX__ -#define __SGTELIB_MATRIX__ - -#include <set> -#include <fstream> -#include <vector> -#include <list> -#include <climits> -#include <algorithm> -#include "Surrogate_Utils.hpp" -#include "Exception.hpp" - -namespace SGTELIB { - - - class Matrix { - - private: - - std::string _name; - - int _nbRows; // nbRows x nbCols matrix - int _nbCols; - - double ** _X; - - public: - - // constructor 1: - Matrix ( const std::string & name , - int nbRows , - int nbCols ); - - // constructor 2: - Matrix ( const std::string & name , - int nbRows , - int nbCols , - double ** A ); - - // constructor 3: - Matrix ( const std::string & file_name ); - - // constructor 4: - Matrix ( void ); - - // copy constructor: - Matrix ( const Matrix & ); - - // affectation operator: - Matrix & operator = ( const Matrix & A ); - - //Matrix & operator * ( const Matrix & B); - - - - // destructor: - virtual ~Matrix ( void ); - - // fill the matrix randomly: - void set_random ( double l , double u , bool round = false ); - void fill (double v); - - // add rows: - void add_rows ( const Matrix & X ); - void add_cols ( const Matrix & X ); - void add_row ( const double * row ); - void add_rows ( const int p); // add empty rows - void add_cols ( const int p); // add empty cols - void remove_rows ( const int p); // remove last rows - - // GET methods: - int get_nb_rows ( void ) const { return _nbRows; } - int get_nb_cols ( void ) const { return _nbCols; } - int get_numel ( void ) const { return _nbRows*_nbCols; } - - double get ( const int k ) const; // access to element (k) - double get ( const int i , const int j ) const; // access to element (i,j) - - const double & operator [] ( int k ) const; - double & operator [] ( int k ); - - - - SGTELIB::Matrix get ( const std::list<int> & list_cols , - const std::list<int> & list_rows) const; - - SGTELIB::Matrix get_row (const int i) const; - SGTELIB::Matrix get_col (const int i) const; - - SGTELIB::Matrix get_rows (const std::list<int> & list_rows) const; - SGTELIB::Matrix get_cols (const std::list<int> & list_cols) const; - - SGTELIB::Matrix get_rows (const int i1, const int i2) const; - SGTELIB::Matrix get_cols (const int i1, const int i2) const; - - void swap_rows (const int i1, const int i2); - - - // count the number of different values in column j: - int get_nb_diff_values ( int j ) const; - - // get the constant columns (constant variables): - void get_fix_columns ( std::list<int> & fix_col ) const; - - // check symmetry - bool is_sym ( void ) const; - - // SET methods: - void set_name ( const std::string & name ) { _name = name; } - std::string get_name ( void ) const { return _name; } - - void set (const int i , const int j , const double d ); - void set_row (const SGTELIB::Matrix & T , const int i); // T is row vector - void set_col (const SGTELIB::Matrix & T , const int j); // T is col vector - void set_row (const double v , const int i); // T is row vector - void set_col (const double v , const int j); // T is col vector - - // Permute terms (i1,j1) and (i2,j2) - void permute (const int i1 , const int j1 , const int i2 , const int j2 ); - - // Multiply row - void multiply_row (const double v , const int i); // T is row vector - void multiply_col (const double v , const int j); // T is col vector - - // Inverse - SGTELIB::Matrix SVD_inverse ( void ) const; - - // Inverse the diagonal terms - SGTELIB::Matrix diag_inverse ( void ) const; - - // Build vector from a double* - static SGTELIB::Matrix row_vector ( const double * v, - const int n ); - - static SGTELIB::Matrix col_vector ( const double * v, - const int n ); - - // Transpose - SGTELIB::Matrix transpose ( void ) const; - - // Diag - SGTELIB::Matrix diag (void ) const; - - - // Trace - double trace ( void ) const; - - // Rmse - double rmse ( void ) const; - - // Norm - double norm ( void ) const; - double normsquare ( void ) const; - void normalize_cols ( void ); - - // Sum - double sum ( void ) const; - SGTELIB::Matrix sum ( const int direction ) const; - - // Mean - double mean ( void ) const; - - // Count (number of non null values) - int count ( void ) const; - - - // Product - static SGTELIB::Matrix product ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B); - - static SGTELIB::Matrix product ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B, - const SGTELIB::Matrix & C); - - static SGTELIB::Matrix product ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B, - const SGTELIB::Matrix & C, - const SGTELIB::Matrix & D); - - void product ( const int i , const int j , const double v){ _X[i][j]*=v; }; - - // Subset product, multiply - // the p first rows and q first columns of A - // with the q first rows and r first columns of B. - // Result is a matrix of size p/r. - static SGTELIB::Matrix subset_product (const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B, - int p, - int q, - int r); - - static SGTELIB::Matrix diagA_product ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B); - - static SGTELIB::Matrix diagB_product ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B); - - static SGTELIB::Matrix transposeA_product ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B); - - - static SGTELIB::Matrix hadamard_product ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B); - - static SGTELIB::Matrix hadamard_square ( const SGTELIB::Matrix & A ); - - static SGTELIB::Matrix hadamard_sqrt ( const SGTELIB::Matrix & A ); - - static SGTELIB::Matrix hadamard_power ( const SGTELIB::Matrix & A , - const double e ); - - void hadamard_inverse ( void ); - void hadamard_sqrt ( void ); - void hadamard_square ( void ); - - // Addition - static SGTELIB::Matrix add ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B); - - // Add to the matrix itself - void add ( const SGTELIB::Matrix & B); - void add ( const int i , const int j , const double v){ _X[i][j]+=v; }; - - // Add and fill with 0 (add two matrices of different sizes) - static SGTELIB::Matrix add_fill ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B); - - // Substract - static SGTELIB::Matrix sub ( const SGTELIB::Matrix & A, - const SGTELIB::Matrix & B); - - void sub ( const SGTELIB::Matrix & B); - - // Identity matrix - static SGTELIB::Matrix identity ( const int n ); - - // ones matrix - static SGTELIB::Matrix ones ( const int nbRows , const int nbCols ); - - // random permutation matrix - static SGTELIB::Matrix random_permutation_matrix ( const int n ); - - // Lines random permutation - SGTELIB::Matrix random_line_permutation ( void ) const; - - // Rank of the values - SGTELIB::Matrix rank ( void ) const; - - // Conjugate gradient - static SGTELIB::Matrix conjugate_solve ( const SGTELIB::Matrix & A , - const SGTELIB::Matrix & b , - const SGTELIB::Matrix & x0 , - const double tol); - - // LU factorization - SGTELIB::Matrix lu_inverse ( void ) const; - SGTELIB::Matrix lu_inverse ( double * det ) const; - - // Cholesky - SGTELIB::Matrix cholesky ( void ) const; - SGTELIB::Matrix cholesky_inverse ( double * det ) const; - SGTELIB::Matrix cholesky_inverse ( void ) const; - static SGTELIB::Matrix cholesky_solve ( const SGTELIB::Matrix & A , - const SGTELIB::Matrix & b ); - - - - // Triangular matrix - static SGTELIB::Matrix tril_inverse (const SGTELIB::Matrix & L ); - - static SGTELIB::Matrix triu_solve ( const SGTELIB::Matrix & U , - const SGTELIB::Matrix & b ); - - static SGTELIB::Matrix tril_solve ( const SGTELIB::Matrix & L , - const SGTELIB::Matrix & b ); - // SVD decomposition: - bool SVD_decomposition ( std::string & error_msg , - SGTELIB::Matrix * &MAT_U, // OUT, nbRows x nbCols - SGTELIB::Matrix * &MAT_W, // OUT, nbCols x nbCols, diagonal - SGTELIB::Matrix * &MAT_V, // OUT, nbCols x nbCols - int max_mpn = 1500 ) const; - - bool SVD_decomposition ( std::string & error_msg , - double ** U , // OUT, nbRows x nbCols - double * W , // OUT, nbCols x nbCols, diagonal - double ** V , // OUT, nbCols x nbCols - int max_mpn = 1500 ) const; - - // Projection matrix for linear over-determined models - static SGTELIB::Matrix get_matrix_P ( const SGTELIB::Matrix & Ai, - const SGTELIB::Matrix & H ); - - static double get_trace_P ( const SGTELIB::Matrix & Ai, - const SGTELIB::Matrix & H ); - - static SGTELIB::Matrix get_matrix_PZs ( const SGTELIB::Matrix & Ai, - const SGTELIB::Matrix & H , - const SGTELIB::Matrix & Zs); - - static SGTELIB::Matrix get_matrix_dPiPZs( const SGTELIB::Matrix & Ai, - const SGTELIB::Matrix & H , - const SGTELIB::Matrix & Zs); - - static SGTELIB::Matrix get_matrix_dPiPZs( const SGTELIB::Matrix & Ai, - const SGTELIB::Matrix & H , - const SGTELIB::Matrix & Zs , - const SGTELIB::Matrix & ALPHA); - - - static SGTELIB::Matrix get_matrix_dPi ( const SGTELIB::Matrix & Ai, - const SGTELIB::Matrix & H ); - - // Min / Max - double max (void); - double min (void); - static SGTELIB::Matrix max ( const SGTELIB::Matrix & A , - const SGTELIB::Matrix & B ); - static SGTELIB::Matrix min ( const SGTELIB::Matrix & A , - const SGTELIB::Matrix & B ); - - // Get min index - int get_max_index ( void ); - int get_min_index ( void ); - int get_min_index_row ( const int i ); - int get_min_index_col ( const int j ); - - // display: - void display ( std::ostream & out ) const; - void display_short( std::ostream & out ) const; - void write ( const std::string & file_name ) const; - void display_size ( std::ostream & out ) const; - - // import data in plain format - static SGTELIB::Matrix import_data ( const std::string & file_name ); - static SGTELIB::Matrix string_to_matrix ( std::string s ); - static SGTELIB::Matrix string_to_row ( const std::string & s , int nbCols = 0 ); - - // distances - static SGTELIB::Matrix get_distances_norm1 ( const SGTELIB::Matrix & A , - const SGTELIB::Matrix & B ); - static SGTELIB::Matrix get_distances_norm2 ( const SGTELIB::Matrix & A , - const SGTELIB::Matrix & B ); - static SGTELIB::Matrix get_distances_norminf ( const SGTELIB::Matrix & A , - const SGTELIB::Matrix & B ); - - int find_row (SGTELIB::Matrix & R); - - // nan - bool has_nan (void) const; - bool has_inf (void) const; - void replace_nan (double d); - - // Generate poll directions - static SGTELIB::Matrix get_poll_directions ( const SGTELIB::Matrix scaling, - const SGTELIB::param_domain_t * domain, - double psize ); - - - SGTELIB::Matrix LUPinverse (void); - - }; -} - -SGTELIB::Matrix operator * (const SGTELIB::Matrix & A , const double v ); -SGTELIB::Matrix operator * (const double v , const SGTELIB::Matrix & A); -SGTELIB::Matrix operator * (const SGTELIB::Matrix & A , const SGTELIB::Matrix & B); -SGTELIB::Matrix operator + (const SGTELIB::Matrix & A , const SGTELIB::Matrix & B); -SGTELIB::Matrix operator + (const SGTELIB::Matrix & A , const double v ); -SGTELIB::Matrix operator + (const double v , const SGTELIB::Matrix & A); -SGTELIB::Matrix operator - (const SGTELIB::Matrix & A , const SGTELIB::Matrix & B); -SGTELIB::Matrix operator - (const SGTELIB::Matrix & A , const double v); -SGTELIB::Matrix operator - (const double v , const SGTELIB::Matrix & A); -SGTELIB::Matrix operator - (const SGTELIB::Matrix & A); -SGTELIB::Matrix operator / (const SGTELIB::Matrix & A , const double v ); - -#endif diff --git a/ext/sgtelib/src/Surrogate.cpp b/ext/sgtelib/src/Surrogate.cpp deleted file mode 100644 index 008a894..0000000 --- a/ext/sgtelib/src/Surrogate.cpp +++ /dev/null @@ -1,1664 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "Surrogate.hpp" - -using namespace SGTELIB; - -/*--------------------------------------*/ -/* constructor */ -/*--------------------------------------*/ - -SGTELIB::Surrogate::Surrogate ( SGTELIB::TrainingSet & trainingset, - const SGTELIB::Surrogate_Parameters param) : - _trainingset ( trainingset ) , - _param ( param ) , - _n (_trainingset.get_input_dim() ) , - _m (_trainingset.get_output_dim() ) , - _p_ts (0 ) , - _p_ts_old (999999999 ) , - _p (0 ) , - _p_old (999999999 ) , - _ready (false ) , - _Zhs (NULL ) , - _Shs (NULL ) , - _Zvs (NULL ) , - _Svs (NULL ) , - _selected_points (1,-1 ) , - _metric_emax (NULL ) , - _metric_emaxcv (NULL ) , - _metric_rmse (NULL ) , - _metric_rmsecv (NULL ) , - _metric_oe (NULL ) , - _metric_oecv (NULL ) , - _metric_linv (NULL ) , - _metric_aoe (-1.0 ) , - _metric_aoecv (-1.0 ) , - _metric_armse (-1.0 ) , - _metric_armsecv (-1.0 ) , - _psize_max ( 0.5 ) , - _out ( ) , - _display ( false ) {; -}// - - -SGTELIB::Surrogate::Surrogate ( SGTELIB::TrainingSet & trainingset, - const SGTELIB::model_t mt ) : - _trainingset ( trainingset ) , - _param ( mt ) , - _n (_trainingset.get_input_dim() ) , - _m (_trainingset.get_output_dim() ) , - _p_ts (0 ) , - _p_ts_old (999999999 ) , - _p (0 ) , - _p_old (999999999 ) , - _ready (false ) , - _Zhs (NULL ) , - _Shs (NULL ) , - _Zvs (NULL ) , - _Svs (NULL ) , - _selected_points (1,-1 ) , - _metric_emax (NULL ) , - _metric_emaxcv (NULL ) , - _metric_rmse (NULL ) , - _metric_rmsecv (NULL ) , - _metric_oe (NULL ) , - _metric_oecv (NULL ) , - _metric_linv (NULL ) , - _metric_aoe (-1.0 ) , - _metric_aoecv (-1.0 ) , - _metric_efioe (-1.0 ) , - _metric_efioecv (-1.0 ) , - _metric_armse (-1.0 ) , - _metric_armsecv (-1.0 ) , - _psize_max ( 0.5 ) , - _out ( ) , - _display ( false ) { -}// - -SGTELIB::Surrogate::Surrogate ( SGTELIB::TrainingSet & trainingset, - const std::string & s) : - _trainingset ( trainingset ) , - _param ( s ) , - _n (_trainingset.get_input_dim() ) , - _m (_trainingset.get_output_dim() ) , - _p_ts (0 ) , - _p_ts_old (0 ) , - _p (0 ) , - _p_old (0 ) , - _ready (false ) , - _Zhs (NULL ) , - _Shs (NULL ) , - _Zvs (NULL ) , - _Svs (NULL ) , - _selected_points (1,-1 ) , - _metric_emax (NULL ) , - _metric_emaxcv (NULL ) , - _metric_rmse (NULL ) , - _metric_rmsecv (NULL ) , - _metric_oe (NULL ) , - _metric_oecv (NULL ) , - _metric_linv (NULL ) , - _metric_aoe (-1.0 ) , - _metric_aoecv (-1.0 ) , - _metric_efioe (-1.0 ) , - _metric_efioecv (-1.0 ) , - _metric_armse (-1.0 ) , - _metric_armsecv (-1.0 ) , - _psize_max ( 0.5 ) , - _out ( ) , - _display ( false ) { -}// - - -/*--------------------------------------*/ -/* destructor */ -/*--------------------------------------*/ -SGTELIB::Surrogate::~Surrogate ( void ) { - reset_metrics(); -}// - - -void SGTELIB::Surrogate::info ( void ) const { - _trainingset.info(); -}// - - -/*--------------------------------------*/ -/* display */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::display ( std::ostream & out ) const { - out << "Surrogate: " << get_string() << "\n"; - out << "ready: " << _ready << "\n"; - out << "n: " << _n << " (input dim)\n"; - out << "m: " << _m << " (output dim)\n"; - out << "p: " << _p << " (nb points)\n"; - display_private ( out ); -}// - -/*--------------------------------------*/ -/* erase_data */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::reset_metrics ( void ) { - #ifdef SGTELIB_DEBUG - std::cout << "Surrogate: reset_metrics..."; - #endif - - if (_Zhs) delete _Zhs; - _Zhs = NULL; - - if (_Shs) delete _Shs; - _Shs = NULL; - - if (_Zvs) delete _Zvs; - _Zvs = NULL; - - if (_Svs) delete _Svs; - _Svs = NULL; - - if (_metric_emax) delete [] _metric_emax; - _metric_emax = NULL; - - if (_metric_emaxcv) delete [] _metric_emaxcv; - _metric_emaxcv = NULL; - - if (_metric_rmse) delete [] _metric_rmse; - _metric_rmse = NULL; - - if (_metric_rmsecv) delete [] _metric_rmsecv; - _metric_rmsecv = NULL; - - if (_metric_oe) delete [] _metric_oe; - _metric_oe = NULL; - - if (_metric_oecv) delete [] _metric_oecv; - _metric_oecv = NULL; - - if (_metric_linv) delete [] _metric_linv; - _metric_linv = NULL; - - _metric_aoe = -1.0; - _metric_aoecv = -1.0; - _metric_efioe = -1.0; - _metric_efioecv = -1.0; - _metric_armse = -1.0; - _metric_armsecv = -1.0; - - #ifdef SGTELIB_DEBUG - std::cout << "OK\n"; - #endif -}// - -/*--------------------------------------*/ -/* build */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate::build ( void ) { - - #ifdef SGTELIB_DEBUG - std::cout << "Surrogate build - BEGIN\n"; - #endif - - if (streqi(_param.get_output(),"NULL")){ - _display = false; - } - else{ - _display = true; - } - - // Check the parameters of the model: - _param.check(); - - // Before building the surrogate, the trainingset must be ready - _trainingset.build(); - - // Number of points in the training set. - _p_ts = _trainingset.get_nb_points(); - //std::cout << _ready << " " << _p_ts << " " << _p_ts_old << "\n"; - if ( (_ready) && (_p_ts==_p_ts_old) ){ - #ifdef SGTELIB_DEBUG - std::cout << "Surrogate build - SKIP Build\n"; - #endif - return true; - } - - // Otherwise, the model is not ready and we need to call build_private - _ready = false; - - - // Get the number of points used in the surrogate - if ( (_selected_points.size()==1) && (_selected_points.front()==-1) ) - _p = _p_ts; - else - _p = static_cast<int>(_selected_points.size()); - - // Need at least 2 point to build a surrogate. - if (_p<2){ - return false; - } - - // Delete the intermediate data and metrics - // (they will have to be recomputed...) - reset_metrics(); - - // If there are new points, - // Call to the private build - #ifdef SGTELIB_DEBUG - std::cout << "Surrogate build - BUILD_PRIVATE\n"; - #endif - - bool ok; - ok = init_private(); - if ( ! ok) return false; - - // Optimize parameters - if (_param.get_nb_parameter_optimization()>0){ - ok = optimize_parameters(); - if ( ! ok){ - _ready = false; - return false; - } - } - - // Build private - ok = build_private(); - if ( ! ok){ - _ready = false; - return false; - } - - - // Memorize previous number of points - _p_ts_old = _p_ts; - _p_old = _p; - - #ifdef SGTELIB_DEBUG - std::cout << "Surrogate build - END\n"; - #endif - - if (_display){ - _out.open(_param.get_output().c_str() , std::ios::out | std::ios::app); - if (_out.fail()) std::cout << "Out.fail1!!!\n"; - std::cout << "Write in " << _param.get_output() << "\n"; - if (_out.fail()) std::cout << "Out.fail2!!!\n"; - display(_out); - if (_out.fail()) std::cout << "Out.fail3!!!\n"; - //_out << "AOECV: " << get_metric(SGTELIB::METRIC_AOECV,0) << "\n"; - //_out << "ARMSECV: " << get_metric(SGTELIB::METRIC_ARMSECV,0) << "\n"; - _out.close(); - } - - - _ready = true; - return true; -}// - -bool SGTELIB::Surrogate::init_private (void) { - // Empty initialization function - #ifdef SGTELIB_DEBUG - std::cout << model_type_to_str(get_type()) << " : init_private\n"; - #endif - return true; -} - - -/*--------------------------------------*/ -/* check_ready */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::check_ready (void) const { - check_ready(""); -}// - -/*--------------------------------------*/ -void SGTELIB::Surrogate::check_ready (const std::string & file, - const std::string & function, - const int & i ) const { - check_ready(file+"::"+function+"::"+itos(i)); -}// -/*--------------------------------------*/ -void SGTELIB::Surrogate::check_ready (const std::string & s) const { - - // Check the tag _ready - if ( ! _ready){ - display(std::cout); - std::cout << "Surrogate: NOT READY! (" << s << ")\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "check_ready(): Not ready!" ); - } - - // Check if the trainingset is ready - _trainingset.check_ready("From Surrogate ()"); - - - // Check the new number of points in the trainingset - if (_trainingset.get_nb_points()>_p_ts){ - display(std::cout); - std::cout << "Surrogate: NOT READY! (" << s << ")\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "check_ready(): Not ready!" ); - } - -}// - - -/*--------------------------------------*/ -/* add points */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate::add_points ( const SGTELIB::Matrix & Xnew , - const SGTELIB::Matrix & Znew ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "add_points: forbiden." ); - return _trainingset.add_points(Xnew,Znew); -}// -/*--------------------------------------*/ -bool SGTELIB::Surrogate::add_point ( const double * xnew , - const double * znew ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "add_point: forbiden." ); - return _trainingset.add_point(xnew,znew); -}// - - -/*--------------------------------------*/ -/* predict */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::predict ( const SGTELIB::Matrix & XX , - SGTELIB::Matrix * ZZ , - SGTELIB::Matrix * std, - SGTELIB::Matrix * ei , - SGTELIB::Matrix * cdf) { - - check_ready(__FILE__,__FUNCTION__,__LINE__); - - //std::cout << "IN PREDICT (public) " << __FILE__ << " " << ZZ << " " << std << " " << ei << " " << cdf << "\n"; - - // Check the number of columns in XX - if (XX.get_nb_cols() != _n){ - display(std::cout); - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "predict(): dimension error" ); - } - - *ZZ = SGTELIB::Matrix("ZZ",XX.get_nb_rows(),_m); - - // Scale the input - SGTELIB::Matrix XXs(XX); - XXs.set_name("XXs"); - _trainingset.X_scale(XXs); - - if (ei){ - ei->fill(-INF); - } - - // Call the private prediction with normalize input XXs - predict_private( XXs , ZZ , std , ei , cdf ); - - // If nbdiff==1, put the values to 0.0 - int pxx = XX.get_nb_rows(); - if (ZZ){ - for (int j=0 ; j<_m ; j++){ - if (_trainingset.get_Z_nbdiff(j)==1){ - for (int i=0 ; i<pxx ; i++){ - ZZ->set(i,j,0.0); - } - } - } - } - - - #ifdef SGTELIB_DEBUG - if (ZZ){ - if (ZZ->has_nan()){ - ZZ->replace_nan (+INF); - } - } - if (std){ - if (std->has_nan()){ - display(std::cout); - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "predict(): std has nan" ); - } - } - if (ei){ - if (ei->has_nan()){ - display(std::cout); - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "predict(): ei has nan" ); - } - } - if (cdf){ - if (cdf->has_nan()){ - display(std::cout); - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "predict(): cdf has nan" ); - } - } - #endif - - ZZ->replace_nan (+INF); - std->replace_nan (+INF); - ei->replace_nan (-INF); - cdf->replace_nan (0); - - // UnScale the output - if (ZZ ){ - ZZ->set_name("ZZ"); - _trainingset.Z_unscale(ZZ); - } - if (std){ - std->set_name("std"); - _trainingset.ZE_unscale(std); - } - if (ei ){ - ei->set_name("ei"); - _trainingset.ZE_unscale(ei); - // ei is only computed for the OBJ output, so the other values are dummy, - // So we put them all to 0. - for (int j=0 ; j<_m ; j++){ - if (_trainingset.get_bbo(j)!=SGTELIB::BBO_OBJ){ - for (int i=0 ; i<pxx ; i++){ - ei->set(i,j,0.0); - } - } - } - } - if (cdf){ - cdf->set_name("cdf"); - } - - -}// - - - -/*--------------------------------------*/ -/* predict (ZZs,std,ei) */ -/*--------------------------------------*/ -// This function is the default method to compute std, ei and cdf. -// It can be overloaded, but models PRS, RBF and KS use the default method. -// This method relies on the private method predict_private(XXs,ZZs) -// which HAS TO be overloaded (pure virtual) -void SGTELIB::Surrogate::predict_private (const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs, - SGTELIB::Matrix * std, - SGTELIB::Matrix * ei , - SGTELIB::Matrix * cdf) { - check_ready(__FILE__,__FUNCTION__,__LINE__); - - - const int pxx = XXs.get_nb_rows(); - const double fs_min = _trainingset.get_fs_min(); - int i,j; - - // Prediction of ZZs - if ( (ZZs) || (ei) || (cdf) ){ - predict_private(XXs,ZZs); - } - - // Prediction of statistical data - if ( (std) || (ei) || (cdf) ){ - - if (std) std->fill(-SGTELIB::INF); - else std = new SGTELIB::Matrix("std",pxx,_m); - - if (ei) ei->fill(-SGTELIB::INF); - if (cdf) cdf->fill(-SGTELIB::INF); - - // Use distance to closest as std - SGTELIB::Matrix dtc = _trainingset.get_distance_to_closest(XXs); - dtc.set_name("dtc"); - compute_metric_rmse(); - - for (j=0 ; j<_m ; j++){ - // Set std - double s = _metric_rmse[j]; - std->set_col( dtc+s , j ); - - if (_trainingset.get_bbo(j)==SGTELIB::BBO_OBJ){ - // Compute CDF - if (cdf){ - for (i=0 ; i<pxx ; i++){ - cdf->set(i,j, normcdf( fs_min , ZZs->get(i,j) , std->get(i,j) ) ); - } - } - if (ei){ - for (i=0 ; i<pxx ; i++){ - ei->set(i,j, normei( ZZs->get(i,j) , std->get(i,j) , fs_min ) ); - } - } - }// END CASE OBJ - else if (_trainingset.get_bbo(j)==SGTELIB::BBO_CON){ - // Compute CDF - if (cdf){ - // Scaled Feasibility Threshold - double cs = _trainingset.Z_scale(0.0,j); - for (i=0 ; i<pxx ; i++){ - cdf->set(i,j, normcdf( cs , ZZs->get(i,j) , std->get(i,j) ) ); - } - } - }// END CASE CON - - }// End for j - - } -}// - - - - - - -/*--------------------------------------*/ -/* predict */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::predict ( const SGTELIB::Matrix & XX , - SGTELIB::Matrix * ZZ ) { - - check_ready(__FILE__,__FUNCTION__,__LINE__); - - - - // Check the number of columns in XX - if (XX.get_nb_cols() != _n){ - display(std::cout); - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "predict(): dimension error" ); - } - *ZZ = SGTELIB::Matrix("ZZ",XX.get_nb_rows(),_m); - - // Scale the input - SGTELIB::Matrix XXs(XX); - _trainingset.X_scale(XXs); - - - // Call the private prediction with normalize input XXs - predict_private( XXs , ZZ ); - #ifdef SGTELIB_DEBUG - if (ZZ->has_nan()){ - display(std::cout); - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "predict(): ZZ has nan" ); - } - #endif - - // UnScale the output - _trainingset.Z_unscale(ZZ); - -}// - -/*--------------------------------------*/ -/* get metric (general) */ -/*--------------------------------------*/ -double SGTELIB::Surrogate::get_metric (SGTELIB::metric_t mt , int j){ - - // Check dimension - if ( (j<0) || (j>_m) ){ - display(std::cout); - std::cout << "j = "<< j << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "get_metric(): dimension error" ); - } - - // If the model is not ready, return +INF - if ( ! _ready){ - #ifdef SGTELIB_DEBUG - std::cout << get_string() << " is not ready => _metric = +INF\n"; - #endif - return SGTELIB::INF; - } - - double m; - switch(mt){ - case SGTELIB::METRIC_EMAX : - compute_metric_emax(); - m = _trainingset.ZE_unscale( _metric_emax[j] , j ); - break; - case SGTELIB::METRIC_EMAXCV : - compute_metric_emaxcv(); - m = _trainingset.ZE_unscale( _metric_emaxcv[j] , j ); - break; - case SGTELIB::METRIC_RMSE : - compute_metric_rmse(); - m = _trainingset.ZE_unscale( _metric_rmse[j] , j ); - break; - case SGTELIB::METRIC_RMSECV: - compute_metric_rmsecv(); - m = _trainingset.ZE_unscale( _metric_rmsecv[j] , j ); - break; - case SGTELIB::METRIC_ARMSE : - compute_metric_armse(); - m = _metric_armse; - break; - case SGTELIB::METRIC_ARMSECV : - compute_metric_armsecv(); - m = _metric_armsecv; - break; - case SGTELIB::METRIC_OE : - compute_metric_oe(); - m = _metric_oe[j]; - break; - case SGTELIB::METRIC_OECV : - compute_metric_oecv(); - m = _metric_oecv[j]; - break; - case SGTELIB::METRIC_LINV : - compute_metric_linv(); - m = _metric_linv[j]; - break; - case SGTELIB::METRIC_AOE : - compute_metric_aoe(); - m = _metric_aoe; - break; - case SGTELIB::METRIC_AOECV : - compute_metric_aoecv(); - m = _metric_aoecv; - break; - case SGTELIB::METRIC_EFIOE : - compute_metric_efioe(); - m = _metric_efioe; - break; - case SGTELIB::METRIC_EFIOECV : - compute_metric_efioecv(); - m = _metric_efioecv; - break; - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "get_metric(): unknown metric" ); - } - - if (isnan(m) ){ m = SGTELIB::INF; } - if (m < -EPSILON){ m = SGTELIB::INF; } - if (m <= 0.0 ){ m = 0.0; } - return m; -}// - - -/*---------------------------------------*/ -/* compute matrix Zhs */ -/* Zhs is the prediction on the training */ -/* points */ -/*---------------------------------------*/ -const SGTELIB::Matrix * SGTELIB::Surrogate::get_matrix_Zhs (void){ - if ( ! _Zhs){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - - //#ifdef SGTELIB_DEBUG - //#endif - // Init - _Zhs = new SGTELIB::Matrix("Zhs",_p,_m); - //call the predict function on the training points - predict_private (get_matrix_Xs(),_Zhs); - _Zhs->replace_nan(+INF); - _Zhs->set_name("Zhs"); - } - return _Zhs; -}// - - -/*--------------------------------------*/ -/* compute matrix Shs */ -/* (Compute the predictive std) */ -/*--------------------------------------*/ -const SGTELIB::Matrix * SGTELIB::Surrogate::get_matrix_Shs (void){ - if ( ! _Shs){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - - #ifdef SGTELIB_DEBUG - std::cout << "Compute _Shs\n"; - #endif - // Init - _Shs = new SGTELIB::Matrix("Shs",_p,_m); - //call the predict function on the training points - predict_private (get_matrix_Xs(),NULL,_Shs,NULL,NULL); - _Shs->replace_nan(+INF); - _Shs->set_name("Shs"); - } - return _Shs; -}// - -// If no specific method is defined, consider Svs = Shs. -const SGTELIB::Matrix * SGTELIB::Surrogate::get_matrix_Svs (void){ - if ( ! _Svs){ - _Svs = new SGTELIB::Matrix("Svs",_p,_m); - const SGTELIB::Matrix Ds = _trainingset.get_matrix_Ds(); - for (int i=0 ; i<_p ; i++){ - double dmin = +INF; - for (int j=0 ; j<_p ; j++){ - if (i!=j){ - dmin = std::min(dmin,Ds.get(i,j)); - } - } - _Svs->set_row(dmin,i); - } - } - return _Svs; -}// - - - -/*--------------------------------------*/ -/* get_Xs */ -/*--------------------------------------*/ -const SGTELIB::Matrix SGTELIB::Surrogate::get_matrix_Xs (void){ - _trainingset.build(); - return _trainingset.get_matrix_Xs().get_rows(_selected_points); -}// - - -/*--------------------------------------*/ -/* get_Zs */ -/*--------------------------------------*/ -const SGTELIB::Matrix SGTELIB::Surrogate::get_matrix_Zs (void){ - _trainingset.build(); - return _trainingset.get_matrix_Zs().get_rows(_selected_points); -}// - - -/*--------------------------------------*/ -/* get_Ds */ -/*--------------------------------------*/ -const SGTELIB::Matrix SGTELIB::Surrogate::get_matrix_Ds (void){ - _trainingset.build(); - return _trainingset.get_matrix_Ds().get( _selected_points , _selected_points ); -}// - - -/*--------------------------------------*/ -/* get_Zv */ -/*--------------------------------------*/ -const SGTELIB::Matrix SGTELIB::Surrogate::get_matrix_Zv (void){ - // Return unscaled matrix Zv - check_ready(__FILE__,__FUNCTION__,__LINE__); - SGTELIB::Matrix Zv (*get_matrix_Zvs()); // Get scaled matrix - _trainingset.Z_unscale(&Zv); // Unscale - return Zv; // Return unscaled -}// - - -/*--------------------------------------*/ -/* get_Zh */ -/*--------------------------------------*/ -const SGTELIB::Matrix SGTELIB::Surrogate::get_matrix_Zh (void){ - // Return unscaled matrix Zh - check_ready(__FILE__,__FUNCTION__,__LINE__); - SGTELIB::Matrix Zh (*get_matrix_Zhs()); // Get scaled matrix - _trainingset.Z_unscale(&Zh); // Unscale - return Zh; // Return unscaled -}// - - -/*--------------------------------------*/ -/* get_Sh */ -/*--------------------------------------*/ -const SGTELIB::Matrix SGTELIB::Surrogate::get_matrix_Sh (void){ - // Return unscaled matrix Shs - check_ready(__FILE__,__FUNCTION__,__LINE__); - SGTELIB::Matrix Sh = (*get_matrix_Shs()); - _trainingset.ZE_unscale(&Sh); // Unscale - return Sh; // Return unscaled -}// - -/*--------------------------------------*/ -/* get_Sh */ -/*--------------------------------------*/ -const SGTELIB::Matrix SGTELIB::Surrogate::get_matrix_Sv (void){ - // Return unscaled matrix Zh - check_ready(__FILE__,__FUNCTION__,__LINE__); - SGTELIB::Matrix Sv (*get_matrix_Svs()); // Get scaled matrix - _trainingset.ZE_unscale(&Sv); // Unscale - return Sv; // Return unscaled -}// - - -/*--------------------------------------*/ -/* compute rmsecv */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::compute_metric_rmsecv (void){ - check_ready(); - if ( ! _metric_rmsecv){ - // Init - _metric_rmsecv = new double [_m]; - - // Call to the method of the derivated class to - // compute Zv - - int i,j; - double e; - const SGTELIB::Matrix Zs = get_matrix_Zs(); - const SGTELIB::Matrix * Zvs = get_matrix_Zvs(); - - // Loop on the outputs - for (j=0 ; j<_m ; j++){ - // Compute the error for output j - e = 0; - for (i=0 ; i<_p ; i++){ - e += pow(Zs.get(i,j)-Zvs->get(i,j),2); - } - _metric_rmsecv[j] = sqrt(e/_p); - } - } -}// - -/*--------------------------------------*/ -/* compute emax */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::compute_metric_emax (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - if ( ! _metric_emax){ - #ifdef SGTELIB_DEBUG - std::cout << "Compute _metric_emax\n"; - #endif - // Init - _metric_emax = new double [_m]; - - int i,j; - double e; - const SGTELIB::Matrix Zs = get_matrix_Zs(); - const SGTELIB::Matrix * Zhs = get_matrix_Zhs(); - // Loop on the outputs - for (j=0 ; j<_m ; j++){ - // Compute the error for output j - e = 0; - for (i=0 ; i<_p ; i++){ - e = std::max( e , fabs( Zs.get(i,j)-Zhs->get(i,j) ) ); - } - _metric_emax[j] = e; - } - } - - #ifdef SGTELIB_DEBUG - std::cout << "metric_emax: " ; - for (int j=0 ; j<_m ; j++){ - std::cout << _metric_emax[j] << " "; - } - std::cout << "\n"; - #endif -}// - - -/*--------------------------------------*/ -/* compute emaxcv */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::compute_metric_emaxcv (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - if ( ! _metric_emaxcv){ - #ifdef SGTELIB_DEBUG - std::cout << "Compute _metric_emaxcv\n"; - #endif - // Init - _metric_emaxcv = new double [_m]; - - int i,j; - double e; - const SGTELIB::Matrix Zs = get_matrix_Zs(); - const SGTELIB::Matrix * Zvs = get_matrix_Zvs(); - // Loop on the outputs - for (j=0 ; j<_m ; j++){ - // Compute the error for output j - e = 0; - for (i=0 ; i<_p ; i++){ - e = std::max( e , fabs( Zs.get(i,j)-Zvs->get(i,j) ) ); - } - _metric_emaxcv[j] = e; - } - } - - #ifdef SGTELIB_DEBUG - std::cout << "metric_emaxcv: " ; - for (int j=0 ; j<_m ; j++){ - std::cout << _metric_emaxcv[j] << " "; - } - std::cout << "\n"; - #endif - -}// - -/*--------------------------------------*/ -/* compute rmse */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::compute_metric_rmse (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - if ( ! _metric_rmse){ - #ifdef SGTELIB_DEBUG - std::cout << "Compute _metric_rmse\n"; - #endif - // Init - _metric_rmse = new double [_m]; - - int i,j; - double e; - const SGTELIB::Matrix Zs = get_matrix_Zs(); - const SGTELIB::Matrix * Zhs = get_matrix_Zhs(); - // Loop on the outputs - for (j=0 ; j<_m ; j++){ - // Compute the error for output j - e = 0; - for (i=0 ; i<_p ; i++){ - e += pow(Zs.get(i,j)-Zhs->get(i,j),2); - } - _metric_rmse[j] = sqrt(e/_p); - } - } - - #ifdef SGTELIB_DEBUG - std::cout << "metric_rmse: " ; - for (int j=0 ; j<_m ; j++){ - std::cout << _metric_rmse[j] << " "; - } - std::cout << "\n"; - #endif - -}// - - - - -/*--------------------------------------*/ -/* compute oe */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::compute_metric_oe (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - if ( ! _metric_oe){ - #ifdef SGTELIB_DEBUG - std::cout << "Compute _metric_oe\n"; - #endif - // Init - _metric_oe = new double [_m]; - // Compute the prediction on the training points - const SGTELIB::Matrix * Zhs = get_matrix_Zhs(); - // Compute the order-efficiency metric using the matrix Zh - // nb: oe => use matrix _Z - // oecv => use matrix _Zv - compute_order_error(Zhs,_metric_oe); - } -}// - -/*--------------------------------------*/ -/* compute oecv */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::compute_metric_oecv (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - if ( ! _metric_oecv){ - #ifdef SGTELIB_DEBUG - std::cout << "Compute _metric_oecv\n"; - #endif - // Init - _metric_oecv = new double [_m]; - // Compute the prediction on the training points - const SGTELIB::Matrix * Zvs = get_matrix_Zvs(); - // Compute the order-efficiency metric using the matrix Zh - // nb: oe => use matrix _Z - // oecv => use matrix _Zv - compute_order_error(Zvs,_metric_oecv); - } -}// - - - -/*--------------------------------------*/ -/* compute aoe */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::compute_metric_aoe (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - if (_metric_aoe<0){ - #ifdef SGTELIB_DEBUG - std::cout << "Compute _metric_aoe\n"; - #endif - // Compute the prediction on the training points - const SGTELIB::Matrix * Zhs = get_matrix_Zhs(); - _metric_aoe = compute_aggregate_order_error(Zhs); - } -}// - - -/*--------------------------------------*/ -/* compute aoecv */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::compute_metric_aoecv (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - if (_metric_aoecv<0){ - #ifdef SGTELIB_DEBUG - std::cout << "Compute _metric_aoecv\n"; - #endif - // Compute the prediction on the training points - const SGTELIB::Matrix * Zvs = get_matrix_Zvs(); - _metric_aoecv = compute_aggregate_order_error(Zvs); - } -}// - - -/*--------------------------------------*/ -/* compute efioe */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::compute_metric_efioe (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - if (_metric_efioe<0){ - #ifdef SGTELIB_DEBUG - std::cout << "Compute _metric_efioe\n"; - #endif - SGTELIB::Matrix * EFI = new SGTELIB::Matrix("EFI",_p,_m); - EFI->fill(-1); - EFI->set_col(compute_efi(*get_matrix_Zhs(),*get_matrix_Shs()),_trainingset.get_j_obj()); - _metric_efioecv = compute_aggregate_order_error(EFI); - delete EFI; - } -}// - -/*--------------------------------------*/ -/* compute efioecv */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::compute_metric_efioecv (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - if (_metric_efioecv<0){ - #ifdef SGTELIB_DEBUG - std::cout << "Compute _metric_efioe\n"; - #endif - SGTELIB::Matrix * EFI = new SGTELIB::Matrix("EFI",_p,_m); - EFI->fill(-1); - EFI->set_col(compute_efi(*get_matrix_Zvs(),*get_matrix_Svs()),_trainingset.get_j_obj()); - _metric_efioecv = compute_aggregate_order_error(EFI); - delete EFI; - } -}// - - -/*----------------------------------------------------------*/ -/* compute EFI from the predictive mean and std */ -/*----------------------------------------------------------*/ -SGTELIB::Matrix SGTELIB::Surrogate::compute_efi( const SGTELIB::Matrix Zs, - const SGTELIB::Matrix Ss ){ - - const int p = Zs.get_nb_rows(); - if (Zs.get_nb_cols()!=_m) throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Unconsistent nb of cols" ); - - const SGTELIB::Matrix Z = _trainingset.Z_unscale(Zs); - const SGTELIB::Matrix S = _trainingset.ZE_unscale(Ss); - const double fmin = _trainingset.get_f_min(); - - SGTELIB::Matrix EFI ("EFI",p,1); - EFI.fill(1.0); - double v; - - for (int j=0 ; j<_m ; j++){ - if (_trainingset.get_bbo(j)==SGTELIB::BBO_OBJ){ - for (int i=0 ; i<p ; i++){ - v = SGTELIB::normei( Z.get(i,j) , S.get(i,j) , fmin ); - EFI.product(i,0,v); - } - } - if (_trainingset.get_bbo(j)==SGTELIB::BBO_CON){ - for (int i=0 ; i<p ; i++){ - v = SGTELIB::normcdf( 0.0 , Z.get(i,j) , S.get(i,j) ); - EFI.product(i,0,v); - } - } - }// end loop on j - - return EFI; - -}// - - - - - -/*--------------------------------------*/ -/* compute armse */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::compute_metric_armse (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - if (_metric_armse<0){ - #ifdef SGTELIB_DEBUG - std::cout << "Compute _metric_armse\n"; - #endif - compute_metric_rmse(); - _metric_armse = 0; - for (int j=0 ; j<_m ; j++) _metric_armse += _metric_rmse[j]; - } -}// - - -/*--------------------------------------*/ -/* compute armsecv */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::compute_metric_armsecv (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - if (_metric_armsecv<0){ - #ifdef SGTELIB_DEBUG - std::cout << "Compute _metric_armsecv\n"; - #endif - compute_metric_rmsecv(); - _metric_armsecv = 0; - for (int j=0 ; j<_m ; j++) _metric_armsecv += _metric_rmsecv[j]; - } -}// - -/*--------------------------------------*/ -/* compute linv */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::compute_metric_linv (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - if ( ! _metric_linv){ - #ifdef SGTELIB_DEBUG - std::cout << "Compute _metric_linv\n"; - #endif - // Init - _metric_linv = new double [_m]; - - // Compute the prediction on the training points - const SGTELIB::Matrix * Zhs = get_matrix_Zhs(); - const SGTELIB::Matrix * Shs = get_matrix_Shs(); - // True values - const SGTELIB::Matrix Zs = get_matrix_Zs(); - double s,dz; - double linv; - // TODO : improve the behavior of linv for very small s. - for (int j=0 ; j<_m ; j++){ - if (_trainingset.get_bbo(j)!=SGTELIB::BBO_DUM){ - linv = 0; - for (int i=0 ; i<_p ; i++){ - dz = Zhs->get(i,j)-Zs.get(i,j); - s = Shs->get(i,j); - s = std::max(s ,EPSILON); - dz= std::max(dz,EPSILON); - linv += -log(s) - pow(dz/s,2)/2; - } - linv /= _p; // normalization by the number of points - linv -= 0.5*log(2*3.141592654); // add the normal pdf constant - // Add this point, we have log(prod g)/p - linv = exp(-linv); - _metric_linv[j] = linv; - } - else{ - _metric_linv[j] = -SGTELIB::INF; - } - } - } - -}// - - - -/*--------------------------------------*/ -/* compute order efficiency */ -/*--------------------------------------*/ -void SGTELIB::Surrogate::compute_order_error (const SGTELIB::Matrix * const Zpred , - double * m ){ - - check_ready(__FILE__,__FUNCTION__,__LINE__); - // Compute the order-efficiency metric by comparing the - // values of - _Zs (in the trainingset) - // - Zpred (input of this function) - // Put the results in "m" (output of this function) - - if ( ! m){ - display(std::cout); - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "compute_order_error(): m is NULL" ); - } - - int nb_fail; - const SGTELIB::Matrix Zs = get_matrix_Zs(); - - for (int j=0 ; j<_m ; j++){ - switch (_trainingset.get_bbo(j)){ - //===============================================// - case SGTELIB::BBO_OBJ: - double z1,z1h,z2,z2h; - nb_fail = 0; - for (int i1=0 ; i1<_p ; i1++){ - z1 = Zs.get(i1,j); - z1h = Zpred->get(i1,j); - for (int i2=0 ; i2<_p ; i2++){ - z2 = Zs.get(i2,j); - z2h = Zpred->get(i2,j); - if ( (z1-z2<0)^(z1h-z2h<0) ) nb_fail++; - } - } - m[j] = double(nb_fail)/double(_p*_p); - break; - //===============================================// - case SGTELIB::BBO_CON: - nb_fail = 0; - double z,zh; - for (int i=0 ; i<_p ; i++){ - z = Zs.get(i,j); - zh = Zpred->get(i,j); - if ( (z<0)^(zh<0) ) nb_fail++; - } - - m[j] = double(nb_fail)/double(_p); - break; - //===============================================// - case SGTELIB::BBO_DUM: - m[j] = -1.0; - break; - //===============================================// - default: - display(std::cout); - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined type" ); - //===============================================// - }// end switch - }// end loop on j -}// - - -/*--------------------------------------*/ -/* compute order efficiency */ -/*--------------------------------------*/ -double SGTELIB::Surrogate::compute_aggregate_order_error (const SGTELIB::Matrix * const Zpred){ - - check_ready(__FILE__,__FUNCTION__,__LINE__); - - const SGTELIB::Matrix Zs = get_matrix_Zs(); - - // Build f1,h1,f2 and h2. - // f1 and h1 are the real data - // f2 and h2 are the surrogate. - - SGTELIB::Matrix fhr ("fhr",_p,2); - SGTELIB::Matrix fhs ("fhs",_p,2); - fhr.fill(0.0); - fhs.fill(0.0); - int i,j; - for (j=0 ; j<_m ; j++){ - switch (_trainingset.get_bbo(j)){ - //===============================================// - case SGTELIB::BBO_OBJ: - fhr.set_col( Zs.get_col(j) , 0 ); - fhs.set_col( Zpred->get_col(j) , 0 ); - break; - //===============================================// - case SGTELIB::BBO_CON: - for (i=0 ; i<_p ; i++){ - double d; - d = Zs.get(i,j); - if (d>0) fhr.add(i,1,d*d); - d = Zpred->get(i,j); - if (d>0) fhs.add(i,1,d*d); - } - break; - //===============================================// - case SGTELIB::BBO_DUM: - break; - //===============================================// - default: - display(std::cout); - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined type" ); - //===============================================// - }// end switch - }// end loop on j - - int e = 0; - int i1,i2; - double hr1,hr2,hs1,hs2,fr1,fr2,fs1,fs2; - bool inf_r,inf_s; - // i1 and i2 are the indexes of the two points that are compared. - // fr1 and hr1 (resp. fr2 and hr2) are the real values of f and r for these points. - // fs1 and hs1 (resp. fs2 and hs2) are the surrogate (or CV) values. - for (i1=0 ; i1<_p ; i1++){ - fr1 = fhr.get(i1,0); - hr1 = fhr.get(i1,1); - fs1 = fhs.get(i1,0); - hs1 = fhs.get(i1,1); - for (i2=0 ; i2<_p ; i2++){ - fr2 = fhr.get(i2,0); - hr2 = fhr.get(i2,1); - fs2 = fhs.get(i2,0); - hs2 = fhs.get(i2,1); - // Compute the order for real (r) data and for surrogate (s) model - inf_r = ( (hr1<hr2) | ( (hr1==hr2) & (fr1<fr2) ) ); - inf_s = ( (hs1<hs2) | ( (hs1==hs2) & (fs1<fs2) ) ); - // If they don't agree, increment e. (Note that ^ is the xor operator) - if (inf_r ^ inf_s) e++; - } - } - return double(e)/double(_p*_p); - -}// - -/*--------------------------------------*/ -/* get_exclusion_area_penalty */ -/*--------------------------------------*/ -SGTELIB::Matrix SGTELIB::Surrogate::get_exclusion_area_penalty ( const SGTELIB::Matrix & XX , const double tc ) const{ - // Scale the input - SGTELIB::Matrix XXs(XX); - XXs.set_name("XXs"); - _trainingset.X_scale(XXs); - return _trainingset.get_exclusion_area_penalty ( XXs , tc ); -}// - - -/*--------------------------------------*/ -/* get_distance_to_closest */ -/*--------------------------------------*/ -SGTELIB::Matrix SGTELIB::Surrogate::get_distance_to_closest ( const SGTELIB::Matrix & XX ) const{ - // Scale the input - SGTELIB::Matrix XXs(XX); - XXs.set_name("XXs"); - _trainingset.X_scale(XXs); - return _trainingset.get_distance_to_closest ( XXs ); -}// - - - - -/*--------------------------------------*/ -/* optimize model parameters */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate::optimize_parameters ( void ) { - - - // Number of parameters to optimize - const int N = _param.get_nb_parameter_optimization(); - // Budget - int budget = N*_param.get_budget(); - - int i,j,k; - double d; - const bool display = false; - if (display){ - std::cout << "Begin parameter optimization\n"; - std::cout << "Metric: " << SGTELIB::metric_type_to_str(_param.get_metric_type()) << "\n"; - } - - - - //----------------------------------------- - // Bounds, Scaling and domain - //----------------------------------------- - SGTELIB::Matrix lb("lb",1,N); - SGTELIB::Matrix ub("ub",1,N); - SGTELIB::Matrix scaling ("scaling",1,N); - bool * logscale = new bool [N]; - SGTELIB::param_domain_t * domain = new SGTELIB::param_domain_t[N]; - - _param.get_x_bounds ( &lb , &ub , domain , logscale ); - - for (i=0 ; i<N ; i++){ - if (domain[i]==SGTELIB::PARAM_DOMAIN_CONTINUOUS){ - if (logscale[i]) d = 1; - else d = (ub[i]-lb[i])/5; - scaling.set(0,i,d); - if (d<EPSILON) throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Bad scaling." ); - } - else if (domain[i]==SGTELIB::PARAM_DOMAIN_CAT){ - scaling.set(0,i,ub[i]-lb[i]); - } - else{ - scaling.set(0,i,1); - } - } - - if (display){ - std::cout << "Model: " << get_short_string() << "\n"; - std::cout << "lb: [ "; - for (i=0 ; i<N ; i++) std::cout << lb[i] << " "; - std::cout << "]\n"; - std::cout << "ub: [ "; - for (i=0 ; i<N ; i++) std::cout << ub[i] << " "; - std::cout << "]\n"; - std::cout << "scaling: [ "; - for (i=0 ; i<N ; i++){ - std::cout << scaling[i]; - if (logscale[i]) std::cout << "(log)"; - std::cout << " "; - } - std::cout << "]\n"; - } - - // Build set of starting points - const int nx0 = 1+budget/10; - SGTELIB::Matrix X0 ("X0",nx0,N); - X0.set_row(_param.get_x(),0); - for (j=0 ; j<N ; j++){ - double lbj = lb[j]; - double ubj = ub[j]; - for (i=1 ; i<nx0 ; i++){ // nb: Skip the first row of X0 - d = uniform_rand(); - if (logscale[j]) d = lb[j] * pow(ubj/lbj,d); - else d = lbj + (ubj-lbj)*d; - X0.set(i,j,d); - } - } - - //--------------------------------------------- - // Budget, poll size, success and objectives - //--------------------------------------------- - - SGTELIB::Matrix xtry ("xtry",1,N); - double fmin = +INF; - double pmin = +INF; - double ftry, ptry; - bool success; - double psize = 0.5; - SGTELIB::Matrix POLL; - SGTELIB::Matrix xmin = X0.get_row(0); - - // Init cache of evaluated points - SGTELIB::Matrix CACHE ("CACHE",0,N); - bool cache_hit; - - //------------------------ - // LOOP - //------------------------ - int iter=0; - while (budget>0){ - - success = false; - - if (display){ - std::cout << "=================================================\n"; - std::cout << "Budget: " << budget << "\n"; - // Display best solution - std::cout << "\nCurrent xmin:\n"; - std::cout << "X=[ " ; - for (j=0 ; j<N ; j++) std::cout << xmin[j] << " "; - std::cout << "] => " << fmin << " / " << pmin << "\n\n"; - } - - if (iter){ - // Create POLL candidates - POLL = SGTELIB::Matrix::get_poll_directions(scaling,domain,psize); - //POLL.display(std::cout); - for (i=0 ; i<POLL.get_nb_rows() ; i++){ - for (j=0 ; j<N ; j++){ - // Add poll directions to poll center - d = xmin[j]; - if (logscale[j]) d *= pow(4.0,POLL.get(i,j)); //exp(POLL.get(i,j)); - else d += POLL.get(i,j); - xtry.set(0,j,d); - }// End build candidate - POLL.set_row(xtry,i); - } // End Create POLL - POLL.set_name("POLL-CANDIDATES"); - //POLL.display(std::cout); - } - else{ - // If iter==0, then evaluate starting points - POLL = X0; - } - - // Evaluate POLL - for (i=0 ; i<POLL.get_nb_rows() ; i++){ - - // Candidate - xtry = POLL.get_row(i); - xtry.set_name("xtry"); - - // Display candidate - if (display){ - if (iter) std::cout << "X = [ " ; - else std::cout << "X0= [ " ; - for (j=0 ; j<N ; j++) std::cout << xtry[j] << " "; - std::cout << "] => "; - } - - // Snap to bounds - for (j=0 ; j<N ; j++){ - d = xtry[j]; - // Snap to bounds - double lbj = lb[j]; - double ubj = ub[j]; - switch (domain[j]){ - case SGTELIB::PARAM_DOMAIN_CONTINUOUS: - if (d<lbj) d = lbj; - if (d>ubj) d = ubj; - break; - case SGTELIB::PARAM_DOMAIN_INTEGER: - d = double(round(d)); - if (d<lbj) d=lbj; - if (d>ubj) d=ubj; - break; - case SGTELIB::PARAM_DOMAIN_CAT: - k = round(d); - while (k>ubj) k-=int(ubj-lbj); - while (k<lbj) k+=int(ubj-lbj); - d = double(k); - break; - case SGTELIB::PARAM_DOMAIN_BOOL: - d = (d>1/2)?1.0:0.0; - break; - case SGTELIB::PARAM_DOMAIN_MISC: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Invalid variable domain!" ); - break; - } - xtry.set(0,j,d); - } - - // Check Cache - cache_hit = (CACHE.find_row(xtry)!=-1); - if (cache_hit){ - if (display) std::cout << "Cache hit\n"; - } - else{ - // --------------------------------- - // EVALUATION - // --------------------------------- - _param.set_x(xtry); - _param.check(); - ftry = eval_objective(); - ptry = _param.get_x_penalty(); - budget--; - CACHE.add_rows(xtry); - - // Display f - if (display){ - if (ftry>=+INF) std::cout << "+inf" ; - else std::cout << ftry; - std::cout << " / " ; - if (ptry>=+INF) std::cout << "+inf" ; - else std::cout << ptry; - } - - // Check for success for each objective - if ( (ftry<fmin) || ((ftry==fmin) && (ptry<pmin)) ){ - if (display) std::cout << "(!)"; - xmin = xtry; - fmin = ftry; - pmin = ptry; - success = true; - } - if (display) std::cout << "\n"; - } // End Evaluation (i.e. No Cache Hit) - - if ( (iter) && (success) ) break; - - }// END LOOP ON POLL (for i...) - - if (iter){ - // Update poll size - if (success) psize*=2; - else psize/=2; - } - iter++; - - // Check convergence - if (psize<1e-6) break; - if (budget<=0) break; - - }// End of optimization - - // Set param to optimal value - _param.set_x(xmin); - _param.check(); - - fmin = eval_objective(); - /* - _param.display(std::cout); - std::cout << "fmin = " << fmin << "\n"; - std::cout << "=================================\n"; - */ - if (display){ - _param.display(std::cout); - std::cout << "End parameter optimization\n"; - std::cout << "=================================\n"; - } - - // Check for Nan - if (xmin.has_nan() || xmin.has_inf()) return false; - - delete [] logscale; - delete [] domain; - - // Return success - return true; - -}// - - -/*--------------------------------------*/ -/* Evaluate a set of parameters */ -/*--------------------------------------*/ -double SGTELIB::Surrogate::eval_objective ( void ){ - - //std::cout << "Eval obj...\n"; - reset_metrics(); - - // Build model - bool ok = build_private(); - if ( ! ok) return +INF; - - // Compute metric - const SGTELIB::metric_t mt = _param.get_metric_type(); - - double metric = 0; - if (SGTELIB::metric_multiple_obj(mt)){ - for (int i=0 ; i<_m ; i++) metric += get_metric(mt,i); - } - else{ - metric = get_metric(mt,0); - } - - if ( isnan(metric) ) return +INF; - if ( isinf(metric) ) return +INF; - return metric; - -}// - - - - - - - - - diff --git a/ext/sgtelib/src/Surrogate.hpp b/ext/sgtelib/src/Surrogate.hpp deleted file mode 100644 index f28690e..0000000 --- a/ext/sgtelib/src/Surrogate.hpp +++ /dev/null @@ -1,237 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_SURROGATE__ -#define __SGTELIB_SURROGATE__ - -#include "Matrix.hpp" -#include "TrainingSet.hpp" -#include "Kernel.hpp" -#include "Surrogate_Parameters.hpp" - -namespace SGTELIB { - - /*--------------------------------------*/ - /* Surrogate class */ - /*--------------------------------------*/ - class Surrogate { - - // Surrogate Ensemble is a friend, so that it can access to private and protected - // prediction methods of other derived classed of Surrogate_Ensemble - friend class Surrogate_Ensemble; - - protected: - - // TrainingSet containing the data - // (may be shared between several surrogates) - SGTELIB::TrainingSet & _trainingset; - // Parameters - SGTELIB::Surrogate_Parameters _param; - - // Input dim - const int _n; - // Ouptut dim - const int _m; - - // Number of data points of the training set - int _p_ts; - int _p_ts_old; - // Number of data points used in the model - int _p; - int _p_old; - - // Is the surrogate ready to perform predictions ? - bool _ready; - - // Predictions - // _Zhs: Prediction of the model in the training points - // (used to compute emax, rmse, eotp, linv) - SGTELIB::Matrix * _Zhs; - SGTELIB::Matrix * _Shs; // Predictive std on the training points - - // _Zvs: Cross-Validation prediction of the model in the training points - // (used to compute rmsecv, oecv) - SGTELIB::Matrix * _Zvs; - SGTELIB::Matrix * _Svs; // Cross-validation std on the training points - - // List of points used to build the model - std::list<int> _selected_points; - - // metrics - double * _metric_emax; - double * _metric_emaxcv; - double * _metric_rmse; - double * _metric_rmsecv; - double * _metric_oe; - double * _metric_oecv; - double * _metric_linv; - double _metric_aoe; - double _metric_aoecv; - double _metric_efioe; - double _metric_efioecv; - double _metric_armse; - double _metric_armsecv; - - // psize_max : Larger value of psize that led to a success - // in the previous parameter optimization. - double _psize_max; - - // Output stream - std::ofstream _out; - bool _display; - - // private affectation operator: - Surrogate & operator = ( const Surrogate & ); - - // build model (private): - virtual bool build_private (void) = 0; - virtual bool init_private (void); - - // Compute metrics - void compute_metric_emax (void); - void compute_metric_emaxcv (void); - void compute_metric_rmse (void); - void compute_metric_rmsecv (void); - void compute_metric_armse (void); - void compute_metric_armsecv (void); - void compute_metric_oe (void); - void compute_metric_oecv (void); - void compute_metric_aoe (void); - void compute_metric_aoecv (void); - void compute_metric_efioe (void); - void compute_metric_efioecv (void); - virtual void compute_metric_linv (void); - //virtual void compute_metric_eficv (void); - - // Function used to compute "_metric_oe" and "_metric_oecv" - void compute_order_error ( const SGTELIB::Matrix * const Zpred , - double * m ); - double compute_aggregate_order_error ( const SGTELIB::Matrix * const Zpred ); - - SGTELIB::Matrix compute_efi( const SGTELIB::Matrix Zs, - const SGTELIB::Matrix Ss ); - - // predict model (private): - virtual void predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs, - SGTELIB::Matrix * std, - SGTELIB::Matrix * ei , - SGTELIB::Matrix * cdf ); - - virtual void predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs) = 0; - - - // Display private - virtual void display_private ( std::ostream & out ) const = 0; - - // get matrices (these matrices are unscaled before being returned) - // (That's why these functions cant be public) - const SGTELIB::Matrix get_matrix_Xs (void); - const SGTELIB::Matrix get_matrix_Zs (void); - const SGTELIB::Matrix get_matrix_Ds (void); - - // Compute scaled data - // Compute the cross-validation matrix - virtual const SGTELIB::Matrix * get_matrix_Zvs (void) = 0; - virtual const SGTELIB::Matrix * get_matrix_Zhs (void); - virtual const SGTELIB::Matrix * get_matrix_Shs (void); - virtual const SGTELIB::Matrix * get_matrix_Svs (void); - - public: - // constructor: - - Surrogate ( SGTELIB::TrainingSet & trainingset, - const SGTELIB::Surrogate_Parameters param); - - Surrogate ( SGTELIB::TrainingSet & trainingset, - const SGTELIB::model_t mt ); - - Surrogate ( SGTELIB::TrainingSet & trainingset, - const std::string & s ); - - // destructor: - virtual ~Surrogate ( void ); - - void reset_metrics ( void ); - void info ( void ) const ; - - // check ready - void check_ready (const std::string & s) const; - void check_ready (const std::string & file, const std::string & function, const int & i) const; - void check_ready (void) const; - - // Get metrics - double get_metric (SGTELIB::metric_t mt , int j); - - // construct: - bool build (void); - - // predict: - void predict ( const SGTELIB::Matrix & XX , - SGTELIB::Matrix * ZZ , // nb : ZZ is a ptr - SGTELIB::Matrix * std, - SGTELIB::Matrix * ei , - SGTELIB::Matrix * cdf); - - void predict ( const SGTELIB::Matrix & XX , - SGTELIB::Matrix * ZZ ); - - // Compute unscaled data - const SGTELIB::Matrix get_matrix_Zh (void); - const SGTELIB::Matrix get_matrix_Sh (void); - const SGTELIB::Matrix get_matrix_Zv (void); - const SGTELIB::Matrix get_matrix_Sv (void); - - // add points: - bool add_points ( const SGTELIB::Matrix & Xnew , - const SGTELIB::Matrix & Znew ); - bool add_point ( const double * xnew , - const double * znew ); - - // exclusion_area - SGTELIB::Matrix get_exclusion_area_penalty ( const SGTELIB::Matrix & XX , const double tc ) const; - SGTELIB::Matrix get_distance_to_closest ( const SGTELIB::Matrix & XX ) const; - - bool is_ready (void) const {return _ready;}; - void display_trainingset (void) const {_trainingset.build();_trainingset.display(std::cout);}; - SGTELIB::model_t get_type (void) const {return _param.get_type();}; - std::string get_string (void) const {return _param.get_string();}; - std::string get_short_string (void) const {return _param.get_short_string();}; - void display ( std::ostream & out ) const; - const SGTELIB::Surrogate_Parameters get_param (void) const {return _param;}; - - // Set: - void set_kernel_coef (double v) { _param.set_kernel_coef(v); }; - - // Parameter optimization - bool optimize_parameters ( void ); - double eval_objective ( void ); - - }; -} - -#endif - diff --git a/ext/sgtelib/src/Surrogate_CN.cpp b/ext/sgtelib/src/Surrogate_CN.cpp deleted file mode 100644 index abb25fb..0000000 --- a/ext/sgtelib/src/Surrogate_CN.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "Surrogate_CN.hpp" - -/*----------------------------*/ -/* constructor */ -/*----------------------------*/ -SGTELIB::Surrogate_CN::Surrogate_CN ( SGTELIB::TrainingSet & trainingset, - SGTELIB::Surrogate_Parameters param) : - SGTELIB::Surrogate ( trainingset , param ) { - #ifdef SGTELIB_DEBUG - std::cout << "constructor CN\n"; - #endif -}// - - -/*----------------------------*/ -/* destructor */ -/*----------------------------*/ -SGTELIB::Surrogate_CN::~Surrogate_CN ( void ) { - -}// - - -/*--------------------------------------*/ -/* display */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_CN::display_private ( std::ostream & out ) const { - out << "(No special members)\n"; -}// - - -/*--------------------------------------*/ -/* build_private */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_CN::build_private ( void ) { - _ready = true; - return true; -}// - -/*--------------------------------------*/ -/* predict_private (ZZs only) */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_CN::predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs) { - - int i,imin; - const int pxx = XXs.get_nb_rows(); - - // D : distance between points of XXs and other points of the trainingset - SGTELIB::Matrix D = _trainingset.get_distances(XXs,get_matrix_Xs(),_param.get_distance_type()); - - // Data: - const SGTELIB::Matrix & Zs = get_matrix_Zs(); - - // Loop on the points of XXs - for (i=0 ; i<pxx ; i++){ - // imin is the index of the closest neighbor of xx in Xs - imin = D.get_min_index_row(i); - // Copy the output of this point - ZZs->set_row( Zs.get_row(imin) , i); - } - -}// - - -/*--------------------------------------*/ -/* compute cv values */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_CN::compute_cv_values (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - - if ((_Zvs) && (_Svs)) return true; - - - // Init matrices - if ( ! _Zvs){ - _Zvs = new SGTELIB::Matrix ("Zvs",_p,_m); - _Zvs->set_name("Zvs"); - } - - if ( ! _Svs){ - _Svs = new SGTELIB::Matrix ("Svs",_p,_m); - _Svs->set_name("Svs"); - } - - - int i,i2,imin=0; - double d; - SGTELIB::Matrix D = _trainingset.get_distances(get_matrix_Xs(),get_matrix_Xs(),_param.get_distance_type()); - const SGTELIB::Matrix & Zs = get_matrix_Zs(); - - // Loop on the outputs - for (i=0 ; i<_p ; i++){ - // Find the closest point to iv (not itself) - double dmin = SGTELIB::INF; - // Loop on the points of the trainingset - for (i2=0 ; i2<_p ; i2++){ - d = D.get(i,i2); - if ( (i!=i2) && (d<dmin) ){ - dmin = d; - imin = i2; - } - } - _Zvs->set_row( Zs.get_row(imin) , i); - _Svs->set_row( dmin , i); - } - - - return true; - -}// - -/*--------------------------------------*/ -/* get_matrix_Zhs */ -/*--------------------------------------*/ -const SGTELIB::Matrix * SGTELIB::Surrogate_CN::get_matrix_Zhs (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - if ( ! _Zhs){ - _Zhs = new SGTELIB::Matrix(get_matrix_Zs()); - } - return _Zhs; -}// - -/*--------------------------------------*/ -/* get_matrix_Shs */ -/*--------------------------------------*/ -const SGTELIB::Matrix * SGTELIB::Surrogate_CN::get_matrix_Shs (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - if ( ! _Shs){ - _Shs = new SGTELIB::Matrix("Shs",_p,_m); - } - return _Shs; -}// - - -/*--------------------------------------*/ -/* get_matrix_Zvs */ -/*--------------------------------------*/ -const SGTELIB::Matrix * SGTELIB::Surrogate_CN::get_matrix_Zvs (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - compute_cv_values(); - return _Zvs; -}// - -/*--------------------------------------*/ -/* get_matrix_Svs */ -/*--------------------------------------*/ -const SGTELIB::Matrix * SGTELIB::Surrogate_CN::get_matrix_Svs (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - compute_cv_values(); - return _Svs; -}// - - - - - - - - - - - - - - - diff --git a/ext/sgtelib/src/Surrogate_CN.hpp b/ext/sgtelib/src/Surrogate_CN.hpp deleted file mode 100644 index 9c40555..0000000 --- a/ext/sgtelib/src/Surrogate_CN.hpp +++ /dev/null @@ -1,68 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_SURROGATE_CN__ -#define __SGTELIB_SURROGATE_CN__ - -#include "Surrogate.hpp" - -namespace SGTELIB { - - /*--------------------------------------*/ - /* Surrogate_CN class */ - /*--------------------------------------*/ - class Surrogate_CN : public SGTELIB::Surrogate { - - private: - - virtual bool build_private (void); - - virtual void predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs); - - // Compute metrics - virtual const SGTELIB::Matrix * get_matrix_Zvs (void); - virtual const SGTELIB::Matrix * get_matrix_Zhs (void); - virtual const SGTELIB::Matrix * get_matrix_Svs (void); - virtual const SGTELIB::Matrix * get_matrix_Shs (void); - - bool compute_cv_values (void); - - public: - - // Constructor - Surrogate_CN ( SGTELIB::TrainingSet & trainingset , - SGTELIB::Surrogate_Parameters param) ; - - // destructor: - virtual ~Surrogate_CN ( void ); - - virtual void display_private ( std::ostream & out ) const; - - }; -} - -#endif - diff --git a/ext/sgtelib/src/Surrogate_Ensemble.cpp b/ext/sgtelib/src/Surrogate_Ensemble.cpp deleted file mode 100644 index f6aadfb..0000000 --- a/ext/sgtelib/src/Surrogate_Ensemble.cpp +++ /dev/null @@ -1,1061 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "Surrogate_Ensemble.hpp" - -/*----------------------------*/ -/* constructor */ -/*----------------------------*/ -SGTELIB::Surrogate_Ensemble::Surrogate_Ensemble ( SGTELIB::TrainingSet & trainingset, - SGTELIB::Surrogate_Parameters param ) : - SGTELIB::Surrogate ( trainingset , param ), - _kmax ( 0 ), - _kready ( 0 ), - _active ( NULL ), - _metric ( new double [_m] ){ - - #ifdef ENSEMBLE_DEBUG - std::cout << "constructor Ensemble 1\n"; - #endif - // Init Model list - model_list_preset(_param.get_preset()); - // Init the weight matrix in _param - SGTELIB::Matrix W ("W",_kmax,_m); - W.fill(1.0/double(_kmax)); - _param.set_weight(W); -} - - -/*----------------------------*/ -/* destructor */ -/*----------------------------*/ -SGTELIB::Surrogate_Ensemble::~Surrogate_Ensemble ( void ) { - - delete [] _active; - delete [] _metric; - - for (int k=0 ; k<_kmax ; k++){ - if ( _surrogates.at(k) ){ - surrogate_delete( _surrogates.at(k) ); - } - } - _surrogates.clear(); - -}// - -/*--------------------------------------*/ -/* display */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_Ensemble::display_private ( std::ostream & out ) const { - - out << "kmax: " << _kmax << "\n"; - out << "kready: " << _kready << "\n"; - - SGTELIB::Matrix W = _param.get_weight(); - /* - out << "W = [ "; - for ( int k=0 ; k<_kmax ; k++) out << W.get(k,0) << " "; - out << " ]\n"; - */ -/* - for (int k=0 ; k<_kmax ; k++){ - out <<"model[" << k << "]: " << _surrogates.at(k)->get_string() << "\n"; - } -*/ -/* - double w; - for (int j=0 ; j<_m ; j++){ - out << "output " << j << ":\n"; - for ( int k=0 ; k<_kmax ; k++){ - out << " ["; - out.width(2); - out << k; - out << "]: "; - out.width(12); - out << _surrogates.at(k)->get_metric(_param.get_metric_type(),j) << " ; w: "; - - w = W.get(k,j); - if (w==0) out << " 0 %"; - else if (w<=0.01) out << " <1 %"; - else{ - w = double(round(w*100)); - out.width(3); - out << w << " %"; - } - out << " ; "; - out << _surrogates.at(k)->get_short_string(); - if (! is_ready(k)) - out << " (Not Ready)"; - out << "\n"; - } - // Metric of the Ensemble - out << " =====>"; - out.width(8); - out << _metric[j] ; - out << " ; weight: N.A. ; " << get_short_string() << "\n"; - } - -*/ - - double w; - for (int j=0 ; j<_m ; j++){ - out << "output " << _p << " " << j << ":"; - for ( int k=0 ; k<_kmax ; k++){ - w = W.get(k,j); - if (w>EPSILON) out << " " << k ; - } - out << "\n"; - } - - - -}// - - -/*-----------------------------------------*/ -/* display model list */ -/* (remove all the models of a given type) */ -/*-----------------------------------------*/ -void SGTELIB::Surrogate_Ensemble::model_list_display ( std::ostream & out ) { - out << "model list (_kmax=" << _kmax << "):\n"; - if (_kmax==0){ - out << "model list is empty\n"; - } - for (int k=0 ; k<_kmax ; k++){ - out <<" Model " << k << ": " << _surrogates.at(k)->get_string() << "\n"; - } - -}// - - -/*-----------------------------------------*/ -/* remove all models from model list */ -/*-----------------------------------------*/ -void SGTELIB::Surrogate_Ensemble::model_list_remove_all ( void ){ - - std::vector<SGTELIB::Surrogate *>::iterator it = _surrogates.begin(); - while (it != _surrogates.end()){ - SGTELIB::surrogate_delete(*it); - it = _surrogates.erase(it); - } - _surrogates.clear(); - _kmax = 0; -}// - -/*-----------------------------------------*/ -/* add one model */ -/*-----------------------------------------*/ -void SGTELIB::Surrogate_Ensemble::model_list_add ( const std::string & definition ){ - _surrogates.push_back( SGTELIB::Surrogate_Factory(_trainingset,definition) ); - _kmax++; -}// - - -/*--------------------------------------*/ -/* init_private */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_Ensemble::init_private ( void ) { - #ifdef SGTELIB_DEBUG - std::cout << "Surrogate_Ensemble : init_private\n"; - #endif - - // Need at least 2 surrogates - if (_kmax<=1){ - #ifdef ENSEMBLE_DEBUG - std::cout << "Surrogate_Ensemble : _kmax : " << _kmax << "\n"; - #endif - return false; - } - - // Build them & count the number of ready - _kready = 0; - int k; - for (k=0 ; k<_kmax ; k++){ - #ifdef ENSEMBLE_DEBUG - std::cout << "Init model " << k << "/" << _kmax << ": " << _surrogates.at(k)->get_short_string(); - #endif - if (_surrogates.at(k)->build()){ - _kready++; - #ifdef ENSEMBLE_DEBUG - std::cout << " (ready)\n"; - #endif - } - } - #ifdef ENSEMBLE_DEBUG - std::cout << "Surrogate_Ensemble : _kready/_kmax : " << _kready << "/" << _kmax << "\n"; - #endif - - - // Need at least 2 ready surrogates - if (_kready<=1){ - return false; - } - - // Init weights with selection - compute_W_by_select(); - - return true; -}// - - -/*--------------------------------------*/ -/* build */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_Ensemble::build_private ( void ) { - - #ifdef ENSEMBLE_DEBUG - std::cout << "Surrogate_Ensemble : build_private\n"; - #endif - - int k; - - // computation of the weight - switch (_param.get_weight_type()){ - case SGTELIB::WEIGHT_SELECT: - compute_W_by_select(); - break; - case SGTELIB::WEIGHT_WTA1: - compute_W_by_wta1(); - break; - case SGTELIB::WEIGHT_WTA3: - compute_W_by_wta3(); - break; - case SGTELIB::WEIGHT_OPTIM: - case SGTELIB::WEIGHT_EXTERN: - #ifdef ENSEMBLE_DEBUG - std::cout << "Weight corrections\n"; - #endif - { - SGTELIB::Matrix W = _param.get_weight(); - for (k=0 ; k<_kmax ; k++){ - if (! is_ready(k)){ - W.set_row(0.0,k); - } - } - W.normalize_cols(); - _param.set_weight(W); - } - break; - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Ensemble::build(): undefined aggregation method." ); - } - - - _out << "BUILD...\n"; - - if (check_weight_vector()){ - #ifdef ENSEMBLE_DEBUG - std::cout << "Weights non valid\n"; - #endif - _ready = false; - return false; - } - compute_active_models(); - _ready = true; - - - // Memorize the value of the metric for each output - for (int j=0 ; j<_m ; j++){ - _metric[j] = get_metric(_param.get_metric_type(),j); - } - - - #ifdef ENSEMBLE_DEBUG - std::cout << "Surrogate_Ensemble : end build_private\n"; - #endif - - - return true; -}// - - -/*--------------------------------------*/ -/* compute_active_models */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_Ensemble::compute_active_models ( void ) { - - // Compute the array _active - // (_active[k] is true if the model k is ready AND the weight in k is not null for - // at least one output) - SGTELIB::Matrix W = _param.get_weight(); - if (! _active){ - _active = new bool [_kmax]; - } - int k; - for (k=0 ; k<_kmax ; k++){ - _active[k] = false; - if ( is_ready(k) ){ - for (int j=0 ; j<_m ; j++){ - if ( (_trainingset.get_bbo(j)!=SGTELIB::BBO_DUM) && (W.get(k,j)>EPSILON) ){ - _active[k] = true; - break; - } - } - } - } - -}// - -/*--------------------------------------*/ -/* compute_W_by_select */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_Ensemble::compute_W_by_select ( void ) { - - // Init Weight matrix - SGTELIB::Matrix W ("W", _kmax , _m ); - W.fill(0.0); - - int j,k; - int k_best = 0; - double metric_best; - double metric; - - // Loop on the outputs - for (j=0 ; j<_m ; j++){ - if (_trainingset.get_bbo(j)!=SGTELIB::BBO_DUM){ - - metric_best = SGTELIB::INF; - // Find the value of the best metric - for (k=0 ; k<_kmax ; k++){ - if (is_ready(k)){ - metric = _surrogates.at(k)->get_metric(_param.get_metric_type(),j); - if (! isnan(metric)) { - metric_best = std::min(metric,metric_best); - } - } - }// end loop k - - // Find the number of surrogate that have this metric value - k_best = 0; - for (k=0 ; k<_kmax ; k++){ - if (is_ready(k)){ - metric = _surrogates.at(k)->get_metric(_param.get_metric_type(),j); - // If the metric is close to metric_best - if ( fabs(metric-metric_best)<EPSILON ){ - // Give weight to this model - W.set(k,j,1.0); - // Increment k_best (number of surrogates such that metric=metric_best) - k_best++; - } - } - }// end loop k - - // Normalise - if (k_best>1){ - for (k=0 ; k<_kmax ; k++){ - if (is_ready(k)){ - if ( W.get(k,j) > EPSILON ){ - W.set(k,j,1.0/double(k_best)); - } - } - }// end loop k - }//end if - - - }// end DUM - }// end loop j - - _param.set_weight(W); - -}// - -/*--------------------------------------*/ -/* compute_W_by_wta1 */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_Ensemble::compute_W_by_wta1 ( void ) { - - #ifdef ENSEMBLE_DEBUG - std::cout << "SGTELIB::Surrogate_Ensemble::compute_W_by_wta1\n"; - #endif - - // Init Weight matrix - SGTELIB::Matrix W ("W", _kmax , _m ); - W.fill(0.0); - - int k; - double metric; - double metric_sum; - double weight_sum; - - // Loop on the outputs - for (int j=0 ; j<_m ; j++){ - if (_trainingset.get_bbo(j)!=SGTELIB::BBO_DUM){ - - // Compute the sum of the metric on all the surrogates ready - metric_sum = 0; - for (k=0 ; k<_kmax ; k++){ - if (is_ready(k)){ - metric = _surrogates.at(k)->get_metric(_param.get_metric_type(),j); - if (isdef(metric)) metric_sum += metric; - } - } - - // Affect weight: - if (metric_sum>EPSILON){ - for (k=0 ; k<_kmax ; k++){ - if (is_ready(k)){ - metric = _surrogates.at(k)->get_metric(_param.get_metric_type(),j); - if (isdef(metric)) W.set(k,j,1-metric/metric_sum); - else W.set(k,j,0.0); - } - } - } - else{ - for (k=0 ; k<_kmax ; k++){ - if (is_ready(k)) W.set(k,j,1.0); - } - } - - // Normalize - weight_sum = 0; - for (k=0 ; k<_kmax ; k++){ - weight_sum += W.get(k,j); - } - W.multiply_col( 1.0/weight_sum , j ); - - - } // End if not DUMM - }// End loop on outputs - - _param.set_weight(W); - -}// - -/*--------------------------------------*/ -/* compute_W_by_wta3 */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_Ensemble::compute_W_by_wta3 ( void ) { - - #ifdef ENSEMBLE_DEBUG - std::cout << "SGTELIB::Surrogate_Ensemble::compute_W_by_wta3\n"; - #endif - - // Init Weight matrix - SGTELIB::Matrix W ("W", _kmax , _m ); - W.fill(0.0); - - int k; - double metric; - double metric_avg; - double w; - double w_sum; - - // Loop on the outputs - for (int j=0 ; j<_m ; j++){ - - // Compute the average of the metric on all the surrogates ready - metric_avg = 0; - for (k=0 ; k<_kmax ; k++){ - if (is_ready(k)){ - metric_avg += _surrogates.at(k)->get_metric(_param.get_metric_type(),j); - } - } - metric_avg /= _kready; - - if (metric_avg > EPSILON){ - - // Normal WA3 method. - // Affect un-normalized weight: (which means that the sum of the weight is not 1) - w_sum = 0; - for (k=0 ; k<_kmax ; k++){ - if (is_ready(k)){ - metric = _surrogates.at(k)->get_metric(_param.get_metric_type(),j); - w = pow( metric + wta3_alpha * metric_avg , wta3_beta ); - w_sum += w; - W.set(k,j,w); - } - } - // Then, normalize - for (k=0 ; k<_kmax ; k++){ - if (is_ready(k)){ - W.set(k,j,W.get(k,j)/w_sum); - } - } - - } - else{ - - // If the metric is null for all models, then set to 1/_kready - w = 1.0 / double(_kready); - for (k=0 ; k<_kmax ; k++){ - if (is_ready(k)){ - W.set(k,j,w); - } - } - - } - }// End loop on outputs - - _param.set_weight(W); - -}// - - - -/*--------------------------------------*/ -/* predict (ZZ only) */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_Ensemble::predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZ ) { - #ifdef ENSEMBLE_DEBUG - check_ready(__FILE__,__FUNCTION__,__LINE__); - #endif - - const SGTELIB::Matrix W = _param.get_weight(); - const int pxx = XXs.get_nb_rows(); - - ZZ->fill(0.0); - // Tmp matrix for model k - SGTELIB::Matrix * ZZk = new SGTELIB::Matrix("ZZk",pxx,_m); - - double w; - for (int k=0 ; k<_kmax ; k++){ - if (_active[k]){ - // Call the output for this surrogate - _surrogates.at(k)->predict_private(XXs,ZZk); - for (int j=0 ; j<_m ; j++){ - w = W.get(k,j); - for (int i=0 ; i<pxx ; i++){ - ZZ->set(i,j, ZZ->get(i,j) + w*ZZk->get(i,j) ); - }// end loop i - }// end loop j - }// end if ready - }//end loop k - - delete ZZk; -}// - - -/*--------------------------------------*/ -/* predict_private */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_Ensemble::predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZ , - SGTELIB::Matrix * std, - SGTELIB::Matrix * ei , - SGTELIB::Matrix * cdf) { - #ifdef ENSEMBLE_DEBUG - check_ready(__FILE__,__FUNCTION__,__LINE__); - #endif - - const SGTELIB::Matrix W = _param.get_weight(); - - // If no statistical information is required, use the simpler prediction method - if (! (std || ei || cdf)){ - predict_private ( XXs, ZZ ); - return; - } - - // Else, go for the big guns... - const int pxx = XXs.get_nb_rows(); - - // Init ZZ - bool delete_ZZ = false; - if ( ! ZZ){ - // if ZZ is not required, we build it anyway, but delete it in the end - ZZ = new SGTELIB::Matrix ("ZZ",pxx,_m); - delete_ZZ = true; - } - ZZ->fill(0.0); - - - // Fill output matricres - if (std) std->fill(0.0); - if (ei) ei->fill(0.0); - if (cdf) cdf->fill(0.0); - - // Init tmp matrices - SGTELIB::Matrix * ZZk = new SGTELIB::Matrix ("ZZk" ,pxx,_m); - SGTELIB::Matrix * stdk = new SGTELIB::Matrix ("stdk",pxx,_m); - - // Tmp matrix cdfk - SGTELIB::Matrix * cdfk; - if (cdf) cdfk = new SGTELIB::Matrix ("cdfk",pxx,_m); - else cdfk = NULL; - - // Same story for ei. - SGTELIB::Matrix * eik; - if (ei) eik = new SGTELIB::Matrix ("eik",pxx,_m); - else eik = NULL; - - double w,z,s; - - - // Loop on the models - for (int k=0 ; k<_kmax ; k++){ - if (_active[k]){ - - // Call the output for this surrogate - _surrogates.at(k)->predict_private(XXs,ZZk,stdk,eik,cdfk); - - for (int j=0 ; j<_m ; j++){ - w = W.get(k,j); - if (w>EPSILON/_kmax){ - - // Compute ZZ - for (int i=0 ; i<pxx ; i++){ - z = ZZk->get(i,j); - ZZ->set( i,j, ZZ->get(i,j) + w*z ); - } - - // Compute std - if (std){ - for (int i=0 ; i<pxx ; i++){ - z = ZZk->get(i,j); - s = stdk->get(i,j); - std->set(i,j, std->get(i,j) + w*(s*s + z*z) ); - //std->set(i,j, std->get(i,j) + w*z*z ); - }// end loop i - } - - // EI is linear on w - if ( (ei) && (_trainingset.get_bbo(j)==SGTELIB::BBO_OBJ) ){ - for (int i=0 ; i<pxx ; i++){ - ei->set(i,j, ei->get(i,j) + w*eik->get(i,j) ); - }// end loop i - } - - // CDF is linear on w - if (cdf){ - for (int i=0 ; i<pxx ; i++){ - cdf->set(i,j, cdf->get(i,j) + w*cdfk->get(i,j) ); - }// end loop i - } - - }// end if w>eps - }// end loop j - - }// end if ready - }//end loop k - - - // Correction of std - if (std){ - for (int j=0 ; j<_m ; j++){ - for (int i=0 ; i<pxx ; i++){ - z = ZZ->get(i,j); - s = std->get(i,j) - z*z; - std->set(i,j, sqrt(fabs(s)) ); - }// end loop i - } - } - - if (delete_ZZ) delete ZZ; - if (ZZk ) delete ZZk; - if (stdk) delete stdk; - if (eik ) delete eik; - if (cdfk) delete cdfk; - -}// - -/*--------------------------------------*/ -/* get_matrix_Zvs */ -/*--------------------------------------*/ -const SGTELIB::Matrix * SGTELIB::Surrogate_Ensemble::get_matrix_Zvs (void){ - if ( ! _Zvs){ - #ifdef ENSEMBLE_DEBUG - check_ready(__FILE__,__FUNCTION__,__LINE__); - #endif - const SGTELIB::Matrix W = _param.get_weight(); - _Zvs = new SGTELIB::Matrix("Zv",_p,_m); - _Zvs->fill(0.0); - int i,j; - double wkj; - - for (int k=0 ; k<_kmax ; k++){ - if (_active[k]){ - // Call the output for this surrogate - const SGTELIB::Matrix * Zvs_k = _surrogates.at(k)->get_matrix_Zvs(); - for ( j=0 ; j<_m ; j++){ - wkj = W.get(k,j); - if (wkj>0){ - for ( i=0 ; i<_p ; i++){ - _Zvs->add(i,j, wkj*Zvs_k->get(i,j) ); - } - } - }// end loop j - }// end if ready - }//end loop k - - _Zvs->set_name("Zvs"); - _Zvs->replace_nan(+INF); - - } - return _Zvs; -}// - -/*--------------------------------------*/ -/* get_matrix_Zhs */ -/*--------------------------------------*/ -const SGTELIB::Matrix * SGTELIB::Surrogate_Ensemble::get_matrix_Zhs (void){ - if ( ! _Zhs){ - #ifdef ENSEMBLE_DEBUG - check_ready(__FILE__,__FUNCTION__,__LINE__); - #endif - const SGTELIB::Matrix W = _param.get_weight(); - _Zhs = new SGTELIB::Matrix("Zv",_p,_m); - _Zhs->fill(0.0); - int i,j; - double wkj; - - for (int k=0 ; k<_kmax ; k++){ - if (_active[k]){ - // Call the output for this surrogate - const SGTELIB::Matrix * Zhs_k = _surrogates.at(k)->get_matrix_Zhs(); - for ( j=0 ; j<_m ; j++){ - wkj = W.get(k,j); - if (wkj>0){ - for ( i=0 ; i<_p ; i++){ - _Zhs->add(i,j, wkj*Zhs_k->get(i,j) ); - } - } - }// end loop j - }// end if ready - }//end loop k - - _Zhs->set_name("Zhs"); - _Zhs->replace_nan(+INF); - - } - return _Zhs; -}// - -/*--------------------------------------*/ -/* get_matrix_Shs */ -/*--------------------------------------*/ -const SGTELIB::Matrix * SGTELIB::Surrogate_Ensemble::get_matrix_Shs (void){ - if ( ! _Shs){ - const SGTELIB::Matrix W = _param.get_weight(); - _Shs = new SGTELIB::Matrix("Zv",_p,_m); - _Shs->fill(0.0); - SGTELIB::Matrix col ("col",_p,1); - - int i,j; - double wkj; - for (int k=0 ; k<_kmax ; k++){ - if (_active[k]){ - // Call the output for this surrogate - const SGTELIB::Matrix * Zhs_k = _surrogates.at(k)->get_matrix_Zhs(); - const SGTELIB::Matrix * Shs_k = _surrogates.at(k)->get_matrix_Shs(); - - for ( j=0 ; j<_m ; j++){ - wkj = W.get(k,j); - if (wkj>0){ - for ( i=0 ; i<_p ; i++){ - _Shs->add(i,j, wkj*( pow(Shs_k->get(i,j),2) + pow(Zhs_k->get(i,j),2) ) ); - } - } - }// end loop j - }// end if ready - }//end loop k - - const SGTELIB::Matrix * Zhs = get_matrix_Zhs(); - _Shs->sub( Matrix::hadamard_square( *Zhs ) ); - _Shs->hadamard_sqrt(); - - _Shs->set_name("Shs"); - _Shs->replace_nan(+INF); - - } - return _Shs; -}// - - - - - -/*--------------------------------------*/ -/* to know if basic model k is ready */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_Ensemble::is_ready (const int k) const{ - if ((k<0) || (k>=_kmax)){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Ensemble::set_weight_vector (const int k): k out of range" ); - } - return _surrogates.at(k)->is_ready(); -} - - -/*--------------------------------------*/ -/* external set of the weight vector */ -/* (use model k for output j) */ -/*--------------------------------------*/ -/* -void SGTELIB::Surrogate_Ensemble::set_weight_vector (const int k, const int j){ - if (_param.get_weight_type() != SGTELIB::WEIGHT_EXTERN){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Ensemble::set_weight_vector (k,j): Not in EXTERN mode" ); - } - if ((k<0) or (k>=_kmax)){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Ensemble::set_weight_vector (k,j): k out of range" ); - } - if ((j<0) or (j>=_m)){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Ensemble::set_weight_vector (k,j): k out of range" ); - } - if (not is_ready(k)){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Ensemble::set_weight_vector (k,j): Surrogate not ready" ); - } - - // Set the column j to 0 - _W.set_col( 0.0 , j ); - // Select model k for output j - _W.set(k,j,1.0); - // Check and reset - reset_metrics(); - compute_active_models(); -}// -*/ - -/*--------------------------------------*/ -/* external set of the weight vector */ -/* (use model k for every output) */ -/*--------------------------------------*/ -/* -void SGTELIB::Surrogate_Ensemble::set_weight_vector (const int k){ - if (_param.get_weight_type() != SGTELIB::WEIGHT_EXTERN){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Ensemble::set_weight_vector (k,j): Not in EXTERN mode" ); - } - if ((k<0) or (k>=_kmax)){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Ensemble::set_weight_vector (k,j): k out of range" ); - } - if (not is_ready(k)){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Ensemble::set_weight_vector (k,j): Surrogate not ready" ); - } - // Put _W at 0 - _W.fill(0.0); - // Put model k at 1.0 for every output - _W.set_row( 1.0 , k ); - // Check and reset - reset_metrics(); - compute_active_models(); -}// -*/ - -/*--------------------------------------*/ -/* external set of the weight vector */ -/* (with the whole matrix) */ -/*--------------------------------------*/ -/* -void SGTELIB::Surrogate_Ensemble::set_weight_vector (const SGTELIB::Matrix & W){ - if (_param.get_weight_type() != SGTELIB::WEIGHT_EXTERN){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Ensemble::set_weight_vector (k,j): Not in EXTERN mode" ); - } - // Set _W - _W = W; - // Check and reset - reset_metrics(); - compute_active_models(); -}// -*/ - -/*--------------------------------------*/ -/* check the weight vector */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_Ensemble::check_weight_vector ( void ) const { - const SGTELIB::Matrix W = _param.get_weight(); - double s,w; - int j,k; - for (j=0 ; j<_m ; j++){ - if (_trainingset.get_bbo(j)!=SGTELIB::BBO_DUM){ - for (k=0 ; k<_kmax ; k++){ - w = W.get(k,j); - if (w<-EPSILON) return true; - if (w>1+EPSILON) return true; - if ( isnan(w) ) return true; - } - s = W.get_col(j).sum(); - if (fabs(s-1.0)>_kready*EPSILON) return true; - } - } - - return false; - -}// - - - - - - -/*--------------------------------------*/ -/* define model list */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_Ensemble::model_list_preset ( const std::string & preset ) { - - - #ifdef ENSEMBLE_DEBUG - std::cout << "Build model list\n"; - #endif - - model_list_remove_all(); - - const std::string p = toupper(preset); - const std::string m = " METRIC_TYPE "+_param.get_metric_type_str(); - const std::string d = " DISTANCE_TYPE "+_param.get_distance_type_str(); - const std::string dm = d+m; - - if (SGTELIB::streqi(p,"DEFAULT")) { - model_list_add("TYPE PRS DEGREE 1 RIDGE 0"); - model_list_add("TYPE PRS DEGREE 1 RIDGE 0.001"); - model_list_add("TYPE PRS DEGREE 2 RIDGE 0"); - model_list_add("TYPE PRS DEGREE 2 RIDGE 0.001"); - model_list_add("TYPE PRS DEGREE 3 RIDGE 0.0"); - model_list_add("TYPE PRS DEGREE 6 RIDGE 0.001"); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 0.1"+dm); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 0.3"+dm); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 1 "+dm); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 3 "+dm); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 10 "+dm); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 0.3"+dm); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 1 "+dm); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 3 "+dm); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 10 "+dm); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE I1"+dm); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE I2"+dm); - model_list_add("TYPE CN"+dm); - } - else if (SGTELIB::streqi(p,"KS")) { - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 0.1"+d); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 0.2"+d); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 0.5"+d); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 1 "+d); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 2 "+d); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 5 "+d); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 10 "+d); - } - else if (SGTELIB::streqi(p,"PRS")) { - model_list_add("TYPE PRS DEGREE 1"); - model_list_add("TYPE PRS DEGREE 2"); - model_list_add("TYPE PRS DEGREE 3"); - model_list_add("TYPE PRS DEGREE 4"); - model_list_add("TYPE PRS DEGREE 5"); - model_list_add("TYPE PRS DEGREE 6"); - } - else if (SGTELIB::streqi(p,"IS0")) { - model_list_add("TYPE PRS_EDGE DEGREE 2"); - model_list_add("TYPE PRS_EDGE DEGREE 3"); - - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 0.1 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 0.2 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 0.5 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 1 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 2 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 5 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 10 DISTANCE_TYPE NORM2_IS0"); - - model_list_add("TYPE KS KERNEL_TYPE D2 KERNEL_COEF 0.1 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE KS KERNEL_TYPE D2 KERNEL_COEF 0.2 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE KS KERNEL_TYPE D2 KERNEL_COEF 0.5 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE KS KERNEL_TYPE D2 KERNEL_COEF 1 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE KS KERNEL_TYPE D2 KERNEL_COEF 2 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE KS KERNEL_TYPE D2 KERNEL_COEF 5 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE KS KERNEL_TYPE D2 KERNEL_COEF 10 DISTANCE_TYPE NORM2_IS0"); - - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 0.1 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 0.2 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 0.5 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 1 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 2 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 5 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 10 DISTANCE_TYPE NORM2_IS0"); - - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D2 KERNEL_COEF 0.1 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D2 KERNEL_COEF 0.2 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D2 KERNEL_COEF 0.5 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D2 KERNEL_COEF 1 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D2 KERNEL_COEF 2 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D2 KERNEL_COEF 5 DISTANCE_TYPE NORM2_IS0"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D2 KERNEL_COEF 10 DISTANCE_TYPE NORM2_IS0"); - } - else if (SGTELIB::streqi(p,"CAT")) { - model_list_add("TYPE PRS_CAT DEGREE 2"); - model_list_add("TYPE PRS_CAT DEGREE 3"); - - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 0.1 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 0.2 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 0.5 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 1 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 2 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 5 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE KS KERNEL_TYPE D1 KERNEL_COEF 10 DISTANCE_TYPE NORM2_CAT"); - - model_list_add("TYPE KS KERNEL_TYPE D2 KERNEL_COEF 0.1 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE KS KERNEL_TYPE D2 KERNEL_COEF 0.2 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE KS KERNEL_TYPE D2 KERNEL_COEF 0.5 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE KS KERNEL_TYPE D2 KERNEL_COEF 1 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE KS KERNEL_TYPE D2 KERNEL_COEF 2 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE KS KERNEL_TYPE D2 KERNEL_COEF 5 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE KS KERNEL_TYPE D2 KERNEL_COEF 10 DISTANCE_TYPE NORM2_CAT"); - - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 0.1 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 0.2 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 0.5 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 1 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 2 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 5 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D1 KERNEL_COEF 10 DISTANCE_TYPE NORM2_CAT"); - - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D2 KERNEL_COEF 0.1 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D2 KERNEL_COEF 0.2 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D2 KERNEL_COEF 0.5 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D2 KERNEL_COEF 1 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D2 KERNEL_COEF 2 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D2 KERNEL_COEF 5 DISTANCE_TYPE NORM2_CAT"); - model_list_add("TYPE RBF PRESET I KERNEL_TYPE D2 KERNEL_COEF 10 DISTANCE_TYPE NORM2_CAT"); - } - else if (SGTELIB::streqi(p,"SUPER1")) { - model_list_add("TYPE KS KERNEL_TYPE OPTIM KERNEL_COEF OPTIM"+dm); - model_list_add("TYPE RBF KERNEL_TYPE OPTIM KERNEL_COEF OPTIM RIDGE 0.001 PRESET I"+dm); - model_list_add("TYPE PRS DEGREE OPTIM RIDGE OPTIM"+m); - model_list_add("TYPE LOWESS DEGREE OPTIM RIDGE 0.001 KERNEL_COEF OPTIM KERNEL_TYPE D1"+dm); - } - else if (SGTELIB::streqi(p,"SMALL")) { - model_list_add("TYPE PRS"); - model_list_add("TYPE KS"); - model_list_add("TYPE RBF PRESET I"); - } - else if (SGTELIB::streqi(p,"NONE")) { - // None - } - else { - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Ensemble::model_list_preset: unrecognized preset \""+preset+"\"" ); - } - - #ifdef ENSEMBLE_DEBUG - std::cout << "END Build model list\n"; - #endif - -}// - - diff --git a/ext/sgtelib/src/Surrogate_Ensemble.hpp b/ext/sgtelib/src/Surrogate_Ensemble.hpp deleted file mode 100644 index 59c5f23..0000000 --- a/ext/sgtelib/src/Surrogate_Ensemble.hpp +++ /dev/null @@ -1,130 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_SURROGATE_ENSEMBLE__ -#define __SGTELIB_SURROGATE_ENSEMBLE__ - -#include "Surrogate.hpp" -#include "Surrogate_Factory.hpp" - - -//#include <time.h> - - -namespace SGTELIB { - - const double wta3_alpha = 0.05; - const double wta3_beta = -1; - - /*--------------------------------------*/ - /* Surrogate_Ensemble class */ - /*--------------------------------------*/ - class Surrogate_Ensemble : public SGTELIB::Surrogate { - - /*--------------------------------------------------------*/ - /* these members are defined in the Surrogate superclass */ - /*--------------------------------------------------------*/ - // int _p; // number of data points in X and Z - // int _n; // dimension -- number of variables - // int _m; // number of outputs (includes the objective) - - protected: - - int _kmax; // Nb of surrogates in the ensemble - int _kready; // Nb of surrogates READY in the ensemble - //SGTELIB::Matrix _W; // Weight vector - std::vector<SGTELIB::Surrogate *> _surrogates; // List des surrogates - bool * _active; // Array of boolean. Is _active[k] is true if surrogate k is ready - // AND if there is a j such that W(k,j)!=0 - // ie: the weight in k is non null for at least one output - double * _metric; // Value of the metric for the Ensemble - - // build model (private): - virtual bool build_private (void); - virtual bool init_private (void); - - // Compute metrics - virtual const SGTELIB::Matrix * get_matrix_Zhs (void); - virtual const SGTELIB::Matrix * get_matrix_Shs (void); - virtual const SGTELIB::Matrix * get_matrix_Zvs (void); - - void compute_W_by_select(void); - void compute_W_by_wta1 (void); - void compute_W_by_wta3 (void); - - // predict model (private): - virtual void predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZ , - SGTELIB::Matrix * std, - SGTELIB::Matrix * ei , - SGTELIB::Matrix * cdf ); - - virtual void predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZ ); - - - public: - - // Constructor - Surrogate_Ensemble ( SGTELIB::TrainingSet & trainingset , - SGTELIB::Surrogate_Parameters param) ; - - /* - Surrogate_Ensemble ( SGTELIB::TrainingSet & trainingset , - const std::string & s) ; - */ - - // destructor: - virtual ~Surrogate_Ensemble ( void ); - - virtual void display_private ( std::ostream & out ) const; - void display ( std::ostream & out , const int k ) const {_surrogates.at(k)->display(out);}; - - // ==============================================// - // Method for inspection of the basic surrogates // - // ==============================================// - - // Test if basic model k is ready. - bool is_ready (const int k) const; - - // Compute the boolean array _active - void compute_active_models ( void ) ; - // Check the weight vector - bool check_weight_vector ( void ) const; - - - - // ==============================================// - // Method to define the model_list // - // ==============================================// - void model_list_display ( std::ostream & out ); - void model_list_preset ( const std::string & preset ); - void model_list_remove_all ( void ); - void model_list_add ( const std::string & definition ); - - }; -} - -#endif diff --git a/ext/sgtelib/src/Surrogate_Factory.cpp b/ext/sgtelib/src/Surrogate_Factory.cpp deleted file mode 100644 index 205bb23..0000000 --- a/ext/sgtelib/src/Surrogate_Factory.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "Surrogate_Factory.hpp" - - -/*----------------------------------------------------------*/ -SGTELIB::Surrogate * SGTELIB::Surrogate_Factory (SGTELIB::Matrix & X0, - SGTELIB::Matrix & Z0, - const std::string & s ){ - SGTELIB::TrainingSet * TS; - TS = new SGTELIB::TrainingSet(X0,Z0); - TS->info(); - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_factory: constructor from matrices is forbiden." ); - return SGTELIB::Surrogate_Factory(*TS,s); -}// -/*----------------------------------------------------------*/ - - - - - -/*----------------------------------------------------------*/ -SGTELIB::Surrogate * SGTELIB::Surrogate_Factory ( SGTELIB::TrainingSet & TS, - const std::string & s ) { -/*----------------------------------------------------------*/ - - #ifdef SGTELIB_DEBUG - std::cout << "SGTELIB::Surrogate_Factory (TS,p) begin\n"; - std::cout << "s = " << s << "\n"; - TS.info(); - #endif - - SGTELIB::Surrogate * S; - SGTELIB::Surrogate_Parameters p ( s ); - - - - switch ( p.get_type() ) { - - case SGTELIB::SVN: - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Factory: not implemented yet! \""+s+"\"" ); - - case SGTELIB::PRS: - S = new Surrogate_PRS(TS,p); - break; - - case SGTELIB::PRS_EDGE: - S = new Surrogate_PRS_EDGE(TS,p); - break; - - case SGTELIB::PRS_CAT: - S = new Surrogate_PRS_CAT(TS,p); - break; - - case SGTELIB::KS: - S = new Surrogate_KS(TS,p); - break; - - case SGTELIB::CN: - S = new Surrogate_CN(TS,p); - break; - - case SGTELIB::RBF: - S = new Surrogate_RBF(TS,p); - break; - - case SGTELIB::LOWESS: - S = new Surrogate_LOWESS(TS,p); - break; - - case SGTELIB::ENSEMBLE: - S = new Surrogate_Ensemble(TS,p); - break; - - case SGTELIB::KRIGING: - S = new Surrogate_Kriging(TS,p); - break; - - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined type" ); - } - - - #ifdef SGTELIB_DEBUG - std::cout << "SGTELIB::Surrogate_Factory (TS,p) AFTER set param\n"; - std::cout << "TS.info()\n"; - TS.info(); - std::cout << "S->info()\n"; - S->info(); - std::cout << "SGTELIB::Surrogate_Factory (TS,p) RETURN\n"; - #endif - return S; - -}// - - -/*----------------------------------------------------------*/ -void SGTELIB::surrogate_delete ( SGTELIB::Surrogate * S ){ -/*----------------------------------------------------------*/ - if (S){ - #ifdef SGTELIB_DEBUG - std::cout << "Delete surrogate\n"; - #endif - delete S; - S = NULL; - } -}// - diff --git a/ext/sgtelib/src/Surrogate_Factory.hpp b/ext/sgtelib/src/Surrogate_Factory.hpp deleted file mode 100644 index 6ba52c5..0000000 --- a/ext/sgtelib/src/Surrogate_Factory.hpp +++ /dev/null @@ -1,56 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SURROGATE_FACTORY__ -#define __SURROGATE_FACTORY__ - -#include "Defines.hpp" -#include "Exception.hpp" -#include "Surrogate.hpp" -#include "Surrogate_KS.hpp" -#include "Surrogate_CN.hpp" -#include "Surrogate_RBF.hpp" -#include "Surrogate_PRS.hpp" -#include "Surrogate_PRS_EDGE.hpp" -#include "Surrogate_PRS_CAT.hpp" -//#include "Surrogate_dynaTree.hpp" -#include "Surrogate_Ensemble.hpp" -#include "Surrogate_LOWESS.hpp" -#include "Surrogate_Kriging.hpp" - -namespace SGTELIB { - -SGTELIB::Surrogate * Surrogate_Factory ( SGTELIB::TrainingSet & C, - const std::string & s ); - -SGTELIB::Surrogate * Surrogate_Factory ( SGTELIB::Matrix & X0, - SGTELIB::Matrix & Z0, - const std::string & s ); - -void surrogate_delete ( SGTELIB::Surrogate * S ); - -} - -#endif diff --git a/ext/sgtelib/src/Surrogate_KS.cpp b/ext/sgtelib/src/Surrogate_KS.cpp deleted file mode 100644 index 2380598..0000000 --- a/ext/sgtelib/src/Surrogate_KS.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "Surrogate_KS.hpp" - -/*----------------------------*/ -/* constructor */ -/*----------------------------*/ -SGTELIB::Surrogate_KS::Surrogate_KS ( SGTELIB::TrainingSet & trainingset, - SGTELIB::Surrogate_Parameters param) : - SGTELIB::Surrogate ( trainingset , param ) { - #ifdef SGTELIB_DEBUG - std::cout << "constructor KS\n"; - #endif -}// - - -/*----------------------------*/ -/* destructor */ -/*----------------------------*/ -SGTELIB::Surrogate_KS::~Surrogate_KS ( void ) { - -}// - - -/*--------------------------------------*/ -/* display */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_KS::display_private ( std::ostream & out ) const { - out << "(No special members)\n"; -}// - - -/*--------------------------------------*/ -/* build_private */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_KS::build_private ( void ) { - - // Verify that the kernel is decreasing - if ( ! kernel_is_decreasing(_param.get_kernel_type())){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_KS::build_private(): Kernel must be decreasing for KS model" ); - } - - _ready = true; - return true; -}// - -/*--------------------------------------*/ -/* predict_private (ZZs only) */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_KS::predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs) { - - // i: index of a point in Xs - // ixx: index of a point in XXs - // j: index of an output (ie: a column of ZZs) - int i,ixx,j; - - // pxx: nb of prediction points - int pxx = XXs.get_nb_rows(); - - // D : distance between points of XXs and other points of the trainingset - SGTELIB::Matrix D = _trainingset.get_distances(XXs,get_matrix_Xs(),_param.get_distance_type()); - - // Kernel shape coefficient - //double ks = _param.get_kernel_coef() / _trainingset.get_Ds_mean(); - double ks = _param.get_kernel_coef() / _trainingset.get_Ds_mean(); - - // Compute weights - SGTELIB::Matrix phi = kernel(_param.get_kernel_type(),ks,D); - - const SGTELIB::Matrix & Zs = get_matrix_Zs(); - - SGTELIB::Matrix PhiZ = phi*Zs; - SGTELIB::Matrix Div = phi.sum(2); - Div.hadamard_inverse(); - *ZZs = SGTELIB::Matrix::diagA_product(Div,PhiZ); - - if (Div.has_inf()){ - // Loop on the points of XXs - for (ixx=0 ; ixx<pxx ; ixx++){ - if ( isinf(Div.get(ixx,0)) ){ - // Need to use the limit behavior of kernels - switch (_param.get_kernel_type()){ - case SGTELIB::KERNEL_D1: - case SGTELIB::KERNEL_D4: - case SGTELIB::KERNEL_D5: - // imin is the index of the closest neighbor of xx in Xs - i = D.get_min_index_row(ixx); - // Copy the output of this point - ZZs->set_row( Zs.get_row(i) , ixx); - break; - case SGTELIB::KERNEL_D2: - case SGTELIB::KERNEL_D3: - case SGTELIB::KERNEL_D6: - // Use the mean of the output over the trainingset - for (j=0 ; j<_m ; j++){ - ZZs->set(ixx,j,_trainingset.get_Zs_mean(j)); - } - break; - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_KS::predict_private: Unacceptable kernel type" ); - } - } - } - } - -}// - - -/*--------------------------------------*/ -/* get_matrix_Zvs */ -/*--------------------------------------*/ -const SGTELIB::Matrix * SGTELIB::Surrogate_KS::get_matrix_Zvs (void){ - - check_ready(__FILE__,__FUNCTION__,__LINE__); - - // Check that it's NULL - if ( ! _Zvs ){ - - #ifdef SGTELIB_DEBUG - std::cout << "Compute _Zvs\n"; - #endif - - // Init the matrix - _Zvs = new SGTELIB::Matrix("Zvs",_p,_m); - - // i : index of point of the trainingset - // j : index of an output of the trainingset - // iv: index of the point which is excluded from the model construction, and where the - // cross-validation model is evaluated. - int i,j,iv; - - // w : sum of the weights - // wz : sum of (weights*output) - // z : predicted output (= wz/z) - double w,wz,z; - - // Construction of the phi matrix - // phi(i,iv) = kernel( || x(i) - x(iv) || ) - //double ks = _param.get_kernel_coef() / _trainingset.get_Ds_mean(); - double ks = _param.get_kernel_coef() / _trainingset.get_Ds_mean(); - - // D : distance between points of XXs and other points of the trainingset - SGTELIB::Matrix D = _trainingset.get_distances(get_matrix_Xs(),get_matrix_Xs(),_param.get_distance_type()); - - SGTELIB::Matrix phi; - phi = kernel(_param.get_kernel_type(),ks,D); - - // Loop on the outputs - for (j=0 ; j<_m ; j++){ - - // Compute the LOO-CV prediction for output j - for (iv=0 ; iv<_p ; iv++){ - w = 0; - wz= 0; - // Loop on the points of the trainingset - for (i=0 ; i<_p ; i++){ - // exclude the point iv from the construction - if (i!=iv){ - w += phi.get(i,iv); - wz+= phi.get(i,iv)*_trainingset.get_Zs(i,j); - } - } - - // Compute z - if (w>EPSILON){ - // Normal method - z = wz/w; - } - else{ - // Need to use the limit behavior of kernels - switch (_param.get_kernel_type()){ - case SGTELIB::KERNEL_D1: - case SGTELIB::KERNEL_D4: - case SGTELIB::KERNEL_D5: - { - // Find the closest point to iv - // Nb: We must have imin != iv - double d; - double dmin = SGTELIB::INF; - int imin = 0; // no need to init imin; - // Loop on the points of the trainingset - for (i=0 ; i<_p ; i++){ - - d = D.get(i,iv); - if ( (i!=iv) && (d<dmin) ){ - dmin = d; - imin = i; - } - } - // Copy the output of this point - z = _trainingset.get_Zs(imin,j); - break; - } - case SGTELIB::KERNEL_D2: - case SGTELIB::KERNEL_D3: - case SGTELIB::KERNEL_D6: - // Use the mean of the output over the trainingset - // Loop on the outputs - z = _trainingset.get_Zs_mean(j); - break; - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_KS::predict_private: Unacceptable kernel type" ); - } - }// End of special case for computation of z - - // Affectation of the CV prediction - _Zvs->set(iv,j,z); - } - - } - _Zvs->replace_nan(+INF); - _Zvs->set_name("Zvs"); - } - return _Zvs; - -}// - -/*--------------------------------------*/ -/* get_matrix_Zhs */ -/*--------------------------------------*/ -const SGTELIB::Matrix * SGTELIB::Surrogate_KS::get_matrix_Zhs (void){ - - check_ready(__FILE__,__FUNCTION__,__LINE__); - - // Check that it's NULL - if ( ! _Zhs ){ - - #ifdef SGTELIB_DEBUG - std::cout << "Compute _Zhs\n"; - #endif - - int ixx,j; - - // w : sum of the weights - // wz : sum of (weights*output) - double w; - SGTELIB::Matrix wZ; - - // Init the matrix - _Zhs = new SGTELIB::Matrix("Zhs",_p,_m); - - // Construction of the phi matrix - double ks = _param.get_kernel_coef() / _trainingset.get_Ds_mean(); - SGTELIB::Matrix phi; - SGTELIB::Matrix D = _trainingset.get_distances(get_matrix_Xs(),get_matrix_Xs(),_param.get_distance_type()); - phi = kernel(_param.get_kernel_type(),ks,D); - SGTELIB::Matrix phi_ixx; - const SGTELIB::Matrix & Zs = get_matrix_Zs(); - - // Loop on the outputs - for (j=0 ; j<_m ; j++){ - // Compute the prediction for output j - for (ixx=0 ; ixx<_p ; ixx++){ - phi_ixx = phi.get_row(ixx); - w = phi_ixx.sum(); - wZ = phi_ixx*Zs; - _Zhs->set_row( wZ/w , ixx ); - } - - } - - _Zhs->replace_nan(+INF); - _Zhs->set_name("Zhs"); - - } - return _Zhs; - -}// - - - - - - - - - - - - - - - - - - - diff --git a/ext/sgtelib/src/Surrogate_KS.hpp b/ext/sgtelib/src/Surrogate_KS.hpp deleted file mode 100644 index 2869e2a..0000000 --- a/ext/sgtelib/src/Surrogate_KS.hpp +++ /dev/null @@ -1,64 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_SURROGATE_KS__ -#define __SGTELIB_SURROGATE_KS__ - -#include "Surrogate.hpp" - -namespace SGTELIB { - - /*--------------------------------------*/ - /* Surrogate_KS class */ - /*--------------------------------------*/ - class Surrogate_KS : public SGTELIB::Surrogate { - - private: - - virtual bool build_private (void); - - virtual void predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs); - - // Compute metrics - virtual const SGTELIB::Matrix * get_matrix_Zvs (void); - virtual const SGTELIB::Matrix * get_matrix_Zhs (void); - - public: - - // Constructor - Surrogate_KS ( SGTELIB::TrainingSet & trainingset , - SGTELIB::Surrogate_Parameters param) ; - - // destructor: - virtual ~Surrogate_KS ( void ); - - virtual void display_private ( std::ostream & out ) const; - - }; -} - -#endif - diff --git a/ext/sgtelib/src/Surrogate_Kriging.cpp b/ext/sgtelib/src/Surrogate_Kriging.cpp deleted file mode 100644 index e86a859..0000000 --- a/ext/sgtelib/src/Surrogate_Kriging.cpp +++ /dev/null @@ -1,324 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "Surrogate_Kriging.hpp" - - -/*----------------------------*/ -/* constructor */ -/*----------------------------*/ -SGTELIB::Surrogate_Kriging::Surrogate_Kriging ( SGTELIB::TrainingSet & trainingset, - SGTELIB::Surrogate_Parameters param) : - SGTELIB::Surrogate ( trainingset , param ), - _R ( "R",0,0 ), - _Ri ( "Ri",0,0 ), - _H ( "H",0,0 ), - _alpha ( "alpha",0,0 ), - _beta ( "beta",0,0 ), - _var ( "var",0,0 ){ - #ifdef SGTELIB_DEBUG - std::cout << "constructor Kriging\n"; - #endif - -}// - -/*----------------------------*/ -/* destructor */ -/*----------------------------*/ -SGTELIB::Surrogate_Kriging::~Surrogate_Kriging ( void ) { - -}// - - -/*----------------------------*/ -/* display */ -/*----------------------------*/ -void SGTELIB::Surrogate_Kriging::display_private ( std::ostream & out ) const { - //_alpha.display(out); - _beta.display(out); - _var.display(out); -}// - - -/*--------------------------------------*/ -/* init_private */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_Kriging::init_private ( void ) { - #ifdef SGTELIB_DEBUG - std::cout << "Surrogate_Kriging : init_private\n"; - #endif - return true; -}// - - -/*--------------------------------------*/ -/* build */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_Kriging::build_private ( void ) { - - // The build mainly consists of computing alpha - - // Compute scaling distance for each training point - const int mvar = _trainingset.get_mvar(); - const int nvar = _trainingset.get_nvar(); - const SGTELIB::Matrix & Zs = get_matrix_Zs(); - - _R = compute_covariance_matrix(get_matrix_Xs()); - _H = SGTELIB::Matrix::ones(_p,1); - _Ri = _R.lu_inverse(&_detR); - - if (_detR<=0){ - _detR = +INF; - return false; - } - - - //std::cout << "detR = "<< _detR << "\n"; - const SGTELIB::Matrix HRi = _H.transpose()*_Ri; - const SGTELIB::Matrix HRiH = HRi*_H; - _beta = HRiH.cholesky_inverse() * HRi * Zs; - _alpha = _Ri*(Zs-_H*_beta); - - _beta.set_name("beta"); - _alpha.set_name("alpha"); - - _var = SGTELIB::Matrix("var",1,mvar); - double v; - SGTELIB::Matrix Zj; - SGTELIB::Matrix Vj; - for (int j=0 ; j<mvar ; j++){ - Zj = Zs.get_col(j); - Zj = (Zj-_H*_beta.get_col(j)); - Vj = Zj.transpose() * _Ri * Zj; - v = Vj.get(0,0) / (_p-nvar); - if (v<0) return false; - _var.set(0,j,v); - - } - - _ready = true; - return true; - -}// - - - - - -/*--------------------------------------*/ -/* Compute Design matrix */ -/*--------------------------------------*/ -const SGTELIB::Matrix SGTELIB::Surrogate_Kriging::compute_covariance_matrix ( const SGTELIB::Matrix & XXs ) { - - // Xs can be, either the training set, to build the model, or prediction points. - const int pxx = XXs.get_nb_rows(); - const SGTELIB::Matrix Xs = get_matrix_Xs(); - const SGTELIB::Matrix coef = _param.get_covariance_coef(); - const SGTELIB::Matrix D = _trainingset.get_distances(XXs,get_matrix_Xs(),_param.get_distance_type()); - - SGTELIB::Matrix R ("R",pxx,_p); - - double d, cov;// dsum; - for (int i1=0 ; i1<pxx ; i1++){ - for (int i2=0 ; i2<_p ; i2++){ - d = D.get(i1,i2); - cov = coef[1] * pow(d,coef[0]); - cov = exp(-cov); - // Add noise if the distance is 0. - if (d==0) cov = 1.0+_param.get_ridge(); - R.set(i1,i2,cov); - } - } - - return R; -}// - - - - -/*--------------------------------------*/ -/* predict (ZZs only) */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_Kriging::predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs) { - check_ready(__FILE__,__FUNCTION__,__LINE__); - const int pxx = XXs.get_nb_rows(); - const SGTELIB::Matrix r = compute_covariance_matrix(XXs).transpose(); - *ZZs = SGTELIB::Matrix::ones(pxx,1)*_beta + r.transpose() * _alpha; -}// - - -void SGTELIB::Surrogate_Kriging::predict_private (const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs, - SGTELIB::Matrix * std, - SGTELIB::Matrix * ei , - SGTELIB::Matrix * cdf) { - check_ready(__FILE__,__FUNCTION__,__LINE__); - - const int pxx = XXs.get_nb_rows(); - const double fs_min = _trainingset.get_fs_min(); - const SGTELIB::Matrix r = compute_covariance_matrix(XXs).transpose(); - int i,j; - - // Predict ZZ - if (ZZs) predict_private(XXs,ZZs); - - // Predict std - if (std) std->fill(-SGTELIB::INF); - else std = new SGTELIB::Matrix ("std",pxx,_m); - - double rRr; - const double HRH = (_H.transpose()*_Ri*_H).get(0,0); - - double v; - SGTELIB::Matrix ri; - for (i=0 ; i<pxx ; i++){ - ri = r.get_col(i); - rRr = (ri.transpose()*_Ri*ri).get(0,0); - if (fabs(rRr-1)<EPSILON){ - v = fabs(rRr-1); - } - else{ - v = 1-rRr+(1-rRr)*(1-rRr)/HRH; - } - v = fabs(v); - for (j=0 ; j<_m ; j++){ - std->set(i,j,v*_var[j]); - } - } - - // Prediction of statistical data - if ( (ei) || (cdf) ){ - double v; - if (ei) ei->fill(-SGTELIB::INF); - if (cdf) cdf->fill(-SGTELIB::INF); - for (j=0 ; j<_m ; j++){ - if (_trainingset.get_bbo(j)==SGTELIB::BBO_OBJ){ - // Compute CDF - if (cdf){ - for (i=0 ; i<pxx ; i++){ - v = normcdf( fs_min , ZZs->get(i,j) , std->get(i,j) ); - if (v<0) v=0; - cdf->set(i,j,v); - } - } - if (ei){ - for (i=0 ; i<pxx ; i++){ - v = normei( ZZs->get(i,j) , std->get(i,j) , fs_min ); - if (v<0) v=0; - ei->set(i,j,v ); - } - } - }// END CASE OBJ - else if (_trainingset.get_bbo(j)==SGTELIB::BBO_CON){ - // Compute CDF - if (cdf){ - // Scaled Feasibility Threshold - double cs = _trainingset.Z_scale(0.0,j); - for (i=0 ; i<pxx ; i++){ - v = normcdf( cs , ZZs->get(i,j) , std->get(i,j) ); - if (v<0) v=0; - cdf->set(i,j,v); - } - } - }// END CASE CON - }// End for j - } - -}// - - - - - -bool SGTELIB::Surrogate_Kriging::compute_cv_values (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - - if ((_Zvs) && (_Svs)) return true; - - const SGTELIB::Matrix & Zs = get_matrix_Zs(); - const SGTELIB::Matrix RiH = _Ri*_H; - const SGTELIB::Matrix Q = _Ri - RiH*( _H.transpose()*_Ri*_H)*RiH.transpose(); - const SGTELIB::Matrix dQ = Q.diag_inverse(); - - // Init matrices - if ( ! _Zvs){ - _Zvs = new SGTELIB::Matrix; - *_Zvs = Zs - SGTELIB::Matrix::diagA_product(dQ,Q)*Zs; - _Zvs->replace_nan(+INF); - _Zvs->set_name("Zvs"); - } - - if ( ! _Svs){ - _Svs = new SGTELIB::Matrix ("Svs",_p,_m); - double q; - for (int i=0 ; i<_p ; i++){ - q = dQ.get(i,i); - for (int j=0 ; j<_m ; j++){ - _Svs->set(i,j,sqrt(_var[j]*q)); - } - } - _Svs->replace_nan(+INF); - _Svs->set_name("Svs"); - } - return true; -}// - - -/*--------------------------------------*/ -/* get cv values */ -/*--------------------------------------*/ -const SGTELIB::Matrix * SGTELIB::Surrogate_Kriging::get_matrix_Zvs (void){ - compute_cv_values(); - return _Zvs; -} -const SGTELIB::Matrix * SGTELIB::Surrogate_Kriging::get_matrix_Svs (void){ - compute_cv_values(); - return _Svs; -} - - -/*--------------------------------------*/ -/* compute linv */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_Kriging::compute_metric_linv (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - if ( ! _metric_linv){ - #ifdef SGTELIB_DEBUG - std::cout << "Compute _metric_linv\n"; - #endif - _metric_linv = new double [_m]; - for (int j=0 ; j<_m ; j++){ - _metric_linv[j] = pow(_var[j],_p)*_detR; - } - } - -}// - - - - - - diff --git a/ext/sgtelib/src/Surrogate_Kriging.hpp b/ext/sgtelib/src/Surrogate_Kriging.hpp deleted file mode 100644 index ca399c9..0000000 --- a/ext/sgtelib/src/Surrogate_Kriging.hpp +++ /dev/null @@ -1,111 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_SURROGATE_KRIGING__ -#define __SGTELIB_SURROGATE_KRIGING__ - -#include "Surrogate.hpp" - -namespace SGTELIB { - - /*--------------------------------------*/ - /* Surrogate_Kriging class */ - /*--------------------------------------*/ - class Surrogate_Kriging : public SGTELIB::Surrogate { - - /*--------------------------------------------------------*/ - /* these members are defined in the Surrogate superclass */ - /*--------------------------------------------------------*/ - // int _p; // number of data points in X and Z - // int _n; // dimension -- number of variables - // int _m; // number of outputs (includes the objective) - - private: - - /*--------------------------------------*/ - /* Attributes */ - /*--------------------------------------*/ - SGTELIB::Matrix _R; // Covariance Matrix - SGTELIB::Matrix _Ri; // Inverte of _R - SGTELIB::Matrix _H; // Polynomial terms - SGTELIB::Matrix _alpha; - SGTELIB::Matrix _beta; - SGTELIB::Matrix _var; - double _detR; - - /*--------------------------------------*/ - /* Building methods */ - /*--------------------------------------*/ - const SGTELIB::Matrix compute_covariance_matrix ( const SGTELIB::Matrix & XXs ); - - /*--------------------------------------*/ - /* Build model */ - /*--------------------------------------*/ - virtual bool build_private (void); - virtual bool init_private (void); - //void init_covariance_coef (void); - virtual void compute_metric_linv (void); - bool compute_cv_values (void); - - /*--------------------------------------*/ - /* predict */ - /*--------------------------------------*/ - virtual void predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs); - - virtual void predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs, - SGTELIB::Matrix * std, - SGTELIB::Matrix * ei , - SGTELIB::Matrix * cdf ); - - /*--------------------------------------*/ - /* Compute matrices */ - /*--------------------------------------*/ - virtual const SGTELIB::Matrix * get_matrix_Zvs (void); - virtual const SGTELIB::Matrix * get_matrix_Svs (void); - - public: - - /*--------------------------------------*/ - /* Constructor */ - /*--------------------------------------*/ - Surrogate_Kriging ( SGTELIB::TrainingSet & trainingset , - SGTELIB::Surrogate_Parameters param) ; - - /*--------------------------------------*/ - /* Destructor */ - /*--------------------------------------*/ - virtual ~Surrogate_Kriging ( void ); - - /*--------------------------------------*/ - /* Misc */ - /*--------------------------------------*/ - virtual void display_private ( std::ostream & out ) const; - - }; -} - -#endif diff --git a/ext/sgtelib/src/Surrogate_LOWESS.cpp b/ext/sgtelib/src/Surrogate_LOWESS.cpp deleted file mode 100644 index 5728edd..0000000 --- a/ext/sgtelib/src/Surrogate_LOWESS.cpp +++ /dev/null @@ -1,709 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "Surrogate_LOWESS.hpp" - -//#define SGTELIB_LOWESS_DEV -//#define SGTELIB_DEBUG - - -const int GAMMA_EXP = 2; - -/*----------------------------*/ -/* constructor */ -/*----------------------------*/ -SGTELIB::Surrogate_LOWESS::Surrogate_LOWESS ( SGTELIB::TrainingSet & trainingset, - SGTELIB::Surrogate_Parameters param) : - SGTELIB::Surrogate ( trainingset , param ), - _q ( 0 ), - _q_old ( 99999999 ), - _degree ( 0 ), - _H ( NULL ), - _W ( NULL ), - _A ( NULL ), - _HWZ ( NULL ), - _u ( NULL ), - _old_u ( NULL ), - _old_x ( NULL ), - _ZZsi ("ZZsi",0,0){ - #ifdef SGTELIB_DEBUG - std::cout << "constructor LOWESS\n"; - #endif -}// - - -/*--------------------------------------*/ -/* delete matrices */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_LOWESS::delete_matrices ( void ) { - - if (_W) delete [] _W; - _W = NULL; - - if (_u) delete []_u; - _u = NULL; - - if (_old_u) delete [] _old_u; - _old_u = NULL; - - if (_old_x) delete [] _old_x; - _old_x = NULL; - - - const int p = std::min(_p_old,_p); - if (_H){ - for (int i=0 ; i<p ; i++) delete [] _H[i]; - delete [] _H; - } - _H = NULL; - - - const int q = std::min(_q_old,_q); - if (_A){ - for (int i=0 ; i<q ; i++) delete [] _A[i]; - delete [] _A; - } - _A = NULL; - - if (_HWZ){ - for (int i=0 ; i<q ; i++) delete [] _HWZ[i]; - delete [] _HWZ; - } - _HWZ = NULL; -}// - - -/*--------------------------------------*/ -/* destructor */ -/*--------------------------------------*/ -SGTELIB::Surrogate_LOWESS::~Surrogate_LOWESS ( void ) { - delete_matrices(); -}// - - - - -/*----------------------------*/ -/* display */ -/*----------------------------*/ -void SGTELIB::Surrogate_LOWESS::display_private ( std::ostream & out ) const { - out << "q: " << _q << "\n"; -}// - -/*--------------------------------------*/ -/* build */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_LOWESS::build_private ( void ) { - - const int pvar = _trainingset.get_pvar(); - - if (pvar<2) return false; - - // Get the number of basis functions. - const int n1=_trainingset.get_X_nbdiff1(); - const int n2=_trainingset.get_X_nbdiff2(); - const int q10 = 1+n1; - const int q15 = 1+n1+n2; - const int q20 = 1+n1+n2*(n2+1)/2; - const int degree_max = _param.get_degree(); - if ((pvar>q20) & (degree_max>=2)){ - _q = q20; - _degree = 20; - } - else if ((pvar>q15) & (degree_max>=2)){ - _q = q15; - _degree = 15; - } - else if ((pvar>q10) & (degree_max>=1)){ - _q = q10; - _degree = 10; - } - else{ - _q = 1; - _degree = 0; - } - - #ifdef SGTELIB_DEBUG - std::cout << "_q = " << _q << " (degree=" << double(_degree)/10 << ")\n"; - #endif - - // Init matrices for prediction - - delete_matrices(); - - if ( ! _W){ - _W = new double [_p]; - } - if ( ! _A){ - _A = new double * [_q]; - for (int j=0 ; j<_q ; j++) _A[j] = new double [_q]; - } - if ( ! _H){ - _H = new double * [_p]; - for (int j=0 ; j<_p ; j++) _H[j] = new double [_q]; - } - if ( ! _HWZ){ - _HWZ = new double * [_q]; - for (int j=0 ; j<_q ; j++) _HWZ[j] = new double [_m]; - } - if ( ! _u){ - _u = new double [_q]; - for (int i=0 ; i<_q ; i++) _u[i] = 0.0; - } - if ( ! _old_u){ - _old_u = new double [_q]; - for (int i=0 ; i<_q ; i++) _old_u[i] = 0.0; - } - #ifdef SGTELIB_LOWESS_DEV - if ( ! _old_x){ - _old_x = new double [_n]; - for (int i=0 ; i<_n ; i++) _old_x[i] = 0.0; - } - #endif - - _ZZsi = SGTELIB::Matrix("ZZsi",1,_m); - #ifdef SGTELIB_DEBUG - std::cout << "Line " << __LINE__ << "(End of private build)\n"; - #endif - - _q_old = _q; - - // C.Tribes jan 17th, 2017 --- update _p_old to prevent memory leak - _p_old = _p; - - _ready = true; - return true; -}// - - - - -/*--------------------------------------*/ -/* predict (ZZs only) */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_LOWESS::predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs ) { - - check_ready(__FILE__,__FUNCTION__,__LINE__); - const int pxx = XXs.get_nb_rows(); - if (pxx>1){ - for (int i=0 ; i<XXs.get_nb_rows() ; i++){ - #ifdef SGTELIB_DEBUG - std::cout << "============================================\n"; - std::cout << "Prediction of point " << i << "/" << XXs.get_nb_rows() << "\n"; - std::cout << "============================================\n"; - #endif - predict_private_single ( XXs.get_row(i) ); - ZZs->set_row( _ZZsi , i ); - } - } - else{ - predict_private_single ( XXs ); - *ZZs = _ZZsi; - } -}// - -/*--------------------------------------*/ -/* predict (for one point) */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_LOWESS::predict_private_single ( const SGTELIB::Matrix XXs , int i_exclude ) { - if (XXs.get_nb_rows()!=1){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"predict_private_single : XXs must have only one row." ); - } - - int i,j,j1,j2,k; - double d; - - #ifdef SGTELIB_DEBUG - std::cout << "i_exclude = " << i_exclude << "\n"; - #endif - - #ifdef SGTELIB_LOWESS_DEV - int clock_start; - clock_start = clock(); - #endif - - // Distance Matrix - // D : distance between points of XXs and other points of the trainingset - SGTELIB::Matrix D = _trainingset.get_distances(XXs,get_matrix_Xs(),_param.get_distance_type()); - - // Preset - const std::string preset = _param.get_preset(); - - - // ================================== - // GAMMA DISTRIBUTION - // ================================== - // Number of points taken into account - // = p if no point is excluded - // = p-1 if one point is excluded (ie:i_exclude!=-1). - const double p_divide = double(_p)-double(i_exclude != -1); - // Empirical mean & variance of the distances - SGTELIB::Matrix Distances = D; - if (GAMMA_EXP==2) Distances=SGTELIB::Matrix::hadamard_square(Distances); - const double mean = Distances.sum()/p_divide; - const double var = SGTELIB::Matrix::hadamard_square(Distances+(-mean)).sum()/p_divide; - #ifdef SGTELIB_DEBUG - std::cout << "mean var = " << mean << " " << var << "\n"; - #endif - if ( (mean<0) || (var<0) ){ - std::cout << "mean: " << mean << "\n"; - std::cout << "var: " << var << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Error on computation of mean and var" ); - } - // Gamma parameters - const double gamma_shape = mean*mean/var; - const double gamma_scale = var/mean; - - - - #ifdef SGTELIB_LOWESS_DEV - // Write in a file the values of dq - if (i_exclude==-1){ - const SGTELIB::Matrix R = D.rank(); - i = 0; - while (R.get(i)!=_q-1) i++; - const double dq_emp = D.get(i); - const double dq_gam = pow(SGTELIB::gammacdfinv(double(_q)/double(_p),gamma_shape,gamma_scale),1./GAMMA_EXP); - - std::ofstream fileout; - fileout.open ("data_dq.txt" , std::fstream::out | std::fstream::app); - fileout << dq_emp << " " << dq_gam << " " << _q << " " << _p << " " << gamma_shape << " " << gamma_scale << "\n"; - fileout.close(); - } - #endif - - - - if (preset=="D"){ - // ======================================================== - // Distance only - for (i=0 ; i<_p ; i++) _W[i] = D.get(i); - } - else if (preset=="DEN"){ - // ======================================================== - // Distance, normalized with empirical method - const SGTELIB::Matrix R = D.rank(); - i = 0; - while (R.get(i)!=_q-1) i++; - const double dq = 2.0*D.get(i); - for (i=0 ; i<_p ; i++) _W[i] = D.get(i)/dq; - } - else if (preset=="DGN"){ - // ======================================================== - // Distance, normalized with Gamma method - const double dq = pow(SGTELIB::gammacdfinv(double(_q)/double(p_divide),gamma_shape,gamma_scale),1./GAMMA_EXP); - for (i=0 ; i<_p ; i++) _W[i] = D.get(i)/dq; - } - else if ( (preset=="RE") || (preset=="REN") ){ - // ======================================================== - // Rank, computed with empirical method - const SGTELIB::Matrix R = D.rank(); - for (i=0 ; i<_p ; i++) _W[i] = R.get(i); - if (preset=="REN"){ - for (i=0 ; i<_p ; i++) _W[i] /= (double(_p)-1.0); - } - } - else if ( (preset=="RG") || (preset=="RGN") ){ - // ======================================================== - // Rank, computed with gamma method - for (i=0 ; i<_p ; i++){ - _W[i] = SGTELIB::gammacdf(pow(D.get(i),GAMMA_EXP),gamma_shape,gamma_scale); - } - // DE-Normalization - if (preset=="RG"){ - for (i=0 ; i<_p ; i++) _W[i] *= (double(_p)-1.0); - } - } - - - - - - double wsum; - // For Gamma methods, Handle special case where the variance of the distances is null - if (var==0){ - for (i=0 ; i<_p ; i++){ - _W[i] = 1.0; - } - wsum = _p; - } - // Normal case - else{ - // parameters of the gamma distribution - - const double lambda = _param.get_kernel_coef(); - //std::cout << "lambda : " << lambda << "\n"; - const SGTELIB::kernel_t kt = _param.get_kernel_type(); - // Weights - wsum = 0; - for (i=0 ; i<_p ; i++){ - _W[i] = kernel(kt,lambda,_W[i]); - wsum += _W[i]; - } - } - - // If a point must be excluded from the training points, set its weight to 0. - if (i_exclude != -1){ - wsum -= _W[i_exclude]; - _W[i_exclude] = 0.0; - #ifdef SGTELIB_DEBUG - std::cout << "Exclude training point " << i_exclude << "\n"; - #endif - } - - - if (wsum>EPSILON){ - for (i=0 ; i<_p ; i++){ - _W[i] /= wsum; - } - } - else{ - // If all the weights are negligible, put 1 everywhere - for (i=0 ; i<_p ; i++){ - _W[i] = 1; - } - } - - // Ridge - double ridge = _param.get_ridge(); - - // Build matrices - const int nvar = _trainingset.get_nvar(); - const SGTELIB::Matrix & Zs = get_matrix_Zs(); - const SGTELIB::Matrix & Xs = get_matrix_Xs(); - // Reset H - for (i=0 ; i<_p ; i++){ - for (j=0 ; j<_q ; j++){ - _H[i][j] = 0; - } - } - - // Build H - for (i=0 ; i<_p ; i++){ - k = 0; - _H[i][k++] = 1; - if (_W[i]>EPSILON){ - if (_degree>=10){ - // Linear terms - for (j=0 ; j<nvar ; j++){ - _H[i][k++] = Xs.get(i,j)-XXs.get(0,j); - } - } - if (_degree>=15){ - // Quad and crossed terms - for (j1=0 ; j1<nvar ; j1++){ - if (_trainingset.get_X_nbdiff(j1)>1){ - j2=j1; - if (_trainingset.get_X_nbdiff(j2)>1){ - _H[i][k++] = (Xs.get(i,j1)-XXs.get(0,j1))*(Xs.get(i,j2)-XXs.get(0,j2)); - } - if (_degree>=20){ - for (j2=j1+1 ; j2<nvar ; j2++){ - if (_trainingset.get_X_nbdiff(j2)>1){ - _H[i][k++] = (Xs.get(i,j1)-XXs.get(0,j1))*(Xs.get(i,j2)-XXs.get(0,j2)); - } - } - } - } - } - } - } - } - - - - // Reset A and HWZ - for (i=0 ; i<_q ; i++){ - for (j=i ; j<_q ; j++){ - _A[i][j] = 0; - } - for (j=0 ; j<_m ; j++){ - _HWZ[i][j] = 0; - } - } - #ifdef SGTELIB_DEBUG - int w_count = 0; - #endif - - // Build A and HWZ - double w; - for (k=0 ; k<_p ; k++){ - w = _W[k]; - if (w>EPSILON){ - #ifdef SGTELIB_DEBUG - w_count++; - #endif - for (i=0 ; i<_q ; i++){ - d = _H[k][i]*w; - for (j=i ; j<_q ; j++){ - _A[i][j] += d*_H[k][j]; - } - for (j=0 ; j<_m ; j++){ - _HWZ[i][j] += d*Zs.get(k,j); - } - } - } - } - #ifdef SGTELIB_DEBUG - std::cout << "non null w : " << w_count << " / " << _p << "\n"; - #endif - // Symmetry of A - for (i=0 ; i<_q ; i++){ - for (j=i+1 ; j<_q ; j++){ - _A[j][i] = _A[i][j]; - } - } - - // Add ridge term - //for (i=_trainingset.get_X_nbdiff1()+1 ; i<_q ; i++){ - for (i=1 ; i<_q ; i++){ - _A[i][i] += ridge; - } - - #ifdef SGTELIB_LOWESS_DEV - double time_build; - time_build = double(clock() - clock_start)/double(CLOCKS_PER_SEC); - #endif - - //=========================// - // RESOLUTION // - //=========================// - - - const double tol = 1e-12; - int iter_conj = 0; - - // Initial residual error ||Au-b||_2^2 - double res = 0; - { - double Au_i = -1; - for (i=0 ; i<_q ; i++){ - for (j=0 ; j<_q ; j++){ - Au_i += _A[i][j]*_old_u[j]; - } - res += Au_i*Au_i; - Au_i = 0; - } - res = sqrt(res); - } - - // Choice of the method - bool USE_CHOL = false; - bool USE_CONJ = false; - if (res<1e-4) USE_CONJ = true; - else USE_CHOL = true; - - - #ifdef SGTELIB_DEBUG - std::cout << "USE CHOL / CONJ : " << USE_CHOL << " " << USE_CONJ << " ( " << res << " )\n"; - #endif - #ifdef SGTELIB_LOWESS_DEV - USE_CHOL = true; - USE_CONJ = true; - double time_chol; - double time_conj; - #endif - - - if (USE_CONJ){ - double * r = new double [_q]; - double * p = new double [_q]; - double * Ap = new double [_q]; - - // Use conjugate - #ifdef SGTELIB_LOWESS_DEV - clock_start = clock(); - #endif - - // rr = b-Ax // ================== - double rr = 0; - d = +1; // Special initialization of the first value of d - // to take into account the first term of b (which is 1); - for (i=0 ; i<_q ; i++){ - for (j=0 ; j<_q ; j++){ - d -= _A[i][j]*_u[j]; - } - r[i] = d; - p[i] = d; - rr += d*d; - d = 0; - } - - double rr_old,alpha,pAp; - - while (iter_conj < 100){ - // Ap // =================== - for (i=0 ; i<_q ; i++){ - d = 0; - for (j=0 ; j<_q ; j++){ - d += _A[i][j]*p[j]; - } - Ap[i] = d; - } - // pAp // =================== - pAp = 0; - for (i=0 ; i<_q ; i++) pAp += p[i]*Ap[i]; - // Alpha // ================= - alpha = rr/pAp; - // u // ====================== - for (i=0 ; i<_q ; i++) _u[i] += alpha*p[i]; - // r // ======================== - for (i=0 ; i<_q ; i++) r[i] -= alpha*Ap[i]; - rr_old = rr; - rr = 0; - for (i=0 ; i<_q ; i++) rr += r[i]*r[i]; - - // Break ?? // ================= - if (rr < tol) break; - // p //========================= - d = rr/rr_old; - for (i=0 ; i<_q ; i++){ - p[i] *= d; - p[i] += r[i]; - } - iter_conj++; - } - - #ifdef SGTELIB_DEBUG - std::cout << "Conj rr = " << rr << "\n"; - std::cout << "Conj iter = " << iter_conj << "\n"; - #endif - #ifdef SGTELIB_LOWESS_DEV - time_conj = double(clock() - clock_start)/double(CLOCKS_PER_SEC); - #endif - delete [] r; - delete [] p; - delete [] Ap; - } - - - if (USE_CHOL){ - // Use cholesky - #ifdef SGTELIB_LOWESS_DEV - clock_start = clock(); - #endif - SGTELIB::Matrix A("A",_q,_q,_A); - SGTELIB::Matrix b = SGTELIB::Matrix("b",_q,1); - b.set(0,0,1.0); - SGTELIB::Matrix u_mat = SGTELIB::Matrix::cholesky_solve(A,b); - #ifdef SGTELIB_LOWESS_DEV - time_chol = double(clock() - clock_start)/double(CLOCKS_PER_SEC); - #endif - //std::cout << "Clock (CHOL): " << time_chol << "sec\n"; - for (i=0 ; i<_q ; i++){ - _u[i] = u_mat.get(i,0); - } - } - - - // Compute the output - for (j=0 ; j<_m ; j++){ - d = 0; - for (k=0 ; k<_q ; k++){ - d += _u[k]*_HWZ[k][j]; - } - _ZZsi.set(0,j,d); - } - // _ZZsi is the output of this method, but is not returned as it's an attribut of the class. - - /* - std::cout << "A = [\n"; - for (i=0 ; i<_q ; i++){ - for (j=0 ; j<_q ; j++) - std::cout << _A[i][j] << " "; - std::cout << "\n"; - } - std::cout << "]\n"; - */ - - #ifdef SGTELIB_LOWESS_DEV - // STATISTICS // - // Compute norm dx - double dx = 0; - for (i=0 ; i<_n ; i++){ - d = _old_x[i] - XXs.get(0,i); - dx += d*d; - } - dx = sqrt(dx); - - // Norm du - double du = 0; - for (i=0 ; i<_q ; i++){ - d = _old_u[i] - _u[i]; - du += d*d; - } - du = sqrt(du); - // Display stat - if (i_exclude==-1){ - std::ofstream myfile; - const std::string file_name = "LOWESS_times_n"+itos(_n)+".txt"; - myfile.open (file_name.c_str(),std::ios::app); - myfile << _n << " , " << dx << " " << du << " " << res << " , " << time_build << " " << time_chol << " " << time_conj << " , " << iter_conj << "\n"; - myfile.close(); - } - - // Save old x - for (i=0 ; i<_n ; i++){ - _old_x[i] = XXs.get(0,i); - } - #endif - - - // Save old u - for (i=0 ; i<_q ; i++){ - _old_u[i] = _u[i]; - } - -} - -/*--------------------------------------*/ -/* compute Zvs */ -/*--------------------------------------*/ -const SGTELIB::Matrix * SGTELIB::Surrogate_LOWESS::get_matrix_Zvs (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - #ifdef SGTELIB_DEBUG - std::cout << "==========================\n"; - std::cout << "Compute Zvs\n"; - std::cout << "==========================\n"; - #endif - if ( ! _Zvs){ - _Zvs = new SGTELIB::Matrix("Zvs",_p,_m); - for (int i=0 ; i<_p ; i++){ - predict_private_single( get_matrix_Xs().get_row(i) , i); - _Zvs->set_row( _ZZsi ,i); - } - } - #ifdef SGTELIB_DEBUG - std::cout << "==========================\n"; - std::cout << "END Compute Zvs\n"; - std::cout << "==========================\n"; - #endif - return _Zvs; -}// - - - - diff --git a/ext/sgtelib/src/Surrogate_LOWESS.hpp b/ext/sgtelib/src/Surrogate_LOWESS.hpp deleted file mode 100644 index 94ad836..0000000 --- a/ext/sgtelib/src/Surrogate_LOWESS.hpp +++ /dev/null @@ -1,83 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_SURROGATE_LOWESS__ -#define __SGTELIB_SURROGATE_LOWESS__ - -#include "Surrogate.hpp" - -#include <iostream> -#include <fstream> - -namespace SGTELIB { - - /*--------------------------------------*/ - /* Surrogate_LOWESS class */ - /*--------------------------------------*/ - class Surrogate_LOWESS : public SGTELIB::Surrogate { - - protected: - - int _q; // Number of basis functions - int _q_old; - int _degree; // Degree of local regression - double ** _H; // Design matrix - double * _W; // Weights of each observation - double ** _A; // Matrix of the linear system (and preconditionner) - double ** _HWZ; // Second term - double * _u; // First line of inverse of A - double * _old_u; // Last value of gamma - double * _old_x; // Last value of x - - SGTELIB::Matrix _ZZsi; // Outputs for one point (buffer) - - // build model (private): - virtual bool build_private (void); - - void predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs); - - void delete_matrices (void); - - void predict_private_single ( SGTELIB::Matrix XXs , int i_exclude = -1); - - // Compute metrics - const SGTELIB::Matrix * get_matrix_Zvs (void); - - public: - // Constructor - Surrogate_LOWESS ( SGTELIB::TrainingSet & trainingset , - SGTELIB::Surrogate_Parameters param) ; - - // destructor: - virtual ~Surrogate_LOWESS ( void ); - - // Build the monome exponents - virtual void display_private ( std::ostream & out ) const; - - }; -} - -#endif diff --git a/ext/sgtelib/src/Surrogate_PRS.cpp b/ext/sgtelib/src/Surrogate_PRS.cpp deleted file mode 100644 index bf8db98..0000000 --- a/ext/sgtelib/src/Surrogate_PRS.cpp +++ /dev/null @@ -1,278 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "Surrogate_PRS.hpp" - -/*----------------------------*/ -/* constructor */ -/*----------------------------*/ -SGTELIB::Surrogate_PRS::Surrogate_PRS ( SGTELIB::TrainingSet & trainingset, - SGTELIB::Surrogate_Parameters param) : - SGTELIB::Surrogate ( trainingset , param ), - _q ( 0 ), - _M ( "M",0,0 ), - _H ( "H",0,0 ), - _Ai ( "Ai",0,0 ), - _alpha ( "alpha",0,0 ){ - #ifdef SGTELIB_DEBUG - std::cout << "constructor PRS\n"; - #endif -}// - - -/*----------------------------*/ -/* destructor */ -/*----------------------------*/ -SGTELIB::Surrogate_PRS::~Surrogate_PRS ( void ) { - -}// - - -/*----------------------------*/ -/* display */ -/*----------------------------*/ -void SGTELIB::Surrogate_PRS::display_private ( std::ostream & out ) const { - out << "q: " << _q << "\n"; -}// - - -/*--------------------------------------*/ -/* build */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_PRS::build_private ( void ) { - - const int pvar = _trainingset.get_pvar(); - const int nvar = _trainingset.get_nvar(); - - // Get the number of basis functions. - _q = Surrogate_PRS::get_nb_PRS_monomes(nvar,_param.get_degree()); - - // If _q is too big or there is not enough points, then quit - if (_q>200) return false; - if ( (_q>pvar-1) && (_param.get_ridge()==0) ) return false; - - // Compute the exponents of the basis functions - _M = get_PRS_monomes(nvar,_param.get_degree()); - - // DESIGN MATRIX H - _H = compute_design_matrix ( _M , get_matrix_Xs() ); - - // Compute alpha - if ( ! compute_alpha()) return false; - - _ready = true; - return true; -}// - -/*--------------------------------------*/ -/* Compute PRS matrix */ -/*--------------------------------------*/ -const SGTELIB::Matrix SGTELIB::Surrogate_PRS::compute_design_matrix ( const SGTELIB::Matrix Monomes, - const SGTELIB::Matrix & Xs ) { - - const int n = Xs.get_nb_cols(); // Nb of points in the matrix X given in argument - const int p = Xs.get_nb_rows(); // Nb of points in the matrix X given in argument - double v; - int i,j,jj,k,exponent; - - const int nbMonomes = Monomes.get_nb_rows(); - - // Init the design matrix - SGTELIB::Matrix H("H",p,nbMonomes); - // Current basis function (vector column to construct 1 basis function) - SGTELIB::Matrix h("h",p,1); - - // j is the corresponding index among all input (j in [0;n-1]) - // jj is the index of the input variabe amongst the varying input (jj in [0;nvar-1]) - // k is the index of the monome (ie: the basis function) (k in [0;q-1]) - // i is the index of a point (i in [0;p-1]) - // Loop on the monomes - for (k=0 ; k<nbMonomes ; k++){ - h.fill(1.0); - jj=0; - // Loop on the input variables - for (j=0 ; j<n ; j++){ - if (_trainingset.get_X_nbdiff(j)>1){ - exponent = int(Monomes.get(k,jj)); - if (exponent>0){ - for (i=0 ; i<p ; i++){ - v = h.get(i,0); - v *= pow(Xs.get(i,jj),exponent); - h.set(i,0,v); - } - } - jj++; - } - } - H.set_col(h,k); - } - return H; -}// - - -/*--------------------------------------*/ -/* compute alpha */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_PRS::compute_alpha ( void ){ - - const SGTELIB::Matrix Ht = _H.transpose(); - const SGTELIB::Matrix & Zs = get_matrix_Zs(); - - // Ridge - double r = _param.get_ridge(); - - // COMPUTE COEFS - if (r>0){ - //_Ai = (Ht*_H+r*SGTELIB::Matrix::identity(_q)).SVD_inverse(); - _Ai = (Ht*_H+r*SGTELIB::Matrix::identity(_q)).cholesky_inverse(); - } - else{ - //_Ai = (Ht*_H).SVD_inverse(); - _Ai = (Ht*_H).cholesky_inverse(); - } - - _alpha = _Ai * (Ht * Zs); - _alpha.set_name("alpha"); - if (_alpha.has_nan()){ - return false; - } - return true; -} - -/*--------------------------------------*/ -/* predict (ZZs only) */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_PRS::predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs ) { - check_ready(__FILE__,__FUNCTION__,__LINE__); - *ZZs = compute_design_matrix(_M,XXs) * _alpha; -}// - -/*--------------------------------------*/ -/* compute Zvs */ -/*--------------------------------------*/ -const SGTELIB::Matrix * SGTELIB::Surrogate_PRS::get_matrix_Zvs (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - // Not necessary. Zv is computed in "build". - if ( ! _Zvs){ - _Zvs = new SGTELIB::Matrix; - // Projection matrix - const SGTELIB::Matrix & Zs = get_matrix_Zs(); - SGTELIB::Matrix dPiPZs = SGTELIB::Matrix::get_matrix_dPiPZs(_Ai,_H,Zs); - - // dPi is the inverse of the diag of P - // Compute _Zv = Zs - dPi*P*Zs - *_Zvs = Zs - dPiPZs; - _Zvs->replace_nan(+INF); - _Zvs->set_name("Zvs"); - } - return _Zvs; -}// - - - -/*-----------------------------------------*/ -/* Compute the theorical number of monomes */ -/*-----------------------------------------*/ -int SGTELIB::Surrogate_PRS::get_nb_PRS_monomes(const int nvar, const int degree){ - // Return the number of lines in the matrix M computed in get_PRS_monomes() - int S = 1; - int v = nvar; - for (int d = 1 ; d<=degree ; d++){ - S += v; - v = (v*(nvar+d))/(d+1); - } - return S; -}// - - - -/*----------------------------------*/ -/* BUILD THE INDEX MATRICES */ -/*----------------------------------*/ -SGTELIB::Matrix SGTELIB::Surrogate_PRS::get_PRS_monomes(const int nvar, const int degree){ - - double * z = new double [nvar]; - SGTELIB::Matrix M("Monomes",1,nvar); - bool continuer; - - int i,j,di,ci; - - // Loop on the number of non null terms in z - // c is the number of non-null terms of the monome. - // We start with the monomes with only one non-null term. - for (int c=1 ; c<=std::min(degree,nvar) ; c++){ - for (int d=c ; d<=degree ; d++){ - - // First monome (c,d) - z[0] = d-c+1; - for (i=1 ; i<c ; i++) - z[i] = 1; - for (i=c ; i<nvar ; i++) - z[i] = 0; - - continuer = true; - while (continuer){ - M.add_row(z); - // Pivot - i = 0; - while ( (i<nvar-1) && (z[i]<=z[i+1]) && ( (z[i]<=1) || (z[i+1]>=d-c+1)) ) - i++; - // Transfert - if (i < nvar-1){ - z[i+1]++; - for (j=0; j<=i ; j++){ - z[j] = 0; - } - ci = c; - di = d; - for (j=i+1 ; j<nvar ; j++){ - ci -= (z[j]!=0); - di -= static_cast<int>(z[j]); - } - if ( (ci==0) && (di>0) ){ - z[i+1] = z[i+1]+di; - } - else{ - for (int j=0; j<ci; j++){ - z[j] = 1; - z[0] -= z[j]; - } - z[0] += di; - } - } - else{ - continuer = false; - } - } // loop while - }// loop d - }// loop c - delete [] z; - return M; -}// - - - - diff --git a/ext/sgtelib/src/Surrogate_PRS.hpp b/ext/sgtelib/src/Surrogate_PRS.hpp deleted file mode 100644 index fd45ad3..0000000 --- a/ext/sgtelib/src/Surrogate_PRS.hpp +++ /dev/null @@ -1,85 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_SURROGATE_PRS__ -#define __SGTELIB_SURROGATE_PRS__ - -#include "Surrogate.hpp" - -namespace SGTELIB { - - /*--------------------------------------*/ - /* Surrogate_PRS class */ - /*--------------------------------------*/ - class Surrogate_PRS : public SGTELIB::Surrogate { - - /*--------------------------------------------------------*/ - /* these members are defined in the Surrogate superclass */ - /*--------------------------------------------------------*/ - // int _p; // number of data points in X and Z - // int _n; // dimension -- number of variables - // int _m; // number of outputs (includes the objective) - - protected: - - int _q; // Nb of basis function - SGTELIB::Matrix _M; // Monomes - SGTELIB::Matrix _H; // Design matrix - SGTELIB::Matrix _Ai; // Inverse of Ht*H - SGTELIB::Matrix _alpha; // Coefficients - - virtual const SGTELIB::Matrix compute_design_matrix ( const SGTELIB::Matrix Monomes, - const SGTELIB::Matrix & Xs ); - - // build model (private): - virtual bool build_private (void); - - void predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs); - - - // Compute metrics - const SGTELIB::Matrix * get_matrix_Zvs (void); - - bool compute_alpha ( void ); - - public: - - // Constructor - Surrogate_PRS ( SGTELIB::TrainingSet & trainingset , - SGTELIB::Surrogate_Parameters param) ; - - // destructor: - virtual ~Surrogate_PRS ( void ); - - // Build the monome exponents - static int get_nb_PRS_monomes(const int nvar, const int degree); - static SGTELIB::Matrix get_PRS_monomes(const int nvar, const int degree); - virtual void display_private ( std::ostream & out ) const; - - }; -} - -#endif diff --git a/ext/sgtelib/src/Surrogate_PRS_CAT.cpp b/ext/sgtelib/src/Surrogate_PRS_CAT.cpp deleted file mode 100644 index 9cea7a1..0000000 --- a/ext/sgtelib/src/Surrogate_PRS_CAT.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "Surrogate_PRS_CAT.hpp" - -/*----------------------------*/ -/* constructor */ -/*----------------------------*/ -SGTELIB::Surrogate_PRS_CAT::Surrogate_PRS_CAT ( SGTELIB::TrainingSet & trainingset, - SGTELIB::Surrogate_Parameters param) : - SGTELIB::Surrogate_PRS ( trainingset , param ){ - #ifdef SGTELIB_DEBUG - std::cout << "constructor PRS_CAT\n"; - #endif -}// - - -/*----------------------------*/ -/* destructor */ -/*----------------------------*/ -SGTELIB::Surrogate_PRS_CAT::~Surrogate_PRS_CAT ( void ) { - -}// - -/*----------------------------*/ -/* display */ -/*----------------------------*/ -void SGTELIB::Surrogate_PRS_CAT::display_private ( std::ostream & out ) const { - out << "q: " << _q << "\n"; - out << "nb_cat: " << _nb_cat << "\n"; -}// - -/*--------------------------------------*/ -/* init_private */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_PRS_CAT::init_private ( void ) { - #ifdef SGTELIB_DEBUG - std::cout << "Surrogate_PRS_CAT : init_private\n"; - #endif - // Compute the number of categories - _cat.clear(); - for ( int i = 0 ; i < _p ; ++i ){ - _cat.insert ( _trainingset.get_Xs(i,0) ); - } - _nb_cat = static_cast<int> ( _cat.size() ); - return true; -}// - -/*--------------------------------------*/ -/* build */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_PRS_CAT::build_private ( void ) { - - const int pvar = _trainingset.get_pvar(); - const int nvar = _trainingset.get_nvar(); - - // Get the number of basis functions. - int nb_monomes = Surrogate_PRS::get_nb_PRS_monomes(nvar-1,_param.get_degree()); - _q = nb_monomes*_nb_cat; - - // If _q is too big or there is not enough points, then quit - if (nb_monomes>100) return false; - if ( (_q>pvar-1) && (_param.get_ridge()==0) ) return false; - - // Compute the exponents of the basis functions (nb there is one less variable - // as the first one is the cat) - _M = SGTELIB::Matrix ("M",nb_monomes,1); - _M.fill(0.0); - _M.add_cols(get_PRS_monomes(nvar-1,_param.get_degree())); - - // DESIGN MATRIX H - _H = compute_design_matrix ( _M , get_matrix_Xs() ); - - // Compute alpha - bool ok = compute_alpha(); - return ok; -}// - - - -/*-------------------------------------------------*/ -/* Compute PRS_CAT design matrix */ -/*-------------------------------------------------*/ -const SGTELIB::Matrix SGTELIB::Surrogate_PRS_CAT::compute_design_matrix ( const SGTELIB::Matrix Monomes, - const SGTELIB::Matrix & Xs ) { - - const int p = Xs.get_nb_rows(); - SGTELIB::Matrix H("H",p,0); - SGTELIB::Matrix is_cat ("is_cat",p,1); - const SGTELIB::Matrix H_prs = SGTELIB::Surrogate_PRS::compute_design_matrix ( Monomes, Xs ); - - std::set<double>::iterator it; - double c; - for (it = _cat.begin(); it != _cat.end(); ++it){ - c = *it; - for (int i=0 ; i<p ; i++){ - is_cat.set(i,0,(double)(Xs.get(i,0)==c)); - } - H.add_cols( Matrix::diagA_product(is_cat,H_prs) ); - } - return H; -}// - - - - - - - - - - - - - - - diff --git a/ext/sgtelib/src/Surrogate_PRS_CAT.hpp b/ext/sgtelib/src/Surrogate_PRS_CAT.hpp deleted file mode 100644 index 4be0649..0000000 --- a/ext/sgtelib/src/Surrogate_PRS_CAT.hpp +++ /dev/null @@ -1,61 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_SURROGATE_PRS_CAT__ -#define __SGTELIB_SURROGATE_PRS_CAT__ - -#include "Surrogate_PRS.hpp" - -namespace SGTELIB { - - /*--------------------------------------*/ - /* Surrogate_PRS_CAT class */ - /*--------------------------------------*/ - class Surrogate_PRS_CAT : public SGTELIB::Surrogate_PRS { - - protected: - std::set<double> _cat; // Categories - int _nb_cat; // Number of categories - - virtual const SGTELIB::Matrix compute_design_matrix ( const SGTELIB::Matrix Monomes, - const SGTELIB::Matrix & Xs ); - // build model (private): - virtual bool build_private (void); - virtual bool init_private (void); - public: - - // Constructor - Surrogate_PRS_CAT ( SGTELIB::TrainingSet & trainingset , - SGTELIB::Surrogate_Parameters param) ; - - // destructor: - virtual ~Surrogate_PRS_CAT ( void ); - - virtual void display_private ( std::ostream & out ) const; - - }; -} - -#endif diff --git a/ext/sgtelib/src/Surrogate_PRS_EDGE.cpp b/ext/sgtelib/src/Surrogate_PRS_EDGE.cpp deleted file mode 100644 index c9a8920..0000000 --- a/ext/sgtelib/src/Surrogate_PRS_EDGE.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "Surrogate_PRS_EDGE.hpp" - -/*----------------------------*/ -/* constructor */ -/*----------------------------*/ -SGTELIB::Surrogate_PRS_EDGE::Surrogate_PRS_EDGE ( SGTELIB::TrainingSet & trainingset, - SGTELIB::Surrogate_Parameters param) : - SGTELIB::Surrogate_PRS ( trainingset , param ){ - #ifdef SGTELIB_DEBUG - std::cout << "constructor PRS_EDGE\n"; - #endif -}// - - -/*----------------------------*/ -/* destructor */ -/*----------------------------*/ -SGTELIB::Surrogate_PRS_EDGE::~Surrogate_PRS_EDGE ( void ) { - -}// - - -/*----------------------------*/ -/* display */ -/*----------------------------*/ -void SGTELIB::Surrogate_PRS_EDGE::display_private ( std::ostream & out ) const { - out << "q: " << _q << "\n"; -}// - - -/*--------------------------------------*/ -/* build */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_PRS_EDGE::build_private ( void ) { - - const int pvar = _trainingset.get_pvar(); - const int nvar = _trainingset.get_nvar(); - - // Get the number of basis functions. - _q = Surrogate_PRS::get_nb_PRS_monomes(nvar,_param.get_degree())+nvar; - - // If _q is too big or there is not enough points, then quit - if (_q>200) return false; - if ( (_q>pvar-1) && (_param.get_ridge()==0) ) return false; - - // Compute the exponents of the basis functions - _M = get_PRS_monomes(nvar,_param.get_degree()); - - // DESIGN MATRIX H - _H = compute_design_matrix ( _M , get_matrix_Xs() ); - - return compute_alpha(); -}// - - - - - -/*-------------------------------------------------*/ -/* Compute PRS_EDGE design matrix */ -/*-------------------------------------------------*/ -const SGTELIB::Matrix SGTELIB::Surrogate_PRS_EDGE::compute_design_matrix ( const SGTELIB::Matrix Monomes, - const SGTELIB::Matrix & Xs ) { - - // Call the standard design matrix - const SGTELIB::Matrix H_prs = SGTELIB::Surrogate_PRS::compute_design_matrix ( Monomes, Xs ); - // Add the edge basis functions - const int p = Xs.get_nb_rows(); - const int n = Xs.get_nb_cols(); - const int nvar = _trainingset.get_nvar(); - - // Add the special basis function (xi==0) - // Loop on the input variables - SGTELIB::Matrix H_edge ("He",p,nvar); - int i,j,jj; - double v; - double xs0; // value that xs will have if x=0 (for a given input j) - jj=0; - for (j=0 ; j<n ; j++){ - if (_trainingset.get_X_nbdiff(j)>1){ - xs0 = _trainingset.X_scale( 0.0 , j ); - for (i=0 ; i<p ; i++){ - v = (double) (Xs.get(i,j)==xs0); - H_edge.set(i,jj,v); - } - jj++; - } - } - - SGTELIB::Matrix H(H_prs); - H.add_cols(H_edge); - return H; - -}// - - - - - - - - - - - - - - - diff --git a/ext/sgtelib/src/Surrogate_PRS_EDGE.hpp b/ext/sgtelib/src/Surrogate_PRS_EDGE.hpp deleted file mode 100644 index 4edb18e..0000000 --- a/ext/sgtelib/src/Surrogate_PRS_EDGE.hpp +++ /dev/null @@ -1,59 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_SURROGATE_PRS_EDGE__ -#define __SGTELIB_SURROGATE_PRS_EDGE__ - -#include "Surrogate_PRS.hpp" - -namespace SGTELIB { - - /*--------------------------------------*/ - /* Surrogate_PRS_EDGE class */ - /*--------------------------------------*/ - class Surrogate_PRS_EDGE : public SGTELIB::Surrogate_PRS { - - protected: - - virtual const SGTELIB::Matrix compute_design_matrix ( const SGTELIB::Matrix Monomes, - const SGTELIB::Matrix & Xs ); - - // build model (private): - virtual bool build_private (void); - - public: - - // Constructor - Surrogate_PRS_EDGE ( SGTELIB::TrainingSet & trainingset , - SGTELIB::Surrogate_Parameters param) ; - // destructor: - virtual ~Surrogate_PRS_EDGE ( void ); - - virtual void display_private ( std::ostream & out ) const; - - }; -} - -#endif diff --git a/ext/sgtelib/src/Surrogate_Parameters.cpp b/ext/sgtelib/src/Surrogate_Parameters.cpp deleted file mode 100644 index 735fc73..0000000 --- a/ext/sgtelib/src/Surrogate_Parameters.cpp +++ /dev/null @@ -1,1221 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "Surrogate_Parameters.hpp" -using namespace SGTELIB; -/*----------------------------*/ -/* constructor */ -/*----------------------------*/ -SGTELIB::Surrogate_Parameters::Surrogate_Parameters ( const model_t mt ): - _type ( mt ){ - set_defaults(); - check(); -}// - - -/*----------------------------*/ -/* constructor */ -/*----------------------------*/ -SGTELIB::Surrogate_Parameters::Surrogate_Parameters ( const std::string & s ): - _type ( read_model_type(s) ){ - set_defaults(); - read_string(s); - check(); -}// - -/*----------------------------*/ -/* Destructor */ -/*----------------------------*/ -SGTELIB::Surrogate_Parameters::~Surrogate_Parameters ( void ) { - -}// - - - - -/*----------------------------------------*/ -/* Extract the model type from a string */ -/*----------------------------------------*/ -SGTELIB::model_t SGTELIB::Surrogate_Parameters::read_model_type ( const std::string & model_description){ - std::string s; - std::istringstream in_line (model_description); - while ( in_line >> s ){ - s = SGTELIB::toupper(s); - if (streqi(s,"TYPE")){ - in_line >> s; - s = SGTELIB::toupper(s); - return SGTELIB::str_to_model_type(s); - } - } - // If nothing was found - std::cout << "model_description: " << model_description << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "No field \"TYPE\" found."); -}// - -/*--------------------------------------------------------------------*/ -/* Convert the param name provided by user into a standard param name */ -/*--------------------------------------------------------------------*/ -std::string SGTELIB::Surrogate_Parameters::to_standard_field_name (const std::string field){ - - if ( streqi(field,"TYPE") ) return "TYPE"; - if ( streqi(field,"TYPE_MODEL") ) return "TYPE"; - if ( streqi(field,"MODEL_TYPE") ) return "TYPE"; - - if ( streqi(field,"DEGREE") ) return "DEGREE"; - - if ( streqi(field,"WEIGHT") ) return "WEIGHT_TYPE"; - if ( streqi(field,"WEIGHT_TYPE") ) return "WEIGHT_TYPE"; - if ( streqi(field,"TYPE_WEIGHT") ) return "WEIGHT_TYPE"; - if ( streqi(field,"WEIGHT_CHOICE") ) return "WEIGHT_TYPE"; - if ( streqi(field,"CHOICE_WEIGHT") ) return "WEIGHT_TYPE"; - - if ( streqi(field,"RIDGE") ) return "RIDGE"; - if ( streqi(field,"RIDGE_COEF") ) return "RIDGE"; - if ( streqi(field,"RIDGE_PARAM") ) return "RIDGE"; - - if ( streqi(field,"KERNEL_TYPE") ) return "KERNEL_TYPE"; - if ( streqi(field,"TYPE_KERNEL") ) return "KERNEL_TYPE"; - if ( streqi(field,"KERNEL") ) return "KERNEL_TYPE"; - - if ( streqi(field,"KERNEL_COEF") ) return "KERNEL_COEF"; - if ( streqi(field,"COEF_KERNEL") ) return "KERNEL_COEF"; - if ( streqi(field,"KERNEL_SHAPE") ) return "KERNEL_COEF"; - if ( streqi(field,"COEF_SHAPE") ) return "KERNEL_COEF"; - if ( streqi(field,"SHAPE") ) return "KERNEL_COEF"; - if ( streqi(field,"SHAPE_COEF") ) return "KERNEL_COEF"; - - if ( streqi(field,"METRIC") ) return "METRIC_TYPE"; - if ( streqi(field,"METRIC_TYPE") ) return "METRIC_TYPE"; - if ( streqi(field,"TYPE_METRIC") ) return "METRIC_TYPE"; - - if ( streqi(field,"BUDGET") ) return "BUDGET"; - if ( streqi(field,"OPTIM_BUDGET") ) return "BUDGET"; - if ( streqi(field,"BUDGET_OPTIM") ) return "BUDGET"; - if ( streqi(field,"OPTIMIZATION_BUDGET") ) return "BUDGET"; - if ( streqi(field,"BUDGET_OPTIMIZATION") ) return "BUDGET"; - - if ( streqi(field,"PRESET") ) return "PRESET"; - - if ( streqi(field,"OUTPUT") ) return "OUTPUT"; - if ( streqi(field,"OUTPUT_FILE") ) return "OUTPUT"; - - if ( streqi(field,"DISTANCE") ) return "DISTANCE_TYPE"; - if ( streqi(field,"DISTANCE_TYPE") ) return "DISTANCE_TYPE"; - if ( streqi(field,"TYPE_DISTANCE") ) return "DISTANCE_TYPE"; - - - std::cout << "Field: " << field << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Field not recognized: \""+field+"\"" ); - return "ERROR"; -} - -/*----------------------------*/ -/* Read model definition */ -/*----------------------------*/ -void SGTELIB::Surrogate_Parameters::read_string (const std::string & model_description){ - - std::string field; - std::string content; - bool content_is_optim; - std::istringstream in_line (model_description); - #ifdef SGTELIB_DEBUG - std::cout << "Model description: " << model_description << "\n"; - #endif - while ( in_line >> field ){ - - #ifdef SGTELIB_DEBUG - std::cout << "FIELD: " << field ; - #endif - // Convert the field name into a std field name - field = to_standard_field_name(field); - #ifdef SGTELIB_DEBUG - std::cout << " (" << field << ")\n"; - #endif - // Check if this field is authorized for this type of model. - if ( ! authorized_field(field)){ - std::cout << "model_description: " << model_description << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Unauthorized field \""+field+"\" in a model of type "+model_type_to_str(_type) ); - } - #ifdef SGTELIB_DEBUG - std::cout << "CONTENT: " << content << "\n"; - #endif - // Read the content - if ( ! (in_line >> content)) - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Missing content for field \""+field+"\"" ); - - - - // Detect if the content is "OPTIM". - content_is_optim = ( streqi(content,"OPTIM") || streqi(content,"OPTIMIZATION") || streqi(content,"OPTIMIZE") ); - - // Check if optimization is allowed for this field. - if ((content_is_optim) && ( ! authorized_optim(field))) { - std::cout << "model_description: " << model_description << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Field \""+field+"\" cannot be optimized." ); - } - - if (streqi(field,"TYPE")){ - if ( str_to_model_type(content) != _type ){ - std::cout << "model_description: " << model_description << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Unconsistent model type!" ); - } - } - else if (streqi(field,"DEGREE")){ - if (content_is_optim) - _degree_status = SGTELIB::STATUS_OPTIM; - else{ - _degree = SGTELIB::stoi(content); - _degree_status = SGTELIB::STATUS_FIXED; - } - } - else if (streqi(field,"KERNEL_TYPE")){ - if (content_is_optim) - _kernel_type_status = SGTELIB::STATUS_OPTIM; - else{ - _kernel_type = SGTELIB::str_to_kernel_type(content); - _kernel_type_status = SGTELIB::STATUS_FIXED; - } - } - else if ( streqi(field,"KERNEL_COEF") ){ - if (content_is_optim) - _kernel_coef_status = SGTELIB::STATUS_OPTIM; - else{ - _kernel_coef = SGTELIB::stod(content); - _kernel_coef_status = SGTELIB::STATUS_FIXED; - } - } - else if (streqi(field,"RIDGE")){ - if (content_is_optim) - _ridge_status = SGTELIB::STATUS_OPTIM; - else{ - _ridge = SGTELIB::stod(content); - _ridge_status = SGTELIB::STATUS_FIXED; - } - } - else if ( streqi(field,"DISTANCE_TYPE") ){ - if (content_is_optim) - _distance_type_status = SGTELIB::STATUS_OPTIM; - else{ - _distance_type = str_to_distance_type(content); - _distance_type_status = SGTELIB::STATUS_FIXED; - } - } - else if ( streqi(field,"WEIGHT_TYPE") ){ - _weight_type = str_to_weight_type(content); - if (content_is_optim) - _weight_status = SGTELIB::STATUS_OPTIM; - } - else if ( streqi(field,"METRIC_TYPE") ){ - _metric_type = str_to_metric_type(content); - } - else if ( streqi(field,"BUDGET") ){ - _budget = SGTELIB::stoi(content); - } - else if ( streqi(field,"PRESET") ){ - _preset = content; - } - else if ( streqi(field,"OUTPUT") ){ - _output = content; - } - else{ - std::cout << "model_description: " << model_description << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Field not recognized: \""+field+"\"" ); - } - }// end while read -}// - - - -bool SGTELIB::Surrogate_Parameters::authorized_field ( const std::string & field ) const{ - - if (streqi(field,"TYPE")) return true; - if (streqi(field,"OUTPUT")) return true; - if (streqi(field,"METRIC_TYPE")) return true; - if (streqi(field,"BUDGET")) return true; - - switch (_type) { - case SGTELIB::LINEAR: - case SGTELIB::TGP: - case SGTELIB::SVN: - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Not implemented yetnot " ); - - case SGTELIB::CN: - if (streqi(field,"DISTANCE_TYPE")) return true; - break; - - case SGTELIB::KRIGING: - if (streqi(field,"RIDGE")) return true; - if (streqi(field,"DISTANCE_TYPE")) return true; - - case SGTELIB::PRS: - case SGTELIB::PRS_EDGE: - case SGTELIB::PRS_CAT: - if (streqi(field,"DEGREE")) return true; - if (streqi(field,"RIDGE")) return true; - break; - - case SGTELIB::KS: - if (streqi(field,"KERNEL_TYPE")) return true; - if (streqi(field,"KERNEL_COEF")) return true; - if (streqi(field,"DISTANCE_TYPE")) return true; - break; - - case SGTELIB::RBF: - if (streqi(field,"KERNEL_TYPE")) return true; - if (streqi(field,"KERNEL_COEF")) return true; - if (streqi(field,"DISTANCE_TYPE")) return true; - if (streqi(field,"RIDGE")) return true; - if (streqi(field,"PRESET")) return true; - - break; - - case SGTELIB::LOWESS: - if (streqi(field,"DEGREE")) return true; - if (streqi(field,"RIDGE")) return true; - if (streqi(field,"KERNEL_TYPE")) return true; - if (streqi(field,"KERNEL_COEF")) return true; - if (streqi(field,"PRESET")) return true; - if (streqi(field,"DISTANCE_TYPE")) return true; - break; - - case SGTELIB::ENSEMBLE: - if (streqi(field,"WEIGHT_TYPE")) return true; - if (streqi(field,"PRESET")) return true; - if (streqi(field,"DISTANCE_TYPE")) return true; - break; - - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined model type" ); - break; - } - - return false; -}// - -bool SGTELIB::Surrogate_Parameters::authorized_optim ( const std::string & field ) { - - if (streqi(field,"DEGREE")) return true; - if (streqi(field,"RIDGE")) return true; - if (streqi(field,"KERNEL_TYPE")) return true; - if (streqi(field,"KERNEL_COEF")) return true; - if (streqi(field,"DISTANCE_TYPE")) return true; - if (streqi(field,"WEIGHT_TYPE")) return true; - - if (streqi(field,"TYPE")) return false; - if (streqi(field,"OUTPUT")) return false; - if (streqi(field,"METRIC_TYPE")) return false; - if (streqi(field,"PRESET")) return false; - if (streqi(field,"BUDGET")) return false; - - std::cout << "Field : " << field << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined field" ); - - return false; -}// - - - -/*----------------------------*/ -/* Check */ -/*----------------------------*/ -void SGTELIB::Surrogate_Parameters::check ( void ) { - switch (_type) { - case SGTELIB::LINEAR: - case SGTELIB::TGP: - case SGTELIB::SVN: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Not implemented yet!" ); - - - case SGTELIB::PRS: - case SGTELIB::PRS_EDGE: - case SGTELIB::PRS_CAT: - if (_degree < 0 ) - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"degree must be >= 0" ); - if (_ridge<0) - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"ridge must be >= 0" ); - break; - - case SGTELIB::KRIGING: - if (!SGTELIB::kernel_is_decreasing(_kernel_type)) - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"kernel_type must be decreasing" ); - break; - - - case SGTELIB::KS: - if (_kernel_coef <= 0) - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"kernel_coef must be > 0" ); - if (!SGTELIB::kernel_is_decreasing(_kernel_type)) - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"kernel_type must be decreasing" ); - break; - - case SGTELIB::RBF: - if (_kernel_coef <= 0) - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"kernel_coef must be > 0" ); - if (_ridge<0) - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"ridge must be >= 0" ); - if ( ( ! kernel_has_parameter(_kernel_type)) && (_kernel_type_status==SGTELIB::STATUS_FIXED) ){ - // If the kernel coef is not used in this type of kernel, then it should be fixed. - _kernel_coef = 1; - _kernel_coef_status = SGTELIB::STATUS_FIXED; - } - break; - - case SGTELIB::LOWESS: - if ( (_degree < 0) || (_degree > 2) ) - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"degree for LOWESS model must be 0, 1 or 2" ); - if (_ridge<0) - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"ridge must be >= 0" ); - if ( (_preset!="D" ) && - (_preset!="DEN") && - (_preset!="DGN") && - (_preset!="RE" ) && - (_preset!="RG" ) && - (_preset!="REN") && - (_preset!="RGN") ){ - std::cout << "LOWESS preset : " << _preset << "\n"; - std::cout << "Possible values: D, DEN, DGN, RE, RG, REN, RGN.\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"preset not recognized" ); - } - if ( ! SGTELIB::kernel_is_decreasing( _kernel_type ) ) - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"kernel_type must be decreasing" ); - break; - - case SGTELIB::ENSEMBLE: - break; - - case SGTELIB::CN: - break; - - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined type" ); - } - - - - - // Count the number of parameters to optimize - _nb_parameter_optimization = 0; - if (_degree_status==SGTELIB::STATUS_OPTIM) _nb_parameter_optimization++; - if (_kernel_type_status==SGTELIB::STATUS_OPTIM) _nb_parameter_optimization++; - if (_kernel_coef_status==SGTELIB::STATUS_OPTIM) _nb_parameter_optimization++; - if (_ridge_status==SGTELIB::STATUS_OPTIM) _nb_parameter_optimization++; - if (_distance_type_status==SGTELIB::STATUS_OPTIM) _nb_parameter_optimization++; - if (_covariance_coef_status==SGTELIB::STATUS_OPTIM) _nb_parameter_optimization += _covariance_coef.get_numel(); - if (_weight_status==SGTELIB::STATUS_OPTIM) _nb_parameter_optimization += _weight.get_numel(); - -}// - -/*----------------------------*/ -/* Display */ -/*----------------------------*/ -void SGTELIB::Surrogate_Parameters::display ( std::ostream & out ) const { - - out << "Type: " << SGTELIB::model_type_to_str(_type) << std::endl; - - switch (_type) { - - case SGTELIB::SVN: - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Not implemented yet!" ); - - case SGTELIB::CN: - out << "Distance_type: " << distance_type_to_str(_distance_type) << std::endl; - break; - - case SGTELIB::KRIGING: - out << "Covariance coefs: " << "\n"; - out << "Ridge: " << _ridge << std::endl; - _covariance_coef.display(out); - break; - - case SGTELIB::PRS: - case SGTELIB::PRS_EDGE: - case SGTELIB::PRS_CAT: - out << "Degree: " << _degree << std::endl; - out << "Ridge: " << _ridge << std::endl; - out << "Distance_type: " << distance_type_to_str(_distance_type) << std::endl; - break; - - case SGTELIB::KS: - out << "Kernel type: " << _kernel_type << std::endl; - out << "Kernel coef: " << _kernel_coef << std::endl; - out << "Distance_type: " << distance_type_to_str(_distance_type) << std::endl; - break; - - case SGTELIB::RBF: - out << "Kernel type: " << _kernel_type << std::endl; - out << "Kernel coef: " << _kernel_coef << std::endl; - out << "Distance_type: " << distance_type_to_str(_distance_type) << std::endl; - out << "ridge: " << _ridge << std::endl; - break; - - case SGTELIB::LOWESS: - out << "Kernel coef: " << _kernel_coef << std::endl; - out << "Distance_type: " << distance_type_to_str(_distance_type) << std::endl; - out << "degree: " << _degree << std::endl; - out << "ridge: " << _ridge << std::endl; - out << "Preset: " << _preset << std::endl; - break; - - case SGTELIB::ENSEMBLE: - out << "Metric type: " << metric_type_to_str(_metric_type) << std::endl; - out << "Weight type: " << weight_type_to_str(_weight_type) << std::endl; - out << "Preset: " << _preset << std::endl; - break; - - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined type" ); - } -}// - -/*----------------------------*/ -/* Set defaults */ -/*----------------------------*/ -void SGTELIB::Surrogate_Parameters::set_defaults ( void ) { - - _budget = 100; - _metric_type = SGTELIB::METRIC_AOECV; - _distance_type = SGTELIB::DISTANCE_NORM2; - _distance_type_status = SGTELIB::STATUS_FIXED; - _covariance_coef_status = SGTELIB::STATUS_FIXED; - _weight_status = SGTELIB::STATUS_MODEL_DEFINED; - _ridge = 0.001; - _kernel_coef = 1; - _kernel_type = SGTELIB::KERNEL_D1; - _covariance_coef = SGTELIB::Matrix("COVARIANCE_COEF",0,0); - _weight = SGTELIB::Matrix("WEIGHT",0,0); - - - switch (_type) { - case SGTELIB::LINEAR: - case SGTELIB::TGP: - case SGTELIB::SVN: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Not implemented yet!" ); - - case SGTELIB::KRIGING: - _distance_type = SGTELIB::DISTANCE_NORM2; - _distance_type_status = SGTELIB::STATUS_FIXED; - _ridge = 1e-16; - _ridge_status = SGTELIB::STATUS_OPTIM; - _covariance_coef = SGTELIB::Matrix("COVARIANCE_COEF",1,2); - { - const double default_exponent = 2; - _covariance_coef.set(0,0,default_exponent); - - const double default_factor = 1; - _covariance_coef.set(0,1,default_factor); - } - _covariance_coef_status = SGTELIB::STATUS_OPTIM; - break; - - case SGTELIB::PRS: - case SGTELIB::PRS_EDGE: - case SGTELIB::PRS_CAT: - _degree = 2; - _degree_status = SGTELIB::STATUS_FIXED; - _ridge = 0.001; - _ridge_status = SGTELIB::STATUS_FIXED; - break; - - case SGTELIB::KS: - _kernel_type = SGTELIB::KERNEL_D1; - _kernel_type_status = SGTELIB::STATUS_FIXED; - _kernel_coef = 5; - _kernel_coef_status = SGTELIB::STATUS_OPTIM; - _distance_type = SGTELIB::DISTANCE_NORM2; - _distance_type_status = SGTELIB::STATUS_FIXED; - break; - - case SGTELIB::RBF: - _kernel_type = SGTELIB::KERNEL_I2; - _kernel_type_status = SGTELIB::STATUS_FIXED; - _kernel_coef = 1; - _kernel_coef_status = SGTELIB::STATUS_OPTIM; - _distance_type = SGTELIB::DISTANCE_NORM2; - _distance_type_status = SGTELIB::STATUS_FIXED; - _ridge = 0.001; - _ridge_status = SGTELIB::STATUS_FIXED; - _preset = "I"; - break; - - case SGTELIB::LOWESS: - _kernel_coef = 1.0; - _kernel_coef_status = SGTELIB::STATUS_OPTIM; - _kernel_type = SGTELIB::KERNEL_D1; - _kernel_type_status = SGTELIB::STATUS_FIXED; - _distance_type = SGTELIB::DISTANCE_NORM2; - _distance_type_status = SGTELIB::STATUS_FIXED; - _degree = 2; - _degree_status = SGTELIB::STATUS_FIXED; - _ridge = 0.001; - _ridge_status = SGTELIB::STATUS_FIXED; - _preset = "DGN"; - break; - - case SGTELIB::ENSEMBLE: - _weight_type = WEIGHT_SELECT; - _weight_status = SGTELIB::STATUS_MODEL_DEFINED; - _preset = "DEFAULT"; - break; - - case SGTELIB::CN: - break; - - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined type" ); - } - - // Default output file - _output = "NULL"; - -}// - -/*----------------------------*/ -/* Display */ -/*----------------------------*/ -std::string SGTELIB::Surrogate_Parameters::get_string ( void ) const { - - std::string s = "TYPE "+model_type_to_str(_type); - - switch (_type) { - case SGTELIB::LINEAR: - case SGTELIB::TGP: - - case SGTELIB::SVN: - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Not implemented yet!" ); - - case SGTELIB::KRIGING: - s += " DISTANCE_TYPE " + distance_type_to_str(_distance_type); - break; - - case SGTELIB::CN: - s += " DISTANCE_TYPE " + distance_type_to_str(_distance_type); - break; - - case SGTELIB::PRS: - case SGTELIB::PRS_EDGE: - case SGTELIB::PRS_CAT: - s += " DEGREE " + itos(_degree); - s += " RIDGE " + dtos(_ridge); - break; - - case SGTELIB::KS: - s += " KERNEL_TYPE " + kernel_type_to_str(_kernel_type); - s += " KERNEL_SHAPE " + dtos(_kernel_coef); - s += " DISTANCE_TYPE " + distance_type_to_str(_distance_type); - break; - - case SGTELIB::RBF: - s += " PRESET " + _preset; - s += " KERNEL_TYPE " + kernel_type_to_str(_kernel_type); - s += " KERNEL_SHAPE " + dtos(_kernel_coef); - s += " DISTANCE_TYPE " + distance_type_to_str(_distance_type); - s += " RIDGE " + dtos(_ridge); - break; - - case SGTELIB::LOWESS: - s += " DEGREE " + itos(_degree); - s += " KERNEL_TYPE " + kernel_type_to_str(_kernel_type); - s += " KERNEL_SHAPE " + dtos(_kernel_coef); - s += " DISTANCE_TYPE " + distance_type_to_str(_distance_type); - s += " RIDGE " + dtos(_ridge); - break; - - case SGTELIB::ENSEMBLE: - s += " METRIC_TYPE " + metric_type_to_str(_metric_type); - s += " WEIGHT_TYPE " + weight_type_to_str(_weight_type); - s += " PRESET " + _preset; - s += " DISTANCE_TYPE " + distance_type_to_str(_distance_type); - break; - - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined type" ); - } - return s; - -}// - -/*----------------------------*/ -/* Display */ -/*----------------------------*/ -std::string SGTELIB::Surrogate_Parameters::get_short_string ( void ) const { - - std::string s = model_type_to_str(_type); - - switch (_type) { - case SGTELIB::LINEAR: - case SGTELIB::TGP: - case SGTELIB::SVN: - throw SGTELIB::Exception ( __FILE__ , __LINE__ , "Not implemented yet!" ); - - case SGTELIB::KRIGING: - if (_kernel_type != SGTELIB::KERNEL_D1){ - s += " " + kernel_type_to_str(_kernel_type); - } - if (_distance_type != SGTELIB::DISTANCE_NORM2){ - s += " " + distance_type_to_str(_distance_type); - } - break; - - case SGTELIB::PRS: - case SGTELIB::PRS_EDGE: - case SGTELIB::PRS_CAT: - s += " " + itos(_degree); - if (_ridge>0) s+= " R "+dtos(_ridge); - break; - - case SGTELIB::KS: - s += " " + dtos(_kernel_coef); - if (_kernel_type != SGTELIB::KERNEL_D1){ - s += " " + kernel_type_to_str(_kernel_type); - } - if (_distance_type != SGTELIB::DISTANCE_NORM2){ - s += " " + distance_type_to_str(_distance_type); - } - break; - - case SGTELIB::CN: - if (_distance_type != SGTELIB::DISTANCE_NORM2){ - s += " " + distance_type_to_str(_distance_type); - } - break; - - case SGTELIB::RBF: - s += " " + dtos(_kernel_coef); - if (_kernel_type != SGTELIB::KERNEL_D1){ - s += " " + kernel_type_to_str(_kernel_type); - } - if (_distance_type != SGTELIB::DISTANCE_NORM2){ - s += " " + distance_type_to_str(_distance_type); - } - s += " " + dtos(_ridge); - s += " "+_preset; - break; - - - case SGTELIB::LOWESS: - s += " " + dtos(_kernel_coef); - if (_distance_type != SGTELIB::DISTANCE_NORM2){ - s += " " + distance_type_to_str(_distance_type); - } - if (_kernel_type != SGTELIB::KERNEL_D1){ - s += " " + kernel_type_to_str(_kernel_type); - } - if (_degree!=2) s += " Degree " + itos(_degree); - if (_ridge>0) s+= " R "+dtos(_ridge); - s += " "+_preset; - break; - - case SGTELIB::ENSEMBLE: - s += " " + metric_type_to_str(_metric_type) + " " + weight_type_to_str(_weight_type); - if (!streqi(_preset,"DEFAULT")) s += " "+_preset; - break; - - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined type" ); - } - return s; - -}// - - - - - -/*------------------------------------*/ -/* Parameter domains and definitions */ -/*------------------------------------*/ -SGTELIB::Matrix SGTELIB::Surrogate_Parameters::get_x ( void ){ - - SGTELIB::Matrix X ("X",1,_nb_parameter_optimization); - int k=0; - if (_degree_status == SGTELIB::STATUS_OPTIM) X.set(0,k++,double(_degree)); - if (_ridge_status == SGTELIB::STATUS_OPTIM) X.set(0,k++,double(_ridge)); - if (_kernel_coef_status == SGTELIB::STATUS_OPTIM) X.set(0,k++,double(_kernel_coef)); - if (_kernel_type_status == SGTELIB::STATUS_OPTIM) X.set(0,k++,double(_kernel_type)); - if (_distance_type_status == SGTELIB::STATUS_OPTIM) X.set(0,k++,double(_distance_type)); - - if (_covariance_coef_status == SGTELIB::STATUS_OPTIM){ - for (int j=0 ; j<_covariance_coef.get_nb_cols() ; j++){ - X.set(0,k++,_covariance_coef[j]); - } - } - - if (_weight_status == SGTELIB::STATUS_OPTIM){ - for (int i=0 ; i<_weight.get_nb_rows() ; i++){ - for (int j=0 ; j<_weight.get_nb_cols() ; j++){ - X.set(0,k++,_weight.get(i,j)); - } - } - } - - if ( k != _nb_parameter_optimization){ - std::cout << "k=" << k << "\n"; - std::cout << "_nb_parameter_optimization=" << _nb_parameter_optimization << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Unconcistency in the value of k." ); - } - - return X; - -}// - -/*-------------------------------------------------*/ -/* Set the parameters from an external value of x */ -/*-------------------------------------------------*/ -void SGTELIB::Surrogate_Parameters::set_x ( const SGTELIB::Matrix X ){ - - int k=0; - if (_degree_status == SGTELIB::STATUS_OPTIM) _degree = int(X.get(k++)); - if (_ridge_status == SGTELIB::STATUS_OPTIM) _ridge = double(X.get(k++)); - if (_kernel_coef_status == SGTELIB::STATUS_OPTIM) _kernel_coef = double(X.get(k++)); - if (_kernel_type_status == SGTELIB::STATUS_OPTIM) _kernel_type = SGTELIB::int_to_kernel_type(int(X.get(k++))); - if (_distance_type_status == SGTELIB::STATUS_OPTIM) _distance_type=SGTELIB::int_to_distance_type(int(X.get(k++))); - - if (_covariance_coef_status == SGTELIB::STATUS_OPTIM){ - for (int j=0 ; j<_covariance_coef.get_nb_cols() ; j++){ - _covariance_coef.set(0,j,X.get(k++)); - } - } - - if (_weight_status == SGTELIB::STATUS_OPTIM){ - // For each BBO - for (int i=0 ; i<_weight.get_nb_rows() ; i++){ - for (int j=0 ; j<_weight.get_nb_cols() ; j++){ - // For each model - _weight.set(i,j,X.get(k++)); - } - } - _weight.normalize_cols(); - } - - if ( k != _nb_parameter_optimization ){ - std::cout << "k=" << k << "\n"; - std::cout << "_nb_parameter_optimization=" << _nb_parameter_optimization << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Unconcistency in the value of k." ); - } - -}// - -/*------------------------------------*/ -/* Parameter domains and definitions */ -/*------------------------------------*/ -void SGTELIB::Surrogate_Parameters::get_x_bounds ( SGTELIB::Matrix * LB , - SGTELIB::Matrix * UB , - SGTELIB::param_domain_t * domain, - bool * logscale ){ - - if ( ( ! LB) || ( ! UB) || ( ! domain) || ( ! logscale) ){ - std::cout << LB << " " << UB << " " << domain << " " << logscale << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Pointers are NULL." ); - } - - - int i,j; - const int N = _nb_parameter_optimization; - for (i=0 ; i<N ; i++) logscale[i] = false; - - int k=0; - // --------- DEGREE -------------------- - if (_degree_status == SGTELIB::STATUS_OPTIM){ - LB->set(0,k,0); - if (_type==SGTELIB::LOWESS) { - UB->set(0,k,2); - domain[k] = SGTELIB::PARAM_DOMAIN_INTEGER; - } - else { - UB->set(0,k,6); - domain[k] = SGTELIB::PARAM_DOMAIN_INTEGER; - } - k++; - } - // --------- RIDGE -------------------- - if (_ridge_status == SGTELIB::STATUS_OPTIM){ - LB->set(0,k,1e-16); - UB->set(0,k,1e-1); - domain[k] = SGTELIB::PARAM_DOMAIN_CONTINUOUS; - logscale[k] = true; - k++; - } - // --------- KERNEL_COEF -------------------- - if (_kernel_coef_status == SGTELIB::STATUS_OPTIM){ - LB->set(0,k,1e-2); - UB->set(0,k,100); - domain[k] = SGTELIB::PARAM_DOMAIN_CONTINUOUS; - logscale[k] = true; - k++; - } - // --------- KERNEL_TYPE -------------------- - if (_kernel_type_status == SGTELIB::STATUS_OPTIM){ - LB->set(0,k,0); - if (_type==SGTELIB::RBF) { - UB->set(0,k,double(NB_KERNEL_TYPES-1)); - } - else{ - UB->set(0,k,double(NB_DECREASING_KERNEL_TYPES-1)); - } - domain[k] = SGTELIB::PARAM_DOMAIN_CAT; - k++; - } - // --------- DISTANCE_TYPE -------------------- - if (_distance_type_status == SGTELIB::STATUS_OPTIM){ - LB->set(0,k,0); - UB->set(0,k,double(NB_DISTANCE_TYPES-1)); - domain[k] = SGTELIB::PARAM_DOMAIN_CAT; - k++; - } - // --------- COVARIANCE COEF -------------------- - if (_covariance_coef_status == SGTELIB::STATUS_OPTIM){ - const int v = _covariance_coef.get_nb_cols()/2; - for (j=0 ; j<v ; j++){ - // Exponent parameter - LB->set(0,k,0.5); - UB->set(0,k,3.0); - domain[k] = SGTELIB::PARAM_DOMAIN_CONTINUOUS; - logscale[k] = false; - k++; - // Factor parameter - LB->set(0,k,1e-3); - UB->set(0,k,1e+0); - domain[k] = SGTELIB::PARAM_DOMAIN_CONTINUOUS; - logscale[k] = true; - k++; - } - } - // --------- WEIGHT -------------------- - if (_weight_status == SGTELIB::STATUS_OPTIM){ - for (i=0 ; i<_weight.get_nb_rows() ; i++){ - for (j=0 ; j<_weight.get_nb_cols() ; j++){ - LB->set(0,k,0); - UB->set(0,k,1); - domain[k] = SGTELIB::PARAM_DOMAIN_CONTINUOUS; - logscale[k] = false; - k++; - } - } - } - - if ( k != N){ - std::cout << "k=" << k << "\n"; - std::cout << "N=" << N << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Unconcistency in the value of k." ); - } - // ----- CHECK CONSISTENCY ------- - bool error = false; - for (j=0 ; j<N ; j++){ - // Check bounds order - if (LB->get(j)>=UB->get(j)){ - error=true; - std::cout << "Variable " << j << "\n"; - std::cout << "LB (=" << LB->get(j) << ") >= UB (=" << UB->get(j) << ")\n"; - } - // Check that only continuous variables are using a log scale - if ( (logscale[j]) && (domain[j]!=SGTELIB::PARAM_DOMAIN_CONTINUOUS) ){ - error=true; - std::cout << "Variable " << j << "\n"; - std::cout << "Uses logscale and is not continuous.\n"; - } - // Check that variables with log scale have bounds of the same sign. - if (logscale[j]){ - if (LB->get(j)*UB->get(j)<=0){ - //error=true; - std::cout << "Variable " << j << "\n"; - std::cout << "LB =" << LB->get(j) << "\nUB =" << UB->get(j) << "\n"; - std::cout << "The bounds are not appropriate for logscale optimization.\n"; - } - } - - // Check fo reach domain type - switch (domain[j]){ - case SGTELIB::PARAM_DOMAIN_CONTINUOUS: - break; - case SGTELIB::PARAM_DOMAIN_INTEGER: - case SGTELIB::PARAM_DOMAIN_CAT: - if (double(round(LB->get(j)))!=LB->get(j)){ - error=true; - std::cout << "Variable " << j << " (Integer or Categorical)\n"; - std::cout << "LB (=" << LB->get(j) << ") is not an integer\n"; - } - if (double(round(UB->get(j)))!=UB->get(j)){ - error=true; - std::cout << "Variable " << j << " (Integer or Categorical)\n"; - std::cout << "UB (=" << UB->get(j) << ") is not an integer\n"; - } - break; - case SGTELIB::PARAM_DOMAIN_BOOL: - if (LB->get(j)==0){ - error=true; - std::cout << "Variable " << j << " (Boolean)\n"; - std::cout << "LB (=" << LB->get(j) << ") is not 0\n"; - } - if (UB->get(j)==1){ - error=true; - std::cout << "Variable " << j << " (Boolean)\n"; - std::cout << "UB (=" << UB->get(j) << ") is not 1\n"; - } - break; - case SGTELIB::PARAM_DOMAIN_MISC: - error=true; - std::cout << "Variable " << j << " is MISC\n"; - break; - } - } - - if (error){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Error in definition of LB, UB or domain!" ); - } - -}// - -/*------------------------------------*/ -/* Check parameter X */ -/*------------------------------------*/ -bool SGTELIB::Surrogate_Parameters::check_x ( void ){ - - SGTELIB::Matrix X = get_x(); - bool error = false; - // Check dimension of X - if (X.get_nb_rows()!=1){ - error = true; - std::cout << "Number of rows is not 1\n"; - } - // Check dimension of X - const int N = _nb_parameter_optimization; - if (X.get_nb_cols()!=N){ - error = true; - std::cout << "Number of cols is not consistent with _nb_parameter_optimization\n"; - } - - // Get bound info. - SGTELIB::Matrix * LB = new SGTELIB::Matrix("LB",1,N); - SGTELIB::Matrix * UB = new SGTELIB::Matrix("UB",1,N); - param_domain_t * domain = new param_domain_t[N]; - bool * logscale = new bool[N]; - get_x_bounds ( LB , UB , domain , logscale); - - for (int j=0 ; j<_nb_parameter_optimization ; j++){ - // Check bounds - if (X[j]<LB->get(j)){ - error=true; - std::cout << "X[" << j << "] < lower bound\n"; - } - if (X[j]>UB->get(j)){ - error=true; - std::cout << "X[" << j << "] > upper bound\n"; - } - // Check types - switch (domain[j]){ - case SGTELIB::PARAM_DOMAIN_CONTINUOUS: - break; - case SGTELIB::PARAM_DOMAIN_INTEGER: - case SGTELIB::PARAM_DOMAIN_CAT: - if (double(round(X[j]))!=X[j]){ - error=true; - std::cout << "Variable " << j << " (Integer or Categorical)\n"; - std::cout << "X[" << j << "]=" << X[j] << " is not an integer\n"; - } - break; - case SGTELIB::PARAM_DOMAIN_BOOL: - if ((X[j]!=0) && (X[j]!=1)){ - error=true; - std::cout << "Variable " << j << " (Boolean)\n"; - std::cout << "X[" << j << "]=" << X[j] << " is not a boolean\n"; - } - break; - case SGTELIB::PARAM_DOMAIN_MISC: - error=true; - std::cout << "Variable " << j << " is MISC\n"; - break; - } - }// End loop on j - - // Check dimension of _covariance_coef - if (_covariance_coef.get_nb_rows()>1){ - error = true; - std::cout << "Covariance_coef should have only one row.\n"; - } - - if (error){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Invalid X!" ); - } - - delete LB; - delete UB; - delete [] domain; - - return ( ! error); -}// - - - -/*------------------------------------*/ -/* Parameter domains and definitions */ -/*------------------------------------*/ -void SGTELIB::Surrogate_Parameters::display_x ( std::ostream & out ){ - out << "Parameter set {\n"; - out << " Dimension(X) " << _nb_parameter_optimization << "\n"; - if (_degree_status == SGTELIB::STATUS_OPTIM) - out << " Degree " << _degree << " "; - if (_ridge_status == SGTELIB::STATUS_OPTIM) - out << " Ridge " << _ridge << " "; - if (_kernel_coef_status == SGTELIB::STATUS_OPTIM) - out << " Kernel_coef " << _kernel_coef << " "; - if (_kernel_type_status == SGTELIB::STATUS_OPTIM) - out << " Kernel_type " << SGTELIB::kernel_type_to_str(_kernel_type) << " (" << _kernel_type << ") "; - if (_distance_type_status == SGTELIB::STATUS_OPTIM) - out << " Distance_type " << SGTELIB::distance_type_to_str(_distance_type) << " (" << _distance_type << ") "; - if (_covariance_coef_status == SGTELIB::STATUS_OPTIM){ - out << " Covariance_coef [ "; - for (int j=0 ; j<_covariance_coef.get_nb_cols() ; j++){ - out << _covariance_coef.get(0,j) << " "; - } - out << "]\n"; - } - if (_weight_status == SGTELIB::STATUS_OPTIM){ - out << " Weight [ "; - for (int i=0 ; i<_weight.get_nb_rows() ; i++){ - if (i>0) out << " "; - for (int j=0 ; j<_weight.get_nb_cols() ; j++){ - out << _weight.get(i,j) << " "; - } - if (i==_weight.get_nb_rows()) out << " ]"; - out << "\n"; - } - } - - out << "}\n"; - -}// - - -/*----------------------------------------------*/ -/* smoothness penalty for a set of parameters */ -/*----------------------------------------------*/ -double SGTELIB::Surrogate_Parameters::get_x_penalty ( void ){ - double pen = 0; - - if (_degree_status == SGTELIB::STATUS_OPTIM) pen += _degree; - if (_ridge_status == SGTELIB::STATUS_OPTIM) pen += log(_ridge); - if (_kernel_coef_status == SGTELIB::STATUS_OPTIM) pen += log(_kernel_coef); - if (_distance_type_status == SGTELIB::STATUS_OPTIM){ - switch (_distance_type){ - case DISTANCE_NORM2: - pen += 0; - break; - case DISTANCE_NORM1: - case DISTANCE_NORMINF: - pen += 1; - break; - case DISTANCE_NORM2_IS0: - case DISTANCE_NORM2_CAT: - pen += 10; - break; - } - } - if (_covariance_coef_status == SGTELIB::STATUS_OPTIM){ - int v = _covariance_coef.get_nb_cols()/2; - int ip=0; - for (int i=0 ; i<v ; i++){ - // Exponent (the larger, the smoother) - pen -= _covariance_coef.get(ip++); - // Factor (the smaller, the smoother) - pen += log( _covariance_coef.get(ip++) ); - } - } - if (_weight_status == SGTELIB::STATUS_OPTIM){ - double wij; - for (int i=0 ; i<_weight.get_nb_rows() ; i++){ - for (int j=0 ; j<_weight.get_nb_cols() ; j++){ - wij = _weight.get(i,j); - pen += wij*wij; - } - } - } - - if ( isinf(pen) ) pen=+INF; - if ( isnan(pen) ) pen=+INF; - return pen; -} - - - - - -/*-------------------------------------------------*/ -/* update the dimension of _covariance_parameter */ -/* for Kriging models */ -/*-------------------------------------------------*/ -void SGTELIB::Surrogate_Parameters::update_covariance_coef ( const int v ){ - - // Check the old dimension - const int v0 = _covariance_coef.get_nb_cols()/2; - if (v<v0) throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"v < v0" ); - if (v0 == v) return; - - // Filling values - double factor_mean = 0; - double exponent_mean = 0; - - // First component is the noise. Then the exponent and factor for each dimension. - int k = 1; - for (int i=0 ; i<v0 ; i++){ - exponent_mean += _covariance_coef[k++]; - factor_mean += _covariance_coef[k++]; - } - exponent_mean /= v0; - factor_mean /= v0; - - // Create additional columns - SGTELIB::Matrix Add("Add",1,2); - Add.set(0,0,exponent_mean); - Add.set(0,1,factor_mean); - - // Add columns to _covariance_coef - for (int i=0 ; i<v-v0 ; i++) _covariance_coef.add_cols(Add); -}// - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ext/sgtelib/src/Surrogate_Parameters.hpp b/ext/sgtelib/src/Surrogate_Parameters.hpp deleted file mode 100644 index a0d16eb..0000000 --- a/ext/sgtelib/src/Surrogate_Parameters.hpp +++ /dev/null @@ -1,150 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_SURROGATE_PARAMETERS__ -#define __SGTELIB_SURROGATE_PARAMETERS__ - -#include "Defines.hpp" -#include "Kernel.hpp" -#include <string> - -namespace SGTELIB { - - /*--------------------------------------*/ - /* Surrogate_Parameters class */ - /*--------------------------------------*/ - class Surrogate_Parameters { - - protected: - - // Type of the model - const model_t _type; - - // Degree - int _degree; - SGTELIB::param_status_t _degree_status; - // Kernel type - kernel_t _kernel_type; - SGTELIB::param_status_t _kernel_type_status; - // Kernel coef - double _kernel_coef; - SGTELIB::param_status_t _kernel_coef_status; - // Use ridge - double _ridge; - SGTELIB::param_status_t _ridge_status; - // Distance - distance_t _distance_type; - SGTELIB::param_status_t _distance_type_status; - // Ensemble weights - SGTELIB::Matrix _weight; // Stores the weight values - weight_t _weight_type; // Indicate the method (WTA1, WTA2, WTA3, or OPTIM) - SGTELIB::param_status_t _weight_status; - // Kriging covariance coefficients - SGTELIB::Matrix _covariance_coef; - SGTELIB::param_status_t _covariance_coef_status; - // Metric used for weight calculation - metric_t _metric_type; - // Preset - std::string _preset; - // Output file - std::string _output; - // Optimization budget - int _budget; - - // Nb of parameters that are optimized - int _nb_parameter_optimization; - - public: - - // Constructors - Surrogate_Parameters ( const model_t mt); - Surrogate_Parameters ( const std::string & s); - //Surrogate_Parameters ( const SGTELIB::Surrogate_Parameters & p ); - - // Defaults - void set_defaults (void); - - // Read strings - bool authorized_field (const std::string & field) const; - static bool authorized_optim (const std::string & field); - void read_string (const std::string & model_description); - static SGTELIB::model_t read_model_type ( const std::string & model_description); - static std::string to_standard_field_name (const std::string field); - - // Check - void check (void); - - // Get - model_t get_type (void) const {return _type;}; - int get_degree (void) const {return _degree;}; - kernel_t get_kernel_type (void) const {return _kernel_type;}; - double get_kernel_coef (void) const {return _kernel_coef;}; - double get_ridge (void) const {return _ridge;}; - SGTELIB::Matrix get_weight (void) const {return _weight;}; - weight_t get_weight_type (void) const {return _weight_type;}; - metric_t get_metric_type (void) const {return _metric_type;}; - std::string get_metric_type_str (void) const {return SGTELIB::metric_type_to_str(_metric_type);}; - distance_t get_distance_type (void) const {return _distance_type;}; - std::string get_preset (void) const {return _preset;}; - std::string get_output (void) const {return _output;}; - SGTELIB::Matrix get_covariance_coef (void) const {return _covariance_coef;}; - int get_budget (void) const {return _budget;}; - // Get the distance type (return OPTIM if the distance type has to be optimized). - std::string get_distance_type_str (void) const { - if (_distance_type_status==SGTELIB::STATUS_OPTIM) return "OPTIM"; - else return SGTELIB::distance_type_to_str(_distance_type); - }; - - - // Set - void set_kernel_coef ( const double v ) { _kernel_coef = v; }; - void set_weight_type ( const weight_t wt ) { _weight_type = wt; }; - void set_weight ( const SGTELIB::Matrix W ) { _weight = W; }; - void update_covariance_coef ( const int nvar ); - //void set_distance_type ( distance_t dt ) { _distance_type = dt; }; - //void set_degree ( int d ) { _degree = d; }; - - // destructor: - virtual ~Surrogate_Parameters ( void ); - std::string get_string(void) const; - std::string get_short_string(void) const; - void display ( std::ostream & out ) const; - - // Information and optimization - SGTELIB::Matrix get_x ( void ); - double get_x_penalty ( void ); - bool check_x ( void ); - void display_x ( std::ostream & out ); - void set_x ( const SGTELIB::Matrix X ); - void get_x_bounds ( SGTELIB::Matrix * LB , - SGTELIB::Matrix * UB , - SGTELIB::param_domain_t * domain, - bool * logscale ); - int get_nb_parameter_optimization (void) { return _nb_parameter_optimization; }; - - }; -} - -#endif diff --git a/ext/sgtelib/src/Surrogate_RBF.cpp b/ext/sgtelib/src/Surrogate_RBF.cpp deleted file mode 100644 index 16e7b3f..0000000 --- a/ext/sgtelib/src/Surrogate_RBF.cpp +++ /dev/null @@ -1,303 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "Surrogate_RBF.hpp" - - -/*----------------------------*/ -/* constructor */ -/*----------------------------*/ -SGTELIB::Surrogate_RBF::Surrogate_RBF ( SGTELIB::TrainingSet & trainingset, - SGTELIB::Surrogate_Parameters param) : - SGTELIB::Surrogate ( trainingset , param ), - _q ( -1 ), - _qrbf ( -1 ), - _qprs ( -1 ), - _H ( "H",0,0 ), - _HtH ( "HtH",0,0 ), - _HtZ ( "HtZ",0,0 ), - _Ai ( "Ai",0,0 ), - _Alpha ( "alpha",0,0 ), - _selected_kernel (1,-1 ){ - #ifdef SGTELIB_DEBUG - std::cout << "constructor RBF\n"; - #endif -}// - -/*----------------------------*/ -/* destructor */ -/*----------------------------*/ -SGTELIB::Surrogate_RBF::~Surrogate_RBF ( void ) { - -}// - - -/*----------------------------*/ -/* display */ -/*----------------------------*/ -void SGTELIB::Surrogate_RBF::display_private ( std::ostream & out ) const { - out << "_q: " << _q << "\n"; - out << "_qrbf: " << _qrbf << "\n"; - out << "_qprs: " << _qprs << "\n"; - out << "_kernel_coef: " << _param.get_kernel_coef() << "\n"; - out << "_ridge: " << _param.get_ridge() << "\n"; -}// - - -/*--------------------------------------*/ -/* init_private */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_RBF::init_private ( void ) { - - #ifdef SGTELIB_DEBUG - std::cout << "Surrogate_RBF : init_private\n"; - #endif - - const int pvar = _trainingset.get_pvar(); - if (pvar<3) return false; - - // Check preset - const std::string preset = _param.get_preset(); - const bool modeO = string_find(preset,"O") || string_find(preset,"0"); - const bool modeR = string_find(preset,"R"); - const bool modeI = string_find(preset,"I"); - if (modeO+modeR+modeI!=1){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "RBF preset must contain either \"O\", \"R\" or \"I\", exclusively." ); - } - - if (modeI){ - // Select Incomplete basis - const int nvar = _trainingset.get_nvar(); - _qrbf = std::min(pvar/2,100*nvar); - if (_qrbf<3) return false; - _selected_kernel.clear(); - _selected_kernel = _trainingset.select_greedy( get_matrix_Xs(), - _trainingset.get_i_min(), - _qrbf, - 1.0, - _param.get_distance_type()); - } - else{ - _qrbf = _p; - } - - // Number of PRS basis functions - if (modeO){ - const int dmin = SGTELIB::kernel_dmin(_param.get_kernel_type()); - if (dmin==-1) _qprs = 0; - else if (dmin==0 ) _qprs = 1; - else if (dmin==1 ) _qprs = 1 + _trainingset.get_nvar(); - else{ - std::cout << "dmin = " << dmin << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"dmin out of range." ); - } - } - else{ - // For modes R and I, use n+1 prs basis functions. - _qprs = 1 + _trainingset.get_nvar(); - } - - // Total number of basis function - _q = _qrbf + _qprs; - - if ( (modeO) & (_q>pvar) ) return false; - - return true; -}// - - -/*--------------------------------------*/ -/* build */ -/*--------------------------------------*/ -bool SGTELIB::Surrogate_RBF::build_private ( void ) { - - // The build primarily consists of computing alpha - - // Compute scaling distance for each training point - const SGTELIB::Matrix & Zs = get_matrix_Zs(); - - if ( string_find(_param.get_preset(),"O") || string_find(_param.get_preset(),"0") ){ - // ========================================= - // Solve with orthogonality constraints - // ========================================= - // Build design matrix with constraints lines - _H = compute_design_matrix(get_matrix_Xs(),true); - // Inverte matrix - _Ai = _H.lu_inverse(); - // Product (only the p first rows of Ai) - _Alpha = SGTELIB::Matrix::subset_product(_Ai,Zs,-1,_p,-1); - } - else{ - // ========================================= - // Solve with ridge coefficient - // ========================================= - - // Build design matrix WITHOUT constraints lines - _H = compute_design_matrix(get_matrix_Xs(),false); - _HtH = SGTELIB::Matrix::transposeA_product(_H,_H); - _HtZ = SGTELIB::Matrix::transposeA_product(_H,get_matrix_Zs()); - SGTELIB::Matrix A = _HtH; - - const double r = _param.get_ridge(); - - // Add regularization term - if ( string_find(_param.get_preset(),"1") ){ - // Add ridge to all basis function - for (int i=0 ; i<_q ; i++) A.add(i,i,r); - } - else if ( string_find(_param.get_preset(),"2") ){ - // Add ridge to all basis function except constant - for (int i=0 ; i<_q-1 ; i++) A.add(i,i,r); - } - else if ( string_find(_param.get_preset(),"3") ){ - // Add ridge to all radial basis function - for (int i=0 ; i<_qrbf ; i++) A.add(i,i,r); - } - else { - // Add ridge to all radial basis function (Same as R3) - for (int i=0 ; i<_qrbf ; i++) A.add(i,i,r); - } - _Ai = A.cholesky_inverse(); - _Alpha = _Ai*_HtZ; - } - - // Check for Nan - if (_Alpha.has_nan()){ - return false; - } - - _ready = true; - return true; - -}// - - - - - -/*--------------------------------------*/ -/* Compute Design matrix */ -/*--------------------------------------*/ -const SGTELIB::Matrix SGTELIB::Surrogate_RBF::compute_design_matrix ( const SGTELIB::Matrix & XXs , const bool constraints ) { - - // Xs can be, either the training set, to build the model, or prediction points. - // To build the model, we need the orthogonality constraints, so the 2nd arg is going to be true. - // For prediction, constraints = false. - - const int pxx = XXs.get_nb_rows(); - - // Get the distance from each input point XXs to each kernel - SGTELIB::Matrix H = _trainingset.get_distances(XXs,get_matrix_Xs().get_rows(_selected_kernel),_param.get_distance_type()); - // Apply kernel values - /* - for ( int i=0 ; i<_qrbf ; i++ ){ - H.set_col(kernel(_param.get_kernel_type(),_kernel_coef,H.get_col(i)),i); - } - */ - H = kernel(_param.get_kernel_type(),_param.get_kernel_coef(),H); - - // If there are some PRS basis functions - if (_qprs>0){ - - // Build the matrix that contains linear terms and the constant - SGTELIB::Matrix L ("L",pxx,_qprs); - int k = 0; - - // First columns are the linear terms - if (_qprs>1){ - for ( int j=0 ; j<_n ; j++){ - if (_trainingset.get_X_nbdiff(j)>1){ - L.set_col ( XXs.get_col(j) , k++ ); - } - } - } - - // Last column is the constant term - L.set_col( 1.0 , k ); - - // Concatenate with the RBF terms - H.add_cols(L); - - if (constraints){ - // The constraints are the transpose of L - L = L.transpose(); - // And we add some zeros for the right bottom part of the matrix - L.add_cols(_qprs); - // We add this to the design matrix - H.add_rows(L); - } - - } - - return H; -}// - - - - -/*--------------------------------------*/ -/* predict (ZZs only) */ -/*--------------------------------------*/ -void SGTELIB::Surrogate_RBF::predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs) { - check_ready(__FILE__,__FUNCTION__,__LINE__); - *ZZs = compute_design_matrix(XXs,false) * _Alpha; -}// - -/*--------------------------------------*/ -/* get matrix Zvs */ -/*--------------------------------------*/ -const SGTELIB::Matrix * SGTELIB::Surrogate_RBF::get_matrix_Zvs (void){ - check_ready(__FILE__,__FUNCTION__,__LINE__); - if ( ! _Zvs){ - - // Init _Zvs - _Zvs = new SGTELIB::Matrix; - const SGTELIB::Matrix & Zs = get_matrix_Zs(); - - if ( string_find(_param.get_preset(),"O") ){ - //============================================ - // ORTHOGONALITY CONSTRAINTS - //============================================ - SGTELIB::Matrix dAiAlpha = SGTELIB::Matrix::diagA_product(_Ai.diag_inverse(),_Alpha); - dAiAlpha.remove_rows(_qprs); - *_Zvs = Zs-dAiAlpha; - } - else{ - //SGTELIB::Matrix dPiPZs = SGTELIB::Matrix::get_matrix_dPiPZs(_Ai,_H,Zs); - SGTELIB::Matrix dPiPZs = SGTELIB::Matrix::get_matrix_dPiPZs(_Ai,_H,Zs,_Alpha); - - // dPi is the inverse of the diag of P - // Compute _Zv = Zs - dPi*P*Zs - *_Zvs = Zs - dPiPZs; - } - - _Zvs->replace_nan(+INF); - _Zvs->set_name("Zvs"); - - } - return _Zvs; -}// diff --git a/ext/sgtelib/src/Surrogate_RBF.hpp b/ext/sgtelib/src/Surrogate_RBF.hpp deleted file mode 100644 index 5eb8716..0000000 --- a/ext/sgtelib/src/Surrogate_RBF.hpp +++ /dev/null @@ -1,107 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_SURROGATE_RBF__ -#define __SGTELIB_SURROGATE_RBF__ - -#include "Surrogate.hpp" - -namespace SGTELIB { - - /*--------------------------------------*/ - /* Surrogate_RBF class */ - /*--------------------------------------*/ - class Surrogate_RBF : public SGTELIB::Surrogate { - - /*--------------------------------------------------------*/ - /* these members are defined in the Surrogate superclass */ - /*--------------------------------------------------------*/ - // int _p; // number of data points in X and Z - // int _n; // dimension -- number of variables - // int _m; // number of outputs (includes the objective) - - private: - - /*--------------------------------------*/ - /* Attributes */ - /*--------------------------------------*/ - int _q; // Nb of basis function - int _qrbf; // Nb of RBF basis function - int _qprs; // Nb of PRS basis function - SGTELIB::Matrix _H; // Design matrix - SGTELIB::Matrix _HtH; // H'*H - SGTELIB::Matrix _HtZ; // H'*Z - SGTELIB::Matrix _Ai; // inverse of H or Ht*H+r*J - SGTELIB::Matrix _Alpha; // Coefficients - - std::list<int> _selected_kernel; - - - /*--------------------------------------*/ - /* Building methods */ - /*--------------------------------------*/ - const SGTELIB::Matrix compute_design_matrix ( const SGTELIB::Matrix & XXs , const bool constraints ); - - /*--------------------------------------*/ - /* Build model */ - /*--------------------------------------*/ - bool select_kernels ( void ); - virtual bool build_private (void); - virtual bool init_private (void); - //SGTELIB::Matrix get_bumpiness (void); - - /*--------------------------------------*/ - /* predict */ - /*--------------------------------------*/ - virtual void predict_private ( const SGTELIB::Matrix & XXs, - SGTELIB::Matrix * ZZs); - - /*--------------------------------------*/ - /* Compute matrices */ - /*--------------------------------------*/ - virtual const SGTELIB::Matrix * get_matrix_Zvs (void); - - public: - - /*--------------------------------------*/ - /* Constructor */ - /*--------------------------------------*/ - Surrogate_RBF ( SGTELIB::TrainingSet & trainingset , - SGTELIB::Surrogate_Parameters param) ; - - /*--------------------------------------*/ - /* Destructor */ - /*--------------------------------------*/ - virtual ~Surrogate_RBF ( void ); - - /*--------------------------------------*/ - /* Misc */ - /*--------------------------------------*/ - virtual void display_private ( std::ostream & out ) const; - - }; -} - -#endif diff --git a/ext/sgtelib/src/Surrogate_Utils.cpp b/ext/sgtelib/src/Surrogate_Utils.cpp deleted file mode 100644 index 01d4b1b..0000000 --- a/ext/sgtelib/src/Surrogate_Utils.cpp +++ /dev/null @@ -1,735 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "Surrogate_Utils.hpp" - -/*-------------------------------*/ -/* string comparison */ -/*-------------------------------*/ -bool SGTELIB::streq ( const std::string & s1 , const std::string & s2 ){ - return !std::strcmp(s1.c_str(),s2.c_str()); -}// - -bool SGTELIB::streqi ( const std::string & s1 , const std::string & s2 ){ - const std::string s1u = SGTELIB::toupper(s1); - const std::string s2u = SGTELIB::toupper(s2); - return !std::strcmp(SGTELIB::toupper(s1).c_str(),s2u.c_str()); -}// - -// Check if s is in S. -bool SGTELIB::string_find ( const std::string & S , const std::string & s ){ - const std::string Su = SGTELIB::toupper(S); - const std::string su = SGTELIB::toupper(s); - return ( Su.find(su) < Su.size() ); -}// -/* -bool SGTELIB::issubstring (const std::string S , const std::string s){ - return result = (S.find(s) != std::string::npos); -} -*/ - -/*-------------------------------*/ -/* deblank */ -/*-------------------------------*/ -std::string SGTELIB::deblank ( const std::string & s_input ){ - std::string s = s_input; - // Remove leading spaces - while ( (s.length()) && (s.at(0)==' ') ){ - s.erase(0,1); - } - // Remove trailing spaces - size_t i = s.length(); - while ( (i>0) && (s.at(i-1)==' ') ) { - s.erase(i-1,1); - i--; - } - // Remove double spaces - i=1; - while (i+2<s.length()){ - if ( (s.at(i)==' ') && (s.at(i+1)==' ') ){ - s.erase(i,1); - } - else{ - i++; - } - } - return s; -}// - - - - -/*-------------------------------*/ -/* test if a file is existing */ -/*-------------------------------*/ -bool SGTELIB::exists (const std::string & file) { - struct stat buffer; - return (stat (file.c_str(), &buffer) == 0); -}// - - -/*-------------------------------*/ -/* count_words */ -/*-------------------------------*/ -int SGTELIB::count_words( const std::string & s ) { - int word_count( 0 ); - std::stringstream ss( s ); - std::string word; - while( ss >> word ) ++word_count; - return word_count; -}// - - -/*-------------------------------*/ -/* add string on a new line of */ -/* an existing files */ -/*-------------------------------*/ -void SGTELIB::append_file (const std::string & s , const std::string & file){ - std::string dummy_str; - std::string cmd; - if ( ! SGTELIB::exists(file)){ - cmd = "touch "+ file; - dummy_str = system( cmd.c_str() ); - } - cmd = "echo "+s+" >> "+file; - //std::cout << "cmd : " << cmd << "\n"; - dummy_str = system( cmd.c_str() ); -}// - - -/*-------------------------------*/ -/* wait */ -/*-------------------------------*/ -void SGTELIB::wait (double t) { - // t is a number of seconds -#ifdef _MSC_VER -// Sleep(t*1000000.0); -#else - usleep(t*1000000.0); -#endif -}// - - - -/*-------------------------------*/ -/* isdef (not nan nor inf) */ -/*-------------------------------*/ -bool SGTELIB::isdef ( const double x ) { - if ( isnan(x) ) return false; - if ( isinf(x) ) return false; - if ( fabs(x)>=SGTELIB::INF) return false; - if ( fabs(x)>=1e+16){ - return false; - } - return true; -} - - - -/*-------------------------------*/ -/* distance between two points */ -/*-------------------------------*/ -double SGTELIB::dist ( const double * x , const double * y , int n ) { - double s = 0.0; - double d = 0; - for ( int i = 0 ; i < n ; ++i ) - d = x[i]-y[i]; - s += d*d; - return sqrt(s); -} - -/*------------------*/ -/* relative error */ -/*------------------*/ -double SGTELIB::rel_err ( double x , double y ) { - if ( x*y < 0.0 ) - return 1.0; - if ( x*y == 0.0 ) - return fabs(x-y); - double max = fabs(x); - if ( fabs(y) > max ) - max = fabs(y); - return ( fabs ( x-y ) / max ); -} - -/*---------------------------------*/ -int SGTELIB::round ( double d ) { -/*---------------------------------*/ - return static_cast<int>(d < 0.0 ? -floor(.5-d) : floor(.5+d)); -} - -/*------------------------------------------*/ -std::string SGTELIB::itos ( int i ) { -/*------------------------------------------*/ - std::ostringstream oss; - oss << i; - return oss.str(); -}// - -/*------------------------------------------*/ -std::string SGTELIB::dtos (double d ) { -/*------------------------------------------*/ - std::ostringstream oss; - oss << d; - return oss.str(); -}// - -/*------------------------------------------*/ -std::string SGTELIB::btos (bool b ) { -/*------------------------------------------*/ - if (b) return "True"; - else return "False"; -}// - -/*------------------------------------------*/ -double SGTELIB::stod ( const std::string & s ){ -/*------------------------------------------*/ - double d = atof(s.c_str()); - return d; -}// - -/*------------------------------------------*/ -int SGTELIB::stoi ( const std::string & s ){ -/*------------------------------------------*/ - int d = atoi(s.c_str()); - return d; -}// - -/*----------------------------------------------------------*/ -bool SGTELIB::stob ( const std::string & s ) { -/*----------------------------------------------------------*/ - std::string ss = toupper(s); - if ( ss=="TRUE" ) return true; - if ( ss=="FALSE") return false; - if ( ss=="YES" ) return true; - if ( ss=="NO" ) return false; - if ( ss=="1" ) return true; - if ( ss=="0" ) return false; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Unrecognised string \""+s+"\" ( "+ss+" )" ); -}// - -/*------------------------------------------*/ -bool SGTELIB::isdigit ( const std::string & s ){ -/*------------------------------------------*/ - std::string::const_iterator it = s.begin(); - char c; - while (it != s.end()){ - c = *it; - if ( ! ( ( isdigit(std::string(1,c))) || (c=='+') || (c=='-') || (c=='.') ) ){ - return false; - } - it++; - } - return true; -}// - - - - -/*-----------------------------------------------------------------*/ -/* NOMAD::toupper - 1/2 */ -/*-----------------------------------------------------------------*/ -std::string SGTELIB::toupper ( const std::string & s ) -{ - std::string s2(s); - size_t ns = s2.size(); - for ( size_t i = 0 ; i < ns ; ++i ) - s2[i] = std::toupper(s2[i]); - return s2; -}// - - -/*----------------------------------------------------------*/ -std::string SGTELIB::model_output_to_str ( const SGTELIB::model_output_t ot ) { -/*----------------------------------------------------------*/ - switch ( ot ) { - case SGTELIB::NORMAL_OUTPUT: return "normal"; - case SGTELIB::FIXED_OUTPUT : return "fixed"; - case SGTELIB::BINARY_OUTPUT: return "binary"; - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined type" ); - } -}// - -/*----------------------------------------------------------*/ -std::string SGTELIB::model_type_to_str ( const SGTELIB::model_t t ) { -/*----------------------------------------------------------*/ - switch ( t ) { - case SGTELIB::LINEAR : return "LINEAR"; - case SGTELIB::TGP : return "TGP"; - case SGTELIB::DYNATREE : return "DYNATREE"; - case SGTELIB::KS : return "KS"; - case SGTELIB::CN : return "CN"; - case SGTELIB::PRS : return "PRS"; - case SGTELIB::PRS_EDGE : return "PRS_EDGE"; - case SGTELIB::PRS_CAT : return "PRS_CAT"; - case SGTELIB::RBF : return "RBF"; - case SGTELIB::KRIGING : return "KRIGING"; - case SGTELIB::SVN : return "SVN"; - case SGTELIB::LOWESS : return "LOWESS"; - case SGTELIB::ENSEMBLE : return "ENSEMBLE"; - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined type" ); - } -}// - -/*----------------------------------------------------------*/ -std::string SGTELIB::distance_type_to_str ( const SGTELIB::distance_t t ) { -/*----------------------------------------------------------*/ - switch ( t ) { - case SGTELIB::DISTANCE_NORM2 : return "NORM2"; - case SGTELIB::DISTANCE_NORM1 : return "NORM1"; - case SGTELIB::DISTANCE_NORMINF : return "NORMINF"; - case SGTELIB::DISTANCE_NORM2_IS0 : return "NORM2_IS0"; - case SGTELIB::DISTANCE_NORM2_CAT : return "NORM2_CAT"; - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined type" ); - } -}// - - -/*----------------------------------------------------------*/ -std::string SGTELIB::weight_type_to_str ( const SGTELIB::weight_t cb ) { -/*----------------------------------------------------------*/ - switch (cb){ - case SGTELIB::WEIGHT_SELECT : return "SELECT"; - case SGTELIB::WEIGHT_OPTIM : return "OPTIM" ; - case SGTELIB::WEIGHT_WTA1 : return "WTA1" ; - case SGTELIB::WEIGHT_WTA3 : return "WTA3" ; - case SGTELIB::WEIGHT_EXTERN : return "EXTERN"; - default : - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined type" ); - } -}// - -/*----------------------------------------------------------*/ -std::string SGTELIB::metric_type_to_str ( const SGTELIB::metric_t mt ) { -/*----------------------------------------------------------*/ - switch (mt){ - case SGTELIB::METRIC_EMAX : return "EMAX" ; - case SGTELIB::METRIC_EMAXCV : return "EMAXCV" ; - case SGTELIB::METRIC_RMSE : return "RMSE" ; - case SGTELIB::METRIC_RMSECV : return "RMSECV" ; - case SGTELIB::METRIC_ARMSE : return "ARMSE" ; - case SGTELIB::METRIC_ARMSECV: return "ARMSECV"; - case SGTELIB::METRIC_OE : return "OE" ; - case SGTELIB::METRIC_OECV : return "OECV" ; - case SGTELIB::METRIC_AOE : return "AOE" ; - case SGTELIB::METRIC_AOECV : return "AOECV" ; - case SGTELIB::METRIC_EFIOE : return "EFIOE" ; - case SGTELIB::METRIC_EFIOECV: return "EFIOECV" ; - case SGTELIB::METRIC_LINV : return "LINV" ; - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined metric" ); - } -}// - - -/*----------------------------------------------------------*/ -bool SGTELIB::metric_multiple_obj ( const SGTELIB::metric_t mt ) { -/*----------------------------------------------------------*/ - switch (mt){ - case SGTELIB::METRIC_EMAX : - case SGTELIB::METRIC_EMAXCV : - case SGTELIB::METRIC_RMSE : - case SGTELIB::METRIC_RMSECV : - case SGTELIB::METRIC_OE : - case SGTELIB::METRIC_OECV : - case SGTELIB::METRIC_LINV : - return true; - case SGTELIB::METRIC_ARMSE : - case SGTELIB::METRIC_ARMSECV: - case SGTELIB::METRIC_AOE : - case SGTELIB::METRIC_AOECV : - case SGTELIB::METRIC_EFIOE : - case SGTELIB::METRIC_EFIOECV : - return false; - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined metric" ); - } -}// - -/*----------------------------------------------------------*/ -SGTELIB::metric_t SGTELIB::metric_convert_single_obj ( const SGTELIB::metric_t mt ) { -/*----------------------------------------------------------*/ - switch (mt){ - // Metric that do not have a "Single obj" equivalent - case SGTELIB::METRIC_EMAX : - case SGTELIB::METRIC_EMAXCV : - case SGTELIB::METRIC_LINV : - std::cout << "The metric " << SGTELIB::metric_type_to_str(mt) << "is not supported for this type of model\n"; - std::cout << "AOECV metric will be used.\n"; - return SGTELIB::METRIC_AOECV; - // Metric that have a "single obj" equivalent - case SGTELIB::METRIC_RMSE : - return SGTELIB::METRIC_ARMSE; - case SGTELIB::METRIC_RMSECV : - return SGTELIB::METRIC_ARMSECV; - case SGTELIB::METRIC_OE : - return SGTELIB::METRIC_AOE; - case SGTELIB::METRIC_OECV : - return SGTELIB::METRIC_AOECV; - // Metric that are "single obj" - case SGTELIB::METRIC_ARMSE : - case SGTELIB::METRIC_ARMSECV: - case SGTELIB::METRIC_AOE : - case SGTELIB::METRIC_AOECV : - case SGTELIB::METRIC_EFIOE : - case SGTELIB::METRIC_EFIOECV : - return mt; - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined metric" ); - } -}// - - - -/*----------------------------------------------------------*/ -std::string SGTELIB::bbo_type_to_str ( SGTELIB::bbo_t bbot ) { -/*----------------------------------------------------------*/ - switch ( bbot ) { - case SGTELIB::BBO_OBJ: return "OBJ"; - case SGTELIB::BBO_CON: return "CON"; - case SGTELIB::BBO_DUM: return "DUM"; - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Undefined type" ); - } -}// - -/*----------------------------------------------------------*/ -SGTELIB::model_t SGTELIB::str_to_model_type ( const std::string & s ) { -/*----------------------------------------------------------*/ - std::string ss = SGTELIB::toupper(s); - if ( ss=="LINEAR" ){ return SGTELIB::LINEAR; } - if ( ss=="TGP" ){ return SGTELIB::TGP; } - if ( ss=="DYNATREE" ){ return SGTELIB::DYNATREE; } - if ( ss=="KS" ){ return SGTELIB::KS; } - if ( ss=="CN" ){ return SGTELIB::CN; } - if ( ss=="PRS" ){ return SGTELIB::PRS; } - if ( ss=="PRS_EDGE" ){ return SGTELIB::PRS_EDGE; } - if ( ss=="PRS_CAT" ){ return SGTELIB::PRS_CAT; } - if ( ss=="RBF" ){ return SGTELIB::RBF; } - if ( ss=="KRIGING" ){ return SGTELIB::KRIGING; } - if ( ss=="SVN" ){ return SGTELIB::SVN; } - if ( ss=="LWR" ){ return SGTELIB::LOWESS; } - if ( ss=="LOWESS" ){ return SGTELIB::LOWESS; } - if ( ss=="ENSEMBLE" ){ return SGTELIB::ENSEMBLE; } - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Unrecognised string \""+s+"\" ( "+ss+" )" ); -}// - -/*----------------------------------------------------------*/ -SGTELIB::weight_t SGTELIB::str_to_weight_type ( const std::string & s ) { -/*----------------------------------------------------------*/ - std::string ss = SGTELIB::toupper(s); - if ( ss=="SELECT" ){ return SGTELIB::WEIGHT_SELECT;} - if ( ss=="OPTIM" ){ return SGTELIB::WEIGHT_OPTIM; } - if ( ss=="WTA1" ){ return SGTELIB::WEIGHT_WTA1; } - if ( ss=="WTA3" ){ return SGTELIB::WEIGHT_WTA3; } - if ( ss=="EXTERN" ){ return SGTELIB::WEIGHT_EXTERN;} - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Unrecognised string \""+s+"\" ( "+ss+" )" ); -}// - -/*----------------------------------------------------------*/ -SGTELIB::distance_t SGTELIB::str_to_distance_type ( const std::string & s ) { -/*----------------------------------------------------------*/ - std::string ss = SGTELIB::toupper(s); - if ( ss=="NORM2" ){ return SGTELIB::DISTANCE_NORM2; } - if ( ss=="NORM1" ){ return SGTELIB::DISTANCE_NORM1; } - if ( ss=="NORMINF" ){ return SGTELIB::DISTANCE_NORMINF; } - - if ( ss=="ISO" ){ return SGTELIB::DISTANCE_NORM2_IS0; } - if ( ss=="IS0" ){ return SGTELIB::DISTANCE_NORM2_IS0; } - if ( ss=="NORM2_ISO"){ return SGTELIB::DISTANCE_NORM2_IS0; } - if ( ss=="NORM2_IS0"){ return SGTELIB::DISTANCE_NORM2_IS0; } - - if ( ss=="CAT" ){ return SGTELIB::DISTANCE_NORM2_CAT; } - if ( ss=="NORM2_CAT"){ return SGTELIB::DISTANCE_NORM2_CAT; } - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Unrecognised string \""+s+"\" ( "+ss+" )" ); -}// - -/*----------------------------------------------------------*/ -SGTELIB::distance_t SGTELIB::int_to_distance_type ( const int i ) { -/*----------------------------------------------------------*/ - if ( (i<0) || (i>=SGTELIB::NB_DISTANCE_TYPES) ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "int_to_distance_type: invalid integer "+itos(i) ); - } - switch ( i ){ - case 0: return SGTELIB::DISTANCE_NORM2; - case 1: return SGTELIB::DISTANCE_NORM1; - case 2: return SGTELIB::DISTANCE_NORMINF; - case 3: return SGTELIB::DISTANCE_NORM2_IS0; - case 4: return SGTELIB::DISTANCE_NORM2_CAT; - default: - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "int_to_kernel_type: invalid integer "+itos(i) ); - } -}// - -/*----------------------------------------------------------*/ -SGTELIB::metric_t SGTELIB::str_to_metric_type ( const std::string & s ) { -/*----------------------------------------------------------*/ - std::string ss = SGTELIB::toupper(s); - if ( ss=="EMAX" ){ return SGTELIB::METRIC_EMAX ;} - if ( ss=="EMAXCV" ){ return SGTELIB::METRIC_EMAXCV ;} - if ( ss=="RMSE" ){ return SGTELIB::METRIC_RMSE ;} - if ( ss=="RMSECV" ){ return SGTELIB::METRIC_RMSECV ;} - if ( ss=="PRESS" ){ return SGTELIB::METRIC_RMSECV ;} - if ( ss=="ARMSE" ){ return SGTELIB::METRIC_ARMSE ;} - if ( ss=="ARMSECV"){ return SGTELIB::METRIC_ARMSECV ;} - if ( ss=="OE" ){ return SGTELIB::METRIC_OE ;} - if ( ss=="OECV" ){ return SGTELIB::METRIC_OECV ;} - if ( ss=="AOE" ){ return SGTELIB::METRIC_AOE ;} - if ( ss=="AOECV" ){ return SGTELIB::METRIC_AOECV ;} - if ( ss=="EFIOE" ){ return SGTELIB::METRIC_EFIOE ;} - if ( ss=="EFIOECV" ){ return SGTELIB::METRIC_EFIOECV;} - if ( ss=="LINV" ){ return SGTELIB::METRIC_LINV ;} - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"Unrecognised string \""+s+"\" ( "+ss+" )" ); -}// - - - -/*----------------------------------------------*/ -/* Same sign */ -/*----------------------------------------------*/ -bool SGTELIB::same_sign (const double a, const double b) { - return ( (a*b>0) || ( (fabs(a)<EPSILON) && (fabs(b)<EPSILON) ) ); -}// - - -/*----------------------------------------*/ -/* Compute CUMULATIVE Density Function */ -/* (Centered & Normalized Gaussian law) */ -/*----------------------------------------*/ -double SGTELIB::normcdf ( double x ) { - double t , t2 , v , Phi; - if (fabs(x)<EPSILON){ - Phi = 0.5; - } - else{ - t = 1.0 / ( 1.0 + 0.2316419 * fabs(x) ); - t2 = t*t; - v = exp(-x*x/2.0)*t*(0.319381530-0.356563782*t+1.781477937*t2-1.821255978*t*t2+1.330274429*t2*t2)/2.506628274631; - Phi = (x<0.0)?v:1.0-v; - } - return Phi; -}// - -/*----------------------------------------*/ -/* Compute CUMULATIVE Density Function */ -/* (Gaussian law) */ -/*----------------------------------------*/ -double SGTELIB::normcdf ( double x , double mu , double sigma ) { - if (sigma<-EPSILON){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Utils::normpdf: sigma is <0" ); - } - // Apply lower bound to sigma - if (APPROX_CDF){ - sigma = std::max(sigma,EPSILON); - } - // Compute CDF - if (sigma<EPSILON){ - // The cdf is an Heavyside function - return (x>mu)?1.0:0.0; - } - else{ - // Normal case - return normcdf( (x-mu)/sigma ); - } -}// - - -/*----------------------------------------*/ -/* Compute PROBABILITY Density Function */ -/* (Centered & Normalized Gaussian law) */ -/*----------------------------------------*/ -double SGTELIB::normpdf ( double x ) { - return 0.398942280401*exp(-0.5*x*x); -}// - -/*----------------------------------------*/ -/* Compute PROBABILITY Density Function */ -/* (Gaussian law) */ -/*----------------------------------------*/ -double SGTELIB::normpdf ( double x , double mu , double sigma ) { - if (sigma<EPSILON){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Utils::normpdf: sigma is NULL" ); - } - return normpdf( (x-mu)/sigma )/sigma; -}// - -/*----------------------------------------*/ -/* Compute EI (expected improvement) */ -/* (Gaussian law) */ -/*----------------------------------------*/ -double SGTELIB::normei ( double fh , double sh , double f_min ) { - if (sh<-EPSILON){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Utils::normei: sigma is <0" ); - } - // Apply lower bound to sigma - if (APPROX_CDF){ - sh = std::max(sh,EPSILON); - } - if (sh<EPSILON){ - // If there is no uncertainty, then: - // - fh<f_min => EI = f_min-fh - // - fh>f_min => EI = 0 - return (fh<f_min)?(f_min-fh):0; - } - else{ - // Normal case - double d = (f_min-fh)/sh; - return (f_min-fh)*normcdf(d) + sh*normpdf(d); - } -}// - -/*----------------------------------------*/ -/* CDF of gamma distribution */ -/*----------------------------------------*/ -double SGTELIB::gammacdf(double x, double a, double b){ - // a : shape coef - // b : scale coef - if ( (a<=0) || (b<=0) ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Utils::gammacdf: a or b is <0" ); - } - if (x<EPSILON) return 0.0; - - return lower_incomplete_gamma(x/b,a); -}// - -/*----------------------------------------*/ -/* Inverse CDF of gamma distribution */ -/*----------------------------------------*/ -double SGTELIB::gammacdfinv(double f, double a, double b){ - // a : shape coef - // b : scale coef - if ( (a<=0) || (b<=0) ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Utils::gammacdfinv: a or b is <0" ); - } - if ( (f<0) || (f>1) ){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Utils::gammacdfinv: f<0 or f>1" ); - } - if (f==1.0) return INF; - if (f==0.0) return 0; - - //std::cout << "f,a,b : " << f << " " << a << " " << b << "\n"; - - double xmin = 0; - double xmax = 1; - double xtry; - // Extend upper bound -int k = 0; - while (SGTELIB::gammacdf(xmax,a,b)<f){ - xmin = xmax; - xmax*=2.0; - //std::cout << "up " << xmax << " " << a << " " << b << " " << SGTELIB::gammacdf(xmax,a,b) << "\n"; - k++; - if (k>10) break; - } - - while (xmax-xmin>10000*EPSILON){ - xtry = (xmin+xmax)/2.0; - if (SGTELIB::gammacdf(xtry,a,b)>f) xmax = xtry; - else xmin = xtry; - //std::cout << "dichotomie : " << xtry << "\n"; - } - return (xmin+xmax)/2.0; -}// - -/*----------------------------------------*/ -/* lower incomplete gamma function */ -/*----------------------------------------*/ -// See: -// Milton Abramowitz, Irene Stegun,Handbook of Mathematical Functions, National Bureau of Standards, 1964. -// Stephen Wolfram, The Mathematica Book,Fourth Edition,Cambridge University Press, 1999. -double SGTELIB::lower_incomplete_gamma ( const double x, double p ){ - // Special cases - if ( ( x < EPSILON ) || ( p < EPSILON ) ) return 0; - -#ifdef _MSC_VER -#if ( _MSC_VER <= 1600 ) - throw SGTELIB::Exception ( __FILE__ , __LINE__ , - "Surrogate_Utils:: lgamma function not supported with VisualStudio 2010 or lower " ); -#define _LGAMMA_GUARD -#endif -#endif - double f=0; -#ifndef _LGAMMA_GUARD - f = exp( p * log ( x ) - lgamma ( p + 1.0 ) - x ); -#endif - double dv = 1.0, v = 1.0; - while (dv > v/1e+9) { - dv *= x / (++p); - v += dv; - } - return v*f; - -}// - -/*----------------------------------------*/ -/* difference between two timeval, in ms */ -/*----------------------------------------*/ -int SGTELIB::diff_ms(timeval t1, timeval t2){ - return static_cast<int>((((t1.tv_sec - t2.tv_sec) * 1000000) + (t1.tv_usec - t2.tv_usec +500))/1000); -}// - -/*----------------------------------------*/ -/* uniform rand generator */ -/*----------------------------------------*/ -double SGTELIB::uniform_rand (void){ - return double(rand() / double(INT_MAX)); -}// - -/*----------------------------------------*/ -/* quick gaussian random generator */ -/*----------------------------------------*/ -double SGTELIB::quick_norm_rand (void){ - const int N = 24; - double d = 0; - for (int i=1 ; i<N ; i++) d+= uniform_rand(); - d -= double(N)/2.0; - d *= sqrt(12.0/double(N)); - return d; -}// - -/*----------------------------------------*/ -/* relative ceil */ -/*----------------------------------------*/ -double SGTELIB::rceil (double d){ - if (d>0) return std::ceil(d); - else if (d<0) return std::floor(d); - else return 0.0; -}// - - - - - diff --git a/ext/sgtelib/src/Surrogate_Utils.hpp b/ext/sgtelib/src/Surrogate_Utils.hpp deleted file mode 100644 index 4cbeb3f..0000000 --- a/ext/sgtelib/src/Surrogate_Utils.hpp +++ /dev/null @@ -1,210 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_SURROGATE_UTILS__ -#define __SGTELIB_SURROGATE_UTILS__ - -#include "Defines.hpp" -#include "Exception.hpp" -#include "Matrix.hpp" -#include <sys/stat.h> - -// CASE Visual Studio C++ compiler -#ifdef _MSC_VER -#pragma warning(disable:4996) -#include <io.h> -#define isnan(x) _isnan(x) -#define isdigit(x) _isdigit(x) -#define isinf(x) (!_finite(x)) - -typedef struct timeval { - long tv_sec; - long tv_usec; -} timeval; - -#else -#include <unistd.h> -#endif - - -#include <cstring> -#include <cctype> - -namespace SGTELIB { - - enum distance_t { - DISTANCE_NORM2 , - DISTANCE_NORM1 , - DISTANCE_NORMINF , - DISTANCE_NORM2_IS0, - DISTANCE_NORM2_CAT - }; - const int NB_DISTANCE_TYPES = 5; - - // model type: - enum model_t { - LINEAR , - TGP , - DYNATREE , - PRS , - PRS_EDGE , - PRS_CAT , - KS , - CN , - KRIGING , - SVN , - RBF , - LOWESS , - ENSEMBLE - }; - const int NB_MODEL_TYPES = 12; - - // Aggregation methods (for the Surrogate_Ensemble) - enum weight_t { - WEIGHT_SELECT,// Take the model with the best metrics. - WEIGHT_OPTIM, // Optimize the metric - WEIGHT_WTA1, // Goel, Ensemble of surrogates 2007 - WEIGHT_WTA3, // Goel, Ensemble of surrogates 2007 - WEIGHT_EXTERN // Belief vector is set externaly by the user. - }; - const int NB_WEIGHT_TYPES = 5; - - // Metrics - enum metric_t { - METRIC_EMAX, // Max absolute error - METRIC_EMAXCV,// Max absolute error on cross-validation value - METRIC_RMSE, // Root mean square error - METRIC_ARMSE, // Agregate Root mean square error - METRIC_RMSECV, // Leave-one-out cross-validation - METRIC_ARMSECV, // Agregate Leave-one-out cross-validation - METRIC_OE, // Order error on the training points - METRIC_OECV, // Order error on the cross-validation output - METRIC_AOE, // Agregate Order error - METRIC_AOECV, // Agregate Order error on the cross-validation output - METRIC_EFIOE, // Order error on the cross-validation output - METRIC_EFIOECV, // Agregate Order error on the cross-validation output - METRIC_LINV // Inverse of the likelihood - }; - const int NB_METRIC_TYPES = 11; - - - // Diff in ms - int diff_ms(timeval t1, timeval t2); - - // Compare strings - bool streq ( const std::string & s1 , const std::string & s2 ); - bool streqi ( const std::string & s1 , const std::string & s2 ); - // Check if s is a substring of S - bool string_find ( const std::string & S , const std::string & s ); - //bool issubstring (const std::string S , const std::string s); - - - // Remove useless spaces in string - std::string deblank ( const std::string & s_input ); - - // test if a file exists - bool exists (const std::string & file); - - // Word count - int count_words(const std::string & s ); - - // add string on a new line of an existing files - void append_file (const std::string & s , const std::string & file); - - // wait - void wait (double t); - - // isdef (not nan nor inf) - bool isdef ( const double x ); - - // rounding: - int round ( double d ); - double rceil (double d); - - // relative error: - double rel_err ( double x , double y ); - - // distance between two points: - double dist ( const double * x , const double * y , int n ); - - // same sign - bool same_sign (const double a, const double b); - - // conversion functions (to string) : - std::string itos ( int ); - std::string dtos ( double ); - std::string btos ( bool ); - double stod ( const std::string & s ); - int stoi ( const std::string & s ); - bool stob ( const std::string & s ); - - std::string toupper ( const std::string & s ); - - std::string model_output_to_str ( const SGTELIB::model_output_t ); - std::string model_type_to_str ( const SGTELIB::model_t ); - std::string bbo_type_to_str ( const SGTELIB::bbo_t ); - std::string weight_type_to_str ( const SGTELIB::weight_t ); - std::string metric_type_to_str ( const SGTELIB::metric_t ); - std::string distance_type_to_str ( const SGTELIB::distance_t ); - - // conversion functions (from string) : - bool isdigit ( const std::string & s ); - SGTELIB::model_t str_to_model_type ( const std::string & s ); - SGTELIB::weight_t str_to_weight_type ( const std::string & s ); - SGTELIB::metric_t str_to_metric_type ( const std::string & s ); - SGTELIB::distance_t str_to_distance_type ( const std::string & s ); - SGTELIB::distance_t int_to_distance_type ( const int i ); - - // Info on metric - // Tells if a metric returns one or multiple objectives - // (i.e. One for all the BBO OR One per BBO) - bool metric_multiple_obj ( const SGTELIB::metric_t mt ); - - // Convert a metric to another metric that returns only 1 obj. - SGTELIB::metric_t metric_convert_single_obj ( const SGTELIB::metric_t mt ); - - - /* - // Find the index of the smallest value in an array v of size vsize. - int get_min_index ( const double * v , const int vsize ); - // (optional: exclude index "i_exclude" from the search) - int get_min_index ( const double * v , const int vsize , const int i_exclude); - */ - - // Statistics - double normcdf ( double x ); - double normcdf ( double x , double mu , double sigma ); - double normpdf ( double x ); - double normpdf ( double x , double mu , double sigma ); - double normei ( double fh, double sh , double f_min ); - double gammacdf ( double x, double a, double b); - double gammacdfinv( double f, double a, double b); - double lower_incomplete_gamma ( const double x, const double p ); - - double uniform_rand (void); - double quick_norm_rand (void); -} - -#endif diff --git a/ext/sgtelib/src/Tests.cpp b/ext/sgtelib/src/Tests.cpp deleted file mode 100644 index ee4dd3c..0000000 --- a/ext/sgtelib/src/Tests.cpp +++ /dev/null @@ -1,1580 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "Tests.hpp" -#include "Surrogate_Ensemble.hpp" - -void SGTELIB::sand_box (void){ - - std::cout << "End of sandbox\nEXIT\n"; -}// - - -void SGTELIB::test_LOWESS_times ( void ){ - - std::cout << "====================================================================\n"; - std::cout << "START LOWESS TIMES\n"; - - const int m = 1; - const int pp = 6; - int n = 0; - - for (int in=0 ; in<1 ; in++){ - if (in==0) n = 16; - if (in==1) n = 8; - if (in==2) n = 4; - if (in==3) n = 2; - if (in==4) n = 1; - - std::cout <<"--------------------\n"; - - int NEXP = 20; - - int p = (n+1)*(n+2); - //if (p<20) p=20; - double dx; - - for (int id=10 ; id<11 ; id++){ - dx = pow(10.0,-id); - std::cout << "n=" << n << ", dx=" << dx << "\n"; - - SGTELIB::Matrix DX ("DX",1,n); - SGTELIB::Matrix X ("X",p,n); - SGTELIB::Matrix XX ("XX",pp,n); - SGTELIB::Matrix Z ("Z",p,m); - SGTELIB::Matrix * ZZ = new SGTELIB::Matrix("ZZ",pp,m); - - for (int i = 0 ; i<NEXP ; i++){ - std::cout << "n=" << n << ", dx=" << dx << ", nexp=" << i << "\n"; - // Build data - X.set_random(-5,+5,false); - Z.set_random(-5,+5,false); - SGTELIB::TrainingSet C0(X,Z); - SGTELIB::Surrogate * S0; - // Build model - S0 = SGTELIB::Surrogate_Factory(C0,"TYPE LOWESS RIDGE 0.001"); - S0->build(); - // Build XX - DX.set_random(-1,+1,false); - XX.set_row(DX,0); - for (int j=1 ; j<pp ; j++){ - DX.set_random(-1,+1,false); - DX = DX*(dx/DX.norm()); - DX = DX + XX.get_row(j-1); - XX.set_row(DX,j); - } - // Prediction - S0->predict(XX,ZZ); - }// end loop i - - delete ZZ; - - }// end loop id - }// end loop in - - std::cout << "FINISH LOWESS TIMES\n"; - std::cout << "====================================================================\n"; - -}// - - - - -void SGTELIB::test_many_models ( const std::string & output_file , - const SGTELIB::Matrix & X0 , - const SGTELIB::Matrix & Z0 ){ - std::cout << "======================================================\n"; - std::cout << "SGTELIB::test_many_models\n"; - - // Data information - const int m = Z0.get_nb_cols(); - - // TrainingSet creation - SGTELIB::TrainingSet C0(X0,Z0); - #ifdef SGTELIB_DEBUG - C0.display(std::cout); - #endif - // Init model - SGTELIB::Surrogate * S0; - - // LOAD MODEL LIST in model_list_file - std::vector<std::string> model_list; - model_list.push_back("TYPE PRS DEGREE 2"); - model_list.push_back("TYPE PRS DEGREE OPTIM"); - model_list.push_back("TYPE KS KERNEL_COEF OPTIM"); - model_list.push_back("TYPE LOWESS KERNEL_COEF OPTIM DEGREE 1"); - model_list.push_back("TYPE LOWESS KERNEL_COEF OPTIM DEGREE OPTIM KERNEL_TYPE OPTIM"); - model_list.push_back("TYPE RBF PRESET I"); - - - // BUILD THE METRIC LIST - std::vector<SGTELIB::metric_t> metric_list; - - metric_list.push_back( METRIC_RMSE ); - metric_list.push_back( METRIC_RMSECV ); - metric_list.push_back( METRIC_OE ); - metric_list.push_back( METRIC_OECV ); - - // Open an output file - std::ofstream out; - out.open (output_file.c_str()); - - out << "list_metrics " ; - for (std::vector<SGTELIB::metric_t>::iterator it_metric = metric_list.begin() ; it_metric != metric_list.end(); ++it_metric){ - out << SGTELIB::metric_type_to_str(*it_metric) << " "; - } - out << "\n\n"; - - bool ready; - // Loop on the models - for (std::vector<std::string>::iterator it_model = model_list.begin() ; it_model != model_list.end(); ++it_model){ - - std::cout << "Build " << *it_model << "\n"; - out << *it_model << "\n"; - - // Create model - S0 = SGTELIB::Surrogate_Factory(C0,*it_model); - ready = S0->build(); - - // Loop on the outputs - for (int j=0 ; j<m ; j++){ - out << "output " << j << "\n"; - out << "metrics "; - // Loop on the metrics - for (std::vector<SGTELIB::metric_t>::iterator it_metric = metric_list.begin() ; it_metric != metric_list.end(); ++it_metric){ - if (ready) - out << S0->get_metric (*it_metric,j) << " "; - else - out << "-999 "; - } - out << "\n"; - } - out << "\n"; - SGTELIB::surrogate_delete(S0); - } - out.close(); - -}// - - -/*----------------------------------------------------*/ -/* TEST QUICK */ -/*----------------------------------------------------*/ -std::string SGTELIB::test_quick (const std::string & s , const SGTELIB::Matrix & X0){ - - - std::cout << "======================================================\n"; - std::cout << "SGTELIB::test_quick\n"; - std::cout << s << "\n"; - - // CONSTRUCT DATA - SGTELIB::Matrix Z0 = test_functions(X0); - const int m = Z0.get_nb_cols(); - bool ready; - - // CONSTRUCT REFERENCE MODEL - SGTELIB::TrainingSet C0(X0,Z0); - SGTELIB::Surrogate * S0; - S0 = SGTELIB::Surrogate_Factory(C0,s); - ready = S0->build(); - - if ( ! ready){ - surrogate_delete(S0); - std::cout << "test_quick: model ("+s+") is not ready\n"; - return "test_quick: model ("+s+") is not ready\n"; - } - - // Compute the metrics - double * emax = new double [m]; - double * rmse = new double [m]; - double * rmsecv= new double [m]; - double * oe = new double [m]; - double * oecv = new double [m]; - double * linv = new double [m]; - for (int j=0 ; j<m ; j++){ - emax[j] = S0->get_metric(SGTELIB::METRIC_EMAX,j); - rmse[j] = S0->get_metric(SGTELIB::METRIC_RMSE,j); - rmsecv[j]=S0->get_metric(SGTELIB::METRIC_RMSECV,j); - oe[j] = S0->get_metric(SGTELIB::METRIC_OE,j); - oecv[j] = S0->get_metric(SGTELIB::METRIC_OECV,j); - linv[j] = S0->get_metric(SGTELIB::METRIC_LINV,j); - } - - // Display - std::ostringstream oss; - oss << "test_quick\n"; - oss << "Surrogate string: " << s << "\n"; - oss << " j| emax| rmse| rmsecv| oe| oecv| linv|\n"; - oss << "---|--------------|--------------|--------------|--------------|--------------|--------------|\n"; - for (int j=0 ; j<m ; j++){ - oss.width(3); - oss << j << "|"; - oss.width(14); - oss << emax[j] << "|"; - oss.width(14); - oss << rmse[j] << "|"; - oss.width(14); - oss << rmsecv[j] << "|"; - oss.width(14); - oss << oe[j] << "|"; - oss.width(14); - oss << oecv[j] << "|"; - oss.width(14); - oss << linv[j] << "|\n"; - } - oss << "---|--------------|--------------|--------------|--------------|--------------|--------------|\n"; - std::cout << oss.str(); - - for (int j=0 ; j<m ; j++){ - if ( (isnan(emax[j])) || (isnan(rmsecv[j])) || (isnan(oe[j])) || (isnan(oecv[j])) || (isnan(linv[j])) ){ - std::cout << "There is some nan\n"; - std::cout << "EXIT!\n"; - exit(0); - } - if ( (isinf(emax[j])) || (isinf(rmse[j])) || ( isinf(rmsecv[j])) || (isinf(oe[j])) || (isinf(oecv[j])) || (isinf(linv[j])) ){ - std::cout << "There is some inf\n"; - std::cout << "EXIT!\n"; - exit(0); - } - } - delete [] emax; - delete [] rmse; - delete [] rmsecv; - delete [] oe; - delete [] oecv; - delete [] linv; - - SGTELIB::surrogate_delete(S0); - - return oss.str(); -}// - - -/*----------------------------------------------------*/ -/* TEST pxx */ -/*----------------------------------------------------*/ -std::string SGTELIB::test_pxx (const std::string & s , const SGTELIB::Matrix & X0){ - - std::cout << "======================================================\n"; - std::cout << "SGTELIB::test_pxx\n"; - std::cout << s << "\n"; - - SGTELIB::Matrix Z0 = test_functions(X0); - - // CONSTRUCT DATA - const int n = X0.get_nb_cols(); - const int p = X0.get_nb_rows(); - const int m = Z0.get_nb_cols(); - - // CONSTRUCT REFERENCE MODEL - SGTELIB::TrainingSet C0(X0,Z0); - SGTELIB::Surrogate * S0; - S0 = SGTELIB::Surrogate_Factory(C0,s); - bool ready; - ready = S0->build(); - - if ( ! ready){ - surrogate_delete(S0); - std::cout << "test_pxx: model ("+s+") is not ready\n"; - return "test_pxx: model ("+s+") is not ready\n"; - } - - // Init - SGTELIB::Matrix XX; - int pxx; - - // Validation predictions - SGTELIB::Matrix * ZZ = NULL; - SGTELIB::Matrix * std = NULL; - SGTELIB::Matrix * ei = NULL; - SGTELIB::Matrix * cdf = NULL; - - // Reference prediction - SGTELIB::Matrix * ZZ0 = NULL; - SGTELIB::Matrix * std0 = NULL; - SGTELIB::Matrix * ei0 = NULL; - SGTELIB::Matrix * cdf0 = NULL; - - for (int i=0 ; i<4 ; i++){ - switch (i){ - case 0: - pxx = 1; - break; - case 1: - pxx = 2; - break; - case 2: - pxx = p; - break; - case 3: - pxx = 2*p; - break; - default: - std::cout << "ERROR i = " << i << "\n"; - exit(0); - } - - // TESTING POINT(S) - XX = SGTELIB::Matrix("XX",pxx,n); - XX.set_random(-10,+10,false); - - // Reference output matrices - ZZ0 = new SGTELIB::Matrix("ZZ0" ,pxx,m); - std0 = new SGTELIB::Matrix("std0",pxx,m); - ei0 = new SGTELIB::Matrix("ei0" ,pxx,m); - cdf0 = new SGTELIB::Matrix("cdf0",pxx,m); - - S0->predict(XX,ZZ0,std0,ei0,cdf0); - - for (int k=0 ; k<7 ; k++){ - - // Output matrices - ZZ = new SGTELIB::Matrix("ZZ" ,pxx,m); - std = new SGTELIB::Matrix("std",pxx,m); - ei = new SGTELIB::Matrix("ei" ,pxx,m); - cdf = new SGTELIB::Matrix("cdf",pxx,m); - - switch (k){ - case 0: - S0->predict(XX,ZZ); - check_matrix_diff(ZZ0 ,ZZ); - break; - case 1: - S0->predict(XX,ZZ,std ,NULL,NULL); - check_matrix_diff(ZZ0 ,ZZ); - check_matrix_diff(std0,std); - break; - case 2: - S0->predict(XX,ZZ,NULL,ei ,NULL); - check_matrix_diff(ZZ0 ,ZZ); - check_matrix_diff(ei0,ei); - break; - case 3: - S0->predict(XX,ZZ,NULL,NULL,cdf ); - check_matrix_diff(ZZ0 ,ZZ); - check_matrix_diff(cdf0,cdf); - break; - case 4: - S0->predict(XX,ZZ,NULL,ei ,cdf ); - check_matrix_diff(ZZ0 ,ZZ); - check_matrix_diff(ei0 ,ei); - check_matrix_diff(cdf0,cdf); - break; - case 5: - S0->predict(XX,ZZ,std ,NULL,cdf ); - check_matrix_diff(ZZ0 ,ZZ); - check_matrix_diff(std0,std); - check_matrix_diff(cdf0,cdf); - break; - case 6: - S0->predict(XX,ZZ,std ,ei ,NULL); - check_matrix_diff(ZZ0 ,ZZ); - check_matrix_diff(std0,std); - check_matrix_diff(ei0 ,ei); - break; - default: - std::cout << "ERROR k = " << k << "\n"; - exit(0); - - }// end switch - - delete ZZ; - delete std; - delete ei; - delete cdf; - - }// end loop k - - delete ZZ0; - delete std0; - delete ei0; - delete cdf0; - - }//end loop i - - SGTELIB::surrogate_delete(S0); - - return "test_pxx ok\n"; -}// - - - -/*----------------------------------------------------*/ -/* TEST update */ -/*----------------------------------------------------*/ -std::string SGTELIB::test_update (const std::string & s , const SGTELIB::Matrix & X0){ - - std::cout << "======================================================\n"; - std::cout << "SGTELIB::test_update\n"; - std::cout << s << "\n"; - - // CONSTRUCT DATA - const int p = X0.get_nb_rows(); - const int n = X0.get_nb_cols(); - SGTELIB::Matrix Z0 = test_functions(X0); - const int m = Z0.get_nb_cols(); - - // CONSTRUCT MODEL - SGTELIB::TrainingSet C0(X0,Z0); - SGTELIB::Surrogate * S0; - S0 = SGTELIB::Surrogate_Factory(C0,s); - bool ready; - ready = S0->build(); - - if ( ! ready){ - surrogate_delete(S0); - std::cout << "test_update: model ("+s+") is not ready\n"; - return "test_update: model ("+s+") is not ready\n"; - } - - // Testing set - const int pxx = 3; - SGTELIB::Matrix XX("XX",pxx,n); - XX.set_random(-5,+5,false); - - // Reference prediction - SGTELIB::Matrix * ZZ0 = new SGTELIB::Matrix("ZZ0" ,pxx,m); - SGTELIB::Matrix * std0 = new SGTELIB::Matrix("std0",pxx,m); - SGTELIB::Matrix * ei0 = new SGTELIB::Matrix("ei0" ,pxx,m); - SGTELIB::Matrix * cdf0 = new SGTELIB::Matrix("cdf0",pxx,m); - S0->predict(XX,ZZ0,std0,ei0,cdf0); - - - // CONSTRUCT MODEL - SGTELIB::TrainingSet C1(X0.get_row(0),Z0.get_row(0)); - SGTELIB::Surrogate * S1; - S1 = SGTELIB::Surrogate_Factory(C1,s); - S1->build(); - - for (int i=1 ; i<p ; i++){ - C1.add_points(X0.get_row(i),Z0.get_row(i)); - S1->build(); - } - - // Validation predictions - SGTELIB::Matrix * ZZ1 = new SGTELIB::Matrix("ZZ1" ,pxx,m); - SGTELIB::Matrix * std1 = new SGTELIB::Matrix("std1",pxx,m); - SGTELIB::Matrix * ei1 = new SGTELIB::Matrix("ei1" ,pxx,m); - SGTELIB::Matrix * cdf1 = new SGTELIB::Matrix("cdf1",pxx,m); - S1->predict(XX,ZZ1,std1,ei1,cdf1); - - // Check consistency - check_matrix_diff(ZZ0 ,ZZ1 ); - check_matrix_diff(std0,std1); - check_matrix_diff(ei0 ,ei1 ); - check_matrix_diff(cdf0,cdf1); - - // Free space - SGTELIB::surrogate_delete(S0); - SGTELIB::surrogate_delete(S1); - - delete ZZ0; - delete std0; - delete ei0; - delete cdf0; - - delete ZZ1; - delete std1; - delete ei1; - delete cdf1; - - return "test_update ok\n"; - -}// - - - -/*----------------------------------------------------*/ -/* TEST SINGULAR DATA */ -/*----------------------------------------------------*/ -std::string SGTELIB::test_singular_data (const std::string & s ) { - - std::cout << "======================================================\n"; - std::cout << "SGTELIB::test_singular_data\n"; - std::cout << s << "\n"; - - // CONSTRUCT DATA - const int n = 3; - const int p = 10; - SGTELIB::Matrix X0 ("X0",p,n); - X0.set_random(0,10,false); - SGTELIB::Matrix Z0 = test_functions(X0); - const int m = Z0.get_nb_cols(); - Z0.set_name("Z0"); - - // Column 0 of X0 is constant (= 0.0); - X0.set_col(0.0,0); - // Column 0 of Z0 is constant (= 0.0); - Z0.set_col(0.0,0); - // Column 1 of Z0 has some nan - // Z0.set(2,1,0.0/0.0); - // Z0.set(5,1,0.0/0.0); - Z0.set(2,1,SGTELIB::NaN); - Z0.set(5,1,SGTELIB::NaN); - // Column 2 of Z0 has some inf - Z0.set(4,2,SGTELIB::INF); - Z0.set(7,2,SGTELIB::INF); - // Column 3 of Z0 has some nan and some inf - Z0.set(5,3,SGTELIB::INF); - Z0.set(8,3,SGTELIB::NaN); - // Z0.set(8,3,0.0/0.0); - - #ifdef SGTELIB_DEBUG - X0.display(std::cout); - Z0.display(std::cout); - #endif - - // CONSTRUCT MODEL - SGTELIB::TrainingSet C0(X0,Z0); - SGTELIB::Surrogate * S0; - S0 = SGTELIB::Surrogate_Factory(C0,s); - bool ready = S0->build(); - - if ( ! ready){ - surrogate_delete(S0); - std::cout << "test_singular_data: model ("+s+") is not ready\n"; - return "test_singular_data: model ("+s+") is not ready\n"; - } - - // Get the rmse and rmsecv - double * rmse = new double [m]; - double * rmsecv = new double [m]; - for (int j=0 ; j<m ; j++){ - rmse[j] = S0->get_metric(SGTELIB::METRIC_RMSE,j); - rmsecv[j] = S0->get_metric(SGTELIB::METRIC_RMSECV,j); - } - - // Display - std::ostringstream oss; - oss << "test_singular_data\n"; - oss << "Surrogate string: " << s << "\n"; - oss << " j| rmse| rmsecv|\n"; - oss << "---|--------------|--------------|\n"; - for (int j=0 ; j<m ; j++){ - oss.width(3); - oss << j << "|"; - oss.width(14); - oss << rmse[j] << "|"; - oss.width(14); - oss << rmsecv[j] << "|\n"; - } - oss << "---|--------------|--------------|\n"; - - for (int j=0 ; j<m ; j++){ - if ( ( ! isdef(rmse[j])) || ( ! isdef(rmse[j])) ){ - std::cout << "There are some nan !"; - C0.get_matrix_Xs().display(std::cout); - exit(0); - } - } - - std::cout << oss.str(); - SGTELIB::surrogate_delete(S0); - delete [] rmse; - delete [] rmsecv; - return oss.str(); - -}// - - - - -/*----------------------------------------------------*/ -/* TEST scale */ -/*----------------------------------------------------*/ -std::string SGTELIB::test_scale (const std::string & s , const SGTELIB::Matrix & X0){ - - std::cout << "======================================================\n"; - std::cout << "SGTELIB::test_scale\n"; - std::cout << s << "\n"; - - // CONSTRUCT DATA - const int p = X0.get_nb_rows(); - const int n = X0.get_nb_cols(); - SGTELIB::Matrix Z0 = test_functions(X0); - const int m = Z0.get_nb_cols(); - bool ready; - - // CONSTRUCT MODEL - SGTELIB::TrainingSet C0(X0,Z0); - SGTELIB::Surrogate * S0; - S0 = SGTELIB::Surrogate_Factory(C0,s); - ready = S0->build(); - - if ( ! ready){ - surrogate_delete(S0); - std::cout << "test_scale: model ("+s+") is not ready\n"; - return "test_scale: model ("+s+") is not ready\n"; - } - - // Testing set - const int pxx = 3; - SGTELIB::Matrix XX0("XX0",pxx,n); - XX0.set_random(-5,+5,false); - - // Reference prediction - SGTELIB::Matrix * ZZ0 = new SGTELIB::Matrix("ZZ0" ,pxx,m); - SGTELIB::Matrix * std0 = new SGTELIB::Matrix("std0",pxx,m); - SGTELIB::Matrix * ei0 = new SGTELIB::Matrix("ei0" ,pxx,m); - SGTELIB::Matrix * cdf0 = new SGTELIB::Matrix("cdf0",pxx,m); - S0->predict(XX0,ZZ0,std0,ei0,cdf0); - - // Build scaling values - double * ax = new double [n]; - double * bx = new double [n]; - for (int i=0 ; i<n ; i++){ - ax[i] = double(i+2); // arbitrary values - bx[i] = 1.5+1/double(i+2); // arbitrary values - } - double * az = new double [m]; - double * bz = new double [m]; - for (int i=0 ; i<m ; i++){ - az[i] = 0.0; // No offset on the constraints (we don't want to change the feasibility) - bz[i] = 3.0+double(i+2); // arbitrary values - } - - // CONSTRUCT SCALED DATA - SGTELIB::Matrix X1 = X0; - SGTELIB::Matrix Z1 = Z0; - for (int i=0 ; i<p ; i++){ - for (int j=0 ; j<n ; j++){ - X1.set(i,j, ax[j] + bx[j] * X0.get(i,j) ); - } - for (int j=0 ; j<m ; j++){ - Z1.set(i,j, az[j] + bz[j] * Z0.get(i,j) ); - } - } - - // Build new model - SGTELIB::TrainingSet C1(X1,Z1); - SGTELIB::Surrogate * S1; - S1 = SGTELIB::Surrogate_Factory(C1,s); - S1->build(); - - // Verif prediction - SGTELIB::Matrix * ZZ1 = new SGTELIB::Matrix("ZZ1" ,pxx,m); - SGTELIB::Matrix * std1 = new SGTELIB::Matrix("std1",pxx,m); - SGTELIB::Matrix * ei1 = new SGTELIB::Matrix("ei1" ,pxx,m); - SGTELIB::Matrix * cdf1 = new SGTELIB::Matrix("cdf1",pxx,m); - - // CONSTRUCT SCALED PREDICTION POINTS - SGTELIB::Matrix XX1= XX0; - for (int i=0 ; i<pxx ; i++){ - for (int j=0 ; j<n ; j++){ - XX1.set(i,j, ax[j] + bx[j] * XX0.get(i,j) ); - } - } - S1->predict(XX1,ZZ1,std1,ei1,cdf1); - - // Renormalize - for (int i=0 ; i<pxx ; i++){ - for (int j=0 ; j<m ; j++){ - ZZ1->set(i,j, ( ZZ1->get(i,j)-az[j] ) / bz[j] ); - std1->set(i,j, ( std1->get(i,j) ) / bz[j] ); - ei1->set(i,j, ( ei1->get(i,j) ) / bz[j] ); - } - } - - // Check consistency - std::cout << s << "\n"; - std::cout << "Check ZZ\n"; - check_matrix_diff(ZZ0 ,ZZ1 ); - std::cout << "Check std\n"; - check_matrix_diff(std0,std1); - std::cout << "Check ei\n"; - check_matrix_diff(ei0 ,ei1 ); - std::cout << "Check cdf\n"; - check_matrix_diff(cdf0,cdf1); - - // Free space - SGTELIB::surrogate_delete(S0); - SGTELIB::surrogate_delete(S1); - - delete ZZ0; - delete std0; - delete ei0; - delete cdf0; - - delete ZZ1; - delete std1; - delete ei1; - delete cdf1; - - delete [] ax; - delete [] bx; - delete [] az; - delete [] bz; - - std::cout << "test_scale OK for model " << s << "\n"; - return "test_scale ok\n"; -}// - - - - -/*----------------------------------------------------*/ -/* TEST dimension */ -/*----------------------------------------------------*/ -std::string SGTELIB::test_dimension (const std::string & s ){ - - std::cout << "======================================================\n"; - std::cout << "SGTELIB::test_dimension\n"; - std::cout << s << "\n"; - - // INIT DATA - int p =0,n=0,m=0,pxx=1; - - bool ready; - - // Training Set and Surrogate - SGTELIB::TrainingSet * C0=NULL; - SGTELIB::Surrogate * S0=NULL; - - // Predictions - SGTELIB::Matrix X0,Z0; - SGTELIB::Matrix XX, ZZ, STD, EI, CDF; - - // BUILD THE METRIC LIST - std::vector<SGTELIB::metric_t> metric_list; - metric_list.push_back( METRIC_RMSECV ); - metric_list.push_back( METRIC_EMAX ); - metric_list.push_back( METRIC_EMAXCV ); - metric_list.push_back( METRIC_RMSE ); - metric_list.push_back( METRIC_RMSECV ); - metric_list.push_back( METRIC_OE ); - metric_list.push_back( METRIC_OECV ); - metric_list.push_back( METRIC_LINV ); - - int i_case; - const int i_case_max = 5; - for ( i_case = 0 ; i_case < i_case_max ; i_case++ ){ - std::cout << "------------------------------------------------------\n"; - std::cout << "i_case = " << i_case ; - if (i_case==0){ - std::cout << " (small m,n,p,pxx) "; - m = 1; - n = 2; - p = 3; - pxx = 4; - } - else if (i_case==1){ - std::cout << " (big m) "; - m = 30; - n = 1; - p = 10; - pxx = 2; - } - else if (i_case==2){ - std::cout << " (big n) "; - m = 1; - n = 30; - p = 10; - pxx = 2; - } - else if (i_case==3){ - std::cout << " (big p) "; - m = 1; - n = 2; - p = 30; - pxx = 3; - } - else if (i_case==4){ - std::cout << " (big pxx) "; - m = 1; - n = 2; - p = 30; - pxx = 50; - } - - std::cout << "m,n,p,pxx = " << m << " " << n << " " << p << " " << pxx << "\n"; - - X0 = SGTELIB::Matrix("X0",p,n); - Z0 = SGTELIB::Matrix("X0",p,m); - X0.set_random(0,10,false); - Z0.set_random(0,10,false); - - C0 = new SGTELIB::TrainingSet (X0,Z0); - S0 = SGTELIB::Surrogate_Factory(*C0,s); - ready = S0->build(); - - // Loop on the metrics - std::vector<SGTELIB::metric_t>::iterator it; - int j; - double v = 0; - if (ready){ - for (it = metric_list.begin() ; it != metric_list.end(); ++it){ - std::cout << "Metric " << SGTELIB::metric_type_to_str(*it) << "\n"; - for (j=0 ; j<m ; j++){ - v = S0->get_metric (*it,j); - std::cout << "v = " << v << "\n"; - } - } - - XX = SGTELIB::Matrix("XX",pxx,n); - XX.set_random(0,10,false); - ZZ = SGTELIB::Matrix("ZZ" ,pxx,m); - STD = SGTELIB::Matrix("std",pxx,m); - EI = SGTELIB::Matrix("ei" ,pxx,m); - CDF = SGTELIB::Matrix("cdf",pxx,m); - - std::cout << "m,n,p,pxx = " << m << " " << n << " " << p << " " << pxx << "\n"; - std::cout << "predict(XX,&ZZ)...\n"; - S0->predict(XX,&ZZ); - - std::cout << "m,n,p,pxx = " << m << " " << n << " " << p << " " << pxx << "\n"; - std::cout << "predict(XX,&ZZ,&STD,&EI,&CDF)...\n"; - S0->predict(XX,&ZZ,&STD,&EI,&CDF); - std::cout << "Finish!\n"; - } - else{ - std::cout << "Not Ready\n" ; - } - } - - // Free space - SGTELIB::surrogate_delete(S0); - delete C0; - - std::cout << "test_dimension OK for model " << s << "\n"; - std::cout << "======================================================\n"; - return "test_dimension ok\n"; -}// - - -/*----------------------------------------------------*/ -/* TEST rmse */ -/*----------------------------------------------------*/ -std::string SGTELIB::test_rmse (const std::string & s , const SGTELIB::Matrix & X0){ - - std::cout << "======================================================\n"; - std::cout << "SGTELIB::test_rmse\n"; - std::cout << s << "\n"; - - // CONSTRUCT DATA - const int p = X0.get_nb_rows(); - SGTELIB::Matrix Z0 = test_functions(X0); - const int m = Z0.get_nb_cols(); - bool ready; - - // CONSTRUCT MODEL - SGTELIB::TrainingSet C0(X0,Z0); - SGTELIB::Surrogate * S0; - S0 = SGTELIB::Surrogate_Factory(C0,s); - ready = S0->build(); - - if ( ! ready){ - surrogate_delete(S0); - std::cout << "test_rmse: model ("+s+") is not ready\n"; - return "test_rmse: model ("+s+") is not ready\n"; - } - - // Get the rmse - double * rmse = new double [m]; - for (int j=0 ; j<m ; j++){ - rmse[j] = S0->get_metric(SGTELIB::METRIC_RMSE,j); - } - - // GET THE PREDICTION ON THE TP OUTPUT (matrix Zh) - const SGTELIB::Matrix Zh = S0->get_matrix_Zh(); - - // Recompute the prediction on the TP - SGTELIB::Matrix Zh_verif("Zh_verif",p,m); - SGTELIB::Matrix z("z",1,m); - for (int i=0 ; i<p ; i++){ - S0->predict(X0.get_row(i),&z); - Zh_verif.set_row(z,i); - } - - // Recompute the rmse - double * rmse_verif = new double [m]; - double e; - for (int j=0 ; j<m ; j++){ - e = 0; - for (int i=0 ; i<p ; i++){ - e += pow(Z0.get(i,j)-Zh_verif.get(i,j),2); - } - rmse_verif[j] = sqrt(e/p); - } - - // Display - std::ostringstream oss; - oss << "test_rmse\n"; - oss << "Surrogate string: " << s << "\n"; - oss << " j| rmse| rmse_verif| diff|\n"; - oss << "---|--------------|--------------|--------------|\n"; - for (int j=0 ; j<m ; j++){ - oss.width(3); - oss << j << "|"; - oss.width(14); - oss << rmse[j] << "|"; - oss.width(14); - oss << rmse_verif[j] << "|"; - oss.width(14); - oss << rmse[j]-rmse_verif[j] << "|\n"; - if ( fabs(rmse[j]-rmse_verif[j])>1e-6 ){ - oss << "Error! Diff is too big!\n"; - } - } - oss << "---|--------------|--------------|--------------|\n"; - - std::cout << oss.str(); - SGTELIB::surrogate_delete(S0); - delete [] rmse; - delete [] rmse_verif; - - - return oss.str(); -}// - - -/*----------------------------------------------------*/ -/* TEST RMSECV */ -/*----------------------------------------------------*/ -std::string SGTELIB::test_rmsecv (const std::string & s , const SGTELIB::Matrix & X0){ - - std::cout << "======================================================\n"; - std::cout << "SGTELIB::test_rmsecv\n"; - std::cout << s << "\n"; - - // CONSTRUCT DATA - const int p = X0.get_nb_rows(); - const int n = X0.get_nb_cols(); - const SGTELIB::model_t mt = SGTELIB::Surrogate_Parameters::read_model_type(s); - SGTELIB::Matrix Z0 = test_functions(X0); - const int m = Z0.get_nb_cols(); - - #ifdef SGTELIB_DEBUG - X0.display(std::cout); - Z0.display(std::cout); - #endif - - double dmean0, dmeanv, kc0, kcv , xsa0, xsav; - - // CONSTRUCT REFERENCE MODEL - bool ready; - SGTELIB::TrainingSet C0(X0,Z0); - SGTELIB::Surrogate * S0; - S0 = SGTELIB::Surrogate_Factory(C0,s); - ready = S0->build(); - dmean0 = C0.get_Ds_mean(); - xsa0 = C0.get_X_scaling_a(0); - - - // Get original kernel coefficient - kc0 = 0.0; - S0->get_param().get_kernel_coef(); - - // Check ready - if ( ! ready){ - surrogate_delete(S0); - std::cout << "test_rmsecv: model ("+s+") is not ready\n"; - return "test_rmsecv: model ("+s+") is not ready\n"; - } - - // Get the RMSECV metric - double * rmsecv = new double [m]; - double * rmse = new double [m]; - for (int j=0 ; j<m ; j++){ - rmsecv[j] = S0->get_metric(SGTELIB::METRIC_RMSECV,j); - rmse[j] = S0->get_metric(SGTELIB::METRIC_RMSE,j); - } - // Delete the original model - SGTELIB::surrogate_delete(S0); - - // INIT THE CROSS VALIDATION MATRICES - SGTELIB::Matrix X0i ("X0i",p-1,n); - SGTELIB::Matrix Z0i ("Z0i",p-1,m); - for (int i=1 ; i<p ; i++){ - // Skip the first line - X0i.set_row(X0.get_row(i),i-1); - Z0i.set_row(Z0.get_row(i),i-1); - } - - // Cross-validation models and trainingset - SGTELIB::Surrogate * Sv; - SGTELIB::TrainingSet * Cv; - - // Output for one point - SGTELIB::Matrix Zvi ("Zvi",1,m); - - // Cross validation output for all the training points: - // (Supposed to be identical to _Zv of class Surrogate) - SGTELIB::Matrix Zv_verif ("Zv_verif",p,m); - - // BUILD THE CV MODELS - for (int i=0 ; i<p ; i++){ - // Build the trainingset (without point i); - Cv = new SGTELIB::TrainingSet(X0i,Z0i); - Cv->build(); - dmeanv = Cv->get_Ds_mean(); - xsav = Cv->get_X_scaling_a(0); - // Init surrogate - Sv = SGTELIB::Surrogate_Factory(*Cv,s); - // Correct ks for RBF and KS - kcv = kc0*(dmeanv/dmean0)*(xsa0/xsav); - if (mt==SGTELIB::RBF) static_cast<SGTELIB::Surrogate_RBF*>(Sv)->set_kernel_coef(kcv); - if (mt==SGTELIB::KS) static_cast<SGTELIB::Surrogate_KS* >(Sv)->set_kernel_coef(kcv); - // Build - Sv->build(); - // Do the prediction on point i - Sv->predict(X0.get_row(i),&Zvi); - Zv_verif.set_row(Zvi,i); - // update the matrices so that they lack the point i+1 - if (i<p-1){ - X0i.set_row(X0.get_row(i),i); - Z0i.set_row(Z0.get_row(i),i); - } - delete Cv; - surrogate_delete(Sv); - } - - - // Re-Compute the rmsecv - double * rmsecv_verif = new double [m]; - double e; - for (int j=0 ; j<m ; j++){ - e = 0; - for (int i=0 ; i<p ; i++){ - e += pow(Z0.get(i,j)-Zv_verif.get(i,j),2); - } - rmsecv_verif[j] = sqrt(e/p); - } - - // Display - double d; - std::ostringstream oss; - oss << "Surrogate string: " << s << "\n"; - oss << " j| rmse|| rmsecv| rmsecv_verif| rel diff|\n"; - oss << "---|--------------||--------------|--------------|--------------|\n"; - for (int j=0 ; j<m ; j++){ - oss.width(3); - oss << j << "|"; - oss.width(14); - oss << rmse[j] << "||"; - oss.width(14); - oss << rmsecv[j] << "|"; - oss.width(14); - oss << rmsecv_verif[j] << "|"; - oss.width(14); - d = 2*fabs(rmsecv[j]-rmsecv_verif[j])/(rmsecv[j]+rmsecv_verif[j]); - oss << d << "|\n"; - if (d>0.01){ - oss << "Error! Diff is too big!\n"; - } - } - oss << "---|--------------||--------------|--------------|--------------|\n"; - - delete [] rmse; - delete [] rmsecv; - delete [] rmsecv_verif; - - std::cout << oss.str(); - return oss.str(); -}// - - - -/*----------------------------------------------------*/ -/* TEST MULTIPLE */ -/*----------------------------------------------------*/ -std::string SGTELIB::test_multiple_occurrences (const std::string & s ){ - - std::cout << "======================================================\n"; - std::cout << "SGTELIB::test_multiple_occurences\n"; - std::cout << s << "\n"; - - // CONSTRUCT DATA - const int p = 20; - const int n = 2; - - // Build X0 - SGTELIB::Matrix X0 ("X0",p,n); - X0.set_random(-3,+8,false); - // Build Z0 - SGTELIB::Matrix Z0 = test_functions(X0); - const int m = Z0.get_nb_cols(); - // Create multiple occurences in X0 - X0.set_row( X0.get_row(0) , 1 ); - X0.set_row( X0.get_row(0) , 2 ); - X0.set_row( X0.get_row(10) , 11 ); - - #ifdef SGTELIB_DEBUG - X0.display(std::cout); - Z0.display(std::cout); - #endif - - // CONSTRUCT REFERENCE MODEL - bool ready; - SGTELIB::TrainingSet C0(X0,Z0); - SGTELIB::Surrogate * S0; - S0 = SGTELIB::Surrogate_Factory(C0,s); - ready = S0->build(); - - // Some data to correct the kernel coef in KS and RBF. - const SGTELIB::model_t mt = SGTELIB::Surrogate_Parameters::read_model_type(s); - double dmean0, dmeanv, kc0, kcv , xsa0, xsav; - dmean0 = C0.get_Ds_mean(); - xsa0 = C0.get_X_scaling_a(0); - // Get original kernel coefficient - kc0 = 0.0; - kc0 = S0->get_param().get_kernel_coef(); - - - // Check ready - if ( ! ready){ - surrogate_delete(S0); - std::cout << "test_rmsecv: model ("+s+") is not ready\n"; - return "test_rmsecv: model ("+s+") is not ready\n"; - } - - // Get the RMSECV metric - double * rmsecv = new double [m]; - double * rmse = new double [m]; - for (int j=0 ; j<m ; j++){ - rmsecv[j] = S0->get_metric(SGTELIB::METRIC_RMSECV,j); - rmse[j] = S0->get_metric(SGTELIB::METRIC_RMSE,j); - } - // Delete the original model - SGTELIB::surrogate_delete(S0); - - // INIT THE CROSS VALIDATION MATRICES - SGTELIB::Matrix X0i ("X0i",p-1,n); - SGTELIB::Matrix Z0i ("Z0i",p-1,m); - for (int i=1 ; i<p ; i++){ - // Skip the first line - X0i.set_row(X0.get_row(i),i-1); - Z0i.set_row(Z0.get_row(i),i-1); - } - - // Cross-validation models and trainingset - SGTELIB::Surrogate * Sv; - SGTELIB::TrainingSet * Cv; - - // Output for one point - SGTELIB::Matrix Zvi ("Zvi",1,m); - - // Cross validation output for all the training points: - // (Supposed to be identical to _Zv of class Surrogate) - SGTELIB::Matrix Zv_verif ("Zv_verif",p,m); - - - //std::cout << "SGTELIB::CV\n"; - // BUILD THE CV MODELS - for (int i=0 ; i<p ; i++){ - std::cout << "BUILD CV MODELS " << i << "\n"; - // Build the trainingset (without point i); - Cv = new SGTELIB::TrainingSet(X0i,Z0i); - Cv->build(); - dmeanv = Cv->get_Ds_mean(); - xsav = Cv->get_X_scaling_a(0); - // Init surrogate - Sv = SGTELIB::Surrogate_Factory(*Cv,s); - - // Correct ks for RBF and KS - kcv = kc0*(dmeanv/dmean0)*(xsa0/xsav); - if (mt==SGTELIB::RBF) static_cast<SGTELIB::Surrogate_RBF*>(Sv)->set_kernel_coef(kcv); - if (mt==SGTELIB::KS) static_cast<SGTELIB::Surrogate_KS* >(Sv)->set_kernel_coef(kcv); - // Build - Sv->build(); - - // Do the prediction on point i - Sv->predict(X0.get_row(i),&Zvi); - Zv_verif.set_row(Zvi,i); - - // update the matrices so that they lack the point i+1 - if (i<p-1){ - X0i.set_row(X0.get_row(i),i); - Z0i.set_row(Z0.get_row(i),i); - } - - delete Cv; - surrogate_delete(Sv); - } - - - // Re-Compute the rmsecv - double * rmsecv_verif = new double [m]; - double e; - for (int j=0 ; j<m ; j++){ - e = 0; - for (int i=0 ; i<p ; i++){ - e += pow(Z0.get(i,j)-Zv_verif.get(i,j),2); - } - rmsecv_verif[j] = sqrt(e/p); - } - - // Display - double d; - std::ostringstream oss; - oss << "Surrogate string: " << s << "\n"; - oss << " j| rmse|| rmsecv| rmsecv_verif| rel diff|\n"; - oss << "---|--------------||--------------|--------------|--------------|\n"; - for (int j=0 ; j<m ; j++){ - oss.width(3); - oss << j << "|"; - oss.width(14); - oss << rmse[j] << "||"; - oss.width(14); - oss << rmsecv[j] << "|"; - oss.width(14); - oss << rmsecv_verif[j] << "|"; - oss.width(14); - d = 2*fabs(rmsecv[j]-rmsecv_verif[j])/(rmsecv[j]+rmsecv_verif[j]); - oss << d << "|\n"; - if (d>0.01){ - oss << "Error! Diff is too big!\n"; - } - } - oss << "---|--------------||--------------|--------------|--------------|\n"; - - delete [] rmse; - delete [] rmsecv; - delete [] rmsecv_verif; - - std::cout << oss.str(); - - return oss.str(); -}// - - - - - - -/*----------------------------------------------------*/ -/* test functions */ -/*----------------------------------------------------*/ -SGTELIB::Matrix SGTELIB::test_functions (const SGTELIB::Matrix & X){ - - const int n = X.get_nb_cols(); // Input dim - const int p = X.get_nb_rows(); // Nb of points - const int m = 6; // There are 6 test functions, ie 6 outputs - - SGTELIB::Matrix T ("T" ,p,1); // Aggregate input - SGTELIB::Matrix ZT ("ZT",p,1); // 1 output - - - const double div = 1.0/double(n); - - // Build matrix SX - SGTELIB::Matrix SX ("SX",p,1); // Sum of x for each point - for (int j=0 ; j<n ; j++){ - SX = SX + X.get_col(j); - } - SX = SX * div; - - // Build m - SGTELIB::Matrix Z ("Z",p,m); - - for (int j=0 ; j<m ; j++){ - ZT.fill(0.0); - for (int i=0 ; i<n ; i++){ - if (i==0){ - T = SX; - } - else{ - T = SX - X.get_col(i) * 2 * div; - } - ZT = ZT + test_functions_1D (T,j); - } - ZT = ZT * div; - Z.set_col(ZT,j); - } - return Z; -}// - -/*----------------------------------------------------*/ -/* Create some 1D test functions */ -/*----------------------------------------------------*/ -double SGTELIB::test_functions_1D (const double t, const int function_index){ - - switch (function_index){ - case 0: - return 6.0*t*t + t - 1.0; // Quad function - case 1: - return t/(1.0+fabs(5.0*t)); // Sigmoid - case 2: - return 0.5-exp(-10*t*t); // bump - case 3: - return 0.5-((t>-0.2) && (t<0.5)); // square - case 4: - return 5.0*t-17.0*pow(t,3)+13*pow(t,5); // Oscillations/polynomial - case 5: - return sin(6.0*t)+cos(15.0*sqrt(fabs(t))); // Difficult function - default: - std::cout << "function_index : " << function_index << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"test_function_1D : function_index not recognized" ); - } -}// - - -/*----------------------------------------------------*/ -/* Create some 1D test functions */ -/*----------------------------------------------------*/ -SGTELIB::Matrix SGTELIB::test_functions_1D (const SGTELIB::Matrix & T, const int function_index){ - if (T.get_nb_cols()!=1){ - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"test_function_1D : only for column vector!" ); - } - const int p = T.get_nb_rows(); - SGTELIB::Matrix Z ("Z(T)",p,1); - for (int i=0 ; i<p ; i++){ - Z.set(i,0,test_functions_1D(T.get(i,0),function_index)); - } - return Z; -}// - - -/*----------------------------------------------------*/ -/* Check differences between two matrices */ -/*----------------------------------------------------*/ -void SGTELIB::check_matrix_diff(const SGTELIB::Matrix * A, const SGTELIB::Matrix * B){ - // Check not NULL - if ( ! A){ - std::cout << "A is NULL\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"check_matrix_diff : A is NULL" ); - } - if ( ! B){ - std::cout << "B is NULL\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"check_matrix_diff : B is NULL" ); - } - - // Check dimension - if (A->get_nb_rows()!=B->get_nb_rows()){ - std::cout << "Different number of rows !! " << A->get_nb_rows() << " " << B->get_nb_rows() << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"check_matrix_diff : != nb of rows" ); - } - const int m = A->get_nb_rows(); - if (A->get_nb_cols()!=B->get_nb_cols()){ - std::cout << "Different number of cols !! " << A->get_nb_cols() << " " << B->get_nb_cols() << "\n"; - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"check_matrix_diff : != nb of cols" ); - } - const int n = A->get_nb_cols(); - - double va,vb,dab; - bool eij = false; // true if there is a problem with value (i,j) - bool e = false; // true if there is a problem, anywhere in the matrices - - for (int i=0 ; i<m ; i++){ - for (int j=0 ; j<n ; j++){ - va = A->get(i,j); - vb = B->get(i,j); - eij = false; - dab = fabs(va-vb)/std::max( 0.5*(fabs(va)+fabs(vb)) , 1.0); - if (dab>1e-6){ - eij = true; - std::cout << "diff is too big !\n"; - } - if (isnan(va)){ - eij = true; - std::cout << "va is nan !\n"; - } - if (isnan(vb)){ - eij = true; - std::cout << "vb is nan !\n"; - } - if (isinf(va)){ - eij = true; - std::cout << "va is inf !\n"; - } - if (isinf(vb)){ - eij = true; - std::cout << "vb is inf !\n"; - } - if (eij){ - e = true; - std::cout << "A(" << i << "," << j << ") = " << va << "\n"; - std::cout << "B(" << i << "," << j << ") = " << vb << "\n"; - std::cout << "diff = " << fabs(va-vb) << "\n"; - std::cout << "dab = " << dab << "\n"; - } - } - } - if (e){ - A->display(std::cout); - B->display(std::cout); - } - - -}// - - - - - - - - - -/*----------------------------------------------------*/ -/* build test data */ -/*----------------------------------------------------*/ -void SGTELIB::build_test_data ( const std::string & function_name , - SGTELIB::Matrix & X0 , - SGTELIB::Matrix & Z0 ){ - - int p = 0; - int n = 0; - int m = 0; - - if ( (function_name=="hartman3") || (function_name=="hartman6") ){ - int q = 0; - SGTELIB::Matrix B,D; - std::string B_str,D_str; - if (function_name=="hartman3"){ - B_str = "3.0 10.0 30.0 ;" - "0.1 10.0 35.0 ;" - "3.0 10.0 30.0 ;" - "0.1 10.0 35.0 ;"; - - D_str = "0.3689 0.1170 0.2673 ;" - "0.4699 0.4387 0.7470 ;" - "0.1091 0.8732 0.5547 ;" - "0.03815 0.5743 0.8828 ;"; - } - else if (function_name=="hartman6"){ - B_str = "10.0 3.0 17.0 3.5 1.7 8.0 ;" - "0.05 10.0 17.0 0.1 8.0 14.0 ;" - "3.0 3.5 1.7 10.0 17.0 8.0 ;" - "17.0 8.0 0.05 10.0 0.1 14.0 ;"; - - D_str = "0.1312 0.1696 0.5569 0.0124 0.8283 0.5886 ;" - "0.2329 0.4135 0.8307 0.3736 0.1004 0.9991 ;" - "0.2348 0.1451 0.3522 0.2883 0.3047 0.6650 ;" - "0.4047 0.8828 0.8732 0.5743 0.1091 0.0381 ;"; - } - - B = SGTELIB::Matrix::string_to_matrix(B_str); - D = SGTELIB::Matrix::string_to_matrix(D_str); - n = B.get_nb_cols(); - q = B.get_nb_rows(); - m = 1; - - p = 100*(n+1); - X0 = SGTELIB::Matrix("X0",p,n); - Z0 = SGTELIB::Matrix("Z0",p,m); - X0.set_random(0.0,1.0,false); - - double zi,eik,ak=0; - for (int i=0 ; i<p ; i++){ - zi = 0; - for (int k=0 ; k<q ; k++){ - eik = 0; - for (int j=0 ; j<n ; j++){ - eik -= B.get(k,j)*pow(X0.get(i,j)-D.get(k,j),2.0); - } - switch (k){ - case 0: ak=1.0; break; - case 1: ak=1.2; break; - case 2: ak=3.0; break; - case 3: ak=3.2; break; - } - zi -= ak * exp(eik); - } - Z0.set(i,0,zi); - } - return; - }// end hartman - - - if ((function_name=="branin-hoo") || (function_name=="braninhoo")) { - n = 2; - m = 1; - p = 100*(n+1); - X0 = SGTELIB::Matrix("X0",p,n); - Z0 = SGTELIB::Matrix("Z0",p,m); - X0.set_random(0.0,1.0,false); - X0.set_col(-5.0+15.0*X0.get_col(0),0); - X0.set_col( 0.0+15.0*X0.get_col(1),1); - #ifdef SGTELIB_DEBUG - X0.display(std::cout); - #endif - - double zi,x1,x2; - for (int i=0 ; i<p ; i++){ - x1 = X0.get(i,0); - x2 = X0.get(i,1); - zi = pow(x2-5.1*x1*x1*.25/PI+5.*x1/PI-6.,2.) + 10.*(1.-1./(8.*PI))*cos(x1) + 10.; - Z0.set(i,0,zi); - } - return; - }// end branin-hoo - - - - if (function_name=="camelback") { - n = 2; - m = 1; - p = 100*(n+1); - X0 = SGTELIB::Matrix("X0",p,n); - Z0 = SGTELIB::Matrix("Z0",p,m); - X0.set_random(0.0,1.0,false); - X0.set_col(-3.0+6.0*X0.get_col(0),0); - X0.set_col(-2.0+4.0*X0.get_col(1),1); - #ifdef SGTELIB_DEBUG - X0.display(std::cout); - #endif - - double zi,x1,x2; - for (int i=0 ; i<p ; i++){ - x1 = X0.get(i,0); - x2 = X0.get(i,1); - zi = (pow(x1,4.)/3.-2.1*x1*x1+4.)*x1*x1 + x1*x2 + (4.*x2*x2-4.)*x2*x2; - Z0.set(i,0,zi); - } - return; - }// end camelback - - - if (function_name=="rosenbrock") { - n = 2; - m = 1; - p = 100*(n+1); - X0 = SGTELIB::Matrix("X0",p,n); - Z0 = SGTELIB::Matrix("Z0",p,m); - X0.set_random(0.0,1.0,false); - X0 = -5.+15.*X0; - #ifdef SGTELIB_DEBUG - X0.display(std::cout); - #endif - - double zi,xj,xjp; - for (int i=0 ; i<p ; i++){ - zi = 0; - for (int j=0 ; j<n-1 ; j++){ - xj = X0.get(i,j); - xjp = X0.get(i,j+1); - zi += pow(1-xj,2)+100*pow(xjp-xj*xj,2); - } - Z0.set(i,0,zi); - } - return; - }// end camelback - - - throw SGTELIB::Exception ( __FILE__ , __LINE__ ,"build_test_data : function name not recognized" ); - -} - - diff --git a/ext/sgtelib/src/Tests.hpp b/ext/sgtelib/src/Tests.hpp deleted file mode 100644 index d43ef56..0000000 --- a/ext/sgtelib/src/Tests.hpp +++ /dev/null @@ -1,74 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_TESTS__ -#define __SGTELIB_TESTS__ - -#include "sgtelib.hpp" - -namespace SGTELIB { - - void sand_box (void); - - // test_quick: build the surrogate and compute the metrics - std::string test_quick (const std::string & s , const SGTELIB::Matrix & X0 ); - // test_rmsecv: build the surrogate, then build all the CV models and verif the RMSECV - std::string test_rmsecv (const std::string & s , const SGTELIB::Matrix & X0 ); - // test_rmse: build the surrogate, then perform prediction on the TP to verif rmse - std::string test_rmse (const std::string & s , const SGTELIB::Matrix & X0 ); - // test_update: build a surrogate all-at-once, or point-by-point - std::string test_update(const std::string & s , const SGTELIB::Matrix & X0 ); - // test_pxx: build a surrogate and perform prediction on XX of various sizes - // (especially pxx > _p) - std::string test_pxx (const std::string & s , const SGTELIB::Matrix & X0 ); - // test_scale: build 2 surrogates with a different scale on the data. - std::string test_scale (const std::string & s , const SGTELIB::Matrix & X0 ); - // test_dimension: build surrogates with various sizes of p,n,m to check for dimension errors - std::string test_dimension (const std::string & s ); - // test_singular_data (if there are constant inputs, or outputs or Nan outputs) - std::string test_singular_data (const std::string & s ); - std::string test_multiple_occurrences (const std::string & s ); - - // test_scale: build 2 surrogates with a different scale on the data. - void test_many_models ( const std::string & out_file , const SGTELIB::Matrix & X0 , const SGTELIB::Matrix & Z0 ); - - - void test_LOWESS_times (void); - - // analyse ensembl - void analyse_ensemble ( const std::string & s ); - - SGTELIB::Matrix test_functions (const SGTELIB::Matrix & X); - SGTELIB::Matrix test_functions_1D (const SGTELIB::Matrix & T, const int function_index); - double test_functions_1D (const double t, const int function_index); - void check_matrix_diff (const SGTELIB::Matrix * A, const SGTELIB::Matrix * B); - - - void build_test_data ( const std::string & function_name , SGTELIB::Matrix & X0 , SGTELIB::Matrix & Z0 ); - - -} - -#endif diff --git a/ext/sgtelib/src/TrainingSet.cpp b/ext/sgtelib/src/TrainingSet.cpp deleted file mode 100644 index 604d311..0000000 --- a/ext/sgtelib/src/TrainingSet.cpp +++ /dev/null @@ -1,1436 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#include "TrainingSet.hpp" -using namespace SGTELIB; - -/*--------------------------------------*/ -/* constructor */ -/*--------------------------------------*/ -SGTELIB::TrainingSet::TrainingSet ( const Matrix & X , - const Matrix & Z ) : - _p ( X.get_nb_rows() ) , // Nb of points - _n ( X.get_nb_cols() ) , // Nb of input - _m ( Z.get_nb_cols() ) , // Nb of output - _ready ( false ) , - _bbo ( new bbo_t [_m] ) , // Types of output (OBJ, CON or DUM) - _bbo_is_def ( false ) , // Allows to know if _bbo has been def - _j_obj ( 0 ) , // Index of the output that represents the objective - _f_min ( INF ) , - _fs_min ( INF ) , - _i_min ( 0 ) , // Index of the point where f_min is reached - _X ( X ) , // Input Data - _Z ( Z ) , // Output Data - _Xs ( "TrainingSet._Xs" , _p , _n ) , // Normalized Input Data - _Zs ( "TrainingSet._Zs" , _p , _m ) , // Normalized Output Data - _Ds ( "TrainingSet._Ds" , _p , _p ) , // Nb of varying input - _nvar ( -1 ) , // Nb of varying output - _mvar ( -1 ) , - _pvar ( -1 ) , - _X_lb ( new double [_n] ) , - _X_ub ( new double [_n] ) , - _X_scaling_a ( new double [_n] ) , - _X_scaling_b ( new double [_n] ) , - _X_mean ( new double [_n] ) , - _X_std ( new double [_n] ) , - _X_nbdiff ( new int [_n] ) , - _X_nbdiff1 ( 0 ) , - _X_nbdiff2 ( 0 ) , - _Z_lb ( new double [_m] ) , - _Z_ub ( new double [_m] ) , - _Z_replace ( new double [_m] ) , - _Z_scaling_a ( new double [_m] ) , - _Z_scaling_b ( new double [_m] ) , - _Z_mean ( new double [_m] ) , // Mean of each output - _Z_std ( new double [_m] ) , - _Zs_mean ( new double [_m] ) , // Mean of each normalized output - _Z_nbdiff ( new int [_m] ) , - _Ds_mean ( 0.0 ) { - - // Init bounds - for (int i=0 ; i<_n ; i++){ - _X_lb[i] = 0; - _X_ub[i] = 0; - } - for (int j=1 ; j<_m ; j++){ - _Z_lb[j] = 0; - _Z_ub[j] = 0; - } - - // Init the _bbo with standard values: - // First is the objective, - // Then constraints - _bbo[0] = BBO_OBJ; - for (int j=1 ; j<_m ; j++){ - _bbo[j] = BBO_CON; - _Z_lb[j] = 0; - _Z_ub[j] = 0; - } - -}// - - - - - -/*---------------------------*/ -/* copy constructor */ -/*---------------------------*/ - -SGTELIB::TrainingSet::TrainingSet ( const TrainingSet & C ) : - _p ( C._p ) , - _n ( C._n ) , - _m ( C._m ) { - info(); - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet: copy constructor forbiden." ); - -}// - - - - -/*--------------------------------------*/ -/* info (debug) */ -/*--------------------------------------*/ -void SGTELIB::TrainingSet::info (void) const{ - std::cout << " ## ## TrainingSet::info " << this << " " << _ready << " " << _p << "\n"; -} - -/*--------------------------------------*/ -/* destructor */ -/*--------------------------------------*/ -SGTELIB::TrainingSet::~TrainingSet ( void ) { - #ifdef SGTELIB_DEBUG - std::cout << " ## ## Delete TrainingSet " << this << "\n"; - #endif - delete [] _bbo; - delete [] _X_lb; - delete [] _X_ub; - delete [] _X_scaling_a; - delete [] _X_scaling_b; - delete [] _X_mean; - delete [] _X_std; - delete [] _X_nbdiff; - delete [] _Z_lb; - delete [] _Z_ub; - delete [] _Z_replace; - delete [] _Z_scaling_a; - delete [] _Z_scaling_b; - delete [] _Z_mean; - delete [] _Z_std; - delete [] _Zs_mean; - delete [] _Z_nbdiff; -}// - -/*--------------------------------------*/ -/* operator = */ -/*--------------------------------------*/ -SGTELIB::TrainingSet & SGTELIB::TrainingSet::operator = ( const SGTELIB::TrainingSet & A ) { - A.info(); - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet: operator \"=\" forbiden." ); - return *this; -} - - -/*--------------------------------------*/ -/* Set bbo type */ -/*--------------------------------------*/ -void SGTELIB::TrainingSet::set_bbo_type (const std::string & line){ - // BBOT must be separated by space - - if (_bbo_is_def){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::set_bbo_type: _bbo must be defined before the first build." ); - } - #ifdef SGTELIB_DEBUG - std::cout << "SGTELIB::TrainingSet::set_bbo_type\n"; - std::cout << "Input string: \"" << line << "\"\n"; - #endif - - std::string s; - std::istringstream in_line (line); - - int j = 0; - while (in_line.good()){ - in_line >> s; - if (j>=_m){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::set_bbo_type: string error (j>_m)" ); - } - if ( (streqi(s,"OBJ")) || (streqi(s,"O")) ){ - _bbo[j] = BBO_OBJ; - _j_obj = j; - } - else if ( (streqi(s,"CON")) || (streqi(s,"C")) ){ - _bbo[j] = BBO_CON; - } - else if ( (streqi(s,"DUM")) || (streqi(s,"D")) ){ - _bbo[j] = BBO_DUM; - } - else{ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::set_bbo_type: string error (string "+s+" not recognized)" ); - } - j++; - } - - // Check the number of OBJ - double n = 0; - for (j=0 ; j<_m ; j++){ - if (_bbo[j] == BBO_OBJ){ - n++; - } - } - if (n>1){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::set_bbo_type: Only one obj is allowed" ); - } - - // Check the number of OBJ+CON - for (j=0 ; j<_m ; j++){ - if (_bbo[j] == BBO_CON){ - n++; - } - } - if (n==0){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::set_bbo_type: all outputs are \"DUM\"" ); - } - - #ifdef SGTELIB_DEBUG - std::cout << "Output types:\n"; - for (j=0 ; j<_m ; j++){ - std::cout << j << ": " << bbo_type_to_str(_bbo[j]) << "\n"; - } - #endif - - // nb: this method is supposed to be used only once, in the begining. - // Plus, it may have big changes on the results, so this changes the - // trainingset to "not ready". - _fs_min = INF; - _f_min = INF; - _bbo_is_def = true; - _ready = false; -}// - -/*--------------------------------------*/ -/* Construct */ -/*--------------------------------------*/ -void SGTELIB::TrainingSet::build ( void ){ - - - - // check the dimensions: - if ( _X.get_nb_rows() != _Z.get_nb_rows() ) - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::build(): dimension error" ); - - // Check number of points - if ( _p < 1 ) - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::build(): empty training set"); - - if ( ! _ready){ - #ifdef SGTELIB_DEBUG - std::cout << "TrainingSet::build BEGIN, X:(" << _p << "," << _n << ") Z:(" << _p << "," << _m << ")\n"; - #endif - - // Compute the number of varying input and output - compute_nbdiff(_X,_X_nbdiff,_nvar); - compute_nbdiff(_Z,_Z_nbdiff,_mvar); - - // Compute the number of input dimension for which - // nbdiff is greater than 1 (resp. greater than 2). - _X_nbdiff1 = 0; - _X_nbdiff2 = 0; - for (int j=0 ; j<_n ; j++){ - if (_X_nbdiff[j]>1) _X_nbdiff1++; - if (_X_nbdiff[j]>2) _X_nbdiff2++; - } - - // Check singular data (inf and void) - check_singular_data(); - - // Compute scaling values - compute_scaling(); - - // Compute scaled matrices - compute_scaled_matrices(); - - // Build matrix of distances between each pair of points - compute_Ds(); - - // Compute fs_min - compute_f_min(); - - // The training set is now ready! - _ready = true; - - #ifdef SGTELIB_DEBUG - std::cout << "TrainingSet::build END\n"; - #endif - } - - // _bbo is considered as defined. It can not be modified anymore. - _bbo_is_def = true; - -}// - - -/*--------------------------------------*/ -/* Check if the training set is ready */ -/*--------------------------------------*/ -void SGTELIB::TrainingSet::check_ready (void) const{ - if ( ! _ready){ - std::cout << "TrainingSet: NOT READY!\n"; - throw Exception ( __FILE__ , __LINE__ , "TrainingSet::check_ready(): TrainingSet not ready. Use method TrainingSet::build()" ); - } -}// -/*--------------------------------------*/ -void SGTELIB::TrainingSet::check_ready (const std::string & file, - const std::string & function, - const int & i ) const { - check_ready(file+"::"+function+":"+itos(i)); -}// -/*--------------------------------------*/ -void SGTELIB::TrainingSet::check_ready (const std::string & s) const{ - if ( ! _ready){ - std::cout << "TrainingSet: NOT READY! (" << s << ")\n"; - throw Exception ( __FILE__ , __LINE__ , "TrainingSet::check_ready(): TrainingSet not ready. Use method TrainingSet::build()" ); - } -}// - - -/*--------------------------------------*/ -/* add_points */ -/*--------------------------------------*/ -bool SGTELIB::TrainingSet::add_points ( const Matrix & Xnew , - const Matrix & Znew ) { - - // Check dim - if ( Xnew.get_nb_rows() != Znew.get_nb_rows() || Xnew.get_nb_cols() != _n || Znew.get_nb_cols() != _m ){ - throw Exception ( __FILE__ , __LINE__ , "TrainingSet::add_points(): dimension error" ); - } - - // Check for nan - if (Xnew.has_nan()){ - throw Exception ( __FILE__ , __LINE__ , "TrainingSet::add_points(): Xnew is nan" ); - } - if (Znew.has_nan()){ - throw Exception ( __FILE__ , __LINE__ , "TrainingSet::add_points(): Znew is nan" ); - } - - // Add the points in the trainingset - _X.add_rows(Xnew); - _Z.add_rows(Znew); - - // Add empty rows - int pnew = Xnew.get_nb_rows(); - _Xs.add_rows(pnew); - _Zs.add_rows(pnew); - _Ds.add_rows(pnew); - _Ds.add_cols(pnew); - // Update p - _p += pnew; - // Note that the trainingset needs to be updated. - _ready = false; - - return true; -}// - -/*--------------------------------------*/ -/* add_point */ -/*--------------------------------------*/ -bool SGTELIB::TrainingSet::add_point ( const double * xnew , - const double * znew ) { - - return add_points ( Matrix::row_vector ( xnew , _n ), - Matrix::row_vector ( znew , _m ) ); -}// - - -/*---------------------------------------------------*/ -/* compute the mean and std over */ -/* the columns of a matrix */ -/*---------------------------------------------------*/ -void SGTELIB::TrainingSet::check_singular_data ( void ){ - - int i,j; - bool e = false; - // Check that all the _X data are defined - for ( j = 0 ; j < _n ; j++ ) { - for ( i = 0 ; i < _p ; i++ ) { - if ( ! isdef(_X.get(i,j))){ - std::cout << "_X(" << i << "," << j << ") = " << _X.get(i,j) << "\n"; - e = true; - } - } - } - - // Check that, for each output index, SOME data are defined - bool isdef_Zj; // True if at least one value is defined for output j. - // Loop on the output indexes - for ( j = 0 ; j < _m ; j++ ) { - // no def value so far - isdef_Zj = false; - for ( i = 0 ; i < _p ; i++ ) { - if (isdef(_Z.get(i,j))){ - isdef_Zj = true; - break; - } - } - // if there is more than 10 points and no correct value was found, return an error. - if ( (_p>10) && ( ! isdef_Zj) ){ - std::cout << "_Z(:," << j << ") has no defined value !\n"; - e = true; - } - } - - if (e){ - throw Exception ( __FILE__ , __LINE__ , "TrainingSet::check_singular_data(): incorrect data !" ); - } - -}// - -/*---------------------------------------------------*/ -/* compute the mean and std over */ -/* the columns of a matrix */ -/*---------------------------------------------------*/ -void SGTELIB::TrainingSet::compute_mean_std ( void ){ - - int i,j; - double v, mu, var; - // Loop on the inputs - for ( j=0 ; j<_n ; j++ ) { - // Loop on lines for MEAN computation - mu = 0; - for ( i=0 ; i<_p ; i++ ) { - mu += _X.get(i,j); - } - mu /= _p; - _X_mean[j] = mu; - // Loop on lines for VAR computation - var = 0; - for ( i=0 ; i<_p ; i++ ) { - v = _X.get(i,j); - var += (v-mu)*(v-mu); - } - var /= (_p-1); - _X_std[j] = sqrt(var); - } - - // Loop on the outputs - for ( j=0 ; j<_m ; j++ ) { - // Loop on lines for MEAN computation - mu = 0; - for ( i=0 ; i<_p ; i++ ) { - v = _Z.get(i,j); - if ( ! isdef(v)) v = _Z_replace[j]; - mu += v; - } - mu /= _p; - _Z_mean[j] = mu; - // Loop on lines for VAR computation - var = 0; - for ( i=0 ; i<_p ; i++ ) { - v = _Z.get(i,j); - if ( ! isdef(v)) v = _Z_replace[j]; - var += (v-mu)*(v-mu); - } - var /= (_p-1); - _Z_std[j] = sqrt(var); - } - -}// - -/*---------------------------------------------------*/ -/* compute the bounds over */ -/* the columns of a matrix */ -/*---------------------------------------------------*/ -void SGTELIB::TrainingSet::compute_bounds ( void ){ - - int i,j; - double v; - - // Bound of X - for ( j=0 ; j<_n ; j++ ) { - _X_lb[j] = +INF; - _X_ub[j] = -INF; - // Loop on points - for ( i=0 ; i<_p ; i++ ) { - v = _X.get(i,j); - _X_lb[j] = std::min(v,_X_lb[j]); - _X_ub[j] = std::max(v,_X_ub[j]); - } - } - - // Bound of Z - for ( j=0 ; j<_m ; j++ ) { - _Z_lb[j] = +INF; - _Z_ub[j] = -INF; - // Loop on points - for ( i=0 ; i<_p ; i++ ) { - v = _Z.get(i,j); - if ( isdef(v) ){ - _Z_lb[j] = std::min(v,_Z_lb[j]); - _Z_ub[j] = std::max(v,_Z_ub[j]); - } - } - - // Compute replacement value for undef Z - // If there are no correct bounds defined yet - if ( ( ! isdef(_Z_lb[j])) || ( ! isdef(_Z_ub[j])) ){ - _Z_replace[j] = 1.0; - } - else{ - _Z_replace[j] = std::max(_Z_ub[j],0.0) + std::max(_Z_ub[j]-_Z_lb[j],1.0); - } - - } - -}// - - -/*---------------------------------------------------*/ -/* compute the number of different values over */ -/* the columns of a matrix */ -/*---------------------------------------------------*/ -void SGTELIB::TrainingSet::compute_nbdiff ( const Matrix & MAT , - int * nbdiff, - int & njvar ){ - - int nj = MAT.get_nb_cols(); // nb of columns - njvar = 0; // nb of columns that are not constant - for ( int j = 0 ; j < nj ; j++ ){ - nbdiff[j] = MAT.get_nb_diff_values(j); - if (nbdiff[j]>1) njvar++; - } -}// - - - - - - - -/*---------------------------------------------------*/ -/* compute the bounds over */ -/* the columns of a matrix */ -/*---------------------------------------------------*/ -void SGTELIB::TrainingSet::compute_nvar_mvar ( void ){ - - // Compute _nvar - if (_nvar!=_n){ - _nvar = 0; - for ( int j = 0 ; j < _n ; j++ ) - if (_X_nbdiff[j] > 1) _nvar++; - } - - // Compute _mvar - if (_mvar!=_m){ - _mvar = 0; - for ( int j = 0 ; j < _m ; j++ ) - if (_Z_nbdiff[j] > 1) _mvar++; - } -}// - - - -/*---------------------------------------------------*/ -/* compute scaling parameters */ -/*---------------------------------------------------*/ -void SGTELIB::TrainingSet::compute_scaling ( void ){ - int j=0; - - // Neutral values - for ( j = 0 ; j < _n ; j++ ) { - _X_scaling_a[j] = 1; - _X_scaling_b[j] = 0; - } - for ( j = 0 ; j < _m ; j++ ) { - _Z_scaling_a[j] = 1; - _Z_scaling_b[j] = 0; - } - - switch (scaling_method){ - case SCALING_NONE: - //Nothing to do! - break; - case SCALING_MEANSTD: - // Compute mean and std over columns of X and Z - compute_mean_std(); - // Compute scaling constants - for ( j = 0 ; j < _n ; j++ ) { - if (_X_nbdiff[j]>1) _X_scaling_a[j] = 1/_X_std[j]; - _X_scaling_b[j] = -_X_mean[j]*_X_scaling_a[j]; - } - for ( j = 0 ; j < _m ; j++ ) { - if (_Z_nbdiff[j]>1) _Z_scaling_a[j] = 1/_Z_std[j]; - _Z_scaling_b[j] = -_Z_mean[j]*_Z_scaling_a[j]; - } - break; - case SCALING_BOUNDS: - // Compute bounds over columns of X and Z - compute_bounds(); - // Compute scaling constants - for ( j = 0 ; j < _n ; j++ ) { - if (_X_nbdiff[j]>1) _X_scaling_a[j] = 1/(_X_ub[j]-_X_lb[j]); - _X_scaling_b[j] = -_X_lb[j]*_X_scaling_a[j]; - } - for ( j = 0 ; j < _m ; j++ ) { - if (_Z_nbdiff[j]>1) _Z_scaling_a[j] = 1/(_Z_ub[j]-_Z_lb[j]); - _Z_scaling_b[j] = -_Z_lb[j]*_Z_scaling_a[j]; - } - break; - }// end switch -}// - - -/*---------------------------------------------------*/ -/* compute scale matrices _Xs and _Zs */ -/*---------------------------------------------------*/ -void SGTELIB::TrainingSet::compute_scaled_matrices ( void ){ - - double v, mu; - int i,j; - - // Compute _Xs - for ( j = 0 ; j < _n ; j++ ){ - for ( i = 0 ; i < _p ; i++ ){ - v = _X.get(i,j)*_X_scaling_a[j]+_X_scaling_b[j]; - _Xs.set(i,j,v); - } - } - - // Compute _Zs and Mean_Zs - for ( j = 0 ; j < _m ; j++ ){ - mu = 0; - for ( i = 0 ; i < _p ; i++ ){ - v = _Z.get(i,j); - if ( ! isdef(v)){ - v = _Z_replace[j]; - } - v = v*_Z_scaling_a[j]+_Z_scaling_b[j]; - mu +=v; - _Zs.set(i,j,v); - } - _Zs_mean[j] = mu/_p; - } - -}// - - - -/*---------------------------------------------------*/ -/* compute distance matrix */ -/* the columns of a matrix */ -/*---------------------------------------------------*/ -void SGTELIB::TrainingSet::compute_Ds ( void ){ - double d; - double di1i2; - _pvar = _p; - _Ds_mean = 0.0; - bool unique; - for ( int i1 = 0 ; i1 < _p-1 ; i1++ ){ - _Ds.set(i1,i1,0.0); - unique = true; - for ( int i2 = i1+1 ; i2 < _p ; i2++ ){ - d = 0; - for ( int j = 0 ; j < _n ; j++ ){ - di1i2 = _Xs.get(i1,j)-_Xs.get(i2,j); - d += di1i2*di1i2; - } - d = sqrt(d); - _Ds.set(i1,i2,d); - _Ds.set(i2,i1,d); - // Compute the mean distance between the points - _Ds_mean += d; - // If d==0, then the point i2 is not unique. - if (fabs(d)<EPSILON){ - unique = false; - } - } - // If there are some points equal to the point of index i2, - // then reduce the number of different points. - if ( ! unique) _pvar--; - } - _Ds_mean /= double(_pvar*(_pvar-1)/2); - -}// - - - -/*---------------------------------------------------*/ -/* compute fs_min (scaled value of f_min) */ -/*---------------------------------------------------*/ -// the lazy way.... -void SGTELIB::TrainingSet::compute_f_min ( void ){ - - double f; - bool feasible; - // Go through all points - for ( int i=0 ; i<_p ; i++ ){ - // Get the unscaled objective - f = _Z.get(i,_j_obj); - // If objective is good - if (f<_f_min){ - // check the constraints - feasible = true; - for ( int j=0 ; j<_m ; j++ ) - if (_bbo[j]==BBO_CON) - if (_Z.get(i,j)>0.0){ feasible = false; break; } - // If the point is feasible, save the value. - if (feasible){ - _f_min = f; - _i_min = i; - } - } - } - // Compute the scaled objective. - _fs_min = Z_scale( _f_min, _j_obj ); - -}// - - -/*---------------------------------------------------*/ -/* get */ -/*---------------------------------------------------*/ -double SGTELIB::TrainingSet::get_Xs ( const int i , const int j ) const { - #ifdef SGTELIB_DEBUG - check_ready(); - // Check index - if ( (i<0) ||�(i>=_p) ||�(j<0) ||�(j>=_n) ){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::TrainingSet(): dimension error" ); - } - #endif - // Return value - return _Xs.get(i,j); -}// -/*---------------------------------------------------*/ -double SGTELIB::TrainingSet::get_Zs ( const int i , const int j ) const { - #ifdef SGTELIB_DEBUG - check_ready(); - // Check index - if ( (i<0) ||�(i>=_p) ||�(j<0) ||�(j>=_m) ){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::TrainingSet(): dimension error" ); - } - #endif - // Return value - return _Zs.get(i,j); -}// -/*---------------------------------------------------*/ -void SGTELIB::TrainingSet::get_Xs ( const int i , double * x ) const { - #ifdef SGTELIB_DEBUG - check_ready(__FILE__,__FUNCTION__,__LINE__); - // Check index - if ( (i<0) ||�(i>=_p) ){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::TrainingSet(): dimension error" ); - } - #endif - // Check/initialize pointer - if ( ! x){ - x = new double [_n]; - } - // Fill pointer - for ( int j = 0 ; j < _n ; j++ ){ - x[j] = _Xs.get(i,j); - } -}// -/*---------------------------------------------------*/ -void SGTELIB::TrainingSet::get_Zs ( const int i , double * z ) const { - #ifdef SGTELIB_DEBUG - check_ready(__FILE__,__FUNCTION__,__LINE__); - // Check index - if ( (i<0) ||�(i>=_p) ){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::get_Zs(): dimension error" ); - } - #endif - // Check/initialize pointer - if ( ! z){ - z = new double [_m]; - } - // Fill pointer - for ( int j = 0 ; j < _m ; j++ ){ - z[j] = _Zs.get(i,j); - } -}// -/*---------------------------------------------------*/ -double SGTELIB::TrainingSet::get_Zs_mean ( const int j ) const { - #ifdef SGTELIB_DEBUG - check_ready(__FILE__,__FUNCTION__,__LINE__); - // Check index - if ( (j<0) ||�(j>=_m) ){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::get_Zs_mean(): dimension error" ); - } - #endif - return _Zs_mean[j]; -}// - - -/*---------------------------------------------------*/ -int SGTELIB::TrainingSet::get_X_nbdiff ( const int i ) const { - #ifdef SGTELIB_DEBUG - check_ready(__FILE__,__FUNCTION__,__LINE__); - // Check index - if ( (i<0) ||�(i>=_n) ){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::get_X_nbdiff(): dimension error" ); - } - #endif - return _X_nbdiff[i]; -}// - -/*---------------------------------------------------*/ -const Matrix SGTELIB::TrainingSet::get_X_nbdiff ( void ) const { - Matrix V ("NbDiff",1,_n); - for (int j=0 ; j<_n ; j++){ - V.set(0,j,(double)_X_nbdiff[j]); - } - return V; -}// - - -/*---------------------------------------------------*/ -int SGTELIB::TrainingSet::get_Z_nbdiff ( const int j ) const { - #ifdef SGTELIB_DEBUG - check_ready(__FILE__,__FUNCTION__,__LINE__); - // Check index - if ( (j<0) ||�(j>=_m) ){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::get_Z_nbdiff(): dimension error" ); - } - #endif - return _Z_nbdiff[j]; -}// -/*---------------------------------------------------*/ -// Return the normalized distance between points i1 an i2 -double SGTELIB::TrainingSet::get_Ds ( const int i1 , const int i2 ) const { - #ifdef SGTELIB_DEBUG - check_ready(); - // Check index - if ( (i1<0) ||�(i1>=_p) ||�(i2<0) ||�(i2>=_p) ){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::get_Ds(): dimension error" ); - } - #endif - return _Ds.get(i1,i2); -}// - -/*--------------------------------------------------*/ -/* compute the distances between two sets of points */ -/*--------------------------------------------------*/ -Matrix SGTELIB::TrainingSet::get_distances ( const Matrix & A , - const Matrix & B , - const distance_t dt ) const{ - - - switch (dt){ - - case DISTANCE_NORM1: - return Matrix::get_distances_norm1(A,B); - - case DISTANCE_NORM2: - return Matrix::get_distances_norm2(A,B); - - case DISTANCE_NORMINF: - return Matrix::get_distances_norminf(A,B); - - case DISTANCE_NORM2_IS0: - // Two points x and y are in the same "IS0-class" if (x_j==0 <=> y_j==0 for each j). - // The distance "IS0" between two points of the same IS0-class is the norm 2 distance. - // The distance "IS0" between two points of different IS0-class is INF. - { - const int n = A.get_nb_cols(); - const int pa = A.get_nb_rows(); - const int pb = B.get_nb_rows(); - double v,d; - int ia, ib, j; - Matrix D = Matrix::get_distances_norm2(A,B); - double * x0 = new double [n]; - for (j=0 ; j < n ; j++){ - x0[j] = X_scale( 0.0 , j ); - } - for (ia=0 ; ia < pa ; ia++){ - for (ib=0 ; ib < pb ; ib++){ - // For each value of D - d = D.get(ia,ib); - v = d*d; - for (j=0 ; j < n ; j++){ - // If they are not in the same 0-class - if ( (fabs(A.get(ia,j)-x0[j])<EPSILON) ^ (fabs(B.get(ib,j)-x0[j])<EPSILON) ){ - v+=10000; - } - } - v = sqrt(v); - D.set(ia,ib,v); - } - } - delete [] x0; - return D; - } - - case DISTANCE_NORM2_CAT: - // Two points x and y are in the same "X0-class" if x_0==y_0. - // The distance "IS0" between two points of the same X0-class is the norm 2 distance. - // The distance "IS0" between two points of different X0-class is INF. - { - const int pa = A.get_nb_rows(); - const int pb = B.get_nb_rows(); - double v,d; - int ia, ib, j; - Matrix D = Matrix::get_distances_norm2(A,B); - j = 0; - for (ib=0 ; ib < pb ; ib++){ - for (ia=0 ; ia < pa ; ia++){ - // For each value of D - d = D.get(ia,ib); - v = d*d; - // If they are not in the same 0-class - if ( fabs(A.get(ia,j)-B.get(ib,j))>EPSILON ) { - v+=10000; - } - v = sqrt(v); - D.set(ia,ib,v); - } - } - return D; - } - - default: - throw Exception ( __FILE__ , __LINE__ ,"Undefined type" ); - } - - - -}// - - -/*--------------------------------------*/ -/* X scale: x->y: y = a.x + b */ -/*--------------------------------------*/ -void SGTELIB::TrainingSet::X_scale ( double * x ) const { - for ( int j = 0 ; j < _n ; j++ ) - x[j] = _X_scaling_a[j] * x[j] + _X_scaling_b[j]; -}// - -double SGTELIB::TrainingSet::X_scale ( double x , int var_index ) const { - return _X_scaling_a[var_index] * x + _X_scaling_b[var_index]; -}// - -/*--------------------------------------*/ -/* X unscale: y->x: x = (y-b)/a */ -/*--------------------------------------*/ -void SGTELIB::TrainingSet::X_unscale ( double * y ) const { - for ( int j = 0 ; j < _n ; j++ ) - y[j] = ( y[j] - _X_scaling_b[j] ) / _X_scaling_a[j]; -} - -double SGTELIB::TrainingSet::X_unscale ( double y , int var_index ) const { - return ( y - _X_scaling_b[var_index] ) / _X_scaling_a[var_index]; -} - -/*--------------------------------------*/ -/* Z scale: z->w: w = a.z + b */ -/*--------------------------------------*/ -void SGTELIB::TrainingSet::Z_scale ( double * z ) const { - for ( int j = 0 ; j < _m ; j++ ) - z[j] = _Z_scaling_a[j] * z[j] + _Z_scaling_b[j]; -}// - -double SGTELIB::TrainingSet::Z_scale ( double z , int output_index ) const { - return _Z_scaling_a[output_index] * z + _Z_scaling_b[output_index]; -}// - -/*--------------------------------------*/ -/* Z unscale: w->z: z = (w-b)/a */ -/*--------------------------------------*/ -void SGTELIB::TrainingSet::Z_unscale ( double * w ) const { - for ( int j = 0 ; j < _m ; j++ ) - w[j] = ( w[j] - _Z_scaling_b[j] ) / _Z_scaling_a[j]; -}// - -double SGTELIB::TrainingSet::Z_unscale ( double w , int output_index ) const { - return ( w - _Z_scaling_b[output_index] ) / _Z_scaling_a[output_index]; -}// - -/*------------------------------------------*/ -/* ZE unscale: w->z: z = (w)/a */ -/* Used to unscale errors, std and EI */ -/*------------------------------------------*/ -double SGTELIB::TrainingSet::ZE_unscale ( double w , int output_index ) const { - return w / _Z_scaling_a[output_index]; -}// - - -/*--------------------------------------*/ -/* X scale: x->y: y = a.x + b */ -/*--------------------------------------*/ -void SGTELIB::TrainingSet::X_scale ( Matrix & X ) { - int p = X.get_nb_rows(); - int n = X.get_nb_cols(); - if (n!=_n){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::TrainingSet(): dimension error" ); - } - double v; - // UnScale the output - for (int i=0 ; i<p ; i++){ - for (int j=0 ; j<n ; j++){ - // Z - v = X.get(i,j); - v = X_scale ( v , j ); - X.set(i,j,v); - } - } -}// - -/*--------------------------------------*/ -/* Z unscale: w->z: z = (w-b)/a */ -/*--------------------------------------*/ -void SGTELIB::TrainingSet::Z_unscale ( Matrix * Z ) { - int p = Z->get_nb_rows(); - int m = Z->get_nb_cols(); - if (m!=_m){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::TrainingSet(): dimension error" ); - } - double v; - // UnScale the output - for (int i=0 ; i<p ; i++){ - for (int j=0 ; j<m ; j++){ - // Z - v = Z->get(i,j); - v = Z_unscale ( v , j ); - Z->set(i,j,v); - } - } -}// -Matrix SGTELIB::TrainingSet::Z_unscale ( const Matrix & Z ) { - Matrix Z2 (Z); - Z_unscale(&Z2); - return Z2; -}// - -/*--------------------------------------*/ -/* ZE unscale: w->z: z = w/a */ -/*--------------------------------------*/ -void SGTELIB::TrainingSet::ZE_unscale ( Matrix * ZE ) { - int p = ZE->get_nb_rows(); - int m = ZE->get_nb_cols(); - if (m!=_m){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::TrainingSet(): dimension error" ); - } - double v; - // UnScale the output - for (int i=0 ; i<p ; i++){ - for (int j=0 ; j<m ; j++){ - // Z - v = ZE->get(i,j); - v = ZE_unscale ( v , j ); - ZE->set(i,j,v); - } - } -}// -Matrix SGTELIB::TrainingSet::ZE_unscale ( const Matrix & ZE ) { - Matrix ZE2 (ZE); - ZE_unscale(&ZE2); - return ZE2; -}// - - -/*--------------------------------------*/ -/* get d1 over d2 */ -/*--------------------------------------*/ -double SGTELIB::TrainingSet::get_d1_over_d2 ( const Matrix & XXs ) const { - if (XXs.get_nb_rows()>1){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::get_d1_over_d2: XXs must have only one line." ); - } - double d1 = +INF; - double d2 = +INF; - double d; - double dxj; - int i,i1,j; - i1 = 0; // Index of the closest point - - // If only 1 point, it is not possible to compute d2, - // so we use a dummy value. - if (_p==1){ - return 1.0; - } - - // Parcours des points - for ( i=0 ; i<_p ; i++ ){ - - // Calcul de d - d = 0.0; - for ( j=0 ; j<_n ; j++){ - dxj = XXs.get(0,j)-_Xs.get(i,j); - d += dxj*dxj; - } - if (d==0){ - return 0.0; - } - if (d<d1){ - d2=d1; - d1=d; - i1=i;// Memorize index of closest point - } - else if ((d<d2) && (_Ds.get(i,i1)>0)){ - // nb: the point i can be kept as 2nd closest point only if it is different from the point - // i1, which means that the distance to this point must be non null. - d2=d; - } - - } - return sqrt(d1/d2); -}// - - -/*--------------------------------------*/ -/* get d1 over d2 */ -/*--------------------------------------*/ -double SGTELIB::TrainingSet::get_d1 ( const Matrix & XXs ) const { - if (XXs.get_nb_rows()>1){ - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::get_d1: XXs must have only one line." ); - } - double d; - double d1 = +INF; - int i,j; - double dxj; - - // Parcours des points - for ( i=0 ; i<_p ; i++ ){ - - // Calcul de d - d = 0.0; - for ( j=0 ; j<_n ; j++){ - dxj = XXs.get(0,j)-_Xs.get(i,j); - d += dxj*dxj; - } - if (d==0){ - return 0.0; - } - if (d<d1){ - d1=d; - } - - } - return sqrt(d1); -}// - - -/*--------------------------------------*/ -/* get_exclusion_area_penalty */ -/*--------------------------------------*/ -Matrix SGTELIB::TrainingSet::get_exclusion_area_penalty ( const Matrix & XXs , const double tc ) const { - const int pxx = XXs.get_nb_rows(); - double r12,p; - //double logtc = log(tc); - - // tc = 0 => no penalty - // tc > 0 => infinite penalty for points of the cache - // Small value of tc (close to 0) => penalty is null nearly everywhere - // Large value of tc (close to 1) => penalty is non null nearly everywhere - - Matrix P ("P",pxx,1); - for (int i=0 ; i<pxx ; i++){ - r12 = get_d1_over_d2( XXs.get_row(i) ); - if ( r12<tc ) - //p = std::max(0.0,-1+log(r12)/logtc); - p = 1e+9 - r12; - else - p = 0.0; - P.set(i,0,p); - } - return P; -}// - -/*--------------------------------------*/ -/* get_distance_to_closest */ -/*--------------------------------------*/ -Matrix SGTELIB::TrainingSet::get_distance_to_closest ( const Matrix & XXs ) const { - #ifdef SGTELIB_DEBUG - check_ready(); - #endif - const int pxx = XXs.get_nb_rows(); - double d; - Matrix P ("P",pxx,1); - for (int i=0 ; i<pxx ; i++){ - d = get_d1 ( XXs.get_row(i) ); - P.set(i,0,d); - } - return P; -}// - - - -/*--------------------------------------*/ -/* get_closest */ -/*--------------------------------------*/ -// Return the index of the closest point to point i -int SGTELIB::TrainingSet::get_closest ( const int i ) const { - std::cout << i; - throw Exception ( __FILE__ , __LINE__ , - "TrainingSet::TrainingSet::get_closest ( const int i ): To be implemented." ); - return 0; -} - -/*--------------------------------------*/ -/* get_closest */ -/*--------------------------------------*/ - // Return the indexes of the nb_pts closest points to point i -/* -std::list<int> SGTELIB::TrainingSet::get_closest ( const int i_min , const int nb_pts ) const { - - #ifdef SGTELIB_DEBUG - check_ready(); - // Check index - if ( (i_min<0) or (i_min>=_p) or (nb_pts<0) or (nb_pts>=_p) ){ - throw Exception ( __FILE__ , __LINE__ ,"TrainingSet::TrainingSet(): dimension error" ); - } - #endif - - - //const Matrix & Ds = get_matrix_Ds(); - Matrix d = get_matrix_Ds().get_row(i_min); - Matrix ind("indexes",1,_p); - - int i; - for (i=0 ; i<_p ; i++) ind.set(0,i,i); - - bool change = true; - while (change) { - change = false; - for (i=0 ; i<_p-1 ; i++){ - if (d.get(0,i)>d.get(0,i+1)){ - d.permute(0,i,0,i+1); - ind.permute(0,i,0,i+1); - change = true; - } - } - } - - std::list<int> list; - list.clear(); - for (i=0 ; i<nb_pts ; i++) list.push_back(int(ind.get(0,i))); - return list; - -} -*/ - -/*--------------------------------------*/ -/* select points */ -/*--------------------------------------*/ -std::list<int> SGTELIB::TrainingSet::select_greedy ( const Matrix & X, - const int imin, - const int pS, - const double lambda0, - const distance_t dt ){ - - const int p = X.get_nb_rows(); - const int n = X.get_nb_cols(); - - if ( pS<3 || pS>=p ){ - std::cout << "pS = " << pS << "\n"; - throw Exception ( __FILE__ , __LINE__ ,"TrainingSet::TrainingSet(): wrong value of pS" ); - } - - std::list<int> S; - S.clear(); - - int inew; - Matrix xnew("xnew",1,n); - Matrix x ("x" ,1,n); - - // Select the best point (here, the set B is only the point i_min) - xnew = X.get_row(imin); - // Distance vector between the set B and the cache - Matrix dB = get_distances(X,xnew,dt); - dB.set_name("dB"); - // Add to S - S.push_back(imin); - #ifdef SGTELIB_DEBUG - std::cout << "First point : " << imin << "\n"; - #endif - - // Select the further point from B - // (nb : selecting one point randomly works as well) - inew = dB.get_max_index(); - xnew = X.get_row(inew); - // Distance vector between the set S and the cache - Matrix dS = get_distances(X,xnew,dt); - dS.set_name("dS"); - // Add to S - S.push_back(inew); - #ifdef SGTELIB_DEBUG - std::cout << "Second point : " << inew << "\n"; - #endif - - // As B is in S, we can take the min of both distances - dS = Matrix::min(dS,dB); - - // Compute lambda init : - #ifdef SGTELIB_DEBUG - std::cout << "Compute lambda init\n"; - #endif - double lambda = 0; - if (lambda0!=0){ - for (int i=0 ; i<p ; i++){ - if (dB.get(i)>0){ - lambda = std::max ( lambda , dS.get(i)/dB.get(i) ); - } - } - lambda *= lambda0; - } - - - // Iterative selection - #ifdef SGTELIB_DEBUG - std::cout << "Start greedy selection (S.size / pS = " << S.size() << " / " << pS << ")\n"; - #endif - while ((int) S.size() < pS){ - #ifdef SGTELIB_DEBUG - std::cout << "New iteration with lambda = " << lambda << "\n"; - (dS-lambda*dB).display(std::cout); - #endif - inew = (dS-lambda*dB).get_max_index(); - #ifdef SGTELIB_DEBUG - std::cout << "inew : " << inew << "\n"; - #endif - if (dS.get(inew)==0){ - #ifdef SGTELIB_DEBUG - std::cout << "dS(inew) == 0 !\n"; - #endif - // Update lambda - lambda *= 0.99; - if (lambda<1e-6) break; - } - else{ - #ifdef SGTELIB_DEBUG - std::cout << "Add point " << inew << " to set\n"; - #endif - // Add index in S - S.push_back(inew); - // Get coordinates of new points - xnew = X.get_row(inew); - // Update dS - dS = Matrix::min( dS , get_distances(X,xnew,dt) ); - dS.set_name("dS"); - } - }// End while - - return S; -}// - - -/*--------------------------------------*/ -/* display */ -/*--------------------------------------*/ -void SGTELIB::TrainingSet::display ( std::ostream & out ) const { - check_ready(); - int j; - - // dimensions: - out << "Number of points, p="; - out.width(4); - out << _p << " (" << _pvar << ")\n"; - out << "Input dimension, n="; - out.width(4); - out << _n << " (" << _nvar << ")\n"; - out << "Output dimension, m="; - out.width(4); - out << _m << " (" << _mvar << ")\n"; - - - if (_ready){ - out << "X (Input matrix):\n"; - out << "___________________________________________________________________________________\n"; - out << "Dim|type|nbdiff| mean std| lb ub| a b|\n"; - out << "---|----|------|----------------------|----------------------|---------------------|\n"; - for ( j = 0 ; j < _n ; j++ ){ - out.width(3); - out << j <<"| "; - out << " NA| "; - out.width(5); - out << _X_nbdiff[j] <<"| "; - out.width(10); - out << _X_mean[j] <<" "; - out.width(10); - out << _X_std[j] <<"| "; - out.width(10); - out << _X_lb[j] <<" "; - out.width(10); - out << _X_ub[j] <<"|"; - out.width(10); - out << _X_scaling_a[j] <<" "; - out.width(10); - out << _X_scaling_b[j] <<"|\n"; - } - out << "------------------------------------------------------------------------------------\n"; - - out << "\n"; - - out << "Z (Input matrix):\n"; - out << "___________________________________________________________________________________\n"; - out << "Dim|type|nbdiff| mean std| lb ub| a b|\n"; - out << "---|----|------|----------------------|----------------------|---------------------|\n"; - for ( j = 0 ; j < _m ; j++ ){ - out.width(3); - out << j <<"| "; - out << bbo_type_to_str(_bbo[j]) << "| "; - out.width(5); - out << _Z_nbdiff[j] <<"| "; - out.width(10); - out << _Z_mean[j] <<" "; - out.width(10); - out << _Z_std[j] <<"| "; - out.width(10); - out << _Z_lb[j] <<" "; - out.width(10); - out << _Z_ub[j] <<"|"; - out.width(10); - out << _Z_scaling_a[j] <<" "; - out.width(10); - out << _Z_scaling_b[j] <<"|\n"; - } - out << "------------------------------------------------------------------------------------\n"; - std::cout << "fs_min: " << _fs_min << "\n"; - std::cout << "f_min: " << _f_min << "\n"; - } - - - out << std::endl; - -}// diff --git a/ext/sgtelib/src/TrainingSet.hpp b/ext/sgtelib/src/TrainingSet.hpp deleted file mode 100644 index ec6c86d..0000000 --- a/ext/sgtelib/src/TrainingSet.hpp +++ /dev/null @@ -1,232 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_TRAININGSET__ -#define __SGTELIB_TRAININGSET__ - -#include "Matrix.hpp" -#include "Defines.hpp" -namespace SGTELIB { - - /*--------------------------------------*/ - /* TrainingSet class */ - /*--------------------------------------*/ - class TrainingSet { - - private: - - int _p; // number of data points in X and Z - const int _n; // dimension -- number of variables - const int _m; // number of outputs (includes the objective) - bool _ready; // True if data have been processed and are ready to be used - - // Output type - SGTELIB::bbo_t * _bbo; - bool _bbo_is_def; - int _j_obj; // Index of the objective - - // f_min - double _f_min; - double _fs_min; - int _i_min; // Index of the point where f_min is reached - - // data points: - SGTELIB::Matrix _X; // p x n - SGTELIB::Matrix _Z; // p x m - - // scaled matrices - SGTELIB::Matrix _Xs; // p x n - SGTELIB::Matrix _Zs; // p x m - - // Distance matrix - SGTELIB::Matrix _Ds; // p x p - - // Nb of varying data - int _nvar; // Nb of varying input - int _mvar; // Nb of varying output - int _pvar; // Nb of different points - - // Data - double * _X_lb; - double * _X_ub; - double * _X_scaling_a; - double * _X_scaling_b; - double * _X_mean; - double * _X_std; - int * _X_nbdiff; - int _X_nbdiff1; - int _X_nbdiff2; - double * _Z_lb; - double * _Z_ub; - double * _Z_replace; - double * _Z_scaling_a; - double * _Z_scaling_b; - double * _Z_mean; - double * _Z_std; - double * _Zs_mean; - int * _Z_nbdiff; - - // scaled bounds: - //double * _X_lb_scaled; - //double * _X_ub_scaled; - - // Mean distance between points - double _Ds_mean; - - // private affectation operator: - TrainingSet & operator = ( const TrainingSet & ); - - // Data preparation - - static void compute_nbdiff ( const SGTELIB::Matrix & MAT , - int * nbdiff , - int & njvar ); - - void compute_bounds (void); - void compute_mean_std (void); - void compute_nvar_mvar (void); - void compute_scaling (void); - void compute_Ds (void); - void compute_scaled_matrices (void); - void compute_f_min (void); - void check_singular_data (void); - - // FORBIDEN copy constructor: - TrainingSet ( const TrainingSet & ); - - - public: - // constructor 1: - TrainingSet ( const SGTELIB::Matrix & X , - const SGTELIB::Matrix & Z ); - - // destructor: - virtual ~TrainingSet ( void ); - - // Define the bbo types - void set_bbo_type (const std::string & s); - - // construct/process the data of the TrainingSet - void build ( void ); - - // check ready - bool is_ready ( void ) const {return _ready;}; - void check_ready (const std::string & s) const; - void check_ready (const std::string & file, const std::string & function, const int & i) const; - void check_ready (void) const; - - // add points: - bool add_points ( const SGTELIB::Matrix & Xnew , - const SGTELIB::Matrix & Znew ); - bool add_point ( const double * xnew , - const double * znew ); - - // scale and unscale: - void X_scale ( double * x ) const; - void X_unscale ( double * y ) const; - - double X_scale ( double x , int var_index ) const; - double X_unscale ( double y , int var_index ) const; - - void Z_scale ( double * z ) const; - void Z_unscale ( double * w ) const; - - double Z_scale ( double z , int output_index ) const; - double Z_unscale ( double w , int output_index ) const; - double ZE_unscale ( double w , int output_index ) const; - - void X_scale ( SGTELIB::Matrix &X); - void Z_unscale ( SGTELIB::Matrix *Z); - void ZE_unscale ( SGTELIB::Matrix *ZE); - SGTELIB::Matrix Z_unscale ( const SGTELIB::Matrix & Z ); - SGTELIB::Matrix ZE_unscale ( const SGTELIB::Matrix & ZE ); - - // Get data - double get_Xs ( const int i , const int j ) const; - double get_Zs ( const int i , const int j ) const; - void get_Xs ( const int i , double * x ) const; - void get_Zs ( const int i , double * z ) const; - double get_Zs_mean ( const int j ) const; - int get_X_nbdiff ( const int i ) const; - int get_Z_nbdiff ( const int j ) const; - int get_X_nbdiff1 (void) const { check_ready(); return _X_nbdiff1; }; - int get_X_nbdiff2 (void) const { check_ready(); return _X_nbdiff2; }; - double get_Ds ( const int i1, const int i2) const; - const SGTELIB::Matrix get_X_nbdiff ( void ) const; - - - SGTELIB::Matrix get_distances ( const SGTELIB::Matrix & A , - const SGTELIB::Matrix & B , - const distance_t dt = SGTELIB::DISTANCE_NORM2 ) const; - - double get_d1_over_d2 ( const SGTELIB::Matrix & XXs ) const; - double get_d1 ( const SGTELIB::Matrix & XXs ) const; - SGTELIB::Matrix get_exclusion_area_penalty ( const SGTELIB::Matrix & XXs , const double tc ) const; - SGTELIB::Matrix get_distance_to_closest ( const SGTELIB::Matrix & XXs ) const; - - // Return the index of the closest point to point i - int get_closest ( const int i ) const; - // Return the indexes of the nb_pts closest points to point i - //std::list<int> get_closest ( const int i , const int nb_pts ) const; - - // Get basic information - int get_nb_points ( void ) const { return _p; }; - int get_input_dim ( void ) const { return _n; }; - int get_output_dim ( void ) const { return _m; }; - int get_nvar ( void ) const { check_ready(); return _nvar; }; - int get_mvar ( void ) const { check_ready(); return _mvar; }; - int get_pvar ( void ) const { check_ready(); return _pvar; }; - - double get_fs_min ( void ) const { check_ready(); return _fs_min; }; - double get_f_min ( void ) const { check_ready(); return _f_min; }; - int get_i_min ( void ) const { check_ready(); return _i_min; }; - double get_Ds_mean ( void ) const { check_ready(); return _Ds_mean; }; - int get_j_obj ( void ) const { check_ready(); return _j_obj; }; - //double get_Ds_min ( void ) const ; - - SGTELIB::bbo_t get_bbo ( int j) const { check_ready(); return _bbo[j]; }; - - double get_X_scaling_a ( int j) const { check_ready(); return _X_scaling_a[j]; }; - - // Return the design matrix - const SGTELIB::Matrix & get_matrix_Xs ( void ) const { check_ready(); return _Xs; }; - const SGTELIB::Matrix & get_matrix_Zs ( void ) const { check_ready(); return _Zs; }; - const SGTELIB::Matrix & get_matrix_Ds ( void ) const { check_ready(); return _Ds; }; - - // display: - void display ( std::ostream & out ) const; - void info (void) const; - - // Selection of points - std::list<int> select_greedy ( const SGTELIB::Matrix & X, - const int imin, - const int pS, - const double lambda0, - const distance_t dt = SGTELIB::DISTANCE_NORM2); - - }; -} - -#endif diff --git a/ext/sgtelib/src/header.txt b/ext/sgtelib/src/header.txt deleted file mode 100644 index c297ebc..0000000 --- a/ext/sgtelib/src/header.txt +++ /dev/null @@ -1,24 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2016 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ diff --git a/ext/sgtelib/src/makefile b/ext/sgtelib/src/makefile deleted file mode 100644 index a27db39..0000000 --- a/ext/sgtelib/src/makefile +++ /dev/null @@ -1,97 +0,0 @@ -EXE = ../bin/sgtelib.exe -LIB_NAME = libsgtelib.so -LIB_DIR = ../lib -LIB = $(LIB_DIR)/$(LIB_NAME) -COMPILATOR = g++ -COMPILATOR_OPTIONS = -O3 -pedantic -Wall -Wextra -g3 -fpic - -LIB_CURRENT_VERSION= 1.0.0 - -LIBS = -lc -lm -LDLIB_EXE = -lsgtelib -LDFLAGS = -L$(LIB_DIR) - -UNAME := $(shell uname) - -BUILD_DIR = ../build - -ifeq ($(UNAME), Darwin) -SHARED_OPTIONS_LIB = -current_version $(LIB_CURRENT_VERSION) -compatibility_version $(LIB_CURRENT_VERSION) -install_name $(LIB_NAME) -headerpad_max_install_names -endif - -ifeq ($(UNAME), Linux) -SHARED_OPTIONS_EXE = -Wl,-rpath-link,'.' -Wl,-rpath,'$$ORIGIN/../lib' -COMPILATOR_OPTIONS+= -ansi -LIBS += -ldl -endif - -INCLUDE = -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -OBJS_LIB = TrainingSet.o Surrogate_Parameters.o Surrogate_KS.o Surrogate_RBF.o \ - Surrogate_PRS.o Surrogate_PRS_EDGE.o Surrogate_LOWESS.o Surrogate_Kriging.o\ - Surrogate_PRS_CAT.o Surrogate_Ensemble.o Surrogate_CN.o \ - Surrogate.o Matrix.o Kernel.o Surrogate_Utils.o Surrogate_Factory.o \ - Tests.o sgtelib_help.o -OBJS_MAIN = sgtelib.o - -OBJS_MAIN := $(addprefix $(BUILD_DIR)/,$(OBJS_MAIN)) -OBJS_LIB := $(addprefix $(BUILD_DIR)/,$(OBJS_LIB)) - -.SECONDARY: %.o - -all: $(OBJS_LIB) $(LIB) $(OBJS_MAIN) $(EXE) - -$(EXE): $(OBJS_MAIN) $(LIB) - @echo - @echo "== Making $@ ==" - $(call DisplayCommand,$(COMPILATOR) -o $@ $< $(LIBS) $(LDLIB_EXE) $(COMPILATOR_OPTIONS) $(LDFLAGS) $(SHARED_OPTIONS_EXE)) -ifeq ($(UNAME), Darwin) - @install_name_tool -change $(LIB_NAME) @loader_path/$(LIB) $@ -endif - @echo - -$(LIB): $(OBJS_LIB) - @echo - @echo "== Making $@ ==" - $(call DisplayCommand,$(COMPILATOR) -shared -o $@ $(OBJS_LIB) $(LIBS) $(COMPILATOR_OPTIONS) $(SHARED_OPTIONS_LIB)) - -$(BUILD_DIR)/%.o: %.cpp %.hpp - @mkdir -p $(BUILD_DIR) $(LIB_DIR) ../bin - $(call DisplayCommand,$(COMPILE) $< -o $@) - -$(BUILD_DIR)/%.o: %.cpp - @mkdir -p $(BUILD_DIR) $(LIB_DIR) ../bin - $(call DisplayCommand,$(COMPILE) $< -o $@) - -.PHONY : clean -clean: - @echo " --> cleaning obj files" - $(call DisplayCommand0,rm -f $(OBJS_LIB) $(OBJS_MAIN) ) - -.PHONY : del -del: - @echo " --> cleaning trash files" - $(call DisplayCommand0,rm -f core *~) - @echo " --> cleaning obj files" - $(call DisplayCommand0,rm -f $(OBJS_LIB) $(OBJS_MAIN) ) - @echo " --> cleaning exe file" - $(call DisplayCommand0,rm -f $(EXE)) - @echo " --> cleaning library file" - $(call DisplayCommand0,rm -f $(LIB)) - - -ifdef SHORT_DISPLAY -define DisplayCommand - @if $(1) ; then echo "---> $@ OK" ; else echo "compilation failed for $@" ; fi -endef -define DisplayCommand0 - @if $(1) ; then echo " ----> OK" ; else echo " ----> FAILED" ; fi -endef -else -define DisplayCommand - $(1) -endef -define DisplayCommand0 - $(1) -endef -endif diff --git a/ext/sgtelib/src/sgtelib.cpp b/ext/sgtelib/src/sgtelib.cpp deleted file mode 100644 index c9f5465..0000000 --- a/ext/sgtelib/src/sgtelib.cpp +++ /dev/null @@ -1,782 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ -#include "sgtelib.hpp" -#include "Surrogate_Factory.hpp" -#include "Surrogate_Utils.hpp" -#include <fstream> -#include <string> -using namespace SGTELIB; - -/*--------------------------------------*/ -/* main function */ -/*--------------------------------------*/ -int main ( int argc , char ** argv ) { - - int i,j,ikw; - bool error = false; - - //============================================ - // Check action - //============================================ - std::vector<std::string> keyword; - // Consider only the action keywords. - keyword.push_back("-predict"); - keyword.push_back("-help"); - keyword.push_back("-test"); - keyword.push_back("-server"); - keyword.push_back("-best"); - - // Check that exactly one action is required. - std::string action = "null"; - for (i=1 ; i<argc ; i++){ - for (j=0 ; j<static_cast<int>(keyword.size()) ; j++){ - //std::cout << argv[i] << " vs " << keyword.at(j) << "\n"; - if (streq(argv[i],keyword.at(j))){ - // action kw found. - if (streq(action,"null")){ - action = argv[i]; - } - else{ - std::cout << "Error! Two actions have been requested: \"" << action << "\" and \"" << argv[i] << "\".\n"; - std::cout << "You can only perform one action at a time.\n"; - error = true; - } - } - } - } - if (!strcmp(action.c_str(),"null")){ - std::cout << "Error! No action was found.\n"; - error = true; - } - - //============================================ - // Add other keywords. - //============================================ - keyword.push_back("-model"); - keyword.push_back("-verbose"); - const int NKW = static_cast<int>(keyword.size()); - // Create empty strings to store the information following each keyword. - std::vector<std::string> info; - for (i=0 ; i<NKW ; i++){ - info.push_back(""); - } - - //============================================ - // Parse - //============================================ - i = 1; - j = -1; - while (i<argc){ - // Check if the word is one of the keywords. - bool found_kw = false; - for (ikw=0 ; ikw<NKW ; ikw++){ - if (!strcmp( keyword.at(ikw).c_str(),argv[i] )){ - j = ikw; - found_kw = true; - //std::cout << "keyword: " <<keyword.at(ikw) << "\n"; - break; - } - } - if (j==-1){ - // If no kw was specified, break. - error = true; - break; - } - // Then continue ready the words for the current keyword. - info.at(j) += " "; - if ( ! found_kw) info.at(j) += std::string(argv[i]); - i++; - } - - //============================================ - // help - //============================================ - bool verbose=false; - for (i=0 ; i<NKW ; i++) { - if (!strcmp(keyword.at(i).c_str(),"-verbose")) break; - } - if (info.at(i).size()){ - std::cout << "verbose mode\n"; - verbose = true; - } - - - //============================================ - // Deblank - //============================================ - for (i=0 ; i<NKW ; i++) { - if (info.at(i).size()){ - info.at(i) = SGTELIB::deblank(info.at(i)); - } - } - - //============================================ - // Display error - //============================================ - if (error){ - // Display results - for (i=0 ; i<NKW ; i++) { - if (info.at(i).size()){ - std::cout << keyword.at(i) << " \"" << info.at(i) << "\"\n"; - } - } - std::cout << "Could not parse command.\n"; - } - - //============================================ - // Search for best model - //============================================ - if (!strcmp(action.c_str(),"-best")){ - for (i=0 ; i<NKW ; i++) { - if (!strcmp(keyword.at(i).c_str(),"-best")) break; - } - SGTELIB::sgtelib_best(info.at(i),verbose); - } - - - - //============================================ - // Get model name - //============================================ - std::string model; - for (i=0 ; i<NKW ; i++) { - if (!strcmp(keyword.at(i).c_str(),"-model")) break; - } - model = info.at(i); - if (!strcmp(model.c_str(),"")){ - model = "TYPE ENSEMBLE PRESET SUPER1 METRIC PRESS"; - } - - - //============================================ - // predict - //============================================ - if (!strcmp(action.c_str(),"-predict")){ - std::cout << "model: " << model << "\n"; - for (i=0 ; i<NKW ; i++) { - if (!strcmp(keyword.at(i).c_str(),"-predict")) break; - } - SGTELIB::sgtelib_predict(info.at(i),model); - } - - //============================================ - // help - //============================================ - if (!strcmp(action.c_str(),"-help") || error){ - std::string model; - for (i=0 ; i<NKW ; i++) { - if (!strcmp(keyword.at(i).c_str(),"-help")) break; - } - SGTELIB::sgtelib_help(info.at(i)); - } - - //============================================ - // server - //============================================ - if (!strcmp(action.c_str(),"-server")){ - std::cout << "model: " << model << "\n"; - SGTELIB::sgtelib_server(model,verbose); - } - - //============================================ - // test - //============================================ - if (!strcmp(action.c_str(),"-test")){ - SGTELIB::sgtelib_test(); - } - - //std::cout << "Quit sgtelib.\n"; - - return 0; -} - - - - - - - -/*--------------------------------------*/ -/* one prediction */ -/*--------------------------------------*/ -void SGTELIB::sgtelib_predict( const std::string & file_list , const std::string & model ){ - bool error = false; - std::string file; - SGTELIB::Matrix X,Z,XX,ZZ; - std::istringstream in_line (file_list); - if ( ( ! error) && (in_line >> file) && (SGTELIB::exists(file)) ){ - std::cout << "Read file " << file << "\n"; - X = SGTELIB::Matrix(file); - //X.display(std::cout); - } - else{ - std::cout << "Could not find " << file << "\n"; - error = true; - } - if ( ( ! error) && (in_line >> file) && (SGTELIB::exists(file)) ){ - std::cout << "Read file " << file << "\n"; - Z = SGTELIB::Matrix(file); - //Z.display(std::cout); - } - else{ - std::cout << "Could not find " << file << "\n"; - error = true; - } - if ( ( ! error) && (in_line >> file) && (SGTELIB::exists(file)) ){ - std::cout << "Read file " << file << "\n"; - XX = SGTELIB::Matrix(file); - //XX.display(std::cout); - } - else{ - std::cout << "Could not find " << file << "\n"; - error = true; - } - if ( ! (in_line >> file)){ - std::cout << "No zz file (display output in terminal)\n"; - file = "null"; - } - if ( ! error){ - SGTELIB::TrainingSet TS(X,Z); - SGTELIB::Surrogate * S = Surrogate_Factory(TS,model); - S->build(); - ZZ = SGTELIB::Matrix("ZZ",XX.get_nb_rows(),Z.get_nb_cols()); - S->predict(XX,&ZZ); - ZZ.set_name("ZZ"); - if (strcmp(file.c_str(),"null")){ - std::cout << "Write output matrix in " << file << "\n"; - ZZ.write(file); - } - else{ - ZZ.display(std::cout); - } - - } - if (error){ - sgtelib_help(); - } -}// - - - - - - -/*--------------------------------------*/ -/* find best model for a set of data */ -/*--------------------------------------*/ -void SGTELIB::sgtelib_best( const std::string & file_list , const bool verbose){ - bool error = false; - std::string file; - SGTELIB::Matrix X,Z; - std::istringstream in_line (file_list); - if ( ( ! error) && (in_line >> file) && (SGTELIB::exists(file)) ){ - std::cout << "Read file " << file << "\n"; - X = SGTELIB::Matrix(file); - } - else{ - std::cout << "Could not find " << file << "\n"; - error = true; - } - if ( ( ! error) && (in_line >> file) && (SGTELIB::exists(file)) ){ - std::cout << "Read file " << file << "\n"; - Z = SGTELIB::Matrix(file); - } - else{ - std::cout << "Could not find " << file << "\n"; - error = true; - } - if (error){ - sgtelib_help(); - return; - } - - - std::string m; - double v; - - SGTELIB::TrainingSet TS(X,Z); - for (int i=0 ; i<2 ; i++){ - std::cout << "=============================================================\n"; - if (i==0){ - std::cout << "Test models for optimization...\n"; - m = "AOECV"; - } - else{ - std::cout << "Test models for prediction...\n"; - m = "ARMSECV"; - } - std::cout << "=============================================================\n"; - - std::vector<std::string> model_list; - model_list.push_back("TYPE PRS DEGREE OPTIM RIDGE OPTIM"); - model_list.push_back("TYPE KS KERNEL_SHAPE OPTIM KERNEL_TYPE OPTIM DISTANCE OPTIM"); - model_list.push_back("TYPE RBF PRESET O KERNEL_SHAPE OPTIM KERNEL_TYPE OPTIM DISTANCE OPTIM"); - model_list.push_back("TYPE RBF PRESET R KERNEL_SHAPE OPTIM KERNEL_TYPE OPTIM DISTANCE OPTIM RIDGE OPTIM"); - model_list.push_back("TYPE RBF PRESET I KERNEL_SHAPE OPTIM KERNEL_TYPE OPTIM DISTANCE OPTIM RIDGE OPTIM"); - model_list.push_back("TYPE LOWESS DEGREE OPTIM KERNEL_SHAPE OPTIM KERNEL_TYPE OPTIM DISTANCE OPTIM RIDGE OPTIM"); - model_list.push_back("TYPE KRIGING"); - model_list.push_back("TYPE CN"); - std::vector<double> model_metric; - - double vmin = +INF; - std::cout << "Testing "; - if (verbose) std::cout << "...\n"; - for (std::vector<std::string>::iterator it_model = model_list.begin() ; it_model != model_list.end(); ++it_model){ - std::string model_def = *it_model+" METRIC "+m+" BUDGET 500"; - SGTELIB::Surrogate * S = Surrogate_Factory(TS,model_def); - if (verbose) std::cout << *it_model << "\n"; - else std::cout << model_type_to_str(S->get_type()) << " "; - S->build(); - if (S->is_ready()){ - v = S->get_metric(SGTELIB::str_to_metric_type(m),0); - model_metric.push_back(v); - vmin = std::min(v,vmin); - if (verbose) std::cout << "===> " << v << "\n"; - } - else{ - model_metric.push_back(+INF); - if (verbose) std::cout << "===> no ready\n"; - } - // Store model definition after parameter optimization - *it_model = S->get_string(); - // Delete model - SGTELIB::surrogate_delete(S); - } - std::cout << "\n"; - std::cout << "Best metric: " << m << " = " << vmin << "\n"; - std::cout << "Best model(s):\n "; - for (int k=0 ; k<int(model_list.size()) ; k++){ - if (model_metric.at(k)<=vmin+EPSILON){ - std::cout << model_list.at(k) << "\n"; - } - } - - } - std::cout << "=============================================================\n"; - - -}// - - -/*--------------------------------------*/ -/* sgtelib server */ -/*--------------------------------------*/ -void SGTELIB::sgtelib_server( const std::string & model , const bool verbose ){ - - SGTELIB::TrainingSet * TS = NULL; - SGTELIB::Surrogate * S = NULL; - SGTELIB::Matrix X, Z, std, ei, cdf; - std::string dummy_str; - - std::cout << "========== SERVER ==========================\n"; - - - std::cout << "Start server\n"; - std::cout << "Remove all flag files...\n"; - dummy_str = system("rm flag_* 2>/dev/null"); - std::cout << "Ok.\n"; - - int dummy_k = 0; - int pxx = 0; - int m = 0; - const bool display = verbose; - - std::ofstream out; - std::ifstream in; - - while (true){ - - SGTELIB::wait(0.01); - - if (SGTELIB::exists("flag_new_data_transmit")){ - //------------------------------ - // NEW DATA - //------------------------------ - std::cout << "============flag: new_data===================\n"; - dummy_k = 0; - dummy_str = system("mv flag_new_data_transmit flag_new_data_received"); - if (display) std::cout << "Read new data"; - X = SGTELIB::Matrix("new_data_x.txt"); - Z = SGTELIB::Matrix("new_data_z.txt"); - if (display) X.display_short(std::cout); - if (display) Z.display_short(std::cout); - std::cout << X.get_nb_rows() << " new data points...\n"; - - if ( ! S){ - if (display) std::cout << "First data: Build Trainig Set & Model\n"; - TS = new SGTELIB::TrainingSet(X,Z); - S = Surrogate_Factory(*TS,model); - m = TS->get_output_dim(); - dummy_str = system("rm -f flag_not_ready"); - } - else{ - if (display) std::cout << "Add points to TS\n"; - TS->add_points(X,Z); - } - dummy_str = system("rm new_data_x.txt new_data_z.txt"); - if (display) std::cout << "Waiting...\n"; - - } - else if (SGTELIB::exists("flag_predict_transmit")){ - //------------------------------ - // PREDICT - //------------------------------ - std::cout << "============flag: predict==================" << dummy_k++ << "\n"; - dummy_str = system("mv flag_predict_transmit flag_predict_received"); - - bool ready = false; - if (S){ - if (display) std::cout << "Build Sgte (" << TS->get_nb_points() << " pts)\n"; - ready = S->build(); - if (display) S->display(std::cout); - } - - // Read input matrix - if (display) std::cout << "Read matrix... "; - X = SGTELIB::Matrix("flag_predict_received"); - pxx = X.get_nb_rows(); - Z = SGTELIB::Matrix("ZZ",pxx,m); - std = SGTELIB::Matrix("std",pxx,m); - ei = SGTELIB::Matrix("ei",pxx,m); - cdf = SGTELIB::Matrix("cdf",pxx,m); - if (ready){ - // Do prediction - if (display) std::cout << "Predict... "; - S->predict(X,&Z,&std,&ei,&cdf); - //S->predict(X,&Z,NULL,NULL,NULL); - if (display) X.display_short(std::cout); - if (display) Z.display_short(std::cout); - } - else{ - if (display) std::cout << "Surrogate not ready\n"; - dummy_str = system("touch flag_not_ready"); - Z.fill(+SGTELIB::INF); - } - - // Open stream and write matrices - if (display) std::cout << "Write output.\n"; - out.open ("flag_predict_received"); - { - // Correct matrix names - Z.set_name("Z"); - std.set_name("std"); - ei.set_name("ei"); - cdf.set_name("cdf"); - // Write matrices - Z.display(out); - std.display(out); - ei.display(out); - cdf.display(out); - } - out.close(); - - // Change flag - dummy_str = system("mv flag_predict_received flag_predict_finished"); - if (display) std::cout << "Waiting...\n"; - - } - else if (SGTELIB::exists("flag_cv_transmit")){ - //------------------------------ - // CV values - //------------------------------ - std::cout << "============flag: cv values==================" << dummy_k++ << "\n"; - dummy_str = system("mv flag_cv_transmit flag_cv_received"); - - bool ready = false; - if (S) ready = S->build(); - if ( ! ready){ - if (display) std::cout << "Surrogate not ready\n"; - dummy_str = system("touch flag_not_ready"); - } - else{ - S->display(std::cout); - } - - SGTELIB::Matrix Zh, Sh, Zv, Sv; - if (ready){ - Zh = S->get_matrix_Zh(); - Sh = S->get_matrix_Sh(); - Zv = S->get_matrix_Zv(); - Sv = S->get_matrix_Sv(); - } - else{ - if (display) std::cout << "Surrogate not ready\n"; - dummy_str = system("touch flag_not_ready"); - } - - // Open stream and write matrices - if (display) std::cout << "Write output.\n"; - out.open ("flag_cv_received"); - { - // Correct matrix names - Zh.set_name("Zh"); - Sh.set_name("Sh"); - Zv.set_name("Zv"); - Sv.set_name("Sv"); - // Write matrices - Zh.display(out); - Sh.display(out); - Zv.display(out); - Sv.display(out); - } - out.close(); - - // Change flag - dummy_str = system("mv flag_cv_received flag_cv_finished"); - if (display) std::cout << "Waiting...\n"; - - } - else if (SGTELIB::exists("flag_metric_transmit")){ - //------------------------------ - // METRIC - //------------------------------ - - std::cout << "============flag: metric===================" << dummy_k++ << "\n"; - dummy_str = system("mv flag_metric_transmit flag_metric_received"); - - bool ready = false; - if (S) ready = S->build(); - if ( ! ready){ - if (display) std::cout << "Surrogate not ready\n"; - dummy_str = system("touch flag_not_ready"); - } - - - std::string metric_string; - SGTELIB::metric_t mt; - double metric_value; - - // Read metric_string - in.open("flag_metric_received"); - in >> metric_string; - in.close(); - if (display) std::cout << "metric : " << metric_string << "\n"; - mt = SGTELIB::str_to_metric_type(metric_string); - - // Open stream and write metric - if (display) std::cout << "Write output.\n"; - out.open ("flag_metric_received"); - if (ready){ - for (int j=0 ; j<TS->get_output_dim() ; j++){ - metric_value = S->get_metric(mt,j); - out << metric_value << " "; - if (display){ - std::cout << "output[" << j << "]: " << metric_value << "\n"; - } - } - } - else{ - out << -1; - } - out.close(); - - // Change flag - dummy_str = system("mv flag_metric_received flag_metric_finished"); - if (display) std::cout << "Waiting...\n"; - - } - else if (SGTELIB::exists("flag_info_transmit")){ - //------------------------------ - // INFO - //------------------------------ - - std::cout << "============flag: info===================" << dummy_k++ << "\n"; - dummy_str = system("mv flag_info_transmit flag_info_received"); - - bool ready = false; - if (S) ready = S->build(); - if ( ! ready){ - if (display) std::cout << "Surrogate not ready\n"; - dummy_str = system("touch flag_not_ready"); - } - - // Open stream and write metric - if (ready) S->display(std::cout); - else std::cout << "Not ready."; - // Change flag - dummy_str = system("mv flag_info_received flag_info_finished"); - if (display) std::cout << "Waiting...\n"; - - } - else if (SGTELIB::exists("flag_reset_transmit")){ - //------------------------------ - // RESET - //------------------------------ - - std::cout << "============flag: reset======================" << "\n"; - dummy_str = system("mv flag_reset_transmit flag_reset_received"); - - surrogate_delete(S); - delete TS; - TS = NULL; - S = NULL; - - if (display) std::cout << "Pointers: S=" << S << ", TS=" << TS << "\n"; - - // Change flag - dummy_str = system("mv flag_reset_received flag_reset_finished"); - if (display) std::cout << "Waiting...\n"; - - } - else if (SGTELIB::exists("flag_ping")){ - //------------------------------ - // PING - //------------------------------ - if (display) std::cout << "ping "; - // Write state in the ping file - - bool ready = false; - if (S){ - if (display) std::cout << "Build Sgte (" << TS->get_nb_points() << " pts)\n"; - ready = S->build(); - } - if (ready){ - std::cout << "pong: Model is ready.\n"; - dummy_str = system("echo 1 >> flag_ping"); - } - else{ - std::cout << "pong: Model is not ready.\n"; - dummy_str = system("echo 0 >> flag_ping"); - } - // Send an answer! - dummy_str = system("mv flag_ping flag_pong"); - } - else if (SGTELIB::exists("flag_quit")){ - //------------------------------ - // QUIT - //------------------------------ - surrogate_delete(S); - delete TS; - dummy_str = system("rm flag_quit"); - std::cout << "flag: quit\n"; - break; - } - - } - - std::cout << "Remove all flag files..."; - dummy_str = system("rm flag_* 2>/dev/null"); - std::cout << "Ok.\n"; - - std::cout << "Quit server\n"; - -}// - - - - - -/*--------------------------------------*/ -/* help */ -/*--------------------------------------*/ -void SGTELIB::sgtelib_help( std::string word ){ - - int i,j; - if (!strcmp(word.c_str(),"")) word = "GENERAL"; - //std::cout << "HELP about " << word << "\n"; - - std::string ** DATA = SGTELIB::get_help_data(); - const int NL = SGTELIB::dim_help_data(); - bool failedsearch = true; - bool found = false; - - for (j=0 ; j<3 ; j++){ - // j=0 => search in title - // j=1 => search in associated keywords - // j=2 => search in content - for (i=0 ; i<NL ; i++){ - if ( (SGTELIB::string_find(DATA[i][j],word)) || (streqi(word,"ALL")) ){ - //std::cout << i << " " << j << " " << (SGTELIB::string_find(DATA[i][j],word)) << " " << word << " " << DATA[i][j] << "\n"; - std::cout << "===============================================\n\n"; - std::cout << " \33[4m" << DATA[i][0] << "\33[0m" << "\n\n"; - //std::cout << " *** " << DATA[i][0] << " *** " << "\n\n"; - std::cout << DATA[i][2] << "\n\n"; - found = true; - failedsearch = false; - } - } - // If some data where found for this value of j (i.e. for this depth of search) - // then we don't search for higher j. - if (found) break; - } - - // Search if the word appears in the keywords of some datum. - std::string SeeAlso = "\33[4mSee also\33[0m:"; - found = false; - for (i=0 ; i<NL ; i++){ - if ( SGTELIB::string_find(DATA[i][1],word) ){ - SeeAlso+=" "+DATA[i][0]; - found = true; - } - } - if (found){ - std::cout << "=======================================\n"; - std::cout << "\n" << SeeAlso << "\n\n"; - std::cout << "=======================================\n"; - } - - if (failedsearch){ - std::cout << "We could not find any information associated to your search.\n"; - SGTELIB::sgtelib_help("MAIN"); - } - - -}// - - - - - - -/*--------------------------------------*/ -/* test */ -/*--------------------------------------*/ -void SGTELIB::sgtelib_test( void ){ - - SGTELIB::sand_box(); - - SGTELIB::Matrix X0; - SGTELIB::Matrix Z0; - - std::cout << "========== TEST MANY MODELS ==========================\n"; - - SGTELIB::build_test_data("hartman6",X0,Z0); - SGTELIB::test_many_models("output_hartman6.txt",X0,Z0); - - SGTELIB::build_test_data("hartman3",X0,Z0); - SGTELIB::test_many_models("output_hartman3.txt",X0,Z0); - - SGTELIB::build_test_data("braninhoo",X0,Z0); - SGTELIB::test_many_models("output_braninhoo.txt",X0,Z0); - - SGTELIB::build_test_data("camelback",X0,Z0); - SGTELIB::test_many_models("output_camelback.txt",X0,Z0); - - SGTELIB::build_test_data("rosenbrock",X0,Z0); - SGTELIB::test_many_models("output_rosenbrock.txt",X0,Z0); - - - std::cout << "========== END ================================\n"; -}// diff --git a/ext/sgtelib/src/sgtelib.hpp b/ext/sgtelib/src/sgtelib.hpp deleted file mode 100644 index a14fa27..0000000 --- a/ext/sgtelib/src/sgtelib.hpp +++ /dev/null @@ -1,46 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -// SGTELIB 2014-02-07 - -#ifndef __SGTELIB__ -#define __SGTELIB__ - -#include "Surrogate_Factory.hpp" -#include "Tests.hpp" -#include "Matrix.hpp" -#include "Defines.hpp" -#include "Surrogate_Utils.hpp" -#include "sgtelib_help.hpp" - -namespace SGTELIB { - void sgtelib_server ( const std::string & model , const bool verbose ); - void sgtelib_predict ( const std::string & file_list , const std::string & model ); - void sgtelib_best ( const std::string & file_list , const bool verbose ); - void sgtelib_help ( std::string word="GENERAL" ); - void sgtelib_test ( void ); -} - -#endif diff --git a/ext/sgtelib/src/sgtelib_help.cpp b/ext/sgtelib/src/sgtelib_help.cpp deleted file mode 100644 index 5331a7c..0000000 --- a/ext/sgtelib/src/sgtelib_help.cpp +++ /dev/null @@ -1,516 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - - -#include "sgtelib_help.hpp" - - -//================================ -// Get dimension of HELP_DATA -//================================ -int SGTELIB::dim_help_data (void){ - return 32; -}// - -//================================ -// Construct the help data -//================================ -std::string ** SGTELIB::get_help_data (void){ - int i; - const int NL = 32; - const int NC = 3; - std::string ** HELP_DATA = new std::string * [NL]; - for (i = 0 ; i<NL ; i++) HELP_DATA[i] = new std::string [NC]; - i = 0; - //================================ - // GENERAL - //================================ - HELP_DATA[i][0] = "GENERAL"; - HELP_DATA[i][1] = "GENERAL MAIN SGTELIB HELP"; - HELP_DATA[i][2] = "sgtelib is a dynamic surrogate modeling library. Given a set of data points [X,z(X)], it allows to estimate the value of z(x) for any x.\n" -" \n" -"sgtelib can be called in 5 modes \n" -" * -predict: build a model on a set of data points and perform a prediction on a set of prediction points. See PREDICT for more information. This requires the definition of a model with the option -model, see MODEL.\n" -" sgtelib.exe -model <model description> -predict <input/output files>\n" -" sgtelib.exe -model TYPE PRS DEGREE 2 -predict x.txt z.txt xx.txt zz.txt\n" -" \n" -" * -server: starts a server that can be interrogated to perform predictions or compute the error metric of a model. The server should be used via the Matlab interface (see SERVER). This requires the definition of a model with the option -model, see MODEL. \n" -" sgtelib.exe -server -model <model description>\n" -" sgtelib.exe -server -model TYPE LOWESS SHAPE_COEF OPTIM\n" -" \n" -" * -best: returns the best type of model for a set of data points\n" -" sgtelib.exe -best <x file name> <z file name>\n" -" sgtelib.exe -best x.txt z.txt\n" -" \n" -" * -help: allows to ask for some information about some keyword.\n" -" sgtelib.exe -help keyword\n" -" sgtelib.exe -help DEGREE\n" -" sgtelib.exe -help LOWESS\n" -" sgtelib.exe -help\n" -" \n" -" * -test: runs a test of the sgtelib library.\n" -" sgtelib.exe -test\n" -" "; - i++; - //================================ - // PREDICT - //================================ - HELP_DATA[i][0] = "PREDICT"; - HELP_DATA[i][1] = "PREDICT PREDICTION INLINE SGTELIB"; - HELP_DATA[i][2] = "Performs a prediction in command line on a set of data provided through text files. If no ZZ file is provided, the predictions are displayed in the terminal. If no model is provided, the default model is used.\n" -" \n" -"Example\n" -" sgtelib.exe -predict <x file name> <z file name> <xx file name>\n" -" sgtelib.exe -predict x.txt z.txt xx.txt -model TYPE PRS DEGREE 2\n" -" sgtelib.exe -predict x.txt z.txt xx.txt zz.txt"; - i++; - //================================ - // BEST - //================================ - HELP_DATA[i][0] = "BEST"; - HELP_DATA[i][1] = "GENERAL BEST SGTELIB"; - HELP_DATA[i][2] = "Displays the description of the model that best fit the data provided in text files.\n" -" \n" -"Example\n" -" sgtelib.exe -best x_file.txt z.file.txt "; - i++; - //================================ - // SERVER - //================================ - HELP_DATA[i][0] = "SERVER"; - HELP_DATA[i][1] = "SERVER MATLAB SGTELIB"; - HELP_DATA[i][2] = "Starts a sgtelib server. See MATLAB_SERVER for more details.\n" -" \n" -"Example\n" -" sgtelib.exe -server -model TYPE LOWESS DEGREE 1 KERNEL_SHAPE OPTIM"; - i++; - //================================ - // MODEL - //================================ - HELP_DATA[i][0] = "MODEL"; - HELP_DATA[i][1] = "MODEL FIELD DESCRIPTION MODEL_DESCRIPTION DEFINITION MODEL_DEFINITION TYPE"; - HELP_DATA[i][2] = "Models in sgtelib are defined by using a succession of field names (see FIELD for the list of possible fields) and field values. Each field name is made of one single word. Each field value is made of one single word or numerical value. It is good practice to start by the field name TYPE, followed by the model type. \n" -" \n" -"Possible field names \n" -" * TYPE: mandatory field that specifies the type of model \n" -" * DEGREE: degree of the model for PRS and LOWESS models \n" -" * RIDGE: regularization parameter for PRS, RBF and LOWESS models \n" -" * KERNEL_TYPE: Kernel function for RBF, KS, LOWESS and KRIGING models \n" -" * KERNEL_SHAPE: Shape coefficient for RBF, KS and LOWESS models \n" -" * METRIC_TYPE: Error metric used as criteria for model parameter optimization/selection \n" -" * DISTANCE_TYPE: Metric used to compute the distance between points \n" -" * PRESET: Special information for some types of model \n" -" * WEIGHT_TYPE: Defines how the weights of Ensemble of model are computed \n" -" * BUDGET: Defines the parameter optimization budget \n" -" * OUTPUT: Defines the output text file "; - i++; - //================================ - // FIELD - //================================ - HELP_DATA[i][0] = "FIELD"; - HELP_DATA[i][1] = "FIELD NAME FIELD_NAME MODEL DEFINITION DESCRIPTION"; - HELP_DATA[i][2] = "A model description is composed of field names and field values.\n" -" \n" -"Example\n" -" TYPE <model type> FIELD1 <field 1 value> FIELD2 <field 2 value>"; - i++; - //================================ - // PRS - //================================ - HELP_DATA[i][0] = "PRS"; - HELP_DATA[i][1] = "TYPE POLYNOMIAL RESPONSE SURFACE QUADRATIC"; - HELP_DATA[i][2] = "PRS (Polynomial Response Surface) is a type of model. \n" -" \n" -"Authorized fields for this type of model \n" -" * DEGREE (Can be optimized) \n" -" * RIDGE (Can be optimized) \n" -" \n" -"Example\n" -" TYPE PRS DEGREE 2\n" -" TYPE PRS DEGREE OPTIM RIDGE OPTIM"; - i++; - //================================ - // PRS_EDGE - //================================ - HELP_DATA[i][0] = "PRS_EDGE"; - HELP_DATA[i][1] = "TYPE POLYNOMIAL RESPONSE SURFACE QUADRATIC DISCONTINUITY DISCONTINUITIES EDGE"; - HELP_DATA[i][2] = "PRS_EDGE (Polynomial Response Surface EDGE) is a type of model that allows to model discontinuities at 0 by using additional basis functions. \n" -" \n" -"Authorized fields for this type of model \n" -" * DEGREE (Can be optimized) \n" -" * RIDGE (Can be optimized) \n" -" \n" -"Example\n" -" TYPE PRS_EDGE DEGREE 2\n" -" TYPE PRS_EDGE DEGREE OPTIM RIDGE OPTIM"; - i++; - //================================ - // PRS_CAT - //================================ - HELP_DATA[i][0] = "PRS_CAT"; - HELP_DATA[i][1] = "TYPE POLYNOMIAL RESPONSE SURFACE QUADRATIC DISCONTINUITY DISCONTINUITIES"; - HELP_DATA[i][2] = "PRS_CAT (Categorical Polynomial Response Surface) is a type of model that allows to build one PRS model for each different value of the first component of x. \n" -" \n" -"Authorized fields for this type of model \n" -" * DEGREE (Can be optimized) \n" -" * RIDGE (Can be optimized) \n" -" \n" -"Example\n" -" TYPE PRS_CAT DEGREE 2\n" -" TYPE PRS_CAT DEGREE OPTIM RIDGE OPTIM"; - i++; - //================================ - // RBF - //================================ - HELP_DATA[i][0] = "RBF"; - HELP_DATA[i][1] = "TYPE RADIAL BASIS FUNCTION KERNEL"; - HELP_DATA[i][2] = "RBF (Radial Basis Function) is a type of model. \n" -" \n" -"Authorized fields for this type of model \n" -" * KERNEL_TYPE (Can be optimized) \n" -" * KERNEL_COEF (Can be optimized) \n" -" * DISTANCE_TYPE (Can be optimized) \n" -" * RIDGE (Can be optimized) \n" -" * PRESET: \"O\" for RBF with linear terms and orthogonal constraints, \"R\" for RBF with linear terms and regularization term, \"I\" for RBF with incomplete set of basis functions. This parameter cannot be optimized. \n" -" \n" -"Example\n" -" TYPE RBF KERNEL_TYPE D1 KERNEL_SHAPE OPTIM DISTANCE_TYPE NORM2"; - i++; - //================================ - // KS - //================================ - HELP_DATA[i][0] = "KS"; - HELP_DATA[i][1] = "TYPE KERNEL SMOOTHING SMOOTHING_KERNEL"; - HELP_DATA[i][2] = "KS (Kernel Smoothing) is a type of model. \n" -" \n" -"Authorized fields for this type of model \n" -" * KERNEL_TYPE (Can be optimized) \n" -" * KERNEL_COEF (Can be optimized) \n" -" * DISTANCE_TYPE (Can be optimized) \n" -" \n" -"Example\n" -" TYPE KS KERNEL_TYPE OPTIM KERNEL_SHAPE OPTIM"; - i++; - //================================ - // KRIGING - //================================ - HELP_DATA[i][0] = "KRIGING"; - HELP_DATA[i][1] = "TYPE GAUSSIAN PROCESS GP COVARIANCE"; - HELP_DATA[i][2] = "KRIGING is a type of model. \n" -" \n" -"Authorized fields for this type of model \n" -" * RIDGE (Can be optimized) \n" -" * DISTANCE_TYPE (Can be optimized) \n" -" \n" -"Example\n" -" TYPE KRIGING"; - i++; - //================================ - // LOWESS - //================================ - HELP_DATA[i][0] = "LOWESS"; - HELP_DATA[i][1] = "TYPE LOCALLY WEIGHTED REGRESSION LOWESS LOWER RIDGE DEGREE KERNEL"; - HELP_DATA[i][2] = "LOWESS (Locally Weighted Regression) is a type of model. \n" -" \n" -"Authorized fields for this type of model \n" -" * DEGREE: Must be 1 (default) or 2 (Can be optimized). \n" -" * RIDGE (Can be optimized) \n" -" * KERNEL_TYPE (Can be optimized) \n" -" * KERNEL_COEF (Can be optimized) \n" -" * DISTANCE_TYPE (Can be optimized) \n" -" \n" -"Example\n" -" TYPE LOWESS DEGREE 1 TYPE LOWESS DEGREE OPTIM KERNEL_SHAPE OPTIM KERNEL_TYPE D1 TYPE LOWESS DEGREE OPTIM KERNEL_SHAPE OPTIM KERNEL_TYPE OPTIM DISTANCE_TYPE OPTIM"; - i++; - //================================ - // ENSEMBLE - //================================ - HELP_DATA[i][0] = "ENSEMBLE"; - HELP_DATA[i][1] = "TYPE WEIGHT SELECT SELECTION"; - HELP_DATA[i][2] = "ENSEMBLE is a type of model. \n" -" \n" -"Authorized fields for this type of model \n" -" * WEIGHT: Defines how the ensemble weights are computed. \n" -" * METRIC: Defines which metric is used to compute the weights. \n" -" \n" -"Example\n" -" TYPE ENSEMBLE WEIGHT SELECT METRIC OECV TYPE ENSEMBLE WEIGHT OPTIM METRIC RMSECV DISTANCE_TYPE NORM2 BUDGET 100"; - i++; - //================================ - // TYPE - //================================ - HELP_DATA[i][0] = "TYPE"; - HELP_DATA[i][1] = "MODEL DESCRIPTION DEFINITION TYPE PRS KS PRS_EDGE PRS_CAT RBF LOWESS ENSEMBLE KRIGING CN"; - HELP_DATA[i][2] = "The field name TYPE defines which type of model is used.\n" -" \n" -"Possible model type \n" -" * PRS: Polynomial Response Surface \n" -" * KS: Kernel Smoothing \n" -" * PRS_EDGE: PRS EDGE model \n" -" * PRS_CAT: PRS CAT model \n" -" * RBF: Radial Basis Function Model \n" -" * LOWESS: Locally Weighted Regression \n" -" * ENSEMBLE: Ensemble of surrogates \n" -" * KRIGING: Kriging model \n" -" * CN: Closest neighbor \n" -" \n" -"Example\n" -" TYPE PRS: defines a PRS model.\n" -" TYPE ENSEMBLE: defines an ensemble of models."; - i++; - //================================ - // DEGREE - //================================ - HELP_DATA[i][0] = "DEGREE"; - HELP_DATA[i][1] = "PRS LOWESS PRS_CAT PRS_EDGE"; - HELP_DATA[i][2] = "The field name DEGREE defines the degree of a polynomial response surface. The value must be an integer ge 1. \n" -"Allowed for models of type PRS, PRS_EDGE, PRS_CAT, LOWESS. \n" -"Default values \n" -" * For PRS models, the default degree is 2. \n" -" * For LOWESS models, the degree must be 1 (default) or 2. \n" -" \n" -"Example\n" -" TYPE PRS DEGREE 3 defines a PRS model of degree 3.\n" -" TYPE PRS_EDGE DEGREE 2 defines a PRS_EDGE model of degree 2.\n" -" TYPE LOWESS DEGREE OPTIM defines a LOWESS model where the degree is optimized."; - i++; - //================================ - // RIDGE - //================================ - HELP_DATA[i][0] = "RIDGE"; - HELP_DATA[i][1] = "PRS LOWESS PRS_CAT PRS_EDGE RBF"; - HELP_DATA[i][2] = "The field name RIDGE defines the regularization parameter of the model. \n" -"Allowed for models of type PRS, PRS_EDGE, PRS_CAT, LOWESS, RBF. \n" -"Possible values Real value ge 0. Recommended values are 0 and 0.001. \n" -"Default values Default value is 0.01. \n" -"Example\n" -" TYPE PRS DEGREE 3 RIDGE 0 defines a PRS model of degree 3 with no ridge.\n" -" TYPE PRS DEGREE OPTIM RIDGE OPTIM defines a PRS model where the degree and ridge coefficient are optimized."; - i++; - //================================ - // KERNEL_TYPE - //================================ - HELP_DATA[i][0] = "KERNEL_TYPE"; - HELP_DATA[i][1] = "KS RBF LOWESS GAUSSIAN BI-QUADRATIC BIQUADRATIC TRICUBIC TRI-CUBIC INVERSE SPLINES POLYHARMONIC"; - HELP_DATA[i][2] = "The field name KERNEL_TYPE defines the type of kernel used in the model. The field name KERNEL is equivalent. \n" -"Allowed for models of type RBF, RBFI, Kriging, LOWESS and KS. \n" -"Possible values \n" -" * D1: Gaussian kernel (default) \n" -" * D2: Inverse Quadratic Kernel \n" -" * D3: Inverse Multiquadratic Kernel \n" -" * D4: Bi-quadratic Kernel \n" -" * D5: Tri-cubic Kernel \n" -" * D6: Exponential Sqrt Kernel \n" -" * D7: Epanechnikov Kernel \n" -" * I0: Multiquadratic Kernel \n" -" * I1: Polyharmonic splines, degree 1 \n" -" * I2: Polyharmonic splines, degree 2 \n" -" * I3: Polyharmonic splines, degree 3 \n" -" * I4: Polyharmonic splines, degree 4 \n" -" * OPTIM: The type of kernel is optimized \n" -" \n" -"Example\n" -" TYPE KS KERNEL_TYPE D2 defines a KS model with Inverse Quadratic Kernel\n" -" TYPE KS KERNEL_TYPE OPTIM KERNEL_SHAPE OPTIM defines a KS model with optimized kernel shape and type"; - i++; - //================================ - // KERNEL_COEF - //================================ - HELP_DATA[i][0] = "KERNEL_COEF"; - HELP_DATA[i][1] = "KS RBF LOWESS"; - HELP_DATA[i][2] = "The field name KERNEL_COEF defines the shape coefficient of the kernel function. Note that this field name has no impact for KERNEL_TYPES I1, I2, I3 and I4 because these kernels do not include a shape parameter. \n" -"Allowed for models of type RBF, KS, KRIGING, LOWESS. \n" -"Possible values Real value ge 0. Recommended range is [0.1 , 10]. For KS and LOWESS model, small values lead to smoother models. \n" -"Default values By default, the kernel coefficient is optimized. \n" -"Example\n" -" TYPE RBF KERNEL_COEF 10 defines a RBF model with a shape coefficient of 10.\n" -" TYPE KS KERNEL_TYPE OPTIM KERNEL_SHAPE OPTIM defines a KS model with optimized kernel shape and type"; - i++; - //================================ - // DISTANCE_TYPE - //================================ - HELP_DATA[i][0] = "DISTANCE_TYPE"; - HELP_DATA[i][1] = "KS RBF CN LOWESS"; - HELP_DATA[i][2] = "The field name DISTANCE_TYPE defines the distance function used in the model. \n" -"Allowed for models of type RBF, RBF, KS, LOWESS. \n" -"Possible values \n" -" * NORM1: Euclidian distance \n" -" * NORM2: Distance based on norm 1 \n" -" * NORMINF: Distance based on norm infty \n" -" * NORM2_IS0: Tailored distance for discontinuity in 0. \n" -" * NORM2_CAT: Tailored distance for categorical models. \n" -" \n" -"Default values Default value is NORM2. \n" -"Example\n" -" TYPE KS DISTANCE NORM2_IS0 defines a KS model tailored for VAN optimization."; - i++; - //================================ - // WEIGHT - //================================ - HELP_DATA[i][0] = "WEIGHT"; - HELP_DATA[i][1] = "ENSEMBLE SELECTION WTA1 WTA2 WTA3 WTA4 WTA"; - HELP_DATA[i][2] = "The field name WEIGHT defines the method used to compute the weights w of the ensemble of models. The keyword WEIGHT_TYPE is equivalent. Allowed for models of type ENSEMBLE.\n" -" \n" -"Allowed for models of type ENSEMBLE. \n" -" \n" -"Possible values \n" -" * WTA1: w_k propto metric_sum - metric_k (default) \n" -" * WTA3: w_k propto (metric_k + alpha metric_mean)^beta \n" -" * SELECT: w_k propto 1 textif metric_k = metric_min \n" -" * OPTIM: w minimizes metric(w) \n" -" \n" -"Example\n" -" TYPE ENSEMBLE WEIGHT SELECT METRIC RMSECV defines an ensemble of models which selects the model that has the best RMSECV.\n" -" TYPE ENSEMBLE WEIGHT OPTIM METRIC RMSECV defines an ensemble of models where the weights w are computed to minimize the RMSECV of the model."; - i++; - //================================ - // OUTPUT - //================================ - HELP_DATA[i][0] = "OUTPUT"; - HELP_DATA[i][1] = "OUT DISPLAY"; - HELP_DATA[i][2] = "Defines a text file in which informations will be recorded."; - i++; - //================================ - // OPTIM - //================================ - HELP_DATA[i][0] = "OPTIM"; - HELP_DATA[i][1] = "OPTIM BUDGET PARAMETERS PARAMETER OPTIMIZATION"; - HELP_DATA[i][2] = "The field value OPTIM indicate that the model parameter must be optimized. The default optimization criteria is the AOECV error metric.\n" -" \n" -"Parameters that can be optimized \n" -" * DEGREE \n" -" * RIDGE \n" -" * KERNEL_TYPE \n" -" * KERNEL_COEF \n" -" * DISTANCE_TYPE \n" -" \n" -"Example\n" -" TYPE PRS DEGREE OPTIM\n" -" TYPE LOWESS DEGREE OPTIM KERNEL_TYPE OPTIM KERNEL_SHAPE OPTIM METRIC ARMSECV"; - i++; - //================================ - // METRIC - //================================ - HELP_DATA[i][0] = "METRIC"; - HELP_DATA[i][1] = "PARAMETER OPTIMIZATION CHOICE SELECTION OPTIM BUDGET ENSEMBLE"; - HELP_DATA[i][2] = "The field name METRIC defines the metric used to select the parameters of the model (including the weights of Ensemble models).\n" -" \n" -"Allowed for models of type All types of model.\n" -" \n" -"Possible values \n" -" * EMAX: Error Max \n" -" * EMAXCV: Error Max with Cross-Validation \n" -" * RMSE: Root Mean Square Error \n" -" * RMSECV: RMSE with Cross-Validation \n" -" * OE: Order Error \n" -" * OECV: Order Error with Cross-Validation \n" -" * LINV: Invert of the Likelihood \n" -" * AOE: Aggregate Order Error \n" -" * AOECV: Aggregate Order Error with Cross-Validation \n" -" \n" -"Default values AOECV.\n" -" \n" -"Example\n" -" TYPE ENSEMBLE WEIGHT SELECT METRIC RMSECV defines an ensemble of models which selects the model that has the best RMSECV."; - i++; - //================================ - // BUDGET - //================================ - HELP_DATA[i][0] = "BUDGET"; - HELP_DATA[i][1] = "PARAMETER PARAMETERS OPTIM OPTIMIZATION"; - HELP_DATA[i][2] = "Budget for model parameter optimization. The number of sets of model parameters that are tested is equal to the optimization budget multiplied by the the number of parameters to optimize. \n" -"Default values 20\n" -" \n" -"Example\n" -" TYPE LOWESS KERNEL_SHAPE OPTIM METRIC AOECV BUDGET 100\n" -" TYPE ENSEMBLE WEIGHT OPTIM METRIC RMSECV BUDGET 50"; - i++; - //================================ - // SGTELIB_SERVER_START - //================================ - HELP_DATA[i][0] = "SGTELIB_SERVER_START"; - HELP_DATA[i][1] = "Matlab server interface"; - HELP_DATA[i][2] = "Start a sgtelib model in a server from Matlab. \n" -" \n" -"Example\n" -" sgtelib_server_start('TYPE PRS'); Start a sgtelib server with a PRS model\n" -" sgtelib_server_start('TYPE LOWESS DEGREE 1'); Start a Lowess model\n" -" sgtelib_server_start(model_name,true); Start a model defined in model_name and keep the window open"; - i++; - //================================ - // SGTELIB_SERVER_NEWDATA - //================================ - HELP_DATA[i][0] = "SGTELIB_SERVER_NEWDATA"; - HELP_DATA[i][1] = "Matlab server interface data newdata"; - HELP_DATA[i][2] = "Add data points to the sgtelib model from Matlab. \n" -" \n" -"Example\n" -" sgtelib_server_newdata(X,Z); Add data points [X,Z]"; - i++; - //================================ - // SGTELIB_SERVER_PREDICT - //================================ - HELP_DATA[i][0] = "SGTELIB_SERVER_PREDICT"; - HELP_DATA[i][1] = "Matlab server interface prediction predict"; - HELP_DATA[i][2] = "Perform a prediction from Matlab.\n" -" \n" -"Example\n" -" [ZZ,std,ei,cdf] = sgtelib_server_predict(XX); Prediction at points XX."; - i++; - //================================ - // SGTELIB_SERVER_INFO - //================================ - HELP_DATA[i][0] = "SGTELIB_SERVER_INFO"; - HELP_DATA[i][1] = "Matlab server interface"; - HELP_DATA[i][2] = "Command from Matlab. Use sgtelib_server_info to display information about the model."; - i++; - //================================ - // SGTELIB_SERVER_METRIC - //================================ - HELP_DATA[i][0] = "SGTELIB_SERVER_METRIC"; - HELP_DATA[i][1] = "Matlab server interface RMSE OECV RMSECV OE METRIC"; - HELP_DATA[i][2] = "Command from Matlab. Use sgtelib_server_stop(metric_name) to access the error metric of the model.\n" -" \n" -"Example\n" -" m = sgtelib_server_metric('OECV'); Return the OECV error metric\n" -" m = sgtelib_server_metric('RMSE'); Return the RMSE error metric"; - i++; - //================================ - // SGTELIB_SERVER_RESET - //================================ - HELP_DATA[i][0] = "SGTELIB_SERVER_RESET"; - HELP_DATA[i][1] = "Matlab server interface reset"; - HELP_DATA[i][2] = "Reset the model of the sgtelib server from Matlab."; - i++; - //================================ - // SGTELIB_SERVER_STOP - //================================ - HELP_DATA[i][0] = "SGTELIB_SERVER_STOP"; - HELP_DATA[i][1] = "Matlab server interface stop"; - HELP_DATA[i][2] = "Stop the sgtelib server from Matlab."; - i++; - //================================ - return HELP_DATA; -}// diff --git a/ext/sgtelib/src/sgtelib_help.hpp b/ext/sgtelib/src/sgtelib_help.hpp deleted file mode 100644 index 9ae9583..0000000 --- a/ext/sgtelib/src/sgtelib_help.hpp +++ /dev/null @@ -1,44 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* sgtelib - A surrogate model library for derivative-free optimization */ -/* Version 2.0.1 */ -/* */ -/* Copyright (C) 2012-2017 Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Bastien Talgorn - McGill University, Montreal */ -/* */ -/* Author: Bastien Talgorn */ -/* email: bastientalgorn@fastmail.com */ -/* */ -/* This program is free software: you can redistribute it and/or modify it under the */ -/* terms of the GNU Lesser General Public License as published by the Free Software */ -/* Foundation, either version 3 of the License, or (at your option) any later */ -/* version. */ -/* */ -/* This program is distributed in the hope that it will be useful, but WITHOUT ANY */ -/* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A */ -/* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU Lesser General Public License along */ -/* with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* */ -/* You can find information on sgtelib at https://github.com/bastientalgorn/sgtelib */ -/*-------------------------------------------------------------------------------------*/ - -#ifndef __SGTELIB_HELP__ -#define __SGTELIB_HELP__ - -#include <set> -#include <fstream> -#include <vector> -#include <list> -#include <climits> -#include <algorithm> -#include <iostream> -#include "Defines.hpp" - - -namespace SGTELIB { - int dim_help_data (void); - std::string ** get_help_data (void); -} - -#endif diff --git a/ext/sgtelib/user_guide/sgtelib_user_guide.pdf b/ext/sgtelib/user_guide/sgtelib_user_guide.pdf deleted file mode 100644 index 74b05b32932b052b1d18fe8b0e0d9d8bafe3bce6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108063 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	ADb=mGAhB`u$$w*@{McCUgsIT6>dEDes)7 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�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 RG%z<bGv!iMb@g}S0sw~5WuyQA diff --git a/src/Makefile.am b/src/Makefile.am index 31bee86..65c845b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -46,9 +46,12 @@ pkginclude_HEADERS = Cache_File_Point.hpp Cache.hpp Cache_Point.hpp\ GMesh.hpp Sgtelib_Model_Evaluator.hpp Sgtelib_Model_Manager.hpp \ Sgtelib_Model_Search.hpp +libnomad_a_CXXFLAGS = $(SGTELIB_CFLAGS) + bin_PROGRAMS = nomad nomad_SOURCES = nomad.cpp -nomad_LDADD = libnomad.a +nomad_LDADD = libnomad.a $(SGTELIB_LIBS) +nomad_CXXFLAGS = $(SGTELIB_CFLAGS) pkgconfigdir = $(libdir)/pkgconfig nodist_pkgconfig_DATA = ../nomad.pc @@ -56,12 +59,12 @@ nomad.pc: ../nomad.pc.in if MPI_ENABLED lib_LIBRARIES += libnomadmpi.a -libnomadmpi_a_CXXFLAGS = -DUSE_MPI $(MPI_LDFLAGS) $(MPI_CXXFLAGS) $(AM_CXXFLAGS) +libnomadmpi_a_CXXFLAGS = -DUSE_MPI $(MPI_LDFLAGS) $(MPI_CXXFLAGS) $(AM_CXXFLAGS) $(SGTELIB_CFLAGS) nodist_pkgconfig_DATA += ../nomadmpi.pc nomadmpi.pc: ../nomadmpi.pc.in bin_PROGRAMS += nomad.mpi nomad_mpi_SOURCES = nomad.cpp -nomad_mpi_LDADD = libnomadmpi.a -nomad_mpi_CXXFLAGS = -DUSE_MPI $(MPI_CXXFLAGS) $(AM_CXXFLAGS) +nomad_mpi_LDADD = libnomadmpi.a $(SGTELIB_LIBS) +nomad_mpi_CXXFLAGS = -DUSE_MPI $(MPI_CXXFLAGS) $(AM_CXXFLAGS) $(SGTELIB_CFLAGS) $(SGTELIB_CFLAGS) nomad_mpi_LDFLAGS = $(MPI_CXXLDFLAGS) $(AM_CXXLDFLAGS) endif diff --git a/src/Makefile.in b/src/Makefile.in deleted file mode 100644 index 1a59aae..0000000 --- a/src/Makefile.in +++ /dev/null @@ -1,1575 +0,0 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2014 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - - - -VPATH = @srcdir@ -am__is_gnu_make = { \ - if test -z '$(MAKELEVEL)'; then \ - false; \ - elif test -n '$(MAKE_HOST)'; then \ - true; \ - elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ - true; \ - else \ - false; \ - fi; \ -} -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -bin_PROGRAMS = nomad$(EXEEXT) $(am__EXEEXT_1) -@MPI_ENABLED_TRUE@am__append_1 = libnomadmpi.a -@MPI_ENABLED_TRUE@am__append_2 = ../nomadmpi.pc -@MPI_ENABLED_TRUE@am__append_3 = nomad.mpi -subdir = src -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/lx_find_mpi.m4 \ - $(top_srcdir)/m4/nomad.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ - $(am__DIST_COMMON) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ - "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgincludedir)" -LIBRARIES = $(lib_LIBRARIES) -AR = ar -ARFLAGS = cru -AM_V_AR = $(am__v_AR_@AM_V@) -am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) -am__v_AR_0 = @echo " AR " $@; -am__v_AR_1 = -libnomad_a_AR = $(AR) $(ARFLAGS) -libnomad_a_LIBADD = -am_libnomad_a_OBJECTS = Barrier.$(OBJEXT) Cache.$(OBJEXT) \ - Cache_File_Point.$(OBJEXT) Cache_Point.$(OBJEXT) \ - Cache_Search.$(OBJEXT) Clock.$(OBJEXT) Direction.$(OBJEXT) \ - Directions.$(OBJEXT) Display.$(OBJEXT) Double.$(OBJEXT) \ - Eval_Point.$(OBJEXT) Evaluator_Control.$(OBJEXT) \ - Evaluator.$(OBJEXT) Exception.$(OBJEXT) \ - Extended_Poll.$(OBJEXT) L_Curve.$(OBJEXT) LH_Search.$(OBJEXT) \ - Mads.$(OBJEXT) SMesh.$(OBJEXT) XMesh.$(OBJEXT) \ - Model_Sorted_Point.$(OBJEXT) Model_Stats.$(OBJEXT) \ - Multi_Obj_Evaluator.$(OBJEXT) Parameter_Entries.$(OBJEXT) \ - Parameter_Entry.$(OBJEXT) Parameters.$(OBJEXT) \ - Pareto_Front.$(OBJEXT) Pareto_Point.$(OBJEXT) \ - Phase_One_Evaluator.$(OBJEXT) Phase_One_Search.$(OBJEXT) \ - Point.$(OBJEXT) Priority_Eval_Point.$(OBJEXT) \ - Quad_Model.$(OBJEXT) Quad_Model_Evaluator.$(OBJEXT) \ - Quad_Model_Search.$(OBJEXT) Random_Pickup.$(OBJEXT) \ - RNG.$(OBJEXT) Signature.$(OBJEXT) Slave.$(OBJEXT) \ - Speculative_Search.$(OBJEXT) Stats.$(OBJEXT) utils.$(OBJEXT) \ - Variable_Group.$(OBJEXT) VNS_Search.$(OBJEXT) \ - OrthogonalMesh.$(OBJEXT) -libnomad_a_OBJECTS = $(am_libnomad_a_OBJECTS) -libnomadmpi_a_AR = $(AR) $(ARFLAGS) -libnomadmpi_a_LIBADD = -am_libnomadmpi_a_OBJECTS = libnomadmpi_a-Barrier.$(OBJEXT) \ - libnomadmpi_a-Cache.$(OBJEXT) \ - libnomadmpi_a-Cache_File_Point.$(OBJEXT) \ - libnomadmpi_a-Cache_Point.$(OBJEXT) \ - libnomadmpi_a-Cache_Search.$(OBJEXT) \ - libnomadmpi_a-Clock.$(OBJEXT) \ - libnomadmpi_a-Direction.$(OBJEXT) \ - libnomadmpi_a-Directions.$(OBJEXT) \ - libnomadmpi_a-Display.$(OBJEXT) libnomadmpi_a-Double.$(OBJEXT) \ - libnomadmpi_a-Eval_Point.$(OBJEXT) \ - libnomadmpi_a-Evaluator_Control.$(OBJEXT) \ - libnomadmpi_a-Evaluator.$(OBJEXT) \ - libnomadmpi_a-Exception.$(OBJEXT) \ - libnomadmpi_a-Extended_Poll.$(OBJEXT) \ - libnomadmpi_a-L_Curve.$(OBJEXT) \ - libnomadmpi_a-LH_Search.$(OBJEXT) libnomadmpi_a-Mads.$(OBJEXT) \ - libnomadmpi_a-SMesh.$(OBJEXT) libnomadmpi_a-XMesh.$(OBJEXT) \ - libnomadmpi_a-Model_Sorted_Point.$(OBJEXT) \ - libnomadmpi_a-Model_Stats.$(OBJEXT) \ - libnomadmpi_a-Multi_Obj_Evaluator.$(OBJEXT) \ - libnomadmpi_a-Parameter_Entries.$(OBJEXT) \ - libnomadmpi_a-Parameter_Entry.$(OBJEXT) \ - libnomadmpi_a-Parameters.$(OBJEXT) \ - libnomadmpi_a-Pareto_Front.$(OBJEXT) \ - libnomadmpi_a-Pareto_Point.$(OBJEXT) \ - libnomadmpi_a-Phase_One_Evaluator.$(OBJEXT) \ - libnomadmpi_a-Phase_One_Search.$(OBJEXT) \ - libnomadmpi_a-Point.$(OBJEXT) \ - libnomadmpi_a-Priority_Eval_Point.$(OBJEXT) \ - libnomadmpi_a-Quad_Model.$(OBJEXT) \ - libnomadmpi_a-Quad_Model_Evaluator.$(OBJEXT) \ - libnomadmpi_a-Quad_Model_Search.$(OBJEXT) \ - libnomadmpi_a-Random_Pickup.$(OBJEXT) \ - libnomadmpi_a-RNG.$(OBJEXT) libnomadmpi_a-Signature.$(OBJEXT) \ - libnomadmpi_a-Slave.$(OBJEXT) \ - libnomadmpi_a-Speculative_Search.$(OBJEXT) \ - libnomadmpi_a-Stats.$(OBJEXT) libnomadmpi_a-utils.$(OBJEXT) \ - libnomadmpi_a-Variable_Group.$(OBJEXT) \ - libnomadmpi_a-VNS_Search.$(OBJEXT) \ - libnomadmpi_a-OrthogonalMesh.$(OBJEXT) -libnomadmpi_a_OBJECTS = $(am_libnomadmpi_a_OBJECTS) -@MPI_ENABLED_TRUE@am__EXEEXT_1 = nomad.mpi$(EXEEXT) -PROGRAMS = $(bin_PROGRAMS) -am_nomad_OBJECTS = nomad.$(OBJEXT) -nomad_OBJECTS = $(am_nomad_OBJECTS) -nomad_DEPENDENCIES = libnomad.a -am__nomad_mpi_SOURCES_DIST = nomad.cpp -@MPI_ENABLED_TRUE@am_nomad_mpi_OBJECTS = nomad_mpi-nomad.$(OBJEXT) -nomad_mpi_OBJECTS = $(am_nomad_mpi_OBJECTS) -@MPI_ENABLED_TRUE@nomad_mpi_DEPENDENCIES = libnomadmpi.a -nomad_mpi_LINK = $(CXXLD) $(nomad_mpi_CXXFLAGS) $(CXXFLAGS) \ - $(nomad_mpi_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -AM_V_CXX = $(am__v_CXX_@AM_V@) -am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) -am__v_CXX_0 = @echo " CXX " $@; -am__v_CXX_1 = -CXXLD = $(CXX) -CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ - -o $@ -AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) -am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) -am__v_CXXLD_0 = @echo " CXXLD " $@; -am__v_CXXLD_1 = -SOURCES = $(libnomad_a_SOURCES) $(libnomadmpi_a_SOURCES) \ - $(nomad_SOURCES) $(nomad_mpi_SOURCES) -DIST_SOURCES = $(libnomad_a_SOURCES) $(libnomadmpi_a_SOURCES) \ - $(nomad_SOURCES) $(am__nomad_mpi_SOURCES_DIST) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -DATA = $(nodist_pkgconfig_DATA) -HEADERS = $(pkginclude_HEADERS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DOT = @DOT@ -DOXYGEN = @DOXYGEN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -MPICXX = @MPICXX@ -MPI_CXXFLAGS = @MPI_CXXFLAGS@ -MPI_CXXLDFLAGS = @MPI_CXXLDFLAGS@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -runstatedir = @runstatedir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -lib_LIBRARIES = libnomad.a $(am__append_1) -libnomad_a_SOURCES = Barrier.cpp Cache.cpp Cache_File_Point.cpp Cache_Point.cpp\ - Cache_Search.cpp Clock.cpp Direction.cpp Directions.cpp Display.cpp\ - Double.cpp Eval_Point.cpp Evaluator_Control.cpp Evaluator.cpp\ - Exception.cpp Extended_Poll.cpp L_Curve.cpp LH_Search.cpp Mads.cpp\ - SMesh.cpp XMesh.cpp Model_Sorted_Point.cpp Model_Stats.cpp Multi_Obj_Evaluator.cpp\ - Parameter_Entries.cpp Parameter_Entry.cpp Parameters.cpp\ - Pareto_Front.cpp Pareto_Point.cpp Phase_One_Evaluator.cpp\ - Phase_One_Search.cpp Point.cpp Priority_Eval_Point.cpp Quad_Model.cpp\ - Quad_Model_Evaluator.cpp Quad_Model_Search.cpp Random_Pickup.cpp\ - RNG.cpp Signature.cpp Slave.cpp Speculative_Search.cpp Stats.cpp\ - utils.cpp Variable_Group.cpp VNS_Search.cpp OrthogonalMesh.cpp - -libnomadmpi_a_SOURCES = Barrier.cpp Cache.cpp Cache_File_Point.cpp Cache_Point.cpp\ - Cache_Search.cpp Clock.cpp Direction.cpp Directions.cpp Display.cpp\ - Double.cpp Eval_Point.cpp Evaluator_Control.cpp Evaluator.cpp\ - Exception.cpp Extended_Poll.cpp L_Curve.cpp LH_Search.cpp Mads.cpp\ - SMesh.cpp XMesh.cpp Model_Sorted_Point.cpp Model_Stats.cpp Multi_Obj_Evaluator.cpp\ - Parameter_Entries.cpp Parameter_Entry.cpp Parameters.cpp\ - Pareto_Front.cpp Pareto_Point.cpp Phase_One_Evaluator.cpp\ - Phase_One_Search.cpp Point.cpp Priority_Eval_Point.cpp Quad_Model.cpp\ - Quad_Model_Evaluator.cpp Quad_Model_Search.cpp Random_Pickup.cpp\ - RNG.cpp Signature.cpp Slave.cpp Speculative_Search.cpp Stats.cpp\ - utils.cpp Variable_Group.cpp VNS_Search.cpp OrthogonalMesh.cpp - -pkginclude_HEADERS = Cache_File_Point.hpp Cache.hpp Cache_Point.hpp\ - Cache_Search.hpp Clock.hpp defines.hpp Direction.hpp Directions.hpp\ - Display.hpp Double.hpp Eval_Point.hpp Evaluator_Control.hpp\ - Evaluator.hpp Exception.hpp Extended_Poll.hpp Filter_Point.hpp\ - L_Curve.hpp LH_Search.hpp Mads.hpp SMesh.hpp XMesh.hpp Model_Sorted_Point.hpp\ - Model_Stats.hpp Multi_Obj_Evaluator.hpp\ - Multi_Obj_Quad_Model_Evaluator.hpp nomad.hpp Parameter_Entries.hpp\ - Parameter_Entry.hpp Parameters.hpp Pareto_Front.hpp Pareto_Point.hpp\ - Phase_One_Evaluator.hpp Phase_One_Search.hpp Point.hpp\ - Priority_Eval_Point.hpp Quad_Model_Evaluator.hpp Quad_Model.hpp\ - Quad_Model_Search.hpp Random_Pickup.hpp RNG.hpp Search.hpp\ - Set_Element.hpp Signature_Element.hpp Signature.hpp\ - Single_Obj_Quad_Model_Evaluator.hpp Slave.hpp Speculative_Search.hpp\ - Stats.hpp Uncopyable.hpp utils.hpp Variable_Group.hpp\ - VNS_Search.hpp Barrier.hpp OrthogonalMesh.hpp - -nomad_SOURCES = nomad.cpp -nomad_LDADD = libnomad.a -pkgconfigdir = $(libdir)/pkgconfig -nodist_pkgconfig_DATA = ../nomad.pc $(am__append_2) -@MPI_ENABLED_TRUE@libnomadmpi_a_CXXFLAGS = -DUSE_MPI $(MPI_LDFLAGS) $(MPI_CXXFLAGS) $(AM_CXXFLAGS) -@MPI_ENABLED_TRUE@nomad_mpi_SOURCES = nomad.cpp -@MPI_ENABLED_TRUE@nomad_mpi_LDADD = libnomadmpi.a -@MPI_ENABLED_TRUE@nomad_mpi_CXXFLAGS = -DUSE_MPI $(MPI_CXXFLAGS) $(AM_CXXFLAGS) -@MPI_ENABLED_TRUE@nomad_mpi_LDFLAGS = $(MPI_CXXLDFLAGS) $(AM_CXXLDFLAGS) -all: all-am - -.SUFFIXES: -.SUFFIXES: .cpp .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -install-libLIBRARIES: $(lib_LIBRARIES) - @$(NORMAL_INSTALL) - @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ - echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \ - $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; } - @$(POST_INSTALL) - @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ - for p in $$list; do \ - if test -f $$p; then \ - $(am__strip_dir) \ - echo " ( cd '$(DESTDIR)$(libdir)' && $(RANLIB) $$f )"; \ - ( cd "$(DESTDIR)$(libdir)" && $(RANLIB) $$f ) || exit $$?; \ - else :; fi; \ - done - -uninstall-libLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(libdir)'; $(am__uninstall_files_from_dir) - -clean-libLIBRARIES: - -test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES) - -libnomad.a: $(libnomad_a_OBJECTS) $(libnomad_a_DEPENDENCIES) $(EXTRA_libnomad_a_DEPENDENCIES) - $(AM_V_at)-rm -f libnomad.a - $(AM_V_AR)$(libnomad_a_AR) libnomad.a $(libnomad_a_OBJECTS) $(libnomad_a_LIBADD) - $(AM_V_at)$(RANLIB) libnomad.a - -libnomadmpi.a: $(libnomadmpi_a_OBJECTS) $(libnomadmpi_a_DEPENDENCIES) $(EXTRA_libnomadmpi_a_DEPENDENCIES) - $(AM_V_at)-rm -f libnomadmpi.a - $(AM_V_AR)$(libnomadmpi_a_AR) libnomadmpi.a $(libnomadmpi_a_OBJECTS) $(libnomadmpi_a_LIBADD) - $(AM_V_at)$(RANLIB) libnomadmpi.a -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ - fi; \ - for p in $$list; do echo "$$p $$p"; done | \ - sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p \ - ; then echo "$$p"; echo "$$p"; else :; fi; \ - done | \ - sed -e 'p;s,.*/,,;n;h' \ - -e 's|.*|.|' \ - -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ - sed 'N;N;N;s,\n, ,g' | \ - $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ - { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ - if ($$2 == $$4) files[d] = files[d] " " $$1; \ - else { print "f", $$3 "/" $$4, $$1; } } \ - END { for (d in files) print "f", d, files[d] }' | \ - while read type dir files; do \ - if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ - test -z "$$files" || { \ - echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - files=`for p in $$list; do echo "$$p"; done | \ - sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' \ - `; \ - test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(bindir)" && rm -f $$files - -clean-binPROGRAMS: - -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) - -nomad$(EXEEXT): $(nomad_OBJECTS) $(nomad_DEPENDENCIES) $(EXTRA_nomad_DEPENDENCIES) - @rm -f nomad$(EXEEXT) - $(AM_V_CXXLD)$(CXXLINK) $(nomad_OBJECTS) $(nomad_LDADD) $(LIBS) - -nomad.mpi$(EXEEXT): $(nomad_mpi_OBJECTS) $(nomad_mpi_DEPENDENCIES) $(EXTRA_nomad_mpi_DEPENDENCIES) - @rm -f nomad.mpi$(EXEEXT) - $(AM_V_CXXLD)$(nomad_mpi_LINK) $(nomad_mpi_OBJECTS) $(nomad_mpi_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Barrier.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Cache.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Cache_File_Point.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Cache_Point.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Cache_Search.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Clock.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Direction.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Directions.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Display.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Double.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Eval_Point.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Evaluator.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Evaluator_Control.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Exception.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Extended_Poll.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LH_Search.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/L_Curve.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Mads.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Model_Sorted_Point.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Model_Stats.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Multi_Obj_Evaluator.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OrthogonalMesh.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Parameter_Entries.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Parameter_Entry.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Parameters.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Pareto_Front.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Pareto_Point.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Phase_One_Evaluator.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Phase_One_Search.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Point.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Priority_Eval_Point.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Quad_Model.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Quad_Model_Evaluator.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Quad_Model_Search.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RNG.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Random_Pickup.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SMesh.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Signature.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Slave.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Speculative_Search.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Stats.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VNS_Search.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Variable_Group.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMesh.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Barrier.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Cache.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Cache_File_Point.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Cache_Point.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Cache_Search.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Clock.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Direction.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Directions.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Display.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Double.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Eval_Point.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Evaluator.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Evaluator_Control.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Exception.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Extended_Poll.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-LH_Search.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-L_Curve.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Mads.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Model_Sorted_Point.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Model_Stats.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Multi_Obj_Evaluator.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-OrthogonalMesh.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Parameter_Entries.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Parameter_Entry.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Parameters.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Pareto_Front.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Pareto_Point.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Phase_One_Evaluator.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Phase_One_Search.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Point.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Priority_Eval_Point.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Quad_Model.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Quad_Model_Evaluator.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Quad_Model_Search.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-RNG.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Random_Pickup.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-SMesh.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Signature.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Slave.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Speculative_Search.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Stats.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-VNS_Search.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-Variable_Group.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-XMesh.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnomadmpi_a-utils.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nomad.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nomad_mpi-nomad.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@ - -.cpp.o: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -libnomadmpi_a-Barrier.o: Barrier.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Barrier.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Barrier.Tpo -c -o libnomadmpi_a-Barrier.o `test -f 'Barrier.cpp' || echo '$(srcdir)/'`Barrier.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Barrier.Tpo $(DEPDIR)/libnomadmpi_a-Barrier.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Barrier.cpp' object='libnomadmpi_a-Barrier.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Barrier.o `test -f 'Barrier.cpp' || echo '$(srcdir)/'`Barrier.cpp - -libnomadmpi_a-Barrier.obj: Barrier.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Barrier.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Barrier.Tpo -c -o libnomadmpi_a-Barrier.obj `if test -f 'Barrier.cpp'; then $(CYGPATH_W) 'Barrier.cpp'; else $(CYGPATH_W) '$(srcdir)/Barrier.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Barrier.Tpo $(DEPDIR)/libnomadmpi_a-Barrier.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Barrier.cpp' object='libnomadmpi_a-Barrier.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Barrier.obj `if test -f 'Barrier.cpp'; then $(CYGPATH_W) 'Barrier.cpp'; else $(CYGPATH_W) '$(srcdir)/Barrier.cpp'; fi` - -libnomadmpi_a-Cache.o: Cache.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Cache.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Cache.Tpo -c -o libnomadmpi_a-Cache.o `test -f 'Cache.cpp' || echo '$(srcdir)/'`Cache.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Cache.Tpo $(DEPDIR)/libnomadmpi_a-Cache.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Cache.cpp' object='libnomadmpi_a-Cache.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Cache.o `test -f 'Cache.cpp' || echo '$(srcdir)/'`Cache.cpp - -libnomadmpi_a-Cache.obj: Cache.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Cache.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Cache.Tpo -c -o libnomadmpi_a-Cache.obj `if test -f 'Cache.cpp'; then $(CYGPATH_W) 'Cache.cpp'; else $(CYGPATH_W) '$(srcdir)/Cache.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Cache.Tpo $(DEPDIR)/libnomadmpi_a-Cache.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Cache.cpp' object='libnomadmpi_a-Cache.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Cache.obj `if test -f 'Cache.cpp'; then $(CYGPATH_W) 'Cache.cpp'; else $(CYGPATH_W) '$(srcdir)/Cache.cpp'; fi` - -libnomadmpi_a-Cache_File_Point.o: Cache_File_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Cache_File_Point.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Cache_File_Point.Tpo -c -o libnomadmpi_a-Cache_File_Point.o `test -f 'Cache_File_Point.cpp' || echo '$(srcdir)/'`Cache_File_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Cache_File_Point.Tpo $(DEPDIR)/libnomadmpi_a-Cache_File_Point.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Cache_File_Point.cpp' object='libnomadmpi_a-Cache_File_Point.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Cache_File_Point.o `test -f 'Cache_File_Point.cpp' || echo '$(srcdir)/'`Cache_File_Point.cpp - -libnomadmpi_a-Cache_File_Point.obj: Cache_File_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Cache_File_Point.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Cache_File_Point.Tpo -c -o libnomadmpi_a-Cache_File_Point.obj `if test -f 'Cache_File_Point.cpp'; then $(CYGPATH_W) 'Cache_File_Point.cpp'; else $(CYGPATH_W) '$(srcdir)/Cache_File_Point.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Cache_File_Point.Tpo $(DEPDIR)/libnomadmpi_a-Cache_File_Point.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Cache_File_Point.cpp' object='libnomadmpi_a-Cache_File_Point.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Cache_File_Point.obj `if test -f 'Cache_File_Point.cpp'; then $(CYGPATH_W) 'Cache_File_Point.cpp'; else $(CYGPATH_W) '$(srcdir)/Cache_File_Point.cpp'; fi` - -libnomadmpi_a-Cache_Point.o: Cache_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Cache_Point.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Cache_Point.Tpo -c -o libnomadmpi_a-Cache_Point.o `test -f 'Cache_Point.cpp' || echo '$(srcdir)/'`Cache_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Cache_Point.Tpo $(DEPDIR)/libnomadmpi_a-Cache_Point.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Cache_Point.cpp' object='libnomadmpi_a-Cache_Point.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Cache_Point.o `test -f 'Cache_Point.cpp' || echo '$(srcdir)/'`Cache_Point.cpp - -libnomadmpi_a-Cache_Point.obj: Cache_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Cache_Point.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Cache_Point.Tpo -c -o libnomadmpi_a-Cache_Point.obj `if test -f 'Cache_Point.cpp'; then $(CYGPATH_W) 'Cache_Point.cpp'; else $(CYGPATH_W) '$(srcdir)/Cache_Point.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Cache_Point.Tpo $(DEPDIR)/libnomadmpi_a-Cache_Point.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Cache_Point.cpp' object='libnomadmpi_a-Cache_Point.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Cache_Point.obj `if test -f 'Cache_Point.cpp'; then $(CYGPATH_W) 'Cache_Point.cpp'; else $(CYGPATH_W) '$(srcdir)/Cache_Point.cpp'; fi` - -libnomadmpi_a-Cache_Search.o: Cache_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Cache_Search.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Cache_Search.Tpo -c -o libnomadmpi_a-Cache_Search.o `test -f 'Cache_Search.cpp' || echo '$(srcdir)/'`Cache_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Cache_Search.Tpo $(DEPDIR)/libnomadmpi_a-Cache_Search.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Cache_Search.cpp' object='libnomadmpi_a-Cache_Search.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Cache_Search.o `test -f 'Cache_Search.cpp' || echo '$(srcdir)/'`Cache_Search.cpp - -libnomadmpi_a-Cache_Search.obj: Cache_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Cache_Search.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Cache_Search.Tpo -c -o libnomadmpi_a-Cache_Search.obj `if test -f 'Cache_Search.cpp'; then $(CYGPATH_W) 'Cache_Search.cpp'; else $(CYGPATH_W) '$(srcdir)/Cache_Search.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Cache_Search.Tpo $(DEPDIR)/libnomadmpi_a-Cache_Search.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Cache_Search.cpp' object='libnomadmpi_a-Cache_Search.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Cache_Search.obj `if test -f 'Cache_Search.cpp'; then $(CYGPATH_W) 'Cache_Search.cpp'; else $(CYGPATH_W) '$(srcdir)/Cache_Search.cpp'; fi` - -libnomadmpi_a-Clock.o: Clock.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Clock.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Clock.Tpo -c -o libnomadmpi_a-Clock.o `test -f 'Clock.cpp' || echo '$(srcdir)/'`Clock.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Clock.Tpo $(DEPDIR)/libnomadmpi_a-Clock.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Clock.cpp' object='libnomadmpi_a-Clock.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Clock.o `test -f 'Clock.cpp' || echo '$(srcdir)/'`Clock.cpp - -libnomadmpi_a-Clock.obj: Clock.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Clock.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Clock.Tpo -c -o libnomadmpi_a-Clock.obj `if test -f 'Clock.cpp'; then $(CYGPATH_W) 'Clock.cpp'; else $(CYGPATH_W) '$(srcdir)/Clock.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Clock.Tpo $(DEPDIR)/libnomadmpi_a-Clock.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Clock.cpp' object='libnomadmpi_a-Clock.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Clock.obj `if test -f 'Clock.cpp'; then $(CYGPATH_W) 'Clock.cpp'; else $(CYGPATH_W) '$(srcdir)/Clock.cpp'; fi` - -libnomadmpi_a-Direction.o: Direction.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Direction.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Direction.Tpo -c -o libnomadmpi_a-Direction.o `test -f 'Direction.cpp' || echo '$(srcdir)/'`Direction.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Direction.Tpo $(DEPDIR)/libnomadmpi_a-Direction.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Direction.cpp' object='libnomadmpi_a-Direction.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Direction.o `test -f 'Direction.cpp' || echo '$(srcdir)/'`Direction.cpp - -libnomadmpi_a-Direction.obj: Direction.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Direction.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Direction.Tpo -c -o libnomadmpi_a-Direction.obj `if test -f 'Direction.cpp'; then $(CYGPATH_W) 'Direction.cpp'; else $(CYGPATH_W) '$(srcdir)/Direction.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Direction.Tpo $(DEPDIR)/libnomadmpi_a-Direction.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Direction.cpp' object='libnomadmpi_a-Direction.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Direction.obj `if test -f 'Direction.cpp'; then $(CYGPATH_W) 'Direction.cpp'; else $(CYGPATH_W) '$(srcdir)/Direction.cpp'; fi` - -libnomadmpi_a-Directions.o: Directions.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Directions.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Directions.Tpo -c -o libnomadmpi_a-Directions.o `test -f 'Directions.cpp' || echo '$(srcdir)/'`Directions.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Directions.Tpo $(DEPDIR)/libnomadmpi_a-Directions.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Directions.cpp' object='libnomadmpi_a-Directions.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Directions.o `test -f 'Directions.cpp' || echo '$(srcdir)/'`Directions.cpp - -libnomadmpi_a-Directions.obj: Directions.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Directions.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Directions.Tpo -c -o libnomadmpi_a-Directions.obj `if test -f 'Directions.cpp'; then $(CYGPATH_W) 'Directions.cpp'; else $(CYGPATH_W) '$(srcdir)/Directions.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Directions.Tpo $(DEPDIR)/libnomadmpi_a-Directions.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Directions.cpp' object='libnomadmpi_a-Directions.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Directions.obj `if test -f 'Directions.cpp'; then $(CYGPATH_W) 'Directions.cpp'; else $(CYGPATH_W) '$(srcdir)/Directions.cpp'; fi` - -libnomadmpi_a-Display.o: Display.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Display.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Display.Tpo -c -o libnomadmpi_a-Display.o `test -f 'Display.cpp' || echo '$(srcdir)/'`Display.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Display.Tpo $(DEPDIR)/libnomadmpi_a-Display.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Display.cpp' object='libnomadmpi_a-Display.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Display.o `test -f 'Display.cpp' || echo '$(srcdir)/'`Display.cpp - -libnomadmpi_a-Display.obj: Display.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Display.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Display.Tpo -c -o libnomadmpi_a-Display.obj `if test -f 'Display.cpp'; then $(CYGPATH_W) 'Display.cpp'; else $(CYGPATH_W) '$(srcdir)/Display.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Display.Tpo $(DEPDIR)/libnomadmpi_a-Display.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Display.cpp' object='libnomadmpi_a-Display.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Display.obj `if test -f 'Display.cpp'; then $(CYGPATH_W) 'Display.cpp'; else $(CYGPATH_W) '$(srcdir)/Display.cpp'; fi` - -libnomadmpi_a-Double.o: Double.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Double.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Double.Tpo -c -o libnomadmpi_a-Double.o `test -f 'Double.cpp' || echo '$(srcdir)/'`Double.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Double.Tpo $(DEPDIR)/libnomadmpi_a-Double.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Double.cpp' object='libnomadmpi_a-Double.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Double.o `test -f 'Double.cpp' || echo '$(srcdir)/'`Double.cpp - -libnomadmpi_a-Double.obj: Double.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Double.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Double.Tpo -c -o libnomadmpi_a-Double.obj `if test -f 'Double.cpp'; then $(CYGPATH_W) 'Double.cpp'; else $(CYGPATH_W) '$(srcdir)/Double.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Double.Tpo $(DEPDIR)/libnomadmpi_a-Double.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Double.cpp' object='libnomadmpi_a-Double.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Double.obj `if test -f 'Double.cpp'; then $(CYGPATH_W) 'Double.cpp'; else $(CYGPATH_W) '$(srcdir)/Double.cpp'; fi` - -libnomadmpi_a-Eval_Point.o: Eval_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Eval_Point.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Eval_Point.Tpo -c -o libnomadmpi_a-Eval_Point.o `test -f 'Eval_Point.cpp' || echo '$(srcdir)/'`Eval_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Eval_Point.Tpo $(DEPDIR)/libnomadmpi_a-Eval_Point.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Eval_Point.cpp' object='libnomadmpi_a-Eval_Point.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Eval_Point.o `test -f 'Eval_Point.cpp' || echo '$(srcdir)/'`Eval_Point.cpp - -libnomadmpi_a-Eval_Point.obj: Eval_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Eval_Point.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Eval_Point.Tpo -c -o libnomadmpi_a-Eval_Point.obj `if test -f 'Eval_Point.cpp'; then $(CYGPATH_W) 'Eval_Point.cpp'; else $(CYGPATH_W) '$(srcdir)/Eval_Point.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Eval_Point.Tpo $(DEPDIR)/libnomadmpi_a-Eval_Point.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Eval_Point.cpp' object='libnomadmpi_a-Eval_Point.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Eval_Point.obj `if test -f 'Eval_Point.cpp'; then $(CYGPATH_W) 'Eval_Point.cpp'; else $(CYGPATH_W) '$(srcdir)/Eval_Point.cpp'; fi` - -libnomadmpi_a-Evaluator_Control.o: Evaluator_Control.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Evaluator_Control.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Evaluator_Control.Tpo -c -o libnomadmpi_a-Evaluator_Control.o `test -f 'Evaluator_Control.cpp' || echo '$(srcdir)/'`Evaluator_Control.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Evaluator_Control.Tpo $(DEPDIR)/libnomadmpi_a-Evaluator_Control.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Evaluator_Control.cpp' object='libnomadmpi_a-Evaluator_Control.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Evaluator_Control.o `test -f 'Evaluator_Control.cpp' || echo '$(srcdir)/'`Evaluator_Control.cpp - -libnomadmpi_a-Evaluator_Control.obj: Evaluator_Control.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Evaluator_Control.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Evaluator_Control.Tpo -c -o libnomadmpi_a-Evaluator_Control.obj `if test -f 'Evaluator_Control.cpp'; then $(CYGPATH_W) 'Evaluator_Control.cpp'; else $(CYGPATH_W) '$(srcdir)/Evaluator_Control.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Evaluator_Control.Tpo $(DEPDIR)/libnomadmpi_a-Evaluator_Control.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Evaluator_Control.cpp' object='libnomadmpi_a-Evaluator_Control.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Evaluator_Control.obj `if test -f 'Evaluator_Control.cpp'; then $(CYGPATH_W) 'Evaluator_Control.cpp'; else $(CYGPATH_W) '$(srcdir)/Evaluator_Control.cpp'; fi` - -libnomadmpi_a-Evaluator.o: Evaluator.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Evaluator.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Evaluator.Tpo -c -o libnomadmpi_a-Evaluator.o `test -f 'Evaluator.cpp' || echo '$(srcdir)/'`Evaluator.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Evaluator.Tpo $(DEPDIR)/libnomadmpi_a-Evaluator.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Evaluator.cpp' object='libnomadmpi_a-Evaluator.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Evaluator.o `test -f 'Evaluator.cpp' || echo '$(srcdir)/'`Evaluator.cpp - -libnomadmpi_a-Evaluator.obj: Evaluator.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Evaluator.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Evaluator.Tpo -c -o libnomadmpi_a-Evaluator.obj `if test -f 'Evaluator.cpp'; then $(CYGPATH_W) 'Evaluator.cpp'; else $(CYGPATH_W) '$(srcdir)/Evaluator.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Evaluator.Tpo $(DEPDIR)/libnomadmpi_a-Evaluator.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Evaluator.cpp' object='libnomadmpi_a-Evaluator.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Evaluator.obj `if test -f 'Evaluator.cpp'; then $(CYGPATH_W) 'Evaluator.cpp'; else $(CYGPATH_W) '$(srcdir)/Evaluator.cpp'; fi` - -libnomadmpi_a-Exception.o: Exception.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Exception.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Exception.Tpo -c -o libnomadmpi_a-Exception.o `test -f 'Exception.cpp' || echo '$(srcdir)/'`Exception.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Exception.Tpo $(DEPDIR)/libnomadmpi_a-Exception.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Exception.cpp' object='libnomadmpi_a-Exception.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Exception.o `test -f 'Exception.cpp' || echo '$(srcdir)/'`Exception.cpp - -libnomadmpi_a-Exception.obj: Exception.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Exception.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Exception.Tpo -c -o libnomadmpi_a-Exception.obj `if test -f 'Exception.cpp'; then $(CYGPATH_W) 'Exception.cpp'; else $(CYGPATH_W) '$(srcdir)/Exception.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Exception.Tpo $(DEPDIR)/libnomadmpi_a-Exception.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Exception.cpp' object='libnomadmpi_a-Exception.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Exception.obj `if test -f 'Exception.cpp'; then $(CYGPATH_W) 'Exception.cpp'; else $(CYGPATH_W) '$(srcdir)/Exception.cpp'; fi` - -libnomadmpi_a-Extended_Poll.o: Extended_Poll.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Extended_Poll.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Extended_Poll.Tpo -c -o libnomadmpi_a-Extended_Poll.o `test -f 'Extended_Poll.cpp' || echo '$(srcdir)/'`Extended_Poll.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Extended_Poll.Tpo $(DEPDIR)/libnomadmpi_a-Extended_Poll.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Extended_Poll.cpp' object='libnomadmpi_a-Extended_Poll.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Extended_Poll.o `test -f 'Extended_Poll.cpp' || echo '$(srcdir)/'`Extended_Poll.cpp - -libnomadmpi_a-Extended_Poll.obj: Extended_Poll.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Extended_Poll.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Extended_Poll.Tpo -c -o libnomadmpi_a-Extended_Poll.obj `if test -f 'Extended_Poll.cpp'; then $(CYGPATH_W) 'Extended_Poll.cpp'; else $(CYGPATH_W) '$(srcdir)/Extended_Poll.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Extended_Poll.Tpo $(DEPDIR)/libnomadmpi_a-Extended_Poll.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Extended_Poll.cpp' object='libnomadmpi_a-Extended_Poll.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Extended_Poll.obj `if test -f 'Extended_Poll.cpp'; then $(CYGPATH_W) 'Extended_Poll.cpp'; else $(CYGPATH_W) '$(srcdir)/Extended_Poll.cpp'; fi` - -libnomadmpi_a-L_Curve.o: L_Curve.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-L_Curve.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-L_Curve.Tpo -c -o libnomadmpi_a-L_Curve.o `test -f 'L_Curve.cpp' || echo '$(srcdir)/'`L_Curve.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-L_Curve.Tpo $(DEPDIR)/libnomadmpi_a-L_Curve.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='L_Curve.cpp' object='libnomadmpi_a-L_Curve.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-L_Curve.o `test -f 'L_Curve.cpp' || echo '$(srcdir)/'`L_Curve.cpp - -libnomadmpi_a-L_Curve.obj: L_Curve.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-L_Curve.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-L_Curve.Tpo -c -o libnomadmpi_a-L_Curve.obj `if test -f 'L_Curve.cpp'; then $(CYGPATH_W) 'L_Curve.cpp'; else $(CYGPATH_W) '$(srcdir)/L_Curve.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-L_Curve.Tpo $(DEPDIR)/libnomadmpi_a-L_Curve.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='L_Curve.cpp' object='libnomadmpi_a-L_Curve.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-L_Curve.obj `if test -f 'L_Curve.cpp'; then $(CYGPATH_W) 'L_Curve.cpp'; else $(CYGPATH_W) '$(srcdir)/L_Curve.cpp'; fi` - -libnomadmpi_a-LH_Search.o: LH_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-LH_Search.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-LH_Search.Tpo -c -o libnomadmpi_a-LH_Search.o `test -f 'LH_Search.cpp' || echo '$(srcdir)/'`LH_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-LH_Search.Tpo $(DEPDIR)/libnomadmpi_a-LH_Search.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='LH_Search.cpp' object='libnomadmpi_a-LH_Search.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-LH_Search.o `test -f 'LH_Search.cpp' || echo '$(srcdir)/'`LH_Search.cpp - -libnomadmpi_a-LH_Search.obj: LH_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-LH_Search.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-LH_Search.Tpo -c -o libnomadmpi_a-LH_Search.obj `if test -f 'LH_Search.cpp'; then $(CYGPATH_W) 'LH_Search.cpp'; else $(CYGPATH_W) '$(srcdir)/LH_Search.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-LH_Search.Tpo $(DEPDIR)/libnomadmpi_a-LH_Search.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='LH_Search.cpp' object='libnomadmpi_a-LH_Search.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-LH_Search.obj `if test -f 'LH_Search.cpp'; then $(CYGPATH_W) 'LH_Search.cpp'; else $(CYGPATH_W) '$(srcdir)/LH_Search.cpp'; fi` - -libnomadmpi_a-Mads.o: Mads.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Mads.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Mads.Tpo -c -o libnomadmpi_a-Mads.o `test -f 'Mads.cpp' || echo '$(srcdir)/'`Mads.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Mads.Tpo $(DEPDIR)/libnomadmpi_a-Mads.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Mads.cpp' object='libnomadmpi_a-Mads.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Mads.o `test -f 'Mads.cpp' || echo '$(srcdir)/'`Mads.cpp - -libnomadmpi_a-Mads.obj: Mads.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Mads.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Mads.Tpo -c -o libnomadmpi_a-Mads.obj `if test -f 'Mads.cpp'; then $(CYGPATH_W) 'Mads.cpp'; else $(CYGPATH_W) '$(srcdir)/Mads.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Mads.Tpo $(DEPDIR)/libnomadmpi_a-Mads.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Mads.cpp' object='libnomadmpi_a-Mads.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Mads.obj `if test -f 'Mads.cpp'; then $(CYGPATH_W) 'Mads.cpp'; else $(CYGPATH_W) '$(srcdir)/Mads.cpp'; fi` - -libnomadmpi_a-SMesh.o: SMesh.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-SMesh.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-SMesh.Tpo -c -o libnomadmpi_a-SMesh.o `test -f 'SMesh.cpp' || echo '$(srcdir)/'`SMesh.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-SMesh.Tpo $(DEPDIR)/libnomadmpi_a-SMesh.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SMesh.cpp' object='libnomadmpi_a-SMesh.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-SMesh.o `test -f 'SMesh.cpp' || echo '$(srcdir)/'`SMesh.cpp - -libnomadmpi_a-SMesh.obj: SMesh.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-SMesh.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-SMesh.Tpo -c -o libnomadmpi_a-SMesh.obj `if test -f 'SMesh.cpp'; then $(CYGPATH_W) 'SMesh.cpp'; else $(CYGPATH_W) '$(srcdir)/SMesh.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-SMesh.Tpo $(DEPDIR)/libnomadmpi_a-SMesh.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SMesh.cpp' object='libnomadmpi_a-SMesh.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-SMesh.obj `if test -f 'SMesh.cpp'; then $(CYGPATH_W) 'SMesh.cpp'; else $(CYGPATH_W) '$(srcdir)/SMesh.cpp'; fi` - -libnomadmpi_a-XMesh.o: XMesh.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-XMesh.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-XMesh.Tpo -c -o libnomadmpi_a-XMesh.o `test -f 'XMesh.cpp' || echo '$(srcdir)/'`XMesh.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-XMesh.Tpo $(DEPDIR)/libnomadmpi_a-XMesh.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='XMesh.cpp' object='libnomadmpi_a-XMesh.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-XMesh.o `test -f 'XMesh.cpp' || echo '$(srcdir)/'`XMesh.cpp - -libnomadmpi_a-XMesh.obj: XMesh.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-XMesh.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-XMesh.Tpo -c -o libnomadmpi_a-XMesh.obj `if test -f 'XMesh.cpp'; then $(CYGPATH_W) 'XMesh.cpp'; else $(CYGPATH_W) '$(srcdir)/XMesh.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-XMesh.Tpo $(DEPDIR)/libnomadmpi_a-XMesh.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='XMesh.cpp' object='libnomadmpi_a-XMesh.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-XMesh.obj `if test -f 'XMesh.cpp'; then $(CYGPATH_W) 'XMesh.cpp'; else $(CYGPATH_W) '$(srcdir)/XMesh.cpp'; fi` - -libnomadmpi_a-Model_Sorted_Point.o: Model_Sorted_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Model_Sorted_Point.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Model_Sorted_Point.Tpo -c -o libnomadmpi_a-Model_Sorted_Point.o `test -f 'Model_Sorted_Point.cpp' || echo '$(srcdir)/'`Model_Sorted_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Model_Sorted_Point.Tpo $(DEPDIR)/libnomadmpi_a-Model_Sorted_Point.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Model_Sorted_Point.cpp' object='libnomadmpi_a-Model_Sorted_Point.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Model_Sorted_Point.o `test -f 'Model_Sorted_Point.cpp' || echo '$(srcdir)/'`Model_Sorted_Point.cpp - -libnomadmpi_a-Model_Sorted_Point.obj: Model_Sorted_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Model_Sorted_Point.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Model_Sorted_Point.Tpo -c -o libnomadmpi_a-Model_Sorted_Point.obj `if test -f 'Model_Sorted_Point.cpp'; then $(CYGPATH_W) 'Model_Sorted_Point.cpp'; else $(CYGPATH_W) '$(srcdir)/Model_Sorted_Point.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Model_Sorted_Point.Tpo $(DEPDIR)/libnomadmpi_a-Model_Sorted_Point.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Model_Sorted_Point.cpp' object='libnomadmpi_a-Model_Sorted_Point.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Model_Sorted_Point.obj `if test -f 'Model_Sorted_Point.cpp'; then $(CYGPATH_W) 'Model_Sorted_Point.cpp'; else $(CYGPATH_W) '$(srcdir)/Model_Sorted_Point.cpp'; fi` - -libnomadmpi_a-Model_Stats.o: Model_Stats.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Model_Stats.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Model_Stats.Tpo -c -o libnomadmpi_a-Model_Stats.o `test -f 'Model_Stats.cpp' || echo '$(srcdir)/'`Model_Stats.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Model_Stats.Tpo $(DEPDIR)/libnomadmpi_a-Model_Stats.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Model_Stats.cpp' object='libnomadmpi_a-Model_Stats.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Model_Stats.o `test -f 'Model_Stats.cpp' || echo '$(srcdir)/'`Model_Stats.cpp - -libnomadmpi_a-Model_Stats.obj: Model_Stats.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Model_Stats.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Model_Stats.Tpo -c -o libnomadmpi_a-Model_Stats.obj `if test -f 'Model_Stats.cpp'; then $(CYGPATH_W) 'Model_Stats.cpp'; else $(CYGPATH_W) '$(srcdir)/Model_Stats.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Model_Stats.Tpo $(DEPDIR)/libnomadmpi_a-Model_Stats.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Model_Stats.cpp' object='libnomadmpi_a-Model_Stats.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Model_Stats.obj `if test -f 'Model_Stats.cpp'; then $(CYGPATH_W) 'Model_Stats.cpp'; else $(CYGPATH_W) '$(srcdir)/Model_Stats.cpp'; fi` - -libnomadmpi_a-Multi_Obj_Evaluator.o: Multi_Obj_Evaluator.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Multi_Obj_Evaluator.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Multi_Obj_Evaluator.Tpo -c -o libnomadmpi_a-Multi_Obj_Evaluator.o `test -f 'Multi_Obj_Evaluator.cpp' || echo '$(srcdir)/'`Multi_Obj_Evaluator.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Multi_Obj_Evaluator.Tpo $(DEPDIR)/libnomadmpi_a-Multi_Obj_Evaluator.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Multi_Obj_Evaluator.cpp' object='libnomadmpi_a-Multi_Obj_Evaluator.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Multi_Obj_Evaluator.o `test -f 'Multi_Obj_Evaluator.cpp' || echo '$(srcdir)/'`Multi_Obj_Evaluator.cpp - -libnomadmpi_a-Multi_Obj_Evaluator.obj: Multi_Obj_Evaluator.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Multi_Obj_Evaluator.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Multi_Obj_Evaluator.Tpo -c -o libnomadmpi_a-Multi_Obj_Evaluator.obj `if test -f 'Multi_Obj_Evaluator.cpp'; then $(CYGPATH_W) 'Multi_Obj_Evaluator.cpp'; else $(CYGPATH_W) '$(srcdir)/Multi_Obj_Evaluator.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Multi_Obj_Evaluator.Tpo $(DEPDIR)/libnomadmpi_a-Multi_Obj_Evaluator.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Multi_Obj_Evaluator.cpp' object='libnomadmpi_a-Multi_Obj_Evaluator.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Multi_Obj_Evaluator.obj `if test -f 'Multi_Obj_Evaluator.cpp'; then $(CYGPATH_W) 'Multi_Obj_Evaluator.cpp'; else $(CYGPATH_W) '$(srcdir)/Multi_Obj_Evaluator.cpp'; fi` - -libnomadmpi_a-Parameter_Entries.o: Parameter_Entries.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Parameter_Entries.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Parameter_Entries.Tpo -c -o libnomadmpi_a-Parameter_Entries.o `test -f 'Parameter_Entries.cpp' || echo '$(srcdir)/'`Parameter_Entries.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Parameter_Entries.Tpo $(DEPDIR)/libnomadmpi_a-Parameter_Entries.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Parameter_Entries.cpp' object='libnomadmpi_a-Parameter_Entries.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Parameter_Entries.o `test -f 'Parameter_Entries.cpp' || echo '$(srcdir)/'`Parameter_Entries.cpp - -libnomadmpi_a-Parameter_Entries.obj: Parameter_Entries.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Parameter_Entries.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Parameter_Entries.Tpo -c -o libnomadmpi_a-Parameter_Entries.obj `if test -f 'Parameter_Entries.cpp'; then $(CYGPATH_W) 'Parameter_Entries.cpp'; else $(CYGPATH_W) '$(srcdir)/Parameter_Entries.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Parameter_Entries.Tpo $(DEPDIR)/libnomadmpi_a-Parameter_Entries.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Parameter_Entries.cpp' object='libnomadmpi_a-Parameter_Entries.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Parameter_Entries.obj `if test -f 'Parameter_Entries.cpp'; then $(CYGPATH_W) 'Parameter_Entries.cpp'; else $(CYGPATH_W) '$(srcdir)/Parameter_Entries.cpp'; fi` - -libnomadmpi_a-Parameter_Entry.o: Parameter_Entry.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Parameter_Entry.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Parameter_Entry.Tpo -c -o libnomadmpi_a-Parameter_Entry.o `test -f 'Parameter_Entry.cpp' || echo '$(srcdir)/'`Parameter_Entry.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Parameter_Entry.Tpo $(DEPDIR)/libnomadmpi_a-Parameter_Entry.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Parameter_Entry.cpp' object='libnomadmpi_a-Parameter_Entry.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Parameter_Entry.o `test -f 'Parameter_Entry.cpp' || echo '$(srcdir)/'`Parameter_Entry.cpp - -libnomadmpi_a-Parameter_Entry.obj: Parameter_Entry.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Parameter_Entry.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Parameter_Entry.Tpo -c -o libnomadmpi_a-Parameter_Entry.obj `if test -f 'Parameter_Entry.cpp'; then $(CYGPATH_W) 'Parameter_Entry.cpp'; else $(CYGPATH_W) '$(srcdir)/Parameter_Entry.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Parameter_Entry.Tpo $(DEPDIR)/libnomadmpi_a-Parameter_Entry.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Parameter_Entry.cpp' object='libnomadmpi_a-Parameter_Entry.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Parameter_Entry.obj `if test -f 'Parameter_Entry.cpp'; then $(CYGPATH_W) 'Parameter_Entry.cpp'; else $(CYGPATH_W) '$(srcdir)/Parameter_Entry.cpp'; fi` - -libnomadmpi_a-Parameters.o: Parameters.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Parameters.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Parameters.Tpo -c -o libnomadmpi_a-Parameters.o `test -f 'Parameters.cpp' || echo '$(srcdir)/'`Parameters.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Parameters.Tpo $(DEPDIR)/libnomadmpi_a-Parameters.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Parameters.cpp' object='libnomadmpi_a-Parameters.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Parameters.o `test -f 'Parameters.cpp' || echo '$(srcdir)/'`Parameters.cpp - -libnomadmpi_a-Parameters.obj: Parameters.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Parameters.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Parameters.Tpo -c -o libnomadmpi_a-Parameters.obj `if test -f 'Parameters.cpp'; then $(CYGPATH_W) 'Parameters.cpp'; else $(CYGPATH_W) '$(srcdir)/Parameters.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Parameters.Tpo $(DEPDIR)/libnomadmpi_a-Parameters.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Parameters.cpp' object='libnomadmpi_a-Parameters.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Parameters.obj `if test -f 'Parameters.cpp'; then $(CYGPATH_W) 'Parameters.cpp'; else $(CYGPATH_W) '$(srcdir)/Parameters.cpp'; fi` - -libnomadmpi_a-Pareto_Front.o: Pareto_Front.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Pareto_Front.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Pareto_Front.Tpo -c -o libnomadmpi_a-Pareto_Front.o `test -f 'Pareto_Front.cpp' || echo '$(srcdir)/'`Pareto_Front.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Pareto_Front.Tpo $(DEPDIR)/libnomadmpi_a-Pareto_Front.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Pareto_Front.cpp' object='libnomadmpi_a-Pareto_Front.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Pareto_Front.o `test -f 'Pareto_Front.cpp' || echo '$(srcdir)/'`Pareto_Front.cpp - -libnomadmpi_a-Pareto_Front.obj: Pareto_Front.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Pareto_Front.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Pareto_Front.Tpo -c -o libnomadmpi_a-Pareto_Front.obj `if test -f 'Pareto_Front.cpp'; then $(CYGPATH_W) 'Pareto_Front.cpp'; else $(CYGPATH_W) '$(srcdir)/Pareto_Front.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Pareto_Front.Tpo $(DEPDIR)/libnomadmpi_a-Pareto_Front.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Pareto_Front.cpp' object='libnomadmpi_a-Pareto_Front.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Pareto_Front.obj `if test -f 'Pareto_Front.cpp'; then $(CYGPATH_W) 'Pareto_Front.cpp'; else $(CYGPATH_W) '$(srcdir)/Pareto_Front.cpp'; fi` - -libnomadmpi_a-Pareto_Point.o: Pareto_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Pareto_Point.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Pareto_Point.Tpo -c -o libnomadmpi_a-Pareto_Point.o `test -f 'Pareto_Point.cpp' || echo '$(srcdir)/'`Pareto_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Pareto_Point.Tpo $(DEPDIR)/libnomadmpi_a-Pareto_Point.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Pareto_Point.cpp' object='libnomadmpi_a-Pareto_Point.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Pareto_Point.o `test -f 'Pareto_Point.cpp' || echo '$(srcdir)/'`Pareto_Point.cpp - -libnomadmpi_a-Pareto_Point.obj: Pareto_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Pareto_Point.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Pareto_Point.Tpo -c -o libnomadmpi_a-Pareto_Point.obj `if test -f 'Pareto_Point.cpp'; then $(CYGPATH_W) 'Pareto_Point.cpp'; else $(CYGPATH_W) '$(srcdir)/Pareto_Point.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Pareto_Point.Tpo $(DEPDIR)/libnomadmpi_a-Pareto_Point.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Pareto_Point.cpp' object='libnomadmpi_a-Pareto_Point.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Pareto_Point.obj `if test -f 'Pareto_Point.cpp'; then $(CYGPATH_W) 'Pareto_Point.cpp'; else $(CYGPATH_W) '$(srcdir)/Pareto_Point.cpp'; fi` - -libnomadmpi_a-Phase_One_Evaluator.o: Phase_One_Evaluator.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Phase_One_Evaluator.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Phase_One_Evaluator.Tpo -c -o libnomadmpi_a-Phase_One_Evaluator.o `test -f 'Phase_One_Evaluator.cpp' || echo '$(srcdir)/'`Phase_One_Evaluator.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Phase_One_Evaluator.Tpo $(DEPDIR)/libnomadmpi_a-Phase_One_Evaluator.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Phase_One_Evaluator.cpp' object='libnomadmpi_a-Phase_One_Evaluator.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Phase_One_Evaluator.o `test -f 'Phase_One_Evaluator.cpp' || echo '$(srcdir)/'`Phase_One_Evaluator.cpp - -libnomadmpi_a-Phase_One_Evaluator.obj: Phase_One_Evaluator.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Phase_One_Evaluator.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Phase_One_Evaluator.Tpo -c -o libnomadmpi_a-Phase_One_Evaluator.obj `if test -f 'Phase_One_Evaluator.cpp'; then $(CYGPATH_W) 'Phase_One_Evaluator.cpp'; else $(CYGPATH_W) '$(srcdir)/Phase_One_Evaluator.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Phase_One_Evaluator.Tpo $(DEPDIR)/libnomadmpi_a-Phase_One_Evaluator.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Phase_One_Evaluator.cpp' object='libnomadmpi_a-Phase_One_Evaluator.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Phase_One_Evaluator.obj `if test -f 'Phase_One_Evaluator.cpp'; then $(CYGPATH_W) 'Phase_One_Evaluator.cpp'; else $(CYGPATH_W) '$(srcdir)/Phase_One_Evaluator.cpp'; fi` - -libnomadmpi_a-Phase_One_Search.o: Phase_One_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Phase_One_Search.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Phase_One_Search.Tpo -c -o libnomadmpi_a-Phase_One_Search.o `test -f 'Phase_One_Search.cpp' || echo '$(srcdir)/'`Phase_One_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Phase_One_Search.Tpo $(DEPDIR)/libnomadmpi_a-Phase_One_Search.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Phase_One_Search.cpp' object='libnomadmpi_a-Phase_One_Search.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Phase_One_Search.o `test -f 'Phase_One_Search.cpp' || echo '$(srcdir)/'`Phase_One_Search.cpp - -libnomadmpi_a-Phase_One_Search.obj: Phase_One_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Phase_One_Search.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Phase_One_Search.Tpo -c -o libnomadmpi_a-Phase_One_Search.obj `if test -f 'Phase_One_Search.cpp'; then $(CYGPATH_W) 'Phase_One_Search.cpp'; else $(CYGPATH_W) '$(srcdir)/Phase_One_Search.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Phase_One_Search.Tpo $(DEPDIR)/libnomadmpi_a-Phase_One_Search.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Phase_One_Search.cpp' object='libnomadmpi_a-Phase_One_Search.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Phase_One_Search.obj `if test -f 'Phase_One_Search.cpp'; then $(CYGPATH_W) 'Phase_One_Search.cpp'; else $(CYGPATH_W) '$(srcdir)/Phase_One_Search.cpp'; fi` - -libnomadmpi_a-Point.o: Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Point.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Point.Tpo -c -o libnomadmpi_a-Point.o `test -f 'Point.cpp' || echo '$(srcdir)/'`Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Point.Tpo $(DEPDIR)/libnomadmpi_a-Point.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Point.cpp' object='libnomadmpi_a-Point.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Point.o `test -f 'Point.cpp' || echo '$(srcdir)/'`Point.cpp - -libnomadmpi_a-Point.obj: Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Point.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Point.Tpo -c -o libnomadmpi_a-Point.obj `if test -f 'Point.cpp'; then $(CYGPATH_W) 'Point.cpp'; else $(CYGPATH_W) '$(srcdir)/Point.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Point.Tpo $(DEPDIR)/libnomadmpi_a-Point.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Point.cpp' object='libnomadmpi_a-Point.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Point.obj `if test -f 'Point.cpp'; then $(CYGPATH_W) 'Point.cpp'; else $(CYGPATH_W) '$(srcdir)/Point.cpp'; fi` - -libnomadmpi_a-Priority_Eval_Point.o: Priority_Eval_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Priority_Eval_Point.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Priority_Eval_Point.Tpo -c -o libnomadmpi_a-Priority_Eval_Point.o `test -f 'Priority_Eval_Point.cpp' || echo '$(srcdir)/'`Priority_Eval_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Priority_Eval_Point.Tpo $(DEPDIR)/libnomadmpi_a-Priority_Eval_Point.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Priority_Eval_Point.cpp' object='libnomadmpi_a-Priority_Eval_Point.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Priority_Eval_Point.o `test -f 'Priority_Eval_Point.cpp' || echo '$(srcdir)/'`Priority_Eval_Point.cpp - -libnomadmpi_a-Priority_Eval_Point.obj: Priority_Eval_Point.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Priority_Eval_Point.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Priority_Eval_Point.Tpo -c -o libnomadmpi_a-Priority_Eval_Point.obj `if test -f 'Priority_Eval_Point.cpp'; then $(CYGPATH_W) 'Priority_Eval_Point.cpp'; else $(CYGPATH_W) '$(srcdir)/Priority_Eval_Point.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Priority_Eval_Point.Tpo $(DEPDIR)/libnomadmpi_a-Priority_Eval_Point.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Priority_Eval_Point.cpp' object='libnomadmpi_a-Priority_Eval_Point.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Priority_Eval_Point.obj `if test -f 'Priority_Eval_Point.cpp'; then $(CYGPATH_W) 'Priority_Eval_Point.cpp'; else $(CYGPATH_W) '$(srcdir)/Priority_Eval_Point.cpp'; fi` - -libnomadmpi_a-Quad_Model.o: Quad_Model.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Quad_Model.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Quad_Model.Tpo -c -o libnomadmpi_a-Quad_Model.o `test -f 'Quad_Model.cpp' || echo '$(srcdir)/'`Quad_Model.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Quad_Model.Tpo $(DEPDIR)/libnomadmpi_a-Quad_Model.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Quad_Model.cpp' object='libnomadmpi_a-Quad_Model.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Quad_Model.o `test -f 'Quad_Model.cpp' || echo '$(srcdir)/'`Quad_Model.cpp - -libnomadmpi_a-Quad_Model.obj: Quad_Model.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Quad_Model.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Quad_Model.Tpo -c -o libnomadmpi_a-Quad_Model.obj `if test -f 'Quad_Model.cpp'; then $(CYGPATH_W) 'Quad_Model.cpp'; else $(CYGPATH_W) '$(srcdir)/Quad_Model.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Quad_Model.Tpo $(DEPDIR)/libnomadmpi_a-Quad_Model.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Quad_Model.cpp' object='libnomadmpi_a-Quad_Model.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Quad_Model.obj `if test -f 'Quad_Model.cpp'; then $(CYGPATH_W) 'Quad_Model.cpp'; else $(CYGPATH_W) '$(srcdir)/Quad_Model.cpp'; fi` - -libnomadmpi_a-Quad_Model_Evaluator.o: Quad_Model_Evaluator.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Quad_Model_Evaluator.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Quad_Model_Evaluator.Tpo -c -o libnomadmpi_a-Quad_Model_Evaluator.o `test -f 'Quad_Model_Evaluator.cpp' || echo '$(srcdir)/'`Quad_Model_Evaluator.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Quad_Model_Evaluator.Tpo $(DEPDIR)/libnomadmpi_a-Quad_Model_Evaluator.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Quad_Model_Evaluator.cpp' object='libnomadmpi_a-Quad_Model_Evaluator.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Quad_Model_Evaluator.o `test -f 'Quad_Model_Evaluator.cpp' || echo '$(srcdir)/'`Quad_Model_Evaluator.cpp - -libnomadmpi_a-Quad_Model_Evaluator.obj: Quad_Model_Evaluator.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Quad_Model_Evaluator.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Quad_Model_Evaluator.Tpo -c -o libnomadmpi_a-Quad_Model_Evaluator.obj `if test -f 'Quad_Model_Evaluator.cpp'; then $(CYGPATH_W) 'Quad_Model_Evaluator.cpp'; else $(CYGPATH_W) '$(srcdir)/Quad_Model_Evaluator.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Quad_Model_Evaluator.Tpo $(DEPDIR)/libnomadmpi_a-Quad_Model_Evaluator.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Quad_Model_Evaluator.cpp' object='libnomadmpi_a-Quad_Model_Evaluator.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Quad_Model_Evaluator.obj `if test -f 'Quad_Model_Evaluator.cpp'; then $(CYGPATH_W) 'Quad_Model_Evaluator.cpp'; else $(CYGPATH_W) '$(srcdir)/Quad_Model_Evaluator.cpp'; fi` - -libnomadmpi_a-Quad_Model_Search.o: Quad_Model_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Quad_Model_Search.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Quad_Model_Search.Tpo -c -o libnomadmpi_a-Quad_Model_Search.o `test -f 'Quad_Model_Search.cpp' || echo '$(srcdir)/'`Quad_Model_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Quad_Model_Search.Tpo $(DEPDIR)/libnomadmpi_a-Quad_Model_Search.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Quad_Model_Search.cpp' object='libnomadmpi_a-Quad_Model_Search.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Quad_Model_Search.o `test -f 'Quad_Model_Search.cpp' || echo '$(srcdir)/'`Quad_Model_Search.cpp - -libnomadmpi_a-Quad_Model_Search.obj: Quad_Model_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Quad_Model_Search.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Quad_Model_Search.Tpo -c -o libnomadmpi_a-Quad_Model_Search.obj `if test -f 'Quad_Model_Search.cpp'; then $(CYGPATH_W) 'Quad_Model_Search.cpp'; else $(CYGPATH_W) '$(srcdir)/Quad_Model_Search.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Quad_Model_Search.Tpo $(DEPDIR)/libnomadmpi_a-Quad_Model_Search.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Quad_Model_Search.cpp' object='libnomadmpi_a-Quad_Model_Search.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Quad_Model_Search.obj `if test -f 'Quad_Model_Search.cpp'; then $(CYGPATH_W) 'Quad_Model_Search.cpp'; else $(CYGPATH_W) '$(srcdir)/Quad_Model_Search.cpp'; fi` - -libnomadmpi_a-Random_Pickup.o: Random_Pickup.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Random_Pickup.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Random_Pickup.Tpo -c -o libnomadmpi_a-Random_Pickup.o `test -f 'Random_Pickup.cpp' || echo '$(srcdir)/'`Random_Pickup.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Random_Pickup.Tpo $(DEPDIR)/libnomadmpi_a-Random_Pickup.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Random_Pickup.cpp' object='libnomadmpi_a-Random_Pickup.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Random_Pickup.o `test -f 'Random_Pickup.cpp' || echo '$(srcdir)/'`Random_Pickup.cpp - -libnomadmpi_a-Random_Pickup.obj: Random_Pickup.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Random_Pickup.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Random_Pickup.Tpo -c -o libnomadmpi_a-Random_Pickup.obj `if test -f 'Random_Pickup.cpp'; then $(CYGPATH_W) 'Random_Pickup.cpp'; else $(CYGPATH_W) '$(srcdir)/Random_Pickup.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Random_Pickup.Tpo $(DEPDIR)/libnomadmpi_a-Random_Pickup.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Random_Pickup.cpp' object='libnomadmpi_a-Random_Pickup.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Random_Pickup.obj `if test -f 'Random_Pickup.cpp'; then $(CYGPATH_W) 'Random_Pickup.cpp'; else $(CYGPATH_W) '$(srcdir)/Random_Pickup.cpp'; fi` - -libnomadmpi_a-RNG.o: RNG.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-RNG.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-RNG.Tpo -c -o libnomadmpi_a-RNG.o `test -f 'RNG.cpp' || echo '$(srcdir)/'`RNG.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-RNG.Tpo $(DEPDIR)/libnomadmpi_a-RNG.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RNG.cpp' object='libnomadmpi_a-RNG.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-RNG.o `test -f 'RNG.cpp' || echo '$(srcdir)/'`RNG.cpp - -libnomadmpi_a-RNG.obj: RNG.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-RNG.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-RNG.Tpo -c -o libnomadmpi_a-RNG.obj `if test -f 'RNG.cpp'; then $(CYGPATH_W) 'RNG.cpp'; else $(CYGPATH_W) '$(srcdir)/RNG.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-RNG.Tpo $(DEPDIR)/libnomadmpi_a-RNG.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RNG.cpp' object='libnomadmpi_a-RNG.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-RNG.obj `if test -f 'RNG.cpp'; then $(CYGPATH_W) 'RNG.cpp'; else $(CYGPATH_W) '$(srcdir)/RNG.cpp'; fi` - -libnomadmpi_a-Signature.o: Signature.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Signature.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Signature.Tpo -c -o libnomadmpi_a-Signature.o `test -f 'Signature.cpp' || echo '$(srcdir)/'`Signature.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Signature.Tpo $(DEPDIR)/libnomadmpi_a-Signature.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Signature.cpp' object='libnomadmpi_a-Signature.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Signature.o `test -f 'Signature.cpp' || echo '$(srcdir)/'`Signature.cpp - -libnomadmpi_a-Signature.obj: Signature.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Signature.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Signature.Tpo -c -o libnomadmpi_a-Signature.obj `if test -f 'Signature.cpp'; then $(CYGPATH_W) 'Signature.cpp'; else $(CYGPATH_W) '$(srcdir)/Signature.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Signature.Tpo $(DEPDIR)/libnomadmpi_a-Signature.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Signature.cpp' object='libnomadmpi_a-Signature.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Signature.obj `if test -f 'Signature.cpp'; then $(CYGPATH_W) 'Signature.cpp'; else $(CYGPATH_W) '$(srcdir)/Signature.cpp'; fi` - -libnomadmpi_a-Slave.o: Slave.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Slave.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Slave.Tpo -c -o libnomadmpi_a-Slave.o `test -f 'Slave.cpp' || echo '$(srcdir)/'`Slave.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Slave.Tpo $(DEPDIR)/libnomadmpi_a-Slave.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Slave.cpp' object='libnomadmpi_a-Slave.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Slave.o `test -f 'Slave.cpp' || echo '$(srcdir)/'`Slave.cpp - -libnomadmpi_a-Slave.obj: Slave.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Slave.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Slave.Tpo -c -o libnomadmpi_a-Slave.obj `if test -f 'Slave.cpp'; then $(CYGPATH_W) 'Slave.cpp'; else $(CYGPATH_W) '$(srcdir)/Slave.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Slave.Tpo $(DEPDIR)/libnomadmpi_a-Slave.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Slave.cpp' object='libnomadmpi_a-Slave.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Slave.obj `if test -f 'Slave.cpp'; then $(CYGPATH_W) 'Slave.cpp'; else $(CYGPATH_W) '$(srcdir)/Slave.cpp'; fi` - -libnomadmpi_a-Speculative_Search.o: Speculative_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Speculative_Search.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Speculative_Search.Tpo -c -o libnomadmpi_a-Speculative_Search.o `test -f 'Speculative_Search.cpp' || echo '$(srcdir)/'`Speculative_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Speculative_Search.Tpo $(DEPDIR)/libnomadmpi_a-Speculative_Search.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Speculative_Search.cpp' object='libnomadmpi_a-Speculative_Search.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Speculative_Search.o `test -f 'Speculative_Search.cpp' || echo '$(srcdir)/'`Speculative_Search.cpp - -libnomadmpi_a-Speculative_Search.obj: Speculative_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Speculative_Search.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Speculative_Search.Tpo -c -o libnomadmpi_a-Speculative_Search.obj `if test -f 'Speculative_Search.cpp'; then $(CYGPATH_W) 'Speculative_Search.cpp'; else $(CYGPATH_W) '$(srcdir)/Speculative_Search.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Speculative_Search.Tpo $(DEPDIR)/libnomadmpi_a-Speculative_Search.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Speculative_Search.cpp' object='libnomadmpi_a-Speculative_Search.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Speculative_Search.obj `if test -f 'Speculative_Search.cpp'; then $(CYGPATH_W) 'Speculative_Search.cpp'; else $(CYGPATH_W) '$(srcdir)/Speculative_Search.cpp'; fi` - -libnomadmpi_a-Stats.o: Stats.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Stats.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Stats.Tpo -c -o libnomadmpi_a-Stats.o `test -f 'Stats.cpp' || echo '$(srcdir)/'`Stats.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Stats.Tpo $(DEPDIR)/libnomadmpi_a-Stats.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Stats.cpp' object='libnomadmpi_a-Stats.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Stats.o `test -f 'Stats.cpp' || echo '$(srcdir)/'`Stats.cpp - -libnomadmpi_a-Stats.obj: Stats.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Stats.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Stats.Tpo -c -o libnomadmpi_a-Stats.obj `if test -f 'Stats.cpp'; then $(CYGPATH_W) 'Stats.cpp'; else $(CYGPATH_W) '$(srcdir)/Stats.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Stats.Tpo $(DEPDIR)/libnomadmpi_a-Stats.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Stats.cpp' object='libnomadmpi_a-Stats.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Stats.obj `if test -f 'Stats.cpp'; then $(CYGPATH_W) 'Stats.cpp'; else $(CYGPATH_W) '$(srcdir)/Stats.cpp'; fi` - -libnomadmpi_a-utils.o: utils.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-utils.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-utils.Tpo -c -o libnomadmpi_a-utils.o `test -f 'utils.cpp' || echo '$(srcdir)/'`utils.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-utils.Tpo $(DEPDIR)/libnomadmpi_a-utils.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='utils.cpp' object='libnomadmpi_a-utils.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-utils.o `test -f 'utils.cpp' || echo '$(srcdir)/'`utils.cpp - -libnomadmpi_a-utils.obj: utils.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-utils.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-utils.Tpo -c -o libnomadmpi_a-utils.obj `if test -f 'utils.cpp'; then $(CYGPATH_W) 'utils.cpp'; else $(CYGPATH_W) '$(srcdir)/utils.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-utils.Tpo $(DEPDIR)/libnomadmpi_a-utils.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='utils.cpp' object='libnomadmpi_a-utils.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-utils.obj `if test -f 'utils.cpp'; then $(CYGPATH_W) 'utils.cpp'; else $(CYGPATH_W) '$(srcdir)/utils.cpp'; fi` - -libnomadmpi_a-Variable_Group.o: Variable_Group.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Variable_Group.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Variable_Group.Tpo -c -o libnomadmpi_a-Variable_Group.o `test -f 'Variable_Group.cpp' || echo '$(srcdir)/'`Variable_Group.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Variable_Group.Tpo $(DEPDIR)/libnomadmpi_a-Variable_Group.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Variable_Group.cpp' object='libnomadmpi_a-Variable_Group.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Variable_Group.o `test -f 'Variable_Group.cpp' || echo '$(srcdir)/'`Variable_Group.cpp - -libnomadmpi_a-Variable_Group.obj: Variable_Group.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-Variable_Group.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-Variable_Group.Tpo -c -o libnomadmpi_a-Variable_Group.obj `if test -f 'Variable_Group.cpp'; then $(CYGPATH_W) 'Variable_Group.cpp'; else $(CYGPATH_W) '$(srcdir)/Variable_Group.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-Variable_Group.Tpo $(DEPDIR)/libnomadmpi_a-Variable_Group.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Variable_Group.cpp' object='libnomadmpi_a-Variable_Group.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-Variable_Group.obj `if test -f 'Variable_Group.cpp'; then $(CYGPATH_W) 'Variable_Group.cpp'; else $(CYGPATH_W) '$(srcdir)/Variable_Group.cpp'; fi` - -libnomadmpi_a-VNS_Search.o: VNS_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-VNS_Search.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-VNS_Search.Tpo -c -o libnomadmpi_a-VNS_Search.o `test -f 'VNS_Search.cpp' || echo '$(srcdir)/'`VNS_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-VNS_Search.Tpo $(DEPDIR)/libnomadmpi_a-VNS_Search.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='VNS_Search.cpp' object='libnomadmpi_a-VNS_Search.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-VNS_Search.o `test -f 'VNS_Search.cpp' || echo '$(srcdir)/'`VNS_Search.cpp - -libnomadmpi_a-VNS_Search.obj: VNS_Search.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-VNS_Search.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-VNS_Search.Tpo -c -o libnomadmpi_a-VNS_Search.obj `if test -f 'VNS_Search.cpp'; then $(CYGPATH_W) 'VNS_Search.cpp'; else $(CYGPATH_W) '$(srcdir)/VNS_Search.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-VNS_Search.Tpo $(DEPDIR)/libnomadmpi_a-VNS_Search.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='VNS_Search.cpp' object='libnomadmpi_a-VNS_Search.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-VNS_Search.obj `if test -f 'VNS_Search.cpp'; then $(CYGPATH_W) 'VNS_Search.cpp'; else $(CYGPATH_W) '$(srcdir)/VNS_Search.cpp'; fi` - -libnomadmpi_a-OrthogonalMesh.o: OrthogonalMesh.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-OrthogonalMesh.o -MD -MP -MF $(DEPDIR)/libnomadmpi_a-OrthogonalMesh.Tpo -c -o libnomadmpi_a-OrthogonalMesh.o `test -f 'OrthogonalMesh.cpp' || echo '$(srcdir)/'`OrthogonalMesh.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-OrthogonalMesh.Tpo $(DEPDIR)/libnomadmpi_a-OrthogonalMesh.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OrthogonalMesh.cpp' object='libnomadmpi_a-OrthogonalMesh.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-OrthogonalMesh.o `test -f 'OrthogonalMesh.cpp' || echo '$(srcdir)/'`OrthogonalMesh.cpp - -libnomadmpi_a-OrthogonalMesh.obj: OrthogonalMesh.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -MT libnomadmpi_a-OrthogonalMesh.obj -MD -MP -MF $(DEPDIR)/libnomadmpi_a-OrthogonalMesh.Tpo -c -o libnomadmpi_a-OrthogonalMesh.obj `if test -f 'OrthogonalMesh.cpp'; then $(CYGPATH_W) 'OrthogonalMesh.cpp'; else $(CYGPATH_W) '$(srcdir)/OrthogonalMesh.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libnomadmpi_a-OrthogonalMesh.Tpo $(DEPDIR)/libnomadmpi_a-OrthogonalMesh.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OrthogonalMesh.cpp' object='libnomadmpi_a-OrthogonalMesh.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnomadmpi_a_CXXFLAGS) $(CXXFLAGS) -c -o libnomadmpi_a-OrthogonalMesh.obj `if test -f 'OrthogonalMesh.cpp'; then $(CYGPATH_W) 'OrthogonalMesh.cpp'; else $(CYGPATH_W) '$(srcdir)/OrthogonalMesh.cpp'; fi` - -nomad_mpi-nomad.o: nomad.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nomad_mpi_CXXFLAGS) $(CXXFLAGS) -MT nomad_mpi-nomad.o -MD -MP -MF $(DEPDIR)/nomad_mpi-nomad.Tpo -c -o nomad_mpi-nomad.o `test -f 'nomad.cpp' || echo '$(srcdir)/'`nomad.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nomad_mpi-nomad.Tpo $(DEPDIR)/nomad_mpi-nomad.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='nomad.cpp' object='nomad_mpi-nomad.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nomad_mpi_CXXFLAGS) $(CXXFLAGS) -c -o nomad_mpi-nomad.o `test -f 'nomad.cpp' || echo '$(srcdir)/'`nomad.cpp - -nomad_mpi-nomad.obj: nomad.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nomad_mpi_CXXFLAGS) $(CXXFLAGS) -MT nomad_mpi-nomad.obj -MD -MP -MF $(DEPDIR)/nomad_mpi-nomad.Tpo -c -o nomad_mpi-nomad.obj `if test -f 'nomad.cpp'; then $(CYGPATH_W) 'nomad.cpp'; else $(CYGPATH_W) '$(srcdir)/nomad.cpp'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nomad_mpi-nomad.Tpo $(DEPDIR)/nomad_mpi-nomad.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='nomad.cpp' object='nomad_mpi-nomad.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nomad_mpi_CXXFLAGS) $(CXXFLAGS) -c -o nomad_mpi-nomad.obj `if test -f 'nomad.cpp'; then $(CYGPATH_W) 'nomad.cpp'; else $(CYGPATH_W) '$(srcdir)/nomad.cpp'; fi` -install-nodist_pkgconfigDATA: $(nodist_pkgconfig_DATA) - @$(NORMAL_INSTALL) - @list='$(nodist_pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ - done - -uninstall-nodist_pkgconfigDATA: - @$(NORMAL_UNINSTALL) - @list='$(nodist_pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) -install-pkgincludeHEADERS: $(pkginclude_HEADERS) - @$(NORMAL_INSTALL) - @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ - $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ - done - -uninstall-pkgincludeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) -installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgincludedir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-binPROGRAMS clean-generic clean-libLIBRARIES \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-nodist_pkgconfigDATA \ - install-pkgincludeHEADERS - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-binPROGRAMS install-libLIBRARIES - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-binPROGRAMS uninstall-libLIBRARIES \ - uninstall-nodist_pkgconfigDATA uninstall-pkgincludeHEADERS - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ - clean-binPROGRAMS clean-generic clean-libLIBRARIES \ - cscopelist-am ctags ctags-am distclean distclean-compile \ - distclean-generic distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-binPROGRAMS \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-libLIBRARIES install-man \ - install-nodist_pkgconfigDATA install-pdf install-pdf-am \ - install-pkgincludeHEADERS install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ - tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \ - uninstall-libLIBRARIES uninstall-nodist_pkgconfigDATA \ - uninstall-pkgincludeHEADERS - -.PRECIOUS: Makefile - -nomad.pc: ../nomad.pc.in -@MPI_ENABLED_TRUE@nomadmpi.pc: ../nomadmpi.pc.in - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: -- GitLab