From 6a4079b0fbe65c03372862f4a4089d5093a8fa71 Mon Sep 17 00:00:00 2001 From: Miroslav Shaltev <miroslav.shaltev@shaltev.de> Date: Wed, 7 Dec 2016 23:02:45 +0100 Subject: [PATCH] Update to Nomad 3.7.3 --- doc/user_guide.pdf | Bin 1389306 -> 1787689 bytes .../advanced/categorical/batch/runExample.log | 18 +- examples/advanced/categorical/bi_obj/makefile | 72 +- .../categorical/bi_obj/runExample.log | 75 +- .../advanced/categorical/single_obj/makefile | 72 +- .../categorical/single_obj/runExample.log | 2280 ++++-- examples/advanced/multi_start/best_x.txt | 2 +- examples/advanced/multi_start/makefile | 36 +- examples/advanced/multi_start/runExample.log | 18 +- examples/advanced/plot/makefile | 41 +- examples/advanced/restart/makefile | 64 +- examples/advanced/restart/restart.cpp | 295 +- examples/advanced/user_search/makefile | 65 +- examples/basic/batch/bi_obj/runExample.log | 275 +- .../basic/batch/single_obj/runExample.log | 30 +- .../batch/single_obj_parallel/bb_parallel.cpp | 185 +- .../basic/batch/single_obj_parallel/param.txt | 1 + .../batch/single_obj_parallel/runExample.log | 30 +- examples/basic/library/bi_obj/makefile | 70 +- examples/basic/library/bi_obj/runExample.log | 27 +- .../basic/library/single_obj/basic_lib.cpp | 8 +- examples/basic/library/single_obj/makefile | 70 +- .../basic/library/single_obj/runExample.log | 18 +- .../library/single_obj_parallel/basic_lib.cpp | 358 +- .../library/single_obj_parallel/makefile | 49 +- .../single_obj_parallel/runExample.log | 17 +- examples/interfaces/DLL/bi_obj/makefile | 44 +- examples/interfaces/DLL/single_obj/makefile | 41 +- examples/interfaces/FORTRAN/example1/makefile | 51 +- .../FORTRAN/example1/runExample.log | 19 +- examples/interfaces/FORTRAN/example2/makefile | 43 +- .../Matlab_MEX/{ => Functions}/nomad.m | 8 +- .../Matlab_MEX/{ => Functions}/nomadset.m | 0 .../interfaces/Matlab_MEX/GERAD_NOMAD_build.m | 184 +- .../interfaces/Matlab_MEX/Source/nomadmex.cpp | 659 +- .../example_categorical/run_nomad.m | 2 +- .../Matlab_MEX/example_extra_param/bb.m | 8 + .../example_extra_param/run_nomad.m | 7 + .../example_group_variables/param.txt | 2 + .../Matlab_MEX/example_group_variables/test.m | 19 + .../example_int_variables/param.txt | 3 + .../Matlab_MEX/example_int_variables/run.m | 10 + .../Matlab_MEX/example_int_variables/run2.m | 23 + .../interfaces/Matlab_MEX/test_nomad_gerad.m | 17 +- install/install.sh | 79 +- install/readme.MPI_for_MINGW.rtf | 24 - readme.txt | 77 +- src/Barrier.cpp | 150 +- src/Barrier.hpp | 525 +- src/Cache.cpp | 164 +- src/Cache.hpp | 715 +- src/Cache_File_Point.cpp | 461 +- src/Cache_File_Point.hpp | 315 +- src/Cache_Point.cpp | 43 +- src/Cache_Point.hpp | 129 +- src/Cache_Search.cpp | 248 +- src/Cache_Search.hpp | 125 +- src/Clock.cpp | 37 +- src/Clock.hpp | 161 +- src/Direction.cpp | 151 +- src/Direction.hpp | 385 +- src/Directions.cpp | 116 +- src/Directions.hpp | 40 +- src/Display.cpp | 56 +- src/Display.hpp | 931 +-- src/Double.cpp | 112 +- src/Double.hpp | 902 +-- src/Eval_Point.cpp | 59 +- src/Eval_Point.hpp | 44 +- src/Evaluator.cpp | 1506 ++-- src/Evaluator.hpp | 455 +- src/Evaluator_Control.cpp | 6349 ++++++++-------- src/Evaluator_Control.hpp | 154 +- src/Exception.cpp | 49 +- src/Exception.hpp | 111 +- src/Extended_Poll.cpp | 110 +- src/Extended_Poll.hpp | 396 +- src/Filter_Point.hpp | 25 +- src/LH_Search.cpp | 29 +- src/LH_Search.hpp | 197 +- src/L_Curve.cpp | 111 +- src/L_Curve.hpp | 111 +- src/Mads.cpp | 6704 +++++++++-------- src/Mads.hpp | 116 +- src/Makefile.am | 11 +- src/Model_Sorted_Point.cpp | 94 +- src/Model_Sorted_Point.hpp | 161 +- src/Model_Stats.cpp | 343 +- src/Model_Stats.hpp | 643 +- src/Multi_Obj_Evaluator.cpp | 249 +- src/Multi_Obj_Evaluator.hpp | 215 +- src/Multi_Obj_Quad_Model_Evaluator.hpp | 67 +- src/OrthogonalMesh.cpp | 172 +- src/OrthogonalMesh.hpp | 633 +- src/Parameter_Entries.cpp | 88 +- src/Parameter_Entries.hpp | 150 +- src/Parameter_Entry.cpp | 314 +- src/Parameter_Entry.hpp | 29 +- src/Parameters.cpp | 1824 +++-- src/Parameters.hpp | 212 +- src/Pareto_Front.cpp | 676 +- src/Pareto_Front.hpp | 246 +- src/Pareto_Point.cpp | 107 +- src/Pareto_Point.hpp | 235 +- src/Phase_One_Evaluator.cpp | 77 +- src/Phase_One_Evaluator.hpp | 32 +- src/Phase_One_Search.cpp | 73 +- src/Phase_One_Search.hpp | 115 +- src/Point.cpp | 711 +- src/Point.hpp | 833 +- src/Priority_Eval_Point.cpp | 405 +- src/Priority_Eval_Point.hpp | 383 +- src/Quad_Model.cpp | 352 +- src/Quad_Model.hpp | 831 +- src/Quad_Model_Evaluator.cpp | 338 +- src/Quad_Model_Evaluator.hpp | 25 +- src/Quad_Model_Search.cpp | 142 +- src/Quad_Model_Search.hpp | 232 +- src/RNG.cpp | 74 +- src/RNG.hpp | 114 +- src/Random_Pickup.cpp | 80 +- src/Random_Pickup.hpp | 25 +- src/SMesh.cpp | 410 +- src/SMesh.hpp | 394 +- src/Search.hpp | 178 +- src/Set_Element.hpp | 249 +- src/Signature.cpp | 489 +- src/Signature.hpp | 215 +- src/Signature_Element.hpp | 25 +- src/Single_Obj_Quad_Model_Evaluator.hpp | 68 +- src/Slave.cpp | 85 +- src/Slave.hpp | 427 +- src/Speculative_Search.cpp | 44 +- src/Speculative_Search.hpp | 127 +- src/Stats.cpp | 505 +- src/Stats.hpp | 992 +-- src/TGP_Model.cpp | 1551 ---- src/TGP_Model.hpp | 397 - src/TGP_Model_Evaluator.cpp | 65 - src/TGP_Model_Evaluator.hpp | 98 - src/TGP_Model_Search.cpp | 1683 ----- src/TGP_Model_Search.hpp | 332 - src/TGP_Output_Model.cpp | 486 -- src/TGP_Output_Model.hpp | 241 - src/Uncopyable.hpp | 25 +- src/VNS_Search.cpp | 120 +- src/VNS_Search.hpp | 137 +- src/Variable_Group.cpp | 51 +- src/Variable_Group.hpp | 50 +- src/XMesh.cpp | 571 +- src/XMesh.hpp | 437 +- src/defines.hpp | 88 +- src/nomad.cpp | 54 +- src/nomad.hpp | 27 +- src/utils.cpp | 1831 ++--- src/utils.hpp | 467 +- tools/COOP-MADS/makefile | 46 +- tools/COOP-MADS/problems/G2_10/runExample.log | 31 +- .../problems/RHEOLOGY/runExample.log | 231 +- tools/COOP-MADS/readme.txt | 2 + tools/PSD-MADS/makefile | 45 +- tools/PSD-MADS/problems/G2_10/runExample.log | 68 +- tools/PSD-MADS/readme.txt | 2 + tools/PSD-MADS_library_mode/makefile | 42 +- tools/SENSITIVITY/cache_inspect/makefile | 49 +- tools/SENSITIVITY/detailed_analysis/makefile | 52 +- utils/DisplayCacheFile/Readme.txt | 20 + utils/DisplayCacheFile/build.m | 87 + utils/DisplayCacheFile/cache1.bin | Bin 0 -> 17715 bytes utils/DisplayCacheFile/displayCache.cpp | 66 + utils/DisplayCacheFile/displayCacheM.cpp | 89 + utils/DisplayCacheFile/makefile | 60 + utils/MergeCacheFiles/build.m | 81 +- utils/MergeCacheFiles/makefile | 46 +- utils/Run_TestSuite/readme.txt | 2 + utils/Run_TestSuite/runNomadAll_parallel.pl | 54 +- 176 files changed, 26355 insertions(+), 26736 deletions(-) rename examples/interfaces/Matlab_MEX/{ => Functions}/nomad.m (83%) rename examples/interfaces/Matlab_MEX/{ => Functions}/nomadset.m (100%) create mode 100644 examples/interfaces/Matlab_MEX/example_extra_param/bb.m create mode 100644 examples/interfaces/Matlab_MEX/example_extra_param/run_nomad.m create mode 100644 examples/interfaces/Matlab_MEX/example_group_variables/param.txt create mode 100644 examples/interfaces/Matlab_MEX/example_group_variables/test.m create mode 100644 examples/interfaces/Matlab_MEX/example_int_variables/param.txt create mode 100644 examples/interfaces/Matlab_MEX/example_int_variables/run.m create mode 100644 examples/interfaces/Matlab_MEX/example_int_variables/run2.m delete mode 100644 install/readme.MPI_for_MINGW.rtf delete mode 100644 src/TGP_Model.cpp delete mode 100644 src/TGP_Model.hpp delete mode 100644 src/TGP_Model_Evaluator.cpp delete mode 100644 src/TGP_Model_Evaluator.hpp delete mode 100644 src/TGP_Model_Search.cpp delete mode 100644 src/TGP_Model_Search.hpp delete mode 100644 src/TGP_Output_Model.cpp delete mode 100644 src/TGP_Output_Model.hpp create mode 100644 utils/DisplayCacheFile/Readme.txt create mode 100644 utils/DisplayCacheFile/build.m create mode 100644 utils/DisplayCacheFile/cache1.bin create mode 100644 utils/DisplayCacheFile/displayCache.cpp create mode 100644 utils/DisplayCacheFile/displayCacheM.cpp create mode 100644 utils/DisplayCacheFile/makefile diff --git a/doc/user_guide.pdf b/doc/user_guide.pdf index 9d7d24922c4389db5d4da282552f411c8a276da8..89d8868221345c8ab22ef416259f945dd8a164ba 100644 GIT binary patch delta 895296 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⁣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	ee9K!q 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%0Dl^zS2{{ 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 X=@*PdWqHjlj4Uk8xl~nM{oS|#na|<V delta 503486 zcmZ44m;38!$c6>1jK-4}vRc+F9lUdASK;i;$!397g*6K_Jq}G#3Kd$V{`YHSf@8mn z{iP+7d(v7|cl77)zsovfGVjTgSC#s;oBz)-2;$OGRd(`@;&7dH_tAS+(KRbhEhtcF z3uo0o)O_yemdbyp`zD^Q`^f%BZGB|PY}ucG6L(tFYjPd(IyG}r%1*VW@Q|hzT=lNq zF%zG5#i*~p|EH{QW?EC{lfM~k`X`^fN(fim8@W#@CNNS|<#A7#&*GEwHT8vzd$zs5 z5D>ue=&E8;rHtX@Sz)RS!IO$)&)%;U=(>At@n*GK|FaC<EWLYWd*-vf+tU?mj%gSa zN&P$iHo^V+`|WINr)RF5e9-N%VC>bqTpz{f)nDG(d@J2x%L<)I-G@(Etgnk-KY!YR ze|s{Rgf5?%TwObPvgn>_*CH(~-*-*V`aDjAbMh8>-*asAs}Y%Gu#)lIW<7_<>?o$p z7fQ>g9%uO<uKuYrTX$9R{kr&1lcqIPeKM2SG;eqJ$)wc{><>IN-*GRuoa*FsoI|VR z&6N4SLpD6A=hM&*eN+|0zj(cqrttJMotw*aHpWR57C-*|;wb0l=lYf(7#Kcv{q*4B z3gOTYSngHa^F=ZJ=^2i!@*EMD3ehY23K9ypXPo0H?dIQB%<S;QDpFReeJ<DSzf#v% zzGn4*(-Hk!WD2|StaCH3K4A%6kob)+jajksT)VHz|F>70V(Qsb%bFw-E~bAzm&7;2 z;`gc}@w2U2xI!h4J?61YlUTw2wuf`omD=z1c9M49YB}r9+;}i2bB^(i+ut<xCvzy9 zxIV}&DV5fKcxX<O!ME)8Qwj0anH~AB{_flA`}VX;zu@Ut+zQ?QSu2^@85Wgryxqt7 zZq02u)3fC(UR{|T5S|`g|2tpd+0o=9F%^?kwU@DdND3~G(@<P9p@6H+_x3}nnKJX2 zUCKUbIrW~b!Phl`KQFAXSoQTd$9ZA7Yqz#76kxV{{NwBPwKpFgJN1L*PvWJY!AFY= z*z#F^WSiGsXgl>L=d*<2;=*%fvm*-YC2N+k{%*c4e`mY?JEN;i4d(T|mrJhH^RbtO zR|m)^_s=S`cg*|W=o66M;>(aL^?GOKJN|V>M&?hu-6e0?RIc0j-z+>UF1$_s_McM> z2~(!qY*IG3dp|n(G4H}j$98G>%JL=6(VM`w*{u2HEQ4hqYW}LMX*qAW@yVN+DhFm( z6<FOr5@lZ`KQHE=R(e5wSbTA*{g0*(b^;QQ<3F)ZJa4D6{HyS9rR<jGRL<?GoQzp7 z>u)o&-CWUpklDxR<ofro7z?A8PmlW&vE_d9)}{r@N*P-f>h_%$H~-G*s?*sbBJz}7 z<&j1shq_HtWZNgM+T;9H63qtZlJ3Z!ne$-Lo88~Ony}b^&Nseg!mQ#v#VvA{5wqvx zj&z<@CZ|iz>&*MNpH@i8Joa%{w)EXqN(n;W8_w6W+?(TGdny0uirv>-Ebg%j)Rn$= zH@%Wqn!PBLarykI-8!Y~PhDL2#wIOt_h0@=lNMU{sQpMX;x_)m_2`NP<5xxH2hkQ2 z6$;sBa;pDdAkt>E;D_?+84){Eb!R1~H&?CkpMTMoWzs{Nk~KXSc=D@iujF2|NcjEG z$bZ)!U;ArwPuDME+43&r=GLp~mh)cwRnH0$y3um?pSZ+~)i37G7K(g&Npt_Px_K<0 zXFOcHUTcp2EVs&s=U2%uaQdg$`g&34)2<!*vIh=s<eVksl$KG*cvknz9c8}oGp{V` z7_a7q`pq!#TvK&9YQf6AX_>pD{mwjiRX?-6IPjO>$_HtF>FOyLwk7Udf1^H%*)8du z{a)kON%w!8j?}JQ^PTT#-RiyO)?xJ}iZj-%pBa;@+wJqwYimHi+y0fO1T79fUh(VO z`u38a5AxrwbeZBJdGgKv<}{l}F--nvlnowqY`G@CY2UN%`%N7h%G1|=Vbox<G@87S zRkQx>O#l4bW+DgP{}izbV$ZBu;^DPi$@B6V=Urk`yZJcE5>jreWqG&xSf91~t1+=i z=w#fMwe42#jxJ$&HSy2KkAIE7rOAC;cYZ^*{;~A^d%6!O2WliS-m7@U_&~s-Lgvwg zS?0p;#bT$mp5xy8?Z3?bw0%eADnfM^ysOz|rj+q!X8n1gIVMUQ#6M{GG~8UDe<kWS z<5Q-o!M9JX(duqb)jq%O=x$z(KH;`0LF{U)RE5Qo&V5^V`eY{u-$sFF3niCqYhS|p z)<fH5(_{OvpCM_L?rI$q3^G#l`1LMs@ZdRYkl1rYr|H}2h7S`AA3pn_sSx=;#8m3w zg%kV?#a;J$?Up9j|9<tI|NZ&<xALs^{hCphDad2!Zty2y-n&mldf`^<-&8ips{}T= zwXXB}%yuDVa%QO5UP;#D5*M3|4{ergY`@|o&cM5~U>1ww73rlCwKGpwy`G}5bzSs^ z-?f)7ceX6Lz&~T=j{srSlitpCKiFCxu%Eovemx*ZQHcGc)4I@Y+a&5|pH4M+Rhehq zmX=jrWT;)M6tMJ5%}rJrW^2DV9#{R3w=!i*57?~_HQc=C&DU247<dZ4?E0dwxoKgP zxMhdA*6HqbttRHCeSREw19sJH=rd~H{w>R>_*miP;z@yL>Y8Mkwmm&1d%a|H)KA9F zi5put7Vi0ZL@7>p$-G<T-p{*I>J2x}-E%`rc(u;&z+<@wl73A5*|D&u<#F-8i^Z?i zc8M&Tos{$@t-rzJh<2EP;g4s>bPvvo`?fV>%FDWm{%O^s?hN)bqow$-9y($u^V`so z|EsI$309-X$Q)jG;R)XYj&a&mPPyx0pTYb-edVRg74vUY*y}F8Wq#s)tXWgw)Z2{p zt0J;@8kBAHW6C*o?FQ53i#ty~+Z7n>l+ncS&pRn$y1U$GrcfU#?UMW7YxI{htzUn0 z_8kVn{|9zwFF2tWU!iaO`m^1RGY|Ub1$#ewzwcJ^?i}72qca5)k6&37a9`)n-1~b1 zk3NgGKdP`?<Ur)CnhmSmtV6GIS3cKb@jn}A{(3=uftAG3fTcObofnIp^CJ90rl#L& z+s$vw-F@=4$qau@A&IEnw=FMC_bPvO@(<Uci$^Q1cD=d!-fsExuj1FkYtKv03|9JL zE%I?i>8tBIuWdVaFnLPW_MpkHOR_6_TzLe)*>_czJl|5kRqnRv0x$7xp*yeWwd{^Q z@#gj2<Zn-Po~}v_JX{oZ()MTqqkFmI$pcHKytDZfSF~D<TYG!fqYrCSn7#Chi|<rl zGWcipM*1l8U6#9*cmK``7b|7GZ8t@G?X*|x_nvDuuDWs}$>rhCc|DGt8x@ZEaTF(7 z|8KZq82)(ke#WLrHm|2Qaxe)`fAND+l*!m&`oi=4n)PoZeWPz%2<&?v{zF54lGmmb z&*L9<e!0oSttmcFPR3n8w{Py&xgx(_hi{tFV!^kgbsE#&h;1pSCto*yzsI=o-d6U# zhtHi`@cE&_1Gy$!M%GVk;d0znEeidKHy&GjU{iiC^d>D+^YW$-`+4lDS~}xSbk^;Q znmzmExqk~j$Fsk*tbeiashGx_K&?F$mv;VP+B-4s_ltvZ3Ol}U-BtWZ(672<_H&{4 zdp`TKTkU>h_jBv*4{sE`o#m{wk6+v}W#@ffC$^6JqAm^ljqDp9te&fFY<-R^)4$K( z?(280-{Sh;^mbb`OlWM_^>de^Jl};`qQBhP5+9TXURdlB;qAfyGnVCR{cQhbOJ}Xf z4_vt^WWVtNhfrmv!z+4@e=Aw^_K-|Z%H1gpYzv;3Yqsbc3MkG?6mOZy;JAa;*Y?_k z!+bmEt_axJnj`g7YM#w3kH3}N-8VhN3fC<YU1xfQrAfczmVTRd#g&UfrdvMzoYDB_ z-MrHq*`_~k*_ZXfLg9_zhZjuNk2YA>UwShw-gV=a11E2182P3Iwzp0A@YU(_Tse=M zVZWl)AHHk)zv0;APi$(-rggIKb5IEX=$p8Fv$p%GWcOpKa=E*d)i{a-7O77#jGgrH zz;lT+L7C1ACjRLxTTuR?S9)JXM|2TiY|xi`u~NPvGO8!%D!)?E*4+`=+b1Bg+Ua?` zvrB!sbY|bC@Ck<xEs$M*K~+8cUs|V`cg($2CLL{A>$)PRtjIqnSsZz0Qc-i!hQ68R z&$Is&YJ~6G_Ta_&*5v0FT2Hr@sywa|+qcs<PfN<|Ls>)p{3+kG{{#ka`5^F$)9a&^ ztF-OABcE2TPwYOUXs&pg!{QS2y1o@wTpT9$uU2x$*Rw3B-?Mvvdft*gi`AFUKd&u5 z{;*EASfq`oal*DUN*@~k2;Ta0(cG!dr2kSx-<v~MX6>KQ`t`!WIWO98@~7~LpLl3g zI7jOJFFV051+KUY&UJCK5_Fx-W0rD8x@oQ47p3aGKIe<yJ5_e$rH`-2iQGK0G0FGG z_0oN5*Y9&lv(5LdH`$o$S8wW_+&uf7?9y9Lta?_YS$~`IXsYhry6b_utAlm#yKQB8 zxPASUZHuCXnQ}r;ugWv~6aI?dygV|;SN^K^27&#$dn&w7C3rvGGTG(h*$uC{LQ)D} zYi+Kaa^~Gdw@~Mh$}`(Sgl>Cu=3krc{dVoS>g8qrQ}eQPSqv)+SGd$?uMj(wF|qgk zSI<c<dQG91)0*2^1NIy}@MMK))s=<idY7GqU&c&rdlplya_LP~_zK^$!|#{MJZWfO zyOBqBnz;7VkW}{YH1AT|ed4EnS`>?ip1*vrMDK0!#~qID7sI<1vuA7ESas@Tu8w%L z;K3<-_KUd&Z`qu_u3pcFv8CkV=K69I3oFZa|8ukFEPl*feEa0h<@@wG47_Jw^=sJb z_~`hmx&KO{L}QI)S4OY?^s8=qE7P2lE^gn>bMakTlXIbZN+Hvc;9tqLi@)!va}?dL zmlzT#`K71jX2!J(;el)anCur`5gYQo_s{Jv?O)B=ve&oqp4d0BlkLXkm~)|K+A;2D z>z(chDE;7{61`AG>=g6k#hZ(!oi=^AgHx^f{dsTQWnVOp)-oS|FVUBt;D4?+>iX5L z_^Im8mepK+(8O=DV}YO5BgNjpNQG@t8&>NIC|c;3dWKF}cjWqK<=fY{iyzfFzxnkF z#qSDz&U34eB(qs?lwC0hyjd#edwlkPhJ+4_3sLLkpT@NtP5pT&W@_J)x5xTAoYs`5 zWOH{H)?fH3FC}r>X}a=1Mo%VF^XY<5`L(9c_{Ydwze=fFC4pr^u7$Khw`o%H#Mp!F z8}AgPUBAY$cw*xJ-?c{<%DBtljaq)2y)la~@^6IBzF!H&3F0#BrH3*$bssfk4Zq;| zWYwb1z8h7O7k|qxyi&KWPivl}@XmEJjuvkEZ@BzH{W(95|K0^jpIhc={8F`A$(dUu zxIQ6JJlQ3B&ZPRU;nS6$xGpfToG8P(XNt1*q7>Vtjy3ET7VR}>iuMxy&oF1!7mgCi zMFuA3np{`rgwNqAW2;k*Hg8jl7K!9PCir0E*Cb!P+gcY^=6v{grQr4=(R#}Vo*yp> z9q#f?IUA9G%&OBs*?3Bpb~DGs9ODgNT&_)C(9Oayqapr{dd6y_dX}UZo^OX@7S4|f z<4JXI+_po&gmq=i4OiZ+FD;*C*a}*wuh%%aG$BjpmC(()DQ|?trDI~ca?4kFYdRM3 z>SZ2f(%u=eAz|H{psi1@_uS=JR=DNjG`Wxbbz*N8&nh|Qay4V}s^H*FEf2N?#d<2R zzfIUWVFKs-$qIVT(m&Lbs)g&rxZgf)5$EpFPk$gZBVI3JSIeWK)>*9CIxI0sYMp;0 z9XGG@*eX}1>ZtAXsB6_%7YUyY^PYJ1UOBU#?Xu3dbxGMD{R=}E@vd9vrr~XI;FRT> zmc)0K2O|<MY~3<H!A5aIsq5y0DYYB6B>WOmSSE1x)JJzk$$~k;Tv2QJ)5N-F)bI20 zy1J?A%Zat|JHGnwo^HLp?$y5CGUxbi-`#2d@yp)dACF%x|1a}x`ip``o1edTKlb_U zM-#KSzQ^<5xAWh=dv)pWf;knIX6ka!ZFXD5yltN-IlH_2;h(eL7T4Fz`B3u1V9)JX zp6c?AH}miDv!9Wf`Spp#>!XRqH{#^BrOz&ZceZ}{=d-`x&fLA{*8B2&^Y({zbL=aw zE^at}`}+HBySM*7d-VPMV{OkLf0*C)IkCSy_xybx`TSmc(;%*Q;oIxB+3wlI*)O;D zn!bH3Pu|~}&t(y7=f63}fB5G^p(B%WpJe@gU9fZat@*sud$Xgi-)}d+efIHP_j0KV z3pd<|`FWK~>D!EY?nj=-3)P=Lx9+gYmC0Cd%9oSNvv=veqWq=XH*WWxRK4|=@D;W4 zt#yT8e_fbYe{<gd@~w4yZts`;#v4?z_22DZ&%aI%&f?$JvANlLD$j3Yu2na+{dP^^ zII3#hXQ$mZcgJilyWh3NjdR~kv*G5lkd|-SsQ+`y6^?uE$=h_|Qbp=n^&1v#jbCu# zf%C#Z2_tzPzbBkF%<fOSD`$q(G)+D5`q!*uiAN+8pS)NddCauuP~3y7a!ktS*_FM% ze3)PG_T=-7kIX-L<}II8`>;^r<@y60efzGsrDizK@}0rncK_4Gnq_MK-({z~P5iK* zXJOv6!;I&jU!8Nol&>*&R+U`S<FED8E%q(hcmLnl{OLEHw|}_v<gDiW_`TKNU)|ey z=~!0i45z=pHlBA_%lppQ(3*d42kWu<FMciD7V-H9!}BwqznWRQUY_Whu>Id#`St&k zt&A$|_ixWIuK)M;XI=TXq=tVEul(ol{CfJ~<AZLE59Z%la%uLO^$*2fFaK1(@t^oC z&#(Mv>lH#iEcw3T58ETno{wT~PuCw^@u^_-kIOgM-<r5>h}#|0oo;%6@BH$2H(TUZ z-Mi%68~=LY*6NJ6a#rR1b9c9&yX*Y?-NNGU7c9SqRnM-z{q(8c`jX0}r?q3_UVieL z9=>bOrKeLNLaSrr-hR?LFR3ZBR#elS>z>j*sagl0`lg5*-B%3d{v}=ucqqk|zQ^25 zX-&t{NeTwjcK<#2e8L3r1A;eZw?=$ea6&@pp{36Y=V!+S&)Nr_eqZC1Cej@xP^`}9 z^15C1n~D?r$xGD}*e=;US!*}-)7d5uKf8lQiyP{7?A^E*^$GSLN^X0YDJa9UQFXiQ zMlMdF>Ig1hhKKd64J~gbPfceyamr|-mXC=a!^EGB9!DcXyYEiYKiVb#V!Eb6A)`V^ z>e=uD2ZPL1mYl$gnhKeW3aj33;kt3A%Vknw(<v6dSO)i`_$5~_?U~x-BKYV2;iP(o zliUn~i-jHwd|bP#C8Z;k%OjG3<5mPO$5sX3GyA7#O0E1nc~#4W`a@cZGdiLSd3NlJ z^t!XPF@o81L1pd7V=AKkN{dfDP_+=<IJGidCPriFmL!c$j&m6{wK%N_Qe0Z7wcSX+ zW7Q{?39J@Vl|LnD2OhRtYj))1r$?F!+y$#DYqbv)v6LQ3_U=?`Sn`vf=kVQ?sgfJ6 zCOwswnN!t2J#*p(ra(o}8_Vn8aw#oJl3Sm&a?1Wt&X-mG9Pd=4E3J=&IW5X5aNF)O z&0^aWg>6?qCl!~kjS5sR&?(5`yr+6gQ8QNlgI=ak#~q#7SH2uj`FAaWE4Sc~-4XU> zC)|v--U;RT`TFN3j{9e(yB@m!?DW>>YroFuza@HcBP?gH+<xo!o!gggPd|{tuU&uo zu~quKyIOh|HJz>$?P<=LI5TYV)gNnD?SJ-uVg1!xn{xUtRrqq>x#JQe@jPWhw#<o7 zy(b<#v^nD`>Zj*>@WIbS7Z%~LRV+O`pD&2~tvJhQkWwcRb1RiMRHaCAMbmjJ)?~NG zJIn$rM72*Sm20MypLn(N%2TaR<*$?uZoU=HRo}7q?JX;X6PIjOb!};=U6ylo`Ll4X zo2<V}+UAOFIM1?wR-xSt(X5V!sT0DMamsv_UU8M9S)%XCwxeAwA|*`6|A@^x^FDfB z{9Cs3T`g-r6x3^IY<BLjSiJD)OAb>mpXL*Xo?HxGv^n2HCt&@pxk^m@Kb}Wy_Aj*Y zzQB6U(`8mj{mFgbCQRFZRLMYK=7EEs-*atR_N~%)la}VZVAqBpXZ1|iZ&keXqRH8@ zBBy+|g<k5P9nVzDTA5!Q>dQV@DEOdhnu~hD8UJ`g4I9qrmbCCQdWWLCPYPQ+Tduz{ zY~@t9#Y?tc)pR|@()V+*{>iK9zt#9<CVh!mc4n#HgBkaaM@`*SpL*@&yQ(Fjn#;S2 zDjCIuTcRZ&iYxx{J|VQmYh|#(r#DX;58RJ_*V=Js4fC|bn4<l`Gw-igT>2^NBip3& zDe}>iD)y=~{rU6r>d8016Z57XSk$s*pUCPR2jY$|o;R8GMfc{at^7aMC5p^lr8h_C zKwJV(#kU(-wo~6W`){+l!qWFM|K{neA1C+4x)@}YU*fqhrsg$Som)cF_)CKP9VLk# zu@=Q2yWYEfIySwv_|SqXp2}NCGxFx!D1Xs>Y%uQ(zw+%`OG}}nl8qa0{mqfxzb<U9 zyc<(-$fo?2x39-6shGFR?0U^&rZjmr|2m~l_9vLLIw2ib0}iIujPIu3;b4-f58C$Y z>s@h;OM$mux*pLh6aRh8sqlluk%Ro^8*A+Et9<BfR?*n3aenfG6`M8uPAzzuZ&%mV zEcVTgrEtpC&<{RSY9}lgJy>{wb^rZ8WuNc<J!}5H!Sw9nO<I#5)a~cEy)<wx>-XFb zhJQ-0R9}5@+yA?K-o1PAmKLiQnfU(ye$Z32UZpVP_}5<#YNoqNu4+=>zkPdoW^C); zP3bXL7aCt)qh=iO{n<CY?(TvOvod=oub=y6#oZ;*&kU3fZ@J}{R&VxgqWQAsf_Wk4 z*$?Hu?O7>NQk690qeu1Zu!k8}oR8~hxckPP6~8=t|H<HlSFw{^UE?-uGJkA57b^Je zn31eQ<%_oZxUj>A<9E$G<7s@eZX53`sk`^yK2oV^7kVamMXq{6SlePZ`75f?O)~4Z zIEO4=Bda#eex>>y@uX$72A5ZO+?v^WLpp!m%>@BzZu6WU*@#KbYE0Wue=IWZ;%67L z58;uDdDV~SFy580f91Zx@7o%KNZ&UNpWg62diyP%@kZo^+9&mkV~uCA7ue6ZTD5V0 zy74QyLvI&lr~UbJ+W&rC{}xVF-a65`pb7it2fQ)<w;_CsfK30~OpVVH7qimkj$Uyo zab>*gX>q{QZ<_xxF4<**b^R*U4B=nIWiMN;3JUu;PidCg!qCe$r)JH#>~g5LBXl3b zi_fi!-!i-s3k8x_a38l`Tc4?Bn)%)9R*Ti#{s*UxYDym!%rQv3>RPpa`C*5={JW;| z#epf6V!I9-l<TgS7kkKX#*cf}p7!{wHl>?Z|M<*tEi$g?z{&Ig!OF<C_umhd3oHw- z%9|<SDA=xF@pMW2hK5gfms(6rP%TM~I9OIGzj%sD^iz9=b?N;)ml*|DwlLI}Z7E8R zo4B&$pi#5J0wzw)fJsc98Vq-GL>1oL@owWjsvx57cX8<*VMG3HR`;sDus0Z-7Mb%m z+^KC%Wnk+Sy#hzBC$625wwt{r*S0+9xyEnIY<F%)+Xbf%trNm4O<k&f-dK>ky0zqe zt^Xq5_3sVhpU=Bx@<`6=1ec%8r%R_z>+jBe`P}c&ys*?CIeCVgB?JBx?tNty^KP4* zE6djM1vgCs&KOw)_#DXHmE2KtsYqzXuKBKSJ|9eGe{;#{wB<_o<I&ZryVg&!`POZt zyWoYaxN`GqnX;b9C}Aev8LanMIt!*>f30n*c}e5^hi%J*#r(tOe9%9$UsuYq;H95V zd39*LdZpakQ?7bHR{DJYz~9X0UiUE~Q2o++&$9>bO}v><BB@&VORLGd+besAq9$KD z+q89!4f-;>?iL4L{h{K-rDJ&KmB^J>j_ZCOivRvoD?FoRf|09G*DX_Cw%c=OMqX-b z?A8mPGk<yHlw&)~CnepsEld7AF`3D@d;5`?;_7)Wsr7rmRq<VBzc1pt$LO@-qVP%1 z9BbD7V_LMxzba&|K^BLv_vaAD%_q;4Gv_#Z_HT-@5?N#VJtbmmP1}WlV(kydUiK@f z2u+TBTPm))bmO*l%TijMx!=oQ@zk(B5!hw*?)2UJ66%)Gg#w;S`URL0ZZ0{XqPpgW zq=mP34%378Y<C;#rOOPiY(1sJci-RV(c}lWbgo!tJ+%}yS+91mM@ldEboNpC6C#&C z70pop!1wj(sog>s&a>~IbZox!auz4S;wjxTz3+2w%luM!D6RG8gtv#}^)3A;Wy~<_ z-N*5-|Jlsc3zLpB>YqNtKdqst>zJNH<=jo(<s1{#jw&C#!%>=@pme4_L2mn@!^eWN z@2c*5uJ|;^{chm>yC<x@X3yh!ni8hB_kEXQwaniKEBf@JUx;p#OsnGC5-l%ou+Pz9 z&uj~I0o$xqT`9Lqj_!=f+Q2SU{cO*q{T>Il7cfp|j&ZK3P`t@Fd)raZp#P_Dg#1=n z!CiMgB8YqTb(3?wJuM8ER36Nh-dO*$I{wI-GYvhbg*CqKv@{Uz{p@hrNpg<Jxrt2? zS#!S{EWRLLJK<u`<=^EurUy@|FIiH+yk?jAk4H~$@Vf0PcanN=UEuAiRK*QhTRE2; zpS-kq{>JRbn_nkHRb1rUa8B;YSFs5NtK)gTgju`BTopJT_+nbO2&aDj>FkA-Y3p*r zf7ZL7Sa+|5+5E=#4NCW!8hP}LO(NW4y4Y5T2@6L2WaF%?xD)!N;qJU!8p~J4PdB+U zLFuyvU;m6y7w^iAtM`R{yuDK5p6==(zpyCA2Wd4wbM9N7e9AdBE-n3kPt)<nEsS?L z_uO&0sU<&Q=6$sXPW26+^i>Z$lK%H=$&>lHy7E`fc<nWjsG5GVTY#^y=2W9`diJ3= zF6~!~FT7tnukd+v*L;Z|PYq6;-}QEP^6vx6!qfKWHkqtjyyQlsYv`1zma|KY(wx73 z`}a)#TIr3Spt?<D`$>MLw;GI5+qYXVMKiM09e3S4Jur<`c)F$)lQ^U0bVn<uST<g^ z=E(h$)0bE=8P>~$90_*~p8B{md$y;v`6itSnI-!qYGrO7NS6HOH%->y{(PxIyQ=>O zjf8IOHqv?Kr<}anqWExkO`3a!o^hUgzI#}_W3|7d^tG}CX-AO>O6f_;n~H4bSxnSi zB^AOn_mpbw?2rpe;=WN@^ISIHx!f5d#wl1=XFGrH#UQc5YijjQGq1cXs(DyZ-NkZ- z*Cv@M?_<-1lAW91e0Xr7@mto-p9SZRFL3(WFx~1|&&8*kt6iT~^7@5Nu|B<hOT?G# zt(W-r?Uc#XRP;zRzGnYRS+c{eec6PgT}M;*EuRx~V|)LLU#`zrO<u0Nr8w$YcAQP0 z^7Rz`T`7ysD$i%BKdru8)3RPwSU~+e=NU<sMF&%Vu-fNrkKQIE>K}2YzdA|6Q)0^> z%S7Sx+s~Z-EbY<px7bUyPqVpuv-S1u*Gqzxivmqt+OGuOpJT4M=}FC^tP@P)JI{Py zmXfV(zs+g6@~w{hE)y<?SFD?`$os^SwX?mt-gqo;$-Z4U^W|If8H}mlZgg1a)(2$7 zPs=^$tr0fm_~!TW2eixjI(zO3x+-3@33#`PY0>k@c)`OnKF<j?67x}cYxt=yu1c`D zA*GaSm)OR)uSE?HOzqQDOr3YK{(`{fJ-HT6lIJ^?JnETt=Gto?uD{84^KPiIggKO? zu5oF4e5j%I#m>5#^Dfh+XGrZjmv_L3>$HA->m7!qlWdj$7Ju4x)MUr=Qf1bL?#H{I zZC&twW=vskr)1#1g?I8=r=48KdVBJh+|=hR7YlAKw9}I5d(S&f)<_^pKI~?&;6MG> zZ%x*w+@10|M8HGOV4_x~ze3#pj>2!n65?eN;&#o24;hY?zB?Mb@wn)>JKgEO-pO{{ zurD&RFs@JWdvVA-Nsvd<>&b4zUUrKWJ~rk?53SN3PrAi5le=W@&Zlk(tAv>Sgm)}g zXHijHr>J?;S3Y60SfT&dHP@;y7JgsE{ObxsS7HKxX8POLW)GG+`_8>!zFni^`WNMw z{%)KXt?m}oHn2JbMljs3V^z+x?)$k+NIG&`)R(p?Ys<ISH+`LIw`Xn2<r1N<wdcic zKE#~zDXor~KP~ri*zd{V={xRUJ?_21WXc7uQi-h`_f2#9cg8(P&}>X8KgHyJKHsdH z;ZAOT*12O1oFAP7AC=GUOlh4N&%af2!o!9mEA`?{-77CA-2ZDaLn(0SC6hZ#g(hs< z<d=DM%9fi;_Eacbat*6rb!zgS1-247MXTO!V#xWV82L=~Ldd6sjkk~MJU-%O$-8B{ z?hC!{g(|xQ`&sjaT`V`uO26^b=6+1r?#M!gj1wPUeY;vy_Tss6?XD1E&A$z9nqQ5M z1x@|Fwo31Unw{bvhx0ETBDAwl+q>KmP|Vbpa%p_M?QHSF)RT(@Lj#u=#n!KmR{p%e zr)1j->4H^y4;UGo*ZeBH>2zwUuA=>WIfnF9y=sQfyLLUVVyHLjxF-^%A3Skw=GLjc ztMq5>-)Uzx;f{6C_SI8YTx2$VeWi5ShZ{<z=^5MwnJ%46XSv$!KFzsR=cRS~frqDz z{I3W*^a`AkTvxeI@JLCM>%5az!d1^@>uvHxIv&4MeQ3o{ymb3>Bfs6&^@q;#uIH|N zUh$6k-a*sbI>Pf0*mSk!#%(`4zd4{T_*%`P`<6nVE`3!#<nSp&_0>tu^A3Hd(kcRG z?tiGqGPmOXNuB2gJ6`(!y>>9A?QOvKHY>lc|16Ut6<@rGlul1A|762%soQ6^qf{xJ zDPN}k!jEv)g)^^QzV}|cpj}RIeZrlCu}(Lg&bNi~tz8phd226k%yIMjQx(y|y$<_D zE7{qOe4G+`E_f!x@1Tw+^N#bIzJ0Uo0^6r$?{-u=ABkGWwNs`h?!*jn-(|sd;nj;y zpPV!)<k_xgW{bY_$(=gO%{jSn+i9cQ?f2Geo!X{h8)#V{?Hy*~*nRZ%Pu<*)Oj!ou zxh&>d8(X$1e%Yz&c=z3gPwW?NN9o+|Iq{)QRUvHuHq8`m!$8d-ak;E%DbZnO@f+&C z_dBlnuXn-z_f{Ww>5nUK{@?!a@8?`jsV|ISbw75snOx<~G-Ok#ciB?t6T;BMpm<kd zL$Z9`LjBgg`&<&H)u(EG-uA0C|GlSD_SE1l3m^PnBHe8*?{Rj<gz1mO7JoXt|6@C+ z%bTCqy?5r6Ft*jomOm^!lP9)1LFVn5)$-XhVzQGo7KGR3soq$k5Hf$=%gP5l5qnyk ze*Fus{eOPNuWXT=>vJC(u0Oi3>F)O$!(ZGNgTz;HrRJp+mlUNY=5nP@k4<A`-|pwg z^q7g!c)H*xMqws1lj$E7_%!S1hTqP+V<u4hJ^aPd2C)}Ld%8mI-#O+fd}O0^{zV2) zffGX4#a2z-HtAa5|9!?Ps@~a(9=|qee=IsN)3P|tW%2C}xAp!RKmLDjIcVP-v4nNv zBv&ob79-iGyC?g{XM`NMbGt)m;;a`3*WPiRB>mlQvDPlTpP!#>KYOw}yvudYB$fJy zTDNlCH@HlmvN0prW&Wf4?>E)v-@Y2P#N^p({n^{~;|@ycb(+n3s3)~H)r&{C?r`bm zx8Y7l_<u}Z%hDg+z1ubBTI~GL&}-9u-@0$wb%0&+ySCWvb?!eVe?D9MTjhp&(6`Iq z422E7f@W>%teqse$mP}g-8-9a7fzPB+b1piKD_?Uk=$ne!n|&0=`gXf_s4Q#OX^Z? zT;xxvKCtn2+R@TG@BUm+-e<!8f0AX!>vGv$oA#-$-rB+%KK1M_hD*0}t?n_J*KzPW z$X7n!vi+d9eB6AO`FEPWuQu)0KR8?bM*$nZejzhkC+DJ+4Zj%AZ#R#<$zL%qqGOSZ zOy0gCeb?shdihtYPIB$YSm0n)s<T-0p^$*gkNc^z-%9E}+Hg%eWcy{qkLjv5u0fh@ zqVG@r`jE@nq0J!WU%Qbdg~K=};$wKM-s1oz*}_Au*K9nK(;aqatWoRgT_7I$?rurt z+yC}@vI`qlr)~LpZ=39fHJ_zpgdQ|=8~v*{KjF3OM_lf`A6M&VPkm_kj-@Qryl=+4 zcjvBfw3!-CcxEqE$H=*x_t;_X;)mBKf7pGn;Ar}~hng3KuYU<G+x&!Yp@VJTo`;S0 z!LHLMxO!>$)=f#|I#RI5EjYZN;j~8qN5|AfQgRMkekd?4J)Lsmv*SC1*PoWX+q{V{ zSaIjsO+gv!MXWSjZx~k<vDIIY{Z=h+uzmgZR(bhQ=5247n$p?l1m4ig_m)qv-g(KX z?D5{*yVd<>x0g@Y`9kibfzR8`f8=dUc5l^ip44yDve~gs#;v&J>dil#%l4oCrP$^4 zZEii^E^&dZ?Cw6E>GN71@HS;grn?3zsVrG&@XFJ)Q1AR9r6c7_owX-ia#hl*Pr4K+ zy-w!-?JUFJmTP2!g=_b`|Ern$_PVyEvN*F^-xI6a`pUv@pI*yP7k|Ed#g6$iC$#Td zvn#mfSHX(?c?;IX$~!HSl|L8cCGnVf)@S`WGOxU?3l18GzYsAyRk>!f^Zhpp(<(a{ z=ZMMNzf#!|#33HdQ7b9-{A^x)WP%c>S$BPhr&7ux=gxK(pB>-Qiw^x+)#4k@Dd3j) z%#v$4zok{X&w{AcfsfP0qd#1p709D;_)Dvn{5!@=>H)u6CK|r^e)38D-ji<UCQJ<0 zObII9vGR@8danh0qo3^gxW)TymRy>;pVCV$Ya4zeQ+0OpE{|D!X_ZAK+w9+PZaQ2S zozgh5-eu**!WE$pm+iA}`n=6Iv{IHY#G`?$b6#+w*t2gBj4nUFrSW0&J+6=oQ`tgX zRzCecYjuc|>$T*3)1wA0N^CQf7cT$B$JX1T=%&KReCD|K!S}CkewLAzy3A?PcQ|y0 z)PgAK-2RPCE7$#JUgxO4dZqrM2Re%x1cEFif87r7x};t|OKr05p=vdkW7oc?-o9de zB}|^pes9};m)5LliV@tRyUsME-d)dl)hA%(eMNDVCqG3^G+5*%TYD<_cJOsC6X)FU zT>iY?x_fiu=U2(;SY#dRY$;lF=}Y~Q;>PfXgY|7;n=f=Oy*76#=f#9wn?EcqEj?hW z%9UZy+b`V^k?{9ZV|~Pw_yEPF?my4QOxn3FNw<`1>CwM$XDy6AZmzNJ`!>D1ig|(a zZlB9F@Y`Q_X6HN|QMGdmg0DSemzF$HTk_QAY<gOetL)P=8Ox-re(h@zzcAmx>I#>^ zmy7(4>mU7Lmok{_^@e#yQM^01k@^JHtc7fgPR!MdWMUEZ@2i{VF>CUa`p-KT2Jd#b zVKLt%rHMb5gXjI`e|kKo?!oS&{L8vFwJtka9@ih?a3Lh|(dJdz0cAUR<SV4?KhzxO zb~ya4f#+%I{oitO>DJMVD|Dyr+IaBjp^oQQIqX^I9_qhtRH3`wB0}2Cdxe~&*voV0 z+ioe?Fsv(!&A9P;mz{E3m)aw~s15ZtA?xpyuR6-G^|YGx`%S+igC(D+n9LKqyFfu` z?b(?7UHXw%cUT{~e!}^sQ)9FDk;FNUlF!}GIQBX{>#-_5BX@yw*NQ{$mQ=_8WS^&D zSF*^<M{;qSn@4ZYNBP*z`U|$UeNy_cyR%`-PG(8#bqoJ9-d~j2jZ!o9axk$^Hx6ae z;<ez?_esr5FUe3aGBKO}Fql)b{%F+gJZVdz+UwyT3jb`#*%Wc~^Z|(;b;mU36a&XO zN8_4oPL%a4ADOmkm%`@X8}9F0eoHr6_hi{?p(h6y?4IpAZ=KdWD_1R+^f{c0v))`x zc^vGb-NteK4bR2}OP|&E*Bd`BH1v_&zDO|qLYlBFKhrL^V_PkRgB`rpT)#|ixOlSu zN7AMj85!O8`j)A@?Td^(w4>sMZB^@uAMJ+~JPhX<rS;F4Ya7=kXW;VxV8cd+oStLP z9om?p7A$X>$ssRVxHw_O0`tAcWqq7nj5stGThD7>692*=M(l6MosSu!v4?mQ?`TwL zzMR}Mz3Z@nq(H1kMGN=*FY>1I+Bv(Tyb6|{sAtJ<nIyuQ_j*C#T5e&Lqv0iW50YEM zE=-qw$dtdCJ1g;^eZ`q4Y;Ot_7nLu1*wJ}Y_3+FueD`z=1P&j2#B8@?L2GJbT!#VE z92JqP+2>B&)yZ+$!DBFY;tJzR3**UlUT$1Di=Xw$eLT2BT62-Vk>QI7xwRSnP4yod zdk%DF=`5>XvF<!`n|Q+|^TtVY_W2xD`ShY$aq_R0#Mdfo)@Ls;dCW4|=(V!h&6nbb zqHcEIbL?OfXYX-1b4KpR#k2+2HXI7z=});>D7elt?aUDg)q~e>*_z9@Z!BgMayuio ze4FD1G4VuBm+V5<`&!Ec6b{~7w&J=ZW9+Q+*-m2bk`jZBoa$N1v|P_lxUlM?Nm6XH zOxU6NN9@a&H@~`?Vq?C1`LZfelP)8%yVfxWj&N-H#+0YraG`sCom5Ev^2w(^SLNBw zc=h&l__C__|CZ+R>=jFx_x(RVU5dZ$`qu?jjR#+UtZ9?*`Soi-Rrq<e?w6^y+1HAS zUvK}FW%4KW)AFASwC$9_>Vp>c&q%X4x_idYb@A4Jygxg7E@b@HU;mFgK4{JHTiyq6 zH#A7==jFZIxJI#-O}S=c<Hj$CBxYPU+*EyF#)(ynw>#Z=Aw6rKf<W|xO@8;;;}^0Y z-ElVDtC*w1x#sBXeMvWO^W8rdzUig*z1!iNn%AdX4tF}5RQmq**MqCQ&hz)x)E_ze zyDHRduU2(+=)T_Y#W@K*iRwL9Z&uhG43O_xmT`22<gayKbE}W1WCzUp&UW?ZqojK= z`z3qr`B%lOU0z*v%jczCSpC|#aDBTU&zv0N9_^lxxVAw?Q*`x_mN)6nj$L{wwI^Sc zU$gjrCuG0hJ%64v-w(?#etmSywtK&XOP|lHw@|PNE2z*9OJzCIA$sGY@XZ#LCr59J zY&*0==4^I#S>d*d$o(s0EtSMhnJHesn|v{Bqis8@$BCU4E-G_$z8tWf@FHjN`6`CO z)E!;Ui|vZ)=e_t++jLp}CAVb4;m3deTLiC=>&eU(i$D8bKtd()C*PFF7`s44nbVFT zlg(DDovhz?+Tvs4>8;WNXAY`u2v^t`xiw%*uLNIG?1Q^b!LieS2|cVz_bM=08NrhO z<VQ*R6^^qf1kQ&|Enk05VA(c@6k8#uxdjZ3ts&DIo16~mK4xj0_IKL?&Rf0H{6Eyi z*=4TYsH^Dl>xtcR$CXdE=;rhbG^H9(o>DinWo|tG!J2fndfoN2wr!DIx<zuSjOpS6 zm!u0tyd@6<wiS4FoLx3&ljZWYhE|7XFFtu=+2J5BagNGusw?&9l>R8=I+vzfda%~@ zPng2j{o;q&I_*vNu1(a8Sn!U~+hM}u6IDW|n*(1|I0SrG-2O7od6Or1m}8csg!9{* zFXk}|^|P~V<($DIY|UTqsk!Re8j-C$w>{3ca;_JSys5Z-s_stT8@qCM=5Eb*{N|e1 z@g!H|rKz6iiIo$oCq}eqg;}KZ9<|!DnSbfpDG{%aEVb4<?OB?CVCPwp-Res>-q)xs z`JH0#b$PAW(M7*4%XPP}-IAMg`^vVTGen+GtYubJ4zPSO`6FY})ZT=`VCMQ7Z?S(S ze~i{IKOS>RDw?x1sZ+^fV+;Q~W@Q;cHtW+1A~_>=bO<)3v7ToR3laUR!egg2-{5{E z^XknvUyJP8?8f2Y{?JpR$R#@<E5j$i-Sf&4=11SPYP)*R_#d)R+C7Qu@D?UzwrDSV ziI;&A{V#+6KWKfjHZR9nlxu3*eut8Jaf$7VFK6D?&$L@&Wo?_Qw&I*r-1>8?_wTJ< zTW?=8>-_#d5ux$>>$YBh+&b51{p#5lQ*Gy6-Tdm=uhVDan@YFI-S+={d-h~MwF|!Y z?@iivyHe98P)Pm!U#sj}pAr_^vD{aDt#`XTVn^_~k_d}tH~w2P$+uDx_nUM7o>p3W zde^@C)Y$u**4b;lZhBWTd%p6CurCVA5iQ1FRM*Acb2X4T@o(3Xtv{le8cVXa?W<<A zRQl|6;kM4M>F=dhHQTS5$GpI;WMj_pjXNTo8a=9%q`yYI`p_Ocmw%=6ge@@*Y>Itc zCx5wJdbjVIdx>Y+jv2QfE|vYi{nzgopI7|)`}X(st0ynk=dkUa?Q(um!jfk>K9Wi= z%=Uhr^ZR+8D$A?=A8)<={iW^HwtX!oZVNi%u6|ftts$HB^2Gr@^OrNl?`pf)-m}Vh zKW+MP0qrH5Z31r2Em@%|ndRA5bo(A>IN!S5+S}WL47UUsZdoE4bt%g~+3wv=o-M0N zR8}Yi-21g`!R5V&R!HjC2mTK&u$H-dM&16O*_^s<>EGTYS?!tYd(1xG=hej@x8nTr z{J+JmY|)W8cvkSpQtOb$M!~#ZEt%Lm`r6koKb*Q(CQRRsce(l3GxK!Uz54l2B6QtS z_LiuuR7<Wy%x|7;T-Mqna`$ysSoc*covOPJZ}dOZYd;)q-8yCC*Q<+u-4Cs|mFrJq zci<6xB<-Z#RJJE?(~h<}fu?KAnPaQt;(5|P3#MF~eQTdgEWiG%*?$+l`p0h`8pJ)- z)PKri2ipS;OH!M)LbtJoDl4umzLv#yXU=|MjTtA^Sft!p<h)`yCtO^`V$7uf>D-b} zuV1)Lf6;w1Y2S=%_VRoITf;AWuFeykP~ZM2Ad{{0*;DIC-q5({oCSJqcEQ(oExD~A zpjPPbXe51?@2&jh$;oqHu(*ru>~|<%blWN}yUdosao35DA9-tRAMT2{F0c4L;8ls0 zzPGH$b%%}d=}8lc{W&k)HG3~}ZB5tY!~VZ#9&Xzf@lRmU@@)}6bC%ULt@CgEeq-eo zL%+lIm7mS|?tC`qyS?w%>^W_lbE@2`s-C?&Qyu!XaP_+-p}BASg(LWa^Jkn)3*XYR z^;faZ!B1zZA{;d&y{&ZW`_#7|Uj6sy8cv756KCd6*?)a<<zLR}VU;2Kv`uVhck6t= z@$PIH!?wBE`|pYINOB&0&d%+m;`uL4q12P}>v|sR+WGn`dA5JKnwy~i_n7MXPX@AI znCE?EZs9w-c2f1^_;>nWR=nKlyOwXRop0}d_L~9=4}r(P8O^32{K6>AWMn$s@f)vJ z{oKgc`FG5O{=eJrq@ib_J0bN*d)#;3>o?Admd;ttYvK?TliK-ObkWpplgeV58Q;b4 zm*iVHHRa~?C#NULd^DUR`S01r#`5Q^_x#iU@3E{dRTS=L*WnF%cQ<EGfRW_#I31>G z953&R+;gAbeKl&y%C5h!(=M-9`TqW+di2Qy`Cqf@br;{zf4%PfDy`S2m#KM$iC=kH zdVPJ}{+~bJ{CW1~yfL3TyPQ1VBSG%NS5B9w%h&VoVcPfi4Xe+x&hq@UcQ#X7denEU z`?T)-zgn@LozI2eS$?TJvR9+C<7-`X*#Xvq)&EbG{r0*Y7`V;q{p_h7f4?P8^_Z{N zzTxdGZ?RQV!uGe;b8^OrrM+C77vCfywBx+kJDo=rTb6b#zB#Qe#ihac?W7auUskW) zZ7cL=nck^i=kmhkPj6dUzUy7)Cqv`Or{8SbblUjI@~y|qZ=K72^{UZB`fx$DRmsDk zpNxISl~Z*7IxmlYqiKKo^RovhjxIFKdDy-&?Piv&Tj&3<>pR&pPq_T7=asoU&+K(Z z;AX{1J1vAhrERzWl9#r&)UiZh#=->_Lh;+bvF%np_uEmLH`7qNOX%h)Eh+On@xyCE zOSdgdUTAF`v}A_op$*|L<HY|POnc??=4xwz@b9h}JyW)e&2haTwa$*!W}faW$)zt3 zsT==wPY|kLX+5b>YE@M#=yxt~l54$9nRnct-Mec3KC{nXuXjFv&9yuKk1UnSIlpF} zEXSLpT7{?C5Bu~aKH8X?`-E>V&uo@=@$#jylVTZmX7yA)^9ym<#crE@JNI<lWheEI zTLW**a#!@wnDZ((yln1Gw<R?xhYWUPZ<cD|OIzAdl`N-yDYn{s_jAb^VnI#IS&j*x ztZ(rVQ)y$W-l(!vLa=YQ=<YLFsU>TYZ<wq-*R{1a^T6>xTOYerymjMH3ejQkna#1# z_KNA=mF@{wUfJ_+m}}~)9`nONVqvtl!?!iL>(<U)Sh&pbN9?i6Tm{!Q|ISFQ?jy;X z^Xn^Wf65*GbNc7kMN5JYJ}S6yR^-`(HOezvnk{YW_b$9PYfkcs61N51i*w7ie2Jbk zbzSBR^WQ?e-D`qebfy}&PS|=<;X~}~r?-U)_ALn9pF8{T-D|wl&ib+G*vz~;U4Hhi zd})Wp6ORA;z2@50>95=QQZK*0JN^1mL*@rM`{qOoK44dFo1lDayM^9e?@iJE6>fs1 z@zYXtlEqY+l^Kfb-Io2Bb@&2%r2Gc<9XWrQgYsqh824U&lI_5B%&l>Y<=N1G^1^E$ zzS?;0Ute8g@&83RyXF2miTtPxeK!B?Les5Jcs@LFzR!H|&SfJz)~XBpo$@*R`R+Fv ztvheBb>H%HEsCjopPuZQuxa6QPv+tsH?RD(msxO{>6!40dpQ@&&IG#F8%77G?|%Ay zf`;0TqNMur)Tz&3JPZ4#$>;xc`e#*ErUEyCf}3+SDx5ehzMLx;w3#5#_~Ez<v&(Oh zhV&I(H_y~w%U}82;Ey27Me9SMi_2T&-QH&$n2;%R+$kV_1q=73^us$s3^^3rHS+d2 z^H^&LL^9ZYohi$t-xH~%EY7}3q+YV={(QB+AJ1h9^_RODeK_d6J$Uurvo+e)-nW+Q z{k-DyYF>-OH@YLG*v;;xBx)&4o7$kiWas~L56pxX|CG3Jz@uo^@90SJgvAd6*2?oQ zzL>J~!8hg`eo5lVDc^ourJg#fB)wVsQOA^*DmF$eTo-auT2HUZoF^k7zVOR#wl%W5 z>$%n}$>02ut6IP<O5iX5#A!P}HwmaOJH&iJo#XHAP+N0z)^~P{@Aluj)3iKTZo0_~ zU*Xp>VJkl<<{M_Lcyz##aenJz?~Bt}7IU;cc-y;8aZ>M>sR|B9rkS}On)gWOP5G{- z6HI$22t5?&^k3Fr$*?0-Yg;GZIt}aR4jug~nO7>*ORP(L7?`Y*9JFxRwh0B@1wTK0 z36^JRb(FJN^SsDxV#INaaD_aks;PqMfBw&4;6LD}(D(P&^S<cz$7?69ap5^=Aa7Rv z?5O?p2rq*@0aaQeJ{rGsez=6(J6_5$@zCsN2{IEH{l7FiU%1{QaOVcEMru+UL%5O6 zPoV+{pG`A5)$139%klLsKNIWpIEwq<A^no?JM+H<v#>ArP!dy-(B-NK6ze~7sde40 zi>dowsdYA_>+O50^zd=_l*QdTa|E5()E>VVy7pDWqRBhPsla4<U&q1v<0nI`K3Tq; z(V@L<cG9H{0=g}lHuD>MYr=ItY8_}hYOwP5t5a&*zdzAQI??d5o<m$|#+Dxk7oEAZ z^R-4|XSbV-&>w^I6Af1H(ap|zl{Q_}=l|0B1s-Lw*B(TQ&0uwGoTIYL#-~A9hW*+J z$*{Vdy-RP0yE*ZHn{7FFSNSeB_aMu?w>RXPdtKg~mn9<p^zOo|Ve&t|+_vs!+%I)@ zK^*Js{r>Z7=gwz(ko2%z;YxD-k`@PvJr}k!JPjAwzQiL^>(Iof%paV?_)cvWRIDmW zom4HdWErDt(G7pUxTDh)eA2^SbUwOJ-=3;JgP}0#`=m)<+<zThy6*0+Cdu480k>a$ zO_E)8^R0LL6z4U!Oxw+_uhU3Qx_F3n<+_MuE{)t`9qw44w~wT3miPA0GvncyJ+Iz? zx5DDm;}5ZpSKJ=X@=?_3*R`=KVN~r&b7T`frP#XfOp#8H=l@r;Zt;6tt26GI{$%Bi zcNdKx%Pdy>@RTXp?({j<u7k@gy#J}BDhUX06A5qA&9T>!UGiYt$qmm`&z6L4oz<42 zf1%O*uVl4A(VI=y-X<$r=GLqze%O;ZadY_Q`nn(|N1>}rH+)YxRntDrZT<J^4|dBV zCM)R9biB1}CD-J0u8p7SqXRkJ)h6DTefN%|ODIKEy6W5RwM|T#_syPd@=fpI(}?ta zyQXZ0OaH4ZgO~eEW{TCUkzRBsEb{NnU3cwHzimvdeU$Jpb4E$AF6;778e60UCj9Q( zu~l}mys&+}fstvr-~*j^*9~gtY&`tE&~oSDNwa<aTo1i|Vb#U6nZJHiu?0@3(Bk4a zqjtK+`!0KOH@nn~l%kb&*+1Csrm(8WNKO@ax^mWvwk##FJr9^x<Q-n|<$kyVlQsAI zYXO0+WgE13V>%TNR2khXJ;1R*z~<OHBL~R`g6z&48Mg0i60Tpj@^|Ab<)-|E>o=X^ z4Nksq=UNn^xk6qtXj#l#xtHmSBuW#rxu0J!4PboBp2bjXUH&!X*Z)o2Z*&(<Z`Rmw zhH2+5&kt>Jmp`s6c(GuX-R+&<0=iV+++#U*ZpMe#X`ao>%l~R}H2d+-Y`z%n`hkD` zj-!_|m$B|{+#Q_xB1m~nc>Rr48AjSK6&`xj8%{i`_bh5cr-mGF=;TvH7bZ%S^=g}4 zmUTDHlSr@R%j->>RnBI@rLwYq^H%POr>`AgKT{GqJ@BBkr9^boS_e(7l%(u#Efb9w zw~mP)-f-Kj{nVGM0TppNrfNE}kDl!BZQ8yxX;Q+$m8*VF;@fq9*7n}J$zigJCbF5A z+@1<ZS%v6Y6|VQ2|Ez=e{)$B=Wy=;%cvbHmq9g)tHBR4jTR?=_+zhh4H8=ER-faVc zy|1+^PBb!U&6=%axLw3^7MsUq6SgP?Uaq5ylD9_5czZqC|GuDj?IHC^ht2cT?(wL0 z%@cH;zo@@EqfE2th(=(D;g*PnJ_4GOrz})0#WMmIv7g~oFI;5Qn%|W=r=zkh|NY%x z%5^a@%A9dIdJUH!%`~|7B1v$sOFd7I$VOZJ*^^B|Gj6)@_lry|DDTw})N;=kyQwg9 zdCSvd>)pOzjCHBql*rrTV=#%cGeyhe)Y64DoeiC7D_v!B-iCho+;;PM+v3lBOn2U{ zpLAfR%!H_kH(XR!Og$soBGyz8{yFulO`d6olEjOneve(e`u4x9Tf?6IHY`u}np{}@ z*1rK)N)1C|vvp+ncYS{lD*jm}zqfC*_e#FzVy#Yr>W%xub2AU-?{)SMo;qcT5r0CG zwD1%c0j@1(UyIIpuB+L<|IWQRbB}X|i>&Xympd=v<i=}jt$*Dq<!n}bn6z=7&4;ZU zW`-XPUfaw1>Wg{u`qK_<6XxEIwmh>;^WPDh!@ug)MK@i$m!5ob*Y#B;``otv|MR8# zV$L@{*XUalmn@qZu&YRQrpytW<F5DndlwqDFEn1gX{%#Gx=t?B+QS;s=aQ~BGF>tI zp!#78^OX6^nC5SleX_Zf;qJb$+v`lPpG#0V`EAml?m3U+symd!w`tuz8sfLxgEQS` z%f~0LZ$5ezv3+tq!yFO&+|CJ1`yDsAGoSswxF~7)gX>q{o^_pLU{lSc+UIhn_|Q}? zzrVYrUtc=<K{%ODMm+Upn(FC4Yi^kM#D&d?ox}a-V8rtc?Ahj49>G5%4cqT8u9e>) zz2@>U^LHMKGAs+`v>v&&PV-dq&%@2(HryMOF6=gwu$6phH2c-gH?!)Gotas?Qu_Ao zbvJ)Z&yMC^U3dL-;RpY_S)P5o&!%RwaHwv~o@C2$r@Yr(zQ_E=+3ANOuD?6EyO}dn zPkQ&GO;K;>B&HX=KDO4{_t~W%vgcgiPma*LJAL_@ThBFjR~IC_xV~$hIwK#q_ufeh zr9Q_>S0`A{t*Ji5W#75~_rAHexl*SGr?Cn$nHf#bx8_uy{>+$9WBS}ACL0NJ1p|d3 zE`2Ab{0fC=0|f&Gb4v>aGb7{aACs7T87-y<R&e^r&4`ZDkYHFibE4r4zjL7%zMnA- zDLBc#il2pHS{xq}II}UCTTFl0$11{TI9(x;SDWA5(t=ChBQ-NUqXcXme+rYLfDy#9 zVBf^zYy}ew<LM45OxE>#t2ZnSuY7iW=FE_#pVG6kPMs78pW~Id{MZtsgjGS4&+Op3 z&n1(rE^#~JSPYNchXjMeHzMSCW@t(m8ymRAw4`#Mo}{Xn*t~;-bE}HV#TV<symeQq zIxfyzc~y7ol6PXqrWR>cp0E6E^LI{p?6+Tf>F@L3|DAK|>&wXZRrk`@zOVnD`*v?h zR7d@%)7Sq!4uA7cefD+vi~SrO4KU;&-T2(*x#j)uwfDFGzxe(i^WPgAPsNFSSR}sp z#p?LKuNFGD|Fi##P~X6DMk(R>O7?!cpXck}sQ&*l|F7|!wSOYMKIE_e@!{d&`F|e8 zR&~ORukUE!*dn~+_ssXPoBk{Cg_mvGbU*Co##h1dcUDh_IiZ20!y%mMy8YL?&;R_1 z{Fkl$yV&8k^8x?b%=K|f3QTbHm!sz0i_PEO$J~5)$}jBO`>?scpYHxD#3(2LLoeJP zTv~j8YyHBz{$clj-}`P?|95IF!ZjTY9AA_RE>28;yFIjS)28~*fA?s=zv#{4;s8Sn z<Qvc1Y<rvX^?CeWcYTDx0*!Sn|K428RbRb-N7jCHS3UYr{?nh?zW8fx>-B%!`?eXD z{tNwmet*^fw)!1a&O7wBOj#5n4s+uSlg9qIs>ieM{aqQp?`i+>+Q?<9zc(iGdC#f8 zcs=gt`ub<b|GoTg@$R&d?#_}QKhO8){GJ<n@|pUIvxl!9+o-jtWFMD<i3r5B#-(Z> ze%=3hB0PV`>)ZYFWxl7*oc1Q=*@h$M?Y_5$&;9+fKK=V$Gq6!#Y7U=#rN6(d{@d4` zv)}#wbGAD7)%tZi|2OHLXI=iaHtheI>t^c^LA8dVG5qhf-*0?M58JvQ1G&+9zNJp$ z{#906zfW5{{m;!E`lq)%xfJ~GLix78=U%NZvk$0>tvUV9|L&Kc+~xKO>{{PqHvIlq z&%Iu^Y-4Z~EPN9*IrjWo`~Ls6iIcCtw>AQ~>?Y@#L{97fbM`!*?XLIh%H#UIKaDp2 z{L~d|e&pGk%#EoPe-;(rO-@=|e)`!VBi)@}WbRiN+&=m0P&R)`ym;<4{art$_tzcW z{qNaqcD<j!ny23_dGN{hd;GUv-dx?h`V-&IZTyk0f9tD${Lk<b?)pF7ySLTFeK{Vo z|Js~CoA<uHwL1Q%zTf%0_m5aIq0t=?$+X_Gc2m`xU$x2m-lU|StTR}l|IuCk=b6)W z53hUc&(_WDnZDukdE@Q(e%y$kSNyE>pk@Ef?9HD#?^m;b@{KlJJ16rFSLGM|^BaBY zz4c`C|6Sg`ZSI<Xzjn2It@qylZ-Z~`w`bP>U-$3%bU)@p`}&`UUf(Z%yME8})As*o z&;M)x@7px#oL7&|-s@ghy<y6R&tE^+<y`+<|MigZ_74xa*IVv=@w+bb`nve4>TmCI zUd8WueAwpezVbPID@!)U!vZ?2`#|=;zwC1Lc153V)j}fhcX)9vr}gI>^*NirByV2Y z`%$RuU*)ga*X93x?w7I4e_Wd3{o{huoBdB-+Ap*J_ieND(+OL1%y!i)ryCyxrNvc0 z|F&<RyGC!{zlU#LuU~(AMSR)e?Qecv(?0)ys{WrttmXgC+}s`i_x-+#Z?pA&U%Vdk z;eJj1!)wtwuO^-SwtwHhg*hkAiJ$-dG4_1@Ro9!*8&-z@$$R&%?t6Nf?RWEX@o!<A zXVxuR1T7TSFg0G^_qMsr<>ub^Cw8oF@0+tJ<^Q?0`ibpxE^R#Z$}IZUj9h8&8$X}_ z=)G?9=_G&6^WfR*{p$+6b9m1Ge7imR-2dHQg}0oox7&2{>GiY6_;+pd@z$FoBWL$} zVXpdW@4O0&-@AUawXgYiQ`$VuzWDU>`(<DMe`#C)=S%&^edd1`+y6ORUw1Bl@54#| zpT>soxsqP|cJ}kh=KBx*Z+N>i|6c8_;*am`%U}CHsr$pc@7=P`%*$Vg{dqBazWlCp zbuYutd!OgFJYW0yeSQ9%HG1dn9CG9PbNgLk@zI#mZadz7Xs`dj`1YTfAMWU$R)ZFA z-aZMRZxm;J-*^0Y?az~^_M7K+wwu-IeyjM_I(aH*-Os|)S~vByKMB=s`t{B7{oilL z?`2<aRx^v&<EwkKSN=Eu{@lR-=fBCXj`+Lfe{%XRzwdQ#_SS9Es;~XM|LwtGd#C^J z&F1g@c>Ct{rRH^~UroQi#qf8lb$-qDum2C9k1M-Y|5ZKzZ}0iNZ{_#?-(L6f(ErcA z;`YzGx8Kd)JUzE+Tl=4*{x>pTEUn)d_-Db~^>H7orB~;O)IVyTeLD8fx##by{;k%x zi@o#p@cTcPFQ1D&U;DZA_HMJk%Wv18-%@dIexA(XJsh`7*Z+HXcJhq%`!4SIoBI3X zQ>WVG9T%&s+GpN;YiR_nU=DBz{@D8e!@~S~)juZB->>_->bCrx!^`I`$Thp2>Uw%h z%749e`iV2$&Fg&>bfb@~;f_1x7sfy5w|e-$8~ovM?|;sm@3uxa<Cd1_e&5Jts>kbv zk6yc6|G6<&ef8-)s~NSm-_)#)WcSn*e>+`n^XJ^_x(~hK``*a!f4}zs)8GH^uKT|K zX{h-B7pKqvf3Lsu>Fj4e@0ed=v39ZjZ#uoA);s>wIr%$ZPya8>-ueH>rC9rqipDu- z^R96Ja^An^tM}@&KBqS>zW7om@8-VV-gU;OAIjy{-<7X9{Z(Sq22E?;B3D@Myw=hn zTb*~W{>L5tJM(I9eoTHHA8_i=)wIpAVOxB>%i5Mt-|^^Maj`ykWy<H{Ec*k_ltq4g z_P0NY(>^lx?<4V;uam@M{!Y3aE*!r9iTk>`kNq=#`2WA|y>Wv2?W<a0_YEQ*Kg&M6 z|Kca6`ud+ISAFrTc+7m;FKqtp&vQS$Uf}!p?6QZO%VR&hU;pp@y^^Qv|NKdPU-wm2 z-}-yDe%(t}{hvR4<4q5X=hdlrTKrcp-}_+e^r}zO_I-&h+f;S@TG9I-J7evCs;AwU zb$7+{FEiJ@j{m*qtj}tj_p#6CoO?K}K>6m%oWjK)=iIM4xNd&Ewf)YC6IL#S<!ZIY z>wmws=k0ud(f;?Pxi_cJwUyKQe<Nqx>8@#+C;xqY<vr*7QtQp@XL_gXUQ=<pwm*^6 zI#Sl+{o?EU-rQGNU!ObGzUJrYim3~7&0bo~O`bU|#!6++yM3T)`R_C3&GFUyKL5<O zEBYBLzW4L4|6eCp*T?<r)2@4W|KD5bf4BShKD4a=l^uSs@WQRP1zT;O7?*AOwe|EK zj@+c{{&f|bD{k(tFSs80{!WC{X4bzCH<#JIzdPUHxm$PoypunVM8|J<?IWn2r`PBf zm2~)h=JNMd*<X#HoxLZf_6d=CEB?O!b5fRH_V?<$-{Lo%so(QPpeX+5acI<jb3P<9 zZNumDhsA3?9gD9$$-Dp8<!`$_hUy#kir;U2`TgG~ZKtPhTOuC2z4xzPpBnY)+v0OG znGdgiceiZQuRmwoZ^yNtDSJA%zvkh(-|Kh0eyE*i|6{5(Uu@BBS^eEV-e|wKnxPW& zA$WJ(hh3*_XMTD5zW(3B%k>+k&)z$8PWqSL_0{*%&VN4lYvuFY(%L6F{XZ9O-&dWj z`2Ma@zR&!x>n?9^yU}}7zUp=FmfKsh7k^%Ecj<(S8LU<mWZM7FT7KW}2f^Ro`=!Uf zulPUzw&Id6n{MVz7uCHy>F?}vK2Ul5ApQLQpXPNRpWXklbnW!|O!<G0e#d{+y3>?t ztTOfTxwF&a_x$W#UaWI@(#t;^-Y%TK^>518)@b?Ms=Gx$x*qI#y1_KA^7>-=9p9SP zzpGuKsiKmh0WBhx40xITe=E1&^#4NV#r<b>FHf>916%n)+`jsF{{Flr*I(NnH`3k7 z@?89#<;nlI4`}DrSFbt!`l9~5e>cSQZ&$<?-d-HP>#w18-pn0Y@Av5`&JCLq32&Ml z=iKw~P5-_BH&(8{Q(AIodTP`rd7)<;TISZv?SJN7zW=pu`TozkzwdpWR{Q>r!1DO_ zRiE8zlV6?v?U%iJ&&{^kUwspArEQN=(78Ox+kNi;>igR!U#&mpx$<r4(YLdYuhRW| zt>AIZ)fo!2p_!rMfC=ZGueS5=)t>&#FH>0tw(<TanQ1?E{{LD3`_|6+b)TfK_x|4G z<E>}AWBR?lZ&SW5weEYN3JZ@7&sg+!WZjRxU;IwG{=I!aNM+f!;)q9=>pw1?U;B>x z?e}``$NNC;c|T$Lo4eogH`G5pcO1RNy!_p*Z`P}|-&?IhX_4DA+1EYaHu-A!ce%@G zO=R)hxoh6o-%0u3`pe`=4NB)gg=G`_a{0ZFm&{%H=D+2x`l3x$i|Y{WYX_E&0}Gwo z+vcn>`rqEI1@9+x9PkqO@q7ROYHLkd%c3VgK0fxpeBSuHO|tUtN6(LR3ak6ivnhKs z!!Jzx<C9Whc#q(*@P(6EHOsu9&0$8th;SyW$hEI0U$5;3cR@h?j~;&q_0=C|Y6Ze$ zI+pWA%GP!Mao=@eL1|#eICssl^i?j<)Gp9isv2MwIoGQ6)$aR$*TsI_&l_`nd)vEc zm>CO<8{eEf_3t%T*_x_*pXVKK*ZvzWZgn`c86LT_1U>x2>g(40`uG0-Kk<DZTGQv2 zit&Y8MXtRW?YvzZX7h!a4i=F=H@;%8d%zy|=aKmQ+HW`I|2$y-|Dylj3I1@a$kMje zY;aeZDhv39m3378JRSe<+xGo`_k2G0`_6N_?^D;;JiV2@{_m&h`*TX?uDSMR?ZVrl zjDiC7;C{jjAB8z<{*;H6^>NvMTfgab%2mmAQt(K**5hCi`S8Exg@5Xe*1!Hs@93`k zrMSG|@}~H6i*{Z58{KODxNXa%Yd4L%@?s9<Mj9`xu#Z%i7F)DA`s_OvKjBDb@tZtn z+d>YDecC(kmvyMXy_Kt1@7&_G@}6mYT|LO<Gwd2$=dAfLyQx%cy5y!(?IQixlj^fd z?-^&`Pmfx8{rIlkmv$-6&s}p?tnJPWzsOcz?u#$iUCQ0iUi#{b*N2wGTSwWh-Q2Qe z@6t)fwv}wHp1}WbuY}W<^i!IkF!Xj$_@}=5!^>H+QGzPXjHSXhM`zgvUrRi1mUA=r zMSWIg=Jze_n>R1n{Cd+(p2QisH(w@Qx83riS)J#ybrN&7#b(zt+d3X{ehu~dxwOjG zcQYt$ZCJu0R=0`k&L8I+>tgh4jf!P&wZ`f)y80iUaz2Uk%1+hjHBS!kH~yJapl+1t z+{7uOxPyCdM&ntQuA4GtMSd&VpBl6raGE;dm{0w-O1pJSHLpBuIpMc3gUL_aCiHsj z--y+6-8X~kR{S;)*%-Ex&pATx>tO+x+Pewc603`Dt?mM)AsyMqm2=m4F>IDU_lGlI zYOlfJgkTM`tZjvSVTsJy#-AtrbyS}Aoy~vS47JT`U6t)c@0{Db!uiJ<er?y;k7Qn4 zNcvjUnx0;tWt_t7ym3miZ(3{lPoYTXZ6~r*d1KbhHsns+t1D$@?7W%dR@=?_zoP73 zdskR%-I?JV2F@p8%?CEkS<_SY>*SoUKMNlmp0oSLokbV3(_T!Nf7bKwy{U1|)dnAQ z{9AYN|KutzSQIBDYX9lt>1SfSZo+TeZAB_?c+R%edHA+|$FHuXK5v#Q?bx2=EiRSu zthCTtz<9d%?X{}WYu;>r^jy<V<LXUia6Z&_KHwL&{a)4U)akL`R=%}=KCgP6=$o$j z-uipL^jW{ND0_2bp>zA2Z~J$BkEr<jLRS5)@)!Ak59Qy?GM!WZ?`M9^W9h@kbIM+D zYCc(0x$G?Oo!g7n)_3Pdw01}49u3lWiYcg`u}Y<7ok7ld&$-6pU!y;}#cg*@wlrIO zLx1w(1-=nd{Cf`_?fN$N%6g9Vw-0GCpG~}I;8L+t&Wu^w#X!NJqig>19jimq`?rAN zXAKXdb>z*BuRc6HT)+M6<NvCwA0O|x|9IqM^6_~VRbOr-_sd#Ve5kiBzgznK>GXKJ zKPjm%eoUTbx@=8^(wVwzZ_Z!ad199M*=v@PY5JSwZ@Fw}W#PHl#MON%XT|3YuAhY> z&no6QupW99TiS6-@9f6d&kxNFRocJ542<zK4Zm@|^m@(LyPNK7FV&mpYikpI>Dtt} zr^G5(JBI(UIU2jvs(Oj51B**SYCXq|ldpv5|7e-N>Wxq7rzb1Z{pM8sdYR5ATlM9^ zL3g=-*A6nX%iXK~ZfkyLNBaGJ)#rcyuzah&di6KC$J75dovu%R`r^;wZTH>Rl}37K zE(}?}<w54Bx~QTFCl6h=;QFZ(_37b59}(XrUyrHYn3fgaboim?@*RhCms&0IIwY0b zb-O+?Su5H_?fkB7+EsVMRvmt(t9W^LfY0Izt!y)9eOV!|V42z5KIjPfEa+4EzNw7) zk7(nH96NDcmF#sb*<PT+cG}#A`D^}s5BVk^RsU?Ju)posFO&V{>VG_J=C}E9;oon$ z8{6~$o9FL)`|EZ7ru&htlSSp{__W*e@@#&XVk%po_wVHU--)(!WwX>lIU78hblQnQ zeRcZ$+HXfXC)cg9s`}E&&Sz8de((49cdO68-TwaW=I7U5uiO3cob~rI>&UycZ?vj> zzon%5d;O2ttCJu8HW=hC7Y7zKzk~}XyZHRdI=c36zGY|qbn?|B^Cxao2Ng>o%Qon+ z)R%0Enx?+AwhLSvbu@7J%x~}uyIk*f3)Up=IIv0J#?HxCua?U{p8n6IAo8Bjt>vHu z25M6}<TE+@h1C=o$^Nrlz50D!Q@mB=*E+W>M13d5)a)OY-sf)>se9V_x*aIi!Gl?4 z9S1f{zB;o$dFtOPt$Ay{*%q4a{bIdZwyLQMR4;(5g&BN}j_TT07B>~O=B(Mb?LFt7 zoG|s(FKtTRx<GyClF-h<V;TAI!IMQrn~a+M!mPirh-$<9XCTXD73uptG6N}S{Su!0 zg<XGB-4y?8?$u5E>qEDIs{qglUE@rawmEBlJV>$nllj2(yUjuUxogtwxFz8g(X_b- z7EHeSZS!Qmu+#t2F8qUghD`_*Lhq{QJ(ymXZu-G<Wh~r%zu;z`%ldBX|H)f@^~?Q| zTbx1ljsT-zy+C6lOWWKv+vd(abn?}$>iJu)zgsIle@$8LzaQt89(8=rxR?ElTt+?r zj^J=XfyR?U5=EOnHBX+u;LR-C$i!*>VQz=*J$^pEBDhkI?~i%+J^m{D7k?+z`56gk z3JNr?6qKmgbm*X_ZDefu`^kR}o$T7Ly%gf=Tbw>`rCom43o;6NaPnA2emr=x<j35r zrN8Gt5%&w*$No>{VeCphyDIx1_gNn)@GU*>T$k_B-N50~3kieZs!hA<{!gy>c(Tjh zVCi37MZQN1zBk-s)_vc&vbHnBUP*ze@xX-1qJF-5hfZpp`E*k2jU&v{0*rzYyiC^R zn|}SOuRZ>A>Ex?fdlE~;K}iyv{zYMlsxDnLt#s2W8&+R<Lu?IO<6P^=y9M_P>t3d8 zmCBd6+X_#Ntso0Qx$A!9-Gcuh1)-H(v*6>e5xh*zeqp!I`#nr4ef;<M&(_IP|JV1& z|F9~Y^k@IInLold-<Hn)pZqk%JoBjRsqYcHr(KKPUd4HW?_<3Ao?Y>v7?UX4^r(6A z%Yse2UN%1d^Jwza#N)?*99X}n@vUw?L(bH*#Szn|OE22|`@Nt=m|y10z)zdcr%rit zX`6WT`Fror=%zNNbQ>?0;{E&Wri322nO*PG1$DH#`s(F*RS(W^t84H78)$dTo%7{K z3$d+v{cG2SdcWK`<<)7v<=<<+=Dl&xId}T&?IpWF$udEQ>9Ai|Iw*^Csjtqr`5>}C z$}j96=bSpe^w%*y(Lr_xn-z=Ju)5|SpTfyfwDD;FF@+1=4iW)|6UEjx#l5Ji=YHNI z_M|`b`P`P$O5JOBnykd5i<;&~*KnE7h-Et3^*}Yjc}Hka?$l#eIWj_B^U{uPITxJg zv3_2UHqVLzj;@H+@7m8wZ+><v<du8Ej8BOjP3}&hv@hnDaN=Yazu&UMC$r8sF8^Wr zIpwJQRNY$_Hs-3GOn9cag?o3AR9c`<y>_B;B=arB8*IFSMwKt*cDE_<`~K!<k7{k# zt<p}5emp^jh3(+%l~3CB<l0z#D(|k7Ih}Ux1y_@;u2t;mT{gmR_4f2BnTM6k`1It| z)+zmBW)*^>;$>T{x_Yf{*jS2KPF`LSyN*5A8QcjtP{Q%y<g1(M`?J>vFZY{kQTVC; z#Kgtz{Py2YD7Wwb`_}#2+uQYbOU>_9KEGFNS9fk>@^L;{tCZi{Ckx5X@#!zxbSQl# zX8@P{9^=;r8yq^+lQZP5XWqSiGjde{$MT)~OP;1=Y;j&NSNq_5=?|-Y7cSlSs4k_* zx@5-F#BMh~&w`H1iW9r8$VJ^a_V$9_k5jrU-ID8PJhIB(tSED<dUL6W;*B}4CcJDr zbv1dj<x-{hEN?ZOrrg>n`DIa3Q}-IfRM(9B6zS~wS3^Motmf3<A6Eap{QmFz|F7=< zwe|YGZ{_#@mDSgNQI`LCd;ibb?DBuY`X^sCm#>)>KesM@YU|{>Y0IYOEEZ2ROBCg4 z_7lD#x#-56`dbxdt9P<WDdnE@TbOYu%D|;M>f_4B(!BhOH~djuEbwN{i%IieuaW-V zEb5%UP0l8<W7?Vo<LnuilcEfZw?(X+zRaS%^rZZ&g-6rADuc>kVMPJIu>JpjU9W%k z=d=C(uf=Cguiq&;t-BOb2i}jo`=|cF<v*`VHa+S;JISnJM$?MmR^CH@6D6E3MTRI; z7(2F`$fe!h?E3zZ=92{(hq@$|wVAY>Rkf|+V`_fDdqadjvRzN^5ZlAeHZ5%&*@X(P zC+!bef24?e+JmI-XEooH4LH7SXw%hQCK|UTaC0xS_pHCm4)>QA<{Loz?A+=H>eW}T ztCu>#u73GpO6h55|Igk2VN3guuPa^LK22=W4~Mn~EZS`XEzSofguM#PNNE%hpYf<_ zZ^q`Eaql0=Y%7%g*^!jqFO!#kmYenLZ%1wxGqGKpoLv&lLM}zDTcE8iklMt%B3dw0 zW7?U8eQ_#3gltmIZqA%?zHRmP-7^;lv~Q?)%Me~V$KdLvLxGX?+fKyZh}Ou`fP~!v zWT(A840f9E&hM@HhxfaP?c>dLV42p@@NZq@qV}b0yAD(daj38MgLviS$yYO@<?TLS zI;pkiVAQ{xHd`_@n6kYc>i4gCyZCx<_kl}-4<?6Rx95G*Tn{eH-bSDQ;H|!TX?1?a zVI^=8tfasc%lYBts@L<`J{>$+Vi9@w-`eyaODBh3cURsID{v27668={{r%5D`5X0V ziQliCpJ!YB?cLqzU-w~}KE4HMx_W7^`Ibab`3bIO*RlLax%$<g`R9WatNJ->-u?N; zS@-c|*MHfN%=(l^3Vc=kFKjP-l6&z>QGY*2$ALMVA5Nb7clkB6Wo3`GIrOGpa|*b$ zd9|)t{l`&t?cMJG86Nfv?k~K0wDG^#h2M_v+4ss{I`5gLq|2maU<$2a?$%dqdi35a z6YRFeGN$0)Y!^YJ0YRYJ>DKSL!hbHkU-RMNNq<IH;Z@eWg#zq<YaiB&PqFxLU-^=f z0#mTE!IPAupwv?yR$l*{W&e+qqwzAA{!J5LFT7Cg@V;@{_XAh<xonXa6lionl!*70 z)qfsUU%i2yw;oa(yMP+Qrl6(_s2;Y6y!-itC+_;~_~fe#Cx5@-t-ktH@P#Sx*vJx) zDA}~Ad9v)HLnmL|JFJeQVy!E<RsUm3cfqDjR{KlpF=|&ub!|I~nSAQ2fAh`1RbjiU z(zb?6UHhN>eu={dYXWl1!<@t{Ot1YrekxL-%g_7w-&<RQ#n1F~oAPAqF-<m*5$sdH zz16U|z09asI(cn$RK}V=Zatei8#vC)KQLkP)t8$m&tGt9^3=I2Uu<<&*Zy5UW0w7v zI_<u%omOFf`*%y+xca`5cW3ImRND`3Vasd{I1d-*Zw{_dFV37VHp%bm<ky=sqn1wU zJtd~CICq)Op2_iPf&z_m6%1aaxU#ETyR_bqy!-!!W*x76<kIc?7tarTS+t5r<-+gE zuX$T|i}hbOe&1yD_S}(mb?(+(8SaNKtJeobtqbuNW(#|^?Sjm_yAC2*;*DFCV3C^g z^+59SH>LltWj{N4%D(kY)}O=bLd$Bd$qR@_|5<vxD~{z*XIJNz4AC!6*P|`ew<y%F zv3jqv=5+Q(H|}o?4>|K3xc}I_F4YTrwN$g^^QCzwgWt}oj%=@C+0<^zv$7yM>s<Y{ zof%fX+@e3$zPrU+dNx+kfajsf#MmbBCdHD<v~4rC?bum#_F2KjlBIW-gR13IIRcs7 z&x=K_gUYhR$5l~Vx}+~@@-?naTIaL$AqP*e9Z%o~kB$b85Kv-z_~wa{Wu)!z1Ig)e zFHfGb*Zc84CPO^$z%#?>l{Z9gM=aK^7tLvI<Ctkv(jV(Qv3=R!cILH*4vXy--MqHY zgO4e8%C`gFJC3jG-8<)`<(+f$#Ln*Ry_IZflhd}`YuA>r?)^_5R%y=P{;F<w(Z;~( zpC+DMq-uPZZQ2J7`DrF+R1fw(d#Lz2s5&EY_V(MRuQ?yuq?~PBbMvs&ye%DF+`HR) z4+gBPZ(sSQXwKofxaqGQm4lsFTo(8x+&KB_%)yg<fe%wkADr0CE@%BY%RX|cyiOhW z!{mcqnXIlgVHHubOwS#PnY#7}YbWhgsCc2<D{9{Ubi#zWsm0xVnG(~g&OQh(YyGBo z#d~iI|K52GO74Xft1jN~Y?&LOA0AbbY59&<ZvLUG>Ge0yTYdR7LHGhw;yJOijcYEx zR^qwaskA=TRnAFy`K8yvU$ynSKA3D45)yjw#OifW#Vf}Uts7^g&TV-ix_cJ;W(}tb zCLWHK6MlsgO|NZI+Ty;k*Hmnh0HfdvVTqzmw=66!e$*`9wCUzralf!_@_+7fJ)F&R zc*Exsv$X{k8S8m0>)EB0a?kiJ%uw3RE8+CufYtWxFE&`UExq?<Z%fk3>8}^6?$+x% zC{uLf+KS68>$beO<aFn>+`8=<?|5h3HavP%toNA0rMT5I)Yn!kzdG1f<(+@Sx$H#a z)H6Bj#hsbv#H8Q7*SaF4Kq1=#M<rcvFd5XIzqayZzyHIOuMZ}s|J=G*UHjkd{Y$hp zHtF76)c!#vDbOU*l_%I)>d>=Ea<=S^0{cwXE$my^eaX(d^z|VT7IA6Q^?8<db1I*T zS}u&8KJCF1#a&bKOZ!@TyLF{{9Sii=AN{&!Tavo{?89=Koa0Qsw5`ms-p*prA6e~J zzv9D$uV-8<nREP{FL}L4b@nXwK6$wG+vjgFyN!PY&(=~>V2Xqm*0vu~LVs4zTz=^O zn;DOGJ6~i0Wr910O24Fao4x*;@L6&DhThj1E+W>|PYSHF<5n!W`F@u6i$haF6B-^Q zZBx~a((lUnu5`RjGw)>9dtOeNN8Ss>>+32Eriy;p{$$6^;)wLgYa_UxYi5W!-ZuCx z{O!QuH<xlYILIBkA94O2`(6*@#zosdELtj1R^_zqP~f_sQc)JmH|YtTd2DsoQ8rCj zakEM2s^pylQ@^Hn-{fss)TX4sWX$>I&dFB`kI#Q9{{LLovvtpMKJd@9)VJFDRD$XC z%D2Jb{?`m<##)XujGLxKghG8P3+ni&S8w{nFHqZa!#YMI>}!7U-RT@ALKoT{lr?U; zEO2sAU(F?h=oWQ2s54ntZu<4kx&QX*e?A4yKHtj2<`$gP0ktI{Rk|pst58>FRm)p1 zCGqcX+1xc+{*Lv*5J@EkrqzxKCr)b3nS1DD*8hjWe=eQOGQDT8iyK@uG71Vbay7!M zhJ2X{uJyL;^DdoS^-078G2Sl)>g*O27$v4JFW9sz>;1;n??9~(EC#JED7$oW)uBiv z`(HaasIM-qIJL_iZskvb3n#Pe=4=HIID*C-4p@OiWan*q2Ob0jSDSV$C7WjPr>|9l zd36IHOUb6F_T_7;;lmI!_!;M{@tbS)^^CFlyqZrxHYWSq{QGh7_q%%Q4f*%~S-;=& z`&#t-9WSNL-|zeOy8PbG?{oU+7r(i&(Yc-P=Dj!j7cKao`=Dmt#4thdzyzoRE5=l} zsp{L!^uH0MUtVlfcJH(M^<rY}?{`}lUs=2T?#A@<y7BuTN?(7oFHU`RYUMJ-n8|@f zpfRsU-THPlKR(oV3aihndi7F$e$A&&^?6(3qiz3u*v=<Y@uHEL|6cun=HK7%*Pplj zoxktrHE#Vq0sA*cU737o7d+A~t0$<hwypkl<Kd})OV<C}lzjDSc>LPQSHH|(Sq5%L zf>dtMU@F_RsXqVJiHXX``{nCr)y=DXCMkVW)c#w&_u9$o{;yKDu25fE3U7-n1I<Xh zv{!x`0P1RhLphS;Maotkf3M$&Fa=FXEc@RBAIlJEOjTSk`RXPcP520uOTsTu?EEvn z#0NKgT5E$}*y&G8w)hJQFhT}j8ef9uNq(L8u!fr+A;tt6GMan|F=Rxft3YG<Wx4+> zWHP}`Fvh*?x9&5)yAsOclCX(ItZ0*w)IY~l^2_@?N(&$CuaEpv2WlL)e<_|c6FR=} z$3N^(tR{HKSLuRZLe_nSTm2jz4qgfW)V1$3*H8MeE<{{@ul%3)OoamNm!2!`HwO)7 zE^|vzRM-A@V9K}cEfyWk_n52rx9nkG_DyvWsO!nX#BCYbY76OifZ_y{-yGCe*I%vZ zL&{^CpybWv?^q3LD1(z)1TSd9=veWUSWx;0kJ9-xHu!}FS8&}z%;jVWL|i#}>c6@{ zS*%sh;`ej@Uw3fMFv(kU(JV#%@wdLC%L~K3k1zkYFX44bb8%b0@2nSF{PX5)e%DgJ z;<axn*Zj}D*_MI=jY5sBbJlz)WDL9|_v%@ToRZtgl{vfJ>r~gio@?f2dTZCZea`=6 z@2+iKe*4}<(aTSt#b@q6SoYlS&e5ds{5^}m`5xjlEbc6OentZ{X7<btJn<1J*mhGo z|6_`@bK&yhW2g9U=gFJpEx34X-@8dx-ZJ%GUsd;>ExG;H{Kh+<aLKsHH?IzVmlvwK z<JUiJ!wOIl`dQsz?qt#Wwk5Z;Gw*gJo_d*To5TH&tJuPKL+|SuT&`CRUs@`2#hLF_ zujL-S@0;{=AC{JHdKQ<_6483L^la>&fGBqz_O?a7l^z{Uz3I)zx&#aoTsh`9U1m8W z8u+O`{dG*qT)k7Jv!9CPG<Pox<o{=I)GVX_&;{3IyIoE5uRqoN;af2G@0-N4byxPz zkWKqru&q0XPu#b7mVe<<)9oK}PM((o4YhF!&G>in)PkvYi97gsCz^e_awh#?+BL;# z%Olc1Z*B{C@=##z-3Ia9$EGcs@c7WWXD)>cjxCb8p<FL)xsv0gLB-v5dt_!uF4pGw zR&pur+&bx3dt#Q?@I9a4cDH(M<8S@k^;_ikot@PF`fE-3qf^fW4jm3z&bhMvFlaDu z+QbIGu%*kxejd^GEu5RYw@=%DCSR<LkExSSh2JaApD#CD30k$BbI+FdEPDl>NiN!` z(f;Lxi=UR05l>8eec8eAADfwa6Q{k7%yrE^D8jwYdH2EH0VWq$+`U<Mv`*^t!|$?5 z9cAl(=ydIqH>+0NyGXXlHd9cP<J<QO^P1h{Hkmm~RB?+(DhD{RxFo#fc##rXmGVdP z_^m%SI+;hxj7oUd|Jc|VGG$xHs^y$<iS{-zGK)4hhP|29IVYq*<a~XRtW?un(b!ML zwyW1>Y@Craac%L&_HEPr>~Hj!mR?GGHqCGERM{fGtk040x6)t#Gf7NSW%)E=>(iFR zUGvu@K4VJ}U=*Ao)%bJ%njQu_2ZbFHCj2+gmtK3582c&0_V?kvYtEiIyyl#kv$9xf z@rMr~;k|!CrYzcEC4H$ZWRsa5U;V|Up<Xi+Kc_i6c`9%nnrqY2cED-r4KI%uXVao4 z=6;y+D(Bt8wM#Gae@l*?`{lsj-)gn4{g1p>RaWc%{?Z~B&iCB4*{^+{*!IoeB4b@0 zSf))p;N%y^cFNxQ&8Z7JB<xZuxO6qb&P>&OGKJ;&;bw<3NvDpSQMz^WOzcX=pBrX6 z)K4s4P-&L&L|IoN%ISflRC|FDkHCws(}HBpmdtc8eEZdF?>V`$s-kU^^7^$i6~gb# z{I&UO!eN1??Z<ENn6>aWb&Kxz-x?qNsn&as#;40==G(969?88YWMs*B?!iYzCnvr$ zy-md%tXf)^%+iiH+I>^ALd69%a&TagU)W-WOZDj&H6)x*ObU9MyP2<iIc(7XjYi{B z+sL2Wm+x~vURAw@;k@XM){XO)6@jV(2Np5cgi8OgZlz_28pCCQi-Y=VA<3)oV%}we zHsjniyM!jk!|D(R7B5iw`>5X1>y~^kq>QWw6_Q@^&sKqkmRmq!SN8rN;~{xvJ{M5& zY)b3WxgLM<Os&%S!pSVtd5hnHheknRn7{?977qnqsFwqA!80OZ%?*BGt3S$=A_l^P z6&6gsDl)I>8*EHQX@eA~ZPWXF#cp^FF@uS5?wVyEM7FTQ+f7$N`m$`?5o6;AL^xig zn6@roU<<EC*03?oT~i<S*z%Pg+zrb>Z7@w6*0+wZNJ}sURs2%t1Ira*?JEOT(6q`! z%?y4>MWzI*%Rps)>}>l5(`BPJ=4qUby31VHTKv*Q!T8ZX#^XoMM3^~W-<^<sa=rW7 z4>}raZ`iJTRlD{^@}>H>9St0BWEwr^uK8npGf#}^mX_n^3+Zbg*=Mxhm=(Ef|GNv% zET@%n`a-AKR|Zf0`C((|vz{uu@21aZUn&AQ;etm(pt^R=t;fz1hsygFb{ClP^EkFE z-nNMh7szN7wn^;J;4s_J=E%hI>_9r7_k%J8u}vCb(?KCv-*{9g;=##Nc6D#>eN^Om z=wMJHxbBWbiG<Se<o0;W38vR{MH3Im-I4sW!StHt5tBpFF1wDLS?8xa_l)uMGUpRV z1e9)geLYolFDd+Uf%Pl9qufi=z7#oScrL#qurAO0>{6>+J6q2#duVttct!EW(lV~2 z6NINF%!bU+nl&D+pSR}2%iIZ@=iiI@em?7l!i~rLtBszr?b~G;b5o#1b5F?jGM_|I zJ+|Jb7oLjBZOeF)!unn%`-E8K-8GHfy=iY+Sf8`VCK<LA*tZERluI&9sqfzAb|dD7 zXr^95Lh*%#tcQd2d6vrL@yN}aweqaMt&LyK#963<;ya<1L+4dWeQL|!WJ&pR0(|n$ z9XWT?z2(+C+PgTWa&1WXx8&eN`#baA>7Mzt!F73KW^3`Kn*ld1iz8Op9WnEnF}Z!k zmMh+?6(%?@sGVkO!<x$^r5oe3HT+U`L^rR8pY2z!^XIOlZEy{q9bRLW{a~#ZXu->Y zUjm@eR`}d*Twjvh)oNcaazjCDUdbuvwixf%MYd1EmuXq^#M<OsOys|*_&kMIW1IEb zrIRJSO}JWSKiInKn)hkN_QTD5d+#)9>TSy~VLQ0j=4k1)XPnOOA0?^hrk#6p<+SuP zF;I8KRB^+N$x|KA)di$?|8p^56?CdNA(t=z^wmbiIqhpI?e|z!M;sQe@3P6cc!G1$ zmDgtTw`MQxULI6$JHNU*TZi#spoG(v*JiK%c7I9>crs^_8;3f$M}F^}=x(K6+gMYl zsyFP}Khr8+Og-jvuNe}f%%FtKv!lM@@nUIFo9<)&KTOy;7jxt^U*52S^U7w|`MSP^ zcT11Xm)cO`Sy1;OL90HR-&J~9U5LV^b&aC_$6k57j&g4@Rcc{n+WX@0w4@KWC+wae z{7PchLE%4K^(*__#P4vwRkTZas~e&8y1o5&t+C8e#TfTxEucZbHO!!D@LJ=lcZHRl zA0{?@{d8|)nI1UT8u&9=MV_6!?OGHU(~rB|ol9?QFaxhnsaL`}N$Q}!I<>y(7Gk8g z1XO&?O<y<{UVP|SGtONz?JsB6e^3?#7f_c$&Hs{lt!0R=*c(uB^-X=nUr_8rTCeS( z3Fb<%Tb&>`gVsNF9M}YE{@<Lx;F~_!wF*o$ca>P_rdzJ|#cA~~w9m(gNY8nhW4^>Y zSycFhXYPzsT{#_=JLf%1HcQ!L?9-|!<ivgb@Ravm#Z8u9H_tSc+NlBQ8z?Y!t8SPu zd1}4-uink`_`AM|YWvN8wd=M?ul5>UOCIg)jhmNPPOy#nu6pQA$LndIZihcP`{gxa z9sdnZrqA{Ek*)8K7~JWsels`nR`klaNR3?1sRmnCY?*X6Jv#PwPDiQzbxXzFGF@-h zysonQu2i$^#dTBTFxZMK36F$_>e~1A*T=T$`|=oei}^&d&dSxO;$G&Xz_K^)iC6}Q zS@p$rGE=YK;d9>B5h<=KmzQY2rQ2Z3x`6lFlWx_EiXAd2ou(DHKE^ri=t@m!6*9xP z@#UN~KVDDT%J?u*{cYNAqfoyUEy<^D@9Z{JpI&lpzHVEK7=Kigq_gm|hl*M;-(_w% zt+`%!G)I+j^^S})&!4RMW}C7+1lpTxY!!}pI63s&?7I!^>(k^m@%hb5y8DS`^S>O! z`XyT{_NbOtv3^xJB=CAspI7XXy7deA0&l55XE*lWn75^{8=SK`8aU3hA2{S6_G4Ph z2I+L!Hk+%9f_v_Sa<2DjZ7J#8GHF|jmqgpu%MR<7?9JG&S$^oT(pq-u=hID$ZW^fA zOP_dn;jP~m4`|{&Aj5Iye@d$P(fIEA3jzlP+HwwuY|GeubAEzZe|Ukbxb@~)-7mB{ zubdIRb|Xl$>-C+8OEM?q)>Ws?c-q>OmhQRzNqE)aE}JKM>%5`K`alw=&XbhX?Qib) zJp64K&6D<d$q|d?B9opi3A`y2-?!XC>#omIAt#G=^U1f;(yF{Oo-E32NqN2SM17sf zrWHR9PbqIzdj45NKk)jCRkuxG3m87DY*;Zlbb0lc_ZNb^Yqwo#wc5V9%@N*+aA1+* z^!cCibotybXM$Im-?O;w*7GO=GMB+9D9~7{Z18vT)m^rNch`fm8p!hpJ_%hox$5<1 z?)|phhrgNpSyaDf@6kDXr*p4fV)^%*aFQtt<A;_HD-BxquXf;bx!&^N`<wuo><-^q z657F*pnPuN%VZT<TC4Y?Z-d*l*y0QK?sYt6tFxV2wCCPFc}s1UKaz|q`S128E!~^i zRUEPX%d&Y7IWw1qTg)syxqcVO6*{J%R-v8U|16H{>lEMBzyG3pIPF^O^k;F`rU|#j zPJZgonKCi0JM;Y+uIC%(-L&v`z7ZjDu2?+^yu|aFvxEBTb#wl%R*bQ2>F#j7sI~5} z$oC{I(L1NDO0Q|(IelwaO~>lzA2vKXzUYH<%JKjc#^sz>cAhAenCA2&wq@-ij)!dW zZAmYlDq07hom#cey1sdS_p-~SdnI<=IM%(aboB=zgMx{N7bc$AmePH#X&0vp>se6u zj#2Q1FUaN>A2z;`zb;Yar;+sH(7HUnQa=yVGiFC2c3U0!B(jBjcbjU$1A*;{TurvN zB@tD5&iCtgoQs+JUMj66f|ZR!Z;`6@gy2`XE0t%SP2{(!5507Pv+1u5c!cz^nZWF` zoQjDjbWcnKHBK58SxPp&^3tyn`Fz22oyRk;ll;Y=3M`ABths)Xk8yu^&5W$oH$t|} z6T3U}Yqj0FoA;)<srW>GxSKdXrUlfm^Jdzc*3kAqsYG?Y^h5KDEAGyWbJpRBIiIC% zruX*kj$cAI&(zNhzA+D6dwfw_FgY~5<WFbrUJ0jyi-#+_raQ|vr8lSXzfPEK`6TYz zwG)RYxz(L)*ws1V<z9m&&hxY~a}qRJ?z5Vman0bkk;awR*tX%@q;qPUcV0SecJ1bw z35T8Eoz2qTw13Iwy{en9z7Ed20G_&T6S#14mA36amF;mn^@=-QJhVA_x^S*(^@5uR zW=-E<^+)yK-Zf{>AD-lvbFyI<=Q)?T-L@uX8$_DkOG!UdGI2?0S{ITMz3J$LlX6Ge zl=vf+Pj#2MI(ZgYo3JqLl`R!ss=4m)`J-LiG|v>Rzg`MjOw{-g6pp71YNS42*cz)V zTq?4+?`gnyu0IAW^#|Fm-O2lUVJhEF^VNGhG<X6X)t0S!G^_P?z;TiA8^W(_Qr_x% z7k<rcKfCzE_j6W1yvw^}I4lAU8y9s>+f|+LtxUvHx8hKUMB4OqA{WnjZ@yphp@OxJ zWAjG0@TKRVNyiJ6bdEd`Z!A?iuw3L?ae~piqQ}e5KK!<|rJe({zUsostjKv&zG*TE zD?Uh{WI5mGSX9ZHIh{7#xy~#u2~D8B!UN}v(?HEOa93g4lm@@Bzj86Z{P(T+!u>?g zW#)rl9k-^x5b205eH9gLT(I$ldvZn7+S7{b((~G)(`FqvO1QYLvDf^nY1y*<-`i|0 zbF6vN*V*|q*T1`R#OC_dD5VW0pfLJ);>YFnORA5wiTUvbGq=yXqr89b(K*cKJDJ`x zUUyJaT+1%+mk`^ZRUXwh^L3`~=DA@m3H$Z7@C!Om`xdwR7F)#k+x^eKyv}{|$=7UF zs&M01l?9VSuRoWwi>NrUD?8_vygBbrnbT5jT^V1@Z)tI_Jyw5ZhfLe@LZ;VNZ|4^D zZB4RG&)fXA<C1P={*Gnark$FQyXDF5bi37C-n;t=&QJgs9aB!Rb1ze{xzoOMQRN|# z@{iv(S!SGXE2x$_t*a{g>1>-%{=;Ke&eWN#>r5~@bMUpzYX`5=d8s9(_STnK;`Yuv ze9nuny+v%^qu8sjpFOFUF`J!tzR-A)f|Ffa&V$gPw|+5+4o6wKR1c<Qm?xjGj9GKV zkad6Ru48@%ti`E!FSIUf0gVMZsIQ*lxmU<;?u{OQE$y`2g&m6KN&=hX9)ebS2<Yy0 zw%I1Lz5VL+@)zc!>%QJTIZM*7`<PJ9HYNVZ!}GbeKYYdZF17dDmJ{_;C!O0i{Y=bu zH~Cwlvs^EjeVL!*VRdwy*j`cj|F<rko_AxvY1{FZs}(Oq^}<SKY*MUqN{cv=W3b?; z>$Z8iZEn1-31>N9q+I>V8}KvX;mVNeqw69jYQHIWUU7g&u*hHy_ZH_Rr+<cc%POjE z(A&OvM_ZF+1Hbr8&g+qfg}dyYXxGnC6%@L2%=H?FXLpR|%M0(e&3txhTH3cw2a76h zth;-%?v97R8_&}HGWW`6y_D9ty3>4jXm$$!`w7Mm8x?1ZbxCzKa2PPoT{FY2`&=DY zrLw=H^NjXVE1uQmM(2H;Espms6@1r}eE3Qf?`D}zu7?kmUQ-b3O5})kO^M!dLdr6; zexkN&Z02{(ycWy3O}vL})?AeCvU#&=Vx*w%%&BEQg?*xiEf11h+cl*hwJ(0<Iy=?) z^~_!aP(}VC<?3VG1M(Ker6&_!e+t>vYjFCo*j%=%rAx~@+TV8<d;N}lShb^8+Gvg& zuU+OW_BNRx!Gc0}4!B;+STAx|q)kBVQt0%kdN0eRwbTB@zCOX9q+aynUiFj3tcSkK zv}I1@Rqef<&fF!Wq`>6kpsu~_;<~?&TkTT<K2EqK^6JBEj@O?={yckVwSCH~H;sPG zho?xcnRH95biNbct;<%`VbRtH3cf}^Q*zE&xqJD%!!s`|Eij(4Y{$9RZ9Y7fTG3l3 z%q-P;<+p~rzA;pwRgB{uuj`g*S*x$rOY5GdT(>RSaq(7VM~(0e&#VI?w}S1<557NI z!d1#r#r;a412nssz+@F^$O{^GbYpsHUX=X!Pp<ctt3MB4>{3!-S`2DUmn`8DX%tm! zxF0?vqU(0dE?#}s(A*#v^qHf2(B5WsP@R5=wfL!gOD&h5uxjzjb9<S;%1o2kaX2(L z{nLfNd17zXeyK)?x9^xIc~sZ<Y_jBrjOz!E&3+|ieffU%;dwIKWZR6x=Pze0&q|v2 zI!jkD!ivc%@@qxPpO?pPExzQnzpB5tRqP(;>x68{sOoNCIW>V9{3#NbDi+qeo#kBf z`t4i4(}u;iYg4yf?&5fJz4e=7(uqs=vcqpPysrEGaZcUd-q?L7-8SbaZI}ltrGDKx z%<e4_cFF5p&|aadMxsfFH>fhsQ{2lD>1?RC{bA;u1H1lZlpV6X*7bGH&a>N;y|zEu z`*7B+C@tr07bm@+_jApqee#yB;BvM8)vo|8d7VEWXB?X*b-7A&d5Hh@O<q#m(Pr&` zSNcT<^*=v6^BrTb+J>2;VvK_Cwj5a)^4-nvu~*b_C&vxOS7RO?+j34cL%hb-V_U}N zuU0(s4yRq_Xg|w))5=Dt>6pRUjVs^yXL`q+H!GTW_Cnr)3oKDPB334I)p-}p?R65| zmQdfeFr*#aq*GtL?tSA-c^y^f<hi-JySCK7OXa^Fz2)mB-oTiYvvuolPwjS8E_lTB z{m`O)>19?e1@H4dOqg^`C}+i!1M|834_xJyIW6@zbE3BD++6*cJM((&wrHDlFUWmi ze{(`fSFUcAw%xz2OQ+jztk34@=Un~qf_BWB7Y6mI&VO3YY?yE}!J)f5$2OX$SE}p4 zEMZV1QM$oCBIfo~=NlIm_xW(NOqrCJ5NK4q*EL%0_68R5$iw-r864$o_D118A9AgD z3q0PN%y`&7nfJuUq!~`$0+G_<k&DfBi<T~N-hDf5)?V%G(_$ODIL%rV{jY94zo~tC z!r6Ht-%r;+%w0ZnU)9QUd-wQXSt}@|wA){=N}T<dPB>^z1vIk7G-2l94+n+XuFVUx z*}O4sQ)03)@6D$dSOvF5tzwTZlfHBNk^70P?uMiJX3;zsHq8s*IV?8mrkLI)w}hxC zUY_B%YP+Np{gx**8}Mg;X;b3gos|;i;+?isHh505E2#YuaWU~!+mDAUsxGG8JX4jX z%md2upw!F%ft@eA-%ES$t2_4=Y5zXIExlVTXw~Ns@ci_>8;57vYA-vSd&}TJqO)f+ zr?i&khviBtI~u#!T#VCf)8tXqS+ZJh>y#p|-#R~cUz;d@#P7+6z28r`bGN*=<hiUQ z?IpGSJX^g8XfS3*gI}1>;@IEEx!2w6P(1R%DxY(s+K#x3H>c%XbP8y9GxAUE&T~+1 zGq}F|#x^ObBN0E=E}i<#s#*7G3S-!rrJCz@^PS8T)P3V}@yHpgGw;4E%<NcT=(3pe zo$KB1H|>6Z4Z>N}cfXr>xcAyQ=O?odm<2H}yD;z9PVPGW`enf@lrKaFv^z{`;pkux zzHqWD6EqEGBIL1uqO|n${OCn%&&l_Ni7*OE%x&-sTdW+qfMbmT<DY$pjs)F#b}6?) zb4Au<B?Tr?CacKM2N~cc@sM_kmEeVwtAzE;%>QjR$hmXdS-Jh_hdFYby}J9(yA|`_ zcHpxOdvm4!(CyQUPKa6SPBbmndA(+4_uMmgECTei?l#^I+YRb3OaaX(C|wT9{}Yt4 z<!p@MlN$wT-q#vrI@aVS6uKX-%`c8f;$XQa_geO@jsB6UXT2px=Y6uxQ?74Ks&1MC z?y_hySw-?z%G}g%HQ8`+npxW^zb8FYCAV44e|W^a{`~Fay^9Mf6t7wDda>i7_pY~v ziW<HwE(w*KFH%gO+-zOXAm6s=>0+ivrKqTFg14fhHqD!m?7ThEctynAZr!gJ4oN@I zSoi&!+>5sy+ZC@@xAW&e$z3u_`=MA)S9p2)t8{*o+d;h=KYSNtFn!%(?z6GcdBN+t z8(x-i+p|x6OngxfUoY#RzFM)r!Tz52txvV5)?LtP+Lri|-EvRZ$(WVJ)+Q~cd>138 zJ8RAS@Lgc3>Ylvoax<5TrEJoex%b?;5@Wk=7CF#p*u_hy<+ijd@keiYdf?fibum1< zw&a}@dlkWL2};vS27;i1zE<GR#CwZ$?Xypdy`Ejqsasl{YWC!Y!0az8*D%WY>s4;h zlfEQ&V;5InYObZ-7VVPj9}558kYjn?o+NSTW$C^oEp3bCuF5TE!=5Cr+Iy&UON8L9 z!_8;AcP!hSsd`qkQa~F#P~5Eq>P~z@vg+ZqU7PJrTV4=YIQ_M*)Y}}li!LkA)z9mC zR(9?1WbN*6vmd?P_-#u7r}LVKRfh#wen*?!x|!oDH_fCfc7v`@tHV6s-Iu&(#eXW; z1RfF4X=(5ai{1Fyy{dcLpEbJCYx3KoZN%#4Z_?HhZIt2gcm6%W>e|x@Ui*IE?cr5W z5tTV@r6VYH`?K@o35xmsThrUP_@hfQ>yvf&zH#)6`r@_XGk8|1YPK=&Le;O;s%szX zfo4iv62P5@j~rg|?{8Xl?GxB1qOj)Nt}XIUHZ(}OhIldgiRV1lymIr}qO}u?FNv*d z3C-b}+V!C3#-^hsVpHde-RReU;(X0uhR5qYd#{|_yz<<yy(hRAPW+o=>?~1KJ){1S zfJ*ouj`L=VBo<j1ST6-1FQ7B0!7q%vp5>Oqk3KO0!4(1*b}wae4+gC_1P$zqKqdqN z)En+6&0Jw^3LY-#R$VapYSPc_Qs@YdKw~H<2KtxZd?`Oa@!iIN<zn$Gg1x&Xf16)? zq+e;FF8#DE==Yg=t54}xi4NXn_8Yzm%kbIStcq_cP2?9aUi`qs@UqP`#_lrSFUQu! z9{#)6{Ec^eZu`RzZ+mAnSeqIqty$!f@RbA9_MG|2UH-L~-{Q5C8djc4ztyoi!BRX~ zRhhj>{FK;DgW&JpFRq&w8>excG|PFZRp}IUGHhir(`&D8->ug5cVqmsXTIH{#Pqv# zVQq)RrY+xZT{Szf>wcZh^7#DZ>G_*3>dfX?qYiHQm;Xyhj6IpTB~+*;Yt5XQ+^mNq zUKjDb-VpOXasQdRSl!t&=9Lvv>KoSGKka96JZj@S<Lx)gTwYGwV;&P6?VWnUEb7x; z<N2YtzAG>1@R<NgKJxWmPn%oq<t(SYUS@c-RKz#sbxcXG*gU6=hV6e<Wv4Z--J-|i zSm3v6=cC>e+ZE3*%4?ebz{<aH?%zFLQSxygOE+>cdH>eDIx&H*WyXr%H)pC<=wIJ? zXm93R?F)K8x+dgYOnY4_VbgwgnIPY6=}n~-5iGrlvyy{v&c8Hm$GqGpO7*iB-fdXO zxusxZ&~cGJ(;iq!w<_fv<Z)if*9_{F`-R!wWB!xaTK4ZiVlJE9rg=A|&m?w~i6>5L z*R@*mal-Au=StZUK?lvQz2gy;+w|;4z;i{D7Sl~`e%m@CIkvZIr)^fse)crVWD+PV zZECX@%{zRR_YR_=P)~GA0cS(uyR<^hp&t|0d!(hWx;W|U;*6&1o$sv9D2XX;ZJlOf zoV&5B^rz@a+oDU;0v;;9F3G&F^2*Mon|t3O`8f;i>T5b|Bc{CkRdkTYe%nDd{x4kX z3Z}Vu6iAClDyzU-58BbQZk}d4{V;KNnfmWSWycNbSN|4O+|FE<zaZrKy*FWNC))0D zKG(wDmJ<bDK7D|tWK)uq?kxLOFRLdhxi^)}HywPPx%83#%$?_EEpAGaHgPcsZ@Y8o zR&>2nYrF0(r%h&hY2VE*Pk5W9nKpUz(M!)Nr(Td~d!zF*2Q;+}c8K;{yQ94Z%Y!#K z&S*ESa-P^8YigvuNOkk2KFxC*mD&VAt*KP!KLsIsGdAa>*=`nO;}jGCCEI=MKQ1qG zjjp>kO?TRveV$t!K0I@t*seQkanreN>Gj<U4S6my9c<h3LNw;?8MA9<r=2r85)NF- zaVQiKoRll^?Lgb4V}3URPBz+$DjwvGN$LIOW$2U0k*FA3x^n51;9Kb@?{Dq<qfn;Q z{(i5!U6ex2`NSDwHv=y1s5M)lp~$2J35(ua_R*L8XXMD5ok<d1cOY%^irEb}S(ojo z?^ALyDDJDiaUgJ|n;LiC^8;ICMf1#icXb+wrX@OX|FL=M8e+jxr?*L%O~)`sVRGy7 zWmCWH`hM;2&9l?ROp7zSUhmQSbXh6tLFSoudzA!E4whxQH}3_w?7q6tmdkIxQ=R7l zdzItP8(8=!<}XS*AhK=ZFH5n1IdvQl-M$seHr9hGCO-#t?Y+XwJR9tHMfw+S&)%_G zwMxT#%T?1F<(Jc3!G+A$s`DkO?@sI&_`20%CHt-t{?wOdHY<;>J=@X1@kL?5<WT;M zEJ5&s8SucF4&&T4n<CQ0F4qgVrKaT@R3vM>yR+fD-Qj5ym<4&3ChoYu?(NbWE3X#T z$LsvcEh1{D1lvf-?PSZuwCfu4Gv|is<en^VTJf!SA?wLZ)?jblL$zC#Pu(l^I9>J1 z)i2@hz0mSoZw^#{`SWe>$GTsog--dlDVguL)~{ZBZrA-ZEQQ_o4+jr9UyDtS{*(N) ze`<2IoNCsT31SV!-+HR!4_~%uER`j?kn?)l%o;2p_U_iY3lW0BcG2rM-z@Ex@BSo| z(O&;SL%vNZ>}1!K9s!+RH=mgff@WuuxTbc=KjY-Ozdyexf8qVwLMbD`t3|)(OvqYS z5Eb>DYYX>2C6(wcH>+gX&L?ipY&ra_Ek{;P%rSY!vl}7bmTysAmoB~YL|TS<LI#sA zWB^5V$2qr!9MJ}c16CbYP-FsCP1nCWJZ-K&y8KPn%$(*l=4(gSgjbxfN=dt|T{o{N zH~gFrZ^R;{9o%Lju{T76)eO3o!WSqyd9Uo-A}h2nZ^yOkr)GKo*1x)uMS9H%=W8F9 zAIjaatFbzAu`Q_7*!))2`1;z5?PaZLf?Ih1s!LDu+ql*>|LF1k+rDg4|CZnT&@j<d zuBx@WUQ~8jPRINSl43^EJQ;-(*QR$b40INZC<eEbm_zI$DzvVKZQQ!!o%i+-uX6$t ziz+OFcQ>xzm+|-1#sVdkob$Yy+~ErZnFK!>&RKI{?+rfR-*!7sSU<PQu5h~8Uemf+ z#i{A`juTRfpq`oRt-EHIV{TqL6K58|$A5dP_09TzY0f6wmG7n>zU^mR%e>U;d)oG_ z-Zu|ri_~lkQZ73Mg7(a*Eto8NIpg9@f5rSKD<}C)Pf$O<?CX}KI=xNnd^Yk*HGMY- zPT#%B)n)1Cn8r4TWC3H|gZBRu%i3=)dfWSY&BnI@JkB??lx`n#y><dT%Hy@$zfk$i zOOYIbXZ4A__X3_IhWDQ7$~d`ZOLAB7nhr%4acwJ~n*#PSq58LUW=EdSX@T}o<=!*? zJMePV<);=0(<)EQTD~Lh(wqE?Q)ROC{}zbb+)PTH_V<FowHu2j+RGli{cU%~p6M4} zl#6uPq{Qz0yQa5$&BS1E$LQDH{B5?;N7N2GCDup0%3b+cXiaq0&BJ@wG_yN%7;n$m zwsHRJrKLCHFTF^`HUJ~wvoKHT$!E~;OV!HO*Q)l{eXF^<Y*OB`ozu^BQM@zfX40(w z(58&eRXTyUUj2E!$MeM$=6oJA;ibE(Us>Maj^#3U29;ZRCyq?0U%bhcduHVEMemO6 z5{O_8%xHW7DZGOBhrbH<E4!=QF1>bc`w8>Lxl7o57TSI-7XK6Hvpm3k!S)4wjT)dL z9vnLnhI8xE*4^NJRVL<<(0MP`d&^Z;y8vC#UK26U$qh=DTV?(fFYR3U*7tX09FzC= zeNnr3_1{<5J6nr03KlR~MZTO1o<jxoSQMC&1!w#}$@QPZ@|v!OJ8UV21B;pyXbs~2 zLi>1MmZojsb~Z%)V$ixlksdBY5y+^#Va4RBx@+U3U&<mDf+n$uRctbvWEHda#%<5- z%1lc2U`w<85*pRDWmjMOvv>Jz=s|FeSHULqg|7Y{cS#n$|MEr3((mATT+nn<14oZ5 z$VLBir^X)N#rhN?1|ko*fTq|?CrV#8gY*VLWI_p(Rb+2pNF&72N(xNb_1+HZtGCvE z*;NQ{w_XJGysUy);aif|=rYb-bM4#3*T>+Ci`>)~OuqWULloh&ZJ>$f+wSY7q0UF{ zuYw%Zz|nEwme7ThS-J9i^I~8@noy7FBwD)Yz#spx-9`4!@3<>_761O}eOP~aW9i<r zzs}kA+MY;fWbRrq!{H*!tC*7Bm4&QgtBxN!w&>ob#hV*FC6;+7-+nnI{1VHS85*T4 zA+!1yJV1eeTcUp3=Da(_S+AuooxFc?&b!<@UAfC_3)al7_M3HV>Y8(6x&LGM4;x&q z+pK%;*oTD8iQYf>Dr=1Qv0t0|wEj+*(UdgruR(pUAdwQu#BCpWbKM(d+uhs0C0*BV zUH9+X+&3#Wzuva{*XG&J1+Jy}wclKH)5$is#DBxhf;;m!<Z14?7?vf!{oQQN>%WBl ze!IVZ^*-UVpx8SgB^2@F<SD!Jvexw*mfzAgDE78$^;*3D%bm@ZF+4wS%6z|FFCvxb z+*%yq()~NI-NDcEz)L1GxlL`2tkMy)+uN7z?e2cV3EI2Q_BK#)Lie&nv%r~2(kAN4 zUEL>A9=^>fJ}dge@M-K+?KwIXYbV4<D)~Mry(}|tDrf}=qhN;0h69sD?Vi`J{&UdI z-&R;8|JWIul-QGr(%D;Dl-l&(yz;BRaxp^uP5#B3TY?tPtmO*NPq(+RNoA9N)YWo< z+u3u&{?&S^QG2(@>o7i4lyFi|k<cnFUlyJ+>p|I-oiE-_U3uk=?o=!Ah>?;4lP)NC zeR})zd+W<f*B$roD&P9$+>#@TQ)|PDEEKQCZPXUpG3i(0Y)!AdORLNTW;ZtIKB=#m z+a1PvxJuPDSywFY@YUrzw!0Q5Tv#|a{qUk0Uau98wB_kt6%=Lpoy+CSp;wiks%2X3 zy%f?p;OKDRZfu>uX2Z!#*AGsxI^;X0=*Hx$cW&sn3olS~O0zn$ZU^hpu7vvTb8b_m z&YlT=!RyMSc<I<Fkt9X0XX{E?mNhLtRKLdmW@*}7=cp2nBNM9Eg3A8AtBt14+PgFe zGAzmBvY_=q*8DYI@rE(;JvC=kp4c_%uvrF2cFJ77i9FIQ%QiLTuG#3K@r~Paw*Yse z=-o44e}$;-xpd;E>Rh$OhjjOK`7h)PT)BC<Yw}lx9oLr`v^-e!J#1Of=Iv8n$)$$Z z-vD>A9avtmJgeVyD82MoVXx-x&Dmm($uBHF6yIIG=8^q7&%e>1Kd%4aJmat_`>|~) zJ!S7)r-&|8Y!aT>;j~m`LO^EYa*?FcZ%bxr%RDOGoz@-0?<ZdrzG^3H9mnU*$1ZeT z$W+t1C%rCHd0N8<7P%si6aHrnSPnLt9X(uCZ<i+6!PVlQ$T4x-0wqX^8lZ0Qe{yK8 zy|(4+_=w=$TQlEfWlaHX;RClXUw{@m`t7Ki@v)jg*!Grt{>)o-Zu=c!#nk~O(Ahl> zKcZk~sktN^1+Ab<;tv6px8UMdX@di3al632X=0G`Z$SGA3_<I>Z!lkd3oWf0ICMZ= zRPL7bphdo*;?sd8tf#>*O#7QdsWl|CDk(5=t1Os&mFZzNV%lF+dBNnXUA6&t`#|Go zAk*-;sUDl7!2TrOP2fW9g*x};=bM9H2j{d4%(=Nxv{5fx<80L3zdH^^3e7ox>u;vt zhXfAw?n{fh*Y<Bcys@b2!iS~RCadaQ!9}rxz>NPVPniY$mso$k?eF?m8)TgdJ_$%M zeON1G!e1+vbCIucWypqh(@&8OvyC%&e1G&;Z*%*&{_D*b@9gHy%x{}HZ(6GL(~{VY zPu_3II30Tey!|-aJE2K^_0$@%e`iB~#d+sj{$0i`>QZUTqigVWH+!Af!T49a_1j8r zA3R{W=H{{64d0$zn4~*PJ^K5jj_YsIEb5mvo)x`2@AA7ZPqqG?3Q1iJJxRcW)8|#n zQ~CEV+iR9v&G!AQ`#HpWt}V0aw7ipr#RWx%S63`KRP1!Oea9^JwgrbL<j#{>m!pw+ zuEc*wRa(Y*v9ry*8{}PuW%{hT43-4f%gnp=pnT%Gd9h4p^PXx*?3j_Y#W`hrqsa}0 z37q^|px%*^0@GfwmF0qV&nqqb?@GV)GdE(1KHdJX%gU@-Pb|lIZuh;onND^svwzNN zi(s9pvxBc!<NQI<-W3a$hH&aid=k<)=kqu;s91Hm(bQ)xp%o`AZ&n$!C~o)Y2F?F~ zYjG}h?cWEU-{zeEKapek^`EbT-=ybmPCW6?gq_>hYsvNouN|ycewz7Sf32wUW!c-j z2ini4n>^pp{(7a}+CyJ2JPl6d{INGL{GHZJXYn?Hg%jJ?RIXiMt2JZd{I0Ic%io-e z6}7(&8qs%gU}+PG_;FI}?-u^421m};Z@aR2UI35tlYZ?Q(cOHVXY;0Z@8P<h8_1(r zqb}jJ!Ls6#rum1hQx2D&)4Y1~@Xx7MIf|EGXBw{E(lXsfvA2DVbM*|a&1P%<EZJ-D zdrEAeVc^HjzL2b!z|r{BD)M9aVZYakA(!LsuZ_LD@|f4@zfmFArs@9LHKU0`(I%z7 zfBW+AZyWTUPO*9OJ@kxZ*TU<$2Is$|-`;s**5Siuhq?-?tk*4!d*3uOSL|qM4u8|x zWzw(bXhIf%8B72r{ePMA>*~Z8W*pvf?)&MwD|=7$CU)`Wc)!k=)3o7jqV%57YiTF= zy!XC&ek`QAwRpo!g-dZ}ODx~`e`mJOQL7i|P}0(QP!esB4vNEBGv&h`I(#YG_cF-V zn$=i+x!;YNwFW8n%b=yCo1(%0$yYUQhn+aY`6IlnD)z@QwM~q6mo{vB+xpPOY)vjG zyEkz3fVPJP8fdw&1TodTIg+!jBNEh76%=SpRR`_Rv3Gn6U6ozW;*wwmDtaH;b0yl! zswJu~^?fv*|DgS;4O=p#<Ul$3;tbO%X=~rr#XQvEJeU6VpNV>fLCa*<%!|{kilWYF zzhQh>&~JTKefE6aTgSX+^Hg680A*=44+r(tGx?W(QjDKDOETJgi#oeH|3bx_!0Tna zv)b*tWf#dZ1+Pq~=g)q!xxp;`g2b#3^51iMAH~1k?2)nY=!>(3?~mo&V(KnaURu4< zr+3rC3H^#JVV>GEK+~TBjh&!5&J)a8|NoRPkCmS8J=vKxFpl3jS{0tNx4qe0kndT{ zm(P4_@=n?8)<wM9X(d~$ow(Z)W3PmJzWHL?_QxQle$rIUZJwZ2TnAXdnM{89%l52o zeTxEpqc^SCtb6CQ)W(Gpugto)-kJGpC+oAW6)F|t(uWq!XyVX)({9H9JM#K+n>p+6 zL|>Zoa$dpL0~hA$&SGD^S>9Fn=7#|NpO>w|1s)yUz!*1u_oh-2XEk%Sxw#(~Sw||H zi8$X)+t_7YA8gN~li)0#7T9=v`5}WJhEu@f7f+SIn_kXr%XrK)n|pWIgTrTfMSC^! z*8I46Ov*C3Q{dg<0^Z+G6mNkBEKOwFGQO|;B31Tib&G(U(uKJahaQX0fBN)BXI0db zQvz?j3!I`J-duO<(uGHd*6mmyasXr&3&gB?%asYzCN5>V^S5TtS_a-{r=tm4`^TeD z&(W-ISFLzyWsv@yg9o^$npE91FlL`^(%2&CdV}Y^x{mA|38x?H3`!1$=Sa)N@ojdT zawg{aoS?b3>nays2%VXf9)5P?1(_sQxlMe*3-8X2+%M|AmxGh-oMz^iO^IoJvz@sY zHPwS`kI<HFGvNg_?h`!0k-+nF@eQrS6LYkKbG(yxZd@|)0Gsxw4NER^KlIzZ=#uk? zqKxNC>kpM0Cv!aH#9m0uv2;;3=$PiSWy4L-a)a8g+;x`AU6mWpCI-$+>b<w?fmlYz zhA^u&_3hbVpyWEO^+1VV*i!!oL3cSmhj15sfBZ^U=8#n5!V`zZ&aR#zzcJSJaa3gV zwiD9EcdrKDs=qGt?ff0Ly9c73bX=BhKYI9~%+*V`A3Z#?AuRL7#vQxXZV_|3k>Dz~ zEhFyepAKEusYcE7i^1hz!b;9F|5H+T{5d?$zG!Y@{qm}lcRpDhy3}##-le|<-rf6C zrRUmg)A;i;ZBuaAleN3rs}mC@Ud`-VzBK$?`rC7m%-8y!xBE~J7x(P1ib6RjbXOdf z{Il@fLpjkuaW3J@|4g#fnI&7Lzf2(XCja&=KLp=3MH{p#wI}n3wX|{gxp;!ghy$O5 zB2JvlQmo(c!+6eDC$r5=-ByRc>|)w(wldm-v-s%tS5sT_tCem?Sg_}U&L%j^x#s-I zQ*tH0rfzxWAHRM76&AIxb@Q&IP5ZSm>$8#q(`mniwV+dxHf(|H=mV`k>=d5y|76$y zn_^XVQ#Q=${JG{vwdnmU@9KiI_L}{X%wk-d!@k#p#(P=RH<Z=S61I^zbaK&_7bdTj z-^oNQt6Y9-D!2i|0P0Dmdbh9VluoiQ7D)VRx#mW4=Qm$AaCxG>?yVH4iE!J^nq^tg zLAh%u(iwBlEig2BX#eh})Y1Ld(id0vJ!V*V|J34^FVRu4O5hgQTn?XyDOWQOAFe;k z{d3YM*SEKJ{4bfjut{Tm`@*%8e%)oZ?|z{Fl`Z;P+>Y%_EZes;zCC%TZ>!VAHc{hU zVj73qe!oqbGNI0UHF!~?%K~9gGu-Qb&!5mov$V_lW1eVcNH7UV1hijf=}P2W_x(b| zqNV0{70n*M&2iYoxoxBR+T!qxl;TXw_4VoN_vCqg7D`lKDz^Ik9iH!>?p1JJX`b0G zT5r|r=9Ac2ayZ6O`HzP|<D$+hCpTY$IDfJdsAIFwoq^@Pg20TTgQXe5X5ERd%N0e7 zH7_`eRXpuY{2zBjwDgT|tj>)#EAhR1jaq9s%s-p*ZsanGERdB7oY$-^73k=_vR)|4 zpyk1_32gnHmqJ!lOG#Z;^q;z={G}EX$fgZCpdL+;%RgJzn16qRw9@w1-kCFZQ^dMt z*ZhYIZ#P-;Y&^-@RpPy32ZwXc){Syb5`n7(&oOaFZd_8?WgFwaHS~k<t^jkvWi=<R zU&+~gQ_0<Nx8&gsO4n_TLuyWh>&VWjU*Qc(jtv|-f}k*D(yn>D;9R_UWUi}m`f{hc z#y4l0?%=)tz<uxJ4+6W(UU5Bp<G16)>VmsP1}z^7coc8Q*u0z~{UhqsL#yXgUcGtv z$4l1iTnaC9%lTWTAvGuVUdTIkVUFtDHkQrOho)XWG^GvXD+Q*@>ISWor`Cr`YS-5+ zcPQAnWbfXkN9EbAy=P9{)n2mq*P?w_*X@1xJa_sQ%gw<zlRDnM(!A?>UFO^LZ~bep z@$OMQ;?xo+H_hheF43La7v*Z5X-hP-uP{^k0&aFHZLk4VsGssD7nmme(G_kpDBgQ? z{#S*wE%qz61g-!5X3qK>YuCP(e&(BGY*WvgzEYe`Eb{HfImz4J@aH#doqc)EgM$Ko zVq!_oYq*WIbRO_<zT@0$({g{#3g;znKcw5*oZfq|XX~Y1@JJE?SvQMWtk(Q2uaUg; zHL>5f?){Ltmlg$HDLk$3z^l1ye(bJ$Dc5ecr-bE8UGy&ZWxU`juTQ8xV(;XueUE~6 zfU_ESU?&8W-;Vz8vH#E?XtAoO|Fp$bKQ)WZ&e}{)*8*m3-SxY$b+d}a{H?#C4qfW{ zJox=a;XCJQ%2tFz`YB?5puMoWvuhsDkl<hpWG+^_dao|{;7R8UjtSenF4%mDWN?IJ z*Lw8)$~Ut&@@nCZm8-s=`MoFa@*1$a4x9q_4=$Ges#<kf&T!Sf3lk#mFNu|QzBHQ) z+@jB&dgZ;`k4TpKmF71#eLu8U^{nL{-VFa|Wotyc%+}0E_fy;!+roQA+Ir^ez*(Rr zp^SnNTuhU#BI|!%5BQZDvda45x__-U;&+@*zj`SfDJ~w|>!rn{YTlBqy5H{U!<wUP zuX;DM&RsBX+ixvZ=MTFjUE@@(Taz*#?#jN$5bpKW#8DJHe$^<d2Cldbw`SOgm_<)) zU-K}&Ofc_M`$H*<4+3x1HkInl;&a~eJEV%&`eUdQ2Y<cb3qPKRAG^+fDthCxH-6%7 zuU%V?_}EK<R)x4Yuv}{dMc$j0AE)2#vOV(UT0o&-+m64-syIHDec84_cjnG>mP@Uw zV{VJuFXS#2ei;(QX=XOXWLiSA_+_p$(9Xkaw**!Huzv#TUu&Pw-uQZgdBnFqa2^sn zDxg#!@W?9r9q%pSLsP50XBFQ#{B=R))C-4#*EK8h1oKOKNv+<%=qe05uhD@eY#zu# zKe+q8Cdn^-e`MX>?FYXHT@sr&_mo(zI;2UBtwp_ie)Ns|p~`clEp0M>!2H&Az{#&Z z?B89HeG7ShPq11(wP@O}lec^m|Gzw&wp=3fF2nNMmueJT{XCcKedAMnBj1nbVah`` z7I4LPR6udX42OwxdrRMc-4evNUKP?J-=GHCVHhR6ZFTMJnmGx3Z<VjzEez?-Hd-;x zUGu62zPMgVf$1$vN&Tj*bXE9qh7BB7IA5fMK3^OOj!m$}4D|(*L#?$fLCq8J;#-#m zeh%uZt>nQ&T;Lqj;b6@;cg?NHli)2ikRqm($tv>d&kS(m0+K0if!1lB^YTL&y+Zgx z{mE75+&4qCfXE9Vv&+JYK*MKHvq8&lO6{Pj7Th{4W3r0ex_J`pm`4}T=t;?@Ri7_H zatm1B7SI~5xl_R_V8B(L5_nkS>bfWF)=wlwR9~?$tj)WeQ_saEDqif?a`pM1b<-dr zbt91Jvwh^vw;#kMv-e-#vS~5PGRZuFTjtvwlIDK9S?6y3Bqd-??oNX{3wc{^wCYHG zTL9TLdSC}j$tJ1k&owe*_ZRH`<$iNXt4`M4d%vIaZjQUMx5f6$K7CV&w|v?U1kG9V zhg;*XRK3*dd9^Ye+iz|#S?04qT<%Ppro^6eX7ik6nJiTq(`OydUMO3)dWmj~qqmj- z6C=NtT7V9x8N0pz!nxh+HV13W;?T8gjhpvWbM<2LE45l8&63VKPyPiw*N|xX&{E}> zaS_}ZaY+aSRb+?0yYBe@f%lN}wL3?@uA5cd<Tj<Ad-p8HqYDlTm~|vPSXlig%XQuF zf@h|?UA9Rainf`0b*HSE-ljH1@V4x28hMUJ;^|rD2iOD;d6#Ze<gzXdeD$;{<KP6_ zHHij+t2Vnsd!BY6+qCW`{FwDYG5+ES*UO;eQWDbY3z9m-R_|y#AoBbGvvl_Y!!IrM zIqNH<>Nf4YxoGLsSBa}$@A?q_>0x5vr}JxOA1n%*4ca>Q;p#<>{o5DJd&`^Fr?qu) z>)DmxysDo5ZHZI~w^`^4njaDrXq>CIK}UV{6z2Nb8`_LT4hwAS0_|XsI~06D;925a zzKxR;ocF5S;O7+-)4D2nj!k5<((5NmuXCE}MQ>jAoIUfl_1B{08xh`qOId?;E#EjM z3#js6k8CdkH_9DYp7|u~^b7mLYcy>g!*kVy$4c489|WY7BrYZHV)>qACYsaS<{|z` zGsbqqBmZz7-KBBs&hr>D|4z>`E;#LDKf8IG;{OVfb#|erwnxr$;uDWHS)cT;(K2H? z^!$ez#*IJculW<*wm-Yzw9Qerb%%49N;BrW-gUVq|LRSnUh9m7CPz!-nqKSv+{5xm z_2I*tVr#l@3N*#7Kb)^*;qAO-1LM(YGUlJz1g4%%+;3UQQGea4J>jcBQ=&m~pzxj3 zbs6RhRIeEF1b&$QD&tEHXrH!=1B)1F^t^sG>%BLA`fu+ySnoY`pyr;+>&A`Rm(Te` ztUts1$_<in%RsB`lOKM~f4KCAUfiO!eP2tgo_6@F#~6VsQRw>THt?b(NLz*nv=2_8 z>J_A-0cBZ6@FdX$$gng>0KBzB%E`ZeFDTbTGALxG9@@kM2^+LD_=P#YSQ!rLp+MX+ z1GG}m8IsJvr4eW|MHYwcS4hqR*^gMn2jYR|Jp@1t;1({ALzF!5^~3P-M+wl7f#R1d z;Kf8B%c0Aj6(I#H*oDrZmcdr-pOTyYZ@K<B@I2qz2=ggvYvs1_KhNUWx4W+V2<N)r zPjyyl-`yWtVf@m!klWh*`pZi<RkeN}6frkDR&-jXq-^!g(uXD!O$#QTy^!N!TAwrb z(`A|U6;YXGR;72omTX%xH$=|s*S@BkEf>zt1P!m0HUE)IusyZ6-9gUDIl(xL6Eu48 zcA+d&u($4yvWWEjQ#_z{*!0qq_FJvq&)oXnc<q(f$#-Kj?@l;xb}fzDInQVLnnP`^ zFG|8+n*IC#ZQru%+g9(ow4bGuZIZP|{ksdEIv1a@U(l4ACUkUSeZ$it<Esmvx_PZ) zQgnIZbip8E$BTwHEVEgdrc~aralZM0;o!#Jx9&fgZ!Zi9HOYF!+5FJ*c~te=TDx!e zp7$(Xel{Yx&+^)x<oVV2tG>s@M;x}$p36CF!<kqe4vX&7x=lU4PMy=$9zWHpD7X@u z7F}L{IdmSM96LjMz$CSdk9V|dzOd+hO-apHKhO1EyJ6CIt#!*1Z6DX2JiER4sr4)W zt2^EAY|2a!`tm@rY?<=oX}%8)jPIAGpSy51P*0<G_U28krx_!1nl|V}`}v-mo9H5M zk~s5y2dl2kt_U%&$EO$1=*bV)+HT-%d1Kd;sEs<e%j+Yr@8XO<@b0!{<VR_R<n%XI zGcBj+eOp?}xPy5b-yzc%ihO$=pI!BhEsUQW+*-}^>(cV8hinY28@|K_7#;ZCWG<wu zdh=tWT*Gz^!*8Ez7dAFCPGGq6G{yV=qeM}MGBZbojVv5e&zkM0ISNnHD;5g>BE^u& zU^BVzw9ttMhr`y?YZiXcH*K7ARp>|}XZrI(-Jg@Th<#x5s=x6}Yx;x3DH#uizT6NG z)tf5e#VlYEspoAwh4BD;tU!a|1kdCPudnWtyP6aF>-<&zbIo^+KgdSc?4Py!$Q+YK zQU9=qb5G{?2;S*p-Nxf{X5Jo_`~^>Dn#fGc_<pHw{pq|VZ;FJ%Q<&-vr#qB2rShJ> z!M=M#!^Y0alfN1grN5O%dZwjM>wRFrtiN;bljZ}{WiNTXVU~&Nd2bvu_lTMXFZ0b$ z2Pde0(7V4#WQxlBP_7v|M<=I<v9wL^seNsC_^M|P)8`b)cYP<t+AJFS<Ww6B7(O4I zHeDx~$5&xvNkX`WtV4o#!t{@q>Lsr|DNAo+Q*(U3=k}&HLmp;_d~ciS{Qsil%t4+g zQ~r}SqdVI2z;VZjMcEVh)$aA(E8sS`ul!*4EYteDGd<E)`Qgz{%m-4~7mL))(6`-u zFX~iy2EWw0BFzu`o@gI&<lM(<RrO=>^rOlWy=)Qub`$o@Y4w%a_Mt4M_V_gQ`e!d0 z-n~8X$*sNP^RhDrdf!tSlY2xw;?5mXGdq9hQBSxxqnak;Eyjpxo(2qS^fzknol^KM zF)fI{k@0rZ^uEHQITsonm5;CmuyW3v?j>K6dg1!^Rl0V+yDgKLUe8<e#_hu$#u;xO zgmK(FKI6e*?`zwCOl$kvX8z;TN!!MM6?3cWw;bE&zhC?}+sw~CeF;3ww;kn;^S_p@ zaa#HKz~S-~1D>i6su`Vgw`=c;uxvW*Hi6HrM$J^s!2ATmj5i7Mm(-`8Pu4u_u{8I_ z^yxi&%?<XXoRK!%FA=SL|8$J}ymrIi2JdgI-e+nYc{8zsJAolPWzO_>XJ!dWpWM5q zkUi#fkZ1j~wTVm@GFzSr%rE@EVeYhcm4ch<+TLyV!w)bx9yq;omh-$rFRT9Qy|LPK z^oeeHjn&>8vrJVbS@s>-nxpCYjnOP2N$27W$N0;u*yc@Fw&)j>F#9MZ!SML`qXbd2 zqe9yliob7i%bWT7@#Ko>(T0-^jn|~#GmL-!Yw>mI&6b~cX4Ug>OB}W=*_b9~W|(ij zTKsUu^yt=uH*BW3eLEy3IpwXY<hRt-)8zIrUjBSZQmxtkh~wcJjh)U4&2qCCer*cd zdX&9bw}1A5pZ;P07QB6Be(3yM?+1)N=XXqXzA(jG`C=T`p|~}LJ=!&T%n$bQoY||K zpJ}<J!sTsKQLtX`j{}n%>#aA3rmqh=7QH#4<@w%-^M6#%&0eHBeMVtq_Wd<2y3CVr zPCD8XsO9;i;OfTMi?26{@z31O;{Tp$=Gq-0UA_mR+1q21oZq)HH<UWEu``^Ad2I8A zaffKO#NkyciAO_^m$|M#9c7bpPsnDk_JpTG{|>T0Vu(1e`@r|T1cUdsS1%OnAG^Ka zb$Gy_`pj|DK9y$9*Ec78T+n}dll|u$?V3d_=ju0EUF<#a?U2v|f7TxTH)f^QUJjgJ zgm<jsuit;O=B@jZSJyz3`q}<2pA{JYePIf6;M8b*?ddR|W!>}0_)BwNrIdR52Y+A0 zGNnN%fXT~&bIt4qzp&TO*59297N`fQ_Xcgy^RAk;OI&pURAIth(0T&%`nT(#0uG!p zK}@UXtoh>HIsJ>+rM()AFtr{J{-|r)hy7&eF`NW8(}5E#SvKoHl)859&8+4561{8T z#*_#}fbO^OR0Zp=hq&sENn@#h*sr_?e)r9!q9OXHGze)3Tl_zH>ez+tOsCTogW$q9 zszEOKCO7L@ILJ$2+om|oZ14+9)lq`@3+#pspbc|kEz88fRzYl<!nvksQ`Cpzunf)j zPER)03pt!)n^w80`EjaUcInff<gT?RdH*`T5$@Z>>HrIMUm^?M@L}OkdPH?xl@E z2UNNnBPST9Z2q&k-}v3NRe9~lWAoFO6iwRuB$7}6Q;=}P)0EW2bH552Bpw9GAK&%; z=tm>H<wlMtrBCkdiT<_rqm6O$d}HI<e-Y)^Z<+tt+_SO%<e^E@#U~}i)--(%spPq4 zaLy~eNlm9%oSW&~qoQtw<jDb#mY%HG$t5RKI`!s;mwIhSwlIZHI<U_#Ec{bIU&ZWy zndwh9m;7J})w`+AQIV!+n09tr;f$NplrOifn>elT><&xq=pA>aA64Txz3J(dCwC;> zzBmd```H(9;n2eF)P?mX`)s;S{wP~o#BDsKxif@G+CRZsUHiYrv8lz`wGGZW4POs= zFbFngHin&8r(YYTdxm*4^NEB!oBr@^Q&NtzS25gMbYxwNx=DcngHXfn3*BNTcp7wS zBTm{i^50J6Z0NO8Yo4c5Tptsy`XPX6is}Tm1tkZT+Ra;iJgzo6q`AI6f^BB_+o(^f zCzFJy{M&FgRB!7a-{5HuN%1=hR~`vSD}E9C_;e8eQwxh}=YRACX*C{X*;cmc)5d7| zwquX?ZDLbxWaTWF_xNq<^vOF8@h0gtn%v|_ll+|^E@oh6s2?eBkW(p_;bmmKIfv!2 zJ#*f3tqO+qzcx8Xb=EdGcYmyHt6x3&2Fub!g=jm8O)U4GMo(#)^klCW<K(3klg>09 z_%LZ>{@wH)R-L{H^K=g1HN1I9fc?V7#Vi7B33fM<Ud}3THI*>ZU&9jSlki(zn|t{m zhLlMkyAt13y*?`W?AVzKqjR^X&e!aAH>hgn|Gd=y+V7B`Qn#8LR>yGd(f`R+7|@ho z-`FSj??viI4!6aO*P8iN^wSfC+jaNIhTq@#w6oHxq1t-Wo{Nf)_GlXSoUV;LAfe1U zY5L|3oo9`=TRgrR)ZppWP{uGVRfvb-wRpn!$O|jPR10>olx(t!-4<OS_y3Eio#Rw* z<<qmZjz&tR=p_`fM2nx^z&%;jY|~Y4VfH(6UiGr=7euE$wu`jfx$^!j^H2MfC2nt& zcw*$gjmaz_Z%;|vNxpBMzrtsHPfeVD_-JB$oYA*lro-OHY(zhIZ#4bXd;aUgN{P+< zpZoT{iZ-4+wR`42hVI;}D_HnE9n@DlU%FkF|L@GTnKSL(4Yy76l)q;D?5)>4&trQs zPi{6o;<rieM!mxXR(73>Ol^*<r7Gh367DTJlJkhkfZ^ErqX$>rnU(wemvjCD0r`2C z*UmUOL-LyO`x)!)bYIVXSsuAnHF=*&B4hHruD_AS+_QfO$jjYZJL6=<ySR579-LCt z$q4TjvTy|z6n~NxYg|4UC8tejo}9`l)fmYsBee4CtvKCwvHSIz2cO(~eOgey!stQS z@u#In<fXo`WGZ~#6CPHywR!Kvvx?_b({?O9dUzG<nu}g{&Pgnt)S@0Pds}p`UiQZc zmEIq|=uNoU<-PO<%bwDL6RKuk;w%^<#8V0w8qS!WbCz$2-q>ci#!DzHrZgw~%dRy? zouBC*yu6z!QtzRBje;D@n|k3g`H~4foO3i9L;b?kcZuJO3u5}Sa?(fDyNlnsLP|V6 zea5+K^xn^mJ0tsXzo-7QWhKg9;PS2DCg+Qk(wpbQ%a_B8*Ez<GpXaanVQt-GUA}gG zY{?<Zyq6zV+)VuNQ|`MMU&-mu(ue2$T(+Zis{8TE*G1j+=WH|zA1~0|K8JDo;%UE~ zG8c##oJ>j(OX0bx^Z(7`p50ql-F{ej{kCMM`b_J4F}CkZgYHP4@t(Y!|CCy-ibWFB zZi~pDe_#DAKJq*+s_;-x^rK1Uld2`Re~ErvnRd)BJ?+<@jqlcN&Hs=tnLN2w)%@8c zL!AiL=PN%+tVx_R^&CsRZ^Sb_F_t+;pNcsiQ(Jh%d-BI3Q5%a_TAOb!D?UDZwf*hd zsm)VUvX?|Yn%4P4S#81OtAdB`ESOq<<YsBnwhtR4LB-yU`QAN|n^R@dwmm(uWnuP` z)EMKubEm}gzNc>FJhUmt($uoNO|bStOX@ylu`LBJk|H&F_4|{I_QkHeQ-6r(X@cK5 z+5C0;Hh(SjuH10O=iQD4sh5JAj&kO_N_qOe_nNiJhloYlg&g8{Eadn;>0H);mVzGl zxmB6>SXU@t44Nb>|AMiiTPRuozPOZy1Ow-RSifywbmhVrQ__W5guELTB-;H*mNZFx zX{280x}I?Y+X3U3J9HX(?CNul&Jtq(A0&JtQrA&tT0xoI^-21k*^K!MzO?7AE8?{C zX%o|P?5_=c8q~SagrRZr(@j^LE%`REI_#gGDrx-K?hFI-7L%n1JT7ndQl0<)XsY9x zO@5uJhtfR~)=mzsoBUySlcCcI72}?ZN(S=|Y+^XAr(SrJN1&K<$w@bZ(>K`b5v~5y zpB;iH-JF@KEb&jWz&iXObH!DvH2cN8ueYoYcVvtH!q)JX!Abe^+92=4Hp$-#@2&G; ztDiId7>m)5-3l2FTx%wQ8Vvg*>)Id0vI{UJ7OuA4l3_W|p|5;{xp~^LwR5(w)?LV$ zu&Fta%kIqdd6D_LPqnwO^M>yfsfhn1`e*^meI{AkKNn9w66|qfUc)XAZpHIOS6Hvx zmwa0Ia|y%uvXsij&POVP(<G+<-qc{|#-&mZDsX3~=M^4Xy_8|{6o$79I;T}67_OZ^ z^zMOfPqf;Niwq_{Y{GF&#s<Q1QhM!$z2V2d&JbYOo4_<fgk|rv<=zR|>Z{MqeYTy~ zxW`)Udf2CkH&&I86%Q2M{G@rb^0-1V<7DL<yCT|RXXtF4xHfKv#e;7FuPj>DZIJnX z^3+M+`oGuqO#Ci;@J8QJh3S=>L^m)NKVE9=Q?|kX(*8qx^tpG-=<)sjG-+eLh(w&x zvz0UAd)7|OuUW@`{_u?28Rc(6@6VdKCg#A0Ydz6n7Z_$tD$IByWWb!qetwB`5off) z$sLz3>8A?6Q7!n#vaNEH)_s+kDQzErCf|9}C)XY8uJ(kdUNZXq68_hcpZBSrS4qCN z<;hLSB=t!C9EB52%+oR$4=)Jiwb6Gs$PY|1D`bSU>qGO-ZY%z~(7d37|NP6aGbv|y zUe7E)6Fz_1*K=QXuemkJFn-pC21Ea&|JKZG^{wgP=YJn|CdH;)zkEh%?%lf6ORh{; zk=b)fN;{GBK+1vo%1j@Ho5xo>3QUWfFZqLG&7=cmeqj}#pO|+V*L+<w!*GvRgZMU0 zcdPH${s?Z7iQ4n_lIBkyy@WG7&sz9xBnzygj2b!{1D;Mw{`Ms6*-b6&owp8F26q&9 zN>1PU?X1@gBZHZ`k!L`qHb2%<yPlk4o6(@K@P@5*$rlaD6TQb+igg$(+60YWd=}Fw z;PL&y&Oh^jn2^Q)ldn3;=iX0tH<^BQ7w3n=se9gq+=}JYXk6{(Fu!Kqt3vtLY2T~s zH+?eSbMM>nD)pQT?)??b{I1HHjoBU`6%RG%zmxl3y~!$8ttbr9&ONY+<(h5e+;`f3 zo99ITx5@k{R{Ao2(&>5KyI@UxjYeCw4UbN~TJn4X>$A1fCh2=tGjI7}yU*NYGo%fy z!Ki9r-ni8-Y`I;1qt1u?ty5||tA5PAbZ5EpUbu=4>si7qBe$NDJJ+t|!EH7rDsX$s z2BQhpzhl?rYc8BA;-CrZD}cKOpaGQ3mW@k$moo2``@xZL!cO(%?#(;;qr?8{g~Hq9 zjeFHMES@}7eg&W9mJ0oK4{z3QofBP?@%(9%Se`h-lV!6GXsK(T)|ziSBQd5+e975) zJ&B={xXbc?CMd)E9bONDgd<+3q*k^GbLdN^Ki!mma9+>Dut~+``7;y5k(4zFM|@04 zUD;OLq3?bo)t}{GV)h4ycm1jk_3_i|znZSnf~ysub6}VHYHq%;?aSa5YD^-NRb=c# z=j*!KaCPdS4wEpeb~L<W@qi1|RpGMVT(WDv*CXAq`ehPnH9}h?B;H$fefqHW=E0AF zY}T_q=iQgMXM0~{`-V?1Eb?RXF3zlHSIv{z@^qT<gQ6=%@fy5SnA9S9&NTHX&VD+- zc242;uu^NAcU9KPQz!GBv((VuZlQS-rTTqtA9?dbg*t=G$G(KppyD@1Ow)Wft;tTA zH?6HaCFYfHz$dpN{m0YlvTe?vx$*pr&wTr9cej4y{il<hvuVSVV=?tcZLF&w*o4Y8 zoAzwJG;;yx={rZ88aD5^qjchi%9M&sqqucV?C!CtX7@@8&N)h2&u5<ws*dMDtK$vt zPM*qpQj*_!+4B6^`kN}JcOA;fOS*pGdFqXIF`N7aHYiS)*qnCS;!MuziJ8vVJx=dP zyEA91Zp^#WNy06uH;c0Bi{9}l|60I#y2f26<Kcy)n*yZb<&LJ*><-%5DtYQ4lcmM; z1v)e4C(dL)eddV-ca)l~YQ&ra%lyLr-Q##K5NEV4TJLLzQb%;vi3egb3I+307q%Q@ zP+;Z=JJv21JuT@&s`u#>7nyC`VR5{6YsH>5%H9y&-k=-sDeKuz)+DvPto5qj5-%D4 ziEc>MU47?t?A*#VPfo2lKktq3s)e%N3^`W}CBLN1{QdZrR%5%+0-Z(^hNaAUUq8m! zetUI$k<_2VMkn@UfhugV*^v5r<<tCGn^=T?AL{j1Z8Mtf{9Y=4T9w9e#@`>V>9*TA z*Ut+&zhvv@ONPb*5}a>lCv~o?KakAHuyl7LdjaD#CT+D1b0>@L*XBFOG1<50iR$C9 zPSc*q_j_VDW^zWbX)~BTDHF3e&y)Nvs%N_7v{=7KT@w|a33*KJO_;Wkzbuh4S@`p$ zuZ)MMJ#Sp5vf22wo53IB2W9J;*gve&w_Y;!2D`-;iTmK*On?;Irl-w{-Vb8y_ql3n zc-~trVi4J-eo}{nM_=;ywc0jNujtuHqdT&bb$JRIWNp0|5*eN~>rPw8d7ahn&Y|Di z3|>oa-gor7Y1q?a4WBQ~aA2z!XW{i|3>CU@>*T5X#(&Pee7wfJ=T3%-zT|eVH!-hz zdG_A0V#s4JJ8<1^`t%Fg-p3Xe-YnXfSf6)>=X`$Xy!l6!CH5X{|9MIMb?vGe-nWhi zLiJehO|NOS&^Wl=!JWVU%ccsJ#TOY~A7lr2fDVh@>s$T)#-}4TvIq9cM&5fNP<U^O z<guswbP{?dGMzjfdE>~lnbC7TW@#Q!QFX9pIBmqq*6{W5joY#3cRX&8<#jlg^5LPX z0du|a!=(?4<gQng#`JSCUf@=1@N~S8UAYU?%RE(n>ismabFs%ZSm?NWIUbHK@zP;V zvo&ByVN78(?r~Puk4+0#^OoT`oqBq?$n)5yGps&+39pkR%Mv#oaobjv_^9Ew^UB8p zyABoIQP);C2VH1*ubd^>TC6$d*~zd2Y-f6>*Pk=EdC<=DKiB7dI&X@0SiCvyeQaM~ zLdD4$%aiI1x4G^6xYN#tKlxkYy^Z0u*=d`K^bY?vdiTSDEg|XH!s*@zcy`FzOwK!@ znsZR)v7h(;DZU$~ANVO8@jc~eew)}fpFKyICd`Y_n5vR3v3*U%VT%{F>;Fx?-N+c# zrc+R#CQ)8iUp_O|T58IT$s0M<Y9r1|JTpjCo3K!D_Ow3>_^WtZ-cr96AhCbjyS<MC zwoOs-*>g&&9?}fJYz2Tu^yCgqeJ{0y@fmORN|oZy+8w8Cq7CyURG<A;StWVki1)sf zGd|CDa%ro5?rS&Lb2LW&_10<AoV(v|Nnm*Y^=SvFd9eHOC#y&Nywy!66Dsd%gBl0- zPCOHME@XV?(xb$yOxH5%RrAt&f;<mRUfuV$D{lJMiW7TOE2_j#<Q!cZl*4q-%HoNT zbd|mg!y0ZQ3kHX0QqLFiA6Of4SRzc7Q+u7&Htnj|YmXE^PkZn(wozyL2Yx#Nex@HY z?B2|ijgSGi4jj*%-jMk+c+x&@uQxAM#Tpv#F?cYaGgjVH#q``ha&2Ax>B@$^dyKyu zrTbMd9yUK+(Ks~<T#ug?x}ZKkb!Tklbic5Fjhp}S&)<8d@(BM5?LAMGm#J&3E?^N; zU*K=oy*PNW>VnBr@3DD-yM*96*&+-y_U!k4>Y~VVYwPE2so>uKMgL^7t>#b2P#I{H z?zVrz(aBdm>(484pNZC0ji2;wNA#a>_c><;KsudM8iXutAZ-L#6XDn67gPA^<BGuJ zh+vbp%{ic@zWUnD!#@L9GY#8<v~Nt~31chD-{1XJSJh-PlLjl;FCeEidV7Hemh5^B zwr$y1l5m|_o{{I~a+UhZa<T7)r&rxyx(d<q_|8&Rvgs4^RmFC(_eV`_c26tr=6|~< z=E9-3hd@SwtKkEF;K8=Yr<>W0d%Qn3ZMiwwaE({d!FRgyIV#{#06Q}#iz$2V8lCe6 zOb=BbuZj7lb7QjM9j~Hy?{tOVC@o-_QV$9XF9*(;0w(QwYjmy_@O^yBvGYym0s9<Y zxdVSUvb=czdec6)P((%F1j=2d2M@lwhVYxVkAwPZ?V1<6QW5H0Kz;K?38|}*TN2Oh zBR}#h8`@R<P&c*zwME*n{>ufv&OTYbkCECFZ1x-4`0UfnOMH5<@ZPRFi;Vfb?pS1; z)=fX~bj8zs0a6;QKAR+Fuu3|cowomN@i=eotFnqaU(4Jssdy#mgLYj^S1)a|{8?=G zxF}nA%ASdLPVZQHU+TQE@i$B3%g_5u%h%R6+n<)0t)sKkaC%STK`jgasrAPbcptAR zQOh`FRK8K+fsWpG4kI&8)wo$b(^o$@7#Kd&ceYleu6n^i_0_t^>$cteQ~dZu`pXZI zTR^q@2id|-!|ZK6htF)2nQ2ziyQL@l*xAUNho0`!F>{QVrn_A2`8k6{{IfQkDL>LA z#uux@z4YVLK%ZmVwWmhUSSaJOMCe9+1=DP+$e-**KML3~J-2xsD?XPY`7l!E%bT6S zJ-cVmxj$7m^5x~MM7bHV4!_DYBp)yyknWr|>CF!Z{sYldB&vVzyKvwjg9pRAqD@Ql zKW^Ysu%4|jA%cm8_wzyd(+fDgr(1SvSMfHOFwFBjp30f>AyNC<6pJ6zXE~h9;(WBB zWpn-K9n)$&qqr-Wm)hqPPxbzgXtbq(v+7N^)^snPrHmYNbfzzrJLP!bUl03j)nF!d zUr-|c_aY%@d;e1A-A0lIkDR6(?~yt9VW-f6nLYQ5Za!66SI|7eTfx_?De{=zjaJqk z-!tCV*m<JovCo=x=A4f7!4KyfZtvuhJFt4+n+aj{N%9XaB-PA+_)5jhF;n8iH2yZ7 z#`2$HOBbkAt`9npqB&1xvx32%lsD1eCD-{S3C~bJT~O|`&EN=Q$rlaA7RDL;+ah+U z#fbkn5a7T$N3n73+%-RxIkxj(k~kih#AE2N;!_dJ;pbiq=|-=o6(^_Nxlp<LmXH*K znzh8z2Zw83&aD4>Eoh%p^@W0|-i_Z?;}!Y5KImS!cvya~j@-cvlLJ*B8lODX$$7M) zb^GI2*4u0h{n-oh-KUvbxy&(7Z7bZV&n=O>#NktsnAyh4XJYAlqPPq^IWO=X*yPj1 znDE!)TiJDEx$+4?oOAR*E<0uYw*JAERgKS|a_FhwlzmyAb-n)NNlRhj>8GdpYo4=a zo5?*x=3wPE@Eq7K=5;n~9t~lp9}+vu8ax@Nutg<3f6Ha4?Ot$`<I=&7^GlAgJY$n& zm@NBd@|X2*Ds@sNR&L=1^_9P~wN3A-RDLF&oc*MF=Ig_s4btSF$yQ(8o~EY#+-Q&f z<DGVwv>Ss}3jR%=T7Q?-?oO0^;X`Fr9b0xaN#&&upb$&He&GF;b;{)zyN*_=*TN>f zZftq-@IiyAs@bI}F<g8R-%QtLJ*c#7+E~rKp)>mcgM_^}`|6W-pZ{{sZ#d3;K85{v z!o8>P4)XP#|6Y7OmUFIVoz!8bV+DM%pziUR`rBt;9W}W3G%V4;jDP9Gy&H~N95Aps zU$J|N*Mkz!RK=#-5Bp8;#QvNZH0j<YEyMRa7N2K2Q{39Hcy{&gYuUP>G0e<^3}g>s z)>Ax&$)0%mqnqZ`1D>GHSm~wNlYX+Q9GGt`8Gm5yOEE|h`JhSo!pT=n^6&2DpXCp+ z3VZw4GOG?$QXUAc2OZlIYMXa=4ZQd-xCEN^dZh1YVD~cjRE<I7;r%{G_^NC6Rn{e2 z?5zpDbLiCK$9qb5x~9ub*-?05TJ*Vw(}AaJ7n%fc%}6mc;5KT@nO6U;@Yvm`t8YK- zc>T6#iRY99aY7ePX6gIC;wk?0yyn=`Yib&m$~&hQde`qaotK{WrZ{ccdHL7xqJFd0 zPct-&j3`RhlRVrMS};$m|De>d$d^7BT2kL7IUb0N$rDV;5%St&BB>vKuzB%1quFMm zOwpi4Yr6Jx52t@V->W=->EZN?MJMeX4=gSsSUlDfC?8?P<G+G=Pjpk>WxX{2r{iZR zw`hjRbB4`3zGQAS;6KBsP^&zJ=fkxJy)NFKWi<=fALx4Z?5&B<c#y!L!ccB`^V0T; z2-XR6eFZ#p7@OLDKIl)q(6aROoFk%p+3Fpn7|t(wyotr=#|F`CFPT5yz6$AESqdW# z-K>o9-lwvbbx-3Z`E5H-ss1pKjM~9s`^|N#w`$uZ1{S|*pm`aEg!*I6ZzpLsP6qc~ z>Prls-A=F5OOt;%hvE6m)w;{x6bXfYaXO<qK~4IgPO|))Lrllio~gcOZqq%_?CY6U zpFXWO;Ya#`w=t~z4?^S1JhV6R7i1XjJ6}*LG<$&wPs(X_=V=Fa*K`L3OxhE!nXpO3 ze^R7?M4ZvLwZD17)i-jUnVh=AS}j`Q5rb9L6ox|#XV{~4Vujan*Cc2xU^zDdG@4Yl zc`g5zKZ&A8?noTjX5-u=zJWE};&oXOs5q=gD-Y>b9Qw{(^T+IPdp)QA^GBDTZWB-U zKeKK!bMZDcz3IC1gXWa;7>OHLHhs=%woAMBs+2vZl4k<L+N=kMh2AnuX42r@a^&1? z(WJ1x2b%<!Gz-r6?BzVeYs8>teM9|a{LRl1rwoEJrN2E@O@7bIqc8c{?Tr4hYbU-N zU2lJ$c*gFG^|w{|XMMuXrB=k(A1kh163(>T15&R^9Gup6y5MU~)ZXPD`M>8W&iQv> z?h7?g0XPLT>redxu>K520jQ8s$+yjW8H?X6(6oM;^^Xrv`Y#B|&6>bjKgCh_#Dztv zGaX)Eobt%w*X10`EfvNur_^wZ8>F!%A7G!yvqM%_^1u;?6-6fvtBXuO=S-a%^Y+0W z%_BRH^qh|Rou-;2IpfSUoitFBza7-%ucuy{-|mINOd*Rv(2P@Gk^Y~BM}BBLGm5lj ztXtL-F7Lw(ZZJ=25PG4q;r`^Qcc=VsUA@1|y8e9mbyeH@vG#Vn>p>009p_leYB%jV z=e}$=VmQofc7tEo>{=5kA9&mRMl6$6<lA=>GZR4ND7X=uuo=__yy?F9Af(g<&FtR= z6|e8)X0qWjtRCD{rj}`>8&;3UZKRt<x?%NRWCa_=PCF2#zWVlytvdBG<{#pYoxZc} zvg^S=a(Z$+cHOdO_ayQJyxE@bYz=;IaeDsI1Ak={j4y<*i?)3^$H4xY?XHJO+ZUe~ zR<qpozwvwa<3tta#9N1_8@!KbjpjJ*x7f=|L1n|KlU?^W_8iXHXX4oHo_T3WNrYR{ z<;b@?wT%sqyk%Hm!d-I9dN+SwVf~K758PxUcO2aF=8N23kuv*f_P34lezL=+<)RZR zPOyHCs9ycr;dz4fi?TbFR(Xjw(bI&_6(yX%)XUoZBf_q7x94-66F%ES7qb+BdbO?J zvv!&YEoO5(x!puSUQp-8>Kska`IEhSp5Jp_z5VF<Pxf6W*T`<RI3qAEvc5j(8PD$i z96^)BnZgN<+|SpEO3D=-l$iU?FY};Vv+i79>!p|eX#Co#_Ee>P!gA?^nV&bUa~2AC z&#JQF*Ga9E7x~G%jpFxhpP7==yN@TOyIq1Qr*{(Lgvhp_mFbrXFC=pw*wi!gqgZ;B zO*YSFi!BA3{LNW<jVJ%D6{@(wG)1)@v>>5DNT1jGyh_#15Ux2-gbciHOusv$<<bF; z^RtAK+crf_+8otnq4V&4&5E*VvbA~#*;U`XW?=ddAjOcm;QZ!GhOcjSRlc**JAaP* z*~3Jc!xOv}cpcad{N6O_r$U?mgW68*-G-989)!K}JyXMd*#5=L_fs~lHBXD{5z0{A zP``C@X!f~3_tKsT<XA7d+Za2O=Z3mVw|=u)$YCMfh1@o;8yTI#yVE7JXB_WqeDlIu zwLJNtPR=6(wqw#C9oKi?)$KWAXW*VJw%x0dzqj(_?`<2(x30UFdVSi0Cy)-rIThoc zvs~T`-_k+jgPWSyimXaJ`Fq=kYPou;tJCXeJ}JwXk@GMpCnf&;)k}#%0^1}E3;lOL zySGQyxaV|llj7^>igo;77)$<GtC}Y|9ygn^C4|YcaqpZpIiEgkd#?I;&6nL}yzvv+ zPF#@AS(xrTLAG$YNZFZlFG>$wKe^VsaA&f@#?172*WTT+=AOMn=CJRcD6UhU3%+L= za4rd-X;S}&FZJYVy$|coR4B(sdwrPP&~7=~BIi`Oh?kkrDjPYEYs}IPi^~^^{D^5i z5WPcC_5G>q3Vc=THtkG|*vO{hu%b;hg(32Q&#`kiwmwc!&1<>DI9=j-R(Imz2M10I z@@R`mzx3Yc6v>pA&ZGUFYbl?kRP4&tLNC-oiD%E@+RXavMLA;I4WuFyQX-tL>3?1Q z=H!gCzxmej?A^n{#_=p7jZvbZXtz(<mxWi}r+!p1YuxF`b|8hleUk3ar+NEYKTrOr zH*ZR!c$k#rv<ZwpTnktv@+HG({aiAGwZ~ARA^feBM0}C{hVG3fsod$470MiUY>M80 z#4DlUTAWV8{{!u+_1cZiZPO1hRLbdXwK>@S?c=>5$vcN8MMp_AZ&di<aGCMWIg5za zNz#3j=Q4%_F--$iiQ6>yH%cx}NqPO!fxkg7f9C1-vNyLsH7ev>2Q5wU$vLT-&@gSm z;c~AHtS>r#tFHdV9ma6%{2{ex(<1jKvgt53S>|6k^jJ4>`W~5`_2TbOT@TZL|7dZM zetGJ=uWM4y#I^-8C0shH!N}r!Qrc4Kvu=}-j`#lsjs49hr+GS_o-f_3Hl;#EZ|V+} z!+W=woZ;_l5o@^6@i0=rB=w}{?n4J1HTAp~8fHI>V%;m5w(L&G5+M$7M@I6G?Cv+U z*|Bxvx|1Voylw2BJh92Ce>!=3`1gmE58hPiZFD}_{3NcVRV#ZB%TmUUV$Bl@Wp*!a zviB}+yX_lri*4T7M(5;+X-4X`4b%2rIdHaNd-}5T$(I?T?9`lB=5VI0Y-e_OS9FYp zA@U7RRprT~4-9Wk&e-jBk7Z{0vh$mdZTOuq@7zAUd0X{!E}r(8ab)^C{+Z16>WUnp zKT<YMb=c;!ppl=sWUAc@-q846{Er{xs2aREpnJyo4&zd}wiUaWE253gd0(&J^6}HE zbzTQRy`80h%BMK|XxY5@WWV(*&*Fm5HMZ|`-yC|o#PYpTBe&cndA-Lwx6iQ;nzpl0 z{P8uL-sY?B(N!O>gBGe?|9R*5`&stQ^}Xe>^MWkrJfErc{PUANkMyFek8FN+@nqJ~ z@^gLLuAR(s=l5QWn4psOcTiv5Yp>9YSn%;igK_SfvM(D<kOt5`vXpGP^@I6R1!B0Y z57Ys|G_0Pgrjc$KsQqyOhubhrYb@AQ_51Di|9h+Uem-Zt|L58KHC3;#trd^2xtRCi z;_U5mo9)m4d3oM_e%0@7xAT7AeP5RzF5I%}rF_kYgVpbLrn^7P2!S`395~N-Da@%~ z^CqP9xNLdNi@n$1Zogmmd~W%@+V6MyZ9X)7w2C~-6_y0o@PJF0LtXp-tgFZE|9#y3 zZrAI7zu*6VB)<R05n=xu8@=K;?>h9oEiV$@M4K_&!6I_+&u6picI^6ouUfw9#X@QG zydN81t=)d_()BgZ(zN#q1=K?)b_;Sjf1G@EH9Wrdaj*HCA5Zjub4`_9Ay@Y!QD$|| z^^>n|-ILxG4|hsJ9#h?>UtibP=f<zyv{^Xr{l4Gt^6P&`?{3<-KJ{j&xBWpo^Td~k zS=ZN|2mHgnv1(g8-n_Z;^QPpfeqq-?AG<JDi?JSNCb!Us$x~}L>(5#FMj-V}b^FTi zv0qGAvnsBJE<&2pAhcr=%b%2~{DI$U9jpUyn(istv}=-iTV62S#}N}6=C3*QapmSK zC$k(+WCcR~wt!`w3Zs4G&C1L_r4QaGY?u8S1ed9wa==yXL;L;B2G8sHY$E?A{rLLX zeqUV0!`A%T*U{gyz5k!CUjN@~{h5G3*ueCGlfobNcNT2jzxK_0o!_&)*Pr%&aGx!% zxG$vsf?UNWDG4pFxVoRI)r<Fix#ayV_tf{lHhaZj8NqB?!(Z97`t+OkW2$1~nD*CK z{XbnNyQ22=`>)sIw+m1Ddt%qzpq$EoldozY*6+zLu6q?czv}(<Y5)GEr2apv^zX*| zu8Q~9UH^1Cdcwxr4@e4q*x&gkYk$b?y6%h8`FnoOJYSRcCp~A$og$`h-1eVe*Z=*P znyyuSuWrqz&nKhQS6{#Pf0NDJ4L9GEXVu^Q`uFSo^*NvX>wjH-zwdYZ|KEpLmpg9N zU{rm;dE>s(w}mP7UJIsxM&nf&t%L9GO09pn@88Yyb=UqqyY%{#(1zfy`rK3N+TLzo zb6fgYz4D7|eqnWMHvL!6kX~Q9Y182c)&FHGF5lboYcb1|1DjahIDCCx|1G`z|J8Wb z5A**$%dhW=e6~_gbpeYFqjlKcPp`7Si89Y!qxatDX?e<V(cg!z$d=zp47ZNS{g(3d z_$vOo56$22mdAfj`Fc(|e_!hRd(qqL*4leHaO!v;*q8Wmdi_W7|8EbnGyizsZ<BP! z$iGw*?2nbNp2qK8H2LaMxz%s>{Ym+{kiYiCKCvh5t9k3|&YtQImH%;o-R|4Q{@QoN z^Iy+d^G5zkng6$UwO_AZ|KiT6(U{74L%s2T#r@j&zpuiXEB<^u-V1YeWBlJ&Q>VvO z-Q4$i(fY{PR}Z<=SA+8Az3TV1@6`|7kNj}g;rG=zfBU~%YOj60-uOQ^;YZs1TEn-8 z<^O$fxBFB-@%Q`v|Fz?PdOc71dMkT--OtnF^XmVlpSSxh{5O!vD<P8UTjqWLFvc4v zPt8c3_bQ0V>wxf&kNxv&f3=_g^X2FB(oMVGOuqVd`~AH3Y3*`VFCMnbZ##UoY4X&+ z$7}j+KAn)~56hSRp7Jz)^RFZ7b{`Kg^Vj@+9shpLnm6$*_Wys@@3;GY$A5n1v-(&4 zLIF&tg(@DlivLX!ZJ4_T9y5&~r<&*4q}KbtOewvozS{czp38L`kM&BMi`AdyN?#RR zbN19e`M2$>{p&tW_P6=y@;v41Ded*Q#Mjh)S)4w<>eaG;8jPwNbQ<ITJevOhXa4_h z()WM3G2H+AuDl)*lJD<V{HnhH``_mCcFQMUO`X5y-M-&>)*E$xSZdb@3nV;ADSf<r zd*1H1X4#c*o~=DT@8{+D?)mqsJ{)9!zw`OL4|g5@ujQ`W@$1(0eb+1_Z+>4tzxv(J z<@4*Fom8)107)Vb((Qk@{@w6vvcH|=fwQyCdn2FK!xLZa@7wpczUO=e@}c%`z1y4q zn+e=!VUe(m{QKqTcCk5Y-t2hVuD!c$@pRp{j5ptJ{<U2^ep9{3pU?LH`K#|kLvKU< z>_1P`|0mUZZ8#Gg>*c^%!Sw%&|NY8Go%yz(7t6m+DLtsZ`tyIg)#3Ml+&}FX_OsrB z^_YLyH~v@ob)Rqd+yCqT|DiV@Y#6A-Xv|gpz<>YG@BQ_UHXfJTU-?;b?i#%xDXH;H zhq6C>k9=5NFWFOb_SM(z|NZ}`d_5k|Y5#ZskJ?XWKd0~i^HhEQpM8G|9`M(FaQ^+% z0hE})CB}xcEc-sseP8?U^Zf1mch-N|^@HV2Ov`_R4WF%VeB5jQ`~Q?bm!|JaiA`|x z3(Md8yZ*Pj_M9&=5pNn#df&cY_qO@3U)%o6-q14lz&7C@hs5`Nc(J(u*Zmp0-q|u* zTYQcGcGl54_~*t`bw5tkRn;8S{a*k2Q2xKa|G)Z&ZCe=!@)&3eP0x<;k57H~fjZ%c z4|=wrPoDBit<nTZz=jVBn7%1Te2W%2^gi^*i{Sj*;j69UH*eD03zG+rXcRF`R@WAO z0ZP0ugFyvNUi~lCf3vO{34=-iaBmqr9Tx#Q=rI?;*Qjqy1`SbcoHPa5gpy5{s=<K; zRe9XYL49?ys-`@ww(@cSRhRaEzW)7I{HE=zJ2W`J;~)<vuza}BCUpT8Mi9XREN`;I z{>!g#JGz%EH7}*Oq$o8pmn(I8Y#J*Eqw(~IeXJskrqdM?dA0e?EiJh8JyJ8%GfEW9 zjEtxA-R4W;Yh++xU^uK$|4Q~rYe3?5!*teC4t6<qww6nG1E&Y3v5GL7KnyXP9zU7a zX}j8EzDr!pCYFZN58mb%o<4att3kb)z`oz%A0{xH3LmTxa!4!kxV^)7`O4cabC*pn zvoc|goD;OfE6A_rRs8!$j$KPKZ{}4^bP$Nq*>L||-ENCreFb0M-V9&8`7`%2rKX9; zX1T2PRgp*va-Wp6M58<G^^0VmA4#5DpBdG~=iXvf{;2+YvYtd=_U4F9F2^cwZpjQ> zQlA?)wN6d<dfkOt%VPg*{Ppk6*H>@e8#7ry?)V}-k%e>N;+*ntANgh0KD_%~(9LJ{ zi^<VDyLSk6X#9>9+-v{)ClCAE-TxQ+C~+uFaqsk-;Ny2PWsVZ-?J}d|MiO&k8j^Z0 z20JC}Jk$|%RkLkNC}-V%+1}%aSeH6K{MLGvO?``aefaDQ<EiEQPkJ;7DjIo-ICBQx zOB285G<EZZq?4R|>o29fc0YSfq}BAqPgY4zFOxg7_6n;%w2bh7Xb~H2>?N~3`Z4?L zRT`^ULq9Ixv*%l|Yuv13{KeUIo_(k5kN1cld$0Z@qOeKh<u~WwyKX(Xdun4^jPfCu z?LuYohrUJLnpIlAU$aK^;F`T$a=M((P1*bZTzeHI`#|o&smHlnH+LO;yXNz)l(p8L zwZD`69N(~V>L0JU7hbwMf=lVKy#D=tzn-0cuXlf6-Oh+fKenHazxVg$^L>?{-+jHl z`gHkz%ia$WQx|s3k6XL1`sbP26jzJH=i!w<AI+>SzMfcR9Ly`B6r4~mw6;1SXyHY{ z+shT0i(@WGo`^VpRwwCAg2l~mo4-HmNSL5?Q^3P4#zJ8upJYOp=7a~a>?*t0d|G{| zsEEtMNzr$boTqE)TS3FCJ%$}wd!o&=i#tkq0!|)l%l64WHGAdTzr_aoOdmBfNSvxP z6LEQT{6<_uch;Ht8P!JF)rty7>Ng*Gy){ZhEc{?V<m~$m`M&G^tCh~1v^=~u(`xp% z$*z%GZ~r{N&tLuBaqI2v=l>c7Z(AnU_~6IU=6BZ{xYLit-(4B8P(*1{zt+9I>AbRH zeQ%BLJc*O=bm({_TyxmZh;MoJr@Q-h@J?9Av~9Jsbl%x`0o#42yr1;giGOr=c);LS z&l&x{{Y{CvZ<J!o#^p~={w`kc;IvXBk?G~+n=!>KK1pgHxh!UMwM^-Fz|P0^Zl1>9 z7i+k+G%cs(EO+Ervhq|HS|=V9?_T#oZ%Klpa_5#K_m(QG&gPmJ=~SU8C;GplnN9P# z_=J1?@)0T8Doej)*K2-0&$#GhKn@e1m-URfzw1SnEoB0)9lt66>63wa+avexirHy> zuZ~WC|M!2pf<N!Rh@wV~8_6pL{hNyWl4fq`$U795Q<L+X_xt@T&)zdHd9XEARcO*d zCYwdy_yt71RVHqB>R8yk_RMpUIj2qfizQ}vOStS@{y2*(S5cUQ;SJ{vyQ4P~c)qaz zkz630@$LG%`U~?M&$G%l8N9m~ko(4Wqg}$y!nDeXJ=e{eZ#}p9^ZsthRTImWcOSHB z@(ypf&CT>cV_}nd*3I0qxv9lcj=cwjuj+m>GyYnUzk*v#;O#<_4{dEa!E)Qnnqz0> zD!%>Qet+YE1#{AiW0Yo{C~VPN{jE~mB=)4?a(k8?E?>&ODt@kSDYTufFTu)nMfa}5 zF0Q_8-S~KRj)vRr@^{y*|Mq*4@`Pu{M6TXD`R>!L^=8~NR_pO@NfTj9V7E}HG@K># z*z`zRgY~5;wUNAsI~*kZs;#^k_$OFY7V#Pj*sV%z+R>ghqcVsoMdXqL$HIJ_pa`Z` zwLhFIlwZfjEo+_6a&E`B`X_=94hTyfzAR(9M1(0O{z}Sg>pQRSJUSt?;ftJ^ckYsR zoUPvX!Wci_OkqDgX-;0WvA^2GO&?m47kqArVezTDcQMoGgO+#yg}-wq1kbj7`Tr27 zW!s^dEkE|$ic%M2DwuQi=e=pVOs@_)N556@NG)iH{%=)L7xCuLE&uj{C-QgekKR1E zRnwRE&!&$|zrWhY={?ujyt<#^?88IB;)f-k79Kx)EPUNVl}+EDFPyu!cl|R?*#O5i zlO}e)?VGpcP}oAR&Bd;DPdnzNAKqS96es#2xq#E|!cqBxlLoB+Mas{;{JO>ZOz3kV z)jj+t)fo;7EhzQ;w4b5Lk>glYS;L0w3sd{+*_R!(>|XY1bM}hdP1`>5+qK<4sqNxy z_HOUTxBmHQpSf73DepaJ-FYvQ=f@$VM6J5boToz0vvVFj_hxVIn@5MvSNz_&TYZkQ z-_0$0@($ePd$lDjvR5zM`Zk)KVY|u8i!ycvZ~1?GKXqV%XL+K@8}ldYPHo*Z>t$8J znl1WK%gz<lC%<C*aZq@5>;DPt@6uG<EP|G|-U-(|!>A*mu!=!&7x#~8Q#~@R%`TPa zyt#ZY{`;|(^xF~-f{wNy`_U<4aq!yyP-m&6>v@-p_&P+gT@0%m9^A+lP6~L=d1!ap zr2B7!<3#F~U$SUoE{?O8e9!dyg!%TlMxXC;Ke#OPz2g4T`kD2=v!V?I6PA4Mxw&HV zlLMzS79Bq@(@c6+)wd&EyYt={obXxs+GtJVW=1)e>-HA{?%lR|Rpr8Wrc<iC^|{`S zK22Gf6XGWpx?fPQiPn)9-dF$nP{E3gvB`|5THOV-xkOj}xb)26Xo}wRKH08=U$g(E z#F<X8eG=+;%Xv%It;Da1bLyG6AN7>;R841-+H&T!uj%X@9exY7BiA;~nQ+VU#-jYs z1^1s#+;^6FVr0>)&n>ZGvbX*!*1YDLW+|zs)&AG*@4Vbnjcaq)${v3=Tf0(R$@#mc zu6pd!Rc|bR*`2Q`nV0ZPX}{f-XC^n<-&r_aS*-l-GNVy*$OOeJ;#<>q{jX=d#bhlu z{o;QqVI~vH=^y<BM3_vBr!PFuuUWq~GCKdZnMmFD^%o8|s2uQ_ETTE7R^pnP-|YpF zyN<|mmAES2?$QmJ78Co3<?z4XeELO?H9oD1(qE<;=zjnE#OI5Y-{{)B*(<ka7LVKW zeP1}-xU?Vn=Gi_}KGvbG;Wp{ly_9#gR?9jTO<pMU>W9&sxjcUzWa97M`1ttb^OLQ| zAJpp!{YbccMm=V}Y>#?#J~Na0M)z%Ho(&e^_i{{se37g!-cj~2@rm}!+%spU9#?U9 zdG%Z9ecFfT4AvXI-q>)m)rn`ryUm_UE!X9~yTLKz_)Z6z&$VhB+&L$?nCTSw)SWvL zoK)TUO5LE-;KSYjEEbA0s+%I?^=uob97wBFb#C&k?`LP>T=}NxZ<)~(J4?UKp%&Zg z+Y75^n_l0Lc1zN|xl><I{Gfm23P+iQLyZf#1f8lUP7YLIUj0lye7gSmIXz`Nx<4tM z^J`PsX!}sP@x{3*XVaR+0_DzK)RDQ_ni0C+_zhd(q67i<mGupsQY>ux->U=X|MK{G z<W&8vwep`THrDH`-B6$0=l`(%g>#jUp_+4-qQlJ9|F^8ZBN^AMaLl7&{ddO+21l3@ zIpf-XhIju{EqZLiAKrQ|UNXl(svs_Z^+}^m^>H)biXVM>NN#@G>e3l@TQ0xn`KMXC zjAPN9uTJvCErzA9ck_H!(USR`C3n!t_*95*<(kfOn~n(9&sXKIPc?~N_Hp~ExwCeE zH1a-e!!<cfa940fhl1jnRdyx`UCJDlVa?YIH%)zDvig)3yO-UX>tQWX3{^82Vjr6S z;O?q9RW0bi#&Ot0`GD)Tl7%I2Y98o#UB2<-!1`}TT=~K|_%ha>EVU`#W4~l0=gHLH z|K9WMakRalxo~>QS(gT;H<RkW`kL@|8}-TjFYmiNbD5m}q0A|7RHl98-@){^aqfkg zzRvvb4u4r7Zp+lj@wn9H#N$P0u9YsC{p4fFZ#LB_@5LRpuiaI(x}3pruw>h-rEd}f zirDnj{@mu<`I%XILhbB&J`D*z!-oz5b6Kl2B_yu&HSKPCxX0`H#MRZw&qH4u=-01J z_mPiTX1RaY&TaLFubh>;e?L8QZ~n5vrd!h&7=L4{PI~-b(Yv65lbz|d#GT_p4vd;B zPrrPxV6vQbhr+`y+5H<P$^A{zda0kkPVe|)rTM*+j#@cBt*yMGSDaqsFWHnmJK#3A z^NeG2%j+~2-MJJM^3mp2&=tcMf@dquq(cq9)_2crz4rNb*`~V-%}#hpyZ=_;{<<h+ zU97=A{_yPJ1vCEqK2&w-T$NkiDY>e-2Tfma3d>d}Ja<++vBLYnWF2p=;57F0c~^tt z?;l>Ry^3wEgOV3tRk_`f7UqMwEN`7-G`7a*)z5cHd}vfCw{~-`z&f#Yw{$nV@9nz( z+WcABM(e}%IRdF%ft3NTtdF!XKfIlAv;9`U{(^@=_e-B%n*KWShYQ!<<-ND_Zaao7 zKU^R>HNd!jXYayESyOi#pHmB#Hu;@!N`gsg+RNy>=cS5Hu6X?X{kGlT0$y>gaO}Kw z;Rd^^#v-O?lb+4ih^$|}Wco|P#Y<)PyYbJ~ng3ePBe2{tCs?Jv_~#3bu2>JJlM{E| z(Q-}~;+5>^U08d9;i`z>I@uzzyRM$w)?I#mY1O04R%Z5MssEA}1?Zmo&v|L4pR<6$ zlBT#WO?fSA$Cz(_PnSpsUl*-(W8HhF{Ou8|!&P2ATCx{@FJOHtlX{y=E9S-(hkcVT zh3pev9pzctdgaHF1-vD{4%8=jOq{E)JxRf@#hsbeIM%RGPCw@}+lOG6MhWKneXCBD zhThtIa|_Soko^l@EIu2w|Hte4)Q~C5<~~1Mr#t<e+Z-{~H+MIfSRc4EKP%MjxsUBJ zr&br10}pmF_^+<E&KKYO&h+!!Ef<TIi5&X(?ezI}le&9+6*`Jvb^fw_?NO~zRSd}a zZSZ>~r^F0@UxT`ua|Xg5dHEal6LRMVCnW!2Pd@v8`o{uJVP;bU<LQE*7)7@KTE)r@ z>NJ8mQkz*Xu`?M#`gzQTM&{EWE@suNkGP%p*iESRd-#V$=HQO2ue9|mXP>P~6FxHY z=EjY)UDXUSCT-erxLYY`@yGk`Uvhf}I%}UxYGCDAeKRL4G<@zltE*S4zpVKF?9uvi z@zvLrK1rw=_RcKd{%wkaQqSHA!9s-(@21{cZ`Up6EqC1LOaAQA?E+`)U(}y;3aFp1 zKTWBg<L{!p-Ai;Pugl1?o_uAdY)R#9-MZbsKR){P?$LK{wzF4~o0Y@_mL}=1)vNp4 zTP1n#?~6dCM<=XjOr5H(>>9CTzxLkS-SsgSI=^l_F3~yl(XFbsxf>cP9YrE8TTX1r ze!BX4qfMNq<iZG-x0}qbzmNaRd#&x%|0(aI_OgHGo&BRe?WJ8*5hwH9HhHU><xKlC zzOMhY{X^&z^W12gDLd!BlG^>maQ)}lOHaSOe7@b>O<l}Jq;%7Rh5NOO)Kl;3D5R#Z zo$zs^=p4>NhgX>YReO2rN#eN}K>@9H-EYyexRNKiINn+RbLEQf^PjsU9`-s_ck}9; zB@F9ir~F;L!gzDDv$cA?pVk`%8J+5~)jg9FcrN))iaNh{?^eHGseWb!qF&ePH{Uaz z8rOQ`qJSg!Ue!Cx7aZI3E?K~Pf9|*4CfgtLhn%?7!o)9jT%u(59j%a}q$M1lGCWeR zmw9c{`tK8@(8$PVY}R(*p~Orr%~#2LQ#SGxY<g$bx;Y_x1Eau0^|PD*o~xf3DS5%> zW_xMSl(H#r?^ZWk|5@g{b&KBvlQzL~oTpaZe{{x9B=zD;gN(#L7K80>9Bq5q{gZ{g zoh;`sDyS^Bm7dJd9>AA<`|mYbA>ki-=hvvc&frN{Z@B8r@#l+<?A#Nj&{Grh!^dTZ zT>p<>|8D1}8=mEuyej_6>kV~6hCvhT>R%pDDAYVRqx(zxCz-nWB?1g`ze7}CE?ZH` zv-HWo-A4Ym?(Fk4ul#k9&ssXFr^-F~M?%e{-IMdxEbHp;E7yu~KfB&vc50{om3PcK zR!K#xeOK*vpB{UEzhmB!N){96tj&!)9Y@Zwo?Cfapg8_k$*uo>n@oZ~2u+V;c%ZTB z+|tZ?Ma#|*n<Xz-3N$7uO_-RZd5&|T9KWSt<BMY3&aII@{-+tu;|gbZG_l~XQ?xU) zUB~UG_kM-kE0mp?)Xcg<S?5cL%#8KDyYqG*VJb7zex0HnKVgcfWbt-Zqon!QWB1K& zHfmaSW5WE2VPf7#o$7BsyIW_rRYT@OhC}J4uMMvqZ`6lOy?m-P?qC^1O}F9#+YW&h z8I$Dx?d@QB(5oNuApG~X&5O<SKVRvYI=S!U_UQ0`hWjqxe|mM>7FPb#Ic1ykWp6~Q zFT5*m#`_>N{@0nq3RM>K(`q-Hv0Z-2SbIr+*W?q0_hu=bJvseMGRL|gm8AHDSw}xI zxUaiwsqjlCpkZHtRlV1TziKPxKMS9i7yEW1DO;YqdfLqSqSh4`<({Zpo38v5Y%nM1 zyZ*AOyZ`^bJ^R&b`m8_2Oy$qtuDXyBrLNg#{;QSo@n7SeGri{=_?cvLb>EwCzn&k* zqzeC@UOl@!>bn2+?e}XEoW31<v2nBee!sV8&Q?xla9(yK;P80?mQ<nBHubM(^zS+{ zG3|s!yz(m}9?s&M5AUw~8IrR3D+h~X@02GRIh(fzO-#6RY2gdA^D+;23K(h~sDJu| zK{@ov*X8^n7roa;x*yEizh{?9%GLj|uf!vcKI=&;nALNH+u_psISo(ta7qcp|GVD( zFLKN8C41g}i@aEH>c!LIZ=42415S!7q}AWlpDXdhy=H3C%L12kOGHkxE^MloEl`|h zn3P!(H=F5WlER!6uFLoCMBmBWZ}+C#X!h-lo*s=O+-6!%A-5mAe&V;#NvLtA^xSPZ zTQ2W9+JEb`>-jxDE<P++m$84g>Wc*oMQhHsEs)mH>#kaR_o7Yr>JDMmCxtub`Sy4< zrTLy-R-ae(zIWAc_sMh0J=0!Z<6)k;BjVVL1f`$*H!Rh!oNZ9*`A70zS)bU>Z&3>- zx&@XA-uB6;s%I8x-Q_h~ymor)%6+VPvQM{fcK-i6Wxj0ijK$x6X{^fJ?CQ|1byvE{ zkG;sON6<#<PvJMGKR0&d3DnJ)-leC<#lC9l({;xu`AGe*_p8$JE`N0<tWHy>ZD|R| z@dE;?(|2gywQKo!!|p-t-IB`xoeN8Y?C$?}IgtE8Jz}w4XR@*RB$pQkbGdk~&E>e! zHQRKpYF)cF@9nrY!-apZ{eJSejN?+;jl^tuHY1Iz3Oc#3@~%%Q`?NvxQm?FB;r_&} zpT6hTEp@-RB5~J+T*vyKse$z}Vm;Qy-y{?Z>v#AEFP|!FP``cs?nOoXsUH(QWJxns zXE$di&#KH7Vao`W7oNLIz`xbxt8?!C?Y{aeba(wNNWb>ny5@S$@skHb8I5)KzrD28 z(@f=CcVJrR73CxT-zTU1XKY`8p<oB!l^ZpO{NMKMF57T6ZJ+jhzs>Iq>+h#cmUg(b z`k7(pj;nuG<;-5a&-34k)ZJFsZgKZ2M_&?VvMmo;x^IDu!9L%FD>_qM4oNlS-fo*2 zt!5a<vS&l-YhT@0TkfPk&y6km5W=>o;!R(&RL7aEzv?%auYGm*deZwq0}<cY%;$Ub zIQM+I^xG+I-8;8VpLm92$-hNjUSfPyzu>%Nc!QMBy2c~^m6^}h#}!<Dm?izfcwx`{ z)iZcz$}dShmFx6Uv-Y(}ga@Pc4ZRt?4~}owU431__r$qIwX$2BQ<P%4gaWs}`r34S zvO(MN*Nw`e^A)b9r28H0mhew2S<&!eqXdsknwI&Ic~{SvesB?TcRBVc<I}RVG%3k! z-_tQUZ(m)WS@%5acv$|aZ|*badhSZkTif8jZv8A1$K{VhuP%GN?f%-Z_QQ=12cH>K zy-fC=a5a4S^sdz*(NEs-hQGgP`yu6P#I^atN6IgUK4lSPzG>Tff+yu4_kk+Y6VorQ zVijgIf^;G+ET%iE@N3o2x}A5&OrY)kUlFD%Wp=~EpBFkXJ?UX9y>rbiP=S-_ZPd1_ z@3Ml|nzf77e&;j2Vr8bQen#kHtE=aoi~o5~J`7OOJ;xnobHBP|Q~CRu8(0?~2|V64 zdGjF-B~@*n<wuGF=gbjX@8zd*)4t%?)b`N*E7E?mJI&sddA)XPL`d!Ctonys%dbs2 z^LD>w<;L${Qr^F}W$RzSdOIp*md4YrpGEJlN=MB(v{#%}_0Y{nhXaZuJyvsU{#V}p zsN(%~Td9=3<0qDt&622H?U~p9`Qj5%;V7|N9!aYE&$8%RC{Me2qG{2a+deVRcTK%) z@2IWR^Yf7KgQkfOIh_w{MN2&5k-c@*t3GK7>&8BVbsJ;lZEn~HG)=AD`|kd>)v2Yw zzU_Ip>hca=_bVxif?YvJ3_tpcxd~d&;80r9_AYtzkKo`#a~$jCeEz<b-|%vF;8V}{ z>Zkh-w5pvub@zbojE05FH4K}Sf1GsPd~BVGT)dpDUCpEJJvI6riZ!#eB7<Fy@&=ws zT{x+yz94tvtB1?>N0h#npZH?JgO3aI&qRjnUSIu9FRsew-mN*;YIl6IiK*Um>&xtQ z`?~j42(GhRd3#&rVOKX({r<yO=f5u4Zuy;mW!l$Aw}kz6rG>3uUOV$m=ZWcOgjR)! z#dCF3n)oQT`~P=nntyBGyK}25d-*DTMQi_k+1~EI;J}7s^)D75pS>=-$=xDV#yhmS zYk!STlkqXGtXsM#113hVP(AflWb3}WOkM$e%H@6266Zv$FxzrQ|8CZ{71Lk1SyYCX z*9JSUpZ_Us*94BER*OteH#sQ^CwP21Y_aXx*{Tzse{Q~?D(@8=%(z7UlwW3)pZnsH zOhcJ-9Fh;F2p{n*ZGBh&G|h6gwa)r;1sXDE|E+mm`?-!`%cYx>?lR5L(q}S}_*u+w zNJmTex6*^tp}R9~?Rs@=2G`2;aMRrPjXT43ExCN)WRY@0?_{U85=Ti_jm!5{V?CzJ zHfqZse5#k2FD~rZ^2CK>`qAHB!dZvk@cle#ShhS*IO*vA%lmx91QR*ri|eoY?Ync( zMc`n2#>~T04+*e+zWLykd;h#e%>8nEXOtzr+N}KXjJxyR$?W9@f-V6)5tcC=ktcT? z;#<kDbBOcqKi}O(kw;2-Ue?H*+O#NS!VL*oHO*d`rbAKxPs_a2QsP_P5oE*O-m=B* zf`Pc9pcKnBHJ`wT3cmBt>0b_YkzrG=59Z@Lk+6m%m}m2eh5OdoP6~CAi4s2RD#sVE zt7EW}N7lRU><^D{!9oq5d`pX-`ki9;1Ud{ZEVS%Njk()5QAg>}gtiRz%?S=>im4po zL5ge>GEW@n4J@%*>L)Ik*r6EoY(YcGk(m=1GYo?ybX5-gbbY4cx~h$%DS6HrN5-2S z^+}0;mp%1ZxH7QK`t(;5*G(N9&51M4G%B(zG<qU%t5?E{^JL2tgJ<f7lU!XSL>8y; z@p$A+;T2wRb6eY^I~=EH>`84<@9r=(@OXA0L1^07#w6=~sw|4f7bM>``mLJ1!;kUu zYXPO=0EaA=*9RLGy7S~E#$>#RxLm6h>(Y{F=u)3{KwyHTp}Cs!lzdB->j9Sotj|td zqx8r?LZ!ICAuVNxq~*5eX3LXnzG+;RIjN<@*PCd>&Yt2H^Lb+O?e#O}|5{>PRP_iP zKs}Q!EfkE6^v=}x#1<JS2=;w`nJ{&o(xV9y8pQ<;St>_%R6KfR%y)F9==QDdo4Puj zc_tdM*Rw5g3)@|IRx#Kh$kjzeM)@h<>6fuSEP_0bWBB5ovK~A6eUZ1?bS$5B`g_6c z`Bi_?+f#-8rhWaz<o){D{Hh-UhA+RS>=iUT+OebicDX^L(vHIg(+<DwIV5FwCS<d# z>Hq9)za;Mb-xrm0=o`Za-9OEFx~D$ao-O~bX}<h*H-~OL+b)@w3HLQ5gSsO3z6<;x z8M}7&O{JRSQR~HKJ9w>3R$lTx{q~ob>}9%P-#bOiAMdIA`S$grx)pV0_AZSt_s!^& zusoR{a`u7BJBfwU>Zgm}ez{4xptsPR-C{}fteJ1yx;!tQ?C){W_I{F=|G3;xaNC^< z;W?|O*qS%LzcDq|&8ObrP{_g7rqURWTjyte_GLfp`Q!XfmjfJ4hCy<<zshIJtzVZ` zdv(iK&3UyuRz&Ok{HyI-{m#GQW;~1Z^>6Aw?{D8%`Odak=b5qYod}66wkMCu8SgwY z3E87{tNwgg%^LT%Wpdl!h}3zDT%538&SBs4W8Zhp|F%;%eD+`Fbs3iH9qQSquZvlC z?|OvPkzdv8S5Dymvx)z&Puxe*Bl7Ex{J4`ipD*&B#s$HZHzPj2^F202Kh`+3eoyi7 z{xjC*H%%^Vt9mW-|Lb41&c1*hpLX6Xy?b9L$T4>N*QCpF#YZwPU;SM7^zXIWL)CTP zzHM(Zw%%j4Kf?5LRYvQh2I~`T397uTMwxC4A78!non_UjU&&i*p6|7uQ(644!qDak z^SlGX?aC*P9olgIfOy-SgW`v#O?&vv&OB9o&3@@E*Iw^>`})IdwLdJsl|(jF<`>O< z(6r<9z3)H6bndIwSzkL_mtwGF>CT<zeeN7C|Cw*yDb0b@zQ)r7-}8zvnV3vBoGhd@ zJ@yDIPrZ||ppVUuS7+y{`5HYwk~=4OQeh_7v>QPSyn>1@#ov$BIWS?<oF__pV(V*b ze(Q?3&(`Rxi~m!#c}K;<Paa41bZ`saz2n~bNK1Q>&oP_nTDv0M<!AIv*NzmiN`8Oq zcj8Kx>I3tORwiAW`P6Hv<mz1eDZascrP-drw@f*kU$#H3Uq1VK_jB{^dU2+_K4rr= zm7sYlt|4#5<n4}LlzJBDZW!(=XS-wSZja}j;+F5S7nOJ0i+w!vOG&6n+*9dd72~{) z5SPq(RhM@@%i1aAr1s`-fce+@gNJky-`dvR-?MkupWY+CmnP_1U0--qTtCRxdLKjN zvx42$e^$xN`qU@Z6<IG5p7_-3(BD?`XKC3Pg^QMVFMTkREB#hk_`375D^<jecu&9M z-^R62?9GMg(#}bDABS)HmZy=OeQn9!=u>lQ6)Pi7_0-<HUiSES^!}|`<<>s8EQO~& zo3OIr_cfE>PqhSZUVf&gxg@-eS0+sR<T~l#Z~x40^QlP$Sk<^_FE!QQQs4GLbKZ-l zZ|}TK_Gy==8OT;F4?gRWnsH$^BP(lSf!{@@<u|XmC!e&j$V-~%VKguE=U<;yJ>Dzj z+GYLMGkkcKv&ZP9BIo8gi>9WZyUy9)og=h7=II;Tr^2$1J&$4!Z~L~d-z?w+i$lz> z392Ps(VC*sv-iDvWvy{<j-pV2_=JY~PY+U@nxvJ50)DUwvFuRWTEWEWZ!uF-uh_QG zsF^oE_v!lTDTx=Rc3e8Azkp|Q>%DKQwj5k2y2eC=m-C@dN)gwBeaoFZB5wX(zk1FU z=FH+7lGYb`lv!s;o)cdkV5xuUQTr)V;pICHT3wj6w<NH5d*rWoC+{1wtXS=3|I+wH zxlcWp^zsceJm)RB%*y=k`J*K>YP!1fms*_Naq9BScKOFD|FX9(^@)%FS6Ny5n=N8$ zY@F?X$!AA)a&Roz7a=lv&Evh-GoF~-U$V{Mh3B8B+Xf%LJzLYxTDMRA><cavx!roR zuT=>se1G+Wg{ARv<E?&y#Od5IvdkG=8Kv_UPT$$|jIG`<H*u}c@!SQRmO8VmR$Pn- z={xp_LE~(8e=2XyrHb0zmj+2u0dF$H`xjU{`x$ZbzOQ~V#o@U`=CR*jxm{dE9oqgG zv1j}UdzxUjcK1%UXIx(xmvfr-U!AyT)kWqH!CoijUL|@5ZPk5yERe15#AGqCcODn{ z?=F<$lMs?oD#($nKh`A2YLUoq&HuVjBtvbTMUd)+r+m?$dlv>ZR7uY=n(tdGA!#@- zFfoJE$v*Ug)zg&{J72!~b#<qMb2r<PR@cV$Cs=eRt)CFJ)b-50+spo?zl=C}x92Cn zm_?%hld?6po&BZi8F&pcx|YXWy0EjaN%8vZTO|@R(r3JQ@_Oafg|F*v7A*>$^*Lhx zv(h~-uO1w^P_wYG{>FRRsoUO7TB!b2Giy!}n}GXs*4;~1mfoG2wZPbIRoyDzQ%rH3 zkBhnPcWy6<Z+{{bP&KQ^>2pla?p4>66u-%x5BSY=udm<JU$j$QaLSqIMcd22MlQJ` z;t+Xza}U3)ndULA-zNhPy*<4>{CvIsg;PbfItwSS)!*|p<LlA6vn5x(tu)BgJGw=7 znb+p<X*~<v>^BNt)^TabZ}B<w*<$W)3r*{qqF~|Ehi>c5zpi<1$Dujb9=tgz=Owni zZF8FE@<T4BC7O?HBc!SfeH8)&=AXKG_}Y*CtoJ4*@8#>&nzuX2ckj(fv2PbH{&e+( z319u3t+FzYjLxn*Ie*@>&V>P76VAGwX!^86B<GaQl2U(v^{d~K*Gy_&=-xT|(;<~D z7A5>f_Wx((s}<I@ZPDh4Ika6{WP`uuL(UzJFQ4zUVm3c=<!I!Nhde^D$$7VT??0d9 zci7laF1l-b?wPqWp7C|<%%811RmbjB@b{|OswcOah${WFX)sWnf4OX$TFlBf$9F~6 zT{;spS?>SGR{cK{|HxlocVjBJ?4E9ZkyV7*#KdIsLRQWC)=9qkw+(pO-v1J{d6OW& zq~q77Ew|fDV!2CPt?xG_8OWF$Kf95;DB;Hb`8u~(-sQb<lEriK`P1Pt-wr&SRdeoS zma?uwdY^U6A4#K=Q=Cq)q=$K&DBs}Aa#?4oUhzra>QAnhMfSbBHN|VP>h50=Q}=nR z`uFX3=4w6clJINF{Ymw!=j;*UnQieP)j(?5*5*$R+x%t97M5|(@l1ah{>G+Z)2xMW z|7Smtu2iV;TdlevDM-?AvFWuKkKnEq|CF|V>J9m_q%nW%!PXMKkd}*ibGEMh{ybT< zm4~bEci^eVrj5FxG3~WkIT8ZNw^T|m&+-2k@#EE$V|M=+OEqoEuD$xpq<&lJ`TVOV z7GIsio_j1L?eK#WpC7*ddw2QQ@A}`%!~ZWbZ_~8=>KE18yY5J8ZsgwPmEz`I50-O& zcKEIOP${ZSR7}Hb*;MIc`%R{<FUwK<``3JieWbpHQMv)grXK5y)&IR_oI8}<DZANV z+Oq%0j=XxNka)Ls`iBC|i<xS3d3*U&Y%4`g<`l{X-7?Voawt+u^&4Lu&#b8)*G|v= zdi24=onMmIchr4-S#iLwqmSpIci=xC*J&cZU+pjd$t>%6<p(%E8I7msS#zpPe`d_5 zA(WX{T#}fRlbYh3pIeZhmzq~HUD1S3Q_9rDM8QBIh)dteDZfG?+CafT!N}55!Q9+p z`o|<DZ)Q^y)9HZ~oIY|Akx^O_3=4PeWS!x6F7(3pGo~R0C)ro=voK6M&c_M1P~5~+ z!9XEDDT~X-hD+ZkH7~s+L&4O<0=#@oz!Yiun4zhu*>wICCV3%K6HAEw!M=&b*$Sqn z2Gbo<n5^sfc85p1&wIc6|H8@hjE!HPyVL$Y>Uq)osONW#=gu@vfA`iP?(>T+!c|pP zmnWx9n&)@C<bIxi&Krx&%lztP2ad5NZ|F(Qkvk@Ktf7*lkwGzzN##o&Ba@0lLW^wA z#$H}OC!zcCZ*T41qAGWfL$c?`+bddG*VnCz{T<!XU%!9Vt@_<NXUg=8?LX4MwSZ{_ zgH{8VM_@wTL+-+gA3uu4<ZP-A9s2vzRqUCZ-ks_XGum$c?$6j^ZEj!uUa{qTn*4-< z@Bik`wB*=szuUYvUCimjxw|WG8*g7`-)tbc$Jnscx*%KX(2tY?lY-OscAN*z%?#i0 z^ZY!fSmAz*t?dtUT>Ss~2Oa4NH}2X$`BWjhj&b+q`_Dc^yv^HuHgl6zPulE*DR19y zE?{tBdSuTKz!<_H>cF~0OW~OO63KrG2S2cLw%L0qFfRRbndvmt@p~R{DKN%=U_A70 zA;dQ}>a34?8vGYq?fdm=_3!WR@9!$j&dJG1Nl7Uv*dWgzQV%jSps^zSfN<T8aLbrQ zhhLUhwH(%yF?+b7sQqY?VR8G(lvl!hi!Ww8=(~6C-n@D9@*ci;_3G7=zP`S`Z{NO| zy}R(TBx>!pR_lbm^($9;F1~0|&>ppR-TL+GSFc{ZcJ11gD_5>tx3BWE+FbS+eFk~E z8jdU7-yM%VcV-3os9rR}v9W-mDvWVKG>b!cjX*(SVq!^239IY8=xf{0z4<?R&z1if ze_qDN-21-Pc%}YRnVOep7(M>%_;j~^?XRQW>3p@?&kuN8w*PxxymEhL<>%e10nZek z{PDbZkoi^lf9a5uZHL<b{kv8F=f|;o(>L+gY5#ukE_;8)^JmribM1b-t>4UEA3Oce z9jiXx#h?%qn9udbfvN8ES@X-6FVD80qd(vN&!#^g=FjuL8~pG6|NP8T@=urToARA8 zr7rs4!TQ~Q{_hQ&_G$U^d+bb`jOweu+OFdXvHWpZ`u)GNS4Ei47PrT1dRFfJ^Spje z`Gci*4%bI+`u_D(`TrMh{^igAoA7ylJ;(bFP|7>7Ei7TVpun;}$BrN0o^s;edcAw) zn_pZv@BSVtIzLa-=klL#%S9vEvpk-y*YdW@(>ar8{qb>E^Y4s}s~*X`U8>xh`9E&v z*8R^;{d@JOdv1FD(p&#ezv}*9xcSMJZ4Vw#Q?_4y>Q;R1(=A~Wua*3G+Z7!BDWD=a zgh904fpyz@ChM+-2K$H?n^K#fZtTi``*FtYHQ`^k&Hk&WKL34T`OW+-5qi88IVQ&+ zzRKOC@oNt6mn%<lE=8QL{^eWn>dTi*ou6vU+m_sQ>-}k?+ia)>&Poj~tYv(R2Y>Di zy(TZqUHN^t=(AwCerFpK*=@UC?b}>?&Tm>~Ny)YPuP3c@wIrlYl<c0%`|Oe0=g|J+ zyvxJV^F#07Oj|uErpWT@vL><9reWg3;M}=@>5}LTOO`v6cG`b*h=|?$^RA})uDXkP zYlWXj%j_*(_NVN%@A7W*zYSGV-kw`EuRnRQNOgD4E2+npt1mMw*PFii*p%?w<$Tk0 z4`z06U2|?peL-7u=pDOdfsou47Lw2|AP`o!?#GYWb6yrj`fscM<K|oB`JT1^w$8rl z&90HTR=1P$3wKncYpO)8xz1R?C$4$(`HMBLPB$@a3F{7xyjXtfSnR7!tMVm`j;?)s z<4Z$#-s!@(5v(5$1~P^?>|(NRX_&p|W1{ZgyXWS7n_ORCZ2a`^vc0k2iV8g);?~D< z*IhKrF5SI%+3kx7#otSBy~_VG_tI^t1xqgHu6$*^c<YC)U%s`y-aCJm1^=qcx#H$q zgD)@pa@XkHjaW}L@A<Vi&bY00V~+OH*4AFV`s&-Z4Lfh8U$3`QjWK%>x;r=F!B3O^ zwTqZmFswh|r=XBi9dB2E@56&b+x~t1+tPJ9dh(3J*GsL}OZchY`*ZVtxJvxXv(hib z|GnBZrz}0cedof90g>qet9*`@rd4kKs+F+u+?@4Wr|rC}_o2otiYxRPQ-AvmOEvfM zor=!+!QO8i_J|wHigHAJ^I?j*S{=V|2TynT+ndo>5~gTP+4^g4?55ak8Ke4})|M$- zFB$VY?R~Xr&X;EUU$@^E$W}eQ+5h2;+eT1%yk_MAKZOTf`L&JHucoA=%!znDapp`; zeU^yei=p~v(O#0a53e#CO#goURQdnur{Dk2{>r{Tf7geJTF>LBw8!cG+rD4B@^!Cv z{{PjV(od$oms{~KwC;8Oy0ZTZ&xT#ht6#g)@aZ8Hg*yulM{yU|^G#>H<hOn8t%_|I zW465NEx*wE^+v-ouX)oF8J_qTnH;kBz802$)-5CYzGcwHGU+F)N-NWs%-VQ9PsV!z z(~1LHTt{pf6WNbw_1{|`qII3~fba*WZC9hJ)9NbkbM|g^iSbF@_aojbVgB!S{nPe; zE_=(@|9Sg0KIKK9*tb9bHvN0hI_+<!dHM3N|Djo5>+Pd<FJJPRU)L;k{^G^w)-33D zI{0h#tJ4d+JrV_G|32~Rf^7Yo_J#!JcXh^_H*C6_@aUiK<2QL4T#>EsPpJNNKECSS z_UiBNY)|)@-%p9TTf61c&BsYvi@&{C7cMbvV#E1qyxt3#>ZL;z-f?oQ-xKGnRIxm> ztZZ8e$Ft|pjg|AZnq5EF{#3iP_IaW>bNrdN=dym^m4Ckc-_6!|`OKeJzwWy~@9p1* z%YTKRFaIB1`F!JMUVGo&KmRWY`*(EVtMI;%_j+$EE@kasxc%yVlayfb6*m{IH+-^? zJ7h`a32v=Ixqy)A-rKax>H|ymPD;CTz~s&Whu3lY7MibCjhw7jnp(PgqE2Pd^7jvS zHL&!^$k@2ECarV0BP_7*$A-3y58HA(Sy-lP?m1cAyG$jnsZ?ibTd<z^{(_~4!#>7) z)o<MW=l&_4_P)|Le%IBXmHm68e0HMzog4r4McMhn_x}#OS{|ew|MS7K_<!r_e^tB2 z${&adn7ek-p&6cc7y3=#d#Ga7)gtFdcQXz5hA|&o<L3P>jE6@;o4dHL$ldSZsyi35 z6S}&lS<RZaIN){oug!T^oi|_DaM5jA!HcU)x3EpQE>ZD<pXbJvR?E!H%nM;veu=-k z&Pv=`ecJ2k%$YG?ODYqWUflX=mOys();ZJat!Ay$xa{zF<`lV286O|6c_w{Bg7NgF zieSC9Jso@2E∈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�>_cm zjW=Fze|@0(1JnD%CwK3jyxCi@+9ttsLc#mIx1I-E{A^^|bog4!r&rFeUFr9K$M2iX zm13Vc{BGUszq<0lzsoP3R@}(1*Zy<0?z)6j%>A0G-*WwPWA4oT^Sb5m$^(y?E7#4K z(z*TCyqbT?AB-Y?-{hX*k@WuLyE|2ZI+Fb#V;<g}_vf+7jpsA{E1nrV>#EiYJ93L_ z2WPUqbKId5=cWHlt-H1Ls#)&m&?u4fTUwkaZ@la(!us#-F_U*ElH<0=MqSvsHq+dr zKJa&>|4We**W2ujKC21@W*U`8dtQEf?7{EzdZ}B^uX$i7oOs9k;;EN^{yZ|&-F2Du z`{iw`Uf%f9+nErx;$KKqTJaWfLH@`EO8Ey_CkGnsd=wnMrNVjNo}K@TGxcrCB&Rn{ zw(Z>PG5gqq%Z?8#OnLnr6~fp)Oq^+UmizIvcWZyt`vxwYG4I@3$uGaGck?W_DONnN zX3KUC)ya*^wD+^b$ji*Oo7$%D`SH)56SK=A*G}K9rGGoElY95AH?Oi%XQ}DS?_)7) zsIT#3S;#k|r?mc{rHxMDzy5164@xh7I8l1_Hk03?OK%TMsQJ8V%f8JoUiz8@uf6zz zrQ^~+h5aV4#LKSLztZ__(x~%1PxwR7LcV!-X6=<`f6%gZ_NpqYX~$XrPAXp@z{git z99w^H?^L@xmwnncF<-wJ^?Q5TwHwVZtLryZMb+*3SyI?`E92GGn+Y8`n{S_$T6{^z z!(~0EdcMh)2^Q|%w`Z6boAw4){J5Q0l)iZ{v$IFSdWpq-kpe9X)=#K^`Jz6v=dK>} zOx@4du4IVq2-ug=;CNzE#`%9Ki~i0(b^Mk76-%i^5tRkp!S<IooZa5$wlcVN&Zik0 zQXU9e?3ueeRK@2=;{Mg?+f;Tb_+_7VYV-L}uqyh-uCv}I-Pc`w4k>Z2{vUQo<9MFZ z!)4J6GZ*I+ew<NLd1z)(*8PLYrlR!)5>9ouX9&47T50-CdDh8Rx%1VwbB3p;eOqww z;jLY-yxbXn9!LnD!Ronwe}xq1yZ<Ju&FW32#Tq3`$7lM)1YFr_KaE@FPt)!gt4*E~ z&&sB0mL&grclSVHYhQEB-RIpWxBfTZD|^z#uX#t(wA&`x(@MW@>SmY~5cTeNN6%mH zDfK4=R3;s`U$35Jd9Z+E(b{+1n{)3i$aNRd(Fn3$CH(h|>x7j);d;ssZdfkvwY?@8 zc*!p@g=ur&N`@CKk3!G)%oI7SH{r~be&+AZ=^V?~cNnitw)!S~Yvq-c<w0MkG2IkM zaSYCI*`a!RcFCMAnY?N29Il^#{Avq(G3V~B9cO><sDH`(ukBy(y*xgTb-RmN4VTSy z^%iO|PC9q5A&4dEj=lYRW}&yUR-Bn~;{T*cir=SCyFUF)XYs!E9m*2i4Ifvu+18!Y zb@t2pcJ2KR!!R8V_U{amoVxC}StWcw37tC0&2G&Ur|EJ1%4Vl%j&+esVj8Bo{F%R9 zd_NP5P~(UCn(ET}(%pM@)ct<<>d{}Fc*Yb*(fvxC^9)S89zFWLyZiNb@%PjB-&vrt zZe83S2FDLG(j`8L^8JvGxD)8{T0Zl++Xdcg{*5+k%$JoelW&YjE}Srb)lKt+NwNX= zHfKH)<nXT8v0k<0+j{NI#f)aJvkKlbdnE1Kw(QKW8xL&OYWxbYSs+p0qqw$mK|%lf zg(uys^7@`#*%5Hb`Ta*byL;bne_hLM+NP7THSx==%+~E33wtI@oJgMbMO3)$Nlo~U zN4$$puTfw)*Z6bwh0ZVM;^z8%xH@M-=z&E~cAVcM^t4i8;TOq8f3BT+I#W-sK(p@2 zl-<d*ck4!94Opb2v0}@TmVl|+$%psVZ>n0L)BW3B@xXM^CfP^_&gaLv{QQg;2kEp- z%1g?>FMj;;qedOZKQ*tFw%<<tDspMt_K;NbpVwY;91FcDXmWV{#d!~uSD&!jpm#sP z>F7jX5$C1z9FDT3-hB{Q_FAWf-<dZx(nh>7J#M+d0^WzSF0JFuo?s=zyfgWyQT>ao z#~13Ezp=eyzpnD*>*3DtH{W$e*fffZXfNUUTP}M+HNX8*L>IG(m+Ovq*$o20q0L_H zmu~OunH!z^>ttxC6KC|KCkeV+*Kw)1nLO24`#S4(aCyrH#(?CHZJQG;`kn>*xm=mI z@DO{$tF~RNyW%r)m*(_dpCbHdvAJAWFkj@lIsc#M)?en=h*^`>T=8H*&Uv52w#eCW z&kil}k_f-QwuIBr(P!#Co(`df9!E@a=0=o69%SC=!~1leuKSJ2j5-Wc3!Jle&VDPk zde)1I^w!rco@@J#OP<hsdz!()*idLjf?di(hwxb?S2yQ`&2^n|PD3&ML?+v^1|d(+ zQwJK?u4m*4ykS&tZC?GPwvl1huiv(Yk{b;*TTeuHDv6hTFUv@H@WeUrZZg-QscE5s z?gtt!AGKN3(7$`xBFAaLRZZ0i*}sJ>f_E-*XHIYT^ZKOH5+Qo5EnPPz`Q^gfQbm@& zx%@uwzdepn>yI$`w&q&q#Thq$NN*|-c~m>!r-WtRMn6U71*Lmt*6()ITJ|JCw!U%K zwC|a*&$lJ4OrN^o;DRMJvVm@mb1vlG+A>#_!={1b+d_{X+2cF~&fW{TS*EOyRSFc? zb+~z+uxYi(6jzn!R@)i4(*sWB-rZSh6eM918yn6q;I+c6SLA*)v)jS&&r_8*zRlt0 zKFP1E{A0tq^i3yEEtFoF@FcfBX0;6C2U(Lt28|~S#d*$Nzw-3h-bE{J1~ji(KlRT0 z)ic?@x#;{f`~1e==hm%Sb}Jr*WY>?~wQmJ3SKEBqy4<DZQ$<VOy0}Gx3QK}KZ)`sn z+2nKZzr5OG%}h(h-p_(d%49#zi^$#cRdMU|S??w&U6>%eLZ6vkS>J;@VvcJ-dUXBI zWGR=^Ta1~H%+hUfK7Cia)nJLJ-p@G2JNL~NNdA7B_2>8<rvmHNU)!4(bGmG>kd*lG z@K@SJWurG-UHJ@hrABANZ$I74Z|}YNxJXb@8JpVuW!paGJilGdHEC*{stL!rLmux8 zO)}?O&Az|8WM37d>&J)7j{cG7YnbbzGPx$Tw7zxWioE`mzX=Xik#Wv-g#p(VtWJvB zGkf~xK8I%J9UHF8>~&QWkZEst{_8q_fJD-@j=xH8y$%%c*7h>U?f)dSqAB9dA~zBH z^b&zZ%m?F*t#r;Tyk+Z=u+GXoWGXX@$TG9q^StY}vEATny(QwF#Oq;k$?R*|UB|{5 zY<pvuE;qDpIJ76Grsf`Ffzydwch4`|!Ls`QznEq-CZ8QIOdsE2uV2vo;fwr{1^LN} zmo6Omzh98Mx{t5^Kij7=ODS-JZn~R0zbLZ_?0Uv<_zIm1%%uV>0uQv!mu{S!_Q;~} z%FBZ%OA-VpT?km>95iii{C!rjB_8b?@1_+gc6{HrFJJu1?TRbbv-iaKJzH+`Q9@PI zcjoq(YD0A=1ARUXPo{Ue#_vywyG(eg(;NK1e^KDosC8FLjxD|sUS3o_d9_p(BX_WU z&+_{D)AQBTPoKQb*(|-{_%7y1mqP|$!*-v%n*J));QO(~Ez3L0H)xm7^Kd#Ov|0bV zou8dgM*OJ>)jk4xix#M-PH~yra#=DtNh9%4t!e5%S)ZSN0Rs7Tr`V)|^TiIFTxtC( zRWCe#-SW)}A5Ux6ygQ@6qDuSo-kg%iD;5RDyh;1D>dmL#**S5l&WGb~+GLka{&9;p z?U(S=n9x-j1qr$R>&rGVKIXcy;f_|h_^hpW!&im|-@5%S@L#}}r_TdjDke3^h5fsK zFLsW8+~2>y9{oA8=3Cm^KRty)T_WLUqpzRstvOTfCT%LfeEp+Ap8kc(ed}j?nO%E7 z=V!F`9Y$+~mAR$o>-jHib=qpYjQ3C4>u1+e=S4@$lx#e>aO#@SzlYd@rCC2;PFV0w z$JcWf*JAlZ8;6^AfnxSIOnLJE<c3Dh*<WwH%#hzhqI`8+gU^+n?Uz#)NcBYb`f`8% zrn8~&y^esf=cDvH65VAN4UIk=s?GJ~E%(SNs?B}uc&qfg#f+8FQ>WLPn-zt&C6~>d zT_5_cWa0jIb8m=WH9fMrS3s;)Wx+)Qr<BBV9j*HLOV2&s+Ub5fcTOYkj@7-+KcC(_ zvb(ABojf1=rogFZPI#RQyt?r53;~rMt5inOk~2!2jCL8~3mqLE{EV*M+i+km{~jJ~ z2IoYdzegpUf*Q)t+}f<Ax_PeB+4@-HvRs!=j_OUFVfnGiyDx4(<+33#)I3_IWZ(Cm zR8OI$8K(sNEe}}=WrTg6ys|1ZQ$^}=oN=0BqB?sDBXjBEyf=$3=!-nq@-8Mn?Yaj) zKcD2C>_u0$ux}PR`}61rK5xYhTdjB9O$=FhxZs9Ydzt#it&Ao7Q}br6Yi2VvX?Rf2 z_h;>?{DKuR$+!ERUnI%gis!NX5h-$Zo6ftBEt_o({C2AMZ*KgVe&9(%jECZR^=3Vt zy8p$MLA_4KEgcEAMgmG7;*}G5E!XeK{Nh(Hy|ht9iLrm)J{_ft6Hl+N<1me9;TQaH zlXLMaw*N70Oi$juTE0ensS3l6zb${`_R6Ymt8bWSz{?&otM6&VISm$Gqqwew=82)1 z!I^14d4BC$QM#<4_lVkV{U?6w3+@ReCv_T@9huQ2r#Lm)j&p~Cqx<LjmrBm-`_dc} z)>=HX&3zc*_MxqR!j2+S?e+f~LwNsOC}LC%oY8Y})xnAH)^1nczG~IReFlmB4CTSH z?EkYw=J?g~s_0Lj-d&#T#^IcBX`gZ8*CMXcX^TazFH93-IonX3rlV+5)Kjr)wVB7# z&Br`k8U*v!2<C9?KD1y<wt>Q#Z@X;Mj_lXzI=J8VZo+frU5-&)*6iU=_g!o?u3y)! z?{@IpHL(w|oR_up<({P(^clM_M0m7F%wk%_m0*8x=f;)?^@r|HUHjPAzwvs1n4xR< zGqtE9^XT$l=cf22t9dXxx&Da}Zc%x4?UsjWc%<%GQ$KIxZ?YH8{7GCLwbT7CV`-UB zk{G|>$N6_2F&zrIE1`IcmEnp<q`l+RShb>kr>2~Iw$|PH{8x`pjzU@HVb$RqqQ1^& zPzVW9dSu^xVDr(R$1m2OIlw9WhVh%8!Q&g{ou?gL`NIzihMT=S-l2WXXzj{l@~i<o z{bpjeno>6VAN`Q@?CzFVS$i+}6(=*hz~U<nFaAg0_+=>3YpU_@f#yZ;ubf}+mp>E> z;^E3rymRKf;7@~RKcuZ?mfv1?BuygMpkc!`>DUuC`;XfONWSt-JS-WuBmOvpUuo&G z$y?&n<kqt{v$4DuS@X7P&6{~S=T|=4b)5N6{S9Z$Rd<gpZJM+Dd|j!Y)%4!P{U0ag zyimLFrFLD)+bgTDM1?wwTvxk1?Wl6Tc(&=szq=RNU)ZL8`sDuGpB$cmi+n~)(B37H z?aLhb=d&_f8bDTQZjW~7cV%G$T~POhQF!}SZ~psCjE38%`teU@Vlp+He(*NG@OIlk z{-qqu7A6MM!JD~_x!{|*ji(>5=GUqRoh%u>Q?Ty(`Uj8m<SS0>oG_<#W5Z_0ZQW%T z6+9brn{6yQXR-ONJy1B|?(~1(>XZYgr5xWCF`dEeT<;v?KhI`M_e(9G;FQcO`M*~; z;HYWj1DzdujaQu}3%L};TVy24s9u>;m?P0#zwm-o|EvsyLtB?k2ySIqI-$6b(=z2$ z{ft#T!e1@h%GG>yDvpGG;D}nWdZFr*ppPEeCv<PFNOUsWv-jcKDO$_KIj5X_uQEqu z|7E7Y&)btlCoPQAYz)cDh!CFIcF;7r@ku#{x@mt@>w#$>gI0LkZJjE0ViG?amuB)! zQG=9k)}{tOcSrH*aB}Cg2<t3$R2Mre>)q(x^rU`S<LbrN4DJev-N-tivWGj$>)7Ws zkrqycMAbt_k4r50Hl0Z@@S8A?Udut(!l275B>l8XwoNH$YGjjHDmg9Y;|Uq(HDPOh zmT=EH!Jd6#4zIeY#?H#w4_yB8`B|JiA;e}Jm(k#_$kCO!q3Gz0HsLk56Jm5*4ceSM z15PDecRKmL-a~^&NOFpH(BDALr72R8>lTK5bk`L*er$o4Z^Z6Et_WVaK)$IpmOG*w zx&16cbpLVmtUf89x#FDjVj(Rt3nTONwjY|G6Y}TG2)1M`{vmR{cX`eMow8+W^(@6w zKXP^YI_!%+rPZ74U9J2%m0Kt0!4A>(bJy8g3#1>*6ci^duWt#Lo};k*O@+hWIdg8a zxu5i`5j!()vXx4KngzRorL{D#{=Xj<e20HNefp%z#OD8>UsY9quYaHZUy`?9Ej<5t zxc*(|%c~!rKdgV)U;p!$BoiCy{X6;eH($|sw`59kV{P$655MSV5mIe)+c$4Eu;D*^ zezN#v0~@~ke_#LIeLnngy++`Ee*1qGhwlH&3Ro>@AXq3;VXVIAuIyA(t?6I0PHd9u zKYW_)LU4sx+x>qZ{WmBcl5~11Bl&0dpFa-|ul{{3?V`pz?E_8?M^8OapM3iDN<RMt zuR|+dZc$g@p8k`y<K>%=+-Icb#rfW|kxwp7toZfAQzEXXem~#(FvjYtk9jurQguxq zK0f`beq_r^JHFG)Pd;C5p1gnQ=IH%>_xJ6uF!^cg)7awOu$LucUR+F~p5Cu3D|zi6 zuJtRrezbY5e7x<Iu#ThN+a|H-Jk&iT#OXFk$FQ4SR-%93xtZqg*B}4*=kw#jP2Gn# z9^*CR&GSqya@VvBi-<1j?Ff#)`b0Qw-~9TRV?v*E?;Thx7ULnN_^$5J8lJYx5|=y` zJ6RXJcb@Z*Gf85*&3=cn44eH9O&5Q%GO29;DWhWNHsN-A<*fHc=eH%r&0e{$r*GNY z*n-M6%AF=nvltl}7;E1?I2C;G2ut?qc`K?PHbo`NvvA*a+^}S>K+LDut25tcy*z%a zKi58fU%hDgTG#cHS>~l^L<ekkW!>x&?Gn1_TJwXy?Zv6jgeHf}6uX+ZpTBZjqv-V1 z?>(AVmEztDvd*-V780<L`pBnw@S6Ifq60NEG#4FOcuPsqda+h7>sFCfUM=_b`0?(W z&F_6raot*;bD35<W-zkeK6N;3PS(-82U0vU>mGi6Z8OEO-sF4C*M$3<ckc_Ae^b5L z<JHywjJ3SJ-d~KObkA>^y5xnfyQhfu<*K}^%thTgO#v&8evFgh)N9WYQr&rETG_?q zQ`5KAE{T`4=Drud^qOt5D|goAw@-vbudKg)^6Uq#{>{5DS5GX>FZ|1JbIDTco^@{* z_N=q*zEb7kwm7=?nXGQT(S`-GK}WhHt))$KGvsbDa`rlHS&*Ud>ChG4DGA|U9=u4r zVJ2`ZPk7fYzKcbv1^v@HvJDqX+}Dp<ccqG5<Ncew%Ij|ymSpX<$ebItR$M(dwy-EZ zed6>Y{Vs<4stoJ7UIl*J^4w7=G(>e>(DP$cqz?bQdGibJ;h$UhB<Atg*VljR{$Kz7 z{p;8L_B@BD>&HLZ{qgG2+drNq{kZ?+)z_n{Y5VN{zdz1@_&b04{VZ#j4673-`~7wu z*bt)nYhIgD)Ye1aw>#VW|10~NG^s+~JtDMqsmo{Hg)ss*ms{t5aCdZmT^qD7eyV$T zz2twZytfT|B^{?fijLBFAf)A`C2}=-c70IbgSGF^zR2TEwl)!&wr^5eLr-4#!2_>% zT)8Xrg+a9E?%O}U^0(@5>aBhADM6^=_3q^wL0hioZ)8t;nYUuoTc@e{yVfZsW>!C1 z)AMy*P;g_k`4h8PdyB=lJQU1ROLUi2Z(H=+z52fPKGucrFW8AV-JR#Ny7}SfeaBC$ z9{l~{cKzW=mt!MtH79PAosqh`O~t?7-1~deHgje6j~jMZ+p6uZys=24fO)sxwcD2W z56zd|D(`K7tuE)U#o;67@6(Up>5r8wt-SIyaJoB;aXeP8yz<V|!s$@P*R=`vSIw8* zZS(TelGBs*)*r8ay?eD<Y}|cGlb4^K)Gx3$dsRKpplO@TU+%uF-hZ}^zR8+f^w$5= zoFt=naP@*StYuL;MoNczmCkPekh53mP<zM{<))_Y>0ef8PTI!XAXD(%BT{+cva*CT zqBFFclo!3{6rIW3Br@%ikkY>GYO{5Ud0dK^mAGvegm3npw$gn;mR4ZyNuw!?PO+W# zu-;Rjx~K5lv1e`*uLR`gZs3`!tZ_+W+BOH52~)W8A8E<nGhxb4b$KQ2I?LsjgWyHw z7Y~1*-KzJ+AuavV*0)~0MJ%TuoY;~g`K2gB*F54GM`CD=_)@(cS}%$%^B=8}J!tYT z(oA2m>BXV%CO5b*%N))OU_KpmO!$A+TtBJvX<Zvaztn4VAJEFMclr56=HaqH@v03o z>pkof7tMU#cq?kU5%2a_^Yi^A&+SrDRX(8qWyOKzTQ46k7jv$OXIf(L=y#h|VBbOx zXU4b}3lA*6mVaQv8~dP$A9})zB7cg7_*yR8<Y6-B>i3g=9)jyFbpo<qC?`m=7=DYt zw?IMT=aip$Vt4bu)X#XlajH@ci)&UR(_1&e|Iea=ZyuPS{KR@zU4OK~Bl+glc}`C_ zQjHHruGY&k){=VtvQDaCF<bN(dCR*i7Rs!C!TGs9Kb^zyaQ%j=#T^Xud$0Z${A90~ zwq@z7yZhgm*`@YcxU-ylWzV=T@QA&`7T!v8`Ge`p<`+$`F+bRPZM&crdtaLD1fKY> zysLLA-DC)O8vKs2#DOd7-qKgL=3Dki*GYwo-}_z9cTM8N^hQ5^VMep*2SKf^?~(jz zEYl@3`O~I9dM_q4-7tgyC8Nc3flrJ{jF!_UI`WH6pOVQR#m6U-HG4XP)1BgXXDu&H zo&G12zoS0Vn4QtGz?J`eqq3HPIOFQ43JD#*8W)QsSj`L2no@53>`eEW`CaE)ydSLo zTxqr}j_30pU%};_r>A(iaE7_OHEP|nldF8DQRL~6fXSLXSDm<-GIYKey_I{k<ig2A zzUpxkcV(~ZetYchGKPJ9|GRZq#V@z{$cI<W{h!#T(0J9Terw?4N0qYYz2_|HnU&Xl zcH50wpS>ALMTSo_kM9fUtLar)ey=}$?vC9u9SjTR9j_PGdzNQ#u`2M~pP7933oq~V z<9fq&OqzAF0`EhE{1~YZxdKt46Y4?><dT%Cro2sdbXnT9SEA8D=AO6aZYP1$x57(f zS?wl8unHVFaZ1CcC7_<`@`fp)Om}AQS(!9L(~d(cRH)m0#RvX?xNUdVEqtMynyhso z@dR7r^Oi)`rkjVihjnWAzgf&Z<E6GK$F2u<DUbHM)^}}Ny@*xPOO)e3$CG7G6kHUp zUYt~HXtBa!o=Ws71B>Segq#-6TD7#{$dc6$j$Xa~@_4&``u6a2c{_jWFZI<THLGi0 zf7n?zuQ1`}CYQZ?WfoTN-oZL!s_>n->+9ZKJ{kIG-DczLd#j`8?fm{|jhOp}jHj|u z_H(^ezgkUK@hxdT$M2f!H6=)c!Pa$=Pt$=2er`5{4gKFTr*Qb3>iwElRbBe`<EuaB zAyq2PVKc8u9NFNx-%2zkaMP9jap~;}^#Pt6k0mVZ6%*ckvF(yqU|3MgLII6k;YW)t zj|-M2XKsCJ&3R)&|Ax)l{=4Op9?NaA*!uhLp{;^4G7l!ZTTjUo-u-g6)Qk7GEiQ9c zc-H5(D0&52E)46+Q<mwwRnWvKSknHYv`O9}|LW$q1#PJk-z*zFyPWsu%zUSpe!2bg z>)rK{?W}#xd7BT&ZFw0w{ld@N`||oV{_JPvR$MjL{Jp_(hAU;yZajYGqQBDI|MQ`{ zOZ|0yTpK#|zt7mmsc+bN*xyp|ep=+No-U&ub)8|iH`UJjQLtb_&Hcb-oJ`#Y8R?Hd zWzAul?^yh7o^Sv8rUQm%%zYbo7WdrWWwLc1`(@j8i>BA-^7GVxdwpY9yRP4z)z)u6 zJUlqVSKf(3?~1406DH$xZ8s*)Fqju$D(|;{PHo+e-TU4eJudvQHf_!0-CJ+3z4~(1 z;X>vI;eD%xJLdOfSVkO?nP^-bvCVJeCh?~$U3RzU=0#~3-(DGCQJHmLJg-Fbx$EjL z^XDAlzVRaL9LsE@{H*WRuSDw$u3zlt{rG-;OT7R8``7pi)c-aI&c4(x(DHfmlJh+~ z|0weD^svsDbw9Yy>wk8*aG6Ze>KCt1gsF!K`bjRZo8Y$T%>CUL=WS;BzjyNyfj8Qx zue`ioF1)#5|Er(dURe6@I4%<^nCs&&TxyULd{98?1>eQh2~Hc{pLP_>*V>@6?{r>m zc~8ZTJ$wJXUgmuK_`~h5cJ$RB$V_5jn=1BNr0h6n#5(7sY1ump@@Fo6*6wbcB$L+m z%}?t6?XZ`Z{XR^+z<y$jP?havxrOpPw?(X49{h8RJ+)5Ato85xDKlB#8oE4ua^B<T z>}r91Yw!R6Boti=F1y4nEffqC@{_U@knT1xHa436Fql(oyH`GcEhFQ??I#NOS()nt zx6J+8b3i?KjXbaZdiTTKAHV*+n|4Y*qhaQ!U5wVdn8bf{{j{>%)ihzkzq^0m-dwsT zW{Im+Gi$^h4sk&hhhM2_XIy5f9P6JsfxAU&nQ5F&+|{Is$6u#S{GW2FZ`&!>Wre$A zVglSwy3RMuuG?t;%Kc!1{FI}|In`3+IA;hS{82C9xJhBs;{6u8fAn}Bz4_wMr2q09 z`BS{v>%w<h9LRrq>EQV;5uq2C9eso(@9IDOYO?;GJjdAwM^)y|DDKdjtoic^YfzC^ zP*cO2Rc|Uy^QHcsdHpT&+tza%b|mm@WN}IL-x@n%;Z&z|vmD0D{}!;Rwp{7%KeMHF z%_+-MTmCYrDc0v*YdrnBee-8&?-?Zun<81PibA)ysv7^4eW3N}^$y?0@+OnH$=9TR z{?)uTMdhdV%}J;FpX;m*KkajGPglK8FW(d0`CTD0OsW$r4>Rd^A1T_-He-Lb#MasI z1qRk$Jip%X=tSL+zPx~S4bSJtT8Hg=ZSK!&c(abxZ?8d)nNGWXeSdrT^uwo*%fHXh zlWQ+m=+O;b&g^U0?QEVJ&i{}hzSHIS`T41dTZ}U|vIiDKi%(tsEGnKe;_xl=eawe8 zFVKuJRI+hU3_Wz~QJ&@e)6rYsHknTrVO1_QYfx1C7gc05Isf_O61~u+U5A4XDoN(2 z+_2cX^5|v@g(*Ul?Yh4yWY_11G|ySUUp6QGp~Ui=!n5yQbrI^{&KVi*`}pG5tD>ti zw?z7~&q@lLoOjB|+dTUO>#9o=`ndk(wv{q0*rNYK_WSJFobSxbG<d9D2K<<O@wkK6 zJkKKiBd2{sy{2W(RzID?ck)d1H_uJ=-Mb%7*n0WxyJM`LQ=F{s^L*6l{QYl(e7))+ z;UCjF>*u%`G$n7GY}4ZW!n2}y!Sl^4!UVfj_?*qW7B%NgZ(+U?CM0`h&xzMEoboP# z-syXEq|1e08H*)F2yMCd#C6|6h5oOTIF^Z(zq0YGW)AQWTE#Wvptj>ZZthh7YJTCV z_Ma=0J4&`09hE#H@T7r1TD#4WW4o8@4vG4t9W#6r{vC-^zqe@fArtl_=N(aJ<9Y;> zZcb}k>U_kZ@SYyi*VBjQ{n?R_pnc$+xl?<6@{vUc_7?JTwb&g})@HP6cyDm)d&tDd z27z~Oxl`F#DsnYv$g*XJ&F8zlD*x^g0q41GAM$5Et(+0M&~xstP_?&5682n5kPdPT z3wgRIpk9GVcXGvFiC^)T^{&PX+){nL`&+E?UWKsBAFtkEPp+w5EN9jECG^PRegFUQ zefItAXLBt1^bu`Ix%2Exoob(TreA)rZvh*plemu6I}_FRh{<Y=(&{ga&*zI)l-uvx z>hZxKVl&(QMDCrR^b&6NS?WEM@Y|c!m#}tDw{?A?%$NW5*^Bs>*mf>D&)a%Ly`kY< zTkZ7}gHM&mrSCjBy4f+$q)p%P<=gt%(;3(|FS^EXdCh_i;Zt=o8%}Gbo?a5OXWgqa z3qlKK7hWp8Cav<M!OhG0{j~cA-3{N`Of)#IKYOy{5Nr3r9P_I=e2ylmXZzki-`sw@ zef7qr9pw_6BAu;1^`+Kxv47}VV^tI9Q+#IW0o|XS1ul<*St9Bdag{w-Dfa24chpJs zl^f^njnX?U`Gx)c29JuRn-0u4-~LckQqE_xWz^-CY^Hq{=X)9N2UjOVi!sek$z|j% zVlJC?Gue*4B+%(%`q_w`jBy(seqLH8ksR@=<~;w^n>&{6`)GLQn5Durulh?04HFEa zqJ<_N>OVZceVKCQho}=<3|!W%_RU@{JSXIx__8AZ-7;@%*UN`9zfrPU_wLYvUl+d5 zUBjlswP(lAvV1xHeLZ!Dk{uVXet2V(icDL6jBrU!cG63xEwP*>7s~FNcl<8h7W1Sv zM&yvfr0ByJ=3W0(oOO?3-Dc0;rT+y!*KZa%&)Ry{smb^0<^2yU|4lnt7Fv67_M$bu zvWILQ?33_{d(v*H*5Ug{$N2u)L*)kEYd?LB)H<cK`9xBFNVA?n$k%>r%i{;4KN}P( z^Kb|>t&p^v7WL%V`?nvy)qUx9m2RJzaIG!x(6+^ndJR+UN*=f=OmW$>Sm0uV&_w?; zzxNc?GfSNCQ(1jfPV&x*UF{YD;wpb#w`oMjw}1a!Gg12J#9C4JGt(vi{aKV{e(uRj zt9$!xw`Uw?w4P%2MKY-+qG-e4MBYaS3{0%Nqy>&vsT2gSNsnm1I;F7wyTP6xM*G<A ze>{BCv_{|j@af~PKNgg<wRh?47qhycu{r8q@2zE`;v4F{wBK)taFY3<$WpWV=;U9F zOlDhLPo2}}KE%Mxc<J2Zr_G90jMb3~J{^8;l3%vCs#)dZq^|}V?6s$w%V&o^NP6SN z`aXHPb;n;v`>X~vyB&)kulgu5$7fIO<DBF1Y!@Xi?TVOu@Wb-W(%e`1o6UmuGVh)G zhOZ%dQ+WgHUCZDS|N37=$GtAd+6n(vSy9ta85k$Ac*V&YQ_<h+J#SR;?x{KXdYPea z!CHT%!|%D@v<K|BmUY=NQ#)8)@Q!0l+s5fTPH;2k+H`!McQx@%YwfMidg8@*yH*=t zkAAY%e2rtA#9`U#(*wk+8yEjg;NmmO+Wspb)_UjU!#oDrKIRFlkI699Yxll9aA~Q_ zzggamZN7S{elN=AA9`7xC|B!N9oHn#Kk>t3{kJ*)jvTxo`t<9<{Dpt+ZD2d)EdS?3 z^UWzOa$En$m6o4-oTq%<rb{RL#@$niKhjRU{t>PDo*^PIj(u95YGk>#=i{&k!ST}` zicL>l>>Zig+bYxJSQsvUSnS<9-t77ZdYlKWWu^<c@F=X9oMYM9*gNsqo!7UIfBvj{ z$Cl^5N33kUbg}G#ZAY#qvgS)JkG+@F{KHo={jXO1nr9BTSLTQno@x7(|NMF4o%rr0 z6&GBBv@)8)Z!rta-dxa=m~yH2<@agEm-*6GPHnUEE=zsG`zui50;}Ai8_wcyKQ8_D zne~68)>WbDj{X9|Oa?~N4PBUow`bSzcQe*6m}-=3D<HkVtLno#`=2JerM|vX|NAiE zN8z>i6TVIVm~lhik2hx>yW9CR(X&Ou?&mL_JMehcyq$f=S3S3HInQq{vOPwE{e{_% z3Ci~$>bBL)x%5{4(;_EpCYJ-@;X7YtGsQo;XS<wt$NvgOdqMlZzHR0fpYJY^;&z_5 z+AUYxa$WuOQ+lUk*oE(uN)^sce!_Bx>$;`$yz?UK?tjl`oAfgN*nzLXKI_?C&zFdv z&Rll=%bL_(uPl?T%nkoaAB*rVbGy60{f*c$8};3{?yPHkJGFM&O+K}Z2c}88nH5>W zQq69>3wm<kz`l)t6Kn3y{+2#{@5zLugi2eEs%fhw$^v&71=R0Z7Oi_Ubo+gSVv{#t z6+?C>Y~m~2eP-cX=jGnFesdf;<}@ea?Qy=Zx9y+y|1RB9Zzyo*kim17aOu|yHFF+L zojXnPT|>Q?Ns<Ngte;1?4$C$f_$Qygn_%G`VJG=#b$&v*?f0s()&IT+s<i+6Dk_^A zd`P%mTw-asv+s;3(-j8$>k|)Mo^gK44E{YI_lAk{IQ{X`i_tfix+=hL*uQPcYo1FB z|8$h>OBBy<jVimu8klIzq|0xVdgzX`NrmkT)zYr0?(7HkyEfQ;zcX1^K{sN0L7e-a zhPe_gxs7o<H(V{eonwBnFg5&JRG8U}g4$aiH*YxV*%>w)b=91=UYR4M&|g2nJhk6_ z`}XBiV$bi5ySb|V^r?01lQX8SJ!G>^L}Ihc%|AY=pa1XPB<pf_OXT{Qn=G07<}J+W zn(@C}<2KXYqSV!or)lhd9lU*QSxn)o;|uidUt287tTx}fWcDhXogXr1KWVnQdq6R% z|Kr2JZ?j+ce%&Q+l)r^X{^+DM(YO8Vvrg5|4d63LXnN?@og!W~b&8;L<1t=~qKIuC za<Sj@)Bm2g<uF}beb{Y-8bj_1O@#)=hKV;0#qZy1sxxgZgGaLmqr(<X`EUpK>DF(1 zY#;qjlRmBg@$~KW4%b|_MCZ-hY`o;}lE>jZSE3we&tT5-o3%~k=gB8Wl6UlrJ<`tZ z{<G0SwEk58eg20@;>S+!JohB(+eM`)+3+>Ivr@WrOD_30JFT+T)pVJ0U`=4t1<}_f zk7fi0FkSzlF3R*f{ZQws37-4Q>%X2<=&!o>^;5vz`MUhl3`UhJ7>p_{uAF|VxKI6) zK)g_8hyHI5wyQtAt7Mp`@3zu%KmT&x#|`Ztco=^~%I*7DZyy=G#xeHxlD`hW_BMVM zYqLw=d#g<OwYIhHW;vgVBe_SaPEC~l5f;J!dFA^Zsn^cCJ$}j1_9)L_Cf_<9sTJ+6 z>lsDQ+?3kDsBpP~E8!<g3(pLmgPhV&3lCMq8^y`!fB#hcTT1`>>AfnOEY5{nzMrZP zQZnbd7@PU?t+(Wq*K5~X>wcE<*{~q+)Dcy^MSWAJbb8l339^6s_3+yggWWS@`{dfL zxAi3W{;$$o%^)NB(k1Ca!R||4zk5!us@}NK_|5Z-+s<EpwCSlYW38|>46Qh(TVJ|9 zHLZ#BjY)KRLR-!KQ@tMI)g2Wssn0$Xm0jOG@60>-Hi1H4mbL88{sE%L>rYA>huNgx z39-%R%a(k3u=>!^x0COD`x)_+*ZIT!o5uo5rlsX`@G9%vFMH1?efiZvr|Kf3)o(Lb zY@PCD>cy#^{AxSyzvx@?SolfN`C~?h1)cq8c>TKg{9o<+Z)IhbmduyB&%P+Ucim;t z(^|$;p7)|Z&iS<OL8a_J&YI;q!VUVY^$hCU{6Bpz6g~G}x!!A<(8;e`WdCx6w?AUC z?p?fah5Jo!QQM`f`=2PptTmZcl*rt^($)9oi`72Ct@}1DTKVdQ*DN75iSN>xTw(uB z7MKND^*KzvJ6GZxyS#mD-#hiq|HPf&?O0a5cS6Yj4R3{iPJC>&>7m8tiLWYzb?3)# z+S_!azGGj`)ZW93F7q-?xHkXdAA!@lxdIhCtxU2%S8@nCMn#=-HDhnem}K!~@{xre zQfkYOh=tYIwSD|^bjD6Yj$=;CpEPNfbY;4R-p!8WNMK^`&0Ay<vgA;#_T+BmTdt{> z-5-B^QTNNhXWQD%tM7^W=*|D79&Bm)@I~vwN0#N%*{t;rY67AMzI_c1bg#LwBsxUO z!YFd`lhh-D^W4PQKNtKHdRehnrKV5#_Mr#Qj)X~XzA3l7G<AMzR5R!L$c1a2WsY=C z-6hsu;h?^5vFVy=4cC^j2HQ$hS*^A>w`?;ngXG*$hT|{hh%8=G^6%;aAMVGKjf0P- zo>~`D9<^v{#M#-aPuBNGov^%k#LaBY)Le<SP>+)z&&53YSR5qcJ8MR7D6?>+1f#Iu zVvR#boGvGtskyW5eVaD*@llPU>>2#oN*CBBFtrpjcZf1*Ugl!xV-+|z(@4H+aSgvJ zUrM^{e4hHL<@#Frp_jV4YTo&By_t6R?c@E6EBE|KjIh1+Vxi6y(W({o3&oc9ty--8 z(qo1~ny`B75oVDe>v~_#XmovLICsK3Hl=)X<L3rhP8YSkjusiUCmt<UQ@y%*?t)zA zxO2&(^9sd7?q<)NpK$2&Y}P9Af?(~_uE$zuT)OHJ<W?3ZS>nr46}L*_OzMTwyRS|i z=E~cjxJbYGTg1FKRw`R1GIfg;vg>C?{`N1{-Q2tJROKqAWo=Q<UiqCiVHM`fElKV( z?2}j+c1>B&EpOV!J^xLN1UAnLwlxf0uig=PdF`|rt8VAd2(&d^7#)<f@03fhMwh~o z#mncedwim2!;hY)eSc!*!dW&c=+BaVf8_D%+s|XSO!s`WPW?4+*K4tjn_g^c*rtE@ zZhhX$*|tTuq9uOM`Ic3mQ1VA{>MOs~TiAtLOil$FzH*pu8Mesy3q$E8onuc{m0L^H znFQ>gmu&kr^!(YhH!(_P4^o9R56o^~z2uDEPQe`$6D>7Oh19zuZ#-_<+MuVtrt93E zc`M#*JriN@aA&Vpvqr;5zZ1t2Po)1*N#u0j_kKxB{oC*B`!{c$7i=3Dy8h;&ZQeC% zuc}JF@7eb#p6&3<H|xGX-JMtejp2V!?6rUS(;Zy?YFnP-wmbdx`1^mqs|t#XYZh&| z_{N7NYjgR-w2iUON1lhgDE+vaZH4x_=aFa57wp^a*Ql+sTSNcxW6$zGs<KCJmrQC1 zEZ>`SUr*_y$4re|^=UUmudd?x%renNaDU52oA1YqwoZC}Df;K9gpDo#(=YnP^X}-p zJbUuSDU~8>tf7m1o=wn-7rEKbem(MP!WM(@b<qm->#9o~`qrP*s@BPjizvukd`sk2 zMZ&4Ah29gZL_Thb$uWA<n|}G?$wez?z1#XJ{O|nP8k-*3UtRdBem`e?y>;w$e-ozp zD$XT0bW$!oPye-f%`dU|tE=*3YbzE>H0@mRS1dSkikz+cY>$+AVkb9p+dcYQB>0l) zo;1f{k&I@cnIc#03{`io{;ku^=yM@$W-!-kyN@mNTUDh~8Ix`rmrXAG|LWm3bJ-fd z_o`jDyVwG+G%ply?RuOOdWAXQMnwISRRN4MUb%eoJrTDoV)4&J(PKrc74yz(EPbT3 z=XO=sy<;<;=Y-$RT2h_5Jaw1xi}?M4mYk|Qm2w+58ZN)UJYz{<n$cU|^vUhJZ*D37 zzcIhUX@wet?Zr@*XTG~cw@dB~-F{e5K;{H@->r=m&uX{F<tZ4wzg&EJ`Q_8c)_gWG zDy*OMmFe7Ui~7z>O>2Lsu2g1^?D(bUeCxj3<>GCtea-XoS5@m?mi5^Yx0u(GlcOj` z+f`X)_ld(Q(i<;UnC+N(_e=HUgHP8kY*?knWP3l9<2hTIHiOZ#)eJ$;j6W9me>qll zgYmSw;)6d%)8?Nndg{TMbnJP+q@S8x-%l@jr!|vtTm9<hpGzan+$_?!-?DLj>QOph zHIG~PO74~-MH>$<UEKodZ>KwczEt^U@bdoobyeH9PmZj=A^b!w_i)-iH6GoA+!p85 zcJMN29^_`&vT(LQ%YClXs-9l!{}+15ZLWV=vUB>gB^KXqJyg8cm6EF=m(l&uyGUEI zZbtj+t8sN_zuge2-&S=)`<&>8)xO;&^Z901#vM3)Dg2J>r-Y4nx|du(v_P8s&B>DB z7p9k`R_waGsi5Mq_*#MMx4OeP!tc3!thBI<G>f>rJx+Jk=khGih!0^(4*oj*YYv<; z`LfP`%GN#e#qBNx&rH4cO~AfZ|HiS1XC}{DuXo9$Z@m3usnQ{rqtm;%QtnQu{l~v< zNr45pcff351io`gc)MU1|2)Qe36JTIiyD=ZCf<1a_1NLM{pNCad+zhE`}O$sJJpZ& z-`cD9{!E>;WA9GAlTS7=zuVLFf8qY9EjvC-vS{4hdCq?C{x>WFirx90SuAz)RxDV# z>(ZSsM~q)6?0d=gCu!^FqxWZgZ0%!Ka60}gOjN$1<H42r>r8U4d;UvEn{)P3PToDu z`mR^vNlF=x$6YqG@pfB3yYukF?*xloJAZpiU+l>{BOx=Bea{*0^|D_WboY449G<<} zfAPVyU+sz}Id7JdO*dvg$hVNuqVC3&VvAROZK5}A9Ut@Di(~EG)jNOE9@PYyvsW8S z7bxD!lsU4CLHENqmv&pPgs_K+Ym%E%JkGwkUwXg(?>%|`-Syv&Z~wddpl`nXv3QL} z>Bps<m)3YZJ9+D&j)~KpFutkp+W%XoXg`b>_idgL_|E@v=1r4|b7z|ym()%^-oI;6 zQ`)B)Yv#)sE2+4c<ebTH?_uyfw2Cp{Z%N4uhC3W0heD)xbcW6gUF1;lLz>&h`*X#n z3r+>k?$2J3Bv-GNnQr=1eWuvUWG3g6bqnSmzN)q0>Q>LAb#r9Tf3Z9#!u#Rs<pQ;Z z4XPI-3)oIwDK@s)y-U)`t+x7l?e+WI8>btVJFPirqkm0n?wjN1B_*Q&nEYt6x6?6k zn>R)KmCQ-!g6OZ(H)S|wJ=5;5d3ScU$!y2Jv(Ch17H^7pDP!5HQ~x9X-lOB`2B|NP z_eR!k-N5^bIj|v>^L91+C(B7YnEtI6Q;^Z!%FLl9Jby;Mgrnl~w@C(FP6b<=Ed&@3 z-HBRnE^#le^uN^iU-IvM{hs*2=v$u3m7CEjB@&ANzHj-lEJ{S_X<F{Dw3jxzpRVie z_f}w^5imRL*nuT>(QON72rX@`w|^YJP>ZL-fB%*P?|3%rB!<sdImwtX$H;hgyq@)> zmVY)UCzb9A(63-UbE2Nfa_1AfP=PhIj{_X$%{aO=j5)2e<o~KI>b2YEO<m8Ed@eyZ zfA#m)$J*@TaS^)VCN2wv6W0Vy_e|sc_?^AM_(y>#gVe9q{bDTgXTMqgx}xW&5m&#( zXDfqMqtnxQ?w4=8pEu?3tebh>s`ihb9#;B!R8Un?hi}oUKQ}u?Wfwe3_9^H-=|7_^ zb-!>%h@eEq3E}DAophyNT->elPQd5D{SJdH*_i$E{O;w|$?s49*p-|=_x(YwCp<mg z^{YSMeUj?BM(o_`bj2ejOJ=Tmvw4d_?eEw(JoRZS7kR~=3C}FMA0{Dl_WHwV4$TLD zJr>y>QnjFE&T^-=r;OqY@BZKWHh%l{<N7IYzn!sq?L4oN@7U7xYd?3rN<QXWduGPk z{)LI#4o<3^mAb1cu(@RAnJM?nVluB>J8w1F?+V-1LvI%O-u8M{d}G_Ex4&HYr=9sM z?Dg#N(z-q#SLXW3m$TCJB)V>0pKl*)TpUp#;CJRuem>jv#f39@*R#p9FWxIqIg`h) z!z5+J+e>c_o{+SN?lF<je=Ps9XmiUO`9S;II=W)lmN_qU_<Jiic)}$c|F`ot-kU#j zsqFWE*$clHN-!?bJhSrJ_Ym<_7dG{rakh<R@a)xjp|}6k^4BUSrRsgwJYStF8NRUD zCE}{3?4uhTO;-+Vcb2NQym{(D)kM9^i)xLZ%h*LK?Mf8uie{)Z31(Ng%E-y>$E*_a zXwp2@;6lBCh&%=!`<`FPn+spv+q^BJMzGpk<n<f=wAGh?PIJiFaCgo1)s_it(^6El zw!4I0mMgrm?Z9OVWB!|7x-N<JA0rbzzpmQyEGll*<Dj?KH@?nr_SIXUDmUxaeOu|4 z2))${*%^v<ZPKc_vUTd(O-oo6j~A6Puy}kB78Y9*^g_|FuBi2(W{XMm$+}(dzD7@% z&`){O=GObsF=b9;K4-7g?fKCOIh!IEO_zB3;CRJG&s(cD8qZk%>Flf>>#cH+Ub$HB zBfE~%WJAjFAIql281xq$vDmOaRv>Ye$>FfFP7RUGE$(&tnvbr`DQ#KB)y8vj#s0Wg z#)6kKcb{?Icj+N()T<)S+!(#e&+|;)Eptd&q~MXVF(#RHXWZsRj=iEK_hx$?4r6W; zHGbN;Qa?vF(E3Q|p05kuDo&DG;JIGz^37@U*Vdbg@!x;csh2%TY3{LYJ{wj2Ho2v# z<&>)lU8|Y6SK(usp#T55E6!T|;QRO2;Ck-0lRB}hH!IrCz5Cm|ZQX<3+txzLlA-Cx z^Y8b)|F!pE?EkwSYfahAuj_3sJGDN6PeWnbBnb`KR*8}&eODrPELQn^Y0sg$c_L{( z8;iPF9XC%?t$%az-8vZq4)37T{5Rrc0#`mVz0g0SzV`FR+r~E23&qY)-ZRC>kaxuo zt#IXI7rtH>Uj1?t$KS-`xm}+e_#aJAc;&!9A@ZG$-3#u3z|w4o?fdJ!jV>EqSr{0| zU-P!Rt4gJJ+Jn+h$}{uMeBz%ccln0N8~=Y(#7|z@a<ErS)xA--zV>DTNBb;EW)HWk zC*NGZANMxU`03PH-ZvlJTqELhH%DXn($YgN9TMELtyUfhbv>TNd2NQKwc^&@GE(mY zm$r58ITHSDu~gyA%49WG-szqTs&@w7e!6QZ@7~X$XU~1uvgyqwrR}n_4@s;IW6!KS zP@S%K_u;cQZu0qwspa3*qIIX%fBDF>a<+NKmA?%-neAzvEj3}fy;IdJKK>6WHqvBe zVh&qmb;CJQS8@B4aI1#tmrEurwX83jn#`Uf*p=bRrBW7j$m7AO;F8o8Eynw1M|i3W z#QR1qnb=#dI%UP_yjzhOE5bM?1}@hKUwKR-=GwWJ4;`g1K8fYr^R=xzZ@NMIviey| z^Uhp$e`~!;|GrT4^J$wp{hoEreR(mCalc#2(WLN{r&F2IX6foYzEZbovH+hoPs^=? zU*9el{1eXi`Q5AF_4fDD-9`DCz4)Yq*w%=h)@646f6L%Ta%|||hXt=SLe&m8ntt?> zf1Z%3Y;JOAV)U$Pv$u`XJ6v0?{hepHe>cO~`qW<~98<V|{@rSM>b9Hcxr4JagL_5u zmfm<2R#coB{9P)(Rd05&Z~ocvhgbhb9Sr*_ec3tuWfSkNMT=ISXpEZYQ$5$A*TPhN zQnV5iQ^mxToxaES+_AgOc_^?!<KD6BIsO|OV!WMh-f;hHwd!Bfp;ap<b4dhDsVPmb zjd&0u^Zj_ey2f_rsLG?-DHU9$YD%+o*t6OkmuzxcwdhTD`k6@`p)t7!N;W=qun;;M z!MtVrw`TU*gM3QoO+v3-EW6^o#<$7nlQZ+FDvecEN+N2fS+X2gpJv`98?w7-m$n&e z4D0P1-!C`4_K6gK;&?dAG}1xJM2`34{6`A}fB76TyQ*-YLEu-^>#MwPK8bhz`_DW# zVeU3?BaO+xc)R0N{{5VcCfgb3^DpOQG6io+7TLaU1^;7?=>hL~MYnI;$iI|j`jy@M zBHQz~@pG{-8QO2J-o@|8$g;<wDGNM-&17acQ9zB~(!>C18MDFkkMc}f^-;Om$|nW? zt&6`XU;OjJt99GowLMKJ@11;rbz1ac)$MQC->)m0Artn2JLX^QysXTe)05V0G=1H0 z(A4;<t!b$L-fgp{OmLbkWi<W56edx|xy;Yoe(P@V%vk0a`Eh<z=Fxh-r9W%eEM%** z(Y86wWA#*MlL5!+2M6*je+Jns@_BH&{(*l)#=oGi)^GC71-hnI+$)%9`dwQfDt&Fh ziD`cXzisRa75zP>sg~>8$|vO;R&jkh`1sDBz^4wD&KI;AIpQy8@g51S{q5kC+xFJc zp(QL@;p{%H@++<Rtgi|JrDv>8n$O1iGc=orS1^Rp)WFexZDv9tr}UI%Ih&WUx_q@} zGp!d|;>~hY?Ef?tKhIm5T$47cYw#UfcYcaWhr{j#CLIrjrm$*0+U=mSGBkZb)&-Z^ z>0&0cgDnq6ocw;;az#ODSJSF!vsAvQ1592`Vc`W$%dUp9oN7w-($<#R(op_Hs%N&e z$OMDbdiFwt;>l_T(I@v!+py?c`2*oKw=D~~mNGllOLH7xd(T<1_cTlElr>G}8(I#X zywCMORO7IwP3YVBZrfci8}}sT#os@(>zIUt&YPH~sarogAGow@&yO#&?jGYjuqIFS zL*a@^wYr)bH&z^25xVeq8fVLo+ecSk`?+zG%Kx-IJHyH}7jD`0%WlDnhuI(47_BxX zO=hb<wKkurV!{rm`ak<D<_TZ8X0p4WuO{?)^VJ85f9ExC*LIgJy%hc<byelJXJ>Qj zzTN+?bLh|8r%yknnf<T${d8IU|B}L=?{EIO`{~u~N3VjLoR^>fy#L&Pv-<y<-@9-A zd4BZz><^p?9qS@8Y^8j7J&ruG+AMXIr6&LIZ1co_hG+h7vWaf{>G|WbX?<9nj(&3I z7v~=zk4yej6LHayvU%$#ur*_)t?G&Si=VVN&1v!X{TpiE{?q>7PwkScNynzO7N@NE z^y%C8`}Xfs&#g3$-uz<4tpvN+xO*j<evQgZdA~OWOLVPWqyIp<WygkHEBJinZbS*} zs(!SwbO!_94nFaJ4(xglSiK@*E0(ON-x=>P?`Qk!r`P+rSLmIwpEIZJ=gmj`vp-Z` zmXbeLAARQ8d&O^$K0T9~@v3^~x%JbxhsTRwx0U%GT_0bw+oFE^ALSD5gHP{rFZjm) zJUl`=>XB%?`3KW`uNK}<{dnR1e|vxCmSce@->%<SYMysdxNnx*GUtXXFBv>tCQe{% zHQjZ;UfJEH!F`E~Hv5qqO^aXJ9^!JHsD5F`!P9fg)g``v6q0c}{&w}O#mkZ%`I>SQ zKL2v~p)q0F7T!z0bSBvSd1YoKU^D5<gq}^R$qNgOrhSSycIffNjR$vcQ`*|`>BZ7D z-@m!NdSt!2Y4(|IZ~q3ZzLvXs+OMSETKU!2HmN3GO+WcVq2A_NX~mj7|MY{~JVnl3 ze0$jPxK7;Zs4r2RhDOVlv446xrSOv1k>x^9BN78vacIWrZ9Z~}{Yb{;&Vx6TKE7IE zDxxPcBlt^`+)J6%mzRq&s$|x$?)`p(_a5`dD)#jry*87k>$>VQ&VRfAck_3*p6|>0 z+HNry9=cS}cr@;kyf8yl{oSH<Y5Jw>wykR3^E>KqymjQ{uk~{;-Bg+W;+OFi23FsN z4BRvKer7%4Wf#DEqC{hQi`LFc8F$e~cjW`#>-HI~S`x+2aY%TV^e@&ec8;@LzHMl( zJ9s48zjwt9z8`;EnmGRKSrjK`&Rb<AXkwHx|E|##{u72vQ!i{+ag*h5P1#=0^XmGm zzcyE{%!}6B_NnJxYV*%^)s7-l3R~~iEq6bqcZJRD{n_>~wzG8$6Pxes{&ted_1nv% zi#;y3bLn%7)~<W>=*z}avmP`~XuQz4p;3c5kbTkG&N*yJH!S(BpC>-Ic{8Vd?&l4~ za%JZZpW7)bzBcHD^hyC;k(!HK3p#Qhsyfy?9xz|>ENyq~qt{2zD(%~A8!2E?&=a21 z{iwh|ndRIiSH~0En%2yD5~|v$E@hCPQF%nY^u&b?`!c&#zSXK$#ux;CQJih4CANM_ zf|~r_84JvwGcV=x&6*>2SKTMbCpFYa@Iqcj;dj=xTm9;yYOHrFHPkp|ayhB$6s!B{ zUUbi`S6=cnPfSV0SnIo(Q{Tf&aTlFj0s}8eDDM0@p~LbTpUl%gufAo@yZJsf^F!kL zQhsmat+f)Gf_>5^-d{4cgij?;iW7aBw%&ZpmnHfIiM|Xxhi0#ET@rM*!RY$+>CRHK z^i$qA_NnZc8}HwD&|p$c$LaDmL5(AuWL6wI)zY*;&aZx6epZ*xi%FtvP3*;sXT1EM zAek4p_ho`)W2(n#ZLO4C$@Q22Mr3c`srLQQ)ut#vf7{jHf4{Wxyu6{nUTtS*@@)O( z*3Eo@SMs-Xy=>5M($+E-VeU};wdx^{sfT_3)lkO+N4wSdZt{t-Fs!!ClKa*9XvM>$ zn}0W+6;oi1o$vObe$o7tQwQHYaCHCp>D_{NFZkZHPCioSX1VKn)sep;o3~Dnp0H)Y z=3|D%Oe#KoTW{C;e>)+!xb2tzHj&rcmd<dG<m$QIEAu?F-AW^cLG4>0qlr=-Q)khP zUO_>=BWYRDdB=^a(tdPQN=UtHzQ~uBDfTy~Ld1AsNbthK<2L;K#b)&ajNg~--h75V zePTrOj8ylkt#4lZRF!R<x={J~!jsR;UjB)_ApOH~>%zspt6h#|Xl$JlaY}nyjK=Z5 zH@J`1eUVSvu;8ZqQD+Y0J?fkPzkam+_G;HHXAfSU_?FRN+Re#g-}k)wd9`20IA-A# zb*VSyrzanMdG+|wo1fmS+WJ{{`=mc}>VNDxSZiSS{?WB3s>zZkeg7G^E^^;>jhTJc zBNkJ2U+X<9_uZMDG9%V==9Nybx4mY@zwUI!Op$nMX(zu=wYu%Z_INgXrUUA-nVaQP z4i<O(a+xXW(H7bv`t(L||DWIITaG<%Za?Gl!)OYJ-IeQemmWHH?X^U_h-YR>PkUFp z@Ri{DZ)%z0A@@7JzsWJN`S_CO{jayDo~X8*GMg}U9{ZE_S;2CWzTZ~l{pXio=FxQQ zc6|2Fr+KTJZ@)4qx~3@o%HYg4lc#SYFC=iMD1Rwtn!}NlU#fC&>DFoLw^r$gKhHc= z82a5J(z5vD{bh%iU%b0<{-rDGM=E~*n;vq0`Q*jFIF{WLK6&v%UjKwgr+1y!DWCL* zUw?VhJaF5K(O~++_hQ1^pYP@`=3+K9u-M*xp5KHAv_x5C`{mpGYMhLg+kZXb*W_U~ zGyu2CgtuFM<X^=(y_H!&Z2Gnc0qy#=5%I;hcL>&BU;e;Ze#K4>HHQX<-v!2=vto*b z&0iih-#ar#joEX{*;z`Vlf2&K-;dSt=oESC626~9VMD~5`}g%kSj`<p{uoskn(nTU zo!#KB(;Flg6U%Ou7WB!XyF*ftJ^b~9;1x4dKD(~E{9*ok{rUfs_jL%%=DoG)J9JB| z-ZkvPsq1U<KCPOg@1ix8=j@#JntwlEUB9_{_09TpnY<pRd+`T^mxV~JG284ve{lkD z^?o+N?qK1X;wiHoq>k=5SnT?t@Z0*xCrjTQQ=aEJ%V4g}sUV5(cQ?vx@JN}Eak59G ze`5#J!I=-Abu@SVh)*`W_Bzn^W1C9au_O2QE56LDFQ{WXEip~)0K=UemCKhJHnh36 z?fLV$W?>6gc(&C4XElFW=lpo~_vz~HH}~?kxn7IW$(_9Z!S>j@aVC|O!71^pR0IA# zKYi_2hQ+7K^jVu(?So=Dr*ZvMS*1R!@F4rH{8d(qZ`x+RzkRuDj_$FEN|Tx$UU`ZH zaz5@<aJA^v&*-SnoM3SxVD7c&IhlQ5IxV{wJ@Nc9v8(fhv%ia!506mW<X>}i&rY;! zsGoSnf04h=%n6ge2r~bd;e*Qra&_j-bCDM`P84~$m``a<zxjH8`?cq9Uh4T8xH9oi zrosenvF?-x=G$xZ{_q&`Uf@l5d%9cv|GKwg-)?OCAy_}fBKnxJDzC$oXa0*+J4Dpe z9+=qcOuBraU>}RS)r%HRy?^$yL26T(s@;6tUNT6C9r8btX<`xIqO2;^pdxDDDI|5A zQR0i0j$H7g9KpUR0S(S8YlKvV4yT-ASAFij=w%LPUzAOX;L=xf<j!XvTs|v?HMME^ zzDs+~<(Gy070#%y_<8?1w{Z6d(XF;yVqzb!aQ2>m`p~*}(=NQ5wPDub^R~MA&mDro z&9~mY;PmaPnDuR^^)C0P?a=AwI`^ue)clFw%gt+xqf2D&%2wVq+cIH##^dhmUUFHg z%B*wKxw@=d7c@pIL~eLtCT5f7^^4`uvvsfEJmZ%0D=**i*lJH=wRyeSiUT6eZ71T- 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 We>Z7aUSkUr3u6;5RaIAiH!c7haq(*a diff --git a/examples/advanced/categorical/batch/runExample.log b/examples/advanced/categorical/batch/runExample.log index 543c3aa..1eb0da5 100644 --- a/examples/advanced/categorical/batch/runExample.log +++ b/examples/advanced/categorical/batch/runExample.log @@ -2,22 +2,24 @@ Warning: { Model use is disabled for problem with categorical variables. } Warning: { - Anisotropic mesh are not supported with categorical and binary variables. + Default anisotropic mesh is disabled with categorical and binary variables. } -NOMAD - version 3.7.1 - www.gerad.ca/nomad - -Copyright (C) 2001-2015 { - Mark A. Abramson - The Boeing Company +NOMAD - version 3.7.3 has been created by { Charles Audet - Ecole Polytechnique de Montreal - Gilles Couture - Ecole Polytechnique de Montreal - John E. Dennis, Jr. - Rice University Sebastien Le Digabel - Ecole Polytechnique de Montreal Christophe Tribes - Ecole Polytechnique de Montreal } -Funded in part by AFOSR and Exxon Mobil. +The copyright of NOMAD - version 3.7.3 is owned by { + Sebastien Le Digabel - Ecole Polytechnique de Montreal + Christophe Tribes - Ecole Polytechnique de Montreal +} + +NOMAD version 3 is a new version of Nomad v1 and v2, it has been funded by AFOSR and Exxon Mobil. +Nomad v1 and v2 were created and developed by Mark A. Abramson from The Boeing Company, Charles Audet and Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from Rice University, and were funded by AFOSR and Exxon Mobil. +Download : www.gerad.ca/nomad License : '$NOMAD_HOME/src/lgpl.txt' User guide: '$NOMAD_HOME/doc/user_guide.pdf' Examples : '$NOMAD_HOME/examples' diff --git a/examples/advanced/categorical/bi_obj/makefile b/examples/advanced/categorical/bi_obj/makefile index 914d338..89f48dd 100644 --- a/examples/advanced/categorical/bi_obj/makefile +++ b/examples/advanced/categorical/bi_obj/makefile @@ -1,25 +1,37 @@ -EXE = categorical.exe -EXE_MPI = categorical_MPI.exe - -COMPILATOR = g++ -COMPILATOR_MPI = mpic++ -SUNAME = $(shell uname) -OSS=$(findstring MINGW32,$(SUNAME)) -ifneq "$(strip $(OSS))" "" -COMPILATOR_MPI = g++ -endif +UNAME := $(shell uname) + +EXE = categorical.exe +EXE_MPI = categorical_MPI.exe -COMPILATOR_OPTIONS = -g -ansi +COMPILATOR = g++ +COMPILATOR_MPI = mpic++ + +COMPILATOR_OPTIONS = -O2 -ansi COMPILATOR_OPTIONS_MPI = $(COMPILATOR_OPTIONS) -DUSE_MPI -L1 = $(NOMAD_HOME)/lib/nomad.a -L1_MPI = $(NOMAD_HOME)/lib/nomad.MPI.a -LIBS = $(L1) -lm -LIBS_MPI = $(L1_MPI) -lm -lmpi -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -COMPILE_MPI = $(COMPILATOR_MPI) $(COMPILATOR_OPTIONS_MPI) $(INCLUDE) -c -OBJS = categorical.o -OBJS_MPI = categorical_MPI.o + + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so +LIB_NOMAD_MPI = libnomad.MPI.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi +endif +CXXFLAGS_MPI = $(CXXFLAGS) -DUSE_MPI + + +LDLIBS = -lm -lnomad +LDLIBS_MPI = -lm -lmpi -lnomad.MPI + +INCLUDE = -I$(NOMAD_HOME)/src -I. + +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c +COMPILE_MPI = $(COMPILATOR_MPI) $(COMPILATOR_OPTIONS_MPI) $(INCLUDE) -c + +OBJS = categorical.o +OBJS_MPI = categorical_MPI.o ifndef NOMAD_HOME @@ -30,19 +42,23 @@ endef endif -$(EXE): $(L1) $(OBJS) +$(EXE): $(OBJS) $(ECHO_NOMAD) @echo " building the scalar version ..." @echo " exe file : "$(EXE) - @$(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) - @strip $(EXE) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif -$(EXE_MPI): $(L1_MPI) $(OBJS_MPI) +$(EXE_MPI): $(OBJS_MPI) $(ECHO_NOMAD) @echo " building the MPI version ..." @echo " exe file : "$(EXE_MPI) - @$(COMPILATOR_MPI) -o $(EXE_MPI) $(OBJS_MPI) $(LIBS_MPI) $(COMPILATOR_OPTIONS_MPI) - @strip $(EXE_MPI) + @$(COMPILATOR_MPI) -o $(EXE_MPI) $(OBJS_MPI) $(LDLIBS_MPI) $(CXXFLAGS_MPI) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD_MPI) $(NOMAD_HOME)/lib/$(LIB_NOMAD_MPI) $(EXE_MPI) +endif categorical.o: categorical.cpp $(ECHO_NOMAD) @@ -50,10 +66,8 @@ categorical.o: categorical.cpp categorical_MPI.o: categorical.cpp $(ECHO_NOMAD) - @$(COMPILE_MPI) categorical.cpp -o categorical_MPI.o + @$(COMPILE_MPI) categorical.cpp -o $@ -$(L1) $(L1_MPI): ; - $(ECHO_NOMAD) mpi: $(EXE_MPI) diff --git a/examples/advanced/categorical/bi_obj/runExample.log b/examples/advanced/categorical/bi_obj/runExample.log index c73859f..fb02048 100644 --- a/examples/advanced/categorical/bi_obj/runExample.log +++ b/examples/advanced/categorical/bi_obj/runExample.log @@ -4,42 +4,55 @@ Warning: { Warning: { Default anisotropic mesh is disabled with categorical and binary variables. } -Warning: { - Model use is disabled in parallel mode (MPI). -} -Warning: { - Asynchronous mode is disabled in parallel mode (MPI) when dynamic directions (ortho n+1) are used. -} multi-MADS run { - MADS run 1 ...... OK [bb eval= 78] [overall bb eval= 78] [# dominant pts= 2] [# new pts= 2] [f1=52.02241823 f2=51.31041823] - MADS run 2 ...... OK [bb eval= 39] [overall bb eval= 117] [# dominant pts= 3] [# new pts= 1] [f1=52.0224221 f2=51.0754221] - MADS run 3 ...... OK [bb eval= 39] [overall bb eval= 156] [# dominant pts= 3] [# new pts= 0] [f1=52.02242186 f2=51.23342186] - MADS run 4 ...... OK [bb eval= 38] [overall bb eval= 194] [# dominant pts= 4] [# new pts= 1] [f1=52.02242186 f2=51.06242186] - MADS run 5 ...... OK [bb eval= 39] [overall bb eval= 233] [# dominant pts= 5] [# new pts= 1] [f1=52.02242186 f2=51.19342186] - MADS run 6 ...... OK [bb eval= 7] [overall bb eval= 240] [# dominant pts= 5] [# new pts= 0] [f1=52.02242186 f2=51.19342186] - MADS run 7 ...... OK [bb eval= 39] [overall bb eval= 279] [# dominant pts= 2] [# new pts= -3] [f1=45.36506988 f2=44.51306988] - MADS run 8 ...... OK [bb eval= 39] [overall bb eval= 318] [# dominant pts= 3] [# new pts= 1] [f1=45.36506988 f2=44.51306988] - MADS run 9 ...... OK [bb eval= 39] [overall bb eval= 357] [# dominant pts= 7] [# new pts= 4] [f1=44.99982416 f2=44.55082416] - MADS run 10 ...... OK [bb eval= 39] [overall bb eval= 396] [# dominant pts= 4] [# new pts= -3] [f1=44.97647101 f2=44.00347101] - MADS run 11 ...... OK [bb eval= 39] [overall bb eval= 435] [# dominant pts= 4] [# new pts= 0] [f1=44.9661848 f2=44.1371848] - MADS run 12 ...... OK [bb eval= 39] [overall bb eval= 474] [# dominant pts= 5] [# new pts= 1] [f1=44.9661848 f2=44.1371848] - MADS run 13 ...... OK [bb eval= 26] [overall bb eval= 500] [# dominant pts= 5] [# new pts= 0] [f1=44.96576761 f2=45.17076761] - -} end of run (max number of bb evaluations) - - -blackbox evaluations : 500 -number of MADS runs : 13 + MADS run 1/30 ...... OK [bb eval= 60] [overall bb eval= 60] [# dominant pts= 6] [# new pts= 6] [f1=52.02241823 f2=52.95541823] + MADS run 2/30 ...... OK [bb eval= 74] [overall bb eval= 134] [# dominant pts= 6] [# new pts= 0] [f1=52.02241826 f2=51.05441826] + MADS run 3/30 ...... OK [bb eval= 58] [overall bb eval= 192] [# dominant pts= 7] [# new pts= 1] [f1=52.02241823 f2=51.45041823] + MADS run 4/30 ...... OK [bb eval= 68] [overall bb eval= 260] [# dominant pts= 6] [# new pts= -1] [f1=52.02241823 f2=51.51641823] + MADS run 5/30 ...... OK [bb eval= 54] [overall bb eval= 314] [# dominant pts= 7] [# new pts= 1] [f1=52.02241823 f2=51.41441823] + MADS run 6/30 ...... OK [bb eval= 0] [overall bb eval= 314] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.51641823] + MADS run 7/30 ...... OK [bb eval= 0] [overall bb eval= 314] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.41441823] + MADS run 8/30 ...... OK [bb eval= 0] [overall bb eval= 314] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.51641823] + MADS run 9/30 ...... OK [bb eval= 0] [overall bb eval= 314] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.41441823] + MADS run 10/30 ...... OK [bb eval= 0] [overall bb eval= 314] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.51641823] + MADS run 11/30 ...... OK [bb eval= 0] [overall bb eval= 314] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.41441823] + MADS run 12/30 ...... OK [bb eval= 0] [overall bb eval= 314] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.51641823] + MADS run 13/30 ...... OK [bb eval= 0] [overall bb eval= 314] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.41441823] + MADS run 14/30 ...... OK [bb eval= 49] [overall bb eval= 363] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.25241823] + MADS run 15/30 ...... OK [bb eval= 57] [overall bb eval= 420] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.06141823] + MADS run 16/30 ...... OK [bb eval= 50] [overall bb eval= 470] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.22141823] + MADS run 17/30 ...... OK [bb eval= 0] [overall bb eval= 470] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.51641823] + MADS run 18/30 ...... OK [bb eval= 0] [overall bb eval= 470] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.41441823] + MADS run 19/30 ...... OK [bb eval= 0] [overall bb eval= 470] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.25241823] + MADS run 20/30 ...... OK [bb eval= 0] [overall bb eval= 470] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.51641823] + MADS run 21/30 ...... OK [bb eval= 0] [overall bb eval= 470] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.41441823] + MADS run 22/30 ...... OK [bb eval= 0] [overall bb eval= 470] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.06141823] + MADS run 23/30 ...... OK [bb eval= 0] [overall bb eval= 470] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.22141823] + MADS run 24/30 ...... OK [bb eval= 0] [overall bb eval= 470] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.25241823] + MADS run 25/30 ...... OK [bb eval= 0] [overall bb eval= 470] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.51641823] + MADS run 26/30 ...... OK [bb eval= 0] [overall bb eval= 470] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.41441823] + MADS run 27/30 ...... OK [bb eval= 0] [overall bb eval= 470] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.06141823] + MADS run 28/30 ...... OK [bb eval= 0] [overall bb eval= 470] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.22141823] + MADS run 29/30 ...... OK [bb eval= 0] [overall bb eval= 470] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.51641823] + MADS run 30/30 ...... OK [bb eval= 0] [overall bb eval= 470] [# dominant pts= 7] [# new pts= 0] [f1=52.02241823 f2=51.25241823] + +} end of run (max number of MADS runs) + + +blackbox evaluations : 470 +number of MADS runs : 30 Pareto front { - 44.9348019953 45.4168019953 - 44.9657676108 45.1707676108 - 44.9661847951 44.1371847951 - 44.9738637269 44.0708637269 - 44.9764710086 44.0034710086 + 52.0224182340 52.9554182340 + 52.0224182340 52.5564182340 + 52.0224182340 51.4504182340 + 52.0224182340 51.2524182340 + 52.0224182340 51.2214182340 + 52.0224182340 51.0614182340 + 52.0224182340 51.0254182340 } -number of Pareto points: 5 +number of Pareto points: 7 diff --git a/examples/advanced/categorical/single_obj/makefile b/examples/advanced/categorical/single_obj/makefile index 305e2ba..89f48dd 100644 --- a/examples/advanced/categorical/single_obj/makefile +++ b/examples/advanced/categorical/single_obj/makefile @@ -1,25 +1,37 @@ -EXE = categorical.exe -EXE_MPI = categorical_MPI.exe - -COMPILATOR = g++ -COMPILATOR_MPI = mpic++ -SUNAME = $(shell uname) -OSS=$(findstring MINGW32,$(SUNAME)) -ifneq "$(strip $(OSS))" "" -COMPILATOR_MPI = g++ -endif +UNAME := $(shell uname) + +EXE = categorical.exe +EXE_MPI = categorical_MPI.exe -COMPILATOR_OPTIONS = -O2 -ansi +COMPILATOR = g++ +COMPILATOR_MPI = mpic++ + +COMPILATOR_OPTIONS = -O2 -ansi COMPILATOR_OPTIONS_MPI = $(COMPILATOR_OPTIONS) -DUSE_MPI -L1 = $(NOMAD_HOME)/lib/nomad.a -L1_MPI = $(NOMAD_HOME)/lib/nomad.MPI.a -LIBS = $(L1) -lm -LIBS_MPI = $(L1_MPI) -lm -lmpi -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -COMPILE_MPI = $(COMPILATOR_MPI) $(COMPILATOR_OPTIONS_MPI) $(INCLUDE) -c -OBJS = categorical.o -OBJS_MPI = categorical_MPI.o + + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so +LIB_NOMAD_MPI = libnomad.MPI.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi +endif +CXXFLAGS_MPI = $(CXXFLAGS) -DUSE_MPI + + +LDLIBS = -lm -lnomad +LDLIBS_MPI = -lm -lmpi -lnomad.MPI + +INCLUDE = -I$(NOMAD_HOME)/src -I. + +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c +COMPILE_MPI = $(COMPILATOR_MPI) $(COMPILATOR_OPTIONS_MPI) $(INCLUDE) -c + +OBJS = categorical.o +OBJS_MPI = categorical_MPI.o ifndef NOMAD_HOME @@ -30,19 +42,23 @@ endef endif -$(EXE): $(L1) $(OBJS) +$(EXE): $(OBJS) $(ECHO_NOMAD) @echo " building the scalar version ..." @echo " exe file : "$(EXE) - @$(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) - @strip $(EXE) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif -$(EXE_MPI): $(L1_MPI) $(OBJS_MPI) +$(EXE_MPI): $(OBJS_MPI) $(ECHO_NOMAD) @echo " building the MPI version ..." @echo " exe file : "$(EXE_MPI) - @$(COMPILATOR_MPI) -o $(EXE_MPI) $(OBJS_MPI) $(LIBS_MPI) $(COMPILATOR_OPTIONS_MPI) - @strip $(EXE_MPI) + @$(COMPILATOR_MPI) -o $(EXE_MPI) $(OBJS_MPI) $(LDLIBS_MPI) $(CXXFLAGS_MPI) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD_MPI) $(NOMAD_HOME)/lib/$(LIB_NOMAD_MPI) $(EXE_MPI) +endif categorical.o: categorical.cpp $(ECHO_NOMAD) @@ -50,10 +66,8 @@ categorical.o: categorical.cpp categorical_MPI.o: categorical.cpp $(ECHO_NOMAD) - @$(COMPILE_MPI) categorical.cpp -o categorical_MPI.o + @$(COMPILE_MPI) categorical.cpp -o $@ -$(L1) $(L1_MPI): ; - $(ECHO_NOMAD) mpi: $(EXE_MPI) diff --git a/examples/advanced/categorical/single_obj/runExample.log b/examples/advanced/categorical/single_obj/runExample.log index d4a89ba..270473f 100644 --- a/examples/advanced/categorical/single_obj/runExample.log +++ b/examples/advanced/categorical/single_obj/runExample.log @@ -2,7 +2,7 @@ Warning: { Model use is disabled for problem with categorical variables. } Warning: { - Anisotropic mesh are not supported with categorical and binary variables. + Default anisotropic mesh is disabled with categorical and binary variables. } MADS run { @@ -338,424 +338,1864 @@ MADS run { 1626+12 ( 2 0 4406.0444434766 2 5593.9555565234 ) 54.0419580454 (ExtendedPoll) 1626+13 ( 2 0 4028.7079722735 2 5971.2920277265 ) 53.7998378556 (ExtendedPoll) 1626+19 ( 2 0 4154.4867960079 2 5845.5132039921 ) 53.7918826239 (ExtendedPoll) - 1690+27 ( 2 0 4999.9918793150 2 5000.0071042165 ) 55.9016755069 (ExtendedPoll) - 1690+28 ( 2 0 4999.9675172600 2 5000.0284168659 ) 55.9016037165 (ExtendedPoll) - 1690+29 ( 2 0 4999.8700690400 2 5000.1136674635 ) 55.9013165752 (ExtendedPoll) - 1690+30 ( 2 0 4999.4802761598 2 5000.4546698539 ) 55.9001683374 (ExtendedPoll) - 1690+31 ( 2 0 4997.9211046392 2 5001.8186794156 ) 55.8955806263 (ExtendedPoll) - 1690+32 ( 2 0 4991.6844185568 2 5007.2747176624 ) 55.8773137258 (ExtendedPoll) - 1690+33 ( 2 0 4966.7376742271 2 5029.0988706497 ) 55.8055960661 (ExtendedPoll) - 1690+34 ( 2 0 4866.9506969084 2 5116.3954825988 ) 55.5407618647 (ExtendedPoll) - 1690+35 ( 2 0 4467.8027876336 2 5465.5819303951 ) 54.8617064546 (ExtendedPoll) - 1690+37 ( 2 0 4466.8269645111 2 5469.3623920026 ) 54.8295561915 (ExtendedPoll) - 1690+38 ( 2 0 4463.8994951436 2 5480.7037768250 ) 54.7333779337 (ExtendedPoll) - 1690+39 ( 2 0 4452.1896176735 2 5526.0693161146 ) 54.3527873521 (ExtendedPoll) - 1690+40 ( 2 0 4432.0999444382 2 5550.0895775916 ) 54.2727755505 (ExtendedPoll) - 1690+41 ( 2 0 4371.8309247321 2 5622.1503620228 ) 54.0490159101 (ExtendedPoll) - 1690+48 ( 2 0 4367.1633511951 2 5628.4010891571 ) 54.0259049915 (ExtendedPoll) - 1690+52 ( 2 0 4367.4363087119 2 5632.2975577092 ) 53.9839463746 (ExtendedPoll) - 1690+64 ( 2 0 4367.5173563027 2 5632.3888412069 ) 53.9823156833 (ExtendedPoll) - 1690+67 ( 2 0 4367.5750698909 2 5632.4087032645 ) 53.9816128497 (ExtendedPoll) - 1690+77 ( 2 0 4367.5769053809 2 5632.4193356014 ) 53.9814889495 (ExtendedPoll) - 1690+82 ( 2 0 4367.5805624212 2 5632.4182502476 ) 53.9814682147 (ExtendedPoll) - 1690+86 ( 2 0 4367.5821046999 2 5632.4171280385 ) 53.9814662175 (ExtendedPoll) - 1690+90 ( 2 0 4367.5818878523 2 5632.4180567321 ) 53.9814586704 (ExtendedPoll) - 1690+104 ( 2 0 4367.5819056985 2 5632.4180679393 ) 53.9814584017 (ExtendedPoll) - 1690+105 ( 2 0 4367.5819346476 2 5632.4180608593 ) 53.9814582222 (ExtendedPoll) - 1690+109 ( 2 0 4367.5819216978 2 5632.4180774844 ) 53.9814581658 (ExtendedPoll) - 1690+115 ( 2 0 4367.5819257648 2 5632.4180741356 ) 53.9814581645 (ExtendedPoll) - 1690+120 ( 2 0 4367.5819244247 2 5632.4180754292 ) 53.9814581630 (ExtendedPoll) - 1690+121 ( 2 0 4367.5819204043 2 5632.4180793101 ) 53.9814581585 (ExtendedPoll) - 1690+122 ( 2 0 4367.5819043228 2 5632.4180948339 ) 53.9814581405 (ExtendedPoll) - 1690+123 ( 2 0 4367.5818399969 2 5632.4181569287 ) 53.9814580686 (ExtendedPoll) - 1690+124 ( 2 0 4367.5815826929 2 5632.4184053083 ) 53.9814577808 (ExtendedPoll) - 1690+125 ( 2 0 4367.5805534773 2 5632.4193988263 ) 53.9814566296 (ExtendedPoll) - 1690+126 ( 2 0 4367.5764366146 2 5632.4233728987 ) 53.9814520249 (ExtendedPoll) - 1690+127 ( 2 0 4367.5599691638 2 5632.4392691879 ) 53.9814336068 (ExtendedPoll) - 1690+128 ( 2 0 4367.4940993607 2 5632.5028543451 ) 53.9813599484 (ExtendedPoll) - 1690+129 ( 2 0 4367.2306201483 2 5632.7571949737 ) 53.9810655359 (ExtendedPoll) - 1690+130 ( 2 0 4366.1767032985 2 5633.7745574881 ) 53.9798914222 (ExtendedPoll) - 1690+131 ( 2 0 4361.9610358996 2 5637.8440075457 ) 53.9752515834 (ExtendedPoll) - 1690+132 ( 2 0 4345.0983663039 2 5654.1218077760 ) 53.9576001475 (ExtendedPoll) - 1690+133 ( 2 0 4277.6476879210 2 5719.2330086971 ) 53.9016513465 (ExtendedPoll) - 1690+135 ( 2 0 4277.6290591203 2 5719.2571811144 ) 53.9015782727 (ExtendedPoll) - 1690+136 ( 2 0 4277.5731727181 2 5719.3296983663 ) 53.9013590679 (ExtendedPoll) - 1690+137 ( 2 0 4277.3496271092 2 5719.6197673739 ) 53.9004824970 (ExtendedPoll) - 1690+138 ( 2 0 4276.4554446736 2 5720.7800434043 ) 53.8969801836 (ExtendedPoll) - 1690+139 ( 2 0 4272.8787149315 2 5725.4211475259 ) 53.8830344924 (ExtendedPoll) - 1690+140 ( 2 0 4272.2449416972 2 5726.1641037669 ) 53.8813532804 (ExtendedPoll) - 1690+141 ( 2 0 4270.3436219944 2 5728.3929724899 ) 53.8763261624 (ExtendedPoll) - 1690+145 ( 2 0 4269.8544309447 2 5729.2382877997 ) 53.8723721175 (ExtendedPoll) - 1690+146 ( 2 0 4268.9604950773 2 5730.9749800002 ) 53.8632736922 (ExtendedPoll) - 1690+157 ( 2 0 4268.9281879962 2 5731.0267642928 ) 53.8630526551 (ExtendedPoll) - 1690+162 ( 2 0 4268.9081672520 2 5731.0497967493 ) 53.8630044126 (ExtendedPoll) - 1690+163 ( 2 0 4268.8481050197 2 5731.1188941187 ) 53.8628597009 (ExtendedPoll) - 1690+167 ( 2 0 4268.9130457179 2 5731.0620335227 ) 53.8628413313 (ExtendedPoll) - 1690+168 ( 2 0 4269.1078678127 2 5730.8914517347 ) 53.8627863397 (ExtendedPoll) - 1690+172 ( 2 0 4268.9798523367 2 5731.0072720873 ) 53.8627858887 (ExtendedPoll) - 1690+173 ( 2 0 4268.5958059087 2 5731.3547331451 ) 53.8627850104 (ExtendedPoll) - 1690+182 ( 2 0 4268.5734598444 2 5731.3755169174 ) 53.8627794333 (ExtendedPoll) - 1690+183 ( 2 0 4268.5064216515 2 5731.4378682344 ) 53.8627627170 (ExtendedPoll) - 1690+184 ( 2 0 4268.2382688801 2 5731.6872735026 ) 53.8626960762 (ExtendedPoll) - 1690+185 ( 2 0 4267.1656577944 2 5732.6848945752 ) 53.8624331084 (ExtendedPoll) - 1690+186 ( 2 0 4262.8752134514 2 5736.6753788658 ) 53.8614387941 (ExtendedPoll) - 1690+187 ( 2 0 4245.7134360797 2 5752.6373160280 ) 53.8583843412 (ExtendedPoll) - 1690+190 ( 2 0 4247.8459166796 2 5750.8801520137 ) 53.8564841075 (ExtendedPoll) - 1690+191 ( 2 0 4254.2433584792 2 5745.6086599708 ) 53.8509013362 (ExtendedPoll) - 1690+203 ( 2 0 4254.3648432334 2 5745.5967180794 ) 53.8499381914 (ExtendedPoll) - 1690+208 ( 2 0 4254.3884937761 2 5745.5774316250 ) 53.8499159225 (ExtendedPoll) - 1690+209 ( 2 0 4254.4594454040 2 5745.5195722617 ) 53.8498491302 (ExtendedPoll) - 1690+216 ( 2 0 4254.4747041982 2 5745.5195660142 ) 53.8497136099 (ExtendedPoll) - 1690+222 ( 2 0 4254.4785171266 2 5745.5196821982 ) 53.8496785985 (ExtendedPoll) - 1690+225 ( 2 0 4254.4745684192 2 5745.5233580070 ) 53.8496778754 (ExtendedPoll) - 1690+226 ( 2 0 4254.4627222968 2 5745.5343854333 ) 53.8496757065 (ExtendedPoll) - 1690+227 ( 2 0 4254.4153378073 2 5745.5784951385 ) 53.8496670379 (ExtendedPoll) - 1690+228 ( 2 0 4254.2257998495 2 5745.7549339594 ) 53.8496324765 (ExtendedPoll) - 1690+229 ( 2 0 4253.4676480183 2 5746.4606892429 ) 53.8494960362 (ExtendedPoll) - 1690+230 ( 2 0 4250.4350406932 2 5749.2837103771 ) 53.8489791731 (ExtendedPoll) - 1690+231 ( 2 0 4238.3046113928 2 5760.5757949136 ) 53.8473747522 (ExtendedPoll) - 1690+233 ( 2 0 4237.9514726055 2 5760.9129400964 ) 53.8472576934 (ExtendedPoll) - 1690+234 ( 2 0 4236.8920562434 2 5761.9243756450 ) 53.8469104201 (ExtendedPoll) - 1690+235 ( 2 0 4232.6543907954 2 5765.9701178391 ) 53.8455799016 (ExtendedPoll) - 1690+236 ( 2 0 4215.7037290030 2 5782.1530866154 ) 53.8411968855 (ExtendedPoll) - 1690+237 ( 2 0 4147.9010818337 2 5846.8849617209 ) 53.8388064213 (ExtendedPoll) - 1690+239 ( 2 0 4139.4939903168 2 5859.9869225266 ) 53.7929039460 (ExtendedPoll) - 1690+243 ( 2 0 4134.1713187395 2 5865.6917346274 ) 53.7882968215 (ExtendedPoll) - 1690+250 ( 2 0 4133.4948958932 2 5866.3963062176 ) 53.7879136446 (ExtendedPoll) - 1690+251 ( 2 0 4131.4656273543 2 5868.5100209882 ) 53.7867806418 (ExtendedPoll) - 1690+261 ( 2 0 4131.5933562783 2 5868.3938874275 ) 53.7866942837 (ExtendedPoll) - 1690+270 ( 2 0 4131.5998202039 2 5868.3898345950 ) 53.7866729850 (ExtendedPoll) - 1690+271 ( 2 0 4131.6192119808 2 5868.3776760976 ) 53.7866090899 (ExtendedPoll) - 1690+279 ( 2 0 4131.6209541211 2 5868.3784525807 ) 53.7865860060 (ExtendedPoll) - 1690+284 ( 2 0 4131.6214166274 2 5868.3783365570 ) 53.7865828676 (ExtendedPoll) - 1690+287 ( 2 0 4131.6210066099 2 5868.3788719382 ) 53.7865816357 (ExtendedPoll) - 1690+293 ( 2 0 4131.6209362583 2 5868.3789681750 ) 53.7865813838 (ExtendedPoll) - 1690+294 ( 2 0 4131.6207252036 2 5868.3792568852 ) 53.7865806279 (ExtendedPoll) - 1690+298 ( 2 0 4131.6206891940 2 5868.3793043828 ) 53.7865805153 (ExtendedPoll) - 1690+304 ( 2 0 4131.6206796375 2 5868.3793158160 ) 53.7865804962 (ExtendedPoll) - 1690+308 ( 2 0 4131.6206768768 2 5868.3793227362 ) 53.7865804572 (ExtendedPoll) - 1690+313 ( 2 0 4131.6206782642 2 5868.3793214934 ) 53.7865804561 (ExtendedPoll) - 1690+315 ( 2 0 4131.6206745081 2 5868.3793251876 ) 53.7865804560 (ExtendedPoll) - 1690+316 ( 2 0 4131.6206632396 2 5868.3793362702 ) 53.7865804559 (ExtendedPoll) - 1690+317 ( 2 0 4131.6206181660 2 5868.3793806004 ) 53.7865804552 (ExtendedPoll) - 1690+318 ( 2 0 4131.6204378713 2 5868.3795579212 ) 53.7865804528 (ExtendedPoll) - 1690+319 ( 2 0 4131.6197166927 2 5868.3802672046 ) 53.7865804428 (ExtendedPoll) - 1690+320 ( 2 0 4131.6168319783 2 5868.3831043383 ) 53.7865804032 (ExtendedPoll) - 1690+321 ( 2 0 4131.6052931206 2 5868.3944528729 ) 53.7865802452 (ExtendedPoll) - 1690+322 ( 2 0 4131.5591376898 2 5868.4398470112 ) 53.7865796204 (ExtendedPoll) - 1690+323 ( 2 0 4131.3745159668 2 5868.6214235646 ) 53.7865772402 (ExtendedPoll) - 1690+324 ( 2 0 4130.6360290747 2 5869.3477297782 ) 53.7865696199 (ExtendedPoll) - 1690+325 ( 2 0 4127.6820815062 2 5872.2529546326 ) 53.7865695587 (ExtendedPoll) - 1690+328 ( 2 0 4127.6840140147 2 5872.2603352230 ) 53.7864835442 (ExtendedPoll) - 1690+329 ( 2 0 4127.6898115401 2 5872.2824769939 ) 53.7862255016 (ExtendedPoll) - 1690+330 ( 2 0 4127.6796235307 2 5872.3112438240 ) 53.7860518834 (ExtendedPoll) - 1690+338 ( 2 0 4127.6784943469 2 5872.3148875688 ) 53.7860284213 (ExtendedPoll) - 1690+339 ( 2 0 4127.6750287014 2 5872.3216844082 ) 53.7859970553 (ExtendedPoll) - 1690+345 ( 2 0 4127.6738721701 2 5872.3232011194 ) 53.7859935510 (ExtendedPoll) - 1690+346 ( 2 0 4127.6704025761 2 5872.3277512530 ) 53.7859830384 (ExtendedPoll) - 1690+352 ( 2 0 4127.6704920471 2 5872.3287007212 ) 53.7859734249 (ExtendedPoll) - 1690+357 ( 2 0 4127.6702519860 2 5872.3291127215 ) 53.7859717972 (ExtendedPoll) - 1690+358 ( 2 0 4127.6695318024 2 5872.3303487226 ) 53.7859669139 (ExtendedPoll) - 1690+364 ( 2 0 4127.6693723329 2 5872.3305259594 ) 53.7859667262 (ExtendedPoll) - 1690+365 ( 2 0 4127.6688939242 2 5872.3310576698 ) 53.7859661633 (ExtendedPoll) - 1690+372 ( 2 0 4127.6688751072 2 5872.3311142263 ) 53.7859658109 (ExtendedPoll) - 1690+374 ( 2 0 4127.6689990935 2 5872.3309999936 ) 53.7859657384 (ExtendedPoll) - 1690+382 ( 2 0 4127.6690021165 2 5872.3309978166 ) 53.7859657310 (ExtendedPoll) - 2080+20 ( 2 0 4999.9878997345 2 5000.0092959702 ) 55.9016794952 (ExtendedPoll) - 2080+21 ( 2 0 4999.9515989379 2 5000.0371838810 ) 55.9016196708 (ExtendedPoll) - 2080+22 ( 2 0 4999.8063957515 2 5000.1487355238 ) 55.9013804121 (ExtendedPoll) - 2080+23 ( 2 0 4999.2255830062 2 5000.5949420954 ) 55.9004239959 (ExtendedPoll) - 2080+24 ( 2 0 4996.9023320246 2 5002.3797683814 ) 55.8966082342 (ExtendedPoll) - 2080+25 ( 2 0 4987.6093280984 2 5009.5190735258 ) 55.8815039246 (ExtendedPoll) - 2080+26 ( 2 0 4950.4373123937 2 5038.0762941031 ) 55.8236448341 (ExtendedPoll) - 2080+27 ( 2 0 4801.7492495748 2 5152.3051764124 ) 55.6343152023 (ExtendedPoll) - 2080+28 ( 2 0 4206.9969982993 2 5609.2207056496 ) 55.6253373563 (ExtendedPoll) - 2080+32 ( 2 0 4217.9971862258 2 5610.1214654550 ) 55.5187948731 (ExtendedPoll) - 2080+33 ( 2 0 4250.9977500050 2 5612.8237448711 ) 55.2000072940 (ExtendedPoll) - 2080+34 ( 2 0 4279.8220637775 2 5600.5952481192 ) 55.0710067569 (ExtendedPoll) - 2080+35 ( 2 0 4366.2950050949 2 5563.9097578633 ) 54.6951789859 (ExtendedPoll) - 2080+39 ( 2 0 4393.3723907599 2 5548.1874048965 ) 54.6249740689 (ExtendedPoll) - 2080+40 ( 2 0 4474.6045477550 2 5501.0203459961 ) 54.4266469861 (ExtendedPoll) - 2080+42 ( 2 0 4525.2654628702 2 5464.3348557403 ) 54.3900963042 (ExtendedPoll) - 2080+48 ( 2 0 4514.4563452056 2 5483.6602479286 ) 54.2742359116 (ExtendedPoll) - 2080+49 ( 2 0 4491.7462798091 2 5505.0601172445 ) 54.2385084897 (ExtendedPoll) - 2080+50 ( 2 0 4423.6160836196 2 5569.2597251923 ) 54.1460338788 (ExtendedPoll) - 2080+51 ( 2 0 4151.0952988618 2 5826.0581569833 ) 54.0054730693 (ExtendedPoll) - 2080+57 ( 2 0 4119.6505929283 2 5880.2129283134 ) 53.7862527117 (ExtendedPoll) - 2080+75 ( 2 0 4119.5665931846 2 5880.3014995623 ) 53.7862021958 (ExtendedPoll) - 2080+76 ( 2 0 4119.3145939537 2 5880.5672133090 ) 53.7860509080 (ExtendedPoll) - 2080+77 ( 2 0 4118.3065970302 2 5881.6300682960 ) 53.7854496575 (ExtendedPoll) - 2080+88 ( 2 0 4118.3108711544 2 5881.6602849630 ) 53.7851316932 (ExtendedPoll) - 2080+96 ( 2 0 4118.3198847115 2 5881.6662155602 ) 53.7849945777 (ExtendedPoll) - 2080+97 ( 2 0 4118.3348277986 2 5881.6631276284 ) 53.7848865134 (ExtendedPoll) - 2080+99 ( 2 0 4118.3462668702 2 5881.6530292707 ) 53.7848751796 (ExtendedPoll) - 2080+108 ( 2 0 4118.3455932557 2 5881.6537043543 ) 53.7848751047 (ExtendedPoll) - 2080+109 ( 2 0 4118.3435724122 2 5881.6557296052 ) 53.7848748801 (ExtendedPoll) - 2080+110 ( 2 0 4118.3354890381 2 5881.6638306090 ) 53.7848739818 (ExtendedPoll) - 2080+111 ( 2 0 4118.3031555418 2 5881.6962346240 ) 53.7848703922 (ExtendedPoll) - 2080+112 ( 2 0 4118.1738215565 2 5881.8258506839 ) 53.7848560937 (ExtendedPoll) - 2080+122 ( 2 0 4118.1735085463 2 5881.8262104036 ) 53.7848556344 (ExtendedPoll) - 2080+123 ( 2 0 4118.1725695157 2 5881.8272895629 ) 53.7848542566 (ExtendedPoll) - 2080+132 ( 2 0 4118.1726545887 2 5881.8272060557 ) 53.7848542498 (ExtendedPoll) - 2080+133 ( 2 0 4118.1729098077 2 5881.8269555344 ) 53.7848542294 (ExtendedPoll) - 2080+134 ( 2 0 4118.1739306837 2 5881.8259534489 ) 53.7848541479 (ExtendedPoll) - 2080+135 ( 2 0 4118.1780141879 2 5881.8219451070 ) 53.7848538220 (ExtendedPoll) - 2080+151 ( 2 0 4118.1780093963 2 5881.8219592167 ) 53.7848537356 (ExtendedPoll) - 2080+152 ( 2 0 4118.1779950216 2 5881.8220015460 ) 53.7848534763 (ExtendedPoll) - 2080+159 ( 2 0 4118.1779947385 2 5881.8220052606 ) 53.7848534446 (ExtendedPoll) - 2251+6 ( 2 0 4168.4622208673 2 5740.6975175468 ) 54.6654457702 (ExtendedPoll) - 2251+7 ( 2 0 3937.8677106876 2 6034.1814395937 ) 54.1025876908 (ExtendedPoll) - 2251+15 ( 2 0 3968.8756845943 2 6029.8141193251 ) 53.8471893590 (ExtendedPoll) - 2251+23 ( 2 0 3966.3440036262 2 6032.7893562581 ) 53.8453293272 (ExtendedPoll) - 2251+29 ( 2 0 3967.2852805629 2 6032.5287671287 ) 53.8387026417 (ExtendedPoll) - 2251+32 ( 2 0 3966.9613567598 2 6032.8941676795 ) 53.8385991104 (ExtendedPoll) - 2251+33 ( 2 0 3965.9895853505 2 6033.9903693319 ) 53.8382928991 (ExtendedPoll) - 2251+45 ( 2 0 3966.0039197226 2 6033.9851390276 ) 53.8382028409 (ExtendedPoll) - 2251+46 ( 2 0 3966.0291479677 2 6033.9679675607 ) 53.8381131770 (ExtendedPoll) - 2251+52 ( 2 0 3966.0378553973 2 6033.9615960721 ) 53.8380860741 (ExtendedPoll) - 2251+64 ( 2 0 3966.0380469160 2 6033.9618735742 ) 53.8380818691 (ExtendedPoll) - 2251+69 ( 2 0 3966.0381004053 2 6033.9618472758 ) 53.8380815916 (ExtendedPoll) - 2251+74 ( 2 0 3966.0381302064 2 6033.9618470067 ) 53.8380813128 (ExtendedPoll) - 2251+79 ( 2 0 3966.0381451069 2 6033.9618471499 ) 53.8380811710 (ExtendedPoll) - 2251+84 ( 2 0 3966.0381513080 2 6033.9618430199 ) 53.8380811481 (ExtendedPoll) - 2251+86 ( 2 0 3966.0381381930 2 6033.9618595149 ) 53.8380811293 (ExtendedPoll) - 2251+91 ( 2 0 3966.0381418784 2 6033.9618557502 ) 53.8380811271 (ExtendedPoll) - 2251+92 ( 2 0 3966.0381529347 2 6033.9618444560 ) 53.8380811204 (ExtendedPoll) - 2251+93 ( 2 0 3966.0381971599 2 6033.9617992793 ) 53.8380810935 (ExtendedPoll) - 2251+94 ( 2 0 3966.0383740607 2 6033.9616185725 ) 53.8380809858 (ExtendedPoll) - 2251+95 ( 2 0 3966.0390816638 2 6033.9608957451 ) 53.8380805552 (ExtendedPoll) - 2251+96 ( 2 0 3966.0419120761 2 6033.9580044356 ) 53.8380788327 (ExtendedPoll) - 2251+97 ( 2 0 3966.0532337255 2 6033.9464391976 ) 53.8380719433 (ExtendedPoll) - 2251+98 ( 2 0 3966.0985203229 2 6033.9001782457 ) 53.8380443936 (ExtendedPoll) - 2251+99 ( 2 0 3966.2796667126 2 6033.7151344380 ) 53.8379343190 (ExtendedPoll) - 2251+100 ( 2 0 3967.0042522715 2 6032.9749592074 ) 53.8374960138 (ExtendedPoll) - 2251+101 ( 2 0 3969.9025945070 2 6030.0142582847 ) 53.8357746693 (ExtendedPoll) - 2251+102 ( 2 0 3981.4959634492 2 6018.1714545940 ) 53.8293988351 (ExtendedPoll) - 2251+103 ( 2 0 4027.8694392178 2 5970.8002398312 ) 53.8120165816 (ExtendedPoll) - 2251+105 ( 2 0 4027.8996279793 2 5970.7957732839 ) 53.8117751288 (ExtendedPoll) - 2251+106 ( 2 0 4027.9901942637 2 5970.7823736422 ) 53.8110507797 (ExtendedPoll) - 2251+107 ( 2 0 4028.3524594017 2 5970.7287750751 ) 53.8081535202 (ExtendedPoll) - 2251+108 ( 2 0 4028.5782890972 2 5970.8215646372 ) 53.8052259801 (ExtendedPoll) - 2251+109 ( 2 0 4029.0659874104 2 5970.8447020517 ) 53.8004791353 (ExtendedPoll) - 2251+117 ( 2 0 4029.1224148462 2 5970.8679660822 ) 53.7997469853 (ExtendedPoll) - 2251+125 ( 2 0 4029.1289146169 2 5970.8639709871 ) 53.7997219690 (ExtendedPoll) - 2251+129 ( 2 0 4029.1327113864 2 5970.8636015775 ) 53.7996898997 (ExtendedPoll) - 2251+134 ( 2 0 4029.1345329350 2 5970.8641672091 ) 53.7996679124 (ExtendedPoll) - 2251+136 ( 2 0 4029.1361890843 2 5970.8632210851 ) 53.7996608999 (ExtendedPoll) - 2251+142 ( 2 0 4029.1366590260 2 5970.8631402857 ) 53.7996572423 (ExtendedPoll) - 2251+146 ( 2 0 4029.1368554851 2 5970.8630052034 ) 53.7996566135 (ExtendedPoll) - 2251+147 ( 2 0 4029.1372198865 2 5970.8626976562 ) 53.7996559536 (ExtendedPoll) - 2251+158 ( 2 0 4029.1372434032 2 5970.8627159631 ) 53.7996555720 (ExtendedPoll) - 2251+159 ( 2 0 4029.1372160758 2 5970.8627689341 ) 53.7996553557 (ExtendedPoll) - 2251+165 ( 2 0 4029.1372107574 2 5970.8627828538 ) 53.7996552815 (ExtendedPoll) - 2251+168 ( 2 0 4029.1372020883 2 5970.8627949737 ) 53.7996552545 (ExtendedPoll) - 2251+172 ( 2 0 4029.1371973626 2 5970.8628007338 ) 53.7996552473 (ExtendedPoll) - 2251+179 ( 2 0 4029.1371969852 2 5970.8628025579 ) 53.7996552346 (ExtendedPoll) - 2251+181 ( 2 0 4029.1372006890 2 5970.8627988111 ) 53.7996552334 (ExtendedPoll) - 2251+182 ( 2 0 4029.1372118001 2 5970.8627875709 ) 53.7996552298 (ExtendedPoll) - 2251+183 ( 2 0 4029.1372562449 2 5970.8627426102 ) 53.7996552156 (ExtendedPoll) - 2251+184 ( 2 0 4029.1374340239 2 5970.8625627674 ) 53.7996551585 (ExtendedPoll) - 2251+185 ( 2 0 4029.1381451401 2 5970.8618433959 ) 53.7996549302 (ExtendedPoll) - 2251+186 ( 2 0 4029.1409896047 2 5970.8589659099 ) 53.7996540170 (ExtendedPoll) - 2251+187 ( 2 0 4029.1523674632 2 5970.8474559659 ) 53.7996503647 (ExtendedPoll) - 2251+188 ( 2 0 4029.1978788972 2 5970.8014161900 ) 53.7996357631 (ExtendedPoll) - 2251+189 ( 2 0 4029.3799246331 2 5970.6172570866 ) 53.7995774796 (ExtendedPoll) - 2251+190 ( 2 0 4030.1081075767 2 5969.8806206727 ) 53.7993463077 (ExtendedPoll) - 2251+191 ( 2 0 4033.0208393511 2 5966.9340750174 ) 53.7984530101 (ExtendedPoll) - 2251+192 ( 2 0 4044.6717664489 2 5955.1478923961 ) 53.7953815270 (ExtendedPoll) - 2251+193 ( 2 0 4091.2754748399 2 5908.0031619108 ) 53.7910882360 (ExtendedPoll) - 2251+196 ( 2 0 4091.3024169829 2 5908.0174949293 ) 53.7907097823 (ExtendedPoll) - 2251+197 ( 2 0 4091.3832434122 2 5908.0604939849 ) 53.7895744291 (ExtendedPoll) - 2251+198 ( 2 0 4091.7065491291 2 5908.2324902073 ) 53.7850331320 (ExtendedPoll) - 2251+201 ( 2 0 4091.7062625770 2 5908.2935241345 ) 53.7844786297 (ExtendedPoll) - 2251+218 ( 2 0 4091.7061814853 2 5908.2937483387 ) 53.7844773284 (ExtendedPoll) - 2251+225 ( 2 0 4091.7061774429 2 5908.2938078061 ) 53.7844768227 (ExtendedPoll) - 2251+228 ( 2 0 4091.7061404988 2 5908.2938545806 ) 53.7844767353 (ExtendedPoll) - 2251+237 ( 2 0 4091.7061392073 2 5908.2938580748 ) 53.7844767152 (ExtendedPoll) - 2251+242 ( 2 0 4091.7061402086 2 5908.2938596455 ) 53.7844766917 (ExtendedPoll) - 2251+251 ( 2 0 4091.7061402086 2 5908.2938597496 ) 53.7844766907 (ExtendedPoll) - 2507+6 ( 2 0 4987.7715032480 2 5009.7172875975 ) 55.8778410034 (ExtendedPoll) - 2507+7 ( 2 0 4951.0860129922 2 5038.8691503901 ) 55.8090330212 (ExtendedPoll) - 2507+8 ( 2 0 4804.3440519688 2 5155.4766015605 ) 55.5765193455 (ExtendedPoll) - 2507+9 ( 2 0 4217.3762078751 2 5621.9064062421 ) 55.4051303015 (ExtendedPoll) - 2507+11 ( 2 0 4105.5728090001 2 5845.5132039921 ) 54.2371769988 (ExtendedPoll) - 2507+17 ( 2 0 4084.6096717110 2 5904.9087596444 ) 53.8806341533 (ExtendedPoll) - 2507+25 ( 2 0 4086.4930785768 2 5912.4969786111 ) 53.7940773323 (ExtendedPoll) - 2507+28 ( 2 0 4089.6866815232 2 5910.2450790976 ) 53.7852355401 (ExtendedPoll) - 2507+40 ( 2 0 4089.7473972443 2 5910.2388432578 ) 53.7847342099 (ExtendedPoll) - 2507+48 ( 2 0 4089.7542955796 2 5910.2355843266 ) 53.7847005125 (ExtendedPoll) - 2507+49 ( 2 0 4089.7673972155 2 5910.2277626627 ) 53.7846513996 (ExtendedPoll) - 2507+51 ( 2 0 4089.7801055712 2 5910.2193169774 ) 53.7846115945 (ExtendedPoll) - 2507+62 ( 2 0 4089.7805040628 2 5910.2190551032 ) 53.7846103195 (ExtendedPoll) - 2507+63 ( 2 0 4089.7816995375 2 5910.2182694805 ) 53.7846064942 (ExtendedPoll) - 2507+73 ( 2 0 4089.7816945523 2 5910.2182988629 ) 53.7846062720 (ExtendedPoll) - 2507+80 ( 2 0 4089.7816938911 2 5910.2183025290 ) 53.7846062447 (ExtendedPoll) - 2507+83 ( 2 0 4089.7816931323 2 5910.2183061762 ) 53.7846062184 (ExtendedPoll) - 2507+86 ( 2 0 4089.7816946030 2 5910.2183050332 ) 53.7846062153 (ExtendedPoll) - 2507+97 ( 2 0 4089.7816947071 2 5910.2183050332 ) 53.7846062143 (ExtendedPoll) - 2609+6 ( 2 0 4993.6127941072 2 5004.5037990269 ) 55.8961392637 (ExtendedPoll) - 2609+7 ( 2 0 4974.4511764290 2 5018.0151961078 ) 55.8801113087 (ExtendedPoll) - 2609+8 ( 2 0 4897.8047057158 2 5072.0607844311 ) 55.8259328921 (ExtendedPoll) - 2609+9 ( 2 0 4591.2188228633 2 5288.2431377246 ) 55.7773330381 (ExtendedPoll) - 2609+12 ( 2 0 4584.2311104336 2 5414.0219614589 ) 54.4414663757 (ExtendedPoll) - 2609+22 ( 2 0 4587.3564740008 2 5411.6745268146 ) 54.4410956907 (ExtendedPoll) - 2609+29 ( 2 0 4587.5587397857 2 5412.1189357716 ) 54.4345618898 (ExtendedPoll) - 2609+33 ( 2 0 4587.4405737045 2 5412.3325570157 ) 54.4332122013 (ExtendedPoll) - 2609+34 ( 2 0 4587.0527821074 2 5412.6292916912 ) 54.4331973113 (ExtendedPoll) - 2609+35 ( 2 0 4585.8894073161 2 5413.5194957176 ) 54.4331558220 (ExtendedPoll) - 2609+36 ( 2 0 4581.2359081511 2 5417.0803118233 ) 54.4330376116 (ExtendedPoll) - 2609+38 ( 2 0 4579.3525012852 2 5420.4991047210 ) 54.4114704020 (ExtendedPoll) - 2609+39 ( 2 0 4573.3201401643 2 5425.4669315265 ) 54.4076771370 (ExtendedPoll) - 2609+40 ( 2 0 4555.2230568015 2 5440.3704119429 ) 54.3971432812 (ExtendedPoll) - 2609+41 ( 2 0 4482.8347233502 2 5499.9843336087 ) 54.3678394409 (ExtendedPoll) - 2609+49 ( 2 0 4485.3459325046 2 5507.3814823136 ) 54.2681454161 (ExtendedPoll) - 2609+50 ( 2 0 4475.1919128802 2 5519.2824300454 ) 54.2285251876 (ExtendedPoll) - 2609+51 ( 2 0 4444.7298540071 2 5554.9852732408 ) 54.1136470777 (ExtendedPoll) - 2609+58 ( 2 0 4443.9800738281 2 5555.6109430488 ) 54.1135341068 (ExtendedPoll) - 2609+59 ( 2 0 4441.7307332914 2 5557.4879524728 ) 54.1132091099 (ExtendedPoll) - 2609+60 ( 2 0 4432.7333711444 2 5564.9959901689 ) 54.1121181220 (ExtendedPoll) - 2609+61 ( 2 0 4396.7439225563 2 5595.0281409531 ) 54.1111148301 (ExtendedPoll) - 2609+63 ( 2 0 4386.2623539118 2 5606.6015396648 ) 54.0828747897 (ExtendedPoll) - 2609+64 ( 2 0 4354.8176479782 2 5641.3217357998 ) 54.0021675011 (ExtendedPoll) - 2609+67 ( 2 0 4332.5443146086 2 5663.1583371426 ) 53.9763377152 (ExtendedPoll) - 2609+68 ( 2 0 4265.7243144997 2 5728.6681411709 ) 53.9145504521 (ExtendedPoll) - 2609+69 ( 2 0 3998.4443140642 2 5990.7073572841 ) 53.9107416673 (ExtendedPoll) - 2609+77 ( 2 0 3977.9179088020 2 6014.2908867343 ) 53.8968485442 (ExtendedPoll) - 2609+85 ( 2 0 3977.6108315956 2 6018.1873552864 ) 53.8658100136 (ExtendedPoll) - 2609+87 ( 2 0 3985.4720080790 2 6010.4353618097 ) 53.8594585168 (ExtendedPoll) - 2609+88 ( 2 0 4009.0555375292 2 5987.1793813797 ) 53.8425419841 (ExtendedPoll) - 2609+89 ( 2 0 4103.3896553299 2 5894.1554596595 ) 53.8066758321 (ExtendedPoll) - 2609+98 ( 2 0 4105.0239884617 2 5893.0858073906 ) 53.8015202481 (ExtendedPoll) - 2609+99 ( 2 0 4109.9269878569 2 5889.8768505839 ) 53.7861093451 (ExtendedPoll) - 2609+108 ( 2 0 4110.1419152454 2 5889.7610302313 ) 53.7852071379 (ExtendedPoll) - 2609+116 ( 2 0 4110.1058896513 2 5889.8103005292 ) 53.7850837032 (ExtendedPoll) - 2609+117 ( 2 0 4109.9978128689 2 5889.9581114227 ) 53.7847134692 (ExtendedPoll) - 2609+120 ( 2 0 4110.1308929863 2 5889.8481353998 ) 53.7845067680 (ExtendedPoll) - 2609+123 ( 2 0 4110.2185046189 2 5889.7631360559 ) 53.7844866226 (ExtendedPoll) - 2609+124 ( 2 0 4110.4813395169 2 5889.5081380242 ) 53.7844264399 (ExtendedPoll) - 2609+134 ( 2 0 4110.4929230099 2 5889.4982056417 ) 53.7844117835 (ExtendedPoll) - 2609+135 ( 2 0 4110.5276734889 2 5889.4684084945 ) 53.7843678178 (ExtendedPoll) - 2609+142 ( 2 0 4110.5308528491 2 5889.4663005158 ) 53.7843581081 (ExtendedPoll) - 2609+143 ( 2 0 4110.5369402846 2 5889.4617014955 ) 53.7843446963 (ExtendedPoll) - 2609+148 ( 2 0 4110.5385864786 2 5889.4607381551 ) 53.7843384902 (ExtendedPoll) - 2609+154 ( 2 0 4110.5389368624 2 5889.4610615818 ) 53.7843323072 (ExtendedPoll) - 2609+174 ( 2 0 4110.5389372789 2 5889.4610615818 ) 53.7843323034 (ExtendedPoll) - 2609+179 ( 2 0 4110.5389372789 2 5889.4610619983 ) 53.7843322995 (ExtendedPoll) - 2609+185 ( 2 0 4110.5389372789 2 5889.4610621024 ) 53.7843322986 (ExtendedPoll) - 2609+186 ( 2 0 4110.5389372789 2 5889.4610624148 ) 53.7843322957 (ExtendedPoll) - 2609+193 ( 2 0 4110.5389373050 2 5889.4610624148 ) 53.7843322955 (ExtendedPoll) - 2609+194 ( 2 0 4110.5389373831 2 5889.4610624148 ) 53.7843322947 (ExtendedPoll) - 2808+6 ( 2 0 4329.1796067501 2 5670.8203932499 ) 53.9289318169 (ExtendedPoll) - 2867+10 ( 2 0 4992.1115277649 2 5007.7246977250 ) 55.8685413615 (ExtendedPoll) - 2867+11 ( 2 0 4968.4461110597 2 5030.8987909000 ) 55.7705699043 (ExtendedPoll) - 2867+12 ( 2 0 4873.7844442388 2 5123.5951636001 ) 55.4016911655 (ExtendedPoll) - 2867+13 ( 2 0 4495.1377769551 2 5494.3806544003 ) 54.3231819620 (ExtendedPoll) - 2867+15 ( 2 0 4411.2852277989 2 5585.2209159863 ) 54.0868469342 (ExtendedPoll) - 2867+22 ( 2 0 4407.4365268122 2 5592.0175581542 ) 54.0499159225 (ExtendedPoll) - 2867+28 ( 2 0 4405.3364599175 2 5593.8105478426 ) 54.0495510124 (ExtendedPoll) - 2867+29 ( 2 0 4399.0362592332 2 5599.1895169077 ) 54.0485700853 (ExtendedPoll) - 2867+30 ( 2 0 4373.8354564960 2 5620.7053931683 ) 54.0463593230 (ExtendedPoll) - 2867+33 ( 2 0 4369.7137979926 2 5627.3382608261 ) 54.0145749170 (ExtendedPoll) - 2867+40 ( 2 0 4368.6287918634 2 5628.9623580510 ) 54.0074781800 (ExtendedPoll) - 2867+41 ( 2 0 4365.3737734757 2 5633.8346497256 ) 53.9862560504 (ExtendedPoll) - 2867+43 ( 2 0 4362.6919658733 2 5636.6802318381 ) 53.9806946516 (ExtendedPoll) - 2867+44 ( 2 0 4354.6465430661 2 5645.2169781755 ) 53.9642607181 (ExtendedPoll) - 2867+50 ( 2 0 4354.0247117231 2 5645.9701703234 ) 53.9620624682 (ExtendedPoll) - 2867+61 ( 2 0 4354.0368388529 2 5645.9609094433 ) 53.9620504600 (ExtendedPoll) - 2867+65 ( 2 0 4354.0401585606 2 5645.9590302273 ) 53.9620405451 (ExtendedPoll) - 2867+71 ( 2 0 4354.0409392116 2 5645.9584824325 ) 53.9620392835 (ExtendedPoll) - 2867+74 ( 2 0 4354.0405359427 2 5645.9593466482 ) 53.9620340616 (ExtendedPoll) - 2867+87 ( 2 0 4354.0405617934 2 5645.9593318187 ) 53.9620339864 (ExtendedPoll) - 2867+88 ( 2 0 4354.0406393458 2 5645.9592873300 ) 53.9620337607 (ExtendedPoll) - 2867+89 ( 2 0 4354.0407417896 2 5645.9592263700 ) 53.9620334847 (ExtendedPoll) - 2867+98 ( 2 0 4354.0407563620 2 5645.9592294825 ) 53.9620333264 (ExtendedPoll) - 2867+99 ( 2 0 4354.0407811713 2 5645.9592129695 ) 53.9620332772 (ExtendedPoll) - 2867+106 ( 2 0 4354.0407786145 2 5645.9592156788 ) 53.9620332721 (ExtendedPoll) - 2867+107 ( 2 0 4354.0407709439 2 5645.9592238067 ) 53.9620332568 (ExtendedPoll) - 2867+108 ( 2 0 4354.0407402615 2 5645.9592563181 ) 53.9620331954 (ExtendedPoll) - 2867+114 ( 2 0 4354.0407434536 2 5645.9592543977 ) 53.9620331870 (ExtendedPoll) - 2867+122 ( 2 0 4354.0407434536 2 5645.9592560637 ) 53.9620331701 (ExtendedPoll) - 2867+123 ( 2 0 4354.0407422389 2 5645.9592574757 ) 53.9620331665 (ExtendedPoll) - 3058+8 ( 2 0 4991.1561764562 2 5006.6055719062 ) 55.8895337846 (ExtendedPoll) - 3058+9 ( 2 0 4964.6247058247 2 5026.4222876248 ) 55.8543769246 (ExtendedPoll) - 3058+10 ( 2 0 4858.4988232988 2 5105.6891504990 ) 55.7342678543 (ExtendedPoll) - 3058+11 ( 2 0 4433.9952931954 2 5422.7566019961 ) 55.6083992097 (ExtendedPoll) - 3058+16 ( 2 0 4468.9338553438 2 5473.4175171113 ) 54.7683907188 (ExtendedPoll) - 3058+17 ( 2 0 4371.1058813282 2 5557.2700662675 ) 54.7224471575 (ExtendedPoll) - 3058+22 ( 2 0 4374.5997375430 2 5620.1594781347 ) 54.0452990385 (ExtendedPoll) - 3058+26 ( 2 0 4353.6366002540 2 5643.3062755580 ) 53.9923716603 (ExtendedPoll) - 3058+34 ( 2 0 4352.3741717388 2 5647.0048499105 ) 53.9659824019 (ExtendedPoll) - 3058+41 ( 2 0 4352.7757178358 2 5646.7270943123 ) 53.9652910126 (ExtendedPoll) - 3058+42 ( 2 0 4353.9803561267 2 5645.8938275179 ) 53.9632201609 (ExtendedPoll) - 3058+50 ( 2 0 4353.8820221150 2 5646.1172848288 ) 53.9618183016 (ExtendedPoll) - 3058+67 ( 2 0 4353.8828862995 2 5646.1168814928 ) 53.9618148524 (ExtendedPoll) - 3058+70 ( 2 0 4353.8819301637 2 5646.1178326989 ) 53.9618135661 (ExtendedPoll) - 3058+71 ( 2 0 4353.8790617562 2 5646.1206863173 ) 53.9618097072 (ExtendedPoll) - 3058+72 ( 2 0 4353.8675881265 2 5646.1321007910 ) 53.9617942721 (ExtendedPoll) - 3058+73 ( 2 0 4353.8216936077 2 5646.1777586857 ) 53.9617325386 (ExtendedPoll) - 3058+74 ( 2 0 4353.6381155322 2 5646.3603902646 ) 53.9614857168 (ExtendedPoll) - 3058+75 ( 2 0 4352.9038032305 2 5647.0909165803 ) 53.9605002241 (ExtendedPoll) - 3058+76 ( 2 0 4349.9665540238 2 5650.0130218428 ) 53.9565869794 (ExtendedPoll) - 3058+77 ( 2 0 4338.2175571967 2 5661.7014428928 ) 53.9413943430 (ExtendedPoll) - 3058+78 ( 2 0 4291.2215698885 2 5708.4551270929 ) 53.8880355778 (ExtendedPoll) - 3058+79 ( 2 0 4103.2376206554 2 5895.4698638933 ) 53.7960048025 (ExtendedPoll) - 3058+83 ( 2 0 4103.0824826918 2 5895.9328254315 ) 53.7931789654 (ExtendedPoll) - 3058+84 ( 2 0 4102.6170688008 2 5897.3217100462 ) 53.7847063488 (ExtendedPoll) - 3058+88 ( 2 0 4102.3017815441 2 5897.6944676551 ) 53.7841793274 (ExtendedPoll) - 3058+104 ( 2 0 4102.3028217662 2 5897.6960663778 ) 53.7841551305 (ExtendedPoll) - 3058+106 ( 2 0 4102.3045951993 2 5897.6953642985 ) 53.7841453060 (ExtendedPoll) - 3058+116 ( 2 0 4102.3046242597 2 5897.6953709067 ) 53.7841449789 (ExtendedPoll) - 3058+126 ( 2 0 4102.3046246516 2 5897.6953727277 ) 53.7841449586 (ExtendedPoll) - 3058+128 ( 2 0 4102.3046253455 2 5897.6953744562 ) 53.7841449364 (ExtendedPoll) - 3058+140 ( 2 0 4102.3046253471 2 5897.6953744562 ) 53.7841449364 (ExtendedPoll) - 3058+141 ( 2 0 4102.3046253520 2 5897.6953744562 ) 53.7841449364 (ExtendedPoll) - 3058+142 ( 2 0 4102.3046253715 2 5897.6953744562 ) 53.7841449362 (ExtendedPoll) - 3058+143 ( 2 0 4102.3046254496 2 5897.6953744562 ) 53.7841449355 (ExtendedPoll) - 3211+9 ( 2 0 4999.2843395107 2 5000.6644809549 ) 55.8991235044 (ExtendedPoll) - 3211+10 ( 2 0 4997.1373580427 2 5002.6579238197 ) 55.8914071579 (ExtendedPoll) - 3211+11 ( 2 0 4988.5494321709 2 5010.6316952788 ) 55.8607138749 (ExtendedPoll) - 3211+12 ( 2 0 4954.1977286835 2 5042.5267811150 ) 55.7407142386 (ExtendedPoll) - 3211+13 ( 2 0 4816.7909147341 2 5170.1071244602 ) 55.3063592103 (ExtendedPoll) - 3211+14 ( 2 0 4267.1636589366 2 5680.4284978408 ) 54.3782156485 (ExtendedPoll) - 3211+16 ( 2 0 4258.4290183995 2 5741.5709816005 ) 53.8530873348 (ExtendedPoll) - 3275+16 ( 2 0 4999.4544048385 2 5000.4231907750 ) 55.9007514521 (ExtendedPoll) - 3275+17 ( 2 0 4997.8176193541 2 5001.6927631002 ) 55.8979127990 (ExtendedPoll) - 3275+18 ( 2 0 4991.2704774163 2 5006.7710524007 ) 55.8866378337 (ExtendedPoll) - 3275+19 ( 2 0 4965.0819096653 2 5027.0842096030 ) 55.8428188421 (ExtendedPoll) - 3275+20 ( 2 0 4860.3276386613 2 5108.3368384118 ) 55.6884538793 (ExtendedPoll) - 3275+21 ( 2 0 4441.3105546452 2 5433.3473536473 ) 55.4321933111 (ExtendedPoll) - 3275+24 ( 2 0 4440.4370905915 2 5464.7920595809 ) 55.1023491348 (ExtendedPoll) - 3275+25 ( 2 0 4437.8166984304 2 5559.1261773817 ) 54.1296401397 (ExtendedPoll) - 3275+28 ( 2 0 4394.1434957448 2 5604.5463081746 ) 54.0358312283 (ExtendedPoll) - 3275+31 ( 2 0 4348.7233649518 2 5648.2195108602 ) 53.9855229289 (ExtendedPoll) - 3275+32 ( 2 0 4212.4629725730 2 5779.2391189168 ) 53.8982210340 (ExtendedPoll) - 3275+39 ( 2 0 4246.9648026945 2 5751.7250012249 ) 53.8561122313 (ExtendedPoll) - 3275+44 ( 2 0 4253.1063468222 2 5746.8663574261 ) 53.8487569023 (ExtendedPoll) - 3275+54 ( 2 0 4253.0200213419 2 5746.9526629144 ) 53.8486838339 (ExtendedPoll) - 3275+55 ( 2 0 4252.7610449010 2 5747.2115793792 ) 53.8484648755 (ExtendedPoll) - 3275+56 ( 2 0 4251.7251391376 2 5748.2472452386 ) 53.8475927460 (ExtendedPoll) - 3275+57 ( 2 0 4247.5815160840 2 5752.3899086759 ) 53.8441635235 (ExtendedPoll) - 3275+58 ( 2 0 4231.0070238695 2 5768.9605624254 ) 53.8313972696 (ExtendedPoll) - 3275+59 ( 2 0 4164.7090550115 2 5835.2431774231 ) 53.7956619398 (ExtendedPoll) - 3275+72 ( 2 0 4164.7639497269 2 5835.2164964256 ) 53.7954160381 (ExtendedPoll) - 3275+76 ( 2 0 4164.7917332002 2 5835.2038710575 ) 53.7952833211 (ExtendedPoll) - 3275+77 ( 2 0 4164.8360404827 2 5835.1618928437 ) 53.7952771546 (ExtendedPoll) - 3275+85 ( 2 0 4164.8422068711 2 5835.1574002652 ) 53.7952636014 (ExtendedPoll) - 3275+97 ( 2 0 4164.8424175700 2 5835.1572886885 ) 53.7952627439 (ExtendedPoll) - 3275+102 ( 2 0 4164.8423842792 2 5835.1574031550 ) 53.7952619685 (ExtendedPoll) - 3275+109 ( 2 0 4164.8424622828 2 5835.1574351058 ) 53.7952609619 (ExtendedPoll) - 3275+110 ( 2 0 4164.8424186334 2 5835.1575460363 ) 53.7952603135 (ExtendedPoll) - 3275+117 ( 2 0 4164.8424468760 2 5835.1575365215 ) 53.7952601474 (ExtendedPoll) - 3275+121 ( 2 0 4164.8424209888 2 5835.1575697812 ) 53.7952600688 (ExtendedPoll) - 3275+129 ( 2 0 4164.8424239711 2 5835.1575675489 ) 53.7952600628 (ExtendedPoll) - 3275+130 ( 2 0 4164.8424329181 2 5835.1575608518 ) 53.7952600448 (ExtendedPoll) - 3275+135 ( 2 0 4164.8424361867 2 5835.1575626390 ) 53.7952599984 (ExtendedPoll) - 3275+138 ( 2 0 4164.8424402468 2 5835.1575592816 ) 53.7952599933 (ExtendedPoll) - 3275+145 ( 2 0 4164.8424410483 2 5835.1575588074 ) 53.7952599905 (ExtendedPoll) - 3275+147 ( 2 0 4164.8424392431 2 5835.1575607257 ) 53.7952599888 (ExtendedPoll) - 3436 ( 3 0 3333.3333333333 2 3333.3333333333 1 3333.3333333333 ) 47.1682905221 + 1689+27 ( 2 0 4999.9918793150 2 5000.0071042165 ) 55.9016755069 (ExtendedPoll) + 1689+28 ( 2 0 4999.9675172600 2 5000.0284168659 ) 55.9016037165 (ExtendedPoll) + 1689+29 ( 2 0 4999.8700690400 2 5000.1136674635 ) 55.9013165752 (ExtendedPoll) + 1689+30 ( 2 0 4999.4802761598 2 5000.4546698539 ) 55.9001683374 (ExtendedPoll) + 1689+31 ( 2 0 4997.9211046392 2 5001.8186794156 ) 55.8955806263 (ExtendedPoll) + 1689+32 ( 2 0 4991.6844185568 2 5007.2747176624 ) 55.8773137258 (ExtendedPoll) + 1689+33 ( 2 0 4966.7376742271 2 5029.0988706497 ) 55.8055960661 (ExtendedPoll) + 1689+34 ( 2 0 4866.9506969084 2 5116.3954825988 ) 55.5407618647 (ExtendedPoll) + 1689+35 ( 2 0 4467.8027876336 2 5465.5819303951 ) 54.8617064546 (ExtendedPoll) + 1689+37 ( 2 0 4466.8269645111 2 5469.3623920026 ) 54.8295561915 (ExtendedPoll) + 1689+38 ( 2 0 4463.8994951436 2 5480.7037768250 ) 54.7333779337 (ExtendedPoll) + 1689+39 ( 2 0 4452.1896176735 2 5526.0693161146 ) 54.3527873521 (ExtendedPoll) + 1689+40 ( 2 0 4432.0999444382 2 5550.0895775916 ) 54.2727755505 (ExtendedPoll) + 1689+41 ( 2 0 4371.8309247321 2 5622.1503620228 ) 54.0490159101 (ExtendedPoll) + 1689+48 ( 2 0 4367.1633511951 2 5628.4010891571 ) 54.0259049915 (ExtendedPoll) + 1689+52 ( 2 0 4367.4363087119 2 5632.2975577092 ) 53.9839463746 (ExtendedPoll) + 1689+64 ( 2 0 4367.5173563027 2 5632.3888412069 ) 53.9823156833 (ExtendedPoll) + 1689+67 ( 2 0 4367.5750698909 2 5632.4087032645 ) 53.9816128497 (ExtendedPoll) + 1689+77 ( 2 0 4367.5769053809 2 5632.4193356014 ) 53.9814889495 (ExtendedPoll) + 1689+82 ( 2 0 4367.5805624212 2 5632.4182502476 ) 53.9814682147 (ExtendedPoll) + 1689+86 ( 2 0 4367.5821046999 2 5632.4171280385 ) 53.9814662175 (ExtendedPoll) + 1689+90 ( 2 0 4367.5818878523 2 5632.4180567321 ) 53.9814586704 (ExtendedPoll) + 1689+104 ( 2 0 4367.5819056985 2 5632.4180679393 ) 53.9814584017 (ExtendedPoll) + 1689+105 ( 2 0 4367.5819346476 2 5632.4180608593 ) 53.9814582222 (ExtendedPoll) + 1689+109 ( 2 0 4367.5819216978 2 5632.4180774844 ) 53.9814581658 (ExtendedPoll) + 1689+115 ( 2 0 4367.5819257648 2 5632.4180741356 ) 53.9814581645 (ExtendedPoll) + 1689+120 ( 2 0 4367.5819244247 2 5632.4180754292 ) 53.9814581630 (ExtendedPoll) + 1689+121 ( 2 0 4367.5819204043 2 5632.4180793101 ) 53.9814581585 (ExtendedPoll) + 1689+122 ( 2 0 4367.5819043228 2 5632.4180948339 ) 53.9814581405 (ExtendedPoll) + 1689+123 ( 2 0 4367.5818399969 2 5632.4181569287 ) 53.9814580686 (ExtendedPoll) + 1689+124 ( 2 0 4367.5815826929 2 5632.4184053083 ) 53.9814577808 (ExtendedPoll) + 1689+125 ( 2 0 4367.5805534773 2 5632.4193988263 ) 53.9814566296 (ExtendedPoll) + 1689+126 ( 2 0 4367.5764366146 2 5632.4233728987 ) 53.9814520249 (ExtendedPoll) + 1689+127 ( 2 0 4367.5599691638 2 5632.4392691879 ) 53.9814336068 (ExtendedPoll) + 1689+128 ( 2 0 4367.4940993607 2 5632.5028543451 ) 53.9813599484 (ExtendedPoll) + 1689+129 ( 2 0 4367.2306201483 2 5632.7571949737 ) 53.9810655359 (ExtendedPoll) + 1689+130 ( 2 0 4366.1767032985 2 5633.7745574881 ) 53.9798914222 (ExtendedPoll) + 1689+131 ( 2 0 4361.9610358996 2 5637.8440075457 ) 53.9752515834 (ExtendedPoll) + 1689+132 ( 2 0 4345.0983663039 2 5654.1218077760 ) 53.9576001475 (ExtendedPoll) + 1689+133 ( 2 0 4277.6476879210 2 5719.2330086971 ) 53.9016513465 (ExtendedPoll) + 1689+135 ( 2 0 4277.6290591203 2 5719.2571811144 ) 53.9015782727 (ExtendedPoll) + 1689+136 ( 2 0 4277.5731727181 2 5719.3296983663 ) 53.9013590679 (ExtendedPoll) + 1689+137 ( 2 0 4277.3496271092 2 5719.6197673739 ) 53.9004824970 (ExtendedPoll) + 1689+138 ( 2 0 4276.4554446736 2 5720.7800434043 ) 53.8969801836 (ExtendedPoll) + 1689+139 ( 2 0 4272.8787149315 2 5725.4211475259 ) 53.8830344924 (ExtendedPoll) + 1689+140 ( 2 0 4272.2449416972 2 5726.1641037669 ) 53.8813532804 (ExtendedPoll) + 1689+141 ( 2 0 4270.3436219944 2 5728.3929724899 ) 53.8763261624 (ExtendedPoll) + 1689+145 ( 2 0 4269.8544309447 2 5729.2382877997 ) 53.8723721175 (ExtendedPoll) + 1689+146 ( 2 0 4268.9604950773 2 5730.9749800002 ) 53.8632736922 (ExtendedPoll) + 1689+157 ( 2 0 4268.9281879962 2 5731.0267642928 ) 53.8630526551 (ExtendedPoll) + 1689+162 ( 2 0 4268.9081672520 2 5731.0497967493 ) 53.8630044126 (ExtendedPoll) + 1689+163 ( 2 0 4268.8481050197 2 5731.1188941187 ) 53.8628597009 (ExtendedPoll) + 1689+167 ( 2 0 4268.9130457179 2 5731.0620335227 ) 53.8628413313 (ExtendedPoll) + 1689+168 ( 2 0 4269.1078678127 2 5730.8914517347 ) 53.8627863397 (ExtendedPoll) + 1689+172 ( 2 0 4268.9798523367 2 5731.0072720873 ) 53.8627858887 (ExtendedPoll) + 1689+173 ( 2 0 4268.5958059087 2 5731.3547331451 ) 53.8627850104 (ExtendedPoll) + 1689+182 ( 2 0 4268.5734598444 2 5731.3755169174 ) 53.8627794333 (ExtendedPoll) + 1689+183 ( 2 0 4268.5064216515 2 5731.4378682344 ) 53.8627627170 (ExtendedPoll) + 1689+184 ( 2 0 4268.2382688801 2 5731.6872735026 ) 53.8626960762 (ExtendedPoll) + 1689+185 ( 2 0 4267.1656577944 2 5732.6848945752 ) 53.8624331084 (ExtendedPoll) + 1689+186 ( 2 0 4262.8752134514 2 5736.6753788658 ) 53.8614387941 (ExtendedPoll) + 1689+187 ( 2 0 4245.7134360797 2 5752.6373160280 ) 53.8583843412 (ExtendedPoll) + 1689+190 ( 2 0 4247.8459166796 2 5750.8801520137 ) 53.8564841075 (ExtendedPoll) + 1689+191 ( 2 0 4254.2433584792 2 5745.6086599708 ) 53.8509013362 (ExtendedPoll) + 1689+203 ( 2 0 4254.3648432334 2 5745.5967180794 ) 53.8499381914 (ExtendedPoll) + 1689+208 ( 2 0 4254.3884937761 2 5745.5774316250 ) 53.8499159225 (ExtendedPoll) + 1689+209 ( 2 0 4254.4594454040 2 5745.5195722617 ) 53.8498491302 (ExtendedPoll) + 1689+216 ( 2 0 4254.4747041982 2 5745.5195660142 ) 53.8497136099 (ExtendedPoll) + 1689+222 ( 2 0 4254.4785171266 2 5745.5196821982 ) 53.8496785985 (ExtendedPoll) + 1689+225 ( 2 0 4254.4745684192 2 5745.5233580070 ) 53.8496778754 (ExtendedPoll) + 1689+226 ( 2 0 4254.4627222968 2 5745.5343854333 ) 53.8496757065 (ExtendedPoll) + 1689+227 ( 2 0 4254.4153378073 2 5745.5784951385 ) 53.8496670379 (ExtendedPoll) + 1689+228 ( 2 0 4254.2257998495 2 5745.7549339594 ) 53.8496324765 (ExtendedPoll) + 1689+229 ( 2 0 4253.4676480183 2 5746.4606892429 ) 53.8494960362 (ExtendedPoll) + 1689+230 ( 2 0 4250.4350406932 2 5749.2837103771 ) 53.8489791731 (ExtendedPoll) + 1689+231 ( 2 0 4238.3046113928 2 5760.5757949136 ) 53.8473747522 (ExtendedPoll) + 1689+233 ( 2 0 4237.9514726055 2 5760.9129400964 ) 53.8472576934 (ExtendedPoll) + 1689+234 ( 2 0 4236.8920562434 2 5761.9243756450 ) 53.8469104201 (ExtendedPoll) + 1689+235 ( 2 0 4232.6543907954 2 5765.9701178391 ) 53.8455799016 (ExtendedPoll) + 1689+236 ( 2 0 4215.7037290030 2 5782.1530866154 ) 53.8411968855 (ExtendedPoll) + 1689+237 ( 2 0 4147.9010818337 2 5846.8849617209 ) 53.8388064213 (ExtendedPoll) + 1689+239 ( 2 0 4139.4939903168 2 5859.9869225266 ) 53.7929039460 (ExtendedPoll) + 1689+243 ( 2 0 4134.1713187395 2 5865.6917346274 ) 53.7882968215 (ExtendedPoll) + 1689+250 ( 2 0 4133.4948958932 2 5866.3963062176 ) 53.7879136446 (ExtendedPoll) + 1689+251 ( 2 0 4131.4656273543 2 5868.5100209882 ) 53.7867806418 (ExtendedPoll) + 1689+261 ( 2 0 4131.5933562783 2 5868.3938874275 ) 53.7866942837 (ExtendedPoll) + 1689+270 ( 2 0 4131.5998202039 2 5868.3898345950 ) 53.7866729850 (ExtendedPoll) + 1689+271 ( 2 0 4131.6192119808 2 5868.3776760976 ) 53.7866090899 (ExtendedPoll) + 1689+279 ( 2 0 4131.6209541211 2 5868.3784525807 ) 53.7865860060 (ExtendedPoll) + 1689+284 ( 2 0 4131.6214166274 2 5868.3783365570 ) 53.7865828676 (ExtendedPoll) + 1689+287 ( 2 0 4131.6210066099 2 5868.3788719382 ) 53.7865816357 (ExtendedPoll) + 1689+293 ( 2 0 4131.6209362583 2 5868.3789681750 ) 53.7865813838 (ExtendedPoll) + 1689+294 ( 2 0 4131.6207252036 2 5868.3792568852 ) 53.7865806279 (ExtendedPoll) + 1689+298 ( 2 0 4131.6206891940 2 5868.3793043828 ) 53.7865805153 (ExtendedPoll) + 1689+304 ( 2 0 4131.6206796375 2 5868.3793158160 ) 53.7865804962 (ExtendedPoll) + 1689+308 ( 2 0 4131.6206768768 2 5868.3793227362 ) 53.7865804572 (ExtendedPoll) + 1689+313 ( 2 0 4131.6206782642 2 5868.3793214934 ) 53.7865804561 (ExtendedPoll) + 1689+315 ( 2 0 4131.6206745081 2 5868.3793251876 ) 53.7865804560 (ExtendedPoll) + 1689+316 ( 2 0 4131.6206632396 2 5868.3793362702 ) 53.7865804559 (ExtendedPoll) + 1689+317 ( 2 0 4131.6206181660 2 5868.3793806004 ) 53.7865804552 (ExtendedPoll) + 1689+318 ( 2 0 4131.6204378713 2 5868.3795579212 ) 53.7865804528 (ExtendedPoll) + 1689+319 ( 2 0 4131.6197166927 2 5868.3802672046 ) 53.7865804428 (ExtendedPoll) + 1689+320 ( 2 0 4131.6168319783 2 5868.3831043383 ) 53.7865804032 (ExtendedPoll) + 1689+321 ( 2 0 4131.6052931206 2 5868.3944528729 ) 53.7865802452 (ExtendedPoll) + 1689+322 ( 2 0 4131.5591376898 2 5868.4398470112 ) 53.7865796204 (ExtendedPoll) + 1689+323 ( 2 0 4131.3745159668 2 5868.6214235646 ) 53.7865772402 (ExtendedPoll) + 1689+324 ( 2 0 4130.6360290747 2 5869.3477297782 ) 53.7865696199 (ExtendedPoll) + 1689+325 ( 2 0 4127.6820815062 2 5872.2529546326 ) 53.7865695587 (ExtendedPoll) + 1689+328 ( 2 0 4127.6840140147 2 5872.2603352230 ) 53.7864835442 (ExtendedPoll) + 1689+329 ( 2 0 4127.6898115401 2 5872.2824769939 ) 53.7862255016 (ExtendedPoll) + 1689+330 ( 2 0 4127.6796235307 2 5872.3112438240 ) 53.7860518834 (ExtendedPoll) + 1689+338 ( 2 0 4127.6784943469 2 5872.3148875688 ) 53.7860284213 (ExtendedPoll) + 1689+339 ( 2 0 4127.6750287014 2 5872.3216844082 ) 53.7859970553 (ExtendedPoll) + 1689+345 ( 2 0 4127.6738721701 2 5872.3232011194 ) 53.7859935510 (ExtendedPoll) + 1689+346 ( 2 0 4127.6704025761 2 5872.3277512530 ) 53.7859830384 (ExtendedPoll) + 1689+352 ( 2 0 4127.6704920471 2 5872.3287007212 ) 53.7859734249 (ExtendedPoll) + 1689+357 ( 2 0 4127.6702519860 2 5872.3291127215 ) 53.7859717972 (ExtendedPoll) + 1689+358 ( 2 0 4127.6695318024 2 5872.3303487226 ) 53.7859669139 (ExtendedPoll) + 1689+364 ( 2 0 4127.6693723329 2 5872.3305259594 ) 53.7859667262 (ExtendedPoll) + 1689+365 ( 2 0 4127.6688939242 2 5872.3310576698 ) 53.7859661633 (ExtendedPoll) + 1689+372 ( 2 0 4127.6688751072 2 5872.3311142263 ) 53.7859658109 (ExtendedPoll) + 1689+374 ( 2 0 4127.6689990935 2 5872.3309999936 ) 53.7859657384 (ExtendedPoll) + 1689+382 ( 2 0 4127.6690021165 2 5872.3309978166 ) 53.7859657310 (ExtendedPoll) + 2076+20 ( 2 0 4999.9878997345 2 5000.0092959702 ) 55.9016794952 (ExtendedPoll) + 2076+21 ( 2 0 4999.9515989379 2 5000.0371838810 ) 55.9016196708 (ExtendedPoll) + 2076+22 ( 2 0 4999.8063957515 2 5000.1487355238 ) 55.9013804121 (ExtendedPoll) + 2076+23 ( 2 0 4999.2255830062 2 5000.5949420954 ) 55.9004239959 (ExtendedPoll) + 2076+24 ( 2 0 4996.9023320246 2 5002.3797683814 ) 55.8966082342 (ExtendedPoll) + 2076+25 ( 2 0 4987.6093280984 2 5009.5190735258 ) 55.8815039246 (ExtendedPoll) + 2076+26 ( 2 0 4950.4373123937 2 5038.0762941031 ) 55.8236448341 (ExtendedPoll) + 2076+27 ( 2 0 4801.7492495748 2 5152.3051764124 ) 55.6343152023 (ExtendedPoll) + 2076+28 ( 2 0 4206.9969982993 2 5609.2207056496 ) 55.6253373563 (ExtendedPoll) + 2076+32 ( 2 0 4217.9971862258 2 5610.1214654550 ) 55.5187948731 (ExtendedPoll) + 2076+33 ( 2 0 4250.9977500050 2 5612.8237448711 ) 55.2000072940 (ExtendedPoll) + 2076+34 ( 2 0 4279.8220637775 2 5600.5952481192 ) 55.0710067569 (ExtendedPoll) + 2076+35 ( 2 0 4366.2950050949 2 5563.9097578633 ) 54.6951789859 (ExtendedPoll) + 2076+39 ( 2 0 4393.3723907599 2 5548.1874048965 ) 54.6249740689 (ExtendedPoll) + 2076+40 ( 2 0 4474.6045477550 2 5501.0203459961 ) 54.4266469861 (ExtendedPoll) + 2076+42 ( 2 0 4525.2654628702 2 5464.3348557403 ) 54.3900963042 (ExtendedPoll) + 2076+48 ( 2 0 4514.4563452056 2 5483.6602479286 ) 54.2742359116 (ExtendedPoll) + 2076+49 ( 2 0 4491.7462798091 2 5505.0601172445 ) 54.2385084897 (ExtendedPoll) + 2076+50 ( 2 0 4423.6160836196 2 5569.2597251923 ) 54.1460338788 (ExtendedPoll) + 2076+51 ( 2 0 4151.0952988618 2 5826.0581569833 ) 54.0054730693 (ExtendedPoll) + 2076+57 ( 2 0 4119.6505929283 2 5880.2129283134 ) 53.7862527117 (ExtendedPoll) + 2076+75 ( 2 0 4119.5665931846 2 5880.3014995623 ) 53.7862021958 (ExtendedPoll) + 2076+76 ( 2 0 4119.3145939537 2 5880.5672133090 ) 53.7860509080 (ExtendedPoll) + 2076+77 ( 2 0 4118.3065970302 2 5881.6300682960 ) 53.7854496575 (ExtendedPoll) + 2076+88 ( 2 0 4118.3108711544 2 5881.6602849630 ) 53.7851316932 (ExtendedPoll) + 2076+96 ( 2 0 4118.3198847115 2 5881.6662155602 ) 53.7849945777 (ExtendedPoll) + 2076+97 ( 2 0 4118.3348277986 2 5881.6631276284 ) 53.7848865134 (ExtendedPoll) + 2076+99 ( 2 0 4118.3462668702 2 5881.6530292707 ) 53.7848751796 (ExtendedPoll) + 2076+108 ( 2 0 4118.3455932557 2 5881.6537043543 ) 53.7848751047 (ExtendedPoll) + 2076+109 ( 2 0 4118.3435724122 2 5881.6557296052 ) 53.7848748801 (ExtendedPoll) + 2076+110 ( 2 0 4118.3354890381 2 5881.6638306090 ) 53.7848739818 (ExtendedPoll) + 2076+111 ( 2 0 4118.3031555418 2 5881.6962346240 ) 53.7848703922 (ExtendedPoll) + 2076+112 ( 2 0 4118.1738215565 2 5881.8258506839 ) 53.7848560937 (ExtendedPoll) + 2076+122 ( 2 0 4118.1735085463 2 5881.8262104036 ) 53.7848556344 (ExtendedPoll) + 2076+123 ( 2 0 4118.1725695157 2 5881.8272895629 ) 53.7848542566 (ExtendedPoll) + 2076+132 ( 2 0 4118.1726545887 2 5881.8272060557 ) 53.7848542498 (ExtendedPoll) + 2076+133 ( 2 0 4118.1729098077 2 5881.8269555344 ) 53.7848542294 (ExtendedPoll) + 2076+134 ( 2 0 4118.1739306837 2 5881.8259534489 ) 53.7848541479 (ExtendedPoll) + 2076+135 ( 2 0 4118.1780141879 2 5881.8219451070 ) 53.7848538220 (ExtendedPoll) + 2076+151 ( 2 0 4118.1780093963 2 5881.8219592167 ) 53.7848537356 (ExtendedPoll) + 2076+152 ( 2 0 4118.1779950216 2 5881.8220015460 ) 53.7848534763 (ExtendedPoll) + 2076+159 ( 2 0 4118.1779947385 2 5881.8220052606 ) 53.7848534446 (ExtendedPoll) + 2244+6 ( 2 0 4168.4622208673 2 5740.6975175468 ) 54.6654457702 (ExtendedPoll) + 2244+7 ( 2 0 3937.8677106876 2 6034.1814395937 ) 54.1025876908 (ExtendedPoll) + 2244+15 ( 2 0 3968.8756845943 2 6029.8141193251 ) 53.8471893590 (ExtendedPoll) + 2244+23 ( 2 0 3966.3440036262 2 6032.7893562581 ) 53.8453293272 (ExtendedPoll) + 2244+29 ( 2 0 3967.2852805629 2 6032.5287671287 ) 53.8387026417 (ExtendedPoll) + 2244+32 ( 2 0 3966.9613567598 2 6032.8941676795 ) 53.8385991104 (ExtendedPoll) + 2244+33 ( 2 0 3965.9895853505 2 6033.9903693319 ) 53.8382928991 (ExtendedPoll) + 2244+45 ( 2 0 3966.0039197226 2 6033.9851390276 ) 53.8382028409 (ExtendedPoll) + 2244+46 ( 2 0 3966.0291479677 2 6033.9679675607 ) 53.8381131770 (ExtendedPoll) + 2244+52 ( 2 0 3966.0378553973 2 6033.9615960721 ) 53.8380860741 (ExtendedPoll) + 2244+64 ( 2 0 3966.0380469160 2 6033.9618735742 ) 53.8380818691 (ExtendedPoll) + 2244+69 ( 2 0 3966.0381004053 2 6033.9618472758 ) 53.8380815916 (ExtendedPoll) + 2244+74 ( 2 0 3966.0381302064 2 6033.9618470067 ) 53.8380813128 (ExtendedPoll) + 2244+79 ( 2 0 3966.0381451069 2 6033.9618471499 ) 53.8380811710 (ExtendedPoll) + 2244+84 ( 2 0 3966.0381513080 2 6033.9618430199 ) 53.8380811481 (ExtendedPoll) + 2244+86 ( 2 0 3966.0381381930 2 6033.9618595149 ) 53.8380811293 (ExtendedPoll) + 2244+91 ( 2 0 3966.0381418784 2 6033.9618557502 ) 53.8380811271 (ExtendedPoll) + 2244+92 ( 2 0 3966.0381529347 2 6033.9618444560 ) 53.8380811204 (ExtendedPoll) + 2244+93 ( 2 0 3966.0381971599 2 6033.9617992793 ) 53.8380810935 (ExtendedPoll) + 2244+94 ( 2 0 3966.0383740607 2 6033.9616185725 ) 53.8380809858 (ExtendedPoll) + 2244+95 ( 2 0 3966.0390816638 2 6033.9608957451 ) 53.8380805552 (ExtendedPoll) + 2244+96 ( 2 0 3966.0419120761 2 6033.9580044356 ) 53.8380788327 (ExtendedPoll) + 2244+97 ( 2 0 3966.0532337255 2 6033.9464391976 ) 53.8380719433 (ExtendedPoll) + 2244+98 ( 2 0 3966.0985203229 2 6033.9001782457 ) 53.8380443936 (ExtendedPoll) + 2244+99 ( 2 0 3966.2796667126 2 6033.7151344380 ) 53.8379343190 (ExtendedPoll) + 2244+100 ( 2 0 3967.0042522715 2 6032.9749592074 ) 53.8374960138 (ExtendedPoll) + 2244+101 ( 2 0 3969.9025945070 2 6030.0142582847 ) 53.8357746693 (ExtendedPoll) + 2244+102 ( 2 0 3981.4959634492 2 6018.1714545940 ) 53.8293988351 (ExtendedPoll) + 2244+103 ( 2 0 4027.8694392178 2 5970.8002398312 ) 53.8120165816 (ExtendedPoll) + 2244+105 ( 2 0 4027.8996279793 2 5970.7957732839 ) 53.8117751288 (ExtendedPoll) + 2244+106 ( 2 0 4027.9901942637 2 5970.7823736422 ) 53.8110507797 (ExtendedPoll) + 2244+107 ( 2 0 4028.3524594017 2 5970.7287750751 ) 53.8081535202 (ExtendedPoll) + 2244+108 ( 2 0 4028.5782890972 2 5970.8215646372 ) 53.8052259801 (ExtendedPoll) + 2244+109 ( 2 0 4029.0659874104 2 5970.8447020517 ) 53.8004791353 (ExtendedPoll) + 2244+117 ( 2 0 4029.1224148462 2 5970.8679660822 ) 53.7997469853 (ExtendedPoll) + 2244+125 ( 2 0 4029.1289146169 2 5970.8639709871 ) 53.7997219690 (ExtendedPoll) + 2244+129 ( 2 0 4029.1327113864 2 5970.8636015775 ) 53.7996898997 (ExtendedPoll) + 2244+134 ( 2 0 4029.1345329350 2 5970.8641672091 ) 53.7996679124 (ExtendedPoll) + 2244+136 ( 2 0 4029.1361890843 2 5970.8632210851 ) 53.7996608999 (ExtendedPoll) + 2244+142 ( 2 0 4029.1366590260 2 5970.8631402857 ) 53.7996572423 (ExtendedPoll) + 2244+146 ( 2 0 4029.1368554851 2 5970.8630052034 ) 53.7996566135 (ExtendedPoll) + 2244+147 ( 2 0 4029.1372198865 2 5970.8626976562 ) 53.7996559536 (ExtendedPoll) + 2244+158 ( 2 0 4029.1372434032 2 5970.8627159631 ) 53.7996555720 (ExtendedPoll) + 2244+159 ( 2 0 4029.1372160758 2 5970.8627689341 ) 53.7996553557 (ExtendedPoll) + 2244+165 ( 2 0 4029.1372107574 2 5970.8627828538 ) 53.7996552815 (ExtendedPoll) + 2244+168 ( 2 0 4029.1372020883 2 5970.8627949737 ) 53.7996552545 (ExtendedPoll) + 2244+172 ( 2 0 4029.1371973626 2 5970.8628007338 ) 53.7996552473 (ExtendedPoll) + 2244+179 ( 2 0 4029.1371969852 2 5970.8628025579 ) 53.7996552346 (ExtendedPoll) + 2244+181 ( 2 0 4029.1372006890 2 5970.8627988111 ) 53.7996552334 (ExtendedPoll) + 2244+182 ( 2 0 4029.1372118001 2 5970.8627875709 ) 53.7996552298 (ExtendedPoll) + 2244+183 ( 2 0 4029.1372562449 2 5970.8627426102 ) 53.7996552156 (ExtendedPoll) + 2244+184 ( 2 0 4029.1374340239 2 5970.8625627674 ) 53.7996551585 (ExtendedPoll) + 2244+185 ( 2 0 4029.1381451401 2 5970.8618433959 ) 53.7996549302 (ExtendedPoll) + 2244+186 ( 2 0 4029.1409896047 2 5970.8589659099 ) 53.7996540170 (ExtendedPoll) + 2244+187 ( 2 0 4029.1523674632 2 5970.8474559659 ) 53.7996503647 (ExtendedPoll) + 2244+188 ( 2 0 4029.1978788972 2 5970.8014161900 ) 53.7996357631 (ExtendedPoll) + 2244+189 ( 2 0 4029.3799246331 2 5970.6172570866 ) 53.7995774796 (ExtendedPoll) + 2244+190 ( 2 0 4030.1081075767 2 5969.8806206727 ) 53.7993463077 (ExtendedPoll) + 2244+191 ( 2 0 4033.0208393511 2 5966.9340750174 ) 53.7984530101 (ExtendedPoll) + 2244+192 ( 2 0 4044.6717664489 2 5955.1478923961 ) 53.7953815270 (ExtendedPoll) + 2244+193 ( 2 0 4091.2754748399 2 5908.0031619108 ) 53.7910882360 (ExtendedPoll) + 2244+196 ( 2 0 4091.3024169829 2 5908.0174949293 ) 53.7907097823 (ExtendedPoll) + 2244+197 ( 2 0 4091.3832434122 2 5908.0604939849 ) 53.7895744291 (ExtendedPoll) + 2244+198 ( 2 0 4091.7065491291 2 5908.2324902073 ) 53.7850331320 (ExtendedPoll) + 2244+201 ( 2 0 4091.7062625770 2 5908.2935241345 ) 53.7844786297 (ExtendedPoll) + 2244+218 ( 2 0 4091.7061814853 2 5908.2937483387 ) 53.7844773284 (ExtendedPoll) + 2244+225 ( 2 0 4091.7061774429 2 5908.2938078061 ) 53.7844768227 (ExtendedPoll) + 2244+228 ( 2 0 4091.7061404988 2 5908.2938545806 ) 53.7844767353 (ExtendedPoll) + 2244+237 ( 2 0 4091.7061392073 2 5908.2938580748 ) 53.7844767152 (ExtendedPoll) + 2244+242 ( 2 0 4091.7061402086 2 5908.2938596455 ) 53.7844766917 (ExtendedPoll) + 2494+9 ( 2 0 4996.9428758120 2 5002.4361458373 ) 55.8956087809 (ExtendedPoll) + 2494+10 ( 2 0 4987.7715032480 2 5009.7445833492 ) 55.8775091797 (ExtendedPoll) + 2494+11 ( 2 0 4951.0860129922 2 5038.9783333968 ) 55.8077152532 (ExtendedPoll) + 2494+12 ( 2 0 4804.3440519688 2 5155.9133335874 ) 55.5714059083 (ExtendedPoll) + 2494+13 ( 2 0 4217.3762078751 2 5623.6533343496 ) 55.3875012518 (ExtendedPoll) + 2494+15 ( 2 0 4161.4745084376 2 5735.4567332245 ) 54.7792090326 (ExtendedPoll) + 2494+19 ( 2 0 4301.2287570313 2 5616.6656219199 ) 54.7199123025 (ExtendedPoll) + 2494+25 ( 2 0 4362.3712407911 2 5630.6410467792 ) 54.0447637843 (ExtendedPoll) + 2494+30 ( 2 0 4360.6789041870 2 5638.2565614975 ) 53.9822178137 (ExtendedPoll) + 2494+34 ( 2 0 4357.7855545091 2 5640.8837775966 ) 53.9807745427 (ExtendedPoll) + 2494+35 ( 2 0 4349.1055054753 2 5648.7654258937 ) 53.9766818176 (ExtendedPoll) + 2494+36 ( 2 0 4314.3853093403 2 5680.2920190824 ) 53.9638836443 (ExtendedPoll) + 2494+38 ( 2 0 4293.8589040781 2 5703.8755485326 ) 53.9100589240 (ExtendedPoll) + 2494+44 ( 2 0 4288.6181197559 2 5709.6895436401 ) 53.8988093078 (ExtendedPoll) + 2494+48 ( 2 0 4286.0250233464 2 5712.6101890697 ) 53.8928738710 (ExtendedPoll) + 2494+49 ( 2 0 4278.2457341180 2 5721.3721253585 ) 53.8753278023 (ExtendedPoll) + 2494+58 ( 2 0 4278.6875840983 2 5721.1643151240 ) 53.8734640832 (ExtendedPoll) + 2494+62 ( 2 0 4278.5548371810 2 5721.3692198536 ) 53.8726233086 (ExtendedPoll) + 2494+70 ( 2 0 4278.5803407327 2 5721.3524598889 ) 53.8725625799 (ExtendedPoll) + 2494+71 ( 2 0 4278.6568513877 2 5721.3021799948 ) 53.8723804067 (ExtendedPoll) + 2494+76 ( 2 0 4278.6854324587 2 5721.3128786333 ) 53.8720225267 (ExtendedPoll) + 2494+84 ( 2 0 4278.6872107890 2 5721.3121890539 ) 53.8720135829 (ExtendedPoll) + 2494+86 ( 2 0 4278.6834607716 2 5721.3160673533 ) 53.8720086108 (ExtendedPoll) + 2494+87 ( 2 0 4278.6722107195 2 5721.3277022515 ) 53.8719936947 (ExtendedPoll) + 2494+96 ( 2 0 4278.6723989724 2 5721.3275559496 ) 53.8719934685 (ExtendedPoll) + 2494+98 ( 2 0 4278.6719110434 2 5721.3280214306 ) 53.8719932064 (ExtendedPoll) + 2494+99 ( 2 0 4278.6704472565 2 5721.3294178739 ) 53.8719924200 (ExtendedPoll) + 2494+100 ( 2 0 4278.6645921088 2 5721.3350036468 ) 53.8719892745 (ExtendedPoll) + 2494+101 ( 2 0 4278.6411715181 2 5721.3573467387 ) 53.8719766944 (ExtendedPoll) + 2494+102 ( 2 0 4278.5474891555 2 5721.4467191061 ) 53.8719264022 (ExtendedPoll) + 2494+103 ( 2 0 4278.1727597049 2 5721.8042085755 ) 53.8717256857 (ExtendedPoll) + 2494+104 ( 2 0 4276.6738419026 2 5723.2341664534 ) 53.8709300560 (ExtendedPoll) + 2494+105 ( 2 0 4270.6781706935 2 5728.9539979649 ) 53.8678634044 (ExtendedPoll) + 2494+106 ( 2 0 4246.6954858570 2 5751.8333240110 ) 53.8574561057 (ExtendedPoll) + 2494+107 ( 2 0 4150.7647465111 2 5843.3506281954 ) 53.8459142947 (ExtendedPoll) + 2494+110 ( 2 0 4151.0319463303 2 5843.7593181024 ) 53.8396594450 (ExtendedPoll) + 2494+111 ( 2 0 4151.8335457878 2 5844.9853878233 ) 53.8208980002 (ExtendedPoll) + 2494+112 ( 2 0 4153.3279881922 2 5846.2426983850 ) 53.7955624715 (ExtendedPoll) + 2494+116 ( 2 0 4153.1058903377 2 5846.6776178033 ) 53.7935050825 (ExtendedPoll) + 2494+118 ( 2 0 4152.8591623323 2 5847.0989959699 ) 53.7917987292 (ExtendedPoll) + 2494+127 ( 2 0 4152.8542659569 2 5847.1291180913 ) 53.7915611730 (ExtendedPoll) + 2494+129 ( 2 0 4152.9186835311 2 5847.0716643992 ) 53.7915145196 (ExtendedPoll) + 2494+133 ( 2 0 4152.8895239414 2 5847.1034820926 ) 53.7914812417 (ExtendedPoll) + 2494+138 ( 2 0 4152.8811001224 2 5847.1162049217 ) 53.7914385729 (ExtendedPoll) + 2494+141 ( 2 0 4152.8973868388 2 5847.1020486033 ) 53.7914233161 (ExtendedPoll) + 2494+150 ( 2 0 4152.8955121262 2 5847.1039880394 ) 53.7914221706 (ExtendedPoll) + 2494+151 ( 2 0 4152.8898879885 2 5847.1098063475 ) 53.7914187344 (ExtendedPoll) + 2494+159 ( 2 0 4152.8896638419 2 5847.1102272180 ) 53.7914168283 (ExtendedPoll) + 2494+168 ( 2 0 4152.8897034201 2 5847.1102717856 ) 53.7914160520 (ExtendedPoll) + 2494+172 ( 2 0 4152.8897151731 2 5847.1102626252 ) 53.7914160311 (ExtendedPoll) + 2494+173 ( 2 0 4152.8897504319 2 5847.1102351440 ) 53.7914159684 (ExtendedPoll) + 2494+177 ( 2 0 4152.8897404990 2 5847.1102462518 ) 53.7914159546 (ExtendedPoll) + 2494+178 ( 2 0 4152.8897107004 2 5847.1102795751 ) 53.7914159130 (ExtendedPoll) + 2494+182 ( 2 0 4152.8897044864 2 5847.1102931188 ) 53.7914158426 (ExtendedPoll) + 2494+188 ( 2 0 4152.8897024353 2 5847.1102962286 ) 53.7914158321 (ExtendedPoll) + 2494+193 ( 2 0 4152.8897041880 2 5847.1102955980 ) 53.7914158221 (ExtendedPoll) + 2494+202 ( 2 0 4152.8897041652 2 5847.1102957121 ) 53.7914158212 (ExtendedPoll) + 2494+205 ( 2 0 4152.8897042523 2 5847.1102956349 ) 53.7914158212 (ExtendedPoll) + 2494+206 ( 2 0 4152.8897045137 2 5847.1102954032 ) 53.7914158210 (ExtendedPoll) + 2494+207 ( 2 0 4152.8897048775 2 5847.1102951127 ) 53.7914158204 (ExtendedPoll) + 2761 ( 3 0 3333.3333333249 2 3333.3333333165 1 3333.3333333555 ) 47.1682905221 + 2762 ( 3 0 3333.3333332996 2 3333.3333332658 1 3333.3333334220 ) 47.1682905221 + 2763 ( 3 0 3333.3333331985 2 3333.3333330633 1 3333.3333336880 ) 47.1682905221 + 2764 ( 3 0 3333.3333327939 2 3333.3333322533 1 3333.3333347518 ) 47.1682905219 + 2765 ( 3 0 3333.3333311757 2 3333.3333290134 1 3333.3333390073 ) 47.1682905212 + 2766 ( 3 0 3333.3333247026 2 3333.3333160534 1 3333.3333560290 ) 47.1682905185 + 2767 ( 3 0 3333.3332988105 2 3333.3332642138 1 3333.3334241161 ) 47.1682905075 + 2768 ( 3 0 3333.3331952421 2 3333.3330568551 1 3333.3336964646 ) 47.1682904637 + 2769 ( 3 0 3333.3327809684 2 3333.3322274206 1 3333.3347858583 ) 47.1682902884 + 2770 ( 3 0 3333.3311238738 2 3333.3289096824 1 3333.3391434333 ) 47.1682895873 + 2771 ( 3 0 3333.3244954951 2 3333.3156387294 1 3333.3565737331 ) 47.1682867830 + 2772 ( 3 0 3333.2979819803 2 3333.2625549176 1 3333.4262949324 ) 47.1682755667 + 2773 ( 3 0 3333.1919279212 2 3333.0502196704 1 3333.7051797296 ) 47.1682307194 + 2774 ( 3 0 3332.7677116849 2 3332.2008786818 1 3334.8207189184 ) 47.1680516124 + 2775 ( 3 0 3331.0708467397 2 3328.8035147270 1 3339.2828756735 ) 47.1673397044 + 2776 ( 3 0 3324.2833869587 2 3315.2140589080 1 3357.1315026938 ) 47.1645644377 + 2777 ( 3 0 3297.1335478348 2 3260.8562356320 1 3428.5260107754 ) 47.1546240959 + 2778 ( 3 0 3188.5341913391 2 3043.4249425281 1 3714.1040431015 ) 47.1336301248 + 2783 ( 3 0 3188.5440963277 2 3043.4291749044 1 3714.1116982164 ) 47.1334189419 + 2784 ( 3 0 3188.5738112936 2 3043.4418720333 1 3714.1346635611 ) 47.1327853954 + 2785 ( 3 0 3188.6926711573 2 3043.4926605491 1 3714.2265249397 ) 47.1302512441 + 2786 ( 3 0 3189.1681106120 2 3043.6958146122 1 3714.5939704540 ) 47.1201151932 + 2787 ( 3 0 3191.0698684310 2 3044.5084308647 1 3716.0637525116 ) 47.0795798665 + 2788 ( 3 0 3198.6768997067 2 3047.7588958743 1 3721.9428807416 ) 46.9175811367 + 2789 ( 3 0 3198.8948848743 2 3047.5863280381 1 3722.3442473958 ) 46.9131329647 + 2790 ( 3 0 3199.5488403769 2 3047.0686245294 1 3723.5483473581 ) 46.8997895433 + 2791 ( 3 0 3202.1646623876 2 3044.9978104945 1 3728.3647472073 ) 46.8464322782 + 2792 ( 3 0 3212.6279504301 2 3036.7145543550 1 3747.6303466044 ) 46.6332660653 + 2797+6 ( 2 0 4900.6584516792 2 5075.3512624213 ) 55.7642295241 (ExtendedPoll) + 2797+7 ( 2 0 4607.1745296323 2 5305.9457726010 ) 55.4472050367 (ExtendedPoll) + 2797+13 ( 2 0 4509.3465556167 2 5389.7983217572 ) 55.3312037272 (ExtendedPoll) + 2797+14 ( 2 0 4215.8626335698 2 5641.3559692260 ) 55.2227885943 (ExtendedPoll) + 2797+16 ( 2 0 3880.4524369449 2 6088.5695647259 ) 54.1867250496 (ExtendedPoll) + 2797+25 ( 2 0 3865.6035480318 2 6116.0836824178 ) 54.0994049526 (ExtendedPoll) + 2797+30 ( 2 0 3858.1791035753 2 6129.8407412638 ) 54.0570067200 (ExtendedPoll) + 2797+35 ( 2 0 3865.9856885553 2 6129.2948262302 ) 53.9862513494 (ExtendedPoll) + 2797+41 ( 2 0 3867.9219809400 2 6129.0355165892 ) 53.9697415456 (ExtendedPoll) + 2797+42 ( 2 0 3871.2247668931 2 6126.9473915858 ) 53.9552082161 (ExtendedPoll) + 2797+47 ( 2 0 3872.9461052333 2 6126.0261599667 ) 53.9462662728 (ExtendedPoll) + 2797+51 ( 2 0 3873.9223548519 2 6126.0547352067 ) 53.9366367060 (ExtendedPoll) + 2797+63 ( 2 0 3873.9150839053 2 6126.0681502590 ) 53.9365956057 (ExtendedPoll) + 2797+64 ( 2 0 3873.9023656577 2 6126.0958912493 ) 53.9364883221 (ExtendedPoll) + 2797+71 ( 2 0 3873.8992381518 2 6126.1002869850 ) 53.9364820231 (ExtendedPoll) + 2797+82 ( 2 0 3873.8993365564 2 6126.1005041485 ) 53.9364792786 (ExtendedPoll) + 2797+86 ( 2 0 3873.8994440785 2 6126.1004526718 ) 53.9364786703 (ExtendedPoll) + 2797+89 ( 2 0 3873.8995441434 2 6126.1003878808 ) 53.9364782440 (ExtendedPoll) + 2797+90 ( 2 0 3873.8997141999 2 6126.1002207754 ) 53.9364779912 (ExtendedPoll) + 2797+91 ( 2 0 3873.9002243693 2 6126.0997194591 ) 53.9364772329 (ExtendedPoll) + 2797+92 ( 2 0 3873.9022650468 2 6126.0977141941 ) 53.9364741996 (ExtendedPoll) + 2797+99 ( 2 0 3873.9023564295 2 6126.0976376432 ) 53.9364739541 (ExtendedPoll) + 2797+108 ( 2 0 3873.9023666523 2 6126.0976268016 ) 53.9364739455 (ExtendedPoll) + 2797+109 ( 2 0 3873.9023973206 2 6126.0975942769 ) 53.9364739197 (ExtendedPoll) + 2797+110 ( 2 0 3873.9025199938 2 6126.0974641781 ) 53.9364738164 (ExtendedPoll) + 2797+111 ( 2 0 3873.9030106867 2 6126.0969437827 ) 53.9364734034 (ExtendedPoll) + 2797+112 ( 2 0 3873.9049734581 2 6126.0948622015 ) 53.9364717515 (ExtendedPoll) + 2797+113 ( 2 0 3873.9128245438 2 6126.0865358764 ) 53.9364651438 (ExtendedPoll) + 2797+114 ( 2 0 3873.9442288869 2 6126.0532305760 ) 53.9364387171 (ExtendedPoll) + 2797+115 ( 2 0 3874.0698462589 2 6125.9200093744 ) 53.9363330745 (ExtendedPoll) + 2797+116 ( 2 0 3874.5723157471 2 6125.3871245682 ) 53.9359115277 (ExtendedPoll) + 2797+117 ( 2 0 3876.5821937000 2 6123.2555853431 ) 53.9342417174 (ExtendedPoll) + 2797+118 ( 2 0 3884.6217055116 2 6114.7294284431 ) 53.9278243645 (ExtendedPoll) + 2797+119 ( 2 0 3916.7797527577 2 6080.6248008429 ) 53.9063357782 (ExtendedPoll) + 2797+120 ( 2 0 4045.4119417422 2 5944.2062904420 ) 53.8866188839 (ExtendedPoll) + 2797+123 ( 2 0 4045.5215045970 2 5944.2601089211 ) 53.8851192623 (ExtendedPoll) + 2797+124 ( 2 0 4045.8501931615 2 5944.4215643586 ) 53.8806205222 (ExtendedPoll) + 2797+125 ( 2 0 4047.1649474193 2 5945.0673861082 ) 53.8626274298 (ExtendedPoll) + 2797+126 ( 2 0 4048.1386380613 2 5945.1403169447 ) 53.8529449201 (ExtendedPoll) + 2797+127 ( 2 0 4051.0597099870 2 5945.3591094543 ) 53.8239051878 (ExtendedPoll) + 2797+130 ( 2 0 4052.9055851942 2 5944.7227772433 ) 53.8125206018 (ExtendedPoll) + 2797+135 ( 2 0 4053.8541125651 2 5944.9547911326 ) 53.8016493716 (ExtendedPoll) + 2797+138 ( 2 0 4054.7420774868 2 5944.5483403302 ) 53.7970783073 (ExtendedPoll) + 2797+144 ( 2 0 4055.1565250914 2 5944.8064771068 ) 53.7909201097 (ExtendedPoll) + 2797+153 ( 2 0 4055.1705529195 2 5944.8124812684 ) 53.7907362425 (ExtendedPoll) + 2797+158 ( 2 0 4055.1759264999 2 5944.8178972016 ) 53.7906378043 (ExtendedPoll) + 2797+159 ( 2 0 4055.1662131965 2 5944.8296651001 ) 53.7906219881 (ExtendedPoll) + 2797+163 ( 2 0 4055.1612269352 2 5944.8354395879 ) 53.7906162644 (ExtendedPoll) + 2797+164 ( 2 0 4055.1462681513 2 5944.8527630512 ) 53.7905990941 (ExtendedPoll) + 2797+170 ( 2 0 4055.1439936051 2 5944.8558254594 ) 53.7905926341 (ExtendedPoll) + 2797+176 ( 2 0 4055.1459887350 2 5944.8540101306 ) 53.7905904735 (ExtendedPoll) + 2797+198 ( 2 0 4055.1459891780 2 5944.8540106179 ) 53.7905904650 (ExtendedPoll) + 2797+200 ( 2 0 4055.1459895782 2 5944.8540103798 ) 53.7905904635 (ExtendedPoll) + 2797+211 ( 2 0 4055.1459895943 2 5944.8540104040 ) 53.7905904631 (ExtendedPoll) + 3014 ( 3 0 3210.5286604494 2 3038.4216692843 1 3750.4447793258 ) 46.6015154107 + 3019+6 ( 2 0 4692.2382076236 2 5223.3043522798 ) 55.6902400114 (ExtendedPoll) + 3019+14 ( 2 0 4751.6337632759 2 5242.5205614614 ) 54.9900785314 (ExtendedPoll) + 3019+23 ( 2 0 4744.8371211080 2 5251.2279062468 ) 54.9451839171 (ExtendedPoll) + 3019+24 ( 2 0 4735.4473825306 2 5263.6747690122 ) 54.8789033947 (ExtendedPoll) + 3019+33 ( 2 0 4734.9854872326 2 5264.5350116862 ) 54.8728327514 (ExtendedPoll) + 3019+34 ( 2 0 4733.7844741588 2 5266.0755156716 ) 54.8649914704 (ExtendedPoll) + 3019+39 ( 2 0 4733.0120896855 2 5266.6730367357 ) 54.8644320425 (ExtendedPoll) + 3019+40 ( 2 0 4730.6949362657 2 5268.4655999279 ) 54.8627657851 (ExtendedPoll) + 3019+41 ( 2 0 4721.4263225864 2 5275.6358526969 ) 54.8562814361 (ExtendedPoll) + 3019+42 ( 2 0 4684.3518678691 2 5304.3168637731 ) 54.8332529571 (ExtendedPoll) + 3019+43 ( 2 0 4536.0540490000 2 5419.0409080777 ) 54.7888275928 (ExtendedPoll) + 3019+46 ( 2 0 4533.8703888657 2 5450.0488819844 ) 54.4714998393 (ExtendedPoll) + 3019+49 ( 2 0 4509.4133953618 2 5469.7018231929 ) 54.4660067399 (ExtendedPoll) + 3019+50 ( 2 0 4436.0424148501 2 5528.6606468184 ) 54.4633610125 (ExtendedPoll) + 3019+53 ( 2 0 4390.6222840571 2 5570.5869213965 ) 54.4160608763 (ExtendedPoll) + 3019+54 ( 2 0 4254.3618916782 2 5696.3657451309 ) 54.3333134172 (ExtendedPoll) + 3019+58 ( 2 0 4163.5216300923 2 5787.2060067168 ) 54.2619287838 (ExtendedPoll) + 3019+64 ( 2 0 4151.2931333404 2 5848.3484904766 ) 53.7943165716 (ExtendedPoll) + 3019+80 ( 2 0 4151.1660641526 2 5848.5569671112 ) 53.7935193903 (ExtendedPoll) + 3019+81 ( 2 0 4150.7848565894 2 5849.1823970151 ) 53.7911289956 (ExtendedPoll) + 3019+86 ( 2 0 4150.6155109737 2 5849.3582466966 ) 53.7910215159 (ExtendedPoll) + 3019+87 ( 2 0 4150.1074741268 2 5849.8857957410 ) 53.7907001042 (ExtendedPoll) + 3019+102 ( 2 0 4150.1089861817 2 5849.8869583539 ) 53.7906755049 (ExtendedPoll) + 3019+103 ( 2 0 4150.1127107275 2 5849.8861339310 ) 53.7906493993 (ExtendedPoll) + 3019+107 ( 2 0 4150.1143060889 2 5849.8850885612 ) 53.7906446904 (ExtendedPoll) + 3019+108 ( 2 0 4150.1171485655 2 5849.8825445004 ) 53.7906426731 (ExtendedPoll) + 3019+114 ( 2 0 4150.1178834653 2 5849.8819367039 ) 53.7906416845 (ExtendedPoll) + 3019+125 ( 2 0 4150.1179323692 2 5849.8819026286 ) 53.7906415591 (ExtendedPoll) + 3019+126 ( 2 0 4150.1180790807 2 5849.8818004026 ) 53.7906411831 (ExtendedPoll) + 3019+127 ( 2 0 4150.1182616331 2 5849.8816470466 ) 53.7906409597 (ExtendedPoll) + 3019+128 ( 2 0 4150.1188092902 2 5849.8811869788 ) 53.7906402897 (ExtendedPoll) + 3019+142 ( 2 0 4150.1188123412 2 5849.8811848413 ) 53.7906402820 (ExtendedPoll) + 3019+143 ( 2 0 4150.1188214943 2 5849.8811784287 ) 53.7906402588 (ExtendedPoll) + 3019+153 ( 2 0 4150.1188216858 2 5849.8811782962 ) 53.7906402583 (ExtendedPoll) + 3181+18 ( 2 0 4999.8309411913 2 5000.1672333819 ) 55.9009656850 (ExtendedPoll) + 3181+20 ( 2 0 4999.4491205399 2 5000.4715383635 ) 55.9002031428 (ExtendedPoll) + 3181+21 ( 2 0 4998.3036585857 2 5001.3844533083 ) 55.8979182003 (ExtendedPoll) + 3181+22 ( 2 0 4993.7218107688 2 5005.0361130876 ) 55.8888187275 (ExtendedPoll) + 3181+23 ( 2 0 4975.3944195012 2 5019.6427522045 ) 55.8530679233 (ExtendedPoll) + 3181+24 ( 2 0 4902.0848544307 2 5078.0693086723 ) 55.7205670458 (ExtendedPoll) + 3181+25 ( 2 0 4608.8465941490 2 5311.7755345433 ) 55.3681229992 (ExtendedPoll) + 3181+27 ( 2 0 4583.9528686182 2 5330.5550116980 ) 55.3637996156 (ExtendedPoll) + 3181+28 ( 2 0 4509.2716920260 2 5386.8934431624 ) 55.3635911500 (ExtendedPoll) + 3181+30 ( 2 0 4432.4068552994 2 5484.7214171780 ) 54.9584061960 (ExtendedPoll) + 3181+31 ( 2 0 4201.8123451197 2 5778.2053392249 ) 54.0036331278 (ExtendedPoll) + 3181+43 ( 2 0 4200.8569938110 2 5785.9573327015 ) 53.9378132020 (ExtendedPoll) + 3181+44 ( 2 0 4192.2315362806 2 5799.0592935072 ) 53.8900546358 (ExtendedPoll) + 3181+52 ( 2 0 4194.7836890625 2 5802.0140586264 ) 53.8389301385 (ExtendedPoll) + 3181+54 ( 2 0 4192.4430783561 2 5805.1394221936 ) 53.8302201837 (ExtendedPoll) + 3181+55 ( 2 0 4185.4212462368 2 5814.5155128951 ) 53.8043694686 (ExtendedPoll) + 3181+71 ( 2 0 4185.4407963358 2 5814.5389460247 ) 53.8039710219 (ExtendedPoll) + 3181+77 ( 2 0 4185.4480076188 2 5814.5364550417 ) 53.8039296544 (ExtendedPoll) + 3181+78 ( 2 0 4185.4696414679 2 5814.5289820924 ) 53.8038055528 (ExtendedPoll) + 3181+81 ( 2 0 4185.4807342197 2 5814.5185044072 ) 53.8038049529 (ExtendedPoll) + 3181+90 ( 2 0 4185.4816714853 2 5814.5183282598 ) 53.8037981763 (ExtendedPoll) + 3181+108 ( 2 0 4185.4816706336 2 5814.5183292645 ) 53.8037981745 (ExtendedPoll) + 3181+112 ( 2 0 4185.4816710094 2 5814.5183289895 ) 53.8037981737 (ExtendedPoll) + 3304+6 ( 2 0 4901.8695805142 2 5076.5623912563 ) 55.7402643064 (ExtendedPoll) + 3304+7 ( 2 0 4608.3856584673 2 5307.1569014360 ) 55.4236611469 (ExtendedPoll) + 3304+15 ( 2 0 4606.6387303599 2 5338.1648753428 ) 55.0917439291 (ExtendedPoll) + 3304+16 ( 2 0 4589.1694492857 2 5397.5604309951 ) 54.5804183615 (ExtendedPoll) + 3304+22 ( 2 0 4562.9655276744 2 5433.3724571972 ) 54.4082368778 (ExtendedPoll) + 3304+23 ( 2 0 4514.0515406666 2 5471.8048755605 ) 54.4043973012 (ExtendedPoll) + 3304+30 ( 2 0 4527.6994165058 2 5464.1620650905 ) 54.3714868324 (ExtendedPoll) + 3304+37 ( 2 0 4526.1776783497 2 5467.7582803742 ) 54.3456878637 (ExtendedPoll) + 3304+38 ( 2 0 4521.0733727858 2 5473.6814584884 ) 54.3251632561 (ExtendedPoll) + 3304+39 ( 2 0 4505.7604560942 2 5491.4509928311 ) 54.2645642604 (ExtendedPoll) + 3304+43 ( 2 0 4501.4477273290 2 5497.9746774822 ) 54.2316163720 (ExtendedPoll) + 3304+45 ( 2 0 4495.7156194766 2 5503.2973490595 ) 54.2235944245 (ExtendedPoll) + 3304+46 ( 2 0 4478.5192959191 2 5519.2653637914 ) 54.2004433791 (ExtendedPoll) + 3304+47 ( 2 0 4409.7340016894 2 5583.1374227190 ) 54.1217038236 (ExtendedPoll) + 3304+48 ( 2 0 4134.5928247705 2 5838.6256584295 ) 54.0371198163 (ExtendedPoll) + 3304+50 ( 2 0 4057.7279880439 2 5936.4536324451 ) 53.8423122971 (ExtendedPoll) + 3304+55 ( 2 0 4036.3281187280 2 5959.1636978416 ) 53.8369788559 (ExtendedPoll) + 3304+63 ( 2 0 4033.2436987883 2 5966.3424805330 ) 53.8016467560 (ExtendedPoll) + 3304+73 ( 2 0 4033.3453648009 2 5966.5644451074 ) 53.7987246325 (ExtendedPoll) + 3304+77 ( 2 0 4033.4533282953 2 5966.5074812194 ) 53.7982274597 (ExtendedPoll) + 3304+84 ( 2 0 4033.4322917074 2 5966.5295898786 ) 53.7982263075 (ExtendedPoll) + 3304+85 ( 2 0 4033.3691819436 2 5966.5959158563 ) 53.7982228672 (ExtendedPoll) + 3304+86 ( 2 0 4033.1167428886 2 5966.8612197669 ) 53.7982093544 (ExtendedPoll) + 3304+94 ( 2 0 4033.1071823367 2 5966.8731120948 ) 53.7981924297 (ExtendedPoll) + 3304+95 ( 2 0 4033.0785006809 2 5966.9087890783 ) 53.7981416597 (ExtendedPoll) + 3304+100 ( 2 0 4033.0925954613 2 5966.9029438115 ) 53.7980625663 (ExtendedPoll) + 3304+105 ( 2 0 4033.0991795212 2 5966.8990892331 ) 53.7980356267 (ExtendedPoll) + 3304+115 ( 2 0 4033.0989658428 2 5966.8995155138 ) 53.7980338197 (ExtendedPoll) + 3304+116 ( 2 0 4033.0983248077 2 5966.9007943557 ) 53.7980283990 (ExtendedPoll) + 3304+119 ( 2 0 4033.0980226539 2 5966.9016988988 ) 53.7980231575 (ExtendedPoll) + 3304+127 ( 2 0 4033.0981418065 2 5966.9016952224 ) 53.7980220818 (ExtendedPoll) + 3304+129 ( 2 0 4033.0982490223 2 5966.9016431107 ) 53.7980215482 (ExtendedPoll) + 3304+133 ( 2 0 4033.0983032868 2 5966.9016184516 ) 53.7980212629 (ExtendedPoll) + 3304+134 ( 2 0 4033.0983898253 2 5966.9015364642 ) 53.7980211876 (ExtendedPoll) + 3304+135 ( 2 0 4033.0986494409 2 5966.9012905019 ) 53.7980209620 (ExtendedPoll) + 3304+136 ( 2 0 4033.0996879031 2 5966.9003066526 ) 53.7980200592 (ExtendedPoll) + 3304+144 ( 2 0 4033.0996674107 2 5966.9003282915 ) 53.7980200572 (ExtendedPoll) + 3304+145 ( 2 0 4033.0996059334 2 5966.9003932080 ) 53.7980200513 (ExtendedPoll) + 3304+160 ( 2 0 4033.0996058034 2 5966.9003936551 ) 53.7980200485 (ExtendedPoll) + 3304+167 ( 2 0 4033.0996061081 2 5966.9003937799 ) 53.7980200446 (ExtendedPoll) + 3304+171 ( 2 0 4033.0996062242 2 5966.9003937721 ) 53.7980200436 (ExtendedPoll) + 3483 ( 3 0 3210.2889578675 2 3039.3458759311 1 3750.2389595149 ) 46.5961289316 + 3488+3 ( 2 0 4552.7233011568 2 5335.3470932817 ) 55.5692389089 (ExtendedPoll) + 3488+7 ( 2 0 4440.9199022818 2 5558.9538910317 ) 54.1048755479 (ExtendedPoll) + 3488+29 ( 2 0 4440.9496420561 2 5559.0071913847 ) 54.1040659660 (ExtendedPoll) + 3488+33 ( 2 0 4440.9365610370 2 5559.0347632759 ) 54.1038907469 (ExtendedPoll) + 3488+34 ( 2 0 4440.8905377740 2 5559.0748522452 ) 54.1038670525 (ExtendedPoll) + 3488+35 ( 2 0 4440.7524679852 2 5559.1951191530 ) 54.1037960247 (ExtendedPoll) + 3488+36 ( 2 0 4440.2001888298 2 5559.6761867843 ) 54.1035127440 (ExtendedPoll) + 3488+37 ( 2 0 4437.9910722084 2 5561.6004573097 ) 54.1023929098 (ExtendedPoll) + 3488+38 ( 2 0 4429.1546057226 2 5569.2975394109 ) 54.0981264568 (ExtendedPoll) + 3488+39 ( 2 0 4393.8087397796 2 5600.0858678158 ) 54.0844835555 (ExtendedPoll) + 3488+42 ( 2 0 4394.2113521169 2 5603.9686884921 ) 54.0411680120 (ExtendedPoll) + 3488+43 ( 2 0 4388.9432720429 2 5609.7553878479 ) 54.0274056417 (ExtendedPoll) + 3488+48 ( 2 0 4388.0032745945 2 5611.4664902813 ) 54.0180260116 (ExtendedPoll) + 3488+51 ( 2 0 4386.7886136448 2 5612.9967583598 ) 54.0128824739 (ExtendedPoll) + 3488+57 ( 2 0 4386.4467770046 2 5613.3454189378 ) 54.0122750804 (ExtendedPoll) + 3488+58 ( 2 0 4385.4212670842 2 5614.3914006721 ) 54.0104567213 (ExtendedPoll) + 3488+59 ( 2 0 4381.3192274022 2 5618.5753276090 ) 54.0032406382 (ExtendedPoll) + 3488+62 ( 2 0 4380.5784036418 2 5619.2116598200 ) 54.0031640007 (ExtendedPoll) + 3488+63 ( 2 0 4378.3559323606 2 5621.1206564531 ) 54.0029484717 (ExtendedPoll) + 3488+64 ( 2 0 4369.4660472359 2 5628.7566429851 ) 54.0023023644 (ExtendedPoll) + 3488+72 ( 2 0 4369.5969815447 2 5629.7243626813 ) 53.9913292971 (ExtendedPoll) + 3488+75 ( 2 0 4369.6824940167 2 5630.2051304326 ) 53.9857012024 (ExtendedPoll) + 3488+82 ( 2 0 4369.6472614388 2 5630.3220036975 ) 53.9848193694 (ExtendedPoll) + 3488+85 ( 2 0 4369.6050333250 2 5630.3660727419 ) 53.9847380922 (ExtendedPoll) + 3488+86 ( 2 0 4369.4783489833 2 5630.4982798750 ) 53.9844943213 (ExtendedPoll) + 3488+87 ( 2 0 4368.9716116168 2 5631.0271084078 ) 53.9835201449 (ExtendedPoll) + 3488+91 ( 2 0 4368.8845997443 2 5631.1127275039 ) 53.9834056991 (ExtendedPoll) + 3488+92 ( 2 0 4368.6235641269 2 5631.3695847921 ) 53.9830625988 (ExtendedPoll) + 3488+93 ( 2 0 4367.5794216571 2 5632.3970139452 ) 53.9816937566 (ExtendedPoll) + 3488+94 ( 2 0 4363.4028517782 2 5636.5067305573 ) 53.9762753650 (ExtendedPoll) + 3488+95 ( 2 0 4346.6965722627 2 5652.9455970056 ) 53.9555155106 (ExtendedPoll) + 3488+96 ( 2 0 4279.8714542003 2 5718.7010627990 ) 53.8872266051 (ExtendedPoll) + 3488+97 ( 2 0 4012.5709819511 2 5981.7229259727 ) 53.8578815474 (ExtendedPoll) + 3488+99 ( 2 0 4003.8363414140 2 5994.7157037717 ) 53.8249871296 (ExtendedPoll) + 3488+107 ( 2 0 4003.0106449257 2 5996.4848096773 ) 53.8171655728 (ExtendedPoll) + 3488+110 ( 2 0 4002.3593853505 2 5997.2124120580 ) 53.8168706752 (ExtendedPoll) + 3488+111 ( 2 0 4000.4056066249 2 5999.3952192000 ) 53.8160033453 (ExtendedPoll) + 3488+119 ( 2 0 4000.3383801740 2 5999.4971117887 ) 53.8157389067 (ExtendedPoll) + 3488+120 ( 2 0 4000.1367008212 2 5999.8027895547 ) 53.8149458834 (ExtendedPoll) + 3488+126 ( 2 0 4000.1340485485 2 5999.8637668378 ) 53.8144356991 (ExtendedPoll) + 3488+134 ( 2 0 4000.1293216626 2 5999.8697555108 ) 53.8144274351 (ExtendedPoll) + 3488+142 ( 2 0 4000.1301279381 2 5999.8692461828 ) 53.8144243508 (ExtendedPoll) + 3488+146 ( 2 0 4000.1294111560 2 5999.8703886418 ) 53.8144210416 (ExtendedPoll) + 3488+148 ( 2 0 4000.1312576800 2 5999.8684223480 ) 53.8144209958 (ExtendedPoll) + 3488+149 ( 2 0 4000.1367972520 2 5999.8625234666 ) 53.8144208588 (ExtendedPoll) + 3488+150 ( 2 0 4000.1589555398 2 5999.8389279410 ) 53.8144203127 (ExtendedPoll) + 3488+151 ( 2 0 4000.2475886910 2 5999.7445458387 ) 53.8144181595 (ExtendedPoll) + 3488+152 ( 2 0 4000.6021212960 2 5999.3670174292 ) 53.8144100483 (ExtendedPoll) + 3488+153 ( 2 0 4002.0202517159 2 5997.8569037914 ) 53.8143856278 (ExtendedPoll) + 3488+155 ( 2 0 4002.1422495983 2 5997.8527654463 ) 53.8132795659 (ExtendedPoll) + 3488+164 ( 2 0 4002.1489902101 2 5997.8491916670 ) 53.8132478315 (ExtendedPoll) + 3488+169 ( 2 0 4002.1460036830 2 5997.8536843822 ) 53.8132363424 (ExtendedPoll) + 3488+176 ( 2 0 4002.1464898557 2 5997.8532170669 ) 53.8132358938 (ExtendedPoll) + 3488+177 ( 2 0 4002.1479483737 2 5997.8518151211 ) 53.8132345481 (ExtendedPoll) + 3488+178 ( 2 0 4002.1537824458 2 5997.8462073379 ) 53.8132291653 (ExtendedPoll) + 3488+194 ( 2 0 4002.1537952967 2 5997.8461997948 ) 53.8132291112 (ExtendedPoll) + 3488+205 ( 2 0 4002.1537979211 2 5997.8462000219 ) 53.8132290846 (ExtendedPoll) + 3488+207 ( 2 0 4002.1537995406 2 5997.8461991017 ) 53.8132290775 (ExtendedPoll) + 3488+208 ( 2 0 4002.1538022459 2 5997.8461965406 ) 53.8132290747 (ExtendedPoll) + 3488+209 ( 2 0 4002.1538103616 2 5997.8461888572 ) 53.8132290662 (ExtendedPoll) + 3488+218 ( 2 0 4002.1538099327 2 5997.8461896839 ) 53.8132290629 (ExtendedPoll) + 3488+226 ( 2 0 4002.1538099976 2 5997.8461897805 ) 53.8132290615 (ExtendedPoll) + 3488+229 ( 2 0 4002.1538101107 2 5997.8461898084 ) 53.8132290602 (ExtendedPoll) + 3488+234 ( 2 0 4002.1538101371 2 5997.8461898603 ) 53.8132290595 (ExtendedPoll) + 3729+22 ( 2 0 4999.8953615990 2 4999.9816204393 ) 55.9027305088 (ExtendedPoll) + 3729+23 ( 2 0 4999.7707564260 2 5000.1157917870 ) 55.9020567360 (ExtendedPoll) + 3729+24 ( 2 0 4999.2723357338 2 5000.6524771780 ) 55.8993623523 (ExtendedPoll) + 3729+27 ( 2 0 4999.1349773271 2 5000.8543164668 ) 55.8979629118 (ExtendedPoll) + 3729+34 ( 2 0 4999.0739417340 2 5000.9153520600 ) 55.8976901754 (ExtendedPoll) + 3729+35 ( 2 0 4998.8908349545 2 5001.0984588395 ) 55.8968720583 (ExtendedPoll) + 3729+36 ( 2 0 4998.1584078364 2 5001.8308859575 ) 55.8936009704 (ExtendedPoll) + 3729+37 ( 2 0 4995.2286993643 2 5004.7605944297 ) 55.8805387184 (ExtendedPoll) + 3729+38 ( 2 0 4983.5098654757 2 5016.4794283182 ) 55.8286442151 (ExtendedPoll) + 3729+39 ( 2 0 4936.6345299214 2 5063.3547638726 ) 55.6267962813 (ExtendedPoll) + 3729+40 ( 2 0 4749.1331877041 2 5250.8561060898 ) 54.9147822323 (ExtendedPoll) + 3729+41 ( 2 0 3999.1278188349 2 6000.8614749590 ) 53.8151109452 (ExtendedPoll) + 3729+58 ( 2 0 3999.1207593662 2 6000.8750024663 ) 53.8150584528 (ExtendedPoll) + 3729+65 ( 2 0 3999.1195214058 2 6000.8764534763 ) 53.8150573268 (ExtendedPoll) + 3729+66 ( 2 0 3999.1158075247 2 6000.8808065061 ) 53.8150539489 (ExtendedPoll) + 3729+67 ( 2 0 3999.1009520003 2 6000.8982186254 ) 53.8150404383 (ExtendedPoll) + 3729+77 ( 2 0 3999.1012090993 2 6000.8986202144 ) 53.8150345073 (ExtendedPoll) + 3729+84 ( 2 0 3999.1012443818 2 6000.8986682546 ) 53.8150337554 (ExtendedPoll) + 3729+85 ( 2 0 3999.1011692098 2 6000.8987607750 ) 53.8150336483 (ExtendedPoll) + 3729+86 ( 2 0 3999.1009436941 2 6000.8990383364 ) 53.8150333272 (ExtendedPoll) + 3729+96 ( 2 0 3999.1009378077 2 6000.8990520256 ) 53.8150332623 (ExtendedPoll) + 3729+100 ( 2 0 3999.1009370763 2 6000.8990594402 ) 53.8150332041 (ExtendedPoll) + 3729+103 ( 2 0 3999.1009434424 2 6000.8990555693 ) 53.8150331784 (ExtendedPoll) + 3729+109 ( 2 0 3999.1009426080 2 6000.8990572346 ) 53.8150331716 (ExtendedPoll) + 3729+113 ( 2 0 3999.1009445289 2 6000.8990554321 ) 53.8150331694 (ExtendedPoll) + 3857+21 ( 2 0 4999.7695768976 2 5000.1146922267 ) 55.9020792324 (ExtendedPoll) + 3857+22 ( 2 0 4999.2676176204 2 5000.6480789368 ) 55.8994523349 (ExtendedPoll) + 3857+26 ( 2 0 4999.0614867145 2 5000.9250615107 ) 55.8976679710 (ExtendedPoll) + 3857+37 ( 2 0 4999.0655499855 2 5000.9315188764 ) 55.8975579561 (ExtendedPoll) + 3857+39 ( 2 0 4999.0601491243 2 5000.9369076070 ) 55.8975339712 (ExtendedPoll) + 3857+40 ( 2 0 4999.0439465409 2 5000.9530737988 ) 55.8974620175 (ExtendedPoll) + 3857+41 ( 2 0 4998.9791362072 2 5001.0177385657 ) 55.8971742134 (ExtendedPoll) + 3857+42 ( 2 0 4998.7198948722 2 5001.2763976335 ) 55.8960231692 (ExtendedPoll) + 3857+43 ( 2 0 4997.6829295325 2 5002.3110339045 ) 55.8914217511 (ExtendedPoll) + 3857+44 ( 2 0 4993.5350681737 2 5006.4495789887 ) 55.8730602592 (ExtendedPoll) + 3857+45 ( 2 0 4976.9436227384 2 5023.0037593255 ) 55.8003237383 (ExtendedPoll) + 3857+46 ( 2 0 4910.5778409973 2 5089.2204806727 ) 55.5208926377 (ExtendedPoll) + 3857+47 ( 2 0 4645.1147140329 2 5354.0873660614 ) 54.5978092091 (ExtendedPoll) + 3857+49 ( 2 0 4641.9961744036 2 5356.4416246436 ) 54.5973154410 (ExtendedPoll) + 3857+50 ( 2 0 4632.6405555159 2 5363.5044003904 ) 54.5960322314 (ExtendedPoll) + 3857+51 ( 2 0 4595.2180799647 2 5391.7555033777 ) 54.5938886963 (ExtendedPoll) + 3857+54 ( 2 0 4589.5405636156 2 5406.2768432706 ) 54.4819217775 (ExtendedPoll) + 3857+59 ( 2 0 4586.8655799511 2 5409.1224253831 ) 54.4730509300 (ExtendedPoll) + 3857+60 ( 2 0 4578.8406289576 2 5417.6591717205 ) 54.4466693127 (ExtendedPoll) + 3857+61 ( 2 0 4546.7408249837 2 5451.8061570703 ) 54.3446263871 (ExtendedPoll) + 3857+67 ( 2 0 4544.4002142773 2 5454.9315206375 ) 54.3305581908 (ExtendedPoll) + 3857+70 ( 2 0 4543.3834475273 2 5456.5982674743 ) 54.3211315639 (ExtendedPoll) + 3857+84 ( 2 0 4543.3817833230 2 5456.6057131428 ) 54.3210653441 (ExtendedPoll) + 3857+87 ( 2 0 4543.3799196151 2 5456.6131114083 ) 54.3210013080 (ExtendedPoll) + 3857+88 ( 2 0 4543.3724892530 2 5456.6264388915 ) 54.3209201075 (ExtendedPoll) + 3857+99 ( 2 0 4543.3733273061 2 5456.6259837410 ) 54.3209179808 (ExtendedPoll) + 3857+101 ( 2 0 4543.3714783336 2 5456.6279477327 ) 54.3209123378 (ExtendedPoll) + 3857+102 ( 2 0 4543.3659314160 2 5456.6338397077 ) 54.3208954091 (ExtendedPoll) + 3857+112 ( 2 0 4543.3658531448 2 5456.6339296214 ) 54.3208950973 (ExtendedPoll) + 3857+113 ( 2 0 4543.3656183312 2 5456.6341993626 ) 54.3208941618 (ExtendedPoll) + 3857+114 ( 2 0 4543.3646790771 2 5456.6352783273 ) 54.3208904201 (ExtendedPoll) + 3857+118 ( 2 0 4543.3645278465 2 5456.6354626442 ) 54.3208897035 (ExtendedPoll) + 3857+127 ( 2 0 4543.3645352524 2 5456.6354634587 ) 54.3208896327 (ExtendedPoll) + 3857+131 ( 2 0 4543.3645324236 2 5456.6354658827 ) 54.3208896303 (ExtendedPoll) + 3857+132 ( 2 0 4543.3645239373 2 5456.6354731547 ) 54.3208896231 (ExtendedPoll) + 3857+133 ( 2 0 4543.3644899919 2 5456.6355022427 ) 54.3208895946 (ExtendedPoll) + 3857+134 ( 2 0 4543.3643542104 2 5456.6356185947 ) 54.3208894804 (ExtendedPoll) + 3857+135 ( 2 0 4543.3638110842 2 5456.6360840029 ) 54.3208890235 (ExtendedPoll) + 3857+136 ( 2 0 4543.3616385797 2 5456.6379456356 ) 54.3208871959 (ExtendedPoll) + 3857+137 ( 2 0 4543.3529485614 2 5456.6453921663 ) 54.3208798860 (ExtendedPoll) + 3857+138 ( 2 0 4543.3181884885 2 5456.6751782893 ) 54.3208506492 (ExtendedPoll) + 3857+139 ( 2 0 4543.1791481970 2 5456.7943227813 ) 54.3207337517 (ExtendedPoll) + 3857+140 ( 2 0 4542.6229870307 2 5457.2709007492 ) 54.3202669568 (ExtendedPoll) + 3857+141 ( 2 0 4540.3983423657 2 5459.1772126208 ) 54.3184125004 (ExtendedPoll) + 3857+142 ( 2 0 4531.4997637056 2 5466.8024601073 ) 54.3111985229 (ExtendedPoll) + 3857+143 ( 2 0 4495.9054490650 2 5497.3034500534 ) 54.2856217202 (ExtendedPoll) + 3857+144 ( 2 0 4353.5281905028 2 5619.3074098378 ) 54.2368825197 (ExtendedPoll) + 3857+146 ( 2 0 4353.5041867680 2 5619.3635257316 ) 54.2365196285 (ExtendedPoll) + 3857+147 ( 2 0 4353.4321755638 2 5619.5318734129 ) 54.2354310246 (ExtendedPoll) + 3857+148 ( 2 0 4353.1441307467 2 5620.2052641384 ) 54.2310776574 (ExtendedPoll) + 3857+149 ( 2 0 4351.9919514786 2 5622.8988270401 ) 54.2136809672 (ExtendedPoll) + 3857+150 ( 2 0 4347.3832344061 2 5633.6730786469 ) 54.1443630877 (ExtendedPoll) + 3857+151 ( 2 0 4346.4159412060 2 5635.3688272200 ) 54.1355996268 (ExtendedPoll) + 3857+152 ( 2 0 4343.5140616057 2 5640.4560729390 ) 54.1093792188 (ExtendedPoll) + 3857+153 ( 2 0 4331.9065432045 2 5660.8050558153 ) 54.0055500944 (ExtendedPoll) + 3857+156 ( 2 0 4329.8320660769 2 5668.3386832786 ) 53.9480883416 (ExtendedPoll) + 3857+162 ( 2 0 4334.3358651038 2 5665.1314324564 ) 53.9408691910 (ExtendedPoll) + 3857+170 ( 2 0 4334.7698249059 2 5664.9075219934 ) 53.9393230537 (ExtendedPoll) + 3857+174 ( 2 0 4335.0132475664 2 5664.9262078546 ) 53.9370077879 (ExtendedPoll) + 3857+178 ( 2 0 4335.0593141454 2 5664.8861671994 ) 53.9370070214 (ExtendedPoll) + 3857+179 ( 2 0 4335.1975138822 2 5664.7660452336 ) 53.9370047791 (ExtendedPoll) + 3857+185 ( 2 0 4335.2265889224 2 5664.7567731080 ) 53.9368437214 (ExtendedPoll) + 3857+191 ( 2 0 4335.2341353579 2 5664.7556510827 ) 53.9367890253 (ExtendedPoll) + 3857+193 ( 2 0 4335.2400852963 2 5664.7508755444 ) 53.9367849554 (ExtendedPoll) + 3857+194 ( 2 0 4335.2579351117 2 5664.7365489296 ) 53.9367727467 (ExtendedPoll) + 3857+197 ( 2 0 4335.2420401136 2 5664.7511438225 ) 53.9367651768 (ExtendedPoll) + 3857+198 ( 2 0 4335.1943551193 2 5664.7949285015 ) 53.9367424744 (ExtendedPoll) + 3857+199 ( 2 0 4335.0036151422 2 5664.9700672173 ) 53.9366517744 (ExtendedPoll) + 3857+200 ( 2 0 4334.2406552335 2 5665.6706220803 ) 53.9362907282 (ExtendedPoll) + 3857+201 ( 2 0 4331.1888155990 2 5668.4728415326 ) 53.9348746183 (ExtendedPoll) + 3857+202 ( 2 0 4318.9814570610 2 5679.6817193417 ) 53.9296600779 (ExtendedPoll) + 3857+203 ( 2 0 4270.1520229090 2 5724.5172305782 ) 53.9160449943 (ExtendedPoll) + 3857+206 ( 2 0 4270.2287922106 2 5726.4688768232 ) 53.8962132135 (ExtendedPoll) + 3857+209 ( 2 0 4269.9967783213 2 5728.4085811769 ) 53.8792448146 (ExtendedPoll) + 3857+210 ( 2 0 4267.4719212911 2 5731.3906420478 ) 53.8723914551 (ExtendedPoll) + 3857+213 ( 2 0 4266.5745734546 2 5733.1256282638 ) 53.8633577202 (ExtendedPoll) + 3857+222 ( 2 0 4266.4308176062 2 5733.3229626873 ) 53.8627005560 (ExtendedPoll) + 3857+223 ( 2 0 4265.9995500609 2 5733.9149659579 ) 53.8607301402 (ExtendedPoll) + 3857+227 ( 2 0 4265.8268724443 2 5734.0875636064 ) 53.8605721022 (ExtendedPoll) + 3857+228 ( 2 0 4265.3088395946 2 5734.6053565521 ) 53.8600989724 (ExtendedPoll) + 3857+229 ( 2 0 4263.2367081957 2 5736.6765283347 ) 53.8582212182 (ExtendedPoll) + 3857+230 ( 2 0 4254.9481826001 2 5744.9612154653 ) 53.8509466860 (ExtendedPoll) + 3857+231 ( 2 0 4221.7940802176 2 5778.0999639874 ) 53.8256476388 (ExtendedPoll) + 3857+232 ( 2 0 4089.1776706878 2 5910.6549580759 ) 53.7861774796 (ExtendedPoll) + 3857+247 ( 2 0 4089.1136696138 2 5910.7589031772 ) 53.7858180957 (ExtendedPoll) + 3857+248 ( 2 0 4088.9216663918 2 5911.0707384809 ) 53.7847402348 (ExtendedPoll) + 3857+252 ( 2 0 4088.8359939837 2 5911.1576970414 ) 53.7847351920 (ExtendedPoll) + 3857+253 ( 2 0 4088.5789767594 2 5911.4185727227 ) 53.7847203220 (ExtendedPoll) + 3857+266 ( 2 0 4088.5833028094 2 5911.4153495129 ) 53.7847099233 (ExtendedPoll) + 3857+273 ( 2 0 4088.5841710836 2 5911.4149550584 ) 53.7847055346 (ExtendedPoll) + 3857+276 ( 2 0 4088.5850132823 2 5911.4145076255 ) 53.7847018687 (ExtendedPoll) + 3857+280 ( 2 0 4088.5854359861 2 5911.4142869556 ) 53.7846999932 (ExtendedPoll) + 3857+283 ( 2 0 4088.5850617172 2 5911.4148479102 ) 53.7846983212 (ExtendedPoll) + 3857+291 ( 2 0 4088.5850276880 2 5911.4148968462 ) 53.7846981880 (ExtendedPoll) + 3857+292 ( 2 0 4088.5849256003 2 5911.4150436540 ) 53.7846977884 (ExtendedPoll) + 3857+297 ( 2 0 4088.5849005844 2 5911.4150977550 ) 53.7846975253 (ExtendedPoll) + 3857+308 ( 2 0 4088.5849003997 2 5911.4150986678 ) 53.7846975187 (ExtendedPoll) + 3857+309 ( 2 0 4088.5848992968 2 5911.4151001689 ) 53.7846975151 (ExtendedPoll) + 3857+313 ( 2 0 4088.5848988407 2 5911.4151009808 ) 53.7846975119 (ExtendedPoll) + 3857+316 ( 2 0 4088.5848979979 2 5911.4151019930 ) 53.7846975104 (ExtendedPoll) + 4187+1 ( 2 0 4105.5097056568 2 5894.3640876566 ) 53.7853303801 (ExtendedPoll) + 4187+33 ( 2 0 4105.5249912111 2 5894.4490403525 ) 53.7844103322 (ExtendedPoll) + 4187+38 ( 2 0 4105.5402085635 2 5894.4501641740 ) 53.7842605703 (ExtendedPoll) + 4187+42 ( 2 0 4105.5590123984 2 5894.4395775740 ) 53.7841854603 (ExtendedPoll) + 4187+50 ( 2 0 4105.5607070024 2 5894.4387021916 ) 53.7841779690 (ExtendedPoll) + 4187+51 ( 2 0 4105.5636102425 2 5894.4362276993 ) 53.7841740843 (ExtendedPoll) + 4187+61 ( 2 0 4105.5638149153 2 5894.4361054192 ) 53.7841733315 (ExtendedPoll) + 4187+65 ( 2 0 4105.5638612668 2 5894.4360679458 ) 53.7841732508 (ExtendedPoll) + 4187+66 ( 2 0 4105.5640003213 2 5894.4359555257 ) 53.7841730088 (ExtendedPoll) + 4187+72 ( 2 0 4105.5640265310 2 5894.4359413401 ) 53.7841728988 (ExtendedPoll) + 4187+79 ( 2 0 4105.5640472452 2 5894.4359452146 ) 53.7841726734 (ExtendedPoll) + 4187+85 ( 2 0 4105.5640494603 2 5894.4359482098 ) 53.7841726256 (ExtendedPoll) + 4187+91 ( 2 0 4105.5640494863 2 5894.4359491407 ) 53.7841726169 (ExtendedPoll) + 4187+92 ( 2 0 4105.5640486402 2 5894.4359508001 ) 53.7841726094 (ExtendedPoll) + 4187+98 ( 2 0 4105.5640493116 2 5894.4359501547 ) 53.7841726092 (ExtendedPoll) + 4187+99 ( 2 0 4105.5640513257 2 5894.4359482183 ) 53.7841726085 (ExtendedPoll) + 4187+100 ( 2 0 4105.5640593820 2 5894.4359404726 ) 53.7841726058 (ExtendedPoll) + 4187+112 ( 2 0 4105.5640593940 2 5894.4359405296 ) 53.7841726051 (ExtendedPoll) + 4187+113 ( 2 0 4105.5640595037 2 5894.4359404905 ) 53.7841726045 (ExtendedPoll) + 4310+8 ( 2 0 4986.7257528443 2 5008.3439881737 ) 55.9026187973 (ExtendedPoll) + 4310+12 ( 2 0 4975.6982691662 2 5019.3714718518 ) 55.8540052955 (ExtendedPoll) + 4310+13 ( 2 0 4942.6158181319 2 5052.4539228861 ) 55.7112095080 (ExtendedPoll) + 4310+14 ( 2 0 4810.2860139947 2 5184.7837270233 ) 55.1870194047 (ExtendedPoll) + 4310+15 ( 2 0 4280.9667974460 2 5714.1029435721 ) 53.9228267897 (ExtendedPoll) + 4310+31 ( 2 0 4282.9099137686 2 5713.8982254345 ) 53.9076802800 (ExtendedPoll) + 4310+34 ( 2 0 4283.1982251457 2 5715.8293998657 ) 53.8861047342 (ExtendedPoll) + 4310+37 ( 2 0 4285.4740084419 2 5714.2633061132 ) 53.8814393469 (ExtendedPoll) + 4310+44 ( 2 0 4285.1205497824 2 5714.8564555920 ) 53.8787142179 (ExtendedPoll) + 4310+55 ( 2 0 4285.1005852658 2 5714.8795367790 ) 53.8786630424 (ExtendedPoll) + 4310+56 ( 2 0 4285.0406917160 2 5714.9487803400 ) 53.8785095322 (ExtendedPoll) + 4310+58 ( 2 0 4285.0005710927 2 5714.9947752809 ) 53.8784105470 (ExtendedPoll) + 4310+70 ( 2 0 4285.0007834768 2 5714.9966707681 ) 53.8783899929 (ExtendedPoll) + 4310+71 ( 2 0 4284.9983617564 2 5714.9996181702 ) 53.8783823323 (ExtendedPoll) + 4310+72 ( 2 0 4284.9910965952 2 5715.0084603766 ) 53.8783593509 (ExtendedPoll) + 4310+76 ( 2 0 4284.9884190656 2 5715.0111774997 ) 53.8783562185 (ExtendedPoll) + 4310+77 ( 2 0 4284.9803864769 2 5715.0193288691 ) 53.8783468217 (ExtendedPoll) + 4310+93 ( 2 0 4284.9804412318 2 5715.0194883169 ) 53.8783447670 (ExtendedPoll) + 4310+98 ( 2 0 4284.9804170022 2 5715.0195427745 ) 53.8783444443 (ExtendedPoll) + 4310+105 ( 2 0 4284.9804316104 2 5715.0195457146 ) 53.8783442863 (ExtendedPoll) + 4310+107 ( 2 0 4284.9804399767 2 5715.0195580455 ) 53.8783440910 (ExtendedPoll) + 4310+114 ( 2 0 4284.9804363154 2 5715.0195618337 ) 53.8783440860 (ExtendedPoll) + 4310+115 ( 2 0 4284.9804253315 2 5715.0195731983 ) 53.8783440710 (ExtendedPoll) + 4310+123 ( 2 0 4284.9804248959 2 5715.0195740214 ) 53.8783440667 (ExtendedPoll) + 4310+124 ( 2 0 4284.9804240703 2 5715.0195756911 ) 53.8783440575 (ExtendedPoll) + 4310+134 ( 2 0 4284.9804241092 2 5715.0195758008 ) 53.8783440561 (ExtendedPoll) + 4310+139 ( 2 0 4284.9804241503 2 5715.0195758421 ) 53.8783440553 (ExtendedPoll) + 4454 ( 3 0 3210.2718306224 2 3039.4036796793 1 3750.2294356176 ) 46.5957725777 + 4455 ( 3 0 3210.2204488871 2 3039.5770909239 1 3750.2008639259 ) 46.5947035783 + 4459+17 ( 2 0 4999.8234054990 2 5000.1686007961 ) 55.9010071498 (ExtendedPoll) + 4459+18 ( 2 0 4999.2960163907 2 5000.6767975791 ) 55.8988833670 (ExtendedPoll) + 4459+19 ( 2 0 4997.1864599572 2 5002.7095847109 ) 55.8903991267 (ExtendedPoll) + 4459+20 ( 2 0 4988.7482342235 2 5010.8407332383 ) 55.8566367335 (ExtendedPoll) + 4459+21 ( 2 0 4954.9953312886 2 5043.3653273476 ) 55.7244004145 (ExtendedPoll) + 4459+22 ( 2 0 4819.9837195490 2 5173.4637037851 ) 55.2417552587 (ExtendedPoll) + 4459+23 ( 2 0 4279.9372725906 2 5693.8572095350 ) 54.1320597545 (ExtendedPoll) + 4459+25 ( 2 0 4260.7210634090 2 5718.3142030389 ) 54.0605176484 (ExtendedPoll) + 4459+26 ( 2 0 4203.0724358640 2 5791.6851835507 ) 53.8630778677 (ExtendedPoll) + 4459+35 ( 2 0 4211.2611613676 2 5784.2607390941 ) 53.8607636217 (ExtendedPoll) + 4459+36 ( 2 0 4235.8273378782 2 5761.9874057245 ) 53.8557950144 (ExtendedPoll) + 4459+41 ( 2 0 4239.2666025897 2 5760.1381185483 ) 53.8430394257 (ExtendedPoll) + 4459+48 ( 2 0 4238.4020949545 2 5761.2154477473 ) 53.8403110732 (ExtendedPoll) + 4459+49 ( 2 0 4236.9895398051 2 5762.5631754865 ) 53.8398579750 (ExtendedPoll) + 4459+50 ( 2 0 4232.7518743570 2 5766.6063587038 ) 53.8385611120 (ExtendedPoll) + 4459+51 ( 2 0 4215.8012125647 2 5782.7790915733 ) 53.8343120215 (ExtendedPoll) + 4459+52 ( 2 0 4147.9985653954 2 5847.4700230513 ) 53.8324459450 (ExtendedPoll) + 4459+58 ( 2 0 4142.8942598315 2 5853.3659054138 ) 53.8237142063 (ExtendedPoll) + 4459+59 ( 2 0 4127.5813431399 2 5871.0535525015 ) 53.7986042338 (ExtendedPoll) + 4459+68 ( 2 0 4129.7411194915 2 5869.3305081768 ) 53.7948876409 (ExtendedPoll) + 4459+73 ( 2 0 4130.5591390496 2 5868.7973880268 ) 53.7923765042 (ExtendedPoll) + 4459+78 ( 2 0 4131.0192217390 2 5868.6337201408 ) 53.7897014772 (ExtendedPoll) + 4459+79 ( 2 0 4131.7293377788 2 5867.9632682402 ) 53.7894517155 (ExtendedPoll) + 4459+80 ( 2 0 4133.8596858981 2 5865.9519125383 ) 53.7887184190 (ExtendedPoll) + 4459+85 ( 2 0 4134.5843028059 2 5865.2972409942 ) 53.7882006022 (ExtendedPoll) + 4459+88 ( 2 0 4134.9640976007 2 5864.9903770359 ) 53.7875931645 (ExtendedPoll) + 4459+96 ( 2 0 4134.9859247059 2 5864.9690484814 ) 53.7875925935 (ExtendedPoll) + 4459+97 ( 2 0 4135.0514060213 2 5864.9050628179 ) 53.7875908962 (ExtendedPoll) + 4459+98 ( 2 0 4135.3133312830 2 5864.6491201639 ) 53.7875843437 (ExtendedPoll) + 4459+99 ( 2 0 4136.3610323297 2 5863.6253495479 ) 53.7875619231 (ExtendedPoll) + 4459+112 ( 2 0 4136.3648032632 2 5863.6247733590 ) 53.7875329472 (ExtendedPoll) + 4459+113 ( 2 0 4136.3761160637 2 5863.6230447924 ) 53.7874460195 (ExtendedPoll) + 4459+119 ( 2 0 4136.3737259452 2 5863.6260178809 ) 53.7874401351 (ExtendedPoll) + 4459+133 ( 2 0 4136.3738000302 2 5863.6261693177 ) 53.7874380524 (ExtendedPoll) + 4459+138 ( 2 0 4136.3737497999 2 5863.6262370108 ) 53.7874378803 (ExtendedPoll) + 4459+140 ( 2 0 4136.3737091508 2 5863.6262806039 ) 53.7874378451 (ExtendedPoll) + 4459+141 ( 2 0 4136.3735872034 2 5863.6264113833 ) 53.7874377393 (ExtendedPoll) + 4459+150 ( 2 0 4136.3735928884 2 5863.6264065675 ) 53.7874377323 (ExtendedPoll) + 4459+157 ( 2 0 4136.3735936795 2 5863.6264060760 ) 53.7874377297 (ExtendedPoll) + 4459+158 ( 2 0 4136.3735950382 2 5863.6264048019 ) 53.7874377291 (ExtendedPoll) + 4459+167 ( 2 0 4136.3735951385 2 5863.6264047429 ) 53.7874377288 (ExtendedPoll) + 4459+171 ( 2 0 4136.3735950627 2 5863.6264048312 ) 53.7874377287 (ExtendedPoll) + 4459+172 ( 2 0 4136.3735948352 2 5863.6264050962 ) 53.7874377283 (ExtendedPoll) + 4459+181 ( 2 0 4136.3735948402 2 5863.6264051370 ) 53.7874377278 (ExtendedPoll) + 4646+2 ( 2 0 4105.5720108686 2 5894.4263928684 ) 53.7841874022 (ExtendedPoll) + 4646+29 ( 2 0 4105.5833069765 2 5894.4161347829 ) 53.7841780742 (ExtendedPoll) + 4646+42 ( 2 0 4105.5835293721 2 5894.4160488549 ) 53.7841768253 (ExtendedPoll) + 4646+43 ( 2 0 4105.5841965588 2 5894.4157910708 ) 53.7841730784 (ExtendedPoll) + 4646+48 ( 2 0 4105.5842867579 2 5894.4157131287 ) 53.7841729675 (ExtendedPoll) + 4646+67 ( 2 0 4105.5842868659 2 5894.4157130854 ) 53.7841729669 (ExtendedPoll) + 4646+74 ( 2 0 4105.5842868950 2 5894.4157130859 ) 53.7841729666 (ExtendedPoll) + 4725+19 ( 2 0 4999.8031735893 2 5000.1447170134 ) 55.9014542318 (ExtendedPoll) + 4725+20 ( 2 0 4999.2150887519 2 5000.5812624482 ) 55.9006716187 (ExtendedPoll) + 4725+21 ( 2 0 4996.8627494022 2 5002.3274441874 ) 55.8975509135 (ExtendedPoll) + 4725+22 ( 2 0 4987.4533920033 2 5009.3121711443 ) 55.8852243268 (ExtendedPoll) + 4725+23 ( 2 0 4949.8159624076 2 5037.2510789717 ) 55.8384358459 (ExtendedPoll) + 4725+24 ( 2 0 4799.2662440251 2 5149.0067102812 ) 55.6927299999 (ExtendedPoll) + 4725+27 ( 2 0 4798.1744139579 2 5164.6198802413 ) 55.5187163710 (ExtendedPoll) + 4725+28 ( 2 0 4798.1744139579 2 5196.0645861749 ) 55.1525452486 (ExtendedPoll) + 4725+33 ( 2 0 4792.1420528370 2 5201.0324129804 ) 55.1431419649 (ExtendedPoll) + 4725+34 ( 2 0 4774.0449694742 2 5215.9358933968 ) 55.1157026271 (ExtendedPoll) + 4725+35 ( 2 0 4701.6566360229 2 5275.5498150626 ) 55.0176540485 (ExtendedPoll) + 4725+36 ( 2 0 4412.1033022177 2 5514.0055017256 ) 54.8221696457 (ExtendedPoll) + 4725+40 ( 2 0 4371.9239557470 2 5561.1725606260 ) 54.6749065998 (ExtendedPoll) + 4725+41 ( 2 0 4251.3859163349 2 5702.6737373272 ) 54.2973393293 (ExtendedPoll) + 4725+44 ( 2 0 4391.1401649287 2 5590.8703384522 ) 54.2022453171 (ExtendedPoll) + 4725+50 ( 2 0 4362.3158511562 2 5624.4987045201 ) 54.1076851285 (ExtendedPoll) + 4725+55 ( 2 0 4358.6036289279 2 5639.6751424533 ) 53.9858955384 (ExtendedPoll) + 4725+60 ( 2 0 4355.6625116846 2 5642.2409431111 ) 53.9855132092 (ExtendedPoll) + 4725+61 ( 2 0 4346.8391599545 2 5649.9383450844 ) 53.9845992440 (ExtendedPoll) + 4725+62 ( 2 0 4311.5457530343 2 5680.7279529777 ) 53.9844549147 (ExtendedPoll) + 4725+67 ( 2 0 4308.5432203496 2 5687.9340314208 ) 53.9390274262 (ExtendedPoll) + 4725+71 ( 2 0 4307.7243477993 2 5691.7554366558 ) 53.9082186256 (ExtendedPoll) + 4725+83 ( 2 0 4308.0052488063 2 5691.9562363603 ) 53.9037540967 (ExtendedPoll) + 4725+87 ( 2 0 4308.1049356103 2 5691.8857845325 ) 53.9035781830 (ExtendedPoll) + 4725+93 ( 2 0 4308.1185770304 2 5691.8789477872 ) 53.9035262437 (ExtendedPoll) + 4725+96 ( 2 0 4308.1246647783 2 5691.8743491833 ) 53.9035184462 (ExtendedPoll) + 4725+100 ( 2 0 4308.1208413138 2 5691.8781550898 ) 53.9035142224 (ExtendedPoll) + 4725+101 ( 2 0 4308.1093709201 2 5691.8895728093 ) 53.9035015515 (ExtendedPoll) + 4725+102 ( 2 0 4308.0634893453 2 5691.9352436871 ) 53.9034508749 (ExtendedPoll) + 4725+103 ( 2 0 4307.8799630460 2 5692.1179271984 ) 53.9032482824 (ExtendedPoll) + 4725+104 ( 2 0 4307.1458578490 2 5692.8486612434 ) 53.9024397326 (ExtendedPoll) + 4725+105 ( 2 0 4304.2094370610 2 5695.7715974237 ) 53.8992346674 (ExtendedPoll) + 4725+106 ( 2 0 4292.4637539088 2 5707.4633421446 ) 53.8868812553 (ExtendedPoll) + 4725+107 ( 2 0 4245.4810213003 2 5754.2303210285 ) 53.8449818536 (ExtendedPoll) + 4725+108 ( 2 0 4057.5500908662 2 5941.2982365638 ) 53.8003145611 (ExtendedPoll) + 4725+112 ( 2 0 4057.3125325273 2 5942.2454844463 ) 53.7939890318 (ExtendedPoll) + 4725+119 ( 2 0 4057.4393884670 2 5942.4540943610 ) 53.7909379794 (ExtendedPoll) + 4725+120 ( 2 0 4057.1333775009 2 5942.8346355240 ) 53.7903471560 (ExtendedPoll) + 4725+123 ( 2 0 4057.6371760427 2 5942.3623976952 ) 53.7899322822 (ExtendedPoll) + 4725+143 ( 2 0 4057.6378562203 2 5942.3617292243 ) 53.7899320010 (ExtendedPoll) + 4725+144 ( 2 0 4057.6398967532 2 5942.3597238116 ) 53.7899311575 (ExtendedPoll) + 4725+145 ( 2 0 4057.6480588849 2 5942.3517021609 ) 53.7899277838 (ExtendedPoll) + 4725+154 ( 2 0 4057.6479540349 2 5942.3519162868 ) 53.7899268277 (ExtendedPoll) + 4725+158 ( 2 0 4057.6478865326 2 5942.3520145431 ) 53.7899265685 (ExtendedPoll) + 4725+159 ( 2 0 4057.6476840256 2 5942.3523093118 ) 53.7899257907 (ExtendedPoll) + 4725+171 ( 2 0 4057.6476847788 2 5942.3523129602 ) 53.7899257509 (ExtendedPoll) + 4725+175 ( 2 0 4057.6476860982 2 5942.3523116454 ) 53.7899257506 (ExtendedPoll) + 4725+176 ( 2 0 4057.6476900565 2 5942.3523077012 ) 53.7899257494 (ExtendedPoll) + 4725+177 ( 2 0 4057.6477058896 2 5942.3522919242 ) 53.7899257448 (ExtendedPoll) + 4725+178 ( 2 0 4057.6477692222 2 5942.3522288165 ) 53.7899257264 (ExtendedPoll) + 4725+179 ( 2 0 4057.6480225525 2 5942.3519763854 ) 53.7899256529 (ExtendedPoll) + 4725+190 ( 2 0 4057.6480214853 2 5942.3519779120 ) 53.7899256490 (ExtendedPoll) + 4725+197 ( 2 0 4057.6480212763 2 5942.3519783281 ) 53.7899256472 (ExtendedPoll) + 4725+200 ( 2 0 4057.6480210350 2 5942.3519787264 ) 53.7899256458 (ExtendedPoll) + 4725+203 ( 2 0 4057.6480213991 2 5942.3519784360 ) 53.7899256451 (ExtendedPoll) + 4725+207 ( 2 0 4057.6480219221 2 5942.3519780358 ) 53.7899256438 (ExtendedPoll) + 4725+211 ( 2 0 4057.6480221025 2 5942.3519778887 ) 53.7899256435 (ExtendedPoll) + 4725+216 ( 2 0 4057.6480219897 2 5942.3519780086 ) 53.7899256435 (ExtendedPoll) + 4725+221 ( 2 0 4057.6480219698 2 5942.3519780298 ) 53.7899256435 (ExtendedPoll) + 4950 ( 3 0 3210.2137213322 2 3039.6012428177 1 3750.1834642275 ) 46.5946997610 + 4951 ( 3 0 3210.1935386677 2 3039.6736984988 1 3750.1312651323 ) 46.5946883143 + 4952 ( 3 0 3210.1128080096 2 3039.9635212235 1 3749.9224687515 ) 46.5946426050 + 4953 ( 3 0 3209.7898853771 2 3041.1228121224 1 3749.0872832281 ) 46.5944610083 + 4957+21 ( 2 0 4999.9515314082 2 5000.0370988583 ) 55.9016212277 (ExtendedPoll) + 4957+22 ( 2 0 4999.8061545413 2 5000.1484243416 ) 55.9013860644 (ExtendedPoll) + 4957+23 ( 2 0 4999.2246470737 2 5000.5937262748 ) 55.9004460290 (ExtendedPoll) + 4957+24 ( 2 0 4996.8986172034 2 5002.3749340079 ) 55.8966957757 (ExtendedPoll) + 4957+25 ( 2 0 4987.5944977221 2 5009.4997649402 ) 55.8818532664 (ExtendedPoll) + 4957+26 ( 2 0 4950.3780197968 2 5037.9990886692 ) 55.8250376177 (ExtendedPoll) + 4957+27 ( 2 0 4801.5121080959 2 5151.9963835853 ) 55.6398202521 (ExtendedPoll) + 4957+29 ( 2 0 4799.9016587469 2 5159.6391940553 ) 55.5631771412 (ExtendedPoll) + 4957+30 ( 2 0 4795.0703106998 2 5182.5676254652 ) 55.3341978198 (ExtendedPoll) + 4957+31 ( 2 0 4780.2214217867 2 5210.0817431571 ) 55.1338115001 (ExtendedPoll) + 4957+36 ( 2 0 4799.2192649549 2 5198.7267104589 ) 55.1133076930 (ExtendedPoll) + 4957+47 ( 2 0 4800.1328196439 2 5199.0717458199 ) 55.1020064789 (ExtendedPoll) + 4957+51 ( 2 0 4800.6067634573 2 5199.1893521250 ) 55.0968559487 (ExtendedPoll) + 4957+57 ( 2 0 4800.7025918042 2 5199.2649685543 ) 55.0952132428 (ExtendedPoll) + 4957+63 ( 2 0 4800.7285047755 2 5199.2488491668 ) 55.0951932210 (ExtendedPoll) + 4957+65 ( 2 0 4800.7568088740 2 5199.2374387295 ) 55.0950994742 (ExtendedPoll) + 4957+69 ( 2 0 4800.7456186612 2 5199.2478121856 ) 55.0950685340 (ExtendedPoll) + 4957+70 ( 2 0 4800.7120480229 2 5199.2789325537 ) 55.0949757164 (ExtendedPoll) + 4957+71 ( 2 0 4800.5777654696 2 5199.4034140262 ) 55.0946044924 (ExtendedPoll) + 4957+72 ( 2 0 4800.0406352565 2 5199.9013399163 ) 55.0931203333 (ExtendedPoll) + 4957+73 ( 2 0 4797.8921144041 2 5201.8930434766 ) 55.0871954955 (ExtendedPoll) + 4957+74 ( 2 0 4789.2980309945 2 5209.8598577177 ) 55.0636852238 (ExtendedPoll) + 4957+75 ( 2 0 4754.9216973563 2 5241.7271146822 ) 54.9726888507 (ExtendedPoll) + 4957+76 ( 2 0 4617.4163628032 2 5369.1961425400 ) 54.6586519092 (ExtendedPoll) + 4957+77 ( 2 0 4067.3950245908 2 5879.0722539713 ) 54.2760732951 (ExtendedPoll) + 4957+81 ( 2 0 4078.4498040205 2 5879.1268454747 ) 54.1738605186 (ExtendedPoll) + 4957+82 ( 2 0 4111.6141423099 2 5879.2906199847 ) 53.8682373433 (ExtendedPoll) + 4957+83 ( 2 0 4135.6344037869 2 5859.2009467494 ) 53.8353496249 (ExtendedPoll) + 4957+91 ( 2 0 4139.1419078776 2 5857.4881383315 ) 53.8193865804 (ExtendedPoll) + 4957+96 ( 2 0 4141.0884361692 2 5857.6587367795 ) 53.8000899204 (ExtendedPoll) + 4957+101 ( 2 0 4141.5688840483 2 5857.7459552361 ) 53.7949073397 (ExtendedPoll) + 4957+104 ( 2 0 4141.9346044712 2 5857.4223513050 ) 53.7945977867 (ExtendedPoll) + 4957+105 ( 2 0 4143.0317657398 2 5856.4515395119 ) 53.7936730233 (ExtendedPoll) + 4957+106 ( 2 0 4147.4204108144 2 5852.5682923396 ) 53.7900323766 (ExtendedPoll) + 4957+117 ( 2 0 4147.4162293615 2 5852.5829669923 ) 53.7899332894 (ExtendedPoll) + 4957+128 ( 2 0 4147.4160645968 2 5852.5834144589 ) 53.7899306065 (ExtendedPoll) + 4957+129 ( 2 0 4147.4153897141 2 5852.5840882751 ) 53.7899304432 (ExtendedPoll) + 4957+130 ( 2 0 4147.4133650660 2 5852.5861097238 ) 53.7899299534 (ExtendedPoll) + 4957+131 ( 2 0 4147.4052664734 2 5852.5941955188 ) 53.7899279944 (ExtendedPoll) + 4957+132 ( 2 0 4147.3728721030 2 5852.6265386988 ) 53.7899201620 (ExtendedPoll) + 4957+133 ( 2 0 4147.2432946213 2 5852.7559114185 ) 53.7898888919 (ExtendedPoll) + 4957+134 ( 2 0 4146.7249846949 2 5853.2734022975 ) 53.7897647629 (ExtendedPoll) + 4957+135 ( 2 0 4144.6517449892 2 5855.3433658132 ) 53.7892834747 (ExtendedPoll) + 4957+136 ( 2 0 4136.3587861663 2 5863.6232198764 ) 53.7876021773 (ExtendedPoll) + 4957+137 ( 2 0 4103.1869508749 2 5896.7426361291 ) 53.7847922558 (ExtendedPoll) + 4957+145 ( 2 0 4103.1682983337 2 5896.8007512235 ) 53.7844302124 (ExtendedPoll) + 4957+150 ( 2 0 4103.1669213843 2 5896.8312377825 ) 53.7841632090 (ExtendedPoll) + 4957+157 ( 2 0 4103.1650483182 2 5896.8345609654 ) 53.7841499007 (ExtendedPoll) + 4957+160 ( 2 0 4103.1624316887 2 5896.8373367825 ) 53.7841484300 (ExtendedPoll) + 4957+170 ( 2 0 4103.1626410673 2 5896.8372227473 ) 53.7841475564 (ExtendedPoll) + 4957+174 ( 2 0 4103.1625629696 2 5896.8373128117 ) 53.7841474463 (ExtendedPoll) + 4957+175 ( 2 0 4103.1623286764 2 5896.8375830050 ) 53.7841471160 (ExtendedPoll) + 4957+184 ( 2 0 4103.1623613751 2 5896.8376095974 ) 53.7841465724 (ExtendedPoll) + 4957+185 ( 2 0 4103.1623318769 2 5896.8376613910 ) 53.7841463677 (ExtendedPoll) + 4957+189 ( 2 0 4103.1623225735 2 5896.8376730311 ) 53.7841463463 (ExtendedPoll) + 4957+199 ( 2 0 4103.1623243672 2 5896.8376725291 ) 53.7841463344 (ExtendedPoll) + 4957+202 ( 2 0 4103.1623260046 2 5896.8376734171 ) 53.7841463113 (ExtendedPoll) + 4957+206 ( 2 0 4103.1623267413 2 5896.8376728473 ) 53.7841463097 (ExtendedPoll) + 4957+214 ( 2 0 4103.1623267301 2 5896.8376730798 ) 53.7841463077 (ExtendedPoll) + 4957+216 ( 2 0 4103.1623264493 2 5896.8376734513 ) 53.7841463069 (ExtendedPoll) + 4957+221 ( 2 0 4103.1623262249 2 5896.8376736923 ) 53.7841463067 (ExtendedPoll) + 4957+222 ( 2 0 4103.1623255517 2 5896.8376744152 ) 53.7841463063 (ExtendedPoll) + 4957+228 ( 2 0 4103.1623256446 2 5896.8376743450 ) 53.7841463061 (ExtendedPoll) + 5195+2 ( 2 0 4552.7863948639 2 5335.4101869888 ) 55.5680147602 (ExtendedPoll) + 5195+12 ( 2 0 4572.0026040455 2 5394.8057426411 ) 54.7532818545 (ExtendedPoll) + 5195+14 ( 2 0 4528.3294013600 2 5438.4789453267 ) 54.6428900648 (ExtendedPoll) + 5195+15 ( 2 0 4397.3097933033 2 5569.4985533833 ) 54.3697111024 (ExtendedPoll) + 5195+16 ( 2 0 3873.2313610768 2 6093.5769856098 ) 54.2139782157 (ExtendedPoll) + 5195+25 ( 2 0 3901.1822107956 2 6079.1648287236 ) 54.0675524851 (ExtendedPoll) + 5195+30 ( 2 0 3904.6760670104 2 6094.4504496635 ) 53.9053251878 (ExtendedPoll) + 5195+38 ( 2 0 3905.5158378706 2 6093.9518756993 ) 53.9014892203 (ExtendedPoll) + 5195+42 ( 2 0 3905.9712291027 2 6093.7758394257 ) 53.8986171016 (ExtendedPoll) + 5195+47 ( 2 0 3906.2152648514 2 6093.7828499557 ) 53.8962262883 (ExtendedPoll) + 5195+53 ( 2 0 3906.2570598051 2 6093.7383694092 ) 53.8962008251 (ExtendedPoll) + 5195+54 ( 2 0 3906.3824446664 2 6093.6049277697 ) 53.8961245036 (ExtendedPoll) + 5195+55 ( 2 0 3906.8839841115 2 6093.0711612115 ) 53.8958202370 (ExtendedPoll) + 5195+56 ( 2 0 3908.8901418918 2 6090.9360949789 ) 53.8946194836 (ExtendedPoll) + 5195+57 ( 2 0 3916.9147730132 2 6082.3958300485 ) 53.8900773214 (ExtendedPoll) + 5195+58 ( 2 0 3949.0132974987 2 6048.2347703268 ) 53.8760722747 (ExtendedPoll) + 5195+60 ( 2 0 3952.3160834518 2 6046.1534692613 ) 53.8626856098 (ExtendedPoll) + 5195+68 ( 2 0 3953.1776056142 2 6046.6132320786 ) 53.8505840740 (ExtendedPoll) + 5195+71 ( 2 0 3953.5789384631 2 6046.3350499844 ) 53.8491773294 (ExtendedPoll) + 5195+80 ( 2 0 3953.6091921986 2 6046.3390542165 ) 53.8488567166 (ExtendedPoll) + 5195+81 ( 2 0 3953.6616312293 2 6046.3078233717 ) 53.8486289876 (ExtendedPoll) + 5195+82 ( 2 0 3953.7497026781 2 6046.2232971719 ) 53.8485221437 (ExtendedPoll) + 5195+83 ( 2 0 3954.0139170244 2 6045.9697185726 ) 53.8482018728 (ExtendedPoll) + 5195+94 ( 2 0 3954.0185845590 2 6045.9794463233 ) 53.8480741214 (ExtendedPoll) + 5195+100 ( 2 0 3954.0184347508 2 6045.9813477797 ) 53.8480591976 (ExtendedPoll) + 5195+112 ( 2 0 3954.0185244766 2 6045.9812692933 ) 53.8480590234 (ExtendedPoll) + 5195+113 ( 2 0 3954.0187936542 2 6045.9810338338 ) 53.8480585006 (ExtendedPoll) + 5195+114 ( 2 0 3954.0198703645 2 6045.9800919962 ) 53.8480564096 (ExtendedPoll) + 5195+119 ( 2 0 3954.0199556739 2 6045.9800087306 ) 53.8480563182 (ExtendedPoll) + 5195+120 ( 2 0 3954.0202116021 2 6045.9797589338 ) 53.8480560440 (ExtendedPoll) + 5195+121 ( 2 0 3954.0212353150 2 6045.9787597466 ) 53.8480549472 (ExtendedPoll) + 5195+131 ( 2 0 3954.0212561678 2 6045.9787384550 ) 53.8480549329 (ExtendedPoll) + 5195+132 ( 2 0 3954.0213187265 2 6045.9786745799 ) 53.8480548901 (ExtendedPoll) + 5195+133 ( 2 0 3954.0215689610 2 6045.9784190796 ) 53.8480547188 (ExtendedPoll) + 5195+134 ( 2 0 3954.0225698990 2 6045.9773970786 ) 53.8480540335 (ExtendedPoll) + 5195+135 ( 2 0 3954.0265736512 2 6045.9733090745 ) 53.8480512924 (ExtendedPoll) + 5195+136 ( 2 0 3954.0425886598 2 6045.9569570580 ) 53.8480403289 (ExtendedPoll) + 5195+137 ( 2 0 3954.1066486941 2 6045.8915489921 ) 53.8479964904 (ExtendedPoll) + 5195+138 ( 2 0 3954.3628888317 2 6045.6299167285 ) 53.8478213863 (ExtendedPoll) + 5195+139 ( 2 0 3955.3878493820 2 6044.5833876740 ) 53.8471249631 (ExtendedPoll) + 5195+140 ( 2 0 3959.4876915833 2 6040.3972714563 ) 53.8444031448 (ExtendedPoll) + 5195+141 ( 2 0 3975.8870603884 2 6023.6528065852 ) 53.8345365224 (ExtendedPoll) + 5195+142 ( 2 0 4041.4845356089 2 5956.6749471009 ) 53.8113115046 (ExtendedPoll) + 5195+145 ( 2 0 4041.6035546824 2 5956.7020629246 ) 53.8099638531 (ExtendedPoll) + 5195+146 ( 2 0 4041.9606119028 2 5956.7834103954 ) 53.8059210158 (ExtendedPoll) + 5195+147 ( 2 0 4042.3009558066 2 5957.1335637099 ) 53.7996303534 (ExtendedPoll) + 5195+148 ( 2 0 4043.0741932721 2 5956.5373221342 ) 53.7977822528 (ExtendedPoll) + 5195+151 ( 2 0 4043.9165231091 2 5956.0430131312 ) 53.7943836123 (ExtendedPoll) + 5195+153 ( 2 0 4044.5989169010 2 5955.3444124866 ) 53.7942993075 (ExtendedPoll) + 5195+154 ( 2 0 4046.6460982769 2 5953.2486105531 ) 53.7940631506 (ExtendedPoll) + 5195+155 ( 2 0 4054.8348237804 2 5944.8654028188 ) 53.7933696899 (ExtendedPoll) + 5195+166 ( 2 0 4055.0724354313 2 5944.9214870586 ) 53.7906651766 (ExtendedPoll) + 5195+176 ( 2 0 4055.0761548684 2 5944.9206398974 ) 53.7906383460 (ExtendedPoll) + 5195+180 ( 2 0 4055.0778890903 2 5944.9198458871 ) 53.7906294220 (ExtendedPoll) + 5195+181 ( 2 0 4055.0811305415 2 5944.9178346926 ) 53.7906174793 (ExtendedPoll) + 5195+184 ( 2 0 4055.0777945058 2 5944.9220743514 ) 53.7906102701 (ExtendedPoll) + 5195+198 ( 2 0 4055.0778330577 2 5944.9221198097 ) 53.7906095046 (ExtendedPoll) + 5195+199 ( 2 0 4055.0777705351 2 5944.9222213074 ) 53.7906091714 (ExtendedPoll) + 5195+201 ( 2 0 4055.0780084500 2 5944.9219823862 ) 53.7906091154 (ExtendedPoll) + 5195+202 ( 2 0 4055.0787221949 2 5944.9212656228 ) 53.7906089474 (ExtendedPoll) + 5195+203 ( 2 0 4055.0815771745 2 5944.9183985692 ) 53.7906082755 (ExtendedPoll) + 5195+204 ( 2 0 4055.0929970928 2 5944.9069303548 ) 53.7906055884 (ExtendedPoll) + 5195+205 ( 2 0 4055.1386767659 2 5944.8610574972 ) 53.7905948477 (ExtendedPoll) + 5195+206 ( 2 0 4055.3213954584 2 5944.6775660669 ) 53.7905520064 (ExtendedPoll) + 5195+207 ( 2 0 4056.0522702285 2 5943.9436003453 ) 53.7903825885 (ExtendedPoll) + 5195+208 ( 2 0 4058.9757693086 2 5941.0077374592 ) 53.7897360619 (ExtendedPoll) + 5195+209 ( 2 0 4070.6697656292 2 5929.2642859147 ) 53.7876477253 (ExtendedPoll) + 5195+210 ( 2 0 4117.4457509116 2 5882.2904797367 ) 53.7872228417 (ExtendedPoll) + 5195+213 ( 2 0 4117.6891202600 2 5882.3097520301 ) 53.7848204977 (ExtendedPoll) + 5195+228 ( 2 0 4117.6899942270 2 5882.3093703541 ) 53.7848160313 (ExtendedPoll) + 5195+229 ( 2 0 4117.6915671836 2 5882.3082915651 ) 53.7848116087 (ExtendedPoll) + 5195+235 ( 2 0 4117.6919572521 2 5882.3080173020 ) 53.7848105741 (ExtendedPoll) + 5195+242 ( 2 0 4117.6920091373 2 5882.3079879653 ) 53.7848103706 (ExtendedPoll) + 5195+245 ( 2 0 4117.6920521121 2 5882.3079466630 ) 53.7848103589 (ExtendedPoll) + 5195+253 ( 2 0 4117.6920497867 2 5882.3079495734 ) 53.7848103533 (ExtendedPoll) + 5195+263 ( 2 0 4117.6920499996 2 5882.3079496675 ) 53.7848103505 (ExtendedPoll) + 5195+266 ( 2 0 4117.6920502143 2 5882.3079495774 ) 53.7848103493 (ExtendedPoll) + 5195+269 ( 2 0 4117.6920504410 2 5882.3079495242 ) 53.7848103478 (ExtendedPoll) + 5195+275 ( 2 0 4117.6920503703 2 5882.3079496167 ) 53.7848103475 (ExtendedPoll) + 5478+3 ( 2 0 4909.1597287779 2 5083.8525395201 ) 55.5960691542 (ExtendedPoll) + 5478+4 ( 2 0 4636.6389440201 2 5335.4101869888 ) 54.8753885588 (ExtendedPoll) + 5478+13 ( 2 0 4690.7937153502 2 5303.9654810552 ) 54.7846942177 (ExtendedPoll) + 5478+15 ( 2 0 4565.0148916158 2 5429.7443047896 ) 54.4304906658 (ExtendedPoll) + 5478+16 ( 2 0 4187.6784204127 2 5807.0807759926 ) 53.8546415124 (ExtendedPoll) + 5478+28 ( 2 0 4195.7852586612 2 5799.5744442811 ) 53.8531825911 (ExtendedPoll) + 5478+29 ( 2 0 4220.1057734067 2 5777.0554491463 ) 53.8508015438 (ExtendedPoll) + 5478+31 ( 2 0 4231.5699891117 2 5766.4646974951 ) 53.8504789320 (ExtendedPoll) + 5478+34 ( 2 0 4237.6296459843 2 5761.5514621930 ) 53.8439440609 (ExtendedPoll) + 5478+41 ( 2 0 4239.1257943732 2 5760.2958576158 ) 53.8427664280 (ExtendedPoll) + 5478+46 ( 2 0 4239.9101207378 2 5759.7136904120 ) 53.8414160967 (ExtendedPoll) + 5478+50 ( 2 0 4239.7094543134 2 5760.1588457372 ) 53.8388916705 (ExtendedPoll) + 5478+54 ( 2 0 4239.2194102715 2 5760.6452645620 ) 53.8385475799 (ExtendedPoll) + 5478+55 ( 2 0 4237.7492781460 2 5762.1045210365 ) 53.8375232191 (ExtendedPoll) + 5478+56 ( 2 0 4231.8687496437 2 5767.9415469345 ) 53.8335445270 (ExtendedPoll) + 5478+57 ( 2 0 4208.3466356348 2 5791.2896505265 ) 53.8195350703 (ExtendedPoll) + 5478+58 ( 2 0 4114.2581795991 2 5884.6820648944 ) 53.7943112519 (ExtendedPoll) + 5478+71 ( 2 0 4114.9485701934 2 5884.6988048671 ) 53.7878427663 (ExtendedPoll) + 5478+74 ( 2 0 4115.3912731659 2 5884.4929138652 ) 53.7856923145 (ExtendedPoll) + 5478+80 ( 2 0 4115.5104388474 2 5884.4664511137 ) 53.7848465681 (ExtendedPoll) + 5478+86 ( 2 0 4115.5040354705 2 5884.4803013045 ) 53.7847774342 (ExtendedPoll) + 5478+92 ( 2 0 4115.5085943246 2 5884.4864188582 ) 53.7846793465 (ExtendedPoll) + 5478+94 ( 2 0 4115.5038751700 2 5884.4924136225 ) 53.7846672332 (ExtendedPoll) + 5478+99 ( 2 0 4115.5033916134 2 5884.4961975456 ) 53.7846367702 (ExtendedPoll) + 5478+108 ( 2 0 4115.5032700638 2 5884.4964026531 ) 53.7846359908 (ExtendedPoll) + 5478+109 ( 2 0 4115.5029054151 2 5884.4970179759 ) 53.7846336525 (ExtendedPoll) + 5478+117 ( 2 0 4115.5029626983 2 5884.4970015034 ) 53.7846332805 (ExtendedPoll) + 5478+121 ( 2 0 4115.5030374021 2 5884.4969624551 ) 53.7846329574 (ExtendedPoll) + 5478+142 ( 2 0 4115.5030374174 2 5884.4969625705 ) 53.7846329562 (ExtendedPoll) + 5629+9 ( 2 0 4975.5429968599 2 5019.6529315723 ) 55.8517940762 (ExtendedPoll) + 5629+10 ( 2 0 4902.1720163482 2 5078.6117551978 ) 55.7134020563 (ExtendedPoll) + 5629+11 ( 2 0 4608.6880943013 2 5314.4470496997 ) 55.3395226272 (ExtendedPoll) + 5629+15 ( 2 0 4552.7863948639 2 5426.2504485747 ) 54.5705629398 (ExtendedPoll) + 5629+20 ( 2 0 4591.6555452540 2 5405.2873112856 ) 54.4751741266 (ExtendedPoll) + 5629+33 ( 2 0 4592.5840273072 2 5406.3096224852 ) 54.4562806449 (ExtendedPoll) + 5629+37 ( 2 0 4592.3579843636 2 5406.7424094230 ) 54.4534252540 (ExtendedPoll) + 5629+38 ( 2 0 4591.6798555328 2 5408.0407702362 ) 54.4448631609 (ExtendedPoll) + 5629+44 ( 2 0 4591.6012203107 2 5408.2719044772 ) 54.4429899385 (ExtendedPoll) + 5629+48 ( 2 0 4591.5696196138 2 5408.3898106624 ) 54.4419637140 (ExtendedPoll) + 5629+52 ( 2 0 4591.5680918914 2 5408.4202901410 ) 54.4416432602 (ExtendedPoll) + 5629+58 ( 2 0 4591.5700204171 2 5408.4276717726 ) 54.4415465559 (ExtendedPoll) + 5629+60 ( 2 0 4591.5654575021 2 5408.4337863066 ) 54.4415176321 (ExtendedPoll) + 5629+67 ( 2 0 4591.5646332830 2 5408.4348538518 ) 54.4415128113 (ExtendedPoll) + 5629+71 ( 2 0 4591.5645519834 2 5408.4353237071 ) 54.4415083512 (ExtendedPoll) + 5629+79 ( 2 0 4591.5646115597 2 5408.4353255431 ) 54.4415078361 (ExtendedPoll) + 5629+84 ( 2 0 4591.5645990175 2 5408.4353525777 ) 54.4415076449 (ExtendedPoll) + 5629+85 ( 2 0 4591.5645613907 2 5408.4354336816 ) 54.4415070710 (ExtendedPoll) + 5629+94 ( 2 0 4591.5645699689 2 5408.4354275629 ) 54.4415070666 (ExtendedPoll) + 5629+101 ( 2 0 4591.5645717027 2 5408.4354268822 ) 54.4415070596 (ExtendedPoll) + 5629+103 ( 2 0 4591.5645704450 2 5408.4354282562 ) 54.4415070551 (ExtendedPoll) + 5629+104 ( 2 0 4591.5645666721 2 5408.4354323781 ) 54.4415070414 (ExtendedPoll) + 5629+109 ( 2 0 4591.5645657541 2 5408.4354339988 ) 54.4415070313 (ExtendedPoll) + 5629+119 ( 2 0 4591.5645658577 2 5408.4354341268 ) 54.4415070290 (ExtendedPoll) + 5755+17 ( 2 0 4999.4391479660 2 5000.4028159491 ) 55.9011173930 (ExtendedPoll) + 5755+18 ( 2 0 4997.7566207727 2 5001.6112927051 ) 55.8993758016 (ExtendedPoll) + 5755+19 ( 2 0 4991.0265119995 2 5006.4451997289 ) 55.8924862980 (ExtendedPoll) + 5755+20 ( 2 0 4964.1060769066 2 5025.7808278241 ) 55.8661643975 (ExtendedPoll) + 5755+21 ( 2 0 4856.4243365351 2 5103.1233402051 ) 55.7810605478 (ExtendedPoll) + 5755+24 ( 2 0 4863.9579639983 2 5116.7712160443 ) 55.5599122421 (ExtendedPoll) + 5755+25 ( 2 0 4848.2356110316 2 5143.8486017093 ) 55.3646109717 (ExtendedPoll) + 5755+31 ( 2 0 4842.8037564475 2 5149.4715265551 ) 55.3415309539 (ExtendedPoll) + 5755+32 ( 2 0 4826.5081926955 2 5166.3403010924 ) 55.2731138922 (ExtendedPoll) + 5755+33 ( 2 0 4761.3259376873 2 5233.8153992415 ) 55.0119577195 (ExtendedPoll) + 5755+36 ( 2 0 4739.4893363446 2 5256.0887326112 ) 54.9328003343 (ExtendedPoll) + 5755+37 ( 2 0 4673.9795323162 2 5322.9087327200 ) 54.7090508194 (ExtendedPoll) + 5755+39 ( 2 0 4628.5594015233 2 5364.8350072982 ) 54.6149385255 (ExtendedPoll) + 5755+40 ( 2 0 4492.2990091444 2 5490.6138310325 ) 54.3872651867 (ExtendedPoll) + 5755+41 ( 2 0 3947.2574396288 2 5993.7291259700 ) 54.3655883138 (ExtendedPoll) + 5755+49 ( 2 0 3928.0412304472 2 6053.1246816223 ) 54.0330892795 (ExtendedPoll) + 5755+58 ( 2 0 3929.8700458096 2 6060.7129005889 ) 53.9508748031 (ExtendedPoll) + 5755+60 ( 2 0 3925.2024722726 2 6066.9909234750 ) 53.9417691814 (ExtendedPoll) + 5755+61 ( 2 0 3911.1997516616 2 6085.8249921331 ) 53.9156381344 (ExtendedPoll) + 5755+66 ( 2 0 3919.7706176886 2 6078.8372797034 ) 53.8929555395 (ExtendedPoll) + 5755+74 ( 2 0 3920.5459876347 2 6078.2435971044 ) 53.8905945920 (ExtendedPoll) + 5755+75 ( 2 0 3922.8720974731 2 6076.4625493074 ) 53.8835272419 (ExtendedPoll) + 5755+81 ( 2 0 3922.0826531550 2 6077.5957494982 ) 53.8814445368 (ExtendedPoll) + 5755+87 ( 2 0 3922.3040046412 2 6077.4927773412 ) 53.8802087502 (ExtendedPoll) + 5755+90 ( 2 0 3922.2317402049 2 6077.7259640948 ) 53.8789219399 (ExtendedPoll) + 5755+100 ( 2 0 3922.2265169811 2 6077.7403010701 ) 53.8788502601 (ExtendedPoll) + 5755+101 ( 2 0 3922.2108473095 2 6077.7833119959 ) 53.8786352255 (ExtendedPoll) + 5755+107 ( 2 0 3922.2085611664 2 6077.7905908301 ) 53.8785953531 (ExtendedPoll) + 5755+113 ( 2 0 3922.2107347292 2 6077.7889934610 ) 53.8785881820 (ExtendedPoll) + 5755+122 ( 2 0 3922.2108535295 2 6077.7889835942 ) 53.8785871342 (ExtendedPoll) + 5755+123 ( 2 0 3922.2110146221 2 6077.7888078314 ) 53.8785870886 (ExtendedPoll) + 5755+124 ( 2 0 3922.2114979001 2 6077.7882805429 ) 53.8785869518 (ExtendedPoll) + 5755+125 ( 2 0 3922.2134310120 2 6077.7861713891 ) 53.8785864048 (ExtendedPoll) + 5755+126 ( 2 0 3922.2211634595 2 6077.7777347737 ) 53.8785842169 (ExtendedPoll) + 5755+127 ( 2 0 3922.2520932495 2 6077.7439883121 ) 53.8785754693 (ExtendedPoll) + 5755+128 ( 2 0 3922.3758124097 2 6077.6090024659 ) 53.8785405430 (ExtendedPoll) + 5755+129 ( 2 0 3922.8706890504 2 6077.0690590808 ) 53.8784018624 (ExtendedPoll) + 5755+130 ( 2 0 3924.8501956130 2 6074.9092855406 ) 53.8778635334 (ExtendedPoll) + 5755+131 ( 2 0 3932.7682218633 2 6066.2701913799 ) 53.8759723517 (ExtendedPoll) + 5755+132 ( 2 0 3964.4403268649 2 6031.7138147370 ) 53.8725913899 (ExtendedPoll) + 5755+134 ( 2 0 3964.6765257473 2 6031.6520794236 ) 53.8708963698 (ExtendedPoll) + 5755+135 ( 2 0 3965.3851223947 2 6031.4668734835 ) 53.8658119765 (ExtendedPoll) + 5755+136 ( 2 0 3968.2195089840 2 6030.7260497231 ) 53.8454844045 (ExtendedPoll) + 5755+138 ( 2 0 3966.5220544265 2 6032.9062978884 ) 53.8426385768 (ExtendedPoll) + 5755+139 ( 2 0 3964.0381410238 2 6035.9224784489 ) 53.8400218659 (ExtendedPoll) + 5755+154 ( 2 0 3964.1134625710 2 6035.8803219730 ) 53.8396748316 (ExtendedPoll) + 5755+157 ( 2 0 3964.1376216602 2 6035.8616765123 ) 53.8396077632 (ExtendedPoll) + 5755+166 ( 2 0 3964.1391333458 2 6035.8605134178 ) 53.8396035356 (ExtendedPoll) + 5755+171 ( 2 0 3964.1395137360 2 6035.8602258817 ) 53.8396024275 (ExtendedPoll) + 5755+175 ( 2 0 3964.1397422881 2 6035.8601580043 ) 53.8396008562 (ExtendedPoll) + 5755+176 ( 2 0 3964.1401032802 2 6035.8598464624 ) 53.8396001384 (ExtendedPoll) + 5755+184 ( 2 0 3964.1401437730 2 6035.8598027239 ) 53.8396001338 (ExtendedPoll) + 5755+185 ( 2 0 3964.1402652513 2 6035.8596715087 ) 53.8396001200 (ExtendedPoll) + 5755+186 ( 2 0 3964.1407511646 2 6035.8591466477 ) 53.8396000647 (ExtendedPoll) + 5755+187 ( 2 0 3964.1426948176 2 6035.8570472037 ) 53.8395998438 (ExtendedPoll) + 5755+188 ( 2 0 3964.1504694296 2 6035.8486494278 ) 53.8395989603 (ExtendedPoll) + 5755+189 ( 2 0 3964.1815678778 2 6035.8150583240 ) 53.8395954303 (ExtendedPoll) + 5755+190 ( 2 0 3964.3059616705 2 6035.6806939089 ) 53.8395813737 (ExtendedPoll) + 5755+191 ( 2 0 3964.8035368415 2 6035.1432362487 ) 53.8395261614 (ExtendedPoll) + 5755+192 ( 2 0 3966.7938375252 2 6032.9934056075 ) 53.8393215384 (ExtendedPoll) + 5755+193 ( 2 0 3974.7550402603 2 6024.3940830430 ) 53.8387624914 (ExtendedPoll) + 5755+195 ( 2 0 3974.8020931115 2 6024.3552069220 ) 53.8386567319 (ExtendedPoll) + 5755+196 ( 2 0 3974.9432516652 2 6024.2385785592 ) 53.8383395150 (ExtendedPoll) + 5755+197 ( 2 0 3975.5078858801 2 6023.7720651080 ) 53.8370715717 (ExtendedPoll) + 5755+198 ( 2 0 3977.7664227394 2 6021.9060113031 ) 53.8320145804 (ExtendedPoll) + 5755+201 ( 2 0 3978.1694615728 2 6021.6302815615 ) 53.8306170085 (ExtendedPoll) + 5755+206 ( 2 0 3978.2884006782 2 6021.6028192098 ) 53.8297362750 (ExtendedPoll) + 5755+211 ( 2 0 3978.3433620337 2 6021.5762764903 ) 53.8294496693 (ExtendedPoll) + 5755+214 ( 2 0 3978.4034030246 2 6021.5653058772 ) 53.8289799544 (ExtendedPoll) + 5755+218 ( 2 0 3978.4320361581 2 6021.5547475992 ) 53.8288022372 (ExtendedPoll) + 5755+219 ( 2 0 3978.4762518106 2 6021.5126727574 ) 53.8287517449 (ExtendedPoll) + 5755+220 ( 2 0 3978.6088987679 2 6021.3864482319 ) 53.8286003328 (ExtendedPoll) + 5755+224 ( 2 0 3978.6514101019 2 6021.3426524116 ) 53.8285808779 (ExtendedPoll) + 5755+225 ( 2 0 3978.7789441037 2 6021.2112649506 ) 53.8285225798 (ExtendedPoll) + 5755+226 ( 2 0 3979.2890801112 2 6020.6857151068 ) 53.8282903842 (ExtendedPoll) + 5755+227 ( 2 0 3981.3296241412 2 6018.5835157314 ) 53.8273775476 (ExtendedPoll) + 5755+228 ( 2 0 3989.4918002613 2 6010.1747182300 ) 53.8239811631 (ExtendedPoll) + 5755+229 ( 2 0 4022.1405047416 2 5976.5395282242 ) 53.8144637068 (ExtendedPoll) + 5755+234 ( 2 0 4020.7893650335 2 5978.9483783098 ) 53.8057221545 (ExtendedPoll) + 5755+239 ( 2 0 4021.8359865119 2 5978.0476185044 ) 53.8039392071 (ExtendedPoll) + 5755+248 ( 2 0 4021.8964440029 2 5978.0392385221 ) 53.8034496620 (ExtendedPoll) + 5755+251 ( 2 0 4021.9498759700 2 5978.0097369858 ) 53.8032127550 (ExtendedPoll) + 5755+255 ( 2 0 4021.9714769156 2 5977.9881793562 ) 53.8032023063 (ExtendedPoll) + 5755+256 ( 2 0 4022.0362797523 2 5977.9235064675 ) 53.8031709766 (ExtendedPoll) + 5755+257 ( 2 0 4022.2954910992 2 5977.6648149127 ) 53.8030459025 (ExtendedPoll) + 5755+258 ( 2 0 4023.3323364869 2 5976.6300486937 ) 53.8025495188 (ExtendedPoll) + 5755+259 ( 2 0 4027.4797180376 2 5972.4909838173 ) 53.8006265679 (ExtendedPoll) + 5755+272 ( 2 0 4027.4926149637 2 5972.4991384731 ) 53.8004340240 (ExtendedPoll) + 5755+274 ( 2 0 4027.4867594927 2 5972.5132290886 ) 53.8003634319 (ExtendedPoll) + 5755+291 ( 2 0 4027.4868017206 2 5972.5131870229 ) 53.8003634121 (ExtendedPoll) + 5755+292 ( 2 0 4027.4869284044 2 5972.5130608261 ) 53.8003633529 (ExtendedPoll) + 5755+293 ( 2 0 4027.4874351394 2 5972.5125560387 ) 53.8003631157 (ExtendedPoll) + 5755+294 ( 2 0 4027.4894620797 2 5972.5105368890 ) 53.8003621672 (ExtendedPoll) + 5755+309 ( 2 0 4027.4894630105 2 5972.5105368589 ) 53.8003621588 (ExtendedPoll) + 5755+315 ( 2 0 4027.4894632002 2 5972.5105367239 ) 53.8003621582 (ExtendedPoll) + 5755+320 ( 2 0 4027.4894631259 2 5972.5105368136 ) 53.8003621581 (ExtendedPoll) + 5755+321 ( 2 0 4027.4894629032 2 5972.5105370826 ) 53.8003621578 (ExtendedPoll) + 5755+329 ( 2 0 4027.4894628766 2 5972.5105371140 ) 53.8003621577 (ExtendedPoll) + 6087+4 ( 2 0 4748.4423428951 2 5251.5576378325 ) 54.9123291399 (ExtendedPoll) + 6087+5 ( 2 0 3993.7694004889 2 6006.2305802387 ) 53.8183151870 (ExtendedPoll) + 6087+44 ( 2 0 3993.7694619626 2 6006.2305225636 ) 53.8183151149 (ExtendedPoll) + 6087+45 ( 2 0 3993.7696463836 2 6006.2303495384 ) 53.8183148988 (ExtendedPoll) + 6087+56 ( 2 0 3993.7696499094 2 6006.2303483359 ) 53.8183148762 (ExtendedPoll) + 6087+64 ( 2 0 3993.7696494122 2 6006.2303491234 ) 53.8183148740 (ExtendedPoll) + 6087+65 ( 2 0 3993.7696479206 2 6006.2303514859 ) 53.8183148673 (ExtendedPoll) + 6087+70 ( 2 0 3993.7696473156 2 6006.2303521939 ) 53.8183148668 (ExtendedPoll) + 6087+71 ( 2 0 3993.7696455004 2 6006.2303543179 ) 53.8183148653 (ExtendedPoll) + 6087+80 ( 2 0 3993.7696457355 2 6006.2303540873 ) 53.8183148651 (ExtendedPoll) + 6087+81 ( 2 0 3993.7696464408 2 6006.2303533957 ) 53.8183148645 (ExtendedPoll) + 6087+82 ( 2 0 3993.7696492618 2 6006.2303506290 ) 53.8183148623 (ExtendedPoll) + 6087+85 ( 2 0 3993.7696499024 2 6006.2303499530 ) 53.8183148622 (ExtendedPoll) + 6087+86 ( 2 0 3993.7696518242 2 6006.2303479249 ) 53.8183148619 (ExtendedPoll) + 6087+87 ( 2 0 3993.7696595112 2 6006.2303398127 ) 53.8183148607 (ExtendedPoll) + 6087+88 ( 2 0 3993.7696902595 2 6006.2303073636 ) 53.8183148562 (ExtendedPoll) + 6087+89 ( 2 0 3993.7698132527 2 6006.2301775672 ) 53.8183148381 (ExtendedPoll) + 6087+90 ( 2 0 3993.7703052255 2 6006.2296583817 ) 53.8183147657 (ExtendedPoll) + 6087+91 ( 2 0 3993.7722731166 2 6006.2275816398 ) 53.8183144759 (ExtendedPoll) + 6087+92 ( 2 0 3993.7801446810 2 6006.2192746722 ) 53.8183133172 (ExtendedPoll) + 6087+93 ( 2 0 3993.8116309384 2 6006.1860468016 ) 53.8183086862 (ExtendedPoll) + 6087+94 ( 2 0 3993.9375759683 2 6006.0531353193 ) 53.8182902249 (ExtendedPoll) + 6087+95 ( 2 0 3994.4413560878 2 6005.5214893902 ) 53.8182173813 (ExtendedPoll) + 6087+96 ( 2 0 3996.4564765659 2 6003.3949056739 ) 53.8179420284 (ExtendedPoll) + 6087+97 ( 2 0 4004.5169584783 2 5994.8885708083 ) 53.8170967872 (ExtendedPoll) + 6087+99 ( 2 0 4004.5245453924 2 5994.8877669371 ) 53.8170328494 (ExtendedPoll) + 6087+100 ( 2 0 4004.5473061346 2 5994.8853553233 ) 53.8168410364 (ExtendedPoll) + 6087+101 ( 2 0 4004.6383491034 2 5994.8757088682 ) 53.8160737928 (ExtendedPoll) + 6087+102 ( 2 0 4005.0025209789 2 5994.8371230479 ) 53.8130049524 (ExtendedPoll) + 6087+105 ( 2 0 4005.0443542507 2 5994.7926791534 ) 53.8130042923 (ExtendedPoll) + 6087+106 ( 2 0 4005.1698540660 2 5994.6593474699 ) 53.8130023789 (ExtendedPoll) + 6087+107 ( 2 0 4005.6718533272 2 5994.1260207358 ) 53.8129957265 (ExtendedPoll) + 6087+108 ( 2 0 4007.6798503720 2 5991.9927137997 ) 53.8129851374 (ExtendedPoll) + 6087+113 ( 2 0 4007.2403461204 2 5992.5254074536 ) 53.8124063797 (ExtendedPoll) + 6087+117 ( 2 0 4007.7373207242 2 5992.0459191907 ) 53.8119791690 (ExtendedPoll) + 6087+118 ( 2 0 4009.2282445356 2 5990.6074544020 ) 53.8107058155 (ExtendedPoll) + 6087+126 ( 2 0 4009.3503023939 2 5990.6056218015 ) 53.8095807273 (ExtendedPoll) + 6087+128 ( 2 0 4009.4380806266 2 5990.5207890577 ) 53.8095074272 (ExtendedPoll) + 6087+129 ( 2 0 4009.7014153247 2 5990.2662908261 ) 53.8092877859 (ExtendedPoll) + 6087+136 ( 2 0 4009.7506106525 2 5990.2301636059 ) 53.8091461907 (ExtendedPoll) + 6087+143 ( 2 0 4009.7635053921 2 5990.2220054099 ) 53.8090975243 (ExtendedPoll) + 6087+144 ( 2 0 4009.8021896106 2 5990.1975308217 ) 53.8089515284 (ExtendedPoll) + 6087+154 ( 2 0 4009.8017843826 2 5990.1980698371 ) 53.8089505672 (ExtendedPoll) + 6087+161 ( 2 0 4009.8017202471 2 5990.1981703234 ) 53.8089502814 (ExtendedPoll) + 6087+162 ( 2 0 4009.8015278408 2 5990.1984717824 ) 53.8089494238 (ExtendedPoll) + 6087+177 ( 2 0 4009.8015265652 2 5990.1984731397 ) 53.8089494237 (ExtendedPoll) + 6087+178 ( 2 0 4009.8015227385 2 5990.1984772118 ) 53.8089494236 (ExtendedPoll) + 6087+182 ( 2 0 4009.8015264517 2 5990.1984734744 ) 53.8089494218 (ExtendedPoll) + 6087+183 ( 2 0 4009.8015375912 2 5990.1984622623 ) 53.8089494165 (ExtendedPoll) + 6087+184 ( 2 0 4009.8015821493 2 5990.1984174139 ) 53.8089493951 (ExtendedPoll) + 6087+185 ( 2 0 4009.8017603815 2 5990.1982380201 ) 53.8089493096 (ExtendedPoll) + 6087+186 ( 2 0 4009.8024733106 2 5990.1975204453 ) 53.8089489676 (ExtendedPoll) + 6087+187 ( 2 0 4009.8053250269 2 5990.1946501458 ) 53.8089475994 (ExtendedPoll) + 6087+188 ( 2 0 4009.8167318920 2 5990.1831689481 ) 53.8089421273 (ExtendedPoll) + 6087+189 ( 2 0 4009.8623593525 2 5990.1372441570 ) 53.8089202465 (ExtendedPoll) + 6087+190 ( 2 0 4010.0448691945 2 5989.9535449926 ) 53.8088328461 (ExtendedPoll) + 6087+191 ( 2 0 4010.7749085625 2 5989.2187483350 ) 53.8084852115 (ExtendedPoll) + 6087+192 ( 2 0 4013.6950660346 2 5986.2795617047 ) 53.8071261335 (ExtendedPoll) + 6087+193 ( 2 0 4025.3756959228 2 5974.5228151836 ) 53.8021926744 (ExtendedPoll) + 6087+194 ( 2 0 4072.0982154756 2 5927.4958290993 ) 53.7904707641 (ExtendedPoll) + 6087+196 ( 2 0 4072.1230863636 2 5927.4781440878 ) 53.7904013936 (ExtendedPoll) + 6087+197 ( 2 0 4072.1976990276 2 5927.4250890534 ) 53.7901932963 (ExtendedPoll) + 6087+198 ( 2 0 4072.4961496835 2 5927.2128689157 ) 53.7893611206 (ExtendedPoll) + 6087+201 ( 2 0 4072.6142224687 2 5927.1818879709 ) 53.7885522474 (ExtendedPoll) + 6087+205 ( 2 0 4072.7124431924 2 5927.2543656553 ) 53.7869896937 (ExtendedPoll) + 6087+206 ( 2 0 4072.8894390822 2 5927.0862195600 ) 53.7868793477 (ExtendedPoll) + 6087+212 ( 2 0 4072.8331432603 2 5927.1516517284 ) 53.7868061997 (ExtendedPoll) + 6087+222 ( 2 0 4072.8364485532 2 5927.1585279631 ) 53.7867134349 (ExtendedPoll) + 6087+225 ( 2 0 4072.8360952700 2 5927.1623262685 ) 53.7866822980 (ExtendedPoll) + 6087+231 ( 2 0 4072.8355323017 2 5927.1630960486 ) 53.7866805212 (ExtendedPoll) + 6087+232 ( 2 0 4072.8338433970 2 5927.1654053888 ) 53.7866751908 (ExtendedPoll) + 6087+236 ( 2 0 4072.8348036881 2 5927.1644583778 ) 53.7866749068 (ExtendedPoll) + 6087+237 ( 2 0 4072.8376845612 2 5927.1616173446 ) 53.7866740546 (ExtendedPoll) + 6087+238 ( 2 0 4072.8492080538 2 5927.1502532121 ) 53.7866706465 (ExtendedPoll) + 6087+239 ( 2 0 4072.8546839370 2 5927.1449407271 ) 53.7866682334 (ExtendedPoll) + 6087+251 ( 2 0 4072.8548902901 2 5927.1448213042 ) 53.7866674110 (ExtendedPoll) + 6087+252 ( 2 0 4072.8555093493 2 5927.1444630354 ) 53.7866649438 (ExtendedPoll) + 6087+257 ( 2 0 4072.8556843793 2 5927.1443011469 ) 53.7866647950 (ExtendedPoll) + 6087+265 ( 2 0 4072.8556567359 2 5927.1443329620 ) 53.7866647619 (ExtendedPoll) + 6087+271 ( 2 0 4072.8556523714 2 5927.1443390004 ) 53.7866647475 (ExtendedPoll) + 6087+272 ( 2 0 4072.8556392781 2 5927.1443571157 ) 53.7866647042 (ExtendedPoll) + 6087+277 ( 2 0 4072.8556357434 2 5927.1443636744 ) 53.7866646774 (ExtendedPoll) + 6087+284 ( 2 0 4072.8556351991 2 5927.1443644301 ) 53.7866646756 (ExtendedPoll) + 6087+289 ( 2 0 4072.8556348885 2 5927.1443647771 ) 53.7866646753 (ExtendedPoll) + 6087+290 ( 2 0 4072.8556339570 2 5927.1443658182 ) 53.7866646745 (ExtendedPoll) + 6087+291 ( 2 0 4072.8556327029 2 5927.1443671954 ) 53.7866646736 (ExtendedPoll) + 6087+300 ( 2 0 4072.8556329763 2 5927.1443670119 ) 53.7866646727 (ExtendedPoll) + 6399+7 ( 2 0 4954.5798595708 2 5043.6731930494 ) 55.7239163641 (ExtendedPoll) + 6399+8 ( 2 0 4818.3194671920 2 5174.6928011060 ) 55.2406520186 (ExtendedPoll) + 6399+9 ( 2 0 4273.2778976764 2 5698.7712333325 ) 54.1421761447 (ExtendedPoll) + 6399+20 ( 2 0 4267.0544662937 2 5713.0742072120 ) 54.0559868372 (ExtendedPoll) + 6399+22 ( 2 0 4305.9236166838 2 5692.5478019498 ) 53.9161736343 (ExtendedPoll) + 6399+38 ( 2 0 4306.4284814658 2 5693.0189735384 ) 53.9070540230 (ExtendedPoll) + 6399+39 ( 2 0 4307.3369182014 2 5692.6607167976 ) 53.9026276457 (ExtendedPoll) + 6399+55 ( 2 0 4307.3366998789 2 5692.6626116095 ) 53.9026107377 (ExtendedPoll) + 6399+61 ( 2 0 4307.3371752453 2 5692.6626490319 ) 53.9026061874 (ExtendedPoll) + 6399+63 ( 2 0 4307.3375784896 2 5692.6623945369 ) 53.9026051716 (ExtendedPoll) + 6399+76 ( 2 0 4307.3375909856 2 5692.6624026545 ) 53.9026049811 (ExtendedPoll) + 6399+81 ( 2 0 4307.3375975611 2 5692.6623991511 ) 53.9026049581 (ExtendedPoll) + 6399+89 ( 2 0 4307.3375983269 2 5692.6623986211 ) 53.9026049566 (ExtendedPoll) + 6399+90 ( 2 0 4307.3376006244 2 5692.6623970312 ) 53.9026049522 (ExtendedPoll) + 6399+92 ( 2 0 4307.3375976707 2 5692.6624013936 ) 53.9026049349 (ExtendedPoll) + 6399+97 ( 2 0 4307.3375969844 2 5692.6624020232 ) 53.9026049346 (ExtendedPoll) + 6399+98 ( 2 0 4307.3375949256 2 5692.6624039121 ) 53.9026049340 (ExtendedPoll) + 6399+99 ( 2 0 4307.3375866905 2 5692.6624114674 ) 53.9026049313 (ExtendedPoll) + 6399+100 ( 2 0 4307.3375537500 2 5692.6624416886 ) 53.9026049205 (ExtendedPoll) + 6399+101 ( 2 0 4307.3374219878 2 5692.6625625735 ) 53.9026048776 (ExtendedPoll) + 6399+102 ( 2 0 4307.3368949392 2 5692.6630461130 ) 53.9026047059 (ExtendedPoll) + 6399+103 ( 2 0 4307.3347867446 2 5692.6649802712 ) 53.9026040190 (ExtendedPoll) + 6399+104 ( 2 0 4307.3263539663 2 5692.6727169040 ) 53.9026012717 (ExtendedPoll) + 6399+105 ( 2 0 4307.2926228530 2 5692.7036634351 ) 53.9025902858 (ExtendedPoll) + 6399+106 ( 2 0 4307.1576983999 2 5692.8274495597 ) 53.9025463974 (ExtendedPoll) + 6399+107 ( 2 0 4306.6180005874 2 5693.3225940580 ) 53.9023717283 (ExtendedPoll) + 6399+108 ( 2 0 4304.4592093375 2 5695.3031720513 ) 53.9016872027 (ExtendedPoll) + 6399+109 ( 2 0 4295.8240443380 2 5703.2254840245 ) 53.8991757562 (ExtendedPoll) + 6399+110 ( 2 0 4261.2833843400 2 5734.9147319171 ) 53.8927720075 (ExtendedPoll) + 6399+113 ( 2 0 4261.2854283144 2 5734.9298531621 ) 53.8926060076 (ExtendedPoll) + 6399+114 ( 2 0 4261.2915602373 2 5734.9752168971 ) 53.8921080120 (ExtendedPoll) + 6399+115 ( 2 0 4261.3160879292 2 5735.1566718371 ) 53.8901160910 (ExtendedPoll) + 6399+116 ( 2 0 4261.4141986968 2 5735.8824915973 ) 53.8821493903 (ExtendedPoll) + 6399+117 ( 2 0 4261.5839708086 2 5736.0579414386 ) 53.8789281638 (ExtendedPoll) + 6399+118 ( 2 0 4262.0932871439 2 5736.5842909627 ) 53.8692650726 (ExtendedPoll) + 6399+119 ( 2 0 4262.1303923063 2 5737.5601140852 ) 53.8593995884 (ExtendedPoll) + 6399+127 ( 2 0 4262.0592807423 2 5737.6593344091 ) 53.8590609755 (ExtendedPoll) + 6399+128 ( 2 0 4261.8459460503 2 5737.9569953809 ) 53.8580454076 (ExtendedPoll) + 6399+133 ( 2 0 4261.8066484312 2 5738.0725691654 ) 53.8572649584 (ExtendedPoll) + 6399+134 ( 2 0 4261.6592140538 2 5738.2671580201 ) 53.8566720935 (ExtendedPoll) + 6399+139 ( 2 0 4261.6094206317 2 5738.3786067875 ) 53.8560252022 (ExtendedPoll) + 6399+146 ( 2 0 4261.6039575038 2 5738.3928541111 ) 53.8559345028 (ExtendedPoll) + 6399+147 ( 2 0 4261.5822528497 2 5738.4143071991 ) 53.8559175202 (ExtendedPoll) + 6399+148 ( 2 0 4261.5171388874 2 5738.4786664632 ) 53.8558665878 (ExtendedPoll) + 6399+149 ( 2 0 4261.2566830381 2 5738.7361035197 ) 53.8556630883 (ExtendedPoll) + 6399+150 ( 2 0 4260.2148596411 2 5739.7658517453 ) 53.8548527711 (ExtendedPoll) + 6399+151 ( 2 0 4256.0475660528 2 5743.8848446480 ) 53.8516704284 (ExtendedPoll) + 6399+152 ( 2 0 4239.3783916996 2 5760.3608162588 ) 53.8398857910 (ExtendedPoll) + 6399+153 ( 2 0 4172.7016942871 2 5826.2647027020 ) 53.8079830812 (ExtendedPoll) + 6399+159 ( 2 0 4172.3873666467 2 5827.1893462901 ) 53.8020966299 (ExtendedPoll) + 6399+161 ( 2 0 4171.7493284512 2 5827.9288905621 ) 53.8008851851 (ExtendedPoll) + 6399+162 ( 2 0 4169.8352138647 2 5830.1475233783 ) 53.7972677698 (ExtendedPoll) + 6399+173 ( 2 0 4169.8728479823 2 5830.1263964098 ) 53.7971266241 (ExtendedPoll) + 6399+180 ( 2 0 4169.8744650652 2 5830.1253849637 ) 53.7971215364 (ExtendedPoll) + 6399+188 ( 2 0 4169.8742332961 2 5830.1256298513 ) 53.7971213238 (ExtendedPoll) + 6399+189 ( 2 0 4169.8735379888 2 5830.1263645140 ) 53.7971206859 (ExtendedPoll) + 6399+197 ( 2 0 4169.8735402993 2 5830.1264240738 ) 53.7971201036 (ExtendedPoll) + 6399+202 ( 2 0 4169.8735394760 2 5830.1264538648 ) 53.7971198303 (ExtendedPoll) + 6399+207 ( 2 0 4169.8735316923 2 5830.1264665714 ) 53.7971197809 (ExtendedPoll) + 6399+208 ( 2 0 4169.8735105156 2 5830.1264875411 ) 53.7971197747 (ExtendedPoll) + 6399+209 ( 2 0 4169.8734469856 2 5830.1265504500 ) 53.7971197562 (ExtendedPoll) + 6399+210 ( 2 0 4169.8731928654 2 5830.1268020859 ) 53.7971196820 (ExtendedPoll) + 6399+211 ( 2 0 4169.8721763846 2 5830.1278086295 ) 53.7971193855 (ExtendedPoll) + 6399+212 ( 2 0 4169.8681104615 2 5830.1318348037 ) 53.7971181995 (ExtendedPoll) + 6399+213 ( 2 0 4169.8518467691 2 5830.1479395006 ) 53.7971134562 (ExtendedPoll) + 6399+214 ( 2 0 4169.7867919994 2 5830.2123582880 ) 53.7970944980 (ExtendedPoll) + 6399+215 ( 2 0 4169.5265729207 2 5830.4700334377 ) 53.7970189008 (ExtendedPoll) + 6399+216 ( 2 0 4168.4856966058 2 5831.5007340364 ) 53.7967202870 (ExtendedPoll) + 6399+217 ( 2 0 4164.3221913464 2 5835.6235364314 ) 53.7955862535 (ExtendedPoll) + 6399+218 ( 2 0 4147.6681703088 2 5852.1147460114 ) 53.7920186238 (ExtendedPoll) + 6399+220 ( 2 0 4147.6602068265 2 5852.1752601464 ) 53.7915256228 (ExtendedPoll) + 6399+221 ( 2 0 4147.6363163798 2 5852.3568025514 ) 53.7900466951 (ExtendedPoll) + 6399+229 ( 2 0 4147.6523233123 2 5852.3423304219 ) 53.7900364877 (ExtendedPoll) + 6399+230 ( 2 0 4147.7003441098 2 5852.2989140332 ) 53.7900058731 (ExtendedPoll) + 6399+244 ( 2 0 4147.7008030485 2 5852.2990434509 ) 53.7900004953 (ExtendedPoll) + 6399+246 ( 2 0 4147.7011719978 2 5852.2987413745 ) 53.7899999659 (ExtendedPoll) + 6399+252 ( 2 0 4147.7010771141 2 5852.2988807259 ) 53.7899995260 (ExtendedPoll) + 6399+259 ( 2 0 4147.7010935191 2 5852.2989056067 ) 53.7899991446 (ExtendedPoll) + 6399+268 ( 2 0 4147.7010938504 2 5852.2989059339 ) 53.7899991385 (ExtendedPoll) + 6399+271 ( 2 0 4147.7010940528 2 5852.2989058189 ) 53.7899991377 (ExtendedPoll) + 6399+275 ( 2 0 4147.7010940473 2 5852.2989059352 ) 53.7899991367 (ExtendedPoll) + 6399+282 ( 2 0 4147.7010940274 2 5852.2989059712 ) 53.7899991366 (ExtendedPoll) + 6685+2 ( 2 0 4105.5727993639 2 5894.4271813637 ) 53.7841729375 (ExtendedPoll) + 6685+41 ( 2 0 4105.5727574055 2 5894.4272236982 ) 53.7841729333 (ExtendedPoll) + 6685+42 ( 2 0 4105.5726315303 2 5894.4273507015 ) 53.7841729207 (ExtendedPoll) + 6685+43 ( 2 0 4105.5721280294 2 5894.4278587149 ) 53.7841728703 (ExtendedPoll) + 6685+53 ( 2 0 4105.5721311970 2 5894.4278654586 ) 53.7841727793 (ExtendedPoll) + 6685+57 ( 2 0 4105.5721285679 2 5894.4278680979 ) 53.7841727792 (ExtendedPoll) + 6685+58 ( 2 0 4105.5721206809 2 5894.4278760159 ) 53.7841727787 (ExtendedPoll) + 6685+59 ( 2 0 4105.5720891326 2 5894.4279076878 ) 53.7841727770 (ExtendedPoll) + 6685+60 ( 2 0 4105.5719629396 2 5894.4280343754 ) 53.7841727702 (ExtendedPoll) + 6685+61 ( 2 0 4105.5714581674 2 5894.4285411256 ) 53.7841727431 (ExtendedPoll) + 6685+74 ( 2 0 4105.5714585929 2 5894.4285413146 ) 53.7841727374 (ExtendedPoll) + 6685+81 ( 2 0 4105.5714586508 2 5894.4285413214 ) 53.7841727368 (ExtendedPoll) + 6774+17 ( 2 0 4999.8038288046 2 5000.1453455727 ) 55.9014415188 (ExtendedPoll) + 6774+18 ( 2 0 4999.2153441271 2 5000.5814111994 ) 55.9006678364 (ExtendedPoll) + 6774+19 ( 2 0 4996.8614054169 2 5002.3256737060 ) 55.8975828466 (ExtendedPoll) + 6774+20 ( 2 0 4987.4456505762 2 5009.3027237327 ) 55.8853990072 (ExtendedPoll) + 6774+21 ( 2 0 4949.7826312134 2 5037.2109238395 ) 55.8391796750 (ExtendedPoll) + 6774+22 ( 2 0 4799.1305537620 2 5148.8437242665 ) 55.6957204380 (ExtendedPoll) + 6774+24 ( 2 0 4791.8152923122 2 5162.6007831124 ) 55.5930004110 (ExtendedPoll) + 6774+25 ( 2 0 4769.8695079627 2 5203.8719596503 ) 55.2886042603 (ExtendedPoll) + 6774+27 ( 2 0 4753.7104229690 2 5230.5126132884 ) 55.1111870096 (ExtendedPoll) + 6774+28 ( 2 0 4703.0495078538 2 5267.1981035443 ) 55.1012158213 (ExtendedPoll) + 6774+34 ( 2 0 4699.1189196121 2 5298.2060774510 ) 54.7818521507 (ExtendedPoll) + 6774+37 ( 2 0 4689.4016320146 2 5310.4345742030 ) 54.7232027437 (ExtendedPoll) + 6774+38 ( 2 0 4665.3813705375 2 5330.5242474383 ) 54.6941438059 (ExtendedPoll) + 6774+39 ( 2 0 4593.3205861064 2 5390.7932671444 ) 54.6201919010 (ExtendedPoll) + 6774+40 ( 2 0 4305.0774483818 2 5631.8693459686 ) 54.5320542946 (ExtendedPoll) + 6774+45 ( 2 0 4291.1020235224 2 5693.0118297283 ) 54.0420071399 (ExtendedPoll) + 6774+50 ( 2 0 4279.6378078175 2 5703.6025813796 ) 54.0382097940 (ExtendedPoll) + 6774+51 ( 2 0 4245.2451607026 2 5735.3748363333 ) 54.0307112653 (ExtendedPoll) + 6774+58 ( 2 0 4249.5032979644 2 5750.4420912598 ) 53.8459996564 (ExtendedPoll) + 6774+69 ( 2 0 4249.5962541266 2 5750.3629695656 ) 53.8459422263 (ExtendedPoll) + 6774+76 ( 2 0 4249.6238551729 2 5750.3759885262 ) 53.8455701397 (ExtendedPoll) + 6774+80 ( 2 0 4249.6129514080 2 5750.3866626954 ) 53.8455633271 (ExtendedPoll) + 6774+81 ( 2 0 4249.5802401136 2 5750.4186852027 ) 53.8455428930 (ExtendedPoll) + 6774+82 ( 2 0 4249.4493949358 2 5750.5467752323 ) 53.8454612142 (ExtendedPoll) + 6774+83 ( 2 0 4248.9260142245 2 5751.0591353504 ) 53.8451354192 (ExtendedPoll) + 6774+84 ( 2 0 4246.8324913796 2 5753.1085758229 ) 53.8438469662 (ExtendedPoll) + 6774+85 ( 2 0 4238.4583999999 2 5761.3063377130 ) 53.8389290219 (ExtendedPoll) + 6774+86 ( 2 0 4204.9620344812 2 5794.0973852733 ) 53.8230461425 (ExtendedPoll) + 6774+87 ( 2 0 4070.9765724063 2 5925.2615755146 ) 53.8210579913 (ExtendedPoll) + 6774+92 ( 2 0 4071.7886210187 2 5927.0375053582 ) 53.7974776434 (ExtendedPoll) + 6774+98 ( 2 0 4072.0432392023 2 5927.4540854434 ) 53.7913560161 (ExtendedPoll) + 6774+100 ( 2 0 4071.7200617674 2 5927.8201257384 ) 53.7910242574 (ExtendedPoll) + 6774+101 ( 2 0 4070.7505294627 2 5928.9182466233 ) 53.7900332794 (ExtendedPoll) + 6774+110 ( 2 0 4070.7703482043 2 5929.0386984572 ) 53.7887604316 (ExtendedPoll) + 6774+112 ( 2 0 4070.7520288631 2 5929.1593835311 ) 53.7878375424 (ExtendedPoll) + 6774+114 ( 2 0 4070.6714077684 2 5929.2510402129 ) 53.7877524096 (ExtendedPoll) + 6774+115 ( 2 0 4070.4295444844 2 5929.5260102582 ) 53.7874972799 (ExtendedPoll) + 6774+123 ( 2 0 4070.4383638744 2 5929.5552256590 ) 53.7871515709 (ExtendedPoll) + 6774+129 ( 2 0 4070.4346738395 2 5929.5619033272 ) 53.7871252238 (ExtendedPoll) + 6774+135 ( 2 0 4070.4365087991 2 5929.5624238125 ) 53.7871035769 (ExtendedPoll) + 6774+139 ( 2 0 4070.4373937138 2 5929.5620682560 ) 53.7870986249 (ExtendedPoll) + 6774+141 ( 2 0 4070.4382753416 2 5929.5617046258 ) 53.7870937763 (ExtendedPoll) + 6774+149 ( 2 0 4070.4383956527 2 5929.5615865285 ) 53.7870937340 (ExtendedPoll) + 6774+150 ( 2 0 4070.4387565859 2 5929.5612322368 ) 53.7870936074 (ExtendedPoll) + 6774+158 ( 2 0 4070.4387684909 2 5929.5612232749 ) 53.7870935786 (ExtendedPoll) + 6774+161 ( 2 0 4070.4387865750 2 5929.5612124557 ) 53.7870935095 (ExtendedPoll) + 6774+169 ( 2 0 4070.4387882509 2 5929.5612116428 ) 53.7870935014 (ExtendedPoll) + 6774+177 ( 2 0 4070.4387881954 2 5929.5612117452 ) 53.7870935010 (ExtendedPoll) + 6774+179 ( 2 0 4070.4387882946 2 5929.5612116843 ) 53.7870935006 (ExtendedPoll) + 6961+15 ( 2 0 4999.8058280052 2 5000.1479845174 ) 55.9013939424 (ExtendedPoll) + 6961+16 ( 2 0 4999.2233409293 2 5000.5919669783 ) 55.9004775395 (ExtendedPoll) + 6961+17 ( 2 0 4996.8933926259 2 5002.3678968219 ) 55.8968217946 (ExtendedPoll) + 6961+18 ( 2 0 4987.5735994122 2 5009.4716161962 ) 55.8823569716 (ExtendedPoll) + 6961+19 ( 2 0 4950.2944265573 2 5037.8864936935 ) 55.8270464781 (ExtendedPoll) + 6961+20 ( 2 0 4801.1777351379 2 5151.5460036826 ) 55.6477582520 (ExtendedPoll) + 6961+23 ( 2 0 4799.7583560506 2 5167.1591736427 ) 55.4764322556 (ExtendedPoll) + 6961+26 ( 2 0 4792.1155455806 2 5180.8070494820 ) 55.3782799039 (ExtendedPoll) + 6961+27 ( 2 0 4769.1871141707 2 5221.7506769997 ) 55.0876212670 (ExtendedPoll) + 6961+31 ( 2 0 4761.8718527209 2 5235.6169188523 ) 54.9868701218 (ExtendedPoll) + 6961+34 ( 2 0 4749.6433559689 2 5245.3342064498 ) 54.9738791762 (ExtendedPoll) + 6961+35 ( 2 0 4712.9578657131 2 5274.4860692424 ) 54.9380022491 (ExtendedPoll) + 6961+36 ( 2 0 4566.2159046897 2 5391.0935204128 ) 54.8421122279 (ExtendedPoll) + 6961+38 ( 2 0 4475.3756431037 2 5474.9460695691 ) 54.6975024335 (ExtendedPoll) + 6961+39 ( 2 0 4202.8548583459 2 5726.5037170378 ) 54.4953088368 (ExtendedPoll) + 6961+50 ( 2 0 4223.8179956350 2 5749.6505144612 ) 54.0825598595 (ExtendedPoll) + 6961+52 ( 2 0 4202.8548583459 2 5772.7973118845 ) 54.0462974249 (ExtendedPoll) + 6961+53 ( 2 0 4139.9654464788 2 5842.2377041545 ) 53.9544164694 (ExtendedPoll) + 6961+59 ( 2 0 4139.3103484385 2 5857.8508741146 ) 53.8144735666 (ExtendedPoll) + 6961+66 ( 2 0 4138.2372842006 2 5859.4835012619 ) 53.8090274109 (ExtendedPoll) + 6961+67 ( 2 0 4135.0180914870 2 5864.3813827037 ) 53.7927617458 (ExtendedPoll) + 6961+75 ( 2 0 4135.1400160653 2 5864.5928981232 ) 53.7896852883 (ExtendedPoll) + 6961+77 ( 2 0 4135.3836253179 2 5864.5767445826 ) 53.7876169219 (ExtendedPoll) + 6961+86 ( 2 0 4135.3975076833 2 5864.5830777793 ) 53.7874316321 (ExtendedPoll) + 6961+87 ( 2 0 4135.4221274217 2 5864.5650445737 ) 53.7873750497 (ExtendedPoll) + 6961+91 ( 2 0 4135.4358288178 2 5864.5583287176 ) 53.7873127014 (ExtendedPoll) + 6961+96 ( 2 0 4135.4417746173 2 5864.5535479991 ) 53.7873029931 (ExtendedPoll) + 6961+97 ( 2 0 4135.4596120157 2 5864.5392058436 ) 53.7872738692 (ExtendedPoll) + 6961+108 ( 2 0 4135.4600654422 2 5864.5390582696 ) 53.7872711118 (ExtendedPoll) + 6961+109 ( 2 0 4135.4609366779 2 5864.5386703998 ) 53.7872667832 (ExtendedPoll) + 6961+114 ( 2 0 4135.4606620754 2 5864.5390602294 ) 53.7872656603 (ExtendedPoll) + 6961+119 ( 2 0 4135.4605743562 2 5864.5392819246 ) 53.7872643984 (ExtendedPoll) + 6961+121 ( 2 0 4135.4610972036 2 5864.5388560396 ) 53.7872635958 (ExtendedPoll) + 6961+126 ( 2 0 4135.4612010194 2 5864.5387974466 ) 53.7872631950 (ExtendedPoll) + 6961+137 ( 2 0 4135.4612024119 2 5864.5387962096 ) 53.7872631938 (ExtendedPoll) + 6961+138 ( 2 0 4135.4612065894 2 5864.5387924983 ) 53.7872631903 (ExtendedPoll) + 6961+145 ( 2 0 4135.4612070035 2 5864.5387922853 ) 53.7872631885 (ExtendedPoll) + 6961+146 ( 2 0 4135.4612082457 2 5864.5387916463 ) 53.7872631831 (ExtendedPoll) + 6961+156 ( 2 0 4135.4612082147 2 5864.5387916956 ) 53.7872631829 (ExtendedPoll) + 6961+157 ( 2 0 4135.4612081217 2 5864.5387918434 ) 53.7872631824 (ExtendedPoll) + 6961+163 ( 2 0 4135.4612081460 2 5864.5387918272 ) 53.7872631824 (ExtendedPoll) + 6961+164 ( 2 0 4135.4612082186 2 5864.5387917788 ) 53.7872631821 (ExtendedPoll) + 7131+3 ( 2 0 4874.2211666294 2 5125.7788140982 ) 55.3724275680 (ExtendedPoll) + 7131+4 ( 2 0 4496.8846954264 2 5503.1152853013 ) 54.2156316564 (ExtendedPoll) + 7131+39 ( 2 0 4496.8846529014 2 5503.1153270666 ) 54.2156315732 (ExtendedPoll) + 7131+40 ( 2 0 4496.8845253266 2 5503.1154523626 ) 54.2156313235 (ExtendedPoll) + 7131+41 ( 2 0 4496.8840150275 2 5503.1159535467 ) 54.2156303249 (ExtendedPoll) + 7131+42 ( 2 0 4496.8819738307 2 5503.1179582832 ) 54.2156263303 (ExtendedPoll) + 7131+43 ( 2 0 4496.8738090439 2 5503.1259772290 ) 54.2156103523 (ExtendedPoll) + 7131+44 ( 2 0 4496.8411498966 2 5503.1580530122 ) 54.2155464435 (ExtendedPoll) + 7131+45 ( 2 0 4496.7105133072 2 5503.2863561450 ) 54.2152908615 (ExtendedPoll) + 7131+46 ( 2 0 4496.1879669499 2 5503.7995686762 ) 54.2142693849 (ExtendedPoll) + 7131+47 ( 2 0 4494.0977815204 2 5505.8524188009 ) 54.2101971068 (ExtendedPoll) + 7131+48 ( 2 0 4485.7370398025 2 5514.0638192997 ) 54.1941263256 (ExtendedPoll) + 7131+49 ( 2 0 4452.2940729307 2 5546.9094212948 ) 54.1333544119 (ExtendedPoll) + 7131+50 ( 2 0 4318.5222054439 2 5678.2918292755 ) 53.9475643989 (ExtendedPoll) + 7131+53 ( 2 0 4318.5963891128 2 5678.5244295969 ) 53.9445911411 (ExtendedPoll) + 7131+54 ( 2 0 4318.8189401194 2 5679.2222305612 ) 53.9356722784 (ExtendedPoll) + 7131+55 ( 2 0 4318.7890853910 2 5680.1984801799 ) 53.9261887566 (ExtendedPoll) + 7131+56 ( 2 0 4317.9105033838 2 5681.9437023028 ) 53.9164801493 (ExtendedPoll) + 7131+63 ( 2 0 4317.7577644608 2 5682.1341594764 ) 53.9159200953 (ExtendedPoll) + 7131+69 ( 2 0 4317.7221920188 2 5682.1837563103 ) 53.9157374211 (ExtendedPoll) + 7131+70 ( 2 0 4317.6154746928 2 5682.3325468122 ) 53.9151894649 (ExtendedPoll) + 7131+74 ( 2 0 4317.6823945996 2 5682.2780286129 ) 53.9151462258 (ExtendedPoll) + 7131+75 ( 2 0 4317.8831543201 2 5682.1144740148 ) 53.9150166207 (ExtendedPoll) + 7131+87 ( 2 0 4317.8850608152 2 5682.1144169722 ) 53.9150004675 (ExtendedPoll) + 7131+92 ( 2 0 4317.8855375905 2 5682.1144246562 ) 53.9149962090 (ExtendedPoll) + 7131+100 ( 2 0 4317.8855643890 2 5682.1144116170 ) 53.9149961040 (ExtendedPoll) + 7131+105 ( 2 0 4317.8855791781 2 5682.1144097931 ) 53.9149959925 (ExtendedPoll) + 7131+107 ( 2 0 4317.8855925920 2 5682.1144033038 ) 53.9149959395 (ExtendedPoll) + 7131+111 ( 2 0 4317.8855821380 2 5682.1144139226 ) 53.9149959253 (ExtendedPoll) + 7131+112 ( 2 0 4317.8855507760 2 5682.1144457789 ) 53.9149958826 (ExtendedPoll) + 7131+113 ( 2 0 4317.8854253280 2 5682.1145732043 ) 53.9149957120 (ExtendedPoll) + 7131+120 ( 2 0 4317.8854184488 2 5682.1145811854 ) 53.9149956927 (ExtendedPoll) + 7131+129 ( 2 0 4317.8854186637 2 5682.1145810957 ) 53.9149956917 (ExtendedPoll) + 7131+136 ( 2 0 4317.8854187880 2 5682.1145812036 ) 53.9149956895 (ExtendedPoll) + 7275+1 ( 2 0 4664.5897937388 2 5335.4101869888 ) 54.6460177074 (ExtendedPoll) + 7275+2 ( 2 0 3658.3592038639 2 6341.6407768637 ) 54.3665218070 (ExtendedPoll) + 7275+37 ( 2 0 3658.3592901848 2 6341.6406946471 ) 54.3665215475 (ExtendedPoll) + 7275+38 ( 2 0 3658.3595491473 2 6341.6404479973 ) 54.3665207691 (ExtendedPoll) + 7275+39 ( 2 0 3658.3598690753 2 6341.6400944160 ) 54.3665201699 (ExtendedPoll) + 7275+40 ( 2 0 3658.3608288593 2 6341.6390336723 ) 54.3665183724 (ExtendedPoll) + 7275+41 ( 2 0 3658.3646679955 2 6341.6347906973 ) 54.3665111823 (ExtendedPoll) + 7275+42 ( 2 0 3658.3800245403 2 6341.6178187975 ) 54.3664824230 (ExtendedPoll) + 7275+43 ( 2 0 3658.4414507195 2 6341.5499311982 ) 54.3663674021 (ExtendedPoll) + 7275+44 ( 2 0 3658.6871554362 2 6341.2783808011 ) 54.3659075842 (ExtendedPoll) + 7275+45 ( 2 0 3659.6699743029 2 6340.1921792124 ) 54.3640725584 (ExtendedPoll) + 7275+46 ( 2 0 3663.6012497698 2 6335.8473728577 ) 54.3568003795 (ExtendedPoll) + 7275+47 ( 2 0 3679.3263516374 2 6318.4681474388 ) 54.3287978530 (ExtendedPoll) + 7275+48 ( 2 0 3742.2267591076 2 6248.9512457632 ) 54.2341245206 (ExtendedPoll) + 7275+49 ( 2 0 3993.8283889887 2 5970.8836390611 ) 54.1291421044 (ExtendedPoll) + 7275+51 ( 2 0 3994.6101563766 2 5970.2984863845 ) 54.1270135487 (ExtendedPoll) + 7275+52 ( 2 0 3996.9554585404 2 5968.5430283547 ) 54.1206429804 (ExtendedPoll) + 7275+53 ( 2 0 4006.3366671954 2 5961.5211962354 ) 54.0953869891 (ExtendedPoll) + 7275+54 ( 2 0 4043.8615018154 2 5933.4338677582 ) 53.9979707862 (ExtendedPoll) + 7275+55 ( 2 0 4058.8195737352 2 5928.7389984696 ) 53.9018789159 (ExtendedPoll) + 7275+56 ( 2 0 4085.0234953465 2 5911.2697173953 ) 53.8187819628 (ExtendedPoll) + 7275+62 ( 2 0 4079.2095002390 2 5920.6867517244 ) 53.7866402997 (ExtendedPoll) + 7275+75 ( 2 0 4079.1688898115 2 5920.8018656928 ) 53.7859692077 (ExtendedPoll) + 7275+79 ( 2 0 4079.1419239280 2 5920.8566204642 ) 53.7857204969 (ExtendedPoll) + 7275+92 ( 2 0 4079.1420265196 2 5920.8575686043 ) 53.7857109426 (ExtendedPoll) + 7275+94 ( 2 0 4079.1415632502 2 5920.8584021968 ) 53.7857076422 (ExtendedPoll) + 7275+101 ( 2 0 4079.1418084008 2 5920.8581707058 ) 53.7857074853 (ExtendedPoll) + 7275+109 ( 2 0 4079.1417949665 2 5920.8581973084 ) 53.7857073675 (ExtendedPoll) + 7275+116 ( 2 0 4079.1417913882 2 5920.8582038435 ) 53.7857073412 (ExtendedPoll) + 7275+120 ( 2 0 4079.1417981276 2 5920.8582006667 ) 53.7857073079 (ExtendedPoll) + 7275+130 ( 2 0 4079.1417985233 2 5920.8582009121 ) 53.7857073020 (ExtendedPoll) + 7275+131 ( 2 0 4079.1417993958 2 5920.8582005863 ) 53.7857072969 (ExtendedPoll) + 7275+139 ( 2 0 4079.1417992378 2 5920.8582007573 ) 53.7857072968 (ExtendedPoll) + 7423+14 ( 2 0 4999.1900742320 2 5000.5459053974 ) 55.9012953652 (ExtendedPoll) + 7423+15 ( 2 0 4996.7603258365 2 5002.1836504981 ) 55.9000925053 (ExtendedPoll) + 7423+16 ( 2 0 4987.0413322545 2 5008.7346309009 ) 55.8954303274 (ExtendedPoll) + 7423+17 ( 2 0 4948.1653579264 2 5034.9385525122 ) 55.8791873269 (ExtendedPoll) + 7423+18 ( 2 0 4792.6614606142 2 5139.7542389575 ) 55.8538338094 (ExtendedPoll) + 7423+20 ( 2 0 4775.1921795400 2 5165.9581605689 ) 55.6864877206 (ExtendedPoll) + 7423+21 ( 2 0 4722.7843363173 2 5244.5699254029 ) 55.1994445339 (ExtendedPoll) + 7423+26 ( 2 0 4722.3476042905 2 5276.0146313364 ) 54.8445124513 (ExtendedPoll) + 7423+29 ( 2 0 4697.8906107866 2 5295.6675725449 ) 54.8205115310 (ExtendedPoll) + 7423+30 ( 2 0 4624.5196302749 2 5354.6263961704 ) 54.7613812550 (ExtendedPoll) + 7423+31 ( 2 0 4331.0357082280 2 5590.4616906724 ) 54.7273149903 (ExtendedPoll) + 7423+36 ( 2 0 4308.3256428315 2 5648.1103182173 ) 54.3396439948 (ExtendedPoll) + 7423+38 ( 2 0 4455.0676038550 2 5543.2946317720 ) 54.1475041698 (ExtendedPoll) + 7423+47 ( 2 0 4447.5339763917 2 5551.3741742688 ) 54.1273594464 (ExtendedPoll) + 7423+58 ( 2 0 4447.2091995963 2 5551.7388284514 ) 54.1263276850 (ExtendedPoll) + 7423+59 ( 2 0 4446.2348692102 2 5552.8327909991 ) 54.1232362635 (ExtendedPoll) + 7423+60 ( 2 0 4442.3375476659 2 5557.2086411901 ) 54.1109285550 (ExtendedPoll) + 7423+69 ( 2 0 4442.5740664204 2 5557.2691503271 ) 54.1082748289 (ExtendedPoll) + 7423+73 ( 2 0 4442.6925323818 2 5557.2986052154 ) 54.1069545527 (ExtendedPoll) + 7423+79 ( 2 0 4442.7168164211 2 5557.2801226062 ) 54.1069394344 (ExtendedPoll) + 7423+82 ( 2 0 4442.7071793373 2 5557.2919529796 ) 54.1068985868 (ExtendedPoll) + 7423+86 ( 2 0 4442.7017183179 2 5557.2972807450 ) 54.1068897802 (ExtendedPoll) + 7423+87 ( 2 0 4442.6853352597 2 5557.3132640411 ) 54.1068633612 (ExtendedPoll) + 7423+88 ( 2 0 4442.6198030272 2 5557.3771972256 ) 54.1067576985 (ExtendedPoll) + 7423+89 ( 2 0 4442.3576740969 2 5557.6329299635 ) 54.1063352645 (ExtendedPoll) + 7423+90 ( 2 0 4441.3091583760 2 5558.6558609153 ) 54.1046489915 (ExtendedPoll) + 7423+91 ( 2 0 4437.1150954922 2 5562.7475847223 ) 54.0979593435 (ExtendedPoll) + 7423+92 ( 2 0 4420.3388439569 2 5579.1144799504 ) 54.0720900340 (ExtendedPoll) + 7423+93 ( 2 0 4353.2338378159 2 5644.5820608629 ) 53.9829787440 (ExtendedPoll) + 7423+94 ( 2 0 4084.8138132516 2 5906.4523845126 ) 53.8646582524 (ExtendedPoll) + 7423+96 ( 2 0 4082.5755616140 2 5909.6528113969 ) 53.8560492754 (ExtendedPoll) + 7423+97 ( 2 0 4075.8608067011 2 5919.2540920498 ) 53.8305130308 (ExtendedPoll) + 7423+98 ( 2 0 4066.9078001506 2 5932.0285038353 ) 53.7973908395 (ExtendedPoll) + 7423+110 ( 2 0 4066.8994834762 2 5932.5167352687 ) 53.7930561968 (ExtendedPoll) + 7423+113 ( 2 0 4066.7294181484 2 5932.9744722294 ) 53.7904920157 (ExtendedPoll) + 7423+115 ( 2 0 4066.4042148569 2 5933.3386999159 ) 53.7902064369 (ExtendedPoll) + 7423+116 ( 2 0 4065.4286049825 2 5934.4313829753 ) 53.7893539893 (ExtendedPoll) + 7423+122 ( 2 0 4065.9681225742 2 5934.0003020220 ) 53.7882608591 (ExtendedPoll) + 7423+134 ( 2 0 4065.9833434669 2 5933.9992277641 ) 53.7881299256 (ExtendedPoll) + 7423+135 ( 2 0 4066.0088195296 2 5933.9824261494 ) 53.7880462489 (ExtendedPoll) + 7423+138 ( 2 0 4066.0322468281 2 5933.9628689699 ) 53.7880063853 (ExtendedPoll) + 7423+149 ( 2 0 4066.0333397798 2 5933.9653350231 ) 53.7879740199 (ExtendedPoll) + 7423+154 ( 2 0 4066.0330666936 2 5933.9662487622 ) 53.7879682924 (ExtendedPoll) + 7423+160 ( 2 0 4066.0329389515 2 5933.9664500713 ) 53.7879676549 (ExtendedPoll) + 7423+161 ( 2 0 4066.0325557253 2 5933.9670539988 ) 53.7879657426 (ExtendedPoll) + 7423+164 ( 2 0 4066.0323799541 2 5933.9674972574 ) 53.7879633642 (ExtendedPoll) + 7423+171 ( 2 0 4066.0324936658 2 5933.9674614732 ) 53.7879626367 (ExtendedPoll) + 7423+175 ( 2 0 4066.0325420577 2 5933.9674266746 ) 53.7879625038 (ExtendedPoll) + 7423+180 ( 2 0 4066.0325530871 2 5933.9674366944 ) 53.7879623114 (ExtendedPoll) + 7423+181 ( 2 0 4066.0325776078 2 5933.9674197559 ) 53.7879622378 (ExtendedPoll) + 7423+192 ( 2 0 4066.0325784803 2 5933.9674194301 ) 53.7879622327 (ExtendedPoll) + 7423+193 ( 2 0 4066.0325810978 2 5933.9674184529 ) 53.7879622173 (ExtendedPoll) + 7423+197 ( 2 0 4066.0325804614 2 5933.9674191328 ) 53.7879622170 (ExtendedPoll) + 7423+198 ( 2 0 4066.0325785520 2 5933.9674211726 ) 53.7879622163 (ExtendedPoll) + 7423+203 ( 2 0 4066.0325782752 2 5933.9674215470 ) 53.7879622154 (ExtendedPoll) + 7423+206 ( 2 0 4066.0325779836 2 5933.9674219101 ) 53.7879622149 (ExtendedPoll) + 7423+208 ( 2 0 4066.0325777001 2 5933.9674222795 ) 53.7879622141 (ExtendedPoll) + 7423+214 ( 2 0 4066.0325779310 2 5933.9674220447 ) 53.7879622141 (ExtendedPoll) + 7423+215 ( 2 0 4066.0325786236 2 5933.9674213404 ) 53.7879622141 (ExtendedPoll) + 7423+216 ( 2 0 4066.0325813941 2 5933.9674185232 ) 53.7879622139 (ExtendedPoll) + 7423+217 ( 2 0 4066.0325924760 2 5933.9674072542 ) 53.7879622133 (ExtendedPoll) + 7423+218 ( 2 0 4066.0326368038 2 5933.9673621781 ) 53.7879622107 (ExtendedPoll) + 7423+219 ( 2 0 4066.0328141148 2 5933.9671818738 ) 53.7879622005 (ExtendedPoll) + 7423+220 ( 2 0 4066.0335233590 2 5933.9664606566 ) 53.7879621598 (ExtendedPoll) + 7423+221 ( 2 0 4066.0363603358 2 5933.9635757879 ) 53.7879619968 (ExtendedPoll) + 7423+222 ( 2 0 4066.0477082430 2 5933.9520363132 ) 53.7879613453 (ExtendedPoll) + 7423+223 ( 2 0 4066.0930998717 2 5933.9058784143 ) 53.7879587467 (ExtendedPoll) + 7423+224 ( 2 0 4066.2746663863 2 5933.7212468186 ) 53.7879484746 (ExtendedPoll) + 7423+225 ( 2 0 4067.0009324450 2 5932.9827204360 ) 53.7879093366 (ExtendedPoll) + 7423+226 ( 2 0 4069.9059966798 2 5930.0286149054 ) 53.7877839844 (ExtendedPoll) + 7423+227 ( 2 0 4081.5262536188 2 5918.2121927832 ) 53.7877812112 (ExtendedPoll) + 7423+230 ( 2 0 4081.5299687022 2 5918.2130588562 ) 53.7877391250 (ExtendedPoll) + 7423+231 ( 2 0 4081.5411139525 2 5918.2156570750 ) 53.7876128665 (ExtendedPoll) + 7423+232 ( 2 0 4081.5856949536 2 5918.2260499504 ) 53.7871078341 (ExtendedPoll) + 7423+233 ( 2 0 4081.6155830020 2 5918.2198824166 ) 53.7868886494 (ExtendedPoll) + 7423+234 ( 2 0 4081.7052471472 2 5918.2013798154 ) 53.7862311047 (ExtendedPoll) + 7423+236 ( 2 0 4081.6080460159 2 5918.3440427676 ) 53.7858294673 (ExtendedPoll) + 7423+240 ( 2 0 4081.5880590083 2 5918.4017130398 ) 53.7854893417 (ExtendedPoll) + 7423+247 ( 2 0 4081.6043092810 2 5918.3875148632 ) 53.7854687399 (ExtendedPoll) + 7423+248 ( 2 0 4081.6530600991 2 5918.3449203333 ) 53.7854069422 (ExtendedPoll) + 7423+257 ( 2 0 4081.6496579113 2 5918.3491070966 ) 53.7854002178 (ExtendedPoll) + 7423+266 ( 2 0 4081.6498661605 2 5918.3495360557 ) 53.7853944010 (ExtendedPoll) + 7423+267 ( 2 0 4081.6493358875 2 5918.3503287128 ) 53.7853920795 (ExtendedPoll) + 7423+274 ( 2 0 4081.6491972063 2 5918.3505226482 ) 53.7853915938 (ExtendedPoll) + 7423+275 ( 2 0 4081.6487811625 2 5918.3511044543 ) 53.7853901369 (ExtendedPoll) + 7423+284 ( 2 0 4081.6488121122 2 5918.3511553938 ) 53.7853893889 (ExtendedPoll) + 7423+287 ( 2 0 4081.6488409573 2 5918.3511479011 ) 53.7853891913 (ExtendedPoll) + 7423+293 ( 2 0 4081.6488473913 2 5918.3511516580 ) 53.7853890979 (ExtendedPoll) + 7423+298 ( 2 0 4081.6488480521 2 5918.3511510017 ) 53.7853890978 (ExtendedPoll) + 7423+299 ( 2 0 4081.6488500345 2 5918.3511490328 ) 53.7853890974 (ExtendedPoll) + 7423+300 ( 2 0 4081.6488579640 2 5918.3511411574 ) 53.7853890960 (ExtendedPoll) + 7423+301 ( 2 0 4081.6488896822 2 5918.3511096556 ) 53.7853890902 (ExtendedPoll) + 7423+310 ( 2 0 4081.6488900669 2 5918.3511093933 ) 53.7853890891 (ExtendedPoll) + 7423+311 ( 2 0 4081.6488912210 2 5918.3511086061 ) 53.7853890856 (ExtendedPoll) + 7423+319 ( 2 0 4081.6488912536 2 5918.3511087179 ) 53.7853890843 (ExtendedPoll) + 7423+323 ( 2 0 4081.6488912181 2 5918.3511087641 ) 53.7853890842 (ExtendedPoll) + 7752 ( 3 0 3209.7898482266 2 3041.1228583258 1 3749.0872770800 ) 46.5944609002 + 7753 ( 3 0 3209.7897367750 2 3041.1229969359 1 3749.0872586356 ) 46.5944605757 + 7758+32 ( 2 0 4999.9999577432 2 5000.0000417347 ) 55.9016992549 (ExtendedPoll) + 7758+39 ( 2 0 4999.9999505368 2 5000.0000494217 ) 55.9016992168 (ExtendedPoll) + 7758+40 ( 2 0 4999.9999398266 2 5000.0000597821 ) 55.9016991732 (ExtendedPoll) + 7758+41 ( 2 0 4999.9999076961 2 5000.0000908630 ) 55.9016990423 (ExtendedPoll) + 7758+42 ( 2 0 4999.9997791737 2 5000.0002151869 ) 55.9016985186 (ExtendedPoll) + 7758+43 ( 2 0 4999.9992650844 2 5000.0007124825 ) 55.9016964242 (ExtendedPoll) + 7758+44 ( 2 0 4999.9972087269 2 5000.0027016649 ) 55.9016880465 (ExtendedPoll) + 7758+45 ( 2 0 4999.9889832972 2 5000.0106583944 ) 55.9016545357 (ExtendedPoll) + 7758+46 ( 2 0 4999.9560815784 2 5000.0424853122 ) 55.9015204952 (ExtendedPoll) + 7758+47 ( 2 0 4999.8244747033 2 5000.1697929837 ) 55.9009843757 (ExtendedPoll) + 7758+48 ( 2 0 4999.2980472026 2 5000.6790236696 ) 55.8988405794 (ExtendedPoll) + 7758+49 ( 2 0 4997.1923371998 2 5002.7159464134 ) 55.8902763014 (ExtendedPoll) + 7758+50 ( 2 0 4988.7694971886 2 5010.8636373882 ) 55.8561940243 (ExtendedPoll) + 7758+51 ( 2 0 4955.0781371440 2 5043.4544012877 ) 55.7226824798 (ExtendedPoll) + 7758+52 ( 2 0 4820.3126969657 2 5173.8174568856 ) 55.2350077198 (ExtendedPoll) + 7758+53 ( 2 0 4281.2509362523 2 5695.2696792774 ) 54.1064641659 (ExtendedPoll) + 7758+55 ( 2 0 4281.1646507560 2 5695.4980679496 ) 54.1049615847 (ExtendedPoll) + 7758+56 ( 2 0 4280.9057942672 2 5696.1832339664 ) 54.1004549928 (ExtendedPoll) + 7758+57 ( 2 0 4279.8703683119 2 5698.9238980333 ) 54.0824459107 (ExtendedPoll) + 7758+58 ( 2 0 4275.7286644908 2 5709.8865543012 ) 54.0106865894 (ExtendedPoll) + 7758+59 ( 2 0 4276.7931988063 2 5713.6465440949 ) 53.9642063625 (ExtendedPoll) + 7758+60 ( 2 0 4274.1455108935 2 5720.9891012964 ) 53.9153574311 (ExtendedPoll) + 7758+61 ( 2 0 4264.8649553228 2 5733.5451470685 ) 53.8744070070 (ExtendedPoll) + 7758+68 ( 2 0 4267.0690872708 2 5731.8801062161 ) 53.8711681165 (ExtendedPoll) + 7758+71 ( 2 0 4268.6471229147 2 5730.7285666922 ) 53.8684637360 (ExtendedPoll) + 7758+80 ( 2 0 4268.8897458950 2 5730.7013509085 ) 53.8665809105 (ExtendedPoll) + 7758+83 ( 2 0 4269.1151490944 2 5730.6075484182 ) 53.8655030390 (ExtendedPoll) + 7758+88 ( 2 0 4269.2342348079 2 5730.5807124826 ) 53.8647110142 (ExtendedPoll) + 7758+91 ( 2 0 4269.3362140286 2 5730.5136259757 ) 53.8644648872 (ExtendedPoll) + 7758+92 ( 2 0 4269.6421516907 2 5730.3123664551 ) 53.8637267148 (ExtendedPoll) + 7758+99 ( 2 0 4269.6705853207 2 5730.3012821375 ) 53.8635834586 (ExtendedPoll) + 7758+104 ( 2 0 4269.6856215996 2 5730.3038783910 ) 53.8634248321 (ExtendedPoll) + 7758+107 ( 2 0 4269.6932509707 2 5730.3038560301 ) 53.8633574718 (ExtendedPoll) + 7758+111 ( 2 0 4269.6964158444 2 5730.3017263609 ) 53.8633503046 (ExtendedPoll) + 7758+119 ( 2 0 4269.6971078879 2 5730.3023825398 ) 53.8633377454 (ExtendedPoll) + 7758+120 ( 2 0 4269.6986534873 2 5730.3012649089 ) 53.8633350054 (ExtendedPoll) + 7758+129 ( 2 0 4269.6987532838 2 5730.3011997053 ) 53.8633347603 (ExtendedPoll) + 7758+137 ( 2 0 4269.6987734099 2 5730.3012216853 ) 53.8633343667 (ExtendedPoll) + 7758+139 ( 2 0 4269.6987532218 2 5730.3012436083 ) 53.8633343307 (ExtendedPoll) + 7758+146 ( 2 0 4269.6987565277 2 5730.3012418911 ) 53.8633343182 (ExtendedPoll) + 7758+148 ( 2 0 4269.6987598023 2 5730.3012401148 ) 53.8633343066 (ExtendedPoll) + 7758+158 ( 2 0 4269.6987598456 2 5730.3012400760 ) 53.8633343066 (ExtendedPoll) + 7758+159 ( 2 0 4269.6987599757 2 5730.3012399595 ) 53.8633343066 (ExtendedPoll) + 7758+160 ( 2 0 4269.6987604960 2 5730.3012394935 ) 53.8633343066 (ExtendedPoll) + 7928 ( 3 0 3209.7896557217 2 3041.1230842797 1 3749.0872551315 ) 46.5944603702 + 7933+5 ( 2 0 4909.1597359805 2 5083.8525467227 ) 55.5960690117 (ExtendedPoll) + 7933+6 ( 2 0 4636.6389512227 2 5335.4101941914 ) 54.8753884193 (ExtendedPoll) + 7933+10 ( 2 0 4468.9338529103 2 5503.1152925039 ) 54.4525845141 (ExtendedPoll) + 7933+11 ( 2 0 3965.8185579728 2 6006.2305874414 ) 54.0810898671 (ExtendedPoll) + 7933+19 ( 2 0 4063.6465319884 2 5929.3657507148 ) 53.8515922697 (ExtendedPoll) + 7933+32 ( 2 0 4065.8046023555 2 5931.0905010240 ) 53.8160592307 (ExtendedPoll) + 7933+33 ( 2 0 4064.4534626474 2 5934.7549556868 ) 53.7954447026 (ExtendedPoll) + 7933+39 ( 2 0 4065.1985513690 2 5934.1237414293 ) 53.7942572358 (ExtendedPoll) + 7933+40 ( 2 0 4067.4338175338 2 5932.2300986566 ) 53.7907104457 (ExtendedPoll) + 7933+47 ( 2 0 4067.6763605460 2 5932.2578742164 ) 53.7882192511 (ExtendedPoll) + 7933+56 ( 2 0 4067.6961659596 2 5932.2810920154 ) 53.7878265281 (ExtendedPoll) + 7933+64 ( 2 0 4067.7064620507 2 5932.2843178088 ) 53.7877022834 (ExtendedPoll) + 7933+68 ( 2 0 4067.7096029627 2 5932.2864826593 ) 53.7876537119 (ExtendedPoll) + 7933+69 ( 2 0 4067.7163863700 2 5932.2829908004 ) 53.7876226117 (ExtendedPoll) + 7933+81 ( 2 0 4067.7165647188 2 5932.2828325755 ) 53.7876223942 (ExtendedPoll) + 7933+82 ( 2 0 4067.7170997651 2 5932.2823579007 ) 53.7876217416 (ExtendedPoll) + 7933+83 ( 2 0 4067.7192399506 2 5932.2804592016 ) 53.7876191311 (ExtendedPoll) + 7933+86 ( 2 0 4067.7200409230 2 5932.2799415742 ) 53.7876164105 (ExtendedPoll) + 7933+101 ( 2 0 4067.7200445311 2 5932.2799480928 ) 53.7876163183 (ExtendedPoll) + 7933+105 ( 2 0 4067.7200436470 2 5932.2799517117 ) 53.7876162938 (ExtendedPoll) + 7933+110 ( 2 0 4067.7200455038 2 5932.2799515643 ) 53.7876162780 (ExtendedPoll) + 7933+111 ( 2 0 4067.7200489601 2 5932.2799501743 ) 53.7876162586 (ExtendedPoll) + 7933+119 ( 2 0 4067.7200493934 2 5932.2799500040 ) 53.7876162561 (ExtendedPoll) + 7933+122 ( 2 0 4067.7200493924 2 5932.2799504696 ) 53.7876162519 (ExtendedPoll) + 7933+129 ( 2 0 4067.7200493199 2 5932.2799505607 ) 53.7876162518 (ExtendedPoll) + 7933+130 ( 2 0 4067.7200491022 2 5932.2799508337 ) 53.7876162513 (ExtendedPoll) + 7933+141 ( 2 0 4067.7200491111 2 5932.2799508739 ) 53.7876162509 (ExtendedPoll) + 8079+2 ( 2 0 4664.5898009415 2 5335.4101941914 ) 54.6460175679 (ExtendedPoll) + 8079+3 ( 2 0 3658.3592110666 2 6341.6407840663 ) 54.3665216810 (ExtendedPoll) + 8079+47 ( 2 0 3658.3592086607 2 6341.6407911178 ) 54.3665216529 (ExtendedPoll) + 8079+49 ( 2 0 3658.3592231902 2 6341.6407758540 ) 54.3665216198 (ExtendedPoll) + 8079+50 ( 2 0 3658.3592667787 2 6341.6407300627 ) 54.3665215205 (ExtendedPoll) + 8079+51 ( 2 0 3658.3594411326 2 6341.6405468973 ) 54.3665211233 (ExtendedPoll) + 8079+52 ( 2 0 3658.3601385484 2 6341.6398142359 ) 54.3665195344 (ExtendedPoll) + 8079+53 ( 2 0 3658.3629282116 2 6341.6368835902 ) 54.3665131789 (ExtendedPoll) + 8079+54 ( 2 0 3658.3740868643 2 6341.6251610074 ) 54.3664877574 (ExtendedPoll) + 8079+55 ( 2 0 3658.4187214749 2 6341.5782706765 ) 54.3663860796 (ExtendedPoll) + 8079+56 ( 2 0 3658.5972599177 2 6341.3907093526 ) 54.3659794991 (ExtendedPoll) + 8079+57 ( 2 0 3659.3114136885 2 6340.6404640569 ) 54.3643552693 (ExtendedPoll) + 8079+58 ( 2 0 3662.1680287720 2 6337.6394828742 ) 54.3578918193 (ExtendedPoll) + 8079+59 ( 2 0 3673.5944891057 2 6325.6355581437 ) 54.3325733144 (ExtendedPoll) + 8079+60 ( 2 0 3719.3003304408 2 6277.6198592213 ) 54.2398493355 (ExtendedPoll) + 8079+61 ( 2 0 3902.1236957812 2 6085.5570635318 ) 54.0045822968 (ExtendedPoll) + 8079+63 ( 2 0 3902.2168451994 2 6085.4781750776 ) 54.0043572353 (ExtendedPoll) + 8079+64 ( 2 0 3902.4962934540 2 6085.2415097151 ) 54.0036823026 (ExtendedPoll) + 8079+65 ( 2 0 3903.6140864724 2 6084.2948482648 ) 54.0009863502 (ExtendedPoll) + 8079+66 ( 2 0 3908.0852585462 2 6080.5082024636 ) 53.9902629755 (ExtendedPoll) + 8079+67 ( 2 0 3925.9699468413 2 6065.3616192587 ) 53.9483351232 (ExtendedPoll) + 8079+68 ( 2 0 3929.8118238900 2 6064.6724015289 ) 53.9176744624 (ExtendedPoll) + 8079+71 ( 2 0 3933.6400530629 2 6065.4639783275 ) 53.8745546326 (ExtendedPoll) + 8079+74 ( 2 0 3935.2163827223 2 6064.3107328191 ) 53.8694071337 (ExtendedPoll) + 8079+80 ( 2 0 3934.4145700168 2 6065.4354030875 ) 53.8674407841 (ExtendedPoll) + 8079+86 ( 2 0 3934.3391268516 2 6065.5313647145 ) 53.8673400617 (ExtendedPoll) + 8079+87 ( 2 0 3934.1127973559 2 6065.8192495955 ) 53.8670381792 (ExtendedPoll) + 8079+97 ( 2 0 3934.1264743868 2 6065.8465307696 ) 53.8666759354 (ExtendedPoll) + 8079+99 ( 2 0 3934.1212739663 2 6065.8766020781 ) 53.8664692539 (ExtendedPoll) + 8079+109 ( 2 0 3934.1202740309 2 6065.8782263033 ) 53.8664649210 (ExtendedPoll) + 8079+113 ( 2 0 3934.1223533865 2 6065.8765080955 ) 53.8664598006 (ExtendedPoll) + 8079+114 ( 2 0 3934.1285914536 2 6065.8713534722 ) 53.8664444397 (ExtendedPoll) + 8079+118 ( 2 0 3934.1299504561 2 6065.8700151548 ) 53.8664429271 (ExtendedPoll) + 8079+132 ( 2 0 3934.1299636052 2 6065.8700081445 ) 53.8664428619 (ExtendedPoll) + 8079+133 ( 2 0 3934.1300030527 2 6065.8699871137 ) 53.8664426663 (ExtendedPoll) + 8079+138 ( 2 0 3934.1300169838 2 6065.8699818250 ) 53.8664425790 (ExtendedPoll) + 8079+144 ( 2 0 3934.1300195727 2 6065.8699791463 ) 53.8664425772 (ExtendedPoll) + 8079+145 ( 2 0 3934.1300273392 2 6065.8699711101 ) 53.8664425718 (ExtendedPoll) + 8079+146 ( 2 0 3934.1300584054 2 6065.8699389652 ) 53.8664425505 (ExtendedPoll) + 8079+147 ( 2 0 3934.1301826702 2 6065.8698103857 ) 53.8664424650 (ExtendedPoll) + 8079+148 ( 2 0 3934.1306797292 2 6065.8692960676 ) 53.8664421232 (ExtendedPoll) + 8079+149 ( 2 0 3934.1326679655 2 6065.8672387954 ) 53.8664407559 (ExtendedPoll) + 8079+150 ( 2 0 3934.1406209105 2 6065.8590097066 ) 53.8664352870 (ExtendedPoll) + 8079+151 ( 2 0 3934.1724326905 2 6065.8260933514 ) 53.8664134151 (ExtendedPoll) + 8079+152 ( 2 0 3934.2996798107 2 6065.6944279307 ) 53.8663259908 (ExtendedPoll) + 8079+153 ( 2 0 3934.8086682912 2 6065.1677662475 ) 53.8659772994 (ExtendedPoll) + 8079+154 ( 2 0 3936.8446222133 2 6063.0611195148 ) 53.8645986296 (ExtendedPoll) + 8079+155 ( 2 0 3944.9884379019 2 6054.6345325840 ) 53.8593413213 (ExtendedPoll) + 8079+156 ( 2 0 3977.5637006562 2 6020.9281848608 ) 53.8424195173 (ExtendedPoll) + 8079+157 ( 2 0 4107.8647516735 2 5886.1027939679 ) 53.8397272797 (ExtendedPoll) + 8079+160 ( 2 0 4107.9148966216 2 5886.1375900537 ) 53.8389476963 (ExtendedPoll) + 8079+161 ( 2 0 4108.0653314659 2 5886.2419783111 ) 53.8366089797 (ExtendedPoll) + 8079+162 ( 2 0 4108.6670708432 2 5886.6595313405 ) 53.8272546148 (ExtendedPoll) + 8079+163 ( 2 0 4111.0740283523 2 5888.3297434584 ) 53.7898451866 (ExtendedPoll) + 8079+164 ( 2 0 4110.6415612866 2 5889.2053399927 ) 53.7857457298 (ExtendedPoll) + 8079+169 ( 2 0 4110.3275535183 2 5889.5792704659 ) 53.7851798069 (ExtendedPoll) + 8079+177 ( 2 0 4110.3514722870 2 5889.6354230117 ) 53.7844442616 (ExtendedPoll) + 8079+179 ( 2 0 4110.3094657512 2 5889.6797036381 ) 53.7844214421 (ExtendedPoll) + 8079+180 ( 2 0 4110.1834461437 2 5889.8125455175 ) 53.7843530488 (ExtendedPoll) + 8079+189 ( 2 0 4110.1987859472 2 5889.7973681491 ) 53.7843522353 (ExtendedPoll) + 8079+190 ( 2 0 4110.2448053575 2 5889.7518360439 ) 53.7843498028 (ExtendedPoll) + 8079+191 ( 2 0 4110.4288829988 2 5889.5697076232 ) 53.7843401922 (ExtendedPoll) + 8079+198 ( 2 0 4110.4212701576 2 5889.5773535241 ) 53.7843395401 (ExtendedPoll) + 8079+199 ( 2 0 4110.3984316340 2 5889.6002912268 ) 53.7843375858 (ExtendedPoll) + 8079+200 ( 2 0 4110.3070775395 2 5889.6920420376 ) 53.7843297986 (ExtendedPoll) + 8079+213 ( 2 0 4110.3073348959 2 5889.6924434618 ) 53.7843237498 (ExtendedPoll) + 8079+218 ( 2 0 4110.3074006879 2 5889.6925428714 ) 53.7843222330 (ExtendedPoll) + 8079+220 ( 2 0 4110.3073219352 2 5889.6926323636 ) 53.7843221306 (ExtendedPoll) + 8079+221 ( 2 0 4110.3070856770 2 5889.6929008404 ) 53.7843218236 (ExtendedPoll) + 8079+229 ( 2 0 4110.3070782245 2 5889.6929137441 ) 53.7843217731 (ExtendedPoll) + 8079+234 ( 2 0 4110.3070784835 2 5889.6929211901 ) 53.7843217023 (ExtendedPoll) + 8079+244 ( 2 0 4110.3070782010 2 5889.6929215603 ) 53.7843217014 (ExtendedPoll) + 8079+248 ( 2 0 4110.3070784332 2 5889.6929215433 ) 53.7843216995 (ExtendedPoll) + 8079+255 ( 2 0 4110.3070784211 2 5889.6929215697 ) 53.7843216993 (ExtendedPoll) + 8338 ( 3 0 3209.7896175644 2 3041.1231297861 1 3749.0872500424 ) 46.5944602659 + 8342+4 ( 2 0 4720.4915015090 2 5223.6067964464 ) 55.4583179990 (ExtendedPoll) + 8342+6 ( 2 0 4385.0813048840 2 5559.0169930714 ) 54.5837536455 (ExtendedPoll) + 8342+11 ( 2 0 4580.7372529152 2 5419.2627444776 ) 54.4134065463 (ExtendedPoll) + 8342+19 ( 2 0 4558.0271875187 2 5440.6626137936 ) 54.3705316119 (ExtendedPoll) + 8342+20 ( 2 0 4489.8969913293 2 5504.8622217413 ) 54.2562699395 (ExtendedPoll) + 8342+21 ( 2 0 4217.3762065715 2 5761.6606535323 ) 54.0237236224 (ExtendedPoll) + 8342+31 ( 2 0 4224.1455529878 2 5775.7452613984 ) 53.8272825836 (ExtendedPoll) + 8342+40 ( 2 0 4224.0014506112 2 5775.9423292618 ) 53.8266734099 (ExtendedPoll) + 8342+42 ( 2 0 4224.5165513001 2 5775.4823531964 ) 53.8264974549 (ExtendedPoll) + 8342+55 ( 2 0 4224.5193698410 2 5775.4797826488 ) 53.8264970122 (ExtendedPoll) + 8342+56 ( 2 0 4224.5278254637 2 5775.4720710060 ) 53.8264956843 (ExtendedPoll) + 8342+72 ( 2 0 4224.5278620041 2 5775.4721180965 ) 53.8264949041 (ExtendedPoll) + 8342+75 ( 2 0 4224.5278401629 2 5775.4721383731 ) 53.8264949041 (ExtendedPoll) + 8342+76 ( 2 0 4224.5277746392 2 5775.4721992028 ) 53.8264949041 (ExtendedPoll) + 8342+77 ( 2 0 4224.5275125446 2 5775.4724425218 ) 53.8264949040 (ExtendedPoll) + 8342+78 ( 2 0 4224.5264641662 2 5775.4734157976 ) 53.8264949035 (ExtendedPoll) + 8342+79 ( 2 0 4224.5222706526 2 5775.4773089008 ) 53.8264949018 (ExtendedPoll) + 8342+80 ( 2 0 4224.5054965982 2 5775.4928813139 ) 53.8264948957 (ExtendedPoll) + 8342+81 ( 2 0 4224.4384003804 2 5775.5551709661 ) 53.8264948856 (ExtendedPoll) + 8342+83 ( 2 0 4224.4377205871 2 5775.5589246019 ) 53.8264648146 (ExtendedPoll) + 8342+86 ( 2 0 4224.4354746818 2 5775.5620080759 ) 53.8264551993 (ExtendedPoll) + 8342+87 ( 2 0 4224.4287369659 2 5775.5712584979 ) 53.8264263535 (ExtendedPoll) + 8342+108 ( 2 0 4224.4287371566 2 5775.5712603508 ) 53.8264263340 (ExtendedPoll) + 8342+110 ( 2 0 4224.4287369462 2 5775.5712622015 ) 53.8264263180 (ExtendedPoll) + 8342+112 ( 2 0 4224.4287384895 2 5775.5712611586 ) 53.8264263143 (ExtendedPoll) + 8342+120 ( 2 0 4224.4287387223 2 5775.5712611587 ) 53.8264263122 (ExtendedPoll) + 8342+123 ( 2 0 4224.4287389206 2 5775.5712610366 ) 53.8264263116 (ExtendedPoll) + 8342+128 ( 2 0 4224.4287388106 2 5775.5712611591 ) 53.8264263114 (ExtendedPoll) + 8342+134 ( 2 0 4224.4287388393 2 5775.5712611545 ) 53.8264263112 (ExtendedPoll) + 8479+5 ( 2 0 4748.4423512277 2 5251.5576461652 ) 54.9123289774 (ExtendedPoll) + 8479+6 ( 2 0 3993.7694088215 2 6006.2305885713 ) 53.8183150359 (ExtendedPoll) + 8479+51 ( 2 0 3993.7694094976 2 6006.2305892118 ) 53.8183150239 (ExtendedPoll) + 8479+52 ( 2 0 3993.7694111450 2 6006.2305883426 ) 53.8183150161 (ExtendedPoll) + 8479+63 ( 2 0 3993.7694114742 2 6006.2305883502 ) 53.8183150129 (ExtendedPoll) + 8479+65 ( 2 0 3993.7694113839 2 6006.2305885648 ) 53.8183150119 (ExtendedPoll) + 8479+70 ( 2 0 3993.7694115223 2 6006.2305884756 ) 53.8183150114 (ExtendedPoll) + 8557 ( 3 0 3209.7895991439 2 3041.1231230634 1 3749.0872724849 ) 46.5944602388 + 8558 ( 3 0 3209.7895438823 2 3041.1231028951 1 3749.0873398125 ) 46.5944601576 + 8559 ( 3 0 3209.7893228358 2 3041.1230222222 1 3749.0876091228 ) 46.5944598326 + 8560 ( 3 0 3209.7884386500 2 3041.1226995306 1 3749.0886863640 ) 46.5944585328 + 8561 ( 3 0 3209.7849019068 2 3041.1214087641 1 3749.0929953290 ) 46.5944533336 + 8562 ( 3 0 3209.7707549341 2 3041.1162456982 1 3749.1102311888 ) 46.5944325369 + 8563 ( 3 0 3209.7141670434 2 3041.0955934346 1 3749.1791746282 ) 46.5943493545 + 8564 ( 3 0 3209.4878154802 2 3041.0129843799 1 3749.4549483857 ) 46.5940166899 + 8565 ( 3 0 3208.5824092276 2 3040.6825481613 1 3750.5580434156 ) 46.5926870780 + 8566 ( 3 0 3204.9607842173 2 3039.3608032869 1 3754.9704235351 ) 46.5873853782 + 8567 ( 3 0 3190.4742841761 2 3034.0738237895 1 3772.6199440134 ) 46.5664471002 + 8568 ( 3 0 3132.5282840110 2 3012.9259057995 1 3843.2180259264 ) 46.4870256328 + 8569 ( 3 0 2900.7442833508 2 2928.3342338397 1 4125.6103535787 ) 46.2408879908 + 8571 ( 3 0 2900.7614274922 2 2928.3321612234 1 4125.8538859951 ) 46.2381909255 + 8572 ( 3 0 2900.8128599165 2 2928.3259433745 1 4126.5844832443 ) 46.2301005176 + 8573 ( 3 0 2901.0185896137 2 2928.3010719787 1 4129.5068722413 ) 46.1977507173 + 8574 ( 3 0 2901.8415084025 2 2928.2015863959 1 4141.1964282293 ) 46.0685414984 + 8575 ( 3 0 2900.9072090155 2 2929.0263074597 1 4144.8990220964 ) 46.0294803754 + 8576 ( 3 0 2898.1043108544 2 2931.5004706513 1 4156.0068036976 ) 45.9126009127 + 8577 ( 3 0 2893.3059337557 2 2930.6699823072 1 4170.8633174072 ) 45.8058560157 + 8578 ( 3 0 2906.2246413292 2 2906.6780968135 1 4186.3657664955 ) 45.7664430594 + 8585 ( 3 0 2885.1856032809 2 2904.8325671601 1 4209.2503341972 ) 45.7234233185 + 8586 ( 3 0 2822.0684891358 2 2899.2959782000 1 4277.9040373024 ) 45.6027586237 + 8587 ( 3 0 2569.6000325554 2 2877.1496223596 1 4552.5188497232 ) 45.2497134209 + 8604 ( 3 0 2569.6580658121 2 2876.7761909688 1 4553.4192663392 ) 45.2437144482 + 8605 ( 3 0 2570.2146083482 2 2875.2291180641 1 4554.4732367897 ) 45.2420565509 + 8619 ( 3 0 2570.1792950214 2 2875.1673676151 1 4554.5724351350 ) 45.2419430091 + 8620 ( 3 0 2570.0733550410 2 2874.9821162682 1 4554.8700301708 ) 45.2416024126 + 8621 ( 3 0 2569.6495951193 2 2874.2411108805 1 4556.0604103143 ) 45.2402404599 + 8628 ( 3 0 2569.2779660036 2 2874.5306463677 1 4556.1885520705 ) 45.2397502250 + 8645 ( 3 0 2569.2890178965 2 2874.5245089523 1 4556.1847035137 ) 45.2397436100 + 8656 ( 3 0 2569.2838215385 2 2874.5258438228 1 4556.1885598972 ) 45.2397403650 + 8657 ( 3 0 2569.2682324643 2 2874.5298484341 1 4556.2001290477 ) 45.2397306308 + 8658 ( 3 0 2569.2058761675 2 2874.5458668797 1 4556.2464056497 ) 45.2396917036 + 8659 ( 3 0 2568.9564509805 2 2874.6099406618 1 4556.4315120578 ) 45.2395361495 + 8660 ( 3 0 2567.9587502324 2 2874.8662357905 1 4557.1719376902 ) 45.2389164047 + 8661 ( 3 0 2563.9679472400 2 2875.8914163050 1 4560.1336402198 ) 45.2364769895 + 8662 ( 3 0 2548.0047352705 2 2879.9921383632 1 4571.9804503382 ) 45.2273531705 + 8663 ( 3 0 2484.1518873922 2 2896.3950265960 1 4619.3676908119 ) 45.2010503608 + 8675 ( 3 0 2484.0736686549 2 2896.3896310350 1 4619.4612514156 ) 45.2009055791 + 8676 ( 3 0 2483.8390124432 2 2896.3734443522 1 4619.7419332265 ) 45.2004713862 + 8689 ( 3 0 2483.8404577833 2 2896.3642671817 1 4619.7710023038 ) 45.2002598293 + 8696 ( 3 0 2483.8253676018 2 2896.3813588741 1 4619.7912874024 ) 45.2000581939 + 8712 ( 3 0 2483.8253703113 2 2896.3815984832 1 4619.7922104815 ) 45.2000473949 + 8714 ( 3 0 2483.8245414630 2 2896.3833077377 1 4619.7920389071 ) 45.2000420407 + 8717 ( 3 0 2483.8258603227 2 2896.3779360857 1 4619.7956529999 ) 45.2000411600 + 8718 ( 3 0 2483.8298169016 2 2896.3618211298 1 4619.8064952782 ) 45.2000385180 + 8719 ( 3 0 2483.8456432174 2 2896.2973613061 1 4619.8498643917 ) 45.2000279546 + 8720 ( 3 0 2483.9089484806 2 2896.0395220115 1 4620.0233408456 ) 45.1999857711 + 8721 ( 3 0 2484.1621695335 2 2895.0081648328 1 4620.7172466613 ) 45.1998181601 + 8722 ( 3 0 2485.1750537449 2 2890.8827361181 1 4623.4928699239 ) 45.1991656831 + 8723 ( 3 0 2489.2265905905 2 2874.3810212593 1 4634.5953629742 ) 45.1968429324 + 8724 ( 3 0 2505.4327379729 2 2808.3741618241 1 4679.0053351755 ) 45.1921264676 + 8727 ( 3 0 2505.3685769810 2 2808.4952747076 1 4679.9720755135 ) 45.1823799799 + 8728 ( 3 0 2505.1760940054 2 2808.8586133581 1 4682.8722965274 ) 45.1531602599 + 8729 ( 3 0 2503.1517786669 2 2810.5022882056 1 4685.7790057314 ) 45.1291493448 + 8738 ( 3 0 2502.1929683392 2 2809.7986800253 1 4687.3275204562 ) 45.1288718569 + 8739 ( 3 0 2499.3165373560 2 2807.6878554842 1 4691.9730646305 ) 45.1280529948 + 8740 ( 3 0 2487.8108134233 2 2799.2445573201 1 4710.5552413278 ) 45.1249818571 + 8741 ( 3 0 2441.7879176925 2 2765.4713646635 1 4784.8839481171 ) 45.1159841138 + 8744 ( 3 0 2462.0887438795 2 2743.6941147538 1 4794.1115963840 ) 45.0330234211 + 8760 ( 3 0 2462.3136002207 2 2743.6052851221 1 4794.0775784423 ) 45.0321070688 + 8776 ( 3 0 2462.3185474349 2 2743.6003098574 1 4794.0805750106 ) 45.0320771528 + 8786 ( 3 0 2462.3197386852 2 2743.5989064226 1 4794.0810742815 ) 45.0320738114 + 8793 ( 3 0 2462.3211643858 2 2743.5976465736 1 4794.0809396072 ) 45.0320731778 + 8794 ( 3 0 2462.3254414876 2 2743.5938670266 1 4794.0805355845 ) 45.0320712769 + 8812 ( 3 0 2462.3255079460 2 2743.5937832827 1 4794.0805883207 ) 45.0320709008 + 8813 ( 3 0 2462.3257073210 2 2743.5935320511 1 4794.0807465293 ) 45.0320697728 + 8826 ( 3 0 2462.3257104845 2 2743.5935091129 1 4794.0807652912 ) 45.0320697624 + 8827 ( 3 0 2462.3257199749 2 2743.5934402983 1 4794.0808215770 ) 45.0320697313 + 8828 ( 3 0 2462.3257579368 2 2743.5931650398 1 4794.0810467200 ) 45.0320696068 + 8829 ( 3 0 2462.3259097844 2 2743.5920640060 1 4794.0819472921 ) 45.0320691088 + 8830 ( 3 0 2462.3265171749 2 2743.5876598710 1 4794.0855495803 ) 45.0320671166 + 8831 ( 3 0 2462.3289467365 2 2743.5700433307 1 4794.0999587333 ) 45.0320591485 + 8832 ( 3 0 2462.3386649831 2 2743.4995771695 1 4794.1575953453 ) 45.0320272796 + 8833 ( 3 0 2462.3775379695 2 2743.2177125248 1 4794.3881417933 ) 45.0318998663 + 8834 ( 3 0 2462.5330299152 2 2742.0902539461 1 4795.3103275852 ) 45.0313912035 + 8835 ( 3 0 2463.1549976977 2 2737.5804196312 1 4798.9990707529 ) 45.0293724005 + 8836 ( 3 0 2465.6428688278 2 2719.5410823714 1 4813.7540434236 ) 45.0215504519 + 8837 ( 3 0 2475.5943533484 2 2647.3837333325 1 4872.7739341066 ) 44.9942951687 + 8838 ( 3 0 2515.4002914308 2 2358.7543371766 1 5108.8534968384 ) 44.9485005040 + 8840 ( 3 0 2515.2855315668 2 2358.6893426326 1 5109.0589561943 ) 44.9480836817 + 8841 ( 3 0 2514.9412519750 2 2358.4943590004 1 5109.6753342622 ) 44.9468335445 + 8842 ( 3 0 2513.5641336077 2 2357.7144244716 1 5112.1408465335 ) 44.9418379464 + 8843 ( 3 0 2508.0556601384 2 2354.5946863564 1 5122.0028956186 ) 44.9219348254 + 8844 ( 3 0 2486.0217662612 2 2342.1157338955 1 5161.4510919593 ) 44.8435947921 + 8845 ( 3 0 2483.0458496952 2 2338.7707113988 1 5167.8643075048 ) 44.8377804120 + 8846 ( 3 0 2474.1180999970 2 2328.7356439086 1 5187.1039541411 ) 44.8205099552 + 8847 ( 3 0 2438.4071012044 2 2288.5953739479 1 5264.0625406864 ) 44.7540328039 + 8848 ( 3 0 2295.5631060339 2 2128.0342941051 1 5571.8968868678 ) 44.5306991822 + 8855 ( 3 0 2246.8411231851 2 2159.0391922817 1 5594.0432427082 ) 44.4908538729 + 8881 ( 3 0 2246.8591149590 2 2159.0973578929 1 5594.0389538567 ) 44.4902351182 + 8890 ( 3 0 2246.8486392353 2 2159.1084209401 1 5594.0397904890 ) 44.4902262093 + 8903 ( 3 0 2246.8540260785 2 2159.1053127856 1 5594.0375595191 ) 44.4902251751 + 8904 ( 3 0 2246.8701866083 2 2159.0959883223 1 5594.0308666095 ) 44.4902220731 + 8905 ( 3 0 2246.9348287276 2 2159.0586904689 1 5594.0040949708 ) 44.4902096777 + 8906 ( 3 0 2247.1933972044 2 2158.9094990553 1 5593.8970084161 ) 44.4901602933 + 8927 ( 3 0 2247.1934312789 2 2158.9093352501 1 5593.8971782696 ) 44.4901598382 + 8933 ( 3 0 2247.1936064494 2 2158.9091736740 1 5593.8971710678 ) 44.4901597251 + 8934 ( 3 0 2247.1941319611 2 2158.9086889458 1 5593.8971494625 ) 44.4901593859 + 8944 ( 3 0 2247.1941525712 2 2158.9086089656 1 5593.8972354233 ) 44.4901591006 + 8961 ( 3 0 2247.1941592110 2 2158.9086060982 1 5593.8972336338 ) 44.4901590823 + 8969 ( 3 0 2247.1941622393 2 2158.9086061446 1 5593.8972314647 ) 44.4901590747 + 8979 ( 3 0 2247.1941629850 2 2158.9086060136 1 5593.8972309224 ) 44.4901590742 + 8988 ( 3 0 2247.1941631028 2 2158.9086062984 1 5593.8972305733 ) 44.4901590739 + 8998 ( 3 0 2247.1941631943 2 2158.9086062904 1 5593.8972305018 ) 44.4901590738 + 9011 ( 3 0 2247.1941631861 2 2158.9086062987 1 5593.8972305106 ) 44.4901590737 + 9021 ( 3 0 2247.1941631897 2 2158.9086062984 1 5593.8972305098 ) 44.4901590737 + 9027 ( 3 0 2247.1941631931 2 2158.9086062979 1 5593.8972305086 ) 44.4901590737 + 9037 ( 3 0 2247.1941631947 2 2158.9086062989 1 5593.8972305060 ) 44.4901590737 + 9047 ( 3 0 2247.1941631950 2 2158.9086062987 1 5593.8972305061 ) 44.4901590737 + 9056 ( 3 0 2247.1941631952 2 2158.9086062985 1 5593.8972305062 ) 44.4901590737 + 9065 ( 3 0 2247.1941631953 2 2158.9086062986 1 5593.8972305060 ) 44.4901590737 + 9074 ( 3 0 2247.1941631953 2 2158.9086062986 1 5593.8972305061 ) 44.4901590737 + 9091 ( 3 0 2247.1941631953 2 2158.9086062986 1 5593.8972305061 ) 44.4901590737 -} end of run (mesh size reached NOMAD precision) +} end of run (mesh index limits) -blackbox evaluations : 3436 -best feasible solution : ( 3 0 3333.333333 2 3333.333333 1 3333.333333 ) h=0 f=47.16829052 +blackbox evaluations : 9091 +best feasible solution : ( 3 0 2247.194163 2 2158.908606 1 5593.897231 ) h=0 f=44.49015907 diff --git a/examples/advanced/multi_start/best_x.txt b/examples/advanced/multi_start/best_x.txt index 7588ff3..821eea6 100644 --- a/examples/advanced/multi_start/best_x.txt +++ b/examples/advanced/multi_start/best_x.txt @@ -1 +1 @@ -1.0065227779901828597530766273849 0.0061576008796691908409037807814457 0.99995827823866767491978180260048 1.0093326058145666301868459413527 1.0032484173774720570548879550188 \ No newline at end of file +0.9999740474925636890546343238384 3.9134074383641649674033663464101e-05 0.99997595080463674843684884763206 0.99999589110497688615453171223635 0.99999324108060483329296630472527 \ No newline at end of file diff --git a/examples/advanced/multi_start/makefile b/examples/advanced/multi_start/makefile index 95b3f96..841008f 100644 --- a/examples/advanced/multi_start/makefile +++ b/examples/advanced/multi_start/makefile @@ -1,11 +1,23 @@ -EXE = multi.exe -COMPILATOR = g++ -COMPILATOR_OPTIONS = -ansi -O2 -L1 = $(NOMAD_HOME)/lib/nomad.a -LIBS = $(L1) -lm -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -OBJS = multi.o +UNAME := $(shell uname) + +EXE = multi.exe +COMPILATOR = g++ +COMPILATOR_OPTIONS = -ansi -O2 + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi +endif + +LDLIBS = -lm -lnomad + +INCLUDE = -I$(NOMAD_HOME)/src -I. +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c +OBJS = multi.o ifndef NOMAD_HOME define ECHO_NOMAD @@ -14,11 +26,15 @@ define ECHO_NOMAD endef endif -$(EXE): $(L1) $(OBJS) +$(EXE): $(OBJS) $(ECHO_NOMAD) @echo " building the scalar version ..." @echo " exe file : "$(EXE) - $(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif + multi.o: multi.cpp $(ECHO_NOMAD) diff --git a/examples/advanced/multi_start/runExample.log b/examples/advanced/multi_start/runExample.log index 51c3fae..ffc68d1 100644 --- a/examples/advanced/multi_start/runExample.log +++ b/examples/advanced/multi_start/runExample.log @@ -1,5 +1,5 @@ -starting point # 0: ( 1.311638583 0.3116009987 0.9520390845 0.8088161243 1.540724398 1.619263445 0.9519058983 ) +starting point # 0: ( 0.5802249825 1.631108467 1.028915701 1.041199968 0.8987064366 1.883811294 1.475481573 ) starting point # 1: ( 4.046907118 0.2179386209 0.3995457903 2.86002185 2.869872299 1.805805862 0.9241232544 ) starting point # 2: ( 2.730496038 4.019688198 2.015450408 3.887235003 1.919237215 0.004176816764 2.788539635 ) starting point # 3: ( 1.986593711 1.814325217 1.166098379 0.9517739273 0.4086947283 3.9836116 2.239536416 ) @@ -8,14 +8,14 @@ starting point # 4: ( 1.072412482 2.713920967 3.075009451 0.3310437183 1.0323001 Warning: { Anisotropic mesh is disabled for direction types other than OrthoMads. } -run # 0: f=1.619155361 -run # 1: f=1.890750373 -run # 2: f=2.267307514 -run # 3: f=1.998968772 -run # 4: f=2.24968126 +run # 0: f=1.933149587 +run # 1: f=1.998299291 +run # 2: f=2.185446803 +run # 3: f=1.978020317 +run # 4: f=2.037153616 bb eval : 5000 -best : 1.619155361 -worst : 2.267307514 -solution: x = ( 1.310592306 0.3106177009 0.9507953978 0.8088442339 1.538847818 1.618878923 0.951419131 ) f(x) = 1.619155361 +best : 1.933149587 +worst : 2.185446803 +solution: x = ( 0.6020877754 1.616716377 1.043857108 1.033179949 0.9025516515 1.899521743 1.402861944 ) f(x) = 1.933149587 diff --git a/examples/advanced/plot/makefile b/examples/advanced/plot/makefile index 3529bc8..22c70e7 100644 --- a/examples/advanced/plot/makefile +++ b/examples/advanced/plot/makefile @@ -1,16 +1,37 @@ -EXE = nomad_plot.exe -COMPILATOR = g++ -COMPILATOR_OPTIONS = -ansi -O2 -L1 = $(NOMAD_HOME)/lib/nomad.a -LIBS = $(L1) -lc -lm -INCLUDE = -I $(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -OBJS = nomad_plot.o +UNAME := $(shell uname) + +EXE = nomad_plot.exe +COMPILATOR = g++ +COMPILATOR_OPTIONS = -ansi -O2 + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi +endif + +LDLIBS = -lm -lnomad + + +INCLUDE = -I $(NOMAD_HOME)/src -I. +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c +OBJS = nomad_plot.o $(EXE): $(OBJS) - $(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) + $(ECHO_NOMAD) + @echo " building the scalar version ..." + @echo " exe file : "$(EXE) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(LIB_DIR)/$(LIB_NOMAD) $(EXE) +endif + -nomad_plot.o: nomad_plot.cpp $(L1) +nomad_plot.o: nomad_plot.cpp + $(ECHO_NOMAD) $(COMPILE) nomad_plot.cpp clean: diff --git a/examples/advanced/restart/makefile b/examples/advanced/restart/makefile index b85123a..a4770d4 100644 --- a/examples/advanced/restart/makefile +++ b/examples/advanced/restart/makefile @@ -1,25 +1,34 @@ -EXE = restart.exe + +UNAME := $(shell uname) + +EXE = restart.exe EXE_MPI = restart_MPI.exe -COMPILATOR = g++ -COMPILATOR_MPI = mpic++ -SUNAME = $(shell uname) -OSS=$(findstring MINGW32,$(SUNAME)) -ifneq "$(strip $(OSS))" "" -COMPILATOR_MPI = g++ +COMPILATOR = g++ +COMPILATOR_MPI = mpic++ + +COMPILATOR_OPTIONS = -g -O2 -ansi +COMPILATOR_OPTIONS_MPI = $(COMPILATOR_OPTIONS) -DUSE_MPI + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so +LIB_NOMAD_MPI = libnomad.MPI.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi endif +CXXFLAGS_MPI = $(CXXFLAGS) -DUSE_MPI + +LDLIBS = -lm -lnomad +LDLIBS_MPI = -lm -lmpi -lnomad.MPI -COMPILATOR_OPTIONS = -O2 -ansi -COMPILATOR_OPTIONS_MPI = $(COMPILATOR_OPTIONS) -DUSE_MPI -L1 = $(NOMAD_HOME)/lib/nomad.a -L1_MPI = $(NOMAD_HOME)/lib/nomad.MPI.a -LIBS = $(L1) -lm -LIBS_MPI = $(L1_MPI) -lm -lmpi -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c +INCLUDE = -I$(NOMAD_HOME)/src -I. +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c COMPILE_MPI = $(COMPILATOR_MPI) $(COMPILATOR_OPTIONS_MPI) $(INCLUDE) -c -OBJS = restart.o -OBJS_MPI = restart_MPI.o +OBJS = restart.o +OBJS_MPI = restart_MPI.o ifndef NOMAD_HOME @@ -30,19 +39,25 @@ endef endif -$(EXE): $(L1) $(OBJS) +$(EXE): $(OBJS) $(ECHO_NOMAD) @echo " building the scalar version ..." @echo " exe file : "$(EXE) - @$(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) - @strip $(EXE) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif + -$(EXE_MPI): $(L1_MPI) $(OBJS_MPI) +$(EXE_MPI): $(OBJS_MPI) $(ECHO_NOMAD) @echo " building the MPI version ..." @echo " exe file : "$(EXE_MPI) - @$(COMPILATOR_MPI) -o $(EXE_MPI) $(OBJS_MPI) $(LIBS_MPI) $(COMPILATOR_OPTIONS_MPI) - @strip $(EXE_MPI) + @$(COMPILATOR_MPI) -o $(EXE_MPI) $(OBJS_MPI) $(LDLIBS_MPI) $(CXXFLAGS_MPI) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD_MPI) $(NOMAD_HOME)/lib/$(LIB_NOMAD_MPI) $(EXE_MPI) +endif + restart.o: restart.cpp $(ECHO_NOMAD) @@ -52,9 +67,6 @@ restart_MPI.o: restart.cpp $(ECHO_NOMAD) @$(COMPILE_MPI) restart.cpp -o restart_MPI.o -$(L1) $(L1_MPI): ; - $(ECHO_NOMAD) - mpi: $(EXE_MPI) all: $(EXE) $(EXE_MPI) diff --git a/examples/advanced/restart/restart.cpp b/examples/advanced/restart/restart.cpp index e41b0dc..9c5c7b5 100644 --- a/examples/advanced/restart/restart.cpp +++ b/examples/advanced/restart/restart.cpp @@ -8,65 +8,70 @@ using namespace NOMAD; /*----------------------------------------*/ /* the problem */ /*----------------------------------------*/ -class My_Evaluator : public Evaluator { +class My_Evaluator : public Evaluator +{ private: - + + public: My_Evaluator ( const Parameters & p ) : Evaluator ( p ) { } - - ~My_Evaluator ( void ) {} - - virtual bool eval_x ( Eval_Point & x , - const Double & h_max , - bool & count_eval ) const; - - virtual void update_iteration ( success_type success , - const Stats & stats , - const Evaluator_Control & ev_control , - const Barrier & true_barrier , - const Barrier & sgte_barrier , - const Pareto_Front & pareto_front , - bool & stop ); + + ~My_Evaluator ( void ) { } + + + virtual bool eval_x ( Eval_Point & x , + const Double & h_max , + bool & count_eval ) const; + + virtual void update_iteration ( success_type success , + const Stats & stats , + const Evaluator_Control & ev_control , + const Barrier & true_barrier , + const Barrier & sgte_barrier , + const Pareto_Front & pareto_front , + bool & stop ); }; /*----------------------------------------*/ /* user-defined eval_x */ /*----------------------------------------*/ bool My_Evaluator::eval_x ( Eval_Point & x , - const Double & h_max , - bool & count_eval ) const + const Double & h_max , + bool & count_eval ) const { - Double c1 = 0.0 , c2 = 0.0; - for ( int i = 0 ; i < 5 ; i++ ) { - c1 += (x[i]-1).pow2(); - c2 += (x[i]+1).pow2(); - } - x.set_bb_output ( 0 , x[4] ); // objective value - x.set_bb_output ( 1 , c1-25 ); // constraint 1 - x.set_bb_output ( 2 , 25-c2 ); // constraint 2 - - count_eval = true; // count a black-box evaluation - - return true; // the evaluation succeeded + Double c1 = 0.0 , c2 = 0.0; + for ( int i = 0 ; i < 5 ; i++ ) + { + + c1 += (x[i]-1).pow2(); + c2 += (x[i]+1).pow2(); + } + x.set_bb_output ( 0 , x[4] ); // objective value + x.set_bb_output ( 1 , c1-25 ); // constraint 1 + x.set_bb_output ( 2 , 25-c2 ); // constraint 2 + + count_eval = true; // count a black-box evaluation + + return true; // the evaluation succeeded } /*----------------------------------------*/ /* updates at each iteration */ /*----------------------------------------*/ void My_Evaluator::update_iteration ( success_type success , - const Stats & stats , - const Evaluator_Control & ev_control , - const Barrier & true_barrier , - const Barrier & sgte_barrier , - const Pareto_Front & pareto_front , - bool & stop ) + const Stats & stats , + const Evaluator_Control & ev_control , + const Barrier & true_barrier , + const Barrier & sgte_barrier , + const Pareto_Front & pareto_front , + bool & stop ) { - if ( success == UNSUCCESSFUL ) - stop = true; + if ( success == UNSUCCESSFUL ) + stop = true; } /*------------------------------------------*/ @@ -74,112 +79,116 @@ void My_Evaluator::update_iteration ( success_type success , /*------------------------------------------*/ int main ( int argc , char ** argv ) { - // display: - Display out ( std::cout ); - out.precision ( DISPLAY_PRECISION_STD ); - - try { - - // NOMAD initializations: - begin ( argc , argv ); - - // parameters creation: - Parameters p ( out ); - - p.set_DIMENSION (5); // number of variables - - vector<bb_output_type> bbot (3); // definition of - bbot[0] = OBJ; // output types - bbot[1] = EB; - bbot[2] = EB; - p.set_BB_OUTPUT_TYPE ( bbot ); - - p.set_DISPLAY_DEGREE ( 2 ); - - p.set_DISPLAY_STATS ( "bbe ( sol ) obj" ); - - p.set_X0 ( Point ( 5 , 0.0 ) ); // starting point - - p.set_LOWER_BOUND ( Point ( 5 , -6.0 ) ); // all var. >= -6 - Point ub ( 5 ); // x_4 and x_5 have no bounds - ub[0] = 5.0; // x_1 <= 5 - ub[1] = 6.0; // x_2 <= 6 - ub[2] = 7.0; // x_3 <= 7 - p.set_UPPER_BOUND ( ub ); - - p.set_MAX_BB_EVAL (100); // the algorithm terminates after - // 100 black-box evaluations - - - - // parameters validation: - p.check(); - - OrthogonalMesh * oMesh=p.get_signature()->get_mesh(); - - // custom evaluator creation: - My_Evaluator ev ( p ); - - // best solutions: - const Point * bf = NULL , * bi = NULL; - - // algorithm creation: - Mads mads ( p , &ev ); - + // display: + Display out ( std::cout ); + out.precision ( DISPLAY_PRECISION_STD ); - // successive runs: - for ( int i = 0 ; i < 5 ; ++i ) - { - - out << endl << open_block ( "MADS run #" + NOMAD::itos(i) ); - - // not for the first run: - if ( i > 0 ) - { - - // new starting points: - p.reset_X0(); - if ( bf ) - p.set_X0 ( *bf ); - if ( bi ) - p.set_X0 ( *bi ); - - if (!bf && !bi) - p.set_LH_SEARCH(1,0); // at least one evaluation is conducted if point is bf and bi are null - else - p.set_LH_SEARCH(0,0); - - // Update the mesh for an unsuccessful iteration and put current - // mesh and poll sizes as initial mesh and poll sizes for the next start. - oMesh->update(UNSUCCESSFUL); - Point delta_0, Delta_0; - oMesh->get_delta(delta_0); - oMesh->set_delta_0(delta_0); - oMesh->get_Delta(Delta_0); - oMesh->set_Delta_0(Delta_0); - - // parameters validation: - p.check(); - - // reset the Mads object: - mads.reset ( true , true ); + try { + + // NOMAD initializations: + begin ( argc , argv ); + + // parameters creation: + Parameters p ( out ); + + p.set_DIMENSION (5); // number of variables + + vector<bb_output_type> bbot (3); // definition of + bbot[0] = OBJ; // output types + bbot[1] = EB; + bbot[2] = EB; + p.set_BB_OUTPUT_TYPE ( bbot ); + + p.set_DISPLAY_DEGREE ( 2 ); + + p.set_DISPLAY_STATS ( "bbe ( sol ) obj" ); + + p.set_X0 ( Point ( 5 , 0.0 ) ); // starting point + + p.set_LOWER_BOUND ( Point ( 5 , -6.0 ) ); // all var. >= -6 + Point ub ( 5 ); // x_4 and x_5 have no bounds + ub[0] = 5.0; // x_1 <= 5 + ub[1] = 6.0; // x_2 <= 6 + ub[2] = 7.0; // x_3 <= 7 + p.set_UPPER_BOUND ( ub ); + + + + p.set_MAX_BB_EVAL (100); // the algorithm terminates after + // 100 black-box evaluations + + // p.set_DISABLE_MODELS(); + + // parameters validation: + p.check(); + + OrthogonalMesh * oMesh=p.get_signature()->get_mesh(); + + // custom evaluator creation: + My_Evaluator ev ( p ); + + // best solutions: + const Point * bf = NULL , * bi = NULL; + + // algorithm creation: + Mads mads ( p , &ev ); + + + // successive runs: + for ( int i = 0 ; i < 6 ; ++i ) + { - } - - // the run: - mads.run(); - bf = mads.get_best_feasible(); - bi = mads.get_best_infeasible(); - - out.close_block(); + out << endl << open_block ( "MADS run #" + NOMAD::itos(i) ); + + // not for the first run: + if ( i > 0 ) + { + + // new starting points: + p.reset_X0(); + if ( bf ) + p.set_X0 ( *bf ); + if ( bi ) + p.set_X0 ( *bi ); + + if (!bf && !bi) + p.set_LH_SEARCH(1,0); // at least one evaluation is conducted if point is bf and bi are null + else + p.set_LH_SEARCH(0,0); + + // Update the mesh for an unsuccessful iteration and put current + // mesh and poll sizes as initial mesh and poll sizes for the next start. + oMesh->update(UNSUCCESSFUL); + Point delta_0, Delta_0; + oMesh->get_delta(delta_0); + oMesh->set_delta_0(delta_0); + oMesh->get_Delta(Delta_0); + oMesh->set_Delta_0(Delta_0); + + // parameters validation: + p.check(); + + // reset the Mads object: + mads.reset ( false , false ); + + } + + // the run: + mads.run(); + bf = mads.get_best_feasible(); + bi = mads.get_best_infeasible(); + + out.close_block(); + } } - } - catch ( exception & e ) { - cerr << "\nNOMAD has been interrupted (" << e.what() << ")\n\n"; - } - - Slave::stop_slaves ( out ); - end(); - - return EXIT_SUCCESS; + catch ( exception & e ) + { + + cerr << "\nNOMAD has been interrupted (" << e.what() << ")\n\n"; + } + + Slave::stop_slaves ( out ); + end(); + + return EXIT_SUCCESS; } diff --git a/examples/advanced/user_search/makefile b/examples/advanced/user_search/makefile index b84b77d..4632e59 100644 --- a/examples/advanced/user_search/makefile +++ b/examples/advanced/user_search/makefile @@ -1,25 +1,35 @@ -EXE = user_search.exe +UNAME := $(shell uname) + + +EXE = user_search.exe EXE_MPI = user_search_MPI.exe -COMPILATOR = g++ -COMPILATOR_MPI = mpic++ -SUNAME = $(shell uname) -OSS=$(findstring MINGW32,$(SUNAME)) -ifneq "$(strip $(OSS))" "" -COMPILATOR_MPI = g++ +COMPILATOR = g++ +COMPILATOR_MPI = mpic++ + +COMPILATOR_OPTIONS = -O2 -ansi +COMPILATOR_OPTIONS_MPI = $(COMPILATOR_OPTIONS) -DUSE_MPI + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so +LIB_NOMAD_MPI = libnomad.MPI.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi endif +CXXFLAGS_MPI = $(CXXFLAGS) -DUSE_MPI + +LDLIBS = -lm -lnomad +LDLIBS_MPI = -lm -lmpi -lnomad.MPI -COMPILATOR_OPTIONS = -O2 -ansi -COMPILATOR_OPTIONS_MPI = $(COMPILATOR_OPTIONS) -DUSE_MPI -L1 = $(NOMAD_HOME)/lib/nomad.a -L1_MPI = $(NOMAD_HOME)/lib/nomad.MPI.a -LIBS = $(L1) -lm -LIBS_MPI = $(L1_MPI) -lm -lmpi -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c +INCLUDE = -I$(NOMAD_HOME)/src -I. +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c COMPILE_MPI = $(COMPILATOR_MPI) $(COMPILATOR_OPTIONS_MPI) $(INCLUDE) -c -OBJS = user_search.o -OBJS_MPI = user_search_MPI.o + +OBJS = user_search.o +OBJS_MPI = user_search_MPI.o ifndef NOMAD_HOME @@ -30,19 +40,25 @@ endef endif -$(EXE): $(L1) $(OBJS) +$(EXE): $(OBJS) $(ECHO_NOMAD) @echo " building the scalar version ..." @echo " exe file : "$(EXE) - @$(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) - @strip $(EXE) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif + -$(EXE_MPI): $(L1_MPI) $(OBJS_MPI) +$(EXE_MPI): $(OBJS_MPI) $(ECHO_NOMAD) @echo " building the MPI version ..." @echo " exe file : "$(EXE_MPI) - @$(COMPILATOR_MPI) -o $(EXE_MPI) $(OBJS_MPI) $(LIBS_MPI) $(COMPILATOR_OPTIONS_MPI) - @strip $(EXE_MPI) + @$(COMPILATOR_MPI) -o $(EXE_MPI) $(OBJS_MPI) $(LDLIBS_MPI) $(CXXFLAGS_MPI) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD_MPI) $(NOMAD_HOME)/lib/$(LIB_NOMAD_MPI) $(EXE_MPI) +endif + user_search.o: user_search.cpp $(ECHO_NOMAD) @@ -52,9 +68,6 @@ user_search_MPI.o: user_search.cpp $(ECHO_NOMAD) @$(COMPILE_MPI) user_search.cpp -o user_search_MPI.o -$(L1) $(L1_MPI): ; - $(ECHO_NOMAD) - mpi: $(EXE_MPI) all: $(EXE) $(EXE_MPI) diff --git a/examples/basic/batch/bi_obj/runExample.log b/examples/basic/batch/bi_obj/runExample.log index 76994f3..f85624f 100644 --- a/examples/basic/batch/bi_obj/runExample.log +++ b/examples/basic/batch/bi_obj/runExample.log @@ -1,17 +1,19 @@ -NOMAD - version 3.7.2 - www.gerad.ca/nomad - -Copyright (C) 2001-2015 { - Mark A. Abramson - The Boeing Company +NOMAD - version 3.7.3 has been created by { Charles Audet - Ecole Polytechnique de Montreal - Gilles Couture - Ecole Polytechnique de Montreal - John E. Dennis, Jr. - Rice University Sebastien Le Digabel - Ecole Polytechnique de Montreal Christophe Tribes - Ecole Polytechnique de Montreal } -Funded in part by AFOSR and Exxon Mobil. +The copyright of NOMAD - version 3.7.3 is owned by { + Sebastien Le Digabel - Ecole Polytechnique de Montreal + Christophe Tribes - Ecole Polytechnique de Montreal +} + +NOMAD version 3 is a new version of Nomad v1 and v2, it has been funded by AFOSR and Exxon Mobil. +Nomad v1 and v2 were created and developed by Mark A. Abramson from The Boeing Company, Charles Audet and Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from Rice University, and were funded by AFOSR and Exxon Mobil. +Download : www.gerad.ca/nomad License : '$NOMAD_HOME/src/lgpl.txt' User guide: '$NOMAD_HOME/doc/user_guide.pdf' Examples : '$NOMAD_HOME/examples' @@ -21,21 +23,21 @@ Please report bugs to nomad@gerad.ca multi-MADS run { - MADS run 1 ...... OK [bb eval= 64] [overall bb eval= 64] [# dominant pts= 10] [# new pts= 10] [f1=0 f2=6.231313115] - MADS run 2 ...... OK [bb eval= 32] [overall bb eval= 96] [# dominant pts= 15] [# new pts= 5] [f1=0.8169729819 f2=-0.479260869] - MADS run 3 ...... OK [bb eval= 32] [overall bb eval= 128] [# dominant pts= 14] [# new pts= -1] [f1=0 f2=1] - MADS run 4 ...... OK [bb eval= 32] [overall bb eval= 160] [# dominant pts= 25] [# new pts= 11] [f1=0.5612660076 f2=0.1239843648] - MADS run 5 ...... OK [bb eval= 32] [overall bb eval= 192] [# dominant pts= 33] [# new pts= 8] [f1=0.3137786342 f2=0.5879263396] - MADS run 6 ...... OK [bb eval= 32] [overall bb eval= 224] [# dominant pts= 47] [# new pts= 14] [f1=0.7805127885 f2=-0.1507861609] - MADS run 7 ...... OK [bb eval= 32] [overall bb eval= 256] [# dominant pts= 54] [# new pts= 7] [f1=0.5299157655 f2=0.357255587] - MADS run 8 ...... OK [bb eval= 32] [overall bb eval= 288] [# dominant pts= 66] [# new pts= 12] [f1=0.07954951288 f2=0.9213144638] - MADS run 9 ...... OK [bb eval= 32] [overall bb eval= 320] [# dominant pts= 76] [# new pts= 10] [f1=0.2748325185 f2=0.7638619206] - MADS run 10 ...... OK [bb eval= 32] [overall bb eval= 352] [# dominant pts= 85] [# new pts= 9] [f1=0.5181766881 f2=0.5029223883] - MADS run 11 ...... OK [bb eval= 32] [overall bb eval= 384] [# dominant pts= 89] [# new pts= 4] [f1=0.7680831771 f2=0.07286356753] - MADS run 12 ...... OK [bb eval= 32] [overall bb eval= 416] [# dominant pts= 99] [# new pts= 10] [f1=0.5151038119 f2=0.5437967797] - MADS run 13 ...... OK [bb eval= 32] [overall bb eval= 448] [# dominant pts= 111] [# new pts= 12] [f1=0.2592955042 f2=0.8727383732] - MADS run 14 ...... OK [bb eval= 32] [overall bb eval= 480] [# dominant pts= 117] [# new pts= 6] [f1=0.5684216658 f2=0.1147587127] - MADS run 15 ...... OK [bb eval= 20] [overall bb eval= 500] [# dominant pts= 120] [# new pts= 3] [f1=0.5684216658 f2=0.1147587127] + MADS run 1 ...... OK [bb eval= 64] [overall bb eval= 64] [# dominant pts= 6] [# new pts= 6] [f1=0 f2=6.231313115] + MADS run 2 ...... OK [bb eval= 32] [overall bb eval= 96] [# dominant pts= 10] [# new pts= 4] [f1=0.8147632732 f2=-0.4772846994] + MADS run 3 ...... OK [bb eval= 32] [overall bb eval= 128] [# dominant pts= 14] [# new pts= 4] [f1=0 f2=1] + MADS run 4 ...... OK [bb eval= 32] [overall bb eval= 160] [# dominant pts= 23] [# new pts= 9] [f1=0.3158760328 f2=0.5854826675] + MADS run 5 ...... OK [bb eval= 32] [overall bb eval= 192] [# dominant pts= 31] [# new pts= 8] [f1=0.563132696 f2=0.1198200644] + MADS run 6 ...... OK [bb eval= 32] [overall bb eval= 224] [# dominant pts= 48] [# new pts= 17] [f1=0.5283988375 f2=0.3748699372] + MADS run 7 ...... OK [bb eval= 32] [overall bb eval= 256] [# dominant pts= 66] [# new pts= 18] [f1=0.7870555978 f2=-0.2509912401] + MADS run 8 ...... OK [bb eval= 32] [overall bb eval= 288] [# dominant pts= 80] [# new pts= 14] [f1=0.268022029 f2=0.8108740924] + MADS run 9 ...... OK [bb eval= 32] [overall bb eval= 320] [# dominant pts= 91] [# new pts= 11] [f1=0.5153477455 f2=0.5405240953] + MADS run 10 ...... OK [bb eval= 32] [overall bb eval= 352] [# dominant pts= 95] [# new pts= 4] [f1=0.7680831771 f2=0.07286356753] + MADS run 11 ...... OK [bb eval= 32] [overall bb eval= 384] [# dominant pts= 102] [# new pts= 7] [f1=0.5137077274 f2=0.5626056928] + MADS run 12 ...... OK [bb eval= 32] [overall bb eval= 416] [# dominant pts= 108] [# new pts= 6] [f1=0.567828327 f2=0.1148265921] + MADS run 13 ...... OK [bb eval= 32] [overall bb eval= 448] [# dominant pts= 115] [# new pts= 7] [f1=0.5682426473 f2=0.1147658278] + MADS run 14 ...... OK [bb eval= 32] [overall bb eval= 480] [# dominant pts= 121] [# new pts= 6] [f1=0.5685361243 f2=0.1147602185] + MADS run 15 ...... OK [bb eval= 20] [overall bb eval= 500] [# dominant pts= 125] [# new pts= 4] [f1=0.5685361243 f2=0.1147602185] } end of run (max number of bb evaluations) @@ -46,125 +48,130 @@ number of MADS runs : 15 Pareto front { BBE ( 0.0000000000 0.0000000000 ) 0.0000000000 1.0000000000 - BBE ( 0.0027621359 0.0000000000 ) 0.0027621359 0.9998007770 BBE ( 0.0088388348 0.0000000000 ) 0.0088388348 0.9979744889 - BBE ( 0.0132582521 0.0000000000 ) 0.0132582521 0.9954876562 - BBE ( 0.0353553391 0.0000000000 ) 0.0353553391 0.9713080680 - BBE ( 0.0441941738 0.0000000000 ) 0.0441941738 0.9584480584 - BBE ( 0.0574524260 0.0000000000 ) 0.0574524260 0.9397084727 - BBE ( 0.0618718434 0.0000000000 ) 0.0618718434 0.9343077419 + BBE ( 0.0154679608 0.0000000000 ) 0.0154679608 0.9938978580 + BBE ( 0.0176776695 0.0000000000 ) 0.0176776695 0.9920893658 + BBE ( 0.0211561362 0.0000000000 ) 0.0211561362 0.9888260567 + BBE ( 0.0530330086 0.0000000000 ) 0.0530330086 0.9456485587 BBE ( 0.0707106781 0.0000000000 ) 0.0707106781 0.9257895286 - BBE ( 0.0729203868 0.0000000000 ) 0.0729203868 0.9242486972 - BBE ( 0.0734728140 0.0000000000 ) 0.0734728140 0.9239051795 - BBE ( 0.0765111634 0.0000000000 ) 0.0765111634 0.9223298234 - BBE ( 0.0783065517 0.0000000000 ) 0.0783065517 0.9216597507 - BBE ( 0.0795495129 0.0000000000 ) 0.0795495129 0.9213144638 - BBE ( 0.0801709935 0.0000000000 ) 0.0801709935 0.9211790945 - BBE ( 0.0804989971 0.0000000000 ) 0.0804989971 0.9211178038 - BBE ( 0.0814830080 0.0000000000 ) 0.0814830080 0.9209765043 - BBE ( 0.0839689303 0.0000000000 ) 0.0839689303 0.9209099136 - BBE ( 0.2546689267 0.0000000000 ) 0.2546689267 0.9053286734 - BBE ( 0.2554285140 0.0000000000 ) 0.2554285140 0.9000152969 - BBE ( 0.2559809412 0.0000000000 ) 0.2559809412 0.8961400979 - BBE ( 0.2592955042 0.0000000000 ) 0.2592955042 0.8727383732 - BBE ( 0.2601241450 0.0002762136 ) 0.2601241450 0.8698079048 - BBE ( 0.2624029071 0.0011048543 ) 0.2624029071 0.8624679573 - BBE ( 0.2633006012 0.0008286408 ) 0.2633006012 0.8531427520 - BBE ( 0.2634387080 0.0001898968 ) 0.2634387080 0.8453357823 - BBE ( 0.2635077614 0.0000000000 ) 0.2635077614 0.8428146572 - BBE ( 0.2643364022 0.0000000000 ) 0.2643364022 0.8369299127 - BBE ( 0.2673747516 0.0000000000 ) 0.2673747516 0.8154302217 - BBE ( 0.2679271788 0.0000000000 ) 0.2679271788 0.8115410603 - BBE ( 0.2695844603 0.0000000000 ) 0.2695844603 0.7999251464 - BBE ( 0.2740038777 0.0022097087 ) 0.2740038777 0.7931862207 - BBE ( 0.2748325185 0.0000000000 ) 0.2748325185 0.7638619206 - BBE ( 0.2762135864 0.0002762136 ) 0.2762135864 0.7575848978 - BBE ( 0.2773184407 0.0000000000 ) 0.2773184407 0.7473019205 - BBE ( 0.2828427125 0.0000000000 ) 0.2828427125 0.7121565043 - BBE ( 0.2872621299 0.0000000000 ) 0.2872621299 0.6860941024 - BBE ( 0.2900242657 0.0000000000 ) 0.2900242657 0.6709156096 - BBE ( 0.2961009646 0.0000000000 ) 0.2961009646 0.6410185691 - BBE ( 0.3005203820 0.0000000000 ) 0.3005203820 0.6226855524 - BBE ( 0.3016252363 0.0000000000 ) 0.3016252363 0.6185926969 - BBE ( 0.3088067896 0.0000000000 ) 0.3088067896 0.5971609072 - BBE ( 0.3093592168 0.0000000000 ) 0.3093592168 0.5959009619 - BBE ( 0.3137786342 0.0000000000 ) 0.3137786342 0.5879263396 - BBE ( 0.3165407700 0.0000000000 ) 0.3165407700 0.5848920973 - BBE ( 0.3167479302 0.0000000000 ) 0.3167479302 0.5847262751 - BBE ( 0.3176456244 0.0000000000 ) 0.3176456244 0.5841081818 - BBE ( 0.3181980515 0.0000000000 ) 0.3181980515 0.5838092475 - BBE ( 0.3226174689 0.0000000000 ) 0.3226174689 0.5836743517 - BBE ( 0.5127214698 0.0000000000 ) 0.5127214698 0.5759653136 - BBE ( 0.5137572707 0.0002762136 ) 0.5137572707 0.5654252540 - BBE ( 0.5140334843 0.0000000000 ) 0.5140334843 0.5582055541 - BBE ( 0.5150347585 0.0000172633 ) 0.5150347585 0.5449424207 - BBE ( 0.5151038119 0.0000000000 ) 0.5151038119 0.5437967797 - BBE ( 0.5153886572 0.0000000000 ) 0.5153886572 0.5399756398 - BBE ( 0.5165194066 0.0000000000 ) 0.5165194066 0.5248681601 - BBE ( 0.5169337269 0.0000000000 ) 0.5169337269 0.5193587219 - BBE ( 0.5173135206 0.0000000000 ) 0.5173135206 0.5143215129 - BBE ( 0.5179004745 0.0002762136 ) 0.5179004745 0.5100634344 - BBE ( 0.5181076347 0.0000690534 ) 0.5181076347 0.5047074913 - BBE ( 0.5181766881 0.0000000000 ) 0.5181766881 0.5029223883 - BBE ( 0.5183147949 0.0000000000 ) 0.5183147949 0.5011051160 - BBE ( 0.5192124890 0.0000000000 ) 0.5192124890 0.4893395607 - BBE ( 0.5203173434 0.0002762136 ) 0.5203173434 0.4784843660 - BBE ( 0.5211459841 0.0010358009 ) 0.5211459841 0.4774378717 - BBE ( 0.5214912511 0.0000000000 ) 0.5214912511 0.4598694955 - BBE ( 0.5228723191 0.0000000000 ) 0.5228723191 0.4423168011 - BBE ( 0.5261868821 0.0000000000 ) 0.5261868821 0.4012836645 - BBE ( 0.5272917364 0.0000000000 ) 0.5272917364 0.3879862090 - BBE ( 0.5292252315 0.0000000000 ) 0.5292252315 0.3652213546 - BBE ( 0.5299157655 0.0000000000 ) 0.5299157655 0.3572555870 - BBE ( 0.5303300859 0.0000000000 ) 0.5303300859 0.3525194343 - BBE ( 0.5317111538 0.0000000000 ) 0.5317111538 0.3369744453 - BBE ( 0.5350257169 0.0000000000 ) 0.5350257169 0.3012827434 - BBE ( 0.5358543576 0.0000000000 ) 0.5358543576 0.2927387374 - BBE ( 0.5361305712 0.0000000000 ) 0.5361305712 0.2899259708 - BBE ( 0.5391689207 0.0000000000 ) 0.5391689207 0.2601947270 - BBE ( 0.5480077554 0.0000000000 ) 0.5480077554 0.1876299330 - BBE ( 0.5513223185 0.0000000000 ) 0.5513223185 0.1663336683 - BBE ( 0.5535320271 0.0000000000 ) 0.5535320271 0.1540707094 - BBE ( 0.5557417358 0.0000000000 ) 0.5557417358 0.1434067848 - BBE ( 0.5568465902 0.0000000000 ) 0.5568465902 0.1386867395 - BBE ( 0.5590562989 0.0000000000 ) 0.5590562989 0.1304923502 - BBE ( 0.5604373668 0.0000000000 ) 0.5604373668 0.1262254672 - BBE ( 0.5612660076 0.0000000000 ) 0.5612660076 0.1239843648 - BBE ( 0.5620687533 0.0000000000 ) 0.5620687533 0.1220429764 - BBE ( 0.5640022484 0.0000000000 ) 0.5640022484 0.1183011565 - BBE ( 0.5645805706 0.0000000000 ) 0.5645805706 0.1174398964 - BBE ( 0.5652020512 0.0000000000 ) 0.5652020512 0.1166473780 - BBE ( 0.5654092114 0.0000000000 ) 0.5654092114 0.1164138826 - BBE ( 0.5656854249 0.0000000000 ) 0.5656854249 0.1161264470 - BBE ( 0.5659616385 0.0000000000 ) 0.5659616385 0.1158663392 - BBE ( 0.5666866992 0.0000000000 ) 0.5666866992 0.1153137493 - BBE ( 0.5669024911 0.0000000000 ) 0.5669024911 0.1151857400 - BBE ( 0.5674462866 0.0000000000 ) 0.5674462866 0.1149374124 - BBE ( 0.5684216658 0.0000000000 ) 0.5684216658 0.1147587127 + BBE ( 0.2562138982 0.0000000000 ) 0.2562138982 0.8945033812 + BBE ( 0.2608404757 0.0000000000 ) 0.2608404758 0.8617719752 + BBE ( 0.2619453301 0.0000000000 ) 0.2619453301 0.8539197314 + BBE ( 0.2622905971 0.0000000000 ) 0.2622905971 0.8514653467 + BBE ( 0.2651217863 0.0003064244 ) 0.2651217863 0.8346375232 + BBE ( 0.2655361067 0.0000000000 ) 0.2655361067 0.8284226452 + BBE ( 0.2680220290 0.0000000000 ) 0.2680220290 0.8108740924 + BBE ( 0.2686435096 0.0000000000 ) 0.2686435096 0.8065101303 + BBE ( 0.2691268833 0.0000000000 ) 0.2691268833 0.8031238337 + BBE ( 0.2696793105 0.0000000000 ) 0.2696793105 0.7992629776 + BBE ( 0.2710603784 0.0003193720 ) 0.2710603784 0.7930864044 + BBE ( 0.2727867134 0.0000000000 ) 0.2727867134 0.7777651163 + BBE ( 0.2741677813 0.0000000000 ) 0.2741677813 0.7683544484 + BBE ( 0.2749964221 0.0002762136 ) 0.2749964221 0.7657285747 + BBE ( 0.2754797958 0.0000000000 ) 0.2754797958 0.7595122877 + BBE ( 0.2819017617 0.0000000000 ) 0.2819017617 0.7179584250 + BBE ( 0.2995794312 0.0000000000 ) 0.2995794312 0.6263296155 + BBE ( 0.3039988486 0.0000000000 ) 0.3039988486 0.6104981808 + BBE ( 0.3059323437 0.0000000000 ) 0.3059323437 0.6046312984 + BBE ( 0.3062085573 0.0000000000 ) 0.3062085573 0.6038477544 + BBE ( 0.3117328290 0.0000000000 ) 0.3117328290 0.5911477575 + BBE ( 0.3158760328 0.0000000000 ) 0.3158760328 0.5854826675 + BBE ( 0.3172571008 0.0000000000 ) 0.3172571008 0.5843556236 + BBE ( 0.3202954502 0.0000000000 ) 0.3202954502 0.5832430145 + BBE ( 0.5134487771 0.0000000000 ) 0.5134487771 0.5661080224 + BBE ( 0.5137077274 0.0000000000 ) 0.5137077274 0.5626056928 + BBE ( 0.5137940441 0.0000000000 ) 0.5137940441 0.5614391407 + BBE ( 0.5150715320 0.0000000000 ) 0.5150715320 0.5442301804 + BBE ( 0.5152786921 0.0000000000 ) 0.5152786921 0.5414500948 + BBE ( 0.5153477455 0.0000000000 ) 0.5153477455 0.5405240953 + BBE ( 0.5158224876 0.0003107403 ) 0.5158224876 0.5380991695 + BBE ( 0.5160987012 0.0005481113 ) 0.5160987012 0.5374102768 + BBE ( 0.5162799664 0.0000000000 ) 0.5162799664 0.5280587044 + BBE ( 0.5168841836 0.0000000000 ) 0.5168841836 0.5200167511 + BBE ( 0.5181098814 0.0000000000 ) 0.5181098814 0.5038021282 + BBE ( 0.5186623086 0.0000000000 ) 0.5186623086 0.4965407236 + BBE ( 0.5192147358 0.0000000000 ) 0.5192147358 0.4893102188 + BBE ( 0.5193183158 0.0000000000 ) 0.5193183158 0.4879580513 + BBE ( 0.5217006580 0.0000000000 ) 0.5217006580 0.4571922658 + BBE ( 0.5220804517 0.0000000000 ) 0.5220804517 0.4523508179 + BBE ( 0.5228055124 0.0000000000 ) 0.5228055124 0.4431601076 + BBE ( 0.5250152211 0.0000000000 ) 0.5250152211 0.4156003506 + BBE ( 0.5252914347 0.0000000000 ) 0.5252914347 0.4122059478 + BBE ( 0.5263962890 0.0000000000 ) 0.5263962890 0.3987478889 + BBE ( 0.5283988375 0.0000000000 ) 0.5283988375 0.3748699372 + BBE ( 0.5302632792 0.0000000000 ) 0.5302632792 0.3532808843 + BBE ( 0.5303323326 0.0000000000 ) 0.5303323326 0.3524938416 + BBE ( 0.5313681336 0.0007595874 ) 0.5313681336 0.3505244083 + BBE ( 0.5317134005 0.0002373711 ) 0.5317134005 0.3399926818 + BBE ( 0.5319205607 0.0000000000 ) 0.5319205607 0.3346507552 + BBE ( 0.5328873083 0.0000000000 ) 0.5328873083 0.3240405720 + BBE ( 0.5335087888 0.0002287394 ) 0.5335087888 0.3202607108 + BBE ( 0.5338540558 0.0000000000 ) 0.5338540558 0.3136280970 + BBE ( 0.5357875509 0.0000000000 ) 0.5357875509 0.2934217157 + BBE ( 0.5363399781 0.0000000000 ) 0.5363399781 0.2878054090 + BBE ( 0.5403105484 0.0000000000 ) 0.5403105484 0.2496195163 + BBE ( 0.5407593955 0.0000000000 ) 0.5407593955 0.2455543650 + BBE ( 0.5413118227 0.0000000000 ) 0.5413118227 0.2406240954 + BBE ( 0.5418642498 0.0000000000 ) 0.5418642498 0.2357753238 + BBE ( 0.5420196200 0.0000000000 ) 0.5420196200 0.2344264287 + BBE ( 0.5440739585 0.0005524272 ) 0.5440739585 0.2243656329 + BBE ( 0.5457312400 0.0000000000 ) 0.5457312400 0.2041983052 + BBE ( 0.5461455604 0.0000000000 ) 0.5461455604 0.2010684705 + BBE ( 0.5473885216 0.0000000000 ) 0.5473885216 0.1919834017 + BBE ( 0.5479409487 0.0000000000 ) 0.5479409487 0.1880940310 + BBE ( 0.5490458031 0.0000000000 ) 0.5490458031 0.1805936986 + BBE ( 0.5491493832 0.0000000000 ) 0.5491493832 0.1799097506 + BBE ( 0.5495982303 0.0000000000 ) 0.5495982303 0.1769843488 + BBE ( 0.5501506574 0.0000000000 ) 0.5501506574 0.1734699226 + BBE ( 0.5508584547 0.0000000000 ) 0.5508584547 0.1691070049 + BBE ( 0.5540176476 0.0000000000 ) 0.5540176476 0.1515886169 + BBE ( 0.5545700748 0.0000000000 ) 0.5545700748 0.1488595298 + BBE ( 0.5549843952 0.0000000000 ) 0.5549843952 0.1468790527 + BBE ( 0.5551225020 0.0000000000 ) 0.5551225020 0.1462315798 + BBE ( 0.5573322107 0.0000000000 ) 0.5573322107 0.1367428101 + BBE ( 0.5584370650 0.0000000000 ) 0.5584370650 0.1326198627 + BBE ( 0.5600943465 0.0000000000 ) 0.5600943465 0.1272233749 + BBE ( 0.5611992009 0.0000000000 ) 0.5611992009 0.1241561368 + BBE ( 0.5627183756 0.0000000000 ) 0.5627183756 0.1206381293 + BBE ( 0.5631326960 0.0000000000 ) 0.5631326960 0.1198200644 + BBE ( 0.5641167069 0.0000000000 ) 0.5641167069 0.1181212433 + BBE ( 0.5645137639 0.0000000000 ) 0.5645137639 0.1175332972 + BBE ( 0.5649453477 0.0000000000 ) 0.5649453477 0.1169580043 + BBE ( 0.5650661911 0.0000000000 ) 0.5650661911 0.1168088425 + BBE ( 0.5658948319 0.0000000000 ) 0.5658948319 0.1159267436 + BBE ( 0.5667234726 0.0000000000 ) 0.5667234726 0.1152907523 + BBE ( 0.5668615794 0.0000000000 ) 0.5668615794 0.1152087235 + BBE ( 0.5674140066 0.0000000000 ) 0.5674140066 0.1149491832 + BBE ( 0.5678283270 0.0000000000 ) 0.5678283270 0.1148265921 + BBE ( 0.5682426473 0.0000000000 ) 0.5682426473 0.1147658278 + BBE ( 0.5685361243 0.0000000000 ) 0.5685361243 0.1147602185 BBE ( 0.7661496820 0.0000000000 ) 0.7661496820 0.1105136967 - BBE ( 0.7669783228 0.0000000000 ) 0.7669783228 0.0943075051 BBE ( 0.7680831771 0.0000000000 ) 0.7680831771 0.0728635675 + BBE ( 0.7689118179 0.0000000000 ) 0.7689118179 0.0569125770 BBE ( 0.7691880314 0.0000000000 ) 0.7691880314 0.0516220389 - BBE ( 0.7694642450 0.0000000000 ) 0.7694642450 0.0463451418 - BBE ( 0.7704309926 0.0007941141 ) 0.7704309926 0.0406045540 + BBE ( 0.7699476188 0.0003841095 ) 0.7699476188 0.0432535935 BBE ( 0.7705690994 0.0000000000 ) 0.7705690994 0.0253788803 - BBE ( 0.7738836624 0.0000000000 ) 0.7738836624 -0.0360307769 - BBE ( 0.7741598760 0.0000000000 ) 0.7741598760 -0.0410385581 - BBE ( 0.7758171575 0.0000000000 ) 0.7758171575 -0.0706993622 - BBE ( 0.7760933711 0.0000000000 ) 0.7760933711 -0.0755763386 - BBE ( 0.7766457983 0.0000000000 ) 0.7766457983 -0.0852712175 - BBE ( 0.7771982255 0.0000000000 ) 0.7771982255 -0.0948858036 - BBE ( 0.7805127885 0.0000000000 ) 0.7805127885 -0.1507861609 - BBE ( 0.7816176428 0.0004488471 ) 0.7816176428 -0.1614780263 - BBE ( 0.7849322059 0.0000000000 ) 0.7849322059 -0.2200658533 - BBE ( 0.7854846330 0.0000000000 ) 0.7854846330 -0.2282658189 + BBE ( 0.7716739537 0.0000000000 ) 0.7716739537 0.0046504791 + BBE ( 0.7741598760 0.0002589502 ) 0.7741598760 -0.0369011145 + BBE ( 0.7783030798 0.0000000000 ) 0.7783030798 -0.1138668264 + BBE ( 0.7834820845 0.0000000000 ) 0.7834820845 -0.1980406893 + BBE ( 0.7841553552 0.0000000000 ) 0.7841553552 -0.2083556587 + BBE ( 0.7854673697 0.0005437955 ) 0.7854673697 -0.2192363858 + BBE ( 0.7858126367 0.0007250607 ) 0.7858126367 -0.2213881058 + BBE ( 0.7863650638 0.0007034815 ) 0.7863650638 -0.2297569563 + BBE ( 0.7864772756 0.0004822948 ) 0.7864772756 -0.2349368931 + BBE ( 0.7867103308 0.0000000000 ) 0.7867103308 -0.2460730547 + BBE ( 0.7870555978 0.0000000000 ) 0.7870555978 -0.2509912401 + BBE ( 0.7875864458 0.0002859242 ) 0.7875864458 -0.2538397470 BBE ( 0.7882467689 0.0000000000 ) 0.7882467689 -0.2676209257 - BBE ( 0.7937710406 0.0000000000 ) 0.7937710406 -0.3375181059 - BBE ( 0.7948758950 0.0000000000 ) 0.7948758950 -0.3499937714 - BBE ( 0.7970856037 0.0000000000 ) 0.7970856037 -0.3733607572 + BBE ( 0.7882985590 0.0000000000 ) 0.7882985590 -0.2683319140 + BBE ( 0.7895587834 0.0000000000 ) 0.7895587834 -0.2853173321 + BBE ( 0.7904564776 0.0000000000 ) 0.7904564776 -0.2970410590 + BBE ( 0.7926661863 0.0000000000 ) 0.7926661863 -0.3245272558 + BBE ( 0.7981904580 0.0000000000 ) 0.7981904580 -0.3842336561 BBE ( 0.8059244384 0.0000000000 ) 0.8059244384 -0.4444581650 - BBE ( 0.8103438558 0.0000000000 ) 0.8103438558 -0.4658115097 - BBE ( 0.8169729819 0.0000000000 ) 0.8169729819 -0.4792608690 + BBE ( 0.8147632732 0.0000000000 ) 0.8147632732 -0.4772846994 + BBE ( 0.8191826906 0.0000000000 ) 0.8191826906 -0.4787160837 } -number of Pareto points: 120 +number of Pareto points: 125 diff --git a/examples/basic/batch/single_obj/runExample.log b/examples/basic/batch/single_obj/runExample.log index 129534c..9311a4b 100644 --- a/examples/basic/batch/single_obj/runExample.log +++ b/examples/basic/batch/single_obj/runExample.log @@ -1,17 +1,19 @@ -NOMAD - version 3.7.2 - www.gerad.ca/nomad - -Copyright (C) 2001-2015 { - Mark A. Abramson - The Boeing Company +NOMAD - version 3.7.3 has been created by { Charles Audet - Ecole Polytechnique de Montreal - Gilles Couture - Ecole Polytechnique de Montreal - John E. Dennis, Jr. - Rice University Sebastien Le Digabel - Ecole Polytechnique de Montreal Christophe Tribes - Ecole Polytechnique de Montreal } -Funded in part by AFOSR and Exxon Mobil. +The copyright of NOMAD - version 3.7.3 is owned by { + Sebastien Le Digabel - Ecole Polytechnique de Montreal + Christophe Tribes - Ecole Polytechnique de Montreal +} + +NOMAD version 3 is a new version of Nomad v1 and v2, it has been funded by AFOSR and Exxon Mobil. +Nomad v1 and v2 were created and developed by Mark A. Abramson from The Boeing Company, Charles Audet and Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from Rice University, and were funded by AFOSR and Exxon Mobil. +Download : www.gerad.ca/nomad License : '$NOMAD_HOME/src/lgpl.txt' User guide: '$NOMAD_HOME/doc/user_guide.pdf' Examples : '$NOMAD_HOME/examples' @@ -28,16 +30,12 @@ MADS run { 3 ( 0.0000000000 2.1466252584 2.3255106966 -1.0733126292 1.0733126292 ) 1.0733100000 10 ( 0.4919349550 2.8174456516 2.1801662781 -0.8720665112 1.0062305899 ) 1.0062300000 11 ( 1.9677398202 4.8299068314 1.7441330224 -0.2683281573 0.8049844719 ) 0.8049840000 - 13 ( 0.0000000000 1.6099689438 2.9068883707 -0.8049844719 0.5366563146 ) 0.5366560000 - 17 ( 3.5241951349 1.7067494832 0.5813776741 -0.5366563146 0.2683281573 ) 0.2683280000 - 28 ( 2.0483902697 -2.5865010336 3.4882660449 1.8782971011 0.0000000000 ) 0.0000000000 - 67 ( 2.0483902697 1.7067494832 2.3255106966 -0.5366563146 -2.4149534157 ) -2.4149500000 - 86 ( 3.0322601798 0.6334368540 0.0000000000 2.6832815730 -2.9516097303 ) -2.9516100000 - 96 ( 1.5564553147 1.7067494832 -0.5813776741 1.6099689438 -3.4882660449 ) -3.4882700000 - 100 ( 1.5564553147 1.7067494832 -0.5813776741 1.6099689438 -3.4882660449 ) -3.4882700000 + 19 ( 0.9838699101 1.0733126292 1.7441330224 1.0733126292 -3.4882660449 ) -3.4882700000 + 31 ( 1.9677398202 0.5366563146 1.7441330224 0.2683281573 -3.7565942022 ) -3.7565900000 + 100 ( 1.9677398202 0.5366563146 1.7441330224 0.2683281573 -3.7565942022 ) -3.7565900000 } end of run (max number of blackbox evaluations) blackbox evaluations : 100 -best infeasible solution (min. violation): ( -0.9032194606 -0.4398757752 4.069643719 -0.2683281573 -1.878297101 ) h=0.0114496 f=-1.8783 -best feasible solution : ( 1.556455315 1.706749483 -0.5813776741 1.609968944 -3.488266045 ) h=0 f=-3.48827 +best infeasible solution (min. violation): ( 0.9838699101 1.073312629 1.162755348 1.073312629 -4.024922359 ) h=0.287344 f=-4.02492 +best feasible solution : ( 1.96773982 0.5366563146 1.744133022 0.2683281573 -3.756594202 ) h=0 f=-3.75659 diff --git a/examples/basic/batch/single_obj_parallel/bb_parallel.cpp b/examples/basic/batch/single_obj_parallel/bb_parallel.cpp index c17a350..71aba0e 100644 --- a/examples/basic/batch/single_obj_parallel/bb_parallel.cpp +++ b/examples/basic/batch/single_obj_parallel/bb_parallel.cpp @@ -8,106 +8,117 @@ using namespace std; -// Number of threads to be used in parallel -#define NUM_THREADS 4 +// Number of threads to be used in parallel +#define NUM_THREADS 4 + +// A semaphore to manage the threads +sem_t mySemaphore; static void * eval_x ( void * dummy_eval_arg ) { - - double c1 = 0.0 , c2 = 0.0 ,f; - double * x = static_cast<double *>(dummy_eval_arg); - for ( int i = 0 ; i < 5 ; i++) - { - c1 += pow ( x[i]-1 , 2 ); - c2 += pow ( x[i]+1 , 2 ); + + double c1 = 0.0 , c2 = 0.0 ,f; + double * x = static_cast<double *>(dummy_eval_arg); + for ( int i = 0 ; i < 5 ; i++) + { + c1 += pow ( x[i]-1 , 2 ); + c2 += pow ( x[i]+1 , 2 ); } x[5]= x[4]; x[6] = c1 - 25; x[7] = 25 - c2; - - // cout << x[0] << " " << x[1] <<" " << x[2] <<" "<< x[3] <<" "<< x[4] << " " << x[5] << " " << x[6] << " " << x[7] << endl; - - pthread_exit(NULL); - + + // cout << x[0] << " " << x[1] <<" " << x[2] <<" "<< x[3] <<" "<< x[4] << " " << x[5] << " " << x[6] << " " << x[7] << endl; + + pthread_exit(NULL); + + // Increase the semaphore ---> a new thread can be launched + sem_post(&mySemaphore); + } int main ( int argc , char ** argv ) - { - - double f = 1e20, c1 = 1e20 , c2 = 1e20; - std::vector< double * > X; - - if ( argc >= 2 ) - { +{ - ifstream in ( argv[1] ); - - while( ! in.eof() ) + double f = 1e20, c1 = 1e20 , c2 = 1e20; + std::vector< double * > X; + + if ( argc >= 2 ) { - double *x = new double [8]; - for ( int i = 0 ; i < 5 ; i++ ) - in >> x[i]; + + ifstream in ( argv[1] ); + + while( ! in.eof() ) + { + double *x = new double [8]; + for ( int i = 0 ; i < 5 ; i++ ) + in >> x[i]; + + X.push_back(x); + + //char c; + // in >> c; + + // cout << x[0] << " " << x[1] <<endl; + + } + in.close(); + X.pop_back(); + + int nb_pts=X.size(); + + // All threads are created + pthread_t threads[nb_pts]; + + // Initialize the semaphore with the number of threads available + sem_init(&mySemaphore,0,NUM_THREADS); + + // Another way to use semaphore + // sem_t * mySemaphore; + // mySemaphore=sem_open("sem",0,NUM_THREADS); + + + // The list of points is evaluated under the control of a semaphore + int i=0; + for (std::vector< double * >::iterator it_x=X.begin(); it_x!=X.end(); ++it_x,++i) + { + // cout << (*it_x)[0] << " " << (*it_x)[1] << " " << (*it_x)[2] << endl; + int rc=pthread_create(&threads[i], NULL, eval_x,(*it_x)); + if (rc) + { + cout << "Error:unable to create thread," << rc << endl; + return false; + } + // wait until value of semaphore is greater than 0 + // and decrement the value of semaphore by 1 + sem_wait(&mySemaphore); + + } + + int ret; + + // cout << nb_pts << endl; + for (i=0; i<nb_pts; ++i) + { + // Wait for all the threads to finish + ret=pthread_join(threads[i],0); + if (ret!=0) + { + perror("pthread join has failed"); + return false; + } + cout << (X[i])[5] << " " << (X[i])[6] << " " << (X[i])[7] << endl; + delete [](X[i]); + } + // Unlink semaphore if the "other" way is used + // sem_unlink("sem"); + + sem_destroy(&mySemaphore); + + } + + return 0; - X.push_back(x); - - //char c; - // in >> c; - - // cout << x[0] << " " << x[1] <<endl; - - } - in.close(); - X.pop_back(); - - int nb_pts=X.size(); - - // All threads are created - pthread_t threads[nb_pts]; - - // The semaphore will allow to run NUM_THREADS in parallel - sem_t *mySemaphore; - mySemaphore=sem_open("sem",0,NUM_THREADS); - - // The list of points is evaluated under the control of a semaphore - int i=0; - for (std::vector< double * >::iterator it_x=X.begin(); it_x!=X.end(); ++it_x,++i) - { - // cout << (*it_x)[0] << " " << (*it_x)[1] << " " << (*it_x)[2] << endl; - int rc=pthread_create(&threads[i], NULL, eval_x,(*it_x)); - if (rc) - { - cout << "Error:unable to create thread," << rc << endl; - return false; - } - // wait until value of semaphore is greater than 0 - // decrement the value of semaphore by 1 - sem_wait(mySemaphore); - - } - - int ret; - - // cout << nb_pts << endl; - for (i=0; i<nb_pts; ++i) - { - // Wait for all the threads to finish - ret=pthread_join(threads[i],0); - if (ret!=0) - { - perror("pthread join has failed"); - return false; - } - cout << (X[i])[5] << " " << (X[i])[6] << " " << (X[i])[7] << endl; - delete [](X[i]); - } - - sem_unlink("sem"); - - - } - - return 0; - } diff --git a/examples/basic/batch/single_obj_parallel/param.txt b/examples/basic/batch/single_obj_parallel/param.txt index bd84342..237325e 100644 --- a/examples/basic/batch/single_obj_parallel/param.txt +++ b/examples/basic/batch/single_obj_parallel/param.txt @@ -2,6 +2,7 @@ DIMENSION 5 # number of variables BB_EXE "$perl parallel_BBWrapper.pl" # BB_EXE bb_parallel.exe + BB_MAX_BLOCK_SIZE 2 BB_OUTPUT_TYPE OBJ PB EB diff --git a/examples/basic/batch/single_obj_parallel/runExample.log b/examples/basic/batch/single_obj_parallel/runExample.log index 2cad690..fb033a1 100644 --- a/examples/basic/batch/single_obj_parallel/runExample.log +++ b/examples/basic/batch/single_obj_parallel/runExample.log @@ -2,19 +2,21 @@ Warning: { The maximum number of evaluations may be exceeded when BB_MAX_BLOCK_SIZE>1. } -NOMAD - version 3.7.2 - www.gerad.ca/nomad - -Copyright (C) 2001-2015 { - Mark A. Abramson - The Boeing Company +NOMAD - version 3.7.3 has been created by { Charles Audet - Ecole Polytechnique de Montreal - Gilles Couture - Ecole Polytechnique de Montreal - John E. Dennis, Jr. - Rice University Sebastien Le Digabel - Ecole Polytechnique de Montreal Christophe Tribes - Ecole Polytechnique de Montreal } -Funded in part by AFOSR and Exxon Mobil. +The copyright of NOMAD - version 3.7.3 is owned by { + Sebastien Le Digabel - Ecole Polytechnique de Montreal + Christophe Tribes - Ecole Polytechnique de Montreal +} + +NOMAD version 3 is a new version of Nomad v1 and v2, it has been funded by AFOSR and Exxon Mobil. +Nomad v1 and v2 were created and developed by Mark A. Abramson from The Boeing Company, Charles Audet and Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from Rice University, and were funded by AFOSR and Exxon Mobil. +Download : www.gerad.ca/nomad License : '$NOMAD_HOME/src/lgpl.txt' User guide: '$NOMAD_HOME/doc/user_guide.pdf' Examples : '$NOMAD_HOME/examples' @@ -31,13 +33,13 @@ MADS run { 4 0.0000000000 (PhaseOne) 4 -1.0733100000 10 -1.6099700000 - 23 -2.4149500000 - 26 -3.4882700000 - 48 -3.7565900000 - 101 -3.7565900000 + 15 -3.4882700000 + 45 -3.7565900000 + 79 -3.9578400000 + 100 -3.9578400000 } end of run (max number of blackbox evaluations) -blackbox evaluations : 101 -best infeasible solution (min. violation): ( 1.106853649 0.9391485505 1.01741093 1.00623059 -4.024922359 ) h=0.265307 f=-4.02492 -best feasible solution : ( 0.9838699101 0.5366563146 1.744133022 1.341640786 -3.756594202 ) h=0 f=-3.75659 +blackbox evaluations : 100 +best infeasible solution (min. violation): ( 0.9838699101 1.609968944 1.01741093 0.5366563146 -3.95784032 ) h=0.167493 f=-3.95784 +best feasible solution : ( 0.9531239754 1.475804865 0.9447387205 0.6037383539 -3.95784032 ) h=0 f=-3.95784 diff --git a/examples/basic/library/bi_obj/makefile b/examples/basic/library/bi_obj/makefile index 582714a..8a2cbcb 100644 --- a/examples/basic/library/bi_obj/makefile +++ b/examples/basic/library/bi_obj/makefile @@ -1,25 +1,37 @@ -EXE = basic_lib.exe -EXE_MPI = basic_lib_MPI.exe - -COMPILATOR = g++ -COMPILATOR_MPI = mpic++ -SUNAME = $(shell uname) -OSS=$(findstring MINGW32,$(SUNAME)) -ifneq "$(strip $(OSS))" "" -COMPILATOR_MPI = g++ -endif +UNAME := $(shell uname) + +EXE = basic_lib.exe +EXE_MPI = basic_lib_MPI.exe -COMPILATOR_OPTIONS = -O2 -ansi +COMPILATOR = g++ +COMPILATOR_MPI = mpic++ + +COMPILATOR_OPTIONS = -O2 -ansi COMPILATOR_OPTIONS_MPI = $(COMPILATOR_OPTIONS) -DUSE_MPI -L1 = $(NOMAD_HOME)/lib/nomad.a -L1_MPI = $(NOMAD_HOME)/lib/nomad.MPI.a -LIBS = $(L1) -lm -LIBS_MPI = $(L1_MPI) -lm -lmpi -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -COMPILE_MPI = $(COMPILATOR_MPI) $(COMPILATOR_OPTIONS_MPI) $(INCLUDE) -c -OBJS = basic_lib.o -OBJS_MPI = basic_lib_MPI.o + + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so +LIB_NOMAD_MPI = libnomad.MPI.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi +endif +CXXFLAGS_MPI = $(CXXFLAGS) -DUSE_MPI + + +LDLIBS = -lm -lnomad +LDLIBS_MPI = -lm -lmpi -lnomad.MPI + +INCLUDE = -I$(NOMAD_HOME)/src -I. + +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c +COMPILE_MPI = $(COMPILATOR_MPI) $(COMPILATOR_OPTIONS_MPI) $(INCLUDE) -c + +OBJS = basic_lib.o +OBJS_MPI = basic_lib_MPI.o ifndef NOMAD_HOME @@ -30,19 +42,23 @@ endef endif -$(EXE): $(L1) $(OBJS) +$(EXE): $(OBJS) $(ECHO_NOMAD) @echo " building the scalar version ..." @echo " exe file : "$(EXE) - @$(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) - @strip $(EXE) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif -$(EXE_MPI): $(L1_MPI) $(OBJS_MPI) +$(EXE_MPI): $(OBJS_MPI) $(ECHO_NOMAD) @echo " building the MPI version ..." @echo " exe file : "$(EXE_MPI) - @$(COMPILATOR_MPI) -o $(EXE_MPI) $(OBJS_MPI) $(LIBS_MPI) $(COMPILATOR_OPTIONS_MPI) - @strip $(EXE_MPI) + @$(COMPILATOR_MPI) -o $(EXE_MPI) $(OBJS_MPI) $(LDLIBS_MPI) $(CXXFLAGS_MPI) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD_MPI) $(NOMAD_HOME)/lib/$(LIB_NOMAD_MPI) $(EXE_MPI) +endif basic_lib.o: basic_lib.cpp $(ECHO_NOMAD) @@ -52,8 +68,6 @@ basic_lib_MPI.o: basic_lib.cpp $(ECHO_NOMAD) @$(COMPILE_MPI) basic_lib.cpp -o basic_lib_MPI.o -$(L1) $(L1_MPI): ; - $(ECHO_NOMAD) mpi: $(EXE_MPI) diff --git a/examples/basic/library/bi_obj/runExample.log b/examples/basic/library/bi_obj/runExample.log index 368fa2e..a35b120 100644 --- a/examples/basic/library/bi_obj/runExample.log +++ b/examples/basic/library/bi_obj/runExample.log @@ -2,9 +2,9 @@ multi-MADS run { MADS run 1 ...... OK [bb eval= 46] [overall bb eval= 46] [# dominant pts= 3] [# new pts= 3] [f1=-6 f2=152.5555363] - MADS run 2 ...... OK [bb eval= 23] [overall bb eval= 69] [# dominant pts= 6] [# new pts= 3] [f1=-1.170093169 f2=-7.948136425] - MADS run 3 ...... OK [bb eval= 23] [overall bb eval= 92] [# dominant pts= 8] [# new pts= 2] [f1=-6 f2=27.18734544] - MADS run 4 ...... OK [bb eval= 8] [overall bb eval= 100] [# dominant pts= 9] [# new pts= 1] [f1=-4.390031056 f2=12.07995483] + MADS run 2 ...... OK [bb eval= 23] [overall bb eval= 69] [# dominant pts= 5] [# new pts= 2] [f1=-0.5603796086 f2=-9.723737785] + MADS run 3 ...... OK [bb eval= 23] [overall bb eval= 92] [# dominant pts= 8] [# new pts= 3] [f1=-5.121958283 f2=23.04985828] + MADS run 4 ...... OK [bb eval= 8] [overall bb eval= 100] [# dominant pts= 10] [# new pts= 2] [f1=-3.780317496 f2=7.348181107] } end of run (max number of bb evaluations) @@ -14,15 +14,16 @@ number of MADS runs : 4 Pareto front { - -6.0000000000 27.1873454385 - -5.4633436854 20.4877802253 - -4.9266873708 17.7107260310 - -4.3900310562 12.0799548321 - -4.1217028989 4.6477802253 - -3.8533747416 1.3742832861 - -3.5850465843 -0.2031008969 - -3.3167184270 -3.6003194012 - -1.1700931686 -7.9481364246 + -6.0000000000 43.0227873016 + -5.9269427546 35.4890842852 + -5.3902864400 34.8873088235 + -5.1219582827 23.0498582755 + -4.5853019681 22.3745620084 + -3.7803174962 7.3481811074 + -2.7070048670 -2.5579608209 + -2.4386767097 -3.2681325630 + -0.8287077659 -4.2758679628 + -0.5603796086 -9.7237377852 } -number of Pareto points: 9 +number of Pareto points: 10 diff --git a/examples/basic/library/single_obj/basic_lib.cpp b/examples/basic/library/single_obj/basic_lib.cpp index ea99384..94b28b3 100644 --- a/examples/basic/library/single_obj/basic_lib.cpp +++ b/examples/basic/library/single_obj/basic_lib.cpp @@ -32,8 +32,11 @@ public: count_eval = true; // count a black-box evaluation + //if ( c1-25 < 0 && 25-c2 < 0 && x[4] < -3.2 ) + // NOMAD::Evaluator::force_quit(); + return true; // the evaluation succeeded - } +} }; @@ -75,7 +78,8 @@ int main ( int argc , char ** argv ) { ub[2] = 7.0; // x_3 <= 7 p.set_UPPER_BOUND ( ub ); - p.set_MAX_BB_EVAL (100); // the algorithm terminates after + p.set_LIMIT_MESH_INDEX( -1 ); + //p.set_MAX_BB_EVAL (10000); // the algorithm terminates after // 100 black-box evaluations p.set_DISPLAY_DEGREE(2); p.set_SOLUTION_FILE("sol.txt"); diff --git a/examples/basic/library/single_obj/makefile b/examples/basic/library/single_obj/makefile index 582714a..8a2cbcb 100644 --- a/examples/basic/library/single_obj/makefile +++ b/examples/basic/library/single_obj/makefile @@ -1,25 +1,37 @@ -EXE = basic_lib.exe -EXE_MPI = basic_lib_MPI.exe - -COMPILATOR = g++ -COMPILATOR_MPI = mpic++ -SUNAME = $(shell uname) -OSS=$(findstring MINGW32,$(SUNAME)) -ifneq "$(strip $(OSS))" "" -COMPILATOR_MPI = g++ -endif +UNAME := $(shell uname) + +EXE = basic_lib.exe +EXE_MPI = basic_lib_MPI.exe -COMPILATOR_OPTIONS = -O2 -ansi +COMPILATOR = g++ +COMPILATOR_MPI = mpic++ + +COMPILATOR_OPTIONS = -O2 -ansi COMPILATOR_OPTIONS_MPI = $(COMPILATOR_OPTIONS) -DUSE_MPI -L1 = $(NOMAD_HOME)/lib/nomad.a -L1_MPI = $(NOMAD_HOME)/lib/nomad.MPI.a -LIBS = $(L1) -lm -LIBS_MPI = $(L1_MPI) -lm -lmpi -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -COMPILE_MPI = $(COMPILATOR_MPI) $(COMPILATOR_OPTIONS_MPI) $(INCLUDE) -c -OBJS = basic_lib.o -OBJS_MPI = basic_lib_MPI.o + + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so +LIB_NOMAD_MPI = libnomad.MPI.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi +endif +CXXFLAGS_MPI = $(CXXFLAGS) -DUSE_MPI + + +LDLIBS = -lm -lnomad +LDLIBS_MPI = -lm -lmpi -lnomad.MPI + +INCLUDE = -I$(NOMAD_HOME)/src -I. + +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c +COMPILE_MPI = $(COMPILATOR_MPI) $(COMPILATOR_OPTIONS_MPI) $(INCLUDE) -c + +OBJS = basic_lib.o +OBJS_MPI = basic_lib_MPI.o ifndef NOMAD_HOME @@ -30,19 +42,23 @@ endef endif -$(EXE): $(L1) $(OBJS) +$(EXE): $(OBJS) $(ECHO_NOMAD) @echo " building the scalar version ..." @echo " exe file : "$(EXE) - @$(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) - @strip $(EXE) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif -$(EXE_MPI): $(L1_MPI) $(OBJS_MPI) +$(EXE_MPI): $(OBJS_MPI) $(ECHO_NOMAD) @echo " building the MPI version ..." @echo " exe file : "$(EXE_MPI) - @$(COMPILATOR_MPI) -o $(EXE_MPI) $(OBJS_MPI) $(LIBS_MPI) $(COMPILATOR_OPTIONS_MPI) - @strip $(EXE_MPI) + @$(COMPILATOR_MPI) -o $(EXE_MPI) $(OBJS_MPI) $(LDLIBS_MPI) $(CXXFLAGS_MPI) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD_MPI) $(NOMAD_HOME)/lib/$(LIB_NOMAD_MPI) $(EXE_MPI) +endif basic_lib.o: basic_lib.cpp $(ECHO_NOMAD) @@ -52,8 +68,6 @@ basic_lib_MPI.o: basic_lib.cpp $(ECHO_NOMAD) @$(COMPILE_MPI) basic_lib.cpp -o basic_lib_MPI.o -$(L1) $(L1_MPI): ; - $(ECHO_NOMAD) mpi: $(EXE_MPI) diff --git a/examples/basic/library/single_obj/runExample.log b/examples/basic/library/single_obj/runExample.log index 062f2c3..e10eb49 100644 --- a/examples/basic/library/single_obj/runExample.log +++ b/examples/basic/library/single_obj/runExample.log @@ -6,17 +6,15 @@ MADS run { 2 ( 0.0000000000 0.5366563146 0.5813776741 -0.2683281573 0.2683281573 ) 288.7937255854 (PhaseOne) 3 ( 0.0000000000 2.1466252584 2.3255106966 -1.0733126292 1.0733126292 ) 0.0000000000 (PhaseOne) 3 ( 0.0000000000 2.1466252584 2.3255106966 -1.0733126292 1.0733126292 ) 1.0733126292 - 11 ( 0.1229837388 2.5491174943 2.6161995337 -1.0733126292 0.8720665112 ) 0.8720665112 - 12 ( 0.4919349550 3.7565942022 3.4882660449 -1.0733126292 0.2683281573 ) 0.2683281573 - 21 ( 0.4919349550 4.2932505168 4.0696437190 -0.2683281573 -0.2683281573 ) -0.2683281573 - 23 ( 1.9677398202 1.6099689438 3.4882660449 -0.8049844719 -1.3416407865 ) -1.3416407865 - 38 ( 1.4758048651 3.2199378876 -0.5813776741 -0.2683281573 -2.9516097303 ) -2.9516097303 - 56 ( 1.9677398202 1.0733126292 1.7441330224 0.5366563146 -3.7565942022 ) -3.7565942022 - 85 ( 1.4758048651 0.9391485505 1.1627553483 0.8049844719 -3.8907582808 ) -3.8907582808 - 100 ( 1.4758048651 0.9391485505 1.1627553483 0.8049844719 -3.8907582808 ) -3.8907582808 + 10 ( -0.1229837388 2.0124611797 2.9068883707 -1.1403946685 1.0062305899 ) 1.0062305899 + 11 ( -0.4919349550 1.6099689438 4.6510213932 -1.3416407865 0.8049844719 ) 0.8049844719 + 13 ( 0.0000000000 0.5366563146 5.2323990673 -0.5366563146 0.5366563146 ) 0.5366563146 + 28 ( 2.9516097303 2.6832815730 4.6510213932 0.5366563146 -1.0733126292 ) -1.0733126292 + 32 ( 0.4919349550 2.1466252584 1.1627553483 0.2683281573 -3.7565942022 ) -3.7565942022 + 100 ( 0.4919349550 2.1466252584 1.1627553483 0.2683281573 -3.7565942022 ) -3.7565942022 } end of run (max number of blackbox evaluations) blackbox evaluations : 100 -best infeasible solution (min. violation): ( 3.443544685 2.683281573 1.744133022 0.8049844719 -2.95160973 ) h=0.0113319552 f=-2.95160973 -best feasible solution : ( 1.475804865 0.9391485505 1.162755348 0.8049844719 -3.890758281 ) h=0 f=-3.890758281 +best infeasible solution (min. violation): ( 2.459674775 0.5366563146 1.162755348 1.073312629 -3.756594202 ) h=0.0023902697 f=-3.756594202 +best feasible solution : ( 0.491934955 2.146625258 1.162755348 0.2683281573 -3.756594202 ) h=0 f=-3.756594202 diff --git a/examples/basic/library/single_obj_parallel/basic_lib.cpp b/examples/basic/library/single_obj_parallel/basic_lib.cpp index 408e841..e67457e 100644 --- a/examples/basic/library/single_obj_parallel/basic_lib.cpp +++ b/examples/basic/library/single_obj_parallel/basic_lib.cpp @@ -8,196 +8,202 @@ using namespace std; // using namespace NOMAD; avoids putting NOMAD:: everywhere -// Number of threads to be used in parallel -#define NUM_THREADS 4 +// Number of threads to be used in parallel +#define NUM_THREADS 4 -// A semaphore to manage parallel evaluations with NUM_THREADS -sem_t *mySemaphore; +// A semaphore to manage the number of threads to be run concurrently +sem_t mySemaphore; // A structure to pass arguments to the evaluation wrapper function class My_Evaluator; typedef struct Arg_Eval_tag { - NOMAD::Eval_Point * x ; - NOMAD::Double h_max; - bool * count_eval; - const My_Evaluator * ev; + NOMAD::Eval_Point * x ; + NOMAD::Double h_max; + bool * count_eval; } Arg_Eval_t; +/*----------------------------------------*/ +/* The problem evaluatiom */ +/*----------------------------------------*/ +// Provide the objective and constraints here +bool eval_x ( NOMAD::Eval_Point & x , + const NOMAD::Double & h_max , + bool & count_eval ) +{ + + NOMAD::Double c1 = 0.0 , c2 = 0.0; + for ( int i = 0 ; i < 5 ; i++ ) + { + c1 += (x[i]-1).pow2(); + c2 += (x[i]+1).pow2(); + } + x.set_bb_output ( 0 , x[4] ); // objective value + x.set_bb_output ( 1 , c1-25 ); // constraint 1 + x.set_bb_output ( 2 , 25-c2 ); // constraint 2 + + count_eval = true; // count a black-box evaluation + + return true; // the evaluation succeeded +} -class My_Evaluator : public NOMAD::Evaluator { -public: - My_Evaluator ( const NOMAD::Parameters & p ) : - NOMAD::Evaluator ( p ) {} - - ~My_Evaluator ( void ) {} - - /*----------------------------------------*/ - /* The problem evaluatiom */ - /*----------------------------------------*/ - // Provide the objective and constraints here - bool eval_x ( NOMAD::Eval_Point & x , - const NOMAD::Double & h_max , - bool & count_eval ) const - { - - NOMAD::Double c1 = 0.0 , c2 = 0.0; - for ( int i = 0 ; i < 5 ; i++ ) - { - c1 += (x[i]-1).pow2(); - c2 += (x[i]+1).pow2(); - } - x.set_bb_output ( 0 , x[4] ); // objective value - x.set_bb_output ( 1 , c1-25 ); // constraint 1 - x.set_bb_output ( 2 , 25-c2 ); // constraint 2 - - count_eval = true; // count a black-box evaluation - - return true; // the evaluation succeeded - } - - // Wrapper of eval_x used for parallel evaluation (pthreads). - static void * wrapper_eval_x ( void * dummy_eval_arg ) - { - - Arg_Eval_t * eval_arg = static_cast<Arg_Eval_t *>(dummy_eval_arg); - - NOMAD::Eval_Point & x=*(eval_arg->x); - bool & count_eval = *(eval_arg->count_eval); - const NOMAD::Double & h_max = (eval_arg->h_max); - const My_Evaluator *ev=(eval_arg->ev); - - ev->eval_x(x,h_max,count_eval); - - pthread_exit(NULL); - - } - - // Implementation - bool eval_x ( std::list<NOMAD::Eval_Point *> &list_x , - const NOMAD::Double & h_max, - std::list<bool> & list_count_eval ) const - { - int rc; - +// Wrapper of eval_x used for parallel evaluation (pthreads). +static void * wrapper_eval_x ( void * dummy_eval_arg ) +{ + + Arg_Eval_t * eval_arg = static_cast<Arg_Eval_t *>(dummy_eval_arg); + + NOMAD::Eval_Point & x=*(eval_arg->x); + bool & count_eval = *(eval_arg->count_eval); + const NOMAD::Double & h_max = (eval_arg->h_max); + + eval_x(x,h_max,count_eval); + + pthread_exit(NULL); + + // The semaphore is incremented. Another thread can be started + sem_post(&mySemaphore); + +} - - list_count_eval.assign(list_count_eval.size(),false); // Evaluations are not counted until eval_x is called and set count_eval - - // All threads are created - pthread_t threads[list_x.size()]; - - // The semaphore will allow to run NUM_THREADS in parallel - mySemaphore=sem_open("sem",0,NUM_THREADS); - - // Arguments passed to the evaluation wrapper - Arg_Eval_t * eval_arg=new Arg_Eval_t[list_x.size()]; - std::list<NOMAD::Eval_Point *>::iterator it_x=list_x.begin(),end_x=list_x.end(); - std::list<bool>::iterator it_count=list_count_eval.begin(); - int i=0; - // The list of points is evaluated under the control of a semaphore - for (it_x=list_x.begin(); it_x!=end_x; ++it_x,++it_count,++i) - { - eval_arg[i].x=(*it_x); - eval_arg[i].h_max=h_max.value(); - eval_arg[i].count_eval=&(*it_count); - eval_arg[i].ev=this; - rc=pthread_create(&threads[i], NULL, wrapper_eval_x,&eval_arg[i]); - if (rc) - { - cout << "Error:unable to create thread," << rc << endl; - return false; - } - // wait until value of semaphore is greater than 0 - // decrement the value of semaphore by 1 - sem_wait(mySemaphore); - - } - - delete []eval_arg; - int ret; - for (i=0; i<list_x.size(); ++i) - { - // Wait for all the threads to finish - ret=pthread_join(threads[i],0); - if (ret!=0) - { - perror("pthread join has failed"); - return false; - } - } - - sem_unlink("sem"); - - return true; // the evaluation succeeded - } - - - +class My_Evaluator : public NOMAD::Evaluator +{ +public: + My_Evaluator ( const NOMAD::Parameters & p ) : + NOMAD::Evaluator ( p ) {} + + ~My_Evaluator ( void ) {} + + + // Implementation + bool eval_x ( std::list<NOMAD::Eval_Point *> &list_x , + const NOMAD::Double & h_max, + std::list<bool> & list_count_eval ) const + { + int rc; + + + + list_count_eval.assign(list_count_eval.size(),false); // Evaluations are not counted until eval_x is called and set count_eval + + // All threads are created + pthread_t threads[list_x.size()]; + + // The semaphore will allow to run NUM_THREADS in parallel + sem_init(&mySemaphore,0,NUM_THREADS); + + // Arguments passed to the evaluation wrapper + Arg_Eval_t * eval_arg=new Arg_Eval_t[list_x.size()]; + + std::list<NOMAD::Eval_Point *>::iterator it_x=list_x.begin(),end_x=list_x.end(); + std::list<bool>::iterator it_count=list_count_eval.begin(); + int i=0; + // The list of points is evaluated under the control of a semaphore + for (it_x=list_x.begin(); it_x!=end_x; ++it_x,++it_count,++i) + { + eval_arg[i].x=(*it_x); + eval_arg[i].h_max=h_max.value(); + eval_arg[i].count_eval=&(*it_count); + + rc=pthread_create(&threads[i], NULL, wrapper_eval_x,&eval_arg[i]); + if (rc) + { + cout << "Error:unable to create thread," << rc << endl; + return false; + } + // wait until value of semaphore is greater than 0 + // decrement the value of semaphore by 1 + sem_wait(&mySemaphore); + + } + + int ret; + for (i=0; i<list_x.size(); ++i) + { + // Wait for all the threads to finish + ret=pthread_join(threads[i],0); + if (ret!=0) + { + perror("pthread join has failed"); + return false; + } + } + delete []eval_arg; + sem_destroy(&mySemaphore); + + return true; // the evaluation succeeded + } + + + }; /*------------------------------------------*/ /* NOMAD main function */ /*------------------------------------------*/ -int main ( int argc , char ** argv ) { - - // display: - NOMAD::Display out ( std::cout ); - out.precision ( NOMAD::DISPLAY_PRECISION_STD ); - - try { - - // NOMAD initializations: - NOMAD::begin ( argc , argv ); - - // parameters creation: - NOMAD::Parameters p ( out ); - - p.set_DIMENSION (5); // number of variables - - vector<NOMAD::bb_output_type> bbot (3); // definition of - bbot[0] = NOMAD::OBJ; // output types - bbot[1] = NOMAD::PB; - bbot[2] = NOMAD::EB; - p.set_BB_OUTPUT_TYPE ( bbot ); - -// p.set_DISPLAY_ALL_EVAL(true); // displays all evaluations. - p.set_DISPLAY_DEGREE(2); - p.set_DISPLAY_STATS ( "bbe ( sol ) obj" ); - - p.set_X0 ( NOMAD::Point(5,0.0) ); // starting point - - p.set_LOWER_BOUND ( NOMAD::Point ( 5 , -6.0 ) ); // all var. >= -6 - NOMAD::Point ub ( 5 ); // x_4 and x_5 have no bounds - ub[0] = 5.0; // x_1 <= 5 - ub[1] = 6.0; // x_2 <= 6 - ub[2] = 7.0; // x_3 <= 7 - p.set_UPPER_BOUND ( ub ); - - p.set_MAX_BB_EVAL (100); // the algorithm terminates after - // 100 black-box evaluations - - // Max number of points to be given as a block for evaluation - // This option is required to perform parallel evaluations - p.set_BB_MAX_BLOCK_SIZE(NUM_THREADS); - - // parameters validation: - p.check(); - - // custom evaluator creation: - My_Evaluator ev ( p ); - - // algorithm creation and execution: - NOMAD::Mads mads ( p , &ev ); - mads.run(); - } - catch ( exception & e ) { - cerr << "\nNOMAD has been interrupted (" << e.what() << ")\n\n"; - } - - NOMAD::Slave::stop_slaves ( out ); - NOMAD::end(); - - return EXIT_SUCCESS; +int main ( int argc , char ** argv ) +{ + + + // display: + NOMAD::Display out ( std::cout ); + out.precision ( NOMAD::DISPLAY_PRECISION_STD ); + + try { + + // NOMAD initializations: + NOMAD::begin ( argc , argv ); + + // parameters creation: + NOMAD::Parameters p ( out ); + + p.set_DIMENSION (5); // number of variables + + vector<NOMAD::bb_output_type> bbot (3); // definition of + bbot[0] = NOMAD::OBJ; // output types + bbot[1] = NOMAD::PB; + bbot[2] = NOMAD::EB; + p.set_BB_OUTPUT_TYPE ( bbot ); + + // p.set_DISPLAY_ALL_EVAL(true); // displays all evaluations. + p.set_DISPLAY_DEGREE(2); + p.set_DISPLAY_STATS ( "bbe ( sol ) obj" ); + + p.set_X0 ( NOMAD::Point(5,0.0) ); // starting point + + p.set_LOWER_BOUND ( NOMAD::Point ( 5 , -6.0 ) ); // all var. >= -6 + NOMAD::Point ub ( 5 ); // x_4 and x_5 have no bounds + ub[0] = 5.0; // x_1 <= 5 + ub[1] = 6.0; // x_2 <= 6 + ub[2] = 7.0; // x_3 <= 7 + p.set_UPPER_BOUND ( ub ); + + p.set_MAX_BB_EVAL (100); // the algorithm terminates after + // 100 black-box evaluations + + // Max number of points to be given as a block for evaluation + // This option is required to perform parallel evaluations + p.set_BB_MAX_BLOCK_SIZE(NUM_THREADS); + + // parameters validation: + p.check(); + + // custom evaluator creation: + My_Evaluator ev ( p ); + + // algorithm creation and execution: + NOMAD::Mads mads ( p , &ev ); + mads.run(); + } + catch ( exception & e ) + { + + cerr << "\nNOMAD has been interrupted (" << e.what() << ")\n\n"; + } + + NOMAD::Slave::stop_slaves ( out ); + NOMAD::end(); + + return EXIT_SUCCESS; } diff --git a/examples/basic/library/single_obj_parallel/makefile b/examples/basic/library/single_obj_parallel/makefile index d7af859..1675b5e 100644 --- a/examples/basic/library/single_obj_parallel/makefile +++ b/examples/basic/library/single_obj_parallel/makefile @@ -1,13 +1,29 @@ -EXE = basic_lib.exe +UNAME := $(shell uname) -COMPILATOR = g++ +EXE = basic_lib.exe -COMPILATOR_OPTIONS = -O2 -ansi -L1 = $(NOMAD_HOME)/lib/nomad.a -LIBS = $(L1) -lm -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -OBJS = basic_lib.o +COMPILATOR = g++ + +COMPILATOR_OPTIONS = -O2 -ansi -Wno-deprecated + + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi +endif + + +LDLIBS = -lm -lnomad -lpthread + +INCLUDE = -I$(NOMAD_HOME)/src -I. + +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c + +OBJS = basic_lib.o ifndef NOMAD_HOME @@ -18,26 +34,25 @@ endef endif -$(EXE): $(L1) $(OBJS) +$(EXE): $(OBJS) $(ECHO_NOMAD) - @echo " building the parallel (ptrhreads) version ..." + @echo " building the scalar version ..." @echo " exe file : "$(EXE) - @$(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) - @strip $(EXE) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif basic_lib.o: basic_lib.cpp $(ECHO_NOMAD) @$(COMPILE) basic_lib.cpp -$(L1) : ; - $(ECHO_NOMAD) - -all: $(EXE) +all: $(EXE) clean: ; @echo " cleaning obj files" - @rm -f $(OBJS) + @rm -f $(OBJS) del: ; @echo " cleaning trash files" diff --git a/examples/basic/library/single_obj_parallel/runExample.log b/examples/basic/library/single_obj_parallel/runExample.log index c69008c..69e53de 100644 --- a/examples/basic/library/single_obj_parallel/runExample.log +++ b/examples/basic/library/single_obj_parallel/runExample.log @@ -13,15 +13,14 @@ MADS run { 6 ( 1.9677398202 0.0000000000 4.6510213932 1.0733126292 -1.0733126292 ) -1.0733126292 12 ( 1.4758048651 -0.5366563146 4.0696437190 0.8049844719 -1.6099689438 ) -1.6099689438 14 ( 0.4919349550 0.5366563146 4.0696437190 0.2683281573 -2.4149534157 ) -2.4149534157 - 30 ( 1.9677398202 0.5366563146 1.1627553483 1.3416407865 -3.2199378876 ) -3.2199378876 - 52 ( 0.9838699101 0.5366563146 1.7441330224 1.3416407865 -3.7565942022 ) -3.7565942022 - 74 ( 0.9838699101 1.0733126292 1.7441330224 0.5366563146 -3.7565942022 ) -3.7565942022 - 92 ( 1.2298373876 1.2074767078 1.3080997668 1.0062305899 -3.8236762415 ) -3.8236762415 - 95 ( 0.8608861713 1.2074767078 1.1627553483 1.3416407865 -3.8907582808 ) -3.8907582808 - 101 ( 0.8608861713 1.2074767078 1.1627553483 1.3416407865 -3.8907582808 ) -3.8907582808 + 30 ( 1.9677398202 0.0000000000 2.9068883707 0.2683281573 -2.9516097303 ) -2.9516097303 + 44 ( 2.4596747752 2.1466252584 1.1627553483 0.2683281573 -3.4882660449 ) -3.4882660449 + 76 ( 1.9677398202 1.6099689438 1.7441330224 0.4024922359 -3.7565942022 ) -3.7565942022 + 88 ( 1.4758048651 0.9391485505 1.8894774410 0.6708203932 -3.8236762415 ) -3.8236762415 + 100 ( 1.4758048651 0.9391485505 1.8894774410 0.6708203932 -3.8236762415 ) -3.8236762415 } end of run (max number of blackbox evaluations) -blackbox evaluations : 101 -best infeasible solution (min. violation): ( 0.9838699101 1.073312629 1.162755348 1.073312629 -4.024922359 ) h=0.2873436854 f=-4.024922359 -best feasible solution : ( 0.8608861713 1.207476708 1.162755348 1.341640786 -3.890758281 ) h=0 f=-3.890758281 +blackbox evaluations : 100 +best infeasible solution (min. violation): ( 1.96773982 1.744133022 1.598788604 0.2683281573 -3.756594202 ) h=0.009334196675 f=-3.756594202 +best feasible solution : ( 1.475804865 0.9391485505 1.889477441 0.6708203932 -3.823676242 ) h=0 f=-3.823676242 diff --git a/examples/interfaces/DLL/bi_obj/makefile b/examples/interfaces/DLL/bi_obj/makefile index 241139b..e610902 100755 --- a/examples/interfaces/DLL/bi_obj/makefile +++ b/examples/interfaces/DLL/bi_obj/makefile @@ -1,11 +1,25 @@ -EXE = nomad_for_dll.exe -COMPILATOR = g++ -COMPILATOR_OPTIONS = -O3 -L1 = $(NOMAD_HOME)/lib/nomad.a -LIBS = $(L1) -lm -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -OBJS = nomad_for_dll.o +UNAME := $(shell uname) + +EXE = nomad_for_dll.exe +COMPILATOR = g++ +COMPILATOR_OPTIONS = -O3 -ansi + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi +endif + +LDLIBS = -lm -lnomad + +INCLUDE = -I$(NOMAD_HOME)/src -I. + +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c + +OBJS = nomad_for_dll.o ifndef NOMAD_HOME define ECHO_NOMAD @@ -14,13 +28,19 @@ define ECHO_NOMAD endef endif -$(EXE): $(L1) $(OBJS) +$(EXE): $(OBJS) $(ECHO_NOMAD) - $(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) + @echo " building the scalar version ..." + @echo " exe file : "$(EXE) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif + -nomad_for_dll.o: nomad_for_dll.cpp $(L1) +nomad_for_dll.o: nomad_for_dll.cpp $(ECHO_NOMAD) - $(COMPILE) nomad_for_dll.cpp + @$(COMPILE) nomad_for_dll.cpp $(L1): ; $(ECHO_NOMAD) diff --git a/examples/interfaces/DLL/single_obj/makefile b/examples/interfaces/DLL/single_obj/makefile index da0aa1b..e610902 100755 --- a/examples/interfaces/DLL/single_obj/makefile +++ b/examples/interfaces/DLL/single_obj/makefile @@ -1,11 +1,25 @@ -EXE = nomad_for_dll.exe -COMPILATOR = g++ -COMPILATOR_OPTIONS = -O3 -L1 = $(NOMAD_HOME)/lib/nomad.a -LIBS = $(L1) -lm -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -OBJS = nomad_for_dll.o +UNAME := $(shell uname) + +EXE = nomad_for_dll.exe +COMPILATOR = g++ +COMPILATOR_OPTIONS = -O3 -ansi + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi +endif + +LDLIBS = -lm -lnomad + +INCLUDE = -I$(NOMAD_HOME)/src -I. + +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c + +OBJS = nomad_for_dll.o ifndef NOMAD_HOME define ECHO_NOMAD @@ -14,14 +28,19 @@ define ECHO_NOMAD endef endif -$(EXE): $(L1) $(OBJS) +$(EXE): $(OBJS) $(ECHO_NOMAD) - $(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) + @echo " building the scalar version ..." + @echo " exe file : "$(EXE) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif nomad_for_dll.o: nomad_for_dll.cpp $(ECHO_NOMAD) - $(COMPILE) nomad_for_dll.cpp + @$(COMPILE) nomad_for_dll.cpp $(L1): ; $(ECHO_NOMAD) diff --git a/examples/interfaces/FORTRAN/example1/makefile b/examples/interfaces/FORTRAN/example1/makefile index 6f7ea74..0b315b4 100644 --- a/examples/interfaces/FORTRAN/example1/makefile +++ b/examples/interfaces/FORTRAN/example1/makefile @@ -1,13 +1,26 @@ -EXE = test.exe -COMPILATOR = g++ -FCOMPILATOR = gfortran -COMPILATOR_OPTIONS = -ansi -Wall -O3 -L1 = $(NOMAD_HOME)/lib/nomad.a -LIBS = $(L1) -lm -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -FCOMPILE = $(FCOMPILATOR) -O3 -c -OBJS = test.o bb.o +UNAME := $(shell uname) + +EXE = test.exe +COMPILATOR = g++ +FCOMPILATOR = gfortran +COMPILATOR_OPTIONS = -ansi -Wall -O3 + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi +endif + + +LDLIBS = -lm -lnomad + +INCLUDE = -I$(NOMAD_HOME)/src -I. +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c +FCOMPILE = $(FCOMPILATOR) -O3 -c +OBJS = test.o bb.o ifndef NOMAD_HOME define ECHO_NOMAD @@ -17,18 +30,22 @@ endef endif -$(EXE): $(L1) $(OBJS) +$(EXE): $(OBJS) $(ECHO_NOMAD) - $(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) -lgfortran + @echo " building the scalar version ..." + @echo " exe file : "$(EXE) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif test.o: test.cpp bb.o - $(COMPILE) test.cpp + $(ECHO_NOMAD) + @$(COMPILE) test.cpp bb.o: bb.f - $(FCOMPILE) bb.f - -$(L1): ; - $(ECHO_NOMAD) + $(ECHO_NOMAD) + @$(FCOMPILE) bb.f clean: @echo " cleaning obj files" diff --git a/examples/interfaces/FORTRAN/example1/runExample.log b/examples/interfaces/FORTRAN/example1/runExample.log index e13bad1..e14c513 100644 --- a/examples/interfaces/FORTRAN/example1/runExample.log +++ b/examples/interfaces/FORTRAN/example1/runExample.log @@ -3,15 +3,18 @@ MADS run { BBE OBJ - 2 275.2281000000 (PhaseOne) + 2 288.7937255854 (PhaseOne) 3 0.0000000000 (PhaseOne) - 3 0.0000000000 - 11 -1.5000000000 - 55 -3.0000000000 - 100 -3.0000000000 + 3 1.0733126292 + 10 1.0062305899 + 11 0.8049844719 + 13 0.5366563146 + 28 -1.0733126292 + 32 -3.7565942022 + 100 -3.7565942022 } end of run (max number of blackbox evaluations) -blackbox evaluations : 100 -best infeasible solution: ( 0.55 1.8 2.6 -1.5 -3 ) h=0.6525 f=-3 -best feasible solution : ( 1.65 1.8 1.95 -1.5 -3 ) h=0 f=-3 +blackbox evaluations : 100 +best infeasible solution (min. violation): ( 2.459674775 0.5366563146 1.162755348 1.073312629 -3.756594202 ) h=0.0023902697 f=-3.756594202 +best feasible solution : ( 0.491934955 2.146625258 1.162755348 0.2683281573 -3.756594202 ) h=0 f=-3.756594202 diff --git a/examples/interfaces/FORTRAN/example2/makefile b/examples/interfaces/FORTRAN/example2/makefile index 75f00d3..8875700 100644 --- a/examples/interfaces/FORTRAN/example2/makefile +++ b/examples/interfaces/FORTRAN/example2/makefile @@ -1,13 +1,27 @@ -EXE = test.exe -COMPILATOR = g++ -FCOMPILATOR = gfortran -COMPILATOR_OPTIONS = -ansi -Wall -O3 -L1 = $(NOMAD_HOME)/lib/nomad.a -LIBS = $(L1) -lm -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -FCOMPILE = $(FCOMPILATOR) -O3 -c -OBJS = nomad.o test.o +UNAME := $(shell uname) + +EXE = test.exe +COMPILATOR = g++ +FCOMPILATOR = gfortran +COMPILATOR_OPTIONS = -ansi -Wall -O3 + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi +endif + + +LDLIBS = -lm -lnomad -lstdc++ + +INCLUDE = -I$(NOMAD_HOME)/src -I. +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c +FCOMPILE = $(FCOMPILATOR) -O3 -c + +OBJS = nomad.o test.o ifndef NOMAD_HOME define ECHO_NOMAD @@ -16,18 +30,17 @@ define ECHO_NOMAD endef endif -$(EXE): $(L1) $(OBJS) +$(EXE): $(OBJS) $(ECHO_NOMAD) - $(FCOMPILATOR) -o $(EXE) $(OBJS) $(LIBS) -lstdc++ + $(FCOMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) -L$(LIB_DIR) $(CXXFLAGS) nomad.o: nomad.cpp + $(ECHO_NOMAD) $(COMPILE) nomad.cpp test.o: test.f - $(FCOMPILE) test.f - -$(L1): ; $(ECHO_NOMAD) + $(FCOMPILE) test.f clean: @echo " cleaning obj files" diff --git a/examples/interfaces/Matlab_MEX/nomad.m b/examples/interfaces/Matlab_MEX/Functions/nomad.m similarity index 83% rename from examples/interfaces/Matlab_MEX/nomad.m rename to examples/interfaces/Matlab_MEX/Functions/nomad.m index b273d1c..e2365b3 100644 --- a/examples/interfaces/Matlab_MEX/nomad.m +++ b/examples/interfaces/Matlab_MEX/Functions/nomad.m @@ -2,11 +2,10 @@ % % min f(x) subject to: nlcon(x) <= 0 % x lb <= x <= ub -% xi in Z -% xj in {0,1} +% x in R % %%%%%%%%%%%%% GERAD VERSION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% [x,fval,exitflag,iter,nfval] = nomad(fun,x0,lb,ub,opts) +% [x,fval,exitflag,iter,nfval] = nomad(fun,x0,lb,ub,opts,param) % % Input arguments: % fun - nonlinear function handle (f and nlcon) @@ -14,10 +13,11 @@ % lb - decision variable lower bounds % ub - decision variable upper bounds % opts - solver options (see nomadset) +% param - extra parameter passed to the blackbox function % % Return arguments: % x - solution vector -% fval - objective value at the solution +% fval - objective value at the solution (paretor front if bi-obj) % exitflag - exit status (see below) % iter - number of iterations taken by the solver % nfval - number of function evaluations taken by the solver diff --git a/examples/interfaces/Matlab_MEX/nomadset.m b/examples/interfaces/Matlab_MEX/Functions/nomadset.m similarity index 100% rename from examples/interfaces/Matlab_MEX/nomadset.m rename to examples/interfaces/Matlab_MEX/Functions/nomadset.m diff --git a/examples/interfaces/Matlab_MEX/GERAD_NOMAD_build.m b/examples/interfaces/Matlab_MEX/GERAD_NOMAD_build.m index 36eee6c..f827e8e 100644 --- a/examples/interfaces/Matlab_MEX/GERAD_NOMAD_build.m +++ b/examples/interfaces/Matlab_MEX/GERAD_NOMAD_build.m @@ -5,75 +5,163 @@ % To recompile you will need to get / do the following: % 1) Get NOMAD -% NOMAD is available from http://www.gerad.ca/NOMAD/PHP_Forms/Download.php. +% NOMAD is available from https://www.gerad.ca/nomad % Complete the download form then download the latest version. Define the % $NOMAD_HOME environment variable. -% 2) NOMAD MEX Interface +% 2) Start Matlab and go into $NOMAD_HOME/examples/interfaces/Matlab_Mex % The NOMAD MEX Interface is a simple MEX interface written to use NOMAD. -% 3) Compile the MEX File -% The code below will build the NOMAD MEX file. Once you have completed all the -% above steps, simply run this file to compile NOMAD! You MUST BE in the -% base directory of OPTI! +% 3) Compile the MEX File by executing this file in Matlab +% +% +% The code below will build the NOMAD MEX file and set the Matlab path. clear nomad -switch(computer) -case 'PCWIN' -libdir = ' -Lwin32\'; -case 'PCWIN64' -libdir = ' -Lwin64\'; -case 'GLNX86' -libdir = 'glnx86/'; -case 'GLNXA64' -libdir = 'glnxa64/'; -case 'MACI64' -libdir = 'maci64/'; -end +% Current directory +cdir = cd; +% Check and set nomad_home and create variables for path clear nomad_home nomad_src; +% Default values +nameLibNomad = ''; +updateLDFLAGS= ''; +install_name_tool=''; + +if ( strcmp(computer,'PCWIN64') == 1 || strcmp(computer,'PCWIN32') == 1 ) + + nomad_home = getenv('NOMAD_EXAMPLES'); + + if ( length(nomad_home) > 1) + nomad_home = [ nomad_home '\VisualStudio' ]; + warning('The nomad_home variable for Matlab is set to %s (that is NOMAD_EXAMPLES\\VisualStudio).The default can be replaced by using the command setenv(''NOMAD_EXAMPLES'',ARG1)! before running the GERAD_NOMAD_build command.',nomad_home); + if ( ~isempty( find(isspace(nomad_home),1) ) ) + error('The compilation of Nomad for Matlab must be performed in the NOMAD_EXAMPLES directory. The NOMAD_EXAMPLES directory should not contain empty space. Please consider moving the NOMAD_EXAMPLES directory and reset the NOMAD_EXAMPLES environment variable accordingly.'); + end + + else + cd .. + cd .. + cd .. + cd 'VisualStudio'; + nomad_home = cd; + + if ( ~ exist(nomad_home,'dir') ) + error('The default NOMAD_EXAMPLES\VisualStudio directory does not exist. Please make sure that a VisualStudio directory exists.'); + end + + cd(cdir); + end + + nomad_src=[nomad_home filesep 'src' filesep]; + nomad_bin=[nomad_home filesep 'bin' filesep]; + nomad_lib=''; + + %Compile & Move (Windows) ---> recompile Nomad + post = [' -I. -I' nomad_src ' -lut -output ' nomad_bin filesep 'nomad.' mexext]; + pre = ['mex -v -largeArrayDims nomadmex.cpp ' nomad_src 'Parameters.cpp ' nomad_src 'Barrier.cpp ' nomad_src 'Cache.cpp '... + nomad_src 'Cache_File_Point.cpp ' nomad_src 'Cache_Point.cpp ' nomad_src 'Cache_Search.cpp ' nomad_src 'Clock.cpp '... + nomad_src 'Direction.cpp ' nomad_src 'Directions.cpp ' nomad_src 'Display.cpp '... + nomad_src 'Double.cpp ' nomad_src 'Eval_Point.cpp ' nomad_src 'Evaluator.cpp ' nomad_src 'Evaluator_Control.cpp ' nomad_src 'Exception.cpp '... + nomad_src 'Extended_Poll.cpp ' nomad_src 'L_Curve.cpp ' nomad_src 'LH_Search.cpp ' nomad_src 'OrthogonalMesh.cpp ' nomad_src 'Mads.cpp ' nomad_src 'Model_Sorted_Point.cpp '... + nomad_src 'Model_Stats.cpp ' nomad_src 'Multi_Obj_Evaluator.cpp ' nomad_src 'Parameter_Entries.cpp '... + nomad_src 'Parameter_Entry.cpp ' nomad_src 'Pareto_Front.cpp ' nomad_src 'Pareto_Point.cpp ' nomad_src 'Phase_One_Evaluator.cpp '... + nomad_src 'Phase_One_Search.cpp ' nomad_src 'Point.cpp ' nomad_src 'Priority_Eval_Point.cpp ' nomad_src 'Quad_Model.cpp '... + nomad_src 'Quad_Model_Evaluator.cpp ' nomad_src 'Quad_Model_Search.cpp ' nomad_src 'Random_Pickup.cpp ' nomad_src 'RNG.cpp '... + nomad_src 'Signature.cpp ' nomad_src 'Slave.cpp ' nomad_src 'SMesh.cpp ' nomad_src 'Speculative_Search.cpp ' nomad_src 'Stats.cpp ' nomad_src 'utils.cpp '... + nomad_src 'Variable_Group.cpp ' nomad_src 'VNS_Search.cpp ' nomad_src 'XMesh.cpp']; + + +else + %%%%%%%%%%%%%%%%%%%%%%% + % LINUX AND OSX + %%%%%%%%%%%%%%%%%%%%%%% + + % Default library names + nameLibNomad = 'libnomad.so'; + + % Default update LDFLAGS (linux only) + updateLDFLAGS= ''; + % Post compilation tool for path to library (osx only) + install_name_tool=''; + + nomad_home = getenv('NOMAD_HOME'); + + if ( length(nomad_home) < 1 ) + % Get a default directory for NOMAD_HOME + cd .. + cd .. + cd .. + nomad_home = cd; + if ( ~ exist(nomad_home,'dir') ) + error('The default NOMAD_HOME directory does not exist. Please provide a correct value for the NOMAD_HOME variables with the command setenv(''NOMAD_HOME'',ARG1)'); + end + warning('The NOMAD_HOME variable for Matlab is set with its default value %s. The default can be replaced by using the command setenv(''NOMAD_HOME'',ARG1)! before running the GERAD_NOMAD_build command.',nomad_home); + cd(cdir); + else + if ( ~isempty( find(isspace(nomad_home),1) ) ) + error('The compilation of Nomad for Matlab uses the sources located in the NOMAD_HOME directory. The NOMAD_HOME directory should not contain empty space. Please consider moving the NOMAD_HOME directory and reset the NOMAD_HOME environment variable accordingly.'); + end + end + + nomad_src=[nomad_home filesep 'src' filesep]; + nomad_lib=[nomad_home filesep 'lib' filesep]; + nomad_bin=[nomad_home filesep 'bin' filesep]; + + switch(computer) + case 'GLNX86' + updateLDFLAGS = 'LDFLAGS=''$LDFLAGS -Wl,-rpath,''''$ORIGIN/../lib/'''' '' '; + case 'GLNXA64' + updateLDFLAGS = 'LDFLAGS=''$LDFLAGS -Wl,-rpath,''''$ORIGIN/../lib/'''' '' '; + case 'MACI64' + install_name_tool=['install_name_tool -change ' nameLibNomad ' @loader_path/../lib/' nameLibNomad ' ' nomad_bin filesep 'nomad.' mexext]; + end + + %Compile & Move (Default) --> use shared object library + post = [' -I. -I' nomad_src ' -lut -lnomad -L' nomad_lib ' -output ' nomad_bin filesep 'nomad.' mexext ]; + pre =[ 'mex -v -largeArrayDims nomadmex.cpp ' updateLDFLAGS ]; + + if ( ~ exist([nomad_lib filesep nameLibNomad],'file') ) + error('The Nomad library file %s is not available. Please perform Nomad project compilation before proceeding.',nameLibNomad); + end + +end + fprintf('\n------------------------------------------------\n'); fprintf('NOMAD MEX FILE BUILD --- GERAD VERSION \n\n'); -nomad_home = getenv('NOMAD_HOME'); -if (length(nomad_home)<1) - error('opti:nomad','Please set NOMAD_HOME variables properly with the command setenv(''NOMAD_HOME'',ARG1)!'); -end -nomad_src=[nomad_home filesep 'src' filesep]; - - -%Get NOMAD Libraries -post = [' -I. -I' nomad_src ' -lm -lut -output nomad']; - %CD to Source Directory -cdir = cd; cd 'Source'; -%Compile & Move -pre = ['mex -v -g -largeArrayDims nomadmex.cpp ' nomad_src 'Parameters.cpp ' nomad_src 'Barrier.cpp ' nomad_src 'Cache.cpp '... -nomad_src 'Cache_File_Point.cpp ' nomad_src 'Cache_Point.cpp ' nomad_src 'Cache_Search.cpp ' nomad_src 'Clock.cpp '... -nomad_src 'Direction.cpp ' nomad_src 'Directions.cpp ' nomad_src 'Display.cpp '... -nomad_src 'Double.cpp ' nomad_src 'Eval_Point.cpp ' nomad_src 'Evaluator.cpp ' nomad_src 'Evaluator_Control.cpp ' nomad_src 'Exception.cpp '... -nomad_src 'Extended_Poll.cpp ' nomad_src 'L_Curve.cpp ' nomad_src 'LH_Search.cpp ' nomad_src 'OrthogonalMesh.cpp ' nomad_src 'Mads.cpp ' nomad_src 'Model_Sorted_Point.cpp '... -nomad_src 'Model_Stats.cpp ' nomad_src 'Multi_Obj_Evaluator.cpp ' nomad_src 'Parameter_Entries.cpp '... -nomad_src 'Parameter_Entry.cpp ' nomad_src 'Pareto_Front.cpp ' nomad_src 'Pareto_Point.cpp ' nomad_src 'Phase_One_Evaluator.cpp '... -nomad_src 'Phase_One_Search.cpp ' nomad_src 'Point.cpp ' nomad_src 'Priority_Eval_Point.cpp ' nomad_src 'Quad_Model.cpp '... -nomad_src 'Quad_Model_Evaluator.cpp ' nomad_src 'Quad_Model_Search.cpp ' nomad_src 'Random_Pickup.cpp ' nomad_src 'RNG.cpp '... -nomad_src 'Signature.cpp ' nomad_src 'Slave.cpp ' nomad_src 'SMesh.cpp ' nomad_src 'Speculative_Search.cpp ' nomad_src 'Stats.cpp ' nomad_src 'utils.cpp '... -nomad_src 'Variable_Group.cpp ' nomad_src 'VNS_Search.cpp ' nomad_src 'XMesh.cpp']; - try + + if ( ~ exist([nomad_lib filesep nameLibNomad],'file') ) + error('The Nomad library file %s is not available. Please perform Nomad project compilation before proceeding.',nameLibNomad); + end + eval([pre post]) - movefile(['nomad.' mexext],['..' filesep],'f') + + if ( strcmp(computer,'MACI64') == 1 ) + system(install_name_tool); + end + cd(cdir); - clear nomad_home nomad_src cdir post pre libdir; - fprintf('Done!\n'); + fprintf('Compilation done!\n'); + fprintf('\n----------------------------------------------------------------------------------------------\n'); + fprintf(' To be able to use the nomad functions, you may need to modify the Matlab path \n'); + qstring = 'To be able to use the nomad functions, you may need to modify the Matlab path. Do you want to update the Matlab path?'; + choice = questdlg(qstring,'Set path','Yes','No','Yes'); + if ( strcmp(choice,'Yes') ) + addpath([ cdir filesep 'Functions']); + addpath(nomad_bin); + fprintf(' ---> The Matlab path has been modified but not saved.\n'); + end + clear nomad_home nomad_lib nomad_bin nomad_src cdir post pre updateLDFLAGS qstring choice install_name_tool nameLibNomad; catch ME cd(cdir); - clear nomad_home nomad_src cdir post pre libdir; - error('opti:nomad','Error Compiling NOMAD!\n%s',ME.message); + clear nomad_home nomad_lib noamd_bin nomad_src cdir post pre updateLDFLAGS qstring choice install_name_tool nameLibNomad; + error('Error Compiling NOMAD!\n%s',ME.message); end -fprintf('------------------------------------------------\n'); diff --git a/examples/interfaces/Matlab_MEX/Source/nomadmex.cpp b/examples/interfaces/Matlab_MEX/Source/nomadmex.cpp index cd8f3ec..e96f29e 100755 --- a/examples/interfaces/Matlab_MEX/Source/nomadmex.cpp +++ b/examples/interfaces/Matlab_MEX/Source/nomadmex.cpp @@ -1,16 +1,24 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search MATLAB Interface */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ /* */ -/* MEX Interface Author: Jonathan Currie 2012 (I2C2) */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ +/* */ +/* */ +/* MEX Interface Author: Jonathan Currie 2012 (I2C2) + modifs C. Tribes */ /* */ /* MEX Interface Contact information: */ /* jocurrie@aut.ac.nz */ @@ -30,7 +38,7 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ -#define NOMADMEX_VERSION "1.24_ct [feb 12, 2015]" +#define NOMADMEX_VERSION "1.25_ct [Sept 3rd, 2015]" //NOTE from Version 1.15 on this MEX file contains a dual interface: // 1) The default (GERAD) interface is: @@ -54,7 +62,7 @@ using namespace std; //Function handle structure #define FLEN 128 /* max length of user function name */ -#define MAXRHS 3 /* max nrhs for user function */ +#define MAXRHS 4 /* max nrhs for user function */ typedef struct { char f[FLEN]; mxArray *plhs[1]; @@ -90,9 +98,9 @@ extern void utSetInterruptPending(bool); //Argument Enums (in expected order of arguments) #ifdef OPTI_VERSION -enum {eFUN, eX0, eLB, eUB, eNLCON, eNLRHS, eXTYPE, eOPTS}; +enum {eFUN, eX0, eLB, eUB, eNLCON, eNLRHS, eXTYPE, eOPTS, ePARAM}; #else //GERAD VERSION -enum {eFUN, eX0, eLB, eUB, eOPTS}; +enum {eFUN, eX0, eLB, eUB, eOPTS, ePARAM}; enum {eNLCON, eNLRHS, eXTYPE}; //placeholders #endif //PRHS Defines @@ -104,6 +112,7 @@ enum {eNLCON, eNLRHS, eXTYPE}; //placeholders #define pNLRHS prhs[eNLRHS] #define pXTYPE prhs[eXTYPE] #define pOPTS prhs[eOPTS] +#define pParam prhs[ePARAM] //Function Prototypes void printSolverInfo(); @@ -144,7 +153,7 @@ public: }; /*-----------------------------------------*/ -/* constructor: creates the signature */ +/* constructor: creates the 3 signatures */ /*-----------------------------------------*/ Matlab_Extended_Poll::Matlab_Extended_Poll ( NOMAD::Parameters & p , neighborsFcn * neighbors) : Extended_Poll ( p ) , @@ -163,8 +172,8 @@ void Matlab_Extended_Poll::construct_extended_points ( const NOMAD::Eval_Point & { double *xm; char errstr[1024]; - - if ( !x.is_complete() ) + + if ( !x.is_complete() ) { mexWarnMsgTxt("construct_extended_points: bad extended poll center\n%sExiting NOMAD...\n\n"); //Force exit @@ -172,7 +181,7 @@ void Matlab_Extended_Poll::construct_extended_points ( const NOMAD::Eval_Point & } - xm = mxGetPr(_neighbors->prhs[1]); + xm = mxGetPr( _neighbors->prhs[1] ); int n=_s1->get_n(); for(int i=0;i<n;i++) @@ -199,7 +208,7 @@ void Matlab_Extended_Poll::construct_extended_points ( const NOMAD::Eval_Point & } - size_t nbNPoints=mxGetNumberOfElements(_neighbors->plhs[0])/n; + int nbNPoints=static_cast<int>(mxGetNumberOfElements(_neighbors->plhs[0])/n); double *xr=mxGetPr(_neighbors->plhs[0]); for(int i=0;i<nbNPoints;i++) @@ -216,10 +225,12 @@ void Matlab_Extended_Poll::construct_extended_points ( const NOMAD::Eval_Point & //MATLAB Evaluator Class -class matlabEval : public NOMAD::Evaluator { +class matlabEval : public NOMAD::Evaluator +{ private: usrFcn *fun; bool hasSur; + // bool hasAdditionalParam; int nobj; usrFcn *con; int ncon; @@ -247,8 +258,7 @@ public: ~matlabEval(void) {} - // evaluating a list of points - bool eval_x(std::list<NOMAD::Eval_Point *> &x, const NOMAD::Double &h_max, std::list<bool> & list_count_eval ) + bool eval_x(std::list<NOMAD::Eval_Point *> &x, const NOMAD::Double &h_max, std::list<bool> & list_count_eval ) { #ifdef OPTI_VERSION @@ -261,17 +271,16 @@ public: char errstr[1024]; bool stop = false; - int i, j; - size_t m, n; + int i, j, m, n; double *fvals; mxLogical *sur; - m=x.size(); + m=static_cast<int>(x.size()); n=(*(x.begin()))->size(); if ( m !=list_count_eval.size()) { - mexPrintf("NomadMex Evaluator: inconsistent size of list" ); + mexPrintf("NomadMex Evaluator: inconsistent size of list" ); //Force exit raise(SIGINT); return false; @@ -279,7 +288,7 @@ public: //Check for Ctrl-C - if (utIsInterruptPending()) + if ( utIsInterruptPending() ) { utSetInterruptPending(false); /* clear Ctrl-C status */ mexPrintf("\nCtrl-C Detected. Exiting NOMAD...\n\n"); @@ -299,10 +308,10 @@ public: //Add Surrogate if present and requested - if(hasSur) - { + if( hasSur ) + { sur=mxGetLogicals(fun->prhs[fun->xrhs+1]); - (x.front()->get_eval_type()==NOMAD::SGTE)? *sur=true:*sur=false; // all evaluations in a list have the same eval_type + ( x.front()->get_eval_type()==NOMAD::SGTE )? *sur=true:*sur=false; // all evaluations in a list have the same eval_type } @@ -359,11 +368,11 @@ public: //Assign bb output - fvals = mxGetPr(fun->plhs[0]); - j=0; - for (it_x=x.begin();it_x!=x.end();++it_x,++j) - for(i=0;i<(nobj+ncon);i++) - (*it_x)->set_bb_output(i,fvals[m*i+j]); + fvals = mxGetPr(fun->plhs[0]); + j=0; + for (it_x=x.begin();it_x!=x.end();++it_x,++j) + for(i=0;i<(nobj+ncon);i++) + (*it_x)->set_bb_output(i,fvals[m*i+j]); //Iteration Callback if(iterF->enabled) @@ -414,13 +423,14 @@ public: { char errstr[1024]; bool stop = false; - int i, n = x.size(); + int i, n = static_cast<int>(x.size()); double *xm, *fvals; mxLogical *sur; count_eval = true; //mexErrMsgTxt will kill MEX //Check for Ctrl-C - if (utIsInterruptPending()) { + if ( utIsInterruptPending() ) + { utSetInterruptPending(false); /* clear Ctrl-C status */ mexPrintf("\nCtrl-C Detected. Exiting NOMAD...\n\n"); count_eval = false; @@ -432,24 +442,30 @@ public: xm = mxGetPr(fun->prhs[fun->xrhs]); for(i=0;i<n;i++) xm[i] = x[i].value(); + //Add Surrogate if present and requested - if(hasSur) { + if( hasSur ) + { sur=mxGetLogicals(fun->prhs[fun->xrhs+1]); - (x.get_eval_type()==NOMAD::SGTE)? *sur=true:*sur=false; + (x.get_eval_type()==NOMAD::SGTE)? *sur=true:*sur=false; } + //Call MATLAB Objective - try { + try + { mexCallMATLAB(1, fun->plhs, fun->nrhs, fun->prhs, fun->f); } //Note if these errors occur it is due to errors in MATLAB code, no way to recover? - catch(exception &e) { + catch(exception &e) + { sprintf(errstr,"Unrecoverable Error from Objective / Blackbox Callback:\n%sExiting NOMAD...\n\n",e.what()); mexWarnMsgTxt(errstr); //Force exit raise(SIGINT); return false; } - catch(...) { + catch(...) + { mexPrintf("Unrecoverable Error from Objective / Blackbox Callback, Exiting NOMAD...\n\n"); //Force exit raise(SIGINT); @@ -458,21 +474,24 @@ public: #ifdef OPTI_VERSION //Check we got the correct number back - if(mxGetM(fun->plhs[0]) != nobj) + if( mxGetM(fun->plhs[0]) != nobj ) mexErrMsgTxt("Incorrect number of elements returned from the objective function"); + //Set Objective (Or multi-objective) fvals = mxGetPr(fun->plhs[0]); - for(i=0;i<nobj;i++) - x.set_bb_output(i,fvals[i]); + for( i=0 ; i<nobj ; i++ ) + x.set_bb_output( i,fvals[i] ); //Constraint Evaluation - if(ncon) { + if( ncon ) + { con->plhs[0] = NULL; xm = mxGetPr(con->prhs[con->xrhs]); for(i=0;i<n;i++) xm[i] = x[i].value(); //Call MATLAB Constraint - try { + try + { mexCallMATLAB(1, con->plhs, con->nrhs, con->prhs, con->f); } catch(...) @@ -485,18 +504,20 @@ public: //Check we got the correct number back if(mxGetM(con->plhs[0]) != ncon) mexErrMsgTxt("Incorrect number of elements returned from nonlinear constraint function"); + //Set Constraints double *cons = mxGetPr(con->plhs[0]); for(i=0,j=nobj;i<ncon;i++,j++) x.set_bb_output(j,cons[i] - con->nlrhs[i]); //subtract nlrhs + // Clean up LHS Ptr mxDestroyArray(con->plhs[0]); } #else //GERAD VERSION //Check we got the correct number of elements back - if(mxGetNumberOfElements(fun->plhs[0]) > nobj+ncon) + if( mxGetNumberOfElements(fun->plhs[0]) > nobj+ncon ) mexWarnMsgTxt("Black box returns more elements than required. Please provide a BB_OUTPUT_TYPE consistent with your black box function"); - else if(mxGetNumberOfElements(fun->plhs[0]) < nobj+ncon) + else if( mxGetNumberOfElements(fun->plhs[0]) < nobj+ncon ) { mexPrintf("Insufficient outputs provided by the black box function. Exiting NOMAD...\n\n"); raise(SIGINT); @@ -572,13 +593,11 @@ public: { return mEval->eval_x(x,h_max,count_eval); } - - //Function + Constraint Information + //Function + Constraint Information bool eval_x(std::list<NOMAD::Eval_Point *> &x, const NOMAD::Double &h_max, std::list<bool> & list_count_eval ) { return mEval->eval_x(x,h_max,list_count_eval); } - }; //cout Redirection @@ -591,26 +610,28 @@ public: } private: enum { s_size = 1024 }; //not sure on this size - char m_buffer[s_size]; - int_type overflow(int_type c) - { - if (!traits_type::eq_int_type(c, traits_type::eof())) { - *pptr() = traits_type::to_char_type(c); - pbump(1); - } - return sync() != -1 ? traits_type::not_eof(c) : traits_type::eof(); - } - - int sync() { - *pptr() = 0; - mexPrintf(pbase()); + char m_buffer[s_size]; + int_type overflow(int_type c) + { + if (!traits_type::eq_int_type(c, traits_type::eof())) + { + *pptr() = traits_type::to_char_type(c); + pbump(1); + } + return sync() != -1 ? traits_type::not_eof(c) : traits_type::eof(); + } + + int sync() + { + *pptr() = 0; + mexPrintf(pbase()); mexEvalString("drawnow;"); - setp(m_buffer, m_buffer + s_size - 2); - return 0; - } + setp(m_buffer, m_buffer + s_size - 2); + return 0; + } }; -// make the buffer static to have a single buffer when nested nomad optimizations + static printfbuf buf; // Main Entry Function @@ -623,7 +644,7 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) char *xtype = NULL; //Outputs Args - double *exitflag, *iter, *nfval; + double *exitflag, *iter, *nfval; //Internal Vars size_t ndec; @@ -633,7 +654,7 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) neighborsFcn neighborsF; //Check user inputs - if(!checkInputs(prhs,nrhs,plhs,nlhs)) + if( !checkInputs(prhs,nrhs,plhs,nlhs) ) return; //Redirect cout @@ -646,9 +667,12 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) NOMAD::Point px0; NOMAD::Double *nx0; NOMAD::stop_type stopflag; + //Evaluator Vars matlabEval *mSEval = NULL; matlabMEval *mBEval = NULL; + + // Extended Poll Vars Matlab_Extended_Poll *mEP = NULL; @@ -663,37 +687,39 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) ndec = mxGetNumberOfElements(pX0); //Get Blackbox / Objective Function Handle - if (mxIsChar(pFUN)) + if ( mxIsChar(pFUN) ) { - if(mxGetString(pFUN, fun.f, FLEN) != 0) + if( mxGetString(pFUN, fun.f, FLEN) != 0 ) mexErrMsgTxt("error reading objective name string"); fun.nrhs = 1; fun.xrhs = 0; - } else + } + else { fun.prhs[0] = (mxArray*)pFUN; strcpy(fun.f, "feval"); fun.nrhs = 2; fun.xrhs = 1; } - fun.prhs[fun.xrhs] = mxCreateDoubleMatrix(ndec, 1, mxREAL); //x + fun.prhs[fun.xrhs] = mxCreateDoubleMatrix( ndec, 1, mxREAL ); //x //Get x0 x0 = mxGetPr(pX0); //Get xtype - if(nrhs > eXTYPE && !mxIsEmpty(pXTYPE)) + if( nrhs > eXTYPE && !mxIsEmpty(pXTYPE) ) xtype = mxArrayToString(pXTYPE); //Get MEX Options if specified - if(nrhs > eOPTS && !mxIsEmpty(pOPTS)) { - if(mxGetField(pOPTS,0,"display_degree") && !mxIsEmpty(mxGetField(pOPTS,0,"display_degree"))) + if( nrhs > eOPTS && !mxIsEmpty(pOPTS) ) + { + if( mxGetField(pOPTS,0,"display_degree") && !mxIsEmpty(mxGetField(pOPTS,0,"display_degree")) ) printLevel = (int)*mxGetPr(mxGetField(pOPTS,0,"display_degree")); - if(mxGetField(pOPTS,0,"param_file") && !mxIsEmpty(mxGetField(pOPTS,0,"param_file"))) + if( mxGetField(pOPTS,0,"param_file") && !mxIsEmpty(mxGetField(pOPTS,0,"param_file")) ) paramfile = mxArrayToString(mxGetField(pOPTS,0,"param_file")); - if(mxGetField(pOPTS,0,"bb_output_type") && !mxIsEmpty(mxGetField(pOPTS,0,"bb_output_type"))) + if( mxGetField(pOPTS,0,"bb_output_type") && !mxIsEmpty(mxGetField(pOPTS,0,"bb_output_type")) ) bb_out_type = mxGetField(pOPTS,0,"bb_output_type"); - if(mxGetField(pOPTS,0,"iterfun") && !mxIsEmpty(mxGetField(pOPTS,0,"iterfun"))) + if( mxGetField(pOPTS,0,"iterfun") && !mxIsEmpty(mxGetField(pOPTS,0,"iterfun")) ) { iterF.prhs[0] = (mxArray*)mxGetField(pOPTS,0,"iterfun"); strcpy(iterF.f, "feval"); @@ -702,7 +728,7 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) iterF.prhs[2] = mxCreateDoubleMatrix(1,1,mxREAL); iterF.prhs[3] = mxCreateDoubleMatrix(ndec,1,mxREAL); } - // This is for categorical variables + if(mxGetField(pOPTS,0,"neighbors_mat") && !mxIsEmpty(mxGetField(pOPTS,0,"neighbors_mat"))) { strcpy(neighborsF.f, "feval"); @@ -712,22 +738,27 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) } } - + //Setup ndec p.set_DIMENSION((int)ndec); + //Warn if >1000 - if(ndec > 1000 && printLevel) { + if(ndec > 1000 && printLevel) + { sprintf(errstr,"Warning: NOMAD is designed for problems with less than 1000 variables. Your model has %d.\nWhile unlikely, it is possible that NOMAD may not perform as intended on this problem.",static_cast<int>(ndec)); mexWarnMsgTxt(errstr); } //Setup Lower Bounds - if(nrhs > eLB && !mxIsEmpty(pLB)) { + if( nrhs > eLB && !mxIsEmpty(pLB) ) + { NOMAD::Point ptLB; NOMAD::Double *dLB = new NOMAD::Double[ndec]; lb = mxGetPr(pLB); - for(i=0;i<ndec;i++) { + + for(i=0;i<ndec;i++) + { if(!mxIsInf(lb[i])) //if not initialized will not be used dLB[i] = lb[i]; } @@ -735,13 +766,15 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) p.set_LOWER_BOUND(ptLB); delete [] dLB; } + //Setup Upper Bounds - if(nrhs > eUB && !mxIsEmpty(pUB)) + if( nrhs > eUB && !mxIsEmpty(pUB) ) { NOMAD::Point ptUB; NOMAD::Double *dUB = new NOMAD::Double[ndec]; ub = mxGetPr(pUB); - for(i=0;i<ndec;i++) { + for(i=0;i<ndec;i++) + { if(!mxIsInf(ub[i])) //if not initialized will not be used dUB[i] = ub[i]; } @@ -752,10 +785,11 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) //Setup x0 nx0 = new NOMAD::Double[ndec]; + #ifdef OPTI_VERSION double xl, xu; //If integer variables declared, need to ensure x0[i] is an integer - if(xtype) + if( xtype ) { for(i=0;i<ndec;i++) { @@ -773,17 +807,22 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) case 'i': case 'b': xl = floor(x0[i]); //First round is a floor + //If lower bounds exist - if(lb) { + if( lb ) + { //if lower bound broken - if(xl < lb[i]) { + if( xl < lb[i] ) + { xu = ceil(x0[i]); //If upper bounds exist, check bound directions - if(ub && xu > ub[i]) { //if broken, no integer x0 exists + if( ub && xu > ub[i] ) + { //if broken, no integer x0 exists sprintf(errstr,"x0[%d] cannot be rounded to an integer value between lb: %g, ub %g",i,lb[i],ub[i]); mexErrMsgTxt(errstr); } - if(xu != x0[i]) { //If we changed something, warn user + if( xu != x0[i] ) + { //If we changed something, warn user sprintf(errstr,"x0[%d] was rounded up to %g to suit NOMAD interface",i,xu); mexWarnMsgTxt(errstr); } @@ -791,8 +830,10 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) nx0[i] = xu; } //Floor value did not break lower bounds, value OK - else { - if(xl != x0[i]) { //If we changed something, warn user + else + { + if( xl != x0[i] ) + { //If we changed something, warn user sprintf(errstr,"x0[%d] was rounded down to %g to suit NOMAD interface",i,xl); mexWarnMsgTxt(errstr); } @@ -802,7 +843,8 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) } //No lower bounds, floor value assumed OK else { - if(xl != x0[i]) { //If we changed something, warn user + if( xl != x0[i] ) + { //If we changed something, warn user sprintf(errstr,"x0[%d] was rounded down to %g to suit NOMAD interface",i,xl); mexWarnMsgTxt(errstr); } @@ -820,9 +862,11 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) } } //Else user start position within bounds - else { - for(i=0;i<ndec;i++) { - if(lb && x0[i] < lb[i]) + else + { + for(i=0;i<ndec;i++) + { + if( lb && x0[i] < lb[i] ) nx0[i] = lb[i]; else if(ub && x0[i] > ub[i]) nx0[i] = ub[i]; @@ -841,24 +885,30 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) #ifdef OPTI_VERSION //Setup Nonlinear Constraints - if(nrhs > eNLCON && !mxIsEmpty(pNLCON)) { - if (mxIsChar(pNLCON)) { + if( nrhs > eNLCON && !mxIsEmpty(pNLCON) ) + { + if ( mxIsChar(pNLCON) ) + { if(mxGetString(pNLCON, con.f, FLEN) != 0) mexErrMsgTxt("error reading constraint name string"); con.nrhs = 1; con.xrhs = 0; - } else { + } + else + { con.prhs[0] = (mxArray*)pNLCON; strcpy(con.f, "feval"); con.nrhs = 2; con.xrhs = 1; } con.prhs[con.xrhs] = mxCreateDoubleMatrix(ndec, 1, mxREAL); //x - if(nrhs < eNLRHS+1 || mxIsEmpty(pNLRHS)) {//we will default to <= 0 + if(nrhs < eNLRHS+1 || mxIsEmpty(pNLRHS)) + {//we will default to <= 0 ncon = -1; con.nlrhs = NULL; } - else { + else + { ncon = (int)mxGetNumberOfElements(pNLRHS); con.nlrhs = mxGetPr(pNLRHS); } @@ -875,28 +925,29 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) #endif //GERAD Version does not have a separate constraint handler and handles input and output types using options - // evaluation tags and numbers are reset - NOMAD::Eval_Point::reset_tags_and_bbes(); + // Make sure that evaluation numbers are reset + NOMAD::Eval_Point::reset_tags_and_bbes(); - // Reset the random number generator for each mads run. // The seed will always be to its default value NOMAD::RNG::reset_seed_to_default(); //Set User Options - if(nrhs > eOPTS && !mxIsEmpty(pOPTS)) + if( nrhs > eOPTS && !mxIsEmpty(pOPTS) ) setNOMADopts(p,pOPTS); else setNOMADopts(p,NULL); //If the user has specified a parameter file to read, see if it exists, and if so, read and parse it. - if(paramfile) + if( paramfile ) { FILE *pFile = fopen(paramfile,"r"); - if(pFile==NULL) { + if(pFile==NULL) + { sprintf(errstr,"Cannot open parameter file: %s\n\nEnsure it exists!",paramfile); mexErrMsgTxt(errstr); } - else{ + else + { fclose(pFile); //close file pointer (we don't need it) try { @@ -915,7 +966,8 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { p.check(); } - catch(exception &e) { + catch(exception &e) + { sprintf(errstr,"NOMAD Parameter Error:\n\n%s",e.what()); mexErrMsgTxt(errstr); } @@ -924,21 +976,36 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) #ifndef OPTI_VERSION nobj=p.get_nb_obj(); ncon=(int)p.get_bb_output_type().size()-nobj; - if (p.has_sgte()) { + if ( p.has_sgte() ) + { fun.prhs[fun.xrhs+1] = mxCreateLogicalMatrix(1,1); //extra logical indicating surrogate or not fun.nrhs++; } #endif + + + // Get additional bb param if specified + if ( nrhs > ePARAM && ! mxIsEmpty(pParam) ) + { + fun.nrhs++; + + if ( p.has_sgte() ) + fun.prhs[fun.xrhs+2]=mxDuplicateArray(pParam); + else + fun.prhs[fun.xrhs+1]=mxDuplicateArray(pParam); + } + //Print Header - if(printLevel) { + if(printLevel) + { mexPrintf("\n------------------------------------------------------------------\n"); mexPrintf(" This is NOMAD v%s\n",NOMAD::VERSION.c_str()); - mexPrintf(" Authors: M. Abramson, C. Audet, G. Couture, J. Dennis, S. Le Digabel, C. Tribes\n"); + mexPrintf(" Authors: C. Audet, S. Le Digabel and C. Tribes\n"); #ifdef OPTI_VERSION mexPrintf(" MEX Interface (OPTI) J. Currie 2012\n\n"); #else - mexPrintf(" MEX Interface (GERAD) J. Currie 2012 and C.Tribes 2015 \n\n"); + mexPrintf(" MEX Interface (GERAD) J. Currie 2012 and C. Tribes 2016 \n\n"); #endif mexPrintf(" Problem Properties:\n"); mexPrintf(" # Decision Variables: %4d\n",ndec); @@ -952,7 +1019,7 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) //Create evaluator and run mads based on number of objectives try { - if(nobj > 1) + if( nobj > 1 ) { mBEval = new matlabMEval(p,&fun,nobj,&con,ncon,&iterF); //Bi-Objective Evaluator @@ -999,8 +1066,6 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) mxFree(xtype); xtype = NULL; - delete mads; - sprintf(errstr,"NOMAD Run Error:\n\n%s",e.what()); mexErrMsgTxt(errstr); } @@ -1008,99 +1073,120 @@ void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) if(printLevel) mexPrintf("------------------------------------------------------------------\n"); - //Obtain Solution - - - //Create Outputs + + //Create Outputs plhs[2] = mxCreateDoubleMatrix(1,1, mxREAL); plhs[3] = mxCreateDoubleMatrix(1,1, mxREAL); plhs[4] = mxCreateDoubleMatrix(1,1, mxREAL); + plhs[5] = mxCreateDoubleMatrix(ndec,1, mxREAL); + plhs[6] = mxCreateDoubleMatrix(ndec,1, mxREAL); + exitflag = mxGetPr(plhs[2]); iter = mxGetPr(plhs[3]); nfval = mxGetPr(plhs[4]); - if (nobj>1) - { - - NOMAD::Pareto_Front * pareto_front=mads->get_pareto_front(); + + double *mesh_size=mxGetPr(plhs[5]); + + //Save mesh size + NOMAD::Point ms( static_cast<int>(ndec) ); + p.get_signature()->get_mesh()->get_delta(ms); + for(i=0;i<ndec;i++) + mesh_size[i] = ms[i].value(); + + double *poll_size=mxGetPr(plhs[6]); + //Save poll size + NOMAD::Point ps( static_cast<int>(ndec) ); + p.get_signature()->get_mesh()->get_Delta(ps); + for(i=0;i<ndec;i++) + poll_size[i] = ps[i].value(); + + if (nobj>1) + { + + NOMAD::Pareto_Front * pareto_front=mads->get_pareto_front(); - if ( pareto_front ) - { - - int nb_pareto_pts = pareto_front->size(); - plhs[0] = mxCreateDoubleMatrix(ndec,nb_pareto_pts, mxREAL); - plhs[1] = mxCreateDoubleMatrix(nobj,nb_pareto_pts, mxREAL); - double *x = mxGetPr(plhs[0]); - double *fval = mxGetPr(plhs[1]); + if ( pareto_front ) + { - const NOMAD::Eval_Point * cur = pareto_front->begin(); - int i=0; - while ( cur ) - { - - if ( cur->is_eval_ok() && cur->is_feasible ( p.get_h_min() ) ) - { - const std::list<int> & index_obj = p.get_index_obj(); - std::list<int>::const_iterator it , end = index_obj.end(); - const NOMAD::Point & bbo = cur->get_bb_outputs(); - int j = 0; - NOMAD::Point multi_obj ( static_cast<int>(index_obj.size()) ); - - for ( it = index_obj.begin() ; it != end ; ++it,j++ ) - fval[nobj*i+j] = bbo[*it].value(); - - for(j=0;j<ndec;j++) - x[ndec*i+j] = (*cur)[j].value(); - } - cur = pareto_front->next(); - i++; - } - *exitflag = getStatus(stopflag); + int nb_pareto_pts = pareto_front->size(); + plhs[0] = mxCreateDoubleMatrix(ndec,nb_pareto_pts, mxREAL); + plhs[1] = mxCreateDoubleMatrix(nobj,nb_pareto_pts, mxREAL); + double *x = mxGetPr(plhs[0]); + double *fval = mxGetPr(plhs[1]); - } - else - { - stopflag = (NOMAD::stop_type)10; - *exitflag = -1; //No solution - } - //Save Status & Iterations + const NOMAD::Eval_Point * cur = pareto_front->begin(); + int i=0; + while ( cur ) + { + + if ( cur->is_eval_ok() && cur->is_feasible ( p.get_h_min() ) ) + { + const std::list<int> & index_obj = p.get_index_obj(); + std::list<int>::const_iterator it , end = index_obj.end(); + const NOMAD::Point & bbo = cur->get_bb_outputs(); + int j = 0; + NOMAD::Point multi_obj ( static_cast<int>(index_obj.size()) ); + + for ( it = index_obj.begin() ; it != end ; ++it,j++ ) + fval[nobj*i+j] = bbo[*it].value(); + + for(j=0;j<ndec;j++) + x[ndec*i+j] = (*cur)[j].value(); + } + cur = pareto_front->next(); + i++; + } + *exitflag = getStatus(stopflag); + + } + else + { + stopflag = (NOMAD::stop_type)10; + *exitflag = -1; //No solution + } + //Save Status & Iterations - *iter = mads->get_stats().get_iterations(); - *nfval = mads->get_stats().get_bb_eval(); - - } - else - { + *iter = mads->get_stats().get_iterations(); + *nfval = mads->get_stats().get_bb_eval(); - plhs[0] = mxCreateDoubleMatrix(ndec,1, mxREAL); - plhs[1] = mxCreateDoubleMatrix(1,1, mxREAL); //even bi-objectives return 1 fval - double *x = mxGetPr(plhs[0]); - double *fval = mxGetPr(plhs[1]); - - const NOMAD::Eval_Point *bestSol = mads->get_best_feasible(); - if(bestSol == NULL) - { - bestSol = mads->get_best_infeasible(); - //manually set as infeasible (no infeasible stop flag) - stopflag = (NOMAD::stop_type)10; - } - if(bestSol == NULL) - *exitflag = -1; //No solution + } + else + { + + plhs[0] = mxCreateDoubleMatrix(ndec,1, mxREAL); + plhs[1] = mxCreateDoubleMatrix(1,1, mxREAL); + double *x = mxGetPr(plhs[0]); + double *fval = mxGetPr(plhs[1]); + + + const NOMAD::Eval_Point *bestSol = mads->get_best_feasible(); + if(bestSol == NULL) + { + bestSol = mads->get_best_infeasible(); + //manually set as infeasible (no infeasible stop flag) + stopflag = (NOMAD::stop_type)10; + } + if(bestSol == NULL) + *exitflag = -1; //No solution - //If we have a solution, save it - if(*exitflag != -1) { - //Save x - NOMAD::Point pt(*bestSol); - for(i=0;i<ndec;i++) - x[i] = pt[i].value(); - //Save fval - *fval = bestSol->get_f().value(); + //If we have a solution, save it + if(*exitflag != -1) + { + //Save x + NOMAD::Point pt(*bestSol); + for(i=0;i<ndec;i++) + x[i] = pt[i].value(); + //Save fval + *fval = bestSol->get_f().value(); - //Save Status & Iterations - *exitflag = getStatus(stopflag); - *iter = mads->get_stats().get_iterations(); - *nfval = mads->get_stats().get_bb_eval(); - } - } + //Save Status & Iterations + *exitflag = getStatus(stopflag); + *iter = mads->get_stats().get_iterations(); + *nfval = mads->get_stats().get_bb_eval(); + + } + } + //Return error control to default mexSetTrapFlag(0); @@ -1132,43 +1218,48 @@ vector<NOMAD::bb_output_type> detRetTypes(usrFcn *fun, mxArray *out_types, int * //Test Blackbox / Objective Evaluation fun->plhs[0] = NULL; memcpy(mxGetPr(fun->prhs[fun->xrhs]), x0, n * sizeof(double)); + //Call MATLAB Objective stat = mexCallMATLAB(1, fun->plhs, fun->nrhs, fun->prhs, fun->f); if(stat) mexErrMsgTxt("Error calling Objective Function!"); //Ensure we have a real column - if(mxGetN(fun->plhs[0]) > mxGetM(fun->plhs[0])) + if( mxGetN(fun->plhs[0]) > mxGetM(fun->plhs[0]) ) mexErrMsgTxt("The objective function must return a scalar or column vector"); - if(mxIsSparse(fun->plhs[0]) || mxIsComplex(fun->plhs[0])) + if( mxIsSparse(fun->plhs[0]) || mxIsComplex(fun->plhs[0]) ) mexErrMsgTxt("The objective function must return a real, dense, vector"); //Ensure 1 or 2 rows (max of bi-objective) *nobj = (int)mxGetNumberOfElements(fun->plhs[0]); - if(*nobj < 1 || *nobj > 2) + if( *nobj < 1 || *nobj > 2 ) mexErrMsgTxt("The objective function must return a scalar or 2x1 vector (bi-objective)"); + // Clean up LHS Ptr mxDestroyArray(fun->plhs[0]); //Test Constraint Evaluation - if(*ncon) { + if( *ncon ) + { con->plhs[0] = NULL; memcpy(mxGetPr(con->prhs[con->xrhs]), x0, n * sizeof(double)); //Call MATLAB Objective stat = mexCallMATLAB(1, con->plhs, con->nrhs, con->prhs, con->f); - if(stat) + if( stat ) mexErrMsgTxt("Error calling Constraint Function!"); //Ensure we have a real column - if(mxGetN(con->plhs[0]) > mxGetM(con->plhs[0])) + if( mxGetN(con->plhs[0]) > mxGetM(con->plhs[0]) ) mexErrMsgTxt("The constraint function must return a scalar or column vector"); - if(mxIsSparse(con->plhs[0]) || mxIsComplex(con->plhs[0])) + if( mxIsSparse(con->plhs[0]) || mxIsComplex(con->plhs[0]) ) mexErrMsgTxt("The constraint function must return a real, dense, vector"); //If we have nlrhs, check against returned vector - if(*ncon > 0) { + if(*ncon > 0) + { if(mxGetM(con->plhs[0]) != *ncon) mexErrMsgTxt("The vector returned from nlcon is not the same length as nlrhs!"); } - else { + else + { *ncon = (int)mxGetM(con->plhs[0]); con->nlrhs = mxGetPr(mxCreateDoubleMatrix(*ncon,1, mxREAL)); //create dummy rhs } @@ -1182,13 +1273,15 @@ vector<NOMAD::bb_output_type> detRetTypes(usrFcn *fun, mxArray *out_types, int * for(i=0;i<*nobj;i++) varType[i] = NOMAD::OBJ; //If the user has set bb_output_type use it to set constraint types - if(out_types) { - if(!mxIsCell(out_types)) + if( out_types ) + { + if( !mxIsCell(out_types) ) mexErrMsgTxt("Parameter bb_output_type must be a cell array of strings."); - if(mxGetNumberOfElements(out_types) != *ncon) + if( mxGetNumberOfElements(out_types) != *ncon ) mexErrMsgTxt("You must specify a bb_output_type for each element returned by the constraint function (not objective)."); //Process each element in the array - for(i=0,j=*nobj;i<*ncon;i++,j++){ + for(i=0,j=*nobj;i<*ncon;i++,j++) + { mxArray *ctype = mxGetCell(out_types,i); if(!mxIsChar(ctype)) mexErrMsgTxt("An element in the bb_output_type paramter is not a string"); @@ -1243,7 +1336,8 @@ NOMAD::bb_output_type getOutEnum(char *str) void lower(char *str) { int i = 0; - while(str[i]) { + while(str[i]) + { str[i] = tolower(str[i]); i++; } @@ -1255,14 +1349,15 @@ vector<NOMAD::bb_input_type> detInTypes(char *xtype, size_t n) int i; char msgbuf[1024]; vector<NOMAD::bb_input_type> varType(n); - for(i=0;i<n;i++) { + for(i=0;i<n;i++) + { switch(tolower(xtype[i])) { case 'c': - varType[i] = NOMAD::CATEGORICAL; break; + varType[i] = NOMAD::CATEGORICAL; break; case 'r': varType[i] = NOMAD::CONTINUOUS; break; - mexErrMsgTxt("Please specify continuous (real) variables using 'c' when using the OPTI version"); + mexErrMsgTxt("Please specify continuous (real) variables using 'c' when using the OPTI version"); // C-> categorical (not implemented in Matlab version) R-> continuous/real ! case 'i': varType[i] = NOMAD::INTEGER; break; case 'b': @@ -1282,7 +1377,8 @@ int checkInputs(const mxArray *prhs[], int nrhs, mxArray *plhs[], int nlhs) char *str = NULL; //MEX Display Version (OPTI compatibility) - if (nrhs < 1) { + if (nrhs < 1) + { if(nlhs < 1) printSolverInfo(); else @@ -1292,58 +1388,65 @@ int checkInputs(const mxArray *prhs[], int nrhs, mxArray *plhs[], int nlhs) //Redirect cout std::streambuf *cout_sbuf = std::cout.rdbuf(); //keep existing buffer - std::cout.rdbuf(&buf); //redirect buffer + std::cout.rdbuf(&buf); //redirect buffer //NOMAD Display NOMAD::Display out (std::cout); //Check for display on options passed as structure - if(nrhs == 1 && mxIsStruct(prhs[0])) { + if(nrhs == 1 && mxIsStruct(prhs[0])) + { int i, no = mxGetNumberOfFields(prhs[0]); const char *field; std::list<std::string> ls; //For all fields, display nomad help - for(i=0;i<no;i++) { + for(i=0;i<no;i++) + { field = mxGetFieldNameByNumber(prhs[0],i); string st(field); ls.push_back ( st ); } - if(no>0) { + if(no>0) + { //NOMAD Display - NOMAD::Parameters p ( out ); + NOMAD::Parameters p ( out ); p.help(ls); } - std::cout.rdbuf(cout_sbuf); //Return cout to initial buffer + std::cout.rdbuf(cout_sbuf); //Return cout to initial buffer return 0; } //Check for Version / Information / Help Request - if(nrhs == 1 && mxIsChar(prhs[0])) { + if(nrhs == 1 && mxIsChar(prhs[0])) + { str = mxArrayToString(prhs[0]); //Check for Info Request - if(!strcmp(str,"-I") || !strcmp(str,"-INFO") || !strcmp(str,"-i") || !strcmp(str,"-info")) { + if(!strcmp(str,"-I") || !strcmp(str,"-INFO") || !strcmp(str,"-i") || !strcmp(str,"-info")) + { //Information to Print mexPrintf("\nNOMAD Blackbox Optimization Software, v%s\n\n",NOMAD::VERSION.c_str()); - mexPrintf("Copyright (C) 2001-2015\n"); - mexPrintf("Mark A. Abramson - The Boeing Company\n"); - mexPrintf("Charles Audet - Ecole Polytechnique de Montreal\n"); - mexPrintf("Gilles Couture - Ecole Polytechnique de Montreal\n"); - mexPrintf("John E. Dennis, Jr. - Rice University\n"); - mexPrintf("Sebastien Le Digabel - Ecole Polytechnique de Montreal\n"); - mexPrintf("Christophe Tribes - Ecole Polytechnique de Montreal\n\n"); - mexPrintf("Funded in part by AFOSR and Exxon Mobil.\n\n"); - mexPrintf("License : \'%s\'\n",NOMAD::LGPL_FILE.c_str()); - mexPrintf("User guide: \'%s\'\n",NOMAD::USER_GUIDE_FILE.c_str()); - mexPrintf("Examples : \'%s\'\n",NOMAD::EXAMPLES_DIR.c_str()); - mexPrintf("Tools : \'%s\'\n\n",NOMAD::TOOLS_DIR.c_str()); - mexPrintf("Please report NOMAD bugs to nomad@gerad.ca and MEX Interface bugs to jocurrie@aut.ac.nz\n\n"); + mexPrintf("NOMAD - version %s has been created by {\n",NOMAD::VERSION.c_str()); + mexPrintf(" Charles Audet - Ecole Polytechnique de Montreal\n"); + mexPrintf(" Sebastien Le Digabel - Ecole Polytechnique de Montreal\n"); + mexPrintf(" Christophe Tribes - Ecole Polytechnique de Montreal\n}\n\n"); + mexPrintf("The copyright of NOMAD - version %s is owned by {\n",NOMAD::VERSION.c_str()); + mexPrintf(" Sebastien Le Digabel - Ecole Polytechnique de Montreal\n"); + mexPrintf(" Christophe Tribes - Ecole Polytechnique de Montreal\n}\n\n"); + mexPrintf("NOMAD version 3 is a new version of Nomad v1 and v2, it has been funded by AFOSR and Exxon Mobil.\n"); + mexPrintf("Nomad v1 and v2 were created and developed by Mark A. Abramson from The Boeing Company, Charles Audet and Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from Rice University, and were funded by AFOSR and Exxon Mobil.\n\n"); + mexPrintf("Web : www.gerad.ca/nomad\n"); + mexPrintf("License : \'%s\'\n",NOMAD::LGPL_FILE.c_str()); + mexPrintf("User guide: \'%s\'\n",NOMAD::USER_GUIDE_FILE.c_str()); + mexPrintf("Examples : \'%s\'\n",NOMAD::EXAMPLES_DIR.c_str()); + mexPrintf("Tools : \'%s\'\n\n",NOMAD::TOOLS_DIR.c_str()); + mexPrintf("Please report bugs to nomad@gerad.ca\n\n"); std::cout.rdbuf(cout_sbuf); //Return cout to initial buffer return 0; } //Check for Ver Request if(!strcmp(str,"-V") || !strcmp(str,"-v") || !strcmp(str,"-version")) - { + { mexPrintf("NOMAD - version %s - www.gerad.ca/nomad\n\n",NOMAD::VERSION.c_str()); #ifdef OPTI_VERSION mexPrintf("MEX Interface (OPTI) v%s\n",NOMADMEX_VERSION); @@ -1353,23 +1456,23 @@ int checkInputs(const mxArray *prhs[], int nrhs, mxArray *plhs[], int nlhs) std::cout.rdbuf(cout_sbuf); //Return cout to initial buffer return 0; - } + } //Check for Help Request if (strcmp(str,"-H")<0 || strcmp(str,"-HELP")<0 || strcmp(str,"-h")<0 || strcmp(str,"-help")<0 ) - { + { NOMAD::Parameters p ( out ); - std::list<std::string> helpS; - const char * toks=" "; - char *w = strtok(str,toks) ; - for ( w = strtok(NULL,toks) ; w != NULL ; w = strtok(NULL,toks) ) - { - helpS.push_back(w); - } - p.help (helpS ); + std::list<std::string> helpS; + const char * toks=" "; + char *w = strtok(str,toks) ; + for ( w = strtok(NULL,toks) ; w != NULL ; w = strtok(NULL,toks) ) + { + helpS.push_back(w); + } + p.help (helpS ); std::cout.rdbuf(cout_sbuf); //Return cout to initial buffer return 0; - } + } } //Otherwise assume we have a normal problem @@ -1387,7 +1490,8 @@ int checkInputs(const mxArray *prhs[], int nrhs, mxArray *plhs[], int nlhs) ndec = mxGetNumberOfElements(prhs[1]); //Check Bounds - if(nrhs > 2) { + if(nrhs > 2) + { if(!mxIsDouble(pLB) || mxIsComplex(pLB)) mexErrMsgTxt("lb must be a real double column vector!"); if(nrhs > 3 && (!mxIsDouble(pUB) || mxIsComplex(pUB))) @@ -1405,14 +1509,16 @@ int checkInputs(const mxArray *prhs[], int nrhs, mxArray *plhs[], int nlhs) mexErrMsgTxt("It appears you may be calling NOMAD using the GERAD NOMAD Syntax - nomad(bb,x0,lb,ub,opts). This is the OPTI NOMAD version and requires nomad(fun,x0,lb,ub,nlcon,nlrhs,xtype,opts)."); //Check Nonlinear Constraint Handle - if(nrhs > eNLCON && !mxIsEmpty(pNLCON)) { + if(nrhs > eNLCON && !mxIsEmpty(pNLCON)) + { if(!mxIsFunctionHandle(pNLCON) && !mxIsChar(pNLCON)) mexErrMsgTxt("nlcon must be a function handle or function name!"); if(nrhs > eNLRHS && (!mxIsDouble(pNLRHS) || mxIsComplex(pNLRHS))) mexErrMsgTxt("nlrhs must be a real double column vector!"); } //Check for xtype - if(nrhs > eXTYPE && !mxIsEmpty(pXTYPE)) { + if(nrhs > eXTYPE && !mxIsEmpty(pXTYPE)) + { if(!mxIsChar(pXTYPE)) mexErrMsgTxt("The xtype vector must be a char array!"); if(ndec != mxGetNumberOfElements(pXTYPE)) @@ -1425,7 +1531,8 @@ int checkInputs(const mxArray *prhs[], int nrhs, mxArray *plhs[], int nlhs) #endif //Check Options - if(nrhs > eOPTS && !mxIsEmpty(pOPTS)) { + if(nrhs > eOPTS && !mxIsEmpty(pOPTS)) + { //Version check if(mxIsDouble(pOPTS)) mexErrMsgTxt("It appears you may be calling NOMAD using the OPTI NOMAD Syntax - nomad(fun,x0,lb,ub,nlcon,nlrhs,xtype,opts). This is the GERAD NOMAD version and requires nomad(bb,x0,lb,ub,opts)."); @@ -1456,28 +1563,34 @@ void setNOMADopts(NOMAD::Parameters &p, const mxArray *opts) no = mxGetNumberOfFields(opts); //For each field, check if it's empty, if not, set it within NOMAD - for(i=0;i<no;i++) { + for(i=0;i<no;i++) + { field = mxGetFieldNameByNumber(opts,i); value = mxGetFieldByNumber(opts,0,i); + //Check we don't have an empty or MEX option - if(!mxIsEmpty(value) && isNMDOption(field)) { + if( !mxIsEmpty(value) && isNMDOption(field) ) + { //Switch on data type - switch(mxGetClassID(value)) + switch( mxGetClassID(value) ) { case mxDOUBLE_CLASS: m = mxGetNumberOfElements(value); //This interface doesn't write vectors as options - if(m > 1) { + if(m > 1) + { sprintf(strbuf,"This interface does not support vector options for parameter %s. Please provide it as a string",field); mexErrMsgTxt(strbuf); } val = *mxGetPr(value); //Check if we have an integer parameter (I assume this check is ok!) - if(floor(val) == val) { + if(floor(val) == val) + { sprintf(strbuf,"%s %.0f",field,val); doAdd = true; //write with no decimal points and no exponent } - else {//write as double (exponent ok) + else + {//write as double (exponent ok) sprintf(strbuf,"%s %g",field,val); doAdd = true; } break; @@ -1500,23 +1613,28 @@ void setNOMADopts(NOMAD::Parameters &p, const mxArray *opts) #ifdef OPTI_VERSION //Add each string for the specified field m = mxGetNumberOfElements(value); - for(j=0;j<m;j++) { + for(j=0;j<m;j++) + { mxArray *cellopt = mxGetCell(value,j); - if(!mxIsChar(cellopt)) { + if( !mxIsChar(cellopt) ) + { sprintf(strbuf,"Element %d in the cell array of paramter %s is not a string",j+1,field); mexErrMsgTxt(strbuf); } //Get the string and create the required option string char *str = mxArrayToString(cellopt); sprintf(strbuf,"%s %s",field,str); + //Add to our set of parameter entries NOMAD::Parameter_Entry *pe = new NOMAD::Parameter_Entry(strbuf); // pe will be deleted by ~Parameter_Entries() - if(pe->is_ok()) + if( pe->is_ok() ) entries.insert(pe); - else { + else + { sprintf(strbuf,"Parameter %s has an error",field); mexErrMsgTxt(strbuf); } + //Free local memory at each iteration mxFree(str); } @@ -1532,24 +1650,25 @@ void setNOMADopts(NOMAD::Parameters &p, const mxArray *opts) } //If we have a valid parameter, add it to our set of entries - if(doAdd) { + if( doAdd ) { //mexPrintf("NOMAD Option set as: %s\n",strbuf); //enable for debug NOMAD::Parameter_Entry *pe = new NOMAD::Parameter_Entry(strbuf); - if(pe->is_ok()) + if( pe->is_ok() ) entries.insert(pe); // pe will be deleted by ~Parameter_Entries() else - { + { sprintf(strbuf,"Parameter %s has an error",field); mexErrMsgTxt(strbuf); } - + doAdd = false; } } } //GERAD default bb_output_type if not specified #ifndef OPTI_VERSION - if(!has_BB_OUTPUT_TYPE) { + if( ! has_BB_OUTPUT_TYPE ) + { NOMAD::Parameter_Entry *pe = new NOMAD::Parameter_Entry("BB_OUTPUT_TYPE OBJ"); entries.insert(pe); // pe will be deleted by ~Parameter_Entries() } @@ -1628,8 +1747,8 @@ void printSolverInfo() mexPrintf("\n-----------------------------------------------------------\n"); mexPrintf(" NOMAD: Nonlinear Optimization using the MADS Algorithm [v%s]\n",NOMAD::VERSION.c_str()); mexPrintf(" - Released under the GNU Lesser General Public License: http://www.gnu.org/copyleft/lesser.html\n"); - mexPrintf(" - Source available from: http://www.gerad.ca/NOMAD/Project/Home.html\n"); + mexPrintf(" - Source available from: https://www.gerad.ca/nomad/\n"); - mexPrintf("\n MEX Interface J.Currie 2013 (www.i2c2.aut.ac.nz) and C.Tribes 2015 \n"); + mexPrintf("\n MEX Interface J.Currie 2013 (www.i2c2.aut.ac.nz) and C. Tribes 2015 \n"); mexPrintf("-----------------------------------------------------------\n"); } diff --git a/examples/interfaces/Matlab_MEX/example_categorical/run_nomad.m b/examples/interfaces/Matlab_MEX/example_categorical/run_nomad.m index c4d169f..3c93d8c 100644 --- a/examples/interfaces/Matlab_MEX/example_categorical/run_nomad.m +++ b/examples/interfaces/Matlab_MEX/example_categorical/run_nomad.m @@ -1,7 +1,7 @@ x0 = [0 100 1 100 ]'; lb = [-100 0.0 0 0.0 ]'; ub = [100 10000.0 100 10000]'; -opts = nomadset('display_degree',2,'max_bb_eval',200,'bb_output_type','EB EB OBJ','bb_input_type','[C R C R]','neighbors_mat',@neighbors); +opts = nomadset('display_degree',2,'display_all_eval',1,'history_file','history.txt','max_bb_eval',500,'bb_output_type','EB EB OBJ','f_target',0,'bb_input_type','[C R C R]','neighbors_mat',@neighbors); % Start optimization [x,fval] = nomad(@fun,x0,lb,ub,opts); diff --git a/examples/interfaces/Matlab_MEX/example_extra_param/bb.m b/examples/interfaces/Matlab_MEX/example_extra_param/bb.m new file mode 100644 index 0000000..b71bc0a --- /dev/null +++ b/examples/interfaces/Matlab_MEX/example_extra_param/bb.m @@ -0,0 +1,8 @@ +function eval = bb(x,extra_param) + +param = [0 ;0]; +if (nargin==2) + param=extra_param; +end + +eval=[10*(x(2)-x(1)^2)+param(1); 1 - x(1)+param(2)]; diff --git a/examples/interfaces/Matlab_MEX/example_extra_param/run_nomad.m b/examples/interfaces/Matlab_MEX/example_extra_param/run_nomad.m new file mode 100644 index 0000000..c7ec81f --- /dev/null +++ b/examples/interfaces/Matlab_MEX/example_extra_param/run_nomad.m @@ -0,0 +1,7 @@ +%% TEST FOR EXTRA BB PARAMETER +clc +x0 = [1;1]; + +bb_extra_param = [ 0 ; 1 ]; +opts = nomadset('display_degree',2,'bb_output_type','OBJ EB'); +[x,fval] = nomad(@bb,x0,[-10;-10],[10;10],opts,bb_extra_param) diff --git a/examples/interfaces/Matlab_MEX/example_group_variables/param.txt b/examples/interfaces/Matlab_MEX/example_group_variables/param.txt new file mode 100644 index 0000000..91163e0 --- /dev/null +++ b/examples/interfaces/Matlab_MEX/example_group_variables/param.txt @@ -0,0 +1,2 @@ +VARIABLE_GROUP 0 1 +VARIABLE_GROUP 2 3 \ No newline at end of file diff --git a/examples/interfaces/Matlab_MEX/example_group_variables/test.m b/examples/interfaces/Matlab_MEX/example_group_variables/test.m new file mode 100644 index 0000000..585abc0 --- /dev/null +++ b/examples/interfaces/Matlab_MEX/example_group_variables/test.m @@ -0,0 +1,19 @@ +%% PROBLEM 4 [fval = -2.5] + +clc +fun = @(x) [-x(1) - x(2) - x(3); + (x(2) - 1./2.)*(x(2) - 1./2.) + (x(3) - 1./2.)*(x(3) - 1./2.) - 1/4; + x(1) - x(2); + x(1) + x(3) + x(4) - 2]; +ub = [1;10;10;5]; +lb = [0;0;0;0]; +x0 = [0;0;0;0]; + +opts = []; %not no nomadset just to keep user options +opts.display_degree = 3; +opts.bb_output_type = 'OBJ PB PB PB'; +opts.model_search = 'false'; +opts.param_file='param.txt'; +opts.max_bb_eval = 20; + +[xr,fval,ef,iter] = nomad(fun,x0,lb,ub,opts) \ No newline at end of file diff --git a/examples/interfaces/Matlab_MEX/example_int_variables/param.txt b/examples/interfaces/Matlab_MEX/example_int_variables/param.txt new file mode 100644 index 0000000..2e03401 --- /dev/null +++ b/examples/interfaces/Matlab_MEX/example_int_variables/param.txt @@ -0,0 +1,3 @@ +GRANULARITY 0-0 1 +GRANULARITY 3-3 1 +INITIAL_MESH_SIZE 5 \ No newline at end of file diff --git a/examples/interfaces/Matlab_MEX/example_int_variables/run.m b/examples/interfaces/Matlab_MEX/example_int_variables/run.m new file mode 100644 index 0000000..872da6b --- /dev/null +++ b/examples/interfaces/Matlab_MEX/example_int_variables/run.m @@ -0,0 +1,10 @@ +%% MINLP 1 [fval = -5] +%clc +fun = @(x) [ (x(1) - 5)^2 + x(2)^2 - 25; + x(1)^2 - x(2) + 0.5 ]; +x0 = [10;10]; +opts = nomadset('display_degree',2,'initial_mesh_size','5','bb_input_type','[I I]','max_eval',100,'direction_type','ortho 2n','disable','models','bb_output_type','OBJ PB'); + +[xr,fval,ef,iter] = nomad(fun,x0,[],[],opts) + + diff --git a/examples/interfaces/Matlab_MEX/example_int_variables/run2.m b/examples/interfaces/Matlab_MEX/example_int_variables/run2.m new file mode 100644 index 0000000..934c0ca --- /dev/null +++ b/examples/interfaces/Matlab_MEX/example_int_variables/run2.m @@ -0,0 +1,23 @@ +%% PROBLEM 4 [fval = -2.5] +clc +fun = @(x) [-x(1) - x(2) - x(3); + (x(2) - 1./2.)*(x(2) - 1./2.) + (x(3) - 1./2.)*(x(3) - 1./2.) - 1/4; + x(1) - x(2); + x(1) + x(3) + x(4) - 2]; +ub = [1;10;10;5]; +lb = [0;0;0;0]; +x0 = [0;0;0;0]; + +opts = []; %just to keep user options +opts.display_degree = 2; +opts.bb_output_type = 'OBJ PB PB PB'; +opts.model_search = 'false'; +opts.model_eval_sort = 'false'; +opts.max_eval = 500; +opts.direction_type = 'ortho 2n'; +opts.param_file = 'param.txt'; +opts.anisotropic_mesh = 0; + +[xr,fval,ef,iter] = nomad(fun,x0,lb,ub,opts) + + diff --git a/examples/interfaces/Matlab_MEX/test_nomad_gerad.m b/examples/interfaces/Matlab_MEX/test_nomad_gerad.m index 810ca83..47d8c88 100755 --- a/examples/interfaces/Matlab_MEX/test_nomad_gerad.m +++ b/examples/interfaces/Matlab_MEX/test_nomad_gerad.m @@ -12,12 +12,12 @@ opts = nomadset('display_degree',2,'min_mesh_size','1e-004','initial_mesh_size', [x,fval] = nomad(fun,x0,lb,ub,opts); -%%Uncomment the following problems for further testing -% -% +%Uncomment the following problems for further testing + + % %% PROBLEM 2 -% %clc % % Blackbox Function +% %clc % bb = @(x) [29.4*x(1) + 18*x(2); % -(x(1) - 0.2458*x(1)^2/x(2)) + 6]; % % Bounds @@ -66,11 +66,9 @@ opts = nomadset('display_degree',2,'min_mesh_size','1e-004','initial_mesh_size', % [xr,fval,ef,iter] = nomad(fun,x0,lb,ub,opts) % % -% %% REMAINDER OF PROBLEMS OK -% % %% Rosenbrock [x = 1,1, fval = 0] -% %clc % % Blackbox Function +% %clc % bb = @(x) (1-x(1))^2 + 100 *(x(2)-x(1)^2)^2; % % Starting Guess % x0 = [0 0]'; @@ -78,8 +76,8 @@ opts = nomadset('display_degree',2,'min_mesh_size','1e-004','initial_mesh_size', % [x,fval,ef,iter] = nomad(bb,x0) % % %% St_e01 [x = 6,0.6667, fval = -6.6667] -% %clc % % Blackbox Function +% %clc % bb = @(x) [-x(1) - x(2); % x(1)*x(2) - 4]; % % Bounds @@ -127,7 +125,7 @@ opts = nomadset('display_degree',2,'min_mesh_size','1e-004','initial_mesh_size', % [x,fval,ef,iter] = nomad(bb,x0,lb,ub,opts) % % %% MINLP 1 [fval = -5] -% clc +% %clc % fun = @(x) [ (x(1) - 5)^2 + x(2)^2 - 25; % x(1)^2 - x(2) + 0.5 ]; % x0 = [0;0]; @@ -150,3 +148,4 @@ opts = nomadset('display_degree',2,'min_mesh_size','1e-004','initial_mesh_size', % opts = nomadset('display_degree',2,'multi_overall_bb_eval',100,'bb_output_type','obj obj eb'); % % [xr,fval,ef,iter] = nomad(bb,x0,lb,ub,opts) +% diff --git a/install/install.sh b/install/install.sh index a38c847..27e136c 100755 --- a/install/install.sh +++ b/install/install.sh @@ -1,44 +1,51 @@ #!/bin/bash -#-------------------------------------------------------------------------------------*/ -# NOMAD - Nonsmooth Optimization by Mesh Adaptive Direct search - version 3.7.2 */ -# */ -# Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -# Charles Audet - Ecole Polytechnique, Montreal */ -# Gilles Couture - Ecole Polytechnique, Montreal */ -# John Dennis - Rice University, Houston */ -# Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -# Christophe Tribes - Ecole Polytechnique, Montreal */ -# */ -# funded in part by AFOSR and Exxon Mobil */ -# */ -# Author: Christophe Tribes */ -# */ -# Contact information: */ -# Ecole Polytechnique de Montreal - GERAD */ -# C.P. 6079, Succ. Centre-ville, Montreal (Quebec) H3C 3A7 Canada */ -# e-mail: nomad@gerad.ca */ -# phone : 1-514-340-6053 #6928 */ -# fax : 1-514-340-5665 */ -# */ -# 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 the NOMAD software at www.gerad.ca/nomad */ -#-------------------------------------------------------------------------------------*/ +#-------------------------------------------------------------------------------------# +# NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 # +# # +# # +# NOMAD - version 3.7.3 has been created by # +# Charles Audet - Ecole Polytechnique de Montreal # +# Sebastien Le Digabel - Ecole Polytechnique de Montreal # +# Christophe Tribes - Ecole Polytechnique de Montreal # +# # +# The copyright of NOMAD - version 3.7.3 is owned by # +# Sebastien Le Digabel - Ecole Polytechnique de Montreal # +# Christophe Tribes - Ecole Polytechnique de Montreal # +# # +# NOMAD v3 has been funded by AFOSR and Exxon Mobil. # +# # +# NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and # +# developed by Mark A. Abramson from The Boeing Company, Charles Audet and # +# Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from # +# Rice University, and were funded by AFOSR and Exxon Mobil. # +# # +# # +# Contact information: # +# Ecole Polytechnique de Montreal - GERAD # +# C.P. 6079, Succ. Centre-ville, Montreal (Quebec) H3C 3A7 Canada # +# e-mail: nomad@gerad.ca # +# phone : 1-514-340-6053 #6928 # +# fax : 1-514-340-5665 # +# # +# 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 the NOMAD software at www.gerad.ca/nomad # +#-------------------------------------------------------------------------------------# # echo "*****************************************************" -echo " NOMAD 3.7.2 Installation Script " +echo " NOMAD 3.7.3 Installation Script " echo " usage: ./install.sh [nparallel] " echo " - nparallel : number of parallel process to make " echo "*****************************************************" diff --git a/install/readme.MPI_for_MINGW.rtf b/install/readme.MPI_for_MINGW.rtf deleted file mode 100644 index e438110..0000000 --- a/install/readme.MPI_for_MINGW.rtf +++ /dev/null @@ -1,24 +0,0 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\margl1440\margr1440\vieww9000\viewh8400\viewkind0 -\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural - -\f0\fs24 \cf0 For NOMAD, the suggested implementation of MPI to be used with MinGW under Windows operating system is MPICH2. The following steps briefly describe how to make nomad parallel version work on Windows :\ -\ -1- Download and install MPICH2 \ -2- Add or modify environment variables \ - * MPI_HOME=c:/mingw/mpich2 (or where MPICH2 has been installed),\ - * CPLUS_INCLUDE_PATH=%MPI_HOME%/include\ - * LIBRARY_PATH=%MPI_HOME%/lib\ - * PATH=%PATH%;%MPI_HOME%/bin\ -3- Start smpd with administrator privileges:\ - * c:/mingw/mpich2/bin/smpd.exe -install\ -4- Compile nomad mpi version in MSYS command shell:\ - * cd into the install directory \ - * type ./install.sh\ -5- For a single computer (local host only) with several nodes start nomad with the following command:\ - * mpiexec.exe -localonly n %NOMAD_HOME%/nomad.MPI.exe param.txt\ -\ -\ -} diff --git a/readme.txt b/readme.txt index 4966d0c..62bf558 100644 --- a/readme.txt +++ b/readme.txt @@ -2,74 +2,57 @@ # # # README # # # -####################################################################################### +#-------------------------------------------------------------------------------------# +# NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 # # # -# NOMAD - Nonsmooth Optimization by Mesh Adaptive Direct search # -# V 3.7.2 # +# NOMAD - version 3.7.3 has been created by # +# Charles Audet - Ecole Polytechnique de Montreal # +# Sebastien Le Digabel - Ecole Polytechnique de Montreal # +# Christophe Tribes - Ecole Polytechnique de Montreal # # # -# Copyright (C) 2001-2015 # +# The copyright of NOMAD - version 3.7.3 is owned by # +# Sebastien Le Digabel - Ecole Polytechnique de Montreal # +# Christophe Tribes - Ecole Polytechnique de Montreal # # # -# Mark Abramson - the Boeing Company, Seattle # -# Charles Audet - Ecole Polytechnique, Montreal # -# Gilles Couture - Ecole Polytechnique, Montreal # -# John Dennis - Rice University, Houston # -# Sebastien Le Digabel - Ecole Polytechnique, Montreal # -# Christophe Tribes - Ecole Polytechnique, Montreal # +# NOMAD v3 has been funded by AFOSR and Exxon Mobil. # # # -#-------------------------------------------------------------------------------------# -# # -# Contact information: # +# NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and # +# developed by Mark A. Abramson from The Boeing Company, Charles Audet and # +# Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from # +# Rice University, and were funded by AFOSR and Exxon Mobil. # +# # +# Contact information: # # Ecole Polytechnique de Montreal - GERAD # # C.P. 6079, Succ. Centre-ville, Montreal (Quebec) H3C 3A7 Canada # # e-mail: nomad@gerad.ca # # phone : 1-514-340-6053 #6928 # # fax : 1-514-340-5665 # # # -# 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 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. # +# 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 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 the NOMAD software at www.gerad.ca/nomad # -####################################################################################### - - - AUTHORS : - -* Mark A. Abramson (Mark.A.Abramson@boeing.com), The Boeing Company. - -* Charles Audet (www.gerad.ca/Charles.Audet), GERAD and Departement de -mathematiques et de genie industriel, ecole Polytechnique de Montreal. - -* J.E. Dennis Jr. (www.caam.rice.edu/~dennis), Computational and Applied -Mathematics Department, Rice University. - -* Sebastien Le Digabel (www.gerad.ca/Sebastien.Le.Digabel), GERAD and Departement -de mathematiques et de genie industriel, ecole Polytechnique de Montreal. +# You can find information on the NOMAD software at www.gerad.ca/nomad # +#-------------------------------------------------------------------------------------# -* Christophe Tribes, GERAD, Departement -de mathematiques et de genie industriel, Department of mechanical engineering, ecole Polytechnique de Montreal. - DESCRIPTION : + DESCRIPTION : NOMAD is a C++ implementation of the Mesh Adaptive Direct Search (MADS) algorithm, designed for constrained optimization of black-box functions. -The project started in 2001, and was funded in part by AFOSR, CRIAQ, FQRNT, LANL, -NSERC, the Boeing Company, and ExxonMobil Upstream Research Company. - WEB PAGE : -http://www.gerad.ca/nomad/ +https://www.gerad.ca/nomad/ FURTHER INSTRUCTIONS : @@ -111,4 +94,4 @@ For informations about the execution of NOMAD, please read the user guide : or - http://www.gerad.ca/NOMAD/Downloads/user_guide.pdf + https://www.gerad.ca/NOMAD/Downloads/user_guide.pdf diff --git a/src/Barrier.cpp b/src/Barrier.cpp index ab768cd..b9289d7 100644 --- a/src/Barrier.cpp +++ b/src/Barrier.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -78,8 +85,9 @@ void NOMAD::Barrier::display ( const Display & out ) const if ( _p.get_barrier_type() == NOMAD::EB ) out << "extreme barrier (EB)" << std::endl; - - else { + else + { + out << "type : " << ( (_p.get_barrier_type()==NOMAD::FILTER) ? "filter" : "progressive" ) @@ -87,7 +95,8 @@ void NOMAD::Barrier::display ( const Display & out ) const << "h_norm : " << _p.get_h_norm() << std::endl << "h_min : " << _p.get_h_min() << std::endl << "h_max : " << _h_max << std::endl; - if ( _p.get_barrier_type()==NOMAD::PB || _p.get_barrier_type()==NOMAD::PEB_P ) { + if ( _p.get_barrier_type()==NOMAD::PB || _p.get_barrier_type()==NOMAD::PEB_P ) + { out << "poll center trigger rho : " << _p.get_rho() << std::endl << "number of trigger leaps : " << _rho_leaps << std::endl; if ( _p.get_barrier_type()==NOMAD::PEB_P ) @@ -125,9 +134,11 @@ void NOMAD::Barrier::display ( const Display & out ) const void NOMAD::Barrier::update_and_reset_success ( void ) { if ( ( _p.get_barrier_type() == NOMAD::PB || _p.get_barrier_type() == NOMAD::PEB_P ) && - _success != NOMAD::UNSUCCESSFUL ) { + _success != NOMAD::UNSUCCESSFUL ) + { - if ( _success == NOMAD::PARTIAL_SUCCESS ) { + if ( _success == NOMAD::PARTIAL_SUCCESS ) + { if ( _filter.empty() ) throw Barrier::Update_Error ( "Barrier.cpp" , __LINE__ , @@ -136,9 +147,11 @@ void NOMAD::Barrier::update_and_reset_success ( void ) std::set<NOMAD::Filter_Point>::const_iterator it = _filter.end(); --it; - while ( true ) { + while ( true ) + { - if ( it->get_point()->get_h().value() < _h_max.value() ) { + if ( it->get_point()->get_h().value() < _h_max.value() ) + { set_h_max ( it->get_point()->get_h() ); break; } @@ -171,7 +184,8 @@ void NOMAD::Barrier::insert ( const NOMAD::Eval_Point & x ) "insertion of an Eval_Point into the bad Barrier object" ); // basic check: - if ( !x.is_eval_ok() ) { + if ( !x.is_eval_ok() ) + { _one_eval_succ = NOMAD::UNSUCCESSFUL; return; } @@ -180,7 +194,8 @@ void NOMAD::Barrier::insert ( const NOMAD::Eval_Point & x ) // then return _UNSUCCESSFUL_: size_t size_before = _prefilter.size(); _prefilter.insert ( x.get_tag() ); - if ( _prefilter.size() == size_before ) { + if ( _prefilter.size() == size_before ) + { _one_eval_succ = NOMAD::UNSUCCESSFUL; return; } @@ -193,7 +208,8 @@ void NOMAD::Barrier::insert ( const NOMAD::Eval_Point & x ) if ( !x.is_EB_ok () || !x.get_f().is_defined () || !h.is_defined () || - h.value() > _h_max.value() ) { + h.value() > _h_max.value() ) + { _one_eval_succ = NOMAD::UNSUCCESSFUL; return; } @@ -217,7 +233,8 @@ void NOMAD::Barrier::insert ( const Barrier & b ) NOMAD::Eval_Point * modifiable_x; std::list<const NOMAD::Eval_Point *>::const_iterator it , end = b._all_inserted.end(); - for ( it = b._all_inserted.begin() ; it != end ; ++it ) { + for ( it = b._all_inserted.begin() ; it != end ; ++it ) + { modifiable_x = &NOMAD::Cache::get_modifiable_point ( **it ); @@ -238,7 +255,8 @@ void NOMAD::Barrier::insert ( const Barrier & b ) /*---------------------------------------------------------*/ NOMAD::success_type NOMAD::Barrier::insert_feasible ( const NOMAD::Eval_Point & x ) { - if ( !_best_feasible || ( x.get_f().value() < _best_feasible->get_f().value() ) ) { + if ( !_best_feasible || ( x.get_f().value() < _best_feasible->get_f().value() ) ) + { _best_feasible = &x; return NOMAD::FULL_SUCCESS; } @@ -250,16 +268,21 @@ NOMAD::success_type NOMAD::Barrier::insert_feasible ( const NOMAD::Eval_Point & /*---------------------------------------------------------*/ void NOMAD::Barrier::filter_insertion ( const NOMAD::Eval_Point & x , bool & insert ) { - if ( _filter.empty() ) { + if ( _filter.empty() ) + { _filter.insert (&x); insert = true; } - else { + else + { + insert = false; std::set<NOMAD::Filter_Point>::iterator it = _filter.begin(); - while ( it != _filter.end() ) { - if ( x < *(it->get_point()) ) { + while ( it != _filter.end() ) + { + if ( x < *(it->get_point()) ) + { _filter.erase(it++); insert = true; continue; @@ -268,11 +291,14 @@ void NOMAD::Barrier::filter_insertion ( const NOMAD::Eval_Point & x , bool & ins ++it; } - if ( !insert ) { + if ( !insert ) + { insert = true; std::set<NOMAD::Filter_Point>::iterator end = _filter.end(); - for ( it = _filter.begin() ; it != end ; ++it ) { - if ( *(it->get_point()) < x ) { + for ( it = _filter.begin() ; it != end ; ++it ) + { + if ( *(it->get_point()) < x ) + { insert = false; break; } @@ -298,11 +324,13 @@ NOMAD::success_type NOMAD::Barrier::insert_infeasible ( const NOMAD::Eval_Point // filter: // ------- - if ( _p.get_barrier_type() == NOMAD::FILTER ) { + if ( _p.get_barrier_type() == NOMAD::FILTER ) + { const NOMAD::Eval_Point * bi = get_best_infeasible(); if ( !bi ) return NOMAD::UNSUCCESSFUL; - if ( old_bi ) { + if ( old_bi ) + { if ( bi->get_h().value() < old_bi->get_h().value() ) return NOMAD::FULL_SUCCESS; if ( insert ) @@ -380,23 +408,28 @@ void NOMAD::Barrier::select_poll_center ( NOMAD::success_type last_it_success ) const NOMAD::Eval_Point * best_infeasible = get_best_infeasible(); _sec_poll_center = NULL; - if ( !_best_feasible && !best_infeasible ) { + if ( !_best_feasible && !best_infeasible ) + { _poll_center = NULL; return; } - if ( !best_infeasible ) { + if ( !best_infeasible ) + { _poll_center = _best_feasible; return; } - if ( !_best_feasible ) { + if ( !_best_feasible ) + { _poll_center = best_infeasible; return; } // filter: - if ( _p.get_barrier_type() == NOMAD::FILTER ) { + if ( _p.get_barrier_type() == NOMAD::FILTER ) + { - if ( !_poll_center ) { + if ( !_poll_center ) + { _poll_center = _best_feasible; return; } @@ -409,15 +442,19 @@ void NOMAD::Barrier::select_poll_center ( NOMAD::success_type last_it_success ) } // progressive barrier: - if ( _p.get_barrier_type() == NOMAD::PB || _p.get_barrier_type() == NOMAD::PEB_P ) { + if ( _p.get_barrier_type() == NOMAD::PB || _p.get_barrier_type() == NOMAD::PEB_P ) + { const NOMAD::Point * last_poll_center = _poll_center; - if ( best_infeasible->get_f() < (_best_feasible->get_f() - _p.get_rho()) ) { + if ( best_infeasible->get_f() < (_best_feasible->get_f() - _p.get_rho()) ) + { _poll_center = best_infeasible; _sec_poll_center = _best_feasible; } - else { + else + { + _poll_center = _best_feasible; _sec_poll_center = best_infeasible; } @@ -435,9 +472,11 @@ void NOMAD::Barrier::set_h_max ( const NOMAD::Double & h_max ) _h_max = h_max; // we remove all filter points x such that h(x) > h_max: - if ( !_filter.empty() ) { + if ( !_filter.empty() ) + { - if ( _filter.begin()->get_point()->get_h().value() > _h_max.value() ) { + if ( _filter.begin()->get_point()->get_h().value() > _h_max.value() ) + { _filter.clear(); return; } @@ -464,8 +503,10 @@ void NOMAD::Barrier::check_PEB_constraints ( const NOMAD::Eval_Point & x , bool int nb = static_cast<int>(bbot.size()); std::list<int> ks; - for ( int k = 0 ; k < nb ; ++k ) { - if ( bbot[k] == NOMAD::PEB_P && bbo[k] <= h_min ) { + for ( int k = 0 ; k < nb ; ++k ) + { + if ( bbot[k] == NOMAD::PEB_P && bbo[k] <= h_min ) + { if ( display ) _p.out() << std::endl << "change status of blackbox output " << k @@ -480,7 +521,8 @@ void NOMAD::Barrier::check_PEB_constraints ( const NOMAD::Eval_Point & x , bool // at least one constraint changed status, so we have to update the filter // and remove all points that have their h value changed to infinity // (it can add new dominant points from the list _peb_lop): - if ( !ks.empty() ) { + if ( !ks.empty() ) + { std::list<int>::const_iterator it_k , end_k = ks.end() , begin_k = ks.begin(); @@ -490,11 +532,13 @@ void NOMAD::Barrier::check_PEB_constraints ( const NOMAD::Eval_Point & x , bool bool reset_filter = false; std::set<NOMAD::Filter_Point>::const_iterator end = _filter.end() , it; - for ( it = _filter.begin() ; it != end ; ++it ) { + for ( it = _filter.begin() ; it != end ; ++it ) + { const NOMAD::Point & bbo_cur = it->get_point()->get_bb_outputs(); for ( it_k = begin_k ; it_k != end_k ; ++it_k ) - if ( bbo_cur[*it_k] > h_min ) { + if ( bbo_cur[*it_k] > h_min ) + { reset_filter = true; break; } @@ -502,7 +546,8 @@ void NOMAD::Barrier::check_PEB_constraints ( const NOMAD::Eval_Point & x , bool break; } - if ( reset_filter ) { + if ( reset_filter ) + { if ( display ) _p.out() << std::endl << "PEB change of status: filter reset" << std::endl; @@ -515,19 +560,22 @@ void NOMAD::Barrier::check_PEB_constraints ( const NOMAD::Eval_Point & x , bool std::list<const NOMAD::Eval_Point *>::const_iterator end2 = _peb_lop.end (); std::list<const NOMAD::Eval_Point *>::iterator it2 = _peb_lop.begin(); - while ( it2 != end2 ) { + while ( it2 != end2 ) + { insert = true; const NOMAD::Point & bbo_cur = (*it2)->get_bb_outputs(); for ( it_k = begin_k ; it_k != end_k ; ++it_k ) - if ( bbo_cur[*it_k] > h_min ) { + if ( bbo_cur[*it_k] > h_min ) + { insert = false; break; } // if insert==true: this point is potentially a new filter point: - if ( insert ) { + if ( insert ) + { filter_insertion ( **it2 , insert ); ++it2; } @@ -535,7 +583,9 @@ void NOMAD::Barrier::check_PEB_constraints ( const NOMAD::Eval_Point & x , bool // if insert==false: it means that the current filter point // has to be removed from filter and from _peb_lop, and // in addition, its h is put to INF: - else { + else + { + NOMAD::Cache::get_modifiable_point ( **it2 ).set_h ( NOMAD::Double() ); _peb_lop.erase(it2++); } diff --git a/src/Barrier.hpp b/src/Barrier.hpp index 2b303a4..a41ad4c 100644 --- a/src/Barrier.hpp +++ b/src/Barrier.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -47,260 +54,260 @@ #include "Filter_Point.hpp" namespace NOMAD { - - /// Barrier class for constraints handling. - /** + + /// Barrier class for constraints handling. + /** The barrier is basically a structure that stores evaluation points. - */ - class Barrier : private NOMAD::Uncopyable { - - private: - - const NOMAD::Parameters & _p; ///< Parameters. - NOMAD::eval_type _eval_type; ///< Truth or surrogate. - NOMAD::Double _h_max; ///< Maximal value for \c h. - const NOMAD::Eval_Point * _best_feasible; ///< Best feasible solution. - - /// Progressive barrier reference point. - const NOMAD::Eval_Point * _ref; - - std::set<NOMAD::Filter_Point> _filter; ///< Filter. - std::set<int> _prefilter; ///< Pre-filter based on point tags. - - int _rho_leaps; ///< Number of trigger (rho) leaps. - - const NOMAD::Eval_Point * _poll_center; ///< Primary poll center. - const NOMAD::Eval_Point * _sec_poll_center; ///< Secondary poll center. - - /** - Number of constraints that have been changed to NOMAD::PEB_E - (Extreme status for the PEB strategy). - */ - int _peb_changes; - - /** - Number of times that the filter has been reseted following a PEB - change of status. - */ - int _peb_filter_reset; - - /** - List of all points that we tried to insert into the filter, - with PEB constraints. - */ - std::list<const NOMAD::Eval_Point *> _peb_lop; - - /// List of all points that we tried to insert into the filter. - std::list<const NOMAD::Eval_Point *> _all_inserted; - - NOMAD::success_type _one_eval_succ; ///< Success for one evaluation. - NOMAD::success_type _success; ///< Success for a list of evaluations. - - /*----------------------------------------------------*/ - - /// Insertion of a feasible point. - /** - \param x The feasible point to insert -- \b IN. - \return Success type of the insertion - (NOMAD::FULL_SUCCESS or NOMAD::UNSUCCESSFUL). - */ - NOMAD::success_type insert_feasible ( const NOMAD::Eval_Point & x ); - - /// Insertion of an infeasible point. - /** - \param x The infeasible point to insert -- \b IN. - \return Success type of the insertion - (NOMAD::FULL_SUCCESS, NOMAD::UNSUCCESSFUL, or NOMAD::PARTIAL_SUCCESS). - */ - NOMAD::success_type insert_infeasible ( const NOMAD::Eval_Point & x ); - - /// Change the value of \c h_max. - /** - \param h_max The new value of \c h_max -- \b IN. - */ - void set_h_max ( const NOMAD::Double & h_max ); - - /// Insertion into the filter. - /** - \param x The point to insert -- \b IN. - \param insert A boolean equal to \c true if the point has been - inserted into the barrier -- \b OUT. - */ - void filter_insertion ( const NOMAD::Eval_Point & x , bool & insert ); - - /*----------------------------------------------------*/ - - public: - - /// Exception class for barrier update error. - class Update_Error : public NOMAD::Exception - { - public: - /// Constructor. - Update_Error ( const std::string & file , - int line , - const std::string & msg ) - : NOMAD::Exception ( file , line , msg ) {} - }; - - /// Exception class for an insertion error. - class Insert_Error : public NOMAD::Exception - { - public: - /// Constructor. - Insert_Error ( const std::string & file , - int line , - const std::string & msg ) - : NOMAD::Exception ( file , line , msg ) {} - }; - - /*----------------------------------------------------*/ - - /// Constructor. - /** - \param p Parameters -- \b IN. - \param et Truth or surrogate -- \b IN. - */ - Barrier ( const NOMAD::Parameters & p , NOMAD::eval_type et ) - : _p ( p ) , - _eval_type ( et ) , - _h_max ( p.get_h_max_0() ) , - _best_feasible ( NULL ) , - _ref ( NULL ) , - _rho_leaps ( 0 ) , - _poll_center ( NULL ) , - _sec_poll_center ( NULL ) , - _peb_changes ( 0 ) , - _peb_filter_reset( 0 ) , - _one_eval_succ ( NOMAD::UNSUCCESSFUL ) , - _success ( NOMAD::UNSUCCESSFUL ) {} - - /// Destructor. - virtual ~Barrier ( void ) {} - - /// Reset the barrier. - void reset ( void ); - - /// Reset the success types. - void reset_success ( void ) { _one_eval_succ = _success = NOMAD::UNSUCCESSFUL; } - - /// Poll center selection. - /** - \param last_it_success Success of the last iteration -- \b IN. - */ - void select_poll_center ( NOMAD::success_type last_it_success ); - - /// Barrier updates. - void update_and_reset_success ( void ); - - /// Access to the best infeasible point. - /** - \return A pointer to the best infeasible point. - */ - const NOMAD::Eval_Point * get_best_infeasible ( void ) const; - - /// Access to the best feasible point. - /** - \return A pointer to the best feasible point. - */ - const NOMAD::Eval_Point * get_best_feasible ( void ) const { return _best_feasible; } - - /// Access to the best infeasible point with min. violation. - /** - \return A pointer to the best infeasible point with min. viol. - */ - const NOMAD::Eval_Point * get_best_infeasible_min_viol ( void ) const; - - /// Access to \c h_max. - /** - \return The value of \c h_max. - */ - const NOMAD::Double & get_h_max ( void ) const { return _h_max; } - - /// Access to the poll center. - /** - \return A pointer to the poll center. - */ - const NOMAD::Eval_Point * get_poll_center ( void ) const { return _poll_center; } - - /// Access to the success type of one evaluation. - /** - \return The success type of one evaluation. - */ - NOMAD::success_type get_one_eval_succ ( void ) const { return _one_eval_succ;} - - /// Access to the success type of a list of evaluations. - /** - \return The success type of a list of evaluations. - */ - NOMAD::success_type get_success ( void ) const { return _success; } - - /// Access to the secondary poll center. - /** - \return A pointer to the secondary poll center. - */ - const NOMAD::Eval_Point * get_sec_poll_center ( void ) const - { - return _sec_poll_center; - } - - /// Access the list of all inserted points. - /** - \return A list with pointers to the inserted points. - */ - const std::list<const NOMAD::Eval_Point *> & get_all_inserted ( void ) const - { - return _all_inserted; - } - - /// Insertion of a point into the barrier. - /** - \param x The point -- \b IN. - */ - void insert ( const NOMAD::Eval_Point & x ); - - /// Update the barrier from another barrier. - /** - Used by the VNS search. - \param b The other barrier -- \b IN. - */ - void insert ( const Barrier & b ); - - /// Check the PEB constraints. - /** - This will change eventually the status of PEB constraints - from NOMAD::PEB_P to NOMAD::PEB_E. - \param x Point at which the constraints are checked -- \b IN. - \param display A boolean equal to \c true if displays are authorized -- \b IN. - */ - void check_PEB_constraints ( const NOMAD::Eval_Point & x , bool display ); - - /// Display. - /** - \param out The NOMAD::Display object -- \b IN. - */ - void display ( const NOMAD::Display & out ) const; - - /// Display. - /** - Uses the NOMAD::Display object of the NOMAD::Parameters class. - */ - void display ( void ) const { display ( _p.out() ); } - - }; - - /// Display a NOMAD::Barrier object. - /** + */ + class Barrier : private NOMAD::Uncopyable { + + private: + + const NOMAD::Parameters & _p; ///< Parameters. + NOMAD::eval_type _eval_type; ///< Truth or surrogate. + NOMAD::Double _h_max; ///< Maximal value for \c h. + const NOMAD::Eval_Point * _best_feasible; ///< Best feasible solution. + + /// Progressive barrier reference point. + const NOMAD::Eval_Point * _ref; + + std::set<NOMAD::Filter_Point> _filter; ///< Filter. + std::set<int> _prefilter; ///< Pre-filter based on point tags. + + int _rho_leaps; ///< Number of trigger (rho) leaps. + + const NOMAD::Eval_Point * _poll_center; ///< Primary poll center. + const NOMAD::Eval_Point * _sec_poll_center; ///< Secondary poll center. + + /** + Number of constraints that have been changed to NOMAD::PEB_E + (Extreme status for the PEB strategy). + */ + int _peb_changes; + + /** + Number of times that the filter has been reseted following a PEB + change of status. + */ + int _peb_filter_reset; + + /** + List of all points that we tried to insert into the filter, + with PEB constraints. + */ + std::list<const NOMAD::Eval_Point *> _peb_lop; + + /// List of all points that we tried to insert into the filter. + std::list<const NOMAD::Eval_Point *> _all_inserted; + + NOMAD::success_type _one_eval_succ; ///< Success for one evaluation. + NOMAD::success_type _success; ///< Success for a list of evaluations. + + /*----------------------------------------------------*/ + + /// Insertion of a feasible point. + /** + \param x The feasible point to insert -- \b IN. + \return Success type of the insertion + (NOMAD::FULL_SUCCESS or NOMAD::UNSUCCESSFUL). + */ + NOMAD::success_type insert_feasible ( const NOMAD::Eval_Point & x ); + + /// Insertion of an infeasible point. + /** + \param x The infeasible point to insert -- \b IN. + \return Success type of the insertion + (NOMAD::FULL_SUCCESS, NOMAD::UNSUCCESSFUL, or NOMAD::PARTIAL_SUCCESS). + */ + NOMAD::success_type insert_infeasible ( const NOMAD::Eval_Point & x ); + + /// Change the value of \c h_max. + /** + \param h_max The new value of \c h_max -- \b IN. + */ + void set_h_max ( const NOMAD::Double & h_max ); + + /// Insertion into the filter. + /** + \param x The point to insert -- \b IN. + \param insert A boolean equal to \c true if the point has been + inserted into the barrier -- \b OUT. + */ + void filter_insertion ( const NOMAD::Eval_Point & x , bool & insert ); + + /*----------------------------------------------------*/ + + public: + + /// Exception class for barrier update error. + class Update_Error : public NOMAD::Exception + { + public: + /// Constructor. + Update_Error ( const std::string & file , + int line , + const std::string & msg ) + : NOMAD::Exception ( file , line , msg ) {} + }; + + /// Exception class for an insertion error. + class Insert_Error : public NOMAD::Exception + { + public: + /// Constructor. + Insert_Error ( const std::string & file , + int line , + const std::string & msg ) + : NOMAD::Exception ( file , line , msg ) {} + }; + + /*----------------------------------------------------*/ + + /// Constructor. + /** + \param p Parameters -- \b IN. + \param et Truth or surrogate -- \b IN. + */ + Barrier ( const NOMAD::Parameters & p , NOMAD::eval_type et ) + : _p ( p ) , + _eval_type ( et ) , + _h_max ( p.get_h_max_0() ) , + _best_feasible ( NULL ) , + _ref ( NULL ) , + _rho_leaps ( 0 ) , + _poll_center ( NULL ) , + _sec_poll_center ( NULL ) , + _peb_changes ( 0 ) , + _peb_filter_reset( 0 ) , + _one_eval_succ ( NOMAD::UNSUCCESSFUL ) , + _success ( NOMAD::UNSUCCESSFUL ) {} + + /// Destructor. + virtual ~Barrier ( void ) {} + + /// Reset the barrier. + void reset ( void ); + + /// Reset the success types. + void reset_success ( void ) { _one_eval_succ = _success = NOMAD::UNSUCCESSFUL; } + + /// Poll center selection. + /** + \param last_it_success Success of the last iteration -- \b IN. + */ + void select_poll_center ( NOMAD::success_type last_it_success ); + + /// Barrier updates. + void update_and_reset_success ( void ); + + /// Access to the best infeasible point. + /** + \return A pointer to the best infeasible point. + */ + const NOMAD::Eval_Point * get_best_infeasible ( void ) const; + + /// Access to the best feasible point. + /** + \return A pointer to the best feasible point. + */ + const NOMAD::Eval_Point * get_best_feasible ( void ) const { return _best_feasible; } + + /// Access to the best infeasible point with min. violation. + /** + \return A pointer to the best infeasible point with min. viol. + */ + const NOMAD::Eval_Point * get_best_infeasible_min_viol ( void ) const; + + /// Access to \c h_max. + /** + \return The value of \c h_max. + */ + const NOMAD::Double & get_h_max ( void ) const { return _h_max; } + + /// Access to the poll center. + /** + \return A pointer to the poll center. + */ + const NOMAD::Eval_Point * get_poll_center ( void ) const { return _poll_center; } + + /// Access to the success type of one evaluation. + /** + \return The success type of one evaluation. + */ + NOMAD::success_type get_one_eval_succ ( void ) const { return _one_eval_succ;} + + /// Access to the success type of a list of evaluations. + /** + \return The success type of a list of evaluations. + */ + NOMAD::success_type get_success ( void ) const { return _success; } + + /// Access to the secondary poll center. + /** + \return A pointer to the secondary poll center. + */ + const NOMAD::Eval_Point * get_sec_poll_center ( void ) const + { + return _sec_poll_center; + } + + /// Access the list of all inserted points. + /** + \return A list with pointers to the inserted points. + */ + const std::list<const NOMAD::Eval_Point *> & get_all_inserted ( void ) const + { + return _all_inserted; + } + + /// Insertion of a point into the barrier. + /** + \param x The point -- \b IN. + */ + void insert ( const NOMAD::Eval_Point & x ); + + /// Update the barrier from another barrier. + /** + Used by the VNS search. + \param b The other barrier -- \b IN. + */ + void insert ( const Barrier & b ); + + /// Check the PEB constraints. + /** + This will change eventually the status of PEB constraints + from NOMAD::PEB_P to NOMAD::PEB_E. + \param x Point at which the constraints are checked -- \b IN. + \param display A boolean equal to \c true if displays are authorized -- \b IN. + */ + void check_PEB_constraints ( const NOMAD::Eval_Point & x , bool display ); + + /// Display. + /** + \param out The NOMAD::Display object -- \b IN. + */ + void display ( const NOMAD::Display & out ) const; + + /// Display. + /** + Uses the NOMAD::Display object of the NOMAD::Parameters class. + */ + void display ( void ) const { display ( _p.out() ); } + + }; + + /// Display a NOMAD::Barrier object. + /** \param out The NOMAD::Display object -- \b IN. \param b The NOMAD::Barrier object to be displayed -- \b IN. \return The NOMAD::Display object. - */ - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::Barrier & b ) - { - b.display ( out ); - return out; - } + */ + inline const NOMAD::Display & operator << ( const NOMAD::Display & out , + const NOMAD::Barrier & b ) + { + b.display ( out ); + return out; + } } #endif diff --git a/src/Cache.cpp b/src/Cache.cpp index dea9a34..d65dfcf 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -119,21 +126,24 @@ const NOMAD::Eval_Point * NOMAD::Cache::find // search in _cache2 (points to write in a cache file): NOMAD::Cache_Point cp ( &x ); it = _cache2.find ( cp ); - if ( it != _cache2.end() ) { + if ( it != _cache2.end() ) + { cache_index = NOMAD::CACHE_2; return it->get_point(); } // search in _cache3 (points saved in a file): it = _cache3.find ( cp ); - if ( it != _cache3.end() ) { + if ( it != _cache3.end() ) + { cache_index = NOMAD::CACHE_3; return it->get_point(); } // search in _cache1 (points read in an initial cache file): it = _cache1.find ( cp ); - if ( it != _cache1.end() ) { + if ( it != _cache1.end() ) + { cache_index = NOMAD::CACHE_1; return it->get_point(); } @@ -165,14 +175,18 @@ bool NOMAD::Cache::erase ( const NOMAD::Eval_Point & x ) const NOMAD::Eval_Point * cache_x = find ( x , it , cache_index ); // the point has been found: - if ( cache_x ) { + if ( cache_x ) + { // remove the point from the list of extern points: - if ( cache_x->get_current_run() || x.get_current_run() ) { + if ( cache_x->get_current_run() || x.get_current_run() ) + { std::list<const NOMAD::Eval_Point*>::const_iterator end2 = _extern_pts.end(); std::list<const NOMAD::Eval_Point*>::iterator it2 = _extern_pts.begin(); - while ( it2 != end2 ) { - if ( *it2 == cache_x || *it2 == &x ) { + while ( it2 != end2 ) + { + if ( *it2 == cache_x || *it2 == &x ) + { _extern_pts.erase ( it2 ); break; } @@ -187,7 +201,8 @@ bool NOMAD::Cache::erase ( const NOMAD::Eval_Point & x ) // remove the point from the cache: _sizeof -= x.size_of(); - switch ( cache_index ) { + switch ( cache_index ) + { case NOMAD::CACHE_1: _cache1.erase ( it ); break; @@ -211,7 +226,8 @@ bool NOMAD::Cache::erase ( const NOMAD::Eval_Point & x ) void NOMAD::Cache::clear ( void ) { const NOMAD::Eval_Point * x = begin(); - while ( x ) { + while ( x ) + { delete x; x = next(); } @@ -266,12 +282,14 @@ void NOMAD::Cache::insert ( Cache & c ) const NOMAD::Eval_Point * cache_x; const NOMAD::Eval_Point * cur = c.begin(); - while ( cur ) { + while ( cur ) + { cache_x = find ( *cur ); // the current point is already in cache: - if ( cache_x ) { + if ( cache_x ) + { update ( get_modifiable_point ( *cache_x ) , *cur ); delete cur; } @@ -297,7 +315,8 @@ void NOMAD::Cache::insert ( Cache & c ) /* . example of use: */ /* */ /* const NOMAD::Eval_Point * cur = cache.begin(); */ -/* while ( cur ) { */ +/* while ( cur ) + { */ /* ... */ /* cur = cache.next(); */ /* } */ @@ -309,15 +328,18 @@ void NOMAD::Cache::insert ( Cache & c ) // -------- const NOMAD::Eval_Point * NOMAD::Cache::begin ( void ) const { - if ( !_cache2.empty() ) { + if ( !_cache2.empty() ) + { _it = _cache2.begin(); return _it->get_point(); } - if ( !_cache3.empty() ) { + if ( !_cache3.empty() ) + { _it = _cache3.begin(); return _it->get_point(); } - if ( !_cache1.empty() ) { + if ( !_cache1.empty() ) + { _it = _cache1.begin(); return _it->get_point(); } @@ -330,12 +352,15 @@ const NOMAD::Eval_Point * NOMAD::Cache::next ( void ) const { ++_it; - if ( !_cache2.empty() && _it == _cache2.end() ) { - if ( !_cache3.empty() ) { + if ( !_cache2.empty() && _it == _cache2.end() ) + { + if ( !_cache3.empty() ) + { _it = _cache3.begin(); return _it->get_point(); } - if ( !_cache1.empty() ) { + if ( !_cache1.empty() ) + { _it = _cache1.begin(); return _it->get_point(); } @@ -343,8 +368,10 @@ const NOMAD::Eval_Point * NOMAD::Cache::next ( void ) const } - if ( !_cache3.empty() && _it == _cache3.end() ) { - if ( !_cache1.empty() ) { + if ( !_cache3.empty() && _it == _cache3.end() ) + { + if ( !_cache1.empty() ) + { _it = _cache1.begin(); return _it->get_point(); } @@ -417,10 +444,12 @@ bool NOMAD::Cache::read_points_from_cache_file ( std::ifstream & fin const NOMAD::Eval_Point * cache_x; // main loop: - while ( !fin.eof() ) { + while ( !fin.eof() ) + { // reading of the Cache_File_Point: - if ( !cfp.read ( fin ) ) { + if ( !cfp.read ( fin ) ) + { if ( fin.eof() ) break; return false; @@ -438,13 +467,16 @@ bool NOMAD::Cache::read_points_from_cache_file ( std::ifstream & fin cache_x = find ( *cur ); // the current point is already in cache: - if ( cache_x ) { + if ( cache_x ) + { update ( get_modifiable_point ( *cache_x ) , *cur ); delete cur; } // point not in cache: insertion: - else { + else + { + // insertion in _extern_pts: insert_extern_point ( *cur ); @@ -459,7 +491,8 @@ bool NOMAD::Cache::read_points_from_cache_file ( std::ifstream & fin } // end of main loop // display stats on the cache load: - if ( display ) { + if ( display ) + { _out << "number of points: " << static_cast<int>(_cache1.size()) << std::endl << "size : "; _out.display_size_of ( _sizeof ); @@ -467,7 +500,8 @@ bool NOMAD::Cache::read_points_from_cache_file ( std::ifstream & fin << "load time : " << c.get_real_time() << 's' << std::endl; } } - catch ( ... ) { + catch ( ... ) + { return false; } return true; @@ -500,7 +534,8 @@ bool NOMAD::Cache::load ( const std::string & file_name , return false; // the file exists: - if ( NOMAD::check_read_file ( file_name ) ) { + if ( NOMAD::check_read_file ( file_name ) ) + { int id; std::ifstream fin ( file_name.c_str() , std::ios::binary ); @@ -508,7 +543,8 @@ bool NOMAD::Cache::load ( const std::string & file_name , fin.read ( (char *) &id , sizeof(int) ); // it is a valid cache file: - if ( !fin.fail() && id == NOMAD::CACHE_FILE_ID ) { + if ( !fin.fail() && id == NOMAD::CACHE_FILE_ID ) + { // display: if ( display ) @@ -516,7 +552,8 @@ bool NOMAD::Cache::load ( const std::string & file_name , << NOMAD::open_block ( "loading of \'" + file_name + "\'" ); // read the points: - if ( !read_points_from_cache_file ( fin , p_nb_bb_outputs , display ) ) { + if ( !read_points_from_cache_file ( fin , p_nb_bb_outputs , display ) ) + { fin.close(); return false; // it is not a valid cache file } @@ -533,14 +570,18 @@ bool NOMAD::Cache::load ( const std::string & file_name , } // it is not a valid cache file: - else { + else + { + fin.close(); return false; } } // the file does not exist: - else { + else + { + // display: if ( display ) @@ -549,7 +590,8 @@ bool NOMAD::Cache::load ( const std::string & file_name , // create the file as a valid cache file: std::ofstream fout ( file_name.c_str() , std::ios::binary ); - if ( fout.fail() ) { + if ( fout.fail() ) + { fout.close(); return false; } @@ -583,11 +625,13 @@ bool NOMAD::Cache::save ( bool overwrite , bool display ) std::ofstream fout; - if ( overwrite ) { + if ( overwrite ) + { // open: fout.open ( _locked_file.c_str() , std::ios::binary ); - if ( fout.fail() ) { + if ( fout.fail() ) + { fout.close(); return false; } @@ -597,9 +641,11 @@ bool NOMAD::Cache::save ( bool overwrite , bool display ) // save all cache points: const NOMAD::Eval_Point * cur = begin(); - while ( cur ) { + while ( cur ) + { NOMAD::Cache_File_Point cfp ( *cur ); - if ( !cfp.write ( fout ) ) { + if ( !cfp.write ( fout ) ) + { fout.close(); return false; } @@ -607,21 +653,26 @@ bool NOMAD::Cache::save ( bool overwrite , bool display ) } } - else { + else + { + // open and go at the end of the file: fout.open ( _locked_file.c_str() , std::ios::binary | std::ios::app ); - if ( fout.fail() ) { + if ( fout.fail() ) + { fout.close(); return false; } std::set<NOMAD::Cache_Point>::iterator it = _cache2.begin(); - while ( it != _cache2.end() ) { + while ( it != _cache2.end() ) + { // write it->get_point() in 'fout': NOMAD::Cache_File_Point cfp ( *it->get_point() ); - if ( !cfp.write ( fout ) ) { + if ( !cfp.write ( fout ) ) + { fout.close(); return false; } @@ -676,8 +727,6 @@ void NOMAD::Cache::update ( NOMAD::Eval_Point & cache_x , cache_x.set_eval_status ( NOMAD::EVAL_OK ); cache_x.set_bb_output ( bbo_x ); cache_x.set_signature ( x.get_signature () ); - cache_x.set_direction ( x.get_direction () ); - _sizeof += cache_x.size_of(); return; } @@ -686,7 +735,8 @@ void NOMAD::Cache::update ( NOMAD::Eval_Point & cache_x , int c1 = 0; int c2 = 0; - for ( int i = 0 ; i < m ; ++i ) { + for ( int i = 0 ; i < m ; ++i ) + { if ( bbo_cache_x[i].is_defined() ) ++c1; @@ -700,10 +750,10 @@ void NOMAD::Cache::update ( NOMAD::Eval_Point & cache_x , // the two points are 'eval_ok' and have comparable outputs: // we select the best as the one with the more defined bb_outputs: - if ( c2 > c1 ) { + if ( c2 > c1 ) + { cache_x.set_signature ( x.get_signature () ); cache_x.set_direction ( x.get_direction () ); - } _sizeof += cache_x.size_of(); @@ -717,7 +767,8 @@ void NOMAD::Cache::display_extern_pts ( const NOMAD::Display & out ) const int nb = static_cast<int>(_extern_pts.size()); int cnt = 0; std::list<const NOMAD::Eval_Point *>::const_iterator it , end = _extern_pts.end(); - for ( it = _extern_pts.begin() ; it != end ; ++it ) { + for ( it = _extern_pts.begin() ; it != end ; ++it ) + { out << "point "; out.display_int_w ( ++cnt , nb ); out << "/" << nb << ": "; @@ -745,7 +796,8 @@ void NOMAD::Cache::display ( const NOMAD::Display & out ) const int cnt = 0; out << NOMAD::open_block ( "cache points" ) << std::endl; const NOMAD::Eval_Point * cur = begin(); - while ( cur ) { + while ( cur ) + { out << "point "; out.display_int_w ( ++cnt , nb ); out << "/" << nb << ": "; diff --git a/src/Cache.hpp b/src/Cache.hpp index 99cfbfb..260ec72 100644 --- a/src/Cache.hpp +++ b/src/Cache.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Cache.hpp - \brief Cache memorizing all evaluations (headers) - \author Sebastien Le Digabel - \date 2010-04-12 - \see Cache.cpp -*/ + \file Cache.hpp + \brief Cache memorizing all evaluations (headers) + \author Sebastien Le Digabel + \date 2010-04-12 + \see Cache.cpp + */ // To browse the cache: // --------------------- @@ -56,355 +63,357 @@ #include "Clock.hpp" namespace NOMAD { - - /// Cache memorizing all evaluations. - /** - - The evaluation are stored as NOMAD::Eval_Point objects in - three \c std::set containers - ( \c _cache1 , \c _cache2 and \c _cache3 ). - - Browse the points inside the cache with the following instructions: - \code - const NOMAD::Eval_Point * cur = cache.begin(); - while ( cur ) { - ... - cur = cache.next(); - } - \endcode - */ - class Cache : private NOMAD::Uncopyable { - - protected: - - /// Display: - const NOMAD::Display & _out; - - private: - - /// Static list of locked files. - static std::set<std::string> _locked_files; - - /// Cache file that is currently in use for load/save (this file is locked). - std::string _locked_file; - /// Type of cache (truth or surrogate). - NOMAD::eval_type _eval_type; - - /// Points read in the (optional) initial cache file. - std::set<NOMAD::Cache_Point> _cache1; - - /// Points of the cache to write in the cache file. - std::set<NOMAD::Cache_Point> _cache2; - - /// Points of the cache already saved in the file. - std::set<NOMAD::Cache_Point> _cache3; - - /// Points not from the current run (from a cache file or from a user). - mutable std::list<const NOMAD::Eval_Point*> _extern_pts; - - /// Size in memory. - mutable float _sizeof; - - /// Iterator to browse the cache with \c begin() and \c next(). - mutable std::set<NOMAD::Cache_Point>::const_iterator _it; - - /*---------------------------------------------------------------------------*/ - - /// Read points in a cache file. - /** - - Reads points from a cache file. - - Fills the set \c _cache1. - \param fin The already opened input file -- \b IN. - \param p_nb_bb_outputs A pointer on an integer with the number - of blackbox outputs; can be \c NULL -- \b IN. - \param display A boolean equal to \c true if displays - are authorized -- \b IN. - \return A boolean equal to \c true if the file could be read. - */ - bool read_points_from_cache_file ( std::ifstream & fin , - const int * p_nb_bb_outputs , - bool display ); - - /// Check if a file is locked. - /** - \param file_name Name of the file -- \b IN. - \return A boolean equal to \c true if the file is locked. - */ - bool is_locked ( const std::string & file_name ); - - /// Lock a file. - /** - \param file_name Name of the file -- \b IN. - \return A boolean equal to \c false if the file was already locked. - */ - bool lock ( const std::string & file_name ); - - /// Unlock the locked file. - void unlock ( void ); - - /// Update a point already in cache. + /// Cache memorizing all evaluations. /** - - The point already in cache is updated from another + - The evaluation are stored as NOMAD::Eval_Point objects in + three \c std::set containers + ( \c _cache1 , \c _cache2 and \c _cache3 ). + - Browse the points inside the cache with the following instructions: + \code + const NOMAD::Eval_Point * cur = cache.begin(); + while ( cur ) { + ... + cur = cache.next(); + } + \endcode + */ + class Cache : private NOMAD::Uncopyable { + + protected: + + /// Display: + const NOMAD::Display & _out; + + private: + + /// Static list of locked files. + static std::set<std::string> _locked_files; + + /// Cache file that is currently in use for load/save (this file is locked). + std::string _locked_file; + + /// Type of cache (truth or surrogate). + NOMAD::eval_type _eval_type; + + /// Points read in the (optional) initial cache file. + std::set<NOMAD::Cache_Point> _cache1; + + /// Points of the cache to write in the cache file. + std::set<NOMAD::Cache_Point> _cache2; + + /// Points of the cache already saved in the file. + std::set<NOMAD::Cache_Point> _cache3; + + /// Points not from the current run (from a cache file or from a user). + mutable std::list<const NOMAD::Eval_Point*> _extern_pts; + + /// Size in memory. + mutable float _sizeof; + + /// Iterator to browse the cache with \c begin() and \c next(). + mutable std::set<NOMAD::Cache_Point>::const_iterator _it; + + /*---------------------------------------------------------------------------*/ + + /// Read points in a cache file. + /** + - Reads points from a cache file. + - Fills the set \c _cache1. + \param fin The already opened input file -- \b IN. + \param p_nb_bb_outputs A pointer on an integer with the number + of blackbox outputs; can be \c NULL -- \b IN. + \param display A boolean equal to \c true if displays + are authorized -- \b IN. + \return A boolean equal to \c true if the file could be read. + */ + bool read_points_from_cache_file ( std::ifstream & fin , + const int * p_nb_bb_outputs , + bool display ); + + /// Check if a file is locked. + /** + \param file_name Name of the file -- \b IN. + \return A boolean equal to \c true if the file is locked. + */ + bool is_locked ( const std::string & file_name ); + + /// Lock a file. + /** + \param file_name Name of the file -- \b IN. + \return A boolean equal to \c false if the file was already locked. + */ + bool lock ( const std::string & file_name ); + + /// Unlock the locked file. + void unlock ( void ); + + /// Update a point already in cache. + /** + - The point already in cache is updated from another point with the same coordinates. - - If both points have a different number of blackbox outputs, + - If both points have a different number of blackbox outputs, they are not comparable and we set \c cache_x \c = \c x . - \param cache_x The point already in cache -- \b IN/OUT. - \param x The other point -- \b IN. - */ - void update ( NOMAD::Eval_Point & cache_x , const NOMAD::Eval_Point & x ) const; - - /// Find a point in the cache. - /** - \param x The point -- \b IN. - \param it An iterator indicating the position of the point - -- \b OUT. - \param cache_index Index of the std::set in which the point has been found - -- \b OUT. - \return A pointer to the point in cache. - \return \c NULL if \c x is not in the cache. - */ - const NOMAD::Eval_Point * find - ( const NOMAD::Eval_Point & x , - std::set<NOMAD::Cache_Point>::const_iterator & it , - NOMAD::cache_index_type & cache_index ) const; - - /// Initialization of \c _sizeof. - /** - \return The size of an empty cache. - */ - int sizeof_init ( void ) const; - - /*---------------------------------------------------------------------------*/ - - public: - - /// Exception class for a cache error. - /** - Occurs when points have not the same \c eval_type as \c this->_eval_type. - */ - class Cache_Error : public NOMAD::Exception - { + \param cache_x The point already in cache -- \b IN/OUT. + \param x The other point -- \b IN. + */ + void update ( NOMAD::Eval_Point & cache_x , const NOMAD::Eval_Point & x ) const; + + /// Find a point in the cache. + /** + \param x The point -- \b IN. + \param it An iterator indicating the position of the point + -- \b OUT. + \param cache_index Index of the std::set in which the point has been found + -- \b OUT. + \return A pointer to the point in cache. + \return \c NULL if \c x is not in the cache. + */ + const NOMAD::Eval_Point * find ( const NOMAD::Eval_Point & x , + std::set<NOMAD::Cache_Point>::const_iterator & it , + NOMAD::cache_index_type & cache_index) const; + + /// Initialization of \c _sizeof. + /** + \return The size of an empty cache. + */ + int sizeof_init ( void ) const; + + /*---------------------------------------------------------------------------*/ + public: - /// Constructor. - Cache_Error ( const std::string & file , - int line , - const std::string & msg ) - : NOMAD::Exception ( file , line , msg ) {} + + /// Exception class for a cache error. + /** + Occurs when points have not the same \c eval_type as \c this->_eval_type. + */ + class Cache_Error : public NOMAD::Exception + { + public: + /// Constructor. + Cache_Error ( const std::string & file , + int line , + const std::string & msg ) + : NOMAD::Exception ( file , line , msg ) {} + }; + + /*---------------------------------------------------------------------------*/ + + /// Constructor. + /** + \param out The NOMAD::Display object -- \b IN. + \param type Type of the cache + -- \b IN -- \b optional (default = NOMAD::TRUTH). + */ + explicit Cache ( const NOMAD::Display & out , + NOMAD::eval_type type = NOMAD::TRUTH ) + : _out ( out ) , + _eval_type ( type ) , + _sizeof ( static_cast<float>(sizeof_init()) ) {} + + /// Destructor. + virtual ~Cache ( void ) { clear(); } + + /// Access to the size of cache in memory. + /** + \return The size of cache in memory, in bytes. + */ + float size_of ( void ) const { return _sizeof; } + + /// Access to the number of points. + /** + \return The number of points in the cache. + */ + int size ( void ) const + { + return static_cast<int> ( _cache1.size() + _cache2.size() + _cache3.size() ); + } + + /// check if the cache is empty. + /** + \return A boolean equal to \c true if the cache is empty. + */ + bool empty ( void ) const + { + return _cache1.empty() && _cache2.empty() && _cache3.empty(); + } + + /// Access to the evaluation type (truth or surrogate). + /** + \return The evaluation type. + */ + NOMAD::eval_type get_eval_type ( void ) const { return _eval_type; } + + /// Const cast for an evaluation point. + /** + Transforms a \c const NOMAD::Eval_Point \c & into a NOMAD::Eval_Point \c &. + \param x The const point -- \b IN. + \return The non-const point. + */ + static NOMAD::Eval_Point & get_modifiable_point ( const NOMAD::Eval_Point & x ) + { + return const_cast<NOMAD::Eval_Point&> ( x ); + } + + /// Insertion of a point into the list of extern points. + /** + \param x The extern point -- \b IN. + */ + void insert_extern_point ( const NOMAD::Eval_Point & x ) const; + + /// Access to the number of extern points. + /** + \return The number of extern points. + */ + virtual int get_nb_extern_points ( void ) const + { + return static_cast<int>(_extern_pts.size()); + } + + /// Access to an extern point. + /** + Get the first extern point and remove it from the list. + \return A pointer to the extern point; + \c NULL if there is no extern point. + */ + virtual const NOMAD::Eval_Point * get_and_remove_extern_point ( void ) const; + + /// Find a point in the cache. + /** + \param x The point -- \b IN. + \return A pointer to the point in cache. + \return \c NULL if the point is not in cache. + */ + virtual const NOMAD::Eval_Point * find ( const NOMAD::Eval_Point & x ) const; + + /// Access to the first point in cache. + /** + We browse in this order: \c _cache2, \c _cache3, and \c _cache_1 . + \return A pointer to the first point in cache; + \c NULL if the cache is empty. + */ + const NOMAD::Eval_Point * begin ( void ) const; + + /// Access to the next point when browsing the cache. + /** + Supposes that \c begin() has already been called. + \return A pointer to the next point; \c NULL if there + is no more point. + */ + const NOMAD::Eval_Point * next ( void ) const; + + /// Erase a point. + /** + The point is not deleted from memory if its + address does not match the address of the point + in cache. + \param x The point -- \b IN. + \return A boolean equal to \c true + if the point has been found and removed from the cache. + */ + bool erase ( const NOMAD::Eval_Point & x ); + + /// Insertion of a point in the cache ( \c _cache2 ). + /** + Supposes that \c x is not already in cache. + \param x The point -- \b IN. + */ + virtual void insert ( const NOMAD::Eval_Point & x ); + + /// Insert all points of another cache into the current cache. + /** + This empties the points in \c c in order to avoid NOMAD::Eval_Point copies. + \c c._locked_file and \c this->_locked_file are different by construction. + \param c The other cache -- \b IN/OUT. + */ + void insert ( Cache & c ); + + /// Load a cache file. + /** + - fills the set \c _cache1. + - locks the file \c file_name. + + \param file_name The file -- \b IN. + + \param p_nb_bb_outputs A pointer to the number of blackbox outputs. + It is ignored if equal to \c NULL. + Points from the file with a different number + of outputs are ignored + -- \b IN -- \b optional (default = \c NULL). + + \param display A boolean equal to \c true if displays + are authorized + -- \b IN -- \b optional (default = \c true). + + \return \c false if the file exists and is not a valid cache file. + \return \c false if the file is already locked. + \return \c false if the object already locked another file. + \return \c true if the object is already locked with this file (and do nothing). + \return \c true and create a valid cache file if the file does not exist. + \return \c false if the previous anything else did not work. + */ + bool load ( const std::string & file_name , + const int * p_nb_bb_outputs = NULL , + bool display = true ); + + /// Save a cache file. + /** + \param overwrite A boolean. + If \c false, points are written + at the end of the locked file and only points + from \c _cache2 are considered. + These points are then transfered to \c _cache3. + If \c true, all the points are considered. + -- \b IN -- \b optional (default = \c false). + \param display A boolean equal to \c true if displays + are authorized + -- \b IN -- \b optional (default = \c true). + \return A boolean equal to \c true if the save could complete. + */ + bool save ( bool overwrite = false , + bool display = true ); + + /// Erase all points in cache and unlock the file. + void clear ( void ); + + /// Display the list of extern points. + /** + \param out The NOMAD::Display object -- \b IN. + */ + void display_extern_pts ( const NOMAD::Display & out ) const; + + /// Display the list of extern points. + /** + Uses the \c this->_out member as NOMAD::Display object. + */ + void display_extern_pts ( void ) const { display_extern_pts ( _out ); } + + /// Display. + /** + \param out The NOMAD::Display object -- \b IN. + */ + void display ( const NOMAD::Display & out ) const; + + /// Display. + /** + Uses the \c this->_out member as NOMAD::Display object. + */ + void display ( void ) const { display ( _out ); } + }; - /*---------------------------------------------------------------------------*/ - - /// Constructor. - /** - \param out The NOMAD::Display object -- \b IN. - \param type Type of the cache - -- \b IN -- \b optional (default = NOMAD::TRUTH). - */ - explicit Cache ( const NOMAD::Display & out , - NOMAD::eval_type type = NOMAD::TRUTH ) - : _out ( out ) , - _eval_type ( type ) , - _sizeof ( static_cast<float>(sizeof_init()) ) {} - - /// Destructor. - virtual ~Cache ( void ) { clear(); } - - /// Access to the size of cache in memory. - /** - \return The size of cache in memory, in bytes. - */ - float size_of ( void ) const { return _sizeof; } - - /// Access to the number of points. - /** - \return The number of points in the cache. - */ - int size ( void ) const - { - return static_cast<int> ( _cache1.size() + _cache2.size() + _cache3.size() ); - } - - /// check if the cache is empty. + /// Display a NOMAD::Cache object. /** - \return A boolean equal to \c true if the cache is empty. - */ - bool empty ( void ) const - { - return _cache1.empty() && _cache2.empty() && _cache3.empty(); - } - - /// Access to the evaluation type (truth or surrogate). - /** - \return The evaluation type. - */ - NOMAD::eval_type get_eval_type ( void ) const { return _eval_type; } - - /// Const cast for an evaluation point. - /** - Transforms a \c const NOMAD::Eval_Point \c & into a NOMAD::Eval_Point \c &. - \param x The const point -- \b IN. - \return The non-const point. - */ - static NOMAD::Eval_Point & get_modifiable_point ( const NOMAD::Eval_Point & x ) - { - return const_cast<NOMAD::Eval_Point&> ( x ); - } - - /// Insertion of a point into the list of extern points. - /** - \param x The extern point -- \b IN. - */ - void insert_extern_point ( const NOMAD::Eval_Point & x ) const; - - /// Access to the number of extern points. - /** - \return The number of extern points. - */ - virtual int get_nb_extern_points ( void ) const { return static_cast<int>(_extern_pts.size()); } - - /// Access to an extern point. - /** - Get the first extern point and remove it from the list. - \return A pointer to the extern point; - \c NULL if there is no extern point. - */ - virtual const NOMAD::Eval_Point * get_and_remove_extern_point ( void ) const; - - /// Find a point in the cache. - /** - \param x The point -- \b IN. - \return A pointer to the point in cache. - \return \c NULL if the point is not in cache. - */ - virtual const NOMAD::Eval_Point * find ( const NOMAD::Eval_Point & x ) const; - - /// Access to the first point in cache. - /** - We browse in this order: \c _cache2, \c _cache3, and \c _cache_1 . - \return A pointer to the first point in cache; - \c NULL if the cache is empty. - */ - const NOMAD::Eval_Point * begin ( void ) const; - - /// Access to the next point when browsing the cache. - /** - Supposes that \c begin() has already been called. - \return A pointer to the next point; \c NULL if there - is no more point. - */ - const NOMAD::Eval_Point * next ( void ) const; - - /// Erase a point. - /** - The point is not deleted from memory if its - address does not match the address of the point - in cache. - \param x The point -- \b IN. - \return A boolean equal to \c true - if the point has been found and removed from the cache. - */ - bool erase ( const NOMAD::Eval_Point & x ); - - /// Insertion of a point in the cache ( \c _cache2 ). - /** - Supposes that \c x is not already in cache. - \param x The point -- \b IN. - */ - virtual void insert ( const NOMAD::Eval_Point & x ); - - /// Insert all points of another cache into the current cache. - /** - This empties the points in \c c in order to avoid NOMAD::Eval_Point copies. - \c c._locked_file and \c this->_locked_file are different by construction. - \param c The other cache -- \b IN/OUT. - */ - void insert ( Cache & c ); - - /// Load a cache file. - /** - - fills the set \c _cache1. - - locks the file \c file_name. - - \param file_name The file -- \b IN. - - \param p_nb_bb_outputs A pointer to the number of blackbox outputs. - It is ignored if equal to \c NULL. - Points from the file with a different number - of outputs are ignored - -- \b IN -- \b optional (default = \c NULL). - - \param display A boolean equal to \c true if displays - are authorized - -- \b IN -- \b optional (default = \c true). - - \return \c false if the file exists and is not a valid cache file. - \return \c false if the file is already locked. - \return \c false if the object already locked another file. - \return \c true if the object is already locked with this file (and do nothing). - \return \c true and create a valid cache file if the file does not exist. - \return \c false if the previous anything else did not work. - */ - bool load ( const std::string & file_name , - const int * p_nb_bb_outputs = NULL , - bool display = true ); - - /// Save a cache file. - /** - \param overwrite A boolean. - If \c false, points are written - at the end of the locked file and only points - from \c _cache2 are considered. - These points are then transfered to \c _cache3. - If \c true, all the points are considered. - -- \b IN -- \b optional (default = \c false). - \param display A boolean equal to \c true if displays - are authorized - -- \b IN -- \b optional (default = \c true). - \return A boolean equal to \c true if the save could complete. - */ - bool save ( bool overwrite = false , - bool display = true ); - - /// Erase all points in cache and unlock the file. - void clear ( void ); - - /// Display the list of extern points. - /** - \param out The NOMAD::Display object -- \b IN. - */ - void display_extern_pts ( const NOMAD::Display & out ) const; - - /// Display the list of extern points. - /** - Uses the \c this->_out member as NOMAD::Display object. - */ - void display_extern_pts ( void ) const { display_extern_pts ( _out ); } - - /// Display. - /** - \param out The NOMAD::Display object -- \b IN. - */ - void display ( const NOMAD::Display & out ) const; - - /// Display. - /** - Uses the \c this->_out member as NOMAD::Display object. - */ - void display ( void ) const { display ( _out ); } - - }; - - /// Display a NOMAD::Cache object. - /** \param out The NOMAD::Display object -- \b IN. \param c The NOMAD::Cache object to be displayed -- \b IN. \return The NOMAD::Display object. - */ - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::Cache & c ) - { - c.display ( out ); - return out; - } + */ + inline const NOMAD::Display & operator << ( const NOMAD::Display & out , + const NOMAD::Cache & c ) + { + c.display ( out ); + return out; + } } #endif diff --git a/src/Cache_File_Point.cpp b/src/Cache_File_Point.cpp index 97aca5d..d5255df 100644 --- a/src/Cache_File_Point.cpp +++ b/src/Cache_File_Point.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Cache_File_Point.cpp - \brief Class for points in binary files (implementation) - \author Sebastien Le Digabel - \date 2010-04-06 - \see Cache_File_Point.hpp -*/ + \file Cache_File_Point.cpp + \brief Class for points in binary files (implementation) + \author Sebastien Le Digabel + \date 2010-04-06 + \see Cache_File_Point.hpp + */ #include "Cache_File_Point.hpp" #include "Eval_Point.hpp" @@ -55,19 +62,19 @@ int NOMAD::Cache_File_Point::_max_cardinality = 0; /* constructor 1 */ /*---------------------------------------------------------------------*/ NOMAD::Cache_File_Point::Cache_File_Point ( void ) - : _n ( 0 ) , - _m ( 0 ) , - _m_def ( 0 ) , - _eval_status ( 3 ) , - _coords ( NULL ) , - _bbo_def ( NULL ) , - _bbo_index ( NULL ) +: _n ( 0 ) , +_m ( 0 ) , +_m_def ( 0 ) , +_eval_status ( 3 ) , +_coords ( NULL ) , +_bbo_def ( NULL ) , +_bbo_index ( NULL ) { #ifdef MEMORY_DEBUG - ++NOMAD::Cache_File_Point::_cardinality; - if ( NOMAD::Cache_File_Point::_cardinality > - NOMAD::Cache_File_Point::_max_cardinality ) - ++NOMAD::Cache_File_Point::_max_cardinality; + ++NOMAD::Cache_File_Point::_cardinality; + if ( NOMAD::Cache_File_Point::_cardinality > + NOMAD::Cache_File_Point::_max_cardinality ) + ++NOMAD::Cache_File_Point::_max_cardinality; #endif } @@ -75,88 +82,94 @@ NOMAD::Cache_File_Point::Cache_File_Point ( void ) /* constructor 2 */ /*---------------------------------------------------------------------*/ NOMAD::Cache_File_Point::Cache_File_Point ( const NOMAD::Eval_Point & x ) - : _n ( x.size() ) , - _m ( 0 ) , - _m_def ( 0 ) , - _coords ( NULL ) , - _bbo_def ( NULL ) , - _bbo_index ( NULL ) +: _n ( x.size() ) , +_m ( 0 ) , +_m_def ( 0 ) , +_coords ( NULL ) , +_bbo_def ( NULL ) , +_bbo_index ( NULL ) { - int i; - - // eval_status: - switch ( x.get_eval_status() ) { - case NOMAD::EVAL_FAIL: - _eval_status = 0; - break; - case NOMAD::EVAL_OK: - _eval_status = 1; - break; - case NOMAD::EVAL_IN_PROGRESS: - _eval_status = 2; - break; - case NOMAD::UNDEFINED_STATUS: - _eval_status = 3; - break; - case NOMAD::EVAL_USER_REJECT: - _eval_status = 3; - break; - } - - // inputs: - if ( _n > 0 ) { - _coords = new double [_n]; - for ( i = 0 ; i < _n ; ++i ) - _coords[i] = x[i].value(); - } - else - _n = 0; - - // outputs: - const NOMAD::Point & bbo = x.get_bb_outputs(); - _m = bbo.size(); - if ( _m > 0 ) { - - std::vector<double> vd; - std::vector<int> vi; - - for ( i = 0 ; i < _m ; ++i ) - if ( bbo[i].is_defined() ) { - vd.push_back ( bbo[i].value() ); - vi.push_back ( i ); - } - - _m_def = static_cast<int> ( vd.size() ); - if ( _m_def > 0 ) { - _bbo_def = new double [_m_def]; - _bbo_index = new int [_m_def]; - for ( i = 0 ; i < _m_def ; ++i ) { - _bbo_def [i] = vd[i]; - _bbo_index[i] = vi[i]; - } - } - } - else - _m = 0; - + int i; + + // eval_status: + switch ( x.get_eval_status() ) + { + case NOMAD::EVAL_FAIL: + _eval_status = 0; + break; + case NOMAD::EVAL_OK: + _eval_status = 1; + break; + case NOMAD::EVAL_IN_PROGRESS: + _eval_status = 2; + break; + case NOMAD::UNDEFINED_STATUS: + _eval_status = 3; + break; + case NOMAD::EVAL_USER_REJECT: + _eval_status = 3; + break; + } + + // inputs: + if ( _n > 0 ) + { + _coords = new double [_n]; + for ( i = 0 ; i < _n ; ++i ) + _coords[i] = x[i].value(); + } + else + _n = 0; + + // outputs: + const NOMAD::Point & bbo = x.get_bb_outputs(); + _m = bbo.size(); + if ( _m > 0 ) + { + + std::vector<double> vd; + std::vector<int> vi; + + for ( i = 0 ; i < _m ; ++i ) + if ( bbo[i].is_defined() ) + { + vd.push_back ( bbo[i].value() ); + vi.push_back ( i ); + } + + _m_def = static_cast<int> ( vd.size() ); + if ( _m_def > 0 ) + { + _bbo_def = new double [_m_def]; + _bbo_index = new int [_m_def]; + for ( i = 0 ; i < _m_def ; ++i ) + { + _bbo_def [i] = vd[i]; + _bbo_index[i] = vi[i]; + } + } + } + else + _m = 0; + #ifdef MEMORY_DEBUG - ++NOMAD::Cache_File_Point::_cardinality; - if ( NOMAD::Cache_File_Point::_cardinality > - NOMAD::Cache_File_Point::_max_cardinality ) - ++NOMAD::Cache_File_Point::_max_cardinality; + ++NOMAD::Cache_File_Point::_cardinality; + if ( NOMAD::Cache_File_Point::_cardinality > + NOMAD::Cache_File_Point::_max_cardinality ) + ++NOMAD::Cache_File_Point::_max_cardinality; #endif } /*---------------------------------------------------------------------*/ /* destructor */ /*---------------------------------------------------------------------*/ -NOMAD::Cache_File_Point::~Cache_File_Point ( void ) +NOMAD::Cache_File_Point::~Cache_File_Point ( void ) { - delete [] _coords; - delete [] _bbo_def; - delete [] _bbo_index; + delete [] _coords; + delete [] _bbo_def; + delete [] _bbo_index; #ifdef MEMORY_DEBUG - --NOMAD::Cache_File_Point::_cardinality; + --NOMAD::Cache_File_Point::_cardinality; #endif } @@ -165,10 +178,10 @@ NOMAD::Cache_File_Point::~Cache_File_Point ( void ) /*---------------------------------------------------------------------*/ double NOMAD::Cache_File_Point::get_coord ( int i ) const { - if ( !_coords || i < 0 || i >= _n ) - throw NOMAD::Exception ( "Cache_File_Point.cpp" , __LINE__ , - "bad access in Cache_File_Point::get_coord()" ); - return _coords[i]; + if ( !_coords || i < 0 || i >= _n ) + throw NOMAD::Exception ( "Cache_File_Point.cpp" , __LINE__ , + "bad access in Cache_File_Point::get_coord()" ); + return _coords[i]; } /*---------------------------------------------------------------------*/ @@ -176,10 +189,10 @@ double NOMAD::Cache_File_Point::get_coord ( int i ) const /*---------------------------------------------------------------------*/ const NOMAD::Point NOMAD::Cache_File_Point::get_bb_outputs ( void ) const { - NOMAD::Point bbo ( _m ); - for ( int i = 0 ; i < _m_def ; ++i ) - bbo [ _bbo_index[i] ] = _bbo_def[i]; - return bbo; + NOMAD::Point bbo ( _m ); + for ( int i = 0 ; i < _m_def ; ++i ) + bbo [ _bbo_index[i] ] = _bbo_def[i]; + return bbo; } /*---------------------------------------------------------*/ @@ -187,16 +200,16 @@ const NOMAD::Point NOMAD::Cache_File_Point::get_bb_outputs ( void ) const /*---------------------------------------------------------*/ void NOMAD::Cache_File_Point::reset ( void ) { - _n = _m = _m_def = 0; - _eval_status = 3; - - delete [] _coords; - delete [] _bbo_def; - delete [] _bbo_index; - - _coords = NULL; - _bbo_def = NULL; - _bbo_index = NULL; + _n = _m = _m_def = 0; + _eval_status = 3; + + delete [] _coords; + delete [] _bbo_def; + delete [] _bbo_index; + + _coords = NULL; + _bbo_def = NULL; + _bbo_index = NULL; } /*---------------------------------------------------------*/ @@ -204,35 +217,36 @@ void NOMAD::Cache_File_Point::reset ( void ) /*---------------------------------------------------------*/ bool NOMAD::Cache_File_Point::write ( std::ofstream & fout ) const { - // do nothing if no point: - if ( _n <= 0 ) - return true; - - // 1. _eval_status: - fout.write ( (char *) &_eval_status , sizeof(_eval_status) ); - - // 2. _n: - fout.write ( (char *) &_n , sizeof(_n) ); - - // 3. _m: - fout.write ( (char *) &_m , sizeof(_m) ); - - // 4. _m_def: - fout.write ( (char *) &_m_def , sizeof(_m_def) ); - - // 5. _coords: - fout.write ( (char *) _coords , _n*sizeof(double) ); - - if ( _m_def > 0 ) { - - // 6. _bbo_def: - fout.write ( (char *) _bbo_def , _m_def*sizeof(double) ); - - // 7. _bbo_index: - fout.write ( (char *) _bbo_index , _m_def*sizeof(int) ); - } - - return !fout.fail(); + // do nothing if no point: + if ( _n <= 0 ) + return true; + + // 1. _eval_status: + fout.write ( (char *) &_eval_status , sizeof(_eval_status) ); + + // 2. _n: + fout.write ( (char *) &_n , sizeof(_n) ); + + // 3. _m: + fout.write ( (char *) &_m , sizeof(_m) ); + + // 4. _m_def: + fout.write ( (char *) &_m_def , sizeof(_m_def) ); + + // 5. _coords: + fout.write ( (char *) _coords , _n*sizeof(double) ); + + if ( _m_def > 0 ) + { + + // 6. _bbo_def: + fout.write ( (char *) _bbo_def , _m_def*sizeof(double) ); + + // 7. _bbo_index: + fout.write ( (char *) _bbo_index , _m_def*sizeof(int) ); + } + + return !fout.fail(); } /*---------------------------------------------------------*/ @@ -240,62 +254,69 @@ bool NOMAD::Cache_File_Point::write ( std::ofstream & fout ) const /*---------------------------------------------------------*/ bool NOMAD::Cache_File_Point::read ( std::ifstream & fin ) { - reset(); - - // 1. _eval_status: - fin.read ( (char *) &_eval_status , sizeof(_eval_status) ); - if ( fin.fail() || _eval_status > 3 ) - return false; - - // 2. _n: - fin.read ( (char *) &_n , sizeof(_n) ); - if ( fin.fail() || _n <= 0 ) { - _n = 0; - return false; - } - - // 3. _m: - fin.read ( (char *) &_m , sizeof(_m) ); - if ( fin.fail() || _m < 0 ) { - _n = _m = 0; - return false; - } - - // 4. _m_def: - fin.read ( (char *) &_m_def , sizeof(_m_def) ); - if ( fin.fail() || _m_def < 0 ) { - _m_def = _n = _m = 0; - return false; - } - - // 5. _coords: - _coords = new double [_n]; - fin.read ( (char *) _coords , _n*sizeof(double) ); - if ( fin.fail() ) { reset(); - return false; - } - - if ( _m_def > 0 ) { - - // 6. _bb_def: - _bbo_def = new double [_m_def]; - fin.read ( (char *) _bbo_def , _m_def*sizeof(double) ); - if ( fin.fail() ) { - reset(); - return false; + + // 1. _eval_status: + fin.read ( (char *) &_eval_status , sizeof(_eval_status) ); + if ( fin.fail() || _eval_status > 3 ) + return false; + + // 2. _n: + fin.read ( (char *) &_n , sizeof(_n) ); + if ( fin.fail() || _n <= 0 ) + { + _n = 0; + return false; } - - // 7. _bbo_index: - _bbo_index = new int [_m_def]; - fin.read ( (char *) _bbo_index , _m_def*sizeof(int) ); - if ( fin.fail() ) { - reset(); - return false; + + // 3. _m: + fin.read ( (char *) &_m , sizeof(_m) ); + if ( fin.fail() || _m < 0 ) + { + _n = _m = 0; + return false; } - } - - return true; + + // 4. _m_def: + fin.read ( (char *) &_m_def , sizeof(_m_def) ); + if ( fin.fail() || _m_def < 0 ) + { + _m_def = _n = _m = 0; + return false; + } + + // 5. _coords: + _coords = new double [_n]; + fin.read ( (char *) _coords , _n*sizeof(double) ); + if ( fin.fail() ) + { + reset(); + return false; + } + + if ( _m_def > 0 ) + { + + // 6. _bb_def: + _bbo_def = new double [_m_def]; + fin.read ( (char *) _bbo_def , _m_def*sizeof(double) ); + if ( fin.fail() ) + { + reset(); + return false; + } + + // 7. _bbo_index: + _bbo_index = new int [_m_def]; + fin.read ( (char *) _bbo_index , _m_def*sizeof(int) ); + if ( fin.fail() ) + { + reset(); + return false; + } + } + + return true; } /*---------------------------------------------------------*/ @@ -303,25 +324,27 @@ bool NOMAD::Cache_File_Point::read ( std::ifstream & fin ) /*---------------------------------------------------------*/ void NOMAD::Cache_File_Point::display ( const NOMAD::Display & out ) const { - out << "n : " << _n << std::endl - << "m : " << _m << std::endl - << "m_def : " << _m_def << std::endl; - - int i; - if ( _n > 0 ) { - out << "coords : ( "; - for ( i = 0 ; i < _n ; ++i ) - out << _coords[i] << " "; - out << ")" << std::endl; - } - if ( _m_def > 0 ) { - out << "bbo_def : [ "; - for ( i = 0 ; i < _m_def ; ++i ) - out << _bbo_def[i] << " "; - out << "]" << std::endl - << "bbo_index : [ "; - for ( i = 0 ; i < _m_def ; ++i ) - out << _bbo_index[i] << " "; - out << "]" << std::endl; - } + out << "n : " << _n << std::endl + << "m : " << _m << std::endl + << "m_def : " << _m_def << std::endl; + + int i; + if ( _n > 0 ) + { + out << "coords : ( "; + for ( i = 0 ; i < _n ; ++i ) + out << _coords[i] << " "; + out << ")" << std::endl; + } + if ( _m_def > 0 ) + { + out << "bbo_def : [ "; + for ( i = 0 ; i < _m_def ; ++i ) + out << _bbo_def[i] << " "; + out << "]" << std::endl + << "bbo_index : [ "; + for ( i = 0 ; i < _m_def ; ++i ) + out << _bbo_index[i] << " "; + out << "]" << std::endl; + } } diff --git a/src/Cache_File_Point.hpp b/src/Cache_File_Point.hpp index 3fcf4f0..7688a9e 100644 --- a/src/Cache_File_Point.hpp +++ b/src/Cache_File_Point.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Cache_File_Point.hpp - \brief Class for points in binary files (headers) - \author Sebastien Le Digabel - \date 2010-04-06 - \see Cache_File_Point.cpp -*/ + \file Cache_File_Point.hpp + \brief Class for points in binary files (headers) + \author Sebastien Le Digabel + \date 2010-04-06 + \see Cache_File_Point.cpp + */ #ifndef __CACHE_FILE_POINT__ #define __CACHE_FILE_POINT__ @@ -48,155 +55,155 @@ #include "Uncopyable.hpp" namespace NOMAD { - - // forward declarations: - class Point; - class Eval_Point; - - /// Class to represent NOMAD::Eval_Point objects in binary files. - /** - - All point coordinates are saved. - - Only defined blackbox outputs are saved. - - To get all bb_outputs: - \code - NOMAD::Point bbo ( _m ); - for ( int i = 0 ; i < _m_def ; ++i ) - bbo [ _bbo_index[i] ] = _bbo_def[i]; - \endcode - */ - class Cache_File_Point : private NOMAD::Uncopyable { - - private: + // forward declarations: + class Point; + class Eval_Point; + + /// Class to represent NOMAD::Eval_Point objects in binary files. + /** + - All point coordinates are saved. + - Only defined blackbox outputs are saved. + - To get all bb_outputs: + \code + NOMAD::Point bbo ( _m ); + for ( int i = 0 ; i < _m_def ; ++i ) + bbo [ _bbo_index[i] ] = _bbo_def[i]; + \endcode + */ + class Cache_File_Point : private NOMAD::Uncopyable { + + private: + #ifdef MEMORY_DEBUG - /// Number of NOMAD::Cache_File_Point objects in memory. - static int _cardinality; - - /// Max number of NOMAD::Cache_File_Point objects in memory. - static int _max_cardinality; + /// Number of NOMAD::Cache_File_Point objects in memory. + static int _cardinality; + + /// Max number of NOMAD::Cache_File_Point objects in memory. + static int _max_cardinality; #endif - - int _n; ///< Dimension of the point. - int _m; ///< Number of blackbox outputs (both defined and undefined). - int _m_def; ///< Number of defined blackbox outputs. - - /// Evaluation status. - /** - - 0: fail. - - 1: ok. - - 2: in progress. - - 3: undefined. - */ - unsigned char _eval_status; - - double * _coords; ///< The \c _n coordinates. - double * _bbo_def; ///< The \c _m_def defined blackbox output values. - int * _bbo_index; ///< The index for the blackbox output values. - - /// Reset. - void reset ( void ); - - public: - + + int _n; ///< Dimension of the point. + int _m; ///< Number of blackbox outputs (both defined and undefined). + int _m_def; ///< Number of defined blackbox outputs. + + /// Evaluation status. + /** + - 0: fail. + - 1: ok. + - 2: in progress. + - 3: undefined. + */ + unsigned char _eval_status; + + double * _coords; ///< The \c _n coordinates. + double * _bbo_def; ///< The \c _m_def defined blackbox output values. + int * _bbo_index; ///< The index for the blackbox output values. + + /// Reset. + void reset ( void ); + + public: + #ifdef MEMORY_DEBUG - /// Access to the number of NOMAD::Cache_File_Point objects in memory. - /** - \return The number of NOMAD::Cache_File_Point objects in memory. - */ - static int get_cardinality ( void ) { return Cache_File_Point::_cardinality; } - - /// Access to the max number of NOMAD::Cache_File_Point objects in memory. - /** - \return The max number of NOMAD::Cache_File_Point objects in memory. - */ - static int get_max_cardinality ( void ) - { - return Cache_File_Point::_max_cardinality; - } + /// Access to the number of NOMAD::Cache_File_Point objects in memory. + /** + \return The number of NOMAD::Cache_File_Point objects in memory. + */ + static int get_cardinality ( void ) { return Cache_File_Point::_cardinality; } + + /// Access to the max number of NOMAD::Cache_File_Point objects in memory. + /** + \return The max number of NOMAD::Cache_File_Point objects in memory. + */ + static int get_max_cardinality ( void ) + { + return Cache_File_Point::_max_cardinality; + } #endif - - /// Constructor #1. - explicit Cache_File_Point ( void ); - - /// Constructor #2. - /** - From a NOMAD::Eval_Point object. - \param x The evaluation point. - */ - explicit Cache_File_Point ( const NOMAD::Eval_Point & x ); + + /// Constructor #1. + explicit Cache_File_Point ( void ); + + /// Constructor #2. + /** + From a NOMAD::Eval_Point object. + \param x The evaluation point. + */ + explicit Cache_File_Point ( const NOMAD::Eval_Point & x ); + + /// Destructor. + virtual ~Cache_File_Point ( void ); + + /// Access to the dimension of the point. + /** + \return The dimension of the point. + */ + int get_n ( void ) const { return _n; } + + /// Access to the number of blackbox outputs. + /** + \return The number of blackbox outputs. + */ + int get_m ( void ) const { return _m; } + + /// Access to the evaluation status. + /** + Evaluation status as a character: + - 0: fail. + - 1: ok. + - 2: in progress. + - 3: undefined. + \return A character as the evaluation status. + */ + unsigned char get_eval_status ( void ) const { return _eval_status; } + + /// Access to the coordinates. + /** + \param i The index (0 for the first element) -- \b IN. + \return The \c (i+1)th coordinate. + */ + double get_coord ( int i ) const; + + /// Access to the blackbox outputs. + /** + \return A NOMAD::Point as the \c _m outputs. + */ + const NOMAD::Point get_bb_outputs ( void ) const; + + /// Write in a binary file. + /** + \param fout The output file -- \b IN/OUT. + \return A boolean equal to \c true if the file could be written. + */ + bool write ( std::ofstream & fout ) const; + + /// Read in a binary file. + /** + \param fin The input file -- \b IN/OUT. + \return A boolean equal to \c true if the file could be read. + */ + bool read ( std::ifstream & fin ); + + /// Display. + /** + \param out The NOMAD::Display object -- \b IN. + */ + void display ( const NOMAD::Display & out ) const; + }; - /// Destructor. - virtual ~Cache_File_Point ( void ); - - /// Access to the dimension of the point. - /** - \return The dimension of the point. - */ - int get_n ( void ) const { return _n; } - - /// Access to the number of blackbox outputs. + /// Display a NOMAD::Cache_File_Point object. /** - \return The number of blackbox outputs. - */ - int get_m ( void ) const { return _m; } - - /// Access to the evaluation status. - /** - Evaluation status as a character: - - 0: fail. - - 1: ok. - - 2: in progress. - - 3: undefined. - \return A character as the evaluation status. - */ - unsigned char get_eval_status ( void ) const { return _eval_status; } - - /// Access to the coordinates. - /** - \param i The index (0 for the first element) -- \b IN. - \return The \c (i+1)th coordinate. - */ - double get_coord ( int i ) const; - - /// Access to the blackbox outputs. - /** - \return A NOMAD::Point as the \c _m outputs. - */ - const NOMAD::Point get_bb_outputs ( void ) const; - - /// Write in a binary file. - /** - \param fout The output file -- \b IN/OUT. - \return A boolean equal to \c true if the file could be written. - */ - bool write ( std::ofstream & fout ) const; - - /// Read in a binary file. - /** - \param fin The input file -- \b IN/OUT. - \return A boolean equal to \c true if the file could be read. - */ - bool read ( std::ifstream & fin ); - - /// Display. - /** - \param out The NOMAD::Display object -- \b IN. - */ - void display ( const NOMAD::Display & out ) const; - }; - - /// Display a NOMAD::Cache_File_Point object. - /** \param out The NOMAD::Display object -- \b IN. \param x The NOMAD::Cache_File_Point object to be displayed -- \b IN. \return The NOMAD::Display object. - */ - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::Cache_File_Point & x ) - { - x.display ( out ); - return out; - } + */ + inline const NOMAD::Display & operator << ( const NOMAD::Display & out , + const NOMAD::Cache_File_Point & x ) + { + x.display ( out ); + return out; + } } #endif diff --git a/src/Cache_Point.cpp b/src/Cache_Point.cpp index 9b17725..ef43345 100644 --- a/src/Cache_Point.cpp +++ b/src/Cache_Point.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Cache_Point.cpp - \brief Point stored in the cache (implementation) - \author Sebastien Le Digabel - \date 2010-04-08 - \see Cache_Point.hpp -*/ + \file Cache_Point.cpp + \brief Point stored in the cache (implementation) + \author Sebastien Le Digabel + \date 2010-04-08 + \see Cache_Point.hpp + */ #include "Cache_Point.hpp" /*-----------------------------------------------------------*/ @@ -47,7 +54,7 @@ /*-----------------------------------------------------------*/ bool NOMAD::Cache_Point::operator < ( const Set_Element<NOMAD::Eval_Point> & cp ) const { - if ( get_element()->get_tag() == cp.get_element()->get_tag() ) - return false; - return get_element()->Point::operator < ( *(cp.get_element()) ); + if ( get_element()->get_tag() == cp.get_element()->get_tag() ) + return false; + return get_element()->Point::operator < ( *(cp.get_element()) ); } diff --git a/src/Cache_Point.hpp b/src/Cache_Point.hpp index eb76b6a..4a7bd2c 100644 --- a/src/Cache_Point.hpp +++ b/src/Cache_Point.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,64 +41,64 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Cache_Point.hpp - \brief Point stored in the cache (headers) - \author Sebastien Le Digabel - \date 2010-04-08 - \see Cache_Point.cpp -*/ + \file Cache_Point.hpp + \brief Point stored in the cache (headers) + \author Sebastien Le Digabel + \date 2010-04-08 + \see Cache_Point.cpp + */ #ifndef __CACHE_POINT__ #define __CACHE_POINT__ #include "Eval_Point.hpp" namespace NOMAD { - - /// Class for the representation of NOMAD::Eval_Point objects stored in the cache. - class Cache_Point : public NOMAD::Set_Element<NOMAD::Eval_Point> { - - private: - - /// Affectation operator. - /** - \param cp The right-hand side object -- \b IN. - \return \c *this as the result of the affectation. - */ - Cache_Point & operator = ( const Cache_Point & cp ); - - public: - - /// Constructor. - /** - \param x A pointer to the NOMAD::Eval_Point object - that is stored in the cache -- \b IN. - */ - explicit Cache_Point ( const NOMAD::Eval_Point * x ) - : NOMAD::Set_Element<NOMAD::Eval_Point> ( x ) {} - - /// Copy constructor. - /** - \param cp The copied object -- \b IN. - */ - Cache_Point ( const Cache_Point & cp ) - : NOMAD::Set_Element<NOMAD::Eval_Point> ( cp.get_element() ) {} - - /// Destructor. - virtual ~Cache_Point ( void ) {} - - /// Comparison operator. - /** - \param cp The right-hand side object. - \return A boolean equal to \c true if \c *this \c < \c cp. - */ - virtual bool operator < ( const NOMAD::Set_Element<NOMAD::Eval_Point> & cp ) const; - - /// Access to the point. - /** - \return A pointer to the NOMAD::Eval_Point stored in the cache. - */ - const NOMAD::Eval_Point * get_point ( void ) const { return get_element(); } - }; + + /// Class for the representation of NOMAD::Eval_Point objects stored in the cache. + class Cache_Point : public NOMAD::Set_Element<NOMAD::Eval_Point> { + + private: + + /// Affectation operator. + /** + \param cp The right-hand side object -- \b IN. + \return \c *this as the result of the affectation. + */ + Cache_Point & operator = ( const Cache_Point & cp ); + + public: + + /// Constructor. + /** + \param x A pointer to the NOMAD::Eval_Point object + that is stored in the cache -- \b IN. + */ + explicit Cache_Point ( const NOMAD::Eval_Point * x ) + : NOMAD::Set_Element<NOMAD::Eval_Point> ( x ) {} + + /// Copy constructor. + /** + \param cp The copied object -- \b IN. + */ + Cache_Point ( const Cache_Point & cp ) + : NOMAD::Set_Element<NOMAD::Eval_Point> ( cp.get_element() ) {} + + /// Destructor. + virtual ~Cache_Point ( void ) {} + + /// Comparison operator. + /** + \param cp The right-hand side object. + \return A boolean equal to \c true if \c *this \c < \c cp. + */ + virtual bool operator < ( const NOMAD::Set_Element<NOMAD::Eval_Point> & cp ) const; + + /// Access to the point. + /** + \return A pointer to the NOMAD::Eval_Point stored in the cache. + */ + const NOMAD::Eval_Point * get_point ( void ) const { return get_element(); } + }; } #endif diff --git a/src/Cache_Search.cpp b/src/Cache_Search.cpp index 58cbd70..2d22fc9 100644 --- a/src/Cache_Search.cpp +++ b/src/Cache_Search.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,122 +41,127 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Cache_Search.cpp - \brief NOMAD::Search subclass for the cache search (implementation) - \author Sebastien Le Digabel - \date 2010-04-08 - \see Cache_Search.hpp -*/ + \file Cache_Search.cpp + \brief NOMAD::Search subclass for the cache search (implementation) + \author Sebastien Le Digabel + \date 2010-04-08 + \see Cache_Search.hpp + */ #include "Cache_Search.hpp" /*---------------------------------------------------------*/ /* the search */ /*---------------------------------------------------------*/ void NOMAD::Cache_Search::search ( NOMAD::Mads & mads , - int & nb_search_pts , - bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - bool & count_search , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc ) -{ - new_feas_inc = new_infeas_inc = NULL; - nb_search_pts = 0; - success = NOMAD::UNSUCCESSFUL; - count_search = false; - - NOMAD::Evaluator_Control & ev_control = mads.get_evaluator_control(); - const Cache & cache = mads.get_cache(); - int nb_extern_pts = cache.get_nb_extern_points(); - - // do not perform the search if the number of extern points did not change: - if ( stop || nb_extern_pts == 0 || nb_extern_pts == _last_search_nb_extern_pts ) - return; - - count_search = true; - - // initial display: - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_search_dd(); - if ( display_degree == NOMAD::FULL_DISPLAY ) { - std::ostringstream oss; - oss << NOMAD::CACHE_SEARCH; - out << std::endl << NOMAD::open_block ( oss.str() ) << std::endl; - } - - std::list<const NOMAD::Eval_Point*> list_of_extern_pts; - const NOMAD::Eval_Point * extern_pt = cache.get_and_remove_extern_point(); - NOMAD::Eval_Point * pt = NULL; - int n = _p.get_dimension(); - - // add the extern points to the list of points to be evaluated: - while ( extern_pt ) { - - list_of_extern_pts.push_front ( extern_pt ); - - pt = &NOMAD::Cache::get_modifiable_point ( *extern_pt ); + int & nb_search_pts , + bool & stop , + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + bool & count_search , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc ) +{ + new_feas_inc = new_infeas_inc = NULL; + nb_search_pts = 0; + success = NOMAD::UNSUCCESSFUL; + count_search = false; + + NOMAD::Evaluator_Control & ev_control = mads.get_evaluator_control(); + const Cache & cache = mads.get_cache(); + int nb_extern_pts = cache.get_nb_extern_points(); - if ( extern_pt->get_signature() ) - pt->set_signature ( extern_pt->get_signature() ); - else if ( extern_pt->size() == n ) - pt->set_signature ( _p.get_signature() ); + // do not perform the search if the number of extern points did not change: + if ( stop || nb_extern_pts == 0 || nb_extern_pts == _last_search_nb_extern_pts ) + return; - if ( pt->get_signature() ) - ev_control.add_eval_point ( pt , - display_degree , - false , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() ); - else { - if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY ) - out << std::endl << "Warning (Cache_Search.cpp, " << __LINE__ - << "): could not use the point " << *pt - << "(no signature)" << std::endl; + count_search = true; + + // initial display: + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_search_dd(); + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + std::ostringstream oss; + oss << NOMAD::CACHE_SEARCH; + out << std::endl << NOMAD::open_block ( oss.str() ) << std::endl; + } + + std::list<const NOMAD::Eval_Point*> list_of_extern_pts; + const NOMAD::Eval_Point * extern_pt = cache.get_and_remove_extern_point(); + NOMAD::Eval_Point * pt = NULL; + int n = _p.get_dimension(); + + // add the extern points to the list of points to be evaluated: + while ( extern_pt ) + { + + list_of_extern_pts.push_front ( extern_pt ); + + pt = &NOMAD::Cache::get_modifiable_point ( *extern_pt ); + + if ( extern_pt->get_signature() ) + pt->set_signature ( extern_pt->get_signature() ); + else if ( extern_pt->size() == n ) + pt->set_signature ( _p.get_signature() ); + + if ( pt->get_signature() ) + ev_control.add_eval_point ( pt , + display_degree , + false , + NOMAD::Double() , + NOMAD::Double() , + NOMAD::Double() , + NOMAD::Double() ); + else + { + + if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY ) + out << std::endl << "Warning (Cache_Search.cpp, " << __LINE__ + << "): could not use the point " << *pt + << "(no signature)" << std::endl; + } + + extern_pt = cache.get_and_remove_extern_point(); + } + + nb_search_pts = ev_control.get_nb_eval_points(); + + // display all the search points: + if ( display_degree == NOMAD::FULL_DISPLAY ) + ev_control.display_eval_lop ( NOMAD::CACHE_SEARCH ); + + // eval_list_of_points: + new_feas_inc = new_infeas_inc = NULL; + ev_control.eval_list_of_points ( NOMAD::CACHE_SEARCH , + mads.get_true_barrier() , + mads.get_sgte_barrier() , + mads.get_pareto_front() , + stop , + stop_reason , + new_feas_inc , + new_infeas_inc , + success ); + + // the method cache.get_and_remove_extern_point() removes the first extern + // point from the cache. If the search is opportunistic and if there are + // extern points that have not been treated, then they must be put back + // in the cache list of extern points: + { + std::list<const NOMAD::Eval_Point*>::const_iterator + it , end = list_of_extern_pts.end(); + for ( it = list_of_extern_pts.begin() ; it != end ; ++it ) + if ( !(*it)->get_current_run() ) + cache.insert_extern_point ( **it ); + } + + // update _last_search_nb_extern_pts: + _last_search_nb_extern_pts = cache.get_nb_extern_points(); + + // final display: + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + std::ostringstream oss; + oss << "end of cache search (" << success << ")"; + out << std::endl << NOMAD::close_block ( oss.str() ) << std::endl; } - - extern_pt = cache.get_and_remove_extern_point(); - } - - nb_search_pts = ev_control.get_nb_eval_points(); - - // display all the search points: - if ( display_degree == NOMAD::FULL_DISPLAY ) - ev_control.display_eval_lop ( NOMAD::CACHE_SEARCH ); - - // eval_list_of_points: - new_feas_inc = new_infeas_inc = NULL; - ev_control.eval_list_of_points ( NOMAD::CACHE_SEARCH , - mads.get_true_barrier() , - mads.get_sgte_barrier() , - mads.get_pareto_front() , - stop , - stop_reason , - new_feas_inc , - new_infeas_inc , - success ); - - // the method cache.get_and_remove_extern_point() removes the first extern - // point from the cache. If the search is opportunistic and if there are - // extern points that have not been treated, then they must be put back - // in the cache list of extern points: - { - std::list<const NOMAD::Eval_Point*>::const_iterator - it , end = list_of_extern_pts.end(); - for ( it = list_of_extern_pts.begin() ; it != end ; ++it ) - if ( !(*it)->get_current_run() ) - cache.insert_extern_point ( **it ); - } - - // update _last_search_nb_extern_pts: - _last_search_nb_extern_pts = cache.get_nb_extern_points(); - - // final display: - if ( display_degree == NOMAD::FULL_DISPLAY ) { - std::ostringstream oss; - oss << "end of cache search (" << success << ")"; - out << std::endl << NOMAD::close_block ( oss.str() ) << std::endl; - } } diff --git a/src/Cache_Search.hpp b/src/Cache_Search.hpp index 25e2e51..9402965 100644 --- a/src/Cache_Search.hpp +++ b/src/Cache_Search.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Cache_Search.hpp - \brief NOMAD::Search subclass for the cache search (headers) - \author Sebastien Le Digabel - \date 2010-04-08 - \see Cache_Search.cpp -*/ + \file Cache_Search.hpp + \brief NOMAD::Search subclass for the cache search (headers) + \author Sebastien Le Digabel + \date 2010-04-08 + \see Cache_Search.cpp + */ #ifndef __CACHE_SEARCH__ #define __CACHE_SEARCH__ @@ -47,50 +54,50 @@ #include "Search.hpp" namespace NOMAD { - - /// Cache search. - class Cache_Search : public NOMAD::Search , private NOMAD::Uncopyable { - - private: - - /// Number of extern points at the end of the last cache search. - int _last_search_nb_extern_pts; - - public: - - /// Constructor. - /** - \param p Parameters -- \b IN. - */ - Cache_Search ( NOMAD::Parameters & p ) - : NOMAD::Search ( p , NOMAD::CACHE_SEARCH ) , - _last_search_nb_extern_pts ( 0 ) {} - /// Destructor. - virtual ~Cache_Search ( void ) {} - - /// Reset. - virtual void reset ( void ) { _last_search_nb_extern_pts = 0; } - - /// The cache search. - /** - \param mads NOMAD::Mads object invoking this search -- \b IN/OUT. - \param nb_search_pts Number of generated search points -- \b OUT. - \param stop Stop flag -- \b IN/OUT. - \param stop_reason Stop reason -- \b OUT. - \param success Type of success -- \b OUT. - \param count_search Count or not the search -- \b OUT. - \param new_feas_inc New feasible incumbent -- \b IN/OUT. - \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. - */ - virtual void search ( NOMAD::Mads & mads , - int & nb_search_pts , - bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - bool & count_search , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc ); - }; + /// Cache search. + class Cache_Search : public NOMAD::Search , private NOMAD::Uncopyable { + + private: + + /// Number of extern points at the end of the last cache search. + int _last_search_nb_extern_pts; + + public: + + /// Constructor. + /** + \param p Parameters -- \b IN. + */ + Cache_Search ( NOMAD::Parameters & p ) + : NOMAD::Search ( p , NOMAD::CACHE_SEARCH ) , + _last_search_nb_extern_pts ( 0 ) {} + + /// Destructor. + virtual ~Cache_Search ( void ) {} + + /// Reset. + virtual void reset ( void ) { _last_search_nb_extern_pts = 0; } + + /// The cache search. + /** + \param mads NOMAD::Mads object invoking this search -- \b IN/OUT. + \param nb_search_pts Number of generated search points -- \b OUT. + \param stop Stop flag -- \b IN/OUT. + \param stop_reason Stop reason -- \b OUT. + \param success Type of success -- \b OUT. + \param count_search Count or not the search -- \b OUT. + \param new_feas_inc New feasible incumbent -- \b IN/OUT. + \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. + */ + virtual void search ( NOMAD::Mads & mads , + int & nb_search_pts , + bool & stop , + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + bool & count_search , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc ); + }; } #endif diff --git a/src/Clock.cpp b/src/Clock.cpp index 6f95c22..5e69bf0 100644 --- a/src/Clock.cpp +++ b/src/Clock.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Clock.cpp - \brief Clock class (implementation) - \author Sebastien Le Digabel - \date 2010-04-02 - \see Clock.hpp -*/ + \file Clock.cpp + \brief Clock class (implementation) + \author Sebastien Le Digabel + \date 2010-04-02 + \see Clock.hpp + */ #include "Clock.hpp" /*-----------------------------------*/ diff --git a/src/Clock.hpp b/src/Clock.hpp index adc303d..2b9466c 100644 --- a/src/Clock.hpp +++ b/src/Clock.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,88 +41,88 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Clock.hpp - \brief Clock class (headers) - \author Sebastien Le Digabel - \date 2010-04-02 - \see Clock.cpp -*/ + \file Clock.hpp + \brief Clock class (headers) + \author Sebastien Le Digabel + \date 2010-04-02 + \see Clock.cpp + */ #ifndef __CLOCK__ #define __CLOCK__ #include <ctime> namespace NOMAD { - - /// Clock class. - /** + + /// Clock class. + /** Time measurement.\n\n \b Example: \code Clock c; - + // some instructions here - + std::cout << "elapsed real time = " << c.get_real_time() << std::endl; std::cout << "elapsed CPU time = " << c.get_CPU_time() << std::endl; \endcode - */ - class Clock { - - private: - - time_t _real_t0; ///< Wall clock time measurement. - clock_t _CPU_t0; ///< CPU time measurement. - static const double _D_CLOCKS_PER_SEC; ///< System constant for CPU time measurement. - - public: - - /// Constructor. - Clock ( void ) : _CPU_t0 ( clock() ) { time (&_real_t0); } - - /// Copy constructor. - /** - \param c The copied object -- \b IN. - */ - Clock ( const Clock & c ) : _real_t0 ( c._real_t0 ) , _CPU_t0 ( c._CPU_t0 ) {} - - /// Affectation operator. - /** - \param c The right-hand side object -- \b IN. - \return \c *this as the result of the affectation. - */ - Clock & operator = ( const Clock & c ) - { - _real_t0 = c._real_t0; - _CPU_t0 = c._CPU_t0; - return *this; - } - - /// Destructor. - virtual ~Clock ( void ) {} - - /// Reset the clock. - void reset ( void ) - { - time ( &_real_t0 ); - _CPU_t0 = clock(); - } - - /// Get wall clock time. - /** - \return The wall clock time. - */ - int get_real_time ( void ) const; - - /// Get the CPU time. - /** - \return The CPU time. - */ - double get_CPU_time ( void ) const - { - return ( clock() - _CPU_t0 ) / _D_CLOCKS_PER_SEC; - } - }; + */ + class Clock { + + private: + + time_t _real_t0; ///< Wall clock time measurement. + clock_t _CPU_t0; ///< CPU time measurement. + static const double _D_CLOCKS_PER_SEC; ///< System constant for CPU time measurement. + + public: + + /// Constructor. + Clock ( void ) : _CPU_t0 ( clock() ) { time (&_real_t0); } + + /// Copy constructor. + /** + \param c The copied object -- \b IN. + */ + Clock ( const Clock & c ) : _real_t0 ( c._real_t0 ) , _CPU_t0 ( c._CPU_t0 ) {} + + /// Affectation operator. + /** + \param c The right-hand side object -- \b IN. + \return \c *this as the result of the affectation. + */ + Clock & operator = ( const Clock & c ) + { + _real_t0 = c._real_t0; + _CPU_t0 = c._CPU_t0; + return *this; + } + + /// Destructor. + virtual ~Clock ( void ) {} + + /// Reset the clock. + void reset ( void ) + { + time ( &_real_t0 ); + _CPU_t0 = clock(); + } + + /// Get wall clock time. + /** + \return The wall clock time. + */ + int get_real_time ( void ) const; + + /// Get the CPU time. + /** + \return The CPU time. + */ + double get_CPU_time ( void ) const + { + return ( clock() - _CPU_t0 ) / _D_CLOCKS_PER_SEC; + } + }; } #endif diff --git a/src/Direction.cpp b/src/Direction.cpp index 7eda227..1f6c941 100644 --- a/src/Direction.cpp +++ b/src/Direction.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Direction.cpp - \brief Polling direction (implementation) - \author Sebastien Le Digabel - \date 2010-04-05 - \see Direction.hpp -*/ + \file Direction.cpp + \brief Polling direction (implementation) + \author Sebastien Le Digabel + \date 2010-04-05 + \see Direction.hpp + */ #include "Direction.hpp" /*-----------------------------------*/ @@ -54,15 +61,15 @@ int NOMAD::Direction::_max_cardinality = 0; /* constructor 1 */ /*---------------------------------------------------------*/ NOMAD::Direction::Direction ( void ) - : NOMAD::Point ( ) , - _type ( NOMAD::UNDEFINED_DIRECTION ) , +: NOMAD::Point ( ) , +_type ( NOMAD::UNDEFINED_DIRECTION ) , _index ( -1 ), _dir_group_index (-1) { #ifdef MEMORY_DEBUG - ++NOMAD::Direction::_cardinality; - if ( NOMAD::Direction::_cardinality > NOMAD::Direction::_max_cardinality ) - ++NOMAD::Direction::_max_cardinality; + ++NOMAD::Direction::_cardinality; + if ( NOMAD::Direction::_cardinality > NOMAD::Direction::_max_cardinality ) + ++NOMAD::Direction::_max_cardinality; #endif } @@ -70,18 +77,18 @@ _dir_group_index (-1) /* constructor 2 */ /*---------------------------------------------------------*/ NOMAD::Direction::Direction ( int n , - const NOMAD::Double & v , - NOMAD::direction_type type , - int dir_group_index ) - : NOMAD::Point ( n , v ) , - _type ( type ) , - _index ( -1 ) , - _dir_group_index (dir_group_index) + const NOMAD::Double & v , + NOMAD::direction_type type , + int dir_group_index ) +: NOMAD::Point ( n , v ) , +_type ( type ) , +_index ( -1 ) , +_dir_group_index (dir_group_index) { #ifdef MEMORY_DEBUG - ++NOMAD::Direction::_cardinality; - if ( NOMAD::Direction::_cardinality > NOMAD::Direction::_max_cardinality ) - ++NOMAD::Direction::_max_cardinality; + ++NOMAD::Direction::_cardinality; + if ( NOMAD::Direction::_cardinality > NOMAD::Direction::_max_cardinality ) + ++NOMAD::Direction::_max_cardinality; #endif } @@ -89,34 +96,34 @@ NOMAD::Direction::Direction ( int n , /* constructor 2b */ /*---------------------------------------------------------*/ NOMAD::Direction::Direction ( int n , - const NOMAD::Double & v , - NOMAD::direction_type type ) + const NOMAD::Double & v , + NOMAD::direction_type type ) : NOMAD::Point ( n , v ) , _type ( type ) , _index ( -1 ), _dir_group_index (-1) { #ifdef MEMORY_DEBUG - ++NOMAD::Direction::_cardinality; - if ( NOMAD::Direction::_cardinality > NOMAD::Direction::_max_cardinality ) - ++NOMAD::Direction::_max_cardinality; + ++NOMAD::Direction::_cardinality; + if ( NOMAD::Direction::_cardinality > NOMAD::Direction::_max_cardinality ) + ++NOMAD::Direction::_max_cardinality; #endif } /*---------------------------------------------------------*/ /* constructor 3 */ /*---------------------------------------------------------*/ -NOMAD::Direction::Direction ( const NOMAD::Point & x , - NOMAD::direction_type type ) - : NOMAD::Point ( x ) , - _type ( type ) , +NOMAD::Direction::Direction ( const NOMAD::Point & x , + NOMAD::direction_type type ) +: NOMAD::Point ( x ) , +_type ( type ) , _index ( -1 ), _dir_group_index (-1) { #ifdef MEMORY_DEBUG - ++NOMAD::Direction::_cardinality; - if ( NOMAD::Direction::_cardinality > NOMAD::Direction::_max_cardinality ) - ++NOMAD::Direction::_max_cardinality; + ++NOMAD::Direction::_cardinality; + if ( NOMAD::Direction::_cardinality > NOMAD::Direction::_max_cardinality ) + ++NOMAD::Direction::_max_cardinality; #endif } @@ -124,15 +131,15 @@ _dir_group_index (-1) /* copy constructor */ /*---------------------------------------------------------*/ NOMAD::Direction::Direction ( const Direction & d ) - : NOMAD::Point ( d ) , - _type ( d._type ) , - _index ( d._index ), +: NOMAD::Point ( d ) , +_type ( d._type ) , +_index ( d._index ), _dir_group_index (d._dir_group_index) { #ifdef MEMORY_DEBUG - ++NOMAD::Direction::_cardinality; - if ( NOMAD::Direction::_cardinality > NOMAD::Direction::_max_cardinality ) - ++NOMAD::Direction::_max_cardinality; + ++NOMAD::Direction::_cardinality; + if ( NOMAD::Direction::_cardinality > NOMAD::Direction::_max_cardinality ) + ++NOMAD::Direction::_max_cardinality; #endif } @@ -142,7 +149,7 @@ _dir_group_index (d._dir_group_index) NOMAD::Direction::~Direction ( void ) { #ifdef MEMORY_DEBUG - --NOMAD::Direction::_cardinality; + --NOMAD::Direction::_cardinality; #endif } @@ -151,15 +158,15 @@ NOMAD::Direction::~Direction ( void ) /*---------------------------------------------------------*/ NOMAD::Direction & NOMAD::Direction::operator = ( const NOMAD::Direction & d ) { - if ( this == &d ) + if ( this == &d ) + return *this; + + NOMAD::Point::operator = ( d ); + + _type = d._type; + _index = d._index; + return *this; - - NOMAD::Point::operator = ( d ); - - _type = d._type; - _index = d._index; - - return *this; } /*---------------------------------------------------------*/ @@ -167,9 +174,9 @@ NOMAD::Direction & NOMAD::Direction::operator = ( const NOMAD::Direction & d ) /*---------------------------------------------------------*/ void NOMAD::Direction::clear ( void ) { - NOMAD::Point::clear(); - _type = NOMAD::UNDEFINED_DIRECTION; - _index = -1; + NOMAD::Point::clear(); + _type = NOMAD::UNDEFINED_DIRECTION; + _index = -1; } /*-----------------------------------------------------------*/ @@ -177,22 +184,24 @@ void NOMAD::Direction::clear ( void ) /*-----------------------------------------------------------*/ const NOMAD::Direction NOMAD::Direction::operator - ( void ) const { - return NOMAD::Direction ( this->NOMAD::Point::operator-() , _type ); + return NOMAD::Direction ( this->NOMAD::Point::operator-() , _type ); } + /*---------------------------------------------------------*/ /* display */ /*---------------------------------------------------------*/ void NOMAD::Direction::display ( const NOMAD::Display & out , - const std::string & sep , - int w , - int lim ) const + const std::string & sep , + int w , + int lim ) const { - if ( is_defined() ) { - out << "( "; - NOMAD::Point::display ( out , sep , w , lim ); - out << " ) " << _type; - } - else - out << "undefined"; + if ( is_defined() ) + { + out << "( "; + NOMAD::Point::display ( out , sep , w , lim ); + out << " ) " << _type; + } + else + out << "undefined"; } diff --git a/src/Direction.hpp b/src/Direction.hpp index b6c192e..2a2813e 100644 --- a/src/Direction.hpp +++ b/src/Direction.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,198 +41,204 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Direction.hpp - \brief Polling direction (headers) - \author Sebastien Le Digabel - \date 2010-04-05 - \see Direction.cpp -*/ + \file Direction.hpp + \brief Polling direction (headers) + \author Sebastien Le Digabel + \date 2010-04-05 + \see Direction.cpp + */ #ifndef __DIRECTION__ #define __DIRECTION__ #include "Point.hpp" namespace NOMAD { - - - - /// Class describing a polling direction. - class Direction : public NOMAD::Point { - - private: - + + + + /// Class describing a polling direction. + class Direction : public NOMAD::Point { + + private: + #ifdef MEMORY_DEBUG - static int _cardinality; ///< Number of NOMAD::Direction objects in memory. - static int _max_cardinality; ///< Max number of NOMAD::Direction objects in memory. + static int _cardinality; ///< Number of NOMAD::Direction objects in memory. + static int _max_cardinality; ///< Max number of NOMAD::Direction objects in memory. #endif - - NOMAD::direction_type _type; ///< Type of direction. - mutable int _index; ///< Direction index (used only for display). - int _dir_group_index ; ///< Index a the group of direction - - public: - + + NOMAD::direction_type _type; ///< Type of direction. + mutable int _index; ///< Direction index (used only for display). + int _dir_group_index ; ///< Index a the group of direction + + public: + #ifdef MEMORY_DEBUG - /// Access to the number of NOMAD::Direction objects in memory. - /** - \return The number of NOMAD::Direction objects in memory. - */ - static int get_cardinality ( void ) { return Direction::_cardinality; } - - /// Access to the max number of NOMAD::Direction objects in memory. - /** - \return The max number of NOMAD::Direction objects in memory. - */ - static int get_max_cardinality ( void ) { return Direction::_max_cardinality; } + /// Access to the number of NOMAD::Direction objects in memory. + /** + \return The number of NOMAD::Direction objects in memory. + */ + static int get_cardinality ( void ) { return Direction::_cardinality; } + + /// Access to the max number of NOMAD::Direction objects in memory. + /** + \return The max number of NOMAD::Direction objects in memory. + */ + static int get_max_cardinality ( void ) { return Direction::_max_cardinality; } #endif - - /// Constructor #1. - Direction ( void ); - - /// Constructor #2. - /** - \param n Dimension -- \b IN. - \param v Initial value for all coordinates -- \b IN. - \param type Type of direction -- \b IN. - \param dir_group_index Index of the variable group the direction belongs --\b IN. - */ - Direction ( int n , const NOMAD::Double & v , NOMAD::direction_type type, int dir_group_index ); - - /// Constructor #2b. - /** - \param n Dimension -- \b IN. - \param v Initial value for all coordinates -- \b IN. - \param type Type of direction -- \b IN. - */ - Direction ( int n , const NOMAD::Double & v , NOMAD::direction_type type); - - - /// Constructor #3. - /** - \param x Coordinates -- \b IN. - \param type Type of direction -- \b IN. - */ - Direction ( const NOMAD::Point & x , NOMAD::direction_type type ); - - /// Copy constructor. - /** - \param d The copied object. - */ - Direction ( const Direction & d ); - - /// Destructor. - virtual ~Direction ( void ); - - /// Affectation operator. - /** - \param d The right-hand side object -- \b IN. - \return \c *this as the result of the affectation. - */ - Direction & operator = ( const Direction & d ); - - /// Check if the direction is defined. - /** - \return A boolean equal to \c true if the direction has no defined type. - */ - virtual bool is_defined ( void ) const - { return _type != NOMAD::UNDEFINED_DIRECTION; } - - /// Clear the direction. - virtual void clear ( void ); - - /// Size of the direction in memory. - /** - \return An integer for the size of the direction in bytes. - */ virtual int size_of ( void ) const - { - return NOMAD::Point::size_of() + sizeof(_type) + sizeof(_index); - } - - /// Negation. - /** - The current object \c *this is not modified. - \return A new direction equal to \c -*this. - */ - const Direction operator - ( void ) const; - - /*---------------*/ - /* GET methods */ - /*---------------*/ - - /// Access to the type of direction. - /** - \return The type of the direction. - */ - NOMAD::direction_type get_type ( void ) const { return _type; } + + /// Constructor #1. + Direction ( void ); + + /// Constructor #2. + /** + \param n Dimension -- \b IN. + \param v Initial value for all coordinates -- \b IN. + \param type Type of direction -- \b IN. + \param dir_group_index Index of the variable group the direction belongs --\b IN. + */ + Direction ( int n , + const NOMAD::Double & v , + NOMAD::direction_type type, + int dir_group_index ); + + /// Constructor #2b. + /** + \param n Dimension -- \b IN. + \param v Initial value for all coordinates -- \b IN. + \param type Type of direction -- \b IN. + */ + Direction ( int n , + const NOMAD::Double & v , + NOMAD::direction_type type); + + + /// Constructor #3. + /** + \param x Coordinates -- \b IN. + \param type Type of direction -- \b IN. + */ + Direction ( const NOMAD::Point & x , NOMAD::direction_type type ); + + /// Copy constructor. + /** + \param d The copied object. + */ + Direction ( const Direction & d ); + + /// Destructor. + virtual ~Direction ( void ); + + /// Affectation operator. + /** + \param d The right-hand side object -- \b IN. + \return \c *this as the result of the affectation. + */ + Direction & operator = ( const Direction & d ); + + + /// Check if the direction is defined. + /** + \return A boolean equal to \c true if the direction has no defined type. + */ + virtual bool is_defined ( void ) const + { return _type != NOMAD::UNDEFINED_DIRECTION; } + + /// Clear the direction. + virtual void clear ( void ); + + /// Size of the direction in memory. + /** + \return An integer for the size of the direction in bytes. + */ virtual int size_of ( void ) const + { + return NOMAD::Point::size_of() + sizeof(_type) + sizeof(_index); + } + + /// Negation. + /** + The current object \c *this is not modified. + \return A new direction equal to \c -*this. + */ + const Direction operator - ( void ) const; + + /*---------------*/ + /* GET methods */ + /*---------------*/ + + /// Access to the type of direction. + /** + \return The type of the direction. + */ + NOMAD::direction_type get_type ( void ) const { return _type; } + + /// Access to the direction index. + /** + \return The direction index. + */ + int get_index ( void ) const { return _index; } + + /// Access to the direction group index. + /** + \return The direction group index. + */ + int get_dir_group_index ( void ) const { return _dir_group_index; } + + + /// Check if the direction is a MADS direction. + /** + \return A boolean equal to \c true if the direction is a MADS direction. + */ + bool is_mads ( void ) const { return NOMAD::dir_is_mads ( _type ); } + + /// Check if the direction is a GPS direction. + /** + \return A boolean equal to \c true if the direction is a GPS direction. + */ + bool is_gps ( void ) const { return NOMAD::dir_is_gps ( _type ); } + + /*---------------*/ + /* SET methods */ + /*---------------*/ + + /// Set the direction index. + /** + \param i The direction index -- \b IN. + */ + void set_index ( int i ) const { _index = i; } + + /// Set the direction type. + /** + \param t The direction type -- \b IN. + */ + void set_type ( NOMAD::direction_type t ) { _type = t; } + + /// Display. + /** + \param out The NOMAD::Display object -- \b IN. + \param sep A string that is used as a separator between the coordinates + -- \b IN. + \param w An integer indicating a width for the display of + each coordinate -- \b IN. + \param lim Max number of coordinates to display -- \b IN. + */ + virtual void display ( const NOMAD::Display & out , + const std::string & sep , + int w , + int lim ) const; + }; - /// Access to the direction index. + /// Display a NOMAD::Direction object. /** - \return The direction index. - */ - int get_index ( void ) const { return _index; } - - /// Access to the direction group index. - /** - \return The direction group index. - */ - int get_dir_group_index ( void ) const { return _dir_group_index; } - - - /// Check if the direction is a MADS direction. - /** - \return A boolean equal to \c true if the direction is a MADS direction. - */ - bool is_mads ( void ) const { return NOMAD::dir_is_mads ( _type ); } - - /// Check if the direction is a GPS direction. - /** - \return A boolean equal to \c true if the direction is a GPS direction. - */ - bool is_gps ( void ) const { return NOMAD::dir_is_gps ( _type ); } - - /*---------------*/ - /* SET methods */ - /*---------------*/ - - /// Set the direction index. - /** - \param i The direction index -- \b IN. - */ - void set_index ( int i ) const { _index = i; } - - /// Set the direction type. - /** - \param t The direction type -- \b IN. - */ - void set_type ( NOMAD::direction_type t ) { _type = t; } - - /// Display. - /** - \param out The NOMAD::Display object -- \b IN. - \param sep A string that is used as a separator between the coordinates - -- \b IN. - \param w An integer indicating a width for the display of - each coordinate -- \b IN. - \param lim Max number of coordinates to display -- \b IN. - */ - virtual void display ( const NOMAD::Display & out , - const std::string & sep , - int w , - int lim ) const; - }; - - /// Display a NOMAD::Direction object. - /** \param out The NOMAD::Display object -- \b IN. \param d The NOMAD::Direction object to be displayed -- \b IN. \return The NOMAD::Display object. - */ - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::Direction & d ) - { - d.display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); - return out; - } + */ + inline const NOMAD::Display & operator << ( const NOMAD::Display & out , + const NOMAD::Direction & d ) + { + d.display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); + return out; + } } #endif diff --git a/src/Directions.cpp b/src/Directions.cpp index e52f61f..8c34295 100644 --- a/src/Directions.cpp +++ b/src/Directions.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -46,14 +53,14 @@ #include "SMesh.hpp" + /*---------------------------------------------------------*/ /* constructor */ /*---------------------------------------------------------*/ -NOMAD::Directions::Directions -( int nc , - const std::set<NOMAD::direction_type> & direction_types , - const std::set<NOMAD::direction_type> & sec_poll_dir_types , - const NOMAD::Display & out ) +NOMAD::Directions::Directions ( int nc , + const std::set<NOMAD::direction_type> & direction_types , + const std::set<NOMAD::direction_type> & sec_poll_dir_types , + const NOMAD::Display & out ) : _nc ( nc ) , _direction_types ( direction_types ) , _sec_poll_dir_types ( sec_poll_dir_types ) , @@ -88,7 +95,6 @@ NOMAD::Directions::~Directions ( void ) for ( int i = 0 ; i <= n ; ++i ) delete _bl[i]; } - } /*---------------------------------------------------------*/ @@ -105,6 +111,7 @@ void NOMAD::Directions::lt_mads_init ( void ) _lt_initialized = true; } + /*---------------------------------------------------------*/ /* set_binary */ /*---------------------------------------------------------*/ @@ -115,7 +122,8 @@ void NOMAD::Directions::set_binary ( void ) _is_orthomads = false; _direction_types.clear(); _direction_types.insert ( NOMAD::GPS_BINARY ); - if ( !_sec_poll_dir_types.empty() ) { + if ( !_sec_poll_dir_types.empty() ) + { _sec_poll_dir_types.clear(); _sec_poll_dir_types.insert ( NOMAD::GPS_BINARY ); } @@ -137,12 +145,12 @@ void NOMAD::Directions::set_categorical ( void ) /* compute binary directions when all groups of variables are binary */ /* (private) */ /*----------------------------------------------------------------------*/ -void NOMAD::Directions::compute_binary_directions -( std::list<NOMAD::Direction> & d ) const +void NOMAD::Directions::compute_binary_directions ( std::list<NOMAD::Direction> & d ) const { // _GPS_BINARY_ n directions: NOMAD::Direction * pd; - for ( int i = 0 ; i < _nc ; ++i ) { + for ( int i = 0 ; i < _nc ; ++i ) + { d.push_back ( NOMAD::Direction ( _nc , 0.0 , NOMAD::GPS_BINARY ) ); pd = &(*(--d.end())); (*pd)[i] = 1.0; @@ -153,9 +161,9 @@ void NOMAD::Directions::compute_binary_directions /*----------------------------------------------------------------------------*/ /* get the directions on a unit n-sphere for a given mesh */ /*----------------------------------------------------------------------------*/ -void NOMAD::Directions::compute ( std::list<NOMAD::Direction> & dirs , - NOMAD::poll_type poll , - const NOMAD::OrthogonalMesh & mesh ) +void NOMAD::Directions::compute ( std::list<NOMAD::Direction> & dirs , + NOMAD::poll_type poll , + const NOMAD::OrthogonalMesh & mesh ) { dirs.clear(); @@ -208,6 +216,7 @@ void NOMAD::Directions::compute ( std::list<NOMAD::Direction> & dirs , NOMAD::Direction dir ( _nc , 0.0 , *it ); NOMAD::Double alpha_t_l; + success_dir=compute_dir_on_unit_sphere ( dir ); if ( success_dir ) @@ -243,7 +252,7 @@ void NOMAD::Directions::compute ( std::list<NOMAD::Direction> & dirs , #endif // Ortho-MADS 2n and n+1: // ---------------------- - if ( *it == NOMAD::ORTHO_2N || *it == NOMAD::ORTHO_NP1_QUAD || *it == NOMAD::ORTHO_NP1_NEG ) + if ( *it == NOMAD::ORTHO_2N || *it == NOMAD::ORTHO_NP1_QUAD || *it == NOMAD::ORTHO_NP1_NEG || *it==NOMAD::ORTHO_NP1_UNI ) { // creation of the 2n directions: @@ -262,6 +271,38 @@ void NOMAD::Directions::compute ( std::list<NOMAD::Direction> & dirs , // Householder transformations on the 2n directions on a unit n-sphere: householder ( dir , true , H ); + if ( *it == NOMAD::ORTHO_NP1_UNI ) + { + std::list<NOMAD::Direction> refac_dirs; + + // dir 0 + NOMAD::Point dir0=-(*H[0]); + for ( i = 1 ; i < _nc ; ++i ) + { + dir0=dir0-(*H[i]); + } + dir0*=1.0/sqrt(double(_nc)); + refac_dirs.push_back ( NOMAD::Direction ( dir0, NOMAD::ORTHO_NP1_UNI ) ); + + NOMAD::Double beta=(sqrt(_nc+1.0)-1.0)/sqrt(double(_nc)); + dir0*=beta; + for ( i = 0 ; i < _nc ; i++ ) + { + NOMAD::Point diri(*H[i]); + diri*=sqrt(double(_nc+1)); + diri=diri+dir0; + diri*=1.0/sqrt(double(_nc)); + refac_dirs.push_back ( NOMAD::Direction ( diri, NOMAD::ORTHO_NP1_UNI ) ); + + } + + dirs.clear(); + dirs.assign( refac_dirs.begin(), refac_dirs.end() ); + + + } + + delete [] H; @@ -302,7 +343,9 @@ void NOMAD::Directions::compute ( std::list<NOMAD::Direction> & dirs , // LT-MADS 2n or LT-MADS n+1: // -------------------------- - else { + else + { + // row permutation vector: int * row_permutation_vector = new int [_nc]; @@ -623,10 +666,10 @@ void NOMAD::Directions::compute ( std::list<NOMAD::Direction> & dirs , /*-----------------------------------------------------------------------------*/ -/* compute a random direction on a unit N-Sphere */ +/* compute a random direction on a unit N-Sphere */ /* see http://en.wikipedia.org/wiki/N-sphere */ /*-----------------------------------------------------------------------------*/ -bool NOMAD::Directions::compute_dir_on_unit_sphere ( NOMAD::Direction & random_dir ) const +bool NOMAD::Directions::compute_dir_on_unit_sphere ( NOMAD::Direction & random_dir ) const { int i; @@ -635,6 +678,8 @@ bool NOMAD::Directions::compute_dir_on_unit_sphere ( NOMAD::Direction & random_d for ( i = 0 ; i < _nc ; ++i ) random_dir[i]=NOMAD::RNG::normal_rand(0,1); + // } + norm=random_dir.norm(); if ( norm==0 ) @@ -660,7 +705,8 @@ NOMAD::Double NOMAD::Directions::eval_ortho_norm ( const NOMAD::Double & x { NOMAD::Double fx = 0.0; - for ( int i = 0 ; i < _nc ; ++i ) { + for ( int i = 0 ; i < _nc ; ++i ) + { new_b[i] = ( x * b[i] / norm ).round(); fx += new_b[i]*new_b[i]; } @@ -680,7 +726,8 @@ NOMAD::Double NOMAD::Directions::get_phi ( int t , int p ) int ll = t; NOMAD::Double d = 0.0; - for ( int i = 0 ; i < size ; ++i ) { + for ( int i = 0 ; i < size ; ++i ) + { div = NOMAD::Double ( pow ( p , size-i-1.0 ) ).round(); d += ( ll / div ) * pow ( static_cast<double>(p) , i-size ); ll = ll % div; @@ -702,11 +749,13 @@ void NOMAD::Directions::householder ( const NOMAD::Direction & dir , NOMAD::Double norm2 = dir.squared_norm() , v , h2i; - for ( i = 0 ; i < _nc ; ++i ) { + for ( i = 0 ; i < _nc ; ++i ) + { h2i = 2 * dir[i]; - for ( j = 0 ; j < _nc ; ++j ) { + for ( j = 0 ; j < _nc ; ++j ) + { // H[i]: (*H[i])[j] = v = (i==j) ? norm2 - h2i * dir[j] : - h2i * dir[j]; @@ -727,6 +776,7 @@ const NOMAD::Direction * NOMAD::Directions::get_bl ( const NOMAD::OrthogonalMesh { NOMAD::Point mesh_indices = mesh.get_mesh_indices(); + int mesh_index =static_cast<int>(mesh_indices[0].value()); NOMAD::Direction * bl = _bl [ mesh_index + NOMAD::L_LIMITS ]; hat_i = _hat_i [ mesh_index + NOMAD::L_LIMITS ]; @@ -858,7 +908,8 @@ bool NOMAD::Directions::operator < ( const NOMAD::Directions & d ) const it2 = d._direction_types.begin() , end = _direction_types.end(); - while ( it1 != end ) { + while ( it1 != end ) + { if ( *it1 < *it2 ) return true; if ( *it2 < *it1 ) @@ -871,7 +922,8 @@ bool NOMAD::Directions::operator < ( const NOMAD::Directions & d ) const it2 = d._sec_poll_dir_types.begin(); end = _sec_poll_dir_types.end(); - while ( it1 != end ) { + while ( it1 != end ) + { if ( *it1 < *it2 ) return true; if ( *it2 < *it1 ) diff --git a/src/Directions.hpp b/src/Directions.hpp index a9d87c8..2651974 100644 --- a/src/Directions.hpp +++ b/src/Directions.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -84,6 +91,7 @@ namespace NOMAD { */ Directions & operator = ( const Directions & d ); + /// LT-MADS initializations. void lt_mads_init ( void ); @@ -198,20 +206,20 @@ namespace NOMAD { /// Compute the directions for a given mesh. /** - \param mesh The given mesh -- \b IN. - \param dirs Set of directions -- \b OUT. - \param poll Type of poll (primary or secondary) -- \b IN. + \param mesh The given mesh -- \b IN. + \param dirs Set of directions -- \b OUT. + \param poll Type of poll (primary or secondary) -- \b IN. */ void compute ( std::list<NOMAD::Direction> & dirs , NOMAD::poll_type poll , - const NOMAD::OrthogonalMesh & mesh ); + const NOMAD::OrthogonalMesh & mesh ); /// Compute a random direction on a N-Sphere. /** - \param random_dir -- \b OUT. + \param random_dir -- \b OUT. \return A boolean equal to \c true if the computation went well. */ - bool compute_dir_on_unit_sphere ( NOMAD::Direction & random_dir ) const; + bool compute_dir_on_unit_sphere ( NOMAD::Direction & random_dir ) const; /// Check if Ortho-MADS directions are used. @@ -287,7 +295,7 @@ namespace NOMAD { /// Display a NOMAD::Directions object. /** - \param out The NOMAD::Display object -- \b IN. + \param out The NOMAD::Display object -- \b IN. \param d The NOMAD::Directions object to be displayed -- \b IN. \return The NOMAD::Display object. */ diff --git a/src/Display.cpp b/src/Display.cpp index e8b340f..4cb4631 100644 --- a/src/Display.cpp +++ b/src/Display.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -406,7 +413,8 @@ std::ostream & NOMAD::operator << ( std::ostream & ou /*-----------------------------------------------------------------*/ std::ostream & NOMAD::operator << ( std::ostream & out , NOMAD::bb_input_type bi ) { - switch ( bi ) { + switch ( bi ) + { case NOMAD::CONTINUOUS: out << "cont(R)"; break; @@ -484,34 +492,12 @@ std::ostream & NOMAD::operator << ( std::ostream & out , NOMAD::model_type mt ) case NOMAD::QUADRATIC_MODEL: out << "quadratic"; break; - case NOMAD::TGP_MODEL: - out << "TGP"; - break; case NOMAD::NO_MODEL: out << "no models"; } return out; } -/*-----------------------------------------------------------------*/ -/* to display a TGP mode */ -/*-----------------------------------------------------------------*/ -std::ostream & NOMAD::operator << ( std::ostream & out , NOMAD::TGP_mode_type m ) -{ - switch ( m ) - { - case NOMAD::TGP_FAST: - out << "fast"; - break; - case NOMAD::TGP_PRECISE: - out << "precise"; - break; - case NOMAD::TGP_USER: - out << "user"; - break; - } - return out; -} /*-----------------------------------------------------------------*/ /* to display an evaluation type */ @@ -581,6 +567,9 @@ std::ostream & NOMAD::operator << ( std::ostream & out , NOMAD::stop_type st ) case NOMAD::XL_LIMITS_REACHED: out << "mesh index limits"; break; + case NOMAD::GL_LIMITS_REACHED: + out << "mesh index limits"; + break; case NOMAD::MAX_TIME_REACHED: out << "max time"; break; @@ -786,6 +775,9 @@ std::ostream & NOMAD::operator << ( std::ostream & out , case NOMAD::ORTHO_NP1_NEG: out << "Ortho-MADS n+1 NEG"; break; + case NOMAD::ORTHO_NP1_UNI: + out << "Ortho-MADS n+1 UNI"; + break; case NOMAD::DYN_ADDED: out << "Dynamic n+1th direction"; break; diff --git a/src/Display.hpp b/src/Display.hpp index e88323b..59ce2c2 100644 --- a/src/Display.hpp +++ b/src/Display.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,48 +41,48 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Display.hpp - \brief Custom class for display (headers) - \author Sebastien Le Digabel - \date 2010-03-30 - \see Display.cpp -*/ + \file Display.hpp + \brief Custom class for display (headers) + \author Sebastien Le Digabel + \date 2010-03-30 + \see Display.cpp + */ #ifndef __DISPLAY__ #define __DISPLAY__ #include "utils.hpp" namespace NOMAD { - - /// Custom display class. - /** + + /// Custom display class. + /** - This class is used instead of \c std::ostream ojects. - Use \c std::endl as new line character; \c '\\n' will ignore indentation. - Do not use \c << \c flush; : it would create a new indentation. - Use method \c Display::flush() instead. + Use method \c Display::flush() instead. \b Two \b examples \b for \b creating \b indented \b blocks: - + \code using namespace NOMAD; Display out ( std::cout ); \endcode \b Example \b 1: - + \code out << "line #1" << std::endl - << open_block() - << "line #2" << std::endl << "line #3" << std::endl - << open_block ( "begin of block 2" ) - << "line #4" << std::endl << "line #5" << std::endl - << close_block ( "end of block 2" ) - << close_block() - << std::endl; + << open_block() + << "line #2" << std::endl << "line #3" << std::endl + << open_block ( "begin of block 2" ) + << "line #4" << std::endl << "line #5" << std::endl + << close_block ( "end of block 2" ) + << close_block() + << std::endl; \endcode - + \b Example \b 2: - + \code out << "line #1" << std::endl; out.open_block(); @@ -86,456 +93,456 @@ namespace NOMAD { out.close_block(); out << std::endl; \endcode - + \b This \b displays \b twice: - + \verbatim line #1 { - line #2 - line #3 - begin of block 2 { - line #4 - line #5 - } end of block 2 + line #2 + line #3 + begin of block 2 { + line #4 + line #5 + } end of block 2 } \endverbatim - */ - class Display { - - private: - - std::ostream & _out; ///< Display. - - mutable std::string _indent_str; ///< Indentation string (tabulations). - mutable bool _newline; ///< Indent or not. + */ + class Display { + + private: + + std::ostream & _out; ///< Display. + + mutable std::string _indent_str; ///< Indentation string (tabulations). + mutable bool _newline; ///< Indent or not. + + std::string _open_brace; ///< Braces of the indentation blocks. + std::string _closed_brace; ///< Defaults: "{" and "}". + + NOMAD::dd_type _gen_dd; ///< General display degree. + NOMAD::dd_type _search_dd; ///< Search display degree. + NOMAD::dd_type _poll_dd; ///< Poll display degree. + NOMAD::dd_type _iter_dd; ///< Iterative display degree. + + /// Private affectation operator. + /** + \param out The right-hand side object -- \b IN. + */ + const Display & operator = ( const Display & out ); + + public: + + /// Constructor. + /** + \param out A \c std::ostream that will be used for all displays + (can be a \c std::ofstream) + -- \b IN -- \b optional (default = \c std::cout). + */ + Display ( std::ostream & out = std::cout ) + : _out ( out ) , // can be a std::ofstream + _newline ( true ) , + _open_brace ( "{" ) , + _closed_brace ( "}" ) , + _gen_dd ( NOMAD::NORMAL_DISPLAY ) , + _search_dd ( NOMAD::NORMAL_DISPLAY ) , + _poll_dd ( NOMAD::NORMAL_DISPLAY ) , + _iter_dd ( NOMAD::NORMAL_DISPLAY ) {} + + /// Copy constructor. + /** + \param out The copied object -- \b IN. + */ + Display ( const Display & out ) + : _out ( out._out ) , + _indent_str ( out._indent_str ) , + _newline ( out._newline ) , + _open_brace ( out._open_brace ) , + _closed_brace ( out._closed_brace ) , + _gen_dd ( out._gen_dd ) , + _search_dd ( out._search_dd ) , + _poll_dd ( out._poll_dd ) , + _iter_dd ( out._iter_dd ) {} + + /// Destructor. + virtual ~Display ( void ) {} + + /// Flush. + /** + Must be used instead of \c out \c << \c std::flush. + */ + void flush ( void ) const { _out << std::flush; } + + /*---------------*/ + /* GET methods */ + /*---------------*/ + + /// Access to the indentation string. + /** + \return The indentation string. + */ + const std::string get_indent_str ( void ) const { return _indent_str; } + + /// Access to the general display degree. + /** + \return _gen_dd. + */ + NOMAD::dd_type get_gen_dd ( void ) const { return _gen_dd; } + + /// Access to the search display degree. + /** + \return _search_dd. + */ + NOMAD::dd_type get_search_dd ( void ) const { return _search_dd; } + + /// Access to the poll display degree. + /** + \return _poll_dd. + */ + NOMAD::dd_type get_poll_dd ( void ) const { return _poll_dd; } + + /// Access to the iterative display degree. + /** + \return _iter_dd. + */ + NOMAD::dd_type get_iter_dd ( void ) const { return _iter_dd; } + + /// Get the display degree for a specific search type. + /** + \param search The search type. + \return The display degree. + */ + NOMAD::dd_type get_display_degree ( NOMAD::search_type search ) const; + + /// Get the display degrees as a string of size 4. + /** + \param dd The string containing the display degrees -- \b OUT. + */ + void get_display_degree ( std::string & dd ) const; + + /*---------------*/ + /* SET methods */ + /*---------------*/ + + /// Set the indentation string. + /** + \param is The indentation string -- \b IN. + */ + void set_indent_str ( const std::string & is ) { _indent_str = is; } + + /// Set the _open_brace string. + /** + \param ob The string -- \b IN. + */ + void set_open_brace ( const std::string & ob ) { _open_brace = ob; } + + /// Set the _closed_brace string. + /** + \param cb The string -- \b IN. + */ + void set_closed_brace ( const std::string & cb ) { _closed_brace = cb; } + + /// Set the display degrees. + /** + \param gen_dd General display degree -- \b IN. + \param search_dd Search display degree -- \b IN. + \param poll_dd Poll display degree -- \b IN. + \param iter_dd Iterative display degree -- \b IN. + */ + void set_degrees ( NOMAD::dd_type gen_dd , + NOMAD::dd_type search_dd , + NOMAD::dd_type poll_dd , + NOMAD::dd_type iter_dd ); + + /// Set all the display degrees to one given display degree. + /** + \param dd The 4 display degrees -- \b IN. + */ + void set_degrees ( NOMAD::dd_type dd ) { set_degrees ( dd , dd , dd , dd ); } + + /// Open an indentation block. + /** + \param msg Message displayed as the block title + -- \b IN -- \b optional (default = empty string). + */ + void open_block ( const std::string & msg = "" ) const; + + /// Close an indentation block. + /** + \param msg Message displayed at the end of the block + -- \b IN -- \b optional (default = empty string). + */ + void close_block ( const std::string & msg = "" ) const; + + /// Operator <<. + template <class T> + const Display & operator << ( const T & ) const; + + /// Defines the \c cout type. + typedef std::basic_ostream<char, std::char_traits<char> > CoutType; + + /// Allows the use of \c out \c << \c endl (\c std::endl is used). + /** + \warning This considers also \c std::flush. + */ + typedef CoutType& (*StandardEndLine)(CoutType&); + + /// Operator << for \c std::endl. + const Display & operator << ( StandardEndLine ) const; + + /// Set the display precision. + /** + \param p The display precision -- \b IN. + */ + void precision ( int p ) const { _out.precision(p); } + + /// Get the current display precision. + /** + \return An integer for the current precision. + */ + int precision ( void ) const { return static_cast<int>(_out.precision()); } + + /// Set the format flags (1/2). + /** + \param f The flags -- \b IN. + */ + void flags ( std::ios_base::fmtflags f ) const { _out.flags(f); } + + /// Set the format flags (2/2). + /** + \param f The flags -- \b IN. + */ + void setf ( std::ios_base::fmtflags f ) const { _out.setf(f); } + + /// Unset the format flags. + /** + \param f The flags -- \b IN. + */ + void unsetf ( std::ios_base::fmtflags f ) const { _out.unsetf(f); } + + + /// Get the current format flags. + /** + \return The format flags. + */ + std::ios_base::fmtflags flags ( void ) const { return _out.flags(); } + + /*--------------------*/ + /* type conversions */ + /*--------------------*/ + + /// Convert a NOMAD::dd_type to a character. + /** + \param dd The NOMAD::dd_type -- \b IN. + \return The character. + */ + static char dd_to_char ( NOMAD::dd_type dd ); + + /// Convert a NOMAD::dd_type to an integer. + /** + \param dd The NOMAD::dd_type -- \b IN. + \return The integer. + */ + static int dd_to_int ( NOMAD::dd_type dd ); + + /// Convert an integer to a NOMAD::dd_type. + /** + \param dd The integer -- \b IN. + \return The NOMAD::dd_type. + */ + static NOMAD::dd_type int_to_dd ( int dd ); + + /// Display a duration with a smart format. + /** + \param t Duration as an integer in seconds -- \b IN. + */ + void display_time ( int t ) const; + + /// Display a boolean with format \c yes/no. + /** + \param b The boolean -- \b IN. + */ + void display_yes_or_no ( bool b ) const { (*this) << ( (b) ? "yes" : "no" ); } + + /// Display a memory size. + /** + \param size The memory size. + */ + void display_size_of ( float size ) const; + + /// Display an integer with a specific width. + /** + \param i The integer to display -- \b IN. + \param max_i Maximal value of \c i used to determine the display width + -- \b IN -- \b optional (default = \c -1). + */ + void display_int_w ( int i , int max_i = -1 ) const; + + /// Get the keyword associated with a NOMAD::display_stats_type. + /** + \param dst The NOMAD::display_stats_type -- \b IN. + \return A string containing the keyword. + */ + static std::string get_display_stats_keyword ( NOMAD::display_stats_type dst ); + + /// Extract display format from a string. + /** + \param s The string -- \b IN/OUT. + \param format The format -- \b OUT. + */ + static void extract_display_format ( std::string & s , std::string & format ); + + /// Get the NOMAD::display_stats_type from a string. + /** + \param s The string -- \b IN. + \return The NOMAD::display_stats_type. + */ + static NOMAD::display_stats_type get_display_stats_type ( const std::string & s ); + + }; - std::string _open_brace; ///< Braces of the indentation blocks. - std::string _closed_brace; ///< Defaults: "{" and "}". - - NOMAD::dd_type _gen_dd; ///< General display degree. - NOMAD::dd_type _search_dd; ///< Search display degree. - NOMAD::dd_type _poll_dd; ///< Poll display degree. - NOMAD::dd_type _iter_dd; ///< Iterative display degree. - - /// Private affectation operator. - /** - \param out The right-hand side object -- \b IN. - */ - const Display & operator = ( const Display & out ); - - public: + /*-------------------------------------------------------------------------*/ - /// Constructor. + /// Open an indented block. /** - \param out A \c std::ostream that will be used for all displays - (can be a \c std::ofstream) - -- \b IN -- \b optional (default = \c std::cout). + Allows the use of \c out \c << \c open_block(msg). */ - Display ( std::ostream & out = std::cout ) - : _out ( out ) , // can be a std::ofstream - _newline ( true ) , - _open_brace ( "{" ) , - _closed_brace ( "}" ) , - _gen_dd ( NOMAD::NORMAL_DISPLAY ) , - _search_dd ( NOMAD::NORMAL_DISPLAY ) , - _poll_dd ( NOMAD::NORMAL_DISPLAY ) , - _iter_dd ( NOMAD::NORMAL_DISPLAY ) {} - - /// Copy constructor. - /** - \param out The copied object -- \b IN. - */ - Display ( const Display & out ) - : _out ( out._out ) , - _indent_str ( out._indent_str ) , - _newline ( out._newline ) , - _open_brace ( out._open_brace ) , - _closed_brace ( out._closed_brace ) , - _gen_dd ( out._gen_dd ) , - _search_dd ( out._search_dd ) , - _poll_dd ( out._poll_dd ) , - _iter_dd ( out._iter_dd ) {} - - /// Destructor. - virtual ~Display ( void ) {} - - /// Flush. - /** - Must be used instead of \c out \c << \c std::flush. - */ - void flush ( void ) const { _out << std::flush; } - - /*---------------*/ - /* GET methods */ - /*---------------*/ - - /// Access to the indentation string. - /** - \return The indentation string. - */ - const std::string get_indent_str ( void ) const { return _indent_str; } - - /// Access to the general display degree. - /** - \return _gen_dd. - */ - NOMAD::dd_type get_gen_dd ( void ) const { return _gen_dd; } - - /// Access to the search display degree. - /** - \return _search_dd. - */ - NOMAD::dd_type get_search_dd ( void ) const { return _search_dd; } - - /// Access to the poll display degree. - /** - \return _poll_dd. - */ - NOMAD::dd_type get_poll_dd ( void ) const { return _poll_dd; } - - /// Access to the iterative display degree. - /** - \return _iter_dd. - */ - NOMAD::dd_type get_iter_dd ( void ) const { return _iter_dd; } - - /// Get the display degree for a specific search type. - /** - \param search The search type. - \return The display degree. - */ - NOMAD::dd_type get_display_degree ( NOMAD::search_type search ) const; - - /// Get the display degrees as a string of size 4. - /** - \param dd The string containing the display degrees -- \b OUT. - */ - void get_display_degree ( std::string & dd ) const; - - /*---------------*/ - /* SET methods */ - /*---------------*/ - - /// Set the indentation string. - /** - \param is The indentation string -- \b IN. - */ - void set_indent_str ( const std::string & is ) { _indent_str = is; } - - /// Set the _open_brace string. - /** - \param ob The string -- \b IN. - */ - void set_open_brace ( const std::string & ob ) { _open_brace = ob; } - - /// Set the _closed_brace string. - /** - \param cb The string -- \b IN. - */ - void set_closed_brace ( const std::string & cb ) { _closed_brace = cb; } - - /// Set the display degrees. - /** - \param gen_dd General display degree -- \b IN. - \param search_dd Search display degree -- \b IN. - \param poll_dd Poll display degree -- \b IN. - \param iter_dd Iterative display degree -- \b IN. - */ - void set_degrees ( NOMAD::dd_type gen_dd , - NOMAD::dd_type search_dd , - NOMAD::dd_type poll_dd , - NOMAD::dd_type iter_dd ); - - /// Set all the display degrees to one given display degree. - /** - \param dd The 4 display degrees -- \b IN. - */ - void set_degrees ( NOMAD::dd_type dd ) { set_degrees ( dd , dd , dd , dd ); } - - /// Open an indentation block. - /** - \param msg Message displayed as the block title - -- \b IN -- \b optional (default = empty string). - */ - void open_block ( const std::string & msg = "" ) const; + class open_block { + private: + std::string _msg; ///< Message displayed as a block title. + public: + + /// Constructor. + /** + Open an indented block. + \param msg The block title + -- \b IN -- \b optional (default = empty string). + */ + open_block ( const std::string & msg = "" ) : _msg ( msg ) {} + + /// Operator (). + const Display & operator() ( const Display & out ) const + { + out.open_block ( _msg ); + return out; + } + }; - /// Close an indentation block. + /*-------------------------------------------------------------------------*/ + + /// Close an indented block. /** - \param msg Message displayed at the end of the block - -- \b IN -- \b optional (default = empty string). - */ - void close_block ( const std::string & msg = "" ) const; - + Allows the use of \c out \c << \c close_block(msg). + */ + class close_block { + private: + std::string _msg; ///< Message displayed at the end of a block. + public: + + /// Constructor. + /** + Close an indented block. + \param msg Message displayed at the end of a block + -- \b IN -- \b optional (default = empty string). + */ + close_block ( const std::string & msg = "" ) : _msg ( msg ) {} + + /// Operator (). + const Display & operator() ( const Display & out ) const + { + out.close_block ( _msg ); + return out; + } + }; + + /*-------------------------------------------------------------*/ + /* display functions for enum types defined in 'defines.hpp' */ + /*-------------------------------------------------------------*/ + + /// Operator << for NOMAD::stop_type. + std::ostream & operator << ( std::ostream & , NOMAD::stop_type ); + + /// Operator << for NOMAD::dd_type. + std::ostream & operator << ( std::ostream & , NOMAD::dd_type ); + + /// Operator << for NOMAD::success_type. + std::ostream & operator << ( std::ostream & , NOMAD::success_type ); + + /// Operator << for NOMAD::bb_input_type. + std::ostream & operator << ( std::ostream & , NOMAD::bb_input_type ); + + /// Operator << for NOMAD::bb_output_type. + std::ostream & operator << ( std::ostream & , NOMAD::bb_output_type ); + + /// Operator << for NOMAD::interpolation_type. + std::ostream & operator << ( std::ostream & , NOMAD::interpolation_type ); + + /// Operator << for NOMAD::hnorm_type. + std::ostream & operator << ( std::ostream & , NOMAD::hnorm_type ); + + /// Operator << for NOMAD::search_type. + std::ostream & operator << ( std::ostream & , NOMAD::search_type ); + + /// Operator << for NOMAD::model_type. + std::ostream & operator << ( std::ostream & , NOMAD::model_type ); + + /// Operator << for NOMAD::direction_type. + std::ostream & operator << ( std::ostream & , NOMAD::direction_type ); + + /// Operator << for NOMAD::check_failed_type. + std::ostream & operator << ( std::ostream & , NOMAD::check_failed_type ); + + /// Operator << for NOMAD::display_stats_type. + std::ostream & operator << ( std::ostream & , NOMAD::display_stats_type ); + + /// Operator << for NOMAD::eval_type. + std::ostream & operator << ( std::ostream & , NOMAD::eval_type ); + + /// Operator << for NOMAD::eval_status_type. + std::ostream & operator << ( std::ostream & , NOMAD::eval_status_type ); + + /// Operator << for NOMAD::multi_formulation_type. + std::ostream & operator << ( std::ostream & , NOMAD::multi_formulation_type ); + + /// Operator << for a vector of NOMAD::bb_intput_type. + std::ostream & operator << ( std::ostream & , + const std::vector<NOMAD::bb_input_type> & ); + /// Operator <<. template <class T> - const Display & operator << ( const T & ) const; - - /// Defines the \c cout type. - typedef std::basic_ostream<char, std::char_traits<char> > CoutType; - - /// Allows the use of \c out \c << \c endl (\c std::endl is used). - /** - \warning This considers also \c std::flush. - */ - typedef CoutType& (*StandardEndLine)(CoutType&); - - /// Operator << for \c std::endl. - const Display & operator << ( StandardEndLine ) const; - - /// Set the display precision. - /** - \param p The display precision -- \b IN. - */ - void precision ( int p ) const { _out.precision(p); } - - /// Get the current display precision. - /** - \return An integer for the current precision. - */ - int precision ( void ) const { return static_cast<int>(_out.precision()); } - - /// Set the format flags (1/2). - /** - \param f The flags -- \b IN. - */ - void flags ( std::ios_base::fmtflags f ) const { _out.flags(f); } - - /// Set the format flags (2/2). - /** - \param f The flags -- \b IN. - */ - void setf ( std::ios_base::fmtflags f ) const { _out.setf(f); } - - /// Unset the format flags. - /** - \param f The flags -- \b IN. - */ - void unsetf ( std::ios_base::fmtflags f ) const { _out.unsetf(f); } - - - /// Get the current format flags. - /** - \return The format flags. - */ - std::ios_base::fmtflags flags ( void ) const { return _out.flags(); } + inline const NOMAD::Display & NOMAD::Display::operator << ( const T & t ) const + { + if ( _newline ) + { + _out << _indent_str; + _newline = false; + } + _out << t; + return *this; + } - /*--------------------*/ - /* type conversions */ - /*--------------------*/ - - /// Convert a NOMAD::dd_type to a character. - /** - \param dd The NOMAD::dd_type -- \b IN. - \return The character. - */ - static char dd_to_char ( NOMAD::dd_type dd ); - - /// Convert a NOMAD::dd_type to an integer. - /** - \param dd The NOMAD::dd_type -- \b IN. - \return The integer. - */ - static int dd_to_int ( NOMAD::dd_type dd ); - - /// Convert an integer to a NOMAD::dd_type. - /** - \param dd The integer -- \b IN. - \return The NOMAD::dd_type. - */ - static NOMAD::dd_type int_to_dd ( int dd ); - - /// Display a duration with a smart format. - /** - \param t Duration as an integer in seconds -- \b IN. - */ - void display_time ( int t ) const; - - /// Display a boolean with format \c yes/no. - /** - \param b The boolean -- \b IN. - */ - void display_yes_or_no ( bool b ) const { (*this) << ( (b) ? "yes" : "no" ); } - - /// Display a memory size. - /** - \param size The memory size. - */ - void display_size_of ( float size ) const; - - /// Display an integer with a specific width. - /** - \param i The integer to display -- \b IN. - \param max_i Maximal value of \c i used to determine the display width - -- \b IN -- \b optional (default = \c -1). - */ - void display_int_w ( int i , int max_i = -1 ) const; - - /// Get the keyword associated with a NOMAD::display_stats_type. - /** - \param dst The NOMAD::display_stats_type -- \b IN. - \return A string containing the keyword. - */ - static std::string get_display_stats_keyword ( NOMAD::display_stats_type dst ); - - /// Extract display format from a string. - /** - \param s The string -- \b IN/OUT. - \param format The format -- \b OUT. - */ - static void extract_display_format ( std::string & s , std::string & format ); - - /// Get the NOMAD::display_stats_type from a string. - /** - \param s The string -- \b IN. - \return The NOMAD::display_stats_type. - */ - static NOMAD::display_stats_type get_display_stats_type ( const std::string & s ); - - }; - - /*-------------------------------------------------------------------------*/ - - /// Open an indented block. - /** - Allows the use of \c out \c << \c open_block(msg). - */ - class open_block { - private: - std::string _msg; ///< Message displayed as a block title. - public: - - /// Constructor. - /** - Open an indented block. - \param msg The block title - -- \b IN -- \b optional (default = empty string). - */ - open_block ( const std::string & msg = "" ) : _msg ( msg ) {} - - /// Operator (). - const Display & operator() ( const Display & out ) const { - out.open_block ( _msg ); - return out; + /// Allows the use of \c out \c << \c endl. + inline const NOMAD::Display & NOMAD::Display::operator << ( StandardEndLine m ) const + { + m ( _out ); // this could be a std::flush, so don't use it: instead use method flush() + _newline = true; + return *this; } - }; - - /*-------------------------------------------------------------------------*/ - - /// Close an indented block. - /** - Allows the use of \c out \c << \c close_block(msg). - */ - class close_block { - private: - std::string _msg; ///< Message displayed at the end of a block. - public: - - /// Constructor. - /** - Close an indented block. - \param msg Message displayed at the end of a block - -- \b IN -- \b optional (default = empty string). - */ - close_block ( const std::string & msg = "" ) : _msg ( msg ) {} - - /// Operator (). - const Display & operator() ( const Display & out ) const { - out.close_block ( _msg ); - return out; + + /// Allows the use of \c out \c << \c open_block(msg). + inline const NOMAD::Display & operator << ( const NOMAD::Display & out , + const NOMAD::open_block & ob ) + { + return ob ( out ); } - }; - - /*-------------------------------------------------------------*/ - /* display functions for enum types defined in 'defines.hpp' */ - /*-------------------------------------------------------------*/ - - /// Operator << for NOMAD::stop_type. - std::ostream & operator << ( std::ostream & , NOMAD::stop_type ); - - /// Operator << for NOMAD::dd_type. - std::ostream & operator << ( std::ostream & , NOMAD::dd_type ); - - /// Operator << for NOMAD::success_type. - std::ostream & operator << ( std::ostream & , NOMAD::success_type ); - - /// Operator << for NOMAD::bb_input_type. - std::ostream & operator << ( std::ostream & , NOMAD::bb_input_type ); - - /// Operator << for NOMAD::bb_output_type. - std::ostream & operator << ( std::ostream & , NOMAD::bb_output_type ); - - /// Operator << for NOMAD::interpolation_type. - std::ostream & operator << ( std::ostream & , NOMAD::interpolation_type ); - - /// Operator << for NOMAD::hnorm_type. - std::ostream & operator << ( std::ostream & , NOMAD::hnorm_type ); - - /// Operator << for NOMAD::search_type. - std::ostream & operator << ( std::ostream & , NOMAD::search_type ); - - /// Operator << for NOMAD::model_type. - std::ostream & operator << ( std::ostream & , NOMAD::model_type ); - - /// Operator << for NOMAD::TGP_mode_type. - std::ostream & operator << ( std::ostream & , NOMAD::TGP_mode_type ); - - /// Operator << for NOMAD::direction_type. - std::ostream & operator << ( std::ostream & , NOMAD::direction_type ); - - /// Operator << for NOMAD::check_failed_type. - std::ostream & operator << ( std::ostream & , NOMAD::check_failed_type ); - - /// Operator << for NOMAD::display_stats_type. - std::ostream & operator << ( std::ostream & , NOMAD::display_stats_type ); - - /// Operator << for NOMAD::eval_type. - std::ostream & operator << ( std::ostream & , NOMAD::eval_type ); - - /// Operator << for NOMAD::eval_status_type. - std::ostream & operator << ( std::ostream & , NOMAD::eval_status_type ); - - /// Operator << for NOMAD::multi_formulation_type. - std::ostream & operator << ( std::ostream & , NOMAD::multi_formulation_type ); - - /// Operator << for a vector of NOMAD::bb_intput_type. - std::ostream & operator << ( std::ostream & , - const std::vector<NOMAD::bb_input_type> & ); - - /// Operator <<. - template <class T> - inline const NOMAD::Display & NOMAD::Display::operator << ( const T & t ) const - { - if ( _newline ) { - _out << _indent_str; - _newline = false; + + /// Allows the use of \c out \c << \c close_block(msg). + inline const NOMAD::Display & operator << ( const NOMAD::Display & out , + const NOMAD::close_block & cb ) + { + return cb ( out ); } - _out << t; - return *this; - } - - /// Allows the use of \c out \c << \c endl. - inline const NOMAD::Display & NOMAD::Display::operator << ( StandardEndLine m ) const - { - m ( _out ); // this could be a std::flush, so don't use it: instead use method flush() - _newline = true; - return *this; - } - - /// Allows the use of \c out \c << \c open_block(msg). - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::open_block & ob ) - { - return ob ( out ); - } - - /// Allows the use of \c out \c << \c close_block(msg). - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::close_block & cb ) - { - return cb ( out ); - } - + } #endif diff --git a/src/Double.cpp b/src/Double.cpp index 8a7c067..28b1f3c 100644 --- a/src/Double.cpp +++ b/src/Double.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -150,7 +157,8 @@ bool NOMAD::Double::atof ( const std::string & ss ) std::string s = ss; NOMAD::toupper(s); - if ( s == "-" || ss == NOMAD::Double::_undef_str ) { + if ( s == "-" || ss == NOMAD::Double::_undef_str ) + { _value = 0.0; _defined = false; return true; @@ -158,13 +166,15 @@ bool NOMAD::Double::atof ( const std::string & ss ) if ( s == "INF" || s == "+INF" || ss == NOMAD::Double::_inf_str || - ss == ("+" + NOMAD::Double::_inf_str) ) { + ss == ("+" + NOMAD::Double::_inf_str) ) + { _value = NOMAD::INF; _defined = true; return true; } - if ( s == "-INF" || ss == ("-" + NOMAD::Double::_inf_str) ) { + if ( s == "-INF" || ss == ("-" + NOMAD::Double::_inf_str) ) + { _value = -NOMAD::INF; _defined = true; return true; @@ -178,8 +188,10 @@ bool NOMAD::Double::atof ( const std::string & ss ) size_t n = s.size(); for ( size_t k = 1 ; k < n ; ++k ) - if ( !isdigit(s[k]) && s[k] != '.' ) { - if ( s[k] == 'E' ) { + if ( !isdigit(s[k]) && s[k] != '.' ) + { + if ( s[k] == 'E' ) + { if ( s.size() == k+1 ) return false; ++k; @@ -200,7 +212,8 @@ bool NOMAD::Double::atof ( const std::string & ss ) /*-------------------------------------------------*/ bool NOMAD::Double::relative_atof ( const std::string & s , bool & relative ) { - if ( std::toupper(s[0]) == 'R' ) { + if ( std::toupper(s[0]) == 'R' ) + { relative = true; std::string ss = s; ss.erase(ss.begin()); @@ -368,7 +381,8 @@ NOMAD::Double & NOMAD::Double::operator = ( double r ) /*------------------------------------------*/ void NOMAD::Double::display ( const NOMAD::Display & out ) const { - if ( _defined ) { + if ( _defined ) + { if ( _value == NOMAD::INF ) out << NOMAD::Double::_inf_str; else if ( _value == -NOMAD::INF ) @@ -484,18 +498,22 @@ void NOMAD::Double::display ( const NOMAD::Display & out , out.precision ( prec ); if ( c == 'f' ) + { out.setf ( std::ios::fixed ); - + out << _value; + } else if ( c == 'e' ) { out.unsetf ( std::ios::fixed ); out.setf ( std::ios::scientific ); + out << _value; } else if ( c == 'E' ) { out.unsetf ( std::ios::fixed ); out.setf ( std::ios::scientific | std::ios::uppercase ); + out << _value; } else if ( c == 'g' ) @@ -509,10 +527,11 @@ void NOMAD::Double::display ( const NOMAD::Display & out , streamS.setf( std::ios::scientific); streamS << _value; streamF << _value; - if (streamS.str().length() < streamF.str().length()) - out.setf(std::ios::scientific); + + if ( streamS.str().length() < streamF.str().length() ) + out << streamS.str(); else - out.setf(std::ios::fixed); + out << streamF.str(); } @@ -522,19 +541,17 @@ void NOMAD::Double::display ( const NOMAD::Display & out , streamS.precision ( prec ); streamF.precision ( prec ); streamF.unsetf(std::ios::scientific); - streamF.setf( std::ios::fixed ); + streamF.setf( std::ios::fixed | std::ios::uppercase ); streamS.unsetf(std::ios::fixed); - streamS.setf( std::ios::scientific); + streamS.setf( std::ios::scientific | std::ios::uppercase ); streamS << _value ; streamF << _value ; if (streamS.str().length() < streamF.str().length()) - out.setf(std::ios::scientific | std::ios::uppercase ); + out << streamS.str(); else - out.setf(std::ios::fixed | std::ios::uppercase ); + out << streamF.str(); } - out << _value; - out.precision ( old_prec ); out.flags ( old_flags ); } @@ -543,6 +560,7 @@ void NOMAD::Double::display ( const NOMAD::Display & out , out << NOMAD::Double::_undef_str; } + /*------------------------------------------*/ /* round */ /*------------------------------------------*/ @@ -551,10 +569,33 @@ int NOMAD::Double::round ( void ) const if ( !_defined ) throw Not_Defined ( "Double.cpp" , __LINE__ , "NOMAD::Double::round(): value not defined" ); - return static_cast<int>(_value < 0.0 ? -std::floor(.5-_value) : std::floor(.5+_value)); + + double d = (_value < 0.0 ? -std::floor(.5-_value) : std::floor(.5+_value)); + + if ( d > NOMAD::P_INF_INT || d < NOMAD::M_INF_INT ) + throw Invalid_Value ( "Double.cpp" , __LINE__ , + "NOMAD::Double::round(): value cannot be rounded to integer because it is outside of range" ); + + return static_cast<int> (d); +} + +/*------------------------------------------*/ +/* round to double */ +/*------------------------------------------*/ +const NOMAD::Double NOMAD::Double::roundd ( void ) const +{ + if ( !_defined ) + throw Not_Defined ( "Double.cpp" , __LINE__ , + "NOMAD::Double::round(): value not defined" ); + + NOMAD::Double d = (_value < 0.0 ? -std::floor(.5-_value) : std::floor(.5+_value)); + + return (_value < 0.0 ? -std::floor(.5-_value) : std::floor(.5+_value)); + } + /*------------------------------------------*/ /* Ceil */ /*------------------------------------------*/ @@ -563,7 +604,7 @@ const NOMAD::Double NOMAD::Double::ceil ( void ) const if ( !_defined ) throw Not_Defined ( "Double.cpp" , __LINE__ , "NOMAD::Double::ceil(): value not defined" ); - return NOMAD::Double(std::ceil(_value)); + return NOMAD::Double( std::ceil(_value) ); } /*------------------------------------------*/ @@ -574,7 +615,7 @@ const NOMAD::Double NOMAD::Double::floor ( void ) const if ( !_defined ) throw Not_Defined ( "Double.cpp" , __LINE__ , "NOMAD::Double::floor(): value not defined" ); - return NOMAD::Double(std::floor(_value)); + return NOMAD::Double( std::floor(_value) ); } /*------------------------------------------*/ @@ -640,7 +681,8 @@ const NOMAD::Double NOMAD::Double::rel_err ( const Double & x ) const double diff = fabs ( _value - x._value ); // 2. test if one of the values is zero: - if ( _value == 0.0 || x._value == 0.0 ) { + if ( _value == 0.0 || x._value == 0.0 ) + { // we return min{2,|x-y|} (instead of 1): if ( diff > 2.0 ) @@ -654,7 +696,8 @@ const NOMAD::Double NOMAD::Double::rel_err ( const Double & x ) const double err = diff / ( (a<b) ? b : a ); // 4. test if we have opposite signs: - if ( _value * x._value < 0.0 ) { + if ( _value * x._value < 0.0 ) + { // the original error gives err in ]1;2] : we check if |x-y| < 1 // and if so we return |x-y| : @@ -701,12 +744,13 @@ void NOMAD::Double::project_to_mesh ( const NOMAD::Double & ref , { if ( !_defined ) return; - + NOMAD::Double v0 = ( ref._defined ) ? ref : 0.0; - if ( delta._defined && delta != 0.0 ) { + if ( delta._defined && delta != 0.0 ) + { - *this = v0 + ( (*this-v0) / delta).round() * delta; + *this = v0 + ( (*this-v0) / delta).roundd() * delta; if ( ub._defined && *this > ub ) *this = ub; diff --git a/src/Double.hpp b/src/Double.hpp index 5a9cf7f..405f786 100644 --- a/src/Double.hpp +++ b/src/Double.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Double.hpp - \brief Custom class for double-precision reals (headers) - \author Sebastien Le Digabel - \date 2010-04-02 - \see Double.cpp -*/ + \file Double.hpp + \brief Custom class for double-precision reals (headers) + \author Sebastien Le Digabel + \date 2010-04-02 + \see Double.cpp + */ #ifndef __NOMAD_DOUBLE__ #define __NOMAD_DOUBLE__ @@ -47,357 +54,363 @@ #include "Display.hpp" namespace NOMAD { - - /// Custom class for double-precision reals. - /** + + /// Custom class for double-precision reals. + /** - Allows comparisons on reals with custom precision. - Deals with undefined values. - Use \c value() to access the true \c double value. - */ - class Double { - - private: - + */ + class Double { + + private: + #ifdef MEMORY_DEBUG - static int _cardinality; ///< Number of NOMAD::Double objects in memory. - static int _max_cardinality; ///< Max number of NOMAD::Double objects in memory. + static int _cardinality; ///< Number of NOMAD::Double objects in memory. + static int _max_cardinality; ///< Max number of NOMAD::Double objects in memory. #endif - - double _value; ///< The value of the number. - bool _defined; ///< \c true if the number has a defined value. - - static double _epsilon; ///< Desired precision on comparisons. - static std::string _inf_str; ///< Infinity string. - static std::string _undef_str; ///< Undefined value string. - - public: - - /*-------------------------------------------------------------------*/ - - /// Exception class for undefined NOMAD::Double objects. - class Not_Defined : public NOMAD::Exception { + + double _value; ///< The value of the number. + bool _defined; ///< \c true if the number has a defined value. + + static double _epsilon; ///< Desired precision on comparisons. + static std::string _inf_str; ///< Infinity string. + static std::string _undef_str; ///< Undefined value string. + public: - /// Constructor. - Not_Defined ( const std::string & file , - int line , - const std::string & msg ) - : NOMAD::Exception ( file , line , msg ) {} - }; - - /// Exception class for divisons by zero with NOMAD::Double objects. - class Invalid_Value : public NOMAD::Exception { - public: - /// Constructor. - Invalid_Value ( const std::string & file , - int line , - const std::string & msg ) - : NOMAD::Exception ( file , line , msg ) {} - }; - - /*-------------------------------------------------------------------*/ + + /*-------------------------------------------------------------------*/ + + /// Exception class for undefined NOMAD::Double objects. + class Not_Defined : public NOMAD::Exception { + public: + /// Constructor. + Not_Defined ( const std::string & file , + int line , + const std::string & msg ) + : NOMAD::Exception ( file , line , msg ) {} + }; + + /// Exception class for divisons by zero with NOMAD::Double objects. + class Invalid_Value : public NOMAD::Exception { + public: + /// Constructor. + Invalid_Value ( const std::string & file , + int line , + const std::string & msg ) + : NOMAD::Exception ( file , line , msg ) {} + }; + + /*-------------------------------------------------------------------*/ #ifdef MEMORY_DEBUG - /// Access to the number of NOMAD::Double objects in memory. - /** - \return The number of NOMAD::Double objects in memory. - */ - static int get_cardinality ( void ) { return NOMAD::Double::_cardinality; } - - /// Access to the max number of NOMAD::Double objects in memory. - /** - \return The max number of NOMAD::Double objects in memory. - */ - static int get_max_cardinality ( void ) { return NOMAD::Double::_max_cardinality; } + /// Access to the number of NOMAD::Double objects in memory. + /** + \return The number of NOMAD::Double objects in memory. + */ + static int get_cardinality ( void ) { return NOMAD::Double::_cardinality; } + + /// Access to the max number of NOMAD::Double objects in memory. + /** + \return The max number of NOMAD::Double objects in memory. + */ + static int get_max_cardinality ( void ) { return NOMAD::Double::_max_cardinality; } #endif - - /// Constructor #1. - explicit Double ( void ); - - /// Constructor #2. - /** - From a \c double. - \param v The \c double -- \b IN. - */ - Double ( double v ); - - /// Copy constructor. - /** - \param d The copied object -- \b IN. - */ - Double ( const Double & d ); - - /// Destructor. - virtual ~Double ( void ); - - /// Function \c atof (conversion from a string to a real). - /** - The value is determined by a string. - \param s The string -- \b IN. - \return A boolean equal to \c true if the string was valid. - */ - bool atof ( const std::string & s ); - - /// Function \c atof (conversion from a string to a real) with a relative value. - /** - The value is determined by a string that may begin with \c 'r' to - indicate a proportion (relative value). - \param s The string -- \b IN. - \param relative A boolean indicating if the conversion was relative -- \b OUT. - \return A boolean equal to \c true if the string was valid. - */ - bool relative_atof ( const std::string & s , bool & relative ); - - /// Reset the Double. - void clear ( void ) { _value = 0.0; _defined = false; } + + /// Constructor #1. + explicit Double ( void ); + + /// Constructor #2. + /** + From a \c double. + \param v The \c double -- \b IN. + */ + Double ( double v ); + + /// Copy constructor. + /** + \param d The copied object -- \b IN. + */ + Double ( const Double & d ); + + /// Destructor. + virtual ~Double ( void ); + + /// Function \c atof (conversion from a string to a real). + /** + The value is determined by a string. + \param s The string -- \b IN. + \return A boolean equal to \c true if the string was valid. + */ + bool atof ( const std::string & s ); + + /// Function \c atof (conversion from a string to a real) with a relative value. + /** + The value is determined by a string that may begin with \c 'r' to + indicate a proportion (relative value). + \param s The string -- \b IN. + \param relative A boolean indicating if the conversion was relative -- \b OUT. + \return A boolean equal to \c true if the string was valid. + */ + bool relative_atof ( const std::string & s , bool & relative ); + + /// Reset the Double. + void clear ( void ) { _value = 0.0; _defined = false; } + + /// Reset the Double. + void reset ( void ) { clear(); } + + /// Affectation operator #1. + /** + \param d The right-hand side object -- \b IN. + \return \c *this as the result of the affectation. + */ + Double & operator = ( const Double & d ); + + /// Affectation operator #2. + /** + \param r The right-hand side \c double -- \b IN. + \return \c *this as the result of the affectation. + */ + Double & operator = ( double r ); + + /// Access to the \c double value. + /** + \return The \c double value. + */ + double value ( void ) const; + + /// Is the value defined ? + /** + \return A boolean equal to \c true if the NOMAD::Double is defined. + */ + bool is_defined ( void ) const { return _defined; } + + /// Is the value an integer ? + /** + \return A boolean equal to \c true if the NOMAD::Double is an integer. + */ + bool is_integer ( void ) const; + + /// Is the value binary ? + /** + \return A boolean equal to \c true if the NOMAD::Double is in {0,1}. + */ + bool is_binary ( void ) const; + + /// Sizeof. + /** + The size of an object in memory. + \return An integer value for the size in bytes. + */ + int size_of ( void ) const { return sizeof(_defined) + sizeof(_value); } + + /// Access to the NOMAD::Double precision. + /** + \return A \c double for the precision. + */ + static double get_epsilon ( void ) { return Double::_epsilon; } + + /// Set the NOMAD::Double precision. + /** + \param eps The precision -- \b IN. + */ + static void set_epsilon ( double eps ); + + /// Access to the undefined value string. + /** + \return A \c std::string for the undefined value string. + */ + static std::string get_undef_str ( void ) { return Double::_undef_str; } + + /// Set the NOMAD::Double undefined value string. + /** + \param undef_str The undefined value string -- \b IN. + */ + static void set_undef_str ( const std::string & undef_str ) + { + NOMAD::Double::_undef_str = undef_str; + } + + /// Access to the infinity string. + /** + \return A \c std::string for the infinity string. + */ + static std::string get_inf_str ( void ) { return Double::_inf_str; } + + /// Set the NOMAD::Double infinity string. + /** + \param inf_str The infinity string -- \b IN. + */ + static void set_inf_str ( const std::string & inf_str ) + { + NOMAD::Double::_inf_str = inf_str; + } + + /// Rounding to int + /** + \return An integer with the rounding result. + */ + int round ( void ) const; + + /// Rounding to a Double + /** + \return A NOMAD::Double with the rounding result. + */ + const Double roundd ( void ) const; + + + /// Ceil. + /** + \return A NOMAD::double with the rounding result. + */ + const Double ceil ( void ) const; + + /// Floor. + /** + \return A NOMAD::double with the rounding result. + */ + const Double floor ( void ) const; + + + /// Absolute value. + /** + \return Another NOMAD::Double equal to max{\c -*this,\c *this}. + */ + const Double abs ( void ) const; + + /// Square. + /** + \return Another NOMAD::Double equal to \c *this \c * \c *this. + */ + const Double pow2 ( void ) const; + + /// Square root. + /** + \return Another NOMAD::Double equal to \c (*this)^0.5. + */ + const Double sqrt ( void ) const; + + /// Relative error with another NOMAD::Double. + /** + \param x The other real -- \b IN. + \return A new object with the relative error value in \c [0;1]. + */ + const Double rel_err ( const Double & x ) const; + + /// Operator \c ++ (prefix position). + /** + Allows \c ++d; + \return The NOMAD::Double plus 1. + */ + Double & operator++ ( void ); + + /// Operator \c ++ (suffix position). + /** + Allows \c d++; + \return A copy of the NOMAD::Double before incrementation. + */ + Double operator++ ( int n ); + + /// Operator \c -- (prefix position). + /** + Allows \c --d; + \return The NOMAD::Double minus 1. + */ Double & operator-- ( void ); + + /// Operator \c -- (suffix position). + /** + Allows \c d--; + \return A copy of the NOMAD::Double before decrementation. + */ Double operator-- ( int n ); + + /// Operator \c +=. + /** + Allows \c d \c += \c d1. + \param d1 The increment -- \b IN. + \return The NOMAD::Double plus \c d1. + */ + const Double & operator += ( const Double & d1 ); + + /// Operator \c -=. + /** + Allows \c d \c -= \c d1. + \param d1 The decrement -- \b IN. + \return The NOMAD::Double minus \c d1. + */ + const Double & operator -= ( const Double & d1 ); + + /// Operator \c *=. + /** + Allows \c d \c *= \c d1. + \param d1 The factor -- \b IN. + \return The NOMAD::Double times \c d1. + */ + const Double & operator *= ( const Double & d1 ); + + /// Operator \c /=. + /** + Allows \c d \c /= \c d1. Throws a NOMAD::Exception::Invalid_Value if \c d1==0. + \param d1 The denominator -- \b IN. + \return The NOMAD::Double divided by \c d1. + */ + const Double & operator /= ( const Double & d1 ); + + /// Comparison <. + /** + The same as operator \c < but with consideration of undefined values. + When comparing \c d1 and \c d2, \c (d1<d2) is equal to \c true for example + if \c d1 is defined and if \c d2 is not. + \param d The right-hand side of the comparison -- \b IN. + \return A boolean equal to \c true if \c *this \c < \c d. + */ + bool comp_with_undef ( const Double & d ) const; + + /// Projection to the mesh. + /** + Projection to the mesh of size delta + ( \c *this \c = \c ref \c + \c k \c * \c delta ). + \param ref Reference for projection -- \b IN. + \param delta Mesh size parameter -- \b IN. + \param lb Lower bound -- \b IN -- \b optional (default=undefined real.) + \param ub Upper bound -- \b IN -- \b optional (default=undefined real.) + */ + void project_to_mesh ( const Double & ref , + const Double & delta , + const Double & lb = Double() , + const Double & ub = Double() ); + + /// Display. + /** + \param out The NOMAD::Display object -- \b IN. + */ + void display ( const NOMAD::Display & out ) const; + + /// Display with format. + /** + \param out The NOMAD::Display object -- \b IN. + \param format The format as in C -- \b IN. + */ + void display ( const NOMAD::Display & out , + const std::string & format ) const; + }; - /// Reset the Double. - void reset ( void ) { clear(); } - - /// Affectation operator #1. - /** - \param d The right-hand side object -- \b IN. - \return \c *this as the result of the affectation. - */ - Double & operator = ( const Double & d ); - - /// Affectation operator #2. - /** - \param r The right-hand side \c double -- \b IN. - \return \c *this as the result of the affectation. - */ - Double & operator = ( double r ); - - /// Access to the \c double value. - /** - \return The \c double value. - */ - double value ( void ) const; - - /// Is the value defined ? - /** - \return A boolean equal to \c true if the NOMAD::Double is defined. - */ - bool is_defined ( void ) const { return _defined; } - - /// Is the value an integer ? - /** - \return A boolean equal to \c true if the NOMAD::Double is an integer. - */ - bool is_integer ( void ) const; - - /// Is the value binary ? - /** - \return A boolean equal to \c true if the NOMAD::Double is in {0,1}. - */ - bool is_binary ( void ) const; + /*---------------------------------------------------------------------------*/ - /// Sizeof. - /** - The size of an object in memory. - \return An integer value for the size in bytes. - */ - int size_of ( void ) const { return sizeof(_defined) + sizeof(_value); } - - /// Access to the NOMAD::Double precision. - /** - \return A \c double for the precision. - */ - static double get_epsilon ( void ) { return Double::_epsilon; } - - /// Set the NOMAD::Double precision. + /// Display a NOMAD::Double object. /** - \param eps The precision -- \b IN. - */ - static void set_epsilon ( double eps ); - - /// Access to the undefined value string. - /** - \return A \c std::string for the undefined value string. - */ - static std::string get_undef_str ( void ) { return Double::_undef_str; } - - /// Set the NOMAD::Double undefined value string. - /** - \param undef_str The undefined value string -- \b IN. - */ - static void set_undef_str ( const std::string & undef_str ) - { - NOMAD::Double::_undef_str = undef_str; - } - - /// Access to the infinity string. - /** - \return A \c std::string for the infinity string. - */ - static std::string get_inf_str ( void ) { return Double::_inf_str; } - - /// Set the NOMAD::Double infinity string. - /** - \param inf_str The infinity string -- \b IN. - */ - static void set_inf_str ( const std::string & inf_str ) + \param out The NOMAD::Display object -- \b IN. + \param d The NOMAD::Double object to be displayed -- \b IN. + \return The NOMAD::Display object. + */ + inline const NOMAD::Display & operator << ( const NOMAD::Display & out , + const Double & d ) { - NOMAD::Double::_inf_str = inf_str; + d.display ( out ); + return out; } - - /// Rounding. - /** - \return An integer with the rounding result. - */ - int round ( void ) const; - - - /// Ceil. - /** - \return A NOMAD::double with the rounding result. - */ - const Double ceil ( void ) const; - - /// Floor. - /** - \return A NOMAD::double with the rounding result. - */ - const Double floor ( void ) const; - - - /// Absolute value. - /** - \return Another NOMAD::Double equal to max{\c -*this,\c *this}. - */ - const Double abs ( void ) const; - - /// Square. - /** - \return Another NOMAD::Double equal to \c *this \c * \c *this. - */ - const Double pow2 ( void ) const; - - /// Square root. - /** - \return Another NOMAD::Double equal to \c (*this)^0.5. - */ - const Double sqrt ( void ) const; - /// Relative error with another NOMAD::Double. - /** - \param x The other real -- \b IN. - \return A new object with the relative error value in \c [0;1]. - */ - const Double rel_err ( const Double & x ) const; - - /// Operator \c ++ (prefix position). - /** - Allows \c ++d; - \return The NOMAD::Double plus 1. - */ - Double & operator++ ( void ); - - /// Operator \c ++ (suffix position). - /** - Allows \c d++; - \return A copy of the NOMAD::Double before incrementation. - */ - Double operator++ ( int n ); - - /// Operator \c -- (prefix position). - /** - Allows \c --d; - \return The NOMAD::Double minus 1. - */ Double & operator-- ( void ); - - /// Operator \c -- (suffix position). - /** - Allows \c d--; - \return A copy of the NOMAD::Double before decrementation. - */ Double operator-- ( int n ); - - /// Operator \c +=. + /// Input. /** - Allows \c d \c += \c d1. - \param d1 The increment -- \b IN. - \return The NOMAD::Double plus \c d1. - */ - const Double & operator += ( const Double & d1 ); - - /// Operator \c -=. - /** - Allows \c d \c -= \c d1. - \param d1 The decrement -- \b IN. - \return The NOMAD::Double minus \c d1. - */ - const Double & operator -= ( const Double & d1 ); - - /// Operator \c *=. - /** - Allows \c d \c *= \c d1. - \param d1 The factor -- \b IN. - \return The NOMAD::Double times \c d1. - */ - const Double & operator *= ( const Double & d1 ); - - /// Operator \c /=. - /** - Allows \c d \c /= \c d1. Throws a NOMAD::Exception::Invalid_Value if \c d1==0. - \param d1 The denominator -- \b IN. - \return The NOMAD::Double divided by \c d1. - */ - const Double & operator /= ( const Double & d1 ); - - /// Comparison <. - /** - The same as operator \c < but with consideration of undefined values. - When comparing \c d1 and \c d2, \c (d1<d2) is equal to \c true for example - if \c d1 is defined and if \c d2 is not. - \param d The right-hand side of the comparison -- \b IN. - \return A boolean equal to \c true if \c *this \c < \c d. - */ - bool comp_with_undef ( const Double & d ) const; - - /// Projection to the mesh. - /** - Projection to the mesh of size delta - ( \c *this \c = \c ref \c + \c k \c * \c delta ). - \param ref Reference for projection -- \b IN. - \param delta Mesh size parameter -- \b IN. - \param lb Lower bound -- \b IN -- \b optional (default=undefined real.) - \param ub Upper bound -- \b IN -- \b optional (default=undefined real.) - */ - void project_to_mesh ( const Double & ref , - const Double & delta , - const Double & lb = Double() , - const Double & ub = Double() ); - - /// Display. - /** - \param out The NOMAD::Display object -- \b IN. - */ - void display ( const NOMAD::Display & out ) const; - - /// Display with format. - /** - \param out The NOMAD::Display object -- \b IN. - \param format The format as in C -- \b IN. - */ - void display ( const NOMAD::Display & out , - const std::string & format ) const; - }; - - /*---------------------------------------------------------------------------*/ - - /// Display a NOMAD::Double object. - /** - \param out The NOMAD::Display object -- \b IN. - \param d The NOMAD::Double object to be displayed -- \b IN. - \return The NOMAD::Display object. - */ - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const Double & d ) - { - d.display ( out ); - return out; - } - - /// Input. - /** - Allows the input of NOMAD::Double objects with operator \c >>. - Can read undefined values (parameter \c UNDEF_STR with default \c "-".) - Example: @@ -410,128 +423,155 @@ namespace NOMAD { \param in A \c std::istream object (can be a file) -- \b IN/OUT. \param d The NOMAD::Double object to be read -- \b OUT. \return The modified \c std::istream object. - */ - std::istream & operator >> ( std::istream & in , Double & d ); - - /// Inverse operator. - /** + */ + std::istream & operator >> ( std::istream & in , Double & d ); + + /// Inverse operator. + /** Allows operations such as \c d \c = \c -d. \param d The NOMAD::Double to be inversed -- \b IN. \return A new NOMAD::Double as the result of the operation. - */ - inline const Double operator - ( const Double & d ) - { - return NOMAD::Double (-d.value()); - } - - /// Operator \c + for two NOMAD::Double objects. - /** + */ + inline const Double operator - ( const Double & d ) + { + return NOMAD::Double (-d.value()); + } + + /// Operator \c + for two NOMAD::Double objects. + /** Allows operations such as \c d \c = \c d1 \c + \c d2. \param d1 The first NOMAD::Double -- \b IN. \param d2 The second NOMAD::Double -- \b IN. \return A third NOMAD::Double as the result of the operation. - */ - inline const Double operator + ( const Double & d1 , const Double & d2 ) - { - return NOMAD::Double ( d1.value() + d2.value() ); - } - - /// Operator \c - for two NOMAD::Double objects. - /** + */ + inline const Double operator + ( const Double & d1 , const Double & d2 ) + { + return NOMAD::Double ( d1.value() + d2.value() ); + } + + /// Operator \c - for two NOMAD::Double objects. + /** Allows operations such as \c d \c = \c d1 \c - \c d2. \param d1 The first NOMAD::Double -- \b IN. \param d2 The second NOMAD::Double -- \b IN. \return A third NOMAD::Double as the result of the operation. - */ - inline const Double operator - ( const Double & d1 , const Double & d2 ) - { - return NOMAD::Double (d1.value() - d2.value()); - } - - /// Operator \c * for two NOMAD::Double objects. - /** + */ + inline const Double operator - ( const Double & d1 , const Double & d2 ) + { + return NOMAD::Double (d1.value() - d2.value()); + } + + /// Operator \c * for two NOMAD::Double objects. + /** Allows operations such as \c d \c = \c d1 \c * \c d2. \param d1 The first NOMAD::Double -- \b IN. \param d2 The second NOMAD::Double -- \b IN. \return A third NOMAD::Double as the result of the operation. - */ - inline const Double operator * ( const Double & d1 , const Double & d2 ) - { - return NOMAD::Double ( d1.value() * d2.value() ); - } - - /// Operator \c / for two NOMAD::Double objects. - /** + */ + inline const Double operator * ( const Double & d1 , const Double & d2 ) + { + return NOMAD::Double ( d1.value() * d2.value() ); + } + + /// Operator \c / for two NOMAD::Double objects. + /** Allows operations such as \c d \c = \c d1 \c / \c d2. \param d1 The first NOMAD::Double -- \b IN. \param d2 The second NOMAD::Double -- \b IN. \return A third NOMAD::Double as the result of the operation. - */ - const Double operator / ( const Double & d1 , const Double & d2 ); - - /// Comparison operator \c ==. - /** + */ + const Double operator / ( const Double & d1 , const Double & d2 ); + + /// Comparison operator \c ==. + /** Allows the comparison \c d1 \c == \c d2. \param d1 The first NOMAD::Double -- \b IN. \param d2 The second NOMAD::Double -- \b IN. \return A boolean equal to true if \c d1 \c == \c d2. - */ - inline bool operator == ( const Double & d1 , const Double & d2 ) - { - return fabs ( d1.value() - d2.value() ) < NOMAD::Double::get_epsilon(); - } - - /// Comparison operator \c !=. - /** + */ + inline bool operator == ( const Double & d1 , const Double & d2 ) + { + return fabs ( d1.value() - d2.value() ) < NOMAD::Double::get_epsilon(); + } + + /// Comparison operator \c !=. + /** Allows the comparison \c d1 \c != \c d2. \param d1 The first NOMAD::Double -- \b IN. \param d2 The second NOMAD::Double -- \b IN. \return A boolean equal to true if \c d1 \c != \c d2. - */ - inline bool operator != ( const Double & d1 , const Double & d2 ) { return !(d1==d2); } - - /// Comparison operator \c <. - /** + */ + inline bool operator != ( const Double & d1 , const Double & d2 ) + { + return !(d1==d2); + } + + /// Comparison operator \c <. + /** Allows the comparison \c d1 \c < \c d2. \param d1 The first NOMAD::Double -- \b IN. \param d2 The second NOMAD::Double -- \b IN. \return A boolean equal to true if \c d1 \c < \c d2. - */ - inline bool operator < ( const Double & d1 , const Double & d2 ) - { - return d1.value() < d2.value() - NOMAD::Double::get_epsilon(); - } - - /// Comparison operator \c >. - /** + */ + inline bool operator < ( const Double & d1 , const Double & d2 ) + { + return d1.value() < d2.value() - NOMAD::Double::get_epsilon(); + } + + /// Comparison operator \c >. + /** Allows the comparison \c d1 \c > \c d2. \param d1 The first NOMAD::Double -- \b IN. \param d2 The second NOMAD::Double -- \b IN. \return A boolean equal to true if \c d1 \c > \c d2. - */ - inline bool operator > ( const Double & d1 , const Double & d2 ) - { - return d1.value() > d2.value() + NOMAD::Double::get_epsilon(); - } - - /// Comparison operator \c <=. - /** + */ + inline bool operator > ( const Double & d1 , const Double & d2 ) + { + return d1.value() > d2.value() + NOMAD::Double::get_epsilon(); + } + + /// Comparison operator \c <=. + /** Allows the comparison \c d1 \c <= \c d2. \param d1 The first NOMAD::Double -- \b IN. \param d2 The second NOMAD::Double -- \b IN. \return A boolean equal to true if \c d1 \c <= \c d2. - */ - inline bool operator <= ( const Double & d1 , const Double & d2 ) { return !(d1>d2); } - - /// Comparison operator \c >=. - /** + */ + inline bool operator <= ( const Double & d1 , const Double & d2 ) { return !(d1>d2); } + + /// Comparison operator \c >=. + /** Allows the comparison \c d1 \c >= \c d2. \param d1 The first NOMAD::Double -- \b IN. \param d2 The second NOMAD::Double -- \b IN. \return A boolean equal to true if \c d1 \c >= \c d2. - */ inline bool operator >= ( const Double & d1 , const Double & d2 ) - { - return !(d1<d2); - } + */ + inline bool operator >= ( const Double & d1 , const Double & d2 ) + { + return !(d1<d2); + } + + /// Largest of two values \c >=. + /** + Return the largest of two NOMAD::Double + \param d1 The first NOMAD::Double -- \b IN. + \param d2 The second NOMAD::Double -- \b IN. + \return A NOMAD::Double equal to the max(d1,d2) + */ + inline Double max (const Double d1 , const Double d2 ) { return (d1>d2)?d1:d2; } + + /// Smallest of two values \c >=. + /** + Return the largest of two NOMAD::Double + \param d1 The first NOMAD::Double -- \b IN. + \param d2 The second NOMAD::Double -- \b IN. + \return A NOMAD::Double equal to the min(d1,d2) + */ + inline Double min ( const Double d1 , const Double d2 ) { return (d1<d2)?d1:d2; } + + + + + } #endif diff --git a/src/Eval_Point.cpp b/src/Eval_Point.cpp index fa193fe..f862e13 100644 --- a/src/Eval_Point.cpp +++ b/src/Eval_Point.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -48,6 +55,7 @@ /* static members initialization */ /*-----------------------------------*/ int NOMAD::Eval_Point::_current_tag = 0; + int NOMAD::Eval_Point::_current_bbe = 0; int NOMAD::Eval_Point::_current_sgte_bbe = 0; /*---------------------------------------------------------------------*/ @@ -128,7 +136,8 @@ _bb_outputs ( x.get_bb_outputs() ) for ( int i = 0 ; i < n ; ++i ) (*this)[i] = x.get_coord(i); - switch ( x.get_eval_status() ) { + switch ( x.get_eval_status() ) + { case 0: _eval_status = NOMAD::EVAL_FAIL; break; @@ -249,7 +258,9 @@ void NOMAD::Eval_Point::set_direction ( const NOMAD::Direction * dir ) void NOMAD::Eval_Point::set_poll_center ( const NOMAD::Eval_Point * pc ) { + _poll_center=pc; + } /*-------------------------------------------------------*/ @@ -257,7 +268,8 @@ void NOMAD::Eval_Point::set_poll_center ( const NOMAD::Eval_Point * pc ) /*-------------------------------------------------------*/ void NOMAD::Eval_Point::set_signature ( NOMAD::Signature * s ) { - if ( !s ) { + if ( !s ) + { _signature = NULL; return; } @@ -356,7 +368,8 @@ bool NOMAD::Eval_Point::treat_periodic_variables ( NOMAD::Direction *& new_dir ) /*--------------------------------------------------*/ bool NOMAD::Eval_Point::check ( int m , NOMAD::check_failed_type & cf ) const { - if ( size() <= 0 || !_signature || m != _bb_outputs.size() ) { + if ( size() <= 0 || !_signature || m != _bb_outputs.size() ) + { std::string err = "Eval_Point::check() could not procede"; if ( !_signature ) err += " (no signature)"; @@ -404,19 +417,22 @@ bool NOMAD::Eval_Point::check ( int m , NOMAD::check_failed_type & cf ) const // check the integer/categorical/binary variables: iti = input_types[i]; - if ( iti == NOMAD::BINARY && !xi.is_binary() ) { + if ( iti == NOMAD::BINARY && !xi.is_binary() ) + { cf = NOMAD::BIN_FAIL; return false; } if ( ( iti == NOMAD::INTEGER || iti == NOMAD::CATEGORICAL ) - && !xi.is_integer() ) { + && !xi.is_integer() ) + { cf = ( iti == NOMAD::INTEGER ) ? NOMAD::INT_FAIL : NOMAD::CAT_FAIL; return false; } // check the fixed-variables: const NOMAD::Double & fvi = fv[i]; - if ( fvi.is_defined() && fvi != xi ) { + if ( fvi.is_defined() && fvi != xi ) + { cf = NOMAD::FIX_VAR_FAIL; return false; } @@ -438,7 +454,8 @@ void NOMAD::Eval_Point::display_tag ( const NOMAD::Display & out ) const /*--------------------------------------------------*/ void NOMAD::Eval_Point::display_eval( const NOMAD::Display & out , bool in_block ) const { - if ( in_block ) { + if ( in_block ) + { std::ostringstream oss; oss << "#" << _tag; @@ -455,7 +472,9 @@ void NOMAD::Eval_Point::display_eval( const NOMAD::Display & out , bool in_block out << "f = " << _f << std::endl; out.close_block(); } - else { + else + { + display_tag ( out ); out << " x=( "; NOMAD::Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); @@ -498,8 +517,10 @@ bool NOMAD::Eval_Point::operator < ( const NOMAD::Eval_Point & x ) const bool NOMAD::Eval_Point::check_nan ( void ) const { int m = _bb_outputs.size(); - for ( int i = 0 ; i < m ; ++i ) { - if ( _bb_outputs[i].is_defined() ) { + for ( int i = 0 ; i < m ; ++i ) + { + if ( _bb_outputs[i].is_defined() ) + { #ifdef WINDOWS if ( isnan ( _bb_outputs[i].value() ) ) return true; diff --git a/src/Eval_Point.hpp b/src/Eval_Point.hpp index 6418403..050efca 100644 --- a/src/Eval_Point.hpp +++ b/src/Eval_Point.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -64,16 +71,16 @@ namespace NOMAD { private: - static int _current_tag; ///< Current tag for all NOMAD::Eval_Point objects. - int _tag; ///< Unique tag. + static int _current_tag; ///< Current tag for all NOMAD::Eval_Point objects. + int _tag; ///< Unique tag. - static int _current_bbe; ///< Current bbe for all NOMAD::Eval_Point objects - static int _current_sgte_bbe; ///< Current sgte_bbe for all NOMAD::Eval_Point objects . - int _bbe; /// Recorded bbe for current NOMAD::Eval_Point object - int _sgte_bbe; /// Recorded sgte_bbe for current NOMAD::Eval_Point object - int _real_time; /// Recorded time for current NOMAD::Eval_Point object + static int _current_bbe; ///< Current bbe for all NOMAD::Eval_Point objects + static int _current_sgte_bbe; ///< Current sgte_bbe for all NOMAD::Eval_Point objects . + int _bbe; /// Recorded bbe for current NOMAD::Eval_Point object + int _sgte_bbe; /// Recorded sgte_bbe for current NOMAD::Eval_Point object + int _real_time; /// Recorded time for current NOMAD::Eval_Point object - NOMAD::Signature * _signature; ///< Signature of the point. + NOMAD::Signature * _signature; ///< Signature of the point. /** \c f is explicitely computed by a NOMAD::Evaluator object @@ -301,7 +308,6 @@ namespace NOMAD { */ const NOMAD::Eval_Point * get_poll_center ( void ) const { return _poll_center ; } - /// Check if the point has been generated during the current run. /** \return A boolean equal to \c true if the point has been @@ -552,7 +558,7 @@ namespace NOMAD { /// Reset the tags and bbes /** - */ + */ static void reset_tags_and_bbes ( void ) {_current_tag = 0;_current_bbe = 0;_current_sgte_bbe = 0;} #ifdef MODEL_STATS diff --git a/src/Evaluator.cpp b/src/Evaluator.cpp index f0f8ca9..278b662 100644 --- a/src/Evaluator.cpp +++ b/src/Evaluator.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -56,774 +63,785 @@ bool NOMAD::Evaluator::_force_quit = false; /* . _bb_exe includes the blackbox path */ /*-----------------------------------------------------------------*/ NOMAD::Evaluator::Evaluator ( const NOMAD::Parameters & p ) -: _p ( p ) , -_is_multi_obj ( false ) , -_is_model_evaluator ( false ) +: _p ( p ) , +_is_multi_obj ( false ) , +_is_model_evaluator ( false ) { - NOMAD::Evaluator::_force_quit = false; - - if ( _p.get_bb_exe().empty() ) - return; - - // _bbe_exe and _bb_nbo construction: - std::list<std::string>::const_iterator it = _p.get_bb_exe().begin(); - _bb_exe.push_back(*it); - _bb_nbo.push_back(1); - ++it; - - std::list<std::string>::const_iterator end = _p.get_bb_exe().end(); - while ( it != end ) + NOMAD::Evaluator::_force_quit = false; + + if ( _p.get_bb_exe().empty() ) + return; + + // _bbe_exe and _bb_nbo construction: + std::list<std::string>::const_iterator it = _p.get_bb_exe().begin(); + _bb_exe.push_back(*it); + _bb_nbo.push_back(1); + ++it; + + std::list<std::string>::const_iterator end = _p.get_bb_exe().end(); + while ( it != end ) { - if ( *it != _bb_exe[_bb_exe.size()-1] ) + if ( *it != _bb_exe[_bb_exe.size()-1] ) { - _bb_exe.push_back(*it); - _bb_nbo.push_back(1); - } - else - ++_bb_nbo[_bb_exe.size()-1]; - ++it; - } - - // we check that _bb_exe contains unique names and we add the problem path: - size_t k , l , n = _bb_exe.size() , nm1 = n-1; - for ( k = 0 ; k < nm1 ; ++k ) + _bb_exe.push_back(*it); + _bb_nbo.push_back(1); + } + else + ++_bb_nbo[_bb_exe.size()-1]; + ++it; + } + + // we check that _bb_exe contains unique names and we add the problem path: + size_t k , l , n = _bb_exe.size() , nm1 = n-1; + for ( k = 0 ; k < nm1 ; ++k ) { - for ( l = k+1 ; l < n ; ++l ) - if ( _bb_exe[k] == _bb_exe[l] ) - throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , - "problem with executable names" ); - } - - // construction of _sgte_exe: - bool has_sgte_exe = _p.has_sgte_exe(); - std::string err; - if ( has_sgte_exe ) + for ( l = k+1 ; l < n ; ++l ) + if ( _bb_exe[k] == _bb_exe[l] ) + throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , + "problem with executable names" ); + } + + // construction of _sgte_exe: + bool has_sgte_exe = _p.has_sgte_exe(); + std::string err; + if ( has_sgte_exe ) { - for ( k = 0 ; k < n ; ++k ) + for ( k = 0 ; k < n ; ++k ) { - - _sgte_exe.push_back ( _p.get_sgte_exe(_bb_exe[k]) ); - - if ( _sgte_exe[_sgte_exe.size()-1].empty() ) + + _sgte_exe.push_back ( _p.get_sgte_exe(_bb_exe[k]) ); + + if ( _sgte_exe[_sgte_exe.size()-1].empty() ) { - err = "blackbox executable \'" + _bb_exe[k] + "\' has no surrogate"; - throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , err ); - } - } - } - - // process blakc-box executables (check and add problem path): - for ( k = 0 ; k < n ; ++k ) + err = "blackbox executable \'" + _bb_exe[k] + "\' has no surrogate"; + throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , err ); + } + } + } + + // process blakc-box executables (check and add problem path): + for ( k = 0 ; k < n ; ++k ) { - process_bb_exe_name ( _bb_exe[k] ); - if ( has_sgte_exe ) - process_bb_exe_name ( _sgte_exe[k] ); - } - - // blackbox names and indexes display: + process_bb_exe_name ( _bb_exe[k] ); + if ( has_sgte_exe ) + process_bb_exe_name ( _sgte_exe[k] ); + } + + // blackbox names and indexes display: #ifdef DEBUG #ifdef USE_MPI - int rank; - MPI_Comm_rank ( MPI_COMM_WORLD, &rank); - if ( rank == 0 ) - { + int rank; + MPI_Comm_rank ( MPI_COMM_WORLD, &rank); + if ( rank == 0 ) #else - { + { #endif - const NOMAD::Display & out = _p.out(); - if ( !_bb_exe.empty() ) - { - out << std::endl - << NOMAD::open_block ( "blackbox executables" ); - for ( k = 0 ; k < n ; ++k ) - { - out << NOMAD::open_block ( "bb #" + NOMAD::itos(k) ) - << _bb_exe[k] << std::endl - << "number of outputs=" << _bb_nbo[k] << std::endl - << NOMAD::close_block(); - } - out.close_block(); - } - if ( !_sgte_exe.empty() ) + const NOMAD::Display & out = _p.out(); + if ( !_bb_exe.empty() ) + { + out << std::endl + << NOMAD::open_block ( "blackbox executables" ); + for ( k = 0 ; k < n ; ++k ) { - out << std::endl - << NOMAD::open_block ( "surrogate executables" ); - for ( k = 0 ; k < n ; ++k ) - out << "sgte #" << static_cast<int>(k) << ": " - << _sgte_exe[k] << std::endl; - out.close_block(); - } - } + out << NOMAD::open_block ( "bb #" + NOMAD::itos(k) ) + << _bb_exe[k] << std::endl + << "number of outputs=" << _bb_nbo[k] << std::endl + << NOMAD::close_block(); + } + out.close_block(); + } + if ( !_sgte_exe.empty() ) + { + out << std::endl + << NOMAD::open_block ( "surrogate executables" ); + for ( k = 0 ; k < n ; ++k ) + out << "sgte #" << static_cast<int>(k) << ": " + << _sgte_exe[k] << std::endl; + out.close_block(); + } + } #endif +} + +/*----------------------------------------------------------------*/ +/* process a blackbox executable name (private) */ +/*----------------------------------------------------------------*/ +void NOMAD::Evaluator::process_bb_exe_name ( std::string & bb_exe ) const +{ + std::string err; + std::list<std::string> bb_exe_words; + + NOMAD::get_words ( bb_exe , bb_exe_words ); + + if ( bb_exe_words.empty() ) + { + err = "problem with executable \'" + bb_exe + "\'"; + throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , err ); } - - /*----------------------------------------------------------------*/ - /* process a blackbox executable name (private) */ - /*----------------------------------------------------------------*/ - void NOMAD::Evaluator::process_bb_exe_name ( std::string & bb_exe ) const - { - std::string err; - std::list<std::string> bb_exe_words; - - NOMAD::get_words ( bb_exe , bb_exe_words ); - - if ( bb_exe_words.empty() ) + + std::string problem_dir = _p.get_problem_dir(); + + // bb_exe is composed of several words (it is a command): + if ( bb_exe_words.size() > 1 ) + { + + bb_exe.clear(); + + std::list<std::string>::const_iterator it = bb_exe_words.begin() , + end = bb_exe_words.end(); + while (true) { - err = "problem with executable \'" + bb_exe + "\'"; - throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , err ); - } - - std::string problem_dir = _p.get_problem_dir(); - - // bb_exe is composed of several words (it is a command): - if ( bb_exe_words.size() > 1 ) + + if ( (*it)[0] != '$' ) + { + bb_exe += "\"" + problem_dir; + bb_exe += *it + "\""; + } + else + bb_exe += it->substr ( 1 , it->size()-1 ); + + ++it; + + if ( it == end ) + break; + + bb_exe += " "; + } + } + + // bb_exe is just composed of one name (it is an executable): + else + { + + if ( bb_exe[0] != '$' ) + bb_exe = problem_dir + bb_exe; + else + bb_exe = bb_exe.substr ( 1 , bb_exe.size()-1 ); + if ( !NOMAD::check_exe_file ( bb_exe ) ) { - - bb_exe.clear(); - - std::list<std::string>::const_iterator it = bb_exe_words.begin() , - end = bb_exe_words.end(); - while (true) + err = "\'" + bb_exe + "\' is not a valid executable file"; + throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , err ); + } + if ( bb_exe[0] != '$' ) + bb_exe = "\"" + bb_exe + "\""; + } +} + +/*-----------------------------------------------------------------------*/ +/* check the constraints to decide if an evaluation have to be stopped */ +/*-----------------------------------------------------------------------*/ +/* . checked when h > h_max or if a 'EB' constraint is violated */ +/* . private method */ +/*-----------------------------------------------------------------------*/ +bool NOMAD::Evaluator::interrupt_evaluations ( const NOMAD::Eval_Point & x , + const NOMAD::Double & h_max ) const +{ + int nbo = _p.get_bb_nb_outputs(); + const NOMAD::Point & bbo = x.get_bb_outputs(); + const std::vector<NOMAD::bb_output_type> & bbot = _p.get_bb_output_type(); + NOMAD::Double h = 0.0; + bool check_h = h_max.is_defined(); + + for ( int i = 0 ; i < nbo ; ++i ) + { + + if ( bbo[i].is_defined() && + ( bbot[i] == NOMAD::EB || bbot[i] == NOMAD::PEB_E ) && + bbo[i] > _p.get_h_min() ) + return true; + + if ( check_h && bbo[i].is_defined() && + (bbot[i] == NOMAD::FILTER || + bbot[i] == NOMAD::PB || + bbot[i] == NOMAD::PEB_P ) ) + { + + if ( bbo[i] > _p.get_h_min() ) { - - if ( (*it)[0] != '$' ) + switch ( _p.get_h_norm() ) { - bb_exe += "\"" + problem_dir; - bb_exe += *it + "\""; - } - else - bb_exe += it->substr ( 1 , it->size()-1 ); - - ++it; - - if ( it == end ) - break; - - bb_exe += " "; - } - } - - // bb_exe is just composed of one name (it is an executable): - else { - if ( bb_exe[0] != '$' ) - bb_exe = problem_dir + bb_exe; - else - bb_exe = bb_exe.substr ( 1 , bb_exe.size()-1 ); - if ( !NOMAD::check_exe_file ( bb_exe ) ) - { - err = "\'" + bb_exe + "\' is not a valid executable file"; - throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , err ); - } - if ( bb_exe[0] != '$' ) - bb_exe = "\"" + bb_exe + "\""; - } - } - - /*-----------------------------------------------------------------------*/ - /* check the constraints to decide if an evaluation have to be stopped */ - /*-----------------------------------------------------------------------*/ - /* . checked when h > h_max or if a 'EB' constraint is violated */ - /* . private method */ - /*-----------------------------------------------------------------------*/ - bool NOMAD::Evaluator::interrupt_evaluations ( const NOMAD::Eval_Point & x , - const NOMAD::Double & h_max ) const - { - int nbo = _p.get_bb_nb_outputs(); - const NOMAD::Point & bbo = x.get_bb_outputs(); - const std::vector<NOMAD::bb_output_type> & bbot = _p.get_bb_output_type(); - NOMAD::Double h = 0.0; - bool check_h = h_max.is_defined(); - - for ( int i = 0 ; i < nbo ; ++i ) { - - if ( bbo[i].is_defined() && - ( bbot[i] == NOMAD::EB || bbot[i] == NOMAD::PEB_E ) && - bbo[i] > _p.get_h_min() ) - return true; - - if ( check_h && bbo[i].is_defined() && - (bbot[i] == NOMAD::FILTER || - bbot[i] == NOMAD::PB || - bbot[i] == NOMAD::PEB_P ) ) { - - if ( bbo[i] > _p.get_h_min() ) { - switch ( _p.get_h_norm() ) { - case NOMAD::L1: - h += bbo[i]; - break; - case NOMAD::L2: - h += bbo[i].pow2(); - break; - case NOMAD::LINF: - if ( bbo[i] > h ) - h = bbo[i]; - break; - } - - if ( _p.get_h_norm() == NOMAD::L2 ) { - if ( h > h_max.pow2() ) - return true; - } - else if ( h > h_max ) - return true; - } - } - } - return false; - } - - /*--------------------------------------------------------*/ - /* compute f(x) from the blackbox outputs of a point */ - /* (define a Multi_Obj_Evaluator to treat more than */ - /* one objective) */ - /*--------------------------------------------------------*/ - void NOMAD::Evaluator::compute_f ( NOMAD::Eval_Point & x ) const - { - if ( x.get_bb_outputs().size() != _p.get_bb_nb_outputs() ) { - std::ostringstream err; - err << "Evaluator::compute_f(x): x has a wrong number of blackbox outputs (" - << x.get_bb_outputs().size() << " != " - << _p.get_bb_nb_outputs() << ")"; - throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , err.str() ); - } - - x.set_f ( x.get_bb_outputs()[*(_p.get_index_obj().begin())] ); - } - - /*--------------------------------------------------------*/ - /* compute h(x) from the blackbox outputs of a point */ - /* set also the flag 'EB_ok' of the point */ - /*--------------------------------------------------------*/ - void NOMAD::Evaluator::compute_h ( NOMAD::Eval_Point & x ) const - { - if ( x.get_bb_outputs().size() != _p.get_bb_nb_outputs() ) + case NOMAD::L1: + h += bbo[i]; + break; + case NOMAD::L2: + h += bbo[i].pow2(); + break; + case NOMAD::LINF: + if ( bbo[i] > h ) + h = bbo[i]; + break; + } + + if ( _p.get_h_norm() == NOMAD::L2 ) + { + if ( h > h_max.pow2() ) + return true; + } + else if ( h > h_max ) + return true; + } + } + } + return false; +} + +/*--------------------------------------------------------*/ +/* compute f(x) from the blackbox outputs of a point */ +/* (define a Multi_Obj_Evaluator to treat more than */ +/* one objective) */ +/*--------------------------------------------------------*/ +void NOMAD::Evaluator::compute_f ( NOMAD::Eval_Point & x ) const +{ + if ( x.get_bb_outputs().size() != _p.get_bb_nb_outputs() ) + { + std::ostringstream err; + err << "Evaluator::compute_f(x): x has a wrong number of blackbox outputs (" + << x.get_bb_outputs().size() << " != " + << _p.get_bb_nb_outputs() << ")"; + throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , err.str() ); + } + + x.set_f ( x.get_bb_outputs()[*(_p.get_index_obj().begin())] ); +} + +/*--------------------------------------------------------*/ +/* compute h(x) from the blackbox outputs of a point */ +/* set also the flag 'EB_ok' of the point */ +/*--------------------------------------------------------*/ +void NOMAD::Evaluator::compute_h ( NOMAD::Eval_Point & x ) const +{ + if ( x.get_bb_outputs().size() != _p.get_bb_nb_outputs() ) + { + std::ostringstream err; + err << "Evaluator::compute_h(x): x has a wrong number of blackbox outputs (" + << x.get_bb_outputs().size() << " != " + << _p.get_bb_nb_outputs() << ")"; + throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , err.str() ); + } + + int nbo = _p.get_bb_nb_outputs(); + const std::vector<NOMAD::bb_output_type> & bbot = _p.get_bb_output_type(); + const NOMAD::Point & bbo = x.get_bb_outputs(); + NOMAD::Double h = 0.0 , bboi; + + x.set_EB_ok ( true ); + + for ( int i = 0 ; i < nbo ; ++i ) + { + + bboi = bbo[i]; + + if ( bboi.is_defined() && + (bbot[i] == NOMAD::EB || bbot[i] == NOMAD::PEB_E ) && + bboi > _p.get_h_min() ) { - std::ostringstream err; - err << "Evaluator::compute_h(x): x has a wrong number of blackbox outputs (" - << x.get_bb_outputs().size() << " != " - << _p.get_bb_nb_outputs() << ")"; - throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , err.str() ); - } - - int nbo = _p.get_bb_nb_outputs(); - const std::vector<NOMAD::bb_output_type> & bbot = _p.get_bb_output_type(); - const NOMAD::Point & bbo = x.get_bb_outputs(); - NOMAD::Double h = 0.0 , bboi; - - x.set_EB_ok ( true ); - - for ( int i = 0 ; i < nbo ; ++i ) + h.clear(); + x.set_h ( h ); + x.set_EB_ok ( false ); + return; + } + + if ( bboi.is_defined() && + ( bbot[i] == NOMAD::FILTER || + bbot[i] == NOMAD::PB || + bbot[i] == NOMAD::PEB_P ) ) { - - bboi = bbo[i]; - - if ( bboi.is_defined() && - (bbot[i] == NOMAD::EB || bbot[i] == NOMAD::PEB_E ) && - bboi > _p.get_h_min() ) - { - h.clear(); - x.set_h ( h ); - x.set_EB_ok ( false ); - return; - } - - if ( bboi.is_defined() && - ( bbot[i] == NOMAD::FILTER || - bbot[i] == NOMAD::PB || - bbot[i] == NOMAD::PEB_P ) ) + if ( bboi > _p.get_h_min() ) { - if ( bboi > _p.get_h_min() ) - { - switch ( _p.get_h_norm() ) - { - case NOMAD::L1: - h += bboi; - break; - case NOMAD::L2: - h += bboi * bboi; - break; - case NOMAD::LINF: - if ( bboi > h ) - h = bboi; - break; - } - } - } - } - - if ( _p.get_h_norm() == NOMAD::L2 ) - h = h.sqrt(); - - x.set_h ( h ); - } - - /*-------------------------------------------------------------------*/ - /* . evaluate the black boxes at a given Eval_Point */ - /* . the function returns true if the evaluation did not fail */ - /* . set count_eval=true to count the evaluation */ - /* (unless the output value CNT_EVAL is defined and set to 1 */ - /* by the blackbox) */ - /*-------------------------------------------------------------------*/ - bool NOMAD::Evaluator::eval_x ( NOMAD::Eval_Point & x , - const NOMAD::Double & h_max , - bool & count_eval ) const - { - count_eval = false; - - if ( _bb_exe.empty() || !x.is_complete() ) - throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , - "Evaluator: no BB_EXE is defined (blackbox executable names)" ); - - bool sgte = x.get_eval_type() == NOMAD::SGTE; - if ( sgte && _sgte_exe.empty() ) - throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , - "Evaluator: no SGTE_EXE is defined (surrogate executable names)" ); - - int pid = NOMAD::get_pid(); - int seed = _p.get_seed(); - std::string tmp_dir = _p.get_tmp_dir(); - - std::ostringstream oss; - oss << "." << seed; - if ( pid != seed ) - oss << "." << pid; - oss << "." << x.get_tag() << "."; - const std::string & sint = oss.str(); - - // for the parallel version: no need to include the process rank in the names - // as the point tags are unique for all the processes: each process creates - // its own points and uses Eval_Point::set_tag() - - // blackbox input file writing: - // ---------------------------- - std::string bb_input_file_name = - tmp_dir + NOMAD::BLACKBOX_INPUT_FILE_PREFIX - + sint + NOMAD::BLACKBOX_INPUT_FILE_EXT; - - std::string bb_output_file_name = - tmp_dir + NOMAD::BLACKBOX_OUTPUT_FILE_PREFIX - + sint + NOMAD::BLACKBOX_OUTPUT_FILE_EXT; - - std::ofstream fout ( bb_input_file_name.c_str() ); - if ( fout.fail() ) - { - std::string err = "could not create file blackbox input file " + bb_input_file_name + ". \n \n #### Please check that write permission are granted for the working directory. #### "; - throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , err ); - } - - // include seed: - if ( _p.get_bb_input_include_seed() ) - fout << seed << " "; - - // include tag: - if ( _p.get_bb_input_include_tag() ) - fout << x.get_tag() << " "; - - fout.setf ( std::ios::fixed ); - fout.precision ( NOMAD::DISPLAY_PRECISION_BB ); - x.Point::display ( fout , " " , -1 , -1 ); - fout << std::endl; - - fout.close(); - - if ( fout.fail() ) - return false; - - x.set_eval_status ( NOMAD::EVAL_IN_PROGRESS ); - - std::string cmd , bb_exe; - std::ifstream fin; - bool failed; - NOMAD::Double d; - int j , nbbok; - int ibbo = 0; - - // system call to evaluate the blackbox: - // ------------------------------------- - size_t bn = _bb_exe.size(); - for ( size_t k = 0 ; k < bn ; ++k ) - { - - // executable name: - bb_exe = ( sgte ) ? _sgte_exe[k] : _bb_exe[k]; - - // system command: - cmd = bb_exe + " " + bb_input_file_name; - - // redirection ? if no, the blackbox has to create - // the output file 'bb_output_file_name': - if ( _p.get_bb_redirection() ) - cmd += " > " + bb_output_file_name; - + switch ( _p.get_h_norm() ) + { + case NOMAD::L1: + h += bboi; + break; + case NOMAD::L2: + h += bboi * bboi; + break; + case NOMAD::LINF: + if ( bboi > h ) + h = bboi; + break; + } + } + } + } + + if ( _p.get_h_norm() == NOMAD::L2 ) + h = h.sqrt(); + + x.set_h ( h ); +} + +/*-------------------------------------------------------------------*/ +/* . evaluate the black boxes at a given Eval_Point */ +/* . the function returns true if the evaluation did not fail */ +/* . set count_eval=true to count the evaluation */ +/* (unless the output value CNT_EVAL is defined and set to 1 */ +/* by the blackbox) */ +/*-------------------------------------------------------------------*/ +bool NOMAD::Evaluator::eval_x ( NOMAD::Eval_Point & x , + const NOMAD::Double & h_max , + bool & count_eval ) const +{ + count_eval = false; + + if ( _bb_exe.empty() || !x.is_complete() ) + throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , + "Evaluator: no BB_EXE is defined (blackbox executable names)" ); + + bool sgte = x.get_eval_type() == NOMAD::SGTE; + if ( sgte && _sgte_exe.empty() ) + throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , + "Evaluator: no SGTE_EXE is defined (surrogate executable names)" ); + + int pid = NOMAD::get_pid(); + int seed = _p.get_seed(); + std::string tmp_dir = _p.get_tmp_dir(); + + std::ostringstream oss; + oss << "." << seed; + if ( pid != seed ) + oss << "." << pid; + oss << "." << x.get_tag() << "."; + const std::string & sint = oss.str(); + + // for the parallel version: no need to include the process rank in the names + // as the point tags are unique for all the processes: each process creates + // its own points and uses Eval_Point::set_tag() + + // blackbox input file writing: + // ---------------------------- + std::string bb_input_file_name = + tmp_dir + NOMAD::BLACKBOX_INPUT_FILE_PREFIX + + sint + NOMAD::BLACKBOX_INPUT_FILE_EXT; + + std::string bb_output_file_name = + tmp_dir + NOMAD::BLACKBOX_OUTPUT_FILE_PREFIX + + sint + NOMAD::BLACKBOX_OUTPUT_FILE_EXT; + + std::ofstream fout ( bb_input_file_name.c_str() ); + if ( fout.fail() ) + { + std::string err = "could not create file blackbox input file " + bb_input_file_name + ". \n \n #### Please check that write permission are granted for the working directory. #### "; + throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , err ); + } + + // include seed: + if ( _p.get_bb_input_include_seed() ) + fout << seed << " "; + + // include tag: + if ( _p.get_bb_input_include_tag() ) + fout << x.get_tag() << " "; + + fout.setf ( std::ios::fixed ); + fout.precision ( NOMAD::DISPLAY_PRECISION_BB ); + x.Point::display ( fout , " " , -1 , -1 ); + fout << std::endl; + + fout.close(); + + if ( fout.fail() ) + return false; + + x.set_eval_status ( NOMAD::EVAL_IN_PROGRESS ); + + std::string cmd , bb_exe; + std::ifstream fin; + bool failed; + NOMAD::Double d; + int j , nbbok; + int ibbo = 0; + + // system call to evaluate the blackbox: + // ------------------------------------- + size_t bn = _bb_exe.size(); + for ( size_t k = 0 ; k < bn ; ++k ) + { + + // executable name: + bb_exe = ( sgte ) ? _sgte_exe[k] : _bb_exe[k]; + + // system command: + cmd = bb_exe + " " + bb_input_file_name; + + // redirection ? if no, the blackbox has to create + // the output file 'bb_output_file_name': + if ( _p.get_bb_redirection() ) + cmd += " > " + bb_output_file_name; + #ifdef DEBUG #ifdef USE_MPI - int rank; - MPI_Comm_rank ( MPI_COMM_WORLD, &rank); - _p.out() << "command(rank=" << rank - << ") = \'" << cmd << "\'" << std::endl; + int rank; + MPI_Comm_rank ( MPI_COMM_WORLD, &rank); + _p.out() << "command(rank=" << rank + << ") = \'" << cmd << "\'" << std::endl; #else - _p.out() << "command=\'" << cmd << "\'" << std::endl; + _p.out() << "command=\'" << cmd << "\'" << std::endl; #endif #endif - - // the evaluation: - { - int signal = system ( cmd.c_str() ); - - // catch the ctrl-c signal: - if ( signal == SIGINT ) - raise ( SIGINT ); - - // other evaluation error: - failed = ( signal != 0 ); - count_eval = true; - } - - // the evaluation failed (we stop the evaluations): - if ( failed ) - { - x.set_eval_status ( NOMAD::EVAL_FAIL ); - break; - } - - // reading of the blackbox output file: - // ------------------------------------ - else + + // the evaluation: + { + int signal = system ( cmd.c_str() ); + + // catch the ctrl-c signal: + if ( signal == SIGINT ) + raise ( SIGINT ); + + // other evaluation error: + failed = ( signal != 0 ); + count_eval = true; + } + + // the evaluation failed (we stop the evaluations): + if ( failed ) + { + x.set_eval_status ( NOMAD::EVAL_FAIL ); + break; + } + + // reading of the blackbox output file: + // ------------------------------------ + else + { + + // bb-output file reading: + fin.open ( bb_output_file_name.c_str() ); + + failed = false; + bool is_defined = true; + bool is_inf = false; + + // loop on the number of outputs for this blackbox: + nbbok = _bb_nbo[k]; + for ( j = 0 ; j < nbbok ; ++j ) + { + + fin >> d; + + if ( !d.is_defined() ) + { + is_defined = false; + break; + } + + if ( fin.fail() ) + { + failed = true; + break; + } + + if ( d.value() >= NOMAD::INF ) + { + is_inf = true; + break; + } + + x.set_bb_output ( ibbo++ , d ); + } + + fin.close(); + + // the evaluation failed: + if ( failed || !is_defined || is_inf ) + { + x.set_eval_status ( NOMAD::EVAL_FAIL ); + break; + } + + // stop the evaluations if h > h_max or if a 'EB' constraint is violated: + if ( k < _bb_exe.size() - 1 && interrupt_evaluations ( x , h_max ) ) + break; + } + } + + if ( x.get_eval_status() == NOMAD::EVAL_IN_PROGRESS ) + x.set_eval_status ( NOMAD::EVAL_OK ); + + // delete the blackbox input and output files: + // ------------------------------------------- + remove ( bb_input_file_name.c_str () ); + remove ( bb_output_file_name.c_str() ); + + // check the CNT_EVAL output: + // -------------------------- + int index_cnt_eval = _p.get_index_cnt_eval(); + if ( index_cnt_eval >= 0 && x.get_bb_outputs()[index_cnt_eval] == 0.0 ) + count_eval = false; + + return x.is_eval_ok(); + + +} + +/*-------------------------------------------------------------------*/ +/* . evaluate the black boxes at a list of given Eval_Points */ +/*-------------------------------------------------------------------*/ +bool NOMAD::Evaluator::eval_x ( std::list<NOMAD::Eval_Point *> & list_eval, + const NOMAD::Double & h_max , + std::list<bool> & list_count_eval) const +{ + + std::list<NOMAD::Eval_Point *>::iterator it; + std::list<NOMAD::Eval_Point *>::iterator it_begin=list_eval.begin(); + std::list<NOMAD::Eval_Point *>::iterator it_end=list_eval.end(); + std::list<bool>::iterator it_count=list_count_eval.begin(); + + if ( list_eval.size() !=list_count_eval.size()) + throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , + "Evaluator: inconsistent size of list" ); + + if ( _bb_exe.empty()) + throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , + "Evaluator: no BB_EXE is defined (blackbox executable names)" ); + + bool sgte = ((*it_begin)->get_eval_type() == NOMAD::SGTE); + if ( sgte && _sgte_exe.empty() ) + throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , + "Evaluator: no SGTE_EXE is defined (surrogate executable names)" ); + + + + int pid = NOMAD::get_pid(); + int seed = _p.get_seed(); + std::string tmp_dir = _p.get_tmp_dir(); + + std::ostringstream oss; + oss << "." << seed; + if ( pid != seed ) + oss << "." << pid; + + for (it=it_begin;it!=it_end;++it) + { + if (!(*it)->is_complete() ) + throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , + "Evaluator: points provided for evaluations are incomplete " ); + + } + // add the tag of the first point + oss << "." << (*it_begin)->get_tag(); + + oss << "." ; + const std::string & sint = oss.str(); + + // for the parallel version: no need to include the process rank in the names + // as the point tags are unique for all the processes: each process creates + // its own points and uses Eval_Point::set_tag() + + // blackbox input file writing: + // ---------------------------- + std::string bb_input_file_name = + tmp_dir + NOMAD::BLACKBOX_INPUT_FILE_PREFIX + + sint + NOMAD::BLACKBOX_INPUT_FILE_EXT; + + std::string bb_output_file_name = + tmp_dir + NOMAD::BLACKBOX_OUTPUT_FILE_PREFIX + + sint + NOMAD::BLACKBOX_OUTPUT_FILE_EXT; + + std::ofstream fout ( bb_input_file_name.c_str() ); + if ( fout.fail() ) + { + std::string err = "could not create file blackbox input file " + bb_input_file_name + ". \n \n #### Please check that write permission are granted for the working directory. #### "; + throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , err ); + } + + + for (it=it_begin;it!=it_end;++it) + { + // include seed: + if ( _p.get_bb_input_include_seed() ) + fout << seed << " "; + + // include tag: + if ( _p.get_bb_input_include_tag() ) + fout << (*it)->get_tag() << " "; + + fout.setf ( std::ios::fixed ); + fout.precision ( NOMAD::DISPLAY_PRECISION_BB ); + (*it)->Point::display ( fout , " " , -1 , -1 ); + fout << std::endl; + } + + fout.close(); + + if ( fout.fail() ) + return false; + + for (it=it_begin;it!=it_end;++it) + (*it)->set_eval_status ( NOMAD::EVAL_IN_PROGRESS ); + + + std::string cmd , bb_exe; + std::ifstream fin; + bool failed; + NOMAD::Double d; + int j , nbbok; + int ibbo = 0; + + // system call to evaluate the blackboxes: + // ------------------------------------- + size_t bn = _bb_exe.size(); + for ( size_t k = 0 ; k < bn ; ++k ) + { + + // executable name: + bb_exe = ( sgte ) ? _sgte_exe[k] : _bb_exe[k]; + + // system command: + cmd = bb_exe + " " + bb_input_file_name; + + // redirection ? if no, the blackbox has to create + // the output file 'bb_output_file_name': + if ( _p.get_bb_redirection() ) + cmd += " > " + bb_output_file_name; + + + // the evaluation: + { + int signal = system ( cmd.c_str() ); + + // catch the ctrl-c signal: + if ( signal == SIGINT ) + raise ( SIGINT ); + + // other evaluation error: + failed = ( signal != 0 ); + } + + // the evaluation failed (we stop the evaluations): + if ( failed ) + { + it_count=list_count_eval.begin(); + for (it=it_begin;it!=it_end;++it,++it_count) { - - // bb-output file reading: - fin.open ( bb_output_file_name.c_str() ); - - failed = false; - bool is_defined = true; - bool is_inf = false; - - // loop on the number of outputs for this blackbox: - nbbok = _bb_nbo[k]; - for ( j = 0 ; j < nbbok ; ++j ) + (*it)->set_eval_status ( NOMAD::EVAL_FAIL ); + (*it_count)=true; // + } + break; + } + + // reading of the blackbox output file: + // ------------------------------------ + else + { + + // bb-output file reading: + fin.open ( bb_output_file_name.c_str() ); + + string s; + bool is_defined,is_inf; + + bool list_all_failed_eval=true; + bool list_all_interrupt=true; + + // loop on the points + it_count=list_count_eval.begin(); + for (it=it_begin;it!=it_end;++it,++it_count) + { + failed = false; + is_defined = true; + is_inf = false; + + // loop on the number of outputs for this blackbox: + nbbok = _bb_nbo[k]; + ibbo=0; + for ( j = 0 ; j < nbbok ; ++j ) { - - fin >> d; - - if ( !d.is_defined() ) + + fin >> s; + + if ( fin.fail() ) { - is_defined = false; - break; - } - - if ( fin.fail() ) + failed = true; + break; + } + + toupper(s); + if (s.compare("REJECT")==0) { - failed = true; - break; - } - - if ( d.value() >= NOMAD::INF ) + *it_count=false; // Rejected points are not counted + (*it)->set_eval_status(NOMAD::EVAL_USER_REJECT); + break; + } + else { - is_inf = true; - break; - } - - x.set_bb_output ( ibbo++ , d ); - } - - fin.close(); - - // the evaluation failed: - if ( failed || !is_defined || is_inf ) + d.atof(s); + (*it_count)=true; + } + // + + if (s.compare("FAIL")==0) + { + failed = true; + break; + } + + + if ( !d.is_defined() ) + { + is_defined = false; + break; + } + + + if ( d.value() >= NOMAD::INF ) + { + is_inf = true; + break; + } + + (*it)->set_bb_output ( ibbo++ , d ); + } + + + // the evaluation failed: + if ( failed || !is_defined || is_inf ) { - x.set_eval_status ( NOMAD::EVAL_FAIL ); - break; - } - - // stop the evaluations if h > h_max or if a 'EB' constraint is violated: - if ( k < _bb_exe.size() - 1 && interrupt_evaluations ( x , h_max ) ) - break; - } - } - - if ( x.get_eval_status() == NOMAD::EVAL_IN_PROGRESS ) - x.set_eval_status ( NOMAD::EVAL_OK ); - - // delete the blackbox input and output files: - // ------------------------------------------- - remove ( bb_input_file_name.c_str () ); - remove ( bb_output_file_name.c_str() ); - - // check the CNT_EVAL output: - // -------------------------- - int index_cnt_eval = _p.get_index_cnt_eval(); - if ( index_cnt_eval >= 0 && x.get_bb_outputs()[index_cnt_eval] == 0.0 ) - count_eval = false; - - return x.is_eval_ok(); - + (*it)->set_eval_status ( NOMAD::EVAL_FAIL ); + + } + else + list_all_failed_eval=false; - } - - - /*-------------------------------------------------------------------*/ - /* . evaluate the black boxes at a list of given Eval_Points */ - /*-------------------------------------------------------------------*/ - bool NOMAD::Evaluator::eval_x ( std::list<NOMAD::Eval_Point *> & list_eval, - const NOMAD::Double & h_max , - std::list<bool> & list_count_eval) const - { - - std::list<NOMAD::Eval_Point *>::iterator it; - std::list<NOMAD::Eval_Point *>::iterator it_begin=list_eval.begin(); - std::list<NOMAD::Eval_Point *>::iterator it_end=list_eval.end(); - std::list<bool>::iterator it_count=list_count_eval.begin(); - - if ( list_eval.size() !=list_count_eval.size()) - throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , - "Evaluator: inconsistent size of list" ); - - if ( _bb_exe.empty()) - throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , - "Evaluator: no BB_EXE is defined (blackbox executable names)" ); - - bool sgte = ((*it_begin)->get_eval_type() == NOMAD::SGTE); - if ( sgte && _sgte_exe.empty() ) - throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , - "Evaluator: no SGTE_EXE is defined (surrogate executable names)" ); - - - - int pid = NOMAD::get_pid(); - int seed = _p.get_seed(); - std::string tmp_dir = _p.get_tmp_dir(); - - std::ostringstream oss; - oss << "." << seed; - if ( pid != seed ) - oss << "." << pid; - - for (it=it_begin;it!=it_end;++it) - { - if (!(*it)->is_complete() ) - throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , - "Evaluator: points provided for evaluations are incomplete " ); + + // stop the evaluations if h > h_max or if a 'EB' constraint is violated: + if ( !( k < _bb_exe.size() - 1 && interrupt_evaluations ( *(*it) , h_max ) && list_all_interrupt )) + list_all_interrupt=false; + } - } - // add the tag of the first point - oss << "." << (*it_begin)->get_tag(); - - oss << "." ; - const std::string & sint = oss.str(); - - // for the parallel version: no need to include the process rank in the names - // as the point tags are unique for all the processes: each process creates - // its own points and uses Eval_Point::set_tag() - - // blackbox input file writing: - // ---------------------------- - std::string bb_input_file_name = - tmp_dir + NOMAD::BLACKBOX_INPUT_FILE_PREFIX - + sint + NOMAD::BLACKBOX_INPUT_FILE_EXT; - - std::string bb_output_file_name = - tmp_dir + NOMAD::BLACKBOX_OUTPUT_FILE_PREFIX - + sint + NOMAD::BLACKBOX_OUTPUT_FILE_EXT; - - std::ofstream fout ( bb_input_file_name.c_str() ); - if ( fout.fail() ) { - std::string err = "could not create file blackbox input file " + bb_input_file_name + ". \n \n #### Please check that write permission are granted for the working directory. #### "; - throw NOMAD::Exception ( "Evaluator.cpp" , __LINE__ , err ); - } - - - for (it=it_begin;it!=it_end;++it) - { - // include seed: - if ( _p.get_bb_input_include_seed() ) - fout << seed << " "; + fin.close(); - // include tag: - if ( _p.get_bb_input_include_tag() ) - fout << (*it)->get_tag() << " "; - - fout.setf ( std::ios::fixed ); - fout.precision ( NOMAD::DISPLAY_PRECISION_BB ); - (*it)->Point::display ( fout , " " , -1 , -1 ); - fout << std::endl; - } - - fout.close(); - - if ( fout.fail() ) - return false; - - for (it=it_begin;it!=it_end;++it) - (*it)->set_eval_status ( NOMAD::EVAL_IN_PROGRESS ); - - - std::string cmd , bb_exe; - std::ifstream fin; - bool failed; - NOMAD::Double d; - int j , nbbok; - int ibbo = 0; - - // system call to evaluate the blackboxes: - // ------------------------------------- - size_t bn = _bb_exe.size(); - for ( size_t k = 0 ; k < bn ; ++k ) - { - - // executable name: - bb_exe = ( sgte ) ? _sgte_exe[k] : _bb_exe[k]; - - // system command: - cmd = bb_exe + " " + bb_input_file_name; - - // redirection ? if no, the blackbox has to create - // the output file 'bb_output_file_name': - if ( _p.get_bb_redirection() ) - cmd += " > " + bb_output_file_name; - - - // the evaluation: - { - int signal = system ( cmd.c_str() ); - - // catch the ctrl-c signal: - if ( signal == SIGINT ) - raise ( SIGINT ); - - // other evaluation error: - failed = ( signal != 0 ); - } - - // the evaluation failed (we stop the evaluations): - if ( failed ) - { - it_count=list_count_eval.begin(); - for (it=it_begin;it!=it_end;++it,++it_count) - { - (*it)->set_eval_status ( NOMAD::EVAL_FAIL ); - (*it_count)=true; // - } - break; - } - - // reading of the blackbox output file: - // ------------------------------------ - else - { - - // bb-output file reading: - fin.open ( bb_output_file_name.c_str() ); - - string s; - bool is_defined,is_inf; - - bool list_all_failed_eval=true; - bool list_all_interrupt=true; - - // loop on the points - it_count=list_count_eval.begin(); - for (it=it_begin;it!=it_end;++it,++it_count) - { - failed = false; - is_defined = true; - is_inf = false; - - // loop on the number of outputs for this blackbox: - nbbok = _bb_nbo[k]; - ibbo=0; - for ( j = 0 ; j < nbbok ; ++j ) - { - fin >> s; - - if ( fin.fail() ) - { - failed = true; - break; - } - - toupper(s); - if (s.compare("REJECT")==0) - { - *it_count=false; // Rejected points are not counted - (*it)->set_eval_status(NOMAD::EVAL_USER_REJECT); - break; - } - else - { - d.atof(s); - (*it_count)=true; - } - // - - if (s.compare("FAIL")==0) - { - failed = true; - break; - } - - - if ( !d.is_defined() ) - { - is_defined = false; - break; - } - - - if ( d.value() >= NOMAD::INF ) { - is_inf = true; - break; - } - - (*it)->set_bb_output ( ibbo++ , d ); - } - - - // the evaluation failed: - if ( failed || !is_defined || is_inf ) - { - (*it)->set_eval_status ( NOMAD::EVAL_FAIL ); - - } else - list_all_failed_eval=false; - - - // stop the evaluations if h > h_max or if a 'EB' constraint is violated: - if ( !( k < _bb_exe.size() - 1 && interrupt_evaluations ( *(*it) , h_max ) && list_all_interrupt )) - list_all_interrupt=false; - } - - fin.close(); - if (list_all_failed_eval || list_all_interrupt) - break; - - } - } - - - // delete the blackbox input and output files: - // ------------------------------------------- - remove ( bb_input_file_name.c_str () ); - remove ( bb_output_file_name.c_str() ); - - bool at_least_one_eval_ok=false; - int index_cnt_eval = _p.get_index_cnt_eval(); - - - // update eval status and check that at least one was ok - it_count=list_count_eval.begin(); - for (it=it_begin;it!=it_end;++it,++it_count) - { - if ( (*it)->get_eval_status() == NOMAD::EVAL_IN_PROGRESS ) - (*it)->set_eval_status ( NOMAD::EVAL_OK ); - - if (!at_least_one_eval_ok && (*it)->is_eval_ok()) - at_least_one_eval_ok=true; - - // count_eval from bb_outputs: - // -------------------------- - if ( index_cnt_eval >= 0 && (*it)->get_bb_outputs()[index_cnt_eval]==0) - *it_count=false; - } - - return at_least_one_eval_ok; - } + if (list_all_failed_eval || list_all_interrupt) + break; + + } + } + + + // delete the blackbox input and output files: + // ------------------------------------------- + remove ( bb_input_file_name.c_str () ); + remove ( bb_output_file_name.c_str() ); + + bool at_least_one_eval_ok=false; + int index_cnt_eval = _p.get_index_cnt_eval(); + + + // update eval status and check that at least one was ok + it_count=list_count_eval.begin(); + for (it=it_begin;it!=it_end;++it,++it_count) + { + if ( (*it)->get_eval_status() == NOMAD::EVAL_IN_PROGRESS ) + (*it)->set_eval_status ( NOMAD::EVAL_OK ); + + if (!at_least_one_eval_ok && (*it)->is_eval_ok()) + at_least_one_eval_ok=true; + + // count_eval from bb_outputs: + // -------------------------- + if ( index_cnt_eval >= 0 && (*it)->get_bb_outputs()[index_cnt_eval]==0) + *it_count=false; + } + + return at_least_one_eval_ok; +} diff --git a/src/Evaluator.hpp b/src/Evaluator.hpp index 80119df..03d52a8 100644 --- a/src/Evaluator.hpp +++ b/src/Evaluator.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -49,235 +56,237 @@ #include <list> namespace NOMAD { - - // forward declarations: - class Barrier; - class Pareto_Front; - class Evaluator_Control; - - /// Evaluation of blackbox functions. - /** + + // forward declarations: + class Barrier; + class Pareto_Front; + class Evaluator_Control; + + /// Evaluation of blackbox functions. + /** This class allows the evaluation of one trial point. - */ - class Evaluator : private NOMAD::Uncopyable { - - protected: - - /// Parameters. - const NOMAD::Parameters & _p; - - /// Multi-objective flag. - /** - Identifies if a NOMAD::Evaluator object refers to - a NOMAD::Multi_Obj_Evaluator for more than one - objective function. - */ - bool _is_multi_obj; - - /// Model flag. - /** - Identifies if a NOMAD::Evaluator object refers to - a NOMAD::***_Model_Evaluator - */ - bool _is_model_evaluator; - - private: - - /// Blackbox executable names. - /** - - Not the same as Parameters::_bb_exe. - - NOMAD::Evaluator::_bb_exe is constructed from + */ + class Evaluator : private NOMAD::Uncopyable { + + protected: + + /// Parameters. + const NOMAD::Parameters & _p; + + /// Multi-objective flag. + /** + Identifies if a NOMAD::Evaluator object refers to + a NOMAD::Multi_Obj_Evaluator for more than one + objective function. + */ + bool _is_multi_obj; + + /// Model flag. + /** + Identifies if a NOMAD::Evaluator object refers to + a NOMAD::***_Model_Evaluator + */ + bool _is_model_evaluator; + + private: + + /// Blackbox executable names. + /** + - Not the same as Parameters::_bb_exe. + - NOMAD::Evaluator::_bb_exe is constructed from NOMAD::Parameters::_bb_exe. - */ - std::vector<std::string> _bb_exe; - - std::vector<std::string> _sgte_exe; ///< Surrogate executable names. - - /// Number of outputs for each blackbox executable. - std::vector<int> _bb_nbo; - - static bool _force_quit; ///< Flag equal to \c true if ctrl-c is pressed. - - /// Check the constraints to decide if the evaluations have to be stopped. - /** - \param x Point at which the constraints are checked -- \b IN. - \param h_max Maximal feasibility value \c h_max -- \b IN. - \return A boolean equal to \c true if - the evaluations have to be stopped. - */ - bool interrupt_evaluations ( const NOMAD::Eval_Point & x , - const NOMAD::Double & h_max ) const; - - /// Process a blackbox executable name. - /** - \param bb_exe Executable name -- \b IN/OUT. - */ - void process_bb_exe_name ( std::string & bb_exe ) const; - - public: - - /// Constructor. - /** - \param p Parameters -- \b IN. - */ - Evaluator ( const NOMAD::Parameters & p ); - - /// Destructor. - virtual ~Evaluator ( void ) {} - - /// Force quit (called by pressing ctrl-c). - static void force_quit ( void ) + */ + std::vector<std::string> _bb_exe; + + std::vector<std::string> _sgte_exe; ///< Surrogate executable names. + + /// Number of outputs for each blackbox executable. + std::vector<int> _bb_nbo; + + static bool _force_quit; ///< Flag equal to \c true if ctrl-c is pressed. + + /// Check the constraints to decide if the evaluations have to be stopped. + /** + \param x Point at which the constraints are checked -- \b IN. + \param h_max Maximal feasibility value \c h_max -- \b IN. + \return A boolean equal to \c true if + the evaluations have to be stopped. + */ + bool interrupt_evaluations ( const NOMAD::Eval_Point & x , + const NOMAD::Double & h_max ) const; + + /// Process a blackbox executable name. + /** + \param bb_exe Executable name -- \b IN/OUT. + */ + void process_bb_exe_name ( std::string & bb_exe ) const; + + public: + + /// Constructor. + /** + \param p Parameters -- \b IN. + */ + Evaluator ( const NOMAD::Parameters & p ); + + /// Destructor. + virtual ~Evaluator ( void ) {} + + /// Force quit (called by pressing ctrl-c). + static void force_quit ( void ) { NOMAD::Evaluator::_force_quit = true; } - - /// Access to the \c force_quit flag. - /** - \return The \c force_quit flag. - */ - static bool get_force_quit ( void ) + + /// Access to the \c force_quit flag. + /** + \return The \c force_quit flag. + */ + static bool get_force_quit ( void ) { return NOMAD::Evaluator::_force_quit; } - - /// Access to the multi-objective flag. - /** - \return The multi-objective flag. - */ - bool is_multi_obj ( void ) const + + /// Access to the multi-objective flag. + /** + \return The multi-objective flag. + */ + bool is_multi_obj ( void ) const { return _is_multi_obj; } - - /// Access to the model evaluator flag. - /** - \return The model evaluator flag. - */ - virtual bool is_model_evaluator ( void ) const + + /// Access to the model evaluator flag. + /** + \return The model evaluator flag. + */ + virtual bool is_model_evaluator ( void ) const { return _is_model_evaluator; } - - /// User pre-processing of a list of points. - /** - - This virtual method is called before the evaluation of a list + + /// User pre-processing of a list of points. + /** + - This virtual method is called before the evaluation of a list of points. - - It allows the user to pre-process the points to be evaluated. - \param pts The list of points -- \b IN/OUT. - */ - virtual void list_of_points_preprocessing - ( std::set<Priority_Eval_Point> & pts ) const {} - - /// User updates after a success. - /** - This virtual method is called every time a new (full) success is made. - \param stats Stats -- \b IN. - \param x Last successful point -- \b IN. - */ - virtual void update_success ( const NOMAD::Stats & stats , - const NOMAD::Eval_Point & x ) {} - - /// User updates after an iteration. - /** - This virtual method is called every time a MADS iteration is terminated. - \param success Success of the iteration -- \b IN. - \param stats Stats -- \b IN. - \param ev_control The NOMAD::Evaluator_Control object -- \b IN. - \param true_barrier Barrier for true evaluations -- \b IN. - \param sgte_barrier Barrier for surrogate evaluations -- \b IN. - \param pareto_front Pareto front -- \b IN. - \param stop Allows the user to stop the algorithm -- \b OUT. - */ - virtual void update_iteration ( NOMAD::success_type success , - const NOMAD::Stats & stats , - const NOMAD::Evaluator_Control & ev_control , - const NOMAD::Barrier & true_barrier , - const NOMAD::Barrier & sgte_barrier , - const NOMAD::Pareto_Front & pareto_front , - bool & stop ) {} - - /// Evaluate the blackbox functions at a given trial point (#1). - /** - - Const version. - - May be user-defined. - - Surrogate or true evaluation depending on the value of \c x.is_surrogate(). - \param x The trial point -- \b IN/OUT. - \param h_max Maximal feasibility value \c h_max -- \b IN. - \param count_eval Flag indicating if the evaluation has to be counted - or not -- \b OUT. - \return A boolean equal to \c false if the evaluation failed. - */ - virtual bool eval_x ( NOMAD::Eval_Point & x , - const NOMAD::Double & h_max , - bool & count_eval ) const; - - /// Evaluate the blackbox functions at a given trial point (#2). - /** - - Non-const version. - - Calls the const version by default. - - May be user-defined. - - Surrogate or true evaluation depending on the value of \c x.is_surrogate(). - \param x The trial point -- \b IN/OUT. - \param h_max Maximal feasibility value \c h_max -- \b IN. - \param count_eval Flag indicating if the evaluation has to be counted - or not -- \b OUT. - \return A boolean equal to \c false if the evaluation failed. - */ - virtual bool eval_x ( NOMAD::Eval_Point & x , - const NOMAD::Double & h_max , - bool & count_eval ) - { - return static_cast<const Evaluator *>(this)->eval_x ( x , h_max , count_eval ); - } - - - - /// Evaluate the blackbox functions at a given list of trial points (#1). - /** - - Const version. - - May be user-defined. - - Surrogate or true evaluation depending on the value of \c x.is_surrogate(). - \param x The list of trial points -- \b IN/OUT. - \param h_max Maximal feasibility value \c h_max -- \b IN. - \param count_eval Number of evaluations that are counted -- \b OUT. - \return A boolean equal to \c false if the evaluation failed. - */ - virtual bool eval_x ( std::list<NOMAD::Eval_Point *> &x , - const NOMAD::Double & h_max, - std::list<bool> & count_eval ) const; - - - /// Evaluate the blackbox functions at a given list of trial points (#2). - /** - - Non-Const version. - - May be user-defined. - - Surrogate or true evaluation depending on the value of \c x.is_surrogate(). - \param x The list of trial points -- \b IN/OUT. - \param h_max Maximal feasibility value \c h_max -- \b IN. - \param count_eval Number of evaluations that are counted -- \b OUT. - \return A boolean equal to \c false if the evaluation failed. - */ - virtual bool eval_x ( std::list<NOMAD::Eval_Point *> &x , - const NOMAD::Double & h_max, - std::list<bool> & count_eval ) - { - return static_cast<const Evaluator *>(this)->eval_x ( x , h_max , count_eval ); - } - - - - /// Compute the objective value \c f(x) from the blackbox outputs of a point. - /** - \param x The point -- \b IN/OUT. - */ - virtual void compute_f ( NOMAD::Eval_Point & x ) const; - - /// Compute the feasibility value \c h(x) from the blackbox outputs of a point. - /** - \param x The point -- \b IN/OUT. - */ - void compute_h ( NOMAD::Eval_Point & x ) const; - }; + - It allows the user to pre-process the points to be evaluated. + \param pts The list of points -- \b IN/OUT. + */ + virtual void list_of_points_preprocessing + ( std::set<Priority_Eval_Point> & pts ) const {} + + /// User updates after a success. + /** + This virtual method is called every time a new (full) success is made. + \param stats Stats -- \b IN. + \param x Last successful point -- \b IN. + */ + virtual void update_success ( const NOMAD::Stats & stats , + const NOMAD::Eval_Point & x ) {} + + /// User updates after an iteration. + /** + This virtual method is called every time a MADS iteration is terminated. + \param success Success of the iteration -- \b IN. + \param stats Stats -- \b IN. + \param ev_control The NOMAD::Evaluator_Control object -- \b IN. + \param true_barrier Barrier for true evaluations -- \b IN. + \param sgte_barrier Barrier for surrogate evaluations -- \b IN. + \param pareto_front Pareto front -- \b IN. + \param stop Allows the user to stop the algorithm -- \b OUT. + */ + virtual void update_iteration ( NOMAD::success_type success , + const NOMAD::Stats & stats , + const NOMAD::Evaluator_Control & ev_control , + const NOMAD::Barrier & true_barrier , + const NOMAD::Barrier & sgte_barrier , + const NOMAD::Pareto_Front & pareto_front , + bool & stop ) {} + + /// Evaluate the blackbox functions at a given trial point (#1). + /** + - Const version. + - May be user-defined. + - Surrogate or true evaluation depending on the value of \c x.is_surrogate(). + \param x The trial point -- \b IN/OUT. + \param h_max Maximal feasibility value \c h_max -- \b IN. + \param count_eval Flag indicating if the evaluation has to be counted + or not -- \b OUT. + \return A boolean equal to \c false if the evaluation failed. + */ + virtual bool eval_x ( NOMAD::Eval_Point & x , + const NOMAD::Double & h_max , + bool & count_eval ) const; + + /// Evaluate the blackbox functions at a given trial point (#2). + /** + - Non-const version. + - Calls the const version by default. + - May be user-defined. + - Surrogate or true evaluation depending on the value of \c x.is_surrogate(). + \param x The trial point -- \b IN/OUT. + \param h_max Maximal feasibility value \c h_max -- \b IN. + \param count_eval Flag indicating if the evaluation has to be counted + or not -- \b OUT. + \return A boolean equal to \c false if the evaluation failed. + */ + virtual bool eval_x ( NOMAD::Eval_Point & x , + const NOMAD::Double & h_max , + bool & count_eval ) + { + + return static_cast<const Evaluator *>(this)->eval_x ( x , h_max , count_eval ); + + } + + + + /// Evaluate the blackbox functions at a given list of trial points (#1). + /** + - Const version. + - May be user-defined. + - Surrogate or true evaluation depending on the value of \c x.is_surrogate(). + \param x The list of trial points -- \b IN/OUT. + \param h_max Maximal feasibility value \c h_max -- \b IN. + \param count_eval Number of evaluations that are counted -- \b OUT. + \return A boolean equal to \c false if the evaluation failed. + */ + virtual bool eval_x ( std::list<NOMAD::Eval_Point *> &x , + const NOMAD::Double & h_max, + std::list<bool> & count_eval ) const; + + + /// Evaluate the blackbox functions at a given list of trial points (#2). + /** + - Non-Const version. + - May be user-defined. + - Surrogate or true evaluation depending on the value of \c x.is_surrogate(). + \param x The list of trial points -- \b IN/OUT. + \param h_max Maximal feasibility value \c h_max -- \b IN. + \param count_eval Number of evaluations that are counted -- \b OUT. + \return A boolean equal to \c false if the evaluation failed. + */ + virtual bool eval_x ( std::list<NOMAD::Eval_Point *> &x , + const NOMAD::Double & h_max, + std::list<bool> & count_eval ) + { + return static_cast<const Evaluator *>(this)->eval_x ( x , h_max , count_eval ); + } + + + + /// Compute the objective value \c f(x) from the blackbox outputs of a point. + /** + \param x The point -- \b IN/OUT. + */ + virtual void compute_f ( NOMAD::Eval_Point & x ) const; + + /// Compute the feasibility value \c h(x) from the blackbox outputs of a point. + /** + \param x The point -- \b IN/OUT. + */ + void compute_h ( NOMAD::Eval_Point & x ) const; + }; } #endif diff --git a/src/Evaluator_Control.cpp b/src/Evaluator_Control.cpp index 77b5c10..d0873d0 100644 --- a/src/Evaluator_Control.cpp +++ b/src/Evaluator_Control.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Evaluator_Control.cpp - \brief Control of the blackbox evaluations (implementation) - \author Sebastien Le Digabel - \date 2010-04-15 - \see Evaluator_Control.hpp -*/ + \file Evaluator_Control.cpp + \brief Control of the blackbox evaluations (implementation) + \author Sebastien Le Digabel + \date 2010-04-15 + \see Evaluator_Control.hpp + */ #include "Evaluator_Control.hpp" #include "Multi_Obj_Quad_Model_Evaluator.hpp" #include "Single_Obj_Quad_Model_Evaluator.hpp" @@ -54,125 +61,129 @@ bool NOMAD::Evaluator_Control::_force_evaluation_failure = false; /*---------------------------------------------------------*/ /* constructor */ /*---------------------------------------------------------*/ -NOMAD::Evaluator_Control::Evaluator_Control -( const NOMAD::Parameters & p , - NOMAD::Stats & stats , - NOMAD::Evaluator * ev , // can be NULL - NOMAD::Cache * cache , // can be NULL - NOMAD::Cache * sgte_cache ) // can be NULL - : _p ( p ) , - _ev ( ev ) , - _cache ( cache ) , - _sgte_cache ( sgte_cache ) , - _model_eval_sort ( true ) , - _del_ev ( false ) , - _del_cache ( false ) , - _del_sgte_cache ( false ) , +NOMAD::Evaluator_Control::Evaluator_Control ( const NOMAD::Parameters & p , + NOMAD::Stats & stats , + NOMAD::Evaluator * ev , // can be NULL + NOMAD::Cache * cache , // can be NULL + NOMAD::Cache * sgte_cache ) // can be NULL +: _p ( p ) , +_ev ( ev ) , +_cache ( cache ) , +_sgte_cache ( sgte_cache ) , +_model_eval_sort ( true ) , +_del_ev ( false ) , +_del_cache ( false ) , +_del_sgte_cache ( false ) , #ifdef USE_MPI - _eval_in_progress ( NULL ) , - _nb_in_progress ( 0 ) , - _elop_tag ( 0 ) , - _slaves_elop_tags ( NULL ) , - _slave ( NULL ) , -#endif -#ifdef USE_TGP - _last_TGP_model ( NULL ) , +_eval_in_progress ( NULL ) , +_nb_in_progress ( 0 ) , +_elop_tag ( 0 ) , +_slaves_elop_tags ( NULL ) , +_slave ( NULL ) , #endif - _stats ( stats ) , - _last_stats_tag ( -1 ) , - _last_stats_bbe ( -1 ) , - _last_history_bbe ( -1 ) +_stats ( stats ) , +_last_stats_tag ( -1 ) , +_last_stats_bbe ( -1 ) , +_last_history_bbe ( -1 ) { - NOMAD::Evaluator_Control::_force_quit = false; - - // Evaluator init: - if ( !_ev ) { - _ev = ( _p.get_index_obj().size() > 1 ) ? new NOMAD::Multi_Obj_Evaluator ( p ): - new NOMAD::Evaluator ( p ); - _del_ev = true; - } - - if ( NOMAD::Slave::is_master() ) { - -#ifdef USE_MPI - - int np = NOMAD::Slave::get_nb_processes(); - - _eval_in_progress = new NOMAD::Eval_Point * [np]; - _slaves_elop_tags = new int [np]; - for ( int i = 0 ; i < np ; ++i ) { - _eval_in_progress[i] = NULL; - _slaves_elop_tags[i] = -1; - } - - _slave = new NOMAD::Slave ( _p , _ev ); - -#endif - - const NOMAD::Display & out = _p.out(); - - // caches creation: - if ( !_cache ) { - _cache = new NOMAD::Cache ( out , NOMAD::TRUTH ); - _del_cache = true; - } - if ( !_sgte_cache ) { - _sgte_cache = new NOMAD::Cache ( out , NOMAD::SGTE ); - _del_sgte_cache = true; - } - - // caches init (we only load cache file points with m blackbox outputs): - std::string file_name; - int m = p.get_bb_nb_outputs(); - NOMAD::dd_type display_degree = out.get_gen_dd(); + NOMAD::Evaluator_Control::_force_quit = false; - if ( !_p.get_cache_file().empty() ) { - file_name = _p.get_problem_dir() + _p.get_cache_file(); - if ( !_cache->load ( file_name , &m , display_degree == NOMAD::FULL_DISPLAY ) - && display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) - out << std::endl - << "Warning (" << "Evaluator_Control.cpp" << ", " << __LINE__ - << "): could not load (or create) the cache file " << file_name - << std::endl << std::endl; + // Evaluator init: + if ( !_ev ) + { + _ev = ( _p.get_index_obj().size() > 1 ) ? new NOMAD::Multi_Obj_Evaluator ( p ): + new NOMAD::Evaluator ( p ); + _del_ev = true; } - if ( !_p.get_sgte_cache_file().empty() ) { - file_name = _p.get_problem_dir() + _p.get_sgte_cache_file(); - if ( !_sgte_cache->load ( file_name , &m , display_degree==NOMAD::FULL_DISPLAY ) && - display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY ) - out << std::endl << "Warning (" << "Evaluator_Control.cpp" << ", " << __LINE__ - << "): could not load (or create) the surrogate cache file " - << file_name << std::endl << std::endl; - } - + if ( NOMAD::Slave::is_master() ) + { + +#ifdef USE_MPI + + int np = NOMAD::Slave::get_nb_processes(); + + _eval_in_progress = new NOMAD::Eval_Point * [np]; + _slaves_elop_tags = new int [np]; + for ( int i = 0 ; i < np ; ++i ) + { + _eval_in_progress[i] = NULL; + _slaves_elop_tags[i] = -1; + } + + _slave = new NOMAD::Slave ( _p , _ev ); + +#endif + + const NOMAD::Display & out = _p.out(); + + // caches creation: + if ( !_cache ) + { + _cache = new NOMAD::Cache ( out , NOMAD::TRUTH ); + _del_cache = true; + } + if ( !_sgte_cache ) + { + _sgte_cache = new NOMAD::Cache ( out , NOMAD::SGTE ); + _del_sgte_cache = true; + } + + // caches init (we only load cache file points with m blackbox outputs): + std::string file_name; + int m = p.get_bb_nb_outputs(); + NOMAD::dd_type display_degree = out.get_gen_dd(); + + if ( !_p.get_cache_file().empty() ) + { + file_name = _p.get_problem_dir() + _p.get_cache_file(); + if ( !_cache->load ( file_name , &m , display_degree == NOMAD::FULL_DISPLAY ) + && display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) + out << std::endl + << "Warning (" << "Evaluator_Control.cpp" << ", " << __LINE__ + << "): could not load (or create) the cache file " << file_name + << std::endl << std::endl; + } + + if ( !_p.get_sgte_cache_file().empty() ) + { + file_name = _p.get_problem_dir() + _p.get_sgte_cache_file(); + if ( !_sgte_cache->load ( file_name , &m , display_degree==NOMAD::FULL_DISPLAY ) && + display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY ) + out << std::endl << "Warning (" << "Evaluator_Control.cpp" << ", " << __LINE__ + << "): could not load (or create) the surrogate cache file " + << file_name << std::endl << std::endl; + } + #ifdef MODEL_STATS - if ( _p.has_model_search() || - ( _model_eval_sort && - _p.get_model_eval_sort() != NOMAD::NO_MODEL ) ) { - out << std::endl - << "MODEL_STATS is active. Displayed model stats are:" - << std::endl - << "mode ell nY wY cond"; - if ( _p.has_constraints() ) - out << " h mh eh"; - out << " f mf ef" << std::endl - << NOMAD::open_block() - << "mode: model search (1) or model ordering (2)" << std::endl - << "ell : mesh_index" << std::endl - << "nY : cardinality of the interpolation set Y" << std::endl - << "wY : width of Y" << std::endl - << "cond: Y condition number" << std::endl; - if ( _p.has_constraints() ) - out << "h : h value" << std::endl - << "mh : model value for h" << std::endl - << "eh : relative error(%)" << std::endl; - out << "f : f value" << std::endl - << "mf : model value for f" << std::endl - << "ef : relative error(%)" << std::endl - << NOMAD::close_block() << std::endl; - } + if ( _p.has_model_search() || + ( _model_eval_sort && + _p.get_model_eval_sort() != NOMAD::NO_MODEL ) ) + { + out << std::endl + << "MODEL_STATS is active. Displayed model stats are:" + << std::endl + << "mode ell nY wY cond"; + if ( _p.has_constraints() ) + out << " h mh eh"; + out << " f mf ef" << std::endl + << NOMAD::open_block() + << "mode: model search (1) or model ordering (2)" << std::endl + << "ell : mesh_index" << std::endl + << "nY : cardinality of the interpolation set Y" << std::endl + << "wY : width of Y" << std::endl + << "cond: Y condition number" << std::endl; + if ( _p.has_constraints() ) + out << "h : h value" << std::endl + << "mh : model value for h" << std::endl + << "eh : relative error(%)" << std::endl; + out << "f : f value" << std::endl + << "mf : model value for f" << std::endl + << "ef : relative error(%)" << std::endl + << NOMAD::close_block() << std::endl; + } #endif - } + } } /*---------------------------------------------------------*/ @@ -180,31 +191,32 @@ NOMAD::Evaluator_Control::Evaluator_Control /*---------------------------------------------------------*/ NOMAD::Evaluator_Control::~Evaluator_Control ( void ) { - if ( _del_ev ) - delete _ev; - - if ( _del_cache ) - delete _cache; - - if ( _del_sgte_cache ) - delete _sgte_cache; - - clear_eval_lop(); - + if ( _del_ev ) + delete _ev; + + if ( _del_cache ) + delete _cache; + + if ( _del_sgte_cache ) + delete _sgte_cache; + + clear_eval_lop(); + #ifdef USE_MPI - - if ( _eval_in_progress ) { - int np = NOMAD::Slave::get_nb_processes(); - for ( int i = 0 ; i < np ; ++i ) - if ( _eval_in_progress[i] && !_eval_in_progress[i]->is_in_cache() ) - delete _eval_in_progress[i]; - delete [] _eval_in_progress; - } - if ( _slaves_elop_tags ) - delete [] _slaves_elop_tags; - - delete _slave; - + + if ( _eval_in_progress ) + { + int np = NOMAD::Slave::get_nb_processes(); + for ( int i = 0 ; i < np ; ++i ) + if ( _eval_in_progress[i] && !_eval_in_progress[i]->is_in_cache() ) + delete _eval_in_progress[i]; + delete [] _eval_in_progress; + } + if ( _slaves_elop_tags ) + delete [] _slaves_elop_tags; + + delete _slave; + #endif } @@ -213,10 +225,7 @@ NOMAD::Evaluator_Control::~Evaluator_Control ( void ) /*---------------------------------------------------------*/ void NOMAD::Evaluator_Control::reset ( void ) { - _last_stats_tag = _last_stats_bbe = -1; -#ifdef USE_TGP - _last_TGP_model = NULL; -#endif + _last_stats_tag = _last_stats_bbe = -1; } /*---------------------------------------------------------*/ @@ -224,112 +233,110 @@ void NOMAD::Evaluator_Control::reset ( void ) /*---------------------------------------------------------*/ bool NOMAD::Evaluator_Control::save_caches ( bool overwrite ) { - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_gen_dd(); - - bool b1 = _cache->save ( overwrite , display_degree == NOMAD::FULL_DISPLAY ); - bool b2 = _sgte_cache->save ( overwrite , display_degree == NOMAD::FULL_DISPLAY ); - - if ( !b1 && display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) - out << std::endl << "Warning (" << "Evaluator_Control.cpp" << ", " << __LINE__ - << "): could not save the cache file " - << _p.get_problem_dir() << _p.get_cache_file() - << std::endl << std::endl; - - if ( !b2 && display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) - out << std::endl - << "Warning (" << "Evaluator_Control.cpp" << ", " << __LINE__ - << "): could not save the surrogate cache file " - << _p.get_problem_dir() << _p.get_sgte_cache_file() - << std::endl << std::endl; - return b1 && b2; + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_gen_dd(); + + bool b1 = _cache->save ( overwrite , display_degree == NOMAD::FULL_DISPLAY ); + bool b2 = _sgte_cache->save ( overwrite , display_degree == NOMAD::FULL_DISPLAY ); + + if ( !b1 && display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) + out << std::endl << "Warning (" << "Evaluator_Control.cpp" << ", " << __LINE__ + << "): could not save the cache file " + << _p.get_problem_dir() << _p.get_cache_file() + << std::endl << std::endl; + + if ( !b2 && display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) + out << std::endl + << "Warning (" << "Evaluator_Control.cpp" << ", " << __LINE__ + << "): could not save the surrogate cache file " + << _p.get_problem_dir() << _p.get_sgte_cache_file() + << std::endl << std::endl; + return b1 && b2; } /*---------------------------------------------------------*/ /* process an already evaluated Eval_Point (private) */ /*---------------------------------------------------------*/ -void NOMAD::Evaluator_Control::process_eval_point -( const NOMAD::Eval_Point & x , - NOMAD::Barrier & barrier , - NOMAD::Pareto_Front * pareto_front ) const +void NOMAD::Evaluator_Control::process_eval_point ( const NOMAD::Eval_Point & x , + NOMAD::Barrier & barrier , + NOMAD::Pareto_Front * pareto_front ) const { - // insertion of the Eval_Point in the barriers: - barrier.insert(x); - - if ( x.get_eval_type() == NOMAD::TRUTH || _p.get_opt_only_sgte() ) - { - - // multi-objective: - if ( pareto_front ) - { - - // insertion of the Eval_Point in the Pareto front: - if ( x.is_feasible ( _p.get_h_min() ) && - pareto_front->insert ( x ) && - _p.get_user_calls_enabled() ) - _ev->update_success ( _stats , x ); - + // insertion of the Eval_Point in the barriers: + barrier.insert(x); + + if ( x.get_eval_type() == NOMAD::TRUTH || _p.get_opt_only_sgte() ) + { + + // multi-objective: + if ( pareto_front ) + { + + // insertion of the Eval_Point in the Pareto front: + if ( x.is_feasible ( _p.get_h_min() ) && + pareto_front->insert ( x ) && + _p.get_user_calls_enabled() ) + _ev->update_success ( _stats , x ); + + } + + // single-objective: call virtual method Evaluator::update_success(): + else if ( _p.get_user_calls_enabled() && + barrier.get_one_eval_succ() == NOMAD::FULL_SUCCESS ) + _ev->update_success ( _stats , x ); } - - // single-objective: call virtual method Evaluator::update_success(): - else if ( _p.get_user_calls_enabled() && - barrier.get_one_eval_succ() == NOMAD::FULL_SUCCESS ) - _ev->update_success ( _stats , x ); - } } /*---------------------------------------------------------*/ /* update barrier b1 from points in barrier b2 and treat */ /* these points as evaluations (used in VNS search) */ /*---------------------------------------------------------*/ -NOMAD::success_type NOMAD::Evaluator_Control::process_barrier_points -( NOMAD::Barrier & b1 , - const NOMAD::Barrier & b2 , - NOMAD::Pareto_Front * pareto_front , - NOMAD::dd_type display_degree , - NOMAD::search_type search ) const +NOMAD::success_type NOMAD::Evaluator_Control::process_barrier_points ( NOMAD::Barrier & b1 , + const NOMAD::Barrier & b2 , + NOMAD::Pareto_Front * pareto_front , + NOMAD::dd_type display_degree , + NOMAD::search_type search ) const { - b1.reset_success(); - - NOMAD::Eval_Point * modifiable_x; - NOMAD::success_type one_eval_succ; - const NOMAD::Eval_Point * last_success = NULL; - const std::list<const NOMAD::Eval_Point *> & all_inserted = b2.get_all_inserted(); - std::list<const NOMAD::Eval_Point *>::const_iterator it , end = all_inserted.end(); - for ( it = all_inserted.begin() ; it != end ; ++it ) - { - - // insertion in barrier: - modifiable_x = &NOMAD::Cache::get_modifiable_point ( **it ); - - modifiable_x->set_direction ( NULL ); - modifiable_x->set_poll_center_type ( NOMAD::UNDEFINED_POLL_CENTER_TYPE ); - modifiable_x->set_user_eval_priority ( NOMAD::Double() ); - modifiable_x->set_rand_eval_priority ( NOMAD::Double() ); - - // process evaluation point: - process_eval_point ( **it , b1 , pareto_front ); - - one_eval_succ = b1.get_one_eval_succ(); - if ( one_eval_succ != NOMAD::UNSUCCESSFUL && one_eval_succ >= b1.get_success() ) - last_success = *it; - - } - - NOMAD::success_type success = b1.get_success(); - - // display and save only the last success: - if ( last_success && display_degree == NOMAD::FULL_DISPLAY) - display_eval_result ( *last_success , - display_degree , - search , - success , - success ); - - // barrier update: - b1.update_and_reset_success(); - - return success; + b1.reset_success(); + + NOMAD::Eval_Point * modifiable_x; + NOMAD::success_type one_eval_succ; + const NOMAD::Eval_Point * last_success = NULL; + const std::list<const NOMAD::Eval_Point *> & all_inserted = b2.get_all_inserted(); + std::list<const NOMAD::Eval_Point *>::const_iterator it , end = all_inserted.end(); + for ( it = all_inserted.begin() ; it != end ; ++it ) + { + + // insertion in barrier: + modifiable_x = &NOMAD::Cache::get_modifiable_point ( **it ); + + modifiable_x->set_direction ( NULL ); + modifiable_x->set_poll_center_type ( NOMAD::UNDEFINED_POLL_CENTER_TYPE ); + modifiable_x->set_user_eval_priority ( NOMAD::Double() ); + modifiable_x->set_rand_eval_priority ( NOMAD::Double() ); + + // process evaluation point: + process_eval_point ( **it , b1 , pareto_front ); + + one_eval_succ = b1.get_one_eval_succ(); + if ( one_eval_succ != NOMAD::UNSUCCESSFUL && one_eval_succ >= b1.get_success() ) + last_success = *it; + + } + + NOMAD::success_type success = b1.get_success(); + + // display and save only the last success: + if ( last_success && display_degree == NOMAD::FULL_DISPLAY) + display_eval_result ( *last_success , + display_degree , + search , + success , + success ); + + // barrier update: + b1.update_and_reset_success(); + + return success; } /*---------------------------------------------------------*/ @@ -338,425 +345,423 @@ NOMAD::success_type NOMAD::Evaluator_Control::process_barrier_points /*---------------------------------------------------------*/ void NOMAD::Evaluator_Control::count_output_stats ( const NOMAD::Eval_Point & x ) { - const NOMAD::Point & bbo = x.get_bb_outputs(); - int i_sum = _p.get_index_stat_sum(); - int i_avg = _p.get_index_stat_avg(); - - // STAT_SUM: - if ( i_sum >= 0 ) - _stats.update_stat_sum ( bbo[i_sum] ); - - // STAT_AVG: - if ( i_avg >= 0 ) - _stats.update_stat_avg ( bbo[i_avg] ); + const NOMAD::Point & bbo = x.get_bb_outputs(); + int i_sum = _p.get_index_stat_sum(); + int i_avg = _p.get_index_stat_avg(); + + // STAT_SUM: + if ( i_sum >= 0 ) + _stats.update_stat_sum ( bbo[i_sum] ); + + // STAT_AVG: + if ( i_avg >= 0 ) + _stats.update_stat_avg ( bbo[i_avg] ); } /*-------------------------------------------------------------------*/ /* file displays for parameter STATS_FILE */ /*-------------------------------------------------------------------*/ void NOMAD::Evaluator_Control::stats_file ( const std::string & file_name , - const NOMAD::Eval_Point * x , - bool feasible , - const NOMAD::Point * multi_obj ) const + const NOMAD::Eval_Point * x , + bool feasible , + const NOMAD::Point * multi_obj ) const { - std::string fn = _p.get_problem_dir() + file_name; - std::ofstream fout ( fn.c_str() , std::ios::app ); - - if ( !fout.fail() ) - { - fout.setf ( std::ios::fixed ); - fout.precision ( NOMAD::DISPLAY_PRECISION_BB ); - display_stats ( false , fout , _p.get_stats_file() , x , feasible , multi_obj ); - } - else - { - const NOMAD::Display & out = _p.out(); - if ( out.get_gen_dd() != NOMAD::NO_DISPLAY && out.get_gen_dd() != NOMAD::MINIMAL_DISPLAY) - out << std::endl - << "Warning (" << "Evaluator_Control.cpp" << ", " << __LINE__ - << "): could not save information in stats file \'" - << file_name << "\'" << std::endl << std::endl; - } - fout.close(); + std::string fn = _p.get_problem_dir() + file_name; + std::ofstream fout ( fn.c_str() , std::ios::app ); + + if ( !fout.fail() ) + { + fout.setf ( std::ios::fixed ); + fout.precision ( NOMAD::DISPLAY_PRECISION_BB ); + display_stats ( false , fout , _p.get_stats_file() , x , feasible , multi_obj ); + } + else + { + const NOMAD::Display & out = _p.out(); + if ( out.get_gen_dd() != NOMAD::NO_DISPLAY && out.get_gen_dd() != NOMAD::MINIMAL_DISPLAY) + out << std::endl + << "Warning (" << "Evaluator_Control.cpp" << ", " << __LINE__ + << "): could not save information in stats file \'" + << file_name << "\'" << std::endl << std::endl; + } + fout.close(); } /*-------------------------------------------------------------------*/ /* display stats during Mads::run() for minimal and normal display */ /*-------------------------------------------------------------------*/ -void NOMAD::Evaluator_Control::display_stats -( bool header , - const NOMAD::Display & out , - const std::list<std::string> & stats , - const NOMAD::Eval_Point * x , - bool feasible , - const NOMAD::Point * multi_obj ) const +void NOMAD::Evaluator_Control::display_stats ( bool header , + const NOMAD::Display & out , + const std::list<std::string> & stats , + const NOMAD::Eval_Point * x , + bool feasible , + const NOMAD::Point * multi_obj ) const { - if ( stats.empty() ) - { + if ( stats.empty() ) + { #ifndef R_VERSION - out << std::endl; + out << std::endl; #endif - return; - } - - if ( header ) - { + return; + } + + if ( header ) + { #ifndef R_VERSION - out << std::endl; + out << std::endl; #endif - } - - NOMAD::Double f; - const NOMAD::Point * sol = NULL; - const NOMAD::Point * bbo = NULL; - const NOMAD::Signature * signature = NULL; - int bbe = _stats.get_bb_eval(); - int real_time = _stats.get_real_time(); - int blk_bbe = _stats.get_block_eval(); - int i; - - // this integer is used for the default width display - // of the various stats on the number of evaluations: - int max_bbe = _p.get_max_bb_eval(); - if ( _p.get_max_sgte_eval() > max_bbe ) - max_bbe = _p.get_max_sgte_eval(); - if ( _p.get_max_sim_bb_eval() > max_bbe ) - max_bbe = _p.get_max_sim_bb_eval(); - if ( _p.get_max_eval() > max_bbe ) - max_bbe = _p.get_max_eval(); - - if ( x ) - { - signature = x->get_signature(); - f = (feasible) ? x->get_f() : NOMAD::INF; - sol = x; - bbo = &(x->get_bb_outputs()); - - if (bbe < _last_stats_bbe && ! multi_obj) - return; - - _last_stats_tag = x->get_tag(); - _last_stats_bbe = bbe; - } - - - - std::string s1 , format; - std::list<std::string>::const_iterator it , end = stats.end(); - for ( it = stats.begin() ; it != end ; ++it ) - { - - if ( it->empty() ) - { + } + + NOMAD::Double f; + const NOMAD::Point * sol = NULL; + const NOMAD::Point * bbo = NULL; + const NOMAD::Signature * signature = NULL; + int bbe = _stats.get_bb_eval(); + int real_time = _stats.get_real_time(); + int blk_bbe = _stats.get_block_eval(); + int i; + + // this integer is used for the default width display + // of the various stats on the number of evaluations: + int max_bbe = _p.get_max_bb_eval(); + if ( _p.get_max_sgte_eval() > max_bbe ) + max_bbe = _p.get_max_sgte_eval(); + if ( _p.get_max_sim_bb_eval() > max_bbe ) + max_bbe = _p.get_max_sim_bb_eval(); + if ( _p.get_max_eval() > max_bbe ) + max_bbe = _p.get_max_eval(); + + if ( x ) + { + signature = x->get_signature(); + f = (feasible) ? x->get_f() : NOMAD::INF; + sol = x; + bbo = &(x->get_bb_outputs()); + + if (bbe < _last_stats_bbe && ! multi_obj) + return; + + _last_stats_tag = x->get_tag(); + _last_stats_bbe = bbe; + } + + + std::string s1 , format; + std::list<std::string>::const_iterator it , end = stats.end(); + for ( it = stats.begin() ; it != end ; ++it ) + { + + if ( it->empty() ) + { #ifndef R_VERSION - out << "\t"; + out << "\t"; #endif - } - else { - - if ( header ) - { + } + else + { + + + if ( header ) + { #ifndef R_VERSION - s1 = *it; - NOMAD::Display::extract_display_format ( s1 , format ); - out << s1; + s1 = *it; + NOMAD::Display::extract_display_format ( s1 , format ); + out << s1; #endif - } - - else - { - - // get the stats type: - NOMAD::display_stats_type dst - = NOMAD::Display::get_display_stats_type ( *it ); - - // some stats types are disables in the multi-objective case: - if ( multi_obj && - ( dst == NOMAD::DS_SIM_BBE || - dst == NOMAD::DS_BBE || - dst == NOMAD::DS_SGTE || - dst == NOMAD::DS_EVAL || - dst == NOMAD::DS_TIME || - dst == NOMAD::DS_STAT_SUM || - dst == NOMAD::DS_STAT_AVG ) ) - dst = NOMAD::DS_UNDEFINED; - - // display the stats: - switch ( dst ) + } + + else + { + + // get the stats type: + NOMAD::display_stats_type dst + = NOMAD::Display::get_display_stats_type ( *it ); + + // some stats types are disables in the multi-objective case: + if ( multi_obj && + ( dst == NOMAD::DS_SIM_BBE || + dst == NOMAD::DS_BBE || + dst == NOMAD::DS_SGTE || + dst == NOMAD::DS_EVAL || + dst == NOMAD::DS_TIME || + dst == NOMAD::DS_STAT_SUM || + dst == NOMAD::DS_STAT_AVG ) ) + dst = NOMAD::DS_UNDEFINED; + + // display the stats: + switch ( dst ) { - case NOMAD::DS_UNDEFINED: - s1 = *it; - NOMAD::Display::extract_display_format ( s1 , format ); - out << s1; - break; - case NOMAD::DS_OBJ: - if ( multi_obj ) - display_stats_point ( out , stats , it , multi_obj ); - else + case NOMAD::DS_UNDEFINED: + s1 = *it; + NOMAD::Display::extract_display_format ( s1 , format ); + out << s1; + break; + case NOMAD::DS_OBJ: + if ( multi_obj ) + display_stats_point ( out , stats , it , multi_obj ); + else { #ifdef R_VERSION - { - std::ostringstream oss; - display_stats_real ( oss , f , format ); - Rprintf ( "%s" , oss.str().c_str() ); - } + { + std::ostringstream oss; + display_stats_real ( oss , f , format ); + Rprintf ( "%s" , oss.str().c_str() ); + } #else - display_stats_real ( out , f , format ); + display_stats_real ( out , f , format ); #endif - format.clear(); - } - break; - case NOMAD::DS_MESH_INDEX: - { - if ( signature ) - { - NOMAD::Point mesh_indices=signature->get_mesh()->get_mesh_indices(); - display_stats_point ( out , stats , it , &mesh_indices ); - } - else - out << "-"; - - - break; - } - case NOMAD::DS_DELTA_M: - case NOMAD::DS_MESH_SIZE: - { - if ( signature ) - { - NOMAD::Point delta; - signature->get_mesh()->get_delta ( delta ); - display_stats_point ( out , stats , it , &delta ); - } - else - out << "-"; - } - break; - case NOMAD::DS_DELTA_P: - case NOMAD::DS_POLL_SIZE: - { - if ( signature ) - { - NOMAD::Point Delta; - signature->get_mesh()->get_Delta ( Delta ); - display_stats_point ( out , stats , it , &Delta ); - - } - else - out << "-"; - } - break; - case NOMAD::DS_SIM_BBE: - display_stats_int ( out , _stats.get_sim_bb_eval() , max_bbe , format ); - format.clear(); - break; - case NOMAD::DS_BBE: - + format.clear(); + } + break; + case NOMAD::DS_MESH_INDEX: + { + + if ( signature ) + { + NOMAD::Point mesh_indices=signature->get_mesh()->get_mesh_indices(); + display_stats_point ( out , stats , it , &mesh_indices ); + } + else + out << "-"; + + + break; + } + case NOMAD::DS_DELTA_M: + case NOMAD::DS_MESH_SIZE: + { + if ( signature ) + { + NOMAD::Point delta; + signature->get_mesh()->get_delta ( delta ); + display_stats_point ( out , stats , it , &delta ); + } + else + out << "-"; + } + break; + case NOMAD::DS_DELTA_P: + case NOMAD::DS_POLL_SIZE: + { + if ( signature ) + { + NOMAD::Point Delta; + signature->get_mesh()->get_Delta ( Delta ); + display_stats_point ( out , stats , it , &Delta ); + + } + else + out << "-"; + } + break; + case NOMAD::DS_SIM_BBE: + display_stats_int ( out , _stats.get_sim_bb_eval() , max_bbe , format ); + format.clear(); + break; + case NOMAD::DS_BBE: + #ifdef R_VERSION - { - std::ostringstream oss; - display_stats_int ( oss , bbe , max_bbe , format ); - Rprintf ( "\t%s " , oss.str().c_str() ); - } + { + std::ostringstream oss; + display_stats_int ( oss , bbe , max_bbe , format ); + Rprintf ( "\t%s " , oss.str().c_str() ); + } #else - { - display_stats_int ( out , bbe , max_bbe , format ); - } + { + display_stats_int ( out , bbe , max_bbe , format ); + } #endif - format.clear(); - break; + format.clear(); + break; case NOMAD::DS_BLK_EVA: - { - display_stats_int ( out , blk_bbe , max_bbe , format ); - } - format.clear(); - break; - - case NOMAD::DS_SGTE: - //display_stats_int ( out , sgte_bbe , max_bbe , format ); - display_stats_int ( out , _stats.get_sgte_eval() , max_bbe , format ); - format.clear(); - break; - case NOMAD::DS_EVAL: - display_stats_int ( out , _stats.get_eval() , max_bbe , format ); - format.clear(); - break; - case NOMAD::DS_TIME: - display_stats_int ( out , real_time , 3600 , format ); - format.clear(); - break; - case NOMAD::DS_STAT_SUM: - display_stats_real ( out , _stats.get_stat_sum() , format ); - format.clear(); - break; - case NOMAD::DS_STAT_AVG: - display_stats_real ( out , _stats.get_stat_avg() , format ); - format.clear(); - break; - case NOMAD::DS_BBO: - display_stats_point ( out , stats , it , bbo ); - break; - case NOMAD::DS_SOL: - display_stats_point ( out , stats , it , sol , signature->get_input_type() ); - break; - case NOMAD::DS_VAR: - ++it; - NOMAD::atoi ( *it , i ); - if ( sol ) - if (format.empty()) - display_stats_type ( out , (*sol)[i] , (signature->get_input_type())[i] ); - else - display_stats_real ( out , (*sol)[i] , format ); - else - out << "-"; - format.clear(); - break; - } - } - } - } - - if ( !header ) + { + display_stats_int ( out , blk_bbe , max_bbe , format ); + } + format.clear(); + break; + + case NOMAD::DS_SGTE: + display_stats_int ( out , _stats.get_sgte_eval() , max_bbe , format ); + format.clear(); + break; + case NOMAD::DS_EVAL: + display_stats_int ( out , _stats.get_eval() , max_bbe , format ); + format.clear(); + break; + case NOMAD::DS_TIME: + display_stats_int ( out , real_time , 3600 , format ); + format.clear(); + break; + case NOMAD::DS_STAT_SUM: + display_stats_real ( out , _stats.get_stat_sum() , format ); + format.clear(); + break; + case NOMAD::DS_STAT_AVG: + display_stats_real ( out , _stats.get_stat_avg() , format ); + format.clear(); + break; + case NOMAD::DS_BBO: + display_stats_point ( out , stats , it , bbo ); + break; + case NOMAD::DS_SOL: + display_stats_point ( out , stats , it , sol , signature->get_input_types() ); + break; + case NOMAD::DS_VAR: + ++it; + NOMAD::atoi ( *it , i ); + if ( sol ) + if (format.empty()) + display_stats_type ( out , (*sol)[i] , (signature->get_input_types())[i] ); + else + display_stats_real ( out , (*sol)[i] , format ); + else + out << "-"; + format.clear(); + break; + } + } + } + } + + if ( !header ) #ifdef R_VERSION - Rprintf("\n"); + Rprintf("\n"); #else - out << std::endl; + out << std::endl; #endif } /*-----------------------------------------------------*/ /* display a number with type */ /*-----------------------------------------------------*/ -void NOMAD::Evaluator_Control::display_stats_type -( const NOMAD::Display & out , - const NOMAD::Double & d , - const NOMAD::bb_input_type & bbType ) const +void NOMAD::Evaluator_Control::display_stats_type ( const NOMAD::Display & out , + const NOMAD::Double & d , + const NOMAD::bb_input_type & bbType ) const { - - // Default based on bbType - std::string format2; - switch (bbType) - { - case NOMAD::CONTINUOUS: - format2 = "%0." + NOMAD::itos(DISPLAY_PRECISION_STD) + "g"; - break; - case NOMAD::INTEGER || NOMAD::BINARY || NOMAD::CATEGORICAL: - format2 = "%i"; - break; - default: - break; - } - d.display ( out , format2 ); - + + // Default based on bbType + std::string format2; + switch (bbType) + { + case NOMAD::CONTINUOUS: + format2 = "%0." + NOMAD::itos(DISPLAY_PRECISION_STD) + "g"; + break; + case NOMAD::INTEGER || NOMAD::BINARY || NOMAD::CATEGORICAL: + format2 = "%i"; + break; + default: + break; + } + d.display ( out , format2 ); + } /*-----------------------------------------------------*/ /* display a real with DISPLAY_STATS (or STATS_FILE) */ /*-----------------------------------------------------*/ -void NOMAD::Evaluator_Control::display_stats_real -( const NOMAD::Display & out , - const NOMAD::Double & d , - const std::string & format ) const +void NOMAD::Evaluator_Control::display_stats_real ( const NOMAD::Display & out , + const NOMAD::Double & d , + const std::string & format ) const { - if ( format.empty() ) - { - std::string format2 = "%0." + NOMAD::itos(DISPLAY_PRECISION_STD) + "g"; - d.display ( out , format2 ); - } - else - d.display ( out , format ); + if ( format.empty() ) + { + std::string format2 = "%0." + NOMAD::itos(DISPLAY_PRECISION_STD) + "g"; + d.display ( out , format2 ); + } + else + d.display ( out , format ); } /*---------------------------------------------------------*/ /* display an integer with DISPLAY_STATS (or STATS_FILE) */ /*---------------------------------------------------------*/ -void NOMAD::Evaluator_Control::display_stats_int -( const NOMAD::Display & out , - int i , - int max_i , - const std::string & format ) const +void NOMAD::Evaluator_Control::display_stats_int ( const NOMAD::Display & out , + int i , + int max_i , + const std::string & format ) const { - if ( format.empty() ) - out.display_int_w ( i , max_i ); - else { - NOMAD::Double d = i; - d.display ( out , format ); - } + if ( format.empty() ) + out.display_int_w ( i , max_i ); + else + { + + NOMAD::Double d = i; + d.display ( out , format ); + } } /*---------------------------------------------------------*/ /* display a point with DISPLAY_STATS (or STATS_FILE) */ /*---------------------------------------------------------*/ -void NOMAD::Evaluator_Control::display_stats_point -( const NOMAD::Display & out , - const std::list<std::string> & display_stats , - std::list<std::string>::const_iterator & it , - const NOMAD::Point * x , - const std::vector<NOMAD::bb_input_type> & bbType ) const +void NOMAD::Evaluator_Control::display_stats_point ( const NOMAD::Display & out , + const std::list<std::string> & display_stats , + std::list<std::string>::const_iterator & it , + const NOMAD::Point * x , + const std::vector<NOMAD::bb_input_type> & bbType ) const { - if ( x ) - { - - unsigned int n = x->size() , bbn = static_cast<int>(bbType.size()); - - if ( bbn!=0 && n != bbn ) - throw NOMAD::Exception ( "Evaluator_Control.cpp" , __LINE__ , - "Evaluator_Control::display_stats_point(): bbType and x have different size" ); - - - // s1 is the string displayed befores and after - // one coordinate (it may include format): - std::string s1; - if ( it != display_stats.begin() ) - { - s1 = *(--it); - ++it; + if ( x ) + { + + unsigned int n = x->size() , bbn = static_cast<int>(bbType.size()); + + if ( bbn!=0 && n != bbn ) + throw NOMAD::Exception ( "Evaluator_Control.cpp" , __LINE__ , + "Evaluator_Control::display_stats_point(): bbType and x have different size" ); + + + // s1 is the string displayed befores and after + // one coordinate (it may include format): + std::string s1; + if ( it != display_stats.begin() ) + { + s1 = *(--it); + ++it; + } + + // extract the display format from s1: + std::string format; + if ( !s1.empty() ) + NOMAD::Display::extract_display_format ( s1 , format ); + + // s2 is the string displayed between two coordinates: + std::string s2; + ++it; + if ( it != display_stats.end() ) + s2 = *it; + else if ( s2.empty() ) + --it; + + for ( unsigned int i = 0 ; i < n ; ++i ) + { + if ( !s1.empty() && i > 0 ) + out << s1; + + if (bbn!=0 && format.empty()) + display_stats_type ( out , (*x)[i] , bbType[i]); + else + display_stats_real (out, (*x)[i] , format ); + + if ( !s1.empty() ) + out << s1; + if ( !s2.empty() && i < n-1 && s2.find("(VNS)")==std::string::npos && s2.find("(PhaseOne)")==std::string::npos && s2.find("(LH)")==std::string::npos && s2.find("(ExtendedPoll)")==std::string::npos ) + out << " " << s2; + out << " "; + } + if ( !s2.empty() && (s2.find("(VNS)")!=std::string::npos || s2.find("(PhaseOne)")!=std::string::npos || s2.find("(LH)")!=std::string::npos || s2.find("(ExtendedPoll)")!=std::string::npos)) + out << s2; } - - // extract the display format from s1: - std::string format; - if ( !s1.empty() ) - NOMAD::Display::extract_display_format ( s1 , format ); - - // s2 is the string displayed between two coordinates: - std::string s2; - ++it; - if ( it != display_stats.end() ) - s2 = *it; - else if ( s2.empty() ) - --it; - - for ( unsigned int i = 0 ; i < n ; ++i ) - { - if ( !s1.empty() && i > 0 ) - out << s1; - - if (bbn!=0 && format.empty()) - display_stats_type ( out , (*x)[i] , bbType[i]); - else - display_stats_real (out, (*x)[i] , format ); - - if ( !s1.empty() ) - out << s1; - if ( !s2.empty() && i < n-1 && s2.find("(VNS)")==std::string::npos && s2.find("(PhaseOne)")==std::string::npos && s2.find("(LH)")==std::string::npos && s2.find("(ExtendedPoll)")==std::string::npos ) - out << " " << s2; - out << " "; - } - if ( !s2.empty() && (s2.find("(VNS)")!=std::string::npos || s2.find("(PhaseOne)")!=std::string::npos || s2.find("(LH)")!=std::string::npos || s2.find("(ExtendedPoll)")!=std::string::npos)) - out << s2; - } } /*------------------------------------------*/ /* save the solution file (SOLUTION_FILE) */ /*------------------------------------------*/ void NOMAD::Evaluator_Control::write_solution_file ( const NOMAD::Eval_Point & x, - bool display_bimv) const + bool display_bimv) const { - const std::string & sol_file = _p.get_solution_file(); - if ( !sol_file.empty() && ( x.is_feasible ( _p.get_h_min() ) || display_bimv ) ) - write_sol_or_his_file ( _p.get_problem_dir() + sol_file , x , true , display_bimv ); + const std::string & sol_file = _p.get_solution_file(); + if ( !sol_file.empty() && ( x.is_feasible ( _p.get_h_min() ) || display_bimv ) ) + write_sol_or_his_file ( _p.get_problem_dir() + sol_file , x , true , display_bimv ); } /*----------------------------------------------*/ @@ -764,170 +769,170 @@ void NOMAD::Evaluator_Control::write_solution_file ( const NOMAD::Eval_Point & x /* or update the history file (HISTORY_FILE ) */ /* (private) */ /*----------------------------------------------*/ -void NOMAD::Evaluator_Control::write_sol_or_his_file -( const std::string & file_name , - const NOMAD::Eval_Point & x , - bool is_sol , - bool display_bimv ) const +void NOMAD::Evaluator_Control::write_sol_or_his_file ( const std::string & file_name , + const NOMAD::Eval_Point & x , + bool is_sol , + bool display_bimv ) const { - // if is_sol == true: save the solution file - // else: update the history file - bool failed = false; - std::ofstream fout; - - if ( is_sol ) - fout.open ( file_name.c_str() ); - else - fout.open ( file_name.c_str() , std::ios::app ); - - if ( !fout.fail() ) { - - fout.setf ( std::ios::fixed ); - fout.precision ( NOMAD::DISPLAY_PRECISION_BB ); - - // solution display: - if ( is_sol ) - { - if ( _p.get_bb_input_include_seed() ) - fout << _p.get_seed() << std::endl; - if ( _p.get_bb_input_include_tag() ) - fout << x.get_tag() << std::endl; - x.Point::display ( fout , "\n" , -1 , -1 ); - if (display_bimv) - fout << std::endl << "warning: best infeasible solution (min. violation)"; - fout << std::endl; - } - - // history display: - else { - x.Point::display ( fout , " " , -1 , -1 ); - fout << " "; - x.get_bb_outputs().Point::display ( fout , " " , -1 , -1 ); - fout << std::endl; - } - - if ( fout.fail() ) - failed = true; - } - else - failed = true; - - fout.close(); - - if ( failed && _p.out().get_gen_dd() != NOMAD::NO_DISPLAY && _p.out().get_gen_dd() != NOMAD::MINIMAL_DISPLAY) - _p.out() << std::endl - << "Warning (" << "Evaluator_Control.cpp" << ", " << __LINE__ - << "): could not " - << ( is_sol ? "save the current solution" : - "update the history" ) - << " in \'" - << file_name << "\'" << std::endl << std::endl; + // if is_sol == true: save the solution file + // else: update the history file + bool failed = false; + std::ofstream fout; + + if ( is_sol ) + fout.open ( file_name.c_str() ); + else + fout.open ( file_name.c_str() , std::ios::app ); + + if ( !fout.fail() ) + { + + fout.setf ( std::ios::fixed ); + fout.precision ( NOMAD::DISPLAY_PRECISION_BB ); + + // solution display: + if ( is_sol ) + { + if ( _p.get_bb_input_include_seed() ) + fout << _p.get_seed() << std::endl; + if ( _p.get_bb_input_include_tag() ) + fout << x.get_tag() << std::endl; + x.Point::display ( fout , "\n" , -1 , -1 ); + if (display_bimv) + fout << std::endl << "warning: best infeasible solution (min. violation)"; + fout << std::endl; + } + + // history display: + else + { + x.Point::display ( fout , " " , -1 , -1 ); + fout << " "; + x.get_bb_outputs().Point::display ( fout , " " , -1 , -1 ); + fout << std::endl; + } + + if ( fout.fail() ) + failed = true; + } + else + failed = true; + + fout.close(); + + if ( failed && _p.out().get_gen_dd() != NOMAD::NO_DISPLAY && _p.out().get_gen_dd() != NOMAD::MINIMAL_DISPLAY) + _p.out() << std::endl + << "Warning (" << "Evaluator_Control.cpp" << ", " << __LINE__ + << "): could not " + << ( is_sol ? "save the current solution" : + "update the history" ) + << " in \'" + << file_name << "\'" << std::endl << std::endl; } /*---------------------------------------------------------*/ /* display evaluation result (private) */ /*---------------------------------------------------------*/ -void NOMAD::Evaluator_Control::display_eval_result -( const NOMAD::Eval_Point & x , - NOMAD::dd_type display_degree , - NOMAD::search_type search , - NOMAD::success_type one_eval_success , - NOMAD::success_type success ) const +void NOMAD::Evaluator_Control::display_eval_result ( const NOMAD::Eval_Point & x , + NOMAD::dd_type display_degree , + NOMAD::search_type search , + NOMAD::success_type one_eval_success , + NOMAD::success_type success ) const { - const NOMAD::Display & out = _p.out(); - int cur_bbe; - - // surrogate evaluation: - if ( x.get_eval_type() == NOMAD::SGTE ) - { - if ( display_degree == NOMAD::FULL_DISPLAY ) - { - out << std::endl << "point #" << x.get_tag() << " sgte eval: "; - if ( x.is_eval_ok() ) - { - out << "h="; - if ( x.get_h().is_defined() ) - out << x.get_h(); - else - out << "inf (extr. barrier)"; - out << " f=" << x.get_f(); - } - else - out << "failed"; - out << std::endl; - } - if ( !_p.get_opt_only_sgte() ) - return; - - cur_bbe = _stats.get_sgte_eval(); - } - else - cur_bbe = _stats.get_eval(); - - const std::string & stats_file_name = _p.get_stats_file_name(); - bool feas_x = x.is_feasible ( _p.get_h_min() ); - - // update the history file: - // (contains surrogate evaluations if opt_only_sgte==true) - const std::string & his_file = _p.get_history_file(); - if ( !his_file.empty() && cur_bbe > _last_history_bbe) - { - write_sol_or_his_file ( _p.get_problem_dir() + his_file , x , false ); - _last_history_bbe = cur_bbe; - } - - // success displays: - if ( one_eval_success != NOMAD::UNSUCCESSFUL && - one_eval_success >= success ) - { - - // save the current solution in file: - write_solution_file ( x ); - - bool ds_ok = ( cur_bbe > _last_stats_bbe) && - ( _p.get_display_all_eval() || - ( one_eval_success == NOMAD::FULL_SUCCESS && feas_x ) ); - - // normal display and minimal: - if ( (display_degree == NOMAD::NORMAL_DISPLAY || display_degree == NOMAD::MINIMAL_DISPLAY ) && ds_ok ) - display_stats ( false , out , _p.get_display_stats() , &x , feas_x , NULL ); - // detailed display: - else if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl << search << " " << one_eval_success - << " point " << x; - - // stats file: - if ( ds_ok && !stats_file_name.empty() ) - stats_file ( stats_file_name , &x , feas_x , NULL ); - - } - else - { - - if ( display_degree == NOMAD::FULL_DISPLAY ) - { - out << search << " " << one_eval_success - << " point #" << x.get_tag(); - if ( x.is_eval_ok() ) - out << " [ h=" << x.get_h() - << " f=" << x.get_f() << " ]" << std::endl; - else if (x.check_rejected()) - out << ": evaluation rejected by user (this may alter convergence properties!)" << std::endl; - else - out << ": evaluation failed (you may need to check the source of the problem)." << std::endl; - } - - if ( _p.get_display_all_eval() && cur_bbe > _last_stats_bbe ) - { - - if ( display_degree == NOMAD::NORMAL_DISPLAY || display_degree == NOMAD::MINIMAL_DISPLAY ) - display_stats ( false , out , _p.get_display_stats() , &x , feas_x , NULL ); - - if ( !stats_file_name.empty() ) - stats_file ( stats_file_name , &x , feas_x , NULL ); - } - } + const NOMAD::Display & out = _p.out(); + int cur_bbe; + + // surrogate evaluation: + if ( x.get_eval_type() == NOMAD::SGTE ) + { + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + out << std::endl << "point #" << x.get_tag() << " sgte eval: "; + if ( x.is_eval_ok() ) + { + out << "h="; + if ( x.get_h().is_defined() ) + out << x.get_h(); + else + out << "inf (extr. barrier)"; + out << " f=" << x.get_f(); + } + else + out << "failed"; + out << std::endl; + } + if ( !_p.get_opt_only_sgte() ) + return; + + cur_bbe = _stats.get_sgte_eval(); + } + else + cur_bbe = _stats.get_eval(); + + const std::string & stats_file_name = _p.get_stats_file_name(); + bool feas_x = x.is_feasible ( _p.get_h_min() ); + + // update the history file: + // (contains surrogate evaluations if opt_only_sgte==true) + const std::string & his_file = _p.get_history_file(); + if ( !his_file.empty() && cur_bbe > _last_history_bbe) + { + write_sol_or_his_file ( _p.get_problem_dir() + his_file , x , false ); + _last_history_bbe = cur_bbe; + } + + // success displays: + if ( one_eval_success != NOMAD::UNSUCCESSFUL && + one_eval_success >= success ) + { + + // save the current solution in file: + write_solution_file ( x ); + + bool ds_ok = ( cur_bbe > _last_stats_bbe) && + ( _p.get_display_all_eval() || + ( one_eval_success == NOMAD::FULL_SUCCESS && feas_x ) ); + + // normal display and minimal: + if ( (display_degree == NOMAD::NORMAL_DISPLAY || display_degree == NOMAD::MINIMAL_DISPLAY ) && ds_ok ) + display_stats ( false , out , _p.get_display_stats() , &x , feas_x , NULL ); + // detailed display: + else if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl << search << " " << one_eval_success + << " point " << x; + + // stats file: + if ( ds_ok && !stats_file_name.empty() ) + stats_file ( stats_file_name , &x , feas_x , NULL ); + + } + else + { + + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + out << search << " " << one_eval_success + << " point #" << x.get_tag(); + if ( x.is_eval_ok() ) + out << " [ h=" << x.get_h() + << " f=" << x.get_f() << " ]" << std::endl; + else if (x.check_rejected()) + out << ": evaluation rejected by user (this may alter convergence properties!)" << std::endl; + else + out << ": evaluation failed (you may need to check the source of the problem)." << std::endl; + } + + if ( _p.get_display_all_eval() && cur_bbe > _last_stats_bbe ) + { + + if ( display_degree == NOMAD::NORMAL_DISPLAY || display_degree == NOMAD::MINIMAL_DISPLAY ) + display_stats ( false , out , _p.get_display_stats() , &x , feas_x , NULL ); + + if ( !stats_file_name.empty() ) + stats_file ( stats_file_name , &x , feas_x , NULL ); + } + } } @@ -937,14 +942,13 @@ void NOMAD::Evaluator_Control::display_eval_result /* . return true if the point is in cache */ /* . private method */ /*-------------------------------------------*/ -bool NOMAD::Evaluator_Control::cache_check -( const NOMAD::Eval_Point *& x , - NOMAD::Barrier & true_barrier , - NOMAD::Barrier & sgte_barrier , - NOMAD::Pareto_Front * pareto_front , - bool & count_eval , - const NOMAD::Double & h_max , - NOMAD::dd_type display_degree ) const +bool NOMAD::Evaluator_Control::cache_check ( const NOMAD::Eval_Point *& x , + NOMAD::Barrier & true_barrier , + NOMAD::Barrier & sgte_barrier , + NOMAD::Pareto_Front * pareto_front , + bool & count_eval , + const NOMAD::Double & h_max , + NOMAD::dd_type display_degree ) const { NOMAD::eval_type x_eval_type = x->get_eval_type(); const NOMAD::Eval_Point * cache_x = NULL; @@ -980,6 +984,8 @@ bool NOMAD::Evaluator_Control::cache_check modifiable_cache_x->set_signature ( x->get_signature () ); modifiable_cache_x->set_direction ( x->get_direction () ); + + // The point in cache is updated for the poll center to correspond to the new poll center of x (important for poll reduction) modifiable_cache_x->set_poll_center ( x->get_poll_center () ); modifiable_cache_x->set_poll_center_type ( x->get_poll_center_type () ); modifiable_cache_x->set_user_eval_priority ( x->get_user_eval_priority() ); @@ -1003,9 +1009,9 @@ bool NOMAD::Evaluator_Control::cache_check cache_x->get_h().is_defined() && cache_x->get_h() < h_max ) ) ) { - x = cache_x; - cache_x = NULL; - } + x = cache_x; + cache_x = NULL; + } // point in cache: if ( cache_x ) @@ -1046,235 +1052,240 @@ bool NOMAD::Evaluator_Control::cache_check /* eval a point (private) */ /*----------------------------------------------------*/ void NOMAD::Evaluator_Control::eval_point ( NOMAD::Eval_Point & x , - NOMAD::Barrier & true_barrier , - NOMAD::Barrier & sgte_barrier , - NOMAD::Pareto_Front * pareto_front , - bool & count_eval , - bool & stop , - NOMAD::stop_type & stop_reason , - const NOMAD::Double & h_max ) + NOMAD::Barrier & true_barrier , + NOMAD::Barrier & sgte_barrier , + NOMAD::Pareto_Front * pareto_front , + bool & count_eval , + bool & stop , + NOMAD::stop_type & stop_reason , + const NOMAD::Double & h_max ) { - int max_bb_eval = _p.get_max_bb_eval(); - int max_sgte_eval = _p.get_max_sgte_eval(); - - // blackbox or surrogate evaluations are allowed: - if ( ( x.get_eval_type() == NOMAD::TRUTH && max_bb_eval != 0 ) || - ( x.get_eval_type() == NOMAD::SGTE && max_sgte_eval != 0 ) ) - { - - NOMAD::Eval_Point * eval_x = &NOMAD::Cache::get_modifiable_point ( x ); - - // get the signature: - NOMAD::Signature * signature = x.get_signature(); - if ( !signature ) - throw NOMAD::Exception ( "Evaluator_Control.cpp" , __LINE__ , - "Evaluator_Control::eval_point(): the point has no signature" ); - - // evaluation of the point: - // ------------------------ - bool eval_ok = true; + int max_bb_eval = _p.get_max_bb_eval(); + int max_sgte_eval = _p.get_max_sgte_eval(); + + // blackbox or surrogate evaluations are allowed: + if ( ( x.get_eval_type() == NOMAD::TRUTH && max_bb_eval != 0 ) || + ( x.get_eval_type() == NOMAD::SGTE && max_sgte_eval != 0 ) ) + { + + NOMAD::Eval_Point * eval_x = &NOMAD::Cache::get_modifiable_point ( x ); + + // get the signature: + NOMAD::Signature * signature = x.get_signature(); + if ( !signature ) + throw NOMAD::Exception ( "Evaluator_Control.cpp" , __LINE__ , + "Evaluator_Control::eval_point(): the point has no signature" ); + + // evaluation of the point: + // ------------------------ + bool eval_ok = true; NOMAD::Evaluator_Control::_force_evaluation_failure=false; - - { - // 1. scaling: - bool do_scaling = signature->get_scaling().is_defined(); - if ( do_scaling ) - eval_x->scale(); - - // 2.1. evaluation: - try - { - eval_ok = _ev->eval_x ( *eval_x , h_max , count_eval ); - - } + + { + // 1. scaling: + bool do_scaling = signature->get_scaling().is_defined(); + if ( do_scaling ) + eval_x->scale(); + + // 2.1. evaluation: + try + { + eval_ok = _ev->eval_x ( *eval_x , h_max , count_eval ); + + } catch ( exception & e ) { throw NOMAD::Exception ( "Evaluator_control.cpp" , __LINE__ , e.what() ); } - - // 2.2. check the nan's: - if ( eval_ok && eval_x->check_nan() ) - eval_ok = false; + + // 2.2. check the nan's: + if ( eval_ok && eval_x->check_nan() ) + eval_ok = false; if ( _force_evaluation_failure ) eval_ok = false; - - // 3. unscaling: - if ( do_scaling ) - eval_x->unscale(); - } - - if ( eval_ok ) - { - - eval_x->set_eval_status ( NOMAD::EVAL_OK ); - - // set_f, set_h and set_EB_ok: - _ev->compute_f ( *eval_x ); - _ev->compute_h ( *eval_x ); - - } - else - { - eval_x->set_eval_status ( NOMAD::EVAL_FAIL ); - _stats.add_failed_eval(); - } - - // insertion in cache even if is_eval_ok == false: - if ( !x.is_in_cache() ) - { - - int size_before , size_after; - - if ( x.get_eval_type() == NOMAD::SGTE ) { - size_before = _sgte_cache->size(); - _sgte_cache->insert(x); - size_after = _sgte_cache->size(); - } - else { - size_before = _cache->size(); - _cache->insert(x); - size_after = _cache->size(); - } - - if ( size_after == size_before ) - x.set_in_cache ( false ); - } - - } - + + // 3. unscaling: + if ( do_scaling ) + eval_x->unscale(); + } + + if ( eval_ok ) + { + + eval_x->set_eval_status ( NOMAD::EVAL_OK ); + + // set_f, set_h and set_EB_ok: + _ev->compute_f ( *eval_x ); + _ev->compute_h ( *eval_x ); + + } + else + { + eval_x->set_eval_status ( NOMAD::EVAL_FAIL ); + _stats.add_failed_eval(); + } + + // insertion in cache even if is_eval_ok == false: + if ( !x.is_in_cache() ) + { + + int size_before , size_after; + + if ( x.get_eval_type() == NOMAD::SGTE ) + { + size_before = _sgte_cache->size(); + _sgte_cache->insert(x); + size_after = _sgte_cache->size(); + } + else + { + + size_before = _cache->size(); + _cache->insert(x); + size_after = _cache->size(); + } + + if ( size_after == size_before ) + x.set_in_cache ( false ); + } + + } + } /*----------------------------------------------------*/ /* eval points in a list (private) */ /*----------------------------------------------------*/ -void NOMAD::Evaluator_Control::eval_points ( std::list<NOMAD::Eval_Point *> & list_eval , - NOMAD::Barrier & true_barrier , - NOMAD::Barrier & sgte_barrier , - NOMAD::Pareto_Front * pareto_front , - std::list<bool> & count_list_eval, - bool & stop , - NOMAD::stop_type & stop_reason , - const NOMAD::Double & h_max ) +void NOMAD::Evaluator_Control::eval_points ( std::list<NOMAD::Eval_Point *> & list_eval , + NOMAD::Barrier & true_barrier , + NOMAD::Barrier & sgte_barrier , + NOMAD::Pareto_Front * pareto_front , + std::list<bool> & count_list_eval , + bool & stop , + NOMAD::stop_type & stop_reason , + const NOMAD::Double & h_max ) { - int max_bb_eval = _p.get_max_bb_eval(); - int max_sgte_eval = _p.get_max_sgte_eval(); - - std::list<NOMAD::Eval_Point*>::iterator it_begin=list_eval.begin(); - - if ( ( (*it_begin)->get_eval_type() == NOMAD::TRUTH && max_bb_eval != 0 ) || - ( (*it_begin)->get_eval_type() == NOMAD::SGTE && max_sgte_eval != 0 ) ) - { - - // 1. Pre-evaluation tests and scaling - for ( std::list<NOMAD::Eval_Point*>::iterator it=it_begin;it!=list_eval.end();++it) - { - // get the signature: - NOMAD::Signature * signature = (*it)->get_signature(); - if ( !signature ) - throw NOMAD::Exception ( "Evaluator_Control.cpp" , __LINE__ , - "Evaluator_Control::eval_points(): the point has no signature" ); - - // Scaling before evaluation of the points: - bool do_scaling = signature->get_scaling().is_defined(); - if ( do_scaling ) - (*it)->scale(); - - } - - // 2. list evaluation: - bool eval_list_ok = true; + int max_bb_eval = _p.get_max_bb_eval(); + int max_sgte_eval = _p.get_max_sgte_eval(); + + std::list<NOMAD::Eval_Point*>::iterator it_begin=list_eval.begin(); + + // blackbox or surrogate evaluations are allowed: + if ( ( (*it_begin)->get_eval_type() == NOMAD::TRUTH && max_bb_eval != 0 ) || + ( (*it_begin)->get_eval_type() == NOMAD::SGTE && max_sgte_eval != 0 ) ) + { + + // 1. Pre-evaluation tests and scaling + for ( std::list<NOMAD::Eval_Point*>::iterator it=it_begin;it!=list_eval.end();++it) + { + // get the signature: + NOMAD::Signature * signature = (*it)->get_signature(); + if ( !signature ) + throw NOMAD::Exception ( "Evaluator_Control.cpp" , __LINE__ , + "Evaluator_Control::eval_points(): the point has no signature" ); + + // Scaling before evaluation of the points: + bool do_scaling = signature->get_scaling().is_defined(); + if ( do_scaling ) + (*it)->scale(); + + } + + // 2. list evaluation: + bool eval_list_ok = true; + NOMAD::Evaluator_Control::_force_evaluation_failure=false; - try - { - eval_list_ok=_ev->eval_x ( list_eval , h_max,count_list_eval ); - } + try + { + eval_list_ok=_ev->eval_x ( list_eval , h_max,count_list_eval ); + } catch ( exception & e ) { throw NOMAD::Exception ( "Evaluator_control.cpp" , __LINE__ , e.what() ); } - + if ( _force_evaluation_failure ) eval_list_ok = false; - - // One block of evaluations is counted - if ( eval_list_ok ) - _stats.add_one_block_eval(); - - - // 3. Post list evaluation checks and operation - std::list<bool>::iterator it_count=count_list_eval.begin(); - for ( std::list<NOMAD::Eval_Point*>::iterator it=it_begin;it!=list_eval.end();++it,++it_count) - { - bool eval_ok=true; - bool eval_rejected=false; - - // 3.1. check the nan's and list evaluation failure: - if ( !eval_list_ok || (*it)->check_nan() ) - eval_ok = false; - - if ((*it)->check_rejected()) - { - eval_rejected=true; - eval_ok=false; - } - - // 3.2 unscaling: - if ( (*it)->get_signature()->get_scaling().is_defined() ) - (*it)->unscale(); - - - if ( eval_ok && (*it)->get_eval_status()!=NOMAD::EVAL_FAIL ) - { - (*it)->set_eval_status ( NOMAD::EVAL_OK ); - - // set_f, set_h and set_EB_ok: - _ev->compute_f ( *(*it) ); - _ev->compute_h ( *(*it)); - - } - else if (!eval_rejected) - { - (*it)->set_eval_status ( NOMAD::EVAL_FAIL ); - _stats.add_failed_eval(); - } // Do nothing if eval has been rejected - - // insertion in cache even if is_eval_ok == false. Exception: a point that has been rejected by user is not put in the cache. - if ( !(*it)->is_in_cache() && !eval_rejected ) - { - - int size_before , size_after; - - if ( (*it)->get_eval_type() == NOMAD::SGTE ) - { - size_before = _sgte_cache->size(); - _sgte_cache->insert(*(*it)); - size_after = _sgte_cache->size(); - } - else - { - size_before = _cache->size(); - _cache->insert(*(*it)); - size_after = _cache->size(); - } - - if ( size_after == size_before ) - (*it)->set_in_cache ( false ); - } - - - // count the output stats (STAT_SUM and STAT_AVG): - if ( (_p.check_stat_sum() || _p.check_stat_avg()) && !eval_rejected) - count_output_stats(*(*it)); - - } - } + // One block of evaluations is counted + if ( eval_list_ok ) + _stats.add_one_block_eval(); + + + + // 3. Post list evaluation checks and operation + std::list<bool>::iterator it_count=count_list_eval.begin(); + for ( std::list<NOMAD::Eval_Point*>::iterator it=it_begin;it!=list_eval.end();++it,++it_count) + { + bool eval_ok=true; + bool eval_rejected=false; + + // 3.1. check the nan's and list evaluation failure: + if ( !eval_list_ok || (*it)->check_nan() ) + eval_ok = false; + + if ((*it)->check_rejected()) + { + eval_rejected=true; + eval_ok=false; + } + + // 3.2 unscaling: + if ( (*it)->get_signature()->get_scaling().is_defined() ) + (*it)->unscale(); + + // Check that everything is ok and also that the user did not set the evaluation as failed + if ( eval_ok && (*it)->get_eval_status()!=NOMAD::EVAL_FAIL ) + { + (*it)->set_eval_status ( NOMAD::EVAL_OK ); + + // set_f, set_h and set_EB_ok: + _ev->compute_f ( *(*it) ); + _ev->compute_h ( *(*it)); + + } + else if (!eval_rejected) + { + (*it)->set_eval_status ( NOMAD::EVAL_FAIL ); + _stats.add_failed_eval(); + } // Do nothing if eval has been rejected + + // insertion in cache even if is_eval_ok == false. Exception: a point that has been rejected by user is not put in the cache. + if ( !(*it)->is_in_cache() && !eval_rejected ) + { + + int size_before , size_after; + + if ( (*it)->get_eval_type() == NOMAD::SGTE ) + { + size_before = _sgte_cache->size(); + _sgte_cache->insert(*(*it)); + size_after = _sgte_cache->size(); + } + else + { + size_before = _cache->size(); + _cache->insert(*(*it)); + size_after = _cache->size(); + } + + if ( size_after == size_before ) + (*it)->set_in_cache ( false ); + } + + + // count the output stats (STAT_SUM and STAT_AVG): + if ( (_p.check_stat_sum() || _p.check_stat_avg()) && !eval_rejected) + count_output_stats(*(*it)); + + } + } } @@ -1284,221 +1295,228 @@ void NOMAD::Evaluator_Control::eval_points ( std::list<NOMAD::Eval_Point *> & li /*-------------------------------------------*/ void NOMAD::Evaluator_Control::check_stopping_criteria ( NOMAD::search_type search , - bool count_eval , - const NOMAD::Eval_Point & x , - bool & stop , - NOMAD::stop_type & stop_reason ) const + bool count_eval , + const NOMAD::Eval_Point & x , + bool & stop , + NOMAD::stop_type & stop_reason ) const { - // check the time: - if ( !stop && - _p.get_max_time() > 0 && - _stats.get_real_time() >= _p.get_max_time() ) - { - stop = true; - stop_reason = NOMAD::MAX_TIME_REACHED; - } - - // count an evaluation or a simulated blackbox evaluation: - if ( x.get_eval_type() == NOMAD::TRUTH ) - { - _stats.add_eval(); - if ( count_eval && !x.get_current_run() ) - _stats.add_sim_bb_eval(); - } - - - // check STAT_SUM_TARGET: - if ( !stop && - (_p.check_stat_sum() || _p.check_stat_avg())) - { - - NOMAD::Double sum_target = _p.get_stat_sum_target(); - if ( sum_target.is_defined() ) - { - NOMAD::Double sum = _stats.get_stat_sum(); - if ( sum.is_defined() && sum >= sum_target ) - { - stop = true; - stop_reason = NOMAD::STAT_SUM_TARGET_REACHED; - } - } - } - - // check the number of blackbox evaluations: - if ( !stop ) - { - int max_bb_eval = _p.get_max_bb_eval(); - int max_sgte_eval = _p.get_max_sgte_eval(); - if ( max_bb_eval > 0 && _stats.get_bb_eval() >= max_bb_eval ) - { - stop = true; - stop_reason = NOMAD::MAX_BB_EVAL_REACHED; - } - if ( max_sgte_eval > 0 && _stats.get_sgte_eval() >= max_sgte_eval ) - { - stop = true; - stop_reason = NOMAD::MAX_SGTE_EVAL_REACHED; - } - } - - // check the stopping condition MAX_EVAL: - if ( !stop && - _p.get_max_eval() > 0 && - _stats.get_eval() >= _p.get_max_eval() ) - { - stop = true; - stop_reason = NOMAD::MAX_EVAL_REACHED; - } - - // check the stopping condition MAX_SIM_BB_EVAL: - if ( !stop && - _p.get_max_sim_bb_eval() > 0 && - _stats.get_sim_bb_eval() >= _p.get_max_sim_bb_eval() ) - { - stop = true; - stop_reason = NOMAD::MAX_SIM_BB_EVAL_REACHED; - } - - // check the stopping conditions F_TARGET and FEAS_REACHED - // (for phase one: the evaluations must stop if all EB - // constraints are satisfied, but some PB constraints can - // be violated) - if ( !stop && - x.is_eval_ok() && - ( _p.get_opt_only_sgte() || - x.get_eval_type() == NOMAD::TRUTH ) ) - { - - bool feasible = x.is_feasible ( _p.get_h_min() ); - - // check FEAS_REACHED: - if ( feasible && _p.get_stop_if_feasible() ) - { - stop = true; - stop_reason = NOMAD::FEAS_REACHED; - } - - // check F_TARGET: - { - const NOMAD::Point & f_target = _p.get_f_target(); - const std::list<int> & index_obj = _p.get_index_obj(); - std::list<int>::const_iterator index_obj_end = index_obj.end(); - bool check_f_target = f_target.is_defined(); - int nb_to_check = (check_f_target) ? - f_target.nb_defined() : 0; - - if ( check_f_target && ( feasible || search == NOMAD::LH_SEARCH_P1 ) ) - { - const NOMAD::Point & bbo = x.get_bb_outputs(); - bool chk = true; - int k = 0; - int cnt = 0; - for ( std::list<int>::const_iterator it = index_obj.begin(); - it != index_obj_end ; ++it , ++k ) - { - if ( bbo[*it].is_defined() && f_target[k].is_defined() ) - { - if ( f_target[k] < bbo[*it] ) - { - chk = false; - break; - } - cnt++; - } - } - - if ( chk && cnt == nb_to_check ) - { - stop = true; - stop_reason = NOMAD::F_TARGET_REACHED; - } - } - } - } + // check the time: + if ( !stop && + _p.get_max_time() > 0 && + _stats.get_real_time() >= _p.get_max_time() ) + { + stop = true; + stop_reason = NOMAD::MAX_TIME_REACHED; + } + + // count an evaluation or a simulated blackbox evaluation: + if ( x.get_eval_type() == NOMAD::TRUTH ) + { + _stats.add_eval(); + if ( count_eval && !x.get_current_run() ) + _stats.add_sim_bb_eval(); + } + + + // check STAT_SUM_TARGET: + if ( !stop && + (_p.check_stat_sum() || _p.check_stat_avg())) + { + + NOMAD::Double sum_target = _p.get_stat_sum_target(); + if ( sum_target.is_defined() ) + { + NOMAD::Double sum = _stats.get_stat_sum(); + if ( sum.is_defined() && sum >= sum_target ) + { + stop = true; + stop_reason = NOMAD::STAT_SUM_TARGET_REACHED; + } + } + } + + // check the number of blackbox evaluations: + if ( !stop ) + { + int max_bb_eval = _p.get_max_bb_eval(); + int max_sgte_eval = _p.get_max_sgte_eval(); + if ( max_bb_eval > 0 && _stats.get_bb_eval() >= max_bb_eval ) + { + stop = true; + stop_reason = NOMAD::MAX_BB_EVAL_REACHED; + } + if ( max_sgte_eval > 0 && _stats.get_sgte_eval() >= max_sgte_eval ) + { + stop = true; + stop_reason = NOMAD::MAX_SGTE_EVAL_REACHED; + } + } + + // check the stopping condition MAX_EVAL: + if ( !stop && + _p.get_max_eval() > 0 && + _stats.get_eval() >= _p.get_max_eval() ) + { + stop = true; + stop_reason = NOMAD::MAX_EVAL_REACHED; + } + + // check the stopping condition MAX_SIM_BB_EVAL: + if ( !stop && + _p.get_max_sim_bb_eval() > 0 && + _stats.get_sim_bb_eval() >= _p.get_max_sim_bb_eval() ) + { + stop = true; + stop_reason = NOMAD::MAX_SIM_BB_EVAL_REACHED; + } + + // check the stopping conditions F_TARGET and FEAS_REACHED + // (for phase one: the evaluations must stop if all EB + // constraints are satisfied, but some PB constraints can + // be violated) + if ( !stop && + x.is_eval_ok() && + ( _p.get_opt_only_sgte() || + x.get_eval_type() == NOMAD::TRUTH ) ) + { + + bool feasible = x.is_feasible ( _p.get_h_min() ); + + // check FEAS_REACHED: + if ( feasible && _p.get_stop_if_feasible() ) + { + stop = true; + stop_reason = NOMAD::FEAS_REACHED; + } + + // check F_TARGET: + { + const NOMAD::Point & f_target = _p.get_f_target(); + const std::list<int> & index_obj = _p.get_index_obj(); + std::list<int>::const_iterator index_obj_end = index_obj.end(); + bool check_f_target = f_target.is_defined(); + int nb_to_check = (check_f_target) ? + f_target.nb_defined() : 0; + + if ( check_f_target && ( feasible || search == NOMAD::LH_SEARCH_P1 ) ) + { + const NOMAD::Point & bbo = x.get_bb_outputs(); + bool chk = true; + int k = 0; + int cnt = 0; + for ( std::list<int>::const_iterator it = index_obj.begin(); + it != index_obj_end ; ++it , ++k ) + { + if ( bbo[*it].is_defined() && f_target[k].is_defined() ) + { + if ( f_target[k] < bbo[*it] ) + { + chk = false; + break; + } + cnt++; + } + } + + if ( chk && cnt == nb_to_check ) + { + stop = true; + stop_reason = NOMAD::F_TARGET_REACHED; + } + } + } + } } /*-------------------------------------------------------*/ /* receive an evaluation result from a slave (private) */ /*-------------------------------------------------------*/ #ifdef USE_MPI -void NOMAD::Evaluator_Control::receive_eval_result -( NOMAD::search_type search , - NOMAD::Eval_Point * x , - NOMAD::Barrier & true_barrier , - NOMAD::Barrier & sgte_barrier , - NOMAD::Pareto_Front * pareto_front , - int slave_rank , - bool & stop , - NOMAD::stop_type & stop_reason ) +void NOMAD::Evaluator_Control::receive_eval_result ( NOMAD::search_type search , + NOMAD::Eval_Point * x , + NOMAD::Barrier & true_barrier , + NOMAD::Barrier & sgte_barrier , + NOMAD::Pareto_Front * pareto_front , + int slave_rank , + bool & stop , + NOMAD::stop_type & stop_reason ) { - bool eval_ok , count_eval; - - - // receive the evaluation result: - _slave->receive_eval_result ( slave_rank , x , eval_ok , count_eval ); - - // process the evaluation: - if ( eval_ok ) { - - // set_f, set_h and set_EB_ok: - _ev->compute_f ( *x ); - _ev->compute_h ( *x ); - - // process the evaluated point: - process_eval_point ( *x , - (x->get_eval_type()==NOMAD::TRUTH) ? - true_barrier : sgte_barrier , - pareto_front ); - } - else - _stats.add_failed_eval(); - - // insertion in cache even if !eval_ok: - if ( !x->is_in_cache() ) - ( ( x->get_eval_type() == NOMAD::SGTE ) ? - _sgte_cache : _cache)->insert ( *x ); - - // count the bb evaluation: - if ( count_eval ) { - if ( x->get_eval_type() == NOMAD::SGTE ) - _stats.add_sgte_eval(); + bool eval_ok , count_eval; + + + // receive the evaluation result: + _slave->receive_eval_result ( slave_rank , x , eval_ok , count_eval ); + + // process the evaluation: + if ( eval_ok ) + { + + // set_f, set_h and set_EB_ok: + _ev->compute_f ( *x ); + _ev->compute_h ( *x ); + + // process the evaluated point: + process_eval_point ( *x , + (x->get_eval_type()==NOMAD::TRUTH) ? + true_barrier : sgte_barrier , + pareto_front ); + } else - _stats.add_bb_eval(); - } - - // count the output stats (STAT_SUM and STAT_AVG): - if ( _p.check_stat_sum() || _p.check_stat_avg() ) { - - count_output_stats ( *x ); - - // check STAT_SUM_TARGET: - NOMAD::Double sum_target = _p.get_stat_sum_target(); - if ( sum_target.is_defined() ) { - NOMAD::Double sum = _stats.get_stat_sum(); - if ( !stop && sum.is_defined() && sum >= sum_target ) { - stop = true; - stop_reason = NOMAD::STAT_SUM_TARGET_REACHED; - } - } - } - - // check stopping criteria: - if ( !stop ) { - - int max_bb_eval = _p.get_max_bb_eval(); - int max_sgte_eval = _p.get_max_sgte_eval(); + _stats.add_failed_eval(); + + // insertion in cache even if !eval_ok: + if ( !x->is_in_cache() ) + ( ( x->get_eval_type() == NOMAD::SGTE ) ? + _sgte_cache : _cache)->insert ( *x ); - if ( max_bb_eval > 0 && _stats.get_bb_eval() >= max_bb_eval ) { - stop = true; - stop_reason = NOMAD::MAX_BB_EVAL_REACHED; + // count the bb evaluation: + if ( count_eval ) + { + if ( x->get_eval_type() == NOMAD::SGTE ) + _stats.add_sgte_eval(); + else + _stats.add_bb_eval(); } - if ( max_sgte_eval > 0 && _stats.get_sgte_eval() >= max_sgte_eval ) { - stop = true; - stop_reason = NOMAD::MAX_SGTE_EVAL_REACHED; + + // count the output stats (STAT_SUM and STAT_AVG): + if ( _p.check_stat_sum() || _p.check_stat_avg() ) + { + + count_output_stats ( *x ); + + // check STAT_SUM_TARGET: + NOMAD::Double sum_target = _p.get_stat_sum_target(); + if ( sum_target.is_defined() ) + { + NOMAD::Double sum = _stats.get_stat_sum(); + if ( !stop && sum.is_defined() && sum >= sum_target ) + { + stop = true; + stop_reason = NOMAD::STAT_SUM_TARGET_REACHED; + } + } } - } - - check_stopping_criteria ( search , count_eval , *x , stop , stop_reason ); + + // check stopping criteria: + if ( !stop ) + { + + int max_bb_eval = _p.get_max_bb_eval(); + int max_sgte_eval = _p.get_max_sgte_eval(); + + if ( max_bb_eval > 0 && _stats.get_bb_eval() >= max_bb_eval ) + { + stop = true; + stop_reason = NOMAD::MAX_BB_EVAL_REACHED; + } + if ( max_sgte_eval > 0 && _stats.get_sgte_eval() >= max_sgte_eval ) + { + stop = true; + stop_reason = NOMAD::MAX_SGTE_EVAL_REACHED; + } + } + + check_stopping_criteria ( search , count_eval , *x , stop , stop_reason ); } #endif @@ -1506,100 +1524,99 @@ void NOMAD::Evaluator_Control::receive_eval_result /* wait for evaluations in progress */ /*----------------------------------------------------*/ #ifdef USE_MPI -void NOMAD::Evaluator_Control::wait_for_evaluations -( NOMAD::search_type search , - NOMAD::Barrier & true_barrier , - NOMAD::Barrier & sgte_barrier , - NOMAD::Pareto_Front * pareto_front , - bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - std::list<const NOMAD::Eval_Point *> & evaluated_pts ) -{ - if ( _nb_in_progress == 0 ) - return; - - // display degree: - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_display_degree ( search ); - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl - << NOMAD::open_block ( "wait for evaluations" ); - - NOMAD::Barrier & barrier = ( _p.get_opt_only_sgte() ) ? - sgte_barrier : true_barrier; - char signal; - int source; - NOMAD::Eval_Point * eval_x; - NOMAD::success_type one_eval_success; - - while ( _nb_in_progress > 0 ) - { - - source = NOMAD::Slave::receive_signal ( signal ); - eval_x = _eval_in_progress[source]; - - if ( eval_x ) - { - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl << "receive eval point #" << eval_x->get_tag() - << " from slave " << source << std::endl << std::endl; - - receive_eval_result ( search , - eval_x , - true_barrier , - sgte_barrier , - pareto_front , - source , - stop , - stop_reason ); - - // list of processed points: - if ( eval_x->is_in_cache() ) - evaluated_pts.push_back ( eval_x ); - - // success: - one_eval_success = barrier.get_one_eval_succ(); - success = barrier.get_success(); - - // asynchronous success count: - if ( success == NOMAD::FULL_SUCCESS && - _elop_tag != _slaves_elop_tags[source] ) - _stats.add_asynchronous_success(); - - // displays: - display_eval_result ( *eval_x , - display_degree , - search , - one_eval_success , - success ); - - if ( !_eval_in_progress[source]->is_in_cache() ) - delete _eval_in_progress[source]; - _eval_in_progress[source] = NULL; - _slaves_elop_tags[source] = -1; - --_nb_in_progress; - - // force quit (by pressing ctrl-c): - if ( !stop && ( NOMAD::Evaluator_Control::_force_quit || NOMAD::Evaluator::get_force_quit() ) ) - { - stop = true; - stop_reason = NOMAD::CTRL_C; - break; - } - - if ( stop && ( stop_reason==NOMAD::ERROR || - stop_reason==NOMAD::UNKNOWN_STOP_REASON ) ) - break; - } - else - NOMAD::Slave::send_signal ( NOMAD::WAIT_SIGNAL , source ); - } - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out.close_block(); +void NOMAD::Evaluator_Control::wait_for_evaluations ( NOMAD::search_type search , + NOMAD::Barrier & true_barrier , + NOMAD::Barrier & sgte_barrier , + NOMAD::Pareto_Front * pareto_front , + bool & stop , + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + std::list<const NOMAD::Eval_Point *> & evaluated_pts ) +{ + if ( _nb_in_progress == 0 ) + return; + + // display degree: + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_display_degree ( search ); + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl + << NOMAD::open_block ( "wait for evaluations" ); + + NOMAD::Barrier & barrier = ( _p.get_opt_only_sgte() ) ? + sgte_barrier : true_barrier; + char signal; + int source; + NOMAD::Eval_Point * eval_x; + NOMAD::success_type one_eval_success; + + while ( _nb_in_progress > 0 ) + { + + source = NOMAD::Slave::receive_signal ( signal ); + eval_x = _eval_in_progress[source]; + + if ( eval_x ) + { + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl << "receive eval point #" << eval_x->get_tag() + << " from slave " << source << std::endl << std::endl; + + receive_eval_result ( search , + eval_x , + true_barrier , + sgte_barrier , + pareto_front , + source , + stop , + stop_reason ); + + // list of processed points: + if ( eval_x->is_in_cache() ) + evaluated_pts.push_back ( eval_x ); + + // success: + one_eval_success = barrier.get_one_eval_succ(); + success = barrier.get_success(); + + // asynchronous success count: + if ( success == NOMAD::FULL_SUCCESS && + _elop_tag != _slaves_elop_tags[source] ) + _stats.add_asynchronous_success(); + + // displays: + display_eval_result ( *eval_x , + display_degree , + search , + one_eval_success , + success ); + + if ( !_eval_in_progress[source]->is_in_cache() ) + delete _eval_in_progress[source]; + _eval_in_progress[source] = NULL; + _slaves_elop_tags[source] = -1; + --_nb_in_progress; + + // force quit (by pressing ctrl-c): + if ( !stop && ( NOMAD::Evaluator_Control::_force_quit || NOMAD::Evaluator::get_force_quit() ) ) + { + stop = true; + stop_reason = NOMAD::CTRL_C; + break; + } + + if ( stop && ( stop_reason==NOMAD::ERROR || + stop_reason==NOMAD::UNKNOWN_STOP_REASON ) ) + break; + } + else + NOMAD::Slave::send_signal ( NOMAD::WAIT_SIGNAL , source ); + } + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out.close_block(); } #endif @@ -1608,21 +1625,21 @@ void NOMAD::Evaluator_Control::wait_for_evaluations /* (private) */ /*----------------------------------------------------------------*/ #ifdef USE_MPI -bool NOMAD::Evaluator_Control::already_in_progress -( const NOMAD::Eval_Point & x ) const +bool NOMAD::Evaluator_Control::already_in_progress ( const NOMAD::Eval_Point & x ) const { - if ( _eval_in_progress ) { - - int x_tag = x.get_tag(); - int np = NOMAD::Slave::get_nb_processes(); - - for ( int i = 0 ; i < np ; ++i ) - if ( _eval_in_progress[i] && - ( _eval_in_progress[i]->get_tag() == x_tag || - _eval_in_progress[i]->Point::operator == ( x ) ) ) - return true; - } - return false; + if ( _eval_in_progress ) + { + + int x_tag = x.get_tag(); + int np = NOMAD::Slave::get_nb_processes(); + + for ( int i = 0 ; i < np ; ++i ) + if ( _eval_in_progress[i] && + ( _eval_in_progress[i]->get_tag() == x_tag || + _eval_in_progress[i]->Point::operator == ( x ) ) ) + return true; + } + return false; } #endif @@ -1630,586 +1647,583 @@ bool NOMAD::Evaluator_Control::already_in_progress /* eval_list_of_points, private version (parallel version) */ /*----------------------------------------------------------------*/ #ifdef USE_MPI -void NOMAD::Evaluator_Control::private_eval_list_of_points -( NOMAD::search_type search , // IN : search type - NOMAD::Barrier & true_barrier , // IN/OUT : the barrier - NOMAD::Barrier & sgte_barrier , // IN/OUT : the surrogate barrier - NOMAD::Pareto_Front * pareto_front , // IN/OUT : the Pareto front - // (can be NULL) - bool & stop , // IN/OUT : stopping criterion - NOMAD::stop_type & stop_reason , // OUT : stopping reason - const NOMAD::Eval_Point *& new_feas_inc , // OUT : new feasible incumbent - const NOMAD::Eval_Point *& new_infeas_inc , // OUT : new infeas. incumbent - NOMAD::success_type & success , // OUT : type of success - std::list<const NOMAD::Eval_Point *> - & evaluated_pts ) // OUT : list of processed pts +void NOMAD::Evaluator_Control::private_eval_list_of_points ( NOMAD::search_type search , // IN : search type + NOMAD::Barrier & true_barrier , // IN/OUT : the barrier + NOMAD::Barrier & sgte_barrier , // IN/OUT : the surrogate barrier + NOMAD::Pareto_Front * pareto_front , // IN/OUT : the Pareto front // (can be NULL) + bool & stop , // IN/OUT : stopping criterion + NOMAD::stop_type & stop_reason , // OUT : stopping reason + const NOMAD::Eval_Point *& new_feas_inc , // OUT : new feasible incumbent + const NOMAD::Eval_Point *& new_infeas_inc , // OUT : new infeas. incumbent + NOMAD::success_type & success , // OUT : type of success + std::list<const NOMAD::Eval_Point *> + & evaluated_pts ) // OUT : list of processed pts { - if ( stop || _eval_lop.empty() ) - { - stop_reason = NOMAD::UNKNOWN_STOP_REASON; - ++_elop_tag; - return; - } - - evaluated_pts.clear(); - - - // initial display: - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_display_degree ( search ); - - if ( display_degree == NOMAD::FULL_DISPLAY ) - { - std::ostringstream msg; - msg << "list of points evaluation (" << search << ")"; - out << std::endl << NOMAD::open_block ( msg.str() ); - } - - // call the Evaluator (virtual) preprocessing of a list of points: - _ev->list_of_points_preprocessing ( _eval_lop ); - - const NOMAD::Eval_Point * old_feasible_incumbent = NULL; - const NOMAD::Eval_Point * old_infeasible_incumbent = NULL; - - // active barrier: - NOMAD::Barrier & barrier = ( _p.get_opt_only_sgte() ) ? + if ( stop || _eval_lop.empty() ) + { + stop_reason = NOMAD::UNKNOWN_STOP_REASON; + ++_elop_tag; + return; + } + + evaluated_pts.clear(); + + + // initial display: + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_display_degree ( search ); + + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + std::ostringstream msg; + msg << "list of points evaluation (" << search << ")"; + out << std::endl << NOMAD::open_block ( msg.str() ); + } + + // call the Evaluator (virtual) preprocessing of a list of points: + _ev->list_of_points_preprocessing ( _eval_lop ); + + const NOMAD::Eval_Point * old_feasible_incumbent = NULL; + const NOMAD::Eval_Point * old_infeasible_incumbent = NULL; + + // active barrier: + NOMAD::Barrier & barrier = ( _p.get_opt_only_sgte() ) ? sgte_barrier : true_barrier; - - old_feasible_incumbent = barrier.get_best_feasible(); - old_infeasible_incumbent = barrier.get_best_infeasible(); - - NOMAD::Double f0; - if ( _p.get_opportunistic_min_f_imprvmt().is_defined() && - old_feasible_incumbent ) - f0 = old_feasible_incumbent->get_f(); - - new_feas_inc = NULL; - new_infeas_inc = NULL; - stop = false; - success = NOMAD::UNSUCCESSFUL; - stop_reason = NOMAD::NO_STOP; - - const NOMAD::Eval_Point * x; - NOMAD::check_failed_type check_failed_reason; - bool count_eval; - std::vector<const NOMAD::Eval_Point *> - to_be_evaluated; - NOMAD::success_type one_eval_success; - bool one_for_luck = false; - bool opp_stop = false; - int init_nb_eval = _stats.get_eval(); - int nb_success = 0; - int k = 0; - int nb_points = static_cast<int> ( _eval_lop.size() ); - int max_bb_eval = _p.get_max_bb_eval(); - - // loop #1: search in cache: - // ------------------------- - std::set<NOMAD::Priority_Eval_Point>::iterator + + old_feasible_incumbent = barrier.get_best_feasible(); + old_infeasible_incumbent = barrier.get_best_infeasible(); + + NOMAD::Double f0; + if ( _p.get_opportunistic_min_f_imprvmt().is_defined() && + old_feasible_incumbent ) + f0 = old_feasible_incumbent->get_f(); + + new_feas_inc = NULL; + new_infeas_inc = NULL; + stop = false; + success = NOMAD::UNSUCCESSFUL; + stop_reason = NOMAD::NO_STOP; + + const NOMAD::Eval_Point * x; + NOMAD::check_failed_type check_failed_reason; + bool count_eval; + std::vector<const NOMAD::Eval_Point *> + to_be_evaluated; + NOMAD::success_type one_eval_success; + bool one_for_luck = false; + bool opp_stop = false; + int init_nb_eval = _stats.get_eval(); + int nb_success = 0; + int k = 0; + int nb_points = static_cast<int> ( _eval_lop.size() ); + int max_bb_eval = _p.get_max_bb_eval(); + + // loop #1: search in cache: + // ------------------------- + std::set<NOMAD::Priority_Eval_Point>::iterator it = _eval_lop.begin() , end = _eval_lop.end(); - while ( !stop && !opp_stop && it != end ) - { - - x = it->get_point(); - - x->set_current_run ( true ); - - // displays: - if ( display_degree == NOMAD::FULL_DISPLAY ) - { - - // open the evaluation block: - { - std::ostringstream oss; - if ( x->get_eval_type() == NOMAD::SGTE ) - oss << "surrogate "; - oss << "evaluation " << k+1 << "/" << nb_points; - out << std::endl << NOMAD::open_block ( oss.str() ); - } - - out << std::endl << "point #" << x->get_tag() << " ( "; - x->Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); - out << " )" << std::endl; - if ( x->get_direction() ) - { - out << "direction : " << *x->get_direction() << std::endl; - NOMAD::Point delta; - x->get_signature()->get_mesh()->get_delta(delta); - out << "direction d : ( " << *x->get_direction()/delta << " )" << std::endl; - } - if ( x->get_signature() ) - out << "mesh indices: ( " << x->get_signature()->get_mesh()->get_mesh_indices() << " )" << std::endl; - out << std::endl; - - - - } - - // check if the evaluation at this point is already in progress: - if ( !already_in_progress ( *x ) ) - { - - // current point check (# of bb outputs, bounds, integer values, fixed-vars): - if ( x->check ( _p.get_bb_nb_outputs() , check_failed_reason ) ) - { - - count_eval = true; - - // point in cache: - if ( cache_check ( x , - true_barrier , - sgte_barrier , - pareto_front , - count_eval , - barrier.get_h_max() , - display_degree ) ) - - { - - // list of processed points: - evaluated_pts.push_back ( x ); - - // check stopping criteria: - check_stopping_criteria ( search , count_eval , *x , stop , stop_reason ); - - // success: - one_eval_success = barrier.get_one_eval_succ(); - success = barrier.get_success(); - - // displays: - display_eval_result ( *x , - display_degree , - search , - one_eval_success , - success ); - - // stop the evaluations (opportunistic strategy) ? - if ( stop_evaluations ( *x , - search , - k , - nb_points , - stop , - display_degree , - one_eval_success , - success , - init_nb_eval , - f0 , - barrier , - nb_success , - one_for_luck ) ) - { - _stats.add_interrupted_eval(); - opp_stop = true; // will break loop #1 - } - - // close the evaluation block: - if ( display_degree == NOMAD::FULL_DISPLAY ) - out.close_block(); - } - - // point not in cache (the point is saved for loop #2): - else - { - - // blackbox or surrogate evaluations are allowed: - if ( ( x->get_eval_type() == NOMAD::TRUTH && max_bb_eval != 0 ) || - ( x->get_eval_type() == NOMAD::SGTE && _p.get_max_sgte_eval() != 0 ) ) - to_be_evaluated.push_back ( x ); - - // close the evaluation block: - if ( display_degree == NOMAD::FULL_DISPLAY ) - out.close_block(); - } - } - - // points[k]->check() failed (close the evaluation block): - else if ( display_degree == NOMAD::FULL_DISPLAY ) - { - std::ostringstream oss; - oss << "check failed (" << check_failed_reason << ")"; - out.close_block ( oss.str() ); - } - } - - // evaluation already in progress (close the evaluation block): - else if ( display_degree == NOMAD::FULL_DISPLAY ) - { - std::ostringstream oss; - oss << "evaluation of point #" << x->get_tag() - << " already in progress"; - out.close_block ( oss.str() ); - } - - ++it; - ++k; - - // force quit (by pressing ctrl-c): - if ( !stop && (NOMAD::Evaluator_Control::_force_quit || NOMAD::Evaluator::get_force_quit()) ) - { - stop = true; - stop_reason = NOMAD::CTRL_C; - } - - } // end of loop #1 - // -------------- - - // loop #2: evaluations: - // --------------------- - int nb_to_evaluate = static_cast<int> ( to_be_evaluated.size() ); - int nb_evaluated = 0; - int cur = 0; - int source; - char signal; - NOMAD::Eval_Point * eval_x; - - while ( !stop && !opp_stop && nb_evaluated < nb_to_evaluate ) - { - - source = NOMAD::Slave::receive_signal ( signal ); - - // 2.1: send the RESULT signal, receive and process the evaluation result: - // ----------------------------------------------------------------------- - eval_x = _eval_in_progress[source]; - if ( eval_x ) - { - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl << "receive eval point #" << eval_x->get_tag() - << " from slave " << source << std::endl << std::endl; - - receive_eval_result ( search , - eval_x , - true_barrier , - sgte_barrier , - pareto_front , - source , - stop , - stop_reason ); - - - // list of processed points: - if ( eval_x->is_in_cache() ) - evaluated_pts.push_back ( eval_x ); - - // success: - one_eval_success = barrier.get_one_eval_succ(); - success = barrier.get_success(); - - // asynchronous success count: - if ( success == NOMAD::FULL_SUCCESS && - _elop_tag != _slaves_elop_tags[source] ) - _stats.add_asynchronous_success(); - - // displays: - display_eval_result ( *eval_x , - display_degree , - search , - one_eval_success , - success ); - - // stop the evaluations (opportunistic strategy) ? - if ( stop_evaluations ( *eval_x , - search , - nb_evaluated , - nb_to_evaluate , - stop , - display_degree , - one_eval_success , - success , - init_nb_eval , - f0 , - barrier , - nb_success , - one_for_luck ) ) - { - _stats.add_interrupted_eval(); - opp_stop = true; // will break loop #2 - } - - _eval_in_progress[source] = NULL; - _slaves_elop_tags[source] = -1; - --_nb_in_progress; - ++nb_evaluated; - } - - // 2.2: send the EVAL signal and launch a new evaluation: - // ------------------------------------------------------ - else - { - - // do not launch a new evaluation if... - - // there is no more points to be evaluated: - if ( cur == nb_to_evaluate ) - NOMAD::Slave::send_signal ( NOMAD::WAIT_SIGNAL , source ); - - // or if bbe+_nb_in_progress >= max_bb_eval: - else if ( to_be_evaluated[cur]->get_eval_type() == NOMAD::TRUTH && - max_bb_eval > 0 && - _stats.get_bb_eval() + _nb_in_progress >= max_bb_eval ) - { - stop = true; - stop_reason = NOMAD::MAX_BB_EVAL_REACHED; - NOMAD::Slave::send_signal ( NOMAD::WAIT_SIGNAL , source ); - } - - else - { - - // get the signature: - NOMAD::Signature * signature = to_be_evaluated[cur]->get_signature(); - - // there is no signature (error): - if ( !signature ) - { - stop = true; - stop_reason = NOMAD::ERROR; - if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) - out << std::endl - << "Error in Evaluator_Control::private_eval_list_of_points():" - << " the point #" << to_be_evaluated[cur]->get_tag() - << " has no signature" << std::endl << std::endl; - NOMAD::Slave::send_signal ( NOMAD::WAIT_SIGNAL , source ); - } - - else - { - - NOMAD::Slave::send_signal ( NOMAD::EVAL_SIGNAL , source ); - - eval_x = &NOMAD::Cache::get_modifiable_point ( *to_be_evaluated[cur++] ); - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl - << "send eval point #" << eval_x->get_tag() - << " to slave " << source << std::endl; - - // 1. scaling: - bool do_scaling = signature->get_scaling().is_defined(); - if ( do_scaling ) - eval_x->scale(); - - // 2. send the point: - _slave->send_eval_point ( eval_x , source , barrier.get_h_max() ); - - // 3. unscaling: - if ( do_scaling ) - eval_x->unscale(); - - eval_x->set_eval_status ( NOMAD::EVAL_IN_PROGRESS ); - - _eval_in_progress[source] = eval_x; - _slaves_elop_tags[source] = _elop_tag; - ++_nb_in_progress; - } - } - } - - // force quit (by pressing ctrl-c): - if ( !stop && ( NOMAD::Evaluator_Control::_force_quit || NOMAD::Evaluator::get_force_quit() )) - { - stop = true; - stop_reason = NOMAD::CTRL_C; - } - - } // end of loop #2 - // -------------- - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl - << "number of evaluations in progress: " << _nb_in_progress - << std::endl << std::endl; - - // the algorithm is not asynchronous: we have - // to wait for all the evaluations in progress: - if ( !_p.get_asynchronous() ) - - wait_for_evaluations ( search , - true_barrier , - sgte_barrier , - pareto_front , - stop , - stop_reason , - success , - evaluated_pts ); - - // barriers update: - if ( !stop ) - { - true_barrier.update_and_reset_success(); - sgte_barrier.update_and_reset_success(); - } - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << NOMAD::close_block ( "end of evaluations" ) << std::endl; - - // incumbents update: - const NOMAD::Eval_Point * bf = barrier.get_best_feasible (); - const NOMAD::Eval_Point * bi = barrier.get_best_infeasible(); - if ( bf && bf != old_feasible_incumbent ) - new_feas_inc = bf; - if ( bi && bi != old_infeasible_incumbent ) - new_infeas_inc = bi; - - // the list of eval. points is deleted (only points in the cache are kept): - clear_eval_lop(); - - // update the unique eval_lop() tag: - ++_elop_tag; - + while ( !stop && !opp_stop && it != end ) + { + + x = it->get_point(); + + x->set_current_run ( true ); + + // displays: + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + + // open the evaluation block: + { + std::ostringstream oss; + if ( x->get_eval_type() == NOMAD::SGTE ) + oss << "surrogate "; + oss << "evaluation " << k+1 << "/" << nb_points; + out << std::endl << NOMAD::open_block ( oss.str() ); + } + + out << std::endl << "point #" << x->get_tag() << " ( "; + x->Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); + out << " )" << std::endl; + if ( x->get_direction() ) + { + out << "direction : " << *x->get_direction() << std::endl; + NOMAD::Point delta; + x->get_signature()->get_mesh()->get_delta(delta); + out << "direction/delta : ( " << *x->get_direction()/delta << " )" << std::endl; + } + if ( x->get_signature() ) + out << "mesh indices : ( " << x->get_signature()->get_mesh()->get_mesh_indices() << " )" << std::endl; + out << std::endl; + + + + } + + // check if the evaluation at this point is already in progress: + if ( !already_in_progress ( *x ) ) + { + + // current point check (# of bb outputs, bounds, integer values, fixed-vars): + if ( x->check ( _p.get_bb_nb_outputs() , check_failed_reason ) ) + { + + count_eval = true; + + // point in cache: + if ( cache_check ( x , + true_barrier , + sgte_barrier , + pareto_front , + count_eval , + barrier.get_h_max() , + display_degree ) ) + + { + + // list of processed points: + evaluated_pts.push_back ( x ); + + // check stopping criteria: + check_stopping_criteria ( search , count_eval , *x , stop , stop_reason ); + + // success: + one_eval_success = barrier.get_one_eval_succ(); + success = barrier.get_success(); + + // displays: + display_eval_result ( *x , + display_degree , + search , + one_eval_success , + success ); + + // stop the evaluations (opportunistic strategy) ? + if ( stop_evaluations ( *x , + search , + k , + nb_points , + stop , + display_degree , + one_eval_success , + success , + init_nb_eval , + f0 , + barrier , + nb_success , + one_for_luck ) ) + { + _stats.add_interrupted_eval(); + opp_stop = true; // will break loop #1 + } + + // close the evaluation block: + if ( display_degree == NOMAD::FULL_DISPLAY ) + out.close_block(); + } + + // point not in cache (the point is saved for loop #2): + else + { + + // blackbox or surrogate evaluations are allowed: + if ( ( x->get_eval_type() == NOMAD::TRUTH && max_bb_eval != 0 ) || + ( x->get_eval_type() == NOMAD::SGTE && _p.get_max_sgte_eval() != 0 ) ) + to_be_evaluated.push_back ( x ); + + // close the evaluation block: + if ( display_degree == NOMAD::FULL_DISPLAY ) + out.close_block(); + } + } + + // points[k]->check() failed (close the evaluation block): + else if ( display_degree == NOMAD::FULL_DISPLAY ) + { + std::ostringstream oss; + oss << "check failed (" << check_failed_reason << ")"; + out.close_block ( oss.str() ); + } + } + + // evaluation already in progress (close the evaluation block): + else if ( display_degree == NOMAD::FULL_DISPLAY ) + { + std::ostringstream oss; + oss << "evaluation of point #" << x->get_tag() + << " already in progress"; + out.close_block ( oss.str() ); + } + + ++it; + ++k; + + // force quit (by pressing ctrl-c): + if ( !stop && (NOMAD::Evaluator_Control::_force_quit || NOMAD::Evaluator::get_force_quit()) ) + { + stop = true; + stop_reason = NOMAD::CTRL_C; + } + + } // end of loop #1 + // -------------- + + // loop #2: evaluations: + // --------------------- + int nb_to_evaluate = static_cast<int> ( to_be_evaluated.size() ); + int nb_evaluated = 0; + int cur = 0; + int source; + char signal; + NOMAD::Eval_Point * eval_x; + + while ( !stop && !opp_stop && nb_evaluated < nb_to_evaluate ) + { + + source = NOMAD::Slave::receive_signal ( signal ); + + // 2.1: send the RESULT signal, receive and process the evaluation result: + // ----------------------------------------------------------------------- + eval_x = _eval_in_progress[source]; + if ( eval_x ) + { + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl << "receive eval point #" << eval_x->get_tag() + << " from slave " << source << std::endl << std::endl; + + receive_eval_result ( search , + eval_x , + true_barrier , + sgte_barrier , + pareto_front , + source , + stop , + stop_reason ); + + + // list of processed points: + if ( eval_x->is_in_cache() ) + evaluated_pts.push_back ( eval_x ); + + // success: + one_eval_success = barrier.get_one_eval_succ(); + success = barrier.get_success(); + + // asynchronous success count: + if ( success == NOMAD::FULL_SUCCESS && + _elop_tag != _slaves_elop_tags[source] ) + _stats.add_asynchronous_success(); + + // displays: + display_eval_result ( *eval_x , + display_degree , + search , + one_eval_success , + success ); + + // stop the evaluations (opportunistic strategy) ? + if ( stop_evaluations ( *eval_x , + search , + nb_evaluated , + nb_to_evaluate , + stop , + display_degree , + one_eval_success , + success , + init_nb_eval , + f0 , + barrier , + nb_success , + one_for_luck ) ) + { + _stats.add_interrupted_eval(); + opp_stop = true; // will break loop #2 + } + + _eval_in_progress[source] = NULL; + _slaves_elop_tags[source] = -1; + --_nb_in_progress; + ++nb_evaluated; + } + + // 2.2: send the EVAL signal and launch a new evaluation: + // ------------------------------------------------------ + else + { + + // do not launch a new evaluation if... + + // there is no more points to be evaluated: + if ( cur == nb_to_evaluate ) + NOMAD::Slave::send_signal ( NOMAD::WAIT_SIGNAL , source ); + + // or if bbe+_nb_in_progress >= max_bb_eval: + else if ( to_be_evaluated[cur]->get_eval_type() == NOMAD::TRUTH && + max_bb_eval > 0 && + _stats.get_bb_eval() + _nb_in_progress >= max_bb_eval ) + { + stop = true; + stop_reason = NOMAD::MAX_BB_EVAL_REACHED; + NOMAD::Slave::send_signal ( NOMAD::WAIT_SIGNAL , source ); + } + + else + { + + // get the signature: + NOMAD::Signature * signature = to_be_evaluated[cur]->get_signature(); + + // there is no signature (error): + if ( !signature ) + { + stop = true; + stop_reason = NOMAD::ERROR; + if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) + out << std::endl + << "Error in Evaluator_Control::private_eval_list_of_points():" + << " the point #" << to_be_evaluated[cur]->get_tag() + << " has no signature" << std::endl << std::endl; + NOMAD::Slave::send_signal ( NOMAD::WAIT_SIGNAL , source ); + } + + else + { + + NOMAD::Slave::send_signal ( NOMAD::EVAL_SIGNAL , source ); + + eval_x = &NOMAD::Cache::get_modifiable_point ( *to_be_evaluated[cur++] ); + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl + << "send eval point #" << eval_x->get_tag() + << " to slave " << source << std::endl; + + // 1. scaling: + bool do_scaling = signature->get_scaling().is_defined(); + if ( do_scaling ) + eval_x->scale(); + + // 2. send the point: + _slave->send_eval_point ( eval_x , source , barrier.get_h_max() ); + + // 3. unscaling: + if ( do_scaling ) + eval_x->unscale(); + + eval_x->set_eval_status ( NOMAD::EVAL_IN_PROGRESS ); + + _eval_in_progress[source] = eval_x; + _slaves_elop_tags[source] = _elop_tag; + ++_nb_in_progress; + } + } + } + + // force quit (by pressing ctrl-c): + if ( !stop && ( NOMAD::Evaluator_Control::_force_quit || NOMAD::Evaluator::get_force_quit() )) + { + stop = true; + stop_reason = NOMAD::CTRL_C; + } + + } // end of loop #2 + // -------------- + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl + << "number of evaluations in progress: " << _nb_in_progress + << std::endl << std::endl; + + // the algorithm is not asynchronous: we have + // to wait for all the evaluations in progress: + if ( !_p.get_asynchronous() ) + + wait_for_evaluations ( search , + true_barrier , + sgte_barrier , + pareto_front , + stop , + stop_reason , + success , + evaluated_pts ); + + // barriers update: + if ( !stop ) + { + true_barrier.update_and_reset_success(); + sgte_barrier.update_and_reset_success(); + } + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << NOMAD::close_block ( "end of evaluations" ) << std::endl; + + // incumbents update: + const NOMAD::Eval_Point * bf = barrier.get_best_feasible (); + const NOMAD::Eval_Point * bi = barrier.get_best_infeasible(); + if ( bf && bf != old_feasible_incumbent ) + new_feas_inc = bf; + if ( bi && bi != old_infeasible_incumbent ) + new_infeas_inc = bi; + + // the list of eval. points is deleted (only points in the cache are kept): + clear_eval_lop(); + + // update the unique eval_lop() tag: + ++_elop_tag; + } // end of eval_lop() parallel version -// C. Tribes may 28, 2014 --- method for points block evaluation of a given max size /*----------------------------------------------------------------*/ /* eval_list_of_points, private version (scalar version) */ /*----------------------------------------------------------------*/ #else -void NOMAD::Evaluator_Control::private_eval_list_of_points -( NOMAD::search_type search , // IN : search type - NOMAD::Barrier & true_barrier , // IN/OUT : the barrier - NOMAD::Barrier & sgte_barrier , // IN/OUT : the surrogate barrier - NOMAD::Pareto_Front * pareto_front , // IN/OUT : the Pareto front - // (can be NULL) - bool & stop , // IN/OUT : stopping criterion - NOMAD::stop_type & stop_reason , // OUT : stopping reason - const NOMAD::Eval_Point *& new_feas_inc , // OUT : new feasible incumbent - const NOMAD::Eval_Point *& new_infeas_inc , // OUT : new infeas. incumbent - NOMAD::success_type & success , // OUT : type of success - std::list<const NOMAD::Eval_Point *> - & evaluated_pts ) // OUT : list of processed pts +void NOMAD::Evaluator_Control::private_eval_list_of_points ( NOMAD::search_type search , // IN : search type + NOMAD::Barrier & true_barrier , // IN/OUT : the barrier + NOMAD::Barrier & sgte_barrier , // IN/OUT : the surrogate barrier + NOMAD::Pareto_Front * pareto_front , // IN/OUT : the Pareto front + // (can be NULL) + bool & stop , // IN/OUT : stopping criterion + NOMAD::stop_type & stop_reason , // OUT : stopping reason + const NOMAD::Eval_Point *& new_feas_inc , // OUT : new feasible incumbent + const NOMAD::Eval_Point *& new_infeas_inc , // OUT : new infeas. incumbent + NOMAD::success_type & success , // OUT : type of success + std::list<const NOMAD::Eval_Point *> + & evaluated_pts ) // OUT : list of processed pts { - if ( stop || _eval_lop.empty() ) - { - stop_reason = NOMAD::UNKNOWN_STOP_REASON; - return; - } - - evaluated_pts.clear(); - - // initial display: - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_display_degree ( search ); - - - if ( display_degree == NOMAD::FULL_DISPLAY ) - { - std::ostringstream oss; - oss << "list of points evaluation (" << search << ")"; - out << std::endl << NOMAD::open_block ( oss.str() ); - } - - // call the Evaluator (virtual) preprocessing of a list of points: - _ev->list_of_points_preprocessing ( _eval_lop ); - - const NOMAD::Eval_Point * old_feasible_incumbent = NULL; - const NOMAD::Eval_Point * old_infeasible_incumbent = NULL; - - // active barrier: - NOMAD::Barrier & barrier = ( _p.get_opt_only_sgte() ) ? sgte_barrier : true_barrier; - - old_feasible_incumbent = barrier.get_best_feasible(); - old_infeasible_incumbent = barrier.get_best_infeasible(); - - NOMAD::Double f0; - if ( _p.get_opportunistic_min_f_imprvmt().is_defined() && - old_feasible_incumbent ) - f0 = old_feasible_incumbent->get_f(); - - new_feas_inc = NULL; - new_infeas_inc = NULL; - stop = false; - success = NOMAD::UNSUCCESSFUL; - stop_reason = NOMAD::NO_STOP; - - const NOMAD::Eval_Point * x; - NOMAD::check_failed_type check_failed_reason; - bool one_for_luck = false; - bool stop_evals = false; - int init_nb_eval = _stats.get_eval(); - int nb_success = 0; - int k = 0; - int k_block = 0; - int nb_points = get_nb_eval_points(); - int block_size = _p.get_bb_max_block_size(); - int block_nb = 1; - - // main loop (on the list of points): - // ---------------------------------- - std::set<NOMAD::Priority_Eval_Point>::iterator it = _eval_lop.begin() , end = _eval_lop.end(); - std::list<NOMAD::Eval_Point *> list_x,list_eval; - std::list<bool> count_list_eval; - - while ( !stop_evals && !stop && it != end ) - { - - - if ( block_size > 1 && display_degree == NOMAD::FULL_DISPLAY ) - { - std::ostringstream oss; - oss << "Block of evaluations (" << block_nb <<")"; - out << std::endl << NOMAD::open_block ( oss.str() ); - } - - // Creation of a block of evaluations from the list - //---------------------- - k_block=k; + if ( stop || _eval_lop.empty() ) + { + stop_reason = NOMAD::UNKNOWN_STOP_REASON; + return; + } + + evaluated_pts.clear(); + + // initial display: + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_display_degree ( search ); + + + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + std::ostringstream oss; + oss << "list of points evaluation (" << search << ")"; + out << std::endl << NOMAD::open_block ( oss.str() ); + } + + // call the Evaluator (virtual) preprocessing of a list of points: + _ev->list_of_points_preprocessing ( _eval_lop ); + + const NOMAD::Eval_Point * old_feasible_incumbent = NULL; + const NOMAD::Eval_Point * old_infeasible_incumbent = NULL; + + // active barrier: + NOMAD::Barrier & barrier = ( _p.get_opt_only_sgte() ) ? sgte_barrier : true_barrier; + + old_feasible_incumbent = barrier.get_best_feasible(); + old_infeasible_incumbent = barrier.get_best_infeasible(); + + NOMAD::Double f0; + if ( _p.get_opportunistic_min_f_imprvmt().is_defined() && + old_feasible_incumbent ) + f0 = old_feasible_incumbent->get_f(); + + new_feas_inc = NULL; + new_infeas_inc = NULL; + stop = false; + success = NOMAD::UNSUCCESSFUL; + stop_reason = NOMAD::NO_STOP; + + const NOMAD::Eval_Point * x; + NOMAD::check_failed_type check_failed_reason; + bool one_for_luck = false; + bool stop_evals = false; + int init_nb_eval = _stats.get_eval(); + int nb_success = 0; + int k = 0; + int k_block = 0; + int nb_points = get_nb_eval_points(); + int block_size = _p.get_bb_max_block_size(); + int block_nb = 1; + + // main loop (on the list of points): + // ---------------------------------- + std::set<NOMAD::Priority_Eval_Point>::iterator it = _eval_lop.begin() , end = _eval_lop.end(); + std::list<NOMAD::Eval_Point *> list_x,list_eval; + std::list<bool> count_list_eval; + + while ( !stop_evals && !stop && it != end ) + { + + + if ( block_size > 1 && display_degree == NOMAD::FULL_DISPLAY ) + { + std::ostringstream oss; + oss << "Block of evaluations (" << block_nb <<")"; + out << std::endl << NOMAD::open_block ( oss.str() ); + } + + // Creation of a block of evaluations from the list + //---------------------- + k_block=k; bool opportunistic_success_from_cache_point=false; - while (list_eval.size()!=static_cast<size_t>(block_size) && it != end && ! stop_evals) - { - - x = it->get_point(); - x->set_current_run ( true ); - - // displays: - if ( display_degree == NOMAD::FULL_DISPLAY ) - { - { - // open the evaluation block: - std::ostringstream oss; - oss << "submitted "; - if ( x->get_eval_type() == NOMAD::SGTE ) - oss << "surrogate "; - oss << "evaluation " << k+1 << "/" << nb_points; - out << std::endl << NOMAD::open_block ( oss.str() ); - } - - out << std::endl << "point #" << x->get_tag() << " ( "; - x->Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); - out << " )" << std::endl; - if ( x->get_direction() ) - { - out << "direction : " << *x->get_direction() << std::endl; - NOMAD::Point delta; - x->get_signature()->get_mesh()->get_delta(delta); - out << "direction d : ( " << *x->get_direction()/delta << " )" << std::endl; - } - if ( x->get_signature() ) - out << "mesh indices: ( " << x->get_signature()->get_mesh()->get_mesh_indices() << " )" << std::endl; - out << std::endl; - - } - - // current point check (# of bb outputs, bounds, integer values, fixed-vars): - if ( x->check ( _p.get_bb_nb_outputs() , check_failed_reason ) ) - { - bool count_eval = true; - bool has_been_in_cache=cache_check ( x , - true_barrier , - sgte_barrier , - pareto_front , - count_eval , - barrier.get_h_max() , - display_degree ); - - - // put the point in a block list for evaluation: - if ( !has_been_in_cache ) - list_eval.push_back(&NOMAD::Cache::get_modifiable_point ( *x )); - else - { - // check stopping criteria for points in cache - check_stopping_criteria ( search , count_eval , *x , stop , stop_reason ); + while (list_eval.size()!=static_cast<size_t>(block_size) && it != end && ! stop_evals) + { + + x = it->get_point(); + x->set_current_run ( true ); + + // displays: + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + { + // open the evaluation block: + std::ostringstream oss; + oss << "submitted "; + if ( x->get_eval_type() == NOMAD::SGTE ) + oss << "surrogate "; + oss << "evaluation " << k+1 << "/" << nb_points; + out << std::endl << NOMAD::open_block ( oss.str() ); + } + + out << std::endl << "point #" << x->get_tag() << " ( "; + x->Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); + out << " )" << std::endl; + if ( x->get_direction() ) + { + out << "direction : " << *x->get_direction() << std::endl; + NOMAD::Point delta; + x->get_signature()->get_mesh()->get_delta(delta); + out << "direction/delta: ( " << *x->get_direction()/delta << " )" << std::endl; + } + if ( x->get_signature() ) + out << "mesh indices : ( " << x->get_signature()->get_mesh()->get_mesh_indices() << " )" << std::endl; + out << std::endl; + + } + + // current point check (# of bb outputs, bounds, integer values, fixed-vars): + if ( x->check ( _p.get_bb_nb_outputs() , check_failed_reason ) ) + { + bool count_eval = true; + bool has_been_in_cache=cache_check ( x , + true_barrier , + sgte_barrier , + pareto_front , + count_eval , + barrier.get_h_max() , + display_degree ); + + + // put the point in a block list for evaluation: + if ( !has_been_in_cache ) + list_eval.push_back(&NOMAD::Cache::get_modifiable_point ( *x )); + else + { + // check stopping criteria for points in cache + check_stopping_criteria ( search , count_eval , *x , stop , stop_reason ); + // process the evaluated point: process_eval_point ( *x , @@ -2221,26 +2235,25 @@ void NOMAD::Evaluator_Control::private_eval_list_of_points NOMAD::success_type one_eval_success = barrier.get_one_eval_succ(); success = barrier.get_success(); - + opportunistic_success_from_cache_point = stop_evaluations ( *x , - search , - k , - nb_points , - stop , - display_degree , - one_eval_success , - success , - init_nb_eval , - f0 , - barrier , - nb_success , - one_for_luck ); - - - } - - if (!stop) - list_x.push_back(&NOMAD::Cache::get_modifiable_point ( *x )); + search , + k , + nb_points , + stop , + display_degree , + one_eval_success , + success , + init_nb_eval , + f0 , + barrier , + nb_success , + one_for_luck ); + + } + + if (!stop) + list_x.push_back(&NOMAD::Cache::get_modifiable_point ( *x )); if ( opportunistic_success_from_cache_point ) { @@ -2249,213 +2262,209 @@ void NOMAD::Evaluator_Control::private_eval_list_of_points if ( block_size > 1 && display_degree == NOMAD::FULL_DISPLAY ) out << NOMAD::close_block (); - + stop_evals = true; break; } - - } - // points[k]->check() failed: - else if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "check failed (" << check_failed_reason << ")" << std::endl; - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << NOMAD::close_block(); - - - ++it; - ++k; - } - if (list_eval.size()!=0) - { - - count_list_eval.assign(list_eval.size(), false); - - if (_p.eval_points_as_block()) - { - eval_points ( list_eval , - true_barrier , - sgte_barrier , - pareto_front , - count_list_eval , - stop , - stop_reason , - barrier.get_h_max() ); - - // check stopping criteria for points NOT in cache - std::list<NOMAD::Eval_Point *>::iterator it_eval; - } - else - { - // bool count_eval=false; - x=*(list_eval.begin()); - eval_point ( NOMAD::Cache::get_modifiable_point ( *x ) , - true_barrier , - sgte_barrier , - pareto_front , - count_list_eval.front() , - stop , - stop_reason , - barrier.get_h_max() ); - - } - - } - + } + // points[k]->check() failed: + else if ( display_degree == NOMAD::FULL_DISPLAY ) + out << "check failed (" << check_failed_reason << ")" << std::endl; + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << NOMAD::close_block(); + + + ++it; + ++k; + } + if ( list_eval.size() != 0 ) + { + + count_list_eval.assign( list_eval.size(), false); + + if (_p.eval_points_as_block()) + { + eval_points ( list_eval , + true_barrier , + sgte_barrier , + pareto_front , + count_list_eval , + stop , + stop_reason , + barrier.get_h_max()); + } + else + { + // bool count_eval=false; + x=*(list_eval.begin()); + eval_point ( NOMAD::Cache::get_modifiable_point ( *x ) , + true_barrier , + sgte_barrier , + pareto_front , + count_list_eval.front() , + stop , + stop_reason , + barrier.get_h_max() ); + + } + + } + // Stop evals and exit the loop if ( stop_evals ) break; - - // Check all the points in the evaluation block - std::list<NOMAD::Eval_Point *>::iterator it_x,it_eval; - k=k_block; - it_eval=list_eval.begin(); - for(it_x=list_x.begin();it_x!=list_x.end();++it_x) - { - - x=(*it_x); - - // process the evaluated point: - if ( x->is_eval_ok() && x->is_in_cache() ) - process_eval_point ( *x , - ( x->get_eval_type() == NOMAD::TRUTH ) ? - true_barrier : sgte_barrier , - pareto_front ); - - - - - // success: - NOMAD::success_type one_eval_success = barrier.get_one_eval_succ(); - success = barrier.get_success(); - - // list of processed points: - if ( x->is_in_cache() ) - evaluated_pts.push_back ( x ); - else - { - // this situation may occur on very thin meshes: - // the point has not been found in the cache - // and it failed to be inserted. - one_eval_success = NOMAD::UNSUCCESSFUL; - } - - // displays: - if ( block_size > 0 && display_degree == NOMAD::FULL_DISPLAY ) - { - // open the evaluation block: - std::ostringstream oss; - if ( x->get_eval_type() == NOMAD::SGTE ) - oss << "surrogate "; - oss << "evaluation " << k+1 << "/" << nb_points; - out << std::endl << NOMAD::open_block ( oss.str() ); - out << std::endl << "point #" << x->get_tag() << std::endl; - } - - std::list<bool>::iterator it_count=count_list_eval.begin(); - for(it_eval=list_eval.begin();it_eval!=list_eval.end();++it_eval,++it_count) - { - if ((*it_eval)==x) - { - - // count the bb evaluation: - if ( *it_count ) - { - if ( (*it_eval)->get_eval_type() == NOMAD::SGTE ) - _stats.add_sgte_eval(); - else - { - // current mads bbe evaluation - _stats.add_bb_eval(); - } - - // count the output stats (STAT_SUM and STAT_AVG): - if ( _p.check_stat_sum() || _p.check_stat_avg() ) - count_output_stats(*(*it_eval)); - } - - check_stopping_criteria ( search , *it_count ,*(*it_eval) , stop , stop_reason ); - - if ( *it_count ) - display_eval_result ( *x, display_degree, search, one_eval_success, success ); - - break; - } - } - - - - // close the evaluation block: - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << NOMAD::close_block (); - - // stop the evaluations (opportunistic strategy) ? - if ( !stop_evals && stop_evaluations ( *x , - search , - k , - nb_points , - stop , - display_degree , - one_eval_success , - success , - init_nb_eval , - f0 , - barrier , - nb_success , - one_for_luck ) ) - { - _stats.add_interrupted_eval(); - stop_evals = true; - } - - - ++k; - - } - - if ( block_size > 1 && display_degree == NOMAD::FULL_DISPLAY ) - out << NOMAD::close_block (); - - - // force quit (by pressing ctrl-c): - if ( !stop && ( NOMAD::Evaluator_Control::_force_quit || NOMAD::Evaluator::get_force_quit()) ) - { - stop = true; - stop_reason = NOMAD::CTRL_C; - } - - list_x.clear(); - list_eval.clear(); - - ++block_nb; - - }// end of test for list evaluation - - // barriers update: - if ( !stop ) - { - true_barrier.update_and_reset_success(); - sgte_barrier.update_and_reset_success(); - } - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl << NOMAD::close_block ( "end of evaluations" ) - << std::endl; - - // incumbents update: - const NOMAD::Eval_Point * bf = barrier.get_best_feasible (); - const NOMAD::Eval_Point * bi = barrier.get_best_infeasible(); - if ( bf && bf != old_feasible_incumbent ) - new_feas_inc = bf; - if ( bi && bi != old_infeasible_incumbent ) - new_infeas_inc = bi; - - // the list of eval. points is deleted (only points in the cache are kept): - clear_eval_lop(); - + + // Check all the points in the evaluation block + std::list<NOMAD::Eval_Point *>::iterator it_x,it_eval; + k=k_block; + it_eval=list_eval.begin(); + for(it_x=list_x.begin();it_x!=list_x.end();++it_x) + { + + x=(*it_x); + + // process the evaluated point: + if ( x->is_eval_ok() && x->is_in_cache() ) + process_eval_point ( *x , + ( x->get_eval_type() == NOMAD::TRUTH ) ? + true_barrier : sgte_barrier , + pareto_front ); + + + + + // success: + NOMAD::success_type one_eval_success = barrier.get_one_eval_succ(); + success = barrier.get_success(); + + // list of processed points: + if ( x->is_in_cache() ) + evaluated_pts.push_back ( x ); + else + { + // this situation may occur on very thin meshes: + // the point has not been found in the cache + // and it failed to be inserted. + one_eval_success = NOMAD::UNSUCCESSFUL; + } + + // displays: + if ( block_size > 0 && display_degree == NOMAD::FULL_DISPLAY ) + { + // open the evaluation block: + std::ostringstream oss; + if ( x->get_eval_type() == NOMAD::SGTE ) + oss << "surrogate "; + oss << "evaluation " << k+1 << "/" << nb_points; + out << std::endl << NOMAD::open_block ( oss.str() ); + out << std::endl << "point #" << x->get_tag() << std::endl; + } + + + std::list<bool>::iterator it_count=count_list_eval.begin(); + for(it_eval=list_eval.begin();it_eval!=list_eval.end();++it_eval,++it_count) + { + if ((*it_eval)==x) + { + + // count the bb evaluation: + if ( *it_count ) + { + if ( (*it_eval)->get_eval_type() == NOMAD::SGTE ) + _stats.add_sgte_eval(); + else + { + // current mads bbe evaluation + _stats.add_bb_eval(); + } + + // count the output stats (STAT_SUM and STAT_AVG): + if ( _p.check_stat_sum() || _p.check_stat_avg() ) + count_output_stats(*(*it_eval)); + } + + check_stopping_criteria ( search , *it_count ,*(*it_eval) , stop , stop_reason ); + + if ( *it_count ) + display_eval_result ( *x, display_degree, search, one_eval_success, success ); + + break; + } + } + + + + // close the evaluation block: + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << NOMAD::close_block (); + + // stop the evaluations (opportunistic strategy) ? + if ( !stop_evals && stop_evaluations ( *x , + search , + k , + nb_points , + stop , + display_degree , + one_eval_success , + success , + init_nb_eval , + f0 , + barrier , + nb_success , + one_for_luck ) ) + { + _stats.add_interrupted_eval(); + stop_evals = true; + } + + + ++k; + + } + + if ( block_size > 1 && display_degree == NOMAD::FULL_DISPLAY ) + out << NOMAD::close_block (); + + + // force quit (by pressing ctrl-c): + if ( !stop && ( NOMAD::Evaluator_Control::_force_quit || NOMAD::Evaluator::get_force_quit()) ) + { + stop = true; + stop_reason = NOMAD::CTRL_C; + } + + list_x.clear(); + list_eval.clear(); + + ++block_nb; + + }// end of test for list evaluation + + // barriers update: + if ( !stop ) + { + true_barrier.update_and_reset_success(); + sgte_barrier.update_and_reset_success(); + } + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl << NOMAD::close_block ( "end of evaluations" ) + << std::endl; + + // incumbents update: + const NOMAD::Eval_Point * bf = barrier.get_best_feasible (); + const NOMAD::Eval_Point * bi = barrier.get_best_infeasible(); + if ( bf && bf != old_feasible_incumbent ) + new_feas_inc = bf; + if ( bi && bi != old_infeasible_incumbent ) + new_infeas_inc = bi; + + // the list of eval. points is deleted (only points in the cache are kept): + clear_eval_lop(); + } // end of eval_lop() scalar version - #endif /*-------------------------------------------------*/ @@ -2470,6 +2479,7 @@ void NOMAD::Evaluator_Control::reduce_eval_lop ( int n ) const NOMAD::Eval_Point * x; std::set<NOMAD::Priority_Eval_Point>::iterator it = _eval_lop.end(); + for( int i=0;i<nb_eval_pts-n;i++) { --it; @@ -2480,959 +2490,653 @@ void NOMAD::Evaluator_Control::reduce_eval_lop ( int n ) _eval_lop.erase( it,_eval_lop.end()); } + + /*-------------------------------------------------*/ -/* TGP model ordering (private) */ +/* model_np1_quad_epsilon (private) */ /*-------------------------------------------------*/ -void NOMAD::Evaluator_Control::TGP_model_ordering ( NOMAD::dd_type display_degree , - bool & modified_list ) +void NOMAD::Evaluator_Control::quad_model_ordering ( NOMAD::dd_type display_degree , + bool & modified_list ) { - modified_list = false; - - if ( _p.get_opt_only_sgte() ) - return; - -#ifdef USE_TGP - - // display: - const NOMAD::Display & out = _p.out(); - - // model stats: - NOMAD::Model_Stats model_stats; - NOMAD::Clock clock; - -#ifdef TGP_DEBUG - out << std::endl << NOMAD::open_block ( "TGP model ordering") << std::endl; -#endif - - const std::vector<NOMAD::bb_output_type> & bbot = _p.get_bb_output_type(); - int i , j , n_XX = 0 , m = bbot.size(); - - // construct prediction set (XX): - // ------------------------------ - std::vector<NOMAD::Eval_Point *> XX; - NOMAD::Point lb_XX , ub_XX; - - // save _eval_lop in XX and other_pts: - const NOMAD::Eval_Point * x; - std::list<const NOMAD::Eval_Point *> other_pts; - const NOMAD::Signature * signature = NULL; - int n = -1; - - std::set<NOMAD::Priority_Eval_Point>::const_iterator it , end = _eval_lop.end(); - for ( it = _eval_lop.begin() ; it != end ; ++it ) { - x = it->get_point(); - if ( n < 0 ) { - signature = x->get_signature(); - if ( !signature ) { -#ifdef TGP_DEBUG - out << NOMAD::close_block ( "failure (no signature)" ) << std::endl; -#endif - return; - } - n = signature->get_n(); - - lb_XX = ub_XX = NOMAD::Point(n); - } - - if ( x->size () == n && - x->get_m () == m && - x->get_eval_type () == NOMAD::TRUTH && - !x->get_bb_outputs().is_defined() ) { - - XX.push_back ( &NOMAD::Cache::get_modifiable_point ( *x ) ); - - for ( i = 0 ; i < n ; ++i ) { - if ( !lb_XX[i].is_defined() || (*x)[i] < lb_XX[i] ) - lb_XX[i] = (*x)[i]; - if ( !ub_XX[i].is_defined() || (*x)[i] > ub_XX[i] ) - ub_XX[i] = (*x)[i]; - } - } - else - other_pts.push_back ( x ); - } - - n_XX = XX.size(); - - if ( n_XX <= 1 ) { -#ifdef TGP_DEBUG - out << NOMAD::close_block ( "failure (size(XX) <= 1)" ) << std::endl; + const NOMAD::Display & out = _p.out(); + +#ifdef DEBUG + out << std::endl << NOMAD::open_block ( "model_np1_quad_epsilon") << std::endl; #endif - return; - } - - // the TGP model: - NOMAD::TGP_Model * model; - - // Reuse the last TGP model from the TGP model search: - if ( _last_TGP_model && _p.get_model_tgp_reuse_model() ) { - - model = _last_TGP_model; - - // individual predictions for XX points: - for ( i = 0 ; i < n_XX ; ++i ) - if ( !model->predict ( *XX[i] , false ) ) // pred_outside_bnds = false - for ( j = 0 ; j < m ; ++j ) - XX[i]->set_bb_output ( j , NOMAD::Double() ); - } - - // creation of a new TGP model: - else { - model = new NOMAD::TGP_Model ( n , bbot , out , _p.get_model_tgp_mode() ); - - NOMAD::Point center(n); - for ( i = 0 ; i < n ; ++i ) - center[i] = ( lb_XX[i] + ub_XX[i] ) / 2.0; - - // construct interpolation set (X): - // -------------------------------- - if ( !model->set_X ( *_cache , - ¢er , - _p.get_seed() , - true ) ) { // remove_fv = true - - if ( model->get_p() <= model->get_n() ) - model_stats.add_not_enough_pts(); -#ifdef TGP_DEBUG - out << NOMAD::close_block ( "failure: " + model->get_error_str() ) - << std::endl; + // save _eval_lop in pts and other_pts: + // ------------------------------------ + NOMAD::Point min , max , center , interpolation_radius; + const NOMAD::Eval_Point * y; + std::list<const NOMAD::Eval_Point *> pts , other_pts; + const NOMAD::Signature * signature = NULL; + const NOMAD::Double & radius_factor = _p.get_model_quad_radius_factor(); + NOMAD::eval_type ev_type = NOMAD::TRUTH; + int i , n = -1; + + std::set<NOMAD::Priority_Eval_Point>::const_iterator it , end = _eval_lop.end(); + for ( it = _eval_lop.begin() ; it != end ; ++it ) + { + y = it->get_point(); + if ( n < 0 ) + { + signature = y->get_signature(); + if ( !signature ) + { +#ifdef DEBUG + out << NOMAD::close_block ( "failure (no signature)" ) << std::endl; #endif - - delete model; - - return; + modified_list = false; + return; + } + n = signature->get_n(); + ev_type = y->get_eval_type(); + min.resize ( n ); + max.resize ( n ); + center.resize ( n ); + interpolation_radius.resize ( n ); + } + + if ( y->size() == n && y->get_eval_type() == ev_type ) + { + pts.push_back(y); + for ( i = 0 ; i < n ; ++i ) + { + if ( !min[i].is_defined() || (*y)[i] < min[i] ) + min[i] = (*y)[i]; + if ( !max[i].is_defined() || (*y)[i] > max[i] ) + max[i] = (*y)[i]; + } + } + else + other_pts.push_back ( y ); } - int p = model->get_p(); - - // display sets X and XX: - // ---------------------- -#ifdef TGP_DEBUG + for ( i = 0 ; i < n ; ++i ) { - // max number of points displayed: - const int set_display_limit = 15; // set to -1 for no limit - - // X: - model->display_X ( out , set_display_limit ); - - // XX: - out << NOMAD::open_block ( "prediction points (XX)"); - for ( i = 0 ; i < n_XX ; ++i ) { - out << "#"; - out.display_int_w ( i , n_XX ); - out << " x=("; - XX[i]->NOMAD::Point::display ( out , " " , 15 , -1 ); - out << " )" << std::endl; - } - std::ostringstream oss; - oss << "(size=" << n_XX << ")"; - out << NOMAD::close_block ( oss.str() ) << std::endl; + center [i] = ( min[i] + max[i] ) / 2.0; + interpolation_radius[i] = ( max[i] - min[i] ) * radius_factor / 2.0; } + +#ifdef DEBUG + out << NOMAD::open_block ( "points used to define interpolation radius") + << "type of eval. : " << ev_type << std::endl + << "number of points: " << pts.size() << std::endl + << "min. coordinates: ( "; + min.display ( out , " " , 2 ); + out << " )" << std::endl + << "max. coordinates: ( "; + max.display ( out , " " , 2 ); + out << " )" << std::endl + << "center : ( "; + center.display ( out , " " , 2 ); + out << " )" << std::endl + << "interp. radius : ( "; + interpolation_radius.display ( out , " " , 2 ); + out << " )" << std::endl + << NOMAD::close_block() << std::endl; #endif - - // TGP model construction: - // ----------------------- -#ifdef TGP_DEBUG - out << "TGP model construction ..."; - out.flush(); -#endif - - if ( !model->compute ( XX , - false , // compute_Ds2x = false - false , // compute_improv = false - false ) ) { // pred_outside_bnds = false - model_stats.add_construction_error(); - -#ifdef TGP_DEBUG - out << "... error: " << model->get_error_str() << std::endl - << NOMAD::close_block() << std::endl; + // create model: + // ------------- + NOMAD::Clock clock; + NOMAD::Model_Stats model_stats; + NOMAD::Quad_Model model ( out , + _p.get_bb_output_type() , + (ev_type==NOMAD::TRUTH) ? *_cache : *_sgte_cache , + *signature ); + + int max_Y_size = _p.get_model_quad_max_Y_size(); + int min_Y_size = _p.get_model_quad_min_Y_size(); + bool use_WP = _p.get_model_quad_use_WP (); + + // construct interpolation set Y: + model.construct_Y ( center , + interpolation_radius , + max_Y_size ); + + int nY = model.get_nY(); + +#ifdef DEBUG + out << "number of points in Y: " << nY + << " (p=" << nY-1; + if ( nY < 2 ) out << ", not enough"; + out << ")" << std::endl; #endif - - // reset XX outputs: - for ( i = 0 ; i < n_XX ; ++i ) - for ( j = 0 ; j < m ; ++j ) - XX[i]->set_bb_output ( j , NOMAD::Double() ); - - delete model; - - // check if ctrl-c has been pressed: - if ( NOMAD::TGP_Output_Model::get_force_quit() ) - NOMAD::Evaluator_Control::_force_quit = true; - - return; + + // not enough points: + if ( nY < 2 ) + { + modified_list = false; + model_stats.add_not_enough_pts(); } -#ifdef TGP_DEBUG - out << "... OK" << std::endl << std::endl; -#endif - - // update model stats: - model_stats.add_construction_time ( clock.get_CPU_time() ); - model_stats.update_nY ( p ); - model_stats.update_ES_stats ( n_XX , n_XX ); - model_stats.add_nb_truth(); - model_stats.add_nb_TGP(); - } - - // open display block for model predictions: -#ifdef TGP_DEBUG - out << NOMAD::open_block ( "TGP predictions (XX+ZZ)"); -#endif - - // clear then fill _eval_lop again: - // -------------------------------- - NOMAD::Double f_model , h_model; - const NOMAD::Double & h_min = _p.get_h_min(); - NOMAD::hnorm_type h_norm = _p.get_h_norm(); - bool snap_to_bounds = _p.get_snap_to_bounds(); - - modified_list = true; - _eval_lop.clear(); - - for ( i = 0 ; i < n_XX ; ++i ) { - - // compute model h and f values: - model->eval_hf ( XX[i]->get_bb_outputs() , - h_min , - h_norm , - h_model , - f_model ); - - // display model predictions: -#ifdef TGP_DEBUG - out << "#"; - out.display_int_w ( i , n_XX ); - out << " x=("; - XX[i]->NOMAD::Point::display ( out , " " , 15 , -1 ); - out << " ) m(x)=["; - XX[i]->get_bb_outputs().display ( out , " " , 15 , -1 ); - out << " ]"; - - if ( h_model.is_defined() && f_model.is_defined() ) - out << " hm=" << std::setw(15) << h_model - << " fm=" << std::setw(15) << f_model; else - out << " no model value"; - out << std::endl; -#endif - - // add the evaluation point: - add_eval_point ( XX[i] , - display_degree , - snap_to_bounds , - NOMAD::Double() , - NOMAD::Double() , - f_model , - h_model ); - -#ifdef MODEL_STATS - if ( XX[i] && f_model.is_defined() && h_model.is_defined() ) { - XX[i]->set_mod_use ( 2 ); // 2 for model ordering - XX[i]->set_Yw ( model->get_Yw () ); - XX[i]->set_nY ( p ); - XX[i]->set_mh ( h_model ); - XX[i]->set_mf ( f_model ); - } -#endif - } - -#ifdef TGP_DEBUG - { - // close display block for model predictions: - std::ostringstream oss; - oss << "(size=" << n_XX << ")"; - out << NOMAD::close_block ( oss.str() ) << std::endl; - - // compute and display prediction errors: - out << NOMAD::open_block ( "prediction relative errors on X(%)" ); - model->display_X_errors ( out ); - out << NOMAD::close_block() << std::endl; - } -#endif - - // other points that have been previously discarded and have no model values: - NOMAD::Eval_Point * y; - std::list<const NOMAD::Eval_Point *>::const_iterator it2 , end2 = other_pts.end(); - for ( it2 = other_pts.begin() ; it2 != end2 ; ++it2 ) { - y = &NOMAD::Cache::get_modifiable_point (**it2); - add_eval_point ( y , - display_degree , - snap_to_bounds , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() ); - } - - _stats.update_model_stats ( model_stats ); - _model_ordering_stats.update ( model_stats ); - - if ( model != _last_TGP_model ) - delete model; - -#ifdef TGP_DEBUG - out << NOMAD::close_block() << std::endl; -#else - if ( display_degree == NOMAD::FULL_DISPLAY ) { - out << std::endl << "model ordering"; - if ( !modified_list ) - out << " (no modification)"; - out << std::endl; - } -#endif -#endif -} - -/*-------------------------------------------------*/ -/* model_np1_quad_epsilon (private) */ -/*-------------------------------------------------*/ -void NOMAD::Evaluator_Control::quad_model_ordering ( NOMAD::dd_type display_degree , - bool & modified_list ) -{ - const NOMAD::Display & out = _p.out(); - -#ifdef DEBUG - out << std::endl << NOMAD::open_block ( "model_np1_quad_epsilon") << std::endl; -#endif - - // save _eval_lop in pts and other_pts: - // ------------------------------------ - NOMAD::Point min , max , center , interpolation_radius; - const NOMAD::Eval_Point * y; - std::list<const NOMAD::Eval_Point *> pts , other_pts; - const NOMAD::Signature * signature = NULL; - const NOMAD::Double & radius_factor = _p.get_model_quad_radius_factor(); - NOMAD::eval_type ev_type = NOMAD::TRUTH; - int i , n = -1; - - std::set<NOMAD::Priority_Eval_Point>::const_iterator it , end = _eval_lop.end(); - for ( it = _eval_lop.begin() ; it != end ; ++it ) - { - y = it->get_point(); - if ( n < 0 ) - { - signature = y->get_signature(); - if ( !signature ) - { + { + #ifdef DEBUG - out << NOMAD::close_block ( "failure (no signature)" ) << std::endl; + out << std::endl; + model.display_Y ( out , "unscaled interpolation set Y" ); #endif - modified_list = false; - return; - } - n = signature->get_n(); - ev_type = y->get_eval_type(); - min.resize ( n ); - max.resize ( n ); - center.resize ( n ); - interpolation_radius.resize ( n ); - } - - if ( y->size() == n && y->get_eval_type() == ev_type ) { - pts.push_back(y); - for ( i = 0 ; i < n ; ++i ) { - if ( !min[i].is_defined() || (*y)[i] < min[i] ) - min[i] = (*y)[i]; - if ( !max[i].is_defined() || (*y)[i] > max[i] ) - max[i] = (*y)[i]; - } - } - else - other_pts.push_back ( y ); - } - - for ( i = 0 ; i < n ; ++i ) - { - center [i] = ( min[i] + max[i] ) / 2.0; - interpolation_radius[i] = ( max[i] - min[i] ) * radius_factor / 2.0; - } - -#ifdef DEBUG - out << NOMAD::open_block ( "points used to define interpolation radius") - << "type of eval. : " << ev_type << std::endl - << "number of points: " << pts.size() << std::endl - << "min. coordinates: ( "; - min.display ( out , " " , 2 ); - out << " )" << std::endl - << "max. coordinates: ( "; - max.display ( out , " " , 2 ); - out << " )" << std::endl - << "center : ( "; - center.display ( out , " " , 2 ); - out << " )" << std::endl - << "interp. radius : ( "; - interpolation_radius.display ( out , " " , 2 ); - out << " )" << std::endl - << NOMAD::close_block() << std::endl; - #endif - - // create model: - // ------------- - NOMAD::Clock clock; - NOMAD::Model_Stats model_stats; - NOMAD::Quad_Model model ( out , - _p.get_bb_output_type() , - (ev_type==NOMAD::TRUTH) ? *_cache : *_sgte_cache , - *signature ); - - int max_Y_size = _p.get_model_quad_max_Y_size(); - int min_Y_size = _p.get_model_quad_min_Y_size(); - bool use_WP = _p.get_model_quad_use_WP (); - - // construct interpolation set Y: - model.construct_Y ( center , - interpolation_radius , - max_Y_size ); - - int nY = model.get_nY(); - -#ifdef DEBUG - out << "number of points in Y: " << nY - << " (p=" << nY-1; - if ( nY < 2 ) out << ", not enough"; - out << ")" << std::endl; - #endif - - // not enough points: - if ( nY < 2 ) - { - modified_list = false; - model_stats.add_not_enough_pts(); - } - else - { - + + // define scaling: + model.define_scaling ( radius_factor ); + #ifdef DEBUG - out << std::endl; - model.display_Y ( out , "unscaled interpolation set Y" ); + out << std::endl; + model.display_Y ( out , "scaled interpolation set Ys" ); #endif - - // define scaling: - model.define_scaling ( radius_factor ); - + + // model error flag: + if ( model.get_error_flag() ) + { + model_stats.add_construction_error(); + modified_list = false; + } + else + { + // not enough points: + if ( nY < 2 || ( min_Y_size < 0 && nY <= model.get_nfree() ) ) + { + model_stats.add_not_enough_pts(); + modified_list = false; + } + // enough points and no error: + else + { + + bool cautious = _p.get_model_eval_sort_cautious(); + int nb_inside_radius = 0; + + // check that there is at least two trial points inside the trust radius + // (cautious strategy): + nb_inside_radius = 0; + std::list<const NOMAD::Eval_Point *>::const_iterator it2 , end2 = pts.end(); + if ( cautious ) + { + for ( it2 = pts.begin() ; it2 != end2 ; ++it2 ) + { + NOMAD::Point scaled_pt ( **it2 ); + model.scale ( scaled_pt ); + if ( model.is_within_trust_radius ( scaled_pt ) ) + { + if ( ++nb_inside_radius == 2 ) + break; + } + } + } + + // not enough points inside trust radius: + if ( cautious && nb_inside_radius < 2 ) + modified_list = false; + + // at least two trial points are inside trust radius: + else + { + // construct model: + // ---------------- + model.construct ( use_WP , NOMAD::SVD_EPS , NOMAD::SVD_MAX_MPN , max_Y_size ); + model_stats.add_construction_time ( clock.get_CPU_time() ); + model_stats.update_nY ( model.get_nY() ); + + // display model characteristics: #ifdef DEBUG - out << std::endl; - model.display_Y ( out , "scaled interpolation set Ys" ); + out << std::endl; + model.display_model_coeffs ( out ); + out << std::endl; + model.display_Y_error ( out ); #endif - - // model error flag: - if ( model.get_error_flag() ) - { - model_stats.add_construction_error(); - modified_list = false; - } - else - { - // not enough points: - if ( nY < 2 || ( min_Y_size < 0 && nY <= model.get_nfree() ) ) - { - model_stats.add_not_enough_pts(); - modified_list = false; - } - // enough points and no error: - else - { - - bool cautious = _p.get_model_eval_sort_cautious(); - int nb_inside_radius = 0; - - // check that there is at least two trial points inside the trust radius - // (cautious strategy): - nb_inside_radius = 0; - std::list<const NOMAD::Eval_Point *>::const_iterator it2 , end2 = pts.end(); - if ( cautious ) - { - for ( it2 = pts.begin() ; it2 != end2 ; ++it2 ) - { - NOMAD::Point scaled_pt ( **it2 ); - model.scale ( scaled_pt ); - if ( model.is_within_trust_radius ( scaled_pt ) ) - { - if ( ++nb_inside_radius == 2 ) - break; - } - } - } - - // not enough points inside trust radius: - if ( cautious && nb_inside_radius < 2 ) - modified_list = false; - - // at least two trial points are inside trust radius: - else - { - // construct model: - // ---------------- - model.construct ( use_WP , NOMAD::SVD_EPS , NOMAD::SVD_MAX_MPN , max_Y_size ); - model_stats.add_construction_time ( clock.get_CPU_time() ); - model_stats.update_nY ( model.get_nY() ); - - // display model characteristics: + + // count model: + if ( ev_type == NOMAD::TRUTH ) + model_stats.add_nb_truth(); + else + model_stats.add_nb_sgte(); + + switch ( model.get_interpolation_type() ) + { + case NOMAD::MFN: + model_stats.add_nb_MFN(); + break; + case NOMAD::WP_REGRESSION: + model_stats.add_nb_WP_regression(); + break; + case NOMAD::REGRESSION: + model_stats.add_nb_regression(); + break; + default: + break; + } + + // check model error flag: + const NOMAD::Double & cond = model.get_cond(); + if ( model.get_error_flag() || + !cond.is_defined() || + cond > NOMAD::SVD_MAX_COND ) + { + modified_list = false; + if ( model.get_error_flag() ) + model_stats.add_construction_error(); + else + model_stats.add_bad_cond(); + } + else + { + // clear then fill _eval_lop again: + // -------------------------------- + NOMAD::Double f_model , h_model; + NOMAD::Eval_Point * x; + bool snap_to_bounds = _p.get_snap_to_bounds(); + + modified_list = true; + _eval_lop.clear(); + + nb_inside_radius = 0; + #ifdef DEBUG - out << std::endl; - model.display_model_coeffs ( out ); - out << std::endl; - model.display_Y_error ( out ); + out << std::endl << NOMAD::open_block ( "original trial points" ); #endif - - // count model: - if ( ev_type == NOMAD::TRUTH ) - model_stats.add_nb_truth(); - else - model_stats.add_nb_sgte(); - - switch ( model.get_interpolation_type() ) - { - case NOMAD::MFN: - model_stats.add_nb_MFN(); - break; - case NOMAD::WP_REGRESSION: - model_stats.add_nb_WP_regression(); - break; - case NOMAD::REGRESSION: - model_stats.add_nb_regression(); - break; - default: - break; - } - - // check model error flag: - const NOMAD::Double & cond = model.get_cond(); - if ( model.get_error_flag() || - !cond.is_defined() || - cond > NOMAD::SVD_MAX_COND ) - { - modified_list = false; - if ( model.get_error_flag() ) - model_stats.add_construction_error(); - else - model_stats.add_bad_cond(); - } - else - { - // clear then fill _eval_lop again: - // -------------------------------- - NOMAD::Double f_model , h_model; - NOMAD::Eval_Point * x; - bool snap_to_bounds = _p.get_snap_to_bounds(); - - modified_list = true; - _eval_lop.clear(); - - nb_inside_radius = 0; - + + NOMAD::Quad_Model_Evaluator *quad_model_ev=new NOMAD::Quad_Model_Evaluator(_p , model); + + for ( it2 = pts.begin() ; it2 != end2 ; ++it2 ) + { + NOMAD::Point scaled_pt ( **it2 ); + model.scale ( scaled_pt ); + + + + f_model.clear(); + h_model.clear(); + + + if ( !cautious || model.is_within_trust_radius ( scaled_pt ) ) + { + + int m = static_cast<int>(_p.get_bb_output_type().size()); + NOMAD::Eval_Point x_eval(scaled_pt,m); + for (int i = 0 ; i < x_eval.size() ; ++i ) + x_eval[i] = scaled_pt[i].value() * 1000.0; + + bool count_eval; + + bool success=quad_model_ev->eval_x(x_eval,0.0,count_eval); + if (success) + { + _ev->compute_f(x_eval); + _ev->compute_h(x_eval); + + f_model=x_eval.get_f(); + h_model=x_eval.get_h(); + } + + ++nb_inside_radius; + } + + x = &NOMAD::Cache::get_modifiable_point (**it2); + #ifdef DEBUG - out << std::endl << NOMAD::open_block ( "original trial points" ); + x->display_tag ( out ); + out << ": ( "; + x->NOMAD::Point::display ( out , " " , 2 ); + out << " ) scaled: ("; + scaled_pt.NOMAD::Point::display ( out , " " , 2 ); + out << ") "; + if ( h_model.is_defined() && f_model.is_defined() ) + out << "hm=" << h_model << " fm=" << f_model; + else + out << "no model value"; + out << std::endl; #endif - - NOMAD::Quad_Model_Evaluator *quad_model_ev=new NOMAD::Quad_Model_Evaluator(_p , model); - - for ( it2 = pts.begin() ; it2 != end2 ; ++it2 ) - { - NOMAD::Point scaled_pt ( **it2 ); - model.scale ( scaled_pt ); - - - - f_model.clear(); - h_model.clear(); - - - if ( !cautious || model.is_within_trust_radius ( scaled_pt ) ) - { - - int m = static_cast<int>(_p.get_bb_output_type().size()); - NOMAD::Eval_Point x_eval(scaled_pt,m); - for (int i = 0 ; i < x_eval.size() ; ++i ) - x_eval[i] = scaled_pt[i].value() * 1000.0; - - bool count_eval; - - bool success=quad_model_ev->eval_x(x_eval,0.0,count_eval); - if (success) - { - _ev->compute_f(x_eval); - _ev->compute_h(x_eval); - - f_model=x_eval.get_f(); - h_model=x_eval.get_h(); - } - - ++nb_inside_radius; - } - - x = &NOMAD::Cache::get_modifiable_point (**it2); - -#ifdef DEBUG - x->display_tag ( out ); - out << ": ( "; - x->NOMAD::Point::display ( out , " " , 2 ); - out << " ) scaled: ("; - scaled_pt.NOMAD::Point::display ( out , " " , 2 ); - out << ") "; - if ( h_model.is_defined() && f_model.is_defined() ) - out << "hm=" << h_model << " fm=" << f_model; - else - out << "no model value"; - out << std::endl; -#endif - - // add the evaluation point: - add_eval_point ( x , - display_degree , - snap_to_bounds , - NOMAD::Double() , - NOMAD::Double() , - f_model , - h_model ); - + + // add the evaluation point: + add_eval_point ( x , + display_degree , + snap_to_bounds , + NOMAD::Double() , + NOMAD::Double() , + f_model , + h_model ); + #ifdef MODEL_STATS - if ( x && f_model.is_defined() && h_model.is_defined() ) - { - x->set_mod_use ( 2 ); // 2 for model ordering - x->set_cond ( model.get_cond() ); - x->set_Yw ( model.get_Yw () ); - x->set_nY ( model.get_nY () ); - x->set_mh ( h_model ); - x->set_mf ( f_model ); - } + if ( x && f_model.is_defined() && h_model.is_defined() ) + { + x->set_mod_use ( 2 ); // 2 for model ordering + x->set_cond ( model.get_cond() ); + x->set_Yw ( model.get_Yw () ); + x->set_nY ( model.get_nY () ); + x->set_mh ( h_model ); + x->set_mf ( f_model ); + } #endif - } - - delete quad_model_ev; - - // other points that have been previously discarded - // and have no model values: - end2 = other_pts.end(); - for ( it2 = other_pts.begin() ; it2 != end2 ; ++it2 ) - { - - x = &NOMAD::Cache::get_modifiable_point (**it2); + } + + delete quad_model_ev; + + // other points that have been previously discarded + // and have no model values: + end2 = other_pts.end(); + for ( it2 = other_pts.begin() ; it2 != end2 ; ++it2 ) + { + + x = &NOMAD::Cache::get_modifiable_point (**it2); #ifdef DEBUG - x->display_tag ( out ); - out << ": ( "; - x->NOMAD::Point::display ( out , " " , 2 ); - out << " ) no model value" << std::endl; -#endif - add_eval_point ( x , - display_degree , - snap_to_bounds , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() ); - } + x->display_tag ( out ); + out << ": ( "; + x->NOMAD::Point::display ( out , " " , 2 ); + out << " ) no model value" << std::endl; +#endif + add_eval_point ( x , + display_degree , + snap_to_bounds , + NOMAD::Double() , + NOMAD::Double() , + NOMAD::Double() , + NOMAD::Double() ); + } #ifdef DEBUG - out.close_block(); + out.close_block(); #endif - } - } - model_stats.update_ES_stats ( nb_inside_radius , static_cast<int>(pts.size()) ); - } - } - } - - _stats.update_model_stats ( model_stats ); - _model_ordering_stats.update ( model_stats ); - + } + } + model_stats.update_ES_stats ( nb_inside_radius , static_cast<int>(pts.size()) ); + } + } + } + + _stats.update_model_stats ( model_stats ); + _model_ordering_stats.update ( model_stats ); + #ifdef DEBUG - out << NOMAD::close_block() << std::endl; + out << NOMAD::close_block() << std::endl; #else - if ( display_degree == NOMAD::FULL_DISPLAY ) - { - out << std::endl << "model ordering"; - if ( !modified_list ) - out << " (no modification)"; - out << std::endl; - } + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + out << std::endl << "model ordering"; + if ( !modified_list ) + out << " (no modification)"; + out << std::endl; + } #endif } + /*----------------------------------------------------------------------------------*/ /* evaluation of a list of points (public version that calls the private version) */ /*----------------------------------------------------------------------------------*/ -void NOMAD::Evaluator_Control::eval_list_of_points -( NOMAD::search_type search , // IN : search type - NOMAD::Barrier & true_barrier , // IN/OUT: truth barrier - NOMAD::Barrier & sgte_barrier , // IN/OUT: surrogate barrier - NOMAD::Pareto_Front * pareto_front , // IN/OUT: Pareto front - // (can be NULL) - bool & stop , // IN/OUT: stopping criterion - NOMAD::stop_type & stop_reason , // OUT : stopping reason - const NOMAD::Eval_Point *& new_feas_inc , // OUT : new feas. incumbent - const NOMAD::Eval_Point *& new_infeas_inc , // OUT : new infeas. incumb. - NOMAD::success_type & success , // OUT : type of success - std::list<const NOMAD::Eval_Point *> - * evaluated_pts ) // OUT : list of processed - // pts (can be NULL) +void NOMAD::Evaluator_Control::eval_list_of_points ( NOMAD::search_type search , // IN : search type + NOMAD::Barrier & true_barrier , // IN/OUT: truth barrier + NOMAD::Barrier & sgte_barrier , // IN/OUT: surrogate barrier + NOMAD::Pareto_Front * pareto_front , // IN/OUT: Pareto front + // (can be NULL) + bool & stop , // IN/OUT: stopping criterion + NOMAD::stop_type & stop_reason , // OUT : stopping reason + const NOMAD::Eval_Point *& new_feas_inc , // OUT : new feas. incumbent + const NOMAD::Eval_Point *& new_infeas_inc , // OUT : new infeas. incumb. + NOMAD::success_type & success , // OUT : type of success + std::list<const NOMAD::Eval_Point *> + * evaluated_pts ) // OUT : list of processed // pts (can be NULL) { - - bool del_evaluated_pts = false; - if ( !evaluated_pts ) - { - evaluated_pts = new std::list<const NOMAD::Eval_Point *>; - del_evaluated_pts = true; - } - - bool sgte_eval_sort = _p.get_sgte_eval_sort() && _eval_lop.size() > 1; - bool opt_only_sgte = _p.get_opt_only_sgte (); - bool snap_to_bounds = _p.get_snap_to_bounds(); - bool modified_list = false; - - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_display_degree ( search ); - - // reset the success type: - true_barrier.reset_success(); - sgte_barrier.reset_success(); - - // define all points as surrogates: - if ( opt_only_sgte || sgte_eval_sort ) - { - for ( std::set<NOMAD::Priority_Eval_Point>::iterator it = _eval_lop.begin() ; - it != _eval_lop.end() ; ++it ) - NOMAD::Cache::get_modifiable_point(*it->get_point()).set_eval_type(NOMAD::SGTE); - } - - // use the surrogates to sort the eval. points: - if ( !opt_only_sgte && sgte_eval_sort ) - { - - // evaluate the surrogate: - private_eval_list_of_points ( search , - true_barrier , - sgte_barrier , - NULL , // Pareto front = NULL - stop , - stop_reason , - new_feas_inc , - new_infeas_inc , - success , - *evaluated_pts ); - if ( stop ) - { - if ( del_evaluated_pts ) - delete evaluated_pts; - return; - } - - NOMAD::Eval_Point * x; - - // construct a new list of trial points that will be - // ordered using surrogate values: - std::list<const NOMAD::Eval_Point *>::const_iterator - end = evaluated_pts->end() , it2; - for ( it2 = evaluated_pts->begin() ; it2 != end ; ++it2 ) { - - // Eval_Point construction: - x = new NOMAD::Eval_Point; - x->set ( (*it2)->size() , _p.get_bb_nb_outputs() ); - x->set_signature ( (*it2)->get_signature () ); - x->set_direction ( (*it2)->get_direction () ); - x->Point::operator = ( **it2 ); - - modified_list = true; - - // add the new point to the ordered list of trial points: - add_eval_point ( x , - display_degree , - snap_to_bounds , - (*it2)->get_f() , - (*it2)->get_h() , - NOMAD::Double() , - NOMAD::Double() ); - } - } - - if ( stop ) { - if ( del_evaluated_pts ) - delete evaluated_pts; - return; - } - - // model ordering: - // --------------- - if ( !modified_list && _model_eval_sort && _eval_lop.size() > 1 ) - { - switch ( _p.get_model_eval_sort() ) { - case NOMAD::TGP_MODEL: - TGP_model_ordering ( display_degree , modified_list ); - if ( NOMAD::Evaluator_Control::_force_quit || NOMAD::Evaluator::get_force_quit() ) - { - stop = true; - stop_reason = NOMAD::CTRL_C; - } - break; - case NOMAD::QUADRATIC_MODEL: - quad_model_ordering ( display_degree , modified_list ); - break; - case NOMAD::NO_MODEL:; - } - } - - // this test is true if ctrl-c has been pressed: - if ( stop ) { - if ( del_evaluated_pts ) - delete evaluated_pts; - return; - } - - // display the re-ordered list of trial points: - if ( modified_list && display_degree == NOMAD::FULL_DISPLAY ) { - - const NOMAD::Eval_Point * y; - - std::ostringstream oss; - oss << "re-ordered list of " << _eval_lop.size() - << " " << search << " trial points"; - - out << NOMAD::open_block ( oss.str() ) << std::endl; - - std::set<NOMAD::Priority_Eval_Point>::const_iterator - end = _eval_lop.end() , it; - for ( it = _eval_lop.begin() ; it != end ; ++it ) { - y = it->get_point(); - y->display_tag ( out ); - out << ": ( "; - y->Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); - out << " )"; - if ( y->get_direction() ) - out << " (dir " << y->get_direction()->get_index() << ")"; - out << std::endl; + + bool del_evaluated_pts = false; + if ( !evaluated_pts ) + { + evaluated_pts = new std::list<const NOMAD::Eval_Point *>; + del_evaluated_pts = true; } - out.close_block(); - } - - // evaluate the list of points on the 'true' function: - private_eval_list_of_points ( search , - true_barrier , - sgte_barrier , - pareto_front , - stop , - stop_reason , - new_feas_inc , - new_infeas_inc , - success , - *evaluated_pts ); - + + bool sgte_eval_sort = _p.get_sgte_eval_sort() && _eval_lop.size() > 1; + bool opt_only_sgte = _p.get_opt_only_sgte (); + bool snap_to_bounds = _p.get_snap_to_bounds(); + bool modified_list = false; + + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_display_degree ( search ); + + // reset the success type: + true_barrier.reset_success(); + sgte_barrier.reset_success(); + + // define all points as surrogates: + if ( opt_only_sgte || sgte_eval_sort ) + { + for ( std::set<NOMAD::Priority_Eval_Point>::iterator it = _eval_lop.begin() ; + it != _eval_lop.end() ; ++it ) + NOMAD::Cache::get_modifiable_point(*it->get_point()).set_eval_type(NOMAD::SGTE); + } + + // use the surrogates to sort the eval. points: + if ( !opt_only_sgte && sgte_eval_sort ) + { + + // evaluate the surrogate: + private_eval_list_of_points ( search , + true_barrier , + sgte_barrier , + NULL , // Pareto front = NULL + stop , + stop_reason , + new_feas_inc , + new_infeas_inc , + success , + *evaluated_pts ); + if ( stop ) + { + if ( del_evaluated_pts ) + delete evaluated_pts; + return; + } + + NOMAD::Eval_Point * x; + + // construct a new list of trial points that will be + // ordered using surrogate values: + std::list<const NOMAD::Eval_Point *>::const_iterator + end = evaluated_pts->end() , it2; + for ( it2 = evaluated_pts->begin() ; it2 != end ; ++it2 ) + { + + // Eval_Point construction: + x = new NOMAD::Eval_Point; + x->set ( (*it2)->size() , _p.get_bb_nb_outputs() ); + x->set_signature ( (*it2)->get_signature () ); + x->set_direction ( (*it2)->get_direction () ); + x->Point::operator = ( **it2 ); + + modified_list = true; + + // add the new point to the ordered list of trial points: + add_eval_point ( x , + display_degree , + snap_to_bounds , + (*it2)->get_f() , + (*it2)->get_h() , + NOMAD::Double() , + NOMAD::Double() ); + } + } + + if ( stop ) + { + if ( del_evaluated_pts ) + delete evaluated_pts; + return; + } + + // model ordering: + // --------------- + if ( !modified_list && _model_eval_sort && _eval_lop.size() > 1 ) + { + switch ( _p.get_model_eval_sort() ) + { + case NOMAD::QUADRATIC_MODEL: + quad_model_ordering ( display_degree , modified_list ); + break; + case NOMAD::NO_MODEL:; + } + } + + // this test is true if ctrl-c has been pressed: + if ( stop ) + { + if ( del_evaluated_pts ) + delete evaluated_pts; + return; + } + + // display the re-ordered list of trial points: + if ( modified_list && display_degree == NOMAD::FULL_DISPLAY ) + { + + const NOMAD::Eval_Point * y; + + std::ostringstream oss; + oss << "re-ordered list of " << _eval_lop.size() + << " " << search << " trial points"; + + out << NOMAD::open_block ( oss.str() ) << std::endl; + + std::set<NOMAD::Priority_Eval_Point>::const_iterator + end = _eval_lop.end() , it; + for ( it = _eval_lop.begin() ; it != end ; ++it ) + { + y = it->get_point(); + y->display_tag ( out ); + out << ": ( "; + y->Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); + out << " )"; + if ( y->get_direction() ) + out << " (dir " << y->get_direction()->get_index() << ")"; + out << std::endl; + } + out.close_block(); + } + + // evaluate the list of points on the 'true' function: + private_eval_list_of_points ( search , + true_barrier , + sgte_barrier , + pareto_front , + stop , + stop_reason , + new_feas_inc , + new_infeas_inc , + success , + *evaluated_pts ); + #ifdef MODEL_STATS - display_model_stats ( *evaluated_pts ); + display_model_stats ( *evaluated_pts ); #endif - - if ( del_evaluated_pts ) - delete evaluated_pts; + + if ( del_evaluated_pts ) + delete evaluated_pts; } /*------------------------------------------------------------------------------------*/ /* ordering of a list of points based on surrogate (1st) or model (2nd) evaluations */ /*------------------------------------------------------------------------------------*/ - void NOMAD::Evaluator_Control::ordering_lop ( NOMAD::search_type search , // IN : search type - bool & stop , // IN/OUT: stopping criterion - NOMAD::stop_type & stop_reason , // OUT : stopping reason - NOMAD::Barrier & true_barrier , // IN/OUT: truth barrier - NOMAD::Barrier & sgte_barrier // IN/OUT: surrogate barrier - ) - + bool & stop , // IN/OUT: stopping criterion + NOMAD::stop_type & stop_reason , // OUT : stopping reason + NOMAD::Barrier & true_barrier , // IN/OUT: truth barrier + NOMAD::Barrier & sgte_barrier // IN/OUT: surrogate barrier +) { - std::list<const NOMAD::Eval_Point *> * evaluated_pts = new std::list<const NOMAD::Eval_Point *>; - - bool sgte_eval_sort = _p.get_sgte_eval_sort() && _eval_lop.size() > 1; - bool opt_only_sgte = _p.get_opt_only_sgte (); - bool snap_to_bounds = _p.get_snap_to_bounds(); - bool modified_list = false; - - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_display_degree ( search ); - - NOMAD::success_type success ; - const NOMAD::Eval_Point *new_feas_inc ; - const NOMAD::Eval_Point *new_infeas_inc; - - - // reset the success type: - true_barrier.reset_success(); - sgte_barrier.reset_success(); - - - // use the surrogates to sort the eval. points: - if ( !opt_only_sgte && sgte_eval_sort ) - { - - for ( std::set<NOMAD::Priority_Eval_Point>::iterator it = _eval_lop.begin() ; it != _eval_lop.end() ; ++it ) - NOMAD::Cache::get_modifiable_point(*it->get_point()).set_eval_type(NOMAD::SGTE); - - - // evaluate the surrogate: - private_eval_list_of_points ( search , - true_barrier , - sgte_barrier , - NULL , // Pareto front = NULL - stop , - stop_reason , - new_feas_inc , - new_infeas_inc , - success , - *evaluated_pts ); - if ( stop ) - { - delete evaluated_pts; - return; - } - - NOMAD::Eval_Point * x; - - // construct a new list of trial points that will be - // ordered using surrogate values: - std::list<const NOMAD::Eval_Point *>::const_iterator - end = evaluated_pts->end() , it2; - for ( it2 = evaluated_pts->begin() ; it2 != end ; ++it2 ) - { - - // Eval_Point construction: - x = new NOMAD::Eval_Point; - x->set ( (*it2)->size() , _p.get_bb_nb_outputs() ); - x->set_signature ( (*it2)->get_signature () ); - x->set_direction ( (*it2)->get_direction () ); - x->set_poll_center( (*it2)->get_poll_center () ); // Poll center is needed for further testing (not needed when evaluating points) - x->set_poll_center_type ( (*it2)->get_poll_center_type () ); - x->Point::operator = ( **it2 ); - - modified_list = true; - - // add the new point to the ordered list of trial points: - add_eval_point ( x , - display_degree , - snap_to_bounds , - (*it2)->get_f() , - (*it2)->get_h() , - NOMAD::Double() , - NOMAD::Double() ); - } - } - - // model ordering: - // --------------- - if ( !modified_list && _model_eval_sort && _eval_lop.size() > 1 ) { - switch ( _p.get_model_eval_sort() ) { - case NOMAD::TGP_MODEL: - TGP_model_ordering ( display_degree , modified_list ); - break; - case NOMAD::QUADRATIC_MODEL: - quad_model_ordering ( display_degree , modified_list ); - break; - case NOMAD::NO_MODEL:; - } - } - - if ( NOMAD::Evaluator_Control::_force_quit || NOMAD::Evaluator::get_force_quit() ) - { - stop = true; - stop_reason = NOMAD::CTRL_C; - } - - delete evaluated_pts; + std::list<const NOMAD::Eval_Point *> * evaluated_pts = new std::list<const NOMAD::Eval_Point *>; + + bool sgte_eval_sort = _p.get_sgte_eval_sort() && _eval_lop.size() > 1; + bool opt_only_sgte = _p.get_opt_only_sgte (); + bool snap_to_bounds = _p.get_snap_to_bounds(); + bool modified_list = false; + + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_display_degree ( search ); + + NOMAD::success_type success ; + const NOMAD::Eval_Point *new_feas_inc ; + const NOMAD::Eval_Point *new_infeas_inc; + + + // reset the success type: + true_barrier.reset_success(); + sgte_barrier.reset_success(); + + + // use the surrogates to sort the eval. points: + if ( !opt_only_sgte && sgte_eval_sort ) + { + + for ( std::set<NOMAD::Priority_Eval_Point>::iterator it = _eval_lop.begin() ; it != _eval_lop.end() ; ++it ) + NOMAD::Cache::get_modifiable_point(*it->get_point()).set_eval_type(NOMAD::SGTE); + + + // evaluate the surrogate: + private_eval_list_of_points ( search , + true_barrier , + sgte_barrier , + NULL , // Pareto front = NULL + stop , + stop_reason , + new_feas_inc , + new_infeas_inc , + success , + *evaluated_pts ); + if ( stop ) + { + delete evaluated_pts; + return; + } + + NOMAD::Eval_Point * x; + + // construct a new list of trial points that will be + // ordered using surrogate values: + std::list<const NOMAD::Eval_Point *>::const_iterator + end = evaluated_pts->end() , it2; + for ( it2 = evaluated_pts->begin() ; it2 != end ; ++it2 ) + { + + // Eval_Point construction: + x = new NOMAD::Eval_Point; + x->set ( (*it2)->size() , _p.get_bb_nb_outputs() ); + x->set_signature ( (*it2)->get_signature () ); + x->set_direction ( (*it2)->get_direction () ); + x->set_poll_center( (*it2)->get_poll_center () ); // Poll center is needed for further testing (not needed when evaluating points) + x->set_poll_center_type ( (*it2)->get_poll_center_type () ); + x->Point::operator = ( **it2 ); + + modified_list = true; + + // add the new point to the ordered list of trial points: + add_eval_point ( x , + display_degree , + snap_to_bounds , + (*it2)->get_f() , + (*it2)->get_h() , + NOMAD::Double() , + NOMAD::Double() ); + } + } + + // model ordering: + // --------------- + if ( !modified_list && _model_eval_sort && _eval_lop.size() > 1 ) + { + switch ( _p.get_model_eval_sort() ) + { + case NOMAD::QUADRATIC_MODEL: + quad_model_ordering ( display_degree , modified_list ); + break; + case NOMAD::NO_MODEL:; + } + } + + if ( NOMAD::Evaluator_Control::_force_quit || NOMAD::Evaluator::get_force_quit() ) + { + stop = true; + stop_reason = NOMAD::CTRL_C; + } + + delete evaluated_pts; } @@ -3443,17 +3147,18 @@ void NOMAD::Evaluator_Control::ordering_lop ( NOMAD::search_type sea /*--------------------------------------------------------------*/ bool NOMAD::Evaluator_Control::is_opportunistic ( NOMAD::search_type t ) const { - switch ( t ) { - case NOMAD::X0_EVAL: + switch ( t ) + { + case NOMAD::X0_EVAL: + return false; + case NOMAD::LH_SEARCH: + return _p.get_opportunistic_LH(); + case NOMAD::CACHE_SEARCH: + return _p.get_opportunistic_cache_search(); + default: + return _p.get_opportunistic_eval(); + } return false; - case NOMAD::LH_SEARCH: - return _p.get_opportunistic_LH(); - case NOMAD::CACHE_SEARCH: - return _p.get_opportunistic_cache_search(); - default: - return _p.get_opportunistic_eval(); - } - return false; } /*----------------------------------------------------------------*/ @@ -3462,54 +3167,54 @@ bool NOMAD::Evaluator_Control::is_opportunistic ( NOMAD::search_type t ) const /* . check the opportunistic strategy stopping criterion */ /* . private method */ /*----------------------------------------------------------------*/ -bool NOMAD::Evaluator_Control::stop_evaluations -( const NOMAD::Eval_Point & x , - NOMAD::search_type search , - int k , - int nb_points , - bool stop , - NOMAD::dd_type display_degree , - NOMAD::success_type one_eval_success , - NOMAD::success_type success , - int init_nb_eval , - const NOMAD::Double & f0 , - const NOMAD::Barrier & barrier , - int & nb_success , - bool & one_for_luck ) const +bool NOMAD::Evaluator_Control::stop_evaluations ( const NOMAD::Eval_Point & x , + NOMAD::search_type search , + int k , + int nb_points , + bool stop , + NOMAD::dd_type display_degree , + NOMAD::success_type one_eval_success , + NOMAD::success_type success , + int init_nb_eval , + const NOMAD::Double & f0 , + const NOMAD::Barrier & barrier , + int & nb_success , + bool & one_for_luck ) const { - // opportunistic evaluation ? - bool opportunistic = is_opportunistic ( search ); - - if ( k < nb_points - 1 ) { - - if ( stop ) - return true; - - if ( opportunistic && - ( x.get_eval_type() == NOMAD::TRUTH || _p.get_opt_only_sgte() ) ) - { - - if ( one_for_luck && one_eval_success != NOMAD::FULL_SUCCESS ) - { - if ( display_degree == NOMAD::FULL_DISPLAY ) - _p.out() << std::endl - << "opportunistic termination of evaluations (lucky eval)" - << std::endl; - return true; - } - - if ( success == NOMAD::FULL_SUCCESS && - check_opportunistic_criterion ( display_degree , - one_eval_success , - init_nb_eval , - f0 , - barrier , - nb_success , - one_for_luck ) ) - return true; - } - } - return false; + // opportunistic evaluation ? + bool opportunistic = is_opportunistic ( search ); + + if ( k < nb_points - 1 ) + { + + if ( stop ) + return true; + + if ( opportunistic && + ( x.get_eval_type() == NOMAD::TRUTH || _p.get_opt_only_sgte() ) ) + { + + if ( one_for_luck && one_eval_success != NOMAD::FULL_SUCCESS ) + { + if ( display_degree == NOMAD::FULL_DISPLAY ) + _p.out() << std::endl + << "opportunistic termination of evaluations (lucky eval)" + << std::endl; + return true; + } + + if ( success == NOMAD::FULL_SUCCESS && + check_opportunistic_criterion ( display_degree , + one_eval_success , + init_nb_eval , + f0 , + barrier , + nb_success , + one_for_luck ) ) + return true; + } + } + return false; } /*-----------------------------------------------------------------*/ @@ -3517,114 +3222,113 @@ bool NOMAD::Evaluator_Control::stop_evaluations /* return true to stop the evaluations */ /* return false to continue the evaluations */ /*-----------------------------------------------------------------*/ -bool NOMAD::Evaluator_Control::check_opportunistic_criterion -( NOMAD::dd_type display_degree , - NOMAD::success_type one_eval_success , - int init_nb_eval , - const NOMAD::Double & f0 , - const NOMAD::Barrier & barrier , - int & nb_success , - bool & one_for_luck ) const +bool NOMAD::Evaluator_Control::check_opportunistic_criterion ( NOMAD::dd_type display_degree , + NOMAD::success_type one_eval_success , + int init_nb_eval , + const NOMAD::Double & f0 , + const NOMAD::Barrier & barrier , + int & nb_success , + bool & one_for_luck ) const { - - int min_nb_success = _p.get_opportunistic_min_nb_success(); - int min_eval = _p.get_opportunistic_min_eval(); - NOMAD::Double min_f_imprvmt = _p.get_opportunistic_min_f_imprvmt(); - bool lucky_eval = _p.get_opportunistic_lucky_eval(); - const NOMAD::Display & out = _p.out(); - - // min_nb_success: - if ( min_nb_success > 0 ) - { - - if ( one_eval_success == NOMAD::FULL_SUCCESS ) - ++nb_success; - - if ( nb_success < min_nb_success ) - { - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl - << "opport. strategy (nb_success=" << nb_success - << " < min_nb_success=" << min_nb_success - << "): continue evaluations" - << std::endl; - - return false; - } - } - - // min_eval: - if ( min_eval > 0 ) - { - - int eval = _stats.get_eval() - init_nb_eval; - - if ( eval < min_eval ) - { - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl - << "opport. strategy (eval=" << eval - << " < min_eval=" << min_eval - << "): continue evaluations" << std::endl; - return false; - } - } - - // min_f_imprvmt: - if ( min_f_imprvmt.is_defined() ) - { - - const NOMAD::Eval_Point * bf = barrier.get_best_feasible(); - - if ( f0.is_defined() && bf ) - { - - NOMAD::Double f = bf->get_f(); - - if ( f.is_defined() ) - { - - NOMAD::Double f_imprvmt = f0.rel_err(f) * 100.0; - - if ( f_imprvmt < min_f_imprvmt ) - { - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl - << "opport. strategy (f_improvement=" - << f_imprvmt << " < min_f_imprvmt=" << min_f_imprvmt - << "): continue evaluations" << std::endl; - - return false; - } - } - } - } - - // lucky_eval: - if ( lucky_eval && one_eval_success == NOMAD::FULL_SUCCESS ) - { - one_for_luck = true; - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl - << "opport. strategy: one more evaluation for luck" - << std::endl; - - return false; - } - - if ( display_degree == NOMAD::FULL_DISPLAY ) - { - out << std::endl << "opport. strategy: stop evaluations" ; - if (_p.get_bb_max_block_size() > 1) - out << " at the end of the block evaluation"; - out << std::endl; - } - - return true; + + int min_nb_success = _p.get_opportunistic_min_nb_success(); + int min_eval = _p.get_opportunistic_min_eval(); + NOMAD::Double min_f_imprvmt = _p.get_opportunistic_min_f_imprvmt(); + bool lucky_eval = _p.get_opportunistic_lucky_eval(); + const NOMAD::Display & out = _p.out(); + + // min_nb_success: + if ( min_nb_success > 0 ) + { + + if ( one_eval_success == NOMAD::FULL_SUCCESS ) + ++nb_success; + + if ( nb_success < min_nb_success ) + { + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl + << "opport. strategy (nb_success=" << nb_success + << " < min_nb_success=" << min_nb_success + << "): continue evaluations" + << std::endl; + + return false; + } + } + + // min_eval: + if ( min_eval > 0 ) + { + + int eval = _stats.get_eval() - init_nb_eval; + + if ( eval < min_eval ) + { + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl + << "opport. strategy (eval=" << eval + << " < min_eval=" << min_eval + << "): continue evaluations" << std::endl; + return false; + } + } + + // min_f_imprvmt: + if ( min_f_imprvmt.is_defined() ) + { + + const NOMAD::Eval_Point * bf = barrier.get_best_feasible(); + + if ( f0.is_defined() && bf ) + { + + NOMAD::Double f = bf->get_f(); + + if ( f.is_defined() ) + { + + NOMAD::Double f_imprvmt = f0.rel_err(f) * 100.0; + + if ( f_imprvmt < min_f_imprvmt ) + { + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl + << "opport. strategy (f_improvement=" + << f_imprvmt << " < min_f_imprvmt=" << min_f_imprvmt + << "): continue evaluations" << std::endl; + + return false; + } + } + } + } + + // lucky_eval: + if ( lucky_eval && one_eval_success == NOMAD::FULL_SUCCESS ) + { + one_for_luck = true; + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl + << "opport. strategy: one more evaluation for luck" + << std::endl; + + return false; + } + + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + out << std::endl << "opport. strategy: stop evaluations" ; + if (_p.get_bb_max_block_size() > 1) + out << " at the end of the block evaluation"; + out << std::endl; + } + + return true; } /*---------------------------------------------------------------*/ @@ -3632,38 +3336,40 @@ bool NOMAD::Evaluator_Control::check_opportunistic_criterion /*---------------------------------------------------------------*/ void NOMAD::Evaluator_Control::display_eval_lop ( NOMAD::search_type t ) const { - const NOMAD::Display & out = _p.out(); - int cnt = 0 , nb = static_cast<int>(_eval_lop.size()); - - if ( nb == 0 ) { - out << std::endl << "no evaluation point" << std::endl; - return; - } - - // open indented block: - std::ostringstream oss; - if ( t != NOMAD::UNDEFINED_SEARCH ) - oss << t << " "; - oss << "evaluation point"; - if ( nb > 1 ) - oss << "s"; - out << std::endl << NOMAD::open_block ( oss.str() ) << std::endl; - - // display the points: - std::set<NOMAD::Priority_Eval_Point>::const_iterator it , end = _eval_lop.end(); - for ( it = _eval_lop.begin() ; it != end ; ++it ) { - out << "point "; - out.display_int_w ( ++cnt , nb ); - out << "/" << nb << ": ( "; - it->get_point()->Point::display ( out , - " " , - 2 , - NOMAD::Point::get_display_limit() ); - out << " )" << std::endl; - } - - // close indented block: - out.close_block(); + const NOMAD::Display & out = _p.out(); + int cnt = 0 , nb = static_cast<int>(_eval_lop.size()); + + if ( nb == 0 ) + { + out << std::endl << "no evaluation point" << std::endl; + return; + } + + // open indented block: + std::ostringstream oss; + if ( t != NOMAD::UNDEFINED_SEARCH ) + oss << t << " "; + oss << "evaluation point"; + if ( nb > 1 ) + oss << "s"; + out << std::endl << NOMAD::open_block ( oss.str() ) << std::endl; + + // display the points: + std::set<NOMAD::Priority_Eval_Point>::const_iterator it , end = _eval_lop.end(); + for ( it = _eval_lop.begin() ; it != end ; ++it ) + { + out << "point "; + out.display_int_w ( ++cnt , nb ); + out << "/" << nb << ": ( "; + it->get_point()->Point::display ( out , + " " , + 2 , + NOMAD::Point::get_display_limit() ); + out << " )" << std::endl; + } + + // close indented block: + out.close_block(); } /*--------------------------------------------------------------*/ @@ -3675,118 +3381,118 @@ void NOMAD::Evaluator_Control::display_eval_lop ( NOMAD::search_type t ) const /* . periodic variables are checked */ /*--------------------------------------------------------------*/ void NOMAD::Evaluator_Control::add_eval_point( NOMAD::Eval_Point *& x , - NOMAD::dd_type display_degree , - bool snap_to_bounds , - const NOMAD::Double & f_sgte , - const NOMAD::Double & h_sgte , - const NOMAD::Double & f_model , - const NOMAD::Double & h_model ) + NOMAD::dd_type display_degree , + bool snap_to_bounds , + const NOMAD::Double & f_sgte , + const NOMAD::Double & h_sgte , + const NOMAD::Double & f_model , + const NOMAD::Double & h_model ) { - if ( !x ) - return; - - const NOMAD::Display & out = _p.out(); - - // treat the periodic variables: - NOMAD::Direction * new_dir = NULL; - - if ( _p.has_periodic_variables() && - x->treat_periodic_variables ( new_dir ) ) - { - - if ( new_dir && new_dir->norm() == 0.0 ) - { - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "point #" << x->get_tag() - << " is flushed (||dir||==0)" - << std::endl; - - delete x; - x = NULL; - - delete new_dir; - - return; - } - } - delete new_dir; - - if ( snap_to_bounds && x->snap_to_bounds() ) - { - - if ( display_degree == NOMAD::FULL_DISPLAY ) - { - out << std::endl << "point #" << x->get_tag() << " "; - if ( x->get_direction() && x->get_direction()->get_index() >= 0 ) - out << "(dir " << x->get_direction()->get_index() << ") "; - out << "has been snapped to bounds" << std::endl; - } - - if ( x->get_direction() && x->get_direction()->norm() == 0.0 ) - { - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "point #" << x->get_tag() - << " is flushed (||dir||==0)" - << std::endl; - delete x; - x = NULL; - - return; - } - } - - // creation of the Priority_Eval_Point: - NOMAD::Priority_Eval_Point pep ( x , _p.get_h_min() ); - - // ordering elements of Priority_Eval_Point's: - // ------------------------------------------- - - // 1. surrogate values for f and h: - pep.set_f_sgte ( f_sgte ); - pep.set_h_sgte ( h_sgte ); - - // 2. model values for f and h: - pep.set_f_model ( f_model ); - pep.set_h_model ( h_model ); - - if ( x->get_direction() ) - { - - // get the signature: - NOMAD::Signature * signature = x->get_signature(); - if ( !signature ) - throw NOMAD::Exception ( "Evaluator_Control.cpp" , __LINE__ , - "Evaluator_Control::add_eval_point(): the point has no signature" ); - - // angle with last successful directions (feasible) - const NOMAD::Direction & feas_success_dir = signature->get_feas_success_dir(); - if ( feas_success_dir.is_defined() && - x->get_poll_center_type() == NOMAD::FEASIBLE ) - pep.set_angle_success_dir ( feas_success_dir.get_angle ( *x->get_direction() ) ); - - // angle with last infeasible success direction: - const NOMAD::Direction & infeas_success_dir = signature->get_infeas_success_dir(); - if ( infeas_success_dir.is_defined() && - x->get_poll_center_type() == NOMAD::INFEASIBLE ) - pep.set_angle_success_dir ( infeas_success_dir.get_angle ( *x->get_direction() ) ); - - } - - - - // insertion of the point in _eval_lop: - // ------------------------------------ - size_t size_before = _eval_lop.size(); - - _eval_lop.insert ( pep ); - - if ( _eval_lop.size() == size_before ) - { - delete x; - x = NULL; - } + if ( !x ) + return; + + const NOMAD::Display & out = _p.out(); + + // treat the periodic variables: + NOMAD::Direction * new_dir = NULL; + + if ( _p.has_periodic_variables() && + x->treat_periodic_variables ( new_dir ) ) + { + + if ( new_dir && new_dir->norm() == 0.0 ) + { + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << "point #" << x->get_tag() + << " is flushed (||dir||==0)" + << std::endl; + + delete x; + x = NULL; + + delete new_dir; + + return; + } + } + delete new_dir; + + if ( snap_to_bounds && x->snap_to_bounds() ) + { + + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + out << std::endl << "point #" << x->get_tag() << " "; + if ( x->get_direction() && x->get_direction()->get_index() >= 0 ) + out << "(dir " << x->get_direction()->get_index() << ") "; + out << "has been snapped to bounds" << std::endl; + } + + if ( x->get_direction() && x->get_direction()->norm() == 0.0 ) + { + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << "point #" << x->get_tag() + << " is flushed (||dir||==0)" + << std::endl; + delete x; + x = NULL; + + return; + } + } + + // creation of the Priority_Eval_Point: + NOMAD::Priority_Eval_Point pep ( x , _p.get_h_min() ); + + // ordering elements of Priority_Eval_Point's: + // ------------------------------------------- + + // 1. surrogate values for f and h: + pep.set_f_sgte ( f_sgte ); + pep.set_h_sgte ( h_sgte ); + + // 2. model values for f and h: + pep.set_f_model ( f_model ); + pep.set_h_model ( h_model ); + + if ( x->get_direction() ) + { + + // get the signature: + NOMAD::Signature * signature = x->get_signature(); + if ( !signature ) + throw NOMAD::Exception ( "Evaluator_Control.cpp" , __LINE__ , + "Evaluator_Control::add_eval_point(): the point has no signature" ); + + // angle with last successful directions (feasible) + const NOMAD::Direction & feas_success_dir = signature->get_feas_success_dir(); + if ( feas_success_dir.is_defined() && + x->get_poll_center_type() == NOMAD::FEASIBLE ) + pep.set_angle_success_dir ( feas_success_dir.get_angle ( *x->get_direction() ) ); + + // angle with last infeasible success direction: + const NOMAD::Direction & infeas_success_dir = signature->get_infeas_success_dir(); + if ( infeas_success_dir.is_defined() && + x->get_poll_center_type() == NOMAD::INFEASIBLE ) + pep.set_angle_success_dir ( infeas_success_dir.get_angle ( *x->get_direction() ) ); + + } + + + + // insertion of the point in _eval_lop: + // ------------------------------------ + size_t size_before = _eval_lop.size(); + + _eval_lop.insert ( pep ); + + if ( _eval_lop.size() == size_before ) + { + delete x; + x = NULL; + } } #ifdef MODEL_STATS @@ -3807,50 +3513,55 @@ void NOMAD::Evaluator_Control::add_eval_point( NOMAD::Eval_Point *& x void NOMAD::Evaluator_Control::display_model_stats ( const std::list<const NOMAD::Eval_Point *> & evaluated_pts ) const { - const NOMAD::Display & out = _p.out(); - - NOMAD::Double h , mh , eh , f , mf , ef; - - std::list<const NOMAD::Eval_Point *>::const_iterator it , end = evaluated_pts.end(); - for ( it = evaluated_pts.begin() ; it != end ; ++it ) { - if ( *it && (*it)->get_mod_use() >= 0 ) { - - if ( _p.has_constraints() ) { - h = (*it)->get_h (); - mh = (*it)->get_mh(); - } - else - h = mh = 0.0; - - f = (*it)->get_f (); - mf = (*it)->get_mf(); - - if ( h.is_defined() && mh.is_defined() && f.is_defined() && mf.is_defined() ) { - - ef = f.rel_err ( mf ) * 100.0; - - out << (*it)->get_mod_use() - << " " << std::setw(3) << NOMAD::Mesh::get_mesh_index() - << " " << std::setw(4) << (*it)->get_nY() - << " "; - - (*it)->get_Yw ().display ( out , "%12.3g" ); out << " "; - (*it)->get_cond().display ( out , "%12.3g" ); out << " "; - if ( _p.has_constraints() ) { - eh = h.rel_err ( mh ) * 100.0; - h.display ( out , "%14.3g" ); out << " "; - mh.display ( out , "%14.3g" ); out << " "; - eh.display ( out , "%14.3g" ); out << " "; - } - f.display ( out , "%14.3g" ); out << " "; - mf.display ( out , "%14.3g" ); out << " "; - ef.display ( out , "%14.3g" ); - - out << std::endl; - } - - (*it)->clear_model_data(); + const NOMAD::Display & out = _p.out(); + + NOMAD::Double h , mh , eh , f , mf , ef; + + std::list<const NOMAD::Eval_Point *>::const_iterator it , end = evaluated_pts.end(); + for ( it = evaluated_pts.begin() ; it != end ; ++it ) + { + if ( *it && (*it)->get_mod_use() >= 0 ) + { + + if ( _p.has_constraints() ) + { + h = (*it)->get_h (); + mh = (*it)->get_mh(); + } + else + h = mh = 0.0; + + f = (*it)->get_f (); + mf = (*it)->get_mf(); + + if ( h.is_defined() && mh.is_defined() && f.is_defined() && mf.is_defined() ) + { + + ef = f.rel_err ( mf ) * 100.0; + + out << (*it)->get_mod_use() + << " " << std::setw(3) << NOMAD::Mesh::get_mesh_index() + << " " << std::setw(4) << (*it)->get_nY() + << " "; + + (*it)->get_Yw ().display ( out , "%12.3g" ); out << " "; + (*it)->get_cond().display ( out , "%12.3g" ); out << " "; + if ( _p.has_constraints() ) + { + eh = h.rel_err ( mh ) * 100.0; + h.display ( out , "%14.3g" ); out << " "; + mh.display ( out , "%14.3g" ); out << " "; + eh.display ( out , "%14.3g" ); out << " "; + } + f.display ( out , "%14.3g" ); out << " "; + mf.display ( out , "%14.3g" ); out << " "; + ef.display ( out , "%14.3g" ); + + out << std::endl; + } + + (*it)->clear_model_data(); + } } - } } #endif diff --git a/src/Evaluator_Control.hpp b/src/Evaluator_Control.hpp index d0bfb6f..7ec88a0 100644 --- a/src/Evaluator_Control.hpp +++ b/src/Evaluator_Control.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -48,10 +55,6 @@ #include "Slave.hpp" #include "Quad_Model.hpp" -#ifdef USE_TGP -#include "TGP_Model.hpp" -#endif - #ifdef R_VERSION extern "C" { #include <Rinternals.h> @@ -112,10 +115,6 @@ namespace NOMAD { NOMAD::Slave * _slave; // Slave object for master process #endif -#ifdef USE_TGP - NOMAD::TGP_Model * _last_TGP_model; ///< Last TGP model from the model search. -#endif - NOMAD::Model_Stats _model_ordering_stats; ///< Model ordering stats. NOMAD::Stats & _stats; ///< Algorithm stats. @@ -145,11 +144,11 @@ namespace NOMAD { /// Save the solution file or update the history file. /** - \param file_name Name of the file -- \b IN. - \param x Lattest solution -- \b IN. - \param is_sol Flag equal to \c true if the file is - a solution file; otherwise it is a history file. - \param display_bimv Display best infeasible (min. viol.) if \c true + \param file_name Name of the file -- \b IN. + \param x Lattest solution -- \b IN. + \param is_sol Flag equal to \c true if the file is + a solution file; otherwise it is a history file. -- \b IN. + \param display_bimv Display best infeasible (min. viol.)(optional) if \c true */ void write_sol_or_his_file ( const std::string & file_name , const NOMAD::Eval_Point & x , @@ -235,13 +234,7 @@ namespace NOMAD { void quad_model_ordering ( NOMAD::dd_type display_degree , bool & modified_list ); - /// TGP model ordering (parameter \c MODEL_EVAL_SORT). - /** - \param display_degree Display degree -- \b IN. - \param modified_list To indicate a change in the evaluation list -- \b OUT. - */ - void TGP_model_ordering ( NOMAD::dd_type display_degree , - bool & modified_list ); + /// Count the output stats (STAT_SUM and STAT_AVG). /** @@ -294,24 +287,24 @@ namespace NOMAD { /// Evaluate points. /* - \param list_x The list of points -- \b IN/OUT. - \param true_barrier Barrier for true evaluations -- \b IN/OUT. - \param sgte_barrier Barrier for surrogate evaluations -- \b IN/OUT. - \param pareto_front A pointer to the Pareto front -- \b IN/OUT + \param list_x The list of points -- \b IN/OUT. + \param true_barrier Barrier for true evaluations -- \b IN/OUT. + \param sgte_barrier Barrier for surrogate evaluations -- \b IN/OUT. + \param pareto_front A pointer to the Pareto front -- \b IN/OUT (may be \c NULL). - \param list_count_eval A list of bool for counted evaluations -- \b OUT. - \param stop Stop flag -- \b IN/OUT. - \param stop_reason Stop reason -- \b OUT. - \param h_max Maximal feasibility value -- \b IN. + \param list_count_eval A list of bool for counted evaluations -- \b OUT. + \param stop Stop flag -- \b IN/OUT. + \param stop_reason Stop reason -- \b OUT. + \param h_max Maximal feasibility value -- \b IN. */ - void eval_points ( std::list<NOMAD::Eval_Point *> & list_x , - NOMAD::Barrier & true_barrier , - NOMAD::Barrier & sgte_barrier , - NOMAD::Pareto_Front * pareto_front , - std::list<bool> & list_count_eval , - bool & stop , - NOMAD::stop_type & stop_reason , - const NOMAD::Double & h_max ); + void eval_points ( std::list<NOMAD::Eval_Point *> & list_x , + NOMAD::Barrier & true_barrier , + NOMAD::Barrier & sgte_barrier , + NOMAD::Pareto_Front * pareto_front , + std::list<bool> & list_count_eval , + bool & stop , + NOMAD::stop_type & stop_reason , + const NOMAD::Double & h_max ); @@ -388,17 +381,16 @@ namespace NOMAD { \param success Success for these evaluations -- \b OUT. \param evaluated_pts List of processed points -- \b OUT. */ - void private_eval_list_of_points - ( NOMAD::search_type search , - NOMAD::Barrier & true_barrier , - NOMAD::Barrier & sgte_barrier , - NOMAD::Pareto_Front * pareto_front , - bool & stop , - NOMAD::stop_type & stop_reason , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc , - NOMAD::success_type & success , - std::list<const NOMAD::Eval_Point *> & evaluated_pts ); + void private_eval_list_of_points ( NOMAD::search_type search , + NOMAD::Barrier & true_barrier , + NOMAD::Barrier & sgte_barrier , + NOMAD::Pareto_Front * pareto_front , + bool & stop , + NOMAD::stop_type & stop_reason , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc , + NOMAD::success_type & success , + std::list<const NOMAD::Eval_Point *> & evaluated_pts ); #ifdef MODEL_STATS @@ -435,7 +427,7 @@ namespace NOMAD { Evaluator_Control::_force_quit = true; } - /// Force evaluation failure. + /// Force evaluation failure! static void force_evaluation_failure ( void ) { Evaluator_Control::_force_evaluation_failure = true; @@ -539,8 +531,8 @@ namespace NOMAD { /// Update the solution file. /** - \param x The lattest solution -- \b IN. - \param display_bimv Required to display least infeasible (default=false) -- \b IN + \param x The lattest solution -- \b IN. + \param display_bimv Required to display least infeasible (default=false) -- \b IN */ void write_solution_file ( const NOMAD::Eval_Point & x , bool display_bimv=false) const; @@ -613,13 +605,6 @@ namespace NOMAD { */ void set_evaluator ( NOMAD::Evaluator * e ) { _ev = e; } -#ifdef USE_TGP - /// Set the last TGP model from the model search. - /** - \param m The last TGP model -- \b IN. - */ - void set_last_TGP_model ( NOMAD::TGP_Model * m ) { _last_TGP_model = m; } -#endif /// Reset. void reset ( void ); @@ -633,13 +618,12 @@ namespace NOMAD { \param true_barrier Barrier for true evaluations -- \b IN/OUT. \param sgte_barrier Barrier for surrogate evaluations -- \b IN/OUT. */ - void ordering_lop - ( NOMAD::search_type search , // IN : search type - bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::Barrier & true_barrier , // IN/OUT: truth barrier - NOMAD::Barrier & sgte_barrier // IN/OUT: surrogate barrier - ); + void ordering_lop ( NOMAD::search_type search , // IN : search type + bool & stop , + NOMAD::stop_type & stop_reason , + NOMAD::Barrier & true_barrier , // IN/OUT: truth barrier + NOMAD::Barrier & sgte_barrier ); // IN/OUT: surrogate barrier + @@ -658,17 +642,16 @@ namespace NOMAD { \param success Success for this series of evaluations -- \b OUT. \param evaluated_pts List of processed points -- \b OUT. */ - void eval_list_of_points - ( NOMAD::search_type search , - NOMAD::Barrier & true_barrier , - NOMAD::Barrier & sgte_barrier , - NOMAD::Pareto_Front * pareto_front , - bool & stop , - NOMAD::stop_type & stop_reason , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc , - NOMAD::success_type & success , - std::list<const NOMAD::Eval_Point *> * evaluated_pts = NULL ); + void eval_list_of_points ( NOMAD::search_type search , + NOMAD::Barrier & true_barrier , + NOMAD::Barrier & sgte_barrier , + NOMAD::Pareto_Front * pareto_front , + bool & stop , + NOMAD::stop_type & stop_reason , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc , + NOMAD::success_type & success , + std::list<const NOMAD::Eval_Point *> * evaluated_pts = NULL ); /// Add a point to the list of points to be evaluated. /** @@ -765,8 +748,7 @@ namespace NOMAD { bool & stop , NOMAD::stop_type & stop_reason , NOMAD::success_type & success , - std::list<const NOMAD::Eval_Point *> - & evaluated_pts ); + std::list<const NOMAD::Eval_Point *> & evaluated_pts ); #endif }; } diff --git a/src/Exception.cpp b/src/Exception.cpp index cd72299..b455c0d 100644 --- a/src/Exception.cpp +++ b/src/Exception.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Exception.cpp - \brief custom class for exceptions (implementation) - \author Sebastien Le Digabel - \date 2010-03-29 - \see Exception.hpp -*/ + \file Exception.cpp + \brief custom class for exceptions (implementation) + \author Sebastien Le Digabel + \date 2010-03-29 + \see Exception.hpp + */ #include "Exception.hpp" /*----------------------------------------------------------------*/ @@ -47,10 +54,10 @@ /*----------------------------------------------------------------*/ const char * NOMAD::Exception::what ( void ) const throw() { - std::ostringstream oss; - oss << "NOMAD::Exception thrown (" << _file << ", " << _line << ")"; - if ( !_what.empty() ) - oss << " " << _what; - _what = oss.str(); - return _what.c_str(); + std::ostringstream oss; + oss << "NOMAD::Exception thrown (" << _file << ", " << _line << ")"; + if ( !_what.empty() ) + oss << " " << _what; + _what = oss.str(); + return _what.c_str(); } diff --git a/src/Exception.hpp b/src/Exception.hpp index 5e32917..84f0c7f 100644 --- a/src/Exception.hpp +++ b/src/Exception.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,62 +41,62 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Exception.hpp - \brief Custom class for exceptions (headers) - \author Sebastien Le Digabel - \date 2010-03-29 - \see Exception.cpp -*/ + \file Exception.hpp + \brief Custom class for exceptions (headers) + \author Sebastien Le Digabel + \date 2010-03-29 + \see Exception.cpp + */ #ifndef __NOMAD_EXCEPTION__ #define __NOMAD_EXCEPTION__ #include <sstream> namespace NOMAD { - - /// Custom class for exceptions. - /** + + /// Custom class for exceptions. + /** NOMAD uses this type of exceptions. It indicates the file and line number at which a throw is made. - + \b Example - + \code throw NOMAD::Exception ( __FILE__ , __LINE__ , "an error message" ); \endcode - */ - class Exception : public std::exception { - - private: - - mutable std::string _what; ///< Error message. - std::string _file; ///< File where the exception is thrown. - int _line; ///< Line number at which the exception is thrown. - - public: - - /// Constructor. - /** - \param file A string corresponding to the file where the - exception is thrown -- \b IN - \param line An integer corresponding to the line number - at which the exception is thrown -- \b IN. - \param msg A string corresponding to the error message -- \b IN. */ - Exception ( const std::string & file , int line , const std::string & msg ) - : _what ( msg ) , - _file ( file ) , - _line ( line ) {} - - /// Destructor. - virtual ~Exception ( void ) throw() {} - - /// Access to the error message. - /** - \return A string with the error message. - */ - const char * what ( void ) const throw(); - }; + class Exception : public std::exception { + + private: + + mutable std::string _what; ///< Error message. + std::string _file; ///< File where the exception is thrown. + int _line; ///< Line number at which the exception is thrown. + + public: + + /// Constructor. + /** + \param file A string corresponding to the file where the + exception is thrown -- \b IN + \param line An integer corresponding to the line number + at which the exception is thrown -- \b IN. + \param msg A string corresponding to the error message -- \b IN. + */ + Exception ( const std::string & file , int line , const std::string & msg ) + : _what ( msg ) , + _file ( file ) , + _line ( line ) {} + + /// Destructor. + virtual ~Exception ( void ) throw() {} + + /// Access to the error message. + /** + \return A string with the error message. + */ + const char * what ( void ) const throw(); + }; } #endif diff --git a/src/Extended_Poll.cpp b/src/Extended_Poll.cpp index 4344e92..f09390f 100644 --- a/src/Extended_Poll.cpp +++ b/src/Extended_Poll.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -126,12 +133,13 @@ void NOMAD::Extended_Poll::add_extended_poll_point ( NOMAD::Point & ep , // new eval point: // --------------- NOMAD::Eval_Point * pt = new NOMAD::Eval_Point; - pt->set ( ep , _p.get_bb_nb_outputs() ); - pt->set_signature ( new_s ); + pt->set ( ep , _p.get_bb_nb_outputs() ); + pt->set_signature ( new_s ); + for ( int i = 0 ; i < pt->get_n() ; ++i ) { - if ( (pt->get_signature()->get_input_type())[i] != NOMAD::CONTINUOUS && ! (*pt)[i].is_integer() ) + if ( (pt->get_signature()->get_input_types())[i] != NOMAD::CONTINUOUS && ! (*pt)[i].is_integer() ) throw NOMAD::Exception ( "Extended_Poll.cpp" , __LINE__ , "NOMAD::Extended_Poll::add_extended_points(): the categorical variables of the added point must be an integer." ); @@ -292,8 +300,8 @@ void NOMAD::Extended_Poll::descent ( const NOMAD::Eval_Point * y // Set mesh indices to 0 - NOMAD::Point delta( signature->get_n(), 0 ); - descent_p.get_signature()->get_mesh()->set_mesh_indices( delta ); + NOMAD::Point zero_mesh_indices( signature->get_n(), 0 ); + descent_p.get_signature()->get_mesh()->set_mesh_indices( zero_mesh_indices ); // Use best_feasible or best_infeasible limit mesh index as a termination criterion for descent const NOMAD::Eval_Point * old_bf = mads.get_best_feasible(); @@ -303,9 +311,10 @@ void NOMAD::Extended_Poll::descent ( const NOMAD::Eval_Point * y l1 = static_cast<int>((old_bf->get_signature()->get_mesh()->get_min_mesh_indices())[0].value()); // index same for all variables when using categorical variable else if ( old_bi ) l2 = static_cast<int>((old_bi->get_signature()->get_mesh()->get_min_mesh_indices())[0].value()); - descent_p.get_signature()->get_mesh()->set_limit_mesh_index( min( l1, l2) ); + descent_p.get_signature()->get_mesh()->set_limit_mesh_index( std::min( l1, l2) ); + // Evaluator_Control object: NOMAD::Evaluator_Control & ev_control = mads.get_evaluator_control(); @@ -508,10 +517,9 @@ void NOMAD::Extended_Poll::descent ( const NOMAD::Eval_Point * y /*----------------------------------------------------------------*/ /* create the descent parameters (private) */ /*----------------------------------------------------------------*/ -void NOMAD::Extended_Poll::set_descent_parameters -( const NOMAD::Eval_Point * y , - const NOMAD::Stats & stats , - NOMAD::Parameters & descent_p ) const +void NOMAD::Extended_Poll::set_descent_parameters ( const NOMAD::Eval_Point * y , + const NOMAD::Stats & stats , + NOMAD::Parameters & descent_p ) const { // extended poll center signature @@ -527,6 +535,7 @@ void NOMAD::Extended_Poll::set_descent_parameters descent_p.set_LOWER_BOUND ( epc_signature->get_lb() ); descent_p.set_UPPER_BOUND ( epc_signature->get_ub() ); descent_p.set_FIXED_VARIABLE ( epc_signature->get_fixed_variables() ); + descent_p.set_GRANULARITY ( epc_signature->get_granularity() ); descent_p.set_PERIODIC_VARIABLE ( epc_signature->get_periodic_variables() ); descent_p.set_VARIABLE_GROUP ( epc_signature->get_var_groups() ); descent_p.set_BB_OUTPUT_TYPE ( _p.get_bb_output_type() ); @@ -565,9 +574,9 @@ void NOMAD::Extended_Poll::set_descent_parameters descent_p.set_MODEL_EVAL_SORT ( _p.get_model_eval_sort()); descent_p.set_MODEL_SEARCH (_p.has_model_search()); - } + descent_p.set_LH_SEARCH ( 0 , 0 ); int bbe = stats.get_bb_eval(); @@ -619,8 +628,8 @@ void NOMAD::Extended_Poll::set_descent_parameters descent_p.set_OPPORTUNISTIC_MIN_F_IMPRVMT ( _p.get_opportunistic_min_f_imprvmt() ); descent_p.set_OPPORTUNISTIC_MIN_NB_SUCCESS ( _p.get_opportunistic_min_nb_success() ); - if (_p.eval_points_as_block()) - descent_p.set_BB_MAX_BLOCK_SIZE( _p.get_bb_max_block_size() ); + if ( _p.eval_points_as_block() ) + descent_p.set_BB_MAX_BLOCK_SIZE( _p.get_bb_max_block_size() ); descent_p.set_CACHE_FILE ( _p.get_cache_file() ); @@ -632,7 +641,7 @@ void NOMAD::Extended_Poll::set_descent_parameters descent_p.set_DISPLAY_ALL_EVAL(_p.get_display_all_eval()); if ( _p.out().get_poll_dd() == NOMAD::FULL_DISPLAY ) descent_p.set_DISPLAY_DEGREE ( NOMAD::NORMAL_DISPLAY ); - else if (_p.out().get_poll_dd() == NOMAD::NORMAL_DISPLAY ) + else if ( _p.out().get_poll_dd() == NOMAD::NORMAL_DISPLAY ) descent_p.set_DISPLAY_DEGREE ( NOMAD::MINIMAL_DISPLAY ); else descent_p.set_DISPLAY_DEGREE ( _p.out().get_poll_dd()); @@ -680,8 +689,7 @@ void NOMAD::Extended_Poll::set_descent_parameters const OrthogonalMesh * mesh = epc_signature->get_mesh(); descent_p.set_MIN_MESH_SIZE ( mesh->get_min_mesh_size() ); descent_p.set_MIN_POLL_SIZE ( mesh->get_min_poll_size() ); - descent_p.set_INITIAL_POLL_SIZE ( mesh->get_initial_poll_size() , false ); - + descent_p.set_INITIAL_POLL_SIZE ( mesh->get_initial_poll_size() , false ); } // check the parameters: @@ -703,14 +711,13 @@ void NOMAD::Extended_Poll::set_descent_parameters /*----------------------------------------------------------------*/ /* evaluation of an extended poll point (private) */ /*----------------------------------------------------------------*/ -const NOMAD::Eval_Point * NOMAD::Extended_Poll::eval_epp -( NOMAD::Eval_Point * y , - Mads & mads , - bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc ) const +const NOMAD::Eval_Point * NOMAD::Extended_Poll::eval_epp ( NOMAD::Eval_Point * y , + Mads & mads , + bool & stop , + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc ) const { NOMAD::Evaluator_Control & ev_control = mads.get_evaluator_control(); const NOMAD::Display & out = _p.out(); @@ -804,7 +811,8 @@ void NOMAD::Extended_Poll::run ( Mads & mads , out << std::endl << NOMAD::open_block ( oss.str() ) << std::endl; } - if ( has_sgte ) { + if ( has_sgte ) + { _p.set_SGTE_EVAL_SORT ( false ); // this ensures that only surrogate _p.force_check_flag(); // evaluations are performed } @@ -855,7 +863,8 @@ void NOMAD::Extended_Poll::run ( Mads & mads , &evaluated_pts ); if ( has_sgte ) { - if ( !_p.get_opt_only_sgte() ) { + if ( !_p.get_opt_only_sgte() ) + { success = NOMAD::UNSUCCESSFUL; new_feas_inc = new_infeas_inc = NULL; } @@ -982,8 +991,7 @@ void NOMAD::Extended_Poll::run ( Mads & mads , /* sort the extended poll points after they have been evaluated */ /* (private) */ /*----------------------------------------------------------------*/ -void NOMAD::Extended_Poll::sort_epp -( const std::list<const NOMAD::Eval_Point *> & evaluated_pts ) +void NOMAD::Extended_Poll::sort_epp ( const std::list<const NOMAD::Eval_Point *> & evaluated_pts ) { const NOMAD::Display & out = _p.out(); NOMAD::dd_type display_degree = out.get_poll_dd(); @@ -1034,7 +1042,7 @@ void NOMAD::Extended_Poll::sort_epp y->Point::operator = ( *cur ); // display: - if ( display_degree == NOMAD::FULL_DISPLAY ) + if ( display_degree == NOMAD::FULL_DISPLAY ) { out << "point #"; out.display_int_w ( ++i , nb_pts ); @@ -1056,11 +1064,12 @@ void NOMAD::Extended_Poll::sort_epp /*--------------------------------------------------------------------*/ bool NOMAD::Extended_Poll::set_neighbors_exe ( std::string & error_str ) { - error_str.clear(); + error_str.clear(); _neighbors_exe = _p.get_neighbors_exe(); - if ( _neighbors_exe.empty() ) { + if ( _neighbors_exe.empty() ) + { error_str = "categorical variables: parameter NEIGHBORS_EXE is undefined"; return false; } @@ -1071,16 +1080,18 @@ bool NOMAD::Extended_Poll::set_neighbors_exe ( std::string & error_str ) NOMAD::get_words ( _neighbors_exe , neighbors_exe_words ); // _neighbors_exe is composed of several words (it is a command): - if ( neighbors_exe_words.size() > 1 ) + if ( neighbors_exe_words.size() > 1 ) { _neighbors_exe.clear(); std::list<std::string>::const_iterator it = neighbors_exe_words.begin() , end = neighbors_exe_words.end(); - while (true) { + while (true) + { - if ( (*it)[0] != '$' ) { + if ( (*it)[0] != '$' ) + { _neighbors_exe += "\"" + problem_dir; _neighbors_exe += *it + "\""; } @@ -1148,7 +1159,7 @@ void NOMAD::Extended_Poll::construct_extended_points ( const NOMAD::Eval_Point & // input file writing: // ------------------- std::string input_file_name = - tmp_dir + NOMAD::BLACKBOX_INPUT_FILE_PREFIX + tmp_dir + NOMAD::BLACKBOX_INPUT_FILE_PREFIX + sint + NOMAD::BLACKBOX_INPUT_FILE_EXT; std::string output_file_name = @@ -1170,7 +1181,7 @@ void NOMAD::Extended_Poll::construct_extended_points ( const NOMAD::Eval_Point & fout.close(); - if ( fout.fail() ) + if ( fout.fail() ) { remove ( input_file_name.c_str () ); std::string err = "could not write file neighbors input file " + input_file_name; @@ -1207,7 +1218,7 @@ void NOMAD::Extended_Poll::construct_extended_points ( const NOMAD::Eval_Point & std::ifstream fin ( output_file_name.c_str() ); - if ( fin.fail() ) + if ( fin.fail() ) { remove ( input_file_name.c_str () ); remove ( output_file_name.c_str() ); @@ -1220,13 +1231,14 @@ void NOMAD::Extended_Poll::construct_extended_points ( const NOMAD::Eval_Point & while ( true ) { NOMAD::Point y(n); - try - { + try + { fin >> y; } catch ( NOMAD::Point::Bad_Input & ) { - if ( y.is_defined() ) { + if ( y.is_defined() ) + { remove ( input_file_name.c_str () ); remove ( output_file_name.c_str() ); std::string err = "error with neighbor in file " + output_file_name; diff --git a/src/Extended_Poll.hpp b/src/Extended_Poll.hpp index 55cdae4..93df428 100644 --- a/src/Extended_Poll.hpp +++ b/src/Extended_Poll.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Extended_Poll.hpp - \brief Extended poll for categorical variables (headers) - \author Sebastien Le Digabel - \date 2010-04-14 - \see Extended_Poll.cpp -*/ + \file Extended_Poll.hpp + \brief Extended poll for categorical variables (headers) + \author Sebastien Le Digabel + \date 2010-04-14 + \see Extended_Poll.cpp + */ #ifndef __EXTENDED_POLL__ #define __EXTENDED_POLL__ @@ -47,189 +54,188 @@ #include "Signature_Element.hpp" namespace NOMAD { - - /// Generic class for the extended poll. - /** - This is an abstract class (it is not possible to create - NOMAD::Extended_Poll objects). - */ - class Extended_Poll : public NOMAD::Uncopyable { - - protected: - - /// Parameters (includes the standard signature). - NOMAD::Parameters & _p; - - /// Add an extended poll point. - /** - Get, check and register the extended point and its signature - created by the user in \c construct_extended_points(). - \param ep Extended poll point -- \b IN. - \param s Associated signature -- \b IN. - */ - void add_extended_poll_point ( NOMAD::Point & ep , NOMAD::Signature & s ); - - /*---------------------------------------------------------------------*/ - - private: - - /// Executable for getting neighbors in batch mode. - std::string _neighbors_exe; - - /// Set of signatures (does not include the standard signature). - std::set<NOMAD::Signature_Element> _signatures; - - /// Signatures used during one poll step. - std::set<NOMAD::Signature_Element> _poll_signatures; - - /// Extended points for one poll step. - std::list<NOMAD::Eval_Point *> _extended_points; - - /*---------------------------------------------------------------------*/ - - /// Evaluation of an extended poll point. - /** - \param y The extended poll point -- \b IN/OUT. - \param mads NOMAD::Mads object invoking the poll -- \b IN/OUT. - \param stop Stop flag -- \b IN/OUT. - \param stop_reason Stop reason -- \b OUT. - \param success Type of success -- \b OUT. - \param new_feas_inc New feasible incumbent -- \b IN/OUT. - \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. - \return A pointer to the evaluated point; may be \c NULL if - the evaluation failed. - */ - const NOMAD::Eval_Point * eval_epp - ( NOMAD::Eval_Point * y , - Mads & mads , - bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc ) const; - - /// Sort the evaluated extended poll points. - /** - \param evaluated_pts The list of evaluated extended poll points -- \b IN/OUT. - */ - void sort_epp ( const std::list<const NOMAD::Eval_Point *> & evaluated_pts ); - - /// Check the extended poll trigger. - /** - \param old_bf A pointer to the old best feasible point -- \b IN. - \param old_bi A pointer to the old best infeasible point -- \b IN. - \param y A pointer to the extended poll center -- \b IN. - \return A boolean equal to \c true if the extended poll has to be performed. - */ - bool check_trigger ( const NOMAD::Eval_Point * old_bf , - const NOMAD::Eval_Point * old_bi , - const NOMAD::Eval_Point * y ) const; - - /// Check only the \c f values for the extended poll trigger. - /** - \param old_f Old \c f value -- \b IN. - \param new_f New \c f value -- \b IN. - \return A boolean equal to \c true if the extended poll has to be performed. - */ - bool check_trigger_on_f ( const NOMAD::Double & old_f , - const NOMAD::Double & new_f ) const; - /// Create the descent parameters. - /** - \param y Starting point -- \b IN. - \param stats Stats -- \b IN. - \param descent_p Descent parameters -- \b IN/OUT. - */ - void set_descent_parameters ( const NOMAD::Eval_Point * y , - const NOMAD::Stats & stats , - NOMAD::Parameters & descent_p ) const; - - /// Descent from the extended poll center. - /** - \param y Extended poll center -- \b IN. - \param mads NOMAD::Mads object invoking the poll -- \b IN/OUT. - \param nb_ext_poll_pts Number of extended poll points -- \b IN/OUT. - \param stop Stop flag -- \b IN/OUT. - \param stop_reason Stop reason -- \b OUT. - \param success Type of success -- \b OUT. - \param new_feas_inc New feasible incumbent -- \b IN/OUT. - \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. - */ - void descent ( const NOMAD::Eval_Point * y , - Mads & mads , - int & nb_ext_poll_pts , - bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc ); - - /*---------------------------------------------------------------------*/ - - public: - - /// Constructor. - /** - \param p Parameters -- \b IN. - */ - Extended_Poll ( NOMAD::Parameters & p ) : _p ( p ) {} - - /// Destructor. - virtual ~Extended_Poll ( void ); - - /// Construct the extended poll points. + /// Generic class for the extended poll. /** - - Has to be implemented by every NOMAD::Extended_Poll subclass. - - The extended poll points are the neighbors of \c xk where + This is an abstract class (it is not possible to create + NOMAD::Extended_Poll objects). + */ + class Extended_Poll : public NOMAD::Uncopyable { + + protected: + + /// Parameters (includes the standard signature). + NOMAD::Parameters & _p; + + /// Add an extended poll point. + /** + Get, check and register the extended point and its signature + created by the user in \c construct_extended_points(). + \param ep Extended poll point -- \b IN. + \param s Associated signature -- \b IN. + */ + void add_extended_poll_point ( NOMAD::Point & ep , NOMAD::Signature & s ); + + /*---------------------------------------------------------------------*/ + + private: + + /// Executable for getting neighbors in batch mode. + std::string _neighbors_exe; + + /// Set of signatures (does not include the standard signature). + std::set<NOMAD::Signature_Element> _signatures; + + /// Signatures used during one poll step. + std::set<NOMAD::Signature_Element> _poll_signatures; + + /// Extended points for one poll step. + std::list<NOMAD::Eval_Point *> _extended_points; + + /*---------------------------------------------------------------------*/ + + /// Evaluation of an extended poll point. + /** + \param y The extended poll point -- \b IN/OUT. + \param mads NOMAD::Mads object invoking the poll -- \b IN/OUT. + \param stop Stop flag -- \b IN/OUT. + \param stop_reason Stop reason -- \b OUT. + \param success Type of success -- \b OUT. + \param new_feas_inc New feasible incumbent -- \b IN/OUT. + \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. + \return A pointer to the evaluated point; may be \c NULL if + the evaluation failed. + */ + const NOMAD::Eval_Point * eval_epp ( NOMAD::Eval_Point * y , + Mads & mads , + bool & stop , + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc ) const; + + /// Sort the evaluated extended poll points. + /** + \param evaluated_pts The list of evaluated extended poll points -- \b IN/OUT. + */ + void sort_epp ( const std::list<const NOMAD::Eval_Point *> & evaluated_pts ); + + /// Check the extended poll trigger. + /** + \param old_bf A pointer to the old best feasible point -- \b IN. + \param old_bi A pointer to the old best infeasible point -- \b IN. + \param y A pointer to the extended poll center -- \b IN. + \return A boolean equal to \c true if the extended poll has to be performed. + */ + bool check_trigger ( const NOMAD::Eval_Point * old_bf , + const NOMAD::Eval_Point * old_bi , + const NOMAD::Eval_Point * y ) const; + + /// Check only the \c f values for the extended poll trigger. + /** + \param old_f Old \c f value -- \b IN. + \param new_f New \c f value -- \b IN. + \return A boolean equal to \c true if the extended poll has to be performed. + */ + bool check_trigger_on_f ( const NOMAD::Double & old_f , + const NOMAD::Double & new_f ) const; + + /// Create the descent parameters. + /** + \param y Starting point -- \b IN. + \param stats Stats -- \b IN. + \param descent_p Descent parameters -- \b IN/OUT. + */ + void set_descent_parameters ( const NOMAD::Eval_Point * y , + const NOMAD::Stats & stats , + NOMAD::Parameters & descent_p ) const; + + /// Descent from the extended poll center. + /** + \param y Extended poll center -- \b IN. + \param mads NOMAD::Mads object invoking the poll -- \b IN/OUT. + \param nb_ext_poll_pts Number of extended poll points -- \b IN/OUT. + \param stop Stop flag -- \b IN/OUT. + \param stop_reason Stop reason -- \b OUT. + \param success Type of success -- \b OUT. + \param new_feas_inc New feasible incumbent -- \b IN/OUT. + \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. + */ + void descent ( const NOMAD::Eval_Point * y , + Mads & mads , + int & nb_ext_poll_pts , + bool & stop , + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc ); + + /*---------------------------------------------------------------------*/ + + public: + + /// Constructor. + /** + \param p Parameters -- \b IN. + */ + Extended_Poll ( NOMAD::Parameters & p ) : _p ( p ) {} + + /// Destructor. + virtual ~Extended_Poll ( void ); + + /// Construct the extended poll points. + /** + - Has to be implemented by every NOMAD::Extended_Poll subclass. + - The extended poll points are the neighbors of \c xk where categorical variables have different values. - - The default implementation of this method uses parameter NEIGHBORS_EXE. - \param xk Poll center. - */ - virtual void construct_extended_points ( const NOMAD::Eval_Point & xk ); - - /// Set the neighbors executable name for the default implementation. - /** - \param error_str A string containing a possible error message -- \b OUT. - \return \c true if no error. - */ - bool set_neighbors_exe ( std::string & error_str ); - - /// Reset. - void reset ( void ); - - /// Poll reset. - /** - Before the extended poll is launched. - */ - void poll_reset ( void ); - - /// Access to the poll signatures. - /** - \return The set of poll signatures. - */ - const std::set<NOMAD::Signature_Element> & get_poll_signatures ( void ) const - { - return _poll_signatures; - } - - /// Run the extended poll. - /** - \param mads NOMAD::Mads object invoking this poll -- \b IN/OUT. - \param nb_ext_poll_pts Number of extended poll points -- \b OUT. - \param stop Stop flag -- \b IN/OUT. - \param stop_reason Stop reason -- \b OUT. - \param success Type of success -- \b OUT. - \param new_feas_inc New feasible incumbent -- \b IN/OUT. - \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. - */ - void run ( Mads & mads , - int & nb_ext_poll_pts , - bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc ); - }; + - The default implementation of this method uses parameter NEIGHBORS_EXE. + \param xk Poll center. + */ + virtual void construct_extended_points ( const NOMAD::Eval_Point & xk ); + + /// Set the neighbors executable name for the default implementation. + /** + \param error_str A string containing a possible error message -- \b OUT. + \return \c true if no error. + */ + bool set_neighbors_exe ( std::string & error_str ); + + /// Reset. + void reset ( void ); + + /// Poll reset. + /** + Before the extended poll is launched. + */ + void poll_reset ( void ); + + /// Access to the poll signatures. + /** + \return The set of poll signatures. + */ + const std::set<NOMAD::Signature_Element> & get_poll_signatures ( void ) const + { + return _poll_signatures; + } + + /// Run the extended poll. + /** + \param mads NOMAD::Mads object invoking this poll -- \b IN/OUT. + \param nb_ext_poll_pts Number of extended poll points -- \b OUT. + \param stop Stop flag -- \b IN/OUT. + \param stop_reason Stop reason -- \b OUT. + \param success Type of success -- \b OUT. + \param new_feas_inc New feasible incumbent -- \b IN/OUT. + \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. + */ + void run ( Mads & mads , + int & nb_ext_poll_pts , + bool & stop , + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc ); + }; } #endif diff --git a/src/Filter_Point.hpp b/src/Filter_Point.hpp index 3e74cc4..58de3cf 100644 --- a/src/Filter_Point.hpp +++ b/src/Filter_Point.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ diff --git a/src/LH_Search.cpp b/src/LH_Search.cpp index 43d76d1..7450155 100644 --- a/src/LH_Search.cpp +++ b/src/LH_Search.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -137,7 +144,7 @@ void NOMAD::LH_Search::search ( NOMAD::Mads & mads , int m = _p.get_bb_nb_outputs(); int pm1 = p-1; - // mesh sizes: + // mesh size: NOMAD::Point delta_max = signature->get_mesh()->get_delta_max (); NOMAD::Double delta_i; NOMAD::Point delta; @@ -180,7 +187,7 @@ void NOMAD::LH_Search::search ( NOMAD::Mads & mads , { pts[i] = new NOMAD::Point ( p ); - // for the initial mesh: delta is not used and there will + // for the initial mesh: delta_m is not used and there will // be no projection on mesh: if ( !_initial_search ) delta_i = delta[i]; diff --git a/src/LH_Search.hpp b/src/LH_Search.hpp index 685141a..a3704ee 100644 --- a/src/LH_Search.hpp +++ b/src/LH_Search.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,100 +41,100 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file LH_Search.hpp - \brief Latin-Hypercube search (headers) - \author Sebastien Le Digabel - \date 2010-04-09 - \see LH_Search.cpp -*/ + \file LH_Search.hpp + \brief Latin-Hypercube search (headers) + \author Sebastien Le Digabel + \date 2010-04-09 + \see LH_Search.cpp + */ #ifndef __LH_SEARCH__ #define __LH_SEARCH__ #include "Search.hpp" #include "Mads.hpp" -#include "RNG.hpp" +#include "RNG.hpp" namespace NOMAD { - - /// Class for the Latin-Hypercube search. - class LH_Search : public NOMAD::Search , private NOMAD::Uncopyable { - - private: - - bool _initial_search; /// Initial search flag (for display only). - - /// Decide \c p values for one variable. - /** - If no bounds, values are scaled with the largest Delta^m_k value obtained so far. - \param p Number of values to decide -- \b IN. - \param delta_m Delta^m_k (for the projection to the mesh) -- \b IN. - \param delta_m_max Largest Delta^m_k value -- \b IN. - \param bbit Black-box input type -- \b IN. - \param lb Lower bound -- \b IN. - \param ub Upper bound -- \b IN. - \param x The \p values -- \b OUT. - */ - void values_for_var_i ( int p , - const NOMAD::Double & delta_m , - const NOMAD::Double & delta_m_max , - const NOMAD::bb_input_type & bbit , - const NOMAD::Double & lb , - const NOMAD::Double & ub , - NOMAD::Point & x ) const; - public: - /// Constructor. - /** - \param p Parameters -- \b IN. - \param initial_search Initial search flag -- \b IN. - \param phase_one Phase one flag -- \b IN. - */ - LH_Search ( NOMAD::Parameters & p , - bool initial_search , - bool phase_one ) - : NOMAD::Search ( p , phase_one ? NOMAD::LH_SEARCH_P1 : NOMAD::LH_SEARCH ) , - _initial_search ( initial_search ) {} - - /// Destructor. - virtual ~LH_Search ( void ) {} - - /// The Latin-Hypercube search. - /** - \param mads NOMAD::Mads object invoking this search -- \b IN/OUT. - \param nb_search_pts Number of generated search points -- \b OUT. - \param stop Stop flag -- \b IN/OUT. - \param stop_reason Stop reason -- \b OUT. - \param success Type of success -- \b OUT. - \param count_search Count or not the search -- \b OUT. - \param new_feas_inc New feasible incumbent -- \b IN/OUT. - \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. - */ - virtual void search ( NOMAD::Mads & mads , - int & nb_search_pts , - bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - bool & count_search , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc ); - - /// Simpler method used to generate a list of LH points. - /** - \param n Dimension -- \b IN. - \param m Number of outputs -- \b IN. - \param p Number of LH points -- \b IN. - \param lb Lower bounds -- \b IN. - \param ub Upper bounds -- \b IN. - \param pts LH points -- \b OUT. - \return A boolean equal to \c true if no error occured. - */ - static bool LH_points ( int n , - int m , - int p , - const NOMAD::Point & lb , - const NOMAD::Point & ub , - std::vector<NOMAD::Eval_Point *> & pts ); - }; + /// Class for the Latin-Hypercube search. + class LH_Search : public NOMAD::Search , private NOMAD::Uncopyable { + + private: + + bool _initial_search; /// Initial search flag (for display only). + + /// Decide \c p values for one variable. + /** + If no bounds, values are scaled with the largest Delta^m_k value obtained so far. + \param p Number of values to decide -- \b IN. + \param delta_m Delta^m_k (for the projection to the mesh) -- \b IN. + \param delta_m_max Largest Delta^m_k value -- \b IN. + \param bbit Black-box input type -- \b IN. + \param lb Lower bound -- \b IN. + \param ub Upper bound -- \b IN. + \param x The \p values -- \b OUT. + */ + void values_for_var_i ( int p , + const NOMAD::Double & delta_m , + const NOMAD::Double & delta_m_max , + const NOMAD::bb_input_type & bbit , + const NOMAD::Double & lb , + const NOMAD::Double & ub , + NOMAD::Point & x ) const; + public: + + /// Constructor. + /** + \param p Parameters -- \b IN. + \param initial_search Initial search flag -- \b IN. + \param phase_one Phase one flag -- \b IN. + */ + LH_Search ( NOMAD::Parameters & p , + bool initial_search , + bool phase_one ) + : NOMAD::Search ( p , phase_one ? NOMAD::LH_SEARCH_P1 : NOMAD::LH_SEARCH ) , + _initial_search ( initial_search ) {} + + /// Destructor. + virtual ~LH_Search ( void ) {} + + /// The Latin-Hypercube search. + /** + \param mads NOMAD::Mads object invoking this search -- \b IN/OUT. + \param nb_search_pts Number of generated search points -- \b OUT. + \param stop Stop flag -- \b IN/OUT. + \param stop_reason Stop reason -- \b OUT. + \param success Type of success -- \b OUT. + \param count_search Count or not the search -- \b OUT. + \param new_feas_inc New feasible incumbent -- \b IN/OUT. + \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. + */ + virtual void search ( NOMAD::Mads & mads , + int & nb_search_pts , + bool & stop , + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + bool & count_search , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc ); + + /// Simpler method used to generate a list of LH points. + /** + \param n Dimension -- \b IN. + \param m Number of outputs -- \b IN. + \param p Number of LH points -- \b IN. + \param lb Lower bounds -- \b IN. + \param ub Upper bounds -- \b IN. + \param pts LH points -- \b OUT. + \return A boolean equal to \c true if no error occured. + */ + static bool LH_points ( int n , + int m , + int p , + const NOMAD::Point & lb , + const NOMAD::Point & ub , + std::vector<NOMAD::Eval_Point *> & pts ); + }; } #endif diff --git a/src/L_Curve.cpp b/src/L_Curve.cpp index 0050f90..369b3ae 100644 --- a/src/L_Curve.cpp +++ b/src/L_Curve.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file L_Curve.cpp - \brief L_CURVE_TARGET stopping criterion (implementation) - \author Sebastien Le Digabel - \date 2010-04-09 - \see L_Curve.hpp -*/ + \file L_Curve.cpp + \brief L_CURVE_TARGET stopping criterion (implementation) + \author Sebastien Le Digabel + \date 2010-04-09 + \see L_Curve.hpp + */ #include "L_Curve.hpp" /*-----------------------------------------------*/ @@ -47,19 +54,24 @@ /*-----------------------------------------------*/ void NOMAD::L_Curve::insert ( int bbe , const NOMAD::Double & f ) { - if ( _f.empty() ) { - _f.push_back ( f ); - _bbe.push_back (bbe); - } - else { - size_t nm1 = _bbe.size()-1; - if ( _bbe[nm1] == bbe ) - _f[nm1] = f; - else { - _f.push_back ( f ); - _bbe.push_back (bbe); + if ( _f.empty() ) + { + _f.push_back ( f ); + _bbe.push_back (bbe); + } + else + { + + size_t nm1 = _bbe.size()-1; + if ( _bbe[nm1] == bbe ) + _f[nm1] = f; + else + { + + _f.push_back ( f ); + _bbe.push_back (bbe); + } } - } } /*---------------------------------------------------------------*/ @@ -69,27 +81,28 @@ void NOMAD::L_Curve::insert ( int bbe , const NOMAD::Double & f ) /*---------------------------------------------------------------*/ bool NOMAD::L_Curve::check_stop ( int bbe ) const { - // we check the p last successes and approximate the L-curve - // with a line joining the extremities: - const size_t p = 7; - - if ( _f.size() >= p ) { - - size_t n = _f.size(); - - NOMAD::Double f2 = _f[n-1]; - if ( f2 <= _target ) - return false; + // we check the p last successes and approximate the L-curve + // with a line joining the extremities: + const size_t p = 7; - size_t nmp = n-p; - int bbe1 = _bbe [ nmp ]; - NOMAD::Double f1 = _f [ nmp ]; - NOMAD::Double a = ( f2 - f1 ) / ( bbe - bbe1 ); - NOMAD::Double b = f1 - a * bbe1; - int bbe_target = static_cast<int> ( ceil ( ( ( _target - b ) / a ).value() ) ); - - // test: if ( bbe_target > bbe+(bbe-bbe1) ) - return ( bbe_target > 2*bbe - bbe1 ); - } - return false; + if ( _f.size() >= p ) + { + + size_t n = _f.size(); + + NOMAD::Double f2 = _f[n-1]; + if ( f2 <= _target ) + return false; + + size_t nmp = n-p; + int bbe1 = _bbe [ nmp ]; + NOMAD::Double f1 = _f [ nmp ]; + NOMAD::Double a = ( f2 - f1 ) / ( bbe - bbe1 ); + NOMAD::Double b = f1 - a * bbe1; + int bbe_target = static_cast<int> ( ceil ( ( ( _target - b ) / a ).value() ) ); + + // test: if ( bbe_target > bbe+(bbe-bbe1) ) + return ( bbe_target > 2*bbe - bbe1 ); + } + return false; } diff --git a/src/L_Curve.hpp b/src/L_Curve.hpp index 8330580..ee5a635 100644 --- a/src/L_Curve.hpp +++ b/src/L_Curve.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file L_Curve.hpp - \brief L_CURVE_TARGET stopping criterion (headers) - \author Sebastien Le Digabel - \date 2010-04-09 - \see L_Curve.cpp -*/ + \file L_Curve.hpp + \brief L_CURVE_TARGET stopping criterion (headers) + \author Sebastien Le Digabel + \date 2010-04-09 + \see L_Curve.cpp + */ #ifndef __L_CURVE__ #define __L_CURVE__ @@ -47,42 +54,42 @@ #include "Uncopyable.hpp" namespace NOMAD { - - /// Class implementing the L_CURVE_TARGET stopping criterion. - class L_Curve : private NOMAD::Uncopyable { - - private: - - NOMAD::Double _target; ///< L_CURVE_TARGET parameter value. - std::vector<NOMAD::Double> _f; ///< List of objective values. - std::vector<int > _bbe; ///< List of numbers of evaluations. - - public: - - /// Constructor. - /** - \param target L_CURVE_TARGET parameter value -- \b IN. - */ - L_Curve ( const NOMAD::Double & target ) : _target ( target ) {} - - /// Destructor. - virtual ~L_Curve ( void ) {} - - /// Insertion of a pair \c bbe/f in the lists \c _f and \c _bbe. - /** - \param bbe A new number of evaluations -- \b IN. - \param f A new objective value -- \b IN. - */ - void insert ( int bbe , const NOMAD::Double & f ); - - /// Check the L_CURVE_TARGET stopping criterion. - /** - \param bbe An integer indicating a number of blackbox evaluations - -- \b IN. - \return A boolean equal to \c true if the method detects that - the target will not be reached after bbe evaluations. - */ - bool check_stop ( int bbe ) const; - }; + + /// Class implementing the L_CURVE_TARGET stopping criterion. + class L_Curve : private NOMAD::Uncopyable { + + private: + + NOMAD::Double _target; ///< L_CURVE_TARGET parameter value. + std::vector<NOMAD::Double> _f; ///< List of objective values. + std::vector<int > _bbe; ///< List of numbers of evaluations. + + public: + + /// Constructor. + /** + \param target L_CURVE_TARGET parameter value -- \b IN. + */ + L_Curve ( const NOMAD::Double & target ) : _target ( target ) {} + + /// Destructor. + virtual ~L_Curve ( void ) {} + + /// Insertion of a pair \c bbe/f in the lists \c _f and \c _bbe. + /** + \param bbe A new number of evaluations -- \b IN. + \param f A new objective value -- \b IN. + */ + void insert ( int bbe , const NOMAD::Double & f ); + + /// Check the L_CURVE_TARGET stopping criterion. + /** + \param bbe An integer indicating a number of blackbox evaluations + -- \b IN. + \return A boolean equal to \c true if the method detects that + the target will not be reached after bbe evaluations. + */ + bool check_stop ( int bbe ) const; + }; } #endif diff --git a/src/Mads.cpp b/src/Mads.cpp index 5232644..5aae7c5 100644 --- a/src/Mads.cpp +++ b/src/Mads.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -57,27 +64,24 @@ bool NOMAD::Mads::_flag_p1_active = false; /*---------------------------------------------------------*/ void NOMAD::Mads::force_quit ( int signalValue ) { - NOMAD::Mads::_force_quit = true; - NOMAD::Evaluator_Control::force_quit(); - NOMAD::Evaluator::force_quit(); - -#ifdef USE_TGP - NOMAD::TGP_Output_Model::force_quit(); -#endif + NOMAD::Mads::_force_quit = true; + NOMAD::Evaluator_Control::force_quit(); + NOMAD::Evaluator::force_quit(); + } /*---------------------------------------------------------*/ /* access to the flags (static) */ /*---------------------------------------------------------*/ void NOMAD::Mads::get_flags ( bool & flag_check_bimads , - bool & flag_reset_mesh , - bool & flag_reset_barriers , - bool & flag_p1_active ) + bool & flag_reset_mesh , + bool & flag_reset_barriers , + bool & flag_p1_active ) { - flag_check_bimads = _flag_check_bimads; - flag_reset_mesh = _flag_reset_mesh; - flag_reset_barriers = _flag_reset_barriers; - flag_p1_active = _flag_p1_active; + flag_check_bimads = _flag_check_bimads; + flag_reset_mesh = _flag_reset_mesh; + flag_reset_barriers = _flag_reset_barriers; + flag_p1_active = _flag_p1_active; } /*---------------------------------------------------------*/ @@ -88,53 +92,43 @@ void NOMAD::Mads::get_flags ( bool & flag_check_bimads , /*---------------------------------------------------------*/ void NOMAD::Mads::init ( void ) { - - NOMAD::Mads::_force_quit = false; - - if ( !NOMAD::Slave::is_master() ) - return; - - // Mads::force_quit() will be called if ctrl-c is pressed: - signal ( SIGINT , NOMAD::Mads::force_quit ); + + NOMAD::Mads::_force_quit = false; + + if ( !NOMAD::Slave::is_master() ) + return; + + // Mads::force_quit() will be called if ctrl-c is pressed: + signal ( SIGINT , NOMAD::Mads::force_quit ); #ifndef WINDOWS - signal ( SIGPIPE , NOMAD::Mads::force_quit ); // (ctrl-c during a "| more") + signal ( SIGPIPE , NOMAD::Mads::force_quit ); // (ctrl-c during a "| more") #endif #ifdef USE_MPI - signal ( SIGTERM , NOMAD::Mads::force_quit ); + signal ( SIGTERM , NOMAD::Mads::force_quit ); #endif - - // model searches initialization: - if ( _p.has_model_search() ) { -#ifdef USE_TGP - if ( _p.get_model_search(1) == NOMAD::TGP_MODEL ) - _model_search1 = new TGP_Model_Search ( _p ); -#endif - if ( _p.get_model_search(1) == NOMAD::QUADRATIC_MODEL ) - _model_search1 = new Quad_Model_Search ( _p ); -#ifdef USE_TGP - if ( _p.get_model_search(2) == NOMAD::TGP_MODEL ) - _model_search2 = new TGP_Model_Search ( _p ); -#endif - if ( _p.get_model_search(2) == NOMAD::QUADRATIC_MODEL ) - _model_search2 = new Quad_Model_Search ( _p ); - } - -#ifdef USE_TGP - _ev_control.set_last_TGP_model ( NULL ); -#endif - - // VNS search initialization: - if ( _p.get_VNS_search() ) - _VNS_search = new VNS_Search ( _p ); - - // cache search initialization: - if ( _p.get_cache_search() ) - _cache_search = new Cache_Search ( _p ); - - // Orthogonal mesh initialization - _mesh->reset(); - - + + // model searches initialization: + if ( _p.has_model_search() ) + { + if ( _p.get_model_search(1) == NOMAD::QUADRATIC_MODEL ) + _model_search1 = new Quad_Model_Search ( _p ); + + if ( _p.get_model_search(2) == NOMAD::QUADRATIC_MODEL ) + _model_search2 = new Quad_Model_Search ( _p ); + } + + // VNS search initialization: + if ( _p.get_VNS_search() ) + _VNS_search = new VNS_Search ( _p ); + + // cache search initialization: + if ( _p.get_cache_search() ) + _cache_search = new Cache_Search ( _p ); + + // Orthogonal mesh initialization + _mesh->reset(); + + } /*---------------------------------------------------------*/ @@ -142,15 +136,15 @@ void NOMAD::Mads::init ( void ) /*---------------------------------------------------------*/ NOMAD::Mads::~Mads ( void ) { - delete _pareto_front; - delete _model_search1; - delete _model_search2; - delete _VNS_search; - delete _cache_search; - delete _L_curve; - + delete _pareto_front; + delete _model_search1; + delete _model_search2; + delete _VNS_search; + delete _cache_search; + delete _L_curve; + if ( _extended_poll && !_user_ext_poll) - delete _extended_poll; + delete _extended_poll; } /*-------------------------------------------------------------*/ @@ -161,434 +155,416 @@ NOMAD::Mads::~Mads ( void ) /*-------------------------------------------------------------*/ void NOMAD::Mads::reset ( bool keep_barriers , bool keep_stats ) { - // evaluator control: -#ifdef USE_TGP - _ev_control.set_last_TGP_model ( NULL ); -#endif - - // user search: - _user_search = NULL; - - // model search #1: - if ( _p.get_model_search(1) != NOMAD::NO_MODEL ) - { - if ( _model_search1 ) - _model_search1->reset(); - else { - if ( _p.get_model_search(1) == NOMAD::TGP_MODEL ) - { -#ifdef USE_TGP - _model_search1 = new TGP_Model_Search ( _p ) ; -#endif - } - else - _model_search1 = new Quad_Model_Search ( _p ); - } - } - else - { - delete _model_search1; - _model_search1 = NULL; - } - - // model search #2: - if ( _p.get_model_search(2) != NOMAD::NO_MODEL ) - { - if ( _model_search2 ) - _model_search2->reset(); - else - { - if ( _p.get_model_search(2) == NOMAD::TGP_MODEL ) - { -#ifdef USE_TGP - _model_search2 = new TGP_Model_Search ( _p ) ; -#endif - } - else - _model_search2 = new Quad_Model_Search ( _p ); - } - } - else - { - delete _model_search2; - _model_search2 = NULL; - } - - // VNS search: - if ( _p.get_VNS_search() ) - { - if ( _VNS_search ) - _VNS_search->reset(); - else - _VNS_search = new VNS_Search ( _p ); - } - else { - delete _VNS_search; - _VNS_search = NULL; - } - - // cache search: - if ( _p.get_cache_search() ) - { - if ( _cache_search ) - _cache_search->reset(); - else - _cache_search = new Cache_Search ( _p ); - } - else - { - delete _cache_search; - _cache_search = NULL; - } - - // barriers: - _flag_reset_barriers = !keep_barriers; - if ( _flag_reset_barriers ) - { - _true_barrier.reset(); - _sgte_barrier.reset(); - } - - // stats: - if ( !keep_stats ) - _stats.reset(); - - + + // user search: + _user_search = NULL; + + // model search #1: + if ( _p.get_model_search(1) != NOMAD::NO_MODEL ) + { + if ( _model_search1 ) + _model_search1->reset(); + else + _model_search1 = new Quad_Model_Search ( _p ); + } + else + { + delete _model_search1; + _model_search1 = NULL; + } + + // model search #2: + if ( _p.get_model_search(2) != NOMAD::NO_MODEL ) + { + if ( _model_search2 ) + _model_search2->reset(); + else + _model_search2 = new Quad_Model_Search ( _p ); + } + else + { + delete _model_search2; + _model_search2 = NULL; + } + + // VNS search: + if ( _p.get_VNS_search() ) + { + if ( _VNS_search ) + _VNS_search->reset(); + else + _VNS_search = new VNS_Search ( _p ); + } + else + { + + delete _VNS_search; + _VNS_search = NULL; + } + + // cache search: + if ( _p.get_cache_search() ) + { + if ( _cache_search ) + _cache_search->reset(); + else + _cache_search = new Cache_Search ( _p ); + } + else + { + delete _cache_search; + _cache_search = NULL; + } + + // barriers: + _flag_reset_barriers = !keep_barriers; + if ( _flag_reset_barriers ) + { + _true_barrier.reset(); + _sgte_barrier.reset(); + } + + // stats: + if ( !keep_stats ) + _stats.reset(); + + _mesh->reset(); - + } - /* algorithm execution (single-objective) */ /*---------------------------------------------------------*/ NOMAD::stop_type NOMAD::Mads::run ( void ) { - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_gen_dd(); - NOMAD::stop_type stop_reason = NOMAD::UNKNOWN_STOP_REASON; - + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_gen_dd(); + NOMAD::stop_type stop_reason = NOMAD::UNKNOWN_STOP_REASON; + #ifdef USE_MPI - - if ( NOMAD::Slave::get_nb_processes() < 2 ) - { - out << NOMAD::open_block("ERROR:") << "Incorrect command to run with MPI." << std::endl - << "Usage: mpirun -np p exeName" << std::endl ; - out << NOMAD::close_block(); - return stop_reason; - } - - - // init the slaves: - bool stop_slaves_here = false; - - if ( NOMAD::Slave::is_master() ) - { - if ( !NOMAD::Slave::are_running() ) - { - NOMAD::Slave::init_slaves ( out ); - stop_slaves_here = true; - } - } - else - { - NOMAD::Slave s ( _p , _ev_control.get_evaluator() ); - s.run(); - return stop_reason; - } - + + if ( NOMAD::Slave::get_nb_processes() < 2 ) + { + out << NOMAD::open_block("ERROR:") << "Incorrect command to run with MPI." << std::endl + << "Usage: mpirun -np p exeName" << std::endl ; + out << NOMAD::close_block(); + return stop_reason; + } + + + // init the slaves: + bool stop_slaves_here = false; + + if ( NOMAD::Slave::is_master() ) + { + if ( !NOMAD::Slave::are_running() ) + { + NOMAD::Slave::init_slaves ( out ); + stop_slaves_here = true; + } + } + else + { + NOMAD::Slave s ( _p , _ev_control.get_evaluator() ); + s.run(); + return stop_reason; + } + #endif - - try - { - - // check an extended poll if there are categorical - // variables and disable extended poll otherwise: - if ( _p.get_signature()->has_categorical() ) - { - - if ( _user_ext_poll && !_extended_poll ) - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , - "categorical variables: user extended poll object is NULL" ); - - if ( _p.get_extended_poll_enabled() && !_user_ext_poll ) - { - if (!_extended_poll) - _extended_poll = new NOMAD::Extended_Poll ( _p ); // extended poll created only once with the signatures of _p - - std::string error_str; - if ( !_extended_poll->set_neighbors_exe ( error_str ) ) - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , error_str ); - } - } - else if ( _extended_poll ) - { - if ( !_user_ext_poll ) - delete _extended_poll; - _extended_poll = NULL; - } - - // check if Mads::run() has been called for multi-objective: - if ( NOMAD::Mads::_flag_check_bimads && _p.get_nb_obj() > 1 ) - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , - "Mads::run() called for multi-objective instead of Mads::multi_run()" ); - + + try + { + + // check an extended poll if there are categorical + // variables and disable extended poll otherwise: + if ( _p.get_signature()->has_categorical() ) + { + + if ( _user_ext_poll && !_extended_poll ) + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , + "categorical variables: user extended poll object is NULL" ); + + if ( _p.get_extended_poll_enabled() && !_user_ext_poll ) + { + if (!_extended_poll) + _extended_poll = new NOMAD::Extended_Poll ( _p ); // extended poll created only once with the signatures of _p + + std::string error_str; + if ( !_extended_poll->set_neighbors_exe ( error_str ) ) + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , error_str ); + } + } + else if ( _extended_poll ) + { + if ( !_user_ext_poll ) + delete _extended_poll; + _extended_poll = NULL; + } + + // check if Mads::run() has been called for multi-objective: + if ( NOMAD::Mads::_flag_check_bimads && _p.get_nb_obj() > 1 ) + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , + "Mads::run() called for multi-objective instead of Mads::multi_run()" ); + #ifndef R_VERSION - if ( display_degree == NOMAD::NORMAL_DISPLAY || display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl << NOMAD::open_block ( "MADS run" ); - - if ( display_degree == NOMAD::NORMAL_DISPLAY ) { - _ev_control.display_stats ( true , - out , - _p.get_display_stats() , - NULL , - false , - NULL ); - out << std::endl << std::endl; - } + if ( display_degree == NOMAD::NORMAL_DISPLAY || display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl << NOMAD::open_block ( "MADS run" ); + + if ( display_degree == NOMAD::NORMAL_DISPLAY ) + { + _ev_control.display_stats ( true , + out , + _p.get_display_stats() , + NULL , + false , + NULL ); + out << std::endl << std::endl; + } #endif - - // barriers init: - if ( _flag_reset_barriers ) - { - _true_barrier.reset(); - _sgte_barrier.reset(); - } - - // evaluator control init: - _ev_control.reset(); - - // reset the extended poll: - if ( _extended_poll && _p.get_extended_poll_enabled() ) - _extended_poll->reset(); - - // mesh init/reset: - if ( _flag_reset_mesh ) + + // barriers init: + if ( _flag_reset_barriers ) + { + _true_barrier.reset(); + _sgte_barrier.reset(); + } + + // evaluator control init: + _ev_control.reset(); + + // reset the extended poll: + if ( _extended_poll && _p.get_extended_poll_enabled() ) + _extended_poll->reset(); + + // mesh init/reset: + if ( _flag_reset_mesh ) _mesh->reset(); - - NOMAD::success_type success , last_success; - int nb_search_pts; - bool count_search; - bool stop = false; - const NOMAD::Eval_Point * new_feas_inc = NULL; - const NOMAD::Eval_Point * new_infeas_inc = NULL; - - stop_reason = NOMAD::NO_STOP; - - // x0 eval: - eval_x0 ( stop , stop_reason ); - - // phase one: if no feasible starting point: - bool phase_one_done = false; - if (stop && - stop_reason == NOMAD::X0_FAIL && - _p.has_EB_constraints() && - ( _stats.get_eval() > 0 || ( _p.get_opt_only_sgte() && _stats.get_sgte_eval() > 0 ) ) ) - { - - phase_one_done = true; - Phase_One_Search p1s ( _p ); - p1s.search ( *this , - nb_search_pts , - stop , - stop_reason , - success , - count_search , - new_feas_inc , - new_infeas_inc ); - - _mesh->reset(); - - } - - // initial Latin-Hypercube (LH) search: - if ( !stop && !phase_one_done && _p.get_LH_search_p0() > 0 ) - { - - LH_Search lh ( _p , true , _flag_p1_active ); - int nb_search_pts; - - lh.search ( *this , - nb_search_pts , - stop , - stop_reason , - success , - count_search , - new_feas_inc , - new_infeas_inc ); - - if ( success == NOMAD::FULL_SUCCESS ) - _stats.add_LH_success(); - - if ( count_search ) - _stats.add_nb_LH_searches(); - - _stats.add_LH_pts ( nb_search_pts ); - } - - // no iterations allowed: - if ( !stop && _p.get_max_iterations() == 0 ) - { - stop = true; - stop_reason = NOMAD::MAX_ITER_REACHED; - } - - // L_curve initialization: - delete _L_curve; - _L_curve = NULL; - const NOMAD::Double L_curve_target = _p.get_L_curve_target(); - if ( L_curve_target.is_defined() ) - { - _L_curve = new NOMAD::L_Curve ( L_curve_target ); - const NOMAD::Eval_Point * best_feasible = get_best_feasible(); - if ( best_feasible ) - _L_curve->insert ( _stats.get_bb_eval() , best_feasible->get_f() ); - } - - int max_cfi = _p.get_max_consecutive_failed_iterations(); - int nb_cfi = 0; - - success = last_success = NOMAD::UNSUCCESSFUL; - - // MADS iterations: - while ( !stop ) - { - - iteration ( stop , - stop_reason , - success , - new_feas_inc , - new_infeas_inc ); - - if ( success == NOMAD::UNSUCCESSFUL && last_success == NOMAD::UNSUCCESSFUL ) - ++nb_cfi; - else - nb_cfi = (success == NOMAD::UNSUCCESSFUL) ? 1 : 0; - - last_success = success; - - // check the consecutive number of failed iterations: - if ( max_cfi > 0 && nb_cfi > max_cfi ) - { - stop = true; - stop_reason = NOMAD::MAX_CONS_FAILED_ITER; - } - - } - - // parallel version: + + NOMAD::success_type success , last_success; + int nb_search_pts; + bool count_search; + bool stop = false; + const NOMAD::Eval_Point * new_feas_inc = NULL; + const NOMAD::Eval_Point * new_infeas_inc = NULL; + + stop_reason = NOMAD::NO_STOP; + + // x0 eval: + eval_x0 ( stop , stop_reason ); + + // phase one: if no feasible starting point: + bool phase_one_done = false; + if (stop && + stop_reason == NOMAD::X0_FAIL && + _p.has_EB_constraints() && + ( _stats.get_eval() > 0 || ( _p.get_opt_only_sgte() && _stats.get_sgte_eval() > 0 ) ) ) + { + + phase_one_done = true; + Phase_One_Search p1s ( _p ); + p1s.search ( *this , + nb_search_pts , + stop , + stop_reason , + success , + count_search , + new_feas_inc , + new_infeas_inc ); + + _mesh->reset(); + + } + + // initial Latin-Hypercube (LH) search: + if ( !stop && !phase_one_done && _p.get_LH_search_p0() > 0 ) + { + + LH_Search lh ( _p , true , _flag_p1_active ); + int nb_search_pts; + + lh.search ( *this , + nb_search_pts , + stop , + stop_reason , + success , + count_search , + new_feas_inc , + new_infeas_inc ); + + if ( success == NOMAD::FULL_SUCCESS ) + _stats.add_LH_success(); + + if ( count_search ) + _stats.add_nb_LH_searches(); + + _stats.add_LH_pts ( nb_search_pts ); + } + + // no iterations allowed: + if ( !stop && _p.get_max_iterations() == 0 ) + { + stop = true; + stop_reason = NOMAD::MAX_ITER_REACHED; + } + + // L_curve initialization: + delete _L_curve; + _L_curve = NULL; + const NOMAD::Double L_curve_target = _p.get_L_curve_target(); + if ( L_curve_target.is_defined() ) + { + _L_curve = new NOMAD::L_Curve ( L_curve_target ); + const NOMAD::Eval_Point * best_feasible = get_best_feasible(); + if ( best_feasible ) + _L_curve->insert ( _stats.get_bb_eval() , best_feasible->get_f() ); + } + + int max_cfi = _p.get_max_consecutive_failed_iterations(); + int nb_cfi = 0; + + success = last_success = NOMAD::UNSUCCESSFUL; + + // MADS iterations: + while ( !stop ) + { + + iteration ( stop , + stop_reason , + success , + new_feas_inc , + new_infeas_inc ); + + if ( success == NOMAD::UNSUCCESSFUL && last_success == NOMAD::UNSUCCESSFUL ) + ++nb_cfi; + else + nb_cfi = (success == NOMAD::UNSUCCESSFUL) ? 1 : 0; + + last_success = success; + + // check the consecutive number of failed iterations: + if ( max_cfi > 0 && nb_cfi > max_cfi ) + { + stop = true; + stop_reason = NOMAD::MAX_CONS_FAILED_ITER; + } + + } + + // parallel version: #ifdef USE_MPI - - // asynchronous mode: wait for the evaluations in progress: - if ( _p.get_asynchronous() ) - { - std::list<const NOMAD::Eval_Point *> evaluated_pts; - _ev_control.wait_for_evaluations ( NOMAD::ASYNCHRONOUS , - _true_barrier , - _sgte_barrier , - _pareto_front , - stop , - stop_reason , - success , - evaluated_pts ); - } - - // update stats: - _stats.set_MPI_data_size ( NOMAD::Slave::get_data_sent() + - NOMAD::Slave::get_data_rcvd() ); - + + // asynchronous mode: wait for the evaluations in progress: + if ( _p.get_asynchronous() ) + { + std::list<const NOMAD::Eval_Point *> evaluated_pts; + _ev_control.wait_for_evaluations ( NOMAD::ASYNCHRONOUS , + _true_barrier , + _sgte_barrier , + _pareto_front , + stop , + stop_reason , + success , + evaluated_pts ); + } + + // update stats: + _stats.set_MPI_data_size ( NOMAD::Slave::get_data_sent() + + NOMAD::Slave::get_data_rcvd() ); + #endif - - // final cache save (overwrite=true): - _ev_control.save_caches ( true ); - - // final displays: - const NOMAD::Eval_Point * bf = get_best_feasible(); - bool write_stats = bf && - ( bf->get_tag() != _ev_control.get_last_stats_tag() || - _stats.get_bb_eval() != _ev_control.get_last_stats_bbe() ); - - const std::string & stats_file_name = _p.get_stats_file_name(); - - if ( !stats_file_name.empty() ) - { - if ( write_stats && !_p.get_display_all_eval() ) - { - _ev_control.stats_file ( stats_file_name , bf , true , NULL ); - } + + // final cache save (overwrite=true): + _ev_control.save_caches ( true ); + + // final displays: + const NOMAD::Eval_Point * bf = get_best_feasible(); + bool write_stats = bf && + ( bf->get_tag() != _ev_control.get_last_stats_tag() || + _stats.get_bb_eval() != _ev_control.get_last_stats_bbe() ); + + const std::string & stats_file_name = _p.get_stats_file_name(); + + if ( !stats_file_name.empty() ) + { + if ( write_stats && !_p.get_display_all_eval() ) + { + _ev_control.stats_file ( stats_file_name , bf , true , NULL ); + } + if ( !bf && display_degree > NOMAD::MINIMAL_DISPLAY ) - { - std::ofstream fout ( (_p.get_problem_dir() + stats_file_name).c_str() ); - if ( fout.fail() ) - { - out << std::endl - << "Warning (" << "Mads.cpp" << ", " << __LINE__ - << "): could not save information in stats file \'" - << stats_file_name << "\'" << std::endl << std::endl; - } - else - fout << "no feasible solution has been found after " - << _stats.get_bb_eval() << " evaluations" - << std::endl; - fout.close(); - } - - } - - if ( display_degree > NOMAD::MINIMAL_DISPLAY) - { - - // final stats: - if ( display_degree == NOMAD::NORMAL_DISPLAY && bf && write_stats && !_p.get_display_all_eval() ) - _ev_control.display_stats ( false, - out, - _p.get_display_stats() , - bf , - true , - NULL ); + { + std::ofstream fout ( (_p.get_problem_dir() + stats_file_name).c_str() ); + if ( fout.fail() ) + { + out << std::endl + << "Warning (" << "Mads.cpp" << ", " << __LINE__ + << "): could not save information in stats file \'" + << stats_file_name << "\'" << std::endl << std::endl; + } + else + fout << "no feasible solution has been found after " + << _stats.get_bb_eval() << " evaluations" + << std::endl; + fout.close(); + } + + } + + if ( display_degree > NOMAD::MINIMAL_DISPLAY) + { + + // final stats: + if ( display_degree == NOMAD::NORMAL_DISPLAY && bf && write_stats && !_p.get_display_all_eval() ) + _ev_control.display_stats ( false, + out, + _p.get_display_stats() , + bf , + true , + NULL ); #ifndef R_VERSION - std::ostringstream msg; - msg << "end of run (" << stop_reason << ")"; - out << std::endl << NOMAD::close_block ( msg.str() ); + std::ostringstream msg; + msg << "end of run (" << stop_reason << ")"; + out << std::endl << NOMAD::close_block ( msg.str() ); #endif - } - - // mono-objective final displays: - if ( _p.get_nb_obj() == 1 ) - { - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl << NOMAD::open_block ( "NOMAD final display" ); - + } + + // mono-objective final displays: + if ( _p.get_nb_obj() == 1 ) + { + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl << NOMAD::open_block ( "NOMAD final display" ); + #ifndef R_VERSION - display(); + display(); #endif - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out.close_block(); - } - - } // end of the try block - - catch ( std::exception & e ) + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out.close_block(); + } + + } // end of the try block + + catch ( std::exception & e ) { - + #ifdef USE_MPI - if ( NOMAD::Slave::are_running() ) - NOMAD::Slave::stop_slaves ( out ); + if ( NOMAD::Slave::are_running() ) + NOMAD::Slave::stop_slaves ( out ); #endif - - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , e.what() ); - } - - // stop the slaves: + + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , e.what() ); + } + + // stop the slaves: #ifdef USE_MPI - if ( NOMAD::Slave::are_running() && stop_slaves_here ) - NOMAD::Slave::stop_slaves ( out ); + if ( NOMAD::Slave::are_running() && stop_slaves_here ) + NOMAD::Slave::stop_slaves ( out ); #endif - - return stop_reason; + + return stop_reason; } /*----------------------------------------------------------------------*/ @@ -599,153 +575,152 @@ NOMAD::stop_type NOMAD::Mads::run ( void ) /* been set to zero */ /* . private method */ /*----------------------------------------------------------------------*/ -void NOMAD::Mads::multi_launch_single_opt -( NOMAD::dd_type display_degree , - int mads_runs , - int overall_bbe , - NOMAD::Multi_Obj_Evaluator & ev , - int & stagnation_cnt , - NOMAD::Stats & multi_stats , - bool & stop , - NOMAD::stop_type & stop_reason ) +void NOMAD::Mads::multi_launch_single_opt ( NOMAD::dd_type display_degree , + int mads_runs , + int overall_bbe , + NOMAD::Multi_Obj_Evaluator & ev , + int & stagnation_cnt , + NOMAD::Stats & multi_stats , + bool & stop , + NOMAD::stop_type & stop_reason ) { - // max number of bb evaluations for one MADS run: - int max_bbe = _p.get_max_bb_eval(); - - // size of the Pareto front before the MADS run: - int tmp = _pareto_front->size(); - - // current MADS run: - int cur_mads_run = multi_stats.get_mads_runs(); - - // displays: - const NOMAD::Display & out = _p.out(); - - if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) - { - out << "MADS run " << std::setw(2) << cur_mads_run + 1; - if ( mads_runs > 0 ) - out << "/" << mads_runs; - out << " ..."; - } - - // run single-objective MADS (it also updates the Pareto front): - NOMAD::Mads::set_flag_check_bimads ( false ); - NOMAD::stop_type single_run_stop_reason = run(); - NOMAD::Mads::set_flag_check_bimads ( true ); - - if ( single_run_stop_reason == NOMAD::CTRL_C || - single_run_stop_reason == NOMAD::ERROR || - single_run_stop_reason == NOMAD::UNKNOWN_STOP_REASON || - single_run_stop_reason == NOMAD::X0_FAIL || - single_run_stop_reason == NOMAD::F_TARGET_REACHED || - single_run_stop_reason == NOMAD::P1_FAIL ) - { - stop = true; - stop_reason = single_run_stop_reason; - } - - // update MULTI-MADS stats from MADS stats: - multi_stats.update ( _stats , false ); // for_search = false - multi_stats.add_mads_run(); - - int nb_new_pts = _pareto_front->size() - tmp; - int global_bbe = multi_stats.get_bb_eval(); - - // displays: - if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) - { - - // display basic stats on the terminated run: - out << "... OK [bb eval=" << std::setw(3) << _stats.get_bb_eval() - << "] [overall bb eval=" << std::setw(5) << global_bbe - << "] [# dominant pts=" << std::setw(4) << _pareto_front->size() - << "] [# new pts=" << std::setw(4) << nb_new_pts << "]"; - - // display f1, f2, and f: - const NOMAD::Eval_Point * bf = get_best_feasible(); - if ( bf ) - { - - const NOMAD::Point & bbo = bf->get_bb_outputs(); - - out << " [f1=" << bbo[ev.get_i1()] - << " f2=" << bbo[ev.get_i2()]; - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << " f=" << bf->get_f(); - out << "]"; - } - out << std::endl; - } - - if ( _stats.get_bb_eval() == 0 && nb_new_pts == 0 ) - ++stagnation_cnt; - else - stagnation_cnt = 0; - - // stop ? - if ( !stop ) - { - - // test the number of MADS runs: - if ( mads_runs > 0 ) - { - if ( multi_stats.get_mads_runs() >= mads_runs ) - { - stop = true; - stop_reason = NOMAD::MULTI_NB_MADS_RUNS_REACHED; - } - } - - // test if no new Pareto point has been generated for 50*n MADS runs: - else - { - if ( stagnation_cnt > 50 * _p.get_nb_free_variables() ) - { - stop = true; - stop_reason = NOMAD::MULTI_STAGNATION; - } - } - } - - if ( overall_bbe >= 0 && global_bbe >= overall_bbe ) - { - stop = true; - stop_reason = NOMAD::MULTI_MAX_BB_REACHED; - } - - bool user_calls_enabled = _p.get_user_calls_enabled(); - - if ( !stop ) - { - - // ell is the mesh index on which the last run terminated: - // int ell = NOMAD::Mesh::get_mesh_index(); - - // reset MADS: - reset(); - - // this strategy deciding the initial mesh size - // was used with versions < 3.4 - // if ( cur_mads_run > 1 ) - // _p.set_INITIAL_MESH_INDEX ( (ell > 5) ? 5 : ell ); - - // modify MAX_BB_EVAL for single runs (in order to have - // less than overall_bbe blackbox evaluations): - if ( overall_bbe >= 0 && global_bbe + max_bbe > overall_bbe ) - _p.set_MAX_BB_EVAL ( overall_bbe - global_bbe ); - } - - // set the number of MADS runs for the general Stats object: - _stats.set_mads_runs ( multi_stats.get_mads_runs() ); - - // call the user-defined function Multi_Obj_Evaluator::update_mads_run(): - if ( user_calls_enabled ) - ev.update_mads_run ( _stats , - _ev_control , - _true_barrier , - _sgte_barrier , - *_pareto_front ); + // max number of bb evaluations for one MADS run: + int max_bbe = _p.get_max_bb_eval(); + + // size of the Pareto front before the MADS run: + int tmp = _pareto_front->size(); + + // current MADS run: + int cur_mads_run = multi_stats.get_mads_runs(); + + // displays: + const NOMAD::Display & out = _p.out(); + + if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) + { + out << "MADS run " << std::setw(2) << cur_mads_run + 1; + if ( mads_runs > 0 ) + out << "/" << mads_runs; + out << " ..."; + } + + // run single-objective MADS (it also updates the Pareto front): + NOMAD::Mads::set_flag_check_bimads ( false ); + NOMAD::stop_type single_run_stop_reason = run(); + NOMAD::Mads::set_flag_check_bimads ( true ); + + if ( single_run_stop_reason == NOMAD::CTRL_C || + single_run_stop_reason == NOMAD::ERROR || + single_run_stop_reason == NOMAD::UNKNOWN_STOP_REASON || + single_run_stop_reason == NOMAD::X0_FAIL || + single_run_stop_reason == NOMAD::F_TARGET_REACHED || + single_run_stop_reason == NOMAD::P1_FAIL ) + { + stop = true; + stop_reason = single_run_stop_reason; + } + + // update MULTI-MADS stats from MADS stats: + multi_stats.update ( _stats , false ); // for_search = false + multi_stats.add_mads_run(); + + int nb_new_pts = _pareto_front->size() - tmp; + int global_bbe = multi_stats.get_bb_eval(); + + // displays: + if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) + { + + // display basic stats on the terminated run: + out << "... OK [bb eval=" << std::setw(3) << _stats.get_bb_eval() + << "] [overall bb eval=" << std::setw(5) << global_bbe + << "] [# dominant pts=" << std::setw(4) << _pareto_front->size() + << "] [# new pts=" << std::setw(4) << nb_new_pts << "]"; + + // display f1, f2, and f: + const NOMAD::Eval_Point * bf = get_best_feasible(); + if ( bf ) + { + + const NOMAD::Point & bbo = bf->get_bb_outputs(); + + out << " [f1=" << bbo[ev.get_i1()] + << " f2=" << bbo[ev.get_i2()]; + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << " f=" << bf->get_f(); + out << "]"; + } + out << std::endl; + } + + if ( _stats.get_bb_eval() == 0 && nb_new_pts == 0 ) + ++stagnation_cnt; + else + stagnation_cnt = 0; + + // stop ? + if ( !stop ) + { + + // test the number of MADS runs: + if ( mads_runs > 0 ) + { + if ( multi_stats.get_mads_runs() >= mads_runs ) + { + stop = true; + stop_reason = NOMAD::MULTI_NB_MADS_RUNS_REACHED; + } + } + + // test if no new Pareto point has been generated for 50*n MADS runs: + else + { + if ( stagnation_cnt > 50 * _p.get_nb_free_variables() ) + { + stop = true; + stop_reason = NOMAD::MULTI_STAGNATION; + } + } + } + + if ( overall_bbe >= 0 && global_bbe >= overall_bbe ) + { + stop = true; + stop_reason = NOMAD::MULTI_MAX_BB_REACHED; + } + + bool user_calls_enabled = _p.get_user_calls_enabled(); + + if ( !stop ) + { + + // ell is the mesh index on which the last run terminated: + // int ell = NOMAD::Mesh::get_mesh_index(); + + // reset MADS: + reset(); + + // this strategy deciding the initial mesh size + // was used with versions < 3.4 + // if ( cur_mads_run > 1 ) + // _p.set_INITIAL_MESH_INDEX ( (ell > 5) ? 5 : ell ); + + // modify MAX_BB_EVAL for single runs (in order to have + // less than overall_bbe blackbox evaluations): + if ( overall_bbe >= 0 && global_bbe + max_bbe > overall_bbe ) + _p.set_MAX_BB_EVAL ( overall_bbe - global_bbe ); + } + + // set the number of MADS runs for the general Stats object: + _stats.set_mads_runs ( multi_stats.get_mads_runs() ); + + // call the user-defined function Multi_Obj_Evaluator::update_mads_run(): + if ( user_calls_enabled ) + ev.update_mads_run ( _stats , + _ev_control , + _true_barrier , + _sgte_barrier , + *_pareto_front ); } /*--------------------------------------------------------------------------*/ @@ -753,33 +728,34 @@ void NOMAD::Mads::multi_launch_single_opt /* (private) */ /*--------------------------------------------------------------------------*/ void NOMAD::Mads::multi_set_min_poll_size ( const NOMAD::Point & lb , - const NOMAD::Point & ub , - const NOMAD::Point & Delta_0 , - NOMAD::Double delta_j ) + const NOMAD::Point & ub , + const NOMAD::Point & Delta_0 , + NOMAD::Double delta_j ) { - delta_j /= sqrt ( _mesh->get_update_basis() ); - - int n = Delta_0.size(); - NOMAD::Point Delta_min (n); - - for ( int i = 0 ; i < n ; ++i ) - { - - // set a relative value: - if ( lb[i].is_defined() && ub[i].is_defined() ) - Delta_min[i] = delta_j * ( ub[i] - lb[i] ); - - // set an absolute value: - else - Delta_min[i] = delta_j; - - // compare to Delta_0: - if ( Delta_min[i] > Delta_0[i] ) - Delta_min[i] = Delta_0[i]; - } - - _p.set_MIN_POLL_SIZE ( Delta_min ); + + delta_j /= sqrt ( _mesh->get_update_basis() ); + + int n = Delta_0.size(); + NOMAD::Point Delta_min (n); + + for ( int i = 0 ; i < n ; ++i ) + { + + // set a relative value: + if ( lb[i].is_defined() && ub[i].is_defined() ) + Delta_min[i] = delta_j * ( ub[i] - lb[i] ); + + // set an absolute value: + else + Delta_min[i] = delta_j; + + // compare to Delta_0: + if ( Delta_min[i] > Delta_0[i] ) + Delta_min[i] = Delta_0[i]; + } + + _p.set_MIN_POLL_SIZE ( Delta_min ); } /*---------------------------------------------------------*/ @@ -787,1066 +763,1072 @@ void NOMAD::Mads::multi_set_min_poll_size ( const NOMAD::Point & lb , /*---------------------------------------------------------*/ NOMAD::stop_type NOMAD::Mads::multi_run ( void ) { - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_gen_dd(); - NOMAD::stop_type stop_reason = NOMAD::UNKNOWN_STOP_REASON; - - // init the slaves: + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_gen_dd(); + NOMAD::stop_type stop_reason = NOMAD::UNKNOWN_STOP_REASON; + + // init the slaves: #ifdef USE_MPI - - if ( NOMAD::Slave::get_nb_processes() < 2 ) - { - out << NOMAD::open_block("ERROR:") << "Incorrect command to run with MPI." << std::endl - << "Usage: mpirun -np p exeName" << std::endl ; - out << NOMAD::close_block(); - return stop_reason; - } - - bool stop_slaves_here = false; - - if ( NOMAD::Slave::is_master() ) - { - if ( !NOMAD::Slave::are_running() ) - { - NOMAD::Slave::init_slaves ( out ); - stop_slaves_here = true; - } - } - else - { - NOMAD::Slave s ( _p , _ev_control.get_evaluator() ); - s.run(); - return stop_reason; - } - + + if ( NOMAD::Slave::get_nb_processes() < 2 ) + { + out << NOMAD::open_block("ERROR:") << "Incorrect command to run with MPI." << std::endl + << "Usage: mpirun -np p exeName" << std::endl ; + out << NOMAD::close_block(); + return stop_reason; + } + + bool stop_slaves_here = false; + + if ( NOMAD::Slave::is_master() ) + { + if ( !NOMAD::Slave::are_running() ) + { + NOMAD::Slave::init_slaves ( out ); + stop_slaves_here = true; + } + } + else + { + NOMAD::Slave s ( _p , _ev_control.get_evaluator() ); + s.run(); + return stop_reason; + } + #endif - - try { - - // objective indexes: - NOMAD::Multi_Obj_Evaluator::set_obj_indexes ( _p.get_index_obj() ); - - // bounds: - const NOMAD::Point & lb = _p.get_lb(); - const NOMAD::Point & ub = _p.get_ub(); - - // MULTI-MADS stopping criteria: - int mads_runs = _p.get_multi_nb_mads_runs(); // max number of MADS runs - int overall_bbe = _p.get_multi_overall_bb_eval(); // max number of total bb eval. - bool use_delta_crit = _p.get_multi_use_delta_crit(); // use the delta term. crit. - int stagnation_cnt = 0; - - if ( mads_runs == 0 ) - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , - "Mads::multi_run(): parameter MULTI_NB_MADS_RUNS is not positive" ); - - if ( _p.get_nb_obj() != 2 ) - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , - "Mads::multi_run(): NOMAD current version handles a maximum of two objectives" ); - - // remember cache save period: - int old_csp = _p.get_cache_save_period(); - - // remember L_CURVE_TARGET: - NOMAD::Double old_lct = _p.get_L_curve_target(); - - // remember solution file: - std::string old_sol_file = _p.get_solution_file(); - - // remember the original LH search parameters: - int lh_p0 = _p.get_LH_search_p0(); - int lh_pi = _p.get_LH_search_pi(); - - // remember the original minimal poll size: - const NOMAD::Point original_min_poll_size = _p.get_min_poll_size(); - - // remember display degrees: - NOMAD::dd_type iter_dd = out.get_iter_dd(); - std::string old_dd; - out.get_display_degree ( old_dd ); - - // save list of starting points: - std::string x0_cache_file = _p.get_x0_cache_file(); - std::vector<NOMAD::Point *> x0s; - { - const std::vector<NOMAD::Point *> & x0s_tmp = _p.get_x0s(); - size_t nx0 = x0s_tmp.size() , k; - for ( k = 0 ; k < nx0 ; ++k ) - x0s.push_back ( new Point ( *x0s_tmp[k] ) ); - } - - NOMAD::Point Delta_0 = _mesh->get_initial_poll_size (); - - - if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) - out << std::endl << NOMAD::open_block ( "multi-MADS run" ) << std::endl; - - bool stop = false; - stop_reason = NOMAD::NO_STOP; - - // MULTI-MADS stats: - NOMAD::Stats multi_stats ( _stats ); - - // access to the evaluator (downcast to a Multi_Obj_Evaluator): - NOMAD::Multi_Obj_Evaluator * ev = - static_cast<NOMAD::Multi_Obj_Evaluator*> ( _ev_control.get_evaluator() ); - if ( !ev->is_multi_obj() ) - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , - "Mads::multi_run(): associated Evaluator object is not a Multi_Obj_Evaluator" ); - - // parameters modifications: - // ------------------------- - - // STATS_FILE: - const std::string old_stats_file_name = _p.get_stats_file_name(); - const std::list<std::string> old_stats_file = _p.get_stats_file(); - _p.reset_stats_file(); - - // MAX_BB_EVAL: - int max_bbe = _p.get_max_bb_eval(); - if ( overall_bbe >= 0 && ( max_bbe < 0 || overall_bbe < max_bbe ) ) - _p.set_MAX_BB_EVAL ( overall_bbe ); - - // disable display: - _p.set_DISPLAY_DEGREE ( NOMAD::NO_DISPLAY ); - - // disable solution file: - _p.set_SOLUTION_FILE ( "" ); - - // disable CACHE_SAVE_PERIOD: - _p.set_CACHE_SAVE_PERIOD ( -1 ); - - // disable L_CURVE_TARGET: - _p.set_L_CURVE_TARGET ( NOMAD::Double() ); - - // LH_SEARCH and MAX_BB_EVAL adjustment: - if ( lh_p0 > 0 ) - { - _p.set_LH_SEARCH ( lh_p0 , 0 ); - if ( max_bbe >= 0 ) - { - int bbe = max_bbe + lh_p0; - if ( overall_bbe >= 0 && bbe > overall_bbe ) - bbe = overall_bbe; - _p.set_MAX_BB_EVAL ( bbe ); - } - } - - // parameters validation: - _p.check ( true , // remove_history_file = true - true , // remove_solution_file = true - true ); // remove_stats_file = true - - // Pareto front initialization: - delete _pareto_front; - _pareto_front = new NOMAD::Pareto_Front; + + try { - // Problem has categorical variables ? (Si why this flag is needed below) - bool hasCategoricalVar=_p.get_signature()->has_categorical(); - - // initial optimizations ( minimize f1(x) or f2(x) ): - // -------------------------------------------------- - const NOMAD::Eval_Point * best_f2; - int i; - - for ( i = 0 ; i < 2 ; ++i ) - { - - if ( stop ) - break; - - // minimize f2: - if ( i == 1 ) - { - - // new starting point: - best_f2 = _pareto_front->get_best_f2(); - if ( best_f2 ) - { - _p.set_EXTERN_SIGNATURE ( best_f2->get_signature() ); - _p.reset_X0(); - _p.set_X0 ( *best_f2 ); - } - - // LH_SEARCH: - if ( lh_pi > 0 ) - _p.set_LH_SEARCH ( lh_pi , 0 ); - else if ( lh_p0 > 0 ) - _p.set_LH_SEARCH ( 0 , 0 ); - - // MAX_BB_EVAL: - if ( max_bbe >= 0 ) - { - int bbe = max_bbe + ( (lh_pi > 0 ) ? lh_pi : 0 ); - if ( overall_bbe >= 0 ) - { - if ( bbe > overall_bbe ) - bbe = overall_bbe; - int global_bbe = multi_stats.get_bb_eval(); - if ( global_bbe + bbe > overall_bbe ) - bbe = overall_bbe - global_bbe; - } - _p.set_MAX_BB_EVAL ( bbe ); - } - - if ( _p.to_be_checked() ) - _p.check ( false , // remove_history_file = false - true , // remove_solution_file = true - true ); // remove_stats_file = true - - _mesh=_p.get_signature()->get_mesh(); - - } - - // set weights/reference: - ev->set_weights ( 1-i , i ); - ev->set_ref ( NULL ); - - // launch the single optimization: - multi_launch_single_opt ( iter_dd , - mads_runs , - overall_bbe , - *ev , - stagnation_cnt , - multi_stats , - stop , - stop_reason ); - } - - const NOMAD::Point * ref; - const NOMAD::Pareto_Point * xj; - NOMAD::Double delta_j; - - // the LH search is disabled: - _p.set_LH_SEARCH ( 0 , 0 ); - - // MAX_BB_EVAL reset: - if ( max_bbe > 0 && ( lh_p0 > 0 || lh_pi > 0 ) ) - { - int bbe = max_bbe; - if ( overall_bbe >= 0 ) - { - if ( bbe > overall_bbe ) - bbe = overall_bbe; - - int global_bbe = multi_stats.get_bb_eval(); - if ( global_bbe + bbe > overall_bbe ) - bbe = overall_bbe - global_bbe; - } - _p.set_MAX_BB_EVAL ( bbe ); - } - - // MULTI-MADS main loop: - // --------------------- - const NOMAD::Eval_Point * x0_tmp; - - while ( !stop ) - { - - // get the reference point from the Pareto front: - ref = _pareto_front->get_ref ( xj , delta_j ); - - if ( !xj ) - { - stop = true; - stop_reason = NOMAD::MULTI_NO_PARETO_PTS; - break; - } - - // use delta as stopping criterion: - if ( use_delta_crit ) - { - if ( delta_j.is_defined() && delta_j > 0.0 ) - multi_set_min_poll_size ( lb , ub , Delta_0 , delta_j ); - else - _p.set_MIN_POLL_SIZE ( original_min_poll_size ); - } - - // new starting point: - x0_tmp = xj->get_element(); - _p.set_EXTERN_SIGNATURE ( x0_tmp->get_signature() ); - _p.reset_X0(); - _p.set_X0 ( *x0_tmp ); - - _p.check ( false , // remove_history_file = false - true , // remove_solution_file = true - true ); // remove_stats_file = true - - // a reference point has been found: optimization - // with reference-based function: - if ( ref ) - { - - // set reference: - ev->set_ref ( ref ); - - // launch the single optimization: - multi_launch_single_opt ( iter_dd , - mads_runs , - overall_bbe , - *ev , - stagnation_cnt , - multi_stats , - stop , - stop_reason ); - - delete ref; - ev->set_ref ( NULL ); - } - - // no reference available: two optimizations ( f1(x) and f2(x) ): - else - { - - // for the stagnation check: - const NOMAD::Eval_Point * pp_before; - int stagnation_cnt_before , overall_bbe_before; - bool check_1 = false; - - // loop on f1 and f2: - for ( i = 0 ; i < 2 ; ++i ) - { - - if ( stop ) - break; - - // minimize f2: - if ( i == 1 ) - { - - // new starting point: - best_f2 = _pareto_front->get_best_f2(); - if ( best_f2 ) - { - _p.set_EXTERN_SIGNATURE ( best_f2->get_signature() ); - _p.reset_X0(); - _p.set_X0 ( *best_f2 ); - } - else - _p.set_X0 ( *x0_tmp ); - - _p.check ( false , // remove_history_file = false - true , // remove_solution_file = true - true ); // remove_stats_file = true - } - - // set weights/reference: - ev->set_weights ( 1-i , i ); - ev->set_ref ( NULL ); - - stagnation_cnt_before = stagnation_cnt; - overall_bbe_before = overall_bbe; - pp_before = ( _pareto_front->size() == 1 ) ? - _pareto_front->begin() : NULL; - - // launch the single optimization: - multi_launch_single_opt ( iter_dd , - mads_runs , - overall_bbe , - *ev , - stagnation_cnt , - multi_stats , - stop , - stop_reason ); - - // stagnation check: - if ( stagnation_cnt > stagnation_cnt_before && - overall_bbe == overall_bbe_before && - _pareto_front->size() == 1 && - _pareto_front->begin() == pp_before ) - { - - if ( i == 0 ) - check_1 = true; - else if ( check_1 ) - { - stop = true; - stop_reason = NOMAD::MULTI_STAGNATION; - } - } - } - } - - } // end of MULTI-MADS main loop - // --------------------------- - + // objective indexes: + NOMAD::Multi_Obj_Evaluator::set_obj_indexes ( _p.get_index_obj() ); - // parameters re-initialization and final displays: - if ( ! hasCategoricalVar ) // Dimension may change when categorical variables are present. This may pose problem for the check. Hence we add a test -> when categorical variables are present, the parameters are not set back to their initial state at the end of the multi-objective optimization. - { - _p.reset_X0(); - size_t nx0 = x0s.size(); - if ( nx0 > 0 ) - { - for ( size_t k = 0 ; k < nx0 ; ++k ) - { - _p.set_X0 ( *x0s[k] ); - delete x0s[k]; - } - } - else if ( !x0_cache_file.empty() ) - _p.set_X0 ( x0_cache_file ); + // bounds: + const NOMAD::Point & lb = _p.get_lb(); + const NOMAD::Point & ub = _p.get_ub(); + + // MULTI-MADS stopping criteria: + int mads_runs = _p.get_multi_nb_mads_runs(); // max number of MADS runs + int overall_bbe = _p.get_multi_overall_bb_eval(); // max number of total bb eval. + bool use_delta_crit = _p.get_multi_use_delta_crit(); // use the delta term. crit. + int stagnation_cnt = 0; + + if ( mads_runs == 0 ) + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , + "Mads::multi_run(): parameter MULTI_NB_MADS_RUNS is not positive" ); + + if ( _p.get_nb_obj() != 2 ) + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , + "Mads::multi_run(): NOMAD current version handles a maximum of two objectives" ); + + // remember cache save period: + int old_csp = _p.get_cache_save_period(); + + // remember L_CURVE_TARGET: + NOMAD::Double old_lct = _p.get_L_curve_target(); + + // remember solution file: + std::string old_sol_file = _p.get_solution_file(); + + // remember the original LH search parameters: + int lh_p0 = _p.get_LH_search_p0(); + int lh_pi = _p.get_LH_search_pi(); + + // remember the original minimal poll size: + const NOMAD::Point original_min_poll_size = _p.get_min_poll_size(); + + // remember display degrees: + NOMAD::dd_type iter_dd = out.get_iter_dd(); + std::string old_dd; + out.get_display_degree ( old_dd ); + + // save list of starting points: + std::string x0_cache_file = _p.get_x0_cache_file(); + std::vector<NOMAD::Point *> x0s; + { + const std::vector<NOMAD::Point *> & x0s_tmp = _p.get_x0s(); + size_t nx0 = x0s_tmp.size() , k; + for ( k = 0 ; k < nx0 ; ++k ) + x0s.push_back ( new Point ( *x0s_tmp[k] ) ); + } + + NOMAD::Point Delta_0 = _mesh->get_initial_poll_size (); + + + if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) + out << std::endl << NOMAD::open_block ( "multi-MADS run" ) << std::endl; + + bool stop = false; + stop_reason = NOMAD::NO_STOP; + + // MULTI-MADS stats: + NOMAD::Stats multi_stats ( _stats ); + + // access to the evaluator (downcast to a Multi_Obj_Evaluator): + NOMAD::Multi_Obj_Evaluator * ev = + static_cast<NOMAD::Multi_Obj_Evaluator*> ( _ev_control.get_evaluator() ); + if ( !ev->is_multi_obj() ) + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , + "Mads::multi_run(): associated Evaluator object is not a Multi_Obj_Evaluator" ); + + // parameters modifications: + // ------------------------- + + // STATS_FILE: + const std::string old_stats_file_name = _p.get_stats_file_name(); + const std::list<std::string> old_stats_file = _p.get_stats_file(); + _p.reset_stats_file(); + + // MAX_BB_EVAL: + int max_bbe = _p.get_max_bb_eval(); + if ( overall_bbe >= 0 && ( max_bbe < 0 || overall_bbe < max_bbe ) ) + _p.set_MAX_BB_EVAL ( overall_bbe ); + + // disable display: + _p.set_DISPLAY_DEGREE ( NOMAD::NO_DISPLAY ); + + // disable solution file: + _p.set_SOLUTION_FILE ( "" ); + + // disable CACHE_SAVE_PERIOD: + _p.set_CACHE_SAVE_PERIOD ( -1 ); + + // disable L_CURVE_TARGET: + _p.set_L_CURVE_TARGET ( NOMAD::Double() ); + + // LH_SEARCH and MAX_BB_EVAL adjustment: + if ( lh_p0 > 0 ) + { + _p.set_LH_SEARCH ( lh_p0 , 0 ); + if ( max_bbe >= 0 ) + { + int bbe = max_bbe + lh_p0; + if ( overall_bbe >= 0 && bbe > overall_bbe ) + bbe = overall_bbe; + _p.set_MAX_BB_EVAL ( bbe ); + } + } + + // parameters validation: + _p.check ( true , // remove_history_file = true + true , // remove_solution_file = true + true ); // remove_stats_file = true + + // Pareto front initialization: + delete _pareto_front; + _pareto_front = new NOMAD::Pareto_Front; + + // Problem has categorical variables ? (Si why this flag is needed below) + bool hasCategoricalVar=_p.get_signature()->has_categorical(); + + // initial optimizations ( minimize f1(x) or f2(x) ): + // -------------------------------------------------- + const NOMAD::Eval_Point * best_f2; + int i; + + for ( i = 0 ; i < 2 ; ++i ) + { + + if ( stop ) + break; + + // minimize f2: + if ( i == 1 ) + { + + // new starting point: + best_f2 = _pareto_front->get_best_f2(); + if ( best_f2 ) + { + _p.set_EXTERN_SIGNATURE ( best_f2->get_signature() ); + _p.reset_X0(); + _p.set_X0 ( *best_f2 ); + } + + // LH_SEARCH: + if ( lh_pi > 0 ) + _p.set_LH_SEARCH ( lh_pi , 0 ); + else if ( lh_p0 > 0 ) + _p.set_LH_SEARCH ( 0 , 0 ); + + // MAX_BB_EVAL: + if ( max_bbe >= 0 ) + { + int bbe = max_bbe + ( (lh_pi > 0 ) ? lh_pi : 0 ); + if ( overall_bbe >= 0 ) + { + if ( bbe > overall_bbe ) + bbe = overall_bbe; + int global_bbe = multi_stats.get_bb_eval(); + if ( global_bbe + bbe > overall_bbe ) + bbe = overall_bbe - global_bbe; + } + _p.set_MAX_BB_EVAL ( bbe ); + } + + if ( _p.to_be_checked() ) + _p.check ( false , // remove_history_file = false + true , // remove_solution_file = true + true ); // remove_stats_file = true + + _mesh=_p.get_signature()->get_mesh(); + + } + + // set weights/reference: + ev->set_weights ( 1-i , i ); + ev->set_ref ( NULL ); + + // launch the single optimization: + multi_launch_single_opt ( iter_dd , + mads_runs , + overall_bbe , + *ev , + stagnation_cnt , + multi_stats , + stop , + stop_reason ); + } + + const NOMAD::Point * ref; + const NOMAD::Pareto_Point * xj; + NOMAD::Double delta_j; + + // the LH search is disabled: + _p.set_LH_SEARCH ( 0 , 0 ); + + // MAX_BB_EVAL reset: + if ( max_bbe > 0 && ( lh_p0 > 0 || lh_pi > 0 ) ) + { + int bbe = max_bbe; + if ( overall_bbe >= 0 ) + { + if ( bbe > overall_bbe ) + bbe = overall_bbe; + + int global_bbe = multi_stats.get_bb_eval(); + if ( global_bbe + bbe > overall_bbe ) + bbe = overall_bbe - global_bbe; + } + _p.set_MAX_BB_EVAL ( bbe ); + } + + // MULTI-MADS main loop: + // --------------------- + const NOMAD::Eval_Point * x0_tmp; + + while ( !stop ) + { + + // get the reference point from the Pareto front: + ref = _pareto_front->get_ref ( xj , delta_j ); + + if ( !xj ) + { + stop = true; + stop_reason = NOMAD::MULTI_NO_PARETO_PTS; + break; + } + + // use delta as stopping criterion: + if ( use_delta_crit ) + { + if ( delta_j.is_defined() && delta_j > 0.0 ) + multi_set_min_poll_size ( lb , ub , Delta_0 , delta_j ); + else + _p.set_MIN_POLL_SIZE ( original_min_poll_size ); + } + + // new starting point: + x0_tmp = xj->get_element(); + _p.set_EXTERN_SIGNATURE ( x0_tmp->get_signature() ); + _p.reset_X0(); + _p.set_X0 ( *x0_tmp ); + + _p.check ( false , // remove_history_file = false + true , // remove_solution_file = true + true ); // remove_stats_file = true + + // a reference point has been found: optimization + // with reference-based function: + if ( ref ) + { + + // set reference: + ev->set_ref ( ref ); + + // launch the single optimization: + multi_launch_single_opt ( iter_dd , + mads_runs , + overall_bbe , + *ev , + stagnation_cnt , + multi_stats , + stop , + stop_reason ); + + delete ref; + ev->set_ref ( NULL ); + } + + // no reference available: two optimizations ( f1(x) and f2(x) ): + else + { + + // for the stagnation check: + const NOMAD::Eval_Point * pp_before; + int stagnation_cnt_before , overall_bbe_before; + bool check_1 = false; + + // loop on f1 and f2: + for ( i = 0 ; i < 2 ; ++i ) + { + + if ( stop ) + break; + + // minimize f2: + if ( i == 1 ) + { + + // new starting point: + best_f2 = _pareto_front->get_best_f2(); + if ( best_f2 ) + { + _p.set_EXTERN_SIGNATURE ( best_f2->get_signature() ); + _p.reset_X0(); + _p.set_X0 ( *best_f2 ); + } + else + _p.set_X0 ( *x0_tmp ); + + _p.check ( false , // remove_history_file = false + true , // remove_solution_file = true + true ); // remove_stats_file = true + } + + // set weights/reference: + ev->set_weights ( 1-i , i ); + ev->set_ref ( NULL ); + + stagnation_cnt_before = stagnation_cnt; + overall_bbe_before = overall_bbe; + pp_before = ( _pareto_front->size() == 1 ) ? + _pareto_front->begin() : NULL; + + // launch the single optimization: + multi_launch_single_opt ( iter_dd , + mads_runs , + overall_bbe , + *ev , + stagnation_cnt , + multi_stats , + stop , + stop_reason ); + + // stagnation check: + if ( stagnation_cnt > stagnation_cnt_before && + overall_bbe == overall_bbe_before && + _pareto_front->size() == 1 && + _pareto_front->begin() == pp_before ) + { + + if ( i == 0 ) + check_1 = true; + else if ( check_1 ) + { + stop = true; + stop_reason = NOMAD::MULTI_STAGNATION; + } + } + } + } + + } // end of MULTI-MADS main loop + // --------------------------- + + + // parameters re-initialization and final displays: + if ( ! hasCategoricalVar ) // Dimension may change when categorical variables are present. This may pose problem for the check. Hence we add a test -> when categorical variables are present, the parameters are not set back to their initial state at the end of the multi-objective optimization. + { + _p.reset_X0(); + size_t nx0 = x0s.size(); + if ( nx0 > 0 ) + { + for ( size_t k = 0 ; k < nx0 ; ++k ) + { + _p.set_X0 ( *x0s[k] ); + delete x0s[k]; + } + } + else if ( !x0_cache_file.empty() ) + _p.set_X0 ( x0_cache_file ); if ( use_delta_crit ) _p.set_MIN_POLL_SIZE ( original_min_poll_size ); - - } - _p.set_MAX_BB_EVAL ( max_bbe ); - _p.set_DISPLAY_DEGREE ( old_dd ); - _p.set_STATS_FILE ( old_stats_file_name , old_stats_file ); - _p.set_SOLUTION_FILE ( old_sol_file ); - _p.set_LH_SEARCH ( lh_p0 , lh_pi ); - _p.set_CACHE_SAVE_PERIOD ( old_csp ); - _p.set_L_CURVE_TARGET ( old_lct ); - - - _p.check ( false , // remove_history_file = false - true , // remove_solution_file = true - true ); // remove_stats_file = true - - // reset MADS stats from MULTI-MADS stats: - _stats = multi_stats; - - // final cache save (overwrite=true): - _ev_control.save_caches ( true ); - + + } + _p.set_MAX_BB_EVAL ( max_bbe ); + _p.set_DISPLAY_DEGREE ( old_dd ); + _p.set_STATS_FILE ( old_stats_file_name , old_stats_file ); + _p.set_SOLUTION_FILE ( old_sol_file ); + _p.set_LH_SEARCH ( lh_p0 , lh_pi ); + _p.set_CACHE_SAVE_PERIOD ( old_csp ); + _p.set_L_CURVE_TARGET ( old_lct ); + + + _p.check ( false , // remove_history_file = false + true , // remove_solution_file = true + true ); // remove_stats_file = true + + // reset MADS stats from MULTI-MADS stats: + _stats = multi_stats; + + // final cache save (overwrite=true): + _ev_control.save_caches ( true ); + #ifndef R_VERSION - if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) - { - std::ostringstream msg; - msg << "end of run (" << stop_reason << ")"; - out << std::endl << NOMAD::close_block ( msg.str() ) << std::endl; - } + if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) + { + std::ostringstream msg; + msg << "end of run (" << stop_reason << ")"; + out << std::endl << NOMAD::close_block ( msg.str() ) << std::endl; + } #endif - // multi-objective final displays: - if ( _p.get_nb_obj() > 1 ) - { - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out.open_block ( "NOMAD final display" ); - - display(); - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out.close_block(); - } - - } // end of the try block - - catch ( std::exception & e ) + // multi-objective final displays: + if ( _p.get_nb_obj() > 1 ) + { + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out.open_block ( "NOMAD final display" ); + + display(); + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out.close_block(); + } + + } // end of the try block + + catch ( std::exception & e ) { #ifdef USE_MPI - if ( NOMAD::Slave::are_running() ) - NOMAD::Slave::stop_slaves ( out ); + if ( NOMAD::Slave::are_running() ) + NOMAD::Slave::stop_slaves ( out ); #endif - - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , e.what() ); - } - - // stop the slaves: + + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , e.what() ); + } + + // stop the slaves: #ifdef USE_MPI - if ( NOMAD::Slave::are_running() && stop_slaves_here ) - NOMAD::Slave::stop_slaves ( out ); + if ( NOMAD::Slave::are_running() && stop_slaves_here ) + NOMAD::Slave::stop_slaves ( out ); #endif - - return stop_reason; + + return stop_reason; } /*---------------------------------------------------------*/ /* one MADS iteration (private) */ /*---------------------------------------------------------*/ void NOMAD::Mads::iteration ( bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc ) + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc ) { - - bool forbid_poll_size_stop = false; - - // force quit (by pressing ctrl-c): - if ( !stop && NOMAD::Mads::_force_quit ) - { - stop = true; - stop_reason = NOMAD::CTRL_C; - return; - } - - // poll center selection: - ( ( _p.get_opt_only_sgte() ) ? - _sgte_barrier : _true_barrier ).select_poll_center ( success ); - - // displays: - const NOMAD::Display & out = _p.out(); - if ( out.get_iter_dd() == NOMAD::FULL_DISPLAY ) - out << std::endl - << NOMAD::open_block ( "MADS iteration " - + NOMAD::itos ( _stats.get_iterations() ) ) - << std::endl; - display_iteration_begin(); - - // SEARCH: - // ------- - search ( stop , stop_reason , success , new_feas_inc , new_infeas_inc ); - - // POLL: - // ----- - if ( success != NOMAD::FULL_SUCCESS ) - poll ( stop , - stop_reason , - success , - new_feas_inc , - new_infeas_inc , - forbid_poll_size_stop ); - - // UPDATES: - // -------- - - NOMAD::Point old_r=_mesh->get_mesh_indices(); - - if ( !stop ) - { - // OrthogonalMesh update using success status and direction of success (when present) - if ( new_feas_inc ) + + bool forbid_poll_size_stop = false; + + // force quit (by pressing ctrl-c): + if ( !stop && NOMAD::Mads::_force_quit ) + { + stop = true; + stop_reason = NOMAD::CTRL_C; + return; + } + + // poll center selection: + ( ( _p.get_opt_only_sgte() ) ? + _sgte_barrier : _true_barrier ).select_poll_center ( success ); + + // displays: + const NOMAD::Display & out = _p.out(); + if ( out.get_iter_dd() == NOMAD::FULL_DISPLAY ) + out << std::endl + << NOMAD::open_block ( "MADS iteration " + + NOMAD::itos ( _stats.get_iterations() ) ) + << std::endl; + display_iteration_begin(); + + // SEARCH: + // ------- + search ( stop , stop_reason , success , new_feas_inc , new_infeas_inc ); + + // POLL: + // ----- + if ( success != NOMAD::FULL_SUCCESS ) + poll ( stop , + stop_reason , + success , + new_feas_inc , + new_infeas_inc , + forbid_poll_size_stop ); + + // UPDATES: + // -------- + + NOMAD::Point old_r=_mesh->get_mesh_indices(); + + if ( !stop ) + { + + // OrthogonalMesh update using success status and direction of success (when present) + if ( new_feas_inc ) { _mesh=new_feas_inc->get_signature()->get_mesh(); - _mesh->update ( success, new_feas_inc->get_direction() ); + _mesh->update ( success, new_feas_inc->get_direction() ); } - else if ( new_infeas_inc ) + else if ( new_infeas_inc ) { _mesh=new_infeas_inc->get_signature()->get_mesh(); - _mesh->update ( success, new_infeas_inc->get_direction()); - } - else - _mesh->update ( success ); - - - _mesh->check_min_mesh_sizes( stop , stop_reason ); - - // if the Delta_k^p stopping criterion is met with integer variables, - // the last set of directions must have a minimal coordinate of 1; - // otherwise the stopping criterion is disabled at this iteration: - if ( forbid_poll_size_stop && stop && stop_reason == NOMAD::DELTA_P_MIN_REACHED ) - { - stop = false; - stop_reason = NOMAD::NO_STOP; - } - - // display: - if ( _p.out().get_iter_dd() == NOMAD::FULL_DISPLAY ) - { - _p.out() << std::endl << NOMAD::open_block ( "Orthogonal mesh update" ) - << "previous mesh indices: ( " << old_r << " )" << std::endl - << "new mesh indices : ( " << _mesh->get_mesh_indices() << " )" << std::endl - << NOMAD::close_block() << std::endl; - } - - // periodic cache save (overwrite=false): - if ( _p.get_cache_save_period() > 0 && - _stats.get_iterations()%_p.get_cache_save_period() == - _p.get_cache_save_period() - 1 ) - _ev_control.save_caches ( false ); - } - - // number of iterations: - _stats.add_iteration(); - if ( !stop && - _p.get_max_iterations() > 0 && - _stats.get_iterations() >= _p.get_max_iterations() ) - { - stop = true; - stop_reason = NOMAD::MAX_ITER_REACHED; - } - - // max cache memory: - if ( !stop && - _p.get_max_cache_memory() > 0.0 && - _ev_control.get_cache().size_of() > 1048576*_p.get_max_cache_memory() ) - { - stop = true; - stop_reason = NOMAD::MAX_CACHE_MEMORY_REACHED; - } - - // L_CURVE_TARGET stopping criterion: - if ( _L_curve && !stop ) - { - int bbe = _stats.get_bb_eval(); - if ( success == NOMAD::FULL_SUCCESS ) - { - if ( new_feas_inc ) - _L_curve->insert ( bbe , new_feas_inc->get_f() ); - } - else if ( success == NOMAD::UNSUCCESSFUL && _L_curve->check_stop ( bbe ) ) - { - stop = true; - stop_reason = NOMAD::L_CURVE_TARGET_REACHED; - } - } - - // call the user-defined function Evaluator::update_iteration(): - if ( _p.get_user_calls_enabled() ) - { - bool stop_before = stop; + _mesh->update ( success, new_infeas_inc->get_direction()); + } + else + _mesh->update ( success ); + + // check the min mesh/poll sizes stopping criteria + _mesh->check_min_mesh_sizes( stop , stop_reason ); + + + // if the Delta_k^p stopping criterion is met with integer variables, + // the last set of directions must have a minimal coordinate of 1; + // otherwise the stopping criterion is disabled at this iteration: + if ( forbid_poll_size_stop && stop && stop_reason == NOMAD::DELTA_P_MIN_REACHED ) + { + stop = false; + stop_reason = NOMAD::NO_STOP; + } + + // display: + if ( _p.out().get_iter_dd() == NOMAD::FULL_DISPLAY ) + { + _p.out() << std::endl << NOMAD::open_block ( "OrthogonalMesh update" ) + << "previous mesh indices: ( " << old_r << " )" << std::endl + << "new mesh indices : ( " << _mesh->get_mesh_indices() << " )" << std::endl + << NOMAD::close_block() << std::endl; + } + + // periodic cache save (overwrite=false): + if ( _p.get_cache_save_period() > 0 && + _stats.get_iterations()%_p.get_cache_save_period() == + _p.get_cache_save_period() - 1 ) + _ev_control.save_caches ( false ); + } + + // number of iterations: + _stats.add_iteration(); + if ( !stop && + _p.get_max_iterations() > 0 && + _stats.get_iterations() >= _p.get_max_iterations() ) + { + stop = true; + stop_reason = NOMAD::MAX_ITER_REACHED; + } + + // max cache memory: + if ( !stop && + _p.get_max_cache_memory() > 0.0 && + _ev_control.get_cache().size_of() > 1048576*_p.get_max_cache_memory() ) + { + stop = true; + stop_reason = NOMAD::MAX_CACHE_MEMORY_REACHED; + } + + // L_CURVE_TARGET stopping criterion: + if ( _L_curve && !stop ) + { + int bbe = _stats.get_bb_eval(); + if ( success == NOMAD::FULL_SUCCESS ) + { + if ( new_feas_inc ) + _L_curve->insert ( bbe , new_feas_inc->get_f() ); + } + else if ( success == NOMAD::UNSUCCESSFUL && _L_curve->check_stop ( bbe ) ) + { + stop = true; + stop_reason = NOMAD::L_CURVE_TARGET_REACHED; + } + } + + // call the user-defined function Evaluator::update_iteration(): + if ( _p.get_user_calls_enabled() ) + { + bool stop_before = stop; NOMAD::Pareto_Front * pf = ( ( _pareto_front ) ? _pareto_front:(new NOMAD::Pareto_Front) ); - _ev_control.get_evaluator()->update_iteration ( success , - _stats , - _ev_control , - _true_barrier , - _sgte_barrier , + _ev_control.get_evaluator()->update_iteration ( success , + _stats , + _ev_control , + _true_barrier , + _sgte_barrier , *pf , - stop ); + stop ); if ( ! _pareto_front ) delete pf; - - if ( !stop_before && stop ) - stop_reason = NOMAD::USER_STOPPED; - } - - // if the algorithms stops, we set the mesh index to the value - // it had before the mesh update: - if ( stop ) - { - _mesh->set_mesh_indices( old_r ); - } - - // displays at the end of an iteration: - display_iteration_end ( stop , - stop_reason , - success , - new_feas_inc , - new_infeas_inc ); - - - - // displays: - if ( out.get_iter_dd() == NOMAD::FULL_DISPLAY ) - out << std::endl - << NOMAD::close_block ( "end of iteration " - + NOMAD::itos ( _stats.get_iterations()-1 ) ); + if ( !stop_before && stop ) + stop_reason = NOMAD::USER_STOPPED; + } + + // if the algorithms stops, we set the mesh index to the value + // it had before the mesh update: + if ( stop ) + _mesh->set_mesh_indices( old_r ); + + // displays at the end of an iteration: + display_iteration_end ( stop , + stop_reason , + success , + new_feas_inc , + new_infeas_inc ); + + + + // displays: + if ( out.get_iter_dd() == NOMAD::FULL_DISPLAY ) + out << std::endl + << NOMAD::close_block ( "end of iteration " + + NOMAD::itos ( _stats.get_iterations()-1 ) ); } /*---------------------------------------------------------*/ /* the poll (private) */ /*---------------------------------------------------------*/ void NOMAD::Mads::poll ( bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc , - bool & forbid_poll_size_stop ) + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc , + bool & forbid_poll_size_stop ) { - forbid_poll_size_stop = false; - - if ( stop ) - return; - - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_poll_dd(); - - success = NOMAD::UNSUCCESSFUL; - new_feas_inc = NULL; - new_infeas_inc = NULL; - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl << NOMAD::open_block ( "MADS poll" ) << std::endl; - - - const NOMAD::Eval_Point * x; - size_t offset = 0; - - std::vector<NOMAD::Signature *> signatures; - - const NOMAD::Barrier & barrier = get_active_barrier(); - std::list<NOMAD::Direction>::const_iterator it , end; - - - // poll centers: - const NOMAD::Eval_Point * poll_centers[2] , * poll_center; - poll_centers[0] = barrier.get_poll_center(); - poll_centers[1] = (_p.use_sec_poll_center()) ? + forbid_poll_size_stop = false; + + if ( stop ) + return; + + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_poll_dd(); + + success = NOMAD::UNSUCCESSFUL; + new_feas_inc = NULL; + new_infeas_inc = NULL; + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl << NOMAD::open_block ( "MADS poll" ) << std::endl; + + + const NOMAD::Eval_Point * x; + size_t offset = 0; + + std::vector<NOMAD::Signature *> signatures; + + const NOMAD::Barrier & barrier = get_active_barrier(); + std::list<NOMAD::Direction>::const_iterator it , end; + + + // poll centers: + const NOMAD::Eval_Point * poll_centers[2] , * poll_center; + poll_centers[0] = barrier.get_poll_center(); + poll_centers[1] = (_p.use_sec_poll_center()) ? barrier.get_sec_poll_center() : NULL; - - if ( !poll_centers[0] && !poll_centers[1] ) - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , - "Mads::poll(): could not get a poll center" ); - - - // Keep original directions + reduction in reducedPollDirs - std::list<NOMAD::Direction> *dirs=new std::list<NOMAD::Direction>[2]; - std::list<NOMAD::Direction> *reducedPollDirs=new std::list<NOMAD::Direction>[2]; - std::list<NOMAD::Direction>::iterator itDir; - - - // loop on the two poll centers for creation of evaluation point - // ----------------------------- - NOMAD::poll_type i_pc = NOMAD::PRIMARY; - poll_center = poll_centers[NOMAD::PRIMARY]; - - bool reducePollToNDir=false; - - while ( true ) - { - if ( poll_center ) - { - // add the poll center signature - signatures.push_back(poll_center->get_signature()); - - // Creation of the poll directions - set_poll_directions ( dirs[i_pc] , i_pc , offset , *poll_center , stop , stop_reason ); - - // Reduction is applied only to achieve ortho n+1 - reducePollToNDir=dirs_have_orthomads_np1(dirs[i_pc]); - - // creation of the poll trial points in the evaluator control: - if (reducePollToNDir) - { - - // Keep poll directions unchanged (store directions even those that will be snaped to bounds) - reducedPollDirs[i_pc].assign(dirs[i_pc].begin(),dirs[i_pc].end()); - - _ev_control_for_sorting.clear_eval_lop(); - - - // Sort the directions only if mesh is not finest - if ( ! _mesh->is_finest() ) - { - - // 1st sorting of points based on feas. or infeas. success direction. IMPORTANT removes out of bounds -> this justifies to proceede in two steps - set_poll_trial_points(dirs[i_pc],offset,*poll_center,stop,stop_reason,true); - if (stop) - { - delete[] dirs; - delete[] reducedPollDirs; - return; - } - + + if ( !poll_centers[0] && !poll_centers[1] ) + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , + "Mads::poll(): could not get a poll center" ); + + + // Keep original directions + reduction in reducedPollDirs + std::list<NOMAD::Direction> *dirs=new std::list<NOMAD::Direction>[2]; + std::list<NOMAD::Direction> *reducedPollDirs=new std::list<NOMAD::Direction>[2]; + std::list<NOMAD::Direction>::iterator itDir; + + + // loop on the two poll centers for creation of evaluation point + // ----------------------------- + NOMAD::poll_type i_pc = NOMAD::PRIMARY; + poll_center = poll_centers[NOMAD::PRIMARY]; + + bool reducePollToNDir=false; + + while ( true ) + { + if ( poll_center ) + { + // add the poll center signature + signatures.push_back(poll_center->get_signature()); + + // Creation of the poll directions + set_poll_directions ( dirs[i_pc] , i_pc , offset , *poll_center , stop , stop_reason ); + + // Reduction is applied only to achieve ortho n+1 + reducePollToNDir=dirs_have_orthomads_np1_dyn(dirs[i_pc]); + + // creation of the poll trial points in the evaluator control: + if ( reducePollToNDir ) + { + + // Keep poll directions unchanged (store directions even those that will be snaped to bounds) + reducedPollDirs[i_pc].assign(dirs[i_pc].begin(),dirs[i_pc].end()); + + _ev_control_for_sorting.clear_eval_lop(); + + if ( ! _mesh->is_finest() ) + { + + // 1st sorting of points based on feas. or infeas. success direction. IMPORTANT removes out of bounds -> this justifies to proceede in two steps + set_poll_trial_points(dirs[i_pc],offset,*poll_center,stop,stop_reason,true); + if ( stop ) + { + delete[] dirs; + delete[] reducedPollDirs; + return; + } + #ifdef USE_MPI - // asynchronous mode: wait for truth evaluations in progress: - if ( _p.get_asynchronous() ) - { - std::list<const NOMAD::Eval_Point *> eval_pts; - _ev_control.wait_for_evaluations ( NOMAD::ASYNCHRONOUS , - _true_barrier , - _sgte_barrier , - _pareto_front , - stop , - stop_reason , - success , - eval_pts ); - } -#endif - - // 2nd sorting of points based on model and surrogate if available - _ev_control_for_sorting.ordering_lop( NOMAD::POLL,stop,stop_reason,_true_barrier,_sgte_barrier ); - if (stop) - { - delete[] dirs; - delete[] reducedPollDirs; - return; - } - } - - - - // reduce the number of poll direction using dir indices from ev_control_for_sorting and original poll directions (reducedPollDirs) - bool hasBeenReduced=set_reduced_poll_to_n_directions(reducedPollDirs[i_pc],*poll_center); - - - // if hasBeenReduced than reassign dirs for setting poll trial points (reduced) - // else original dirs are considered - if (hasBeenReduced) - dirs[i_pc].assign(reducedPollDirs[i_pc].begin(),reducedPollDirs[i_pc].end()); - - } - - set_poll_trial_points(dirs[i_pc],offset,*poll_center,stop,stop_reason,false); - offset = dirs[i_pc].size(); - - if (!reducePollToNDir) - { - // 2nd sorting of points based on model and surrogate if available - _ev_control.ordering_lop( NOMAD::POLL,stop,stop_reason,_true_barrier,_sgte_barrier ); + // asynchronous mode: wait for truth evaluations in progress: + if ( _p.get_asynchronous() ) + { + std::list<const NOMAD::Eval_Point *> eval_pts; + _ev_control.wait_for_evaluations ( NOMAD::ASYNCHRONOUS , + _true_barrier , + _sgte_barrier , + _pareto_front , + stop , + stop_reason , + success , + eval_pts ); + } +#endif + + // 2nd sorting of points based on model and surrogate if available + _ev_control_for_sorting.ordering_lop( NOMAD::POLL,stop,stop_reason,_true_barrier,_sgte_barrier ); + if ( stop ) + { + delete[] dirs; + delete[] reducedPollDirs; + return; + } + } + + + + // reduce the number of poll direction using dir indices from ev_control_for_sorting and original poll directions (reducedPollDirs) + bool hasBeenReduced=set_reduced_poll_to_n_directions(reducedPollDirs[i_pc],*poll_center); + + + // if hasBeenReduced than reassign dirs for setting poll trial points (reduced) + // else original dirs are considered + if ( hasBeenReduced ) + dirs[i_pc].assign(reducedPollDirs[i_pc].begin(),reducedPollDirs[i_pc].end()); + } - - - } - - if (stop) - { - delete[] dirs; - delete[] reducedPollDirs; - return; - } - - // loop increment: - if ( i_pc == NOMAD::PRIMARY) - { - i_pc = NOMAD::SECONDARY; - poll_center = poll_centers[NOMAD::SECONDARY]; - } - else - break; - } - - - // display the re-ordered list of poll trial points: - if ( display_degree == NOMAD::FULL_DISPLAY && !stop ) - { - const std::set<NOMAD::Priority_Eval_Point> & poll_pts = _ev_control.get_eval_lop(); - if (!reducePollToNDir) - out << std::endl << NOMAD::open_block ( "re-ordered list of " - + NOMAD::itos ( poll_pts.size() ) - + " poll trial points." ); - else - out << std::endl << NOMAD::open_block ( "re-ordered and reduced (dynamic directions may be added after evaluations) list of " - + NOMAD::itos ( poll_pts.size() ) - + " poll trial points" ); - - std::set<NOMAD::Priority_Eval_Point>::const_iterator end2 = poll_pts.end() , it2; - for ( it2 = poll_pts.begin() ; it2 != end2 ; ++it2 ) - { - x = it2->get_point(); - x->display_tag ( out ); - out << " : ( "; - x->Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); - out << " )"; - if ( x->get_direction() ) - out << " (dir " << x->get_direction()->get_index() << ")"; - out << std::endl; - } - out.close_block(); - } - - - _stats.add_poll_pts ( _ev_control.get_nb_eval_points() ); - - // the directions are checked to satisfy a minimum - // poll size with integer variables: - check_directions ( forbid_poll_size_stop ); - - // eval_list_of_points (poll): - // --------------------------- - std::list<const NOMAD::Eval_Point *> *evaluated_pts=new std::list<const NOMAD::Eval_Point *>; - _ev_control.eval_list_of_points ( NOMAD::POLL , - _true_barrier , - _sgte_barrier , - _pareto_front , - stop , - stop_reason , - new_feas_inc , - new_infeas_inc , - success , - evaluated_pts ); - - - // If ortho mads n+1, complete poll with additional evaluations obtained dynamically - if (!stop && success !=NOMAD::FULL_SUCCESS && _p.has_dynamic_direction()) - { - _ev_control.reset(); - - // loop again on the two poll centers to obtain dynamic direction - // --------------------------------------------------------------------------- - i_pc = NOMAD::PRIMARY; - poll_center = poll_centers[NOMAD::PRIMARY]; - offset=0; - while ( true ) - { - if ( poll_center && NOMAD::Mads::dirs_have_orthomads_np1(reducedPollDirs[i_pc])) - { - std::list<NOMAD::Direction> dyn_dirs; - + + set_poll_trial_points(dirs[i_pc],offset,*poll_center,stop,stop_reason,false); + offset = dirs[i_pc].size(); + + if ( ( _p.get_intensification_type() == NOMAD::POLL_ONLY || _p.get_intensification_type() == NOMAD::POLL_AND_SEARCH ) && i_pc == NOMAD::PRIMARY ) + { + set_poll_intensification_points( *poll_center, offset, stop, stop_reason ); + } + + if ( !reducePollToNDir ) + { + // 2nd sorting of points based on model and surrogate if available + _ev_control.ordering_lop( NOMAD::POLL, stop, stop_reason, _true_barrier, _sgte_barrier ); + } + + + } + + if ( stop ) + { + delete[] dirs; + delete[] reducedPollDirs; + return; + } + + // loop increment: + if ( i_pc == NOMAD::PRIMARY) + { + i_pc = NOMAD::SECONDARY; + poll_center = poll_centers[NOMAD::SECONDARY]; + } + else + break; + } + + + // display the re-ordered list of poll trial points: + if ( display_degree == NOMAD::FULL_DISPLAY && !stop ) + { + const std::set<NOMAD::Priority_Eval_Point> & poll_pts = _ev_control.get_eval_lop(); + + if ( !reducePollToNDir ) + out << std::endl << NOMAD::open_block ( "re-ordered list of " + + NOMAD::itos ( poll_pts.size() ) + + " poll trial points." ); + else + out << std::endl << NOMAD::open_block ( "re-ordered and reduced (dynamic directions may be added after evaluations) list of " + + NOMAD::itos ( poll_pts.size() ) + + " poll trial points" ); + + std::set<NOMAD::Priority_Eval_Point>::const_iterator end2 = poll_pts.end() , it2; + for ( it2 = poll_pts.begin() ; it2 != end2 ; ++it2 ) + { + x = it2->get_point(); + x->display_tag ( out ); + out << " : ( "; + x->Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); + out << " )"; + if ( x->get_direction() ) + out << " (dir " << x->get_direction()->get_index() << ")"; + out << std::endl; + } + out.close_block(); + } + + + _stats.add_poll_pts ( _ev_control.get_nb_eval_points() ); + + // the directions are checked to satisfy a minimum + // poll size with integer variables: + check_directions ( forbid_poll_size_stop ); + + // eval_list_of_points (poll): + // --------------------------- + std::list<const NOMAD::Eval_Point *> *evaluated_pts=new std::list<const NOMAD::Eval_Point *>; + _ev_control.eval_list_of_points ( NOMAD::POLL , + _true_barrier , + _sgte_barrier , + _pareto_front , + stop , + stop_reason , + new_feas_inc , + new_infeas_inc , + success , + evaluated_pts ); + + + // If ortho mads n+1, complete poll with additional evaluations obtained dynamically + if (!stop && success !=NOMAD::FULL_SUCCESS && _p.has_dynamic_direction()) + { + _ev_control.reset(); + + // loop again on the two poll centers to obtain dynamic direction + // --------------------------------------------------------------------------- + i_pc = NOMAD::PRIMARY; + poll_center = poll_centers[NOMAD::PRIMARY]; + offset=0; + while ( true ) + { + if ( poll_center && NOMAD::Mads::dirs_have_orthomads_np1_dyn( reducedPollDirs[i_pc] ) ) + { + std::list<NOMAD::Direction> dyn_dirs; + #ifdef USE_MPI - // asynchronous mode: wait for the evaluations in progress: - if ( _p.get_asynchronous() ) - { - _ev_control.wait_for_evaluations ( NOMAD::ASYNCHRONOUS , - _true_barrier , - _sgte_barrier , - _pareto_front , - stop , - stop_reason , - success , - *evaluated_pts ); - } -#endif - - bool hasNewDynDir=get_dynamic_directions (reducedPollDirs[i_pc], - dyn_dirs, - *poll_center); - - - // Set new poll points obtained dynamically - if (hasNewDynDir) - { - set_poll_trial_points(dyn_dirs, - offset, - *poll_center, - stop, - stop_reason, - false); - - if (stop) - { - delete evaluated_pts; - delete[] dirs; - delete[] reducedPollDirs; - return; - } - } - offset = dyn_dirs.size(); - } - // loop increment: - if ( i_pc == NOMAD::PRIMARY ) - { - i_pc = NOMAD::SECONDARY; - poll_center = poll_centers[NOMAD::SECONDARY]; - } - else - break; - } - - if ( display_degree == NOMAD::FULL_DISPLAY ) - { - const std::set<NOMAD::Priority_Eval_Point> & poll_pts = _ev_control.get_eval_lop(); - out << std::endl << NOMAD::open_block ( "re-ordered and complete (dynamic directions added) list of " - + NOMAD::itos ( poll_pts.size() ) - + " poll trial points" ); - - std::set<NOMAD::Priority_Eval_Point>::const_iterator end2 = poll_pts.end() , it2; - for ( it2 = poll_pts.begin() ; it2 != end2 ; ++it2 ) { - x = it2->get_point(); - x->display_tag ( out ); - out << " : ( "; - x->Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); - out << " )"; - if ( x->get_direction() ) - out << " (dir " << x->get_direction()->get_index() << ")"; - out << std::endl; - } - out.close_block(); - } - - - - - // Eval additional point(s) : - // --------------------------- - _ev_control.eval_list_of_points ( NOMAD::POLL , - _true_barrier , - _sgte_barrier , - _pareto_front , - stop , - stop_reason , - new_feas_inc , - new_infeas_inc , - success ); - - if (success==NOMAD::FULL_SUCCESS) - _stats.add_nb_success_dyn_dir(); - - } - - delete evaluated_pts; - delete[] dirs; - delete[] reducedPollDirs; - - - // extended poll for categorical variables: - // ---------------------------------------- - if ( !stop && - _extended_poll && - success != NOMAD::FULL_SUCCESS && - _p.get_extended_poll_enabled() ) { - - // display: - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl << NOMAD::open_block ( "MADS extended poll" ) << std::endl; - + // asynchronous mode: wait for the evaluations in progress: + if ( _p.get_asynchronous() ) + { + _ev_control.wait_for_evaluations ( NOMAD::ASYNCHRONOUS , + _true_barrier , + _sgte_barrier , + _pareto_front , + stop , + stop_reason , + success , + *evaluated_pts ); + } +#endif + + bool hasNewDynDir=get_dynamic_directions (reducedPollDirs[i_pc], + dyn_dirs, + *poll_center); + + + // Set new poll points obtained dynamically + if (hasNewDynDir) + { + set_poll_trial_points(dyn_dirs, + offset, + *poll_center, + stop, + stop_reason, + false); + + if (stop) + { + delete evaluated_pts; + delete[] dirs; + delete[] reducedPollDirs; + return; + } + } + offset = dyn_dirs.size(); + } + // loop increment: + if ( i_pc == NOMAD::PRIMARY ) + { + i_pc = NOMAD::SECONDARY; + poll_center = poll_centers[NOMAD::SECONDARY]; + } + else + break; + } + + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + const std::set<NOMAD::Priority_Eval_Point> & poll_pts = _ev_control.get_eval_lop(); + out << std::endl << NOMAD::open_block ( "re-ordered and complete (dynamic directions added) list of " + + NOMAD::itos ( poll_pts.size() ) + + " poll trial points" ); + + std::set<NOMAD::Priority_Eval_Point>::const_iterator end2 = poll_pts.end() , it2; + for ( it2 = poll_pts.begin() ; it2 != end2 ; ++it2 ) + { + x = it2->get_point(); + x->display_tag ( out ); + out << " : ( "; + x->Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); + out << " )"; + if ( x->get_direction() ) + out << " (dir " << x->get_direction()->get_index() << ")"; + out << std::endl; + } + out.close_block(); + } + + + + + // Eval additional point(s) : + // --------------------------- + _ev_control.eval_list_of_points ( NOMAD::POLL , + _true_barrier , + _sgte_barrier , + _pareto_front , + stop , + stop_reason , + new_feas_inc , + new_infeas_inc , + success ); + + if (success==NOMAD::FULL_SUCCESS) + _stats.add_nb_success_dyn_dir(); + + } + + delete evaluated_pts; + delete[] dirs; + delete[] reducedPollDirs; + + + // extended poll for categorical variables: + // ---------------------------------------- + if ( !stop && + _extended_poll && + success != NOMAD::FULL_SUCCESS && + _p.get_extended_poll_enabled() ) + { + + // display: + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl << NOMAD::open_block ( "MADS extended poll" ) << std::endl; + #ifdef USE_MPI - // asynchronous mode: wait for the evaluations in progress: - if ( _p.get_asynchronous() ) { - std::list<const NOMAD::Eval_Point *> evaluated_pts; - _ev_control.wait_for_evaluations ( NOMAD::ASYNCHRONOUS , - _true_barrier , - _sgte_barrier , - _pareto_front , - stop , - stop_reason , - success , - evaluated_pts ); - } + // asynchronous mode: wait for the evaluations in progress: + if ( _p.get_asynchronous() ) + { + std::list<const NOMAD::Eval_Point *> evaluated_pts; + _ev_control.wait_for_evaluations ( NOMAD::ASYNCHRONOUS , + _true_barrier , + _sgte_barrier , + _pareto_front , + stop , + stop_reason , + success , + evaluated_pts ); + } #endif - - // reset the extended poll object: - _extended_poll->poll_reset(); - - // call the user defined method changing the categorical variables - // (this creates the list of extended poll points): - _extended_poll->construct_extended_points ( *barrier.get_poll_center() ); - - // add the signatures in use to the list of poll signatures: - { - const std::set<NOMAD::Signature_Element> & - tmp = _extended_poll->get_poll_signatures(); - std::set<NOMAD::Signature_Element>::const_iterator it , end = tmp.end(); - for ( it = tmp.begin() ; it != end ; ++it ) - signatures.push_back ( it->get_signature() ); - } - - // execute the extended poll: - int nb_ext_poll_pts; - _extended_poll->run ( *this , - nb_ext_poll_pts , - stop , - stop_reason , - success , - new_feas_inc , - new_infeas_inc ); - - // stats updates: - _stats.add_ext_poll_pts ( nb_ext_poll_pts ); - if ( success == NOMAD::FULL_SUCCESS ) - _stats.add_ext_poll_succ(); - _stats.add_nb_ext_polls(); - - // display: - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl << NOMAD::close_block ( "end of extended poll" ) << std::endl; - } - - // stats updates: - if ( success == NOMAD::FULL_SUCCESS ) - _stats.add_poll_success(); - - _stats.add_nb_poll_searches(); - - // success directions (feasible and infeasible): - update_success_directions ( new_feas_inc , true ); - update_success_directions ( new_infeas_inc , false ); - + + // reset the extended poll object: + _extended_poll->poll_reset(); + + // call the user defined method changing the categorical variables + // (this creates the list of extended poll points): + _extended_poll->construct_extended_points ( *barrier.get_poll_center() ); + + // add the signatures in use to the list of poll signatures: + { + const std::set<NOMAD::Signature_Element> & + tmp = _extended_poll->get_poll_signatures(); + std::set<NOMAD::Signature_Element>::const_iterator it , end = tmp.end(); + for ( it = tmp.begin() ; it != end ; ++it ) + signatures.push_back ( it->get_signature() ); + } + + // execute the extended poll: + int nb_ext_poll_pts; + _extended_poll->run ( *this , + nb_ext_poll_pts , + stop , + stop_reason , + success , + new_feas_inc , + new_infeas_inc ); + + // stats updates: + _stats.add_ext_poll_pts ( nb_ext_poll_pts ); + if ( success == NOMAD::FULL_SUCCESS ) + _stats.add_ext_poll_succ(); + _stats.add_nb_ext_polls(); + + // display: + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl << NOMAD::close_block ( "end of extended poll" ) << std::endl; + } + + // stats updates: + if ( success == NOMAD::FULL_SUCCESS ) + _stats.add_poll_success(); + + _stats.add_nb_poll_searches(); + + // success directions (feasible and infeasible): + update_success_directions ( new_feas_inc , true ); + update_success_directions ( new_infeas_inc , false ); + #ifdef DEBUG - if ( !new_feas_inc && !new_infeas_inc ) - out << "No new feasible or infeasible incumbent" << std::endl << std::endl; + if ( !new_feas_inc && !new_infeas_inc ) + out << "No new feasible or infeasible incumbent" << std::endl << std::endl; #endif - - // check the PEB constraints: if we have a new best infeasible - // incumbent from another infeasible incumbent - // ( active_barrier.check_PEB_constraints() ): - if ( _p.get_barrier_type() == NOMAD::PEB_P && new_infeas_inc && - new_infeas_inc->get_poll_center_type() == NOMAD::INFEASIBLE ) - ( ( _p.get_opt_only_sgte() ) ? _sgte_barrier : _true_barrier ).check_PEB_constraints( *new_infeas_inc , display_degree==NOMAD::FULL_DISPLAY ); - - // final display: - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << NOMAD::close_block ( "end of poll" ); + + // check the PEB constraints: if we have a new best infeasible + // incumbent from another infeasible incumbent + // ( active_barrier.check_PEB_constraints() ): + if ( _p.get_barrier_type() == NOMAD::PEB_P && new_infeas_inc && + new_infeas_inc->get_poll_center_type() == NOMAD::INFEASIBLE ) + ( ( _p.get_opt_only_sgte() ) ? _sgte_barrier : _true_barrier ).check_PEB_constraints( *new_infeas_inc , display_degree==NOMAD::FULL_DISPLAY ); + + // final display: + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << NOMAD::close_block ( "end of poll" ); } /*---------------------------------------------------------*/ @@ -1856,109 +1838,111 @@ void NOMAD::Mads::poll ( bool & stop , /*---------------------------------------------------------*/ // A direction group corresponds to a variable group having directions. // A variable group of categorical variables does not possess directions. -bool NOMAD::Mads::set_reduced_poll_to_n_directions(std::list<NOMAD::Direction> & dirs, - const NOMAD::Eval_Point & poll_center) +bool NOMAD::Mads::set_reduced_poll_to_n_directions(std::list<NOMAD::Direction> & dirs, + const NOMAD::Eval_Point & poll_center) { - NOMAD::Signature * cur_signature = poll_center.get_signature(); - size_t n = cur_signature->get_n()-cur_signature->get_nb_fixed_variables() ; + + // get the number of free variables using the signature (because of extended poll and changing signature) + NOMAD::Signature * cur_signature = poll_center.get_signature(); + size_t n = cur_signature->get_n()-cur_signature->get_nb_fixed_variables() ; // No direction for categorical variables - size_t n_cat = cur_signature->get_n_categorical(); - - // Verify that enough directions for reduction are provided - if ( dirs.size()<n-n_cat ) - return false; - - // Maximum number of direction groups - std::list<NOMAD::Direction>::iterator itDirs; - size_t maxDirGroupIndex=0; - size_t dgi; - for (itDirs=dirs.begin();itDirs!=dirs.end() ; ++itDirs) - { - dgi=(*itDirs).get_dir_group_index(); - if (dgi>maxDirGroupIndex) maxDirGroupIndex=dgi; - } - + size_t n_cat = cur_signature->get_n_categorical(); + + // Verify that enough directions for reduction are provided + if ( dirs.size()<n-n_cat ) + return false; + + // Maximum number of direction groups + std::list<NOMAD::Direction>::iterator itDirs; + size_t maxDirGroupIndex=0; + size_t dgi; + for (itDirs=dirs.begin();itDirs!=dirs.end() ; ++itDirs) + { + dgi=(*itDirs).get_dir_group_index(); + if (dgi>maxDirGroupIndex) maxDirGroupIndex=dgi; + } + std::list<NOMAD::Direction> TmpDirs(dirs); dirs.clear(); - - // Loop on each direction group - for (dgi=0;dgi<=maxDirGroupIndex;++dgi) - { - - // Get all poll directions with a given direction group index + Get a vector of unique indices for those directions - std::vector<NOMAD::Direction> pollDirs; - std::vector<int> pollDirIndices; - bool containsOrthoMads=false; - for (itDirs=TmpDirs.begin();itDirs!=TmpDirs.end() ; ++itDirs) - { - if ( static_cast<size_t>((*itDirs).get_dir_group_index()) == dgi ) - { - pollDirs.push_back(*itDirs); - pollDirIndices.push_back((*itDirs).get_index()); - if (!containsOrthoMads) - containsOrthoMads=NOMAD::dir_is_orthomads((*itDirs).get_type()); - } - } - - - std::list<NOMAD::Direction> sortedDirs; + + // Loop on each direction group + for (dgi=0;dgi<=maxDirGroupIndex;++dgi) + { + + // Get all poll directions with a given direction group index + Get a vector of unique indices for those directions + std::vector<NOMAD::Direction> pollDirs; + std::vector<int> pollDirIndices; + bool containsOrthoMads = false; + for ( itDirs=TmpDirs.begin() ; itDirs != TmpDirs.end() ; ++itDirs) + { + if ( static_cast<size_t>((*itDirs).get_dir_group_index()) == dgi ) + { + pollDirs.push_back(*itDirs); + pollDirIndices.push_back((*itDirs).get_index()); + if (!containsOrthoMads) + containsOrthoMads=NOMAD::dir_is_orthomads((*itDirs).get_type()); + } + } + + + std::list<NOMAD::Direction> sortedDirs; std::list<NOMAD::Direction>::iterator itSortedDirs; - // Sort the directions only if mesh is not finest - if ( !_mesh->is_finest() ) - { - - const std::set<NOMAD::Priority_Eval_Point> & LOP=_ev_control_for_sorting.get_eval_lop(); - - if ( LOP.size()==0 ) - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , - "Mads::set_reduced_poll_to_n_directions(): the _ev_control_for_sorting does not have a list of evaluation points." ); - - - // Get all directions from ev_control ordered lop (list of evaluation points) with a given direction group index and given poll center - // Get a set of unique indices of those directions - std::list<int> sortedDirIndices; + // Sort the directions only if mesh is not finest + if ( !_mesh->is_finest() ) + { + + const std::set<NOMAD::Priority_Eval_Point> & LOP=_ev_control_for_sorting.get_eval_lop(); + + if ( LOP.size()==0 ) + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , + "Mads::set_reduced_poll_to_n_directions(): the _ev_control_for_sorting does not have a list of evaluation points." ); + + + // Get all directions from ev_control ordered lop (list of evaluation points) with a given direction group index and given poll center + // Get a set of unique indices of those directions + std::list<int> sortedDirIndices; std::set<int> indices; std::list<int>::iterator itSortedDirIndices; - std::set<NOMAD::Priority_Eval_Point>::const_iterator citLOP; - for (citLOP=LOP.begin();citLOP!=LOP.end();++citLOP) - { - const NOMAD::Eval_Point *eval_point=(*citLOP).get_point(); - if ( static_cast<size_t>(eval_point->get_direction()->get_dir_group_index()) == dgi && - *(eval_point->get_poll_center())==poll_center) + std::set<NOMAD::Priority_Eval_Point>::const_iterator citLOP; + for (citLOP=LOP.begin();citLOP!=LOP.end();++citLOP) + { + const NOMAD::Eval_Point *eval_point=(*citLOP).get_point(); + if ( static_cast<size_t>(eval_point->get_direction()->get_dir_group_index()) == dgi && + *(eval_point->get_poll_center())==poll_center) { int index=eval_point->get_direction()->get_index(); if ( indices.size() == 0 || indices.find(index) == indices.end() ) // if the index is already in indices no need to add it in sortedDirIndices to avoid duplicate. - sortedDirIndices.push_back(index); + sortedDirIndices.push_back(index); indices.insert(index); // If the index is already in the set IT IS NOT INSERTED --> set of unique sort integers - + } - - } - - if ( sortedDirIndices.size()==0 ) - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , - "Mads::set_reduced_poll_to_n_directions(): no directions with proper group index available from _ev_control_for_sorting!" ); - - // A direction from _ev_control may have been suppressed if it does not satisfy bound constraint and is not snapped to bounds - // --> complete sorted direction with remaining directions in poll dirs - // - // 2 - Add poll directions (from tmpDirs) in the same order as sorted direction indices (from ev_control) - std::vector<int>::iterator itPollDirIndices; - std::vector<NOMAD::Direction>::iterator itPollDirs=pollDirs.begin(); - size_t pos; - for ( itSortedDirIndices = sortedDirIndices.begin() ; itSortedDirIndices != sortedDirIndices.end() ; ++itSortedDirIndices) - { - itPollDirIndices=find(pollDirIndices.begin(),pollDirIndices.end(),*itSortedDirIndices); - if ( itPollDirIndices!=pollDirIndices.end() ) - { - pos=distance(pollDirIndices.begin(),itPollDirIndices); + + } + + if ( sortedDirIndices.size()==0 ) + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , + "Mads::set_reduced_poll_to_n_directions(): no directions with proper group index available from _ev_control_for_sorting!" ); + + // A direction from _ev_control may have been suppressed if it does not satisfy bound constraint and is not snapped to bounds + // --> complete sorted direction with remaining directions in poll dirs + // + // 2 - Add poll directions (from tmpDirs) in the same order as sorted direction indices (from ev_control) + std::vector<int>::iterator itPollDirIndices; + std::vector<NOMAD::Direction>::iterator itPollDirs=pollDirs.begin(); + size_t pos; + for ( itSortedDirIndices = sortedDirIndices.begin() ; itSortedDirIndices != sortedDirIndices.end() ; ++itSortedDirIndices) + { + itPollDirIndices=find(pollDirIndices.begin(),pollDirIndices.end(),*itSortedDirIndices); + if ( itPollDirIndices!=pollDirIndices.end() ) + { + pos=distance(pollDirIndices.begin(),itPollDirIndices); itPollDirs=pollDirs.begin(); std::advance(itPollDirs,pos); - sortedDirs.push_back(*itPollDirs); - } - } + sortedDirs.push_back(*itPollDirs); + } + } // 3 - complete with remaining pollDirs directions if ( sortedDirs.size() != pollDirs.size() ) { @@ -1971,48 +1955,47 @@ bool NOMAD::Mads::set_reduced_poll_to_n_directions(std::list<NOMAD::Direction> & sortedDirs.push_back(*itPollDirs); } } - - } + + } else sortedDirs.assign(pollDirs.begin(),pollDirs.end()); - - // Make a spanning set of directions (this is slightly different Ortho n+1 paper but still we have the garantee that Dk grows asymptotically dense because D^o_k has not been sorted if mesh_index_is_max) - // Sequentially add sorted directions that increase the rank in two situations: - // - If mesh is not finest -> consider all directions for adding -> n directions - // - If mesh is finest but some ORTHO MADS directions are present -> only consider ortho mads dir for adding -> n directions - // - Else, all directions are considered -> more than n directions - // See paper Ortho n+1 paper for details - - - size_t currentRank=get_rank_from_dirs(dirs); - for (itSortedDirs=sortedDirs.begin();itSortedDirs!=sortedDirs.end();++itSortedDirs) - { - dirs.push_back(*itSortedDirs); - if ( !_mesh->is_finest() || ( _mesh->is_finest() && containsOrthoMads)) - { - size_t rank=get_rank_from_dirs(dirs); - if (rank>currentRank && rank<=n-n_cat && NOMAD::dir_is_orthomads((*itSortedDirs).get_type())) - currentRank++; - else - dirs.pop_back(); - } - } - - - } - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_poll_dd(); - if ( dirs.size()!=n-n_cat ) - { - if (display_degree == NOMAD::FULL_DISPLAY ) - { - out << std::endl << NOMAD::open_block ( "The number of reduced directions is lower than n-n_categorical: "); - out << dirs.size() << ". No reduction is performed." << std::endl; - out << NOMAD::close_block(); - } - return false; - } - return true; + + // Make a spanning set of directions (this is slightly different Ortho n+1 paper but still we have the garantee that Dk grows asymptotically dense because D^o_k has not been sorted if mesh_index_is_max) + // Sequentially add sorted directions that increase the rank in two situations: + // - If mesh is not finest -> consider all directions for adding -> n directions + // - If mesh is finest but some ORTHO MADS directions are present -> only consider ortho mads dir for adding -> n directions + // - Else, all directions are considered -> more than n directions + // See paper Ortho n+1 paper for details + + size_t currentRank=get_rank_from_dirs(dirs); + for (itSortedDirs=sortedDirs.begin();itSortedDirs!=sortedDirs.end();++itSortedDirs) + { + dirs.push_back(*itSortedDirs); + if ( !_mesh->is_finest() || ( _mesh->is_finest() && containsOrthoMads)) + { + size_t rank=get_rank_from_dirs(dirs); + if (rank>currentRank && rank<=n-n_cat && NOMAD::dir_is_orthomads((*itSortedDirs).get_type())) + currentRank++; + else + dirs.pop_back(); + } + } + + + } + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_poll_dd(); + if ( dirs.size()!=n-n_cat ) + { + if (display_degree == NOMAD::FULL_DISPLAY ) + { + out << std::endl << NOMAD::open_block ( "The number of reduced directions is lower than n-n_categorical: "); + out << dirs.size() << ". No reduction is performed." << std::endl; + out << NOMAD::close_block(); + } + return false; + } + return true; } /*----------------------------------------------------------------*/ @@ -2020,34 +2003,34 @@ bool NOMAD::Mads::set_reduced_poll_to_n_directions(std::list<NOMAD::Direction> & /*----------------------------------------------------------------*/ int NOMAD::Mads::get_rank_from_dirs(const std::list<NOMAD::Direction> & dirs) { - if (dirs.size()==0) - return 0; - - std::list<NOMAD::Direction>::const_iterator it=dirs.begin(); - size_t m=(*it).size(); - size_t n=dirs.size(); - - double ** M = new double *[m]; - for (size_t i=0 ; i<m ; ++i ) - { - it=dirs.begin(); - M[i] = new double[n]; - for (size_t j = 0 ; j < n ; ++j ) - { - M[i][j] = (*it)[static_cast<int>(i)].value() ; - ++it; - } - } - - int rank=NOMAD::get_rank(M,m,n); - - for (size_t i = 0 ; i < m ; ++i ) - { - delete[] M[i]; - } - delete[] M; - return rank; - + if (dirs.size()==0) + return 0; + + std::list<NOMAD::Direction>::const_iterator it=dirs.begin(); + size_t m=(*it).size(); + size_t n=dirs.size(); + + double ** M = new double *[m]; + for (size_t i=0 ; i<m ; ++i ) + { + it=dirs.begin(); + M[i] = new double[n]; + for (size_t j = 0 ; j < n ; ++j ) + { + M[i][j] = (*it)[static_cast<int>(i)].value() ; + ++it; + } + } + + int rank=NOMAD::get_rank(M,m,n); + + for (size_t i = 0 ; i < m ; ++i ) + { + delete[] M[i]; + } + delete[] M; + return rank; + } /*---------------------------------------------------------------------------------------*/ @@ -2055,346 +2038,350 @@ int NOMAD::Mads::get_rank_from_dirs(const std::list<NOMAD::Direction> & dirs) /* (private) */ /*---------------------------------------------------------------------------------------*/ bool NOMAD::Mads::optimize_quad_model ( const NOMAD::Eval_Point & poll_center , - const std::list<NOMAD::Direction> & dirs , - NOMAD::Point & prospect_point ) + const std::list<NOMAD::Direction> & dirs , + NOMAD::Point & prospect_point ) { - const NOMAD::Display & out = _p.out(); - - // surrogate or truth model evaluations: - NOMAD::eval_type ev_type = + const NOMAD::Display & out = _p.out(); + + // surrogate or truth model evaluations: + NOMAD::eval_type ev_type = ( _p.get_opt_only_sgte() ) ? NOMAD::SGTE : NOMAD::TRUTH; - - // active cache: - const NOMAD::Cache & cache = get_cache(); - - NOMAD::Point delta,Delta; - NOMAD::Signature * signature=poll_center.get_signature(); - _mesh->get_delta ( delta ); - _mesh->get_Delta ( Delta ); - - // compute the interpolation radius: points in Y must be at - // a max distance of ms_radius_factor times Delta^k: - NOMAD::Point interpolation_radius = Delta; - interpolation_radius *= _p.get_model_quad_radius_factor(); - - - // Epsilon for quad model hypercube scaling - NOMAD::Double epsilon = _p.get_model_np1_quad_epsilon(); - + + // active cache: + const NOMAD::Cache & cache = get_cache(); + + NOMAD::Point delta,Delta; + NOMAD::Signature * signature=poll_center.get_signature(); + _mesh->get_delta ( delta ); + _mesh->get_Delta ( Delta ); + + // compute the interpolation radius: points in Y must be at + // a max distance of ms_radius_factor times Delta^k: + NOMAD::Point interpolation_radius = Delta; + interpolation_radius *= _p.get_model_quad_radius_factor(); + + + // Epsilon for quad model hypercube scaling + NOMAD::Double epsilon = _p.get_model_np1_quad_epsilon(); + #ifdef DEBUG - out << std::endl << NOMAD::open_block ( "Quadratic model for (n+1)th prospect point") << std::endl - << "model construction for " << ev_type << std::endl - << "nbr of cache pts: " << cache.size() << std::endl - << "mesh indices : ( " << _mesh->get_mesh_indices () << " )" << std::endl - << "poll center : ( " << poll_center << " )" << std::endl - << "poll size : ( " << Delta << " )" << std::endl - << "interpol. radius: ( " << interpolation_radius << " )" << std::endl - << "epsilon hypercube: ( " << epsilon << " )" << std::endl;; + out << std::endl << NOMAD::open_block ( "Quadratic model for (n+1)th prospect point") << std::endl + << "model construction for " << ev_type << std::endl + << "nbr of cache pts: " << cache.size() << std::endl + << "mesh indices : ( " << _mesh->get_mesh_indices () << " )" << std::endl + << "poll center : ( " << poll_center << " )" << std::endl + << "poll size : ( " << Delta << " )" << std::endl + << "interpol. radius: ( " << interpolation_radius << " )" << std::endl + << "epsilon hypercube: ( " << epsilon << " )" << std::endl;; #endif - - - // creation of the model for all bb outputs: - std::vector<NOMAD::bb_output_type> bbot = _p.get_bb_output_type(); - NOMAD::Quad_Model model ( out , bbot , cache , *signature ); - NOMAD::Model_Stats tmp_stats; - NOMAD::Clock clock; - - // flag to detect model or optimization errors: - bool error = true; - - // construct interpolation set Y: - int min_Y_size = _p.get_model_quad_min_Y_size(); - int max_Y_size = _p.get_model_quad_max_Y_size(); - - model.construct_Y ( poll_center , interpolation_radius , max_Y_size ); - - int nY = model.get_nY(); - + + + // creation of the model for all bb outputs: + std::vector<NOMAD::bb_output_type> bbot = _p.get_bb_output_type(); + NOMAD::Quad_Model model ( out , bbot , cache , *signature ); + NOMAD::Model_Stats tmp_stats; + NOMAD::Clock clock; + + // flag to detect model or optimization errors: + bool error = true; + + // construct interpolation set Y: + int min_Y_size = _p.get_model_quad_min_Y_size(); + int max_Y_size = _p.get_model_quad_max_Y_size(); + + model.construct_Y ( poll_center , interpolation_radius , max_Y_size ); + + int nY = model.get_nY(); + #ifdef DEBUG - out << std::endl << "number of points in Y: " << nY; - if ( nY < 2 || ( min_Y_size < 0 && nY <= model.get_nfree() ) ) - out << " (not enough)"; - out << std::endl; + out << std::endl << "number of points in Y: " << nY; + if ( nY < 2 || ( min_Y_size < 0 && nY <= model.get_nfree() ) ) + out << " (not enough)"; + out << std::endl; #endif - - if ( nY < 2 || ( min_Y_size < 0 && nY <= model.get_nfree() ) ) - tmp_stats.add_not_enough_pts(); - else - { + + if ( nY < 2 || ( min_Y_size < 0 && nY <= model.get_nfree() ) ) + tmp_stats.add_not_enough_pts(); + else + { #ifdef DEBUG - out << std::endl; - model.display_Y ( out , "unscaled interpolation set Y" ); + out << std::endl; + model.display_Y ( out , "unscaled interpolation set Y" ); #endif - - // define scaling with rotation: obtain an hypercube [0,1]^n formed by truncated directions - model.define_scaling_by_directions ( dirs, delta ,epsilon); - + + // define scaling with rotation: obtain an hypercube [0,1]^n formed by truncated directions + model.define_scaling_by_directions ( dirs, delta ,epsilon); + #ifdef DEBUG - out << std::endl; - model.display_Y ( out , "scaled interpolation set Ys" ); + out << std::endl; + model.display_Y ( out , "scaled interpolation set Ys" ); #endif - - // error check: - if ( model.get_error_flag() ) - tmp_stats.add_construction_error(); - - // no model error: - else { - - // construct model: - model.construct ( _p.get_model_quad_use_WP() , NOMAD::SVD_EPS , NOMAD::SVD_MAX_MPN , max_Y_size ); - tmp_stats.add_construction_time ( clock.get_CPU_time() ); - tmp_stats.update_nY ( model.get_nY() ); - - // display model characteristics: + + // error check: + if ( model.get_error_flag() ) + tmp_stats.add_construction_error(); + + // no model error: + else + { + + + // construct model: + model.construct ( _p.get_model_quad_use_WP() , NOMAD::SVD_EPS , NOMAD::SVD_MAX_MPN , max_Y_size ); + tmp_stats.add_construction_time ( clock.get_CPU_time() ); + tmp_stats.update_nY ( model.get_nY() ); + + // display model characteristics: #ifdef DEBUG - out << std::endl; - model.display_model_coeffs ( out ); - out << std::endl; - model.display_Y_error ( out ); + out << std::endl; + model.display_model_coeffs ( out ); + out << std::endl; + model.display_Y_error ( out ); #endif - - - // count model: - if ( ev_type == NOMAD::TRUTH ) - tmp_stats.add_nb_truth(); - else - tmp_stats.add_nb_sgte(); - - switch ( model.get_interpolation_type() ) - { - case NOMAD::MFN: - tmp_stats.add_nb_MFN(); - break; - case NOMAD::WP_REGRESSION: - tmp_stats.add_nb_WP_regression(); - break; - case NOMAD::REGRESSION: - tmp_stats.add_nb_regression(); - break; - default: - break; - } - - // check model error flag: - const NOMAD::Double & cond = model.get_cond(); - if ( model.get_error_flag() || - !cond.is_defined() || - cond > NOMAD::SVD_MAX_COND ) - { - if ( model.get_error_flag() ) - tmp_stats.add_construction_error(); - else - tmp_stats.add_bad_cond(); - } - else - { - int n = model.get_n(); - std::string error_str; - int i; - - // initial displays: - if ( _p.get_display_degree() == NOMAD::FULL_DISPLAY ) - { - std::ostringstream oss; - oss << "Quad model optimization for prospect point"; - out << std::endl << NOMAD::open_block ( oss.str() ); - } - - // parameters creation: - NOMAD::Parameters model_param ( out ); - - // number of variables: - model_param.set_DIMENSION ( n ); - - // blackbox outputs: - model_param.set_BB_OUTPUT_TYPE ( bbot ); - - // barrier parameters: - model_param.set_H_MIN ( _p.get_h_min () ); - model_param.set_H_NORM ( _p.get_h_norm() ); - - // starting points: - model_param.set_X0 ( NOMAD::Point ( n , 500.0 ) ); - - // fixed variables: - for ( i = 0 ; i < n ; ++i ) - if ( model.variable_is_fixed(i) || _p.variable_is_fixed(i) ) - model_param.set_FIXED_VARIABLE(i); - - // no model search and no model ordering: - model_param.set_MODEL_SEARCH ( false ); - model_param.set_MODEL_EVAL_SORT ( false ); - model_param.set_DIRECTION_TYPE (NOMAD::ORTHO_2N); // use 2N for model search rather than the default Ortho n+1 - - // display: - model_param.set_DISPLAY_DEGREE ( NOMAD::NO_DISPLAY ); - - // mesh: use isotropic mesh - model_param.set_ANISOTROPIC_MESH ( false ); - model_param.set_MESH_UPDATE_BASIS ( 4.0 ); - model_param.set_MESH_COARSENING_EXPONENT ( 1 ); - model_param.set_MESH_REFINING_EXPONENT ( -1 ); - model_param.set_INITIAL_MESH_INDEX ( 0 ); - model_param.set_INITIAL_MESH_SIZE ( NOMAD::Point ( n , 100.0 ) ); - - // maximum number of evaluations: - model_param.set_MAX_BB_EVAL ( 50000 ); - - model_param.set_SNAP_TO_BOUNDS ( true ); - - // disable user calls: - model_param.set_USER_CALLS_ENABLED ( false ); - - // set flags: - bool flag_check_bimads , flag_reset_mesh , flag_reset_barriers , flag_p1_active; - NOMAD::Mads::get_flags ( flag_check_bimads , - flag_reset_mesh , - flag_reset_barriers , - flag_p1_active ); - - NOMAD::Mads::set_flag_check_bimads (false ); - NOMAD::Mads::set_flag_reset_mesh ( true ); - NOMAD::Mads::set_flag_reset_barriers ( true ); - NOMAD::Mads::set_flag_p1_active ( false ); - - // bounds to optimize away from n first direction - // Bound are consistent with model evaluator: x in [0;1000] for optimziation -> x in [-1;1] for model evaluation - NOMAD::Point lb ( n , 0.0 ); - NOMAD::Point ub ( n , 1000.0 ); - model_param.set_LOWER_BOUND ( lb ); - model_param.set_UPPER_BOUND ( ub ); - - try - { - - // parameters validation: - model_param.check(); - - // model evaluator creation: - NOMAD::Evaluator *ev; - if (model_param.get_nb_obj()==2) - ev =new NOMAD::Multi_Obj_Quad_Model_Evaluator( model_param , model ); - else - ev=new NOMAD::Single_Obj_Quad_Model_Evaluator( model_param , model ); - - // algorithm creation and execution: - NOMAD::Mads mads ( model_param , ev ); + + + // count model: + if ( ev_type == NOMAD::TRUTH ) + tmp_stats.add_nb_truth(); + else + tmp_stats.add_nb_sgte(); + + switch ( model.get_interpolation_type() ) + { + case NOMAD::MFN: + tmp_stats.add_nb_MFN(); + break; + case NOMAD::WP_REGRESSION: + tmp_stats.add_nb_WP_regression(); + break; + case NOMAD::REGRESSION: + tmp_stats.add_nb_regression(); + break; + default: + break; + } + + // check model error flag: + const NOMAD::Double & cond = model.get_cond(); + if ( model.get_error_flag() || + !cond.is_defined() || + cond > NOMAD::SVD_MAX_COND ) + { + if ( model.get_error_flag() ) + tmp_stats.add_construction_error(); + else + tmp_stats.add_bad_cond(); + } + else + { + int n = model.get_n(); + std::string error_str; + int i; + + // initial displays: + if ( _p.get_display_degree() == NOMAD::FULL_DISPLAY ) + { + std::ostringstream oss; + oss << "Quad model optimization for prospect point"; + out << std::endl << NOMAD::open_block ( oss.str() ); + } + + // parameters creation: + NOMAD::Parameters model_param ( out ); + + // number of variables: + model_param.set_DIMENSION ( n ); + + // blackbox outputs: + model_param.set_BB_OUTPUT_TYPE ( bbot ); + + // barrier parameters: + model_param.set_H_MIN ( _p.get_h_min () ); + model_param.set_H_NORM ( _p.get_h_norm() ); + + // starting points: + model_param.set_X0 ( NOMAD::Point ( n , 500.0 ) ); + + // fixed variables: + for ( i = 0 ; i < n ; ++i ) + if ( model.variable_is_fixed(i) || _p.variable_is_fixed(i) ) + model_param.set_FIXED_VARIABLE(i); + + // no model search and no model ordering: + model_param.set_MODEL_SEARCH ( false ); + model_param.set_MODEL_EVAL_SORT ( false ); + model_param.set_DIRECTION_TYPE (NOMAD::ORTHO_2N); // use 2N for model search rather than the default Ortho n+1 + + // display: + model_param.set_DISPLAY_DEGREE ( NOMAD::NO_DISPLAY ); + + // mesh: use isotropic mesh + model_param.set_ANISOTROPIC_MESH ( false ); + model_param.set_MESH_UPDATE_BASIS ( 4.0 ); + model_param.set_MESH_COARSENING_EXPONENT ( 1 ); + model_param.set_MESH_REFINING_EXPONENT ( -1 ); + model_param.set_INITIAL_MESH_INDEX ( 0 ); + model_param.set_INITIAL_MESH_SIZE ( NOMAD::Point ( n , 100.0 ) ); + + // maximum number of evaluations: + model_param.set_MAX_BB_EVAL ( 50000 ); + + model_param.set_SNAP_TO_BOUNDS ( true ); + + // disable user calls: + model_param.set_USER_CALLS_ENABLED ( false ); + + // set flags: + bool flag_check_bimads , flag_reset_mesh , flag_reset_barriers , flag_p1_active; + NOMAD::Mads::get_flags ( flag_check_bimads , + flag_reset_mesh , + flag_reset_barriers , + flag_p1_active ); + + NOMAD::Mads::set_flag_check_bimads (false ); + NOMAD::Mads::set_flag_reset_mesh ( true ); + NOMAD::Mads::set_flag_reset_barriers ( true ); + NOMAD::Mads::set_flag_p1_active ( false ); + + // bounds to optimize away from n first direction + // Bound are consistent with model evaluator: x in [0;1000] for optimziation -> x in [-1;1] for model evaluation + NOMAD::Point lb ( n , 0.0 ); + NOMAD::Point ub ( n , 1000.0 ); + model_param.set_LOWER_BOUND ( lb ); + model_param.set_UPPER_BOUND ( ub ); + + try + { + + // parameters validation: + model_param.check(); - NOMAD::Phase_One_Evaluator * p1ev=NULL; - if ( model_param.get_nb_obj() >= 2 && ! flag_check_bimads ) - { - p1ev = new NOMAD::Phase_One_Evaluator ( model_param , *ev ); - mads.get_evaluator_control().set_evaluator ( p1ev ); - } - NOMAD::stop_type st = mads.run(); - - - delete ev; - if (p1ev) - delete p1ev; - - // reset flags: - NOMAD::Mads::set_flag_check_bimads ( flag_check_bimads ); - NOMAD::Mads::set_flag_reset_mesh ( flag_reset_mesh ); - NOMAD::Mads::set_flag_reset_barriers ( flag_reset_barriers ); - NOMAD::Mads::set_flag_p1_active ( flag_p1_active ); - - // check the stopping criterion: - if ( st == NOMAD::CTRL_C || st == NOMAD::MAX_CACHE_MEMORY_REACHED ) { - std::ostringstream oss; - oss << "quad model optimization for prospect point: " << st; - error_str = oss.str(); - error = true; - } - - // display solution: - if ( _p.get_display_degree() == NOMAD::FULL_DISPLAY ) - { - NOMAD::Display out_tmp = out; - out_tmp.set_degrees ( NOMAD::NORMAL_DISPLAY ); - out_tmp.open_block("Optimization results"); - mads.display ( out_tmp ); - } - - // get the solution(s): - const NOMAD::Eval_Point * best_feas = mads.get_best_feasible (); - const NOMAD::Eval_Point * best_infeas = mads.get_best_infeasible(); - - - if ( best_infeas ) - { - prospect_point = *best_infeas; - prospect_point *= 0.001; - model.unscale ( prospect_point ); - - if ( _p.get_display_degree() == NOMAD::FULL_DISPLAY ) - { - out << "best infeasible point before unscaling: ( "; - prospect_point.NOMAD::Point::display ( out ); - out << " )" << std::endl; - } - - - } - else if ( _p.get_display_degree() == NOMAD::FULL_DISPLAY ) - out << "no infeasible solution" << std::endl; - - - if ( best_feas ) - { - prospect_point = *best_feas; - prospect_point *= 0.001; - model.unscale ( prospect_point ); - if ( _p.get_display_degree() == NOMAD::FULL_DISPLAY ) - { - out << "best feasible point after unscaling : ( "; - prospect_point.NOMAD::Point::display ( out ); - out << " )" << std::endl; - } - - } - else if ( _p.get_display_degree() == NOMAD::FULL_DISPLAY ) - out << "no feasible solution" << std::endl; - - - if ( !prospect_point.is_defined() ) - { - error = true; - error_str = "optimization error: no solution"; - } - else - error=false; - } - catch ( std::exception & e ) - { - error = true; - error_str = std::string ( "optimization error: " ) + e.what(); - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , error_str ); - } - } - } - } - - // update the stats: - _stats.update_model_stats ( tmp_stats ); - - if ( _p.get_display_degree() == NOMAD::FULL_DISPLAY ) - { - out << std::endl << "Prospect point. from quad. model: "; - if ( !error) - out << "( " << prospect_point << " )" << std::endl; - else - out << "failure" << std::endl; - - out << NOMAD::close_block() << std::endl; - } - + // model evaluator creation: + NOMAD::Evaluator *ev; + if (model_param.get_nb_obj()==2) + ev =new NOMAD::Multi_Obj_Quad_Model_Evaluator( model_param , model ); + else + ev=new NOMAD::Single_Obj_Quad_Model_Evaluator( model_param , model ); + + // algorithm creation and execution: + NOMAD::Mads mads ( model_param , ev ); + + NOMAD::Phase_One_Evaluator * p1ev=NULL; + if ( model_param.get_nb_obj() >= 2 && ! flag_check_bimads ) + { + p1ev = new NOMAD::Phase_One_Evaluator ( model_param , *ev ); + mads.get_evaluator_control().set_evaluator ( p1ev ); + } + NOMAD::stop_type st = mads.run(); + + + delete ev; + if (p1ev) + delete p1ev; + + // reset flags: + NOMAD::Mads::set_flag_check_bimads ( flag_check_bimads ); + NOMAD::Mads::set_flag_reset_mesh ( flag_reset_mesh ); + NOMAD::Mads::set_flag_reset_barriers ( flag_reset_barriers ); + NOMAD::Mads::set_flag_p1_active ( flag_p1_active ); + + + // check the stopping criterion: + if ( st == NOMAD::CTRL_C || st == NOMAD::MAX_CACHE_MEMORY_REACHED ) + { + std::ostringstream oss; + oss << "quad model optimization for prospect point: " << st; + error_str = oss.str(); + error = true; + } + + // display solution: + if ( _p.get_display_degree() == NOMAD::FULL_DISPLAY ) + { + NOMAD::Display out_tmp = out; + out_tmp.set_degrees ( NOMAD::NORMAL_DISPLAY ); + out_tmp.open_block("Optimization results"); + mads.display ( out_tmp ); + } + + // get the solution(s): + const NOMAD::Eval_Point * best_feas = mads.get_best_feasible (); + const NOMAD::Eval_Point * best_infeas = mads.get_best_infeasible(); + + + if ( best_infeas ) + { + prospect_point = *best_infeas; + prospect_point *= 0.001; + model.unscale ( prospect_point ); + + if ( _p.get_display_degree() == NOMAD::FULL_DISPLAY ) + { + out << "best infeasible point before unscaling: ( "; + prospect_point.NOMAD::Point::display ( out ); + out << " )" << std::endl; + } + + + } + else if ( _p.get_display_degree() == NOMAD::FULL_DISPLAY ) + out << "no infeasible solution" << std::endl; + + + if ( best_feas ) + { + prospect_point = *best_feas; + prospect_point *= 0.001; + model.unscale ( prospect_point ); + if ( _p.get_display_degree() == NOMAD::FULL_DISPLAY ) + { + out << "best feasible point after unscaling : ( "; + prospect_point.NOMAD::Point::display ( out ); + out << " )" << std::endl; + } + + } + else if ( _p.get_display_degree() == NOMAD::FULL_DISPLAY ) + out << "no feasible solution" << std::endl; + + + if ( !prospect_point.is_defined() ) + { + error = true; + error_str = "optimization error: no solution"; + } + else + error=false; + } + catch ( std::exception & e ) + { + error = true; + error_str = std::string ( "optimization error: " ) + e.what(); + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , error_str ); + } + } + } + } + + // update the stats: + _stats.update_model_stats ( tmp_stats ); + + if ( _p.get_display_degree() == NOMAD::FULL_DISPLAY ) + { + out << std::endl << "Prospect point. from quad. model: "; + if ( !error) + out << "( " << prospect_point << " )" << std::endl; + else + out << "failure" << std::endl; + + out << NOMAD::close_block() << std::endl; + } + #ifdef DEBUG - out << NOMAD::close_block() << std::endl; + out << NOMAD::close_block() << std::endl; #endif - - return !error; + + return !error; } @@ -2402,96 +2389,212 @@ bool NOMAD::Mads::optimize_quad_model ( const NOMAD::Eval_Point & poll /* set the poll directions based on signatures (private) */ /*----------------------------------------------------------------*/ void NOMAD::Mads::set_poll_directions ( std::list<NOMAD::Direction> & dirs , - NOMAD::poll_type i_pc , + NOMAD::poll_type i_pc , size_t offset , - const NOMAD::Eval_Point & poll_center , - bool & stop , - NOMAD::stop_type & stop_reason ) + const NOMAD::Eval_Point & poll_center , + bool & stop , + NOMAD::stop_type & stop_reason ) { - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_poll_dd(); - - std::list<NOMAD::Direction>::const_iterator it , end; - - if ( display_degree == NOMAD::FULL_DISPLAY ) - { - if ( i_pc == NOMAD::SECONDARY ) - out << "secondary "; - out << "poll center: ( "; - poll_center.Point::display ( out, " ", 2, NOMAD::Point::get_display_limit() ); - out << " )" << std::endl; - } - - // get the poll center's signature: - NOMAD::Signature * cur_signature = poll_center.get_signature(); - - if ( !cur_signature ) - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , - "Mads::poll(): could not get the poll center's signature" ); - - int n = cur_signature->get_n(); - - if ( n != poll_center.size() ) - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , - "Mads::poll(): the poll center has an incompatible signature" ); - - // get directions from the signature: - cur_signature->get_directions ( dirs , - i_pc , - poll_center ); + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_poll_dd(); - - - size_t k = 0; + std::list<NOMAD::Direction>::const_iterator it , end; + + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + if ( i_pc == NOMAD::SECONDARY ) + out << "secondary "; + out << "poll center: ( "; + poll_center.Point::display ( out, " ", 2, NOMAD::Point::get_display_limit() ); + out << " )" << std::endl; + } + + // get the poll center's signature: + NOMAD::Signature * cur_signature = poll_center.get_signature(); + + if ( !cur_signature ) + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , + "Mads::set_poll_directions(): could not get the poll center's signature" ); + + int n = cur_signature->get_n(); + + if ( n != poll_center.size() ) + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , + "Mads::set_poll_directions(): the poll center has an incompatible signature" ); + + + // get directions from the signature: + cur_signature->get_directions ( dirs , + i_pc , + poll_center ); + + size_t k = 0; for ( it = dirs.begin() ; it != dirs.end() ; ++it, ++k ) - it->set_index ( static_cast<int>(offset + k) ); + it->set_index ( static_cast<int>(offset + k) ); + + + if ( !stop && dirs.empty() ) + { + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << "Mads::set_poll_directions(): could not get directions: stop" + << std::endl << NOMAD::close_block() << std::endl; + stop = true; + stop_reason = NOMAD::MESH_PREC_REACHED; + return; + + } + + + // displays: + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + end = dirs.end(); + + int nb_dirs = static_cast<int>(dirs.size()); + + out << std::endl + << NOMAD::open_block ( "poll directions (include mesh size parameter)" ); + for ( it = dirs.begin() ; it != end ; ++it ) + { + out << "dir "; + out.display_int_w ( (*it).get_index() , nb_dirs ); + out << " : " << *it << std::endl; + } + out.close_block(); + } +} - - if ( !stop && dirs.empty() ) - { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "Mads::poll(): could not get directions: stop" - << std::endl << NOMAD::close_block() << std::endl; - stop = true; - stop_reason = NOMAD::MESH_PREC_REACHED; - return; - - } - - - // displays: - if ( display_degree == NOMAD::FULL_DISPLAY ) - { - end = dirs.end(); - - int nb_dirs = static_cast<int>(dirs.size()); - - out << std::endl - << NOMAD::open_block ( "poll directions (include mesh size parameter)" ); - for ( it = dirs.begin() ; it != end ; ++it ) - { - out << "dir "; - out.display_int_w ( (*it).get_index() , nb_dirs ); - out << " : " << *it << std::endl; - } - out.close_block(); - } +/*----------------------------------------------------------------*/ +/* set the poll intensification points (private) */ +/*----------------------------------------------------------------*/ +void NOMAD::Mads::set_poll_intensification_points ( const NOMAD::Eval_Point & poll_center , + size_t & offset , + bool & stop , + NOMAD::stop_type & stop_reason ) +{ + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_poll_dd(); + + std::list<NOMAD::Direction>::const_iterator it , end; + + + // get the poll center's signature: + NOMAD::Signature * cur_signature = poll_center.get_signature(); + + if ( !cur_signature ) + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , + "Mads::set_poll_intensification_points(): could not get the poll center's signature" ); + + int n = cur_signature->get_n(); + + if ( n != poll_center.size() ) + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , + "Mads::set_poll_intensification_points(): the poll center has an incompatible signature" ); + + // Number of eval points already submitted for polling + int n_eval_sub = _ev_control.get_nb_eval_points(); + + // Number of extra intensification points + int n_max_size_poll_set = cur_signature->get_max_size_poll_set(); + int n_eval_tot = std::min( n_max_size_poll_set , _p.get_max_eval_intensification() ); + int n_extra = n_eval_tot - n_eval_sub ; + + if ( display_degree == NOMAD::FULL_DISPLAY && n_extra > 0 ) + { + out << std::endl << NOMAD::open_block ( "Poll intensification: " )<< std::endl; + + if ( n_extra == n_max_size_poll_set ) + out << "reduced to max size of poll set"<< std::endl; + out << "target number of poll points: " << n_extra << std::endl; + } + if ( display_degree == NOMAD::FULL_DISPLAY && n_extra <= 0 ) + { + out << std::endl << NOMAD::open_block ( "No poll intensification" )<< std::endl; + out << close_block(); + } + + if ( n_extra <= 0 ) + return; + + + // Loop for adding extra points + size_t k = offset; + int n_tries = 0; + int n_eval_cur = _ev_control.get_nb_eval_points(); + while ( n_eval_cur < n_eval_tot && n_tries < 2 * n_extra ) + { + + NOMAD::Direction dir( n, 0.0, NOMAD::UNDEFINED_DIRECTION ); + std::list<NOMAD::Direction> dirs; + + n_tries++; + + // get a direction for a randomly selected variable group + cur_signature->get_variable_group_direction ( dir, poll_center ); + + if ( dir.is_complete() ) + { + dir.set_type( NOMAD::ORTHO_1 ); + dir.set_index ( static_cast<int>(k++) ); + + offset++; + + dirs.push_back(dir); + } + + + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + if ( ! dir.is_defined() ) + out << "dir "<<k-1<<" : null" << std::endl ; + else + out << "dir "<<k-1<<" : " << dir << std::endl; + } + + if ( dirs.size() !=0 ) + set_poll_trial_points( dirs, offset, poll_center, stop, stop_reason, false ); + + int n_eval_tmp = _ev_control.get_nb_eval_points(); + + if ( n_eval_cur == n_eval_tmp ) + { + k--; + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << "reinsert a point"<< std::endl; + } + else + n_eval_cur = n_eval_tmp; + } + + if ( _ev_control.get_nb_eval_points() < n_eval_tot ) + out << " cannot reached the target number of points" <<std::endl; + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out.close_block(); + + // Failed intensification cannot stop algo. Force the stop to be false. + stop = false; + stop_reason = NOMAD::NO_STOP; + + + } -/*----------------------------------------------------------------------------------*/ -/* check if a set of directions includes one Ortho-MADS N+1 direction (private) */ -/* (true if at least one direction in the set is of type Ortho-MADS N+1) */ -/*----------------------------------------------------------------------------------*/ -bool NOMAD::Mads::dirs_have_orthomads_np1( const std::list<NOMAD::Direction> & dirs) + +/*------------------------------------------------------------------------------------------*/ +/* check if a set of directions includes one Ortho-MADS N+1 dynamic direction (private) */ +/* (true if at least one direction in the set is of type Ortho-MADS N+1) */ +/*------------------------------------------------------------------------------------------*/ +bool NOMAD::Mads::dirs_have_orthomads_np1_dyn( const std::list<NOMAD::Direction> & dirs) { - std::list<NOMAD::Direction>::const_iterator it , end = dirs.end(); - for ( it = dirs.begin() ; it != end ; ++it ) - if ( (*it).get_type()==NOMAD::ORTHO_NP1_QUAD || - (*it).get_type()==NOMAD::ORTHO_NP1_NEG) - return true; - return false; + std::list<NOMAD::Direction>::const_iterator it , end = dirs.end(); + for ( it = dirs.begin() ; it != end ; ++it ) + if ( (*it).get_type()==NOMAD::ORTHO_NP1_QUAD || + (*it).get_type()==NOMAD::ORTHO_NP1_NEG) + return true; + return false; } @@ -2501,11 +2604,11 @@ bool NOMAD::Mads::dirs_have_orthomads_np1( const std::list<NOMAD::Direction> & d /*-------------------------------------------------------------------------*/ bool NOMAD::Mads::dir_from_model_opt( const std::list<NOMAD::Direction> & dirs) { - std::list<NOMAD::Direction>::const_iterator it , end = dirs.end(); - for ( it = dirs.begin() ; it != end ; ++it ) - if ( (*it).get_type()!=NOMAD::ORTHO_NP1_QUAD ) - return false; - return true; + std::list<NOMAD::Direction>::const_iterator it , end = dirs.end(); + for ( it = dirs.begin() ; it != end ; ++it ) + if ( (*it).get_type()!=NOMAD::ORTHO_NP1_QUAD ) + return false; + return true; } @@ -2514,274 +2617,280 @@ bool NOMAD::Mads::dir_from_model_opt( const std::list<NOMAD::Direction> & dirs) /* set the poll trial points based on poll directions (private) */ /*----------------------------------------------------------------*/ void NOMAD::Mads::set_poll_trial_points (std::list<NOMAD::Direction> &dirs, - size_t offset, - const NOMAD::Eval_Point & poll_center, - bool & stop, - NOMAD::stop_type &stop_reason, - bool sorting) + size_t offset, + const NOMAD::Eval_Point & poll_center, + bool & stop, + NOMAD::stop_type &stop_reason, + bool sorting) { - NOMAD::Signature * cur_signature=poll_center.get_signature(); - NOMAD::poll_center_type pc_type=( poll_center.is_feasible ( _p.get_h_min() ) ) ? NOMAD::FEASIBLE : NOMAD::INFEASIBLE; - - int n = cur_signature->get_n(); - int m = _p.get_bb_nb_outputs(); - const std::vector<NOMAD::bb_input_type> & bbit = _p.get_bb_input_type(); - - std::list<NOMAD::Direction>::const_iterator it; - - const NOMAD::Direction * dir; - NOMAD::Eval_Point * pt; - - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_poll_dd(); - - int k=0; - for ( it = dirs.begin() ; it != dirs.end() ; ++it ) - { - dir = &(*it); - pt = new NOMAD::Eval_Point ( n , m ); - - // pt = poll_center + dir: with a particular case for binary variables - // equal to 1 with dir=1: the variables are set to 0 (1+1=0 in binary): - for (int i = 0 ; i < n ; ++i ) - (*pt)[i] = ( bbit[i]==NOMAD::BINARY && (*dir)[i]==1.0 && (poll_center)[i]==1.0 ) ? 0.0 : (*pt)[i] = (poll_center)[i] + (*dir)[i]; - - + + NOMAD::Signature * cur_signature=poll_center.get_signature(); + NOMAD::poll_center_type pc_type=( poll_center.is_feasible ( _p.get_h_min() ) ) ? NOMAD::FEASIBLE : NOMAD::INFEASIBLE; + + int n = cur_signature->get_n(); + int m = _p.get_bb_nb_outputs(); + const std::vector<NOMAD::bb_input_type> & bbit = _p.get_bb_input_type(); + + std::list<NOMAD::Direction>::const_iterator it; + + const NOMAD::Direction * dir; + NOMAD::Eval_Point * pt; + + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_poll_dd(); + + int k=0; + for ( it = dirs.begin() ; it != dirs.end() ; ++it ) + { + dir = &(*it); + pt = new NOMAD::Eval_Point ( n , m ); + + // pt = poll_center + dir: with a particular case for binary variables + // equal to 1 with dir=1: the variables are set to 0 (1+1=0 in binary): + for (int i = 0 ; i < n ; ++i ) + (*pt)[i] = ( bbit[i]==NOMAD::BINARY && (*dir)[i]==1.0 && (poll_center)[i]==1.0 ) ? 0.0 : (*pt)[i] = (poll_center)[i] + (*dir)[i]; + if ( pt->Point::operator == ( poll_center ) ) - delete pt; + delete pt; else { - pt->set_signature ( cur_signature ); - pt->set_direction ( dir ); - pt->set_poll_center_type ( pc_type ); - pt->set_poll_center ( &poll_center ); - - // random direction? - if ( NOMAD::dir_is_random ( dir->get_type() ) ) - { - int nb_dirs = static_cast<int>(dirs.size()); - NOMAD::Random_Pickup rp ( nb_dirs ); - pt->set_rand_eval_priority ( rp.pickup() ); - } - - if (!sorting) - _ev_control.add_eval_point ( pt , - display_degree , - _p.get_snap_to_bounds() , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() ); - else - { - _ev_control_for_sorting.add_eval_point ( pt , - display_degree , - _p.get_snap_to_bounds() , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() ); - } - - ++k; - } - } - + pt->set_signature ( cur_signature ); + pt->set_direction ( dir ); + pt->set_poll_center_type ( pc_type ); + pt->set_poll_center ( &poll_center ); + + // random direction? + if ( NOMAD::dir_is_random ( dir->get_type() ) ) + { + int nb_dirs = static_cast<int>(dirs.size()); + NOMAD::Random_Pickup rp ( nb_dirs ); + pt->set_rand_eval_priority ( rp.pickup() ); + } + + if ( !sorting ) + _ev_control.add_eval_point ( pt , + display_degree , + _p.get_snap_to_bounds() , + NOMAD::Double() , + NOMAD::Double() , + NOMAD::Double() , + NOMAD::Double() ); + else + { + _ev_control_for_sorting.add_eval_point ( pt , + display_degree , + _p.get_snap_to_bounds() , + NOMAD::Double() , + NOMAD::Double() , + NOMAD::Double() , + NOMAD::Double() ); + } + + ++k; + } + } + if ( k==0 ) { if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "Mads::poll(): could not generate poll trial points: stop" - << std::endl << NOMAD::close_block() << std::endl; + out << "Mads::set_poll_trial_points(): could not generate poll trial points" << std::endl; // << NOMAD::close_block() << std::endl; stop = true; stop_reason = NOMAD::MESH_PREC_REACHED; } - - - return; + + + return; } /*-------------------------------------------------------------*/ -/* compute the poll directions dynamically (private) */ +/* compute the poll directions dynamically (private) */ /*-------------------------------------------------------------*/ -bool NOMAD::Mads::get_dynamic_directions (const std::list<NOMAD::Direction> & dirs, - std::list<NOMAD::Direction> & newDirs, - const NOMAD::Eval_Point & poll_center ) +bool NOMAD::Mads::get_dynamic_directions (const std::list<NOMAD::Direction> & dirs , + std::list<NOMAD::Direction> & newDirs , + const NOMAD::Eval_Point & poll_center ) { - - const NOMAD::Signature * cur_signature=poll_center.get_signature(); - size_t n = cur_signature->get_n()-cur_signature->get_nb_fixed_variables(); - size_t n_cat = cur_signature->get_n_categorical(); - - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_poll_dd(); - - // Dynamic completion only if sufficient directions provided: (n-n_cat)->(n-n_cat)+1 - if ( dirs.size() < n-n_cat ) - return false; - - - // Get the maximum number of direction groups - std::list<NOMAD::Direction>::const_iterator itDir; - int maxDirGroupIndex=0; - int dgi; - for (itDir=dirs.begin();itDir!=dirs.end() ; ++itDir) - { - dgi=(*itDir).get_dir_group_index(); - if (dgi>maxDirGroupIndex) + + const NOMAD::Signature * cur_signature=poll_center.get_signature(); + + // get the number of free variables using the signature (because of extended poll and changing signature) + size_t n = cur_signature->get_n()-cur_signature->get_nb_fixed_variables(); + size_t n_cat = cur_signature->get_n_categorical(); + + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_poll_dd(); + + // Dynamic completion only if sufficient directions provided: (n-n_cat)->(n-n_cat)+1 + if ( dirs.size() < n-n_cat ) + return false; + + + // Get the maximum number of direction groups + std::list<NOMAD::Direction>::const_iterator itDir; + int maxDirGroupIndex=0; + int dgi; + for (itDir=dirs.begin();itDir!=dirs.end() ; ++itDir) + { + dgi=(*itDir).get_dir_group_index(); + if (dgi>maxDirGroupIndex) maxDirGroupIndex=dgi; - } - - // Loop on each direction group to obtain a new direction - for (dgi=0;dgi<=maxDirGroupIndex;++dgi) - { - int maxIndex=0; - - // 1 - Search directions having the same direction group index - std::list<NOMAD::Direction> rDirs; - std::list<NOMAD::Double>::iterator it_fv; - for (itDir=dirs.begin();itDir!=dirs.end() ; ++itDir) - { - if ((*itDir).get_index()>maxIndex) - maxIndex=(*itDir).get_index(); - if ((*itDir).get_dir_group_index()==dgi) - rDirs.push_back(*itDir); - } - - // 2 - add a dynamic direction from a quad model optimization or sum of direction negatives - NOMAD::Direction dyn_dir=get_single_dynamic_direction(rDirs,poll_center); - if ( dyn_dir.get_type()==NOMAD::DYN_ADDED ) - { - dyn_dir.set_index(maxIndex+1); - newDirs.push_back(dyn_dir); - } - } - - if ( display_degree == NOMAD::FULL_DISPLAY ) + } + + // Loop on each direction group to obtain a new direction + for (dgi=0;dgi<=maxDirGroupIndex;++dgi) + { + int maxIndex=0; + + // 1 - Search directions having the same direction group index + std::list<NOMAD::Direction> rDirs; + std::list<NOMAD::Double>::iterator it_fv; + for (itDir=dirs.begin();itDir!=dirs.end() ; ++itDir) + { + if ( (*itDir).get_index()>maxIndex ) + maxIndex=(*itDir).get_index(); + if ( (*itDir).get_dir_group_index()==dgi ) + rDirs.push_back(*itDir); + } + + // 2 - add a dynamic direction from a quad model optimization or sum of direction negatives + NOMAD::Direction dyn_dir=get_single_dynamic_direction( rDirs , poll_center ); + if ( dyn_dir.get_type()==NOMAD::DYN_ADDED ) + { + dyn_dir.set_index(maxIndex+1); + newDirs.push_back(dyn_dir); + } + } + + if ( display_degree == NOMAD::FULL_DISPLAY ) { out << std::endl; if ( newDirs.size()!= 0 ) out << NOMAD::open_block ( "Added (n+1)th poll direction(s) (include mesh size parameter)" ); else out << NOMAD::open_block ( "Cannot generate a (n+1)th poll direction" ); - - for ( itDir = newDirs.begin() ; itDir != newDirs.end() ; ++itDir ) + + for ( itDir = newDirs.begin() ; itDir != newDirs.end() ; ++itDir ) { - out << "dir "; - out.display_int_w ( (*itDir).get_index() , static_cast<int>(newDirs.size()) ); - out << " : " << *itDir << std::endl; - } - out.close_block(); - out << std::endl; - - } + out << "dir "; + out.display_int_w ( (*itDir).get_index() , static_cast<int>(newDirs.size()) ); + out << " : " << *itDir << std::endl; + } + out.close_block(); + out << std::endl; + + } if ( newDirs.size()==0 ) return false; - - - return true; + + + return true; } /*------------------------------------------------------------------------------*/ -/* get a single dynamic direction from incomplete poll */ -/* directions by optimization of a quad model or sum of negative (private) */ +/* get a single dynamic direction from incomplete poll */ +/* directions by optimization of a quad model or sum of negative (private) */ /*------------------------------------------------------------------------------*/ /* The new direction calculation is described in paper from */ /* Audet, Ianni, Le Digabel and Tribes : Reducing the number of */ /* function evaluations in Mesh Adaptive Direct Search Algorithms*/ /*----------------------------------------------------------------*/ -NOMAD::Direction NOMAD::Mads::get_single_dynamic_direction (const std::list<NOMAD::Direction> & dirs, - const NOMAD::Eval_Point & poll_center) +NOMAD::Direction NOMAD::Mads::get_single_dynamic_direction (const std::list<NOMAD::Direction> & dirs, + const NOMAD::Eval_Point & poll_center) { - const NOMAD::Signature * cur_signature=poll_center.get_signature(); - int n=cur_signature->get_n(); - - NOMAD::Direction Vb1( n , 0.0 ,NOMAD::UNDEFINED_DIRECTION); - - - std::vector<NOMAD::Double> alpha; - NOMAD::Double f_pc=(poll_center.is_feasible(_p.get_h_min())) ? poll_center.get_f():poll_center.get_h(); - NOMAD::Double lambda=0; - std::list<NOMAD::Direction>::const_iterator itDir; - - // -sum(d^i) - for (itDir=dirs.begin();itDir!=dirs.end();++itDir) - { - for (int i=0; i<n; i++) - { - Vb1[i]-=(*itDir)[i].value(); - } - } - - // New direction - int dirGroupIndex=(*dirs.begin()).get_dir_group_index(); - NOMAD::Direction V( n , 0.0 ,NOMAD::DYN_ADDED,dirGroupIndex); - - // New direction obtained by quad model optimization or negative sum of directions - NOMAD::Point prospect_point; - bool success=false; - if (dir_from_model_opt(dirs)) - success=optimize_quad_model(poll_center,dirs,prospect_point); - for (int i=0; i<n; i++) - { - if (success) - V[i]=prospect_point[i].value()-poll_center[i].value(); - else - V[i]=Vb1[i]; // use -sum(d^i) if model optimization unsucessfull or no dynamic direction requested - } - - // Update the new directions depending on the input_types - const std::vector<NOMAD::bb_input_type> & input_types=cur_signature->get_input_types(); - - NOMAD::Point delta,Delta; - _mesh->get_delta ( delta ); - _mesh->get_Delta ( Delta ); - bool isZero=true; - for (int i=0; i<n; ++i) - { - NOMAD::Double v=V[i].value(),vb1=Vb1[i].value(),dm=delta[i].value(),dp=Delta[i].value(); - - // Continous variables ---> rounding towards mesh node. - if (input_types[i]==NOMAD::CONTINUOUS) - { - if ((vb1/dm).round()>=(v/dm).round()) - V[i] = (v/dm).ceil()*dm; - else - V[i] = (v/dm).floor()*dm; - } - // Integer variables: - else if ( input_types[i] == NOMAD::INTEGER ) - { - if ( v >= dp/3.0 ) - V[i] = v.ceil(); - else if ( v <= -dp/3.0 ) - V[i] = v.floor(); - else - V[i] = v.round(); - } - // binary variables: - else if ( input_types[i] == NOMAD::BINARY ) - { - if ( v != 0.0 ) V[i] = 1.0; - } - // categorical variables: set direction=0: - else if ( input_types[i] == NOMAD::CATEGORICAL ) - V[i] = 0.0; - - if (V[i]!=0) - isZero=false; - } - - if (isZero) - { - NOMAD::Direction Vzero( n , 0.0 ,NOMAD::UNDEFINED_DIRECTION); - return Vzero; - } - else - return V; + const NOMAD::Signature * cur_signature=poll_center.get_signature(); + int n=cur_signature->get_n(); + + NOMAD::Direction Vb1( n , 0.0 ,NOMAD::UNDEFINED_DIRECTION); + + + std::vector<NOMAD::Double> alpha; + NOMAD::Double f_pc=(poll_center.is_feasible(_p.get_h_min())) ? poll_center.get_f():poll_center.get_h(); + NOMAD::Double lambda=0; + std::list<NOMAD::Direction>::const_iterator itDir; + + // -sum(d^i) + for (itDir=dirs.begin();itDir!=dirs.end();++itDir) + { + for (int i=0; i<n; i++) + { + Vb1[i]-=(*itDir)[i].value(); + } + } + + // New direction + int dirGroupIndex=(*dirs.begin()).get_dir_group_index(); + NOMAD::Direction V( n , 0.0 ,NOMAD::DYN_ADDED,dirGroupIndex); + + // New direction obtained by quad model optimization or negative sum of directions + NOMAD::Point prospect_point; + bool success=false; + if (dir_from_model_opt(dirs)) + success=optimize_quad_model(poll_center,dirs,prospect_point); + for (int i=0; i<n; i++) + { + if (success) + V[i]=prospect_point[i].value()-poll_center[i].value(); + else + V[i]=Vb1[i]; // use -sum(d^i) if model optimization unsucessfull or no dynamic direction requested + } + + // Update the new directions depending on the input_types + const std::vector<NOMAD::bb_input_type> & input_types=cur_signature->get_input_types(); + + NOMAD::Point delta,Delta; + _mesh->get_delta ( delta ); + _mesh->get_Delta ( Delta ); + bool isZero=true; + for (int i=0; i<n; ++i) + { + NOMAD::Double v=V[i].value(),vb1=Vb1[i].value(),dm=delta[i].value(),dp=Delta[i].value(); + + // Continous variables ---> rounding towards mesh node. + if (input_types[i]==NOMAD::CONTINUOUS) + { + NOMAD::Double d1 = vb1/dm; + NOMAD::Double d2 = v/dm; + NOMAD::Double r1 = ( d1 < 0.0 ? -std::floor(.5-d1.value()) : std::floor(.5+d1.value() ) ); + NOMAD::Double r2 = ( d2 < 0.0 ? -std::floor(.5-d2.value()) : std::floor(.5+d2.value() ) ); + if ( r1 >= r2 ) + V[i] = (v/dm).ceil()*dm; + else + V[i] = (v/dm).floor()*dm; + } + // Integer variables: + else if ( input_types[i] == NOMAD::INTEGER ) + { + if ( v >= dp/3.0 ) + V[i] = v.ceil(); + else if ( v <= -dp/3.0 ) + V[i] = v.floor(); + else + V[i] = v.round(); + } + // binary variables: + else if ( input_types[i] == NOMAD::BINARY ) + { + if ( v != 0.0 ) + V[i] = 1.0; + } + // categorical variables: set direction=0: + else if ( input_types[i] == NOMAD::CATEGORICAL ) + V[i] = 0.0; + + if ( V[i]!=0 ) + isZero=false; + } + + if (isZero ) + { + NOMAD::Direction Vzero( n , 0.0 ,NOMAD::UNDEFINED_DIRECTION); + return Vzero; + } + else + return V; } @@ -2793,55 +2902,55 @@ NOMAD::Direction NOMAD::Mads::get_single_dynamic_direction (const std::list<NOMA /*----------------------------------------------------------------*/ void NOMAD::Mads::check_directions ( bool & forbid_poll_size_stop ) { - if ( !_p.get_min_poll_size_defined() ) - { - - NOMAD::Double v , min; - const NOMAD::Point * dir; - int i , n; - - const NOMAD::Signature * signature; - - const std::set<NOMAD::Priority_Eval_Point> & poll_pts = _ev_control.get_eval_lop(); - std::set<NOMAD::Priority_Eval_Point>::const_iterator end = poll_pts.end() , it; - for ( it = poll_pts.begin() ; it != end ; ++it ) - { - - signature = it->get_point()->get_signature(); - - if ( signature ) + if ( !_p.get_min_poll_size_defined() ) + { + + NOMAD::Double v , min; + const NOMAD::Point * dir; + int i , n; + + const NOMAD::Signature * signature; + + const std::set<NOMAD::Priority_Eval_Point> & poll_pts = _ev_control.get_eval_lop(); + std::set<NOMAD::Priority_Eval_Point>::const_iterator end = poll_pts.end() , it; + for ( it = poll_pts.begin() ; it != end ; ++it ) + { + + signature = it->get_point()->get_signature(); + + if ( signature ) { - - dir = it->get_point()->get_direction(); - - if ( dir ) + + dir = it->get_point()->get_direction(); + + if ( dir ) { - - n = dir->size(); - - if ( n == signature->get_n() ) + + n = dir->size(); + + if ( n == signature->get_n() ) { - - const std::vector<NOMAD::bb_input_type> & bbit - = signature->get_input_types(); - - for ( i = 0 ; i < n ; ++i ) + + const std::vector<NOMAD::bb_input_type> & bbit + = signature->get_input_types(); + + for ( i = 0 ; i < n ; ++i ) { - if ( bbit[i] == NOMAD::INTEGER ) + if ( bbit[i] == NOMAD::INTEGER ) { - v = (*dir)[i].abs(); - if ( v.is_defined() && v > 0.0 && ( !min.is_defined() || v < min ) ) - min = v; - } - } - } - } - } - } - - if ( min.is_defined() && min > 1.0 ) - forbid_poll_size_stop = true; - } + v = (*dir)[i].abs(); + if ( v.is_defined() && v > 0.0 && ( !min.is_defined() || v < min ) ) + min = v; + } + } + } + } + } + } + + if ( min.is_defined() && min > 1.0 ) + forbid_poll_size_stop = true; + } } /*---------------------------------------------------------*/ @@ -2849,25 +2958,25 @@ void NOMAD::Mads::check_directions ( bool & forbid_poll_size_stop ) /* (private) */ /*---------------------------------------------------------*/ void NOMAD::Mads::update_success_directions ( const NOMAD::Eval_Point * new_inc , - bool feasible ) const + bool feasible ) const { - if ( new_inc && new_inc->get_direction() ) - { - - const NOMAD::Direction * dir = new_inc->get_direction(); - NOMAD::Signature * signature = new_inc->get_signature(); - - - if ( !signature ) - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , - "Mads::update_success_directions(): new incumbent has no signature" ); - - if ( feasible ) - new_inc->get_signature()->set_feas_success_dir ( *dir ); - else - new_inc->get_signature()->set_infeas_success_dir ( *dir ); - - } + if ( new_inc && new_inc->get_direction() ) + { + + const NOMAD::Direction * dir = new_inc->get_direction(); + NOMAD::Signature * signature = new_inc->get_signature(); + + + if ( !signature ) + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , + "Mads::update_success_directions(): new incumbent has no signature" ); + + if ( feasible ) + new_inc->get_signature()->set_feas_success_dir ( *dir ); + else + new_inc->get_signature()->set_infeas_success_dir ( *dir ); + + } } @@ -2875,540 +2984,532 @@ void NOMAD::Mads::update_success_directions ( const NOMAD::Eval_Point * /* the search (private) */ /*---------------------------------------------------------*/ void NOMAD::Mads::search ( bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc ) + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc ) { - int nb_search_pts; - bool count_search; - int mads_iteration = _stats.get_iterations(); - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_search_dd(); - NOMAD::success_type last_it_success = success; - success = NOMAD::UNSUCCESSFUL; - - // first display: - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl << NOMAD::open_block ( "MADS search" ); - - // 1. speculative search: - if ( _p.get_speculative_search() ) - { - if ( new_feas_inc || new_infeas_inc ) - { - Speculative_Search ss ( _p ); - - ss.search ( *this , - nb_search_pts , - stop , - stop_reason , - success , - count_search , - new_feas_inc , - new_infeas_inc ); - - if ( success == NOMAD::FULL_SUCCESS ) - _stats.add_spec_success(); - if ( count_search ) - _stats.add_nb_spec_searches(); - _stats.add_spec_pts ( nb_search_pts ); - } - } - - // 2. user search: - if ( success != NOMAD::FULL_SUCCESS && _user_search ) - { - - // initial user search display: - if ( display_degree == NOMAD::FULL_DISPLAY ) - { - std::ostringstream oss; - oss << NOMAD::USER_SEARCH; - out << std::endl << NOMAD::open_block ( oss.str() ) << std::endl; - } - - // the search: - _user_search->search ( *this , - nb_search_pts , - stop , - stop_reason , - success , - count_search , - new_feas_inc , - new_infeas_inc ); - - // update stats: - if ( success == NOMAD::FULL_SUCCESS ) - _stats.add_usr_srch_success(); - if ( count_search ) - _stats.add_nb_usr_searches(); - _stats.add_usr_srch_pts ( nb_search_pts ); - - // final user search display: - if ( display_degree == NOMAD::FULL_DISPLAY ) - { - std::ostringstream oss; - oss << "end of " << NOMAD::USER_SEARCH << " (" << success << ")"; - out << std::endl << NOMAD::close_block ( oss.str() ) << std::endl; - } - } - - // 3. cache search: - if ( success != NOMAD::FULL_SUCCESS && _p.get_cache_search() ) - { - - // the search: - _cache_search->search ( *this , - nb_search_pts , - stop , - stop_reason , - success , - count_search , - new_feas_inc , - new_infeas_inc ); - - // update stats: - if ( success == NOMAD::FULL_SUCCESS ) - _stats.add_CS_success(); - if ( count_search ) - _stats.add_nb_cache_searches(); - _stats.add_CS_pts ( nb_search_pts ); - } - - // 4. Model Searches (stats are updated inside the searches): - if ( success != NOMAD::FULL_SUCCESS && _p.has_model_search() ) - { - + int nb_search_pts; + bool count_search; + int mads_iteration = _stats.get_iterations(); + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_search_dd(); + NOMAD::success_type last_it_success = success; + success = NOMAD::UNSUCCESSFUL; + + // first display: + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl << NOMAD::open_block ( "MADS search" ); + + // 1. speculative search: + if ( _p.get_speculative_search() ) + { + if ( new_feas_inc || new_infeas_inc ) + { + Speculative_Search ss ( _p ); + + ss.search ( *this , + nb_search_pts , + stop , + stop_reason , + success , + count_search , + new_feas_inc , + new_infeas_inc ); + + if ( success == NOMAD::FULL_SUCCESS ) + _stats.add_spec_success(); + if ( count_search ) + _stats.add_nb_spec_searches(); + _stats.add_spec_pts ( nb_search_pts ); + } + } + + // 2. user search: + if ( success != NOMAD::FULL_SUCCESS && _user_search ) + { + + // initial user search display: + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + std::ostringstream oss; + oss << NOMAD::USER_SEARCH; + out << std::endl << NOMAD::open_block ( oss.str() ) << std::endl; + } + + // the search: + _user_search->search ( *this , + nb_search_pts , + stop , + stop_reason , + success , + count_search , + new_feas_inc , + new_infeas_inc ); + + // update stats: + if ( success == NOMAD::FULL_SUCCESS ) + _stats.add_usr_srch_success(); + if ( count_search ) + _stats.add_nb_usr_searches(); + _stats.add_usr_srch_pts ( nb_search_pts ); + + // final user search display: + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + std::ostringstream oss; + oss << "end of " << NOMAD::USER_SEARCH << " (" << success << ")"; + out << std::endl << NOMAD::close_block ( oss.str() ) << std::endl; + } + } + + // 3. cache search: + if ( success != NOMAD::FULL_SUCCESS && _p.get_cache_search() ) + { + + // the search: + _cache_search->search ( *this , + nb_search_pts , + stop , + stop_reason , + success , + count_search , + new_feas_inc , + new_infeas_inc ); + + // update stats: + if ( success == NOMAD::FULL_SUCCESS ) + _stats.add_CS_success(); + if ( count_search ) + _stats.add_nb_cache_searches(); + _stats.add_CS_pts ( nb_search_pts ); + } + + // 4. Model Searches (stats are updated inside the searches): + if ( success != NOMAD::FULL_SUCCESS && _p.has_model_search() ) + { + #ifdef USE_MPI - // asynchronous mode: wait for the evaluations in progress: - if ( _p.get_asynchronous() ) - { - std::list<const NOMAD::Eval_Point *> evaluated_pts; - _ev_control.wait_for_evaluations ( NOMAD::ASYNCHRONOUS , - _true_barrier , - _sgte_barrier , - _pareto_front , - stop , - stop_reason , - success , - evaluated_pts ); - } -#endif - - // model search #1: - _model_search1->search ( *this , - nb_search_pts , - stop , - stop_reason , - success , - count_search , - new_feas_inc , - new_infeas_inc ); - - // save the TGP model for the model ordering: - if ( _p.get_model_search(1) == NOMAD::TGP_MODEL ) - { -#ifdef USE_TGP - _ev_control.set_last_TGP_model - ( static_cast<NOMAD::TGP_Model_Search *>(_model_search1)->get_model() ); + // asynchronous mode: wait for the evaluations in progress: + if ( _p.get_asynchronous() ) + { + std::list<const NOMAD::Eval_Point *> evaluated_pts; + _ev_control.wait_for_evaluations ( NOMAD::ASYNCHRONOUS , + _true_barrier , + _sgte_barrier , + _pareto_front , + stop , + stop_reason , + success , + evaluated_pts ); + } #endif - } - // model search #2: - if ( success != NOMAD::FULL_SUCCESS && _model_search2 ) + + // model search #1: + _model_search1->search ( *this , + nb_search_pts , + stop , + stop_reason , + success , + count_search , + new_feas_inc , + new_infeas_inc ); + + // model search #2: + if ( success != NOMAD::FULL_SUCCESS && _model_search2 ) { - + #ifdef USE_MPI - // asynchronous mode: wait for the evaluations in progress: - if ( _p.get_asynchronous() ) - { - std::list<const NOMAD::Eval_Point *> evaluated_pts; - _ev_control.wait_for_evaluations ( NOMAD::ASYNCHRONOUS , - _true_barrier , - _sgte_barrier , - _pareto_front , - stop , - stop_reason , - success , - evaluated_pts ); - } -#endif - _model_search2->search ( *this , - nb_search_pts , - stop , - stop_reason , - success , - count_search , - new_feas_inc , - new_infeas_inc ); - - // save the TGP model for the model ordering: - if ( _p.get_model_search(2) == NOMAD::TGP_MODEL ) + // asynchronous mode: wait for the evaluations in progress: + if ( _p.get_asynchronous() ) { -#ifdef USE_TGP - _ev_control.set_last_TGP_model - ( static_cast<NOMAD::TGP_Model_Search *>(_model_search2)->get_model() ); + std::list<const NOMAD::Eval_Point *> evaluated_pts; + _ev_control.wait_for_evaluations ( NOMAD::ASYNCHRONOUS , + _true_barrier , + _sgte_barrier , + _pareto_front , + stop , + stop_reason , + success , + evaluated_pts ); + } #endif - } - } - } - - // 5. VNS search: - if ( _p.get_VNS_search() && - success != NOMAD::FULL_SUCCESS && - last_it_success == NOMAD::UNSUCCESSFUL && + _model_search2->search ( *this , + nb_search_pts , + stop , + stop_reason , + success , + count_search , + new_feas_inc , + new_infeas_inc ); + } + } + + // 5. VNS search: + if ( _p.get_VNS_search() && + success != NOMAD::FULL_SUCCESS && + last_it_success == NOMAD::UNSUCCESSFUL && _mesh->is_finer_than_initial() && - _stats.get_iterations() > 0 ) + _stats.get_iterations() > 0 ) { - - // check the VNS_trigger criterion: - int bbe = _stats.get_bb_eval(); - if ( bbe==0 || - _stats.get_VNS_bb_eval() / static_cast<float>(bbe) < _p.get_VNS_trigger() ) + + // check the VNS_trigger criterion: + int bbe = _stats.get_bb_eval(); + if ( bbe==0 || + _stats.get_VNS_bb_eval() / static_cast<float>(bbe) < _p.get_VNS_trigger() ) { - + #ifdef USE_MPI - // asynchronous mode: wait for the evaluations in progress: - if ( _p.get_asynchronous() ) + // asynchronous mode: wait for the evaluations in progress: + if ( _p.get_asynchronous() ) { - std::list<const NOMAD::Eval_Point *> evaluated_pts; - _ev_control.wait_for_evaluations ( NOMAD::ASYNCHRONOUS , - _true_barrier , - _sgte_barrier , - _pareto_front , - stop , - stop_reason , - success , - evaluated_pts ); - } + std::list<const NOMAD::Eval_Point *> evaluated_pts; + _ev_control.wait_for_evaluations ( NOMAD::ASYNCHRONOUS , + _true_barrier , + _sgte_barrier , + _pareto_front , + stop , + stop_reason , + success , + evaluated_pts ); + } #endif - - _VNS_search->search ( *this , - nb_search_pts , - stop , - stop_reason , - success , - count_search , - new_feas_inc , - new_infeas_inc ); - - if ( success == NOMAD::FULL_SUCCESS ) - _stats.add_VNS_success(); - - if ( count_search ) - _stats.add_nb_VNS_searches(); - - _stats.add_VNS_pts ( nb_search_pts ); - } - } - - // 6. Latin-Hypercube (LH) search: - if ( success != NOMAD::FULL_SUCCESS && _p.get_LH_search_pi() > 0 ) - { - - // for the first iteration: do not perform the - // search if there was an initial LH search: - if ( mads_iteration > 0 || _p.get_LH_search_p0() <= 0 ) { - - LH_Search lh ( _p , false , _flag_p1_active ); - - lh.search ( *this , - nb_search_pts , - stop , - stop_reason , - success , - count_search , - new_feas_inc , - new_infeas_inc ); - - if ( success == NOMAD::FULL_SUCCESS ) - _stats.add_LH_success(); - - if ( count_search ) - _stats.add_nb_LH_searches(); - - _stats.add_LH_pts ( nb_search_pts ); - } - } - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << NOMAD::close_block ( "end of search" ); + + _VNS_search->search ( *this , + nb_search_pts , + stop , + stop_reason , + success , + count_search , + new_feas_inc , + new_infeas_inc ); + + if ( success == NOMAD::FULL_SUCCESS ) + _stats.add_VNS_success(); + + if ( count_search ) + _stats.add_nb_VNS_searches(); + + _stats.add_VNS_pts ( nb_search_pts ); + } + } + + // 6. Latin-Hypercube (LH) search: + if ( success != NOMAD::FULL_SUCCESS && _p.get_LH_search_pi() > 0 ) + { + + // for the first iteration: do not perform the + // search if there was an initial LH search: + if ( mads_iteration > 0 || _p.get_LH_search_p0() <= 0 ) + { + + LH_Search lh ( _p , false , _flag_p1_active ); + + lh.search ( *this , + nb_search_pts , + stop , + stop_reason , + success , + count_search , + new_feas_inc , + new_infeas_inc ); + + if ( success == NOMAD::FULL_SUCCESS ) + _stats.add_LH_success(); + + if ( count_search ) + _stats.add_nb_LH_searches(); + + _stats.add_LH_pts ( nb_search_pts ); + } + } + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << NOMAD::close_block ( "end of search" ); } /*---------------------------------------------------------*/ /* x0 eval (private) */ /*---------------------------------------------------------*/ void NOMAD::Mads::eval_x0 ( bool & stop , - NOMAD::stop_type & stop_reason ) + NOMAD::stop_type & stop_reason ) { - const std::vector<NOMAD::Point *> & x0s = _p.get_x0s(); - const std::string & x0_cache_file = _p.get_x0_cache_file(); - if ( x0s.empty() && x0_cache_file.empty() ) - return; - - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_gen_dd(); - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl << NOMAD::open_block ( "starting point evaluation" ); - - NOMAD::Eval_Point * pt; - size_t k; - int m = _p.get_bb_nb_outputs(); - int n = _p.get_dimension(); - std::ostringstream err; - - // x0s from vector Parameters::_x0s: - // --------------------------------- - size_t x0s_size = x0s.size(); - for ( k = 0 ; k < x0s_size ; ++k ) - { - - // the current starting point has to be in dimension n: - if ( x0s[k]->size() != n ) - { - err << "starting point ( " << *x0s[k] << " ) is not of dimension " << n; - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , err.str() ); - } - - // creation of the Eval_Point: - pt = new NOMAD::Eval_Point; - pt->set ( *x0s[k] , m ); - pt->set_signature ( _p.get_signature() ); - - _ev_control.add_eval_point ( pt , - display_degree , - false , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() ); - } - - // x0 from a cache file: - // --------------------- - if ( !x0_cache_file.empty() ) - { - - NOMAD::Cache & cache = _ev_control.get_cache(); - const NOMAD::Eval_Point * x; - - // another cache file (this file won't be modified): - if ( x0_cache_file != _p.get_cache_file() ) - { - - NOMAD::Cache x0_cache ( out , ( _p.get_opt_only_sgte() ) ? NOMAD::SGTE : NOMAD::TRUTH ); - std::string file_name = _p.get_problem_dir() + x0_cache_file; - - if ( !x0_cache.load ( file_name , NULL , display_degree==NOMAD::FULL_DISPLAY ) ) - { - err << "could not load (or create) the cache file " << file_name; - throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , err.str() ); - } - - // we copy all the temporary cache points - // into the list of points to be evaluated: - x = x0_cache.begin(); - while ( x ) - { - - pt = new NOMAD::Eval_Point; - pt->set ( *x , m ); - - if ( x->get_signature() ) - pt->set_signature ( x->get_signature() ); - else if ( x->size() == n ) - pt->set_signature ( _p.get_signature() ); - - if ( pt->get_signature() ) - _ev_control.add_eval_point ( pt , - display_degree , - false , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() ); - else - { - if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) - out << std::endl << "Warning (" << "Mads.cpp" << ", " << __LINE__ - << "): could not use the starting point " << *pt - << " (no signature)" << std::endl << std::endl; - delete pt; - } - - x = x0_cache.next(); - } - - // insertion of this temporary cache in the algorithm's cache: - cache.insert ( x0_cache ); - } - - // x0 cache file and the algorithm's cache file are the same: - else { - - x = cache.begin(); - while ( x ) { - pt = &NOMAD::Cache::get_modifiable_point ( *x ); - - if ( x->get_signature() ) - pt->set_signature ( x->get_signature() ); - else if ( x->size() == n ) - pt->set_signature ( _p.get_signature() ); - - if ( pt->get_signature() ) - _ev_control.add_eval_point ( pt , - display_degree , - false , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() ); - else { - if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) - out << std::endl << "Warning (" << "Mads.cpp" << ", " << __LINE__ - << "): could not use the starting point " << *pt - << "(no signature)" << std::endl; - } - x = cache.next(); - } - } - } - - // display of all starting points: - if ( display_degree == NOMAD::FULL_DISPLAY ) { - - const std::set<NOMAD::Priority_Eval_Point> & pts = _ev_control.get_eval_lop(); - - // one starting point: - if ( pts.size() == 1 ) { - out << std::endl << "x0 eval point: ( "; - pts.begin()->get_point()->Point::display ( out , - " " , - 2 , - NOMAD::Point::get_display_limit() ); - out << " )" << std::endl; - } - - // several starting points: - else - _ev_control.display_eval_lop ( NOMAD::X0_EVAL ); - } - - NOMAD::success_type success; - const NOMAD::Eval_Point * new_feas_inc = NULL; - const NOMAD::Eval_Point * new_infeas_inc = NULL; - - // eval_list_of_points (x0): - // ------------------------- - _ev_control.eval_list_of_points ( NOMAD::X0_EVAL , - _true_barrier , - _sgte_barrier , - _pareto_front , - stop , - stop_reason , - new_feas_inc , - new_infeas_inc , - success ); - if ( !stop && - ( success == NOMAD::UNSUCCESSFUL || - (!new_feas_inc && !new_infeas_inc ) || - ( _p.get_barrier_type() == NOMAD::EB && - !get_active_barrier().get_best_feasible() ) ) ) { - stop = true; - stop_reason = NOMAD::X0_FAIL; - } - - - // displays: - display_iteration_end ( stop , - stop_reason , - success , - new_feas_inc , - new_infeas_inc ); - - // stop the algorithm if no iterations are allowed: - if ( !stop && _p.get_max_iterations() == 0 ) - { - stop = true; - stop_reason = NOMAD::MAX_ITER_REACHED; - } - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl << NOMAD::close_block ( "end of starting point evaluation" ); + const std::vector<NOMAD::Point *> & x0s = _p.get_x0s(); + const std::string & x0_cache_file = _p.get_x0_cache_file(); + if ( x0s.empty() && x0_cache_file.empty() ) + return; + + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_gen_dd(); + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl << NOMAD::open_block ( "starting point evaluation" ); + + NOMAD::Eval_Point * pt; + size_t k; + int m = _p.get_bb_nb_outputs(); + int n = _p.get_dimension(); + std::ostringstream err; + + // x0s from vector Parameters::_x0s: + // --------------------------------- + size_t x0s_size = x0s.size(); + for ( k = 0 ; k < x0s_size ; ++k ) + { + + // the current starting point has to be in dimension n: + if ( x0s[k]->size() != n ) + { + err << "starting point ( " << *x0s[k] << " ) is not of dimension " << n; + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , err.str() ); + } + + // creation of the Eval_Point: + pt = new NOMAD::Eval_Point; + pt->set ( *x0s[k] , m ); + pt->set_signature ( _p.get_signature() ); + + _ev_control.add_eval_point ( pt , + display_degree , + false , + NOMAD::Double() , + NOMAD::Double() , + NOMAD::Double() , + NOMAD::Double() ); + } + + // x0 from a cache file: + // --------------------- + if ( !x0_cache_file.empty() ) + { + + NOMAD::Cache & cache = _ev_control.get_cache(); + const NOMAD::Eval_Point * x; + + // another cache file (this file won't be modified): + if ( x0_cache_file != _p.get_cache_file() ) + { + + NOMAD::Cache x0_cache ( out , ( _p.get_opt_only_sgte() ) ? NOMAD::SGTE : NOMAD::TRUTH ); + std::string file_name = _p.get_problem_dir() + x0_cache_file; + + if ( !x0_cache.load ( file_name , NULL , display_degree==NOMAD::FULL_DISPLAY ) ) + { + err << "could not load (or create) the cache file " << file_name; + throw NOMAD::Exception ( "Mads.cpp" , __LINE__ , err.str() ); + } + + // we copy all the temporary cache points + // into the list of points to be evaluated: + x = x0_cache.begin(); + while ( x ) + { + + pt = new NOMAD::Eval_Point; + pt->set ( *x , m ); + + if ( x->get_signature() ) + pt->set_signature ( x->get_signature() ); + else if ( x->size() == n ) + pt->set_signature ( _p.get_signature() ); + + if ( pt->get_signature() ) + _ev_control.add_eval_point ( pt , + display_degree , + false , + NOMAD::Double() , + NOMAD::Double() , + NOMAD::Double() , + NOMAD::Double() ); + else + { + if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) + out << std::endl << "Warning (" << "Mads.cpp" << ", " << __LINE__ + << "): could not use the starting point " << *pt + << " (no signature)" << std::endl << std::endl; + delete pt; + } + + x = x0_cache.next(); + } + + // insertion of this temporary cache in the algorithm's cache: + cache.insert ( x0_cache ); + } + + // x0 cache file and the algorithm's cache file are the same: + else + { + + + x = cache.begin(); + while ( x ) + { + pt = &NOMAD::Cache::get_modifiable_point ( *x ); + + if ( x->get_signature() ) + pt->set_signature ( x->get_signature() ); + else if ( x->size() == n ) + pt->set_signature ( _p.get_signature() ); + + if ( pt->get_signature() ) + _ev_control.add_eval_point ( pt , + display_degree , + false , + NOMAD::Double() , + NOMAD::Double() , + NOMAD::Double() , + NOMAD::Double() ); + else + { + + if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) + out << std::endl << "Warning (" << "Mads.cpp" << ", " << __LINE__ + << "): could not use the starting point " << *pt + << "(no signature)" << std::endl; + } + x = cache.next(); + } + } + } + + // display of all starting points: + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + + const std::set<NOMAD::Priority_Eval_Point> & pts = _ev_control.get_eval_lop(); + + // one starting point: + if ( pts.size() == 1 ) + { + out << std::endl << "x0 eval point: ( "; + pts.begin()->get_point()->Point::display ( out , + " " , + 2 , + NOMAD::Point::get_display_limit() ); + out << " )" << std::endl; + } + + // several starting points: + else + _ev_control.display_eval_lop ( NOMAD::X0_EVAL ); + } + + NOMAD::success_type success; + const NOMAD::Eval_Point * new_feas_inc = NULL; + const NOMAD::Eval_Point * new_infeas_inc = NULL; + + // eval_list_of_points (x0): + // ------------------------- + _ev_control.eval_list_of_points ( NOMAD::X0_EVAL , + _true_barrier , + _sgte_barrier , + _pareto_front , + stop , + stop_reason , + new_feas_inc , + new_infeas_inc , + success ); + if ( !stop && + ( success == NOMAD::UNSUCCESSFUL || + (!new_feas_inc && !new_infeas_inc ) || + ( _p.get_barrier_type() == NOMAD::EB && + !get_active_barrier().get_best_feasible() ) ) ) + { + stop = true; + stop_reason = NOMAD::X0_FAIL; + } + + + // displays: + display_iteration_end ( stop , + stop_reason , + success , + new_feas_inc , + new_infeas_inc ); + + // stop the algorithm if no iterations are allowed: + if ( !stop && _p.get_max_iterations() == 0 ) + { + stop = true; + stop_reason = NOMAD::MAX_ITER_REACHED; + } + + if ( display_degree == NOMAD::FULL_DISPLAY ) + out << std::endl << NOMAD::close_block ( "end of starting point evaluation" ); } /*---------------------------------------------------------*/ /* display the Pareto front */ /*---------------------------------------------------------*/ void NOMAD::Mads::display_pareto_front ( void ) const -{ - if ( !_pareto_front ) - return; - - const std::string & stats_file_name = _p.get_stats_file_name(); - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_gen_dd(); - - // loop on the Pareto points: - if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) - out << std::endl << NOMAD::open_block ( "Pareto front" ) << std::endl; - - const NOMAD::Eval_Point * cur = _pareto_front->begin(); - while ( cur ) - { - - if ( cur->is_eval_ok() && cur->is_feasible ( _p.get_h_min() ) ) - { - - const std::list<int> & index_obj = _p.get_index_obj(); - std::list<int>::const_iterator it , end = index_obj.end(); - const NOMAD::Point & bbo = cur->get_bb_outputs(); - int i = 0; - NOMAD::Point multi_obj ( static_cast<int>(index_obj.size()) ); - - for ( it = index_obj.begin() ; it != end ; ++it ) - multi_obj[i++] = bbo[*it]; - - if ( !stats_file_name.empty() ) - _ev_control.stats_file ( stats_file_name , cur , true , &multi_obj ); - - if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY && !_p.get_display_stats().empty() ) - _ev_control.display_stats ( false , - out , - _p.get_display_stats() , - cur , - true , - &multi_obj ); - } - cur = _pareto_front->next(); - } - - if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) - out << NOMAD::close_block(); - - // other stats: - if ( display_degree == NOMAD::FULL_DISPLAY ) - { - - out << std::endl << "number of pts : " << _pareto_front->size() << std::endl; - - NOMAD::Double delta , surf; - _pareto_front->get_delta_surf ( delta , surf , - _p.get_multi_f_bounds() ); // f1_min, f1_max, - // f2_min, f2_max - out << "delta_j : " << delta << std::endl - << "surf : "; - if ( surf.is_defined() ) - out << 100*surf << "%" << std::endl; - else - out << NOMAD::Double() - << " (define valid MULTI_F_BOUNDS values to access this output)" - << std::endl; - } - else if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) - out << std::endl << "number of Pareto points: " << _pareto_front->size() - << std::endl; +{ + if ( !_pareto_front ) + return; + + const std::string & stats_file_name = _p.get_stats_file_name(); + const NOMAD::Display & out = _p.out(); + NOMAD::dd_type display_degree = out.get_gen_dd(); + + // loop on the Pareto points: + if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) + out << std::endl << NOMAD::open_block ( "Pareto front" ) << std::endl; + + const NOMAD::Eval_Point * cur = _pareto_front->begin(); + while ( cur ) + { + + if ( cur->is_eval_ok() && cur->is_feasible ( _p.get_h_min() ) ) + { + + const std::list<int> & index_obj = _p.get_index_obj(); + std::list<int>::const_iterator it , end = index_obj.end(); + const NOMAD::Point & bbo = cur->get_bb_outputs(); + int i = 0; + NOMAD::Point multi_obj ( static_cast<int>(index_obj.size()) ); + + for ( it = index_obj.begin() ; it != end ; ++it ) + multi_obj[i++] = bbo[*it]; + + if ( !stats_file_name.empty() ) + _ev_control.stats_file ( stats_file_name , cur , true , &multi_obj ); + + if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY && !_p.get_display_stats().empty() ) + _ev_control.display_stats ( false , + out , + _p.get_display_stats() , + cur , + true , + &multi_obj ); + } + cur = _pareto_front->next(); + } + + if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) + out << NOMAD::close_block(); + + // other stats: + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + + out << std::endl << "number of pts : " << _pareto_front->size() << std::endl; + + NOMAD::Double delta , surf; + _pareto_front->get_delta_surf ( delta , surf , + _p.get_multi_f_bounds() ); // f1_min, f1_max, + // f2_min, f2_max + out << "delta_j : " << delta << std::endl + << "surf : "; + if ( surf.is_defined() ) + out << 100*surf << "%" << std::endl; + else + out << NOMAD::Double() + << " (define valid MULTI_F_BOUNDS values to access this output)" + << std::endl; + } + else if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY) + out << std::endl << "number of Pareto points: " << _pareto_front->size() + << std::endl; } /*---------------------------------------------------------*/ @@ -3416,168 +3517,168 @@ void NOMAD::Mads::display_pareto_front ( void ) const /*---------------------------------------------------------*/ void NOMAD::Mads::display ( const NOMAD::Display & out ) const { - NOMAD::dd_type display_degree = out.get_gen_dd(); - - if ( !NOMAD::Slave::is_master() ) - return; - - // 0. no display: - // -------------- - if ( display_degree == NOMAD::NO_DISPLAY || display_degree == NOMAD::MINIMAL_DISPLAY) - { - - // there may be a pareto front to write as a stats file: - if ( _pareto_front && - !_pareto_front->empty() && - !_p.get_stats_file_name().empty() ) - display_pareto_front(); - - return; - } - - // incumbents: - const NOMAD::Eval_Point * bf = get_best_feasible(); - const NOMAD::Eval_Point * bi = get_best_infeasible(); - const NOMAD::Eval_Point *bimv = get_best_infeasible_min_viol(); - - // save the solution file: - if ( bf ) - _ev_control.write_solution_file ( *bf , false); - else if (bimv) - _ev_control.write_solution_file ( *bimv , true ); - - - - // 1. detailed display: - // -------------------- - if ( display_degree == NOMAD::FULL_DISPLAY ) - { - - // cache: - out << std::endl - << NOMAD::open_block ( "cache" ) - << ( _p.get_opt_only_sgte() ? _ev_control.get_sgte_cache() : _ev_control.get_cache() ) - << NOMAD::close_block(); - - // constraints: - if ( _p.has_constraints() ) - out << std::endl - << NOMAD::open_block ( "constraints handling") << std::endl - << get_active_barrier() - << NOMAD::close_block(); - - // Pareto front: - if ( _pareto_front ) - { - if ( _pareto_front->empty() ) - out << std::endl << "Pareto front empty" << std::endl; - else - display_pareto_front(); - } - - // stats: - out << std::endl - << NOMAD::open_block ( "stats" ) - << _stats - << NOMAD::close_block(); - - // model stats: + NOMAD::dd_type display_degree = out.get_gen_dd(); + + if ( !NOMAD::Slave::is_master() ) + return; + + // 0. no display: + // -------------- + if ( display_degree == NOMAD::NO_DISPLAY || display_degree == NOMAD::MINIMAL_DISPLAY) + { + + // there may be a pareto front to write as a stats file: + if ( _pareto_front && + !_pareto_front->empty() && + !_p.get_stats_file_name().empty() ) + display_pareto_front(); + + return; + } + + // incumbents: + const NOMAD::Eval_Point * bf = get_best_feasible(); + const NOMAD::Eval_Point * bi = get_best_infeasible(); + const NOMAD::Eval_Point *bimv = get_best_infeasible_min_viol(); + + // save the solution file: + if ( bf ) + _ev_control.write_solution_file ( *bf , false); + else if (bimv) + _ev_control.write_solution_file ( *bimv , true ); + + + + // 1. detailed display: + // -------------------- + if ( display_degree == NOMAD::FULL_DISPLAY ) + { + + // cache: + out << std::endl + << NOMAD::open_block ( "cache" ) + << ( _p.get_opt_only_sgte() ? _ev_control.get_sgte_cache() : _ev_control.get_cache() ) + << NOMAD::close_block(); + + // constraints: + if ( _p.has_constraints() ) + out << std::endl + << NOMAD::open_block ( "constraints handling") << std::endl + << get_active_barrier() + << NOMAD::close_block(); + + // Pareto front: + if ( _pareto_front ) + { + if ( _pareto_front->empty() ) + out << std::endl << "Pareto front empty" << std::endl; + else + display_pareto_front(); + } + + // stats: + out << std::endl + << NOMAD::open_block ( "stats" ) + << _stats + << NOMAD::close_block(); + + // model stats: #ifdef DEBUG - display_model_stats ( out ); + display_model_stats ( out ); #endif - - // miscellaneous: - if ( !_pareto_front ) - { - out << std::endl - << NOMAD::open_block ( "miscellaneous" ) - << "mesh indices : min= (" - << _mesh->get_min_mesh_indices() << " ), max = (" - << _mesh->get_max_mesh_indices() << " ), last= ( " - << _mesh->get_mesh_indices() << " ) " << std::endl; - - if ( bimv ) - { - out << "best infeasible solution (min. violation): ( "; - bimv->Point::display ( out , " " , -1 , -1 ); - out << " ) h=" << bimv->get_h() - << " f=" << bimv->get_f() << std::endl; - } - - out << "best feasible solution : "; - - if ( bf ) - { - out << "( "; - bf->Point::display ( out , " " , -1 , -1 ); - out << " ) h=" << bf->get_h() - << " f=" << bf->get_f() << std::endl; - } - else - out << "no feasible solution has been found" << std::endl; - - - out.close_block(); - } - } - - // 2. normal display: - // ------------------ - else - { - - // blackbox evaluations: - out << std::endl - << "blackbox evaluations : " << _stats.get_bb_eval() << std::endl; - - // output stats: - if ( _stats.get_stat_sum().is_defined() ) - out << "stat sum : " << _stats.get_stat_sum() << std::endl; - if ( _stats.get_stat_avg().is_defined() ) - out << "stat avg : " << _stats.get_stat_avg() << std::endl; - - // Pareto front (multi-objective optimization): - if ( _pareto_front ) - { - out << "number of MADS runs : " << _stats.get_mads_runs() << std::endl; - if ( _pareto_front->empty() ) - out << "Pareto front : empty" << std::endl; - else - display_pareto_front(); - } - - // single-objective optimization (display of best solutions): - else - { - - if ( !bf && !bi ) - out << "no solution" << std::endl; - else - { - if ( bimv ) - { - out << "best infeasible solution (min. violation): ( "; - bimv->Point::display ( out , " " , -1 , -1 ); - out << " ) h=" << bimv->get_h() - << " f=" << bimv->get_f() << std::endl; - } - - out << "best feasible solution : "; - - if ( bf ) - { - out << "( "; - bf->Point::display ( out , " " , -1 , -1 ); - out << " ) h=" << bf->get_h() - << " f=" << bf->get_f() << std::endl; - } - else - out << "no feasible solution has been found" << std::endl; - - } - } - out.close_block(); - } + + // miscellaneous: + if ( !_pareto_front ) + { + out << std::endl + << NOMAD::open_block ( "miscellaneous" ) + << "mesh indices : min= (" + << _mesh->get_min_mesh_indices() << " ), max = (" + << _mesh->get_max_mesh_indices() << " ), last= ( " + << _mesh->get_mesh_indices() << " ) " << std::endl; + + if ( bimv ) + { + out << "best infeasible solution (min. violation): ( "; + bimv->Point::display ( out , " " , -1 , -1 ); + out << " ) h=" << bimv->get_h() + << " f=" << bimv->get_f() << std::endl; + } + + out << "best feasible solution : "; + + if ( bf ) + { + out << "( "; + bf->Point::display ( out , " " , -1 , -1 ); + out << " ) h=" << bf->get_h() + << " f=" << bf->get_f() << std::endl; + } + else + out << "no feasible solution has been found" << std::endl; + + + out.close_block(); + } + } + + // 2. normal display: + // ------------------ + else + { + + // blackbox evaluations: + out << std::endl + << "blackbox evaluations : " << _stats.get_bb_eval() << std::endl; + + // output stats: + if ( _stats.get_stat_sum().is_defined() ) + out << "stat sum : " << _stats.get_stat_sum() << std::endl; + if ( _stats.get_stat_avg().is_defined() ) + out << "stat avg : " << _stats.get_stat_avg() << std::endl; + + // Pareto front (multi-objective optimization): + if ( _pareto_front ) + { + out << "number of MADS runs : " << _stats.get_mads_runs() << std::endl; + if ( _pareto_front->empty() ) + out << "Pareto front : empty" << std::endl; + else + display_pareto_front(); + } + + // single-objective optimization (display of best solutions): + else + { + + if ( !bf && !bi ) + out << "no solution" << std::endl; + else + { + if ( bimv ) + { + out << "best infeasible solution (min. violation): ( "; + bimv->Point::display ( out , " " , -1 , -1 ); + out << " ) h=" << bimv->get_h() + << " f=" << bimv->get_f() << std::endl; + } + + out << "best feasible solution : "; + + if ( bf ) + { + out << "( "; + bf->Point::display ( out , " " , -1 , -1 ); + out << " ) h=" << bf->get_h() + << " f=" << bf->get_f() << std::endl; + } + else + out << "no feasible solution has been found" << std::endl; + + } + } + out.close_block(); + } } /*---------------------------------------------------------*/ @@ -3585,17 +3686,18 @@ void NOMAD::Mads::display ( const NOMAD::Display & out ) const /*---------------------------------------------------------*/ void NOMAD::Mads::display_model_stats ( const NOMAD::Display & out ) const { - if ( _model_search1 ) - out << std::endl << NOMAD::open_block ( "model search #1 stats" ) - << *_model_search1 << NOMAD::close_block(); - if ( _model_search2 ) - out << std::endl << NOMAD::open_block ( "model search #2 stats" ) - << *_model_search2 << NOMAD::close_block(); - if ( _p.get_model_eval_sort() != NOMAD::NO_MODEL ) { - out << std::endl << NOMAD::open_block ( "model ordering stats" ); - _ev_control.display_model_ordering_stats ( out ); - out << NOMAD::close_block(); - } + if ( _model_search1 ) + out << std::endl << NOMAD::open_block ( "model search #1 stats" ) + << *_model_search1 << NOMAD::close_block(); + if ( _model_search2 ) + out << std::endl << NOMAD::open_block ( "model search #2 stats" ) + << *_model_search2 << NOMAD::close_block(); + if ( _p.get_model_eval_sort() != NOMAD::NO_MODEL ) + { + out << std::endl << NOMAD::open_block ( "model ordering stats" ); + _ev_control.display_model_ordering_stats ( out ); + out << NOMAD::close_block(); + } } /*---------------------------------------------------------*/ @@ -3604,16 +3706,16 @@ void NOMAD::Mads::display_model_stats ( const NOMAD::Display & out ) const /*---------------------------------------------------------*/ void NOMAD::Mads::display_deltas ( const NOMAD::Signature & s ) const { - - NOMAD::Point delta,Delta; - - _mesh->get_delta(delta); - _mesh->get_Delta(Delta); - if (delta.is_defined() && Delta.is_defined()) - _p.out() << "mesh size : ( " << delta << " )" << std::endl - << "poll size : ( " << Delta << " )" << std::endl - << "mesh indices : ( " << _mesh->get_mesh_indices() << " )" << std::endl; - + + NOMAD::Point delta,Delta; + + _mesh->get_delta(delta); + _mesh->get_Delta(Delta); + if (delta.is_defined() && Delta.is_defined()) + _p.out() << "mesh size : ( " << delta << " )" << std::endl + << "poll size : ( " << Delta << " )" << std::endl + << "mesh indices : ( " << _mesh->get_mesh_indices() << " )" << std::endl; + } /*-------------------------------------------------------*/ @@ -3621,110 +3723,118 @@ void NOMAD::Mads::display_deltas ( const NOMAD::Signature & s ) const /*-------------------------------------------------------*/ void NOMAD::Mads::display_iteration_begin ( void ) const { - const NOMAD::Display & out = _p.out(); - if ( out.get_iter_dd() != NOMAD::FULL_DISPLAY ) - return; - - // incumbents: - const NOMAD::Eval_Point * bf = get_best_feasible(); - const NOMAD::Eval_Point * bi = get_best_infeasible(); - const NOMAD::Signature * s1 = NULL; - - out << "blackbox evaluations : " << _stats.get_bb_eval() << std::endl; + const NOMAD::Display & out = _p.out(); + if ( out.get_iter_dd() != NOMAD::FULL_DISPLAY ) + return; + + // incumbents: + const NOMAD::Eval_Point * bf = get_best_feasible(); + const NOMAD::Eval_Point * bi = get_best_infeasible(); + const NOMAD::Signature * s1 = NULL; + + out << "blackbox evaluations : " << _stats.get_bb_eval() << std::endl; #ifdef USE_MPI - if ( _p.get_asynchronous() ) - out << "eval. in progress : " << _ev_control.get_nb_eval_in_progress() - << std::endl; + if ( _p.get_asynchronous() ) + out << "eval. in progress : " << _ev_control.get_nb_eval_in_progress() + << std::endl; #endif - out << "best feas. solution : "; - if ( bf ) { - out << "( "; - bf->Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); - out << " ) h=" << bf->get_h() - << " f=" << bf->get_f() - << std::endl; - } - else - out << "none" << std::endl; - out << "best infeas. solution: "; - if ( bi ) { - out << "( "; - bi->Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); - out << " ) h=" << bi->get_h() - << " f=" << bi->get_f() - << std::endl; - } - else - out << "none" << std::endl; - - out << "poll center : "; - const NOMAD::Eval_Point * poll_center = get_active_barrier().get_poll_center(); - if ( poll_center ) { - out << "( "; - poll_center->Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); - out << " )" << std::endl; - - s1 = poll_center->get_signature(); - if (s1) - display_deltas ( *s1 ); - } - else - out << "none" << std::endl; - - const NOMAD::Eval_Point * sec_poll_center + out << "best feas. solution : "; + if ( bf ) + { + out << "( "; + bf->Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); + out << " ) h=" << bf->get_h() + << " f=" << bf->get_f() + << std::endl; + } + else + out << "none" << std::endl; + out << "best infeas. solution: "; + if ( bi ) + { + out << "( "; + bi->Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); + out << " ) h=" << bi->get_h() + << " f=" << bi->get_f() + << std::endl; + } + else + out << "none" << std::endl; + + out << "poll center : "; + const NOMAD::Eval_Point * poll_center = get_active_barrier().get_poll_center(); + if ( poll_center ) + { + out << "( "; + poll_center->Point::display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); + out << " )" << std::endl; + + s1 = poll_center->get_signature(); + if (s1) + display_deltas ( *s1 ); + } + else + out << "none" << std::endl; + + const NOMAD::Eval_Point * sec_poll_center = get_active_barrier().get_sec_poll_center(); - - if ( sec_poll_center ) { - out << "sec. poll center : ( "; - sec_poll_center->Point::display ( out , - " " , - 2 , - NOMAD::Point::get_display_limit() ); - out << " )" << std::endl; - const NOMAD::Signature * s2 = sec_poll_center->get_signature(); - if ( s2 && (!s1 || s1 != s2) ) - display_deltas ( *s2 ); - } - out << "h_max : " - << get_active_barrier().get_h_max() << std::endl; + + if ( sec_poll_center ) + { + out << "sec. poll center : ( "; + sec_poll_center->Point::display ( out , + " " , + 2 , + NOMAD::Point::get_display_limit() ); + out << " )" << std::endl; + const NOMAD::Signature * s2 = sec_poll_center->get_signature(); + if ( s2 && (!s1 || s1 != s2) ) + display_deltas ( *s2 ); + } + + out << "h_max : " + << get_active_barrier().get_h_max() << std::endl; } /*---------------------------------------------------------*/ /* displays at the end of an iteration (private) */ /*---------------------------------------------------------*/ -void NOMAD::Mads::display_iteration_end -( bool stop , - NOMAD::stop_type stop_reason , - NOMAD::success_type success , - const NOMAD::Eval_Point * new_feas_inc , - const NOMAD::Eval_Point * new_infeas_inc ) const +void NOMAD::Mads::display_iteration_end ( bool stop , + NOMAD::stop_type stop_reason , + NOMAD::success_type success , + const NOMAD::Eval_Point * new_feas_inc , + const NOMAD::Eval_Point * new_infeas_inc ) const { - const NOMAD::Display & out = _p.out(); - - if ( out.get_iter_dd() != NOMAD::FULL_DISPLAY ) - return; - - out << std::endl - << "terminate MADS : "; - out.display_yes_or_no ( stop ); - out << std::endl; - if ( stop ) { - out << "termination cause : " << stop_reason; - if ( stop_reason==NOMAD::X0_FAIL && - !_flag_p1_active && - _p.has_EB_constraints() ) - out << " (phase one will be performed)"; - out << std::endl; - } - out << "iteration status : " << success << std::endl; - out << "new feas. incumbent : "; - if ( new_feas_inc ) - out << *new_feas_inc; - else - out << "none" << std::endl; - out << "new infeas. incumbent: "; - if ( new_infeas_inc ) - out << *new_infeas_inc; - else - out << "none" << std::endl; + const NOMAD::Display & out = _p.out(); + + if ( out.get_iter_dd() != NOMAD::FULL_DISPLAY ) + return; + + out << std::endl + << "terminate MADS : "; + out.display_yes_or_no ( stop ); + out << std::endl; + if ( stop ) + { + out << "termination cause : " << stop_reason; + if ( stop_reason==NOMAD::X0_FAIL && + !_flag_p1_active && + _p.has_EB_constraints() ) + out << " (phase one will be performed)"; + out << std::endl; + } + out << "iteration status : " << success << std::endl; + out << "new feas. incumbent : "; + if ( new_feas_inc ) + out << *new_feas_inc; + else + out << "none" << std::endl; + out << "new infeas. incumbent: "; + if ( new_infeas_inc ) + out << *new_infeas_inc; + else + out << "none" << std::endl; + } + + diff --git a/src/Mads.hpp b/src/Mads.hpp index c44819e..f3b0b26 100644 --- a/src/Mads.hpp +++ b/src/Mads.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -55,9 +62,6 @@ #include "XMesh.hpp" #include "SMesh.hpp" -#ifdef USE_TGP -#include "TGP_Model_Search.hpp" -#endif namespace NOMAD { @@ -78,6 +82,7 @@ namespace NOMAD { NOMAD::Barrier _true_barrier; ///< Barrier for true function evaluations. NOMAD::Barrier _sgte_barrier; ///< Barrier for surrogate evaluations. + NOMAD::OrthogonalMesh * _mesh; ///< Access to the OrthogonalMesh /// Pareto front for multi-objective optimization. @@ -102,6 +107,8 @@ namespace NOMAD { static bool _flag_reset_barriers; ///< Reset or not the barriers before a MADS run. static bool _flag_p1_active; ///< Flag equal to \c true if phase one is active. + + /*-----------------------------------------------------------------------------*/ /// Initializations. @@ -153,12 +160,12 @@ namespace NOMAD { size stopping criterion has to be disabled for integer variables -- \b OUT. */ - void poll ( bool & stop, - NOMAD::stop_type & stop_reason, - NOMAD::success_type & success, - const NOMAD::Eval_Point *& new_feas_inc, + void poll ( bool & stop , + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + const NOMAD::Eval_Point *& new_feas_inc , const NOMAD::Eval_Point *& new_infeas_inc, - bool & forbid_poll_size_stop ); + bool & forbid_poll_size_stop ); /// Sets the poll trial points from poll direction, poll center and mesh size /** @@ -169,12 +176,12 @@ namespace NOMAD { \param offset Dir index offset for primary and sec. poll center -- \b IN. \param sorting If true than the points are for sorting -- \b IN. */ - void set_poll_trial_points ( std::list<NOMAD::Direction> & dirs, - size_t offset, - const NOMAD::Eval_Point & poll_center, - bool & stop, - NOMAD::stop_type &stop_reason, - bool sorting); + void set_poll_trial_points ( std::list<NOMAD::Direction> & dirs , + size_t offset , + const NOMAD::Eval_Point & poll_center , + bool & stop , + NOMAD::stop_type & stop_reason , + bool sorting ); /// Compute a prospect point by optimization on quadratic models. @@ -184,19 +191,19 @@ namespace NOMAD { \param prospect_point The prospect point -- \b OUT. \return A flag equal to \c true if the prospect direction has been computed. */ - bool optimize_quad_model ( const NOMAD::Eval_Point & poll_center , - const std::list<NOMAD::Direction> & dirs , - NOMAD::Point & prospect_point ) ; + bool optimize_quad_model ( const NOMAD::Eval_Point & poll_center , + const std::list<NOMAD::Direction> & dirs , + NOMAD::Point & prospect_point) ; /// Sets the poll directions from signature, poll center and mesh size /** - \param dirs List of directions for the poll -- \b OUT. - \param i_pc Poll type -- \b IN. - \param offset Dir index offset for primary and sec. poll center -- \b IN. - \param poll_center The poll center -- \b IN. - \param stop Stop flag, true if cannot get direction -- \b IN/OUT. - \param stop_reason Stop type -- \b OUT. + \param dirs List of directions for the poll -- \b OUT. + \param i_pc Poll type -- \b IN. + \param offset Dir index offset for primary and sec. poll center -- \b IN. + \param poll_center The poll center -- \b IN. + \param stop Stop flag, true if cannot get direction -- \b IN/OUT. + \param stop_reason Stop type -- \b OUT. */ void set_poll_directions ( std::list<NOMAD::Direction> & dirs , NOMAD::poll_type i_pc , @@ -205,14 +212,27 @@ namespace NOMAD { bool & stop , NOMAD::stop_type & stop_reason ); + + /// Sets the poll intensification points from signature, poll center and mesh size + /** + \param poll_center The poll center -- \b IN. + \param offset Dir index offset for intensification -- \b IN. + \param stop Stop flag, true if cannot get direction -- \b IN/OUT. + \param stop_reason Stop type -- \b OUT. + */ + void set_poll_intensification_points ( const NOMAD::Eval_Point & poll_center , + size_t & offset , + bool & stop , + NOMAD::stop_type & stop_reason ); + /// Reduce the number of poll directions -> n /** - \param dirs List of directions for the poll -- \b IN/OUT. - \param poll_center the poll center -- \b IN. + \param dirs List of directions for the poll -- \b IN/OUT. + \param poll_center The poll center -- \b IN. \return success for this step. */ - bool set_reduced_poll_to_n_directions(std::list<NOMAD::Direction> & dirs, - const NOMAD::Eval_Point & poll_center); + bool set_reduced_poll_to_n_directions(std::list<NOMAD::Direction> & dirs, + const NOMAD::Eval_Point & poll_center); /// Compute the rank of a list of directions /** @@ -299,13 +319,13 @@ namespace NOMAD { /** - The computed opposite directions already include Delta^k_m. \param dirs List of existing directions (no snap to bounds) -- \b IN. - \param newDirs New dynamic directions -- \b OUT. + \param newDirs New dynamic directions -- \b OUT. \param poll_center Poll center -- \b IN. \return true if new dynamic direction generated false otherwise */ - bool get_dynamic_directions (const std::list<NOMAD::Direction> & dirs, - std::list<NOMAD::Direction> & newDirs, - const NOMAD::Eval_Point & poll_center) ; + bool get_dynamic_directions (const std::list<NOMAD::Direction> & dirs, + std::list<NOMAD::Direction> & newDirs, + const NOMAD::Eval_Point & poll_center) ; @@ -316,7 +336,7 @@ namespace NOMAD { least one direction in the set is of type Ortho-MADS N+1. */ - bool dirs_have_orthomads_np1 ( const std::list<NOMAD::Direction> & dirs ); + bool dirs_have_orthomads_np1_dyn ( const std::list<NOMAD::Direction> & dirs ); /// Check if a dir needs to be obtained from model optimization @@ -329,12 +349,12 @@ namespace NOMAD { /// get a single direction using quad model optimization or sum of negatives /** - \param dirs Reduced poll directions (no snap to bounds) -- \b IN. - \param poll_center Poll center -- \b IN. + \param dirs Reduced poll directions (no snap to bounds) -- \b IN. + \param poll_center Poll center -- \b IN. \return new direction */ - NOMAD::Direction get_single_dynamic_direction (const std::list<NOMAD::Direction> & dirs, - const NOMAD::Eval_Point & poll_center) ; + NOMAD::Direction get_single_dynamic_direction (const std::list<NOMAD::Direction> & dirs, + const NOMAD::Eval_Point & poll_center) ; /*-----------------------------------------------------------------------------*/ @@ -355,7 +375,7 @@ namespace NOMAD { _ev_control_for_sorting( p , _stats , _ev_control.get_evaluator() , &(_ev_control.get_cache()) , &(_ev_control.get_sgte_cache()) ) , _true_barrier ( p , NOMAD::TRUTH ) , _sgte_barrier ( p , NOMAD::SGTE ) , - _mesh ( p.get_signature()->get_mesh() ) , + _mesh ( p.get_signature()->get_mesh() ) , _pareto_front ( NULL ) , _user_search ( NULL ) , _model_search1 ( NULL ) , @@ -388,7 +408,7 @@ namespace NOMAD { _ev_control_for_sorting( p , _stats , _ev_control.get_evaluator() , cache , sgte_cache ) , _true_barrier ( p , NOMAD::TRUTH ) , _sgte_barrier ( p , NOMAD::SGTE ) , - _mesh ( p.get_signature()->get_mesh() ) , + _mesh ( p.get_signature()->get_mesh() ) , _pareto_front ( NULL ) , _user_search ( NULL ) , _model_search1 ( NULL ) , @@ -406,7 +426,7 @@ namespace NOMAD { /** \return Stop reason. */ - NOMAD::stop_type run ( void ); + virtual NOMAD::stop_type run ( void ); /// Algorithm execution for multi-objective. /** diff --git a/src/Makefile.am b/src/Makefile.am index 2ffa641..02e435d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -9,9 +9,7 @@ libnomad_a_SOURCES = Barrier.cpp Cache.cpp Cache_File_Point.cpp Cache_Point.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\ - TGP_Model.cpp TGP_Model_Evaluator.cpp TGP_Model_Search.cpp\ - TGP_Output_Model.cpp utils.cpp Variable_Group.cpp VNS_Search.cpp\ - OrthogonalMesh.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\ @@ -23,9 +21,7 @@ libnomadmpi_a_SOURCES = Barrier.cpp Cache.cpp Cache_File_Point.cpp Cache_Point.c 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\ - TGP_Model.cpp TGP_Model_Evaluator.cpp TGP_Model_Search.cpp\ - TGP_Output_Model.cpp utils.cpp Variable_Group.cpp VNS_Search.cpp\ - OrthogonalMesh.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\ @@ -40,8 +36,7 @@ pkginclude_HEADERS = Cache_File_Point.hpp Cache.hpp Cache_Point.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 TGP_Model_Evaluator.hpp TGP_Model.hpp TGP_Model_Search.hpp\ - TGP_Output_Model.hpp Uncopyable.hpp utils.hpp Variable_Group.hpp\ + Stats.hpp TGP_Model_Evaluator.hpp Uncopyable.hpp utils.hpp Variable_Group.hpp\ VNS_Search.hpp Barrier.hpp OrthogonalMesh.hpp bin_PROGRAMS = nomad diff --git a/src/Model_Sorted_Point.cpp b/src/Model_Sorted_Point.cpp index 1afbbdb..a37d68f 100644 --- a/src/Model_Sorted_Point.cpp +++ b/src/Model_Sorted_Point.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,55 +41,58 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Model_Sorted_Point.cpp - \brief Interpolation point with distance to model center (implementation) - \author Sebastien Le Digabel - \date 2010-11-15 - \see Model_Sorted_Point.hpp -*/ + \file Model_Sorted_Point.cpp + \brief Interpolation point with distance to model center (implementation) + \author Sebastien Le Digabel + \date 2010-11-15 + \see Model_Sorted_Point.hpp + */ #include "Model_Sorted_Point.hpp" /*---------------------------------------------------------*/ /* constructor */ /*---------------------------------------------------------*/ -NOMAD::Model_Sorted_Point::Model_Sorted_Point -( NOMAD::Point * x , const NOMAD::Point & center ) : _x(x) +NOMAD::Model_Sorted_Point::Model_Sorted_Point ( NOMAD::Point * x , + const NOMAD::Point & center ) : _x(x) { - int i , n = center.size(); - if ( x && x->size() == n ) { - _dist = 0.0; - for ( i = 0 ; i < n ; ++i ) - if ( (*x)[i].is_defined() && center[i].is_defined() ) { - _dist += ( (*x)[i] - center[i] ).pow2(); - } - else { - _dist.clear(); - break; - } - } + int i , n = center.size(); + if ( x && x->size() == n ) + { + _dist = 0.0; + for ( i = 0 ; i < n ; ++i ) + if ( (*x)[i].is_defined() && center[i].is_defined() ) + { + _dist += ( (*x)[i] - center[i] ).pow2(); + } + else + { + + _dist.clear(); + break; + } + } } /*---------------------------------------------------------*/ /* affectation operator */ /*---------------------------------------------------------*/ -NOMAD::Model_Sorted_Point & NOMAD::Model_Sorted_Point::operator = -( const NOMAD::Model_Sorted_Point & x ) +NOMAD::Model_Sorted_Point & NOMAD::Model_Sorted_Point::operator = ( const NOMAD::Model_Sorted_Point & x ) { - _x = x._x; - _dist = x._dist; - return *this; + _x = x._x; + _dist = x._dist; + return *this; } /*---------------------------------------------------------*/ /* comparison operator */ /*---------------------------------------------------------*/ -bool NOMAD::Model_Sorted_Point::operator < -( const Model_Sorted_Point & x ) const +bool NOMAD::Model_Sorted_Point::operator < ( const Model_Sorted_Point & x ) const { - if ( _dist.is_defined() ) { - if ( !x._dist.is_defined() ) - return true; - return _dist < x._dist; - } - return false; + if ( _dist.is_defined() ) + { + if ( !x._dist.is_defined() ) + return true; + return _dist < x._dist; + } + return false; } diff --git a/src/Model_Sorted_Point.hpp b/src/Model_Sorted_Point.hpp index c1e1a7c..1cd2e08 100644 --- a/src/Model_Sorted_Point.hpp +++ b/src/Model_Sorted_Point.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,80 +41,80 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Model_Sorted_Point.hpp - \brief Interpolation point with distance to model center (headers) - \author Sebastien Le Digabel - \date 2010-11-15 - \see Model_Sorted_Point.cpp -*/ + \file Model_Sorted_Point.hpp + \brief Interpolation point with distance to model center (headers) + \author Sebastien Le Digabel + \date 2010-11-15 + \see Model_Sorted_Point.cpp + */ #ifndef __MODEL_SORTED_POINT__ #define __MODEL_SORTED_POINT__ #include "Point.hpp" namespace NOMAD { - - /// Class used to order interpolation points. - class Model_Sorted_Point { - - private: - - NOMAD::Point * _x; ///< The point. - NOMAD::Double _dist; ///< Distance to center. - - public: - - /// Constructor 1/2. - /** - \param x Interpolaton point -- \b IN. - \param center Model center -- \b IN. - */ - Model_Sorted_Point ( NOMAD::Point * x , const NOMAD::Point & center ); - - /// Constructor 2/2. - /** - \param x Interpolaton point -- \b IN. - \param dist Custom distance with center -- \b IN. - */ - Model_Sorted_Point ( NOMAD::Point * x , const NOMAD::Double & dist ) - : _x ( x ) , _dist ( dist ) {} - - /// Copy constructor. - /** - \param x The copied object -- \b IN. - */ - Model_Sorted_Point ( const Model_Sorted_Point & x ) - : _x ( x._x ) , _dist ( x._dist ) {} - - /// Affectation operator. - /** - \param x The right-hand side object -- \b IN. - \return \c *this as the result of the affectation. - */ - Model_Sorted_Point & operator = ( const Model_Sorted_Point & x ); - - /// Destructor. - virtual ~Model_Sorted_Point ( void ) {} - - /// Comparison operator. - /** - \param x The right-hand side object -- \b IN. - \return \c true if the current interpolation point is closer to the center. - */ - bool operator < ( const Model_Sorted_Point & x ) const; - - /// Access to the interpolation point. - /** - \return The interpolation point. - */ - NOMAD::Point * get_point ( void ) const { return _x; } - - /// Access to the distance. - /** - \return The distance - */ - const NOMAD::Double & get_dist ( void ) const { return _dist; } - }; + + /// Class used to order interpolation points. + class Model_Sorted_Point { + + private: + + NOMAD::Point * _x; ///< The point. + NOMAD::Double _dist; ///< Distance to center. + + public: + + /// Constructor 1/2. + /** + \param x Interpolaton point -- \b IN. + \param center Model center -- \b IN. + */ + Model_Sorted_Point ( NOMAD::Point * x , const NOMAD::Point & center ); + + /// Constructor 2/2. + /** + \param x Interpolaton point -- \b IN. + \param dist Custom distance with center -- \b IN. + */ + Model_Sorted_Point ( NOMAD::Point * x , const NOMAD::Double & dist ) + : _x ( x ) , _dist ( dist ) {} + + /// Copy constructor. + /** + \param x The copied object -- \b IN. + */ + Model_Sorted_Point ( const Model_Sorted_Point & x ) + : _x ( x._x ) , _dist ( x._dist ) {} + + /// Affectation operator. + /** + \param x The right-hand side object -- \b IN. + \return \c *this as the result of the affectation. + */ + Model_Sorted_Point & operator = ( const Model_Sorted_Point & x ); + + /// Destructor. + virtual ~Model_Sorted_Point ( void ) {} + + /// Comparison operator. + /** + \param x The right-hand side object -- \b IN. + \return \c true if the current interpolation point is closer to the center. + */ + bool operator < ( const Model_Sorted_Point & x ) const; + + /// Access to the interpolation point. + /** + \return The interpolation point. + */ + NOMAD::Point * get_point ( void ) const { return _x; } + + /// Access to the distance. + /** + \return The distance + */ + const NOMAD::Double & get_dist ( void ) const { return _dist; } + }; } #endif diff --git a/src/Model_Stats.cpp b/src/Model_Stats.cpp index bc18f4d..c71aadd 100644 --- a/src/Model_Stats.cpp +++ b/src/Model_Stats.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Model_Stats.cpp - \brief Model stats (implementation) - \author Sebastien Le Digabel - \date 2010-09-24 - \see Model_Stats.hpp -*/ + \file Model_Stats.cpp + \brief Model stats (implementation) + \author Sebastien Le Digabel + \date 2010-09-24 + \see Model_Stats.hpp + */ #include "Model_Stats.hpp" /*---------------------------------------------------------*/ @@ -47,38 +54,37 @@ /*---------------------------------------------------------*/ NOMAD::Model_Stats & NOMAD::Model_Stats::operator = ( const NOMAD::Model_Stats & s ) { - _nb_truth = s._nb_truth; - _nb_sgte = s._nb_sgte; - _nb_MFN = s._nb_MFN; - _nb_WP_regression = s._nb_WP_regression; - _nb_regression = s._nb_regression; - _nb_TGP = s._nb_TGP; - _not_enough_pts = s._not_enough_pts; - _nb_Y_sets = s._nb_Y_sets; - _sum_nY = s._sum_nY; - _min_nY = s._min_nY; - _max_nY = s._max_nY; - _construction_error = s._construction_error; - _construction_time = s._construction_time; - _optimization_time = s._optimization_time; - _bad_cond = s._bad_cond; - _MS_nb_searches = s._MS_nb_searches; - _MS_pts = s._MS_pts; - _MS_success = s._MS_success; - _MS_bb_eval = s._MS_bb_eval; - _MS_sgte_eval = s._MS_sgte_eval; - _MS_cache_hits = s._MS_cache_hits; - _MS_rejected = s._MS_rejected; - _MS_max_search_pts = s._MS_max_search_pts; - _MS_nb_opt = s._MS_nb_opt; - _MS_opt_error = s._MS_nb_opt; - _MS_avg_model_eval = s._MS_avg_model_eval; - _MS_max_model_eval = s._MS_max_model_eval; - _MS_max_bbe = s._MS_max_bbe; - _ES_nb_inside_radius = s._ES_nb_inside_radius; - _ES_nb_pts = s._ES_nb_pts; - - return *this; + _nb_truth = s._nb_truth; + _nb_sgte = s._nb_sgte; + _nb_MFN = s._nb_MFN; + _nb_WP_regression = s._nb_WP_regression; + _nb_regression = s._nb_regression; + _not_enough_pts = s._not_enough_pts; + _nb_Y_sets = s._nb_Y_sets; + _sum_nY = s._sum_nY; + _min_nY = s._min_nY; + _max_nY = s._max_nY; + _construction_error = s._construction_error; + _construction_time = s._construction_time; + _optimization_time = s._optimization_time; + _bad_cond = s._bad_cond; + _MS_nb_searches = s._MS_nb_searches; + _MS_pts = s._MS_pts; + _MS_success = s._MS_success; + _MS_bb_eval = s._MS_bb_eval; + _MS_sgte_eval = s._MS_sgte_eval; + _MS_cache_hits = s._MS_cache_hits; + _MS_rejected = s._MS_rejected; + _MS_max_search_pts = s._MS_max_search_pts; + _MS_nb_opt = s._MS_nb_opt; + _MS_opt_error = s._MS_nb_opt; + _MS_avg_model_eval = s._MS_avg_model_eval; + _MS_max_model_eval = s._MS_max_model_eval; + _MS_max_bbe = s._MS_max_bbe; + _ES_nb_inside_radius = s._ES_nb_inside_radius; + _ES_nb_pts = s._ES_nb_pts; + + return *this; } /*---------------------------------------------------------*/ @@ -86,12 +92,11 @@ NOMAD::Model_Stats & NOMAD::Model_Stats::operator = ( const NOMAD::Model_Stats & /*---------------------------------------------------------*/ void NOMAD::Model_Stats::reset ( void ) { - _nb_truth = + _nb_truth = _nb_sgte = _nb_MFN = _nb_WP_regression = _nb_regression = - _nb_TGP = _not_enough_pts = _construction_error = _bad_cond = @@ -103,20 +108,20 @@ void NOMAD::Model_Stats::reset ( void ) _MS_cache_hits = _MS_rejected = _MS_max_search_pts = - _MS_nb_opt = + _MS_nb_opt = _MS_opt_error = _MS_avg_model_eval = _MS_max_model_eval = _MS_max_bbe = _ES_nb_inside_radius = - _ES_nb_pts = + _ES_nb_pts = _nb_Y_sets = 0; - - _min_nY = INT_MAX; - _sum_nY = 0.0; - - _max_nY = -1; - _construction_time = + + _min_nY = INT_MAX; + _sum_nY = 0.0; + + _max_nY = -1; + _construction_time = _optimization_time = 0.0; } @@ -125,51 +130,50 @@ void NOMAD::Model_Stats::reset ( void ) /*-------------------------------------------------------*/ void NOMAD::Model_Stats::update ( const NOMAD::Model_Stats & s ) { - _nb_truth += s._nb_truth; - _nb_sgte += s._nb_sgte; - _nb_MFN += s._nb_MFN; - _nb_WP_regression += s._nb_WP_regression; - _nb_regression += s._nb_regression; - _nb_TGP += s._nb_TGP; - _not_enough_pts += s._not_enough_pts; - _construction_error += s._construction_error; - _construction_time += s._construction_time; - _optimization_time += s._optimization_time; - _bad_cond += s._bad_cond; - _MS_nb_searches += s._MS_nb_searches; - _MS_pts += s._MS_pts; - _MS_success += s._MS_success; - _MS_bb_eval += s._MS_bb_eval; - _MS_sgte_eval += s._MS_sgte_eval; - _MS_cache_hits += s._MS_cache_hits; - _MS_rejected += s._MS_rejected; - _MS_opt_error += s._MS_opt_error; - _MS_max_bbe += s._MS_max_bbe; - _ES_nb_inside_radius += s._ES_nb_inside_radius; - _ES_nb_pts += s._ES_nb_pts; - _nb_Y_sets += s._nb_Y_sets; - _sum_nY += s._sum_nY; - - _min_nY = ( _min_nY < s._min_nY ) ? + _nb_truth += s._nb_truth; + _nb_sgte += s._nb_sgte; + _nb_MFN += s._nb_MFN; + _nb_WP_regression += s._nb_WP_regression; + _nb_regression += s._nb_regression; + _not_enough_pts += s._not_enough_pts; + _construction_error += s._construction_error; + _construction_time += s._construction_time; + _optimization_time += s._optimization_time; + _bad_cond += s._bad_cond; + _MS_nb_searches += s._MS_nb_searches; + _MS_pts += s._MS_pts; + _MS_success += s._MS_success; + _MS_bb_eval += s._MS_bb_eval; + _MS_sgte_eval += s._MS_sgte_eval; + _MS_cache_hits += s._MS_cache_hits; + _MS_rejected += s._MS_rejected; + _MS_opt_error += s._MS_opt_error; + _MS_max_bbe += s._MS_max_bbe; + _ES_nb_inside_radius += s._ES_nb_inside_radius; + _ES_nb_pts += s._ES_nb_pts; + _nb_Y_sets += s._nb_Y_sets; + _sum_nY += s._sum_nY; + + _min_nY = ( _min_nY < s._min_nY ) ? _min_nY : s._min_nY; - - _max_nY = ( _max_nY > s._max_nY ) ? + + _max_nY = ( _max_nY > s._max_nY ) ? _max_nY : s._max_nY; - - _MS_max_model_eval = ( _MS_max_model_eval > s._MS_max_model_eval ) ? + + _MS_max_model_eval = ( _MS_max_model_eval > s._MS_max_model_eval ) ? _MS_max_model_eval : s._MS_max_model_eval; - - _MS_max_search_pts = ( _MS_max_search_pts > s._MS_max_search_pts ) ? + + _MS_max_search_pts = ( _MS_max_search_pts > s._MS_max_search_pts ) ? _MS_max_search_pts : s._MS_max_search_pts; - - if ( _MS_nb_opt + s._MS_nb_opt == 0 ) - _MS_avg_model_eval = 0; - else - _MS_avg_model_eval = ( _MS_avg_model_eval* _MS_nb_opt + - s._MS_avg_model_eval*s._MS_nb_opt ) / - ( _MS_nb_opt + s._MS_nb_opt ); - - _MS_nb_opt += s._MS_nb_opt; + + if ( _MS_nb_opt + s._MS_nb_opt == 0 ) + _MS_avg_model_eval = 0; + else + _MS_avg_model_eval = ( _MS_avg_model_eval* _MS_nb_opt + + s._MS_avg_model_eval*s._MS_nb_opt ) / + ( _MS_nb_opt + s._MS_nb_opt ); + + _MS_nb_opt += s._MS_nb_opt; } /*----------------------------------------------------*/ @@ -177,12 +181,12 @@ void NOMAD::Model_Stats::update ( const NOMAD::Model_Stats & s ) /*----------------------------------------------------*/ void NOMAD::Model_Stats::update_nY ( int nY ) { - ++_nb_Y_sets; - _sum_nY += nY; - if ( nY > _max_nY ) - _max_nY = nY; - if ( nY < _min_nY ) - _min_nY = nY; + ++_nb_Y_sets; + _sum_nY += nY; + if ( nY > _max_nY ) + _max_nY = nY; + if ( nY < _min_nY ) + _min_nY = nY; } /*----------------------------------------------------*/ @@ -190,8 +194,8 @@ void NOMAD::Model_Stats::update_nY ( int nY ) /*----------------------------------------------------*/ void NOMAD::Model_Stats::update_MS_max_search_pts ( int sp ) { - if ( sp > _MS_max_search_pts ) - _MS_max_search_pts = sp; + if ( sp > _MS_max_search_pts ) + _MS_max_search_pts = sp; } /*-----------------------------------------------------------------------*/ @@ -199,10 +203,10 @@ void NOMAD::Model_Stats::update_MS_max_search_pts ( int sp ) /*-----------------------------------------------------------------------*/ void NOMAD::Model_Stats::update_MS_model_opt ( int eval ) { - if ( eval > _MS_max_model_eval ) - _MS_max_model_eval = eval; - ++_MS_nb_opt; - _MS_avg_model_eval = ( (_MS_avg_model_eval*(_MS_nb_opt-1)) + eval ) / _MS_nb_opt; + if ( eval > _MS_max_model_eval ) + _MS_max_model_eval = eval; + ++_MS_nb_opt; + _MS_avg_model_eval = ( (_MS_avg_model_eval*(_MS_nb_opt-1)) + eval ) / _MS_nb_opt; } /*---------------------------------------------------------*/ @@ -210,63 +214,64 @@ void NOMAD::Model_Stats::update_MS_model_opt ( int eval ) /*---------------------------------------------------------*/ void NOMAD::Model_Stats::display ( const NOMAD::Display & out ) const { - out << "number of models built : " << get_nb_models() << std::endl; - if ( _nb_sgte > 0 ) - out << "number of truth models : " << _nb_truth << std::endl - << "number of surrogate models : " << _nb_sgte << std::endl; - out << "number of MFN interpolations : " << _nb_MFN << std::endl - << "number of WP regressions : " << _nb_WP_regression << std::endl - << "number of quadr. regressions : " << _nb_regression << std::endl - << "number of TGP models : " << _nb_TGP << std::endl - << "number of construction errors: " << _construction_error << std::endl - << "number of bad cond numbers : " << _bad_cond << std::endl - << "number of too small Y sets : " << _not_enough_pts << std::endl - << "min Y size : "; - if ( _min_nY != INT_MAX ) - out << _min_nY; - else - out << "-"; - out << std::endl - << "max Y size : "; - if ( _max_nY != -1 ) - out << _max_nY; - else - out << "-"; - out << std::endl - << "avg Y size : "; - if ( get_avg_nY() != 0.0 ) - out << get_avg_nY(); - else - out << "-"; - out << std::endl - << "construction CPU time (s) : " << _construction_time << std::endl; - if ( _MS_nb_searches > 0 ) { - out << NOMAD::open_block ( "model searches" ) - << "number of searches : " << _MS_nb_searches << std::endl - << "number of search successes : " << _MS_success << std::endl - << "number of search points : " << _MS_pts << std::endl - << "number of blackbox evaluations : " << _MS_bb_eval << std::endl; - if ( _MS_sgte_eval > 0 ) - out << "number of sgte evaluations : " << _MS_sgte_eval << std::endl; - out << "number of cache hits : " << _MS_cache_hits << std::endl - << "number of rejected candidates : " << _MS_rejected << std::endl - << "max number of trial points : " << _MS_max_search_pts << std::endl - << "number of optimizations : " << _MS_nb_opt << std::endl - << "number of optimization errors : " << _MS_opt_error << std::endl - << "number of max_bbe stops : " << _MS_max_bbe << std::endl - << "max number of model evaluations : " << _MS_max_model_eval << std::endl - << "average number of model evaluations: " << _MS_avg_model_eval << std::endl - << "optimization CPU time (s) : " << _optimization_time << std::endl - << NOMAD::close_block(); - } - - if ( _ES_nb_pts > 0 ) { - out << NOMAD::open_block ( "model ordering" ) - << "number of points considered : " << _ES_nb_pts << std::endl - << "number of points inside radius: " << _ES_nb_inside_radius - << " ("; - NOMAD::Double(_ES_nb_inside_radius*100.0/_ES_nb_pts).display ( out , "%.0f" ); - out << "%)" << std::endl - << NOMAD::close_block(); - } + out << "number of models built : " << get_nb_models() << std::endl; + if ( _nb_sgte > 0 ) + out << "number of truth models : " << _nb_truth << std::endl + << "number of surrogate models : " << _nb_sgte << std::endl; + out << "number of MFN interpolations : " << _nb_MFN << std::endl + << "number of WP regressions : " << _nb_WP_regression << std::endl + << "number of quadr. regressions : " << _nb_regression << std::endl + << "number of construction errors: " << _construction_error << std::endl + << "number of bad cond numbers : " << _bad_cond << std::endl + << "number of too small Y sets : " << _not_enough_pts << std::endl + << "min Y size : "; + if ( _min_nY != INT_MAX ) + out << _min_nY; + else + out << "-"; + out << std::endl + << "max Y size : "; + if ( _max_nY != -1 ) + out << _max_nY; + else + out << "-"; + out << std::endl + << "avg Y size : "; + if ( get_avg_nY() != 0.0 ) + out << get_avg_nY(); + else + out << "-"; + out << std::endl + << "construction CPU time (s) : " << _construction_time << std::endl; + if ( _MS_nb_searches > 0 ) + { + out << NOMAD::open_block ( "model searches" ) + << "number of searches : " << _MS_nb_searches << std::endl + << "number of search successes : " << _MS_success << std::endl + << "number of search points : " << _MS_pts << std::endl + << "number of blackbox evaluations : " << _MS_bb_eval << std::endl; + if ( _MS_sgte_eval > 0 ) + out << "number of sgte evaluations : " << _MS_sgte_eval << std::endl; + out << "number of cache hits : " << _MS_cache_hits << std::endl + << "number of rejected candidates : " << _MS_rejected << std::endl + << "max number of trial points : " << _MS_max_search_pts << std::endl + << "number of optimizations : " << _MS_nb_opt << std::endl + << "number of optimization errors : " << _MS_opt_error << std::endl + << "number of max_bbe stops : " << _MS_max_bbe << std::endl + << "max number of model evaluations : " << _MS_max_model_eval << std::endl + << "average number of model evaluations: " << _MS_avg_model_eval << std::endl + << "optimization CPU time (s) : " << _optimization_time << std::endl + << NOMAD::close_block(); + } + + if ( _ES_nb_pts > 0 ) + { + out << NOMAD::open_block ( "model ordering" ) + << "number of points considered : " << _ES_nb_pts << std::endl + << "number of points inside radius: " << _ES_nb_inside_radius + << " ("; + NOMAD::Double(_ES_nb_inside_radius*100.0/_ES_nb_pts).display ( out , "%.0f" ); + out << "%)" << std::endl + << NOMAD::close_block(); + } } diff --git a/src/Model_Stats.hpp b/src/Model_Stats.hpp index 1351a30..9799969 100644 --- a/src/Model_Stats.hpp +++ b/src/Model_Stats.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,332 +41,322 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Model_Stats.hpp - \brief Model stats (headers) - \author Sebastien Le Digabel - \date 2010-09-24 - \see Model_Stats.cpp -*/ + \file Model_Stats.hpp + \brief Model stats (headers) + \author Sebastien Le Digabel + \date 2010-09-24 + \see Model_Stats.cpp + */ #ifndef __MODEL_STATS__ #define __MODEL_STATS__ #include "Double.hpp" namespace NOMAD { - - /// Model stats. - class Model_Stats { - - private: - - int _nb_truth; ///< Number of truth models. - int _nb_sgte; ///< Number of surrogate models. - int _nb_MFN; ///< Number of quadr. MFN models. - int _nb_WP_regression; ///< Number of quadr. well-poised regressions models. - int _nb_regression; ///< Number of quadr. regression_max_nY models. - int _nb_TGP; ///< Number of TGP models. - int _not_enough_pts; ///< Number of too small \c Y sets. - int _nb_Y_sets; ///< Number of \c Y sets. - float _sum_nY; ///< Total number of \c Y points. - int _min_nY; ///< Minimal \c Y size. - int _max_nY; ///< Maximal \c Y size. - int _construction_error; ///< Number of construction errors. - double _construction_time; ///< Models construction CPU time. - double _optimization_time; ///< Models optimization CPU time. - - /// Number of times that \c cond exceeded \c SVD_MAX_COND. - int _bad_cond; - - // model search (MS): - int _MS_nb_searches; ///< Number of searches. - int _MS_pts; ///< Number of search points. - int _MS_success; ///< Number of search successes. - int _MS_bb_eval; ///< Number of search blackbox evaluations. - int _MS_sgte_eval; ///< Number of search surrogate evaluations. - int _MS_cache_hits; ///< Number of search cache hits. - int _MS_rejected; ///< Number of rejected trial points. - int _MS_max_search_pts; ///< Max number of trial points for one search. - int _MS_nb_opt; ///< Number of optimizations. - int _MS_opt_error; ///< Number of optimization errors. - int _MS_avg_model_eval; ///< Avg number of evaluations for a model opt. - int _MS_max_model_eval; ///< Max number of evaluations for a model opt. - int _MS_max_bbe; ///< Number of times model eval. reached limit. - - // eval sort (ES): - int _ES_nb_inside_radius; ///< Total number of points inside radius. - int _ES_nb_pts; ///< Total number of points. - -public: - - /// Constructor. - explicit Model_Stats ( void ) { reset(); } - - /// Copy constructor. - /** - \param s The copied object -- \b IN. - */ - explicit Model_Stats ( const Model_Stats & s ) - : _nb_truth ( s._nb_truth ) , - _nb_sgte ( s._nb_sgte ) , - _nb_MFN ( s._nb_MFN ) , - _nb_WP_regression ( s._nb_WP_regression ) , - _nb_regression ( s._nb_regression ) , - _nb_TGP ( s._nb_TGP ) , - _not_enough_pts ( s._not_enough_pts ) , - _nb_Y_sets ( s._nb_Y_sets ) , - _sum_nY ( s._sum_nY ) , - _min_nY ( s._min_nY ) , - _max_nY ( s._max_nY ) , - _construction_error ( s._construction_error ) , - _construction_time ( s._construction_time ) , - _optimization_time ( s._optimization_time ) , - _bad_cond ( s._bad_cond ) , - _MS_nb_searches ( s._MS_nb_searches ) , - _MS_pts ( s._MS_pts ) , - _MS_success ( s._MS_success ) , - _MS_bb_eval ( s._MS_bb_eval ) , - _MS_sgte_eval ( s._MS_sgte_eval ) , - _MS_cache_hits ( s._MS_cache_hits ) , - _MS_rejected ( s._MS_rejected ) , - _MS_max_search_pts ( s._MS_max_search_pts ) , - _MS_nb_opt ( s._MS_nb_opt ) , - _MS_opt_error ( s._MS_opt_error ) , - _MS_avg_model_eval ( s._MS_avg_model_eval ) , - _MS_max_model_eval ( s._MS_max_model_eval ) , - _MS_max_bbe ( s._MS_max_bbe ) , - _ES_nb_inside_radius ( s._ES_nb_inside_radius ) , - _ES_nb_pts ( s._ES_nb_pts ) {} - - /// Affectation operator. - /** - \param s The right-hand side object -- \b IN. - */ - Model_Stats & operator = ( const Model_Stats & s ); - /// Destructor. - virtual ~Model_Stats ( void ) {} - - /// Reset the stats. - void reset ( void ); - - /// Update stats from another NOMAD::Model_Stats object. - /** - \param s The other NOMAD::Model_Stats object -- \b IN. - */ - void update ( const Model_Stats & s ); - - /// Update stats on the size of interpolation set \c Y. - /** - \param nY Size of an interpolation set \c Y -- \b IN. - */ - void update_nY ( int nY ); - - /// Update stat \c _MS_max_search_pts. - /** - \param sp Number of trial points for a model search -- \b IN. - */ - void update_MS_max_search_pts ( int sp ); - - /// Update stats \c _MS_nb_opt, \c _MS_max_model_eval, and \c _MS_avg_model_eval. - /** - \param eval Number of model evaluations during one model optimization -- \b IN. - */ - void update_MS_model_opt ( int eval ); - - /// Update model ordering stats. - /** - \param nb_inside_radius Number of points inside radius -- \b IN. - \param nb_pts Number of points -- \b IN. - */ - void update_ES_stats ( int nb_inside_radius , int nb_pts ) - { - _ES_nb_inside_radius += nb_inside_radius; - _ES_nb_pts += nb_pts; - } - - /// Add a real to stat \c _construction_time. - /** - \param t Time -- \b IN. - */ - void add_construction_time ( double t ) { _construction_time += t; } - - /// Add a real to stat \c _optimization_time. - /** - \param t Time -- \b IN. - */ - void add_optimization_time ( double t ) { _optimization_time += t; } - - /// Add \c 1 to stat \c _nb_truth. - void add_nb_truth ( void ) { ++_nb_truth; } - - /// Add \c 1 to stat \c _nb_sgte. - void add_nb_sgte ( void ) { ++_nb_sgte; } - - /// Add \c 1 to stat \c _nb_MFN. - void add_nb_MFN ( void ) { ++_nb_MFN; } - - /// Add \c 1 to stat \c _nb_WP_regression. - void add_nb_WP_regression ( void ) { ++_nb_WP_regression; } - - /// Add \c 1 to stat \c _nb_regression. - void add_nb_regression ( void ) { ++_nb_regression; } - - /// Add \c 1 to stat \c _nb_TGP. - void add_nb_TGP ( void ) { ++_nb_TGP; } - - /// Add \c 1 to stat \c _not_enough_pts. - void add_not_enough_pts ( void ) { ++_not_enough_pts; } - - /// Add \c 1 to stat \c _construction_error. - void add_construction_error ( void ) { ++_construction_error; } - - /// Add \c 1 to stat \c _bad_cond. - void add_bad_cond ( void ) { ++_bad_cond; } - - /// Add \c 1 to stat \c _MS_nb_searches. - void add_MS_nb_searches ( void ) { ++_MS_nb_searches; } - - /// Add \c 1 to stat \c _MS_success. - void add_MS_success ( void ) { ++_MS_success; } - - /// Add \c 1 to stat \c _MS_opt_error. - void add_MS_opt_error ( void ) { ++_MS_opt_error; } - - /// Add \c 1 to stat \c _MS_max_bbe. - void add_MS_max_bbe ( void ) { ++_MS_max_bbe; } - - /// Add \c 1 to stat \c _MS_rejected. - void add_MS_rejected ( void ) { ++_MS_rejected; } - - /// Add an integer to stat \c _MS_pts. - /** - \param i The integer -- \b IN. - */ - void add_MS_pts ( int i ) { _MS_pts += i; } - - /// Add an integer to stat \c _MS_bb_eval. - /** - \param i The integer -- \b IN. - */ - void add_MS_bb_eval ( int i ) { _MS_bb_eval += i; } - - /// Add an integer to stat \c _MS_sgte_eval. - /** - \param i The integer -- \b IN. - */ - void add_MS_sgte_eval ( int i ) { _MS_sgte_eval += i; } - - /// Add an integer to stat \c _MS_cache_hits. - /** - \param i The integer -- \b IN. - */ - void add_MS_cache_hits ( int i ) { _MS_cache_hits += i; } - - /// Access to the number of model searches. - /* - \return The number of model searches. - **/ - int get_MS_nb_searches ( void ) const { return _MS_nb_searches; } - - /// Access to the number of model optimizations. - /* - \return The number of model optimizations. - **/ - int get_MS_nb_opt ( void ) const { return _MS_nb_opt; } - - /// Access to the number of model search points. - /* - \return The number of model search points. - **/ - int get_MS_pts ( void ) const { return _MS_pts; } - - /// Access to the number of model blackbox evaluations. - /* - \return The number of model blackbox evaluations. - **/ - int get_MS_bb_eval ( void ) const { return _MS_bb_eval; } - - /// Access to the number of model search surrogate evaluations. - /* - \return The number of model search surrogate evaluations. - **/ - int get_MS_sgte_eval ( void ) const { return _MS_sgte_eval; } - - /// Access to the number of model search successes. - /* - \return The number of model search successes. - **/ - int get_MS_success ( void ) const { return _MS_success; } - - /// Access to the number of models. - /* - \return The number of models. - **/ - int get_nb_models ( void ) const { return _nb_truth + _nb_sgte; } - - /// Access to stat \c _min_nY. - /** - \return The stat \c _min_nY. - */ - int get_min_nY ( void ) const { return _min_nY; } - - /// Access to stat \c _max_nY. - /** - \return The stat \c _max_nY. - */ - int get_max_nY ( void ) const { return _max_nY; } - - /// Access to the average size of interpolation sets. - /** - \return The average size of interpolation sets. - */ - float get_avg_nY ( void ) const - { - return ( _nb_Y_sets == 0 ) ? 0 : _sum_nY / _nb_Y_sets; - } - - /// Access to stat \c _nb_MFN. - /** - \return \c The stat _nb_MFN. - */ - int get_nb_MFN ( void ) const { return _nb_MFN; } + /// Model stats. + class Model_Stats { + + private: + + int _nb_truth; ///< Number of truth models. + int _nb_sgte; ///< Number of surrogate models. + int _nb_MFN; ///< Number of quadr. MFN models. + int _nb_WP_regression; ///< Number of quadr. well-poised regressions models. + int _nb_regression; ///< Number of quadr. regression_max_nY models. + int _not_enough_pts; ///< Number of too small \c Y sets. + int _nb_Y_sets; ///< Number of \c Y sets. + float _sum_nY; ///< Total number of \c Y points. + int _min_nY; ///< Minimal \c Y size. + int _max_nY; ///< Maximal \c Y size. + int _construction_error; ///< Number of construction errors. + double _construction_time; ///< Models construction CPU time. + double _optimization_time; ///< Models optimization CPU time. + + /// Number of times that \c cond exceeded \c SVD_MAX_COND. + int _bad_cond; + + // model search (MS): + int _MS_nb_searches; ///< Number of searches. + int _MS_pts; ///< Number of search points. + int _MS_success; ///< Number of search successes. + int _MS_bb_eval; ///< Number of search blackbox evaluations. + int _MS_sgte_eval; ///< Number of search surrogate evaluations. + int _MS_cache_hits; ///< Number of search cache hits. + int _MS_rejected; ///< Number of rejected trial points. + int _MS_max_search_pts; ///< Max number of trial points for one search. + int _MS_nb_opt; ///< Number of optimizations. + int _MS_opt_error; ///< Number of optimization errors. + int _MS_avg_model_eval; ///< Avg number of evaluations for a model opt. + int _MS_max_model_eval; ///< Max number of evaluations for a model opt. + int _MS_max_bbe; ///< Number of times model eval. reached limit. + + // eval sort (ES): + int _ES_nb_inside_radius; ///< Total number of points inside radius. + int _ES_nb_pts; ///< Total number of points. + + public: + + /// Constructor. + explicit Model_Stats ( void ) { reset(); } + + /// Copy constructor. + /** + \param s The copied object -- \b IN. + */ + explicit Model_Stats ( const Model_Stats & s ) + : _nb_truth ( s._nb_truth ) , + _nb_sgte ( s._nb_sgte ) , + _nb_MFN ( s._nb_MFN ) , + _nb_WP_regression ( s._nb_WP_regression ) , + _nb_regression ( s._nb_regression ) , + _not_enough_pts ( s._not_enough_pts ) , + _nb_Y_sets ( s._nb_Y_sets ) , + _sum_nY ( s._sum_nY ) , + _min_nY ( s._min_nY ) , + _max_nY ( s._max_nY ) , + _construction_error ( s._construction_error ) , + _construction_time ( s._construction_time ) , + _optimization_time ( s._optimization_time ) , + _bad_cond ( s._bad_cond ) , + _MS_nb_searches ( s._MS_nb_searches ) , + _MS_pts ( s._MS_pts ) , + _MS_success ( s._MS_success ) , + _MS_bb_eval ( s._MS_bb_eval ) , + _MS_sgte_eval ( s._MS_sgte_eval ) , + _MS_cache_hits ( s._MS_cache_hits ) , + _MS_rejected ( s._MS_rejected ) , + _MS_max_search_pts ( s._MS_max_search_pts ) , + _MS_nb_opt ( s._MS_nb_opt ) , + _MS_opt_error ( s._MS_opt_error ) , + _MS_avg_model_eval ( s._MS_avg_model_eval ) , + _MS_max_model_eval ( s._MS_max_model_eval ) , + _MS_max_bbe ( s._MS_max_bbe ) , + _ES_nb_inside_radius ( s._ES_nb_inside_radius ) , + _ES_nb_pts ( s._ES_nb_pts ) {} + + /// Affectation operator. + /** + \param s The right-hand side object -- \b IN. + */ + Model_Stats & operator = ( const Model_Stats & s ); + + /// Destructor. + virtual ~Model_Stats ( void ) {} + + /// Reset the stats. + void reset ( void ); + + /// Update stats from another NOMAD::Model_Stats object. + /** + \param s The other NOMAD::Model_Stats object -- \b IN. + */ + void update ( const Model_Stats & s ); + + /// Update stats on the size of interpolation set \c Y. + /** + \param nY Size of an interpolation set \c Y -- \b IN. + */ + void update_nY ( int nY ); + + /// Update stat \c _MS_max_search_pts. + /** + \param sp Number of trial points for a model search -- \b IN. + */ + void update_MS_max_search_pts ( int sp ); + + /// Update stats \c _MS_nb_opt, \c _MS_max_model_eval, and \c _MS_avg_model_eval. + /** + \param eval Number of model evaluations during one model optimization -- \b IN. + */ + void update_MS_model_opt ( int eval ); + + /// Update model ordering stats. + /** + \param nb_inside_radius Number of points inside radius -- \b IN. + \param nb_pts Number of points -- \b IN. + */ + void update_ES_stats ( int nb_inside_radius , int nb_pts ) + { + _ES_nb_inside_radius += nb_inside_radius; + _ES_nb_pts += nb_pts; + } + + /// Add a real to stat \c _construction_time. + /** + \param t Time -- \b IN. + */ + void add_construction_time ( double t ) { _construction_time += t; } + + /// Add a real to stat \c _optimization_time. + /** + \param t Time -- \b IN. + */ + void add_optimization_time ( double t ) { _optimization_time += t; } + + /// Add \c 1 to stat \c _nb_truth. + void add_nb_truth ( void ) { ++_nb_truth; } + + /// Add \c 1 to stat \c _nb_sgte. + void add_nb_sgte ( void ) { ++_nb_sgte; } + + /// Add \c 1 to stat \c _nb_MFN. + void add_nb_MFN ( void ) { ++_nb_MFN; } + + /// Add \c 1 to stat \c _nb_WP_regression. + void add_nb_WP_regression ( void ) { ++_nb_WP_regression; } + + /// Add \c 1 to stat \c _nb_regression. + void add_nb_regression ( void ) { ++_nb_regression; } + + /// Add \c 1 to stat \c _not_enough_pts. + void add_not_enough_pts ( void ) { ++_not_enough_pts; } + + /// Add \c 1 to stat \c _construction_error. + void add_construction_error ( void ) { ++_construction_error; } + + /// Add \c 1 to stat \c _bad_cond. + void add_bad_cond ( void ) { ++_bad_cond; } + + /// Add \c 1 to stat \c _MS_nb_searches. + void add_MS_nb_searches ( void ) { ++_MS_nb_searches; } + + /// Add \c 1 to stat \c _MS_success. + void add_MS_success ( void ) { ++_MS_success; } + + /// Add \c 1 to stat \c _MS_opt_error. + void add_MS_opt_error ( void ) { ++_MS_opt_error; } + + /// Add \c 1 to stat \c _MS_max_bbe. + void add_MS_max_bbe ( void ) { ++_MS_max_bbe; } + + /// Add \c 1 to stat \c _MS_rejected. + void add_MS_rejected ( void ) { ++_MS_rejected; } + + /// Add an integer to stat \c _MS_pts. + /** + \param i The integer -- \b IN. + */ + void add_MS_pts ( int i ) { _MS_pts += i; } + + /// Add an integer to stat \c _MS_bb_eval. + /** + \param i The integer -- \b IN. + */ + void add_MS_bb_eval ( int i ) { _MS_bb_eval += i; } + + /// Add an integer to stat \c _MS_sgte_eval. + /** + \param i The integer -- \b IN. + */ + void add_MS_sgte_eval ( int i ) { _MS_sgte_eval += i; } + + /// Add an integer to stat \c _MS_cache_hits. + /** + \param i The integer -- \b IN. + */ + void add_MS_cache_hits ( int i ) { _MS_cache_hits += i; } + + /// Access to the number of model searches. + /* + \return The number of model searches. + **/ + int get_MS_nb_searches ( void ) const { return _MS_nb_searches; } + + /// Access to the number of model optimizations. + /* + \return The number of model optimizations. + **/ + int get_MS_nb_opt ( void ) const { return _MS_nb_opt; } + + /// Access to the number of model search points. + /* + \return The number of model search points. + **/ + int get_MS_pts ( void ) const { return _MS_pts; } + + /// Access to the number of model blackbox evaluations. + /* + \return The number of model blackbox evaluations. + **/ + int get_MS_bb_eval ( void ) const { return _MS_bb_eval; } + + /// Access to the number of model search surrogate evaluations. + /* + \return The number of model search surrogate evaluations. + **/ + int get_MS_sgte_eval ( void ) const { return _MS_sgte_eval; } + + /// Access to the number of model search successes. + /* + \return The number of model search successes. + **/ + int get_MS_success ( void ) const { return _MS_success; } + + /// Access to the number of models. + /* + \return The number of models. + **/ + int get_nb_models ( void ) const { return _nb_truth + _nb_sgte; } + + /// Access to stat \c _min_nY. + /** + \return The stat \c _min_nY. + */ + int get_min_nY ( void ) const { return _min_nY; } + + /// Access to stat \c _max_nY. + /** + \return The stat \c _max_nY. + */ + int get_max_nY ( void ) const { return _max_nY; } + + /// Access to the average size of interpolation sets. + /** + \return The average size of interpolation sets. + */ + float get_avg_nY ( void ) const + { + return ( _nb_Y_sets == 0 ) ? 0 : _sum_nY / _nb_Y_sets; + } + + /// Access to stat \c _nb_MFN. + /** + \return \c The stat _nb_MFN. + */ + int get_nb_MFN ( void ) const { return _nb_MFN; } + + /// Access to stat \c _nb_WP_regression. + /** + \return \c The stat _nb_WP_regression. + */ + int get_nb_WP_regression ( void ) const { return _nb_WP_regression; } + + /// Access to stat \c _nb_regression. + /** + \return \c The stat _nb_regression. + */ + int get_nb_regression ( void ) const { return _nb_regression; } + + /// Display. + /** + \param out The NOMAD::Display object -- \b IN. + */ + void display ( const NOMAD::Display & out ) const; + }; - /// Access to stat \c _nb_WP_regression. - /** - \return \c The stat _nb_WP_regression. - */ - int get_nb_WP_regression ( void ) const { return _nb_WP_regression; } - - /// Access to stat \c _nb_regression. - /** - \return \c The stat _nb_regression. - */ - int get_nb_regression ( void ) const { return _nb_regression; } - - /// Access to stat \c _nb_TGP. + /// Display a NOMAD::Model_Stats object. /** - \return \c The stat _nb_TGP. - */ - int get_nb_TGP ( void ) const { return _nb_TGP; } - - /// Display. - /** - \param out The NOMAD::Display object -- \b IN. - */ - void display ( const NOMAD::Display & out ) const; - }; - - /// Display a NOMAD::Model_Stats object. - /** \param out The NOMAD::Display object -- \b IN. \param s The NOMAD::Model_Stats object to be displayed -- \b IN. \return The NOMAD::Display object. - */ - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::Model_Stats & s ) { - s.display ( out ); - return out; - } + */ + inline const NOMAD::Display & operator << ( const NOMAD::Display & out , + const NOMAD::Model_Stats & s ) + { + s.display ( out ); + return out; + } } #endif diff --git a/src/Multi_Obj_Evaluator.cpp b/src/Multi_Obj_Evaluator.cpp index 89c5bfe..9fdcf13 100644 --- a/src/Multi_Obj_Evaluator.cpp +++ b/src/Multi_Obj_Evaluator.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Multi_Obj_Evaluator.cpp - \brief NOMAD::Evaluator subclass for multiobjective optimization (implementation) - \author Sebastien Le Digabel - \date 2010-04-09 - \see Multi_Obj_Evaluator.hpp -*/ + \file Multi_Obj_Evaluator.cpp + \brief NOMAD::Evaluator subclass for multiobjective optimization (implementation) + \author Sebastien Le Digabel + \date 2010-04-09 + \see Multi_Obj_Evaluator.hpp + */ #include "Multi_Obj_Evaluator.hpp" /*-----------------------------------*/ @@ -54,15 +61,15 @@ int NOMAD::Multi_Obj_Evaluator::_i2 = -1; /*---------------------------------------*/ void NOMAD::Multi_Obj_Evaluator::set_obj_indexes ( const std::list<int> & index_obj ) { - if ( index_obj.size() != 2 ) - throw NOMAD::Exception ( "Multi_Obj_Evaluator.cpp" , __LINE__ , - "Multi_Obj_Evaluator defined with a number of indexes different than two" ); - - std::list<int>::const_iterator it = index_obj.begin(); - - NOMAD::Multi_Obj_Evaluator::_i1 = *it; - it++; - NOMAD::Multi_Obj_Evaluator::_i2 = *it; + if ( index_obj.size() != 2 ) + throw NOMAD::Exception ( "Multi_Obj_Evaluator.cpp" , __LINE__ , + "Multi_Obj_Evaluator defined with a number of indexes different than two" ); + + std::list<int>::const_iterator it = index_obj.begin(); + + NOMAD::Multi_Obj_Evaluator::_i1 = *it; + it++; + NOMAD::Multi_Obj_Evaluator::_i2 = *it; } /*-------------------------------------------------------------*/ @@ -71,98 +78,106 @@ void NOMAD::Multi_Obj_Evaluator::set_obj_indexes ( const std::list<int> & index_ /*-------------------------------------------------------------*/ void NOMAD::Multi_Obj_Evaluator::compute_f ( NOMAD::Eval_Point & x ) const { - if ( _i1 < 0 || _i2 < 0 ) - throw NOMAD::Exception ( "Multi_Obj_Evaluator.cpp" , __LINE__ , - "Multi_Obj_Evaluator::compute_f(): no objective indexes defined" ); - - int obj_index [2]; - obj_index[0] = _i1; - obj_index[1] = _i2; - - const NOMAD::Point & bbo = x.get_bb_outputs(); - - // a reference is available: - if ( _ref ) - { - - NOMAD::multi_formulation_type mft = _p.get_multi_formulation(); - - if ( mft == NOMAD::UNDEFINED_FORMULATION ) - throw NOMAD::Exception ( "Multi_Obj_Evaluator.cpp" , __LINE__ , - "Multi_Obj_Evaluator::compute_f(): no formulation type is defined" ); - - // normalized formulation: - if ( mft == NOMAD::NORMALIZED || mft == NOMAD::DIST_LINF ) { - - // f1 - r1: - NOMAD::Double d = bbo[obj_index[0]] - (*_ref)[0]; - - // f2 - r2: - NOMAD::Double f2mr2 = bbo[obj_index[1]] - (*_ref)[1]; - - // we take the max: - if ( f2mr2 > d ) - d = f2mr2; - - x.set_f ( d ); - } - - // product formulation: - else if ( mft == NOMAD::PRODUCT ) { - - NOMAD::Double prod = 1.0 , ri , fi; - - for ( int i = 0 ; i < 2 ; ++i ) { - - ri = (*_ref)[i]; - fi = bbo[obj_index[i]]; - - if ( fi > ri ) { - prod = 0.0; - break; - } - prod = prod * (ri-fi).pow2(); - } - - x.set_f ( -prod ); - } - - // distance formulation: - else { - - NOMAD::Double d; - NOMAD::Double r1mf1 = (*_ref)[0] - bbo[obj_index[0]]; - NOMAD::Double r2mf2 = (*_ref)[1] - bbo[obj_index[1]]; - - if ( r1mf1 >= 0.0 && r2mf2 >= 0.0 ) { - d = r1mf1.pow2(); - NOMAD::Double tmp = r2mf2.pow2(); - if ( tmp < d ) - d = tmp; - d = -d; - } - else if ( r1mf1 <= 0.0 && r2mf2 <= 0.0 ) { - - // with L2 norm: - if ( mft == NOMAD::DIST_L2 ) - d = r1mf1.pow2() + r2mf2.pow2(); - - // with L1 norm: - else - d = (r1mf1.abs() + r2mf2.abs()).pow2(); - - // Linf norm: treated as NORMALIZED - } - else if ( r1mf1 > 0.0 ) - d = r2mf2.pow2(); - else - d = r1mf1.pow2(); - - x.set_f ( d ); - } - } + if ( _i1 < 0 || _i2 < 0 ) + throw NOMAD::Exception ( "Multi_Obj_Evaluator.cpp" , __LINE__ , + "Multi_Obj_Evaluator::compute_f(): no objective indexes defined" ); + + int obj_index [2]; + obj_index[0] = _i1; + obj_index[1] = _i2; + + const NOMAD::Point & bbo = x.get_bb_outputs(); + + // a reference is available: + if ( _ref ) + { + + NOMAD::multi_formulation_type mft = _p.get_multi_formulation(); + + if ( mft == NOMAD::UNDEFINED_FORMULATION ) + throw NOMAD::Exception ( "Multi_Obj_Evaluator.cpp" , __LINE__ , + "Multi_Obj_Evaluator::compute_f(): no formulation type is defined" ); + + // normalized formulation: + if ( mft == NOMAD::NORMALIZED || mft == NOMAD::DIST_LINF ) + { + + // f1 - r1: + NOMAD::Double d = bbo[obj_index[0]] - (*_ref)[0]; + + // f2 - r2: + NOMAD::Double f2mr2 = bbo[obj_index[1]] - (*_ref)[1]; + + // we take the max: + if ( f2mr2 > d ) + d = f2mr2; + + x.set_f ( d ); + } + + // product formulation: + else if ( mft == NOMAD::PRODUCT ) + { + + NOMAD::Double prod = 1.0 , ri , fi; + + for ( int i = 0 ; i < 2 ; ++i ) + { + + ri = (*_ref)[i]; + fi = bbo[obj_index[i]]; + + if ( fi > ri ) + { + prod = 0.0; + break; + } + prod = prod * (ri-fi).pow2(); + } + + x.set_f ( -prod ); + } + + // distance formulation: + else + { + + + NOMAD::Double d; + NOMAD::Double r1mf1 = (*_ref)[0] - bbo[obj_index[0]]; + NOMAD::Double r2mf2 = (*_ref)[1] - bbo[obj_index[1]]; + + if ( r1mf1 >= 0.0 && r2mf2 >= 0.0 ) + { + d = r1mf1.pow2(); + NOMAD::Double tmp = r2mf2.pow2(); + if ( tmp < d ) + d = tmp; + d = -d; + } + else if ( r1mf1 <= 0.0 && r2mf2 <= 0.0 ) + { + + // with L2 norm: + if ( mft == NOMAD::DIST_L2 ) + d = r1mf1.pow2() + r2mf2.pow2(); + + // with L1 norm: + else + d = (r1mf1.abs() + r2mf2.abs()).pow2(); + + // Linf norm: treated as NORMALIZED + } + else if ( r1mf1 > 0.0 ) + d = r2mf2.pow2(); + else + d = r1mf1.pow2(); + + x.set_f ( d ); + } + } - // no reference is available (use weights): - else - x.set_f ( _w1 * bbo[obj_index[0]] + _w2 * bbo[obj_index[1]] ); + // no reference is available (use weights): + else + x.set_f ( _w1 * bbo[obj_index[0]] + _w2 * bbo[obj_index[1]] ); } diff --git a/src/Multi_Obj_Evaluator.hpp b/src/Multi_Obj_Evaluator.hpp index 522cb4f..155be5e 100644 --- a/src/Multi_Obj_Evaluator.hpp +++ b/src/Multi_Obj_Evaluator.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,107 +41,113 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Multi_Obj_Evaluator.hpp - \brief NOMAD::Evaluator subclass for multiobjective optimization (headers) - \author Sebastien Le Digabel - \date 2010-04-20 - \see Multi_Obj_Evaluator.cpp -*/ + \file Multi_Obj_Evaluator.hpp + \brief NOMAD::Evaluator subclass for multiobjective optimization (headers) + \author Sebastien Le Digabel + \date 2010-04-20 + \see Multi_Obj_Evaluator.cpp + */ #ifndef __MULTI_OBJ_EVALUATOR__ #define __MULTI_OBJ_EVALUATOR__ #include "Phase_One_Evaluator.hpp" namespace NOMAD { - - /// NOMAD::Evaluator subclass for multiobjective optimization. - /** - Version for two objective functions. - */ - class Multi_Obj_Evaluator : public NOMAD::Evaluator { - - private: - - static int _i1; ///< Index of the first objective. - static int _i2; ///< Index of the second objective. - - NOMAD::Double _w1; ///< Weight on the first objective function. - NOMAD::Double _w2; ///< Weight on the second objective function. - - const NOMAD::Point * _ref; ///< Reference point. - - public: - - /// Constructor. - /** - \param p Parameters -- \b IN. - */ - Multi_Obj_Evaluator ( const NOMAD::Parameters & p ) - : NOMAD::Evaluator ( p ) , - _w1 ( 1.0 ) , - _w2 ( 0.0 ) , - _ref ( NULL ) { _is_multi_obj = true; } - - /// Destructor. - virtual ~Multi_Obj_Evaluator ( void ) {} - - /// Initialization of objective indexes. - /** - \param index_obj List of objective indexes -- \b IN. - */ - static void set_obj_indexes ( const std::list<int> & index_obj ); - - /// Updates after a MADS run. - /** - This virtual method is called every time a MADS run is terminated. - \param stats Stats -- \b IN. - \param ev_control Evaluator control -- \b IN. - \param true_barrier Barrier for true functions -- \b IN. - \param sgte_barrier Barrier for surrogate functions -- \b IN. - \param pareto_front Pareto front -- \b IN. - */ - virtual void update_mads_run ( const NOMAD::Stats & stats , - const NOMAD::Evaluator_Control & ev_control , - const NOMAD::Barrier & true_barrier , - const NOMAD::Barrier & sgte_barrier , - const NOMAD::Pareto_Front & pareto_front ) {} - - /// Compute \c f(x) from the blackbox outputs of a point. + + /// NOMAD::Evaluator subclass for multiobjective optimization. /** - - Bi-objective version. - - Computation of \c f taking into account the two objectives + Version for two objective functions. + */ + class Multi_Obj_Evaluator : public NOMAD::Evaluator { + + private: + + static int _i1; ///< Index of the first objective. + static int _i2; ///< Index of the second objective. + + NOMAD::Double _w1; ///< Weight on the first objective function. + NOMAD::Double _w2; ///< Weight on the second objective function. + + const NOMAD::Point * _ref; ///< Reference point. + + public: + + /// Constructor. + /** + \param p Parameters -- \b IN. + */ + Multi_Obj_Evaluator ( const NOMAD::Parameters & p ) + : NOMAD::Evaluator ( p ) , + _w1 ( 1.0 ) , + _w2 ( 0.0 ) , + _ref ( NULL ) { _is_multi_obj = true; } + + /// Destructor. + virtual ~Multi_Obj_Evaluator ( void ) {} + + /// Initialization of objective indexes. + /** + \param index_obj List of objective indexes -- \b IN. + */ + static void set_obj_indexes ( const std::list<int> & index_obj ); + + /// Updates after a MADS run. + /** + This virtual method is called every time a MADS run is terminated. + \param stats Stats -- \b IN. + \param ev_control Evaluator control -- \b IN. + \param true_barrier Barrier for true functions -- \b IN. + \param sgte_barrier Barrier for surrogate functions -- \b IN. + \param pareto_front Pareto front -- \b IN. + */ + virtual void update_mads_run ( const NOMAD::Stats & stats , + const NOMAD::Evaluator_Control & ev_control , + const NOMAD::Barrier & true_barrier , + const NOMAD::Barrier & sgte_barrier , + const NOMAD::Pareto_Front & pareto_front ) {} + + /// Compute \c f(x) from the blackbox outputs of a point. + /** + - Bi-objective version. + - Computation of \c f taking into account the two objectives with a reformulation based on a reference point, or with weights when no reference is available. - \param x The evaluation point -- \b IN/OUT. - */ - virtual void compute_f ( NOMAD::Eval_Point & x ) const; - - /// Get the index of the first objective function. - /** - \return The index of the first objective function. - */ - static int get_i1 ( void ) { return _i1; } - - /// Get the index of the second objective function. - /** - \return The index of the second objective function. - */ - static int get_i2 ( void ) { return _i2; } - - /// Set the weights. - /** - \param w1 Weight on the first objective function -- \b IN. - \param w2 Weight on the second objective function -- \b IN. - */ - void set_weights ( const NOMAD::Double & w1 , - const NOMAD::Double & w2 ) { _w1 = w1; _w2 = w2; } - - /// Set the reference point. - /** - \param ref A pointer to the reference point -- \b IN. - */ - void set_ref ( const NOMAD::Point * ref ) { _ref = ref; } - }; + \param x The evaluation point -- \b IN/OUT. + */ + virtual void compute_f ( NOMAD::Eval_Point & x ) const; + + /// Get the index of the first objective function. + /** + \return The index of the first objective function. + */ + static int get_i1 ( void ) { return _i1; } + + /// Get the index of the second objective function. + /** + \return The index of the second objective function. + */ + static int get_i2 ( void ) { return _i2; } + + /// Set the weights. + /** + \param w1 Weight on the first objective function -- \b IN. + \param w2 Weight on the second objective function -- \b IN. + */ + void set_weights ( const NOMAD::Double & w1 , + const NOMAD::Double & w2 ) + { + _w1 = w1; + _w2 = w2; + } + + /// Set the reference point. + /** + \param ref A pointer to the reference point -- \b IN. + */ + void set_ref ( const NOMAD::Point * ref ) { _ref = ref; } + + + }; } #endif diff --git a/src/Multi_Obj_Quad_Model_Evaluator.hpp b/src/Multi_Obj_Quad_Model_Evaluator.hpp index 932fa5a..c59b5f4 100644 --- a/src/Multi_Obj_Quad_Model_Evaluator.hpp +++ b/src/Multi_Obj_Quad_Model_Evaluator.hpp @@ -1,7 +1,8 @@ + /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ +/* Copyright (C) 2001-2015 Mark Abramson - Brigham Young University, Provo */ /* Charles Audet - Ecole Polytechnique, Montreal */ /* Gilles Couture - Ecole Polytechnique, Montreal */ /* John Dennis - Rice University, Houston */ @@ -36,7 +37,7 @@ /** \file Multi_Obj_Quad_Model_Evaluator.hpp \brief NOMAD::Mulit_Obj_Evaluator subclass for quadratic model optimization (headers) - \author Christophe Tribes + \author Christophe Tribes \date 2014-06-19 \see Multi_Obj_Quad_Model_Evaluator.cpp */ @@ -47,36 +48,36 @@ #include "Multi_Obj_Evaluator.hpp" namespace NOMAD { - - /// Bi-objective NOMAD::Evaluator subclass for quadratic model. - class Multi_Obj_Quad_Model_Evaluator : public NOMAD::Quad_Model_Evaluator, public NOMAD::Multi_Obj_Evaluator { - public: - - /// Constructor. - /** - \param p Parameters -- \b IN. - \param model Model -- \b IN. - */ - Multi_Obj_Quad_Model_Evaluator ( const NOMAD::Parameters & p , - const NOMAD::Quad_Model & model ) : NOMAD::Quad_Model_Evaluator(p,model),NOMAD::Multi_Obj_Evaluator(p) {_is_model_evaluator=true;} - - /// Destructor. - virtual ~Multi_Obj_Quad_Model_Evaluator ( void ){;} - - - /// Evaluate the blackboxes quad model at a given trial point - /** - \param x point to evaluate -- \b IN/OUT. - \param h_max h_max for barrier -- \b IN. - \param count_eval Count eval if true -- \b IN. - \return A boolean equal to \c false if the evaluation failed. - */ - virtual bool eval_x ( NOMAD::Eval_Point & x , - const NOMAD::Double & h_max , - bool & count_eval ) const {return Quad_Model_Evaluator::eval_x(x,h_max,count_eval);} - - - }; + + /// Bi-objective NOMAD::Evaluator subclass for quadratic model. + class Multi_Obj_Quad_Model_Evaluator : public NOMAD::Quad_Model_Evaluator, public NOMAD::Multi_Obj_Evaluator { + public: + + /// Constructor. + /** + \param p Parameters -- \b IN. + \param model Model -- \b IN. + */ + Multi_Obj_Quad_Model_Evaluator ( const NOMAD::Parameters & p , + const NOMAD::Quad_Model & model ) : NOMAD::Quad_Model_Evaluator(p,model),NOMAD::Multi_Obj_Evaluator(p) {_is_model_evaluator=true;} + + /// Destructor. + virtual ~Multi_Obj_Quad_Model_Evaluator ( void ){;} + + + /// Evaluate the blackboxes quad model at a given trial point + /** + \param x point to evaluate -- \b IN/OUT. + \param h_max h_max for barrier -- \b IN. + \param count_eval Count eval if true -- \b IN. + \return A boolean equal to \c false if the evaluation failed. + */ + virtual bool eval_x ( NOMAD::Eval_Point & x , + const NOMAD::Double & h_max , + bool & count_eval ) const {return Quad_Model_Evaluator::eval_x(x,h_max,count_eval);} + + + }; } #endif diff --git a/src/OrthogonalMesh.cpp b/src/OrthogonalMesh.cpp index 1c7331a..d0a0e60 100644 --- a/src/OrthogonalMesh.cpp +++ b/src/OrthogonalMesh.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -44,69 +51,80 @@ #include "OrthogonalMesh.hpp" /// Constructor (called only by derived objects). -NOMAD::OrthogonalMesh::OrthogonalMesh (const NOMAD::Point & Delta_0 , - const NOMAD::Point & Delta_min , - const NOMAD::Point & delta_min , - const NOMAD::Point & fixed_variables , - NOMAD::Double update_basis, - int coarsening_step, - int refining_step, - int limit_mesh_index ) : -_delta_0 ( Delta_0 ), -_Delta_0 ( Delta_0 ), -_Delta_min ( Delta_min ), -_delta_min ( delta_min ), -_update_basis ( update_basis ), -_coarsening_step ( coarsening_step ), -_refining_step ( refining_step ), +NOMAD::OrthogonalMesh::OrthogonalMesh (bool anisotropic_mesh , + const NOMAD::Point & Delta_0 , + const NOMAD::Point & Delta_min , + const NOMAD::Point & delta_min , + const NOMAD::Point & fixed_variables , + const NOMAD::Point & granularity , + NOMAD::Double update_basis , + int coarsening_step , + int refining_step , + int limit_mesh_index ) : +_delta_0 ( Delta_0 ), +_Delta_0 ( Delta_0 ), +_Delta_min ( Delta_min ), +_delta_min ( delta_min ), +_fixed_variables ( fixed_variables ), +_granularity ( granularity ), +_anisotropic_mesh ( anisotropic_mesh ), +_update_basis ( update_basis ), +_coarsening_step ( coarsening_step ), +_refining_step ( refining_step ), _limit_mesh_index ( limit_mesh_index ) { - - _Delta_min_is_defined=_Delta_min.is_defined(); - _Delta_min_is_complete=_Delta_min.is_complete(); - bool chkMesh = delta_min.is_defined(); - bool chkPoll = _Delta_min_is_defined; - _n = Delta_0.size(); + _Delta_min_is_defined = _Delta_min.is_defined(); + _Delta_min_is_complete = _Delta_min.is_complete(); - _n_free_variables = _n - fixed_variables.nb_defined(); + _delta_min_is_defined = _delta_min.is_defined(); + _delta_min_is_complete = _delta_min.is_complete(); - // The delta_0 are decreased - _delta_0*=pow(_n_free_variables,-0.5); + _n = Delta_0.size(); + + _n_free_variables = _n - _fixed_variables.nb_defined(); + + if ( _granularity.is_defined() && ( ! _granularity.is_complete() || _granularity.size() != _n ) ) + throw NOMAD::Exception ( "OrthogonalMesh.hpp" , __LINE__ , + "NOMAD::OrthogonalMesh::OrthogonalMesh(): granularity has undefined values" ); if ( !_Delta_0.is_complete() ) throw NOMAD::Exception ( "OrthogonalMesh.hpp" , __LINE__ , "NOMAD::OrthogonalMesh::OrthogonalMesh(): delta_0 has undefined values" ); - if ( chkMesh && delta_min.size() != _n ) + if ( _delta_min_is_defined && delta_min.size() != _n ) throw NOMAD::Exception ( "OrthogonalMesh.hpp" , __LINE__ , "NOMAD::OrthogonalMesh::OrthogonalMesh(): delta_0 and delta_min have different sizes" ); - if ( chkPoll && Delta_min.size() != _n ) + if ( _Delta_min_is_defined && Delta_min.size() != _n ) throw NOMAD::Exception ( "OrthogonalMesh.hpp" , __LINE__ , "NOMAD::OrthogonalMesh::OrthogonalMesh(): Delta_0 and Delta_min have different sizes" ); std::string error; + _all_granular = ( _granularity.is_defined() && _granularity.is_complete() ) ? true:false ; for ( int k = 0 ; k < _n ; ++k ) { // we check that Delta_min <= Delta_0 and that delta_min <= delta_0: - if ( chkMesh && - _delta_min[k].is_defined() && - _delta_0[k] < _delta_min[k] ) + if ( _delta_min_is_defined && + _delta_min[k].is_defined() && + _delta_0[k] < _delta_min[k] ) { error = "NOMAD::OrthogonalMesh::OrthogonalMesh(): delta_0 < delta_min"; break; } - if ( chkPoll && - _Delta_min[k].is_defined() && + if ( _Delta_min_is_defined && + _Delta_min[k].is_defined() && _Delta_0[k] < _Delta_min[k] ) { error = "NOMAD::OrthogonalMesh::OrthogonalMesh(): Delta_0 < Delta_min"; break; } + if ( _all_granular && _granularity[k] == 0 ) + _all_granular = false; + } if ( !error.empty() ) @@ -137,42 +155,88 @@ void NOMAD::OrthogonalMesh::set_min_mesh_sizes ( const NOMAD::Point & delta_min if ( ! delta_min.is_defined() ) { _delta_min.clear(); + _delta_min_is_defined = false; + _delta_min_is_complete = false; return; } - // If delta_min defined test that everything is consistent + // Test that given delta_min is valid if ( delta_min.size() != _n ) - throw NOMAD::Exception ( "XMesh.cpp" , __LINE__ , - "NOMAD::OrthogonalMesh::set_min_mesh_sizes() delta_min has dimension different than mesh dimension" ); + throw NOMAD::Exception ( "OrthogonalMesh.cpp" , __LINE__ , + "set_min_mesh_sizes() delta_min has dimension different than mesh dimension" ); - if ( !delta_min.is_complete() ) + if ( ! delta_min.is_complete() ) throw NOMAD::Exception ( "OrthogonalMesh.hpp" , __LINE__ , - "NOMAD::OrthogonalMesh::set_min_mesh_sizes(): delta_min has some defined and undefined values" ); + "set_min_mesh_sizes(): delta_min has some defined and undefined values" ); + + _delta_min.reset(_n); + _delta_min_is_defined = true; + _delta_min_is_complete = true; + _delta_min=delta_min; std::string error; for ( int k = 0 ; k < _n ; ++k ) { // we check that Delta_min <= Delta_0 and that delta_min <= delta_0: - if ( delta_min[k].is_defined() && - _delta_0[k] < delta_min[k] ) + if ( delta_min[k].is_defined() && + _delta_0[k] < delta_min[k] ) { - error = "NOMAD::OrthogonalMesh::set_delta_min(): delta_0 < delta_min"; - break; + _delta_min[k]=_delta_0[k]; } - if ( delta_min[k].is_defined() && + if ( delta_min[k].is_defined() && _Delta_0[k] < delta_min[k] ) { - error = "NOMAD::OrthogonalMesh::set_delta_min(): Delta_0 < delta_min"; - break; + _delta_min[k]=_Delta_0[k]; } } if ( !error.empty() ) - throw NOMAD::Exception ( "OrthogonalMesh.hpp" , __LINE__ , error ); + throw NOMAD::Exception ( "OrthogonalMesh.cpp" , __LINE__ , error ); - _delta_min=delta_min; + +} + + +/// Manually set the min poll size per coordinate. +void NOMAD::OrthogonalMesh::set_min_poll_sizes ( const NOMAD::Point & Delta_min ) +{ + + // If Delta_min undefined than _Delta_min->undefined + if ( ! Delta_min.is_defined() ) + { + _Delta_min.clear(); + _Delta_min_is_defined = false; + _Delta_min_is_complete = false; + return; + } + + // Test that given Delta_min is valid + if ( Delta_min.size() != _n ) + throw NOMAD::Exception ( "OrthogonalMesh.cpp" , __LINE__ , + "set_min_poll_sizes() Delta_min has dimension different than mesh dimension" ); + + // Test that the given Delta_min is complete + if ( ! Delta_min.is_complete() ) + throw NOMAD::Exception ( "OrthogonalMesh.hpp" , __LINE__ , + "set_min_poll_sizes(): Delta_min has some defined and undefined values" ); + + _Delta_min.reset( _n ); + _Delta_min = Delta_min; + _Delta_min_is_defined = true; + _Delta_min_is_complete = true; + + std::string error; + for ( int k = 0 ; k < _n ; ++k ) + { + // we check that Delta_min <= Delta_0 : + if ( Delta_min[k].is_defined() && _Delta_0[k] < Delta_min[k] ) + _Delta_min[k]=_Delta_0[k]; + } + + if ( !error.empty() ) + throw NOMAD::Exception ( "OrthogonalMesh.cpp" , __LINE__ , error ); } diff --git a/src/OrthogonalMesh.hpp b/src/OrthogonalMesh.hpp index 5971ae5..92887d9 100644 --- a/src/OrthogonalMesh.hpp +++ b/src/OrthogonalMesh.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file OrthogonalMesh.hpp - \brief Virtual class for the MADS orthogonal meshes (headers) - \author Christophe Tribes - \date 2010-04-06 - \see Mesh.cpp XMesh.cpp -*/ + \file OrthogonalMesh.hpp + \brief Virtual class for the MADS orthogonal meshes (headers) + \author Christophe Tribes + \date 2010-04-06 + \see Mesh.cpp XMesh.cpp + */ #ifndef __ORTHOGONALMESH__ #define __ORTHOGONALMESH__ @@ -47,338 +54,366 @@ #include "Direction.hpp" namespace NOMAD { - - /// Virtual class for the MADS orthogonal meshes. - /** + + /// Virtual class for the MADS orthogonal meshes. + /** - An orthogonal mesh in NOMAD is defined with the basic orthogonal directions the - mesh size parameter delta^k. + mesh size parameter delta^k. - The poll size parameter Delta^k is not used to define the mesh but - to define the poll trial points. + to define the poll trial points. - At each MADS iteration the mesh is updated. - Mesh and poll size parameters are stored as NOMAD::Point objects. - */ - class OrthogonalMesh { - - /*--------------------------------------------------------------*/ - private: - - - /*--------------------------------------------------------------*/ - - /// Private affectation operator. - /** - \param m The right-hand side object -- \b IN. - */ - const OrthogonalMesh & operator = ( const OrthogonalMesh & m ); - - - /*--------------------------------------------------------------*/ - protected: - - - NOMAD::Point _delta_0; - NOMAD::Point _Delta_0; - NOMAD::Point _Delta_min; - NOMAD::Point _delta_min; - - - NOMAD::Double _update_basis; - int _coarsening_step; - int _refining_step ; - - int _n; + - A mesh index is mapped to the mesh and poll sizes. + */ + class OrthogonalMesh { + + /*--------------------------------------------------------------*/ + private: + + + /*--------------------------------------------------------------*/ + + /// Private affectation operator. + /** + \param m The right-hand side object -- \b IN. + */ + const OrthogonalMesh & operator = ( const OrthogonalMesh & m ); + + + /*--------------------------------------------------------------*/ + protected: + + + NOMAD::Point _delta_0; + NOMAD::Point _Delta_0; + NOMAD::Point _Delta_min; + NOMAD::Point _delta_min; + NOMAD::Point _fixed_variables; + NOMAD::Point _granularity; + + bool _anisotropic_mesh; + bool _all_granular; bool _Delta_min_is_defined; bool _Delta_min_is_complete; + bool _delta_min_is_defined; + bool _delta_min_is_complete; + + NOMAD::Double _update_basis; + int _coarsening_step; + int _refining_step ; + + int _n; int _n_free_variables; int _limit_mesh_index; // Limit max or min of the mesh index for fine mesh (SMesh->max, XMesh->min) - - /// Constructor (called only by derived objects). - /** - \param Delta_0 Initial poll size Delta_0 -- \b IN. - \param Delta_min Minimal poll size Delta_min (may be undefined) -- \b IN. - \param delta_min Minimal mesh size delta_min (may be undefined) -- \b IN. - \param fixed_variables Fixed variables -- \b IN. - \param update_basis Mesh/poll update basis (tau) -- \b IN. - \param coarsening_step Mesh/poll coarsening exponent (w+) -- \b IN. - \param refining_step Mesh/poll refining exponent (w-) -- \b IN. - \param limit_mesh_index Limit mesh index to trigger stopping criterion -- \b IN. - */ - OrthogonalMesh (const NOMAD::Point & Delta_0 , - const NOMAD::Point & Delta_min , - const NOMAD::Point & delta_min , - const NOMAD::Point & fixed_variables , - NOMAD::Double update_basis, - int coarsening_step, - int refining_step, - int limit_mesh_index ) ; - - - /// Copy constructor (called only by derived objects). - /** - \param m The copied object -- \b IN. - */ - OrthogonalMesh ( const OrthogonalMesh & m ) - : _delta_0 ( m._delta_0 ), - _Delta_0 ( m._Delta_0 ), - _Delta_min ( m._Delta_min ), - _delta_min ( m._delta_min ), - _update_basis ( m._update_basis ), - _coarsening_step ( m._coarsening_step ), - _refining_step ( m._refining_step ), - _n ( m._n ), - _Delta_min_is_defined ( m._Delta_min_is_defined ), - _Delta_min_is_complete ( m._Delta_min_is_complete ), - _n_free_variables ( m._n_free_variables ), - _limit_mesh_index ( m._limit_mesh_index){} - - - /*--------------------------------------------------------------*/ - public: - - - /// Destructor. - virtual ~OrthogonalMesh ( void ){;} - - - /// Update the Mesh (poll and mesh sizes). - /** - \param success Type of success of the iteration -- \b IN. - \param dir Direction of the iteration (optional) -- \b IN. - */ - virtual void update ( NOMAD::success_type success, const NOMAD::Direction * dir=NULL) = 0; - - - /// Update the provided mesh indices (the Mesh is unchanged). - /** - \param success Type of success of the iteration -- \b IN. - \param mesh_indices Provided mesh indices for update -- \b IN/OUT. - \param dir Direction of the iteration (optional) -- \b IN. - */ - virtual void update ( NOMAD::success_type success, NOMAD::Point & mesh_indices, const NOMAD::Direction * dir=NULL ) const = 0; - - - - /// Reset the Mesh to its original sizes (poll and mesh sizes). - virtual void reset ( void ) = 0; - - - /// Access to the initial mesh size. - /** - \return A NOMAD::Point for the initial mesh size. - */ - const NOMAD::Point & get_initial_mesh_size ( void ) const { return _delta_0; } + + /// Constructor (called only by derived objects). + /** + \param anisotropic_mesh Anisotropy of the mesh (true or false) -- \b IN. + \param Delta_0 Initial poll size Delta_0 -- \b IN. + \param Delta_min Minimal poll size Delta_min (may be undefined) -- \b IN. + \param delta_min Minimal mesh size delta_min (may be undefined) -- \b IN. + \param fixed_variables Fixed variables -- \b IN. + \param granularity Granularity of variables -- \b IN. + \param update_basis Mesh/poll update basis (tau) -- \b IN. + \param coarsening_step Mesh/poll coarsening exponent (w+) -- \b IN. + \param refining_step Mesh/poll refining exponent (w-) -- \b IN. + \param limit_mesh_index Limit mesh index to trigger stopping criterion -- \b IN. + */ + OrthogonalMesh (bool anisotropic_mesh , + const NOMAD::Point & Delta_0 , + const NOMAD::Point & Delta_min , + const NOMAD::Point & delta_min , + const NOMAD::Point & fixed_variables , + const NOMAD::Point & granularity , + NOMAD::Double update_basis, + int coarsening_step, + int refining_step, + int limit_mesh_index ) ; + + + /// Copy constructor (called only by derived objects). + /** + \param m The copied object -- \b IN. + */ + OrthogonalMesh ( const OrthogonalMesh & m ) + : + _delta_0 ( m._delta_0 ), + _Delta_0 ( m._Delta_0 ), + _Delta_min ( m._Delta_min ), + _delta_min ( m._delta_min ), + _fixed_variables ( m._fixed_variables ), + _granularity ( m._granularity ), + _anisotropic_mesh ( m._anisotropic_mesh ), + _Delta_min_is_defined ( m._Delta_min_is_defined ), + _Delta_min_is_complete ( m._Delta_min_is_complete ), + _delta_min_is_defined ( m._delta_min_is_defined ), + _delta_min_is_complete ( m._delta_min_is_complete ), + _update_basis ( m._update_basis ), + _coarsening_step ( m._coarsening_step ), + _refining_step ( m._refining_step ), + _n ( m._n ), + _n_free_variables ( m._n_free_variables ), + _limit_mesh_index ( m._limit_mesh_index ){} + + + /*--------------------------------------------------------------*/ + public: + + + /// Destructor. + virtual ~OrthogonalMesh ( void ){;} + + + /// Update the Mesh (poll and mesh sizes). + /** + \param success Type of success of the iteration -- \b IN. + \param dir Direction of the iteration (optional) -- \b IN. + */ + virtual void update ( NOMAD::success_type success, const NOMAD::Direction * dir=NULL) = 0; + + + /// Update the provided mesh indices (the Mesh is unchanged). + /** + \param success Type of success of the iteration -- \b IN. + \param mesh_indices Provided mesh indices for update -- \b IN/OUT. + \param dir Direction of the iteration (optional) -- \b IN. + */ + virtual void update ( NOMAD::success_type success, NOMAD::Point & mesh_indices, + const NOMAD::Direction * dir=NULL ) const = 0; + + + + /// Reset the Mesh to its original sizes (poll and mesh sizes). + virtual void reset ( void ) = 0; + + + /// Access to the initial mesh size. + /** + \return A NOMAD::Point for the initial mesh size. + */ + const NOMAD::Point & get_initial_mesh_size ( void ) const { return _delta_0; } /// Access to the initial poll size. /** \return A NOMAD::Point for the initial poll size. */ const NOMAD::Point & get_initial_poll_size ( void ) const { return _Delta_0; } - - - /// Access to the minimal mesh size. - /** - \return A NOMAD::Point for the minimal mesh size. - */ - const NOMAD::Point & get_min_mesh_size ( void ) const { return _delta_min; } - - - /// Access to the minimal poll size. - /** - \return A NOMAD::Point for the minimal poll size. - */ - const NOMAD::Point & get_min_poll_size ( void ) const { return _Delta_min; } - - - /// Test if mesh is finest so far. - /** - \return True if mesh is the finest so far, False otherwise. - */ - virtual bool is_finest(void) const = 0; - + + /// Access to the minimal mesh size. + /** + \return A NOMAD::Point for the minimal mesh size. + */ + const NOMAD::Point & get_min_mesh_size ( void ) const { return _delta_min; } + + + /// Access to the minimal poll size. + /** + \return A NOMAD::Point for the minimal poll size. + */ + const NOMAD::Point & get_min_poll_size ( void ) const { return _Delta_min; } + + + /// Test if mesh is finest so far. + /** + \return True if mesh is the finest so far, False otherwise. + */ + virtual bool is_finest(void) const = 0; + + /// Test if current mesh is finer than initial mesh (used by VNS search). - /** - \return True if mesh size is smaller than initial mesh size for all components. - */ - bool is_finer_than_initial (void) const; - + /** + \return True if mesh size is smaller than initial mesh size for all components. + */ + virtual bool is_finer_than_initial (void) const; + + + /// Access to the mesh/poll update basis tau. + /** + \return A double with the update basis tau. + */ + double get_update_basis ( void ) const { return _update_basis.value(); } + + + /// Access to the mesh ratio after a success + /** + \return A point with the ratio for each coordinate + */ + virtual NOMAD::Point get_mesh_ratio_if_success( void ) const = 0; + + + /// Access to the number of variables. + /** + \return An integer with the number of variables. + */ + int get_n ( void ) const { return _n; } - /// Access to the mesh/poll update basis tau. - /** - \return A double with the update basis tau. - */ - double get_update_basis ( void ) const { return _update_basis.value(); } - - - /// Access to the mesh ratio after a success - /** - \return A point with the ratio for each coordinate - */ - virtual NOMAD::Point get_mesh_ratio_if_success( void ) const = 0; - - - /// Access to the number of variables. - /** - \return An integer with the number of variables. - */ - int get_n ( void ) const { return _n; } - /// Access to the number of free variables. - /** - \return An integer with the number of free variables. - */ - int get_n_free_variables ( void ) const { return _n_free_variables; } - + /** + \return An integer with the number of free variables. + */ + int get_n_free_variables ( void ) const { return _n_free_variables; } + /// Access to the mesh size parameter delta^k. - /** - \return delta The mesh size parameter delta^k -- \b OUT. - */ - NOMAD::Point get_delta ( void ) const + /** + \return delta The mesh size parameter delta^k -- \b OUT. + */ + NOMAD::Point get_delta ( void ) const { NOMAD::Point delta; get_delta(delta); return delta; } - - /// Access to the mesh size parameter delta^k. - /** - \param delta The mesh size parameter delta^k -- \b OUT. - \return A boolean equal to \c true if all values are - strictly inferior than the associated minimal - mesh size delta_min - (stopping criterion MIN_MESH_SIZE). - */ - virtual bool get_delta ( NOMAD::Point & delta ) const = 0; - - /// Access to the largest mesh size. - /** - \return The largest mesh size -- \b OUT. - */ - virtual NOMAD::Point get_delta_max ( void ) const = 0; - + + /// Access to the mesh size parameter delta^k. + /** + \param delta The mesh size parameter delta^k -- \b OUT. + \return A boolean equal to \c true if all values are + strictly inferior than the associated minimal + mesh size delta_min + (stopping criterion MIN_MESH_SIZE). + */ + virtual bool get_delta ( NOMAD::Point & delta ) const = 0; + + /// Access to the largest mesh size. + /** + \return The largest mesh size -- \b OUT. + */ + virtual NOMAD::Point get_delta_max ( void ) const = 0; + /// Access to the poll size parameter Delta^k. - /** - \return Delta The poll size parameter Delta^k -- \b OUT. - */ - NOMAD::Point get_Delta ( void ) + /** + \return Delta The poll size parameter Delta^k -- \b OUT. + */ + NOMAD::Point get_Delta ( void ) { NOMAD::Point Delta; get_Delta(Delta); return Delta; } - /// Access to the poll size parameter Delta^k. - /** - \param Delta The poll size parameter Delta^k -- \b OUT. - \return A boolean equal to \c true if all values are - strictly inferior than the associated minimal - mesh size delta_min - (stopping criterion MIN_POLL_SIZE). - */ - virtual bool get_Delta ( NOMAD::Point & Delta ) const = 0 ; - - - /// Display. - /** - \param out The NOMAD::Display object -- \b IN. - */ - virtual void display ( const NOMAD::Display & out ) const = 0; - - /// Check the stopping conditions on the minimal poll and mesh sizes. - /** - \param stop Stop flag -- \b IN/OUT. - \param stop_reason Stop reason -- \b OUT. - */ - virtual void check_min_mesh_sizes ( bool & stop , - NOMAD::stop_type & stop_reason ) const = 0; - - /// Access to the mesh indices per coordinate. - /** - \return A point with the mesh index for each coordinate. - */ - virtual const NOMAD::Point get_mesh_indices ( void ) const = 0; - - /// Manually set the mesh indices per coordinate (virtual). - /** - \param r The mesh index per coordinate -- \b IN. - */ - virtual void set_mesh_indices ( const NOMAD::Point & r ) =0 ; - - /// Manually set the min mesh size per coordinate. - /** - \param delta_min The min mesh sizes per coordinate (can be undefined) -- \b IN. - */ - void set_min_mesh_sizes ( const NOMAD::Point & delta_min ); - - /// Manually set intial mesh size per coordinate. - /** - \param d The initial mesh sizes per coordinate -- \b IN. - */ + /// Access to the poll size parameter Delta^k. + /** + \param Delta The poll size parameter Delta^k -- \b OUT. + \return A boolean equal to \c true if all values are + strictly inferior than the associated minimal + mesh size delta_min + (stopping criterion MIN_POLL_SIZE). + */ + virtual bool get_Delta ( NOMAD::Point & Delta ) const = 0 ; + + + /// Display. + /** + \param out The NOMAD::Display object -- \b IN. + */ + virtual void display ( const NOMAD::Display & out ) const = 0; + + /// Check the stopping conditions on the minimal poll and mesh sizes. + /** + \param stop Stop flag -- \b IN/OUT. + \param stop_reason Stop reason -- \b OUT. + */ + virtual void check_min_mesh_sizes ( bool & stop , + NOMAD::stop_type & stop_reason ) const = 0; + + /// Access to the mesh indices per coordinate. + /** + \return A point with the mesh index for each coordinate. + */ + virtual const NOMAD::Point get_mesh_indices ( void ) const = 0; + + /// Manually set the mesh indices per coordinate (virtual). + /** + \param r The mesh index per coordinate -- \b IN. + */ + virtual void set_mesh_indices ( const NOMAD::Point & r ) =0 ; + + /// Manually set the min mesh size per coordinate. + /** + \param delta_min The min mesh sizes per coordinate (can be undefined) -- \b IN. + */ + void set_min_mesh_sizes ( const NOMAD::Point & delta_min ); + + /// Manually set the min poll size per coordinate. + /** + \param Delta_min The min poll sizes per coordinate (can be undefined) -- \b IN. + */ + void set_min_poll_sizes ( const NOMAD::Point & Delta_min ); + + + /// Manually set intial mesh size per coordinate. + /** + \param d The initial mesh sizes per coordinate -- \b IN. + */ void set_delta_0 ( const NOMAD::Point & d ); - /// Manually set intial poll size per coordinate. - /** - \param d The initial poll sizes per coordinate -- \b IN. - */ + /// Manually set intial poll size per coordinate. + /** + \param d The initial poll sizes per coordinate -- \b IN. + */ void set_Delta_0 ( const NOMAD::Point & d ); - - - /// Access to the min mesh indices reached so far. - /** - \return A point with the mesh index for each coordinate. - */ - virtual const NOMAD::Point get_min_mesh_indices ( void ) const = 0; - - /// Access to the max mesh indices reached so far. - /** - \return A point with the mesh index for each coordinate. - */ - virtual const NOMAD::Point get_max_mesh_indices ( void ) const = 0; - - + + + /// Access to the min mesh indices reached so far. + /** + \return A point with the mesh index for each coordinate. + */ + virtual const NOMAD::Point get_min_mesh_indices ( void ) const = 0; + + /// Access to the max mesh indices reached so far. + /** + \return A point with the mesh index for each coordinate. + */ + virtual const NOMAD::Point get_max_mesh_indices ( void ) const = 0; + + /// Access to the limit mesh index. - /** - \return An integer with the limit mesh index. - */ - int get_limit_mesh_index ( void ) const { return _limit_mesh_index;} + /** + \return An integer with the limit mesh index. + */ + int get_limit_mesh_index ( void ) const { return _limit_mesh_index;} /// Manually set the limit mesh index. - /** - \param limit_mesh_index The limit mesh index. - */ - virtual void set_limit_mesh_index ( int limit_mesh_index ) = 0; - + /** + \param limit_mesh_index The limit mesh index. + */ + virtual void set_limit_mesh_index ( int limit_mesh_index ) = 0; + + + /// Scale and project the ith component of a vector on the mesh + /** + \param i The vector component number -- \b IN. + \param l The vector component value -- \b IN. + \param round_up The flag to perform or not rounding up (optional) -- \b IN. + \return The ith component of a vector after mesh scaling and projection + */ + virtual NOMAD::Double scale_and_project(int i, + const NOMAD::Double & l, + bool round_up=false ) const = 0 ; + - /// Scale and project the ith component of a vector on the mesh - /** - \param i The vector component number -- \b IN. - \param l The vector component value -- \b IN. - \return The ith component of a vector after mesh scaling and projection - */ - virtual NOMAD::Double scale_and_project(int i, const NOMAD::Double & l) const = 0 ; - - - }; - - /// Display a NOMAD::OrthogonalMesh object. - /** + }; + + /// Display a NOMAD::OrthogonalMesh object. + /** \param out The NOMAD::Display object -- \b IN. \param m The NOMAD::OrthogonalMesh object to be displayed -- \b IN. \return The NOMAD::Display object. - */ - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::OrthogonalMesh & m ) - { - m.display ( out ); - return out; - } + */ + inline const NOMAD::Display & operator << ( const NOMAD::Display & out , + const NOMAD::OrthogonalMesh & m ) + { + m.display ( out ); + return out; + } } #endif diff --git a/src/Parameter_Entries.cpp b/src/Parameter_Entries.cpp index 6a7392c..d2ef0d3 100644 --- a/src/Parameter_Entries.cpp +++ b/src/Parameter_Entries.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Parameter_Entries.cpp - \brief Parameter entries (implementation) - \author Sebastien Le Digabel - \date 2010-04-05 - \see Parameter_Entries.hpp -*/ + \file Parameter_Entries.cpp + \brief Parameter entries (implementation) + \author Sebastien Le Digabel + \date 2010-04-05 + \see Parameter_Entries.hpp + */ #include "Parameter_Entries.hpp" /*--------------------------------------------*/ @@ -47,10 +54,10 @@ /*--------------------------------------------*/ NOMAD::Parameter_Entries::~Parameter_Entries ( void ) { - std::multiset<NOMAD::Parameter_Entry*, NOMAD::Parameter_Entry_Comp>::iterator + std::multiset<NOMAD::Parameter_Entry*, NOMAD::Parameter_Entry_Comp>::iterator end = _entries.end() , it; - for ( it = _entries.begin() ; it != end ; ++it) - delete *it; + for ( it = _entries.begin() ; it != end ; ++it) + delete *it; } /*--------------------------------------------*/ @@ -58,12 +65,12 @@ NOMAD::Parameter_Entries::~Parameter_Entries ( void ) /*--------------------------------------------*/ NOMAD::Parameter_Entry * NOMAD::Parameter_Entries::find ( const std::string & name ) const { - NOMAD::Parameter_Entry p (name); - std::multiset<NOMAD::Parameter_Entry*, NOMAD::Parameter_Entry_Comp>::const_iterator + NOMAD::Parameter_Entry p (name); + std::multiset<NOMAD::Parameter_Entry*, NOMAD::Parameter_Entry_Comp>::const_iterator it = _entries.find ( &p ); - if ( it != _entries.end() ) - return (*it); - return NULL; + if ( it != _entries.end() ) + return (*it); + return NULL; } /*----------------------------------------*/ @@ -71,15 +78,16 @@ NOMAD::Parameter_Entry * NOMAD::Parameter_Entries::find ( const std::string & na /*----------------------------------------*/ void NOMAD::Parameter_Entries::insert ( NOMAD::Parameter_Entry * entry ) { - NOMAD::Parameter_Entry * cur = find ( entry->get_name() ); - if ( cur ) { - entry->set_unique ( false ); - cur->set_unique ( false ); - while ( cur->get_next() ) - cur = cur->get_next(); - cur->set_next ( entry ); - } - _entries.insert ( entry ); + NOMAD::Parameter_Entry * cur = find ( entry->get_name() ); + if ( cur ) + { + entry->set_unique ( false ); + cur->set_unique ( false ); + while ( cur->get_next() ) + cur = cur->get_next(); + cur->set_next ( entry ); + } + _entries.insert ( entry ); } /*----------------------------------------*/ @@ -87,12 +95,12 @@ void NOMAD::Parameter_Entries::insert ( NOMAD::Parameter_Entry * entry ) /*----------------------------------------*/ NOMAD::Parameter_Entry * NOMAD::Parameter_Entries::find_non_interpreted ( void ) const { - std::multiset<NOMAD::Parameter_Entry*, NOMAD::Parameter_Entry_Comp>::const_iterator + std::multiset<NOMAD::Parameter_Entry*, NOMAD::Parameter_Entry_Comp>::const_iterator end = _entries.end() , it; - for ( it = _entries.begin() ; it != end ; ++it ) - if ( !(*it)->has_been_interpreted() ) - return *it; - return NULL; + for ( it = _entries.begin() ; it != end ; ++it ) + if ( !(*it)->has_been_interpreted() ) + return *it; + return NULL; } /*--------------------------------------------*/ @@ -100,8 +108,8 @@ NOMAD::Parameter_Entry * NOMAD::Parameter_Entries::find_non_interpreted ( void ) /*--------------------------------------------*/ void NOMAD::Parameter_Entries::display ( const NOMAD::Display & out ) const { - std::multiset<NOMAD::Parameter_Entry*,NOMAD::Parameter_Entry_Comp>::const_iterator + std::multiset<NOMAD::Parameter_Entry*,NOMAD::Parameter_Entry_Comp>::const_iterator end = _entries.end() , it; - for ( it = _entries.begin() ; it != end ; ++it ) - out << **it << std::endl; + for ( it = _entries.begin() ; it != end ; ++it ) + out << **it << std::endl; } diff --git a/src/Parameter_Entries.hpp b/src/Parameter_Entries.hpp index aff4d01..d2682bf 100644 --- a/src/Parameter_Entries.hpp +++ b/src/Parameter_Entries.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,80 +41,81 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Parameter_Entries.hpp - \brief Parameter entries (headers) - \author Sebastien Le Digabel - \date 2010-04-05 - \see Parameter_Entries.cpp -*/ + \file Parameter_Entries.hpp + \brief Parameter entries (headers) + \author Sebastien Le Digabel + \date 2010-04-05 + \see Parameter_Entries.cpp + */ #ifndef __PARAMETER_ENTRIES__ #define __PARAMETER_ENTRIES__ #include "Parameter_Entry.hpp" namespace NOMAD { - - /// Parameter entries. - /** + + /// Parameter entries. + /** - Objects of this class store NOMAD::Parameter_Entry objects. - One NOMAD::Parameter_Entries object summarizes an entire parameters file. - */ - class Parameter_Entries : private NOMAD::Uncopyable { - - private: - - /// List of NOMAD::Parameter_Entry objects (the entries). - std::multiset<NOMAD::Parameter_Entry *, NOMAD::Parameter_Entry_Comp> _entries; - - public: - - /// Constructor. - explicit Parameter_Entries ( void ) {} - - /// Destructor. - virtual ~Parameter_Entries ( void ); - - /// Find a specific entry in a set. - /** - \param name The name of the wanted NOMAD::Parameter_Entry object -- \b IN. - \return A pointer to the NOMAD::Parameter_Entry object if it - has been found in the list of entries, - or \c NULL otherwise. - */ - NOMAD::Parameter_Entry * find ( const std::string & name ) const; - - /// Insert a new entry in the list of entries. - /** - \param entry A pointer to the new NOMAD::Parameter_Entry object -- \b IN. - */ - void insert ( NOMAD::Parameter_Entry * entry ); - - /// Find a non-interpreted entry. - /** - \return A pointer to the first NOMAD::Parameter_Entry that has not been - interpreted so far, - or \c NULL if all entries have already been interpreted. - */ - NOMAD::Parameter_Entry * find_non_interpreted ( void ) const; - - /// Display. + */ + class Parameter_Entries : private NOMAD::Uncopyable { + + private: + + /// List of NOMAD::Parameter_Entry objects (the entries). + std::multiset<NOMAD::Parameter_Entry *, NOMAD::Parameter_Entry_Comp> _entries; + + public: + + /// Constructor. + explicit Parameter_Entries ( void ) {} + + /// Destructor. + virtual ~Parameter_Entries ( void ); + + /// Find a specific entry in a set. + /** + \param name The name of the wanted NOMAD::Parameter_Entry object -- \b IN. + \return A pointer to the NOMAD::Parameter_Entry object if it + has been found in the list of entries, + or \c NULL otherwise. + */ + NOMAD::Parameter_Entry * find ( const std::string & name ) const; + + /// Insert a new entry in the list of entries. + /** + \param entry A pointer to the new NOMAD::Parameter_Entry object -- \b IN. + */ + void insert ( NOMAD::Parameter_Entry * entry ); + + /// Find a non-interpreted entry. + /** + \return A pointer to the first NOMAD::Parameter_Entry that has not been + interpreted so far, + or \c NULL if all entries have already been interpreted. + */ + NOMAD::Parameter_Entry * find_non_interpreted ( void ) const; + + /// Display. + /** + \param out The NOMAD::Display object -- \b IN. + */ + void display ( const NOMAD::Display & out ) const; + }; + + /// Display a NOMAD::Parameter_Entries object. /** - \param out The NOMAD::Display object -- \b IN. - */ void display ( const NOMAD::Display & out ) const; - }; - - /// Display a NOMAD::Parameter_Entries object. - /** \param out The NOMAD::Display object -- \b IN. \param e The NOMAD::Parameter_Entries object to be displayed -- \b IN. \return The NOMAD::Display object. - */ - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::Parameter_Entries & e ) - { - e.display ( out ); - return out; - } + */ + inline const NOMAD::Display & operator << ( const NOMAD::Display & out , + const NOMAD::Parameter_Entries & e ) + { + e.display ( out ); + return out; + } } #endif diff --git a/src/Parameter_Entry.cpp b/src/Parameter_Entry.cpp index de60272..198d80b 100644 --- a/src/Parameter_Entry.cpp +++ b/src/Parameter_Entry.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Parameter_Entry.cpp - \brief Parameter entry (implementation) - \author Sebastien Le Digabel - \date 2010-04-05 - \see Parameter_Entry.hpp -*/ + \file Parameter_Entry.cpp + \brief Parameter entry (implementation) + \author Sebastien Le Digabel + \date 2010-04-05 + \see Parameter_Entry.hpp + */ #include "Parameter_Entry.hpp" /*-----------------------------------*/ @@ -47,133 +54,147 @@ /* . ignores all entries after '#' */ /*-----------------------------------*/ NOMAD::Parameter_Entry::Parameter_Entry ( const std::string & entry , - bool remove_comments ) - : _ok ( false ) , - _unique ( true ) , - _next ( NULL ) , - _has_been_interpreted ( false ) + bool remove_comments ) +: _ok ( false ) , +_unique ( true ) , +_next ( NULL ) , +_has_been_interpreted ( false ) { - int i , idst; - std::string s; - std::istringstream in ( entry ); - in >> _name; - - if (_name.size()==0) - return; - - if ( remove_comments && _name[0] == '#' ) - _name.clear(); - else { - - NOMAD::toupper ( _name ); - - bool stats_file_name_read = false; - - while ( true ) { - in >> s; - - if ( in.fail() ) - break; - - // comment: - if ( remove_comments && s[0]=='#' ) - break; - - // string with quotes: - bool had_quotes = false; - if ( s[0] == '\"' || s[0] == '\'' ) { - - had_quotes = true; - char quote = s[0]; - - s.erase ( s.begin() ); - - if ( s[s.size()-1] == quote ) - s.resize ( s.size() - 1 ); - - else { - std::string ss; - getline ( in , ss , quote ); - - if ( in.fail() || !in.good()) { - _ok = false; - return; - } - - s = s + ss; - } - } - - // DISPLAY_STATS or STATS_FILE: - if ( _name == "STATS_FILE" && !stats_file_name_read ) - stats_file_name_read = true; - - else if ( _name == "DISPLAY_STATS" || _name == "STATS_FILE" ) { - - if ( had_quotes ) { - _ok = false; - return; - } - - std::string keyword , ss = s; - bool interpreted = false; - NOMAD::toupper ( ss ); - - NOMAD::display_stats_type dst = NOMAD::DS_OBJ; - while ( dst < NOMAD::DS_UNDEFINED ) { - - keyword = NOMAD::Display::get_display_stats_keyword (dst); - - i = static_cast<int> ( ss.rfind ( keyword , ss.size()-1 ) ); - - if ( i >= 0 ) { - std::string s1 = s.substr ( 0 , i ); - std::string s2 = s.substr ( i+keyword.size() ); - if ( !s1.empty() ) - _values.push_back ( s1 ); - _values.push_back ( keyword ); - if ( !s2.empty() ) - _values.push_back ( s2 ); - _values.push_back ( std::string() ); - interpreted = true; - break; - } - - // loop increment: - idst = dst; - ++idst; - dst = static_cast<NOMAD::display_stats_type> ( idst ); - } - - if ( !interpreted ) { - _values.push_back ( s ); - _values.push_back ( std::string() ); - } - - continue; - } - - // vector: - if ( s.size() > 1 && ( s[0] == '[' || s[0] == '(' ) ) { - _values.push_back ( s[0]=='[' ? "[" : "(" ); - s.erase(s.begin()); - } - int sm1 = static_cast<int>(s.size()) - 1; - char c = s[sm1]; - if ( s.size() > 1 && ( c == ']' || c == ')' ) ) { - s.resize(sm1); - _values.push_back (s); - _values.push_back ( c==']' ? "]" : ")" ); - continue; - } - - // other values: - _values.push_back ( s ); + int i , idst; + std::string s; + std::istringstream in ( entry ); + in >> _name; + + if (_name.size()==0) + return; + + if ( remove_comments && _name[0] == '#' ) + _name.clear(); + else + { + + + NOMAD::toupper ( _name ); + + bool stats_file_name_read = false; + + while ( true ) + { + in >> s; + + if ( in.fail() ) + break; + + // comment: + if ( remove_comments && s[0]=='#' ) + break; + + // string with quotes: + bool had_quotes = false; + if ( s[0] == '\"' || s[0] == '\'' ) + { + + had_quotes = true; + char quote = s[0]; + + s.erase ( s.begin() ); + + if ( s[s.size()-1] == quote ) + s.resize ( s.size() - 1 ); + + else + { + + std::string ss; + getline ( in , ss , quote ); + + if ( in.fail() || !in.good()) + { + _ok = false; + return; + } + + s = s + ss; + } + } + + // DISPLAY_STATS or STATS_FILE: + if ( _name == "STATS_FILE" && !stats_file_name_read ) + stats_file_name_read = true; + + else if ( _name == "DISPLAY_STATS" || _name == "STATS_FILE" ) + { + + if ( had_quotes ) + { + _ok = false; + return; + } + + std::string keyword , ss = s; + bool interpreted = false; + NOMAD::toupper ( ss ); + + NOMAD::display_stats_type dst = NOMAD::DS_OBJ; + while ( dst < NOMAD::DS_UNDEFINED ) + { + + keyword = NOMAD::Display::get_display_stats_keyword (dst); + + i = static_cast<int> ( ss.rfind ( keyword , ss.size()-1 ) ); + + if ( i >= 0 ) + { + std::string s1 = s.substr ( 0 , i ); + std::string s2 = s.substr ( i+keyword.size() ); + if ( !s1.empty() ) + _values.push_back ( s1 ); + _values.push_back ( keyword ); + if ( !s2.empty() ) + _values.push_back ( s2 ); + _values.push_back ( std::string() ); + interpreted = true; + break; + } + + // loop increment: + idst = dst; + ++idst; + dst = static_cast<NOMAD::display_stats_type> ( idst ); + } + + if ( !interpreted ) + { + _values.push_back ( s ); + _values.push_back ( std::string() ); + } + + continue; + } + + // vector: + if ( s.size() > 1 && ( s[0] == '[' || s[0] == '(' ) ) + { + _values.push_back ( s[0]=='[' ? "[" : "(" ); + s.erase(s.begin()); + } + int sm1 = static_cast<int>(s.size()) - 1; + char c = s[sm1]; + if ( s.size() > 1 && ( c == ']' || c == ')' ) ) + { + s.resize(sm1); + _values.push_back (s); + _values.push_back ( c==']' ? "]" : ")" ); + continue; + } + + // other values: + _values.push_back ( s ); + } + + if ( !_values.empty() ) + _ok = true; } - - if ( !_values.empty() ) - _ok = true; - } } /*------------------------------*/ @@ -181,10 +202,11 @@ NOMAD::Parameter_Entry::Parameter_Entry ( const std::string & entry , /*------------------------------*/ void NOMAD::Parameter_Entry::display ( const NOMAD::Display & out ) const { - if ( _ok ) { - out << _name << ": "; - std::list<std::string>::const_iterator end = _values.end(); - for ( std::list<std::string>::const_iterator it = _values.begin() ; it != end ; ++it ) - out << "[" << *it << "] "; - } + if ( _ok ) + { + out << _name << ": "; + std::list<std::string>::const_iterator end = _values.end(); + for ( std::list<std::string>::const_iterator it = _values.begin() ; it != end ; ++it ) + out << "[" << *it << "] "; + } } diff --git a/src/Parameter_Entry.hpp b/src/Parameter_Entry.hpp index 7c1e0b9..85bfe40 100644 --- a/src/Parameter_Entry.hpp +++ b/src/Parameter_Entry.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -74,7 +81,7 @@ namespace NOMAD { \param entry A string describing the parameter entry -- \b IN. \param remove_comments A boolean equal to \c true if entries after \c '#' are ignored -- \b IN - -- \b optional (default = \c true). + -- \b optional (default = \c true). */ Parameter_Entry ( const std::string & entry , bool remove_comments = true ); @@ -189,7 +196,7 @@ namespace NOMAD { \return The NOMAD::Display object. */ inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::Parameter_Entry & e ) + const NOMAD::Parameter_Entry & e ) { e.display ( out ); return out; diff --git a/src/Parameters.cpp b/src/Parameters.cpp index cf218fe..5e89b82 100644 --- a/src/Parameters.cpp +++ b/src/Parameters.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -47,6 +54,7 @@ bool NOMAD::Parameters::_warning_has_been_displayed=false; + /*----------------------------------------*/ /* destructor */ /*----------------------------------------*/ @@ -65,7 +73,6 @@ void NOMAD::Parameters::init ( void ) // miscellaneous and algorithm parameters: _to_be_checked = true; _seed = 0; - // _seed = NOMAD::get_pid(); _max_eval = -1; _max_sim_bb_eval = -1; _max_bb_eval = -1; @@ -99,18 +106,21 @@ void NOMAD::Parameters::init ( void ) set_INF_STR ( NOMAD::DEFAULT_INF_STR ); // Mesh: - _anisotropic_mesh = true; - _use_smesh = false; - _mesh_update_basis = 4; - _poll_update_basis = 2; - _mesh_coarsening_exponent = 1; - _mesh_refining_exponent =-1; - _initial_mesh_index = 0; - _min_poll_size_defined = false; + _anisotropic_mesh = true; + _mesh_type = NOMAD::XMESH; + + _mesh_update_basis = 4; + _poll_update_basis = 2; + _mesh_coarsening_exponent = 1; + _mesh_refining_exponent =-1; + _initial_mesh_index = 0; + _limit_mesh_index = NOMAD::XL_LIMITS; + _min_poll_size_defined = false; _initial_mesh_size.clear(); _initial_poll_size.clear(); _min_mesh_size.clear(); _min_poll_size.clear(); + _granularity.clear(); // Directions: reset_directions ( ); @@ -149,6 +159,10 @@ void NOMAD::Parameters::init ( void ) _has_filter_constraints = false; _barrier_type = NOMAD::EB; + // Intensification: + _max_eval_intensification = -1; + _intensification_type = NOMAD::NO_INTENSIFICATION; + // outputs: _index_obj.clear(); _bb_exe.clear(); @@ -199,10 +213,6 @@ void NOMAD::Parameters::init ( void ) _model_params.quad_max_Y_size = 500; _model_params.model_np1_quad_epsilon =0.01; - // TGP model parameters: - _model_params.tgp_mode = NOMAD::TGP_FAST; - _model_params.tgp_reuse_model = true; - // other searches: _VNS_trigger.clear(); _speculative_search = true; @@ -216,12 +226,12 @@ void NOMAD::Parameters::init ( void ) _opp_CS_is_defined = false; // opportunistic strategy: - _bb_max_block_size = 1; + _bb_max_block_size = 1; _eval_points_as_block = false; - _opportunistic_eval = true; - _opportunistic_min_nb_success = -1; - _opportunistic_min_eval = -1; - _opportunistic_lucky_eval = false; + _opportunistic_eval = true; + _opportunistic_min_nb_success = -1; + _opportunistic_min_eval = -1; + _opportunistic_lucky_eval = false; _opportunistic_min_f_imprvmt.clear(); // display: @@ -239,6 +249,7 @@ void NOMAD::Parameters::init ( void ) reset_stats_file(); _display_all_eval = false; + } /*------------------------------------------------------------------*/ @@ -281,13 +292,16 @@ bool NOMAD::Parameters::check_display_stats { int var_index; std::list<std::string>::const_iterator it , end = stats.end(); - for ( it = stats.begin() ; it != end ; ++it ) { + for ( it = stats.begin() ; it != end ; ++it ) + { if ( !it->empty() && - NOMAD::Display::get_display_stats_type(*it) == NOMAD::DS_VAR ) { + NOMAD::Display::get_display_stats_type(*it) == NOMAD::DS_VAR ) + { ++it; if ( !NOMAD::atoi ( *it , var_index ) || var_index < 0 || - var_index >= _dimension ) { + var_index >= _dimension ) + { return false; } } @@ -314,19 +328,24 @@ bool NOMAD::Parameters::check_directory ( std::string & s ) // step 2: replace '/' or '\' with DIR_SEP: i = 0; ns = s.size(); - while ( i < ns ) { + while ( i < ns ) + { if ( s[i] == '/' || s[i] == '\\' ) s[i] = NOMAD::DIR_SEP; ++i; } // step 3: add DIR_SEP at the end: - if ( i >= 1 ) { - if (s[i-1] != NOMAD::DIR_SEP) { + if ( i >= 1 ) + { + if (s[i-1] != NOMAD::DIR_SEP) + { s += NOMAD::DIR_SEP; } } - else { + else + { + s = "."; s.push_back ( NOMAD::DIR_SEP ); } @@ -338,17 +357,18 @@ bool NOMAD::Parameters::check_directory ( std::string & s ) /* interpretation of the Parameter_Entry for PERIODIC_VARIABLE */ /* (private) */ /*---------------------------------------------------------------*/ -void NOMAD::Parameters::interpret_periodic_var -( const NOMAD::Parameter_Entries & entries ) +void NOMAD::Parameters::interpret_periodic_var ( const NOMAD::Parameter_Entries & entries ) { int i , j , k; std::list<std::string>::const_iterator it , end; NOMAD::Parameter_Entry * pe = entries.find ( "PERIODIC_VARIABLE" ); - while ( pe ) { + while ( pe ) + { // just one variable index (can be '*' or a range of indexes 'i-j'): - if ( pe->get_nb_values() == 1 ) { + if ( pe->get_nb_values() == 1 ) + { it = pe->get_values().begin(); if ( !NOMAD::string_to_index_range ( *it , i , j , &_dimension ) ) @@ -360,9 +380,12 @@ void NOMAD::Parameters::interpret_periodic_var } // list of variable indexes: - else { + else + { + end = pe->get_values().end(); - for ( it = pe->get_values().begin() ; it != end ; ++it ) { + for ( it = pe->get_values().begin() ; it != end ; ++it ) + { if ( !NOMAD::atoi ( *it , i ) ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: PERIODIC_VARIABLE" ); @@ -386,10 +409,12 @@ void NOMAD::Parameters::interpret_var_groups ( const NOMAD::Parameter_Entries & std::list<std::string>::const_iterator it , end; NOMAD::Parameter_Entry * pe = entries.find ( "VARIABLE_GROUP" ); - while ( pe ) { + while ( pe ) + { // just one variable index (can be '*' or a range of indexes 'i-j'): - if ( pe->get_nb_values() == 1 ) { + if ( pe->get_nb_values() == 1 ) + { it = pe->get_values().begin(); if ( !NOMAD::string_to_index_range ( *it , i , j , &_dimension ) ) @@ -401,9 +426,12 @@ void NOMAD::Parameters::interpret_var_groups ( const NOMAD::Parameter_Entries & } // list of variable indexes: - else { + else + { + end = pe->get_values().end(); - for ( it = pe->get_values().begin() ; it != end ; ++it ) { + for ( it = pe->get_values().begin() ; it != end ; ++it ) + { if ( !NOMAD::atoi ( *it , i ) ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: VARIABLE_GROUP" ); @@ -485,7 +513,9 @@ void NOMAD::Parameters::interpret_BFVS ( const NOMAD::Parameter_Entries & entrie // file name: - else { + else + { + file_name = _problem_dir + *pe->get_values().begin(); @@ -499,7 +529,8 @@ void NOMAD::Parameters::interpret_BFVS ( const NOMAD::Parameter_Entries & entrie } try { - switch ( param_name[0] ) { + switch ( param_name[0] ) + { case 'L': _lb.reset ( _dimension ); fin >> _lb; @@ -517,7 +548,8 @@ void NOMAD::Parameters::interpret_BFVS ( const NOMAD::Parameter_Entries & entrie fin >> _scaling; } } - catch ( NOMAD::Point::Bad_Input & ) { + catch ( NOMAD::Point::Bad_Input & ) + { err = "invalid parameter: " + param_name + " - could not read file \'" + file_name + "\'"; throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); @@ -528,9 +560,11 @@ void NOMAD::Parameters::interpret_BFVS ( const NOMAD::Parameter_Entries & entrie } // vector form: all values on one row: - else if ( pe->get_nb_values() == _dimension + 2 ) { + else if ( pe->get_nb_values() == _dimension + 2 ) + { - if ( !pe->is_unique() ) { + if ( !pe->is_unique() ) + { err = "invalid parameter: " + param_name + " - has been given in vector form with [] or () and is not unique"; throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); @@ -538,21 +572,25 @@ void NOMAD::Parameters::interpret_BFVS ( const NOMAD::Parameter_Entries & entrie it = pe->get_values().begin(); - if ( *it != "[" && *it != "(" ) { + if ( *it != "[" && *it != "(" ) + { err = "invalid parameter: " + param_name + " - error in vector form with () or []"; throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); } ++it; - for ( k = 0 ; k < _dimension ; ++k ) { - if ( !v.atof(*it) ) { + for ( k = 0 ; k < _dimension ; ++k ) + { + if ( !v.atof(*it) ) + { err = "invalid parameter: " + param_name; throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); } ++it; - switch ( param_name[0] ) { + switch ( param_name[0] ) + { case 'L': set_LOWER_BOUND ( k , v ); break; case 'U': set_UPPER_BOUND ( k , v ); @@ -563,7 +601,8 @@ void NOMAD::Parameters::interpret_BFVS ( const NOMAD::Parameter_Entries & entrie } } - if ( *it != "]" && *it != ")" ) { + if ( *it != "]" && *it != ")" ) + { err = "invalid parameter: " + param_name + " - error in vector form with () or []"; throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); @@ -572,34 +611,40 @@ void NOMAD::Parameters::interpret_BFVS ( const NOMAD::Parameter_Entries & entrie } // indexed values: - else { + else + { + - if ( pe->get_nb_values() != 2 ) { + if ( pe->get_nb_values() != 2 ) + { err = "invalid parameter: " + param_name; throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); } it = pe->get_values().begin(); - if ( !NOMAD::string_to_index_range ( *it , i , j , &_dimension ) ) { + if ( !NOMAD::string_to_index_range ( *it , i , j , &_dimension ) ) + { err = "invalid parameter: " + param_name; throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); } ++it; - if ( !v.atof(*it) ) { + if ( !v.atof(*it) ) + { err = "invalid parameter: " + param_name; throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); } for ( k = j ; k >= i ; --k ) - switch (param_name[0]) { - case 'L': set_LOWER_BOUND ( k, v ); - break; - case 'U': set_UPPER_BOUND ( k, v ); - break; - case 'F': set_FIXED_VARIABLE ( k, v ); - break; - case 'S': set_SCALING ( k, v ); - } + switch (param_name[0]) + { + case 'L': set_LOWER_BOUND ( k, v ); + break; + case 'U': set_UPPER_BOUND ( k, v ); + break; + case 'F': set_FIXED_VARIABLE ( k, v ); + break; + case 'S': set_SCALING ( k, v ); + } } pe->set_has_been_interpreted(); pe = pe->get_next(); @@ -675,11 +720,9 @@ void NOMAD::Parameters::interpret_f_target ( const NOMAD::Parameter_Entries & en /* interpretation of the Parameter_Entry for mesh/poll sizes */ /* (private) */ /*-------------------------------------------------------------*/ -void NOMAD::Parameters::interpret_mesh_sizes -( const NOMAD::Parameter_Entries & entries , - const std::string & param_name ) +void NOMAD::Parameters::interpret_mesh_sizes ( const NOMAD::Parameter_Entries & entries , + const std::string & param_name ) { - // param_name == "INITIAL_MESH_SIZE" or "INITIAL_MESH_SIZE" or "MIN_MESH_SIZE" or "MIN_POLL_SIZE": if ( param_name != "INITIAL_POLL_SIZE" && param_name != "INITIAL_MESH_SIZE" && param_name != "MIN_MESH_SIZE" && @@ -759,7 +802,8 @@ void NOMAD::Parameters::interpret_mesh_sizes else if ( pe->get_nb_values() == _dimension + 2 ) { - if ( !pe->is_unique() ) { + if ( !pe->is_unique() ) + { err = "invalid parameter: " + param_name + " - has been given in vector form with [] or () and is not unique"; throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); @@ -812,6 +856,123 @@ void NOMAD::Parameters::interpret_mesh_sizes } } + +/*----------------------------------------------------------------*/ +/* interpretation of the Parameter_Entry for granular variables */ +/* (private) */ +/*----------------------------------------------------------------*/ +void NOMAD::Parameters::interpret_granularity ( const NOMAD::Parameter_Entries & entries , + const std::string & param_name ) +{ + if ( param_name != "GRANULARITY" ) + throw Bad_Access ( "Parameters.cpp" , __LINE__ , + "wrong use of Parameters::interpret_granularity()" ); + + int i , j , k; + NOMAD::Double v; + std::string err; + std::list<std::string>::const_iterator it; + NOMAD::Parameter_Entry * pe = entries.find ( param_name ); + + while ( pe ) + { + + // just one value: + if ( pe->get_nb_values() == 1 ) + { + + if ( !pe->is_unique() ) + { + err = "invalid parameter: " + param_name + + " - has been given with just one value and is not unique"; + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); + } + + if ( !v.atof ( *pe->get_values().begin() ) ) + { + err = "invalid parameter: " + param_name; + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); + } + + set_GRANULARITY( v ); + + } + + // indexed form: + else if ( pe->get_nb_values() == 2 ) + { + + it = pe->get_values().begin(); + if ( !NOMAD::string_to_index_range ( *it , i , j , &_dimension ) ) + { + err = "invalid parameter: " + param_name; + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); + } + ++it; + + if ( !v.atof( *it ) ) + { + err = "invalid parameter: " + param_name; + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); + } + + for ( k = i ; k <= j ; ++k ) + set_GRANULARITY( k , v ); + } + + // vector form: all values on one row: + else if ( pe->get_nb_values() == _dimension + 2 ) + { + + if ( !pe->is_unique() ) + { + err = "invalid parameter: " + param_name + + " - has been given in vector form with [] or () and is not unique"; + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); + } + + it = pe->get_values().begin(); + + if ( *it != "[" && *it != "(" ) + { + err = "invalid parameter: " + param_name + + " - error in vector form with () or []"; + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); + } + + ++it; + for ( k = 0 ; k < _dimension ; ++k ) + { + if ( !v.atof ( *it ) ) + { + err = "invalid parameter: " + param_name; + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); + } + ++it; + set_GRANULARITY( k , v ); + } + + if ( *it != "]" && *it != ")" ) + { + err = "invalid parameter: " + param_name + + " - error in vector form with () or []"; + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); + } + } + + else + { + err = "invalid parameter: " + param_name; + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); + } + + pe->set_has_been_interpreted(); + pe = pe->get_next(); + } +} + + + /*---------------------------------------------------------------------------------*/ /* interpretation of the Parameter_Entry for BB_INPUT_TYPE (private) */ /*---------------------------------------------------------------------------------*/ @@ -820,18 +981,19 @@ void NOMAD::Parameters::interpret_mesh_sizes /* # or { Real , Cat , Bin , Int } */ /* or BB_INPUT_TYPE i-j t */ /*---------------------------------------------------------------------------------*/ -void NOMAD::Parameters::interpret_bb_input_type -( const NOMAD::Parameter_Entries & entries ) +void NOMAD::Parameters::interpret_bb_input_type ( const NOMAD::Parameter_Entries & entries ) { int i , j , k; NOMAD::bb_input_type bbit; std::list<std::string>::const_iterator it; NOMAD::Parameter_Entry * pe = entries.find ( "BB_INPUT_TYPE" ); - while ( pe ) { + while ( pe ) + { // indexed form: - if ( pe->get_nb_values() == 2 ) { + if ( pe->get_nb_values() == 2 ) + { it = pe->get_values().begin(); if ( !NOMAD::string_to_index_range ( *it , i , j , &_dimension ) ) @@ -847,7 +1009,8 @@ void NOMAD::Parameters::interpret_bb_input_type } // vector form: all values on one row: - else if ( pe->get_nb_values() == _dimension + 2 ) { + else if ( pe->get_nb_values() == _dimension + 2 ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , @@ -861,7 +1024,8 @@ void NOMAD::Parameters::interpret_bb_input_type "invalid parameter: BB_INPUT_TYPE - error in vector form with () or []" ); ++it; - for ( k = 0 ; k < _dimension ; ++k ) { + for ( k = 0 ; k < _dimension ; ++k ) + { if ( !NOMAD::string_to_bb_input_type ( *it , bbit ) ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: BB_INPUT_TYPE" ); @@ -896,7 +1060,8 @@ void NOMAD::Parameters::interpret_x0 ( const NOMAD::Parameter_Entries & entries NOMAD::Point tmp_x0; std::vector<int> indexes; - while ( pe ) { + while ( pe ) + { tmp_x0.reset ( _dimension ); @@ -905,15 +1070,18 @@ void NOMAD::Parameters::interpret_x0 ( const NOMAD::Parameter_Entries & entries set_X0 ( *pe->get_values().begin() ); // Vector form: all values on one row: - else if ( pe->get_nb_values() == _dimension + 2 ) { + else if ( pe->get_nb_values() == _dimension + 2 ) + { it = pe->get_values().begin(); - if ( *it != "[" && *it != "(" ) { + if ( *it != "[" && *it != "(" ) + { // particular case with n=1 and 3 entry values: // example: X0 1 0 4.0 (first coordinate of the 2nd x0 point put to 4.0) - if ( _dimension == 1 ) { + if ( _dimension == 1 ) + { it = pe->get_values().begin(); @@ -925,7 +1093,8 @@ void NOMAD::Parameters::interpret_x0 ( const NOMAD::Parameter_Entries & entries if ( l > i ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: X0" ); - else if ( l == i ) { + else if ( l == i ) + { l = static_cast<int> ( _x0s.size() ); indexes.push_back ( l ); set_X0 ( tmp_x0 ); @@ -955,10 +1124,13 @@ void NOMAD::Parameters::interpret_x0 ( const NOMAD::Parameter_Entries & entries "invalid parameter: X0 - error in vector form with () or []" ); } - else { + else + { + ++it; - for ( k = 0 ; k < _dimension ; ++k ) { + for ( k = 0 ; k < _dimension ; ++k ) + { if ( !v.atof(*it) ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: X0" ); @@ -976,7 +1148,8 @@ void NOMAD::Parameters::interpret_x0 ( const NOMAD::Parameter_Entries & entries // indexed values without x0 index (must be unique) // (example: X0 0-5 1.0): - else if ( pe->get_nb_values() == 2 ) { + else if ( pe->get_nb_values() == 2 ) + { it = pe->get_values().begin(); if ( !NOMAD::string_to_index_range ( *it , i , j , &_dimension ) ) @@ -985,7 +1158,8 @@ void NOMAD::Parameters::interpret_x0 ( const NOMAD::Parameter_Entries & entries if ( !v.atof(*it) ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: X0" ); - if ( indexes.empty() ) { + if ( indexes.empty() ) + { l = static_cast<int> ( _x0s.size() ); indexes.push_back ( l ); set_X0 ( tmp_x0 ); @@ -1000,7 +1174,9 @@ void NOMAD::Parameters::interpret_x0 ( const NOMAD::Parameter_Entries & entries // indexed values with x0 index // example: X0 0 0-5 1.0 --> first x0 point // X0 1 0-5 2.0 --> 2nd x0 point - else { + else + { + if ( pe->get_nb_values() != 3 ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: X0" ); @@ -1013,7 +1189,8 @@ void NOMAD::Parameters::interpret_x0 ( const NOMAD::Parameter_Entries & entries i = static_cast<int> ( indexes.size() ); if ( l > i ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: X0" ); - else if ( l == i ) { + else if ( l == i ) + { l = static_cast<int> ( _x0s.size() ); indexes.push_back ( l ); set_X0 ( tmp_x0 ); @@ -1050,6 +1227,7 @@ void NOMAD::Parameters::read ( const std::string & param_file ) // ------------ _problem_dir.clear(); size_t k = param_file.find_last_of ( NOMAD::DIR_SEP ); + if ( k < param_file.size() ) _problem_dir = param_file.substr (0,k) + NOMAD::DIR_SEP; else @@ -1058,12 +1236,14 @@ void NOMAD::Parameters::read ( const std::string & param_file ) // open the parameters file: std::string err = "could not open parameters file \'" + param_file + "\'"; std::ifstream fin; - if ( NOMAD::check_read_file ( param_file ) ) { + if ( NOMAD::check_read_file ( param_file ) ) + { fin.open ( param_file.c_str() ); if ( !fin.fail() ) err.clear(); } - if ( !err.empty() ) { + if ( !err.empty() ) + { fin.close(); throw NOMAD::Exception ( "Parameters.cpp" , __LINE__ , err ); } @@ -1280,20 +1460,24 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) } } - // USE_SMESH: + // MESH_TYPE: // --------------- { - pe = entries.find ( "USE_SMESH" ); + pe = entries.find ( "MESH_TYPE" ); if ( pe ) { - if ( !pe->is_unique() ) + if ( ! pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , - "invalid parameter: USE_SMESH not unique" ); - i = NOMAD::string_to_bool ( *(pe->get_values().begin() ) ); - if ( pe->get_nb_values() != 1 || i == -1 ) + "invalid parameter: MESH_TYPE not unique" ); + + NOMAD::mesh_type mt; + std::string smt = *(pe->get_values().begin()); + + if ( ! NOMAD::string_to_mesh_type ( smt , mt ) ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , - "invalid parameter: USE_SMESH" ); - set_USE_SMESH ( i == 1 ); + "invalid parameter: MESH_TYPE" ); + + set_MESH_TYPE ( mt ); pe->set_has_been_interpreted(); } } @@ -1303,7 +1487,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // -------------------- { pe = entries.find ( "POINT_DISPLAY_LIMIT" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: POINT_DISPLAY_LIMIT not unique" ); @@ -1320,12 +1505,15 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) { pe = entries.find ( "DIMENSION" ); - if ( !pe ) { + if ( !pe ) + { if ( !pe && _dimension <= 0 ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: DIMENSION not defined" ); } - else { + else + { + if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: DIMENSION not unique" ); @@ -1345,7 +1533,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // --------------- { pe = entries.find ( "SNAP_TO_BOUNDS" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: SNAP_TO_BOUNDS not unique" ); @@ -1363,7 +1552,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) { // MULTI_OVERALL_BB_EVAL: pe = entries.find ( "MULTI_OVERALL_BB_EVAL" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MULTI_OVERALL_BB_EVAL not unique" ); @@ -1376,7 +1566,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // MULTI_NB_MADS_RUNS: pe = entries.find ( "MULTI_NB_MADS_RUNS" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MULTI_NB_MADS_RUNS not unique" ); @@ -1389,7 +1580,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // MULTI_USE_DELTA_CRIT: pe = entries.find ( "MULTI_USE_DELTA_CRIT" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MULTI_USE_DELTA_CRIT not unique" ); @@ -1403,7 +1595,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // MULTI_F_BOUNDS (f1_min, f2_min, f2_min, f2_max): pe = entries.find ( "MULTI_F_BOUNDS" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MULTI_F_BOUNDS not unique" ); @@ -1412,7 +1605,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) "invalid parameter: MULTI_F_BOUNDS" ); NOMAD::Point mfb ( 4 ); it = pe->get_values().begin(); - for ( i = 0 ; i < 4 ; ++i ) { + for ( i = 0 ; i < 4 ; ++i ) + { if ( !d.atof ( *it ) ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MULTI_F_BOUNDS" ); @@ -1427,7 +1621,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ------------------ { pe = entries.find ( "MULTI_FORMULATION" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MULTI_FORMULATION not unique" ); @@ -1479,7 +1674,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) bool b_model_search = false; pe = entries.find ( "MODEL_SEARCH" ); - while ( pe ) { + while ( pe ) + { if ( pe->get_nb_values() != 1 ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , @@ -1493,7 +1689,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) int imt = NOMAD::string_to_bool ( smt ); // entered as a boolean: - if ( imt == 0 || imt == 1 ) { + if ( imt == 0 || imt == 1 ) + { if ( b_model_search || i_model_search == 2 ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MODEL_SEARCH (boolean argument can only be used once)" ); @@ -1502,7 +1699,9 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) } // entered as a model type: - else { + else + { + if ( !NOMAD::string_to_model_type ( smt , mt ) ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , @@ -1519,7 +1718,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // MODEL_SEARCH_OPTIMISTIC: { pe = entries.find ( "MODEL_SEARCH_OPTIMISTIC" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MODEL_SEARCH_OPTIMISTIC not unique" ); @@ -1535,7 +1735,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // MODEL_SEARCH_PROJ_TO_MESH: { pe = entries.find ( "MODEL_SEARCH_PROJ_TO_MESH" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MODEL_SEARCH_PROJ_TO_MESH not unique" ); @@ -1551,7 +1752,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // MODEL_QUAD_RADIUS_FACTOR: { pe = entries.find ( "MODEL_QUAD_RADIUS_FACTOR" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MODEL_QUAD_RADIUS_FACTOR not unique" ); @@ -1566,7 +1768,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // MODEL_QUAD_USE_WP: { pe = entries.find ( "MODEL_QUAD_USE_WP" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MODEL_QUAD_USE_WP not unique" ); @@ -1582,7 +1785,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // MODEL_QUAD_MAX_Y_SIZE: { pe = entries.find ( "MODEL_QUAD_MAX_Y_SIZE" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MODEL_QUAD_MAX_Y_SIZE not unique" ); @@ -1597,7 +1801,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // MODEL_QUAD_MIN_Y_SIZE: { pe = entries.find ( "MODEL_QUAD_MIN_Y_SIZE" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , @@ -1625,7 +1830,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // MODEL_QUAD_HYPERCUBE_LOWER_LIM: { pe = entries.find ( "MODEL_NP1_QUAD_EPSILON" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , @@ -1647,44 +1853,48 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) } } - // MODEL_TGP_MODE: - { - pe = entries.find ( "MODEL_TGP_MODE" ); - if ( pe ) { - if ( !pe->is_unique() ) - throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , - "invalid parameter: MODEL_TGP_MODE not unique" ); - - NOMAD::TGP_mode_type m; - if ( pe->get_nb_values() != 1 || - !NOMAD::string_to_TGP_mode_type ( *(pe->get_values().begin()) , m ) ) - throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , - "Invalid parameter: MODEL_TGP_MODE" ); - pe->set_has_been_interpreted(); - set_MODEL_TGP_MODE ( m ); - } - } - // MODEL_TGP_REUSE_MODEL: - { - pe = entries.find ( "MODEL_TGP_REUSE_MODEL" ); - if ( pe ) { - if ( !pe->is_unique() ) - throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , - "invalid parameter: MODEL_TGP_REUSE_MODEL not unique" ); - i = NOMAD::string_to_bool ( *(pe->get_values().begin() ) ); - if ( pe->get_nb_values() != 1 || i == -1 ) - throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , - "invalid parameter: MODEL_TGP_REUSE_MODEL" ); - set_MODEL_TGP_REUSE_MODEL ( i == 1 ); - pe->set_has_been_interpreted(); - } - } + // // MODEL_TGP_MODE: + // { + // pe = entries.find ( "MODEL_TGP_MODE" ); + // if ( pe ) + // { + // if ( !pe->is_unique() ) + // throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , + // "invalid parameter: MODEL_TGP_MODE not unique" ); + // + // NOMAD::TGP_mode_type m; + // if ( pe->get_nb_values() != 1 || + // !NOMAD::string_to_TGP_mode_type ( *(pe->get_values().begin()) , m ) ) + // throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , + // "Invalid parameter: MODEL_TGP_MODE" ); + // pe->set_has_been_interpreted(); + // set_MODEL_TGP_MODE ( m ); + // } + // } + // + // // MODEL_TGP_REUSE_MODEL: + // { + // pe = entries.find ( "MODEL_TGP_REUSE_MODEL" ); + // if ( pe ) + // { + // if ( !pe->is_unique() ) + // throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , + // "invalid parameter: MODEL_TGP_REUSE_MODEL not unique" ); + // i = NOMAD::string_to_bool ( *(pe->get_values().begin() ) ); + // if ( pe->get_nb_values() != 1 || i == -1 ) + // throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , + // "invalid parameter: MODEL_TGP_REUSE_MODEL" ); + // set_MODEL_TGP_REUSE_MODEL ( i == 1 ); + // pe->set_has_been_interpreted(); + // } + // } // MODEL_SEARCH_MAX_TRIAL_PTS: { pe = entries.find ( "MODEL_SEARCH_MAX_TRIAL_PTS" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MODEL_SEARCH_MAX_TRIAL_PTS not unique" ); @@ -1699,7 +1909,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // MODEL_EVAL_SORT: { pe = entries.find ( "MODEL_EVAL_SORT" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MODEL_EVAL_SORT not unique" ); @@ -1716,7 +1927,9 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) set_MODEL_EVAL_SORT ( imt == 1 ); // entered as a model type: - else { + else + { + if ( !NOMAD::string_to_model_type ( smt , mt ) ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , @@ -1731,7 +1944,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // MODEL_EVAL_SORT_CAUTIOUS: { pe = entries.find ( "MODEL_EVAL_SORT_CAUTIOUS" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MODEL_EVAL_SORT_CAUTIOUS not unique" ); @@ -1749,7 +1963,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ------------------- { pe = entries.find ( "SPECULATIVE_SEARCH" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: SPECULATIVE_SEARCH not unique" ); @@ -1766,7 +1981,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ----------- { pe = entries.find ( "VNS_SEARCH" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: VNS_SEARCH not unique" ); @@ -1778,7 +1994,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) i = NOMAD::string_to_bool ( s ); // entered as a real: - if ( i == -1 || s == "1" ) { + if ( i == -1 || s == "1" ) + { if ( !d.atof ( s ) ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: VNS_SEARCH" ); @@ -1796,7 +2013,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ------------- { pe = entries.find ( "CACHE_SEARCH" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: CACHE_SEARCH not unique" ); @@ -1813,7 +2031,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ---------- { pe = entries.find ( "LH_SEARCH" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: LH_SEARCH not unique" ); @@ -1838,7 +2057,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ----------------- { pe = entries.find ( "OPPORTUNISTIC_LH" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: OPPORTUNISTIC_LH not unique" ); @@ -1856,7 +2076,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // --------------------------- { pe = entries.find ( "OPPORTUNISTIC_CACHE_SEARCH" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: OPPORTUNISTIC_CACHE_SEARCH not unique" ); @@ -1875,7 +2096,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // BB_MAX_BLOCK_SIZE pe = entries.find ( "BB_MAX_BLOCK_SIZE" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: BB_MAX_BLOCK_SIZE not unique" ); @@ -1893,7 +2115,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // OPPORTUNISTIC_EVAL: pe = entries.find ( "OPPORTUNISTIC_EVAL" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: OPPORTUNISTIC_EVAL not unique" ); @@ -1907,7 +2130,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // OPPORTUNISTIC_MIN_NB_SUCCESS: pe = entries.find ( "OPPORTUNISTIC_MIN_NB_SUCCESS" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: OPPORTUNISTIC_MIN_NB_SUCCESS not unique" ); @@ -1920,7 +2144,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // OPPORTUNISTIC_MIN_EVAL: pe = entries.find ( "OPPORTUNISTIC_MIN_EVAL" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: OPPORTUNISTIC_MIN_EVAL not unique" ); @@ -1933,7 +2158,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // OPPORTUNISTIC_MIN_F_IMPRVMT: pe = entries.find ( "OPPORTUNISTIC_MIN_F_IMPRVMT" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: OPPORTUNISTIC_MIN_F_IMPRVMT not unique" ); @@ -1946,7 +2172,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // OPPORTUNISTIC_LUCKY_EVAL: pe = entries.find ( "OPPORTUNISTIC_LUCKY_EVAL" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: OPPORTUNISTIC_LUCKY_EVAL not unique" ); @@ -1966,7 +2193,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) pe = entries.find ( "DIRECTION_TYPE" ); - while ( pe ) { + while ( pe ) + { if ( !NOMAD::strings_to_direction_type ( pe->get_values() , dt ) ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , @@ -1979,7 +2207,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) } pe = entries.find ( "SEC_POLL_DIR_TYPE" ); - while ( pe ) { + while ( pe ) + { if ( !NOMAD::strings_to_direction_type ( pe->get_values() , dt ) ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: SEC_POLL_DIR_TYPE" ); @@ -1990,12 +2219,30 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) } } + // INTENSIFICATION: + { + pe = entries.find( "MAX_EVAL_INTENSIFICATION"); + if ( pe ) + { + if ( !pe->is_unique() ) + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , + "invalid parameter: MAX_EVAL_INTENSIFICATION not unique" ); + if ( !NOMAD::atoi (*(pe->get_values().begin()) , i) ) + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , + "invalid parameter: MAX_EVAL_INTENSIFICATION" ); + pe->set_has_been_interpreted(); + set_MAX_EVAL_INTENSIFICATION (i); + + } + } + // MAX_ITERATIONS: // --------------- { pe = entries.find ( "MAX_ITERATIONS" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MAX_ITERATIONS not unique" ); @@ -2011,7 +2258,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ---------------------------------- { pe = entries.find ( "MAX_CONSECUTIVE_FAILED_ITERATIONS" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MAX_CONSECUTIVE_FAILED_ITERATIONS not unique" ); @@ -2027,7 +2275,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ----------------- { pe = entries.find ( "MAX_CACHE_MEMORY" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MAX_CACHE_MEMORY not unique" ); @@ -2043,7 +2292,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // --------- { pe = entries.find ( "MAX_EVAL" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MAX_EVAL not unique" ); @@ -2059,7 +2309,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ------------ { pe = entries.find ( "MAX_BB_EVAL" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MAX_BB_EVAL not unique" ); @@ -2075,7 +2326,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ---------------- { pe = entries.find ( "MAX_SIM_BB_EVAL" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MAX_SIM_BB_EVAL not unique" ); @@ -2091,7 +2343,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // -------------- { pe = entries.find ( "MAX_SGTE_EVAL" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MAX_SGTE_EVAL not unique" ); @@ -2107,7 +2360,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // --------- { pe = entries.find ( "MAX_TIME" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MAX_TIME not unique" ); @@ -2124,7 +2378,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ---------------- { pe = entries.find ( "STAT_SUM_TARGET" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: STAT_SUM_TARGET not unique" ); @@ -2140,7 +2395,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // --------------- { pe = entries.find ( "L_CURVE_TARGET" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: L_CURVE_TARGET not unique" ); @@ -2156,7 +2412,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ---------------------- { pe = entries.find ( "EXTENDED_POLL_TRIGGER" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: EXTENDED_POLL_TRIGGER not unique" ); @@ -2177,7 +2434,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ---------------------- { pe = entries.find ( "EXTENDED_POLL_ENABLED" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: EXTENDED_POLL_ENABLED not unique" ); @@ -2194,7 +2452,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ------------------- { pe = entries.find ( "USER_CALLS_ENABLED" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: USER_CALLS_ENABLED not unique" ); @@ -2211,7 +2470,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ------------- { pe = entries.find ( "ASYNCHRONOUS" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: ASYNCHRONOUS not unique" ); @@ -2228,7 +2488,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ---- { pe = entries.find ( "RHO" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: RHO not unique" ); @@ -2244,7 +2505,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ------ { pe = entries.find ( "H_MIN" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: H_MIN not unique" ); @@ -2260,7 +2522,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // -------- { pe = entries.find ( "H_MAX_0" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: H_MAX_0 not unique" ); @@ -2276,7 +2539,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ------- { pe = entries.find ( "H_NORM" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: H_NORM not unique" ); @@ -2295,7 +2559,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) { _tmp_dir.clear(); pe = entries.find ( "TMP_DIR" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: TMP_DIR not unique" ); @@ -2314,7 +2579,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ----------------------- { pe = entries.find ( "ADD_SEED_TO_FILE_NAMES" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: ADD_SEED_TO_FILE_NAMES not unique" ); @@ -2337,7 +2603,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) { _solution_file.clear(); pe = entries.find ( "SOLUTION_FILE" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: SOLUTION_FILE not unique" ); @@ -2355,7 +2622,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) { _history_file.clear(); pe = entries.find ( "HISTORY_FILE" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: HISTORY_FILE not unique" ); @@ -2372,7 +2640,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ----------- { pe = entries.find ( "STATS_FILE" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , @@ -2386,7 +2655,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) std::list<std::string> ls; if (it!=end) { - while ( it != end ) { + while ( it != end ) + { ls.push_back(*it); ++it; } @@ -2403,7 +2673,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) { _cache_file.clear(); pe = entries.find ( "CACHE_FILE" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: CACHE_FILE not unique" ); @@ -2420,7 +2691,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) { _sgte_cache_file.clear(); pe = entries.find ( "SGTE_CACHE_FILE" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: SGTE_CACHE_FILE not unique" ); @@ -2437,7 +2709,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ------------------ { pe = entries.find ( "CACHE_SAVE_PERIOD" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: CACHE_SAVE_PERIOD not unique" ); @@ -2453,7 +2726,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ---------- { pe = entries.find ( "SGTE_COST" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: SGTE_COST not unique" ); @@ -2497,7 +2771,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // STOP_IF_FEASIBLE: // ----------------- pe = entries.find ( "STOP_IF_FEASIBLE" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: STOP_IF_FEASIBLE not unique" ); @@ -2513,7 +2788,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // --------------------- { pe = entries.find ( "BB_INPUT_INCLUDE_TAG" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: BB_INPUT_INCLUDE_TAG not unique" ); @@ -2530,7 +2806,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ---------------------- { pe = entries.find ( "BB_INPUT_INCLUDE_SEED" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: BB_INPUT_INCLUDE_SEED not unique" ); @@ -2546,7 +2823,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // --------------- { pe = entries.find ( "BB_REDIRECTION" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: BB_REDIRECTION not unique" ); @@ -2566,17 +2844,26 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) interpret_mesh_sizes ( entries , "MIN_MESH_SIZE" ); interpret_mesh_sizes ( entries , "MIN_POLL_SIZE" ); + + // GRANULARITY ---> for the next release! + //-------------------- + // interpret_granularity( entries , "GRANULARITY"); + + // BB_OUTPUT_TYPE: // --------------- { pe = entries.find ( "BB_OUTPUT_TYPE" ); - if ( !pe ) { + if ( !pe ) + { if ( _bb_output_type.empty() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: BB_OUTPUT_TYPE not defined" ); } - else { + else + { + if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , @@ -2592,8 +2879,10 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) std::list<NOMAD::bb_output_type> bbot; i = 0; end = pe->get_values().end(); - for ( it = pe->get_values().begin() ; it != end ; ++it ) { - if ( !NOMAD::string_to_bb_output_type ( *it , cur ) ) { + for ( it = pe->get_values().begin() ; it != end ; ++it ) + { + if ( !NOMAD::string_to_bb_output_type ( *it , cur ) ) + { err = "invalid parameter: BB_OUTPUT_TYPE (" + pe->get_name(); throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); } @@ -2611,7 +2900,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) { _neighbors_exe.clear(); pe = entries.find ( "NEIGHBORS_EXE" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: NEIGHBORS_EXE not unique" ); @@ -2628,7 +2918,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ------- { pe = entries.find ( "BB_EXE" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , @@ -2639,7 +2930,9 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) if ( m == 1 ) set_BB_EXE ( *pe->get_values().begin() ); - else { + else + { + if ( m != static_cast<int>(_bb_output_type.size()) ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , @@ -2661,18 +2954,21 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // --------- { pe = entries.find ( "SGTE_EXE" ); - if ( pe ) { + if ( pe ) + { std::string bb_exe_name , sgte_name; - if ( pe->get_nb_values() == 1 ) { + if ( pe->get_nb_values() == 1 ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: SGTE_EXE (with one arguement) not unique" ); sgte_name = *pe->get_values().begin(); } - else if ( pe->get_nb_values() == 2 ) { + else if ( pe->get_nb_values() == 2 ) + { bb_exe_name = *pe->get_values().begin(); sgte_name = *(++pe->get_values().begin()); } @@ -2690,7 +2986,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // --------------- { pe = entries.find ( "SGTE_EVAL_SORT" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: SGTE_EVAL_SORT not unique" ); @@ -2707,7 +3004,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // --------- { pe = entries.find ( "HAS_SGTE" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: HAS_SGTE not unique" ); @@ -2724,7 +3022,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // -------------- { pe = entries.find ( "OPT_ONLY_SGTE" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: OPT_ONLY_SGTE not unique" ); @@ -2741,7 +3040,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // --------------- { pe = entries.find ( "DISPLAY_DEGREE" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: DISPLAY_DEGREE not unique" ); @@ -2757,7 +3057,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ----------- { pe = entries.find ( "OPEN_BRACE" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: OPEN_BRACE not unique" ); @@ -2776,7 +3077,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ------------- { pe = entries.find ( "CLOSED_BRACE" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: CLOSED_BRACE not unique" ); @@ -2794,7 +3096,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // DISPLAY_STATS: { pe = entries.find ( "DISPLAY_STATS" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: DISPLAY_STATS not unique" ); @@ -2812,7 +3115,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // ----------------- { pe = entries.find ( "DISPLAY_ALL_EVAL" ); - if ( pe ) { + if ( pe ) + { if ( !pe->is_unique() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: DISPLAY_ALL_EVAL not unique" ); @@ -2844,7 +3148,6 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) s = *(pe->get_values().begin()); NOMAD::toupper(s); - if ( s == "DIFF" ) i = -1; else if ( !NOMAD::atoi ( s , i ) ) @@ -2853,10 +3156,10 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) set_SEED(i); pe->set_has_been_interpreted(); - } } + // VARIABLE_GROUP: // --------------- interpret_var_groups ( entries ); @@ -2869,7 +3172,8 @@ void NOMAD::Parameters::read ( const NOMAD::Parameter_Entries & entries ) // check the non-interpreted parameters: pe = entries.find_non_interpreted(); - if ( pe ) { + if ( pe ) + { err = "invalid parameter: " + pe->get_name() + " - unknown"; throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , err ); } @@ -2884,13 +3188,15 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const { std::list<std::string>::const_iterator it; - if ( _to_be_checked ) { + if ( _to_be_checked ) + { out << "parameters not checked" << std::endl; return; } // problem directory: - if ( !_problem_dir.empty() ) { + if ( !_problem_dir.empty() ) + { out << "problem directory : " << _problem_dir << std::endl; if ( _tmp_dir != _problem_dir ) out << "tmp directory : " << _tmp_dir << std::endl; @@ -2900,26 +3206,30 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const out << "dimension : n=" << _dimension << std::endl; // bounds: - if ( _lb.is_defined() ) { + if ( _lb.is_defined() ) + { out << "lower bounds : ( "; _lb.display ( out , " " , 4 , NOMAD::Point::get_display_limit() ); out << " )" << std::endl; } - if ( _ub.is_defined() ) { + if ( _ub.is_defined() ) + { out << "upper bounds : ( "; _ub.display ( out , " " , 4 , NOMAD::Point::get_display_limit() ); out << " )" << std::endl; } // scaling: - if ( _scaling.is_defined() ) { + if ( _scaling.is_defined() ) + { out << "scaling : ( "; _scaling.display ( out , " " , 4 , NOMAD::Point::get_display_limit() ); out << " )" << std::endl; } // fixed variables: - if ( _fixed_variables.is_defined() ) { + if ( _fixed_variables.is_defined() ) + { out << "fixed variables : ( "; _fixed_variables.display ( out , " " , 4 , NOMAD::Point::get_display_limit() ); out << " )" << std::endl; @@ -2938,8 +3248,10 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const out << "( " << _bb_input_type << " )" << std::endl; // extended poll trigger: - if ( get_signature()->has_categorical() ) { - if ( _extended_poll_enabled ) { + if ( get_signature()->has_categorical() ) + { + if ( _extended_poll_enabled ) + { out << "extended poll trigger: " << _extended_poll_trigger; if ( _relative_ept ) out << " (relative)"; @@ -2952,7 +3264,8 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const } // periodic variables: - if ( !_periodic_variables.empty() ) { + if ( !_periodic_variables.empty() ) + { out << "periodic variables : { "; for ( size_t k = 0 ; k < _periodic_variables.size() ; ++k ) if ( _periodic_variables[k] ) @@ -2961,7 +3274,8 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const } // variable groups: - if ( _var_groups.size() > 1 ) { + if ( _var_groups.size() > 1 ) + { int i = 0; out.open_block ( "variable groups" ); std::set<NOMAD::Variable_Group*,NOMAD::VG_Comp>::const_iterator @@ -2981,9 +3295,11 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const it = _bb_exe.begin(); out.open_block ( "blackbox outputs (m=" + NOMAD::itos ( m ) + ")" ); - for ( int i = 0 ; i < m ; ++i ) { + for ( int i = 0 ; i < m ; ++i ) + { out << "#" << std::setw(w) << i << " " << std::setw(12) << _bb_output_type[i]; - if ( display_bb_exe ) { + if ( display_bb_exe ) + { out << "\t" << *it; if ( display_sgte_exe ) out << "\t" << get_sgte_exe(*it); @@ -2999,7 +3315,8 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const << ( (_std_signature) ? "standard" : "extern" ) << std::endl; // BB_REDIRECTION: - if ( !_bb_redirection ) { + if ( !_bb_redirection ) + { out << "blackbox output redirection : "; out.display_yes_or_no ( _bb_redirection ); out << std::endl; @@ -3010,10 +3327,12 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const out << "has surrogate : "; out.display_yes_or_no ( _has_sgte ); out << std::endl; - if ( _has_sgte ) { + if ( _has_sgte ) + { // OPT_ONLY_SGTE: - if ( _opt_only_sgte ) { + if ( _opt_only_sgte ) + { out << "minimize only with surrogate : "; out.display_yes_or_no ( _opt_only_sgte ); out << std::endl; @@ -3035,7 +3354,8 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const } // MULTI-MADS: - if ( get_nb_obj() > 1 ) { + if ( get_nb_obj() > 1 ) + { out << "multi-MADS : [overall bb eval="; if ( _multi_overall_bb_eval >= 0 ) out << _multi_overall_bb_eval; @@ -3051,7 +3371,8 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const out << "]" << std::endl << " [formulation=" << _multi_formulation << "]"; - if ( _multi_f_bounds.is_defined() ) { + if ( _multi_f_bounds.is_defined() ) + { out << " [f_bounds="; _multi_f_bounds.display ( out , "," , -1 , -1 ); out << "]"; @@ -3060,10 +3381,12 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const } // barrier: - if ( _has_constraints ) { + if ( _has_constraints ) + { out << "barrier type : "; - switch ( _barrier_type ) { + switch ( _barrier_type ) + { case NOMAD::EB: out << "extreme" << std::endl; break; @@ -3102,10 +3425,12 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const // STATS_FILE: out << "stats file : "; - if ( !_stats_file_name.empty() ) { + if ( !_stats_file_name.empty() ) + { out << "(" << _stats_file_name << ") "; std::list<std::string>::const_iterator end = _stats_file.end(); - for ( it = _stats_file.begin() ; it != end ; ++it ) { + for ( it = _stats_file.begin() ; it != end ; ++it ) + { if ( it->empty() ) out << " "; else @@ -3118,7 +3443,8 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const // CACHE_FILE: out << "cache file : "; - if ( !_cache_file.empty() ) { + if ( !_cache_file.empty() ) + { out << _cache_file << std::endl; out << "cache save period : "; if ( _cache_save_period <= 0 ) @@ -3141,10 +3467,14 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const if ( _x0s.empty() && _x0_cache_file.empty() ) out << "x0 : points in \'" << _cache_file << "\'" << std::endl; - else { + else + { + bool first = true; - if ( !_x0_cache_file.empty() ) { - if ( first ) { + if ( !_x0_cache_file.empty() ) + { + if ( first ) + { out << "x0 : "; first = false; } @@ -3155,10 +3485,13 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const out << " (read only)"; out << std::endl; } - if ( !_x0s.empty() ) { + if ( !_x0s.empty() ) + { size_t x0n = _x0s.size(); - for ( size_t k = 0 ; k < x0n ; ++k ) { - if ( first ) { + for ( size_t k = 0 ; k < x0n ; ++k ) + { + if ( first ) + { out << "x0 : "; first = false; } @@ -3177,20 +3510,27 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const if ( _direction_types.size() == 1 ) out << "directions : " << *_direction_types.begin() << std::endl; - else { + else + { + out << NOMAD::open_block ( "directions" ); for ( it = _direction_types.begin() ; it != end ; ++it ) out << *it << std::endl; out.close_block(); } - if ( _barrier_type == NOMAD::PB || _barrier_type == NOMAD::PEB_P ) { + if ( _barrier_type == NOMAD::PB || _barrier_type == NOMAD::PEB_P ) + { if ( _sec_poll_dir_types.empty() ) out << "sec. poll dir. type: no secondary poll" << std::endl; - else { + else + { + if ( _sec_poll_dir_types.size() == 1 ) out << "sec. poll dir. type: " << *_sec_poll_dir_types.begin() << std::endl; - else { + else + { + end = _sec_poll_dir_types.end(); out << NOMAD::open_block ( "sec. poll dir. types" ); for ( it = _sec_poll_dir_types.begin() ; it != end ; ++it ) @@ -3199,17 +3539,16 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const } } } - } // mesh: { - if ( get_use_smesh() ) + if ( _mesh_type == NOMAD::SMESH ) { out << NOMAD::open_block ( "smesh (isotropic)" ); out << "mesh update basis : " << std::setw(3) << _mesh_update_basis << std::endl; } - else + else if ( _mesh_type == NOMAD::XMESH ) { if ( get_anisotropic_mesh() ) out << NOMAD::open_block ( "xmesh (anisotropic)" ); @@ -3217,6 +3556,7 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const out << NOMAD::open_block ( "xmesh (isotropic)" ); out << "poll update basis : " << std::setw(3) << _poll_update_basis << std::endl; } + out << "coarsening exponent : " << std::setw(3) << _mesh_coarsening_exponent << std::endl << "refining exponent : " << std::setw(3) << _mesh_refining_exponent @@ -3228,12 +3568,14 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const out << "initial poll size : ( "; _initial_poll_size.display ( out , " " , 4 , NOMAD::Point::get_display_limit() ); out << " )" << std::endl; - if ( _min_mesh_size.is_defined() ) { + if ( _min_mesh_size.is_defined() ) + { out << "min mesh size : ( "; _min_mesh_size.display ( out , " " , 4 , NOMAD::Point::get_display_limit() ); out << " )" << std::endl; } - if ( _min_poll_size.is_defined() ) { + if ( _min_poll_size.is_defined() ) + { out << "min poll size : ( "; _min_poll_size.display ( out , " " , 4 , NOMAD::Point::get_display_limit() ); out << " )" << std::endl; @@ -3262,7 +3604,8 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const out << "opportunistic evaluations : "; out.display_yes_or_no ( _opportunistic_eval ); out << std::endl; - if ( _opportunistic_eval ) { + if ( _opportunistic_eval ) + { if ( _opportunistic_min_nb_success > 0 ) out << "opportunistic min nb success : " << _opportunistic_min_nb_success << std::endl; @@ -3314,8 +3657,10 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const out << "no model search" << std::endl; // model ordering: - if ( _model_params.eval_sort != NOMAD::NO_MODEL ) { - if ( _model_params.eval_sort == NOMAD::QUADRATIC_MODEL ) { + if ( _model_params.eval_sort != NOMAD::NO_MODEL ) + { + if ( _model_params.eval_sort == NOMAD::QUADRATIC_MODEL ) + { out << NOMAD::open_block ( "model ordering" ) << "models type : " << _model_params.eval_sort << std::endl << "cautious model ordering: "; @@ -3343,12 +3688,13 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const // quadratic model parameters: if ( _model_params.eval_sort == NOMAD::QUADRATIC_MODEL || _model_params.search1 == NOMAD::QUADRATIC_MODEL || - _model_params.search2 == NOMAD::QUADRATIC_MODEL ) { + _model_params.search2 == NOMAD::QUADRATIC_MODEL ) + { out << NOMAD::open_block ( "quadratic model parameters" ) << "radius factor: " << _model_params.quad_radius_factor << std::endl << "use WP : "; out.display_yes_or_no ( _model_params.quad_use_WP ); - out << std::endl << "min Y size : "; + out << std::endl << "min Y size : "; if ( _model_params.quad_min_Y_size < 0 ) out << "n+1"; else @@ -3357,19 +3703,11 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const << "max Y size : " << _model_params.quad_max_Y_size << std::endl << NOMAD::close_block(); } - - // TGP model parameters: - if ( _model_params.eval_sort == NOMAD::TGP_MODEL || - _model_params.search1 == NOMAD::TGP_MODEL || - _model_params.search2 == NOMAD::TGP_MODEL ) { - out << NOMAD::open_block ( "TGP model parameters" ) - << "mode : " << _model_params.tgp_mode << std::endl - << "reuse model: " << _model_params.tgp_reuse_model << std::endl - << NOMAD::close_block(); - } out.close_block(); } - else { + else + { + out << "use models : "; out.display_yes_or_no ( false ); out << std::endl; @@ -3390,7 +3728,8 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const // LH_SEARCH: out << "Latin-Hypercube (LH) search : "; - if ( _LH_search_p0 > 0 || _LH_search_pi > 0 ) { + if ( _LH_search_p0 > 0 || _LH_search_pi > 0 ) + { out << "#init:" << _LH_search_p0 << ", #iter:" << _LH_search_pi << ", opport:"; @@ -3402,7 +3741,8 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const // CACHE_SEARCH: out << "cache search : "; - if ( _cache_search ) { + if ( _cache_search ) + { out.display_yes_or_no ( true ); out << ", opport:"; out.display_yes_or_no ( _opportunistic_cache_search ); @@ -3437,7 +3777,8 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const // DISPLAY_STATS: out << "display stats : "; std::list<std::string>::const_iterator end = _display_stats.end(); - for ( it = _display_stats.begin() ; it != end ; ++it ) { + for ( it = _display_stats.begin() ; it != end ; ++it ) + { if ( it->empty() ) out << " "; else @@ -3462,7 +3803,8 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const out << "max eval. (bb+cache) : " << _max_eval << std::endl; // MAX_BB_EVAL: - if ( _max_bb_eval >= 0 ) { + if ( _max_bb_eval >= 0 ) + { out << "max number of blackbox eval. : " << _max_bb_eval; if ( _max_bb_eval == 0 ) out << " (no blackbox eval. allowed)"; @@ -3474,7 +3816,8 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const out << "max simulated blackbox eval. : " << _max_sim_bb_eval << std::endl; // MAX_SGTE_EVAL: - if ( _sgte_max_eval >= 0 ) { + if ( _sgte_max_eval >= 0 ) + { out << "max surrogate eval. : " << _sgte_max_eval; if ( _sgte_max_eval == 0 ) out << " (no surrogate eval. allowed)"; @@ -3482,7 +3825,8 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const } // MAX_ITERATIONS: - if ( _max_iterations >= 0 ) { + if ( _max_iterations >= 0 ) + { out << "max iterations : " << _max_iterations; if ( _max_iterations == 0 ) out << " (no iterations allowed)"; @@ -3503,9 +3847,11 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const out << "max wall-clock time : " << _max_time << "s" << std::endl; // F_TARGET: - if ( _f_target.is_defined() ) { + if ( _f_target.is_defined() ) + { out << "objective target : "; - if ( _f_target.size() > 1 ) { + if ( _f_target.size() > 1 ) + { out << "( "; _f_target.display ( out , " " , 4 , -1 ); out << " )" << std::endl; @@ -3525,11 +3871,13 @@ void NOMAD::Parameters::display ( const NOMAD::Display & out ) const << _L_curve_target << std::endl; // STOP_IF_FEASIBLE: - if ( _stop_if_feasible ) { + if ( _stop_if_feasible ) + { out << "stop if feasible : "; out.display_yes_or_no ( _stop_if_feasible ); out << std::endl; } + } /*---------------------------------------*/ @@ -3764,7 +4112,7 @@ void NOMAD::Parameters::check ( bool remove_history_file , /*----------------------------*/ { - if ( _use_smesh && _anisotropic_mesh ) + if ( _mesh_type == NOMAD::SMESH && _anisotropic_mesh ) { _anisotropic_mesh=false; if ( !_warning_has_been_displayed ) @@ -3795,6 +4143,36 @@ void NOMAD::Parameters::check ( bool remove_history_file , } + // limit mesh index: + // -------------------------------- + { + if ( _mesh_type == NOMAD::SMESH && _limit_mesh_index > NOMAD::L_LIMITS ) + if ( !_warning_has_been_displayed ) + _out << NOMAD::open_block("Warning:") + << "A limit mesh index that is greater than the defaut limit of " << NOMAD::L_LIMITS << " is provided. This convergence criterion can be difficult to meet due to nomad precision" << std::endl + << NOMAD::close_block(); + + if ( _mesh_type == NOMAD::SMESH && _limit_mesh_index == NOMAD::XL_LIMITS ) + _limit_mesh_index = NOMAD::L_LIMITS; + + if ( ( _mesh_type == NOMAD::XMESH ) && _limit_mesh_index < NOMAD::XL_LIMITS ) + if ( !_warning_has_been_displayed ) + _out << NOMAD::open_block("Warning:") + << "A limit mesh index that is smaller than the defaut limit of " << NOMAD::L_LIMITS << " is provided. This convergence criterion can be difficult to meet due to nomad precision" << std::endl + << NOMAD::close_block(); + + if ( _mesh_type == NOMAD::SMESH && _limit_mesh_index <= _initial_mesh_index ) + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , + "invalid parameter: LIMIT_MESH_INDEX must be larger than INITIAL_MESH_INDEX (SMESH)" ); + + if ( ( _mesh_type == NOMAD::XMESH ) && _limit_mesh_index >= _initial_mesh_index ) + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , + "invalid parameter: LIMIT_MESH_INDEX must be smaller than INITIAL_MESH_INDEX (XMESH)" ); + + + } + + // initial mesh size or poll size: // -------------------------------- bool use_x0 = !_x0s.empty() && _x0s[0]->size() == _dimension; @@ -3806,10 +4184,10 @@ void NOMAD::Parameters::check ( bool remove_history_file , if ( _bb_input_type[i] == NOMAD::CONTINUOUS ) { - // Determine _initial_mesh_size from _initial_poll_size (this will disappear in future version) if ( _initial_mesh_size[i].is_defined() ) _initial_poll_size[i]=_initial_mesh_size[i]*pow(_dimension,0.5); + // default value for initial mesh size if ( !_initial_poll_size[i].is_defined() ) { @@ -3846,12 +4224,19 @@ void NOMAD::Parameters::check ( bool remove_history_file , } } } + else if ( !_fixed_variables[i].is_defined() && ( _initial_poll_size[i].value() < NOMAD::Double::get_epsilon() || _initial_poll_size[i].value() <= 0.0 ) ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: INITIAL_MESH_SIZE" ); + + // Determine _initial_mesh_size from _initial_poll_size (this will disappear in future version) + if ( !_initial_mesh_size[i].is_defined() ) + _initial_mesh_size[i]=_initial_poll_size[i]*pow(_dimension,-0.5); + } + // binary/categorical variables: // ----------------------------- else if ( _bb_input_type[i] == NOMAD::BINARY || @@ -3862,6 +4247,7 @@ void NOMAD::Parameters::check ( bool remove_history_file , _initial_mesh_size[i] = 1.0; _initial_poll_size[i] = 1.0; } + // integer variables: // ------------------ else @@ -3877,31 +4263,27 @@ void NOMAD::Parameters::check ( bool remove_history_file , if ( _initial_mesh_size[i] < 1.0 ) _initial_mesh_size[i] = 1.0; + } else // that is no initial_mesh_size and no initial_poll_size { - - // default value for initial mesh size // (r0.1 if there are bounds + rounding to nearest integer not zero, 1.0 otherwise): if ( !_lb[i].is_defined() || !_ub[i].is_defined() ) _initial_mesh_size[i] = 1.0; else { set_INITIAL_POLL_SIZE ( i , 0.1 , true ); - _initial_mesh_size[i]=_initial_poll_size[i]*pow(_dimension,-0.5); - _initial_mesh_size[i]=_initial_mesh_size[i].round(); + _initial_mesh_size[i] = _initial_poll_size[i] * pow(_dimension,-0.5); + _initial_mesh_size[i] = _initial_mesh_size[i].round(); if ( _initial_mesh_size[i] < 1.0 ) _initial_mesh_size[i] = 1.0; } } - _initial_poll_size[i]=_initial_mesh_size[i]*pow(_dimension,0.5); + // Determine the initial poll size from mesh size + _initial_poll_size[i] = _initial_mesh_size[i] * pow(_dimension,0.5); } - // Determine _initial_mesh_size from _initial_poll_size (this will disappear in future version) - if ( !_initial_mesh_size[i].is_defined() ) - _initial_mesh_size[i]=_initial_poll_size[i]*pow(_dimension,-0.5); - } // min mesh size \delta_min: @@ -3910,14 +4292,14 @@ void NOMAD::Parameters::check ( bool remove_history_file , if ( _min_mesh_size.size() != _dimension ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , - "invalid parameter: MIN_MESH_SIZE" ); + "invalid parameter: MIN_MESH_SIZE must have the same dimension as the problem" ); for ( i = 0 ; i < _dimension ; ++i ) if ( _min_mesh_size[i].is_defined() && - (_min_mesh_size[i].value() < NOMAD::Double::get_epsilon() || + ( _min_mesh_size[i].value() < NOMAD::Double::get_epsilon() || _min_mesh_size[i].value() <= 0.0 ) ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , - "invalid parameters: MIN_MESH_SIZE" ); + "invalid parameters: MIN_MESH_SIZE must be greater than zero" ); } // min poll size \Delta^p_min: @@ -3928,8 +4310,8 @@ void NOMAD::Parameters::check ( bool remove_history_file , if ( _min_poll_size.size() != _dimension ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , - "invalid parameter: MIN_POLL_SIZE" ); - + "invalid parameter: MIN_POLL_SIZE must have the same dimension as the problem." ); + // test validity of min poll size for ( i = 0 ; i < _dimension ; ++i ) { // continuous variables: @@ -3939,36 +4321,20 @@ void NOMAD::Parameters::check ( bool remove_history_file , (_min_poll_size[i].value() < NOMAD::Double::get_epsilon() || _min_poll_size[i].value() <= 0.0 ) ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , - "invalid parameters: MIN_POLL_SIZE" ); + "invalid parameters: MIN_POLL_SIZE must be consistent with continuous variable" ); } - // integer and binary variables: else if ( _bb_input_type[i] != NOMAD::CATEGORICAL ) { - if ( _min_poll_size[i].is_defined() ) - { - if ( _min_poll_size[i] < 1.0 ) - _min_poll_size[i] = 1.0; - } - else - _min_poll_size[i] = 1.0; + if ( _min_poll_size[i].is_defined() && _min_poll_size[i] < 1.0 ) + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , + "invalid parameters: MIN_POLL_SIZE must be consistent with integer/binary variable" ); } } } - - // default min poll size for non-continuous variables: else - { - _min_poll_size_defined = false; - - _min_poll_size = NOMAD::Point ( _dimension ); - for ( i = 0 ; i < _dimension ; ++i ) - if ( _bb_input_type[i] == NOMAD::INTEGER ) - _min_poll_size[i] = 1.0; - } - // default value for _mesh_update_basis (tau): if ( _mesh_update_basis <= 1.0 ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameters: MESH_UPDATE_BASIS (must be >1)" ); @@ -3979,6 +4345,66 @@ void NOMAD::Parameters::check ( bool remove_history_file , } + { + // Granularity --> this will be used in the next version in which granular variabtesles will be handled + //------------------- + if ( _granularity.is_defined () && _granularity.size () != _dimension ) + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , + "invalid parameters: granularity (size must be equal to dimension)" ); + + if ( ! _granularity.is_defined() ) + _granularity = NOMAD::Point ( _dimension ,0 ); + else + { + double inpart; + for ( i = 0 ; i < _dimension ; ++i ) + { + + if ( _granularity[i].is_defined() && _granularity[i] < 0 ) + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , + "invalid parameters: granularity (negative values)" ); + + if ( _granularity[i].is_defined() && _granularity[i] !=0 && _mesh_type == NOMAD::SMESH ) + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , + "invalid parameters: granular variables are not supported when mesh_type = smesh " ); + + // Exception if a granularity is not supported by xmesh is given + if ( _granularity[i].is_defined() && _granularity[i] != 0.0 && _granularity[i] != 1.0 ) + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , + "invalid parameters: granularity must be 0 (continuous) or 1 (integer). " ); + + //from bb_input_type --> _granularity. No granularity is required for categorical variables (different variable group + no mesh ) + if ( _bb_input_type[i] == NOMAD::CONTINUOUS ) + { + if ( _granularity[i].is_defined() && _granularity[i] != 0.0 && _out.get_gen_dd()>=NOMAD::NORMAL_DISPLAY && !_warning_has_been_displayed ) + _out << NOMAD::open_block("Warning:") + << " The granularity of the continuous variable " << i << " is changed to 0." << std::endl + << NOMAD::close_block(); + _granularity[i] = 0.0; + } + + if ( _bb_input_type[i] == NOMAD::INTEGER || _bb_input_type[i] == NOMAD::BINARY ) + { + + if ( _granularity[i].is_defined() && _granularity[i] != 1.0 && _out.get_gen_dd() >= NOMAD::NORMAL_DISPLAY && !_warning_has_been_displayed ) + _out << NOMAD::open_block("Warning:") + << " The granularity of the integer/binary variable " << i << " is changed to 1." << std::endl + << NOMAD::close_block(); + _granularity[i] = 1.0; + } + + if ( !_x0s.empty() && _granularity[i].is_defined() && _granularity[i] > 0.0 + && std::modf ( (*_x0s[0])[i].value() / _granularity[i].value() , &inpart ) != 0 ) + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , + "NOMAD::Parameters::check : invalid granularity of variables vs initial value" ); + } + + } + + + } + + int nb_obj = static_cast<int>(_index_obj.size()); /*----------------------------*/ @@ -4068,14 +4494,16 @@ void NOMAD::Parameters::check ( bool remove_history_file , // blackbox with the associated surrogate // (SGTE_EXE parameter with only one argument): it = _sgte_exe.find(""); - if ( it != end ) { + if ( it != end ) + { if ( _sgte_exe.size() != 1 ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: SGTE_EXE - impossible to interpret with one argument" ); std::string bb_exe_name = *bb_exe_begin; std::list<std::string>::const_iterator it2 = ++bb_exe_begin; - while ( it2 != bb_exe_end ) { + while ( it2 != bb_exe_end ) + { if ( *it2 != bb_exe_name ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: unique SGTE_EXE without unique blackbox executable" ); @@ -4244,10 +4672,20 @@ void NOMAD::Parameters::check ( bool remove_history_file , _speculative_search = false; } + + /*----------------------------*/ + /* intensification */ + /*----------------------------*/ + if ( _max_eval_intensification > 0 ) + _intensification_type = NOMAD::POLL_AND_SEARCH; + else + _intensification_type = NOMAD::NO_INTENSIFICATION; + /*----------------------------*/ /* periodic variables */ /*----------------------------*/ - if ( !_periodic_variables.empty() ) { + if ( !_periodic_variables.empty() ) + { // check the size: if ( _dimension != static_cast<int>(_periodic_variables.size()) ) @@ -4256,7 +4694,8 @@ void NOMAD::Parameters::check ( bool remove_history_file , // check the bounds: for ( int k = 0 ; k < _dimension ; ++k ) - if ( _periodic_variables[k] ) { + if ( _periodic_variables[k] ) + { if ( !_lb[k].is_defined() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: PERIODIC_VARIABLE - lower bound not defined" ); @@ -4275,7 +4714,7 @@ void NOMAD::Parameters::check ( bool remove_history_file , // disable models upon request if ( _disable_models) { - _model_params.search1 = _model_params.search2 = _model_params.eval_sort = NOMAD::NO_MODEL; + _model_params.search1 = _model_params.search2 = _model_params.eval_sort = NOMAD::NO_MODEL; if (_out.get_gen_dd()>NOMAD::MINIMAL_DISPLAY && !_warning_has_been_displayed) { _out << NOMAD::open_block("Warning:") @@ -4311,25 +4750,36 @@ void NOMAD::Parameters::check ( bool remove_history_file , if ( _nb_free_variables >= 50 || has_categorical || _opt_only_sgte ) { - _model_params.search1 = _model_params.search2 = _model_params.eval_sort = NOMAD::NO_MODEL; + _model_params.search1 = _model_params.search2 = _model_params.eval_sort = NOMAD::NO_MODEL; set_DIRECTION_TYPE_NO_MODEL(); - if (_out.get_gen_dd()>NOMAD::MINIMAL_DISPLAY && !_warning_has_been_displayed) + if ( _out.get_gen_dd() > NOMAD::MINIMAL_DISPLAY && !_warning_has_been_displayed) { - if ( _opt_only_sgte) + if ( _opt_only_sgte ) _out << NOMAD::open_block("Warning:") << "Model use is disabled when setting the option OPT_ONLY_SGTE to yes." << std::endl; - if ( has_categorical) + if ( has_categorical ) _out << NOMAD::open_block("Warning:") << "Model use is disabled for problem with categorical variables." << std::endl << NOMAD::close_block(); - if ( _nb_free_variables >= 50) + if ( _nb_free_variables >= 50 ) _out << NOMAD::open_block("Warning:") << "Model use is disabled for problem with dimension greater than 50." << std::endl << NOMAD::close_block(); } } + // disable minimal granularity when categorical variables are present + if ( has_categorical && get_number_granular_variables() > 0 ) + { + _granularity.reset( _dimension , 0.0 ); + + if (_out.get_gen_dd()>NOMAD::MINIMAL_DISPLAY && !_warning_has_been_displayed) + _out << NOMAD::open_block("Warning:") + << "Setting granularity different than 0 is disabled for problem with categorical variables." << std::endl + << NOMAD::close_block(); + + } // disable PEB constraints when categorical variables are present if ( has_categorical && _barrier_type == NOMAD::PEB_P) @@ -4402,12 +4852,14 @@ void NOMAD::Parameters::check ( bool remove_history_file , if ( _model_params.search_max_trial_pts < 1 ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MODEL_SEARCH_MAX_TRIAL_PTS (must be >= 1)" ); + + } /*----------------------------*/ /* EVAL SORT */ /*----------------------------*/ - if (_disable_eval_sort) + if ( _disable_eval_sort ) { _model_params.eval_sort = NOMAD::NO_MODEL; @@ -4474,7 +4926,8 @@ void NOMAD::Parameters::check ( bool remove_history_file , for ( i = 0 ; i < _dimension ; ++i ) { - if ( !in_group[i] && !_fixed_variables[i].is_defined() ) { + if ( !in_group[i] && !_fixed_variables[i].is_defined() ) + { if ( _bb_input_type[i] != NOMAD::CATEGORICAL ) vi_cbi.insert(i); else @@ -4485,6 +4938,7 @@ void NOMAD::Parameters::check ( bool remove_history_file , // creation of a group for cont./bin./int. variables: if ( !vi_cbi.empty() ) { + vg = new NOMAD::Variable_Group ( vi_cbi , _direction_types , _sec_poll_dir_types , @@ -4640,16 +5094,18 @@ void NOMAD::Parameters::check ( bool remove_history_file , _bb_input_type , _lb , _ub , - _use_smesh , - _anisotropic_mesh , - _initial_poll_size, - _min_poll_size, - _min_mesh_size, - _mesh_update_basis, - _poll_update_basis, + _mesh_type , + _anisotropic_mesh , + _granularity , + _initial_poll_size , + _min_poll_size , + _min_mesh_size , + _mesh_update_basis , + _poll_update_basis , _mesh_coarsening_exponent, _mesh_refining_exponent, - _initial_mesh_index, + _initial_mesh_index , + _limit_mesh_index , _scaling , _fixed_variables , _periodic_variables , @@ -4679,6 +5135,7 @@ void NOMAD::Parameters::check ( bool remove_history_file , _ub , _scaling , _fixed_variables , + _granularity , _periodic_variables , _var_groups ); } @@ -4697,7 +5154,8 @@ void NOMAD::Parameters::check ( bool remove_history_file , /* X0 */ /*----------------------------*/ { - if ( _x0s.empty() && _x0_cache_file.empty() ) { + if ( _x0s.empty() && _x0_cache_file.empty() ) + { if ( _LH_search_p0 <= 0 ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "Parameters::check(): no starting point" ); @@ -4713,13 +5171,12 @@ void NOMAD::Parameters::check ( bool remove_history_file , throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: x0 with missing coordinates" ); - // check that x0 is consistent with input type for ( i = 0 ; i < _dimension ; ++i ) { const NOMAD::Double xi = (*_x0s[k])[i]; if ( _bb_input_type[i] != NOMAD::CONTINUOUS && ! xi.is_integer() ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , - "invalid parameter: x0 with variables values inconistent with their type (integer, binary, categorical." ); + "invalid parameter: x0 with variables values inconsistent with their type (integer, binary, categorical)." ); } @@ -4759,7 +5216,8 @@ void NOMAD::Parameters::add_seed_to_file_name ( int n_seed , std::string ext = ""; std::string fic = file_name; - if ( k >= 0 && k < n_pn ) { + if ( k >= 0 && k < n_pn ) + { fic = file_name.substr ( 0 , k ); ext = file_name.substr ( k , n_pn-k ); n_pn = k; @@ -4936,24 +5394,6 @@ int NOMAD::Parameters::get_model_quad_min_Y_size ( void ) const return _model_params.quad_min_Y_size; } -// get_model_tgp_mode: -NOMAD::TGP_mode_type NOMAD::Parameters::get_model_tgp_mode ( void ) const -{ - if ( _to_be_checked ) - throw Bad_Access ( "Parameters.cpp" , __LINE__ , - "Parameters::get_model_tgp_mode(), Parameters::check() must be invoked" ); - return _model_params.tgp_mode; -} - -// get_model_tgp_reuse_model: -bool NOMAD::Parameters::get_model_tgp_reuse_model ( void ) const -{ - if ( _to_be_checked ) - throw Bad_Access ( "Parameters.cpp" , __LINE__ , - "Parameters::get_model_tgp_reuse_model(), Parameters::check() must be invoked" ); - return _model_params.tgp_reuse_model; -} - // get_model_search_max_trial_pts: int NOMAD::Parameters::get_model_search_max_trial_pts ( void ) const { @@ -5082,17 +5522,18 @@ bool NOMAD::Parameters::get_anisotropic_mesh ( void ) const return _anisotropic_mesh; } - -// smesh: -bool NOMAD::Parameters::get_use_smesh ( void ) const +// mesh_type: +const NOMAD::mesh_type & NOMAD::Parameters::get_mesh_type ( void ) const { if ( _to_be_checked ) throw Bad_Access ( "Parameters.cpp" , __LINE__ , - "Parameters::get_use_smesh, Parameters::check() must be invoked" ); - return _use_smesh; + "Parameters::get_mesh_type, Parameters::check() must be invoked" ); + return _mesh_type; + } + // get_mesh_update_basis: const NOMAD::Double & NOMAD::Parameters::get_mesh_update_basis ( void ) const { @@ -5963,7 +6404,8 @@ void NOMAD::Parameters::set_POINT_DISPLAY_LIMIT ( int dl ) // set_DIMENSION: bool NOMAD::Parameters::set_DIMENSION ( int dim ) { - if ( _dimension > 0 ) { + if ( _dimension > 0 ) + { _dimension = -1; throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: DIMENSION - defined twice" ); @@ -5972,7 +6414,8 @@ bool NOMAD::Parameters::set_DIMENSION ( int dim ) _to_be_checked = true; _dimension = dim; - if ( _dimension <= 0 ) { + if ( _dimension <= 0 ) + { _dimension = -1; throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: DIMENSION" ); @@ -6020,6 +6463,9 @@ void NOMAD::Parameters::set_EXTERN_SIGNATURE ( NOMAD::Signature * s ) // fixed variables: set_FIXED_VARIABLE ( s->get_fixed_variables() ); + // granularity: + set_GRANULARITY( s->get_granularity() ); + // periodic variables: set_PERIODIC_VARIABLE ( s->get_periodic_variables() ); @@ -6027,9 +6473,12 @@ void NOMAD::Parameters::set_EXTERN_SIGNATURE ( NOMAD::Signature * s ) reset_variable_groups(); set_VARIABLE_GROUP ( s->get_var_groups() ); + // mesh: the mesh is set during check + _to_be_checked = true; } + // set_SNAP_TO_BOUNDS: void NOMAD::Parameters::set_SNAP_TO_BOUNDS ( bool stb ) { @@ -6078,8 +6527,6 @@ void NOMAD::Parameters::set_model_parameters ( const NOMAD::model_params_type & set_MODEL_QUAD_USE_WP ( mp.quad_use_WP ); set_MODEL_QUAD_MIN_Y_SIZE ( mp.quad_min_Y_size ); set_MODEL_QUAD_MAX_Y_SIZE ( mp.quad_max_Y_size ); - set_MODEL_TGP_MODE ( mp.tgp_mode ); - set_MODEL_TGP_REUSE_MODEL ( mp.tgp_reuse_model ); } // set_MODEL_SEARCH (1/3): @@ -6087,24 +6534,21 @@ void NOMAD::Parameters::set_MODEL_SEARCH ( int i , NOMAD::model_type ms ) { _to_be_checked = true; -#ifndef USE_TGP - if ( ms == NOMAD::TGP_MODEL ) - throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , - "invalid parameter: MODEL_SEARCH: this version has not been compiled for TGP" ); -#endif - if ( i != 1 && i != 2 ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "NOMAD::Parameters::set_MODEL_SEARCH(i,m): bad value for argument i (must be 1 or 2)" ); - if ( i == 1 ) { + if ( i == 1 ) + { if ( _model_params.search2 != NOMAD::NO_MODEL ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "NOMAD::Parameters::set_MODEL_SEARCH(1,m): already a second model search" ); _model_params.search1 = ms; } - else { + else + { + if ( _model_params.search1 == NOMAD::NO_MODEL && ms != NOMAD::NO_MODEL ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , @@ -6121,11 +6565,14 @@ void NOMAD::Parameters::set_MODEL_SEARCH ( int i , NOMAD::model_type ms ) // set_MODEL_SEARCH (2/3): void NOMAD::Parameters::set_MODEL_SEARCH ( bool ms ) { - if ( ms ) { + if ( ms ) + { set_MODEL_SEARCH ( 1 , NOMAD::QUADRATIC_MODEL ); set_MODEL_SEARCH ( 2 , NOMAD::NO_MODEL ); } - else { + else + { + set_MODEL_SEARCH ( 1 , NOMAD::NO_MODEL ); set_MODEL_SEARCH ( 2 , NOMAD::NO_MODEL ); } @@ -6142,11 +6589,6 @@ void NOMAD::Parameters::set_MODEL_SEARCH ( NOMAD::model_type ms ) // set_MODEL_EVAL_SORT (1/2): void NOMAD::Parameters::set_MODEL_EVAL_SORT ( NOMAD::model_type mes ) { -#ifndef USE_TGP - if ( mes == NOMAD::TGP_MODEL ) - throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , - "invalid parameter: MODEL_EVAL_SORT: this version has not been compiled for TGP" ); -#endif _to_be_checked = true; _model_params.eval_sort = mes; } @@ -6210,27 +6652,6 @@ void NOMAD::Parameters::set_MODEL_NP1_QUAD_EPSILON ( const NOMAD::Double & d ) _model_params.model_np1_quad_epsilon = d; } - - -// set_MODEL_TGP_MODE: -void NOMAD::Parameters::set_MODEL_TGP_MODE ( NOMAD::TGP_mode_type m ) -{ - if ( m == NOMAD::TGP_USER ) { - throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , - "invalid parameter: MODEL_TGP_MODE: the TGP user mode is only a debugging option" ); - } - - _to_be_checked = true; - _model_params.tgp_mode = m; -} - -// set_MODEL_TGP_REUSE_MODEL: -void NOMAD::Parameters::set_MODEL_TGP_REUSE_MODEL ( bool rm ) -{ - _to_be_checked = true; - _model_params.tgp_reuse_model = rm; -} - // set_MODEL_SEARCH_MAX_TRIAL_PTS: void NOMAD::Parameters::set_MODEL_SEARCH_MAX_TRIAL_PTS ( int s ) { @@ -6257,7 +6678,8 @@ void NOMAD::Parameters::set_VNS_SEARCH ( bool s ) void NOMAD::Parameters::set_VNS_SEARCH ( const NOMAD::Double & trigger ) { _to_be_checked = true; - if ( !trigger.is_defined() ) { + if ( !trigger.is_defined() ) + { _VNS_search = false; return; } @@ -6323,7 +6745,8 @@ void NOMAD::Parameters::set_SEC_POLL_DIR_TYPE ( NOMAD::direction_type dt ) // set_SEC_POLL_DIR_TYPE (2/2): void NOMAD::Parameters::set_SEC_POLL_DIR_TYPE -( const std::set<NOMAD::direction_type> & dt ) { +( const std::set<NOMAD::direction_type> & dt ) +{ std::set<NOMAD::direction_type>::const_iterator it , end = dt.end(); for ( it = dt.begin() ; it != end ; ++it ) set_SEC_POLL_DIR_TYPE ( *it ); @@ -6796,7 +7219,8 @@ void NOMAD::Parameters::set_SGTE_CACHE_FILE ( const std::string & cf ) _sgte_cache_file = cf; if ( cf.empty() ) return; - if ( !NOMAD::Parameters::check_directory ( _sgte_cache_file ) ) { + if ( !NOMAD::Parameters::check_directory ( _sgte_cache_file ) ) + { throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: SGTE_CACHE_FILE"); } @@ -6828,7 +7252,8 @@ void NOMAD::Parameters::set_X0 ( const std::string & file_name ) std::string complete_file_name = _problem_dir + file_name; std::ifstream fin ( complete_file_name.c_str() ); - if ( fin.fail() ) { + if ( fin.fail() ) + { std::string err = "invalid parameter: X0 - could not open file \'" + complete_file_name + "\'"; fin.close(); @@ -6839,14 +7264,16 @@ void NOMAD::Parameters::set_X0 ( const std::string & file_name ) try { fin >> tmp_x0; } - catch ( NOMAD::Point::Bad_Input & ) { + catch ( NOMAD::Point::Bad_Input & ) + { flag = false; // we suppose that the file name corresponds to a cache file: _x0_cache_file = file_name; } - while ( flag ) { + while ( flag ) + { set_X0 ( tmp_x0 ); @@ -6855,7 +7282,8 @@ void NOMAD::Parameters::set_X0 ( const std::string & file_name ) try { fin >> tmp_x0; } - catch ( NOMAD::Point::Bad_Input & ) { + catch ( NOMAD::Point::Bad_Input & ) + { flag = false; } } @@ -6880,7 +7308,8 @@ void NOMAD::Parameters::set_DISPLAY_STATS ( const std::list<std::string> & ls ) // set_DISPLAY_STATS (2/2): void NOMAD::Parameters::set_DISPLAY_STATS ( const std::string & stats ) { - if ( stats.empty() ) { + if ( stats.empty() ) + { _display_stats.clear(); return; } @@ -6891,7 +7320,8 @@ void NOMAD::Parameters::set_DISPLAY_STATS ( const std::string & stats ) it = pe.get_values().begin(); std::list<std::string> ls; - while ( it != end ) { + while ( it != end ) + { ls.push_back ( *it ); ++it; } @@ -6905,7 +7335,8 @@ void NOMAD::Parameters::set_DISPLAY_STATS ( const std::string & stats ) void NOMAD::Parameters::set_STATS_FILE ( const std::string & file_name , const std::list<std::string> & ls ) { - if ( file_name.empty() ) { + if ( file_name.empty() ) + { reset_stats_file(); return; } @@ -6930,7 +7361,8 @@ void NOMAD::Parameters::set_STATS_FILE ( const std::string & file_name , it = pe.get_values().begin(); std::list<std::string> ls; ++it; - while ( it != end ) { + while ( it != end ) + { ls.push_back(*it); ++it; } @@ -6957,27 +7389,32 @@ bool NOMAD::Parameters::set_DISPLAY_DEGREE ( const std::string & dd ) std::string ddu = dd; NOMAD::toupper ( ddu ); - if ( ddu == "NO" || ddu == "NO_DISPLAY" ) { + if ( ddu == "NO" || ddu == "NO_DISPLAY" ) + { set_DISPLAY_DEGREE ( 0 , 0 , 0 , 0 ); return true; } - else if ( ddu == "MIN" || ddu == "MINIMAL" || ddu == "MINIMAL_DISPLAY" ) { + else if ( ddu == "MIN" || ddu == "MINIMAL" || ddu == "MINIMAL_DISPLAY" ) + { set_DISPLAY_DEGREE ( 1 , 1 , 1 , 1 ); return true; } - else if ( ddu == "NORMAL" || ddu == "NORMAL_DISPLAY" ) { + else if ( ddu == "NORMAL" || ddu == "NORMAL_DISPLAY" ) + { set_DISPLAY_DEGREE ( 2 , 2 , 2 , 2 ); return true; } - else if ( ddu == "FULL" || ddu == "FULL_DISPLAY" ) { + else if ( ddu == "FULL" || ddu == "FULL_DISPLAY" ) + { set_DISPLAY_DEGREE ( 3 , 3 , 3 , 3 ); return true; } } - if ( dd.size() == 1 ) { + if ( dd.size() == 1 ) + { int i; if ( !NOMAD::atoi ( dd[0] , i ) ) return false; @@ -7073,6 +7510,15 @@ void NOMAD::Parameters::set_MAX_BB_EVAL ( int bbe ) _max_bb_eval = ( bbe < 0 ) ? -1 : bbe; } + +// set_MAX_BB_EVAL: +void NOMAD::Parameters::set_MAX_EVAL_INTENSIFICATION ( int bbe ) +{ + _to_be_checked = true; + _max_eval_intensification = ( bbe <= 0 ) ? -1 : bbe; +} + + // set_MAX_SIM_BB_EVAL: void NOMAD::Parameters::set_MAX_SIM_BB_EVAL ( int bbe ) { @@ -7160,20 +7606,20 @@ void NOMAD::Parameters::set_L_CURVE_TARGET ( const NOMAD::Double & lct ) // set_ANISOTROPIC_MESH: void NOMAD::Parameters::set_ANISOTROPIC_MESH ( bool anis ) { - _to_be_checked = true; - _anisotropic_mesh = anis; + _to_be_checked = true; + _anisotropic_mesh = anis; } - -// set_USE_SMESH: -void NOMAD::Parameters::set_USE_SMESH ( bool use_smesh ) +// set_MESH_TYPE: +void NOMAD::Parameters::set_MESH_TYPE ( NOMAD::mesh_type mt ) { - _to_be_checked = true; - _use_smesh = use_smesh; + _to_be_checked = true; + _mesh_type = mt; } + // set_MESH_UPDATE_BASIS: void NOMAD::Parameters::set_MESH_UPDATE_BASIS ( const NOMAD::Double & mub ) { @@ -7426,7 +7872,8 @@ void NOMAD::Parameters::set_MIN_POLL_SIZE ( int index , throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , "invalid parameter: MIN_POLL_SIZE" ); _to_be_checked = true; - if ( relative ) { + if ( relative ) + { if ( !_lb[index].is_defined() || !_ub[index].is_defined() || !d.is_defined() || d <= 0.0 || d > 1.0 ) throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , @@ -7442,7 +7889,8 @@ void NOMAD::Parameters::set_MIN_POLL_SIZE ( const NOMAD::Point & delta_p_min , bool relative ) { _to_be_checked = true; - if ( relative ) { + if ( relative ) + { int nd = delta_p_min.size(); for ( int i = 0 ; i < nd ; ++i ) set_MIN_POLL_SIZE ( i , delta_p_min[i] , true ); @@ -7465,6 +7913,12 @@ void NOMAD::Parameters::set_MIN_POLL_SIZE ( const NOMAD::Double & d , bool relat _min_poll_size = NOMAD::Point ( _dimension , d ); } +void NOMAD::Parameters::set_LIMIT_MESH_INDEX ( const int & lmi ) +{ + _to_be_checked = true; + _limit_mesh_index = lmi; +} + // set_NEIGHBORS_EXE: void NOMAD::Parameters::set_NEIGHBORS_EXE ( const std::string & ne ) { @@ -7560,7 +8014,6 @@ void NOMAD::Parameters::set_BB_MAX_BLOCK_SIZE ( int max_block_size ) if ( _bb_max_block_size > 1 ) _eval_points_as_block=true; - } @@ -7708,11 +8161,83 @@ void NOMAD::Parameters::set_VARIABLE_GROUP for ( it = vg.begin() ; it != end ; ++it ) set_VARIABLE_GROUP ( (*it)->get_var_indexes () , (*it)->get_direction_types () , - (*it)->get_sec_poll_dir_types() - ); + (*it)->get_sec_poll_dir_types() ); + +} + + +void NOMAD::Parameters::reset_granulary ( void ) +{ + _to_be_checked = true; + _granularity.clear(); +} + + +const NOMAD::Point & NOMAD::Parameters::get_granularity ( void ) const +{ + if ( _to_be_checked ) + throw Bad_Access ( "Parameters.cpp" , __LINE__ , + "Parameters::get_granularity(), Parameters::check() must be invoked" ); + + return _granularity; +} + +int NOMAD::Parameters::get_number_granular_variables ( void ) const +{ + + if ( ! _granularity.is_defined() ) + return -1; + + int k=0; + for ( int i=0 ; i < _dimension ; i++ ) + { + if ( _granularity[i] > 0 ) + k++; + + } + return k; +} + + +// set_GRANULAR_VARIABLE +void NOMAD::Parameters::set_GRANULARITY ( int index , const NOMAD::Double & value ) +{ + + _to_be_checked = true; + + if ( index < 0 || index >= _dimension ) + throw Invalid_Parameter ( "Parameters.cpp" , __LINE__ , + "invalid parameter: GRANULARITY - index must be in [0;dimension-1] " ); + + if ( ! _granularity.is_defined() || _granularity.size() != _dimension ) + _granularity.reset( _dimension, 0.0 ); + _granularity[index] = value; } + +// set_GRANULARITY +void NOMAD::Parameters::set_GRANULARITY ( const NOMAD::Point & v ) +{ + _to_be_checked = true; + _granularity = v; + +} + + +// set_GRANULARITY +void NOMAD::Parameters::set_GRANULARITY ( const NOMAD::Double & v ) +{ + _to_be_checked = true; + + _granularity.clear(); + + set_GRANULARITY ( NOMAD::Point( _dimension , v ) ); + +} + + + /*-----------------------------------------------*/ /* help (display parameter descriptions) - 1/3 */ /*-----------------------------------------------*/ @@ -7765,8 +8290,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo const char registered_key_basic[]="2N ANGLES AVG BARRIER BASIC BASIC BB_EXE BB_INPUT_TYPE BB_OUTPUT_TYPE BI-MADS BI-OBJECTIVES BIMADS \ - BINARY BIOBJECTIVES BLACK-BOXES BLACKBOXES BOUNDS CACHE BBEVAL CACHE_FILE CNT_EVAL CONSTRAINTS CONTINUOUS COUNT DEBUG DELTA_0 DIMENSION \ - DIRECTION_TYPE DIRECTION_TYPES DIRECTIONS DIRECTIONS_TYPES DIRECTORY DISPLAY_ALL_EVAL DISPLAY_DEGREES DISPLAY_STATS EVALUATIONS \ + BINARY BIOBJECTIVES BLACK-BOXES BLACKBOXES BOUNDS CACHE BBEVAL CACHE_FILE CNT_EVAL CONSTRAINTS CONTINUOUS COUNT DEBUG DELTA_0 DIMENSION \ + DIRECTION_TYPE DIRECTION_TYPES DIRECTIONS DIRECTIONS_TYPES DIRECTORY DISPLAY_ALL_EVAL DISPLAY_DEGREES DISPLAY_STATS EVALUATIONS \ EXECUTABLE F_TARGET FILES FILTER FORMAT GPS h(x) HISTORY_FILE INITIAL_MESH_SIZE INTEGER LATEX LATIN-HYPERCUBE LB LH_SEARCH LOWER_BOUND \ LT LT-MADS LTMADS MADS MAX_BB_EVAL MAX_TIME MAXIMUM MINIMIZE MODEL MODELS MULTI-OBJECTIVE MULTIOBJECTIVES N+1 NUMBER OPTIMIZE ORTHO \ ORTHO-MADS ORTHOMADS OUTPUTS PATH PB PEB POINT POLL PROGRESSIVE-BARRIER RANDOM SAMPLING SCREEN SCREEN SOLUTION_FILE STARTING STATIC \ @@ -7786,16 +8311,17 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo OPTIMISTIC ORTHO ORTHO-MADS ORTHOGONAL ORTHOMADS OUTPUT OUTPUTS PARALLELISM PARETO PB PEB PERIODIC_VARIABLE PMADS POINT_DISPLAY_LIMIT \ POLL POLL_UPDATE_BASIS PRECISION PROGRESSIVE-BARRIER PROJECTION PSD-MADS PSDMADS QUAD QUADRATIC RAM RANDOM REALS REGRESSION RHO SAMPLING SCALE SCALING \ SEARCH SEED SGTE_CACHE_FILE SGTE_COST SGTE_EVAL_SORT SGTE_EXE SGTE_ORDERING SGTES SIMULATED SNAP_TO_BOUNDS SPECULATIVE_SEARCH \ - STAT_SUM_TARGET STATS STOP_IF_FEASIBLE SUCCESSES SURF SURROGATES TABULATIONS TAU TERMINATES TERMINATION TGP TGPMODEL_SEARCH TRIGGER \ - UB UNDEF_STR UNDEFINED USER_CALLS_DISABLED USER_CALLS_ENABLED VARIABLE_GROUP VARIABLES VNS_SEARCH W- W+"; + STAT_SUM_TARGET STATS STOP_IF_FEASIBLE SUCCESSES SURF SURROGATES TABULATIONS TAU TERMINATES TERMINATION TRIGGER \ + UB UNDEF_STR UNDEFINED USER_CALLS_DISABLED USER_CALLS_ENABLED VARIABLE_GROUP VARIABLES VNS_SEARCH W- W+ "; const char registered_key_developer[]="BI-MADS BI-OBJECTIVES BIMADS BIOBJECTIVES BLACK-BOXES BLACK-BOXES COMPARISONS DEVELOPER \ DIRECTIONS EPSILON EVALUATIONS FROBENIUS INITIAL_MESH_INDEX IMPROVEMENT INTERPOLATION L_CURVE_TARGET MADS MFN MODEL MODEL_EVAL_SORT_CAUTIOUS MODEL_ORDERING \ MODEL_QUAD_MAX_Y_SIZE MODEL_QUAD_MIN_Y_SIZE MODEL_QUAD_RADIUS_FACTOR MODEL_QUAD_USE_WP MODEL_SEARCH MODEL_SEARCH_MAX_TRIAL_PTS \ - MODEL_SEARCH_PROJ_TO_MESH MODEL_TGP_MODE MODEL_TGP_REUSE_MODEL MODELS MULTI_FORMULATION MULTI_USE_DELTA_CRITERION MULTI-OBJECTIVES \ + MODEL_SEARCH_PROJ_TO_MESH MODELS MULTI_FORMULATION MULTI_USE_DELTA_CRITERION MULTI-OBJECTIVES \ MULTIOBJECTIVES N+1 NP1 OBJECTIVE OPPORTUNISTIC_LUCKY_EVAL OPPORTUNISTIC_MIN_F_IMPRVMT OPPORTUNISTIC_MIN_NB_SUCCESSES OPT_ONLY_SGTES \ ORTHO PARETO PB PEB POLL PRECISION PROGRESSIVE-BARRIER PROJECTION QUAD QUADRATIC REALS REGRESSION SEC_POLL_DIR_TYPES SGTES STOPPING \ - SUCCESSES SURROGATES TERMINATES TERMINATION TGP USE_SMESH WELL-POISEDNESS"; + SUCCESSES SURROGATES TERMINATES TERMINATION MESH_TYPE WELL-POISEDNESS " ; + if ( display_all || NOMAD::string_find ( registered_key_basic, param_names ) ) @@ -7812,7 +8338,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo EXECUTABLE FILES BI-OBJECTIVES \ BIOBJECTIVES MULTIOBJECTIVES \ BIMADS BI-MADS \ - MULTI-OBJECTIVES" , param_names ) ) { + MULTI-OBJECTIVES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "BB_EXE (basic)" ) << std::endl << ". blackbox executable names" << std::endl @@ -7839,7 +8366,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // -------------- if ( display_all || NOMAD::string_find ( "BB_INPUT_TYPE BLACK-BOXES BLACKBOXES \ BASIC VARIABLES CONTINUOUS \ - INTEGER BINARY" , param_names ) ) { + INTEGER BINARY" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "BB_INPUT_TYPE (basic)" ) << std::endl << ". blackbox input types" << std::endl @@ -7869,7 +8397,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo MULTI-OBJECTIVE MINIMIZE \ BIOBJECTIVES MULTIOBJECTIVES \ BI-MADS BIMADS \ - OPTIMIZE" , param_names ) ) { + OPTIMIZE" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "BB_OUTPUT_TYPE (basic)" ) << std::endl << ". blackbox output types" << std::endl @@ -7915,7 +8444,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // CACHE_FILE: // ----------- if ( display_all || NOMAD::string_find ( "CACHE_FILE BASIC \ - FILES OUTPUTS" , param_names ) ) { + FILES OUTPUTS" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "CACHE_FILE (basic)" ) << std::endl << ". cache file; if the specified file" << std::endl @@ -7952,7 +8482,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo MADS DIRECTIONS 2N N+1 POLL MODEL MODELS \ ORTHOMADS ORTHO-MADS LTMADS LT-MADS \ RANDOM STATIC UNIFORM ANGLES" , - param_names ) ) { + param_names ) ) + { _out << std::endl << NOMAD::open_block ( "DIRECTION_TYPE (basic)" ) << std::endl << ". types of directions used in the poll step" << std::endl @@ -7975,6 +8506,10 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo << " # ((n+1)th dir = " << std::endl << " # negative sum of" << std::endl << " # n first dirs)" << std::endl + << "DIRECTION_TYPE ORTHO N+1 UNI # OrthoMADS, n+1" << std::endl + << " # uniform " << std::endl + << " # distribution of" << std::endl + << " # dirs)" << std::endl << "DIRECTION_TYPE ORTHO # OrthoMADS, n+1 QUAD " << std::endl << "DIRECTION_TYPE ORTHO 2N # OrthoMADS, 2n" << std::endl << "DIRECTION_TYPE LT 1 # LT-MADS, 1" << std::endl @@ -8028,12 +8563,13 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // DISPLAY_DEGREE: // --------------- if ( display_all || NOMAD::string_find ( "DISPLAY_DEGREES OUTPUTS \ - SCREEN DEBUG BASIC" , param_names ) ) { + SCREEN DEBUG BASIC" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "DISPLAY_DEGREE (basic)" ) << std::endl << ". " << NOMAD::open_block ( "display degree" ) << "0: no display" << std::endl - << "1: minimal display" << std::endl + << "1: minimal display" << std::endl << "2: normal display" << std::endl << "3: full display" << std::endl << NOMAD::close_block() @@ -8066,7 +8602,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // DISPLAY_STATS: // --------------- if ( display_all || NOMAD::string_find ( "DISPLAY_STATS OUTPUTS LATEX FORMAT \ - SCREEN DEBUG BASIC" , param_names ) ) { + SCREEN DEBUG BASIC" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "DISPLAY_STATS (basic)" ) << std::endl << ". format of the outputs displayed at each success" << std::endl @@ -8119,7 +8656,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo MULTI-OBJECTIVES \ BIOBJECTIVES MULTIOBJECTIVES \ BI-MADS BIMADS \ - TERMINATES TERMINATION" , param_names ) ) { + TERMINATES TERMINATION" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "F_TARGET (basic)" ) << std::endl << ". NOMAD terminates if fi <= F_TARGET[i] for" << std::endl @@ -8137,7 +8675,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // HISTORY_FILE: // ------------- if ( display_all || NOMAD::string_find ( "HISTORY_FILE BASIC \ - FILES OUTPUTS" , param_names ) ) { + FILES OUTPUTS" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "HISTORY_FILE (basic)" ) << std::endl << ". history file: contains all trial points" << std::endl @@ -8155,7 +8694,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // INITIAL_MESH_SIZE: // ------------------ if ( display_all || NOMAD::string_find ( "INITIAL_MESH_SIZE BASIC MADS \ - DELTA_0 " , param_names ) ) { + DELTA_0 " , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "INITIAL_MESH_SIZE (basic)" ) << std::endl << ". initial mesh size" << std::endl @@ -8183,7 +8723,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // INITIAL_POLL_SIZE: // ------------------ if ( display_all || NOMAD::string_find ( "INITIAL_POLL_SIZE BASIC MADS \ - DELTA_0 " , param_names ) ) { + DELTA_0 " , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "INITIAL_POLL_SIZE (basic)" ) << std::endl << ". initial poll size" << std::endl @@ -8212,7 +8753,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // LH_SEARCH: // ---------- if ( display_all || NOMAD::string_find ( "LH_SEARCH LATIN-HYPERCUBE \ - SAMPLING BASIC" , param_names ) ) { + SAMPLING BASIC" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "LH_SEARCH (basic)" ) << std::endl << ". Latin-Hypercube sampling (search)" << std::endl @@ -8234,7 +8776,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // LOWER_BOUND: // ------------ if ( display_all || NOMAD::string_find ( "LOWER_BOUND BASIC LB BOUNDS FILES" , - param_names ) ) { + param_names ) ) + { _out << std::endl << NOMAD::open_block ( "LOWER_BOUND (basic)" ) << std::endl << ". lower bounds for each variable" << std::endl @@ -8258,7 +8801,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo BI-0BJECTIVE MULTI-OBJECTIVE \ BIOBJECTIVES MULTIOBJECTIVES \ BI-MADS BIMADS \ - TERMINATES TERMINATION" , param_names ) ) { + TERMINATES TERMINATION" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MAX_BB_EVAL (basic)" ) << std::endl << ". maximum number of blackbox evaluations" << std::endl @@ -8278,7 +8822,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo if ( display_all || NOMAD::string_find ( "MAX_TIME BASIC BLACK-BOXES BLACKBOXES \ MAXIMUM WALL-CLOCK REAL \ STOPPING TERMINATION \ - TERMINATES" , param_names ) ) { + TERMINATES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MAX_TIME (basic)" ) << std::endl << ". maximum wall-clock time in seconds" << std::endl @@ -8293,7 +8838,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // SOLUTION_FILE: // -------------- if ( display_all || NOMAD::string_find ( "SOLUTION_FILE BASIC \ - FILES OUTPUTS" , param_names ) ) { + FILES OUTPUTS" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "SOLUTION_FILE (basic)" ) << std::endl << ". file containing the solution" << std::endl @@ -8312,7 +8858,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ----------- if ( display_all || NOMAD::string_find ( "STATS_FILE BASIC \ FILES OUTPUTS DISPLAY_STATS" , - param_names ) ) { + param_names ) ) + { _out << std::endl << NOMAD::open_block ( "STATS_FILE (basic)" ) << std::endl << ". file containing all successes with the same format" << std::endl @@ -8332,7 +8879,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // -------- if ( display_all || NOMAD::string_find ( "TMP_DIR BASIC PATH TEMPORARY \ DIRECTORY FILES \ - BLACK-BOXES BLACKBOXES" , param_names ) ) { + BLACK-BOXES BLACKBOXES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "TMP_DIR (basic)" ) << std::endl << ". temporary directory for blackbox input/output files" << std::endl @@ -8349,7 +8897,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // UPPER_BOUND: // ------------ if ( display_all || NOMAD::string_find ( "UPPER_BOUND BASIC UB BOUNDS" , - param_names ) ) { + param_names ) ) + { _out << std::endl << NOMAD::open_block ( "UPPER_BOUND (basic)" ) << std::endl << ". upper bounds for each variable" << std::endl @@ -8365,7 +8914,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo if ( display_all || NOMAD::string_find ( "X0 STARTING POINT BASIC \ VARIABLES \ LH LATIN-HYPERCUBE \ - CACHE FILES" , param_names ) ) { + CACHE FILES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "X0 (basic)" ) << std::endl << ". starting point(s)" << std::endl @@ -8407,7 +8957,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ADD_SEED_TO_FILE_NAMES: // ----------------------- if ( display_all || NOMAD::string_find ( "ADD_SEED_TO_FILE_NAMES OUTPUTS \ - ADVANCED FILES" , param_names ) ) { + ADVANCED FILES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "ADD_SEED_TO_FILE_NAMES (advanced)" ) << std::endl << ". if \'yes\', the seed is added to the name of" << std::endl @@ -8422,12 +8973,13 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ANISOTROPIC_MESH: // ------------- - if ( display_all || NOMAD::string_find ( "ANISOTROPIC MESH SCALING" , param_names ) ) { + if ( display_all || NOMAD::string_find ( "ANISOTROPIC MESH SCALING" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "ANISOTROPIC_MESH (advanced)" ) << std::endl << ". use anisotropic mesh for generating directions" << std::endl - << ". if \'yes\', the mesh size is scaled dynamically" << std::endl - << ". based on direction of success." << std::endl + << ". if \'yes\', the mesh size is scaled dynamically" << std::endl + << ". based on direction of success." << std::endl << ". This option is compatible with Ortho Mads " << std::endl << ". directions only " << std::endl << ". default: \'yes\'" << std::endl @@ -8440,7 +8992,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ASYNCHRONOUS: // ------------- if ( display_all || NOMAD::string_find ( "ASYNCHRONOUS PARALLELISM MPI \ - ADVANCED PMADS" , param_names ) ) { + ADVANCED PMADS" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "ASYNCHRONOUS (advanced)" ) << std::endl << ". asynchronous strategy for the parallel version" << std::endl @@ -8458,7 +9011,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ---------------------- if ( display_all || NOMAD::string_find ( "BB_INPUT_INCLUDE_SEED BLACK-BOXES \ BLACKBOXES \ - ADVANCED FILES" , param_names ) ) { + ADVANCED FILES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "BB_INPUT_INCLUDE_SEED (advanced)" ) << std::endl << ". if \'yes\', the seed (\'SEED\') of the current" << std::endl @@ -8475,7 +9029,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // --------------------- if ( display_all || NOMAD::string_find ( "BB_INPUT_INCLUDE_TAG \ BLACK-BOXES BLACKBOXES \ - ADVANCED FILES" , param_names ) ) { + ADVANCED FILES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "BB_INPUT_INCLUDE_TAG (advanced)" ) << std::endl << ". if \'yes\', the tag of a point is put as the first" << std::endl @@ -8492,7 +9047,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // BB_REDIRECTION: // --------------- if ( display_all || NOMAD::string_find ( "BB_REDIRECTION BLACK-BOXES BLACKBOXES \ - ADVANCED OUTPUT FILES" , param_names ) ) { + ADVANCED OUTPUT FILES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "BB_REDIRECTION (advanced)" ) << std::endl << ". if NOMAD uses a redirection (\'>\') to" << std::endl @@ -8564,8 +9120,9 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo if ( display_all || NOMAD::string_find ( "MODEL DISABLE MODELS DISABLE_MODELS \ MODEL_EVAL_SORT ADVANCED \ EVAL_SORT \ - ORTHO N+1 QUAD QUADRATIC MODEL_SEARCH TGP " , - param_names ) ) { + ORTHO N+1 QUAD QUADRATIC MODEL_SEARCH" , + param_names ) ) + { _out << std::endl << NOMAD::open_block ( "DISABLE (advanced)" ) << std::endl << ". this parameter is used to forcefully disable a feature." << std::endl @@ -8578,35 +9135,37 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo << " MODEL_SEARCH and DIRECTION_TYPE ORTHO N+1 QUAD" << std::endl << " will be ignored " << std::endl << ". # DISABLE EVAL_SORT: ordering by lexicographic order only. " << std::endl - << " # WARNING: setting of MODEL_EVAL_SORT," << std::endl - << " SURROGATE_EVAL_SORT and user priority " << std::endl - << " will be ignored" << std::endl + << " # WARNING: setting of MODEL_EVAL_SORT," << std::endl + << " SURROGATE_EVAL_SORT and user priority " << std::endl + << " will be ignored" << std::endl << ". default: no default" << std::endl << NOMAD::close_block(); chk = true; } + // BB_MAX_BLOCK_SIZE //----------- if ( display_all || NOMAD::string_find ( "EVAL LIST MAX BLOCK SIZE BB BLACKBOX \ BLACK-BOX OPPORTUNIST OPPORTUNISTIC PARALLEL", - param_names ) ) { + param_names ) ) + { _out << std::endl - << NOMAD::open_block ( "BB_MAX_BLOCK_SIZE (advanced)" ) << std::endl - << ". maximum size of a block of evaluations send to the blackbox" << std::endl - << " executable at once. Blackbox executable can manage parallel" << std::endl - << " evaluations on its own. Opportunistic strategies may apply after" << std::endl - << " each block of evaluations." << std::endl - << " Depending on the algorithm phase, the blackbox executable will" << std::endl - << " receive at most BB_MAX_BLOCK_SIZE points to evaluate." << std::endl + << NOMAD::open_block ( "BB_MAX_BLOCK_SIZE (advanced)" ) << std::endl + << ". maximum size of a block of evaluations send to the blackbox" << std::endl + << " executable at once. Blackbox executable can manage parallel" << std::endl + << " evaluations on its own. Opportunistic strategies may apply after" << std::endl + << " each block of evaluations." << std::endl + << " Depending on the algorithm phase, the blackbox executable will" << std::endl + << " receive at most BB_MAX_BLOCK_SIZE points to evaluate." << std::endl << " When this parameter is greater than one, the number of evaluations"<< std::endl - << " may exceed the MAX_BB_EVAL stopping criterion." << std::endl - << ". argument: integer > 0" << std::endl - << ". example: BB_MAX_BLOCK_SIZE 3," << std::endl - << " The blackbox executable receives blocks of" << std::endl - << " at most 3 points for evaluation." << std::endl - << ". default: 1" << std::endl + << " may exceed the MAX_BB_EVAL stopping criterion." << std::endl + << ". argument: integer > 0" << std::endl + << ". example: BB_MAX_BLOCK_SIZE 3," << std::endl + << " The blackbox executable receives blocks of" << std::endl + << " at most 3 points for evaluation." << std::endl + << ". default: 1" << std::endl << NOMAD::close_block(); chk = true; } @@ -8618,7 +9177,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo EXTENDED_POLL_DISABLED \ MIXED MVP CATEGORICAL \ ADVANCED" , - param_names ) ) { + param_names ) ) + { _out << std::endl << NOMAD::open_block ( "EXTENDED_POLL_ENABLED (advanced)" ) << std::endl << ". if \'no\', the extended poll for categorical" << std::endl @@ -8635,7 +9195,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // EXTENDED_POLL_TRIGGER: // ---------------------- if ( display_all || NOMAD::string_find ( "EXTENDED_POLL_TRIGGER ADVANCED \ - MIXED MVP CATEGORICAL" , param_names ) ) { + MIXED MVP CATEGORICAL" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "EXTENDED_POLL_TRIGGER (advanced)" ) << std::endl << ". extended poll trigger for categorical variables" << std::endl @@ -8657,7 +9218,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // FIXED_VARIABLE: // --------------- if ( display_all || NOMAD::string_find ( "FIXED_VARIABLE VARIABLES ADVANCED \ - FILES" , param_names ) ) { + FILES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "FIXED_VARIABLE (advanced)" ) << std::endl << ". fix some variables to some specific values" << std::endl @@ -8686,7 +9248,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo CONSTRAINTS PB FILTER PEB \ L1 L2 LINF L_INF \ FEASIBILITY \ - PROGRESSIVE-BARRIER" , param_names ) ) { + PROGRESSIVE-BARRIER" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "H_MAX_0 (advanced)" ) << std::endl << ". initial value of h_max (for PB and" << std::endl @@ -8706,7 +9269,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo CONSTRAINTS PB FILTER PEB \ L1 L2 LINF L_INF \ FEASIBILITY \ - PROGRESSIVE-BARRIER" , param_names ) ) { + PROGRESSIVE-BARRIER" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "H_MIN (advanced)" ) << std::endl << ". value of h_min; x is feasible if h(x) <= h_min" << std::endl @@ -8724,7 +9288,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo CONSTRAINTS PB FILTER PEB \ L1 L2 LINF L_INF \ FEASIBILITY \ - PROGRESSIVE-BARRIER" , param_names ) ) { + PROGRESSIVE-BARRIER" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "H_NORM (advanced)" ) << std::endl << ". norm used by the F and PB constraints handling" << std::endl @@ -8741,8 +9306,9 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // HAS_SGTE: // --------- if ( display_all || NOMAD::string_find ( "HAS_SGTE SGTE_EXE ADVANCED SURROGATES \ - BLACK-BOXES BLACKBOXES \ - SGTES" , param_names ) ) { + BLACK-BOXES BLACKBOXES \ + SGTES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "HAS_SGTE (advanced)" ) << std::endl << ". to indicate that the problem has a surrogate" << std::endl @@ -8762,7 +9328,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // -------- if ( display_all || NOMAD::string_find ( "INF_STR ADVANCED \ INFINITY DISPLAY REALS" , - param_names ) ) { + param_names ) ) + { _out << std::endl << NOMAD::open_block ( "INF_STR (advanced)" ) << std::endl << ". string used to display infinity" << std::endl @@ -8778,7 +9345,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo if ( display_all || NOMAD::string_find ( "MAX_CACHE_MEMORY ADVANCED \ MAXIMUM RAM STOPPING \ MB MEGA-BYTES MEGABYTES \ - TERMINATES TERMINATION" , param_names ) ) { + TERMINATES TERMINATION" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MAX_CACHE_MEMORY (advanced)" ) << std::endl << ". the program terminates as soon as the cache" << std::endl @@ -8794,7 +9362,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // MAX_CONSECUTIVE_FAILED_ITERATIONS: // ---------------------------------- if ( display_all || NOMAD::string_find ( "MAX_CONSECUTIVE_FAILED_ITERATIONS ADVANCED \ - TERMINATION STOPPING TERMINATES" , param_names ) ) { + TERMINATION STOPPING TERMINATES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MAX_CONSECUTIVE_FAILED_ITERATIONS (advanced)" ) << std::endl << ". maximum number of consecutive failed iterations" << std::endl @@ -8810,7 +9379,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo if ( display_all || NOMAD::string_find ( "MAX_EVAL ADVANCED BLACK-BOXES BLACKBOXES \ MAXIMUM CACHE BBEVAL \ NUMBER EVALUATIONS STOPPING \ - TERMINATES TERMINATION" , param_names ) ) { + TERMINATES TERMINATION" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MAX_EVAL (advanced)" ) << std::endl << ". maximum number of evaluations" << std::endl @@ -8828,7 +9398,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo if ( display_all || NOMAD::string_find ( "MAX_ITERATIONS ADVANCED \ MAXIMUM MADS \ NUMBER STOPPING \ - TERMINATES TERMINATION" , param_names ) ) { + TERMINATES TERMINATION" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MAX_ITERATIONS (advanced)" ) << std::endl << ". maximum number of MADS iterations" << std::endl @@ -8839,14 +9410,14 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo chk = true; } - // MAX_SGTE_EVAL: // -------------- if ( display_all || NOMAD::string_find ( "MAX_SGTE_EVAL ADVANCED BLACK-BOXES \ BLACKBOXES \ MAXIMUM SURROGATES BBEVAL SGTES \ NUMBER EVALUATIONS STOPPING \ - TERMINATES TERMINATION" , param_names ) ) { + TERMINATES TERMINATION" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MAX_SGTE_EVAL (advanced)" ) << std::endl << ". maximum number of surrogate evaluations" << std::endl @@ -8863,7 +9434,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo BLACK-BOXES BLACKBOXES BBEVAL \ MAXIMUM CACHE SIMULATED \ NUMBER EVALUATIONS STOPPING \ - TERMINATES TERMINATION" , param_names ) ) { + TERMINATES TERMINATION" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MAX_SIM_BB_EVAL (advanced)" ) << std::endl << ". maximum number of simulated blackbox evaluations" << std::endl @@ -8883,7 +9455,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // MESH_COARSENING_EXPONENT: // ------------------------- if ( display_all || NOMAD::string_find ( "MESH_COARSENING_EXPONENT ADVANCED \ - MADS W+ \\DELTA" , param_names ) ) { + MADS W+ \\DELTA" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MESH_COARSENING_EXPONENT (advanced)" ) << std::endl << ". mesh coarsening exponent w^+ used to update the mesh" << std::endl @@ -8900,7 +9473,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // MESH_REFINING_EXPONENT: // ----------------------- if ( display_all || NOMAD::string_find ( "MESH_REFINING_EXPONENT ADVANCED \ - MADS W- \\DELTA" , param_names ) ) { + MADS W- \\DELTA" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MESH_REFINING_EXPONENT (advanced)" ) << std::endl << ". mesh refining exponent w^- used to update the mesh" << std::endl @@ -8915,7 +9489,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // MESH_UPDATE_BASIS: // ------------------ if ( display_all || NOMAD::string_find ( "MESH_UPDATE_BASIS ADVANCED \ - MADS \\TAU \\DELTA" , param_names ) ) { + MADS \\TAU \\DELTA" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MESH_UPDATE_BASIS (advanced)" ) << std::endl << ". mesh update basis \\tau used to update the" << std::endl @@ -8931,7 +9506,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // -------------- if ( display_all || NOMAD::string_find ( "MIN_MESH_SIZE ADVANCED \ \\DELTA MINIMUM TERMINATION \ - STOPPING TERMINATES" , param_names ) ) { + STOPPING TERMINATES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MIN_MESH_SIZE (advanced)" ) << std::endl << ". minimum mesh size" << std::endl @@ -8947,7 +9523,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // -------------- if ( display_all || NOMAD::string_find ( "MIN_POLL_SIZE MESH ADVANCED \ \\DELTA^P MINIMUM TERMINATION \ - STOPPING TERMINATES" , param_names ) ) { + STOPPING TERMINATES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MIN_POLL_SIZE (advanced)" ) << std::endl << ". minimum poll size" << std::endl @@ -8965,18 +9542,18 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ---------------- if ( display_all || NOMAD::string_find ( "MODEL_ORDERING MODEL_EVAL_SORT ADVANCED \ MODELS INTERPOLATION REGRESSION \ - MFN FROBENIUS QUADRATIC \ - TGP" , param_names ) ) { + MFN FROBENIUS QUADRATIC" , param_names ) ) + { _out << std::endl - << NOMAD::open_block ( "MODEL_EVAL_SORT (advanced)" ) << std::endl + << NOMAD::open_block ( "MODEL_EVAL_SORT (advanced)" ) << std::endl << ". if models are used to sort the trial points" << std::endl << ". disabled for more than 50 variables" << std::endl << ". disabled with categorical variables" << std::endl << ". argument: one boolean (\'yes\' or \'no\')" << std::endl - << " or one string in {\'QUADRATIC\', \'TGP\'}" << std::endl + << " or one string in {\'QUADRATIC\'}" << std::endl << ". default: \'QUADRATIC\'" << std::endl << ". examples: MODEL_EVAL_SORT quadratic" << std::endl - << " MODEL_EVAL_SORT yes # quadratic is used" << std::endl + << " MODEL_EVAL_SORT yes # quadratic is used" << std::endl << " MODEL_EVAL_SORT no # no MES" << std::endl << NOMAD::close_block(); chk = true; @@ -8987,8 +9564,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ------------- if ( display_all || NOMAD::string_find ( "MODEL_SEARCH ADVANCED CATEGORICAL \ MODELS INTERPOLATION REGRESSION \ - MFN FROBENIUS QUADRATIC PARALLEL \ - TGP" , param_names ) ) { + MFN FROBENIUS QUADRATIC PARALLEL" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MODEL_SEARCH (advanced)" ) << std::endl << ". model search (MS)" << std::endl @@ -8997,10 +9574,9 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo << ". disabled with categorical variables" << std::endl << ". disabled in parallel mode" << std::endl << ". argument: one boolean (\'yes\' or \'no\')" << std::endl - << " or one string in {\'QUADRATIC\', \'TGP\'}" << std::endl + << " or one string in {\'QUADRATIC\'}" << std::endl << ". default: \'QUADRATIC\'" << std::endl << ". example: MODEL_SEARCH QUADRATIC" << std::endl - << " MODEL_SEARCH TGP" << std::endl << NOMAD::close_block(); chk = true; } @@ -9011,8 +9587,9 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ------------------------ if ( display_all || NOMAD::string_find ( "MODEL_SEARCH_OPTIMISTIC ADVANCED \ MODELS INTERPOLATION REGRESSION \ - MFN FROBENIUS QUADRATIC \ - TGP" , param_names ) ) { + MFN FROBENIUS QUADRATIC " + , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MODEL_SEARCH_OPTIMISTIC (advanced)" ) << std::endl << ". model search (MS) is optimistic or not" << std::endl @@ -9030,7 +9607,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo BI-OBJECTIVES MULTI-OBJECTIVES \ BIOBJECTIVES MULTIOBJECTIVES \ BI-MADS BIMADS SURF" , - param_names ) ) { + param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MULTI_F_BOUNDS (advanced)" ) << std::endl << ". multi-objective optimization: bounds on the two" << std::endl @@ -9055,7 +9633,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo BI-OBJECTIVES MULTI-OBJECTIVES \ BIOBJECTIVES MULTIOBJECTIVES \ BI-MADS BIMADS \ - NUMBER" , param_names ) ) { + NUMBER" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MULTI_NB_MADS_RUNS (advanced)" ) << std::endl << ". multi-objective optimization:" << std::endl @@ -9075,7 +9654,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo BI-MADS BIMADS \ NUMBER BLACK-BOXES BLACKBOXES BBEVAL \ EVALUATIONS TERMINATION \ - STOPPING TERMINATES" , param_names ) ) { + STOPPING TERMINATES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "MULTI_OVERALL_BB_EVAL (advanced)" ) << std::endl << ". multi-objective optimization: maximum" << std::endl @@ -9096,7 +9676,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo EXTENDED_POLL \ MIXED MVP CATEGORICAL \ ADVANCED" , - param_names ) ) { + param_names ) ) + { _out << std::endl << NOMAD::open_block ( "NEIGHBORS_EXE (advanced)" ) << std::endl << ". to indicate a neighborhood executable for categorical" << std::endl @@ -9135,7 +9716,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo if ( display_all || NOMAD::string_find ( "OPPORTUNISTIC_CACHE_SEARCH ADVANCED \ BLACK-BOXES BLACKBOXES EVALUATIONS \ SUCCESSES CACHE SEARCH" , - param_names ) ) { + param_names ) ) + { _out << std::endl << NOMAD::open_block ( "OPPORTUNISTIC_CACHE_SEARCH (advanced)" ) << std::endl << ". opportunistic strategy for cache search" << std::endl @@ -9150,7 +9732,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ------------------- if ( display_all || NOMAD::string_find ( "OPPORTUNISTIC_EVAL ADVANCED \ BLACK-BOXES BLACKBOXES EVALUATIONS \ - SUCCESSES" , param_names ) ) { + SUCCESSES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "OPPORTUNISTIC_EVAL (advanced)" ) << std::endl << ". opportunistic strategy (terminate a list of" << std::endl @@ -9169,7 +9752,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo if ( display_all || NOMAD::string_find ( "OPPORTUNISTIC_LH ADVANCED \ BLACK-BOXES BLACKBOXES EVALUATIONS \ SUCCESSES LATIN-HYPERCUBE SEARCH" , - param_names ) ) { + param_names ) ) + { _out << std::endl << NOMAD::open_block ( "OPPORTUNISTIC_LH (advanced)" ) << std::endl << ". opportunistic strategy for Latin-Hypercube search" << std::endl @@ -9186,7 +9770,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ----------------------- if ( display_all || NOMAD::string_find ( "OPPORTUNISTIC_MIN_EVAL ADVANCED \ BLACK-BOXES BLACKBOXES EVALUATIONS \ - SUCCESSES" , param_names ) ) { + SUCCESSES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "OPPORTUNISTIC_MIN_EVAL (advanced)" ) << std::endl << ". advanced parameter for the opportunistic" << std::endl @@ -9220,7 +9805,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // POINT_DISPLAY_LIMIT: // -------------------- if ( display_all || NOMAD::string_find ( "POINT_DISPLAY_LIMIT OUTPUTS \ - ADVANCED PRECISION" , param_names ) ) { + ADVANCED PRECISION" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "POINT_DISPLAY_LIMIT (advanced)" ) << std::endl << ". maximum number of point coordinates" << std::endl @@ -9235,7 +9821,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // POLL_UPDATE_BASIS: // ------------------ if ( display_all || NOMAD::string_find ( "POLL_UPDATE_BASIS ADVANCED \ - MADS ANISOTROPIC MESH \\TAU \\DELTA" , param_names ) ) { + MADS ANISOTROPIC MESH \\TAU \\DELTA" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "POLL_UPDATE_BASIS (advanced)" ) << std::endl << ". poll update basis \\tau used to update the" << std::endl @@ -9250,8 +9837,9 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // RHO: // ---- if ( display_all || NOMAD::string_find ( "RHO ADVANCED MADS CONSTRAINTS \ - PROGRESSIVE-BARRIER PB PEB \ - FILTER TRIGGER" , param_names ) ) { + PROGRESSIVE-BARRIER PB PEB \ + FILTER TRIGGER" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "RHO (advanced)" ) << std::endl << ". rho parameter of the progressive barrier" << std::endl @@ -9265,7 +9853,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // SCALING: // -------- if ( display_all || NOMAD::string_find ( "SCALING SCALE ADVANCED \ - FILES" , param_names ) ) { + FILES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "SCALING (advanced)" ) << std::endl << ". variable scaling" << std::endl @@ -9293,8 +9882,9 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ----- if ( display_all || NOMAD::string_find ( "SEED ADVANCED \ RANDOM FILES ORTHOMADS LT-MADS LTMADS \ - LATIN-HYPERCUBE LH TGP \ - SAMPLING SEARCH" , param_names ) ) { + LATIN-HYPERCUBE LH \ + SAMPLING SEARCH" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "SEED (advanced)" ) << std::endl << ". random seed" << std::endl @@ -9307,7 +9897,7 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo << ". the seed is used in the output file names" << std::endl << ". the seed affects the randomness of " << std::endl << " Ortho-MADS and LT-MADS directions," << std::endl - << " Latin-Hypercube search, and TGP search." << std::endl + << " Latin-Hypercube search." << std::endl << ". example: SEED 123456" << std::endl << NOMAD::close_block(); chk = true; @@ -9319,7 +9909,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ---------------- if ( display_all || NOMAD::string_find ( "SGTE_CACHE_FILE ADVANCED \ SURROGATES SGTES \ - FILES OUTPUTS" , param_names ) ) { + FILES OUTPUTS" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "SGTE_CACHE_FILE (advanced)" ) << std::endl << ". surrogate cache file; cannot be the same" << std::endl @@ -9358,7 +9949,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // --------------- if ( display_all || NOMAD::string_find ( "SGTE_EVAL_SORT ADVANCED SURROGATES \ SGTE_ORDERING SGTES BLACK-BOXES \ - BLACKBOXES" , param_names ) ) { + BLACKBOXES" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "SGTE_EVAL_SORT (advanced)" ) << std::endl << ". if surrogate is used to sort the trial points" << std::endl @@ -9373,7 +9965,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ---------- if ( display_all || NOMAD::string_find ( "SGTE_EXE HAS_SGTE ADVANCED SURROGATES \ SGTES BLACK-BOXES BLACKBOXES \ - FILES EXECUTABLE" , param_names ) ) { + FILES EXECUTABLE" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "SGTE_EXE (advanced)" ) << std::endl << ". to indicate a surrogate executable" << std::endl @@ -9389,7 +9982,7 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo << "SGTE_EXE b1.exe s1.exe # \'s1.exe\' is a surrogate" << std::endl << " # for \'b1.exe\'" << std::endl << std::endl << "SGTE_EXE sgte.exe # only if one blackbox" << std::endl - << " # executable is used" << std::endl + << " # executable is used" << std::endl << NOMAD::close_block() << NOMAD::close_block(); chk = true; } @@ -9414,7 +10007,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // SPECULATIVE_SEARCH: // ------------------- if ( display_all || NOMAD::string_find ( "SPECULATIVE_SEARCH MADS OPTIMISTIC \ - ADVANCED" , param_names ) ) { + ADVANCED" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "SPECULATIVE_SEARCH (advanced)" ) << std::endl << ". MADS speculative_search (optimistic strategy)" << std::endl @@ -9447,7 +10041,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ----------------- if ( display_all || NOMAD::string_find ( "STOP_IF_FEASIBLE ADVANCED \ TERMINATES TERMINATION STOPPING" , - param_names ) ) { + param_names ) ) + { _out << std::endl << NOMAD::open_block ( "STOP_IF_FEASIBLE (advanced)" ) << std::endl << ". the algorithm terminates if it generates" << std::endl @@ -9464,7 +10059,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ---------- if ( display_all || NOMAD::string_find ( "UNDEF_STR ADVANCED \ UNDEFINED DISPLAY REALS" , - param_names ) ) { + param_names ) ) + { _out << std::endl << NOMAD::open_block ( "UNDEF_STR (advanced)" ) << std::endl << ". string used to display undefined real values" << std::endl @@ -9480,7 +10076,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ------------------- if ( display_all || NOMAD::string_find ( "USER_CALLS_ENABLED USER_CALLS_DISABLED \ ADVANCED LIBRARY" , - param_names ) ) { + param_names ) ) + { _out << std::endl << NOMAD::open_block ( "USER_CALLS_ENABLED (advanced)" ) << std::endl << ". if \'no\', the automatic calls to user" << std::endl @@ -9495,7 +10092,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // VARIABLE_GROUP: // -------------- if ( display_all || NOMAD::string_find ( "VARIABLE_GROUP GROUPS PSD-MADS PSDMADS \ - VARIABLES ADVANCED" , param_names ) ) { + VARIABLES ADVANCED" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "VARIABLE_GROUP (advanced)" ) << std::endl << ". defines groups of variables" << std::endl @@ -9522,9 +10120,11 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo METAHEURISTICS META-HEURISTICS \ GLOBAL ADVANCED \ TRIGGER" , - param_names ) ) { + param_names ) ) + { - if ( !NOMAD::string_find ( "RHO" , param_names ) ) { + if ( !NOMAD::string_find ( "RHO" , param_names ) ) + { _out << std::endl << NOMAD::open_block ( "VNS_SEARCH (advanced)" ) << std::endl @@ -9553,7 +10153,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // last display: - if ( !chk && !developer) { + if ( !chk && !developer) + { std::string pname = ( pnames.size() == 1 ) ? ("\'" + *pnames.begin() + "\'") : @@ -9575,7 +10176,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // -------- if ( developer && (display_all || NOMAD::string_find ( "EPSILON DEVELOPPER \ PRECISION REALS COMPARISONS" , - param_names ) ) ) { + param_names ) ) ) + { _out << std::endl << NOMAD::open_block ( "EPSILON (developer)" ) << std::endl << ". precision on reals" << std::endl @@ -9590,7 +10192,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // INITIAL_MESH_INDEX: // ------------------- if ( developer && ( display_all || NOMAD::string_find ( "INITIAL_MESH_INDEX DEVELOPER SMESH \ - \\DELTA MADS L0 L_0 \\ELL_0" , param_names ) ) ) { + \\DELTA MADS L0 L_0 \\ELL_0" , param_names ) ) ) + { _out << std::endl << NOMAD::open_block ( "INITIAL_MESH_INDEX (developer)" ) << std::endl << ". initial mesh index for SMesh \\ell_0" << std::endl @@ -9606,7 +10209,9 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // L_CURVE_TARGET: // --------------- if ( developer && ( display_all || NOMAD::string_find ( "L_CURVE_TARGET DEVELOPER TERMINATION \ - STOPPING TERMINATES" , param_names ) ) ){ + STOPPING TERMINATES" , param_names ) ) ) + { + _out << std::endl << NOMAD::open_block ( "L_CURVE_TARGET (developer)" ) << std::endl << ". MADS terminates if it detects that the objective will" << std::endl @@ -9620,13 +10225,13 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo } - // MODEL_EVAL_SORT_CAUTIOUS: // ------------------------- if ( developer && ( display_all || NOMAD::string_find ( "MODEL_ORDERING MODEL_EVAL_SORT_CAUTIOUS \ MODELS INTERPOLATION REGRESSION \ MFN FROBENIUS DEVELOPER \ - QUADRATIC TGP" , param_names ) ) ) { + QUADRATIC" , param_names ) ) ) + { _out << std::endl << NOMAD::open_block ( "MODEL_EVAL_SORT_CAUTIOUS (developer)" ) << std::endl << ". if the model ordering strategy is cautious, meaning" << std::endl @@ -9642,7 +10247,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ---------------------- if ( developer && ( display_all || NOMAD::string_find ( "MODEL_QUAD_MAX_Y_SIZE MODEL_SEARCH DEVELOPER \ MODELS INTERPOLATION REGRESSION \ - MFN FROBENIUS QUADRATIC" , param_names ) ) ) { + MFN FROBENIUS QUADRATIC" , param_names ) ) ) + { _out << std::endl << NOMAD::open_block ( "MODEL_QUAD_MAX_Y_SIZE (developer)" ) << std::endl << ". Sup. limit on the size of interp. set Y for quadr. models" << std::endl @@ -9657,7 +10263,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ---------------------- if ( developer && (display_all || NOMAD::string_find ( "MODEL_QUAD_MIN_Y_SIZE MODEL_SEARCH DEVELOPER \ MODELS INTERPOLATION REGRESSION \ - MFN FROBENIUS QUADRATIC" , param_names ) ) ) { + MFN FROBENIUS QUADRATIC" , param_names ) ) ) + { _out << std::endl << NOMAD::open_block ( "MODEL_QUAD_MIN_Y_SIZE (developer)" ) << std::endl << ". Inf. limit on the size of interp. set Y for quadr. models" << std::endl @@ -9674,7 +10281,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ------------------------- if ( developer && ( display_all || NOMAD::string_find ( "MODEL_QUAD_RADIUS_FACTOR MODEL_SEARCH \ DEVELOPER MODELS INTERPOLATION REGRESSION \ - MFN FROBENIUS QUADRATIC" , param_names ) ) ) { + MFN FROBENIUS QUADRATIC" , param_names ) ) ) + { _out << std::endl << NOMAD::open_block ( "MODEL_QUAD_RADIUS_FACTOR (developer)" ) << std::endl << ". quadratic model search radius factor (see user guide)" << std::endl @@ -9690,7 +10298,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo if ( developer && ( display_all || NOMAD::string_find ( "MODEL_SEARCH_MAX_TRIAL_PTS \ DEVELOPER MODELS INTERPOLATION REGRESSION \ MFN FROBENIUS QUADRATIC \ - TGP" , param_names ) ) ) { + " , param_names ) ) ) + { _out << std::endl << NOMAD::open_block ( "MODEL_SEARCH_MAX_TRIAL_PTS (developer)" ) << std::endl << ". limit on the number of trial points for one model search" << std::endl @@ -9706,8 +10315,9 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // -------------------------- if ( developer && ( display_all || NOMAD::string_find ( "MODEL_SEARCH_PROJ_TO_MESH DEVELOPER \ MODELS INTERPOLATION REGRESSION \ - MFN FROBENIUS QUADRATIC PROJECTION \ - TGP" , param_names ) ) ) { + MFN FROBENIUS QUADRATIC PROJECTION " , + param_names ) ) ) + { _out << std::endl << NOMAD::open_block ( "MODEL_SEARCH_PROJ_TO_MESH (developer)" ) << std::endl << ". if model search trial points are projected to the mesh" << std::endl @@ -9723,7 +10333,9 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo if ( developer && ( display_all || NOMAD::string_find ( "MODEL_QUAD_USE_WP DEVELOPER \ WELL-POISEDNESS \ MODELS INTERPOLATION REGRESSION \ - MFN FROBENIUS QUADRATIC" , param_names ) ) ){ + MFN FROBENIUS QUADRATIC" , param_names ) ) ) + { + _out << std::endl << NOMAD::open_block ( "MODEL_QUAD_USE_WP (developer)" ) << std::endl << ". enable the strategy to maintain WP with quadr. models" << std::endl @@ -9739,50 +10351,20 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // --------------- if ( developer && (display_all || NOMAD::string_find ( "MODEL MODELS NP1 QUAD EPSILON \ ORTHO N+1 QUAD DEVELOPER" , - param_names ) ) ){ + param_names ) ) ) + { + _out << std::endl << NOMAD::open_block ( "MODEL_NP1_QUAD_EPSILON (developer)" ) << std::endl << ". with the direction type ORTHO N+1 QUAD selected the" << std::endl << " (n+1)-th direction is determined within a truncated " << std::endl << " unit hypercube ]epsilon;1[^n defined by the first " << std::endl << " n-th directions. The truncation is on lower limit " << std::endl - << " and is defined with a single argument (epsilon)." << std::endl + << " and is defined with a single argument (epsilon)." << std::endl << ". argument: real in ]0;1[" << std::endl << ". default: 0.01" << std::endl << NOMAD::close_block(); chk = true; - } - - - // MODEL_TGP_MODE: - // --------------- - if ( developer && (display_all || NOMAD::string_find ( "MODEL_TGP_MODE MODEL_SEARCH DEVELOPER \ - MODELS INTERPOLATION REGRESSION \ - TGP" , param_names ) ) ) { - _out << std::endl - << NOMAD::open_block ( "MODEL_TGP_MODE (developer)" ) << std::endl - << ". TGP mode (fast or precise)" << std::endl - << ". arguments: one string in {\'FAST\', \'PRECISE\'}" << std::endl - << ". default: \'FAST\'" << std::endl - << ". example: MODEL_TGP_MODE PRECISE" << std::endl - << NOMAD::close_block(); - chk = true; - } - - // MODEL_TGP_REUSE_MODEL: - // ---------------------- - if (developer && ( display_all || NOMAD::string_find ( "MODEL_TGP_REUSE_MODEL DEVELOPER \ - MODELS INTERPOLATION REGRESSION \ - TGP" , param_names ) ) ){ - _out << std::endl - << NOMAD::open_block ( "MODEL_TGP_REUSE_MODEL (developer)" ) << std::endl - << ". enable to use the last model from the TGP search for" << std::endl - << " the TGP model eval sort strategy." << std::endl - << ". argument: one boolean (\'yes\' or \'no\')" << std::endl - << ". default: \'yes\'" << std::endl - << ". example: MODEL_TGP_REUSE_MODEL no" << std::endl - << NOMAD::close_block(); - chk = true; } // MULTI_FORMULATION: @@ -9791,7 +10373,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo BI-OBJECTIVES MULTI-OBJECTIVES\ BIOBJECTIVES MULTIOBJECTIVES \ BI-MADS BIMADS" , - param_names ) ) ) { + param_names ) ) ) + { _out << std::endl << NOMAD::open_block ( "MULTI_FORMULATION (developer)" ) << std::endl << ". multi-objective optimization: single-objective reformulation" @@ -9814,7 +10397,9 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo BIOBJECTIVES MULTIOBJECTIVES \ BI-MADS BIMADS \ BI-OBJECTIVES MULTI-OBJECTIVES" , - param_names ) ) ){ + param_names ) ) ) + { + _out << std::endl << NOMAD::open_block ( "MULTI_USE_DELTA_CRIT (developer)" ) << std::endl << ". multi-objective optimization: use the delta criterion" << std::endl @@ -9830,7 +10415,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ------------------------- if ( developer && ( display_all || NOMAD::string_find ( "OPPORTUNISTIC_LUCKY_EVAL DEVELOPER \ BLACK-BOXES BLACKBOXES EVALUATIONS \ - SUCCESSES" , param_names ) ) ) { + SUCCESSES" , param_names ) ) ) + { _out << std::endl << NOMAD::open_block ( "OPPORTUNISTIC_LUCKY_EVAL (developer)" ) << std::endl << ". developer parameter for the opportunistic" << std::endl @@ -9847,7 +10433,8 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo if ( developer && ( display_all || NOMAD::string_find ( "OPPORTUNISTIC_MIN_F_IMPRVMT DEVELOPER \ OBJECTIVE \ BLACK-BOXES BLACKBOXES EVALUATIONS \ - SUCCESSES IMPROVEMENT" , param_names ) ) ) { + SUCCESSES IMPROVEMENT" , param_names ) ) ) + { _out << std::endl << NOMAD::open_block ( "OPPORTUNISTIC_MIN_F_IMPRVMT (developer)" ) << std::endl << ". advanced parameter for the opportunistic" << std::endl @@ -9863,7 +10450,9 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ----------------------------- if ( developer && ( display_all || NOMAD::string_find ( "OPPORTUNISTIC_MIN_NB_SUCCESSES DEVELOPER \ BLACK-BOXES BLACKBOXES \ - EVALUATIONS" , param_names ) ) ){ + EVALUATIONS" , param_names ) ) ) + { + _out << std::endl << NOMAD::open_block ( "OPPORTUNISTIC_MIN_NB_SUCCESS (developer)" ) << std::endl << ". advanced parameter for the opportunistic" << std::endl @@ -9878,8 +10467,10 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // OPT_ONLY_SGTE: // -------------- if (developer && ( display_all || NOMAD::string_find ( "OPT_ONLY_SGTES DEVELOPER SURROGATES \ - BLACK-BOXES BLACKBOXES \ - SGTES" , param_names ) ) ){ + BLACK-BOXES BLACKBOXES \ + SGTES" , param_names ) ) ) + { + _out << std::endl << NOMAD::open_block ( "OPT_ONLY_SGTE (developer)" ) << std::endl << ". NOMAD will only minimize the surrogate" << std::endl @@ -9895,7 +10486,9 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo // ------------------- if ( developer && ( display_all || NOMAD::string_find ( "SEC_POLL_DIR_TYPES DEVELOPER MADS \ POLL DIRECTIONS PB PEB \ - PROGRESSIVE-BARRIER" , param_names ) ) ){ + PROGRESSIVE-BARRIER" , param_names ) ) ) + { + _out << std::endl << NOMAD::open_block ( "SEC_POLL_DIR_TYPES (developer)" ) << std::endl << ". types of directions for the secondary poll" << std::endl @@ -9906,22 +10499,26 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo chk = true; } - // USE_SMESH: + // MESH_TYPE: // ------------------- - if ( developer && ( display_all || NOMAD::string_find ( "USE_SMESH SMESH MESH \ - ANISO" , param_names ) ) ){ + if ( developer && ( display_all || NOMAD::string_find ( "MESH_TYPE XMESH SMESH MESH \ + ANISO" , param_names ) ) ) + { + _out << std::endl - << NOMAD::open_block ( "USE_SMESH (developer)" ) << std::endl - << ". forces the use of the standard mesh (older version of mesh)" << std::endl - << ". default: no" << std::endl - << ". example: USE_SMESH 1" << std::endl + << NOMAD::open_block ( "MESH_TYPE (developer)" ) << std::endl + << ". forces the use of a specific type of mesh (xmesh, smesh))" << std::endl + << ". arguments: X or S" << std::endl + << ". default: X" << std::endl + << ". example: MESH_TYPE X " << std::endl << NOMAD::close_block(); chk = true; } // last display: - if ( !chk && developer) { + if ( !chk && developer) + { std::string pname = ( pnames.size() == 1 ) ? ("\'" + *pnames.begin() + "\'") : @@ -9933,6 +10530,7 @@ void NOMAD::Parameters::help ( const std::list<std::string> & pnames,bool develo << std::endl; } - _out.close_block(); } + + diff --git a/src/Parameters.hpp b/src/Parameters.hpp index 5a8d6c8..cf8e370 100644 --- a/src/Parameters.hpp +++ b/src/Parameters.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -71,8 +78,6 @@ namespace NOMAD { int quad_max_Y_size; ///< Limit sup on the size of \c Y. NOMAD::Double model_np1_quad_epsilon;///< Ortho n+1 quadratic model epsilon (scaling used for (n+1)th dynamic direction with Ortho n+1) - NOMAD::TGP_mode_type tgp_mode; ///< TGP mode (fast or precise). - bool tgp_reuse_model; ///< Use the model from MS for the MES. }; /// Class for the NOMAD parameters. @@ -103,6 +108,15 @@ namespace NOMAD { void interpret_mesh_sizes ( const NOMAD::Parameter_Entries & entries , const std::string & param_name ); + /// Interpretation of the entries for granular variables. + /** + \param entries Parameter entries -- \b IN. + \param param_name Parameter name -- \b IN. + */ + void interpret_granularity ( const NOMAD::Parameter_Entries & entries , + const std::string & param_name ); + + /// Interpretation of the entries for bounds and fixed variables. /** \c BFVS stands for "Bounds and Fixed VariableS". @@ -238,8 +252,8 @@ namespace NOMAD { /// Display parameter help. /** For a list of parameters. - \param param_names_list List of parameter names -- \b IN. - \param developer Bool to request developer help (defaut=false) -- \b IN. + \param param_names_list List of parameter names -- \b IN. + \param developer Bool to request developer help (defaut=false) -- \b IN. */ void help ( const std::list<std::string> & param_names_list , bool developer=false) const; @@ -315,6 +329,12 @@ namespace NOMAD { /// Maximum number of simulated evaluations. int _max_sim_bb_eval; + + /// Maximum number of evaluation during intensification of poll and/or search + int _max_eval_intensification; + + int _intensification_type; + int _max_time; ///< Maximum time. int _max_iterations; ///< Maximum number of iterations. int _max_cons_failed_it; ///< Maximum number of consecutive failed iterations. @@ -399,6 +419,19 @@ namespace NOMAD { */ int get_max_bb_eval ( void ) const; + /// Access to the \c INTENSITIFICATION_TYPE parameter. + /** + \return The \c INTENSIFICATION_TYPE parameter. + */ + int get_intensification_type ( void ) const { return _intensification_type ; } + + /// Access to the \c MAX_EVAL_INTENSIFICATION parameter. + /** + \return The \c MAX_EVAL_INTENSIFICATION parameter. + */ + int get_max_eval_intensification ( void ) const { return _max_eval_intensification ; } + + /// Access to the \c MAX_TIME parameter. /** \return The \c MAX_TIME parameter. @@ -567,6 +600,12 @@ namespace NOMAD { */ void set_MAX_BB_EVAL ( int bbe ); + /// Set the \c MAX_EVAL_INTENSIFICATION parameter. + /** + \param bbe The \c MAX_EVAL_INTENSIFICATION parameter -- \b IN. + */ + void set_MAX_EVAL_INTENSIFICATION ( int bbe ); + /// Set the \c MAX_TIME parameter. /** \param mt The \c MAX_TIME parameter -- \b IN. @@ -912,18 +951,6 @@ namespace NOMAD { */ int get_model_quad_min_Y_size ( void ) const; - /// Access to the \c MODEL_TGP_MODE parameter. - /** - \return The \c MODEL_TGP_MODE parameter. - */ - NOMAD::TGP_mode_type get_model_tgp_mode ( void ) const; - - /// Access to the \c MODEL_TGP_REUSE_MODEL parameter. - /** - \return The \c MODEL_TGP_REUSE_MODEL parameter. - */ - bool get_model_tgp_reuse_model ( void ) const; - /// Access to the \c MODEL_SEARCH_MAX_TRIAL_PTS parameter. /** \return The \c MODEL_SEARCH_MAX_TRIAL_PTS parameter. @@ -1074,18 +1101,6 @@ namespace NOMAD { */ void set_MODEL_NP1_QUAD_EPSILON ( const NOMAD::Double & r ); - /// Set the \c MODEL_TGP_MODE parameter. - /** - \param m The \c MODEL_TGP_MODE parameter -- \b IN. - */ - void set_MODEL_TGP_MODE ( NOMAD::TGP_mode_type m ); - - /// Set the \c MODEL_TGP_REUSE_MODEL parameter. - /** - \param rm The \c MODEL_TGP_REUSE_MODEL parameter -- \b IN. - */ - void set_MODEL_TGP_REUSE_MODEL ( bool rm ); - /// Set the \c MODEL_SEARCH_MAX_TRIAL_PTS parameter. /** \param s The \c MODEL_SEARCH_MAX_TRIAL_PTS parameter -- \b IN. @@ -1152,13 +1167,14 @@ namespace NOMAD { // ----- private: - bool _use_smesh; ///< Use smesh (default xmesh) - bool _anisotropic_mesh; ///< Anisotropic mesh (xmesh only, i.e. _use_smesh=false) + NOMAD::mesh_type _mesh_type; ///< The type of mesh used (xmesh [D], smesh [old] ) + bool _anisotropic_mesh; ///< Anisotropic mesh (xmesh only) NOMAD::Double _mesh_update_basis; ///< Mesh update basis (tau). NOMAD::Double _poll_update_basis; ///< Poll update basis (beta). int _mesh_coarsening_exponent; ///< Mesh coarsening exponent. int _mesh_refining_exponent; ///< Mesh refining exponent. int _initial_mesh_index; ///< Initial mesh index (ell_0). + int _limit_mesh_index; ///< Limit value of mesh index. NOMAD::Point _initial_mesh_size; ///< Initial (absolute) mesh size (delta^0). NOMAD::Point _min_mesh_size; ///< Minimal (absolute) mesh size (delta_min). NOMAD::Point _initial_poll_size; ///< Initial (absolute) poll size (delta^0). @@ -1174,12 +1190,12 @@ namespace NOMAD { */ bool get_anisotropic_mesh ( void ) const; - /// Access to the \c USE_SMESH parameter. + + /// Access to the \c MESH_TYPE parameter. /** - \return The \c USE_SMESH parameter -- \b IN. + \return The \c MESH_TYPE parameter -- \b IN. */ - bool get_use_smesh ( void ) const; - + const NOMAD::mesh_type & get_mesh_type ( void ) const; /// Access to the \c POLL_UPDATE_BASIS parameter. @@ -1213,7 +1229,6 @@ namespace NOMAD { */ int get_initial_mesh_index ( void ) const; - /// Access to the \c INITIAL_MESH_SIZE parameter. /** \return The \c INITIAL_MESH_SIZE parameter. @@ -1251,12 +1266,11 @@ namespace NOMAD { */ void set_ANISOTROPIC_MESH ( bool anis ); - /// Set the \c USE_SMESH parameter. + /// Set the \c MESH_TYPE parameter. /** - \param use_smesh The \c USE_SMESH parameter -- \b IN. + \param mt The \c MESH_TYPE parameter -- \b IN. */ - void set_USE_SMESH ( bool use_smesh ); - + void set_MESH_TYPE ( NOMAD::mesh_type mt ); /// Set the \c MESH_UPDATE_BASIS parameter. /** @@ -1270,7 +1284,6 @@ namespace NOMAD { */ void set_POLL_UPDATE_BASIS ( const NOMAD::Double & r ); - /// Set the \c INITIAL_MESH_INDEX parameter. /** \param ell_0 The \c INITIAL_MESH_INDEX parameter -- \b IN. @@ -1295,7 +1308,8 @@ namespace NOMAD { \param relative Indicated as a relative value -- \b IN -- \b optional (default = \c false). */ - void set_MIN_MESH_SIZE ( const NOMAD::Double & mms , bool relative = false ); + void set_MIN_MESH_SIZE ( const NOMAD::Double & mms , + bool relative = false ); /// Set the \c MIN_MESH_SIZE parameter. /** @@ -1314,7 +1328,8 @@ namespace NOMAD { \param relative Indicated as relative values -- \b IN -- \b optional (default = \c false). */ - void set_MIN_MESH_SIZE ( const NOMAD::Point & mms , bool relative = false ); + void set_MIN_MESH_SIZE ( const NOMAD::Point & mms , + bool relative = false ); /// Set the \c MIN_POLL_SIZE parameter. /** @@ -1322,7 +1337,8 @@ namespace NOMAD { \param relative Indicated as a relative value -- \b IN -- \b optional (default = \c false). */ - void set_MIN_POLL_SIZE ( const NOMAD::Double & mps , bool relative = false ); + void set_MIN_POLL_SIZE ( const NOMAD::Double & mps , + bool relative = false ); /// Set the \c MIN_POLL_SIZE parameter. /** @@ -1341,7 +1357,8 @@ namespace NOMAD { \param relative Indicated as relative values -- \b IN -- \b optional (default = \c false). */ - void set_MIN_POLL_SIZE ( const NOMAD::Point & mps , bool relative = false ); + void set_MIN_POLL_SIZE ( const NOMAD::Point & mps , + bool relative = false ); /// Set the \c INITIAL_MESH_SIZE parameter. /** @@ -1349,7 +1366,8 @@ namespace NOMAD { \param relative Indicated as a relative value -- \b IN -- \b optional (default = \c false). */ - void set_INITIAL_MESH_SIZE ( const NOMAD::Double & ims , bool relative = false ); + void set_INITIAL_MESH_SIZE ( const NOMAD::Double & ims , + bool relative = false ); /// Set the \c INITIAL_MESH_SIZE parameter. /** @@ -1368,7 +1386,8 @@ namespace NOMAD { \param relative Indicated as relative values -- \b IN -- \b optional (default = \c false). */ - void set_INITIAL_MESH_SIZE ( const NOMAD::Point & ims , bool relative = false ); + void set_INITIAL_MESH_SIZE ( const NOMAD::Point & ims , + bool relative = false ); /// Set the \c INITIAL_POLL_SIZE parameter. @@ -1377,7 +1396,8 @@ namespace NOMAD { \param relative Indicated as a relative value -- \b IN -- \b optional (default = \c false). */ - void set_INITIAL_POLL_SIZE ( const NOMAD::Double & ims , bool relative = false ); + void set_INITIAL_POLL_SIZE ( const NOMAD::Double & ims , + bool relative = false ); /// Set the \c INITIAL_POLL_SIZE parameter. /** @@ -1399,6 +1419,63 @@ namespace NOMAD { void set_INITIAL_POLL_SIZE ( const NOMAD::Point & ims , bool relative = false ); + /// Set the \c LIMIT_MESH_INDEX parameter. + /** + \param lmi Limit mesh index -- \b IN. + */ + void set_LIMIT_MESH_INDEX ( const int & lmi ); + + + + // Granular variables: + // ------------------- + private: + + NOMAD::Point _granularity; ///< Granularity. + + public: + + /// Access to the granular variables. + /** + \return The granular variables. + */ + const NOMAD::Point & get_granularity ( void ) const ; + + /// Access to the number of granular variables (granularity !=0). + /** + \return The number of real granular variables. + */ + int get_number_granular_variables ( void ) const; + + + /// Reset the granular variables. + /** + This sets all variables with a granularity of zero. + */ + void reset_granulary ( void ); + + /// Set the granularity for one variable. + /** + \param i Index of the variable -- \b IN. + \param value Granularity of the variable -- \b IN. + */ + void set_GRANULARITY ( int i , const NOMAD::Double & value ); + + /// Set the granularity of a series of variables. + /** + \param fv The granular variables; This point is of dimension \c n; + regular variables have a granularity of zero -- \b IN. + */ + void set_GRANULARITY ( const NOMAD::Point & fv ); + + + /// Set the granularity of all variables. + /** + \param v The granularity of all variables -- \b IN. + */ + void set_GRANULARITY ( const NOMAD::Double & v ); + + // Directions: // ----------- @@ -1445,8 +1522,9 @@ namespace NOMAD { */ bool has_dynamic_direction(void) const; - /// Reset the directions. + /** + */ void reset_directions ( void ); @@ -1475,6 +1553,7 @@ namespace NOMAD { */ void set_SEC_POLL_DIR_TYPE ( const std::set<NOMAD::direction_type> & dt ); + /// Enables use of quad model to determine prospect direction /// for Ortho n+1 direction type /** @@ -1784,8 +1863,7 @@ namespace NOMAD { \param g Group to reset; may be \c _var_groups or \c _user_var_groups -- \b IN/OUT. */ - void reset_variable_groups - ( std::set<NOMAD::Variable_Group*,NOMAD::VG_Comp> & g ) const; + void reset_variable_groups ( std::set<NOMAD::Variable_Group*,NOMAD::VG_Comp> & g ) const; public: @@ -1813,10 +1891,9 @@ namespace NOMAD { \param prim_poll_dir_types Types of the poll directions -- \b IN. \param sec_poll_dir_types Types of the secondary poll directions -- \b IN. */ - void set_VARIABLE_GROUP - ( const std::set<int> & var_indexes , - const std::set<NOMAD::direction_type> & prim_poll_dir_types , - const std::set<NOMAD::direction_type> & sec_poll_dir_types ); + void set_VARIABLE_GROUP ( const std::set<int> & var_indexes , + const std::set<NOMAD::direction_type> & prim_poll_dir_types , + const std::set<NOMAD::direction_type> & sec_poll_dir_types ); /// Set several groups of variables. /** @@ -2151,7 +2228,7 @@ namespace NOMAD { */ std::map<std::string,std::string> _sgte_exe; - bool _disable_eval_sort; ///< Sort disablement + bool _disable_eval_sort; ///< Sort disablement /// Flag equal to \c true if surrogates are used to sort evaluation points. bool _sgte_eval_sort; @@ -2168,7 +2245,7 @@ namespace NOMAD { */ int _sgte_cost; - /// Maximum number of surrogate evaluations. + /// Maximum number of surrogate evaluations. int _sgte_max_eval; /// Surrogate cache file. @@ -2467,7 +2544,7 @@ namespace NOMAD { /// Minimum number of evaluations. /** - Parameter \c OPPORTUNISTIC_MIN_EVAL. + Parameter \c OPPORTUNISTIC_MIN_EVAL. */ int _opportunistic_min_eval; @@ -2488,7 +2565,7 @@ namespace NOMAD { /** Parameter \c BB_MAX_BLOCK_SIZE. */ - int _bb_max_block_size; + int _bb_max_block_size; /// Block of points evaluation /** @@ -2579,7 +2656,6 @@ namespace NOMAD { - }; /*----------------------------------------------------------------------*/ diff --git a/src/Pareto_Front.cpp b/src/Pareto_Front.cpp index 0abcee5..c6dc902 100644 --- a/src/Pareto_Front.cpp +++ b/src/Pareto_Front.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Pareto_Front.cpp - \brief Pareto front (implementation) - \author Sebastien Le Digabel - \date 2010-04-09 - \see Pareto_Front.hpp -*/ + \file Pareto_Front.cpp + \brief Pareto front (implementation) + \author Sebastien Le Digabel + \date 2010-04-09 + \see Pareto_Front.hpp + */ #include "Pareto_Front.hpp" /*------------------------------------------------------*/ @@ -48,43 +55,50 @@ /*------------------------------------------------------*/ bool NOMAD::Pareto_Front::insert ( const NOMAD::Eval_Point & x ) { - - NOMAD::Pareto_Point pp ( &x ); - if ( _pareto_pts.empty() ) { - _pareto_pts.insert (pp); - return true; - } - - bool insert = false; - - std::set<NOMAD::Pareto_Point>::iterator it = _pareto_pts.begin(); - while ( it != _pareto_pts.end() ) { - if ( pp.dominates (*it) ) { - _pareto_pts.erase(it++); - insert = true; - - continue; + NOMAD::Pareto_Point pp ( &x ); + + if ( _pareto_pts.empty() ) + { + _pareto_pts.insert (pp); + return true; } - ++it; - } - - if ( !insert ) { - insert = true; - std::set<NOMAD::Pareto_Point>::iterator end = _pareto_pts.end(); - for ( it = _pareto_pts.begin() ; it != end ; ++it ) { - if ( it->dominates (pp) ) { - insert = false; - break; - } + + bool insert = false; + + std::set<NOMAD::Pareto_Point>::iterator it = _pareto_pts.begin(); + while ( it != _pareto_pts.end() ) + { + if ( pp.dominates (*it) ) + { + _pareto_pts.erase(it++); + insert = true; + + continue; + } + ++it; + } + + if ( !insert ) + { + insert = true; + std::set<NOMAD::Pareto_Point>::iterator end = _pareto_pts.end(); + for ( it = _pareto_pts.begin() ; it != end ; ++it ) + { + if ( it->dominates (pp) ) + { + insert = false; + break; + } + } + } + + if ( insert ) + { + _pareto_pts.insert ( pp ); + return true; } - } - - if ( insert ) { - _pareto_pts.insert ( pp ); - return true; - } - return false; + return false; } /*-------------------------------------------------------*/ @@ -93,298 +107,310 @@ bool NOMAD::Pareto_Front::insert ( const NOMAD::Eval_Point & x ) /*-------------------------------------------------------*/ const NOMAD::Eval_Point * NOMAD::Pareto_Front::get_best_f2 ( void ) const { - if ( _pareto_pts.empty() ) - return NULL; - - std::set<NOMAD::Pareto_Point>::const_iterator it = _pareto_pts.end(); - --it; - - return it->get_element(); + if ( _pareto_pts.empty() ) + return NULL; + + std::set<NOMAD::Pareto_Point>::const_iterator it = _pareto_pts.end(); + --it; + + return it->get_element(); } /*------------------------------------------------------*/ /* get the reference point */ /*------------------------------------------------------*/ NOMAD::Point * NOMAD::Pareto_Front::get_ref ( const NOMAD::Pareto_Point *& xj , - NOMAD::Double & delta_j ) const + NOMAD::Double & delta_j ) const { - xj = NULL; - delta_j.clear(); - - int p = static_cast<int>(_pareto_pts.size()); + xj = NULL; + delta_j.clear(); - // no points in the front: - if ( p == 0 ) - return NULL; - - // just one point in the front: - if ( p == 1 ) { - xj = &(*_pareto_pts.begin()); - delta_j = 1.0 / ( xj->get_w() + 1 ); // delta=1.0 - return NULL; - } - - std::set<NOMAD::Pareto_Point>::const_iterator it = _pareto_pts.begin(); - NOMAD::Point * ref = new NOMAD::Point ( 2 ); - - NOMAD::Double f1xm1; // f_1 ( x_{j-1} ) - NOMAD::Double f1x; // f_1 ( x_j ) - NOMAD::Double f1xp1; // f_1 ( x_{j+1} ) - - NOMAD::Double f2xm1; // f_2 ( x_{j-1} ) - NOMAD::Double f2x; // f_2 ( x_j ) - NOMAD::Double f2xp1; // f_2 ( x_{j+1} ) + int p = static_cast<int>(_pareto_pts.size()); - // two points in the front: - if ( p == 2 ) { - - f1xm1 = it->get_f1(); - f2xm1 = it->get_f2(); - - ++it; - xj = &(*it); + // no points in the front: + if ( p == 0 ) + return NULL; - f1x = xj->get_f1(); - f2x = xj->get_f2(); - - delta_j = ( (f1x-f1xm1).pow2() + (f2x-f2xm1).pow2() ) / ( xj->get_w() + 1.0 ); + // just one point in the front: + if ( p == 1 ) + { + xj = &(*_pareto_pts.begin()); + delta_j = 1.0 / ( xj->get_w() + 1 ); // delta=1.0 + return NULL; + } - const_cast<NOMAD::Pareto_Point *>(xj)->update_w(); + std::set<NOMAD::Pareto_Point>::const_iterator it = _pareto_pts.begin(); + NOMAD::Point * ref = new NOMAD::Point ( 2 ); - (*ref)[0] = f1x; - (*ref)[1] = f2xm1; - - return ref; - } - - // more than two points in the front: - std::set<NOMAD::Pareto_Point>::const_iterator end = _pareto_pts.end(); + NOMAD::Double f1xm1; // f_1 ( x_{j-1} ) + NOMAD::Double f1x; // f_1 ( x_j ) + NOMAD::Double f1xp1; // f_1 ( x_{j+1} ) - const NOMAD::Pareto_Point * prev , * cur , * next; - - NOMAD::Double delta; - - prev = &(*it); - ++it; + NOMAD::Double f2xm1; // f_2 ( x_{j-1} ) + NOMAD::Double f2x; // f_2 ( x_j ) + NOMAD::Double f2xp1; // f_2 ( x_{j+1} ) - while ( true ) { - - cur = &(*it); - - ++it; - if ( it == end ) - break; + // two points in the front: + if ( p == 2 ) + { + + f1xm1 = it->get_f1(); + f2xm1 = it->get_f2(); + + ++it; + xj = &(*it); + + f1x = xj->get_f1(); + f2x = xj->get_f2(); + + delta_j = ( (f1x-f1xm1).pow2() + (f2x-f2xm1).pow2() ) / ( xj->get_w() + 1.0 ); + + const_cast<NOMAD::Pareto_Point *>(xj)->update_w(); + + (*ref)[0] = f1x; + (*ref)[1] = f2xm1; + + return ref; + } - next = &(*it); - - f1xm1 = prev->get_f1(); - f2xm1 = prev->get_f2(); + // more than two points in the front: + std::set<NOMAD::Pareto_Point>::const_iterator end = _pareto_pts.end(); - f1x = cur->get_f1(); - f2x = cur->get_f2(); - - f1xp1 = next->get_f1(); - f2xp1 = next->get_f2(); - - delta = ( (f1x-f1xm1).pow2() + (f2x-f2xm1).pow2() + - (f1x-f1xp1).pow2() + (f2x-f2xp1).pow2() ) / ( cur->get_w() + 1.0 ); - - if ( !delta_j.is_defined() || delta > delta_j ) { - xj = cur; - delta_j = delta; - (*ref)[0] = f1xp1; - (*ref)[1] = f2xm1; + const NOMAD::Pareto_Point * prev , * cur , * next; + + NOMAD::Double delta; + + prev = &(*it); + ++it; + + while ( true ) + { + + cur = &(*it); + + ++it; + if ( it == end ) + break; + + next = &(*it); + + f1xm1 = prev->get_f1(); + f2xm1 = prev->get_f2(); + + f1x = cur->get_f1(); + f2x = cur->get_f2(); + + f1xp1 = next->get_f1(); + f2xp1 = next->get_f2(); + + delta = ( (f1x-f1xm1).pow2() + (f2x-f2xm1).pow2() + + (f1x-f1xp1).pow2() + (f2x-f2xp1).pow2() ) / ( cur->get_w() + 1.0 ); + + if ( !delta_j.is_defined() || delta > delta_j ) + { + xj = cur; + delta_j = delta; + (*ref)[0] = f1xp1; + (*ref)[1] = f2xm1; + } + + prev = cur; } - prev = cur; - } - - const_cast<Pareto_Point *>(xj)->update_w(); - - return ref; + const_cast<Pareto_Point *>(xj)->update_w(); + + return ref; } /*------------------------------------------------------*/ /* compute delta and surf */ /*------------------------------------------------------*/ void NOMAD::Pareto_Front::get_delta_surf ( NOMAD::Double & delta_j , - NOMAD::Double & surf , - const NOMAD::Point & f_bounds ) const + NOMAD::Double & surf , + const NOMAD::Point & f_bounds ) const { - bool def = f_bounds.is_complete(); - NOMAD::Double f1_min , f1_max , f2_min , f2_max; - - if ( def ) { - - if ( f_bounds.size() == 4 ) { - - f1_min = f_bounds[0]; - f1_max = f_bounds[1]; - f2_min = f_bounds[2]; - f2_max = f_bounds[3]; - - if ( f1_min >= f1_max || f2_min >= f2_max ) { - f1_min.clear(); - f1_max.clear(); - f2_min.clear(); - f2_max.clear(); - def = false; - } - } - else - def = false; - } - - delta_j.clear(); - surf.clear(); - - int p = static_cast<int> ( _pareto_pts.size() ); - - // no point in the front: - if ( p == 0 ) { + bool def = f_bounds.is_complete(); + NOMAD::Double f1_min , f1_max , f2_min , f2_max; + if ( def ) - surf = 1.0; - return; - } - - const NOMAD::Pareto_Point * xj; - NOMAD::Double f1x; // f_1 ( x_j ) - NOMAD::Double f2x; // f_2 ( x_j ) - - NOMAD::Double surf_frame = (def) ? + { + + if ( f_bounds.size() == 4 ) + { + + f1_min = f_bounds[0]; + f1_max = f_bounds[1]; + f2_min = f_bounds[2]; + f2_max = f_bounds[3]; + + if ( f1_min >= f1_max || f2_min >= f2_max ) + { + f1_min.clear(); + f1_max.clear(); + f2_min.clear(); + f2_max.clear(); + def = false; + } + } + else + def = false; + } + + delta_j.clear(); + surf.clear(); + + int p = static_cast<int> ( _pareto_pts.size() ); + + // no point in the front: + if ( p == 0 ) + { + if ( def ) + surf = 1.0; + return; + } + + const NOMAD::Pareto_Point * xj; + NOMAD::Double f1x; // f_1 ( x_j ) + NOMAD::Double f2x; // f_2 ( x_j ) + + NOMAD::Double surf_frame = (def) ? ( f2_max - f2_min ) * ( f1_max - f1_min ) : NOMAD::Double(); - - // just one point in the front: - if ( p == 1 ) { - xj = &(*_pareto_pts.begin()); - delta_j = 1.0 / ( xj->get_w() + 1 ); // delta=1.0 - f1x = xj->get_f1(); - f2x = xj->get_f2(); - - if ( !def || f1x > f1_max || f1x < f1_min || f2x > f2_max || f2x < f2_min ) - return; - - surf = ( ( f2_max - f2_min ) * ( f1x - f1_min ) - + ( f2x - f2_min ) * ( f1_max - f1x ) ) / surf_frame; - - return; - } - - std::set<NOMAD::Pareto_Point>::const_iterator it = _pareto_pts.begin(); - - NOMAD::Double f1xm1; // f_1 ( x_{j-1} ) - NOMAD::Double f1xp1; // f_1 ( x_{j+1} ) - - NOMAD::Double f2xm1; // f_2 ( x_{j-1} ) - NOMAD::Double f2xp1; // f_2 ( x_{j+1} ) - // two points in the front: - if ( p == 2 ) { - - f1xm1 = it->get_f1(); - f2xm1 = it->get_f2(); - - if ( def && ( f1xm1 < f1_min || - f1xm1 > f1_max || - f2xm1 < f2_min || - f2xm1 > f2_max ) ) - def = false; - - ++it; - xj = &(*it); + // just one point in the front: + if ( p == 1 ) + { + xj = &(*_pareto_pts.begin()); + delta_j = 1.0 / ( xj->get_w() + 1 ); // delta=1.0 + f1x = xj->get_f1(); + f2x = xj->get_f2(); + + if ( !def || f1x > f1_max || f1x < f1_min || f2x > f2_max || f2x < f2_min ) + return; + + surf = ( ( f2_max - f2_min ) * ( f1x - f1_min ) + + ( f2x - f2_min ) * ( f1_max - f1x ) ) / surf_frame; + + return; + } - f1x = xj->get_f1(); - f2x = xj->get_f2(); - - if ( def && ( f1x < f1_min || - f1x > f1_max || - f2x < f2_min || - f2x > f2_max ) ) - def = false; + std::set<NOMAD::Pareto_Point>::const_iterator it = _pareto_pts.begin(); - delta_j = ( (f1x-f1xm1).pow2() + (f2x-f2xm1).pow2() ) / ( xj->get_w() + 1.0 ); - - if ( def ) - surf = ( ( f2xm1 - f2_min ) * ( f1x - f1xm1 ) - + ( f2_max - f2_min ) * ( f1xm1 - f1_min ) - + ( f2x - f2_min ) * ( f1_max - f1x ) ) / surf_frame; - - return; - } - - // more than two points in the front: - std::set<NOMAD::Pareto_Point>::const_iterator end = _pareto_pts.end(); + NOMAD::Double f1xm1; // f_1 ( x_{j-1} ) + NOMAD::Double f1xp1; // f_1 ( x_{j+1} ) - const NOMAD::Pareto_Point * prev , * cur , * next; - - NOMAD::Double delta; - - prev = &(*it); - f1xm1 = prev->get_f1(); - f2xm1 = prev->get_f2(); - - ++it; - - cur = &(*it); - f1x = cur->get_f1(); - - if ( def && ( f1xm1 < f1_min || - f1xm1 > f1_max || - f2xm1 < f2_min || - f2xm1 > f2_max || - f1x < f1_min || - f1x > f1_max ) ) - def = false; - - if ( def ) - surf = ( f2xm1 - f2_min ) * ( f1x - f1xm1 ) - + ( f2_max - f2_min ) * ( f1xm1 - f1_min ); - - while ( true ) { - - cur = &(*it); - - ++it; - if ( it == end ) - break; + NOMAD::Double f2xm1; // f_2 ( x_{j-1} ) + NOMAD::Double f2xp1; // f_2 ( x_{j+1} ) + + // two points in the front: + if ( p == 2 ) + { + + f1xm1 = it->get_f1(); + f2xm1 = it->get_f2(); + + if ( def && ( f1xm1 < f1_min || + f1xm1 > f1_max || + f2xm1 < f2_min || + f2xm1 > f2_max ) ) + def = false; + + ++it; + xj = &(*it); + + f1x = xj->get_f1(); + f2x = xj->get_f2(); + + if ( def && ( f1x < f1_min || + f1x > f1_max || + f2x < f2_min || + f2x > f2_max ) ) + def = false; + + delta_j = ( (f1x-f1xm1).pow2() + (f2x-f2xm1).pow2() ) / ( xj->get_w() + 1.0 ); + + if ( def ) + surf = ( ( f2xm1 - f2_min ) * ( f1x - f1xm1 ) + + ( f2_max - f2_min ) * ( f1xm1 - f1_min ) + + ( f2x - f2_min ) * ( f1_max - f1x ) ) / surf_frame; + + return; + } - next = &(*it); - + // more than two points in the front: + std::set<NOMAD::Pareto_Point>::const_iterator end = _pareto_pts.end(); + + const NOMAD::Pareto_Point * prev , * cur , * next; + + NOMAD::Double delta; + + prev = &(*it); f1xm1 = prev->get_f1(); f2xm1 = prev->get_f2(); - f1x = cur->get_f1(); - f2x = cur->get_f2(); - - f1xp1 = next->get_f1(); - f2xp1 = next->get_f2(); - - - if ( def && - ( f1xm1 < f1_min || f1xm1 > f1_max || f2xm1 < f2_min || f2xm1 > f2_max || - f1x < f1_min || f1x > f1_max || f2x < f2_min || f2x > f2_max || - f1xp1 < f1_min || f1xp1 > f1_max || f2xp1 < f2_min || f2xp1 > f2_max ) ) - def = false; - - delta = ( (f1x-f1xm1).pow2() + (f2x-f2xm1).pow2() + - (f1x-f1xp1).pow2() + (f2x-f2xp1).pow2() ) / ( cur->get_w() + 1.0 ); - - if ( !delta_j.is_defined() || delta > delta_j ) - delta_j = delta; - + ++it; + + cur = &(*it); + f1x = cur->get_f1(); + + if ( def && ( f1xm1 < f1_min || + f1xm1 > f1_max || + f2xm1 < f2_min || + f2xm1 > f2_max || + f1x < f1_min || + f1x > f1_max ) ) + def = false; + if ( def ) - surf += ( f2x - f2_min ) * ( f1xp1 - f1x ); + surf = ( f2xm1 - f2_min ) * ( f1x - f1xm1 ) + + ( f2_max - f2_min ) * ( f1xm1 - f1_min ); - prev = cur; - } - - if ( def ) { - surf += ( f2xp1 - f2_min ) * ( f1_max - f1xp1 ); - surf = surf / surf_frame; - } - else - surf.clear(); + while ( true ) + { + + cur = &(*it); + + ++it; + if ( it == end ) + break; + + next = &(*it); + + f1xm1 = prev->get_f1(); + f2xm1 = prev->get_f2(); + + f1x = cur->get_f1(); + f2x = cur->get_f2(); + + f1xp1 = next->get_f1(); + f2xp1 = next->get_f2(); + + + if ( def && + ( f1xm1 < f1_min || f1xm1 > f1_max || f2xm1 < f2_min || f2xm1 > f2_max || + f1x < f1_min || f1x > f1_max || f2x < f2_min || f2x > f2_max || + f1xp1 < f1_min || f1xp1 > f1_max || f2xp1 < f2_min || f2xp1 > f2_max ) ) + def = false; + + delta = ( (f1x-f1xm1).pow2() + (f2x-f2xm1).pow2() + + (f1x-f1xp1).pow2() + (f2x-f2xp1).pow2() ) / ( cur->get_w() + 1.0 ); + + if ( !delta_j.is_defined() || delta > delta_j ) + delta_j = delta; + + if ( def ) + surf += ( f2x - f2_min ) * ( f1xp1 - f1x ); + + prev = cur; + } + + if ( def ) + { + surf += ( f2xp1 - f2_min ) * ( f1_max - f1xp1 ); + surf = surf / surf_frame; + } + else + surf.clear(); } /*------------------------------------------------------*/ @@ -392,16 +418,17 @@ void NOMAD::Pareto_Front::get_delta_surf ( NOMAD::Double & delta_j , /*------------------------------------------------------*/ void NOMAD::Pareto_Front::display ( const NOMAD::Display & out ) const { - size_t nb = _pareto_pts.size(); - int cnt = 0; - std::set<NOMAD::Pareto_Point>::const_iterator it , end = _pareto_pts.end(); - for ( it = _pareto_pts.begin() ; it != end ; ++it ) { - out << "#"; - out.display_int_w ( cnt++ , static_cast<int>(nb) ); - out << " "; - it->display ( out ); - out << std::endl; - } + size_t nb = _pareto_pts.size(); + int cnt = 0; + std::set<NOMAD::Pareto_Point>::const_iterator it , end = _pareto_pts.end(); + for ( it = _pareto_pts.begin() ; it != end ; ++it ) + { + out << "#"; + out.display_int_w ( cnt++ , static_cast<int>(nb) ); + out << " "; + it->display ( out ); + out << std::endl; + } } /*------------------------------------------------------------------*/ @@ -410,7 +437,8 @@ void NOMAD::Pareto_Front::display ( const NOMAD::Display & out ) const /* . example: */ /* */ /* const Eval_Point * cur = pareto_front.begin(); */ -/* while (cur) { */ +/* while (cur) + { */ /* ... */ /* cur = pareto_front.next(); */ /* } */ @@ -420,20 +448,20 @@ void NOMAD::Pareto_Front::display ( const NOMAD::Display & out ) const // -------- const NOMAD::Eval_Point * NOMAD::Pareto_Front::begin ( void ) const { - if ( _pareto_pts.empty() ) - return NULL; - _it = _pareto_pts.begin(); - return _it->get_element(); + if ( _pareto_pts.empty() ) + return NULL; + _it = _pareto_pts.begin(); + return _it->get_element(); } // next(): (supposes that begin() has been called) // ------- const NOMAD::Eval_Point * NOMAD::Pareto_Front::next ( void ) const { - if ( _pareto_pts.empty() ) - return NULL; - ++_it; - if ( _it == _pareto_pts.end() ) - return NULL; - return _it->get_element(); + if ( _pareto_pts.empty() ) + return NULL; + ++_it; + if ( _it == _pareto_pts.end() ) + return NULL; + return _it->get_element(); } diff --git a/src/Pareto_Front.hpp b/src/Pareto_Front.hpp index c7d251f..2c33263 100644 --- a/src/Pareto_Front.hpp +++ b/src/Pareto_Front.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,133 +41,134 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Pareto_Front.hpp - \brief Pareto front (headers) - \author Sebastien Le Digabel - \date 2010-04-09 - \see Pareto_Front.cpp -*/ + \file Pareto_Front.hpp + \brief Pareto front (headers) + \author Sebastien Le Digabel + \date 2010-04-09 + \see Pareto_Front.cpp + */ #ifndef __PARETO_FRONT__ #define __PARETO_FRONT__ #include "Pareto_Point.hpp" namespace NOMAD { - - /// Pareto front for two objective functions. - /** + + /// Pareto front for two objective functions. + /** Browse the front with the following instructions: \code const Eval_Point * cur = pareto_front.begin(); while ( cur ) { - ... - cur = pareto_front.next(); + ... + cur = pareto_front.next(); } \endcode - */ - class Pareto_Front : private NOMAD::Uncopyable { - - private: - - /// The set of Pareto points. - std::set<NOMAD::Pareto_Point> _pareto_pts; - - /// Iterator to browse the front with begin() and next(). - mutable std::set<NOMAD::Pareto_Point>::const_iterator _it; - - public: - - /// Constructor. - Pareto_Front ( void ) {} - - /// Destructor. - virtual ~Pareto_Front ( void ) {} - - /// Access to the first Pareto point. - /** - Used to initialize a loop on the Pareto points. - \return A pointer to the first Pareto point and \c NULL if the front - is empty. - */ - const NOMAD::Eval_Point * begin ( void ) const; - - /// Access to the next Pareto point. - /** - Used to increment a loop on the Pareto points. - \return A pointer to the next Pareto point and \c NULL if - the current point is the last point in the front. - */ - const NOMAD::Eval_Point * next ( void ) const; - - /// Access to the number of Pareto points. - /** - \return The number of Pareto points. - */ - int size ( void ) const { return static_cast<int>(_pareto_pts.size()); } - - /// Check if the front is empty. - /** - \return A boolean equal to \c true if the front is empty. - */ - bool empty ( void ) const { return _pareto_pts.empty(); } - - /// Computation and access to the reference point. - /** - \param xj A pointer to the reference point; Is equal to \c NULL if - no reference exists -- \b OUT. - \param delta_j The \c delta stats measuring the front repartition -- \b OUT. - \return A pointer to the reference point and - \c NULL if there is no reference point. - */ - NOMAD::Point * get_ref ( const NOMAD::Pareto_Point *& xj , - NOMAD::Double & delta_j ) const; - - /// Access to the Pareto point minimizing f2(x). - /** - \return A pointer to the Pareto point minimizing f2 and - \c NULL if such a point does not exist. - */ - const NOMAD::Eval_Point * get_best_f2 ( void ) const; - - /// Compute the stats \c delta and \c surf. - /** - - \c delta measures the front repartition (lower is best). - - \c surf measures the front quality (lower is best). - \param delta_j The \c delta stat -- \b OUT. - \param surf The \c surf stat -- \b OUT. - \param f_bounds NOMAD::Point with 4 values (f1_min, f1_max, f2_min, and f2_max) - defining bounds for f1 and f2 for the computation - of the \c surf stat -- \b IN. - */ - void get_delta_surf ( NOMAD::Double & delta_j , - NOMAD::Double & surf , - const NOMAD::Point & f_bounds ) const; + */ + class Pareto_Front : private NOMAD::Uncopyable { + + private: + + /// The set of Pareto points. + std::set<NOMAD::Pareto_Point> _pareto_pts; + + /// Iterator to browse the front with begin() and next(). + mutable std::set<NOMAD::Pareto_Point>::const_iterator _it; + + public: + + /// Constructor. + Pareto_Front ( void ) {} + + /// Destructor. + virtual ~Pareto_Front ( void ) {} + + /// Access to the first Pareto point. + /** + Used to initialize a loop on the Pareto points. + \return A pointer to the first Pareto point and \c NULL if the front + is empty. + */ + const NOMAD::Eval_Point * begin ( void ) const; + + /// Access to the next Pareto point. + /** + Used to increment a loop on the Pareto points. + \return A pointer to the next Pareto point and \c NULL if + the current point is the last point in the front. + */ + const NOMAD::Eval_Point * next ( void ) const; + + /// Access to the number of Pareto points. + /** + \return The number of Pareto points. + */ + int size ( void ) const { return static_cast<int>(_pareto_pts.size()); } + + /// Check if the front is empty. + /** + \return A boolean equal to \c true if the front is empty. + */ + bool empty ( void ) const { return _pareto_pts.empty(); } + + /// Computation and access to the reference point. + /** + \param xj A pointer to the reference point; Is equal to \c NULL if + no reference exists -- \b OUT. + \param delta_j The \c delta stats measuring the front repartition -- \b OUT. + \return A pointer to the reference point and + \c NULL if there is no reference point. + */ + NOMAD::Point * get_ref ( const NOMAD::Pareto_Point *& xj , + NOMAD::Double & delta_j ) const; + + /// Access to the Pareto point minimizing f2(x). + /** + \return A pointer to the Pareto point minimizing f2 and + \c NULL if such a point does not exist. + */ + const NOMAD::Eval_Point * get_best_f2 ( void ) const; + + /// Compute the stats \c delta and \c surf. + /** + - \c delta measures the front repartition (lower is best). + - \c surf measures the front quality (lower is best). + \param delta_j The \c delta stat -- \b OUT. + \param surf The \c surf stat -- \b OUT. + \param f_bounds NOMAD::Point with 4 values (f1_min, f1_max, f2_min, and f2_max) + defining bounds for f1 and f2 for the computation + of the \c surf stat -- \b IN. + */ + void get_delta_surf ( NOMAD::Double & delta_j , + NOMAD::Double & surf , + const NOMAD::Point & f_bounds ) const; + + /// Insertion of a point in the Pareto front. + /** + \param x The point to be inserted -- \b IN. + \return A boolean equal to \c true if the point is a new Pareto point. + */ + bool insert ( const NOMAD::Eval_Point & x ); + + /// Display the Pareto points. + /** + \param out The NOMAD::Display object -- \b IN. + */ + void display ( const NOMAD::Display & out ) const; + }; - /// Insertion of a point in the Pareto front. + /// Display a NOMAD::Pareto_Front object. /** - \param x The point to be inserted -- \b IN. - \return A boolean equal to \c true if the point is a new Pareto point. - */ - bool insert ( const NOMAD::Eval_Point & x ); - - /// Display the Pareto points. - /** - \param out The NOMAD::Display object -- \b IN. - */ - void display ( const NOMAD::Display & out ) const; - }; - - /// Display a NOMAD::Pareto_Front object. - /** \param out The NOMAD::Display object -- \b IN. \param pf The NOMAD::Pareto_Front object to be displayed -- \b IN. \return The NOMAD::Display object. - */ - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::Pareto_Front & pf ) { - pf.display ( out ); - return out; - } + */ + inline const NOMAD::Display & operator << ( const NOMAD::Display & out , + const NOMAD::Pareto_Front & pf ) + { + pf.display ( out ); + return out; + } } #endif diff --git a/src/Pareto_Point.cpp b/src/Pareto_Point.cpp index 75ad0ae..985d367 100644 --- a/src/Pareto_Point.cpp +++ b/src/Pareto_Point.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Pareto_Point.cpp - \brief Pareto point (implementation) - \author Sebastien Le Digabel - \date 2010-04-09 - \see Pareto_Point.hpp -*/ + \file Pareto_Point.cpp + \brief Pareto point (implementation) + \author Sebastien Le Digabel + \date 2010-04-09 + \see Pareto_Point.hpp + */ #include "Pareto_Point.hpp" /*--------------------------------------------------------*/ @@ -51,13 +58,13 @@ bool NOMAD::Pareto_Point::operator < ( const NOMAD::Set_Element<NOMAD::Eval_Point> & fp ) const { - if ( this == &fp || get_element() == fp.get_element() ) - return false; - - int i1 = NOMAD::Multi_Obj_Evaluator::get_i1(); - - return get_element()->get_bb_outputs()[i1].value() < - fp.get_element()->get_bb_outputs()[i1].value(); + if ( this == &fp || get_element() == fp.get_element() ) + return false; + + int i1 = NOMAD::Multi_Obj_Evaluator::get_i1(); + + return get_element()->get_bb_outputs()[i1].value() < + fp.get_element()->get_bb_outputs()[i1].value(); } /*---------------------------------------------------------------*/ @@ -67,25 +74,25 @@ bool NOMAD::Pareto_Point::operator < /*---------------------------------------------------------------*/ bool NOMAD::Pareto_Point::dominates ( const NOMAD::Pareto_Point & pp ) const { - if ( this == &pp || get_element() == pp.get_element() ) + if ( this == &pp || get_element() == pp.get_element() ) + return false; + + int i1 = NOMAD::Multi_Obj_Evaluator::get_i1(); + int i2 = NOMAD::Multi_Obj_Evaluator::get_i2(); + + // we compare F(x)=[f1(x),f2(x)] and F(y)=[f1(y),f2(y)]: + double f1x = get_element()->get_bb_outputs ()[i1].value(); + double f2x = get_element()->get_bb_outputs ()[i2].value(); + double f1y = pp.get_element()->get_bb_outputs()[i1].value(); + double f2y = pp.get_element()->get_bb_outputs()[i2].value(); + + if ( f1x < f1y ) + return f2x <= f2y; + + if ( f1x == f1y ) + return ( f2x < f2y ); + return false; - - int i1 = NOMAD::Multi_Obj_Evaluator::get_i1(); - int i2 = NOMAD::Multi_Obj_Evaluator::get_i2(); - - // we compare F(x)=[f1(x),f2(x)] and F(y)=[f1(y),f2(y)]: - double f1x = get_element()->get_bb_outputs ()[i1].value(); - double f2x = get_element()->get_bb_outputs ()[i2].value(); - double f1y = pp.get_element()->get_bb_outputs()[i1].value(); - double f2y = pp.get_element()->get_bb_outputs()[i2].value(); - - if ( f1x < f1y ) - return f2x <= f2y; - - if ( f1x == f1y ) - return ( f2x < f2y ); - - return false; } /*---------------------------------------------------------------*/ @@ -93,14 +100,14 @@ bool NOMAD::Pareto_Point::dominates ( const NOMAD::Pareto_Point & pp ) const /*---------------------------------------------------------------*/ void NOMAD::Pareto_Point::display ( const NOMAD::Display & out ) const { - const NOMAD::Point & bbo = get_element()->get_bb_outputs(); - int w = 13; - - out << "x=( "; - get_element()->NOMAD::Point::display ( out , " " , w , -1 ); - out << " ) F(x)=[ "; - bbo.Point::display ( out , " " , w , -1 ); - out << " ] [ f1(x) f2(x) ]=[ " - << std::setw(w) << bbo[NOMAD::Multi_Obj_Evaluator::get_i1()] << " " - << std::setw(w) << bbo[NOMAD::Multi_Obj_Evaluator::get_i2()] << " ]"; + const NOMAD::Point & bbo = get_element()->get_bb_outputs(); + int w = 13; + + out << "x=( "; + get_element()->NOMAD::Point::display ( out , " " , w , -1 ); + out << " ) F(x)=[ "; + bbo.Point::display ( out , " " , w , -1 ); + out << " ] [ f1(x) f2(x) ]=[ " + << std::setw(w) << bbo[NOMAD::Multi_Obj_Evaluator::get_i1()] << " " + << std::setw(w) << bbo[NOMAD::Multi_Obj_Evaluator::get_i2()] << " ]"; } diff --git a/src/Pareto_Point.hpp b/src/Pareto_Point.hpp index 1d981f6..9503fbb 100644 --- a/src/Pareto_Point.hpp +++ b/src/Pareto_Point.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,122 +41,122 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Pareto_Point.hpp - \brief Pareto point (headers) - \author Sebastien Le Digabel - \date 2010-04-22 - \see Pareto_Point.cpp -*/ + \file Pareto_Point.hpp + \brief Pareto point (headers) + \author Sebastien Le Digabel + \date 2010-04-22 + \see Pareto_Point.cpp + */ #ifndef __PARETO_POINT__ #define __PARETO_POINT__ #include "Multi_Obj_Evaluator.hpp" namespace NOMAD { - - /// Pareto point for two objective functions. - class Pareto_Point : public NOMAD::Set_Element<NOMAD::Eval_Point> { - - private: - - int _w; ///< Weight. - - /// Affectation operator. - /** - \param p The right-hand side object -- \b IN. - */ - Pareto_Point & operator = ( const Pareto_Point & p ); - - public: - - /// Constructor. - /** - \param ep A pointer to an evaluation point -- \b IN. - */ - Pareto_Point ( const NOMAD::Eval_Point * ep ) - : NOMAD::Set_Element<NOMAD::Eval_Point> ( ep ) , - _w ( 0 ) {} - - /// Copy constructor. - /** - \param pp The copied object -- \b IN. - */ - explicit Pareto_Point ( const Pareto_Point & pp ) - : NOMAD::Set_Element<NOMAD::Eval_Point> ( pp.get_element() ) , - _w ( 0 ) {} - - /// Destructor. - virtual ~Pareto_Point ( void ) {} - - /// Update the weight. - /** - A more evolved formula than \c ++w is used in order - to avoid stagnation with large number of evaluations. - */ - void update_w ( void ) { _w = 2 * _w + 2; } - - /// Access to the weight. - /** - \return The weight. - */ - int get_w ( void ) const { return _w; } - - /// Access to the value of the first objective function. - /** - \return The value of the first objective function. - */ - const NOMAD::Double & get_f1 ( void ) const - { - return get_element()->get_bb_outputs()[NOMAD::Multi_Obj_Evaluator::get_i1()]; - } - - /// Access to the value of the second objective function. - /** - \return The value of the second objective function. - */ - const NOMAD::Double & get_f2 ( void ) const - { - return get_element()->get_bb_outputs()[NOMAD::Multi_Obj_Evaluator::get_i2()]; - } - - /// Comparison operator. - /** - - Supposes that \c y is a Pareto point. - - Used for the insertion in a set (the Pareto front). - - \c f1(*this) and \c f1(y) are compared. - \param y The right-hand side of the comparison -- \b IN. - \return A boolean equal to \c true if \c *this \c < \c y. - */ - virtual bool operator < ( const NOMAD::Set_Element<NOMAD::Eval_Point> & y ) const; - - /// Dominance operator. - /** - Used for the comparison (dominance) of two Pareto points - before they are inserted into the Pareto front. - \param y The right-hand side of the comparison -- \b IN. - \return A boolean equal to \c true if \c *this dominates \c y. - */ - bool dominates ( const Pareto_Point & y ) const; - /// Display the Pareto point. + /// Pareto point for two objective functions. + class Pareto_Point : public NOMAD::Set_Element<NOMAD::Eval_Point> { + + private: + + int _w; ///< Weight. + + /// Affectation operator. + /** + \param p The right-hand side object -- \b IN. + */ + Pareto_Point & operator = ( const Pareto_Point & p ); + + public: + + /// Constructor. + /** + \param ep A pointer to an evaluation point -- \b IN. + */ + Pareto_Point ( const NOMAD::Eval_Point * ep ) + : NOMAD::Set_Element<NOMAD::Eval_Point> ( ep ) , + _w ( 0 ) {} + + /// Copy constructor. + /** + \param pp The copied object -- \b IN. + */ + explicit Pareto_Point ( const Pareto_Point & pp ) + : NOMAD::Set_Element<NOMAD::Eval_Point> ( pp.get_element() ) , + _w ( 0 ) {} + + /// Destructor. + virtual ~Pareto_Point ( void ) {} + + /// Update the weight. + /** + A more evolved formula than \c ++w is used in order + to avoid stagnation with large number of evaluations. + */ + void update_w ( void ) { _w = 2 * _w + 2; } + + /// Access to the weight. + /** + \return The weight. + */ + int get_w ( void ) const { return _w; } + + /// Access to the value of the first objective function. + /** + \return The value of the first objective function. + */ + const NOMAD::Double & get_f1 ( void ) const + { + return get_element()->get_bb_outputs()[NOMAD::Multi_Obj_Evaluator::get_i1()]; + } + + /// Access to the value of the second objective function. + /** + \return The value of the second objective function. + */ + const NOMAD::Double & get_f2 ( void ) const + { + return get_element()->get_bb_outputs()[NOMAD::Multi_Obj_Evaluator::get_i2()]; + } + + /// Comparison operator. + /** + - Supposes that \c y is a Pareto point. + - Used for the insertion in a set (the Pareto front). + - \c f1(*this) and \c f1(y) are compared. + \param y The right-hand side of the comparison -- \b IN. + \return A boolean equal to \c true if \c *this \c < \c y. + */ + virtual bool operator < ( const NOMAD::Set_Element<NOMAD::Eval_Point> & y ) const; + + /// Dominance operator. + /** + Used for the comparison (dominance) of two Pareto points + before they are inserted into the Pareto front. + \param y The right-hand side of the comparison -- \b IN. + \return A boolean equal to \c true if \c *this dominates \c y. + */ + bool dominates ( const Pareto_Point & y ) const; + + /// Display the Pareto point. + /** + \param out The NOMAD::Display object -- \b IN. + */ + void display ( const NOMAD::Display & out ) const; + }; + + /// Display a NOMAD::Pareto_Point object. /** - \param out The NOMAD::Display object -- \b IN. - */ - void display ( const NOMAD::Display & out ) const; - }; - - /// Display a NOMAD::Pareto_Point object. - /** \param out The NOMAD::Display object -- \b IN. \param pp The NOMAD::Pareto_Point object to be displayed -- \b IN. \return The NOMAD::Display object. - */ - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::Pareto_Point & pp ) - { - pp.display ( out ); - return out; - } + */ + inline const NOMAD::Display & operator << ( const NOMAD::Display & out , + const NOMAD::Pareto_Point & pp ) + { + pp.display ( out ); + return out; + } } #endif diff --git a/src/Phase_One_Evaluator.cpp b/src/Phase_One_Evaluator.cpp index 27d57ef..ba014d5 100644 --- a/src/Phase_One_Evaluator.cpp +++ b/src/Phase_One_Evaluator.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -48,30 +55,30 @@ /*------------------------------------------------------------------*/ void NOMAD::Phase_One_Evaluator::compute_f ( NOMAD::Eval_Point & x ) const { - if ( x.get_bb_outputs().size() != _p.get_bb_nb_outputs() ) - { - std::ostringstream err; - err << "Phase_One_Evaluator::compute_f(x): " - << "x has a wrong number of blackbox outputs (" - << x.get_bb_outputs().size() << " != " << _p.get_bb_nb_outputs() << ")"; - throw NOMAD::Exception ( "Phase_One_Evaluator.cpp" , __LINE__ , err.str() ); - } - - // objective value for MADS phase 1: the squared sum of all EB constraint violations - // (each EB constraint has been previously transformed into OBJ values): - const std::list<int> & index_obj = _p.get_index_obj(); - const std::list<int>::const_iterator end = index_obj.end(); - const NOMAD::Point & bbo = x.get_bb_outputs(); - NOMAD::Double h_min = _p.get_h_min(); - NOMAD::Double sum = 0.0; - NOMAD::Double v; - - for ( std::list<int>::const_iterator it = index_obj.begin() ; it != end ; ++it ) - { - v = bbo[*it]; - if ( v > h_min ) - sum += v.pow2(); - } - - x.set_f ( sum ); + if ( x.get_bb_outputs().size() != _p.get_bb_nb_outputs() ) + { + std::ostringstream err; + err << "Phase_One_Evaluator::compute_f(x): " + << "x has a wrong number of blackbox outputs (" + << x.get_bb_outputs().size() << " != " << _p.get_bb_nb_outputs() << ")"; + throw NOMAD::Exception ( "Phase_One_Evaluator.cpp" , __LINE__ , err.str() ); + } + + // objective value for MADS phase 1: the squared sum of all EB constraint violations + // (each EB constraint has been previously transformed into OBJ values): + const std::list<int> & index_obj = _p.get_index_obj(); + const std::list<int>::const_iterator end = index_obj.end(); + const NOMAD::Point & bbo = x.get_bb_outputs(); + NOMAD::Double h_min = _p.get_h_min(); + NOMAD::Double sum = 0.0; + NOMAD::Double v; + + for ( std::list<int>::const_iterator it = index_obj.begin() ; it != end ; ++it ) + { + v = bbo[*it]; + if ( v > h_min ) + sum += v.pow2(); + } + + x.set_f ( sum ); } diff --git a/src/Phase_One_Evaluator.hpp b/src/Phase_One_Evaluator.hpp index a22ca4e..0446b24 100644 --- a/src/Phase_One_Evaluator.hpp +++ b/src/Phase_One_Evaluator.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -74,7 +81,8 @@ namespace NOMAD { \param s Stats -- \b IN. \param x Successful point -- \b IN. */ - virtual void update_success ( const NOMAD::Stats & s , const NOMAD::Eval_Point & x ) + virtual void update_success ( const NOMAD::Stats & s , + const NOMAD::Eval_Point & x ) { _basic_ev.update_success ( s , x ); } @@ -116,8 +124,7 @@ namespace NOMAD { This method is called before the evaluation of a list of points. \param pts List of points to preprocess -- \b IN/OUT. */ - virtual void list_of_points_preprocessing - ( std::set<NOMAD::Priority_Eval_Point> & pts ) const + virtual void list_of_points_preprocessing ( std::set<NOMAD::Priority_Eval_Point> & pts ) const { _basic_ev.list_of_points_preprocessing ( pts ); } @@ -132,6 +139,7 @@ namespace NOMAD { return _basic_ev.is_model_evaluator(); } + /// User updates after an iteration. /** This virtual method is called every time a MADS iteration is terminated. diff --git a/src/Phase_One_Search.cpp b/src/Phase_One_Search.cpp index d058fe2..19b3fd6 100644 --- a/src/Phase_One_Search.cpp +++ b/src/Phase_One_Search.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -85,17 +92,19 @@ void NOMAD::Phase_One_Search::search ( NOMAD::Mads & mads // save and modify parameters: std::string old_display_degree; _p.out().get_display_degree ( old_display_degree ); - const std::list<std::string> old_ds = _p.get_display_stats(); - NOMAD::Double old_VNS_trigger = _p.get_VNS_trigger(); - const std::string old_stats_file_name = _p.get_stats_file_name(); - const std::string old_sol_file = _p.get_solution_file(); - const std::list<std::string> old_stats_file = _p.get_stats_file(); - const NOMAD::Point old_f_target = _p.get_f_target(); - NOMAD::Double old_lct = _p.get_L_curve_target(); - bool old_sif = _p.get_stop_if_feasible(); + const std::list<std::string> old_ds = _p.get_display_stats(); + const std::string old_stats_file_name = _p.get_stats_file_name(); + const std::string old_sol_file = _p.get_solution_file(); + const std::list<std::string> old_stats_file = _p.get_stats_file(); + const NOMAD::Point old_f_target = _p.get_f_target(); + NOMAD::Double old_lct = _p.get_L_curve_target(); + bool old_sif = _p.get_stop_if_feasible(); const std::vector<NOMAD::bb_output_type> old_bbot = _p.get_bb_output_type(); std::vector<NOMAD::bb_output_type> p1_bbot = old_bbot; + NOMAD::multi_formulation_type old_multi_formulation = _p.get_multi_formulation() ; + int old_multi_nb_mads_runs = _p.get_multi_nb_mads_runs(); + if ( display_degree == NOMAD::NORMAL_DISPLAY) // Normal display -> minimal display for Phase one _p.set_DISPLAY_DEGREE( NOMAD::MINIMAL_DISPLAY); @@ -117,16 +126,24 @@ void NOMAD::Phase_One_Search::search ( NOMAD::Mads & mads p1_bbot[i] = NOMAD::UNDEFINED_BBO; } - if ( cnt == 0 ) { + if ( cnt == 0 ) + { stop = true; stop_reason = NOMAD::P1_FAIL; return; } + + if ( cnt > 1 ) + { + // _p.set_LH_SEARCH(100, 0); + _p.set_MULTI_FORMULATION( NOMAD::DIST_LINF ); + _p.set_MULTI_NB_MADS_RUNS( 1 ); + } + _p.set_F_TARGET ( NOMAD::Point ( cnt , 0.0 ) ); _p.set_L_CURVE_TARGET ( NOMAD::Double() ); _p.set_STOP_IF_FEASIBLE ( false ); - _p.set_VNS_SEARCH ( false ); _p.set_BB_OUTPUT_TYPE ( p1_bbot ); _p.set_SOLUTION_FILE ( "" ); _p.reset_stats_file(); @@ -160,7 +177,6 @@ void NOMAD::Phase_One_Search::search ( NOMAD::Mads & mads // run MADS with modified parameters: // ---------------------------------- - // C. Tribes march 2014 ---- these flags are mads static and must be put back to their original value after running mads (see below) // get flags: bool flag_check_bimads , flag_reset_mesh , flag_reset_barriers , flag_p1_active; NOMAD::Mads::get_flags ( flag_check_bimads , @@ -174,7 +190,7 @@ void NOMAD::Phase_One_Search::search ( NOMAD::Mads & mads NOMAD::Mads::set_flag_reset_mesh ( false ); NOMAD::Mads::set_flag_p1_active ( true ); NOMAD::Mads::set_flag_reset_barriers ( true ); - + // run: stop_reason = mads.run(); @@ -190,7 +206,9 @@ void NOMAD::Phase_One_Search::search ( NOMAD::Mads & mads } // continue: - else { + else + { + stop = false; stop_reason = NOMAD::NO_STOP; } @@ -199,15 +217,11 @@ void NOMAD::Phase_One_Search::search ( NOMAD::Mads & mads stop = true; // reset flags to there previous state : - // C. Tribes march 2014 ---- these flags are mads static and must be put back to their original value after running mads NOMAD::Mads::set_flag_check_bimads ( flag_check_bimads ); NOMAD::Mads::set_flag_reset_mesh ( flag_reset_mesh ); NOMAD::Mads::set_flag_p1_active ( flag_p1_active ); NOMAD::Mads::set_flag_reset_barriers ( flag_reset_barriers ); - // NOMAD::Mads::set_flag_check_bimads ( true ); - // NOMAD::Mads::set_flag_reset_mesh ( true ); - // NOMAD::Mads::set_flag_p1_active ( false ); // number of search points: nb_search_pts = stats.get_eval() - old_eval; @@ -220,7 +234,6 @@ void NOMAD::Phase_One_Search::search ( NOMAD::Mads & mads mads.set_pareto_front ( old_pareto_front ); // restore parameters: - _p.set_VNS_SEARCH ( old_VNS_trigger ); _p.set_F_TARGET ( old_f_target ); _p.set_L_CURVE_TARGET ( old_lct ); _p.set_BB_OUTPUT_TYPE ( old_bbot ); @@ -230,11 +243,13 @@ void NOMAD::Phase_One_Search::search ( NOMAD::Mads & mads _p.set_STATS_FILE ( old_stats_file_name , old_stats_file ); _p.set_DISPLAY_STATS (old_ds); + _p.set_MULTI_NB_MADS_RUNS( old_multi_nb_mads_runs ); + _p.set_MULTI_FORMULATION( old_multi_formulation ); + _p.check ( false , // remove_history_file = false true , // remove_solution_file = true false ); // remove_stats_file = true - // counters: stats.add_p1_iterations ( stats.get_iterations() - old_it ); stats.add_p1_bbe ( stats.get_bb_eval () - old_bbe ); @@ -316,7 +331,7 @@ void NOMAD::Phase_One_Search::search ( NOMAD::Mads & mads // stats_file: const std::string & stats_file_name = _p.get_stats_file_name(); - if ( !stats_file_name.empty() && display_degree > NOMAD::NO_DISPLAY) + if ( !stats_file_name.empty() && display_degree > NOMAD::NO_DISPLAY) ev_control.stats_file ( stats_file_name , bf , true , NULL ); // display_stats diff --git a/src/Phase_One_Search.hpp b/src/Phase_One_Search.hpp index 46b57d6..f82c450 100644 --- a/src/Phase_One_Search.hpp +++ b/src/Phase_One_Search.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Phase_One_Search.hpp - \brief NOMAD::Search subclass for the phase one (headers) - \author Sebastien Le Digabel - \date 2010-04-09 - \see Phase_One_Search.cpp -*/ + \file Phase_One_Search.hpp + \brief NOMAD::Search subclass for the phase one (headers) + \author Sebastien Le Digabel + \date 2010-04-09 + \see Phase_One_Search.cpp + */ #ifndef __PHASE_ONE_SEARCH__ #define __PHASE_ONE_SEARCH__ @@ -47,47 +54,47 @@ #include "Mads.hpp" namespace NOMAD { - - /// NOMAD::Search subclass for the phase one. - /** + + /// NOMAD::Search subclass for the phase one. + /** - The phase one occurs when no feasible starting point has been given. - It consists in minimizing the constraint violations and it stops - as soon as a feasible point is found. - */ - class Phase_One_Search : public NOMAD::Search , private NOMAD::Uncopyable { - - public: - - /// Constructor. - /** - \param p Parameters -- \b IN. - */ - Phase_One_Search ( NOMAD::Parameters & p ) - : NOMAD::Search ( p , NOMAD::P1_SEARCH ) {} - - /// Destructor. - virtual ~Phase_One_Search ( void ) {} - - /// The phase one search. - /** - \param mads NOMAD::Mads object invoking this search -- \b IN/OUT. - \param nb_search_pts Number of generated search points -- \b OUT. - \param stop Stop flag -- \b IN/OUT. - \param stop_reason Stop reason -- \b OUT. - \param success Type of success -- \b OUT. - \param count_search Count or not the search -- \b OUT. - \param new_feas_inc New feasible incumbent -- \b IN/OUT. - \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. - */ - virtual void search ( NOMAD::Mads & mads , - int & nb_search_pts , - bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - bool & count_search , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc ); - }; + as soon as a feasible point is found. + */ + class Phase_One_Search : public NOMAD::Search , private NOMAD::Uncopyable { + + public: + + /// Constructor. + /** + \param p Parameters -- \b IN. + */ + Phase_One_Search ( NOMAD::Parameters & p ) + : NOMAD::Search ( p , NOMAD::P1_SEARCH ) {} + + /// Destructor. + virtual ~Phase_One_Search ( void ) {} + + /// The phase one search. + /** + \param mads NOMAD::Mads object invoking this search -- \b IN/OUT. + \param nb_search_pts Number of generated search points -- \b OUT. + \param stop Stop flag -- \b IN/OUT. + \param stop_reason Stop reason -- \b OUT. + \param success Type of success -- \b OUT. + \param count_search Count or not the search -- \b OUT. + \param new_feas_inc New feasible incumbent -- \b IN/OUT. + \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. + */ + virtual void search ( NOMAD::Mads & mads , + int & nb_search_pts , + bool & stop , + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + bool & count_search , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc ); + }; } #endif diff --git a/src/Point.cpp b/src/Point.cpp index fe27123..fd2ac13 100644 --- a/src/Point.cpp +++ b/src/Point.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -58,18 +65,18 @@ int NOMAD::Point::_display_limit = NOMAD::DEFAULT_POINT_DISPLAY_LIMIT; NOMAD::Point::Point ( int n , const NOMAD::Double & d ) : _n (n) , _coords (NULL) { #ifdef MEMORY_DEBUG - ++NOMAD::Point::_cardinality; - if ( NOMAD::Point::_cardinality > NOMAD::Point::_max_cardinality ) - ++NOMAD::Point::_max_cardinality; + ++NOMAD::Point::_cardinality; + if ( NOMAD::Point::_cardinality > NOMAD::Point::_max_cardinality ) + ++NOMAD::Point::_max_cardinality; #endif - if (_n > 0) + if (_n > 0) { - _coords = new NOMAD::Double [_n]; - if ( d.is_defined() ) - std::fill ( _coords , _coords+_n , d ); - } - else - _n = 0; + _coords = new NOMAD::Double [_n]; + if ( d.is_defined() ) + std::fill ( _coords , _coords+_n , d ); + } + else + _n = 0; } /*-----------------------------------------------------------*/ @@ -78,17 +85,17 @@ NOMAD::Point::Point ( int n , const NOMAD::Double & d ) : _n (n) , _coords (NULL NOMAD::Point::Point ( const NOMAD::Point & p ) : _n (p._n) , _coords (NULL) { #ifdef MEMORY_DEBUG - ++NOMAD::Point::_cardinality; - if ( NOMAD::Point::_cardinality >= NOMAD::Point::_max_cardinality ) - ++NOMAD::Point::_max_cardinality; + ++NOMAD::Point::_cardinality; + if ( NOMAD::Point::_cardinality >= NOMAD::Point::_max_cardinality ) + ++NOMAD::Point::_max_cardinality; #endif - if ( _n > 0 ) + if ( _n > 0 ) { - NOMAD::Double * p1 = _coords = new NOMAD::Double [_n]; - const NOMAD::Double * p2 = p._coords; - for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 ) - *p1 = *p2; - } + NOMAD::Double * p1 = _coords = new NOMAD::Double [_n]; + const NOMAD::Double * p2 = p._coords; + for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 ) + *p1 = *p2; + } } /*-----------------------------------------------*/ @@ -97,9 +104,9 @@ NOMAD::Point::Point ( const NOMAD::Point & p ) : _n (p._n) , _coords (NULL) NOMAD::Point::~Point ( void ) { #ifdef MEMORY_DEBUG - --NOMAD::Point::_cardinality; + --NOMAD::Point::_cardinality; #endif - delete [] _coords; + delete [] _coords; } /*-----------------------------------------------*/ @@ -108,23 +115,23 @@ NOMAD::Point::~Point ( void ) /*-----------------------------------------------*/ void NOMAD::Point::reset ( int n , const NOMAD::Double & d ) { - if ( n <= 0 ) + if ( n <= 0 ) { - _n = 0; - delete [] _coords; - _coords = NULL; - } - else + _n = 0; + delete [] _coords; + _coords = NULL; + } + else { - if ( _n != n ) + if ( _n != n ) { - delete [] _coords; - _n = n; - _coords = new NOMAD::Double [_n]; - } - if ( d.is_defined() ) - std::fill ( _coords , _coords+_n , d ); - } + delete [] _coords; + _n = n; + _coords = new NOMAD::Double [_n]; + } + if ( d.is_defined() ) + std::fill ( _coords , _coords+_n , d ); + } } /*----------------------------------------------------------------*/ @@ -132,31 +139,31 @@ void NOMAD::Point::reset ( int n , const NOMAD::Double & d ) /*----------------------------------------------------------------*/ void NOMAD::Point::resize ( int n ) { - if ( n == _n ) - return; + if ( n == _n ) + return; - if ( n <= 0 ) + if ( n <= 0 ) { - _n = 0; - delete [] _coords; - _coords = NULL; - return; - } - NOMAD::Double * new_coords = new NOMAD::Double [n]; - if ( _coords ) + _n = 0; + delete [] _coords; + _coords = NULL; + return; + } + NOMAD::Double * new_coords = new NOMAD::Double [n]; + if ( _coords ) { - int min = ( n < _n ) ? n : _n; - - NOMAD::Double * p1 = new_coords; - const NOMAD::Double * p2 = _coords; - - for ( int i = 0 ; i < min ; ++i , ++p1 , ++p2 ) - *p1 = *p2; - - delete [] _coords; - } - _coords = new_coords; - _n = n; + int min = ( n < _n ) ? n : _n; + + NOMAD::Double * p1 = new_coords; + const NOMAD::Double * p2 = _coords; + + for ( int i = 0 ; i < min ; ++i , ++p1 , ++p2 ) + *p1 = *p2; + + delete [] _coords; + } + _coords = new_coords; + _n = n; } /*-----------------------------------------------------------*/ @@ -166,25 +173,25 @@ void NOMAD::Point::resize ( int n ) // const version: const NOMAD::Double & NOMAD::Point::operator [] ( int i ) const { - if ( !_coords ) - throw NOMAD::Point::Not_Defined ( "Point.cpp" , __LINE__ , - "operator x[i] (const): 'x' not defined" ); - if ( i < 0 || i >= _n ) - throw NOMAD::Point::Bad_Access ( "Point.cpp" , __LINE__ , - "operator x[i] (const): 'i' outside the array's bounds." ); - return _coords[i]; + if ( !_coords ) + throw NOMAD::Point::Not_Defined ( "Point.cpp" , __LINE__ , + "operator x[i] (const): 'x' not defined" ); + if ( i < 0 || i >= _n ) + throw NOMAD::Point::Bad_Access ( "Point.cpp" , __LINE__ , + "operator x[i] (const): 'i' outside the array's bounds." ); + return _coords[i]; } // non-const version: NOMAD::Double & NOMAD::Point::operator [] ( int i ) { - if ( !_coords ) - throw NOMAD::Point::Not_Defined ( "Point.cpp" , __LINE__ , - "operator x[i]: 'x' not defined" ); - if ( i < 0 || i >= _n ) - throw NOMAD::Point::Bad_Access ( "Point.cpp" , __LINE__ , - "operator x[i] (const): 'i' outside the array's bounds." ); - return _coords[i]; + if ( !_coords ) + throw NOMAD::Point::Not_Defined ( "Point.cpp" , __LINE__ , + "operator x[i]: 'x' not defined" ); + if ( i < 0 || i >= _n ) + throw NOMAD::Point::Bad_Access ( "Point.cpp" , __LINE__ , + "operator x[i] (const): 'i' outside the array's bounds." ); + return _coords[i]; } /*-----------------------------------------------------------*/ @@ -192,25 +199,25 @@ NOMAD::Double & NOMAD::Point::operator [] ( int i ) /*-----------------------------------------------------------*/ const NOMAD::Point & NOMAD::Point::operator = ( const NOMAD::Point & p ) { - if ( this == &p ) - return *this; - - if ( _n != p._n ) + if ( this == &p ) + return *this; + + if ( _n != p._n ) { - delete [] _coords; - _n = p._n; - if (_n > 0) - _coords = new NOMAD::Double [_n]; - else - _coords = NULL; - } - - NOMAD::Double * p1 = _coords; - const NOMAD::Double * p2 = p._coords; - for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 ) - *p1 = *p2; - - return *this; + delete [] _coords; + _n = p._n; + if (_n > 0) + _coords = new NOMAD::Double [_n]; + else + _coords = NULL; + } + + NOMAD::Double * p1 = _coords; + const NOMAD::Double * p2 = p._coords; + for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 ) + *p1 = *p2; + + return *this; } /*------------------------------------*/ @@ -218,36 +225,36 @@ const NOMAD::Point & NOMAD::Point::operator = ( const NOMAD::Point & p ) /* (*this = ref + k * delta) */ /*------------------------------------*/ void NOMAD::Point::project_to_mesh ( const NOMAD::Point & ref , - const NOMAD::Point & delta , - const NOMAD::Point & lb , - const NOMAD::Point & ub ) + const NOMAD::Point & delta , + const NOMAD::Point & lb , + const NOMAD::Point & ub ) { - if ( delta._n != _n || - ref._n != _n || - ( lb._n > 0 && lb._n != _n ) || - ( ub._n > 0 && ub._n != _n ) ) - throw NOMAD::Point::Bad_Operation ( "Point.cpp" , __LINE__ , - "Point::project_to_mesh(): invalid Point sizes" ); - - NOMAD::Double * p = _coords , - * pr = ref._coords , - * pd = delta._coords , - * pl = lb._coords , - * pu = ub._coords; - int k; - - if ( lb._n == 0 && ub._n == 0 ) - for ( k = 0 ; k < _n ; ++k , ++pr , ++p , ++pd ) - p->project_to_mesh ( *pr , *pd ); - else if ( lb._n == 0 ) - for ( k = 0 ; k < _n ; ++k , ++pr , ++p , ++pd , ++pu ) - p->project_to_mesh ( *pr , *pd , NOMAD::Double() , *pu ); - else if ( ub._n == 0 ) - for ( k = 0 ; k < _n ; ++k , ++pr , ++p , ++pd , ++pl ) - p->project_to_mesh ( *pr , *pd , *pl ); - else - for ( k = 0 ; k < _n ; ++k , ++pr , ++p , ++pd , ++pl , ++pu ) - p->project_to_mesh ( *pr , *pd , *pl , *pu ); + if ( delta._n != _n || + ref._n != _n || + ( lb._n > 0 && lb._n != _n ) || + ( ub._n > 0 && ub._n != _n ) ) + throw NOMAD::Point::Bad_Operation ( "Point.cpp" , __LINE__ , + "Point::project_to_mesh(): invalid Point sizes" ); + + NOMAD::Double * p = _coords , + * pr = ref._coords , + * pd = delta._coords , + * pl = lb._coords , + * pu = ub._coords; + int k; + + if ( lb._n == 0 && ub._n == 0 ) + for ( k = 0 ; k < _n ; ++k , ++pr , ++p , ++pd ) + p->project_to_mesh ( *pr , *pd ); + else if ( lb._n == 0 ) + for ( k = 0 ; k < _n ; ++k , ++pr , ++p , ++pd , ++pu ) + p->project_to_mesh ( *pr , *pd , NOMAD::Double() , *pu ); + else if ( ub._n == 0 ) + for ( k = 0 ; k < _n ; ++k , ++pr , ++p , ++pd , ++pl ) + p->project_to_mesh ( *pr , *pd , *pl ); + else + for ( k = 0 ; k < _n ; ++k , ++pr , ++p , ++pd , ++pl , ++pu ) + p->project_to_mesh ( *pr , *pd , *pl , *pu ); } @@ -255,41 +262,41 @@ void NOMAD::Point::project_to_mesh ( const NOMAD::Point & ref , /* display */ /*-----------------------------------------------------------*/ void NOMAD::Point::display ( const NOMAD::Display & out , - const std::string & sep , - int w , - int lim ) const + const std::string & sep , + int w , + int lim ) const { - int nm1 = _n-1; - - // for a limited display of maximum lim elements: - if ( lim > 0 && lim < _n ) - { - - int l1 = (lim + 1) / 2 , l2 = lim / 2 , i; - - // first coordinates: - for ( i = 0 ; i < l1 ; ++i ) - out << std::setw ( w ) << _coords[i] << sep; - - // separator: - out << "..." << sep; - - // last coordinates: - for ( i = _n - l2 ; i < nm1 ; ++i ) - out << std::setw ( w ) << _coords[i] << sep; - } - - // normal display (lim <= 0 or lim >= _n): - else - { - const NOMAD::Double * p = _coords; - for ( int i = 0 ; i < nm1 ; ++i , ++p ) - out << std::setw ( w ) << *p << sep; - } - - // last coordinate (different because there is no separator after that): - if ( _n > 0 ) - out << std::setw ( w ) << _coords[nm1]; + int nm1 = _n-1; + + // for a limited display of maximum lim elements: + if ( lim > 0 && lim < _n ) + { + + int l1 = (lim + 1) / 2 , l2 = lim / 2 , i; + + // first coordinates: + for ( i = 0 ; i < l1 ; ++i ) + out << std::setw ( w ) << _coords[i] << sep; + + // separator: + out << "..." << sep; + + // last coordinates: + for ( i = _n - l2 ; i < nm1 ; ++i ) + out << std::setw ( w ) << _coords[i] << sep; + } + + // normal display (lim <= 0 or lim >= _n): + else + { + const NOMAD::Double * p = _coords; + for ( int i = 0 ; i < nm1 ; ++i , ++p ) + out << std::setw ( w ) << *p << sep; + } + + // last coordinate (different because there is no separator after that): + if ( _n > 0 ) + out << std::setw ( w ) << _coords[nm1]; } /*-----------------------------------------------------------*/ @@ -297,12 +304,12 @@ void NOMAD::Point::display ( const NOMAD::Display & out , /*-----------------------------------------------------------*/ std::istream & NOMAD::operator >> ( std::istream & in , NOMAD::Point & p ) { - int n = p.size(); - for ( int k = 0 ; k < n ; ++k ) - in >> p[k]; - if ( in.fail() ) - throw NOMAD::Point::Bad_Input ( "Point.cpp" , __LINE__ , "in >> x: bad input" ); - return in; + int n = p.size(); + for ( int k = 0 ; k < n ; ++k ) + in >> p[k]; + if ( in.fail() ) + throw NOMAD::Point::Bad_Input ( "Point.cpp" , __LINE__ , "in >> x: bad input" ); + return in; } /*-----------------------------------------------------------*/ @@ -311,19 +318,19 @@ std::istream & NOMAD::operator >> ( std::istream & in , NOMAD::Point & p ) /*-----------------------------------------------------------*/ void NOMAD::Point::set ( int n , const NOMAD::Double * a ) { - if ( n <= 0 || !a ) - return; - - if ( _n != n ) + if ( n <= 0 || !a ) + return; + + if ( _n != n ) { - delete [] _coords; - _n = n; - _coords = new NOMAD::Double [_n]; - } - - NOMAD::Double * p = _coords; - for ( int k = 0 ; k < _n ; ++k , ++p , ++a ) - *p = *a; + delete [] _coords; + _n = n; + _coords = new NOMAD::Double [_n]; + } + + NOMAD::Double * p = _coords; + for ( int k = 0 ; k < _n ; ++k , ++p , ++a ) + *p = *a; } /*-----------------------------------------------------------*/ @@ -331,13 +338,13 @@ void NOMAD::Point::set ( int n , const NOMAD::Double * a ) /*-----------------------------------------------------------*/ bool NOMAD::Point::is_complete ( void ) const { - if ( _n <= 0 ) - return false; - const NOMAD::Double * p = _coords; - for ( int i = 0 ; i < _n ; ++i , ++p ) - if ( !p->is_defined() ) - return false; - return true; + if ( _n <= 0 ) + return false; + const NOMAD::Double * p = _coords; + for ( int i = 0 ; i < _n ; ++i , ++p ) + if ( !p->is_defined() ) + return false; + return true; } /*---------------------------------------------------------------*/ @@ -345,13 +352,13 @@ bool NOMAD::Point::is_complete ( void ) const /*---------------------------------------------------------------*/ bool NOMAD::Point::is_defined ( void ) const { - if ( _n <= 0 ) - return false; - const NOMAD::Double * p = _coords; - for ( int i = 0 ; i < _n ; ++i , ++p ) - if ( p->is_defined() ) - return true; - return false; + if ( _n <= 0 ) + return false; + const NOMAD::Double * p = _coords; + for ( int i = 0 ; i < _n ; ++i , ++p ) + if ( p->is_defined() ) + return true; + return false; } /*---------------------------------------------------------------*/ @@ -359,25 +366,25 @@ bool NOMAD::Point::is_defined ( void ) const /*---------------------------------------------------------------*/ int NOMAD::Point::nb_defined ( void ) const { - const NOMAD::Double * p = _coords; - int k = 0; - for ( int i = 0 ; i < _n ; ++i , ++p ) - if ( p->is_defined() ) - ++k; - return k; -} + const NOMAD::Double * p = _coords; + int k = 0; + for ( int i = 0 ; i < _n ; ++i , ++p ) + if ( p->is_defined() ) + ++k; + return k; +} /*-----------------------------------------------------------*/ /* negation */ /*-----------------------------------------------------------*/ const NOMAD::Point NOMAD::Point::operator - ( void ) const { - NOMAD::Point tmp (_n); - NOMAD::Double * p1 = tmp._coords; - const NOMAD::Double * p2 = _coords; - for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 ) - *p1 = - *p2; - return tmp; + NOMAD::Point tmp (_n); + NOMAD::Double * p1 = tmp._coords; + const NOMAD::Double * p2 = _coords; + for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 ) + *p1 = - *p2; + return tmp; } /*----------------------------------------------------------*/ @@ -385,10 +392,10 @@ const NOMAD::Point NOMAD::Point::operator - ( void ) const /*----------------------------------------------------------*/ const NOMAD::Point & NOMAD::Point::operator *= ( const NOMAD::Double & d ) { - NOMAD::Double * p = _coords; - for ( int k = 0 ; k < _n ; ++k , ++p ) - *p *= d; - return *this; + NOMAD::Double * p = _coords; + for ( int k = 0 ; k < _n ; ++k , ++p ) + *p *= d; + return *this; } /*----------------------------------------------------------*/ @@ -396,18 +403,18 @@ const NOMAD::Point & NOMAD::Point::operator *= ( const NOMAD::Double & d ) /*----------------------------------------------------------*/ const NOMAD::Point NOMAD::Point::operator * ( const NOMAD::Point & p ) const { - if ( p._n != _n ) - throw NOMAD::Point::Bad_Operation ( "Point.cpp" , __LINE__ , - "x * y: x.size != y.size" ); - NOMAD::Point tmp ( _n ); - NOMAD::Double * p1 = tmp._coords; - const NOMAD::Double * p2 = _coords; - const NOMAD::Double * p3 = p._coords; - - for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 , ++p3 ) - *p1 = *p2 * *p3; - - return tmp; + if ( p._n != _n ) + throw NOMAD::Point::Bad_Operation ( "Point.cpp" , __LINE__ , + "x * y: x.size != y.size" ); + NOMAD::Point tmp ( _n ); + NOMAD::Double * p1 = tmp._coords; + const NOMAD::Double * p2 = _coords; + const NOMAD::Double * p3 = p._coords; + + for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 , ++p3 ) + *p1 = *p2 * *p3; + + return tmp; } /*----------------------------------------------------------*/ @@ -415,18 +422,18 @@ const NOMAD::Point NOMAD::Point::operator * ( const NOMAD::Point & p ) const /*----------------------------------------------------------*/ const NOMAD::Point NOMAD::Point::operator / ( const NOMAD::Point & p ) const { - if ( p._n != _n ) - throw NOMAD::Point::Bad_Operation ( "Point.cpp" , __LINE__ , - "x / y: x.size != y.size" ); - NOMAD::Point tmp ( _n ); - NOMAD::Double * p1 = tmp._coords; - const NOMAD::Double * p2 = _coords; - const NOMAD::Double * p3 = p._coords; - - for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 , ++p3 ) - *p1 = *p2 / *p3; - - return tmp; + if ( p._n != _n ) + throw NOMAD::Point::Bad_Operation ( "Point.cpp" , __LINE__ , + "x / y: x.size != y.size" ); + NOMAD::Point tmp ( _n ); + NOMAD::Double * p1 = tmp._coords; + const NOMAD::Double * p2 = _coords; + const NOMAD::Double * p3 = p._coords; + + for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 , ++p3 ) + *p1 = *p2 / *p3; + + return tmp; } /*----------------------------------------------------------*/ @@ -434,18 +441,18 @@ const NOMAD::Point NOMAD::Point::operator / ( const NOMAD::Point & p ) const /*----------------------------------------------------------*/ const NOMAD::Point NOMAD::Point::operator + ( const NOMAD::Point & p ) const { - if ( p._n != _n ) - throw NOMAD::Point::Bad_Operation ( "Point.cpp" , __LINE__ , - "x + y: x.size != y.size" ); - NOMAD::Point tmp ( _n ); - NOMAD::Double * p1 = tmp._coords; - const NOMAD::Double * p2 = _coords; - const NOMAD::Double * p3 = p._coords; - - for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 , ++p3 ) - *p1 = *p2 + *p3; - - return tmp; + if ( p._n != _n ) + throw NOMAD::Point::Bad_Operation ( "Point.cpp" , __LINE__ , + "x + y: x.size != y.size" ); + NOMAD::Point tmp ( _n ); + NOMAD::Double * p1 = tmp._coords; + const NOMAD::Double * p2 = _coords; + const NOMAD::Double * p3 = p._coords; + + for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 , ++p3 ) + *p1 = *p2 + *p3; + + return tmp; } /*----------------------------------------------------------*/ @@ -453,18 +460,18 @@ const NOMAD::Point NOMAD::Point::operator + ( const NOMAD::Point & p ) const /*----------------------------------------------------------*/ const NOMAD::Point NOMAD::Point::operator - ( const NOMAD::Point & p ) const { - if ( p._n != _n ) - throw NOMAD::Point::Bad_Operation ( "Point.cpp" , __LINE__ , - "x - y: x.size != y.size" ); - NOMAD::Point tmp ( _n ); - NOMAD::Double * p1 = tmp._coords; - const NOMAD::Double * p2 = _coords; - const NOMAD::Double * p3 = p._coords; - - for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 , ++p3 ) - *p1 = *p2 - *p3; - - return tmp; + if ( p._n != _n ) + throw NOMAD::Point::Bad_Operation ( "Point.cpp" , __LINE__ , + "x - y: x.size != y.size" ); + NOMAD::Point tmp ( _n ); + NOMAD::Double * p1 = tmp._coords; + const NOMAD::Double * p2 = _coords; + const NOMAD::Double * p3 = p._coords; + + for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 , ++p3 ) + *p1 = *p2 - *p3; + + return tmp; } /*--------------------------------------------------------------------------*/ @@ -473,28 +480,28 @@ const NOMAD::Point NOMAD::Point::operator - ( const NOMAD::Point & p ) const /*--------------------------------------------------------------------------*/ bool NOMAD::Point::operator < ( const NOMAD::Point & p ) const { - if ( this == &p ) - return false; - - if ( _n < p._n ) - return true; - if ( _n > p._n ) - return false; - - const NOMAD::Double * p1 = _coords; - const NOMAD::Double * p2 = p._coords; - - for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 ) + if ( this == &p ) + return false; + + if ( _n < p._n ) + return true; + if ( _n > p._n ) + return false; + + const NOMAD::Double * p1 = _coords; + const NOMAD::Double * p2 = p._coords; + + for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 ) { - - if ( *p1 < *p2 ) - return true; - - if ( *p1 > *p2 ) - return false; - } - - return false; + + if ( *p1 < *p2 ) + return true; + + if ( *p1 > *p2 ) + return false; + } + + return false; } /*---------------------------------------------------------------------*/ @@ -502,40 +509,40 @@ bool NOMAD::Point::operator < ( const NOMAD::Point & p ) const /*---------------------------------------------------------------------*/ bool NOMAD::Point::comp_with_undef ( const NOMAD::Point & p ) const { - if ( this == &p ) - return false; - - if ( _n < p._n ) - return true; - if ( _n > p._n ) - return false; - - const NOMAD::Double * p1 = _coords; - const NOMAD::Double * p2 = p._coords; - - bool p1d , p2d; - - for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 ) + if ( this == &p ) + return false; + + if ( _n < p._n ) + return true; + if ( _n > p._n ) + return false; + + const NOMAD::Double * p1 = _coords; + const NOMAD::Double * p2 = p._coords; + + bool p1d , p2d; + + for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 ) { - p1d = p1->is_defined(); - p2d = p2->is_defined(); - - if ( !p1d && !p2d ) - continue; - - if ( !p1d ) - return true; - - if ( !p2d ) - return false; - - if ( *p1 < *p2 ) - return true; - - if ( *p1 > *p2 ) - return false; - } - return false; + p1d = p1->is_defined(); + p2d = p2->is_defined(); + + if ( !p1d && !p2d ) + continue; + + if ( !p1d ) + return true; + + if ( !p2d ) + return false; + + if ( *p1 < *p2 ) + return true; + + if ( *p1 > *p2 ) + return false; + } + return false; } /*-----------------------------------------------------------*/ @@ -543,18 +550,18 @@ bool NOMAD::Point::comp_with_undef ( const NOMAD::Point & p ) const /*-----------------------------------------------------------*/ bool NOMAD::Point::operator == ( const NOMAD::Point & p ) const { - if ( this == &p ) - return true; - if ( p._n != _n ) - return false; - - const NOMAD::Double * p1 = _coords; - const NOMAD::Double * p2 = p._coords; - for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 ) - if ( *p1 != *p2 ) - return false; - - return true; + if ( this == &p ) + return true; + if ( p._n != _n ) + return false; + + const NOMAD::Double * p1 = _coords; + const NOMAD::Double * p2 = p._coords; + for ( int k = 0 ; k < _n ; ++k , ++p1 , ++p2 ) + if ( *p1 != *p2 ) + return false; + + return true; } /*-----------------------------------------------------------*/ @@ -562,23 +569,43 @@ bool NOMAD::Point::operator == ( const NOMAD::Point & p ) const /*-----------------------------------------------------------*/ const NOMAD::Double NOMAD::Point::get_angle ( const NOMAD::Point & x ) const { - if ( _n != x._n ) - return NOMAD::Double(); - - NOMAD::Double inner_product = 0.0 , norm_1 = 0.0 , norm_2 = 0.0; - - const NOMAD::Double * p1 = _coords; - const NOMAD::Double * p2 = x._coords; - - for ( int i = 0 ; i < _n ; ++i , ++p1 , ++p2 ) + if ( _n != x._n ) + return NOMAD::Double(); + + NOMAD::Double inner_product = 0.0 , norm_1 = 0.0 , norm_2 = 0.0; + + const NOMAD::Double * p1 = _coords; + const NOMAD::Double * p2 = x._coords; + + for ( int i = 0 ; i < _n ; ++i , ++p1 , ++p2 ) { - norm_1 += *p1 * *p1; - norm_2 += *p2 * *p2; - inner_product += *p1 * *p2; - } - - if ( norm_1 == 0.0 || norm_2 == 0.0 ) - return NOMAD::Double(); - - return acos ( ( inner_product / ( norm_1.sqrt() * norm_2.sqrt() ) ).value() ); + norm_1 += *p1 * *p1; + norm_2 += *p2 * *p2; + inner_product += *p1 * *p2; + } + + if ( norm_1 == 0.0 || norm_2 == 0.0 ) + return NOMAD::Double(); + + return acos ( ( inner_product / ( norm_1.sqrt() * norm_2.sqrt() ) ).value() ); +} + + +/*-----------------------------------------------------------*/ +/* get coord */ +/*-----------------------------------------------------------*/ +const NOMAD::Double NOMAD::Point::get_coord (int i) const +{ + return _coords[i]; +} + + +/*-----------------------------------------------------------*/ +/* Set the coordinate j to value v */ +/*-----------------------------------------------------------*/ +void NOMAD::Point::set_coord ( int j , const NOMAD::Double v ) +{ + if (( j < 0 ) || (j >= _n)) + return; + _coords[j] = v; } diff --git a/src/Point.hpp b/src/Point.hpp index 344ade6..0a565ae 100644 --- a/src/Point.hpp +++ b/src/Point.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Point.hpp - \brief Custom class for points (headers) - \author Sebastien Le Digabel - \date 2010-04-05 - \see Point.cpp -*/ + \file Point.hpp + \brief Custom class for points (headers) + \author Sebastien Le Digabel + \date 2010-04-05 + \see Point.cpp + */ #ifndef __POINT__ #define __POINT__ @@ -48,403 +55,427 @@ #include "Double.hpp" namespace NOMAD { - - /// \c accumulate operator for \c squared_norm(). - struct squared_norm_op { - /** This function returns \c d1+d2^2 and is designed as an - \c accumulate operator. - \param d1 The NOMAD::Double \c d1 -- \b IN. - \param d2 The NOMAD::Double \c d2 -- \b IN. - \return A third NOMAD::Double equal to \c d1+d2^2. - */ - NOMAD::Double operator () ( const NOMAD::Double & d1 , const NOMAD::Double & d2 ) { - return d1 + d2.pow2(); - } - }; - - /// \c accumulate operator for \c size_of(). - struct size_of_op { - /** This function returns \c i+size_of(d) and is designed as an - \c accumulate operator. - \param i The integer \c i -- \b IN. - \param d The NOMAD::Double \c d -- \b IN. - \return An integer equal to \c i+size_of(d). - */ - int operator () ( int i , const NOMAD::Double & d ) { - return i + d.size_of(); - } - }; - - /// Custom class for points. - /** - Coordinates are NOMAD::Double objects. - */ - class Point { - - private: - -#ifdef MEMORY_DEBUG - static int _cardinality; ///< Number of NOMAD::Point objects in memory. - static int _max_cardinality; ///< Max number of NOMAD::Point objects in memory. -#endif - - /** - Max number of coordinates to display. - Default to 20, debug value at -1 (no limit). - */ - static int _display_limit; - - int _n; ///< Dimension of the point. - NOMAD::Double * _coords; ///< Coordinates of the point. - - public: - - /*-------------------------------------------------------------------*/ - - /// Exception class for a bad access with NOMAD::Point objects. - class Bad_Access : public NOMAD::Exception { - public: - /// Constructor. - Bad_Access ( const std::string & file , - int line , - const std::string & msg ) - : NOMAD::Exception ( file , line , msg ) {} - }; - - /// Exception class for NOMAD::Point objects that are not defined. - class Not_Defined : public NOMAD::Exception { - public: - /// Constructor. - Not_Defined ( const std::string & file , - int line , - const std::string & msg ) - : NOMAD::Exception ( file , line , msg ) {} + + /// \c accumulate operator for \c squared_norm(). + struct squared_norm_op { + /** This function returns \c d1+d2^2 and is designed as an + \c accumulate operator. + \param d1 The NOMAD::Double \c d1 -- \b IN. + \param d2 The NOMAD::Double \c d2 -- \b IN. + \return A third NOMAD::Double equal to \c d1+d2^2. + */ + NOMAD::Double operator () ( const NOMAD::Double & d1 , const NOMAD::Double & d2 ) + { + return d1 + d2.pow2(); + } }; - - /// Exception class for input errors with NOMAD::Point objects. - class Bad_Input : public NOMAD::Exception { - public: - /// Constructor. - Bad_Input ( const std::string & file , - int line , - const std::string & msg ) - : NOMAD::Exception ( file , line , msg ) {} + + /// \c accumulate operator for \c size_of(). + struct size_of_op { + /** This function returns \c i+size_of(d) and is designed as an + \c accumulate operator. + \param i The integer \c i -- \b IN. + \param d The NOMAD::Double \c d -- \b IN. + \return An integer equal to \c i+size_of(d). + */ + int operator () ( int i , const NOMAD::Double & d ) + { + return i + d.size_of(); + } }; - /// Exception class for bad operations with NOMAD::Point objects. - class Bad_Operation : public NOMAD::Exception { + /// Custom class for points. + /** + Coordinates are NOMAD::Double objects. + */ + class Point { + + private: + +#ifdef MEMORY_DEBUG + static int _cardinality; ///< Number of NOMAD::Point objects in memory. + static int _max_cardinality; ///< Max number of NOMAD::Point objects in memory. +#endif + + /** + Max number of coordinates to display. + Default to 20, debug value at -1 (no limit). + */ + static int _display_limit; + + int _n; ///< Dimension of the point. + NOMAD::Double * _coords; ///< Coordinates of the point. + public: - /// Constructor. - Bad_Operation ( const std::string & file , - int line , - const std::string & msg ) - : NOMAD::Exception ( file , line , msg ) {} - }; - - /*-------------------------------------------------------------------*/ - + + /*-------------------------------------------------------------------*/ + + /// Exception class for a bad access with NOMAD::Point objects. + class Bad_Access : public NOMAD::Exception { + public: + /// Constructor. + Bad_Access ( const std::string & file , + int line , + const std::string & msg ) + : NOMAD::Exception ( file , line , msg ) {} + }; + + /// Exception class for NOMAD::Point objects that are not defined. + class Not_Defined : public NOMAD::Exception { + public: + /// Constructor. + Not_Defined ( const std::string & file , + int line , + const std::string & msg ) + : NOMAD::Exception ( file , line , msg ) {} + }; + + /// Exception class for input errors with NOMAD::Point objects. + class Bad_Input : public NOMAD::Exception { + public: + /// Constructor. + Bad_Input ( const std::string & file , + int line , + const std::string & msg ) + : NOMAD::Exception ( file , line , msg ) {} + }; + + /// Exception class for bad operations with NOMAD::Point objects. + class Bad_Operation : public NOMAD::Exception { + public: + /// Constructor. + Bad_Operation ( const std::string & file , + int line , + const std::string & msg ) + : NOMAD::Exception ( file , line , msg ) {} + }; + + /*-------------------------------------------------------------------*/ + #ifdef MEMORY_DEBUG - /// Access to the number of NOMAD::Point objects in memory. - /** - \return The number of NOMAD::Point objects in memory. - */ - static int get_cardinality ( void ) { return Point::_cardinality; } - - /// Access to the max number of NOMAD::Point objects in memory. - /** - \return The max number of NOMAD::Point objects in memory. - */ - static int get_max_cardinality ( void ) { return Point::_max_cardinality; } + /// Access to the number of NOMAD::Point objects in memory. + /** + \return The number of NOMAD::Point objects in memory. + */ + static int get_cardinality ( void ) { return Point::_cardinality; } + + /// Access to the max number of NOMAD::Point objects in memory. + /** + \return The max number of NOMAD::Point objects in memory. + */ + static int get_max_cardinality ( void ) { return Point::_max_cardinality; } #endif + + /// Constructor. + /** + \param n Dimension of the point -- \b IN --\b optional (default = 0). + \param d Initial value for all coordinates + -- \b IN -- \b optional (default = undefined real). + */ + explicit Point ( int n = 0 , const NOMAD::Double & d = NOMAD::Double() ); + + /// Copy constructor. + /** + \param p The copied object -- \b IN. + */ + Point ( const Point & p ); + + /// Affectation operator. + /** + \param p The right-hand side object -- \b IN. + \return \c *this as the result of the affectation. + */ + const Point & operator = ( const Point & p ); + + /// Destructor. + virtual ~Point ( void ); + + /// Change the NOMAD::Point dimension. + /** + Sets also all coordinates to d. + \param n New dimension -- \b IN --\b optional (default = 0). + \param d Initial value for all coordinates + -- \b IN -- \b optional (default = undefined real). + */ + void reset ( int n = 0 , const NOMAD::Double & d = NOMAD::Double() ); + + /// Clear the point. + virtual void clear ( void ) { reset(); } + + /// Change the NOMAD::Point dimension. + /** + The values are kept. + \param n New dimension of the point -- \b IN. + */ + void resize ( int n ); + + /// Set a new display limit. + /** + \param dl An integer for the new display limit -- \b IN. + */ + static void set_display_limit ( int dl ) { Point::_display_limit = dl; } + + /// Access to the display limit. + /** + \return The display limit. + */ + static int get_display_limit ( void ) { return Point::_display_limit; } + + /// Const operator \c []. + /** + \param i The index (0 for the first element) -- \b IN. + \return The \c (i+1)th coordinate. + */ + const NOMAD::Double & operator [] ( int i ) const; + + /// Non-const operator \c []. + /** + \param i The index (0 for the first element) -- \b IN. + \return The \c (i+1)th coordinate. + */ + NOMAD::Double & operator [] ( int i ); + + /// Size of the point in memory. + /** + \return An integer for the size of the point in bytes. + */ + virtual int size_of ( void ) const + { + return std::accumulate ( _coords , + _coords+_n , + static_cast<int>(sizeof(_n)) , + size_of_op() ); + } + + /// Access to the dimension of the point. + /** + \return The dimension of the point. + */ + int size ( void ) const { return _n; } + + /// Test if the point is empty (dimension equal to zero). + /** + \return A boolean equal to \c true if the point is empty. + */ + bool empty ( void ) const { return _n==0; } + + /// Set all the coordinates to a specifi value. + /** + \param d The value for all coordinates -- \b IN. + */ + void set ( const NOMAD::Double & d ) const + { + std::fill ( _coords , _coords+_n , d ); + } + + /// Set the coordinates with an array of reals. + /** + \param n Dimension of the point -- \b IN. + \param a Array of size \c n of reals -- \b IN. + */ + void set ( int n , const NOMAD::Double * a ); + + /// Check if all the coordinates are defined. + /** + \return A boolean equal to \c true if all the coordinates are defined. + */ + bool is_complete ( void ) const; + + /// Check if at least one coordinate is defined. + /** + This virtual method is redefined in class NOMAD::Direction. + \return A boolean equal to \c true if at least one coordinate is defined. + */ + virtual bool is_defined ( void ) const; + + /// Count the number of defined values. + /** + \return The number of values that are defined. + */ + int nb_defined ( void ) const; + + /// Squared norm of the point. + /** + \return A NOMAD::Double with the squared norm of the point. + */ + const NOMAD::Double squared_norm ( void ) const + { + return std::accumulate ( _coords , + _coords+_n , + NOMAD::Double(0.0) , + squared_norm_op() ); + } + + /// Norm of the point. + /** + \return A NOMAD::Double with the norm of the point. + */ + const NOMAD::Double norm ( void ) const { return squared_norm().sqrt(); } + + /// Dot product with another point \c x. + /** + \param x The other point \c x -- \b IN. + \return The dot product \c *this \c . \c x. + */ + const NOMAD::Double dot_product ( const Point & x ) const + { + return std::inner_product ( _coords , _coords+_n , x._coords , NOMAD::Double(0.0) ); + } + + /// Angle with another point \c x. + /** + \param x The other point \c x -- \b IN. + \return The angle between \c *this and \c x. + */ + const NOMAD::Double get_angle ( const Point & x ) const; + + /// Mutiplication with a scalar. + /** + - This implements \c *this \c = \c d \c * \c *this. + - The current object \c *this is modified. + \param d The scalar -- \b IN. + \return The point times \c d. + */ + const Point & operator *= ( const NOMAD::Double & d ); + + /// Multiplication with another point. + /** + - The multiplication is done coordinate by coordinate. + - The current object \c *this is not modified. + \param p The other point -- \b IN. + \return A third point equal to \c *this \c .* \c p. + */ + const Point operator * ( const Point & p ) const; + + /// Division with another point. + /** + - The division is done coordinate by coordinate. + - The current object \c *this is not modified. + \param p The other point -- \b IN. + \return A third point equal to \c *this \c ./ \c p. + */ + const Point operator / ( const Point & p ) const; + + /// Addition with another point. + /** + The current object \c *this is not modified. + \param p The other point -- \b IN. + \return A third point equal to \c *this \c + \c p. + */ + const Point operator + ( const Point & p ) const; + + /// Substraction with another point. + /** + The current object \c *this is not modified. + \param p The other point -- \b IN. + \return A third point equal to \c *this \c - \c p. + */ + const Point operator - ( const Point & p ) const; + + /// Negation. + /** + The current object \c *this is not modified. + \return A new point equal to \c -*this. + */ + const Point operator - ( void ) const; + + /// Comparison operator \c <. + /** + \param p The right-hand side object -- \b IN. + \return A boolean equal to \c true if \c *this \c < \c p. + */ + virtual bool operator < ( const Point & p ) const; + + + /// Comparison operator \c ==. + /** + \param p The right-hand side object -- \b IN. + \return A boolean equal to \c true if \c *this \c == \c p. + */ + bool operator == ( const Point & p ) const; + + /// Comparison operator \c !=. + /** + \param p The right-hand side object -- \b IN. + \return A boolean equal to \c true if \c *this \c != \c p. + */ + bool operator != ( const Point & p ) const { return !(*this == p); } + + /// The same as operator \c < but with consideration of undefined values. + /** + \param p The right-hand side object -- \b IN. + \return A boolean equal to \c true if \c *this \c < \c p. + */ + bool comp_with_undef ( const Point & p ) const; + + /// Projection to the mesh. + /** + Projection to the mesh of size delta + ( \c *this \c = \c ref \c + \c k \c * \c delta ). + \param ref Reference for projection -- \b IN. + \param delta Mesh size parameter -- \b IN. + \param lb Lower bound -- \b IN -- \b optional + (default = undefined NOMAD::Point). + \param ub Upper bound -- \b IN -- \b optional + (default = undefined NOMAD::Point). + */ + void project_to_mesh ( const Point & ref , + const Point & delta , + const Point & lb = Point() , + const Point & ub = Point() ); + + /// Display. + /** + \param out The NOMAD::Display object -- \b IN. + \param sep A string that is used as a separator between the coordinates + -- \b IN --\b optional (default = one space). + \param w An integer indicating a width for the display of + each coordinate -- \b IN -- \b optional + (default = -1, no limit). + \param lim Max number of coordinates to display -- \b IN + -- \b optional (default = -1, no limit). + */ + virtual void display ( const NOMAD::Display & out , + const std::string & sep = " " , + int w = -1 , + int lim = -1 ) const; + + + /// Set the coordinate j with a specific value. + /** + \param j Coordinate to be set -- \b IN. + \param v Value to put in jth coordinate -- \b IN. + */ + void set_coord ( int j , const NOMAD::Double v ); + + /// get i^th coordinate of the point. + /** + \param i The index of the coordinate -- \b IN. + \return The coordinate \c i of the point. + */ + const NOMAD::Double get_coord ( int i ) const; + + + + }; - /// Constructor. - /** - \param n Dimension of the point -- \b IN --\b optional (default = 0). - \param d Initial value for all coordinates - -- \b IN -- \b optional (default = undefined real). - */ - explicit Point ( int n = 0 , const NOMAD::Double & d = NOMAD::Double() ); - - /// Copy constructor. - /** - \param p The copied object -- \b IN. - */ - Point ( const Point & p ); - - /// Affectation operator. - /** - \param p The right-hand side object -- \b IN. - \return \c *this as the result of the affectation. - */ - const Point & operator = ( const Point & p ); - - /// Destructor. - virtual ~Point ( void ); - - /// Change the NOMAD::Point dimension. - /** - Sets also all coordinates to d. - \param n New dimension -- \b IN --\b optional (default = 0). - \param d Initial value for all coordinates - -- \b IN -- \b optional (default = undefined real). - */ - void reset ( int n = 0 , const NOMAD::Double & d = NOMAD::Double() ); - - /// Clear the point. - virtual void clear ( void ) { reset(); } - - /// Change the NOMAD::Point dimension. - /** - The values are kept. - \param n New dimension of the point -- \b IN. - */ - void resize ( int n ); - - /// Set a new display limit. - /** - \param dl An integer for the new display limit -- \b IN. - */ - static void set_display_limit ( int dl ) { Point::_display_limit = dl; } - - /// Access to the display limit. - /** - \return The display limit. - */ - static int get_display_limit ( void ) { return Point::_display_limit; } - - /// Const operator \c []. - /** - \param i The index (0 for the first element) -- \b IN. - \return The \c (i+1)th coordinate. - */ - const NOMAD::Double & operator [] ( int i ) const; - - /// Non-const operator \c []. - /** - \param i The index (0 for the first element) -- \b IN. - \return The \c (i+1)th coordinate. - */ - NOMAD::Double & operator [] ( int i ); - - /// Size of the point in memory. - /** - \return An integer for the size of the point in bytes. - */ - virtual int size_of ( void ) const - { - return std::accumulate ( _coords , - _coords+_n , - static_cast<int>(sizeof(_n)) , - size_of_op() ); - } - - /// Access to the dimension of the point. - /** - \return The dimension of the point. - */ - int size ( void ) const { return _n; } - - /// Test if the point is empty (dimension equal to zero). - /** - \return A boolean equal to \c true if the point is empty. - */ - bool empty ( void ) const { return _n==0; } - - /// Set all the coordinates to a specifi value. - /** - \param d The value for all coordinates -- \b IN. - */ - void set ( const NOMAD::Double & d ) const - { std::fill ( _coords , _coords+_n , d ); } - - /// Set the coordinates with an array of reals. - /** - \param n Dimension of the point -- \b IN. - \param a Array of size \c n of reals -- \b IN. - */ - void set ( int n , const NOMAD::Double * a ); - - /// Check if all the coordinates are defined. - /** - \return A boolean equal to \c true if all the coordinates are defined. - */ - bool is_complete ( void ) const; - - /// Check if at least one coordinate is defined. - /** - This virtual method is redefined in class NOMAD::Direction. - \return A boolean equal to \c true if at least one coordinate is defined. - */ - virtual bool is_defined ( void ) const; + /*---------------------------------------------------------------------------*/ - /// Count the number of defined values. - /** - \return The number of values that are defined. - */ - int nb_defined ( void ) const; - - /// Squared norm of the point. + /// Display a NOMAD::Point object. /** - \return A NOMAD::Double with the squared norm of the point. - */ - const NOMAD::Double squared_norm ( void ) const + \param out The NOMAD::Display object -- \b IN. + \param p The NOMAD::Point object to be displayed -- \b IN. + \return The NOMAD::Display object. + */ + inline const NOMAD::Display & operator << ( const NOMAD::Display & out , + const NOMAD::Point & p ) { - return std::accumulate ( _coords , - _coords+_n , - NOMAD::Double(0.0) , - squared_norm_op() ); + p.display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); + return out; } - - /// Norm of the point. - /** - \return A NOMAD::Double with the norm of the point. - */ - const NOMAD::Double norm ( void ) const { return squared_norm().sqrt(); } - - /// Dot product with another point \c x. - /** - \param x The other point \c x -- \b IN. - \return The dot product \c *this \c . \c x. - */ - const NOMAD::Double dot_product ( const Point & x ) const - { return std::inner_product ( _coords , _coords+_n , x._coords , NOMAD::Double(0.0) ); } - - /// Angle with another point \c x. - /** - \param x The other point \c x -- \b IN. - \return The angle between \c *this and \c x. - */ - const NOMAD::Double get_angle ( const Point & x ) const; - - /// Mutiplication with a scalar. - /** - - This implements \c *this \c = \c d \c * \c *this. - - The current object \c *this is modified. - \param d The scalar -- \b IN. - \return The point times \c d. - */ - const Point & operator *= ( const NOMAD::Double & d ); - - /// Multiplication with another point. - /** - - The multiplication is done coordinate by coordinate. - - The current object \c *this is not modified. - \param p The other point -- \b IN. - \return A third point equal to \c *this \c .* \c p. - */ - const Point operator * ( const Point & p ) const; - - /// Division with another point. - /** - - The division is done coordinate by coordinate. - - The current object \c *this is not modified. - \param p The other point -- \b IN. - \return A third point equal to \c *this \c ./ \c p. - */ - const Point operator / ( const Point & p ) const; - - /// Addition with another point. - /** - The current object \c *this is not modified. - \param p The other point -- \b IN. - \return A third point equal to \c *this \c + \c p. - */ - const Point operator + ( const Point & p ) const; - - /// Substraction with another point. - /** - The current object \c *this is not modified. - \param p The other point -- \b IN. - \return A third point equal to \c *this \c - \c p. - */ - const Point operator - ( const Point & p ) const; - - /// Negation. - /** - The current object \c *this is not modified. - \return A new point equal to \c -*this. - */ - const Point operator - ( void ) const; - - /// Comparison operator \c <. - /** - \param p The right-hand side object -- \b IN. - \return A boolean equal to \c true if \c *this \c < \c p. - */ - virtual bool operator < ( const Point & p ) const; - - - /// Comparison operator \c ==. - /** - \param p The right-hand side object -- \b IN. - \return A boolean equal to \c true if \c *this \c == \c p. - */ - bool operator == ( const Point & p ) const; - - /// Comparison operator \c !=. - /** - \param p The right-hand side object -- \b IN. - \return A boolean equal to \c true if \c *this \c != \c p. - */ - bool operator != ( const Point & p ) const { return !(*this == p); } - /// The same as operator \c < but with consideration of undefined values. - /** - \param p The right-hand side object -- \b IN. - \return A boolean equal to \c true if \c *this \c < \c p. - */ - bool comp_with_undef ( const Point & p ) const; - - /// Projection to the mesh. - /** - Projection to the mesh of size delta - ( \c *this \c = \c ref \c + \c k \c * \c delta ). - \param ref Reference for projection -- \b IN. - \param delta Mesh size parameter -- \b IN. - \param lb Lower bound -- \b IN -- \b optional - (default = undefined NOMAD::Point). - \param ub Upper bound -- \b IN -- \b optional - (default = undefined NOMAD::Point). - */ - void project_to_mesh ( const Point & ref , - const Point & delta , - const Point & lb = Point() , - const Point & ub = Point() ); - - /// Display. + /// Input. /** - \param out The NOMAD::Display object -- \b IN. - \param sep A string that is used as a separator between the coordinates - -- \b IN --\b optional (default = one space). - \param w An integer indicating a width for the display of - each coordinate -- \b IN -- \b optional - (default = -1, no limit). - \param lim Max number of coordinates to display -- \b IN - -- \b optional (default = -1, no limit). - */ - virtual void display ( const NOMAD::Display & out , - const std::string & sep = " " , - int w = -1 , - int lim = -1 ) const; - - }; - - /*---------------------------------------------------------------------------*/ - - /// Display a NOMAD::Point object. - /** - \param out The NOMAD::Display object -- \b IN. - \param p The NOMAD::Point object to be displayed -- \b IN. - \return The NOMAD::Display object. - */ - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::Point & p ) { - p.display ( out , " " , 2 , NOMAD::Point::get_display_limit() ); - return out; - } - - /// Input. - /** - Allows the input of NOMAD::Double objects with operator \c >>. - Can read undefined coordinates (parameter \c UNDEF_STR with default \c "-".) - Example: @@ -457,8 +488,8 @@ namespace NOMAD { \param in A \c std::istream object (can be a file) -- \b IN/OUT. \param p The NOMAD::Point object to be read -- \b OUT. \return The modified \c std::istream object. - */ - std::istream & operator >> ( std::istream & in , Point & p ); + */ + std::istream & operator >> ( std::istream & in , Point & p ); } #endif diff --git a/src/Priority_Eval_Point.cpp b/src/Priority_Eval_Point.cpp index f5059e4..014a0bf 100644 --- a/src/Priority_Eval_Point.cpp +++ b/src/Priority_Eval_Point.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Priority_Eval_Point.cpp - \brief Evaluation point with a priority (implementation) - \author Sebastien Le Digabel - \date 2010-04-22 - \see Priority_Eval_Point.hpp -*/ + \file Priority_Eval_Point.cpp + \brief Evaluation point with a priority (implementation) + \author Sebastien Le Digabel + \date 2010-04-22 + \see Priority_Eval_Point.hpp + */ #include "Priority_Eval_Point.hpp" bool NOMAD::Priority_Eval_Point::_lexicographic_order=false; @@ -51,130 +58,128 @@ bool NOMAD::Priority_Eval_Point::_lexicographic_order=false; /* be evaluated before x2 */ /* . x is a Priority_Eval_Point */ /*------------------------------------------------*/ -bool NOMAD::Priority_Eval_Point::dominates -( const NOMAD::Set_Element<NOMAD::Eval_Point> & x ) const +bool NOMAD::Priority_Eval_Point::dominates ( const NOMAD::Set_Element<NOMAD::Eval_Point> & x ) const { - if ( this == &x ) - return false; - const NOMAD::Eval_Point * x1 = get_element(); - const NOMAD::Eval_Point * x2 = x.get_element(); - - // criterion 0: lexicographic order - if (_lexicographic_order) - return NOMAD::Point(*x1) < NOMAD::Point(*x2); - - - // criterion 1: user criterion: - // ------------ - const NOMAD::Double uep1 = x1->get_user_eval_priority(); - if ( uep1.is_defined() ) - { - const NOMAD::Double uep2 = x2->get_user_eval_priority(); - if ( uep2.is_defined() ) - { - if ( uep1 > uep2 ) - return true; - if ( uep2 > uep1 ) - return false; + if ( this == &x ) + return false; + const NOMAD::Eval_Point * x1 = get_element(); + const NOMAD::Eval_Point * x2 = x.get_element(); + + // criterion 0: lexicographic order + if (_lexicographic_order) + return NOMAD::Point(*x1) < NOMAD::Point(*x2); + + // criterion 1: user criterion: + // ------------ + const NOMAD::Double uep1 = x1->get_user_eval_priority(); + if ( uep1.is_defined() ) + { + const NOMAD::Double uep2 = x2->get_user_eval_priority(); + if ( uep2.is_defined() ) + { + if ( uep1 > uep2 ) + return true; + if ( uep2 > uep1 ) + return false; + } } - } - - // specific Priority_Eval_Point elements of comparison: - NOMAD::Double x_f_sgte; - NOMAD::Double x_h_sgte; - NOMAD::Double x_f_model; - NOMAD::Double x_h_model; - NOMAD::Double x_angle_success_dir; - NOMAD::Double x_angle_simplex_grad; - - x.get_priority_criteria ( x_f_sgte , - x_h_sgte , - x_f_model , - x_h_model , - x_angle_success_dir , - x_angle_simplex_grad ); - - // criterion 2: give priority to already evaluated cache points: - // ------------ - if ( x1->is_in_cache() && !x2->is_in_cache() ) - return true; - if ( x2->is_in_cache() && !x1->is_in_cache() ) - return false; - - // criterion 3: give priority to already evaluated points - // ------------ that are eval_ok: - if ( x1->is_eval_ok() && !x2->is_eval_ok() ) - return true; - if ( x2->is_eval_ok() && !x1->is_eval_ok() ) - return false; - - // criterion 4: true f and h values: - // ----------- - int flag = compare_hf_values ( x1->get_h() , - x1->get_f() , - x2->get_h() , - x2->get_f() ); - if ( flag ) - return ( flag > 0 ); - - // criterion 5: surrogate f and h values: - // ------------ - flag = compare_hf_values ( _h_sgte , _f_sgte , x_h_sgte , x_f_sgte ); - if ( flag ) - return ( flag > 0 ); - - // criterion 6: model f and h values: - // ------------ - flag = compare_hf_values ( _h_model , _f_model , x_h_model , x_f_model ); - if ( flag ) - return ( flag > 0 ); - - - - // criterion 7: check the angle with the last successful direction: - // ------------ - if ( _angle_success_dir.is_defined() && x_angle_success_dir.is_defined() ) - { - if ( _angle_success_dir < x_angle_success_dir ) - return true; - if ( x_angle_success_dir < _angle_success_dir ) - return false; - } - - - // criterion 8: take the point with the best h value: - // ------------ - flag = compare_h_values ( x1->get_h() , x2->get_h() ); - if ( flag ) - return ( flag > 0 ); - - flag = compare_h_values ( _h_sgte , x_h_sgte ); - if ( flag ) - return ( flag > 0 ); - - flag = compare_h_values ( _h_model , x_h_model ); - if ( flag ) - return ( flag > 0 ); - - // criterion 9: random criterion for randomly generated directions: - // ------------- - const NOMAD::Double rep1 = x1->get_rand_eval_priority(); - if ( rep1.is_defined() ) - { - const NOMAD::Double rep2 = x2->get_rand_eval_priority(); - if ( rep2.is_defined() ) - { - if ( rep1 < rep2 ) - return true; - if ( rep2 < rep1 ) - return false; + + // specific Priority_Eval_Point elements of comparison: + NOMAD::Double x_f_sgte; + NOMAD::Double x_h_sgte; + NOMAD::Double x_f_model; + NOMAD::Double x_h_model; + NOMAD::Double x_angle_success_dir; + NOMAD::Double x_angle_simplex_grad; + + x.get_priority_criteria ( x_f_sgte , + x_h_sgte , + x_f_model , + x_h_model , + x_angle_success_dir , + x_angle_simplex_grad ); + + // criterion 2: give priority to already evaluated cache points: + // ------------ + if ( x1->is_in_cache() && !x2->is_in_cache() ) + return true; + if ( x2->is_in_cache() && !x1->is_in_cache() ) + return false; + + // criterion 3: give priority to already evaluated points + // ------------ that are eval_ok: + if ( x1->is_eval_ok() && !x2->is_eval_ok() ) + return true; + if ( x2->is_eval_ok() && !x1->is_eval_ok() ) + return false; + + // criterion 4: true f and h values: + // ----------- + int flag = compare_hf_values ( x1->get_h() , + x1->get_f() , + x2->get_h() , + x2->get_f() ); + if ( flag ) + return ( flag > 0 ); + + // criterion 5: surrogate f and h values: + // ------------ + flag = compare_hf_values ( _h_sgte , _f_sgte , x_h_sgte , x_f_sgte ); + if ( flag ) + return ( flag > 0 ); // return (flag < 0); // CTribes dec 17, 2014 --- flag < 0 used for testing ordonnancement negationiste + + // criterion 6: model f and h values: + // ------------ + flag = compare_hf_values ( _h_model , _f_model , x_h_model , x_f_model ); + if ( flag ) + return ( flag > 0 ); + + + + // criterion 7: check the angle with the last successful direction: + // ------------ + if ( _angle_success_dir.is_defined() && x_angle_success_dir.is_defined() ) + { + if ( _angle_success_dir < x_angle_success_dir ) + return true; + if ( x_angle_success_dir < _angle_success_dir ) + return false; } - } - - // criterion 10: compare the tags: - // ------------- - return x1->get_tag() < x2->get_tag(); - + + + // criterion 8: take the point with the best h value: + // ------------ + flag = compare_h_values ( x1->get_h() , x2->get_h() ); + if ( flag ) + return ( flag > 0 ); + + flag = compare_h_values ( _h_sgte , x_h_sgte ); + if ( flag ) + return ( flag > 0 ); + + flag = compare_h_values ( _h_model , x_h_model ); + if ( flag ) + return ( flag > 0 ); + + // criterion 9: random criterion for randomly generated directions: + // ------------- + const NOMAD::Double rep1 = x1->get_rand_eval_priority(); + if ( rep1.is_defined() ) + { + const NOMAD::Double rep2 = x2->get_rand_eval_priority(); + if ( rep2.is_defined() ) + { + if ( rep1 < rep2 ) + return true; + if ( rep2 < rep1 ) + return false; + } + } + + // criterion 10: compare the tags: + // ------------- + return x1->get_tag() < x2->get_tag(); + } /*-----------------------------------------------*/ @@ -187,16 +192,16 @@ bool NOMAD::Priority_Eval_Point::dominates /* . private method */ /*-----------------------------------------------*/ int NOMAD::Priority_Eval_Point::compare_h_values ( const NOMAD::Double & hx1 , - const NOMAD::Double & hx2 ) const + const NOMAD::Double & hx2 ) const { - if ( hx1.is_defined() && hx2.is_defined() ) - { - if ( hx1 < hx2 ) - return 1; - if ( hx2 < hx1 ) - return -1; - } - return 0; + if ( hx1.is_defined() && hx2.is_defined() ) + { + if ( hx1 < hx2 ) + return 1; + if ( hx2 < hx1 ) + return -1; + } + return 0; } /*-----------------------------------------------*/ @@ -210,60 +215,60 @@ int NOMAD::Priority_Eval_Point::compare_h_values ( const NOMAD::Double & hx1 , /* . private method */ /*-----------------------------------------------*/ int NOMAD::Priority_Eval_Point::compare_hf_values ( const NOMAD::Double & hx1 , - const NOMAD::Double & fx1 , - const NOMAD::Double & hx2 , - const NOMAD::Double & fx2 ) const + const NOMAD::Double & fx1 , + const NOMAD::Double & hx2 , + const NOMAD::Double & fx2 ) const { - if ( fx1.is_defined() && fx2.is_defined() ) - { - - if ( hx1.is_defined() && hx2.is_defined() ) - { - // x1 is feasible: - if ( hx1 <= _h_min ) - { - // both points are feasible: - if ( hx2 <= _h_min ) - { - if ( fx1 < fx2 ) - return 1; - if ( fx2 < fx1 ) - return -1; - } - - // x1 feasible and x2 infeasible: - else - return 1; - } - - // x1 is infeasible: - else - { - // x2 is feasible: - if ( hx2 <= _h_min ) - return -1; - - // both points are infeasible: - if ( ( hx1 < hx2 && fx1 < fx2 ) || - ( hx1 == hx2 && fx1 < fx2 ) || - ( hx1 < hx2 && fx1 == fx2 ) ) - return 1; - - if ( ( hx2 < hx1 && fx2 < fx1 ) || - ( hx2 == hx1 && fx2 < fx1 ) || - ( hx2 < hx1 && fx2 == fx1 ) ) - return -1; - } - } - - // we only have f values: - else - { - if ( fx1 < fx2 ) - return 1; - if ( fx2 < fx1 ) - return -1; - } - } - return 0; + if ( fx1.is_defined() && fx2.is_defined() ) + { + + if ( hx1.is_defined() && hx2.is_defined() ) + { + // x1 is feasible: + if ( hx1 <= _h_min ) + { + // both points are feasible: + if ( hx2 <= _h_min ) + { + if ( fx1 < fx2 ) + return 1; + if ( fx2 < fx1 ) + return -1; + } + + // x1 feasible and x2 infeasible: + else + return 1; + } + + // x1 is infeasible: + else + { + // x2 is feasible: + if ( hx2 <= _h_min ) + return -1; + + // both points are infeasible: + if ( ( hx1 < hx2 && fx1 < fx2 ) || + ( hx1 == hx2 && fx1 < fx2 ) || + ( hx1 < hx2 && fx1 == fx2 ) ) + return 1; + + if ( ( hx2 < hx1 && fx2 < fx1 ) || + ( hx2 == hx1 && fx2 < fx1 ) || + ( hx2 < hx1 && fx2 == fx1 ) ) + return -1; + } + } + + // we only have f values: + else + { + if ( fx1 < fx2 ) + return 1; + if ( fx2 < fx1 ) + return -1; + } + } + return 0; } diff --git a/src/Priority_Eval_Point.hpp b/src/Priority_Eval_Point.hpp index e74885d..0e98618 100644 --- a/src/Priority_Eval_Point.hpp +++ b/src/Priority_Eval_Point.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Priority_Eval_Point.hpp - \brief Evaluation point with a priority (headers) - \author Sebastien Le Digabel - \date 2010-04-22 - \see Priority_Eval_Point.cpp -*/ + \file Priority_Eval_Point.hpp + \brief Evaluation point with a priority (headers) + \author Sebastien Le Digabel + \date 2010-04-22 + \see Priority_Eval_Point.cpp + */ #ifndef __PRIORITY_EVAL_POINT__ #define __PRIORITY_EVAL_POINT__ @@ -47,181 +54,181 @@ #include "Eval_Point.hpp" namespace NOMAD { - - /// Evaluation point with a priority. - class Priority_Eval_Point : public NOMAD::Set_Element<NOMAD::Eval_Point> { - - private: - - NOMAD::Double _h_min; ///< \c h_min value for comparison operator. - NOMAD::Double _f_sgte; ///< Objective surrogate value. - NOMAD::Double _h_sgte; ///< Feasibility surrogate value. - NOMAD::Double _f_model; ///< Objective model value. - NOMAD::Double _h_model; ///< Feasibility model value. - NOMAD::Double _angle_success_dir; ///< Angle with last successful direction. - NOMAD::Double _angle_simplex_grad; ///< Angle with simplex gradient. - static bool _lexicographic_order; ///< Use lexicographic order for comparison - - /// Affectation operator. - /** - \param x The right-hand side object -- \b IN. - */ - Priority_Eval_Point & operator = ( const Priority_Eval_Point & x ); - - /// Compare the \c h values of two points. - /** - The two points to compare are \c x1 and \c x2. - \param hx1 \c h(x1) -- \b IN. - \param hx2 \c h(x2) -- \b IN. - \return \c h(x1) \c < \c h(x2) - with the following format: - - 1: \c x1 best than \c x2. - - -1: \c x2 best than \c x1. - - 0: undetermined. - */ - int compare_h_values ( const NOMAD::Double & hx1 , - const NOMAD::Double & hx2 ) const; - - /// Compare the \c h and \c f values of two points. - /** - The two points to compare are \c x1 and \c x2. - \param hx1 \c h(x1) -- \b IN. - \param fx1 \c f(x1) -- \b IN. - \param hx2 \c h(x2) -- \b IN. - \param fx2 \c f(x2) -- \b IN. - \return \c (h(x1),f(x1)) \c < \c (h(x2),f(x2)) - with the following format: - - 1: \c x1 best than \c x2. - - -1: \c x2 best than \c x1. - - 0: undetermined. - */ - int compare_hf_values ( const NOMAD::Double & hx1 , - const NOMAD::Double & fx1 , - const NOMAD::Double & hx2 , - const NOMAD::Double & fx2 ) const; - public: - - /// Constructor. - /** - \param x A pointer to the evaluation point -- \b IN. - \param h_min \c h_min value -- \b IN. - */ - explicit Priority_Eval_Point ( const NOMAD::Eval_Point * x , - const NOMAD::Double & h_min ) - : NOMAD::Set_Element<NOMAD::Eval_Point> ( x ) , - _h_min ( h_min ) {} - - /// Copy constructor. - /** - \param pep The copied object -- \b IN. - */ - explicit Priority_Eval_Point ( const Priority_Eval_Point & pep ) - : NOMAD::Set_Element<NOMAD::Eval_Point> ( pep.get_element() ) , - _h_min ( pep._h_min ) , - _f_sgte ( pep._f_sgte ) , - _h_sgte ( pep._h_sgte ) , - _f_model ( pep._f_model ) , - _h_model ( pep._h_model ) , - _angle_success_dir ( pep._angle_success_dir ) , - _angle_simplex_grad ( pep._angle_simplex_grad ) {} - - /// Destructor. - virtual ~Priority_Eval_Point ( void ) {} - - /// Access to specific elements of comparison. - /** - - This method is defined virtual in NOMAD::Set_Element so that + + /// Evaluation point with a priority. + class Priority_Eval_Point : public NOMAD::Set_Element<NOMAD::Eval_Point> { + + private: + + NOMAD::Double _h_min; ///< \c h_min value for comparison operator. + NOMAD::Double _f_sgte; ///< Objective surrogate value. + NOMAD::Double _h_sgte; ///< Feasibility surrogate value. + NOMAD::Double _f_model; ///< Objective model value. + NOMAD::Double _h_model; ///< Feasibility model value. + NOMAD::Double _angle_success_dir; ///< Angle with last successful direction. + NOMAD::Double _angle_simplex_grad; ///< Angle with simplex gradient. + static bool _lexicographic_order; ///< Use lexicographic order for comparison + + /// Affectation operator. + /** + \param x The right-hand side object -- \b IN. + */ + Priority_Eval_Point & operator = ( const Priority_Eval_Point & x ); + + /// Compare the \c h values of two points. + /** + The two points to compare are \c x1 and \c x2. + \param hx1 \c h(x1) -- \b IN. + \param hx2 \c h(x2) -- \b IN. + \return \c h(x1) \c < \c h(x2) + with the following format: + - 1: \c x1 best than \c x2. + - -1: \c x2 best than \c x1. + - 0: undetermined. + */ + int compare_h_values ( const NOMAD::Double & hx1 , + const NOMAD::Double & hx2 ) const; + + /// Compare the \c h and \c f values of two points. + /** + The two points to compare are \c x1 and \c x2. + \param hx1 \c h(x1) -- \b IN. + \param fx1 \c f(x1) -- \b IN. + \param hx2 \c h(x2) -- \b IN. + \param fx2 \c f(x2) -- \b IN. + \return \c (h(x1),f(x1)) \c < \c (h(x2),f(x2)) + with the following format: + - 1: \c x1 best than \c x2. + - -1: \c x2 best than \c x1. + - 0: undetermined. + */ + int compare_hf_values ( const NOMAD::Double & hx1 , + const NOMAD::Double & fx1 , + const NOMAD::Double & hx2 , + const NOMAD::Double & fx2 ) const; + public: + + /// Constructor. + /** + \param x A pointer to the evaluation point -- \b IN. + \param h_min \c h_min value -- \b IN. + */ + explicit Priority_Eval_Point ( const NOMAD::Eval_Point * x , + const NOMAD::Double & h_min ) + : NOMAD::Set_Element<NOMAD::Eval_Point> ( x ) , + _h_min ( h_min ) {} + + /// Copy constructor. + /** + \param pep The copied object -- \b IN. + */ + explicit Priority_Eval_Point ( const Priority_Eval_Point & pep ) + : NOMAD::Set_Element<NOMAD::Eval_Point> ( pep.get_element() ) , + _h_min ( pep._h_min ) , + _f_sgte ( pep._f_sgte ) , + _h_sgte ( pep._h_sgte ) , + _f_model ( pep._f_model ) , + _h_model ( pep._h_model ) , + _angle_success_dir ( pep._angle_success_dir ) , + _angle_simplex_grad ( pep._angle_simplex_grad ) {} + + /// Destructor. + virtual ~Priority_Eval_Point ( void ) {} + + /// Access to specific elements of comparison. + /** + - This method is defined virtual in NOMAD::Set_Element so that \c operator \c < \c (Set_Element x) can invoke it on \c x (which is in fact a \c Priority_Eval_Point). - - This avoids an expensive downcast in \c operator \c < . - \param f_sgte Objective surrogate value -- \b OUT. - \param h_sgte Feasibility surrogate value -- \b OUT. - \param f_model Objective model value -- \b OUT. - \param h_model Feasibility model value -- \b OUT. - \param angle_success_dir Angle with last successful direction -- \b OUT. - \param angle_simplex_grad Angle with simplex gradient -- \b OUT. - */ - virtual void get_priority_criteria ( NOMAD::Double & f_sgte , - NOMAD::Double & h_sgte , - NOMAD::Double & f_model , - NOMAD::Double & h_model , - NOMAD::Double & angle_success_dir , - NOMAD::Double & angle_simplex_grad ) const - { - f_sgte = _f_sgte; - h_sgte = _h_sgte; - f_model = _f_model; - h_model = _h_model; - angle_success_dir = _angle_success_dir; - angle_simplex_grad = _angle_simplex_grad; - } - - /// Comparison operator. - /** - This virtual function directly call \c dominates(). - \param x The right-hand side object -- \b IN. - \return A boolean equal to \c true if \c *this \c < \c x. - */ - virtual bool operator < ( const NOMAD::Set_Element<NOMAD::Eval_Point> & x ) const - { return dominates ( x ); } - - /// Comparison operator. - /** - \param x The right-hand side object -- \b IN. - \return A boolean equal to \c true if \c *this \c < \c x. - */ - bool dominates ( const NOMAD::Set_Element<NOMAD::Eval_Point> & x ) const; - - /// Access to the evaluation point. - /** - \return A pointer to the evaluation point. - */ - const NOMAD::Eval_Point * get_point ( void ) const { return get_element(); } - - /// Set the angle with last successful direction. - /** - \param a The angle with last successful direction -- \b IN. - */ - void set_angle_success_dir ( const NOMAD::Double & a ) { _angle_success_dir = a; } - - /// Set the angle with simplex gradient . - /** - \param a The angle with simplex gradient -- \b IN. - */ - void set_angle_simplex_grad ( const NOMAD::Double & a ) { _angle_simplex_grad = a; } - - - /// Set the objective surrogate value. - /** - \param f The objective surrogate value -- \b IN. - */ - void set_f_sgte ( const NOMAD::Double & f ) { _f_sgte = f; } - - /// Set the feasibility surrogate value. - /** - \param h The feasibility surrogate value -- \b IN. - */ - void set_h_sgte ( const NOMAD::Double & h ) { _h_sgte = h; } - - /// Set the objective model value. - /** - \param f The objective model value -- \b IN. - */ - void set_f_model ( const NOMAD::Double & f ) { _f_model = f; } - - /// Set the feasibility model value. - /** - \param h The feasibility model value -- \b IN. - */ - void set_h_model ( const NOMAD::Double & h ) { _h_model = h; } - - /// Set the lexicographic order for sorting. - /** - */ - static void set_lexicographic_order ( bool order ) { _lexicographic_order = order; } - - - }; + - This avoids an expensive downcast in \c operator \c < . + \param f_sgte Objective surrogate value -- \b OUT. + \param h_sgte Feasibility surrogate value -- \b OUT. + \param f_model Objective model value -- \b OUT. + \param h_model Feasibility model value -- \b OUT. + \param angle_success_dir Angle with last successful direction -- \b OUT. + \param angle_simplex_grad Angle with simplex gradient -- \b OUT. + */ + virtual void get_priority_criteria ( NOMAD::Double & f_sgte , + NOMAD::Double & h_sgte , + NOMAD::Double & f_model , + NOMAD::Double & h_model , + NOMAD::Double & angle_success_dir , + NOMAD::Double & angle_simplex_grad ) const + { + f_sgte = _f_sgte; + h_sgte = _h_sgte; + f_model = _f_model; + h_model = _h_model; + angle_success_dir = _angle_success_dir; + angle_simplex_grad = _angle_simplex_grad; + } + + /// Comparison operator. + /** + This virtual function directly call \c dominates(). + \param x The right-hand side object -- \b IN. + \return A boolean equal to \c true if \c *this \c < \c x. + */ + virtual bool operator < ( const NOMAD::Set_Element<NOMAD::Eval_Point> & x ) const + { return dominates ( x ); } + + /// Comparison operator. + /** + \param x The right-hand side object -- \b IN. + \return A boolean equal to \c true if \c *this \c < \c x. + */ + bool dominates ( const NOMAD::Set_Element<NOMAD::Eval_Point> & x ) const; + + /// Access to the evaluation point. + /** + \return A pointer to the evaluation point. + */ + const NOMAD::Eval_Point * get_point ( void ) const { return get_element(); } + + /// Set the angle with last successful direction. + /** + \param a The angle with last successful direction -- \b IN. + */ + void set_angle_success_dir ( const NOMAD::Double & a ) { _angle_success_dir = a; } + + /// Set the angle with simplex gradient . + /** + \param a The angle with simplex gradient -- \b IN. + */ + void set_angle_simplex_grad ( const NOMAD::Double & a ) { _angle_simplex_grad = a; } + + + /// Set the objective surrogate value. + /** + \param f The objective surrogate value -- \b IN. + */ + void set_f_sgte ( const NOMAD::Double & f ) { _f_sgte = f; } + + /// Set the feasibility surrogate value. + /** + \param h The feasibility surrogate value -- \b IN. + */ + void set_h_sgte ( const NOMAD::Double & h ) { _h_sgte = h; } + + /// Set the objective model value. + /** + \param f The objective model value -- \b IN. + */ + void set_f_model ( const NOMAD::Double & f ) { _f_model = f; } + + /// Set the feasibility model value. + /** + \param h The feasibility model value -- \b IN. + */ + void set_h_model ( const NOMAD::Double & h ) { _h_model = h; } + + /// Set the lexicographic order for sorting. + /** + */ + static void set_lexicographic_order ( bool order ) { _lexicographic_order = order; } + + + }; } #endif diff --git a/src/Quad_Model.cpp b/src/Quad_Model.cpp index 0bb28ef..1650b8e 100644 --- a/src/Quad_Model.cpp +++ b/src/Quad_Model.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -45,12 +52,11 @@ /*-----------------------------------------------------------*/ /* constructor */ /*-----------------------------------------------------------*/ -NOMAD::Quad_Model::Quad_Model -( const NOMAD::Display & out , - const std::vector<NOMAD::bb_output_type> & bbot , - const NOMAD::Cache & cache , - const NOMAD::Signature & signature ) -: _out ( out ) , +NOMAD::Quad_Model::Quad_Model ( const NOMAD::Display & out , + const std::vector<NOMAD::bb_output_type> & bbot , + const NOMAD::Cache & cache , + const NOMAD::Signature & signature ) +: _out ( out ) , _bbot ( bbot ) , _interpolation_type ( NOMAD::UNDEFINED_INTERPOLATION_TYPE ) , _n ( signature.get_n() ) , @@ -165,7 +171,8 @@ void NOMAD::Quad_Model::init_alpha ( void ) /* check evaluation point outputs before the integration */ /* into an interpolation set (private) */ /*---------------------------------------------------------*/ -bool NOMAD::Quad_Model::check_outputs ( const NOMAD::Point & bbo , int m ) const { +bool NOMAD::Quad_Model::check_outputs ( const NOMAD::Point & bbo , int m ) const +{ if ( bbo.size() != m ) return false; @@ -259,7 +266,8 @@ void NOMAD::Quad_Model::reduce_Y ( const NOMAD::Point & center , _Y.clear(); std::multiset<NOMAD::Model_Sorted_Point>::const_iterator it , end = Ys.end(); - for ( it = Ys.begin() ; it != end ; ++it ) { + for ( it = Ys.begin() ; it != end ; ++it ) + { if ( get_nY() < max_Y_size ) _Y.push_back ( static_cast<NOMAD::Eval_Point *> ( it->get_point() ) ); else @@ -310,7 +318,8 @@ bool NOMAD::Quad_Model::is_within_trust_radius ( const NOMAD::Point & x ) const /*--------------------------------------------------------------*/ void NOMAD::Quad_Model::define_scaling ( const NOMAD::Double & r ) { - if ( _error_flag || _Y.empty() ) { + if ( _error_flag || _Y.empty() ) + { _error_flag = true; return; } @@ -371,9 +380,11 @@ void NOMAD::Quad_Model::define_scaling ( const NOMAD::Double & r ) #endif // compute the scaling (and detect fixed variables): - for ( k = 0 ; k < nY ; ++k ) { + for ( k = 0 ; k < nY ; ++k ) + { - for ( i = 0 ; i < _n ; ++i ) { + for ( i = 0 ; i < _n ; ++i ) + { tmp = ( (*_Y[k])[i] - _ref[i] ).abs(); if ( !_scaling[i].is_defined() || _scaling[i] < tmp ) _scaling[i] = tmp; @@ -429,9 +440,12 @@ void NOMAD::Quad_Model::define_scaling ( const NOMAD::Double & r ) /* LeDigabel, Tribes, 2014 */ /* . looks also for fixed variables */ /*-------------------------------------------------------------------*/ -void NOMAD::Quad_Model::define_scaling_by_directions ( const std::list<NOMAD::Direction> & dirs, const NOMAD::Point & delta_m, const NOMAD::Double & epsilon ) +void NOMAD::Quad_Model::define_scaling_by_directions ( const std::list<NOMAD::Direction> & dirs, + const NOMAD::Point & delta_m, + const NOMAD::Double & epsilon ) { - if ( _error_flag || _Y.empty() ) { + if ( _error_flag || _Y.empty() ) + { _error_flag = true; return; } @@ -671,7 +685,7 @@ bool NOMAD::Quad_Model::unscale ( NOMAD::Point & x ) const } /*-----------------------------------------------------------*/ -/* unscale the slope at a point */ +/* unscale the slope at a point */ /*-----------------------------------------------------------*/ bool NOMAD::Quad_Model::unscale_grad ( NOMAD::Point & x ) const { @@ -694,7 +708,8 @@ bool NOMAD::Quad_Model::unscale_grad ( NOMAD::Point & x ) const /* compute the element (i,j) of the interpolation matrix M(phi,Y) */ /* (private) */ /*------------------------------------------------------------------*/ -double NOMAD::Quad_Model::compute_M ( int i , int j ) const { +double NOMAD::Quad_Model::compute_M ( int i , int j ) const +{ if ( _error_flag ) return 0.0; @@ -716,7 +731,8 @@ double NOMAD::Quad_Model::compute_M ( int i , int j ) const { r = jm2n; i1 = -1; - while ( r > 0 ) { + while ( r > 0 ) + { r -= dec; ++i1; --dec; @@ -742,22 +758,27 @@ void NOMAD::Quad_Model::construct ( bool use_WP , // MFN interpolation: - if ( p1 < _n_alpha ) { + if ( p1 < _n_alpha ) + { _interpolation_type = NOMAD::MFN; _error_flag = !construct_MFN_model ( eps , max_mpn , max_Y_size ); } - else { + else + { + _error_flag = true; // well-poised regression: - if ( use_WP && p1 > _n_alpha ) { + if ( use_WP && p1 > _n_alpha ) + { _interpolation_type = NOMAD::WP_REGRESSION; _error_flag = !construct_WP_model ( max_Y_size ); } // regression: - if ( _error_flag ) { + if ( _error_flag ) + { _interpolation_type = NOMAD::REGRESSION; _error_flag = !construct_regression_model ( eps , max_mpn , max_Y_size ); } @@ -771,21 +792,23 @@ void NOMAD::Quad_Model::construct ( bool use_WP , /* . used in construct_WP_model() */ /* . private */ /*---------------------------------------------------------------*/ -int NOMAD::Quad_Model::find_max_lix -( const NOMAD::Point & li , - const std::vector<NOMAD::Eval_Point *> & Y , - int i1 , - int i2 , - NOMAD::Double & max_lix ) const +int NOMAD::Quad_Model::find_max_lix ( const NOMAD::Point & li , + const std::vector<NOMAD::Eval_Point *> & Y , + int i1 , + int i2 , + NOMAD::Double & max_lix ) const { max_lix = -1.0; int ji = -1; NOMAD::Double tmp; - for ( int j = i1 ; j <= i2 ; ++j ) { + for ( int j = i1 ; j <= i2 ; ++j ) + { tmp = eval ( *Y[j] , li ); - if ( tmp.is_defined() ) { + if ( tmp.is_defined() ) + { tmp = tmp.abs(); - if ( tmp > max_lix ) { + if ( tmp > max_lix ) + { max_lix = tmp; ji = j; } @@ -814,7 +837,8 @@ bool NOMAD::Quad_Model::construct_WP_model ( int max_Y_size ) int i , j , k , p1 = get_nY(); // the number of points (p+1) must be in [1+(n+1)(n+2)/2;MS_MAX_Y_SIZE]: - if ( p1 <= _n_alpha || p1 > max_Y_size ) { + if ( p1 <= _n_alpha || p1 > max_Y_size ) + { #ifdef DEBUG _out << std::endl << "NOMAD::Quad_Model::construct_WP_model(): " @@ -826,7 +850,8 @@ bool NOMAD::Quad_Model::construct_WP_model ( int max_Y_size ) // Lagrange polynomials: std::vector<NOMAD::Point *> l; - for ( i = 0 ; i < _n_alpha ; ++i ) { + for ( i = 0 ; i < _n_alpha ; ++i ) + { l.push_back ( new NOMAD::Point ( _n_alpha ) ); for ( j = 0 ; j < _n_alpha ; ++j ) (*l[i])[j] = (i==j) ? 1.0 : 0.0; @@ -845,16 +870,19 @@ bool NOMAD::Quad_Model::construct_WP_model ( int max_Y_size ) // use algo 6.2 p.95 of the DFO book in order to construct Lagrange polynomials: // ----------------------------------------------------------------------------- - for ( i = 0 ; i < _n_alpha ; ++i ) { + for ( i = 0 ; i < _n_alpha ; ++i ) + { // 1. point selection (select a point in Y2: Y2[iy2]): // ------------------- - if ( i > 0 ) { + if ( i > 0 ) + { ny2m1 = static_cast<int>(Y2.size())-1; iy2 = find_max_lix ( *l[i] , Y2 , 0 , ny2m1 , max_lix ); - if ( iy2 < 0 ) { + if ( iy2 < 0 ) + { #ifdef DEBUG _out << std::endl << "NOMAD::Quad_Model::construct_WP_model(): " @@ -876,7 +904,8 @@ bool NOMAD::Quad_Model::construct_WP_model ( int max_Y_size ) // ----------------- liyi = eval ( *Y1[i] , *l[i] ); - if ( liyi.abs().value() < 1e-15 ) { + if ( liyi.abs().value() < 1e-15 ) + { #ifdef DEBUG _out << std::endl << "NOMAD::Quad_Model::construct_WP_model(): set Y is not poised" @@ -887,7 +916,8 @@ bool NOMAD::Quad_Model::construct_WP_model ( int max_Y_size ) return false; } - for ( k = 0 ; k < _n_alpha ; ++k ) { + for ( k = 0 ; k < _n_alpha ; ++k ) + { (*l[i])[k] /= liyi; if ( (*l[i])[k].abs().value() < 1e-15 ) (*l[i])[k] = 0.0; @@ -896,9 +926,11 @@ bool NOMAD::Quad_Model::construct_WP_model ( int max_Y_size ) // 3. orthogonalization: // --------------------- for ( j = 0 ; j < _n_alpha ; ++j ) - if ( j != i ) { + if ( j != i ) + { ljyi = eval ( *Y1[i] , *l[j] ); - for ( k = 0 ; k < _n_alpha ; ++k ) { + for ( k = 0 ; k < _n_alpha ; ++k ) + { (*l[j])[k] = (*l[j])[k] - ljyi * (*l[i])[k]; if ( (*l[j])[k].abs().value() < 1e-15 ) (*l[j])[k] = 0.0; @@ -914,8 +946,10 @@ bool NOMAD::Quad_Model::construct_WP_model ( int max_Y_size ) // -------------- int m = static_cast<int> ( _bbot.size() ); for ( i = 0 ; i < m ; ++i ) - if ( _alpha[i] ) { - for ( j = 0 ; j < _n_alpha ; ++j ) { + if ( _alpha[i] ) + { + for ( j = 0 ; j < _n_alpha ; ++j ) + { (*_alpha[i])[j] = 0.0; for ( k = 0 ; k < _n_alpha ; ++k ) (*_alpha[i])[j] += Y1[k]->get_bb_outputs()[i] * (*l[k])[j]; @@ -935,9 +969,11 @@ bool NOMAD::Quad_Model::construct_WP_model ( int max_Y_size ) NOMAD::Double ljyk , lkyk , lix , new_rel_err , cur_rel_err = compute_max_rel_err(); - if ( cur_rel_err.is_defined() && cur_rel_err.value() > 1e-15 ) { + if ( cur_rel_err.is_defined() && cur_rel_err.value() > 1e-15 ) + { - for ( int niter = 0 ; niter < 10 ; ++niter ) { + for ( int niter = 0 ; niter < 10 ; ++niter ) + { ny2m1 = static_cast<int>(Y2.size())-1; @@ -948,10 +984,12 @@ bool NOMAD::Quad_Model::construct_WP_model ( int max_Y_size ) iy2 = -1; ik = -1; - for ( i = 0 ; i < _n_alpha ; ++i ) { + for ( i = 0 ; i < _n_alpha ; ++i ) + { j = find_max_lix ( *l[i] , Y2 , 0 , ny2m1 , lix ); - if ( j >= 0 && lix > max_lix ) { + if ( j >= 0 && lix > max_lix ) + { max_lix = lix; iy2 = j; ik = i; @@ -978,8 +1016,10 @@ bool NOMAD::Quad_Model::construct_WP_model ( int max_Y_size ) for ( i = 0 ; i < _n_alpha ; ++i ) (*l[ik])[i] /= lkyk; - for ( j = 0 ; j < _n_alpha ; ++j ) { - if ( j != ik ) { + for ( j = 0 ; j < _n_alpha ; ++j ) + { + if ( j != ik ) + { ljyk = eval ( *Y1[ik] , *l[j] ); for ( i = 0 ; i < _n_alpha ; ++i ) (*l[j])[i] = (*l[j])[i] - ljyk * (*l[ik])[i]; @@ -988,9 +1028,11 @@ bool NOMAD::Quad_Model::construct_WP_model ( int max_Y_size ) // save old alpha and compute new one: for ( i = 0 ; i < m ; ++i ) - if ( _alpha[i] ) { + if ( _alpha[i] ) + { *(old_alpha[i]) = *(_alpha[i]); - for ( j = 0 ; j < _n_alpha ; ++j ) { + for ( j = 0 ; j < _n_alpha ; ++j ) + { (*_alpha[i])[j] = 0.0; for ( k = 0 ; k < _n_alpha ; ++k ) (*_alpha[i])[j] += Y1[k]->get_bb_outputs()[i] * (*l[k])[j]; @@ -1001,7 +1043,8 @@ bool NOMAD::Quad_Model::construct_WP_model ( int max_Y_size ) new_rel_err = compute_max_rel_err(); // if no better error, restore old alpha and exit loop: - if ( !new_rel_err.is_defined() || new_rel_err >= cur_rel_err ) { + if ( !new_rel_err.is_defined() || new_rel_err >= cur_rel_err ) + { tmp_alpha = _alpha; _alpha = old_alpha; old_alpha = tmp_alpha; @@ -1046,7 +1089,8 @@ bool NOMAD::Quad_Model::construct_regression_model ( double eps , int p1 = get_nY(); // the number of points (p+1) must be in [(n+1)(n+2)/2;MS_MAX_Y_SIZE]: - if ( p1 < _n_alpha || p1 > max_Y_size ) { + if ( p1 < _n_alpha || p1 > max_Y_size ) + { #ifdef DEBUG _out << std::endl << "NOMAD::Quad_Model::construct_regression_model(): " @@ -1059,7 +1103,8 @@ bool NOMAD::Quad_Model::construct_regression_model ( double eps , // for this procedure, the number of points is limited to 500 // (because of the SVD decomposition): - if ( p1 > 500 ) { + if ( p1 > 500 ) + { reduce_Y ( NOMAD::Point ( _n , 0.0 ) , 500 ); p1 = 500; } @@ -1069,15 +1114,18 @@ bool NOMAD::Quad_Model::construct_regression_model ( double eps , int i , j , k; double ** F = new double *[_n_alpha]; double ** M = new double *[p1]; - for ( i = 0 ; i < p1 ; ++i ) { + for ( i = 0 ; i < p1 ; ++i ) + { M[i] = new double[_n_alpha]; for ( j = 0 ; j < _n_alpha ; ++j ) M[i][j] = compute_M ( i , j ); } - for ( i = 0 ; i < _n_alpha ; ++i ) { + for ( i = 0 ; i < _n_alpha ; ++i ) + { F[i] = new double[_n_alpha]; - for ( j = 0 ; j <= i ; ++j ) { + for ( j = 0 ; j <= i ; ++j ) + { F[i][j] = 0.0; for ( k = 0 ; k < p1 ; ++k ) F[i][j] += M[k][i] * M[k][j]; @@ -1088,7 +1136,8 @@ bool NOMAD::Quad_Model::construct_regression_model ( double eps , #ifdef DEBUG _out << std::endl << "F="; - for ( i = 0 ; i < _n_alpha ; ++i ) { + for ( i = 0 ; i < _n_alpha ; ++i ) + { _out << "\t"; for ( j = 0 ; j < _n_alpha ; ++j ) _out << std::setw(12) << F[i][j] << " "; @@ -1108,14 +1157,16 @@ bool NOMAD::Quad_Model::construct_regression_model ( double eps , V[i] = new double[_n_alpha]; std::string error_msg; - if ( NOMAD::SVD_decomposition ( error_msg , F , W , V , _n_alpha , _n_alpha , max_mpn ) ) { + if ( NOMAD::SVD_decomposition ( error_msg , F , W , V , _n_alpha , _n_alpha , max_mpn ) ) + { // compute condition number: compute_cond ( W , _n_alpha , eps ); #ifdef DEBUG _out << std::endl << "F="; - for ( i = 0 ; i < _n_alpha ; ++i ) { + for ( i = 0 ; i < _n_alpha ; ++i ) + { _out << "\t"; for ( j = 0 ; j < _n_alpha ; ++j ) _out << std::setw(12) << F[i][j] << " "; @@ -1128,7 +1179,8 @@ bool NOMAD::Quad_Model::construct_regression_model ( double eps , _out << std::endl << std::endl << "cond=" << _cond << std::endl; _out << std::endl << "V="; - for ( i = 0 ; i < _n_alpha ; ++i ) { + for ( i = 0 ; i < _n_alpha ; ++i ) + { _out << "\t"; for ( j = 0 ; j < _n_alpha ; ++j ) _out << std::setw(12) << V[i][j] << " "; @@ -1137,7 +1189,9 @@ bool NOMAD::Quad_Model::construct_regression_model ( double eps , #endif } - else { + else + { + #ifdef DEBUG _out << std::endl << "NOMAD::Quad_Model::construct_regression_model(): " << "SVD decomposition (" << error_msg << ")" @@ -1149,7 +1203,8 @@ bool NOMAD::Quad_Model::construct_regression_model ( double eps , // resolution of system F.alpha = M'.f(Y): // --------------------------------------- - if ( !error ) { + if ( !error ) + { int m = static_cast<int> ( _bbot.size() ); for ( i = 0 ; i < m ; ++i ) if ( _alpha[i] ) @@ -1157,7 +1212,8 @@ bool NOMAD::Quad_Model::construct_regression_model ( double eps , } // free memory: - for ( i = 0 ; i < _n_alpha ; ++i ) { + for ( i = 0 ; i < _n_alpha ; ++i ) + { delete [] F[i]; delete [] V[i]; } @@ -1182,7 +1238,8 @@ void NOMAD::Quad_Model::compute_cond ( const double * W , int n , double eps ) { double min = NOMAD::INF; double max = -min; - for ( int i = 0 ; i < n ; ++i ) { + for ( int i = 0 ; i < n ; ++i ) + { if ( W[i] < min ) min = W[i]; if ( W[i] > max ) @@ -1203,7 +1260,7 @@ void NOMAD::Quad_Model::solve_regression_system ( double ** M , double ** V , int bbo_index , NOMAD::Point & alpha , - double eps ) const + double eps ) const { // resize the alpha vector: if ( alpha.size() != _n_alpha ) @@ -1213,7 +1270,8 @@ void NOMAD::Quad_Model::solve_regression_system ( double ** M , int i , k , p1 = get_nY(); // solve the system: - for ( i = 0 ; i < _n_alpha ; ++i ) { + for ( i = 0 ; i < _n_alpha ; ++i ) + { alpha_tmp[i] = 0.0; for ( k = 0 ; k < p1 ; ++k ) alpha_tmp[i] += M[k][i] * ( _Y[k]->get_bb_outputs()[bbo_index].value() ); @@ -1224,7 +1282,8 @@ void NOMAD::Quad_Model::solve_regression_system ( double ** M , // some W values will be zero (or near zero); // each value that is smaller than eps is ignored - for ( i = 0 ; i < _n_alpha ; ++i ) { + for ( i = 0 ; i < _n_alpha ; ++i ) + { alpha_tmp2[i] = 0.0; for ( k = 0 ; k < _n_alpha ; ++k ) if ( W[i] > eps ) @@ -1233,7 +1292,8 @@ void NOMAD::Quad_Model::solve_regression_system ( double ** M , delete [] alpha_tmp; - for ( i = 0 ; i < _n_alpha ; ++i ) { + for ( i = 0 ; i < _n_alpha ; ++i ) + { alpha[i] = 0.0; for ( k = 0 ; k < _n_alpha ; ++k ) alpha[i] += V[i][k] * alpha_tmp2[k]; @@ -1261,7 +1321,8 @@ bool NOMAD::Quad_Model::construct_MFN_model ( double eps , int p1 = get_nY(); // the number of points (p+1) must be in [n+1;(n+1)(n+2)/2-1]: - if ( p1 <= _nfree || p1 >= _n_alpha ) { + if ( p1 <= _nfree || p1 >= _n_alpha ) + { #ifdef DEBUG _out << std::endl << "NOMAD::Quad_Model::construct_MFN_model(): " @@ -1273,7 +1334,8 @@ bool NOMAD::Quad_Model::construct_MFN_model ( double eps , // for this procedure, the number of points is limited to 250 // (because of the SVD decomposition): - if ( p1 > 250 ) { + if ( p1 > 250 ) + { reduce_Y ( NOMAD::Point ( _n , 0.0 ) , 250 ); p1 = 250; } @@ -1360,7 +1422,8 @@ bool NOMAD::Quad_Model::construct_MFN_model ( double eps , std::string error_msg; - if ( NOMAD::SVD_decomposition ( error_msg , F , W , V , nF , nF , max_mpn ) ) { + if ( NOMAD::SVD_decomposition ( error_msg , F , W , V , nF , nF , max_mpn ) ) + { // compute condition number: compute_cond ( W , nF , eps ); @@ -1433,12 +1496,12 @@ bool NOMAD::Quad_Model::construct_MFN_model ( double eps , /* resolution of system F.[mu alpha_L]'=[f(Y) 0]' */ /* for MFN interpolation (private) */ /*--------------------------------------------------*/ -void NOMAD::Quad_Model::solve_MFN_system ( double ** F , +void NOMAD::Quad_Model::solve_MFN_system ( double ** F , double * W , double ** V , int bbo_index , NOMAD::Point & alpha , - double eps ) const + double eps ) const { // resize the alpha vector: if ( alpha.size() != _n_alpha ) @@ -1536,7 +1599,8 @@ void NOMAD::Quad_Model::solve_MFN_system ( double ** F , /*-----------------------------------------------------------*/ bool NOMAD::Quad_Model::check_Y ( void ) const { - if ( _Y.empty() ) { + if ( _Y.empty() ) + { #ifdef DEBUG _out << std::endl << "NOMAD::Quad_Model::check_Y(): set Y is empty" << std::endl << std::endl; @@ -1547,9 +1611,11 @@ bool NOMAD::Quad_Model::check_Y ( void ) const int nY = get_nY(); int m = static_cast<int> ( _bbot.size() ); - for ( int k = 0 ; k < nY ; ++k ) { + for ( int k = 0 ; k < nY ; ++k ) + { - if ( _Y[k] == NULL ) { + if ( _Y[k] == NULL ) + { #ifdef DEBUG _out << std::endl << "NOMAD::Quad_Model::check_Y(): NULL pointer in the set Y" @@ -1558,7 +1624,8 @@ bool NOMAD::Quad_Model::check_Y ( void ) const return false; } - if ( _Y[k]->get_eval_status() != NOMAD::EVAL_OK ) { + if ( _Y[k]->get_eval_status() != NOMAD::EVAL_OK ) + { #ifdef DEBUG _out << std::endl << "NOMAD::Quad_Model::check_Y(): a point in Y failed to evaluate" @@ -1569,7 +1636,8 @@ bool NOMAD::Quad_Model::check_Y ( void ) const const NOMAD::Point & bbo = _Y[k]->get_bb_outputs(); - if ( !bbo.is_complete() ) { + if ( !bbo.is_complete() ) + { #ifdef DEBUG _out << std::endl << "NOMAD::Quad_Model::check_Y(): some bb outputs in Y are not defined" @@ -1578,7 +1646,8 @@ bool NOMAD::Quad_Model::check_Y ( void ) const return false; } - if ( bbo.size() != m ) { + if ( bbo.size() != m ) + { #ifdef DEBUG _out << std::endl << "NOMAD::Quad_Model::check_Y(): " @@ -1588,7 +1657,8 @@ bool NOMAD::Quad_Model::check_Y ( void ) const return false; } - if ( _Y[k]->size() != _n ) { + if ( _Y[k]->size() != _n ) + { #ifdef DEBUG _out << std::endl << "NOMAD::Quad_Model::check_Y(): " @@ -1680,17 +1750,22 @@ void NOMAD::Quad_Model::eval_hf ( const NOMAD::Point & x , int m = static_cast<int>(_bbot.size()); NOMAD::Double bboi; - for ( int i = 0 ; i < m ; ++i ) { + for ( int i = 0 ; i < m ; ++i ) + { - if ( _alpha[i] ) { + if ( _alpha[i] ) + { bboi = eval ( x , *_alpha[i] ); - if ( bboi.is_defined() ) { + if ( bboi.is_defined() ) + { - if ( _bbot[i] == NOMAD::EB || _bbot[i] == NOMAD::PEB_E ) { + if ( _bbot[i] == NOMAD::EB || _bbot[i] == NOMAD::PEB_E ) + { - if ( bboi > h_min ) { + if ( bboi > h_min ) + { h.clear(); return; } @@ -1698,9 +1773,12 @@ void NOMAD::Quad_Model::eval_hf ( const NOMAD::Point & x , else if ( ( _bbot[i] == NOMAD::FILTER || _bbot[i] == NOMAD::PB || - _bbot[i] == NOMAD::PEB_P ) ) { - if ( bboi > h_min ) { - switch ( h_norm ) { + _bbot[i] == NOMAD::PEB_P ) ) + { + if ( bboi > h_min ) + { + switch ( h_norm ) + { case NOMAD::L1: h += bboi; break; @@ -1737,15 +1815,22 @@ NOMAD::Double NOMAD::Quad_Model::compute_max_rel_err ( void ) const NOMAD::Double truth_value , model_value , rel_err , max_rel_err; int k , nY = get_nY() , m = static_cast<int> ( _bbot.size() ); - for ( int bbo_index = 0 ; bbo_index < m ; ++bbo_index ) { - if ( _alpha[bbo_index] ) { - for ( k = 0 ; k < nY ; ++k ) { - if ( _Y[k] && _Y[k]->get_eval_status() == NOMAD::EVAL_OK ) { + for ( int bbo_index = 0 ; bbo_index < m ; ++bbo_index ) + { + if ( _alpha[bbo_index] ) + { + for ( k = 0 ; k < nY ; ++k ) + { + if ( _Y[k] && _Y[k]->get_eval_status() == NOMAD::EVAL_OK ) + { truth_value = _Y[k]->get_bb_outputs()[bbo_index]; - if ( truth_value.is_defined() ) { + if ( truth_value.is_defined() ) + { model_value = eval ( *_Y[k] , *_alpha[bbo_index] ); - if ( model_value.is_defined() ) { - if ( truth_value.abs() != 0.0 ) { + if ( model_value.is_defined() ) + { + if ( truth_value.abs() != 0.0 ) + { rel_err = (truth_value-model_value).abs() / truth_value.abs(); if ( !max_rel_err.is_defined() || rel_err > max_rel_err ) max_rel_err = rel_err; @@ -1790,7 +1875,7 @@ void NOMAD::Quad_Model::compute_model_error ( int bbo_index , { truth_value = _Y[k]->get_bb_outputs()[bbo_index]; - if ( truth_value.is_defined() ) + if ( truth_value.is_defined() ) { model_value = eval ( *_Y[k] , *_alpha[bbo_index] ); if ( model_value.is_defined() ) @@ -1798,11 +1883,11 @@ void NOMAD::Quad_Model::compute_model_error ( int bbo_index , rel_err.clear(); if ( truth_value.abs() != 0.0 ) rel_err = (truth_value-model_value).abs() / truth_value.abs(); - else + else { if (truth_value.abs()==model_value.abs()) rel_err=0.0; - else + else rel_err=NOMAD::INF; } if ( !max_rel_err.is_defined() || rel_err > max_rel_err ) @@ -1859,7 +1944,8 @@ void NOMAD::Quad_Model::compute_model_error ( int bbo_index , /*-----------------------------------------------------------*/ void NOMAD::Quad_Model::display_model_coeffs ( const NOMAD::Display & out ) const { - if ( _error_flag ) { + if ( _error_flag ) + { out << "model coefficients: could not be constructed" << std::endl; return; } @@ -1867,11 +1953,13 @@ void NOMAD::Quad_Model::display_model_coeffs ( const NOMAD::Display & out ) cons int m = static_cast<int> ( _bbot.size() ); out << NOMAD::open_block ( "model coefficients" ); - for ( int i = 0 ; i < m ; ++i ) { + for ( int i = 0 ; i < m ; ++i ) + { out << "output #"; out.display_int_w ( i , m ); out << ": "; - if ( _alpha[i] ) { + if ( _alpha[i] ) + { out<< "[ "; _alpha[i]->display ( out , " " , 6 ); out << " ]"; @@ -1891,11 +1979,13 @@ void NOMAD::Quad_Model::display_Y ( const NOMAD::Display & out , { out << NOMAD::open_block ( title ); int nY = get_nY(); - for ( int k = 0 ; k < nY ; ++k ) { + for ( int k = 0 ; k < nY ; ++k ) + { out << "#"; out.display_int_w ( k , nY ); out << ": "; - if ( _Y[k] ) { + if ( _Y[k] ) + { out << "( "; _Y[k]->NOMAD::Point::display ( out , " " , 12 ); out << " ) bbo=[ "; @@ -1914,7 +2004,8 @@ void NOMAD::Quad_Model::display_Y ( const NOMAD::Display & out , /*-------------------------------------------------------*/ void NOMAD::Quad_Model::display_Y_error ( const NOMAD::Display & out ) const { - if ( _error_flag ) { + if ( _error_flag ) + { out << "model error on the interpolation set: cannot be computed" << std::endl; return; @@ -1925,8 +2016,10 @@ void NOMAD::Quad_Model::display_Y_error ( const NOMAD::Display & out ) const int m = static_cast<int> ( _bbot.size() ); for ( i = 0 ; i < m ; ++i ) - if ( _alpha[i] ) { - if ( index >= 0 ) { + if ( _alpha[i] ) + { + if ( index >= 0 ) + { index = -1; break; } @@ -1937,7 +2030,8 @@ void NOMAD::Quad_Model::display_Y_error ( const NOMAD::Display & out ) const NOMAD::Double error , min_rel_err , max_rel_err , avg_rel_err; // only one output: - if ( index >= 0 ) { + if ( index >= 0 ) + { compute_model_error ( index , error , min_rel_err , max_rel_err , avg_rel_err ); out << "model errors on the interpolation set: error=" << error << " min_rel_err=" << min_rel_err @@ -1946,7 +2040,9 @@ void NOMAD::Quad_Model::display_Y_error ( const NOMAD::Display & out ) const } // several outputs: - else { + else + { + out.open_block ( "model error on the interpolation set" ); @@ -1959,7 +2055,8 @@ void NOMAD::Quad_Model::display_Y_error ( const NOMAD::Display & out ) const int cnt = 0; for ( i = 0 ; i < m ; ++i ) - if ( _alpha[i] ) { + if ( _alpha[i] ) + { ++cnt; @@ -1994,15 +2091,15 @@ void NOMAD::Quad_Model::display_Y_error ( const NOMAD::Display & out ) const /*-----------------------------------------------*/ /* display Lagrange polynomials (private) */ /*-----------------------------------------------*/ -void NOMAD::Quad_Model::display_lagrange_polynomials -( const std::vector<NOMAD::Point *> & l , - const std::vector<NOMAD::Eval_Point *> & Y ) const +void NOMAD::Quad_Model::display_lagrange_polynomials ( const std::vector<NOMAD::Point *> & l , + const std::vector<NOMAD::Eval_Point *> & Y ) const { int i , j , nY = static_cast<int> ( Y.size() ); // display Lagrange polynomials: _out << std::endl << NOMAD::open_block ( "Lagrange polynomials" ); - for ( i = 0 ; i < _n_alpha ; ++i ) { + for ( i = 0 ; i < _n_alpha ; ++i ) + { _out << "l["; _out.display_int_w ( i , _n_alpha ); _out << "] = [ "; @@ -2013,11 +2110,13 @@ void NOMAD::Quad_Model::display_lagrange_polynomials // display current set Y: _out << std::endl << NOMAD::open_block ( "current set Y" ); - for ( i = 0 ; i < nY ; ++i ) { + for ( i = 0 ; i < nY ; ++i ) + { _out << "Y["; _out.display_int_w ( i , nY ); _out << "] = "; - if ( Y[i] ) { + if ( Y[i] ) + { _out << "( "; Y[i]->NOMAD::Point::display ( _out , " " , 6 , -1 ); _out << " )"; @@ -2032,13 +2131,16 @@ void NOMAD::Quad_Model::display_lagrange_polynomials // display l(Y): should be the identity matrix: NOMAD::Double tmp , err = 0.0; _out << std::endl << NOMAD::open_block ( "l(Y)" ); - for ( i = 0 ; i < _n_alpha ; ++i ) { + for ( i = 0 ; i < _n_alpha ; ++i ) + { _out << "l["; _out.display_int_w ( i , _n_alpha ); _out << "]: "; - for ( j = 0 ; j < _n_alpha ; ++j ) { + for ( j = 0 ; j < _n_alpha ; ++j ) + { tmp.clear(); - if ( j < nY && Y[j] ) { + if ( j < nY && Y[j] ) + { tmp = eval ( *Y[j] , *l[i] ); err += (i==j) ? (tmp-1.0).abs() : tmp.abs(); } diff --git a/src/Quad_Model.hpp b/src/Quad_Model.hpp index b9320c7..da0edf9 100644 --- a/src/Quad_Model.hpp +++ b/src/Quad_Model.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Quad_Model.hpp - \brief Quadratic regression or MFN interpolation model (headers) - \author Sebastien Le Digabel - \date 2010-08-31 - \see Quad_Model.cpp -*/ + \file Quad_Model.hpp + \brief Quadratic regression or MFN interpolation model (headers) + \author Sebastien Le Digabel + \date 2010-08-31 + \see Quad_Model.cpp + */ #ifndef __QUAD_MODEL__ #define __QUAD_MODEL__ @@ -48,405 +55,405 @@ #include "Evaluator.hpp" namespace NOMAD { - - /// Class for quadratic regression or MFN interpolation model. - class Quad_Model : private NOMAD::Uncopyable { - - /*-------------------------------------------------------------------------*/ - private: - - const NOMAD::Display & _out; ///< Display. - - std::vector<NOMAD::Eval_Point *> _Y; ///< Interpolation points. - - const std::vector<NOMAD::bb_output_type> & _bbot; ///< Blackbox output types. - - NOMAD::interpolation_type _interpolation_type; ///< Interpolation type. - - int _n; ///< Dimension. - int _nfree; ///< Number of free variables. - int _n_alpha; ///< Number of model coefficients. - bool * _fixed_vars; ///< Fixed variables. - int * _index; ///< Var. indexes with fixed var. - NOMAD::Point ** _alpha; ///< Model coefficients. - NOMAD::Point _center; ///< Model center. - NOMAD::Point _ref; ///< Reference for scaling. - NOMAD::Point _scaling; ///< Scaling. - const NOMAD::Cache & _cache; ///< Cache. - const NOMAD::Signature & _signature; ///< Signature. - bool _error_flag; ///< Error flag. - std::list<NOMAD::Direction> _dirP; ///< Directions used for scaling (may be empty) - NOMAD::Point _delta_m; ///< Mesh size used for scaling - NOMAD::Double _epsilon; ///< Offset for direction scaling - - - NOMAD::Double _cond; ///< Condition number. - - /// Initialize alpha (model parameters). - void init_alpha ( void ); - - /// Check if an unscaled point is in \c B(center,radius) for a given radius. - /** - \param x The unscaled point -- \b IN. - \param radius The radius -- \b IN. - \return \c true is \c x is in \c B(center,radius). - */ - bool is_within_radius ( const NOMAD::Point & x , - const NOMAD::Point & radius ) const; - - /// Check the interpolation set \c Y. - /** - \return \c true if the interpolation set is valid. - */ - bool check_Y ( void ) const; - - /// Check outputs before the integration into \c Y. - /** - \param bbo The outputs -- \b IN. - \param m Number of outputs -- \b IN. - return \c true if the \c m outputs are valid. - */ - bool check_outputs ( const NOMAD::Point & bbo , int m ) const; - - /// Reduce the number of interpolation points. - /** - The points are sorted accorded to their distance to the model center. - \param center Center of the model -- \b IN. - \param max_Y_size Max number of interpolation points -- \b IN. - */ - void reduce_Y ( const NOMAD::Point & center , int max_Y_size ); - - /// Compute condition number. - /** - \param W Matrix W given as a vector -- \b IN. - \param n Size of \c W -- \b IN - \param eps Epsilon -- \b IN. - */ - void compute_cond ( const double * W , int n , double eps ); - - /// Compute the cumulated error of a model for one output. - /** - The errors are computed on the interpolation set \c Y. - \param bbo_index Blackbox output index -- \b IN. - \param error Cumulated error -- \b OUT. - \param min_rel_err Min relative error -- \b OUT. - \param max_rel_err Max relative error -- \b OUT. - \param avg_rel_err Average relative error -- \b OUT. - */ - void compute_model_error ( int bbo_index , - NOMAD::Double & error , - NOMAD::Double & min_rel_err , - NOMAD::Double & max_rel_err , - NOMAD::Double & avg_rel_err ) const; - - /// Compute the maximal relative error of a model. - /** - The error is computed for the interpolation set \c Y. - \return The maximal relative error. - */ - NOMAD::Double compute_max_rel_err ( void ) const; - - /// Compute the element \c (i,j) of the interpolation matrix \c M(phi,Y). - /** - \param i Row index -- \b IN. - \param j Column index -- \b IN. - */ - double compute_M ( int i , int j ) const; - - /// Construct Minimum Frobenius Norm (MFN) model. - /** - - This occurs when \c p+1 \c < \c (n+1)(n+2)/2. - \param eps Epsilon -- \b IN. - \param max_mpn Maximum \c m+n value for SVD matrices -- \b IN. - \param max_Y_size Maximum number of elements in \c Y -- \b IN. - \return \c true if the construction succeeded - */ - bool construct_MFN_model ( double eps , int max_mpn , int max_Y_size ); - - /// Construct regression model. - /** - - This occurs when \c p+1 \c >= \c (n+1)(n+2)/2. - \param eps Epsilon -- \b IN. - \param max_mpn Maximum \c m+n value for SVD matrices -- \b IN. - \param max_Y_size Maximum number of elements in \c Y -- \b IN. - \return \c true if the construction succeeded - */ - bool construct_regression_model ( double eps , - int max_mpn , - int max_Y_size ); - - /// Construct well-poised (WP) model. - /** - \param max_Y_size Maximum number of elements in \c Y -- \b IN. - \return \c true if the construction succeeded - */ - bool construct_WP_model ( int max_Y_size ); - - /// Find interpolation point with max Lagrange polynomial value. - /** - \param li Lagrange polynomial -- \b IN. - \param Y Interpolation points candidates -- \b IN. - \param i1 Initial index in \c Y -- \b IN. - \param i2 Final index in \c Y -- \b IN. - \param max_lix Absolute value of the max value -- \b OUT. - \return Index of interpolation point. - */ - int find_max_lix ( const NOMAD::Point & li , - const std::vector<NOMAD::Eval_Point *> & Y , - int i1 , - int i2 , - NOMAD::Double & max_lix ) const; - - /// Resolution of system \c F.[mu alpha_L]'=[f(Y) 0]' for MFN interpolation. - /** - \param U Matrix \c F=U from the SVD decomposition \c U.W.V' -- \b IN. - \param W Matrix \c W from the SVD decomposition \c U.W.V' -- \b IN. - \param V Matrix \c V from the SVD decomposition \c U.W.V' -- \b IN. - \param bbo_index Blackbox output index -- \b IN. - \param alpha Model parameters -- \b IN. - \param eps Epsilon -- \b IN. - */ - void solve_MFN_system ( double ** U , - double * W , - double ** V , - int bbo_index , - NOMAD::Point & alpha , - double eps ) const; - - /// Resolution of system \c F.alpha=M'.f(Y) for the regression. - /** - \param M Matrix \c M -- \b IN. - \param U Matrix \c F=U from the SVD decomposition \c U.W.V' -- \b IN. - \param W Matrix \c W from the SVD decomposition \c U.W.V' -- \b IN. - \param V Matrix \c V from the SVD decomposition \c U.W.V' -- \b IN. - \param bbo_index Blackbox output index -- \b IN. - \param alpha Model parameters -- \b IN. - \param eps Epsilon -- \b IN. - */ - void solve_regression_system ( double ** M , - double ** U , - double * W , - double ** V , - int bbo_index , - NOMAD::Point & alpha , - double eps ) const; - - /// Display Lagrange polynomials. - /** - \param l Lagrange polynomials -- \b IN. - \param Y Interpolation set -- \b IN. - */ - void display_lagrange_polynomials - ( const std::vector<NOMAD::Point *> & l , - const std::vector<NOMAD::Eval_Point *> & Y ) const; - + + /// Class for quadratic regression or MFN interpolation model. + class Quad_Model : private NOMAD::Uncopyable { + + /*-------------------------------------------------------------------------*/ + private: + + const NOMAD::Display & _out; ///< Display. + + std::vector<NOMAD::Eval_Point *> _Y; ///< Interpolation points. + + const std::vector<NOMAD::bb_output_type> & _bbot; ///< Blackbox output types. + + NOMAD::interpolation_type _interpolation_type; ///< Interpolation type. + + int _n; ///< Dimension. + int _nfree; ///< Number of free variables. + int _n_alpha; ///< Number of model coefficients. + bool * _fixed_vars; ///< Fixed variables. + int * _index; ///< Var. indexes with fixed var. + NOMAD::Point ** _alpha; ///< Model coefficients. + NOMAD::Point _center; ///< Model center. + NOMAD::Point _ref; ///< Reference for scaling. + NOMAD::Point _scaling; ///< Scaling. + const NOMAD::Cache & _cache; ///< Cache. + const NOMAD::Signature & _signature; ///< Signature. + bool _error_flag; ///< Error flag. + std::list<NOMAD::Direction> _dirP; ///< Directions used for scaling (may be empty) + NOMAD::Point _delta_m; ///< Mesh size used for scaling + NOMAD::Double _epsilon; ///< Offset for direction scaling + + + NOMAD::Double _cond; ///< Condition number. + + /// Initialize alpha (model parameters). + void init_alpha ( void ); + + /// Check if an unscaled point is in \c B(center,radius) for a given radius. + /** + \param x The unscaled point -- \b IN. + \param radius The radius -- \b IN. + \return \c true is \c x is in \c B(center,radius). + */ + bool is_within_radius ( const NOMAD::Point & x , + const NOMAD::Point & radius ) const; + + /// Check the interpolation set \c Y. + /** + \return \c true if the interpolation set is valid. + */ + bool check_Y ( void ) const; + + /// Check outputs before the integration into \c Y. + /** + \param bbo The outputs -- \b IN. + \param m Number of outputs -- \b IN. + return \c true if the \c m outputs are valid. + */ + bool check_outputs ( const NOMAD::Point & bbo , int m ) const; + + /// Reduce the number of interpolation points. + /** + The points are sorted accorded to their distance to the model center. + \param center Center of the model -- \b IN. + \param max_Y_size Max number of interpolation points -- \b IN. + */ + void reduce_Y ( const NOMAD::Point & center , int max_Y_size ); + + /// Compute condition number. + /** + \param W Matrix W given as a vector -- \b IN. + \param n Size of \c W -- \b IN + \param eps Epsilon -- \b IN. + */ + void compute_cond ( const double * W , int n , double eps ); + + /// Compute the cumulated error of a model for one output. + /** + The errors are computed on the interpolation set \c Y. + \param bbo_index Blackbox output index -- \b IN. + \param error Cumulated error -- \b OUT. + \param min_rel_err Min relative error -- \b OUT. + \param max_rel_err Max relative error -- \b OUT. + \param avg_rel_err Average relative error -- \b OUT. + */ + void compute_model_error ( int bbo_index , + NOMAD::Double & error , + NOMAD::Double & min_rel_err , + NOMAD::Double & max_rel_err , + NOMAD::Double & avg_rel_err ) const; + + /// Compute the maximal relative error of a model. + /** + The error is computed for the interpolation set \c Y. + \return The maximal relative error. + */ + NOMAD::Double compute_max_rel_err ( void ) const; + + /// Compute the element \c (i,j) of the interpolation matrix \c M(phi,Y). + /** + \param i Row index -- \b IN. + \param j Column index -- \b IN. + */ + double compute_M ( int i , int j ) const; + + /// Construct Minimum Frobenius Norm (MFN) model. + /** + - This occurs when \c p+1 \c < \c (n+1)(n+2)/2. + \param eps Epsilon -- \b IN. + \param max_mpn Maximum \c m+n value for SVD matrices -- \b IN. + \param max_Y_size Maximum number of elements in \c Y -- \b IN. + \return \c true if the construction succeeded + */ + bool construct_MFN_model ( double eps , int max_mpn , int max_Y_size ); + + /// Construct regression model. + /** + - This occurs when \c p+1 \c >= \c (n+1)(n+2)/2. + \param eps Epsilon -- \b IN. + \param max_mpn Maximum \c m+n value for SVD matrices -- \b IN. + \param max_Y_size Maximum number of elements in \c Y -- \b IN. + \return \c true if the construction succeeded + */ + bool construct_regression_model ( double eps , + int max_mpn , + int max_Y_size ); + + /// Construct well-poised (WP) model. + /** + \param max_Y_size Maximum number of elements in \c Y -- \b IN. + \return \c true if the construction succeeded + */ + bool construct_WP_model ( int max_Y_size ); + + /// Find interpolation point with max Lagrange polynomial value. + /** + \param li Lagrange polynomial -- \b IN. + \param Y Interpolation points candidates -- \b IN. + \param i1 Initial index in \c Y -- \b IN. + \param i2 Final index in \c Y -- \b IN. + \param max_lix Absolute value of the max value -- \b OUT. + \return Index of interpolation point. + */ + int find_max_lix ( const NOMAD::Point & li , + const std::vector<NOMAD::Eval_Point *> & Y , + int i1 , + int i2 , + NOMAD::Double & max_lix ) const; + + /// Resolution of system \c F.[mu alpha_L]'=[f(Y) 0]' for MFN interpolation. + /** + \param U Matrix \c F=U from the SVD decomposition \c U.W.V' -- \b IN. + \param W Matrix \c W from the SVD decomposition \c U.W.V' -- \b IN. + \param V Matrix \c V from the SVD decomposition \c U.W.V' -- \b IN. + \param bbo_index Blackbox output index -- \b IN. + \param alpha Model parameters -- \b IN. + \param eps Epsilon -- \b IN. + */ + void solve_MFN_system ( double ** U , + double * W , + double ** V , + int bbo_index , + NOMAD::Point & alpha , + double eps ) const; + + /// Resolution of system \c F.alpha=M'.f(Y) for the regression. + /** + \param M Matrix \c M -- \b IN. + \param U Matrix \c F=U from the SVD decomposition \c U.W.V' -- \b IN. + \param W Matrix \c W from the SVD decomposition \c U.W.V' -- \b IN. + \param V Matrix \c V from the SVD decomposition \c U.W.V' -- \b IN. + \param bbo_index Blackbox output index -- \b IN. + \param alpha Model parameters -- \b IN. + \param eps Epsilon -- \b IN. + */ + void solve_regression_system ( double ** M , + double ** U , + double * W , + double ** V , + int bbo_index , + NOMAD::Point & alpha , + double eps ) const; + + /// Display Lagrange polynomials. + /** + \param l Lagrange polynomials -- \b IN. + \param Y Interpolation set -- \b IN. + */ + void display_lagrange_polynomials + ( const std::vector<NOMAD::Point *> & l , + const std::vector<NOMAD::Eval_Point *> & Y ) const; + #ifdef MODEL_STATS - mutable NOMAD::Double _Yw; ///< Width of the interpolation set \c Y. - - public: - - /// Access to the width of the interpolation set \c X (or \c Y). - /** - \return The width of the interpolation set. - */ - const NOMAD::Double & get_Yw ( void ) const { return _Yw; } + mutable NOMAD::Double _Yw; ///< Width of the interpolation set \c Y. + + public: + + /// Access to the width of the interpolation set \c X (or \c Y). + /** + \return The width of the interpolation set. + */ + const NOMAD::Double & get_Yw ( void ) const { return _Yw; } #endif - - /*-------------------------------------------------------------------------*/ - public: - - /// Constructor. - /** - \param out The NOMAD::Display object -- \b IN. - \param bbot Output types -- \b IN. - \param cache Cache -- \b IN. - \param signature Signature -- \b IN. - */ - Quad_Model ( const NOMAD::Display & out , - const std::vector<NOMAD::bb_output_type> & bbot , - const NOMAD::Cache & cache , - const NOMAD::Signature & signature ); - - /// Destructor. - virtual ~Quad_Model ( void ); - - /// Evaluate a model at a given point. - /** - \param x The point -- \b IN. - \param alpha Model parameters -- \b IN. - \return Model value. - */ - NOMAD::Double eval ( const NOMAD::Point & x , - const NOMAD::Point & alpha ) const; - - /// Compute model \c h and \c f values at a point. - /** - \param x The point -- \b IN. - \param h_min Value of \c h_min -- \b IN.. - \param h_norm Norm used to compute \c h -- \b IN.. - \param h Value of \c h -- \b OUT. - \param f Value of \c f -- \b OUT. - */ - void eval_hf ( const NOMAD::Point & x , - const NOMAD::Double & h_min , - NOMAD::hnorm_type h_norm , - NOMAD::Double & h , - NOMAD::Double & f ) const; - - - /// Access to the interpolation type. - /** - \return The interpolation type. - */ - const NOMAD::interpolation_type & get_interpolation_type ( void ) const - { - return _interpolation_type; - } - - /// Access to the center of the model. - /** - \return The center. - */ - const NOMAD::Point & get_center ( void ) const { return _center; } - - /// Access to the dimension. - /** - \return The dimension \c n. - */ - int get_n ( void ) const { return _n; } - - /// Access to the number of free variables. - /** - \return The number of free variables \c n. - */ - int get_nfree ( void ) const { return _nfree; } - - /// Access to the model parameters. - /** - \return The model parameters \c alpha. - */ - NOMAD::Point ** get_alpha ( void ) const { return _alpha; } - - /// Check if the model is ready for evaluations. - /** - \return A boolean equal to \c true if the model is ready. - */ - bool check ( void ) const; - - /// Access to the fixed variables. - /** - \param i Variable index -- \b IN. - \return \c true if variable \c i is fixed. - */ - bool variable_is_fixed ( int i ) const { return _fixed_vars[i]; } - - /// Access to the number of interpolation points. - /** - \return The number of interpolation points \c nY=p+1. - */ - int get_nY ( void ) const { return static_cast<int> ( _Y.size() ); } - - /// Access to the condition number. - /** - \return The condition number. - */ - const NOMAD::Double & get_cond ( void ) const { return _cond; } - - /// Access to the error flag. - /** - \return The error flag. - */ - bool get_error_flag ( void ) const { return _error_flag; } - - /// Construct the interpolation set \c Y. - /** - \param center Model center -- \b IN. - \param interpolation_radius Interpolation radius -- \b IN. - \param max_Y_size Maximum number of elements in \c Y -- \b IN. - */ - void construct_Y ( const NOMAD::Point & center , - const NOMAD::Point & interpolation_radius , - int max_Y_size ); - - /// Construct \c m models (one by output). - /** - \param use_WP Use or not well-poisedness -- \b IN. - \param eps Epsilon -- \b IN. - \param max_mpn Maximum \c m+n value for SVD matrices -- \b IN. - \param max_Y_size Maximum number of elements in \c Y -- \b IN. - */ - void construct ( bool use_WP , - double eps , - int max_mpn , - int max_Y_size ); - - /// Define scaling to put all coordinates centered in \c [-r;r]. - /** - - Looks also for fixed variables. - \param r The \c r parameter corresponds to \c MODEL_RADIUS_FACTOR -- \b IN. - */ - void define_scaling ( const NOMAD::Double & r ); - - /// Define scaling based on directions. See paper: Reducing the number of function evaluations in Mesh Adaptive Direct Search algorithms, Audet, Ianni, LeDigabel, Tribes, 2014 - /** - - Looks also for fixed variables. - \param dirP The \c dirP parameter corresponds to set of directions formin a hyper-cube centered on poll center -- \b IN. - \param delta_m The \c delta_m parameter is the dimension of the mesh -- \b IN. - \param epsilon The \c epsilon parameter is the hyper-cube offset from the poll center -- \b IN. - */ - void define_scaling_by_directions ( const std::list<NOMAD::Direction> & dirP, const NOMAD::Point & delta_m, const NOMAD::Double &epsilon ); - - - /// Scale a point. - /** - \param x The point to scale -- \b IN/OUT. - \return \c true if the scaling worked. - */ - bool scale ( NOMAD::Point & x ) const; - - /// Unscale a point. - /** - \param x The point to unscale -- \b IN/OUT. - \return \c true if the unscaling worked. - */ - bool unscale ( NOMAD::Point & x ) const; - - /// Unscale the gradient at a point. - /** - \param x The grad to unscale -- \b IN/OUT. - \return \c true if the unscaling worked. - */ - bool unscale_grad ( NOMAD::Point & x ) const; - - - /// Check if a caled point is inside the trust radius. - /** - \param x The scaled point -- \b IN. - \return \c true is \c x is in the trust radius. - */ - bool is_within_trust_radius ( const NOMAD::Point & x ) const; - - /// Display the model coefficients. - /** - \param out The NOMAD::Display object -- \b IN. - */ - void display_model_coeffs ( const NOMAD::Display & out ) const; - - /// Display the interpolation set \c Y. - /** - \param out The NOMAD::Display object -- \b IN. - \param title Title of the display block -- \b IN - --\b optional (default="interpolation set Y"). - */ - void display_Y ( const NOMAD::Display & out , - const std::string & title = "interpolation set Y" ) const; - - /// Display cumulated error on the interpolation points. - /** - \param out The NOMAD::Display object -- \b IN. - */ - void display_Y_error ( const NOMAD::Display & out ) const; - }; + + /*-------------------------------------------------------------------------*/ + public: + + /// Constructor. + /** + \param out The NOMAD::Display object -- \b IN. + \param bbot Output types -- \b IN. + \param cache Cache -- \b IN. + \param signature Signature -- \b IN. + */ + Quad_Model ( const NOMAD::Display & out , + const std::vector<NOMAD::bb_output_type> & bbot , + const NOMAD::Cache & cache , + const NOMAD::Signature & signature ); + + /// Destructor. + virtual ~Quad_Model ( void ); + + /// Evaluate a model at a given point. + /** + \param x The point -- \b IN. + \param alpha Model parameters -- \b IN. + \return Model value. + */ + NOMAD::Double eval ( const NOMAD::Point & x , + const NOMAD::Point & alpha ) const; + + /// Compute model \c h and \c f values at a point. + /** + \param x The point -- \b IN. + \param h_min Value of \c h_min -- \b IN.. + \param h_norm Norm used to compute \c h -- \b IN.. + \param h Value of \c h -- \b OUT. + \param f Value of \c f -- \b OUT. + */ + void eval_hf ( const NOMAD::Point & x , + const NOMAD::Double & h_min , + NOMAD::hnorm_type h_norm , + NOMAD::Double & h , + NOMAD::Double & f ) const; + + + /// Access to the interpolation type. + /** + \return The interpolation type. + */ + const NOMAD::interpolation_type & get_interpolation_type ( void ) const + { + return _interpolation_type; + } + + /// Access to the center of the model. + /** + \return The center. + */ + const NOMAD::Point & get_center ( void ) const { return _center; } + + /// Access to the dimension. + /** + \return The dimension \c n. + */ + int get_n ( void ) const { return _n; } + + /// Access to the number of free variables. + /** + \return The number of free variables \c n. + */ + int get_nfree ( void ) const { return _nfree; } + + /// Access to the model parameters. + /** + \return The model parameters \c alpha. + */ + NOMAD::Point ** get_alpha ( void ) const { return _alpha; } + + /// Check if the model is ready for evaluations. + /** + \return A boolean equal to \c true if the model is ready. + */ + bool check ( void ) const; + + /// Access to the fixed variables. + /** + \param i Variable index -- \b IN. + \return \c true if variable \c i is fixed. + */ + bool variable_is_fixed ( int i ) const { return _fixed_vars[i]; } + + /// Access to the number of interpolation points. + /** + \return The number of interpolation points \c nY=p+1. + */ + int get_nY ( void ) const { return static_cast<int> ( _Y.size() ); } + + /// Access to the condition number. + /** + \return The condition number. + */ + const NOMAD::Double & get_cond ( void ) const { return _cond; } + + /// Access to the error flag. + /** + \return The error flag. + */ + bool get_error_flag ( void ) const { return _error_flag; } + + /// Construct the interpolation set \c Y. + /** + \param center Model center -- \b IN. + \param interpolation_radius Interpolation radius -- \b IN. + \param max_Y_size Maximum number of elements in \c Y -- \b IN. + */ + void construct_Y ( const NOMAD::Point & center , + const NOMAD::Point & interpolation_radius , + int max_Y_size ); + + /// Construct \c m models (one by output). + /** + \param use_WP Use or not well-poisedness -- \b IN. + \param eps Epsilon -- \b IN. + \param max_mpn Maximum \c m+n value for SVD matrices -- \b IN. + \param max_Y_size Maximum number of elements in \c Y -- \b IN. + */ + void construct ( bool use_WP , + double eps , + int max_mpn , + int max_Y_size ); + + /// Define scaling to put all coordinates centered in \c [-r;r]. + /** + - Looks also for fixed variables. + \param r The \c r parameter corresponds to \c MODEL_RADIUS_FACTOR -- \b IN. + */ + void define_scaling ( const NOMAD::Double & r ); + + /// Define scaling based on directions. See paper: Reducing the number of function evaluations in Mesh Adaptive Direct Search algorithms, Audet, Ianni, LeDigabel, Tribes, 2014 + /** + - Looks also for fixed variables. + \param dirP The \c dirP parameter corresponds to set of directions formin a hyper-cube centered on poll center -- \b IN. + \param delta_m The \c delta_m parameter is the dimension of the mesh -- \b IN. + \param epsilon The \c epsilon parameter is the hyper-cube offset from the poll center -- \b IN. + */ + void define_scaling_by_directions ( const std::list<NOMAD::Direction> & dirP, const NOMAD::Point & delta_m, const NOMAD::Double &epsilon ); + + + /// Scale a point. + /** + \param x The point to scale -- \b IN/OUT. + \return \c true if the scaling worked. + */ + bool scale ( NOMAD::Point & x ) const; + + /// Unscale a point. + /** + \param x The point to unscale -- \b IN/OUT. + \return \c true if the unscaling worked. + */ + bool unscale ( NOMAD::Point & x ) const; + + /// Unscale the gradient at a point. + /** + \param x The grad to unscale -- \b IN/OUT. + \return \c true if the unscaling worked. + */ + bool unscale_grad ( NOMAD::Point & x ) const; + + + /// Check if a caled point is inside the trust radius. + /** + \param x The scaled point -- \b IN. + \return \c true is \c x is in the trust radius. + */ + bool is_within_trust_radius ( const NOMAD::Point & x ) const; + + /// Display the model coefficients. + /** + \param out The NOMAD::Display object -- \b IN. + */ + void display_model_coeffs ( const NOMAD::Display & out ) const; + + /// Display the interpolation set \c Y. + /** + \param out The NOMAD::Display object -- \b IN. + \param title Title of the display block -- \b IN + --\b optional (default="interpolation set Y"). + */ + void display_Y ( const NOMAD::Display & out , + const std::string & title = "interpolation set Y" ) const; + + /// Display cumulated error on the interpolation points. + /** + \param out The NOMAD::Display object -- \b IN. + */ + void display_Y_error ( const NOMAD::Display & out ) const; + }; } #endif diff --git a/src/Quad_Model_Evaluator.cpp b/src/Quad_Model_Evaluator.cpp index 7a6d9f8..1738031 100644 --- a/src/Quad_Model_Evaluator.cpp +++ b/src/Quad_Model_Evaluator.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,81 +41,79 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Quad_Model_Evaluator.cpp - \brief NOMAD::Evaluator subclass for quadratic model optimization (implementation) - \author Sebastien Le Digabel - \date 2010-08-31 - \see Quad_Mopel_Evaluator.hpp -*/ + \file Quad_Model_Evaluator.cpp + \brief NOMAD::Evaluator subclass for quadratic model optimization (implementation) + \author Sebastien Le Digabel + \date 2010-08-31 + \see Quad_Mopel_Evaluator.hpp + */ #include "Quad_Model_Evaluator.hpp" /*-----------------------------*/ /* constructor */ /*-----------------------------*/ -NOMAD::Quad_Model_Evaluator::Quad_Model_Evaluator -( const NOMAD::Parameters & p , - const NOMAD::Quad_Model & model ) - : - _n ( model.get_n() ) , - _nm1 ( _n-1 ) , - _m ( p.get_bb_nb_outputs() ) , - _x ( NULL ) , - _alpha ( NULL ) , - _model_ready ( model.check() ) +NOMAD::Quad_Model_Evaluator::Quad_Model_Evaluator ( const NOMAD::Parameters & p , + const NOMAD::Quad_Model & model ) : +_n ( model.get_n() ) , +_nm1 ( _n-1 ) , +_m ( p.get_bb_nb_outputs() ) , +_x ( NULL ) , +_alpha ( NULL ) , +_model_ready ( model.check() ) { - if ( _model_ready ) - { - - int i , j , k , k2 , nalpha = (_n+1)*(_n+2)/2 , nfree = model.get_nfree(); - NOMAD::Point ** model_alpha = model.get_alpha(); - - _x = new double [_n]; - _alpha = new double * [_m]; - - for ( int io = 0 ; io < _m ; ++io ) - { - _alpha[io] = NULL; - if ( model_alpha[io] ) - { - _alpha[io] = new double[nalpha]; - _alpha[io][0] = (*model_alpha[io])[0].value(); - - for ( i = 1 ; i < nalpha ; ++i ) - _alpha[io][i] = 0.0; - - k = 0; - - for ( i = 0 ; i < _n ; ++i ) - { - if ( !model.variable_is_fixed(i) ) - { - ++k; - _alpha[io][i+1 ] = (*model_alpha[io])[k ].value(); - _alpha[io][i+1+_n] = (*model_alpha[io])[k+nfree].value(); - } - } - - k += nfree; - k2 = 2*_n; - - for ( i = 0 ; i < _nm1 ; ++i ) - { - if ( !model.variable_is_fixed(i) ) - { - for ( j = i+1 ; j < _n ; ++j ) - { - ++k2; - if ( !model.variable_is_fixed(j) ) - _alpha[io][k2] = (*model_alpha[io])[++k].value(); - } - } - else - for ( j = i+1 ; j < _n ; ++j ) - ++k2; - } - } - } - } + if ( _model_ready ) + { + + int i , j , k , k2 , nalpha = (_n+1)*(_n+2)/2 , nfree = model.get_nfree(); + NOMAD::Point ** model_alpha = model.get_alpha(); + + _x = new double [_n]; + _alpha = new double * [_m]; + + for ( int io = 0 ; io < _m ; ++io ) + { + _alpha[io] = NULL; + if ( model_alpha[io] ) + { + _alpha[io] = new double[nalpha]; + _alpha[io][0] = (*model_alpha[io])[0].value(); + + for ( i = 1 ; i < nalpha ; ++i ) + _alpha[io][i] = 0.0; + + k = 0; + + for ( i = 0 ; i < _n ; ++i ) + { + if ( !model.variable_is_fixed(i) ) + { + ++k; + _alpha[io][i+1 ] = (*model_alpha[io])[k ].value(); + _alpha[io][i+1+_n] = (*model_alpha[io])[k+nfree].value(); + } + } + + k += nfree; + k2 = 2*_n; + + for ( i = 0 ; i < _nm1 ; ++i ) + { + if ( !model.variable_is_fixed(i) ) + { + for ( j = i+1 ; j < _n ; ++j ) + { + ++k2; + if ( !model.variable_is_fixed(j) ) + _alpha[io][k2] = (*model_alpha[io])[++k].value(); + } + } + else + for ( j = i+1 ; j < _n ; ++j ) + ++k2; + } + } + } + } } /*-----------------------------*/ @@ -116,14 +121,14 @@ NOMAD::Quad_Model_Evaluator::Quad_Model_Evaluator /*-----------------------------*/ NOMAD::Quad_Model_Evaluator::~Quad_Model_Evaluator ( void ) { - if ( _model_ready ) - { - for ( int i = 0 ; i < _m ; ++i ) - if ( _alpha[i] ) - delete [] _alpha[i]; - delete [] _alpha; - delete [] _x; - } + if ( _model_ready ) + { + for ( int i = 0 ; i < _m ; ++i ) + if ( _alpha[i] ) + delete [] _alpha[i]; + delete [] _alpha; + delete [] _x; + } } /*------------------------------------------------------------------------*/ @@ -133,51 +138,59 @@ NOMAD::Quad_Model_Evaluator::~Quad_Model_Evaluator ( void ) /* x is in [-1000;1000] and must be scaled to [-1;1] for the evalutation */ /* */ /*------------------------------------------------------------------------*/ -bool NOMAD::Quad_Model_Evaluator::eval_x -( NOMAD::Eval_Point & x , - const NOMAD::Double & h_max , - bool & count_eval ) const +bool NOMAD::Quad_Model_Evaluator::eval_x ( NOMAD::Eval_Point & x , + const NOMAD::Double & h_max , + bool & count_eval ) const { - - count_eval=false; - if ( !_model_ready ) - return false; - - int i , j , k; - double z , * alpha , * p; - - for ( i = 0 ; i < _n ; ++i ) - _x[i] = x[i].value() / 1000.0; - - for ( int oi = 0 ; oi < _m ; ++oi ) - { - - alpha = _alpha[oi]; - - if ( alpha ) - { - - z = alpha[0]; - p = _x; - - for ( k = 1 ; k <= _n ; ++k , ++p ) - z += *p * ( alpha[k] + 0.5 * alpha[k+_n] * *p ); - - k += _n-1; - - for ( i = 0 ; i < _nm1 ; ++i ) - for ( j = i+1 ; j < _n ; ++j ) - z += alpha[++k] * _x[i] * _x[j]; - - x.set_bb_output ( oi , z ); - } - - else - x.set_bb_output ( oi , 0.0 ); - } - - count_eval = true; - return true; + + count_eval=false; + if ( !_model_ready ) + return false; + + int i , j , k; + double z , * alpha , * p; + + for ( i = 0 ; i < _n ; ++i ) + _x[i] = x[i].value() / 1000.0; + + for ( int oi = 0 ; oi < _m ; ++oi ) + { + + alpha = _alpha[oi]; + + if ( alpha ) + { + + z = alpha[0]; + p = _x; + + for ( k = 1 ; k <= _n ; ++k , ++p ) + z += *p * ( alpha[k] + 0.5 * alpha[k+_n] * *p ); + + k += _n-1; + + for ( i = 0 ; i < _nm1 ; ++i ) + for ( j = i+1 ; j < _n ; ++j ) + z += alpha[++k] * _x[i] * _x[j]; + + + // SLD special rounding to 8 decimals in order to improve numerical stability: + // { + // long double prec = 1e-8; + // z = ( z < 0.0 ? + // -floor(-z/prec + .5) : + // floor( z/prec + .5) ) * prec; + // } + + x.set_bb_output ( oi , z ); + } + + else + x.set_bb_output ( oi , 0.0 ); + } + + count_eval = true; + return true; } @@ -188,38 +201,37 @@ bool NOMAD::Quad_Model_Evaluator::eval_x /* x is in [-1000;1000] and must be scaled to [-1;1] for the evalutation */ /* */ /*------------------------------------------------------------------------*/ -bool NOMAD::Quad_Model_Evaluator::evalGrad_x -(const NOMAD::Point & x , - NOMAD::Point & g , - const int & output_index , - bool & count_eval ) const +bool NOMAD::Quad_Model_Evaluator::evalGrad_x ( const NOMAD::Point & x , + NOMAD::Point & g , + const int & output_index , + bool & count_eval ) const { - - if ( !_model_ready ) - return false; - - double * alpha ; - - for (int i = 0 ; i < _n ; ++i ) - _x[i] = x[i].value() / 1000.0; - - alpha = _alpha[output_index]; - - if ( !alpha ) - return false; - - int i , j , k ; - - for ( k = 1 ; k <= _n ; ++k ) - g[k-1] = alpha[k] + alpha[k+_n] * _x[k-1]; - - - k += _n-1; - - for ( i = 0 ; i < _nm1 ; ++i ) - for ( j = i+1 ; j < _n ; ++j ) - g[i] += alpha[++k] * _x[j]; - - count_eval = true; - return true; + + if ( !_model_ready ) + return false; + + double * alpha ; + + for (int i = 0 ; i < _n ; ++i ) + _x[i] = x[i].value() / 1000.0; + + alpha = _alpha[output_index]; + + if ( !alpha ) + return false; + + int i , j , k ; + + for ( k = 1 ; k <= _n ; ++k ) + g[k-1] = alpha[k] + alpha[k+_n] * _x[k-1]; + + + k += _n-1; + + for ( i = 0 ; i < _nm1 ; ++i ) + for ( j = i+1 ; j < _n ; ++j ) + g[i] += alpha[++k] * _x[j]; + + count_eval = true; + return true; } diff --git a/src/Quad_Model_Evaluator.hpp b/src/Quad_Model_Evaluator.hpp index f3780a5..c99ffe0 100644 --- a/src/Quad_Model_Evaluator.hpp +++ b/src/Quad_Model_Evaluator.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ diff --git a/src/Quad_Model_Search.cpp b/src/Quad_Model_Search.cpp index ef61c01..b4560f0 100644 --- a/src/Quad_Model_Search.cpp +++ b/src/Quad_Model_Search.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -182,6 +189,7 @@ void NOMAD::Quad_Model_Search::search ( NOMAD::Mads & mads // stats: NOMAD::Stats & stats = mads.get_stats(); + // number of interpolation points: int nY[2]; nY[0] = nY[1] = -1; @@ -217,7 +225,8 @@ void NOMAD::Quad_Model_Search::search ( NOMAD::Mads & mads NOMAD::Signature * signature = xk[i_inc]->get_signature(); if ( !signature ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) { + if ( display_degree == NOMAD::FULL_DISPLAY ) + { std::ostringstream oss; oss << "end of " << NOMAD::MODEL_SEARCH << " (no signature)"; out << std::endl << NOMAD::close_block ( oss.str() ) << std::endl; @@ -227,7 +236,7 @@ void NOMAD::Quad_Model_Search::search ( NOMAD::Mads & mads return; } - // current mesh index: + // current mesh indices: NOMAD::Point mesh_indices = signature->get_mesh()->get_mesh_indices(); @@ -245,6 +254,7 @@ void NOMAD::Quad_Model_Search::search ( NOMAD::Mads & mads return; } + // compute the interpolation radius: points in Y must be at // a max distance of ms_radius_factor times Delta^k: NOMAD::Point Delta , delta; @@ -422,8 +432,10 @@ void NOMAD::Quad_Model_Search::search ( NOMAD::Mads & mads } // end of main loop // check the number of times that not enough points could be considered: - if ( nY[0] <= 1 && nY[1] <= 1 ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) { + if ( nY[0] <= 1 && nY[1] <= 1 ) + { + if ( display_degree == NOMAD::FULL_DISPLAY ) + { std::ostringstream oss; oss << "end of " << NOMAD::MODEL_SEARCH << " (not enough points)"; @@ -437,7 +449,8 @@ void NOMAD::Quad_Model_Search::search ( NOMAD::Mads & mads // check if no model has been computed: if ( !model_ok ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) { + if ( display_degree == NOMAD::FULL_DISPLAY ) + { std::ostringstream oss; oss << "end of " << NOMAD::MODEL_SEARCH << " (model computation or optimization error)"; @@ -507,7 +520,8 @@ void NOMAD::Quad_Model_Search::search ( NOMAD::Mads & mads _all_searches_stats.update ( _one_search_stats ); // final display: - if ( display_degree == NOMAD::FULL_DISPLAY ) { + if ( display_degree == NOMAD::FULL_DISPLAY ) + { std::ostringstream oss; oss << "end of " << NOMAD::MODEL_SEARCH << " (" << success << ")"; out << std::endl << NOMAD::close_block ( oss.str() ) << std::endl; @@ -517,20 +531,20 @@ void NOMAD::Quad_Model_Search::search ( NOMAD::Mads & mads /*---------------------------------------------------------------*/ /* project to mesh and create a trial point (private) */ /*---------------------------------------------------------------*/ -void NOMAD::Quad_Model_Search::create_trial_point -( NOMAD::Evaluator_Control & ev_control , - NOMAD::Point x , - const NOMAD::Quad_Model & model , - NOMAD::Signature & signature , - const NOMAD::Point & mesh_indices , - const NOMAD::Point & delta , - NOMAD::dd_type display_degree , - const NOMAD::Display & out ) +void NOMAD::Quad_Model_Search::create_trial_point ( NOMAD::Evaluator_Control & ev_control , + NOMAD::Point x , + const NOMAD::Quad_Model & model , + NOMAD::Signature & signature , + const NOMAD::Point & mesh_indices , + const NOMAD::Point & delta , + NOMAD::dd_type display_degree , + const NOMAD::Display & out ) { bool proj_to_mesh = _p.get_model_search_proj_to_mesh(); - if ( display_degree == NOMAD::FULL_DISPLAY ) { + if ( display_degree == NOMAD::FULL_DISPLAY ) + { out << "candidate"; if ( proj_to_mesh ) out << " (before projection)"; @@ -553,7 +567,7 @@ void NOMAD::Quad_Model_Search::create_trial_point } - // Round for integer and binary variables: + // Round for integer and variables: bool has_integer=false; bool has_binary=false; for (int i=0;i<n;i++) @@ -570,8 +584,11 @@ void NOMAD::Quad_Model_Search::create_trial_point else if ( _p.get_bb_input_type()[i] == NOMAD::BINARY ) { has_binary=true; - if ( x[i]!= 0.0 ) + if ( x[i] < 0.5 ) + x[i] = 0.0; + else x[i] = 1.0; + } } if ( has_integer && display_degree == NOMAD::FULL_DISPLAY ) @@ -609,6 +626,7 @@ void NOMAD::Quad_Model_Search::create_trial_point tk->Point::operator = ( x ); // compute model f and h in order to accept or reject the trial point: + NOMAD::Double h0 , f0; // model values of f and h at the center NOMAD::Double h1 , f1; // model values of f and h at the trial point @@ -658,7 +676,8 @@ void NOMAD::Quad_Model_Search::create_trial_point } // add the new point to the list of search trial points: - if ( accept_point ) { + if ( accept_point ) + { ev_control.add_eval_point ( tk , display_degree , _p.get_snap_to_bounds() , @@ -667,7 +686,8 @@ void NOMAD::Quad_Model_Search::create_trial_point f1 , h1 ); #ifdef MODEL_STATS - if ( tk ) { + if ( tk ) + { tk->set_mod_use ( 1 ); // 1 for model search tk->set_cond ( model.get_cond() ); tk->set_Yw ( model.get_Yw () ); @@ -678,7 +698,9 @@ void NOMAD::Quad_Model_Search::create_trial_point #endif } - else { + else + { + if ( display_degree == NOMAD::FULL_DISPLAY ) out << "candidate rejected" << std::endl; _one_search_stats.add_MS_rejected(); @@ -694,16 +716,15 @@ void NOMAD::Quad_Model_Search::create_trial_point /* in [-1000;1000] */ /* */ /*---------------------------------------------------------------*/ -bool NOMAD::Quad_Model_Search::optimize_model -( const NOMAD::Quad_Model & model , - const NOMAD::Eval_Point ** xk , - int i_inc , - NOMAD::dd_type display_degree , - const NOMAD::Display & out , - NOMAD::Point & xf , - NOMAD::Point & xi , - bool & stop , - NOMAD::stop_type & stop_reason ) +bool NOMAD::Quad_Model_Search::optimize_model ( const NOMAD::Quad_Model & model , + const NOMAD::Eval_Point ** xk , + int i_inc , + NOMAD::dd_type display_degree , + const NOMAD::Display & out , + NOMAD::Point & xf , + NOMAD::Point & xi , + bool & stop , + NOMAD::stop_type & stop_reason ) { xf.clear(); xi.clear(); @@ -714,7 +735,8 @@ bool NOMAD::Quad_Model_Search::optimize_model int i; // initial displays: - if ( display_degree == NOMAD::FULL_DISPLAY ) { + if ( display_degree == NOMAD::FULL_DISPLAY ) + { std::ostringstream oss; oss << "model optimization"; if ( xk[0] && xk[1] ) @@ -731,6 +753,9 @@ bool NOMAD::Quad_Model_Search::optimize_model // blackbox outputs: model_param.set_BB_OUTPUT_TYPE ( _p.get_bb_output_type() ); + // blackbox inputs: + // Default: all variables are treated as continuous + // barrier parameters: model_param.set_H_MIN ( _p.get_h_min () ); model_param.set_H_NORM ( _p.get_h_norm() ); @@ -799,7 +824,6 @@ bool NOMAD::Quad_Model_Search::optimize_model else model_param.set_MAX_BB_EVAL ( 50000 ); - model_param.set_SNAP_TO_BOUNDS ( true ); // disable user calls: @@ -812,7 +836,7 @@ bool NOMAD::Quad_Model_Search::optimize_model flag_reset_barriers , flag_p1_active ); - NOMAD::Mads::set_flag_check_bimads (false ); + NOMAD::Mads::set_flag_check_bimads ( false ); NOMAD::Mads::set_flag_reset_mesh ( true ); NOMAD::Mads::set_flag_reset_barriers ( true ); NOMAD::Mads::set_flag_p1_active ( false ); @@ -877,15 +901,15 @@ bool NOMAD::Quad_Model_Search::optimize_model // model evaluator creation: NOMAD::Evaluator *ev; - if (model_param.get_nb_obj()==2) + + if ( model_param.get_nb_obj()==2 ) ev =new NOMAD::Multi_Obj_Quad_Model_Evaluator( model_param , model ); else - ev=new NOMAD::Single_Obj_Quad_Model_Evaluator(model_param, model); + ev=new NOMAD::Single_Obj_Quad_Model_Evaluator( model_param, model ); // algorithm creation and execution: NOMAD::Mads mads ( model_param , ev ); - // Handle the case where nb_bb_obj>=2 but no-bimads (case of PhaseOneSearch) ---> need Phase_One_Evaluator for compute_f NOMAD::Phase_One_Evaluator * p1ev=NULL; if ( model_param.get_nb_obj() >= 2 && ! flag_check_bimads ) { @@ -896,11 +920,12 @@ bool NOMAD::Quad_Model_Search::optimize_model NOMAD::stop_type st = mads.run(); delete ev; - if (p1ev) + if ( p1ev ) delete p1ev; // check the stopping criterion: - if ( st == NOMAD::CTRL_C || st == NOMAD::MAX_CACHE_MEMORY_REACHED ) { + if ( st == NOMAD::CTRL_C || st == NOMAD::MAX_CACHE_MEMORY_REACHED ) + { std::ostringstream oss; oss << "model optimization: " << st; error_str = oss.str(); @@ -926,11 +951,13 @@ bool NOMAD::Quad_Model_Search::optimize_model const NOMAD::Eval_Point * best_feas = mads.get_best_feasible (); const NOMAD::Eval_Point * best_infeas = mads.get_best_infeasible(); - if ( best_feas ) { + if ( best_feas ) + { xf = *best_feas; xf *= 0.001; - if ( display_degree == NOMAD::FULL_DISPLAY ) { + if ( display_degree == NOMAD::FULL_DISPLAY ) + { out << "best feasible point after unscaling : ( "; xf.NOMAD::Point::display ( out ); out << " )" << std::endl; @@ -941,11 +968,13 @@ bool NOMAD::Quad_Model_Search::optimize_model else if ( display_degree == NOMAD::FULL_DISPLAY ) out << "no feasible solution" << std::endl; - if ( best_infeas ) { + if ( best_infeas ) + { xi = *best_infeas; xi *= 0.001; - if ( display_degree == NOMAD::FULL_DISPLAY ) { + if ( display_degree == NOMAD::FULL_DISPLAY ) + { out << "best infeasible point before unscaling: ( "; xi.NOMAD::Point::display ( out ); out << " )" << std::endl; @@ -956,12 +985,14 @@ bool NOMAD::Quad_Model_Search::optimize_model else if ( display_degree == NOMAD::FULL_DISPLAY ) out << "no infeasible solution" << std::endl; - if ( !xf.is_defined() && !xi.is_defined() ) { + if ( !xf.is_defined() && !xi.is_defined() ) + { error = true; error_str = "optimization error: no solution"; } } - catch ( std::exception & e ) { + catch ( std::exception & e ) + { error = true; error_str = std::string ( "optimization error: " ) + e.what(); } @@ -979,7 +1010,8 @@ bool NOMAD::Quad_Model_Search::optimize_model // close display block: - if ( display_degree == NOMAD::FULL_DISPLAY ) { + if ( display_degree == NOMAD::FULL_DISPLAY ) + { if ( error ) out.close_block ( error_str ); else diff --git a/src/Quad_Model_Search.hpp b/src/Quad_Model_Search.hpp index 1f2d19e..a00dda5 100644 --- a/src/Quad_Model_Search.hpp +++ b/src/Quad_Model_Search.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Quad_Model_Search.hpp - \brief Quadratic Model search (headers) - \author Sebastien Le Digabel - \date 2010-08-30 - \see Quad_Model_Search.cpp -*/ + \file Quad_Model_Search.hpp + \brief Quadratic Model search (headers) + \author Sebastien Le Digabel + \date 2010-08-30 + \see Quad_Model_Search.cpp + */ #ifndef __QUAD_MODEL_SEARCH__ #define __QUAD_MODEL_SEARCH__ @@ -48,104 +55,105 @@ #include "Multi_Obj_Quad_Model_Evaluator.hpp" namespace NOMAD { - - /// Model search. - class Quad_Model_Search : public NOMAD::Search , private NOMAD::Uncopyable { - - private: - - NOMAD::Model_Stats _one_search_stats; ///< Stats for one search. - NOMAD::Model_Stats _all_searches_stats; ///< Stats for all searches. - - /// Model optimization. - /** - \param model The model -- \b IN. - \param xk The two model centers -- \b IN. - \param i_inc Model center index (\c 0 or \c 1 ) -- \b IN. - \param display_degree Display degree -- \b IN. - \param out The NOMAD::Display object -- \b IN. - \param xf Feasible solution \c xf -- \b OUT. - \param xi Infeasible solution \c xi -- \b OUT. - \param stop Stop flag -- \b OUT. - \param stop_reason Stop reason -- \b OUT. - */ - bool optimize_model ( const NOMAD::Quad_Model & model , - const NOMAD::Eval_Point ** xk , - int i_inc , - NOMAD::dd_type display_degree , - const NOMAD::Display & out , - NOMAD::Point & xf , - NOMAD::Point & xi , - bool & stop , - NOMAD::stop_type & stop_reason ); - - /// Project to mesh and create a trial point. - /** - \param ev_control The NOMAD::Evaluator_Control object -- \b IN. - \param x The point coordinates -- \b IN. - \param model The model -- \b IN. - \param signature Signature -- \b IN. - \param mesh_indices Mesh indic -- \b IN. - \param delta Mesh size parameter -- \b IN. - \param display_degree Display degree -- \b IN. - \param out The NOMAD::Display object -- \b IN. - */ - void create_trial_point - ( NOMAD::Evaluator_Control & ev_control , - NOMAD::Point x , - const NOMAD::Quad_Model & model , - NOMAD::Signature & signature , - const NOMAD::Point & mesh_indices , - const NOMAD::Point & delta , - NOMAD::dd_type display_degree , - const NOMAD::Display & out ); - - /*----------------------------------------------------------------------*/ - - public: - - /// Constructor. - /** - \param p Parameters -- \b IN. - */ - Quad_Model_Search ( NOMAD::Parameters & p ) - : NOMAD::Search ( p , NOMAD::MODEL_SEARCH ) {} - /// Destructor. - virtual ~Quad_Model_Search ( void ) {} - - /// Reset. - virtual void reset ( void ) {} - - /// The quadratic model search. - /** - Based on quadratic regression/MFN interpolation models. - \param mads NOMAD::Mads object invoking this search -- \b IN/OUT. - \param nb_search_pts Number of generated search points -- \b OUT. - \param stop Stop flag -- \b IN/OUT. - \param stop_reason Stop reason -- \b OUT. - \param success Type of success -- \b OUT. - \param count_search Count or not the search -- \b OUT. - \param new_feas_inc New feasible incumbent -- \b IN/OUT. - \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. - */ - virtual void search ( NOMAD::Mads & mads , - int & nb_search_pts , - bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - bool & count_search , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc ); - //// Display stats. - /** - \param out The NOMAD::Display object -- \b IN. - */ - virtual void display ( const NOMAD::Display & out ) const - { - out << _all_searches_stats; - } - }; + /// Model search. + class Quad_Model_Search : public NOMAD::Search , private NOMAD::Uncopyable { + + private: + + NOMAD::Model_Stats _one_search_stats; ///< Stats for one search. + NOMAD::Model_Stats _all_searches_stats; ///< Stats for all searches. + + /// Model optimization. + /** + \param model The model -- \b IN. + \param xk The two model centers -- \b IN. + \param i_inc Model center index (\c 0 or \c 1 ) -- \b IN. + \param display_degree Display degree -- \b IN. + \param out The NOMAD::Display object -- \b IN. + \param xf Feasible solution \c xf -- \b OUT. + \param xi Infeasible solution \c xi -- \b OUT. + \param stop Stop flag -- \b OUT. + \param stop_reason Stop reason -- \b OUT. + */ + bool optimize_model ( const NOMAD::Quad_Model & model , + const NOMAD::Eval_Point ** xk , + int i_inc , + NOMAD::dd_type display_degree , + const NOMAD::Display & out , + NOMAD::Point & xf , + NOMAD::Point & xi , + bool & stop , + NOMAD::stop_type & stop_reason ); + + /// Project to mesh and create a trial point. + /** + \param ev_control The NOMAD::Evaluator_Control object -- \b IN. + \param x The point coordinates -- \b IN. + \param model The model -- \b IN. + \param signature Signature -- \b IN. + \param mesh_indices Mesh indic -- \b IN. + \param delta Mesh size parameter -- \b IN. + \param display_degree Display degree -- \b IN. + \param out The NOMAD::Display object -- \b IN. + */ + void create_trial_point ( NOMAD::Evaluator_Control & ev_control , + NOMAD::Point x , + const NOMAD::Quad_Model & model , + NOMAD::Signature & signature , + const NOMAD::Point & mesh_indices , + const NOMAD::Point & delta , + NOMAD::dd_type display_degree , + const NOMAD::Display & out ); + + /*----------------------------------------------------------------------*/ + + public: + + /// Constructor. + /** + \param p Parameters -- \b IN. + */ + Quad_Model_Search ( NOMAD::Parameters & p ) + : NOMAD::Search ( p , NOMAD::MODEL_SEARCH ) {} + + /// Destructor. + virtual ~Quad_Model_Search ( void ) {} + + /// Reset. + virtual void reset ( void ) {} + + /// The quadratic model search. + /** + Based on quadratic regression/MFN interpolation models. + \param mads NOMAD::Mads object invoking this search -- \b IN/OUT. + \param nb_search_pts Number of generated search points -- \b OUT. + \param stop Stop flag -- \b IN/OUT. + \param stop_reason Stop reason -- \b OUT. + \param success Type of success -- \b OUT. + \param count_search Count or not the search -- \b OUT. + \param new_feas_inc New feasible incumbent -- \b IN/OUT. + \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. + */ + virtual void search ( NOMAD::Mads & mads , + int & nb_search_pts , + bool & stop , + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + bool & count_search , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc ); + + + //// Display stats. + /** + \param out The NOMAD::Display object -- \b IN. + */ + virtual void display ( const NOMAD::Display & out ) const + { + out << _all_searches_stats; + } + }; } #endif diff --git a/src/RNG.cpp b/src/RNG.cpp index c37391f..6010f3e 100644 --- a/src/RNG.cpp +++ b/src/RNG.cpp @@ -1,14 +1,24 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ +/* */ +/* */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ /* C.P. 6079, Succ. Centre-ville, Montreal (Quebec) H3C 3A7 Canada */ @@ -56,34 +66,34 @@ uint32_t NOMAD::RNG::_z = z_def; void NOMAD::RNG::set_seed(int s) { - if( s<=INT_MAX && s>=0 ) - _s=s; - else + if( s<=INT_MAX && s>=0 ) + _s=s; + else throw NOMAD::Exception ( "RNG.cpp" , __LINE__ , "NOMAD::RNG::set_seed(): invalid seed. Seed should be in [0,INT_MAX]" ); - + reset_seed_to_default(); for ( int i=0 ; i<_s ; i++) - NOMAD::RNG::rand(); - - + NOMAD::RNG::rand(); + + } uint32_t NOMAD::RNG::rand ( void ) { // http://madrabbit.org/~ray/code/xorshf96.c //period 2^96-1 - - uint32_t t; - _x ^= _x << 16; - _x ^= _x >> 5; - _x ^= _x << 1; - - t = _x; - _x = _y; - _y = _z; - _z = t ^ _x ^ _y; - - return _z; + + uint32_t t; + _x ^= _x << 16; + _x ^= _x >> 5; + _x ^= _x << 1; + + t = _x; + _x = _y; + _y = _z; + _z = t ^ _x ^ _y; + + return _z; } @@ -109,9 +119,9 @@ double NOMAD::RNG::normal_rand( double mean , double var ) } double NOMAD::RNG::normal_rand_mean_0 ( double Var , int Nsample ) { - double sum = 0.0; - double a=pow( 3.0*Var,0.5 ); - for ( int i=0 ; i<Nsample ; i++ ) - sum+=NOMAD::RNG::rand(-a,a); - return sum / pow( Nsample,0.5 ); + double sum = 0.0; + double a=pow( 3.0*Var,0.5 ); + for ( int i=0 ; i<Nsample ; i++ ) + sum+=NOMAD::RNG::rand(-a,a); + return sum / pow( Nsample,0.5 ); } diff --git a/src/RNG.hpp b/src/RNG.hpp index c0f8714..bc3e897 100644 --- a/src/RNG.hpp +++ b/src/RNG.hpp @@ -1,14 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ +/* */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -31,10 +40,11 @@ /* */ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ + /** \file RNG.hpp \brief Custom class for random number generator - \author Christophe Tribes and Sebastien Le Digabel + \author Christophe Tribes and Sebastien Le Digabel \date 2011-09-28 \see RNG.cpp */ @@ -48,21 +58,21 @@ using namespace std; namespace NOMAD { - + /// Class for random number generator - /** + /** This class is used to set a seed for the random number generator and get a random integer or a random double between two values. - */ - class RNG { - - public: + */ + class RNG { - /// Get current seed - /* - /return An integer in [0,UINT32_MAX]. - */ + public: + + /// Get current seed + /* + /return An integer in [0,UINT32_MAX]. + */ static int get_seed ( void ) { return static_cast<int>(_s); @@ -76,56 +86,56 @@ namespace NOMAD { _z=z_def; } - /// Set seed - /* - /param s The seed -- \b IN. - */ - static void set_seed(int s); - - - /// Get a random integer as uint32 - /** This function serves to obtain a random number \c - /return An integer in the interval [0,UINT32_MAX]. - */ - static uint32_t rand(); + /// Set seed + /* + /param s The seed -- \b IN. + */ + static void set_seed(int s); + + + /// Get a random integer as uint32 + /** This function serves to obtain a random number \c + /return An integer in the interval [0,UINT32_MAX]. + */ + static uint32_t rand(); - - /// Get a random number having a normal distribution as double - /* + + /// Get a random number having a normal distribution as double + /* /param a Lower bound -- \b IN. /param b Upper bound -- \b IN. /return A double in the interval [a,b]. - */ - static double rand(double a, double b) + */ + static double rand(double a, double b) { return a+((b-a)*NOMAD::RNG::rand())/UINT32_MAX; } - - /// Get a random number approaching a normal distribution (N(0,Var)) as double - // A series of Nsample random numbers Xi in the interval [-sqrt(3*Var);+sqrt(3*Var)] is used -> E[Xi]=0, Var(Xi)=var - // see http://en.wikipedia.org/wiki/Central_limit_theorem - /* - /param Nsample Number of samples for averaging -- \b IN. - /param Var Variance of the target normal distribution -- \b IN. + + /// Get a random number approaching a normal distribution (N(0,Var)) as double + // A series of Nsample random numbers Xi in the interval [-sqrt(3*Var);+sqrt(3*Var)] is used -> E[Xi]=0, Var(Xi)=var + // see http://en.wikipedia.org/wiki/Central_limit_theorem + /* + /param Nsample Number of samples for averaging -- \b IN. + /param Var Variance of the target normal distribution -- \b IN. /return A double in the interval [-sqrt(3*Var);+sqrt(3*Var)]. - */ - static double normal_rand_mean_0( double Var=1 , int Nsample=12 ) ; + */ + static double normal_rand_mean_0( double Var=1 , int Nsample=12 ) ; /// Get a random number approaching a normal distribution ( N(Mean,Var) ) as double - /* - /param Mean Mean of the target normal distribution -- \b IN. - /param Var Variance of the target normal distribution -- \b IN. + /* + /param Mean Mean of the target normal distribution -- \b IN. + /param Var Variance of the target normal distribution -- \b IN. /return A random number. - */ + */ static double normal_rand( double Mean=0 , double Var=1 ) ; - - private: + + private: static uint32_t x_def,y_def,z_def,_x,_y,_z; ///< Default parameter value for the random number generator (_s used as the seed). static int _s; - }; + }; } diff --git a/src/Random_Pickup.cpp b/src/Random_Pickup.cpp index 1770499..1c26f83 100644 --- a/src/Random_Pickup.cpp +++ b/src/Random_Pickup.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,24 +41,24 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Random_Pickup.cpp - \brief Class for randomly pick up integers (implementation) - \author Sebastien Le Digabel - \date 2010-04-07 - \see Random_Pickup.hpp -*/ + \file Random_Pickup.cpp + \brief Class for randomly pick up integers (implementation) + \author Sebastien Le Digabel + \date 2010-04-07 + \see Random_Pickup.hpp + */ #include "Random_Pickup.hpp" /*---------------------------------------------------------*/ /* constructor */ /*---------------------------------------------------------*/ NOMAD::Random_Pickup::Random_Pickup ( int n ) - : _n0 ( n ) , - _n ( n ) , - _elts ( new int[n] ) +: _n0 ( n ) , +_n ( n ) , +_elts ( new int[n] ) { - for ( int i = 0 ; i < n ; ++i ) - _elts[i] = i; + for ( int i = 0 ; i < n ; ++i ) + _elts[i] = i; } /*---------------------------------------------------------*/ @@ -59,9 +66,9 @@ NOMAD::Random_Pickup::Random_Pickup ( int n ) /*---------------------------------------------------------*/ void NOMAD::Random_Pickup::reset ( void ) { - _n = _n0; - for ( int i = 0 ; i < _n ; ++i ) - _elts[i] = i; + _n = _n0; + for ( int i = 0 ; i < _n ; ++i ) + _elts[i] = i; } /*---------------------------------------------------------*/ @@ -69,17 +76,18 @@ void NOMAD::Random_Pickup::reset ( void ) /*---------------------------------------------------------*/ int NOMAD::Random_Pickup::pickup ( void ) { - if ( _n == 0 ) - return 0; - int ind = NOMAD::RNG::rand()%_n; - int tmp = _elts[ind]; - if ( ind < _n - 1 ) { - _elts[ind ] = _elts[_n-1]; - _elts[_n-1] = tmp; - } - --_n; - - return tmp; + if ( _n == 0 ) + return 0; + int ind = NOMAD::RNG::rand()%_n; + int tmp = _elts[ind]; + if ( ind < _n - 1 ) + { + _elts[ind ] = _elts[_n-1]; + _elts[_n-1] = tmp; + } + --_n; + + return tmp; } /*---------------------------------------------------------*/ @@ -87,6 +95,6 @@ int NOMAD::Random_Pickup::pickup ( void ) /*---------------------------------------------------------*/ void NOMAD::Random_Pickup::cancel_last_pickup ( void ) { - if ( _n < _n0 ) - ++_n; + if ( _n < _n0 ) + ++_n; } diff --git a/src/Random_Pickup.hpp b/src/Random_Pickup.hpp index b111a86..859d61b 100644 --- a/src/Random_Pickup.hpp +++ b/src/Random_Pickup.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ diff --git a/src/SMesh.cpp b/src/SMesh.cpp index 0874614..3fefbfc 100644 --- a/src/SMesh.cpp +++ b/src/SMesh.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file SMesh.cpp - \brief Class for the MADS mesh (implementation) - \author Sebastien Le Digabel - \date 2010-04-06 - \see SMesh.hpp -*/ + \file SMesh.cpp + \brief Class for the MADS mesh (implementation) + \author Sebastien Le Digabel + \date 2010-04-06 + \see SMesh.hpp + */ #include "SMesh.hpp" @@ -47,50 +54,52 @@ /*-----------------------------------------------------------*/ /* update the mesh */ /*-----------------------------------------------------------*/ -void NOMAD::SMesh::update ( NOMAD::success_type success , const NOMAD::Direction *dir) // , const NOMAD::OrthogonalMesh * mesh ) +void NOMAD::SMesh::update ( NOMAD::success_type success , const NOMAD::Direction *dir) { - // defaults: - // full success: lk = lk - 1 - // failure : lk = lk + 1 - - - if ( success == NOMAD::FULL_SUCCESS ) + // defaults: + // full success: lk = lk - 1 + // failure : lk = lk + 1 + + + if ( success == NOMAD::FULL_SUCCESS ) { - _mesh_index -= _coarsening_step; - if ( _mesh_index < -NOMAD::L_LIMITS ) - _mesh_index = -NOMAD::L_LIMITS; - } - else if ( success == NOMAD::UNSUCCESSFUL ) - _mesh_index -= _refining_step; - - if ( _mesh_index > _max_mesh_index ) - _max_mesh_index = _mesh_index; - - - if ( _mesh_index < _min_mesh_index ) - _min_mesh_index = _mesh_index; + _mesh_index -= _coarsening_step; + if ( _mesh_index < -NOMAD::L_LIMITS ) + _mesh_index = -NOMAD::L_LIMITS; + } + else if ( success == NOMAD::UNSUCCESSFUL ) + _mesh_index -= _refining_step; + + if ( _mesh_index > _max_mesh_index ) + _max_mesh_index = _mesh_index; + + + if ( _mesh_index < _min_mesh_index ) + _min_mesh_index = _mesh_index; } /*-----------------------------------------------------------*/ /* Update the provided mesh indices (the Mesh is unchanged). */ /*-----------------------------------------------------------*/ -void NOMAD::SMesh::update ( NOMAD::success_type success , NOMAD::Point & mesh_indices, const NOMAD::Direction *dir ) const +void NOMAD::SMesh::update ( NOMAD::success_type success , + NOMAD::Point & mesh_indices, + const NOMAD::Direction *dir ) const { - - if ( mesh_indices.is_defined() ) - { - for (int i=0; i < mesh_indices.size() ; i++) - { - if ( success == NOMAD::FULL_SUCCESS ) - { - mesh_indices[i] -= _coarsening_step; - if ( mesh_indices[i] < -NOMAD::L_LIMITS ) - mesh_indices[i] = -NOMAD::L_LIMITS; - } - else if ( success == NOMAD::UNSUCCESSFUL ) - mesh_indices[i] -= _refining_step; - } - } + + if ( mesh_indices.is_defined() ) + { + for (int i=0; i < mesh_indices.size() ; i++) + { + if ( success == NOMAD::FULL_SUCCESS ) + { + mesh_indices[i] -= _coarsening_step; + if ( mesh_indices[i] < -NOMAD::L_LIMITS ) + mesh_indices[i] = -NOMAD::L_LIMITS; + } + else if ( success == NOMAD::UNSUCCESSFUL ) + mesh_indices[i] -= _refining_step; + } + } } @@ -99,15 +108,15 @@ void NOMAD::SMesh::update ( NOMAD::success_type success , NOMAD::Point & mesh_in /*-----------------------------------------------------------*/ void NOMAD::SMesh::set_mesh_indices ( const NOMAD::Point & r ) { - if (!r.is_defined()) - _mesh_index=0; - else - _mesh_index=r[0].NOMAD::Double::round(); - - if ( _mesh_index > _max_mesh_index ) - _max_mesh_index = _mesh_index; - if ( _mesh_index < _min_mesh_index ) - _min_mesh_index = _mesh_index; + if ( !r.is_defined() ) + _mesh_index=0; + else + _mesh_index=r[0].NOMAD::Double::round(); // Warning no need to check that the double will convert nicely to an int because mesh_index will range [-50;50] + + if ( _mesh_index > _max_mesh_index ) + _max_mesh_index = _mesh_index; + if ( _mesh_index < _min_mesh_index ) + _min_mesh_index = _mesh_index; } @@ -117,7 +126,9 @@ void NOMAD::SMesh::set_mesh_indices ( const NOMAD::Point & r ) /*-----------------------------------------------------------*/ void NOMAD::SMesh::set_limit_mesh_index ( int l ) { + _limit_mesh_index=l; + } @@ -127,24 +138,24 @@ void NOMAD::SMesh::set_limit_mesh_index ( int l ) /*-----------------------------------------------------------*/ void NOMAD::SMesh::display ( const NOMAD::Display & out ) const { - out << "n : " << get_n() << std::endl - << "mesh update basis : " << _update_basis << std::endl - << "mesh coarsening step: " << _coarsening_step << std::endl - << "mesh refining step : " << _refining_step << std::endl - << "initial mesh size : " - << "(" << _delta_0 << " )" << std::endl; - out << "minimal mesh size : "; - if ( _delta_min.is_defined() ) - out << "(" << _delta_min << " )" << std::endl; - else - out << "none"; - out << std::endl - << "minimal poll size : "; - if ( _Delta_min_is_defined ) - out << "(" << _Delta_min << " )" << std::endl; - else - out << "none"; - out << std::endl; + out << "n : " << get_n() << std::endl + << "mesh update basis : " << _update_basis << std::endl + << "mesh coarsening step: " << _coarsening_step << std::endl + << "mesh refining step : " << _refining_step << std::endl + << "initial mesh size : " + << "(" << _delta_0 << " )" << std::endl; + out << "minimal mesh size : "; + if ( _delta_min.is_defined() ) + out << "(" << _delta_min << " )" << std::endl; + else + out << "none"; + out << std::endl + << "minimal poll size : "; + if ( _Delta_min_is_defined ) + out << "(" << _Delta_min << " )" << std::endl; + else + out << "none"; + out << std::endl; } /*----------------------------------------------------------*/ @@ -152,31 +163,31 @@ void NOMAD::SMesh::display ( const NOMAD::Display & out ) const /* and on the minimal mesh size */ /*----------------------------------------------------------*/ void NOMAD::SMesh::check_min_mesh_sizes ( bool & stop , - NOMAD::stop_type & stop_reason ) const + NOMAD::stop_type & stop_reason ) const { - if ( stop ) - return; - - // 1. mesh index tests: - if ( abs ( _mesh_index ) > NOMAD::L_LIMITS ) - { - stop = true; - stop_reason = NOMAD::L_LIMITS_REACHED; - } - - // 2. delta_k^p (poll size) tests: - if ( check_min_poll_size_criterion ( ) ) - { - stop = true; - stop_reason = NOMAD::DELTA_P_MIN_REACHED; - } - - // 3. delta_k^m (mesh size) tests: - if ( check_min_mesh_size_criterion ( ) ) - { - stop = true; - stop_reason = NOMAD::DELTA_M_MIN_REACHED; - } + if ( stop ) + return; + + // 1. mesh index tests: + if ( abs ( _mesh_index ) > NOMAD::L_LIMITS ) + { + stop = true; + stop_reason = NOMAD::L_LIMITS_REACHED; + } + + // 2. delta_k^p (poll size) tests: + if ( check_min_poll_size_criterion ( ) ) + { + stop = true; + stop_reason = NOMAD::DELTA_P_MIN_REACHED; + } + + // 3. delta_k^m (mesh size) tests: + if ( check_min_mesh_size_criterion ( ) ) + { + stop = true; + stop_reason = NOMAD::DELTA_M_MIN_REACHED; + } } /*-----------------------------------------------------------*/ @@ -184,10 +195,10 @@ void NOMAD::SMesh::check_min_mesh_sizes ( bool & stop , /*-----------------------------------------------------------*/ bool NOMAD::SMesh::check_min_poll_size_criterion ( ) const { - if ( !_Delta_min_is_defined ) - return false; - NOMAD::Point Delta; - return get_Delta ( Delta ); + if ( !_Delta_min_is_defined ) + return false; + NOMAD::Point Delta; + return get_Delta ( Delta ); } /*-----------------------------------------------------------*/ @@ -195,10 +206,10 @@ bool NOMAD::SMesh::check_min_poll_size_criterion ( ) const /*-----------------------------------------------------------*/ bool NOMAD::SMesh::check_min_mesh_size_criterion ( ) const { - if ( !_delta_min.is_defined() ) - return false; - NOMAD::Point delta; - return get_delta ( delta ); + if ( !_delta_min.is_defined() ) + return false; + NOMAD::Point delta; + return get_delta ( delta ); } /*----------------------------------------------------------------*/ @@ -210,29 +221,28 @@ bool NOMAD::SMesh::check_min_mesh_size_criterion ( ) const /*----------------------------------------------------------------*/ bool NOMAD::SMesh::get_delta ( NOMAD::Point & delta ) const { - delta.reset ( _n ); + delta.reset ( _n ); bool delta_min_is_defined=_delta_min.is_defined(); - - - // power_of_tau = tau^{ max{0,l0} - max{0,lk} }: - NOMAD::Double power_of_tau + + // power_of_tau = tau^{ max{0,l0} - max{0,lk} }: + NOMAD::Double power_of_tau = pow ( _update_basis.value() , - ( (_initial_mesh_index > 0) ? _initial_mesh_index : 0) - - ( (_mesh_index > 0) ? _mesh_index : 0) ); - - bool stop = false; - - // delta^k = power_of_tau * delta^0: - for ( int i = 0 ; i < _n ; ++i ) - { - delta[i] = _delta_0[i] * power_of_tau; - if ( !stop && delta_min_is_defined && delta[i] < _delta_min[i] ) - stop = true; - - } - - return stop; + ( (_initial_mesh_index > 0) ? _initial_mesh_index : 0) - + ( (_mesh_index > 0) ? _mesh_index : 0) ); + + bool stop = false; + + // delta^k = power_of_tau * delta^0: + for ( int i = 0 ; i < _n ; ++i ) + { + delta[i] = _delta_0[i] * power_of_tau; + if ( !stop && delta_min_is_defined && delta[i] < _delta_min[i] ) + stop = true; + + } + + return stop; } /*----------------------------------------------------------------*/ @@ -249,7 +259,7 @@ NOMAD::Double NOMAD::SMesh::get_delta ( int i ) const ( (_initial_mesh_index > 0) ? _initial_mesh_index : 0) - ( (_mesh_index > 0) ? _mesh_index : 0) ); - + NOMAD::Double delta = _delta_0[i] * power_of_tau; return delta; @@ -261,20 +271,20 @@ NOMAD::Double NOMAD::SMesh::get_delta ( int i ) const /*----------------------------------------------------------------*/ NOMAD::Point NOMAD::SMesh::get_delta_max ( ) const { - - NOMAD::Point delta_max ( _n ); - - // power_of_tau = tau^{ max{0,l0} - max{0,lk} }: - NOMAD::Double power_of_tau + + NOMAD::Point delta_max ( _n ); + + // power_of_tau = tau^{ max{0,l0} - max{0,lk} }: + NOMAD::Double power_of_tau = pow ( _update_basis.value() , - ( (_initial_mesh_index > 0) ? _initial_mesh_index : 0) - - ( (_min_mesh_index > 0) ? _min_mesh_index : 0) ); - - // delta^k = power_of_tau * delta^0: - for ( int i = 0 ; i < _n ; ++i ) - delta_max[i] = _delta_0[i] * power_of_tau; - - return delta_max; + ( (_initial_mesh_index > 0) ? _initial_mesh_index : 0) - + ( (_min_mesh_index > 0) ? _min_mesh_index : 0) ); + + // delta^k = power_of_tau * delta^0: + for ( int i = 0 ; i < _n ; ++i ) + delta_max[i] = _delta_0[i] * power_of_tau; + + return delta_max; } @@ -284,32 +294,33 @@ NOMAD::Point NOMAD::SMesh::get_delta_max ( ) const /* = delta^0 \tau^{ell_0^+ - ell_k^+ + |ell_k|/2} */ /*-------------------------------------------------------------------*/ /* the function also returns true if all values are < Delta_min */ +/* (stopping criterion MIN_POLL_SIZE) */ /*-------------------------------------------------------------------*/ bool NOMAD::SMesh::get_Delta ( NOMAD::Point & Delta ) const { - - Delta.reset ( _n ); - - // power_of_tau = tau^{ max{0,l0} - max{0,lk} + |lk|/2}: - NOMAD::Double power_of_tau + + Delta.reset ( _n ); + + // power_of_tau = tau^{ max{0,l0} - max{0,lk} + |lk|/2}: + NOMAD::Double power_of_tau = pow ( _update_basis.value() , abs(_mesh_index) / 2.0 + - ( (_initial_mesh_index > 0) ? _initial_mesh_index : 0) - - ( (_mesh_index > 0) ? _mesh_index : 0) ); - - bool stop = true; - - // Delta^k = power_of_tau * Delta^0: - for ( int i = 0 ; i < _n ; ++i ) - { - Delta[i] = _Delta_0[i] * power_of_tau; - if ( !_Delta_min_is_complete || Delta[i] >= _Delta_min[i] ) - stop = false; - + ( (_initial_mesh_index > 0) ? _initial_mesh_index : 0) - + ( (_mesh_index > 0) ? _mesh_index : 0) ); + + bool stop = true; + + // Delta^k = power_of_tau * Delta^0: + for ( int i = 0 ; i < _n ; ++i ) + { + Delta[i] = _Delta_0[i] * power_of_tau; + if ( !_Delta_min_is_complete || Delta[i] >= _Delta_min[i] ) + stop = false; + if ( _Delta_min_is_defined && _Delta_min[i].is_defined() && Delta[i] < _Delta_min[i] ) Delta[i]=_Delta_min[i]; - } - - return stop; + } + + return stop; } /*-------------------------------------------------------------------*/ @@ -331,27 +342,30 @@ NOMAD::Double NOMAD::SMesh::get_Delta ( int i ) const NOMAD::Double Delta = _Delta_0[i] * power_of_tau; if ( _Delta_min_is_defined && _Delta_min[i].is_defined() && Delta < _Delta_min[i] ) - Delta=_Delta_min[i]; + Delta=_Delta_min[i]; return Delta; } -NOMAD::Double NOMAD::SMesh::scale_and_project(int i, const NOMAD::Double & l) const +NOMAD::Double NOMAD::SMesh::scale_and_project(int i, const NOMAD::Double & l, bool round_up ) const { - NOMAD::Double delta = get_delta ( i ); - NOMAD::Double Delta = get_Delta ( i ); - - - if ( delta.is_defined() && Delta.is_defined() && i <= _n) - { - NOMAD::Double d= Delta / delta * l; - return d.NOMAD::Double::round()*delta; - } - else - throw NOMAD::Exception ( "SMesh.cpp" , __LINE__ , - "Mesh scaling and projection cannot be performed!" ); - + NOMAD::Double delta = get_delta ( i ); + NOMAD::Double Delta = get_Delta ( i ); + + + if ( delta.is_defined() && Delta.is_defined() && i <= _n) + { + NOMAD::Double d= Delta / delta * l; + if ( ! round_up ) + return d.NOMAD::Double::round()*delta; + else + return d.NOMAD::Double::ceil()*delta; + } + else + throw NOMAD::Exception ( "SMesh.cpp" , __LINE__ , + "Mesh scaling and projection cannot be performed!" ); + } @@ -359,24 +373,24 @@ NOMAD::Double NOMAD::SMesh::scale_and_project(int i, const NOMAD::Double & l) co NOMAD::Point NOMAD::SMesh::get_mesh_ratio_if_success ( void ) const { - - NOMAD::Double power_of_tau + + NOMAD::Double power_of_tau = pow ( _update_basis.value() , - ( (_initial_mesh_index > 0) ? _initial_mesh_index : 0) - - ( (_mesh_index > 0) ? _mesh_index : 0) ); - - NOMAD::Double power_of_tau_if_success - = pow ( _update_basis.value() , - ( (_initial_mesh_index > 0) ? _initial_mesh_index : 0) - - ( (_mesh_index - _coarsening_step > 0) ? _mesh_index - _coarsening_step : 0) ); - - try - { - NOMAD::Double ratio_scalaire = power_of_tau_if_success/power_of_tau; - return NOMAD::Point( _n , ratio_scalaire ); - } - catch ( NOMAD::Double::Invalid_Value & ) - { - return NOMAD::Point( _n,-1 ); - } + ( (_initial_mesh_index > 0) ? _initial_mesh_index : 0) - + ( (_mesh_index > 0) ? _mesh_index : 0) ); + + NOMAD::Double power_of_tau_if_success + = pow ( _update_basis.value() , + ( (_initial_mesh_index > 0) ? _initial_mesh_index : 0) - + ( (_mesh_index - _coarsening_step > 0) ? _mesh_index - _coarsening_step : 0) ); + + try + { + NOMAD::Double ratio_scalaire = power_of_tau_if_success/power_of_tau; + return NOMAD::Point( _n , ratio_scalaire ); + } + catch ( NOMAD::Double::Invalid_Value & ) + { + return NOMAD::Point( _n,-1 ); + } } diff --git a/src/SMesh.hpp b/src/SMesh.hpp index 00f0211..ed18f21 100644 --- a/src/SMesh.hpp +++ b/src/SMesh.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -65,29 +72,29 @@ namespace NOMAD { (one value for each variable). The scaling is done once based on initial mesh size. - See the MADS papers for more details on the mesh. */ - - class SMesh : public NOMAD::OrthogonalMesh { - - private: - - int _initial_mesh_index; - int _mesh_index; - int _min_mesh_index; ///< Minimal value reached by the mesh index - int _max_mesh_index; ///< Maximal value reached by the mesh index - - /*--------------------------------------------------------------*/ - - /// Private affectation operator. - /** - \param m The right-hand side object -- \b IN. - */ - const SMesh & operator = ( const SMesh & m ); - - /// Check the minimal poll size criterion. - bool check_min_poll_size_criterion ( ) const; - - /// Check the minimal mesh size criterion. - bool check_min_mesh_size_criterion ( ) const; + + class SMesh : public NOMAD::OrthogonalMesh { + + private: + + int _initial_mesh_index; + int _mesh_index; + int _min_mesh_index; ///< Minimal value reached by the mesh index + int _max_mesh_index; ///< Maximal value reached by the mesh index + + /*--------------------------------------------------------------*/ + + /// Private affectation operator. + /** + \param m The right-hand side object -- \b IN. + */ + const SMesh & operator = ( const SMesh & m ); + + /// Check the minimal poll size criterion. + bool check_min_poll_size_criterion ( ) const; + + /// Check the minimal mesh size criterion. + bool check_min_mesh_size_criterion ( ) const; /// Access to the mesh size parameter delta^k. /** @@ -104,40 +111,42 @@ namespace NOMAD { */ NOMAD::Double get_Delta ( int i ) const ; - - - /*--------------------------------------------------------------*/ - - public: - - /// Constructor. - /** - \param delta_0 Initial mesh size delta_0 -- \b IN. - \param Delta_min Minimal poll size Delta_min (may be undefined) -- \b IN. - \param delta_min Minimal mesh size delta_min (may be undefined) -- \b IN. - \param mesh_update_basis Mesh update basis (tau), default=4 -- \b IN. - \param mesh_coarsening_step Mesh coarsening step (w+), default=1 -- \b IN. - \param mesh_refining_step Mesh refining step (w-), default=-1 -- \b IN. - \param initial_mesh_index Initial mesh index ell_0, default=0 -- \b IN. - \param limit_max_mesh_index Limit max of the mesh index, default=L_LIMITS -- \b IN. + + + /*--------------------------------------------------------------*/ + + public: + + /// Constructor. + /** + \param delta_0 Initial mesh size delta_0 -- \b IN. + \param Delta_min Minimal poll size Delta_min (may be undefined) -- \b IN. + \param delta_min Minimal mesh size delta_min (may be undefined) -- \b IN. + \param mesh_update_basis Mesh update basis (tau), default=4 -- \b IN. + \param mesh_coarsening_step Mesh coarsening step (w+), default=1 -- \b IN. + \param mesh_refining_step Mesh refining step (w-), default=-1 -- \b IN. + \param initial_mesh_index Initial mesh index ell_0, default=0 -- \b IN. + \param limit_max_mesh_index Limit max of the mesh index, default=L_LIMITS -- \b IN. \param fixed_variables Fixed variables -- \b IN. - */ - SMesh ( const NOMAD::Point & delta_0 , - const NOMAD::Point & Delta_min , - const NOMAD::Point & delta_min , + */ + SMesh ( const NOMAD::Point& delta_0 , + const NOMAD::Point & Delta_min , + const NOMAD::Point & delta_min , const NOMAD::Point & fixed_variables , - NOMAD::Double mesh_update_basis=4.0, - int mesh_coarsening_step=1, - int mesh_refining_step=-1, - int initial_mesh_index=0, + NOMAD::Double mesh_update_basis=4.0, + int mesh_coarsening_step=1, + int mesh_refining_step=-1, + int initial_mesh_index=0, int limit_max_mesh_index=NOMAD::L_LIMITS) - : NOMAD::OrthogonalMesh ( delta_0, - Delta_min, - delta_min, + : NOMAD::OrthogonalMesh ( false, + delta_0, + Delta_min, + delta_min, fixed_variables, - mesh_update_basis, - mesh_coarsening_step, - mesh_refining_step , + NOMAD::Point(), + mesh_update_basis, + mesh_coarsening_step, + mesh_refining_step , limit_max_mesh_index ), _initial_mesh_index ( initial_mesh_index ), _mesh_index ( _initial_mesh_index ), @@ -145,19 +154,19 @@ namespace NOMAD { _max_mesh_index ( initial_mesh_index ) {} - /// Copy constructor. - /** - \param m The copied object -- \b IN. - */ - SMesh ( const SMesh & m ) - : OrthogonalMesh(m) , - _initial_mesh_index ( m._initial_mesh_index ), - _mesh_index ( m._initial_mesh_index ), - _min_mesh_index( m._initial_mesh_index ), - _max_mesh_index ( m._initial_mesh_index ) {} - - /// Destructor. - virtual ~SMesh ( void ) + /// Copy constructor. + /** + \param m The copied object -- \b IN. + */ + SMesh ( const SMesh & m ) + : OrthogonalMesh(m) , + _initial_mesh_index ( m._initial_mesh_index ), + _mesh_index ( m._initial_mesh_index ), + _min_mesh_index( m._initial_mesh_index ), + _max_mesh_index ( m._initial_mesh_index ) {} + + /// Destructor. + virtual ~SMesh ( void ) { _delta_0.clear(); _Delta_0.clear(); @@ -165,145 +174,146 @@ namespace NOMAD { _Delta_min.clear(); } - - /// Access to the mesh index. - /** - \return A Point with the mesh index. - */ - const NOMAD::Point get_mesh_indices ( void ) const + + /// Access to the mesh index. + /** + \return A Point with the mesh index. + */ + const NOMAD::Point get_mesh_indices ( void ) const { return NOMAD::Point( 1 , NOMAD::Double(_mesh_index) ); } - /// Access to the min mesh index reached so far. - /** - \return A Point with the mesh index. - */ - const NOMAD::Point get_min_mesh_indices ( void ) const + /// Access to the min mesh index reached so far. + /** + \return A Point with the mesh index. + */ + const NOMAD::Point get_min_mesh_indices ( void ) const { return NOMAD::Point( 1 , NOMAD::Double(_min_mesh_index) ); } - - /// Access to the max mesh index reached so far. - /** - \return A Point with the mesh index. - */ - const NOMAD::Point get_max_mesh_indices ( void ) const + + /// Access to the max mesh index reached so far. + /** + \return A Point with the mesh index. + */ + const NOMAD::Point get_max_mesh_indices ( void ) const { return NOMAD::Point( 1 , NOMAD::Double(_max_mesh_index) ); } - - - /// Manually set the mesh index using a point. (set_mesh_indices for consistency with XMesh) - /** - \param r The mesh index provided as a point -- \b IN. - */ - void set_mesh_indices ( const NOMAD::Point & r ); - + + /// Manually set the mesh index using a point. (set_mesh_indices for consistency with XMesh) + /** + \param r The mesh index provided as a point -- \b IN. + */ + void set_mesh_indices ( const NOMAD::Point & r ); + + /// Manually set the limit mesh index used for termination criterion (max value for SMesh). - /** - \param l The limit mesh index for all coordinates -- \b IN. - */ - void set_limit_mesh_index ( int l ); - - - - /// Test if finest mesh so far. - /** - \return True if mesh index greater or equal to the maximal mesh index; False otherwise. - */ - bool is_finest(void) const {return _mesh_index >= _max_mesh_index; } - - - /// Access to the mesh ratios after a success - /** - \return A point with the ratio for each coordinate - */ - NOMAD::Point get_mesh_ratio_if_success( void ) const; - - - /// Update the provided mesh indices (the Mesh is unchanged). - /** - \param success Type of success of the iteration -- \b IN. - \param mesh_indices The mesh indices before and after the update -- \b IN/OUT. - \param dir The direction that is considered (opt) -- \b IN. - */ - void update ( NOMAD::success_type success , NOMAD::Point & mesh_indices, const NOMAD::Direction *dir=NULL ) const ; - - - /// Update the Mesh. - /** - \param success Type of success of the iteration -- \b IN. - \param dir The direction that is considered (opt) -- \b IN. - */ - void update ( NOMAD::success_type success , const NOMAD::Direction *dir=NULL); - - - /// Reset the mesh to its original size (mesh indices). - void reset ( void ) + /** + \param l The limit mesh index for all coordinates -- \b IN. + */ + void set_limit_mesh_index ( int l ); + + + + /// Test if finest mesh so far. + /** + \return True if mesh index greater or equal to the maximal mesh index; False otherwise. + */ + bool is_finest(void) const {return _mesh_index >= _max_mesh_index; } + + + /// Access to the mesh ratios after a success + /** + \return A point with the ratio for each coordinate + */ + NOMAD::Point get_mesh_ratio_if_success( void ) const; + + + /// Update the provided mesh indices (the Mesh is unchanged). + /** + \param success Type of success of the iteration -- \b IN. + \param mesh_indices The mesh indices before and after the update -- \b IN/OUT. + \param dir The direction that is considered (opt) -- \b IN. + */ + void update ( NOMAD::success_type success , NOMAD::Point & mesh_indices, const NOMAD::Direction *dir=NULL ) const ; + + + /// Update the Mesh. + /** + \param success Type of success of the iteration -- \b IN. + \param dir The direction that is considered (opt) -- \b IN. + */ + void update ( NOMAD::success_type success , const NOMAD::Direction *dir=NULL); + + + /// Reset the mesh to its original size (mesh indices). + void reset ( void ) { set_mesh_indices( NOMAD::Point(1,NOMAD::Double(_initial_mesh_index))) ; - _min_mesh_index=_initial_mesh_index ; - _max_mesh_index=_initial_mesh_index; + _min_mesh_index=_initial_mesh_index ; + _max_mesh_index=_initial_mesh_index; } - - /// Access to the mesh size parameter delta^k. - /** - \param delta The mesh size parameter delta^k -- \b OUT. - \return A boolean equal to \c true if all values are - strictly inferior than the associated minimal - mesh size delta_min - (stopping criterion MIN_MESH_SIZE). - */ - virtual bool get_delta ( NOMAD::Point & delta ) const ; - - + + /// Access to the mesh size parameter delta^k. + /** + \param delta The mesh size parameter delta^k -- \b OUT. + \return A boolean equal to \c true if all values are + strictly inferior than the associated minimal + mesh size delta_min + (stopping criterion MIN_MESH_SIZE). + */ + virtual bool get_delta ( NOMAD::Point & delta ) const ; - /// Access to the larget mesh size so far. - /** - \return delta_max The largest mesh size reached so far -- \b OUT. - */ + + + /// Access to the larget mesh size so far. + /** + \return delta_max The largest mesh size reached so far -- \b OUT. + */ NOMAD::Point get_delta_max ( void ) const ; - - /// Access to the poll size parameter Delta^k. - /** - \param Delta The poll size parameter Delta^k -- \b OUT. - \return A boolean equal to \c true if all values are - strictly inferior than the associated minimal - mesh size Delta_min - (stopping criterion MIN_POLL_SIZE). - */ - virtual bool get_Delta ( NOMAD::Point & Delta ) const ; - - /// Check the stopping conditions on the minimal poll and mesh sizes. - /** - \param stop Stop flag -- \b IN/OUT. - \param stop_reason Stop reason -- \b OUT. - */ - void check_min_mesh_sizes ( bool & stop , + /// Access to the poll size parameter Delta^k. + /** + \param Delta The poll size parameter Delta^k -- \b OUT. + \return A boolean equal to \c true if all values are + strictly inferior than the associated minimal + mesh size Delta_min + (stopping criterion MIN_POLL_SIZE). + */ + virtual bool get_Delta ( NOMAD::Point & Delta ) const ; + + + /// Check the stopping conditions on the minimal poll and mesh sizes. + /** + \param stop Stop flag -- \b IN/OUT. + \param stop_reason Stop reason -- \b OUT. + */ + void check_min_mesh_sizes ( bool & stop , NOMAD::stop_type & stop_reason ) const; - /// Display. - /** - \param out The NOMAD::Display object -- \b IN. - */ - void display ( const NOMAD::Display & out ) const; - - - /// Scale and project the ith component of a vector on the mesh - /** - \param i The vector component number -- \b IN. - \param l The vector component value -- \b IN. - \return The ith component of a vector after mesh scaling and projection - */ - NOMAD::Double scale_and_project(int i, const NOMAD::Double & l) const ; - - - }; + /// Display. + /** + \param out The NOMAD::Display object -- \b IN. + */ + void display ( const NOMAD::Display & out ) const; + + + /// Scale and project the ith component of a vector on the mesh + /** + \param i The vector component number -- \b IN. + \param l The vector component value -- \b IN. + \param round_up Flag for rounding up -- \b IN. + \return The ith component of a vector after mesh scaling and projection + */ + NOMAD::Double scale_and_project(int i, const NOMAD::Double & l, bool round_up ) const ; + + + }; } #endif diff --git a/src/Search.hpp b/src/Search.hpp index a7b6b2e..034aed1 100644 --- a/src/Search.hpp +++ b/src/Search.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,92 +41,93 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Search.hpp - \brief Generic class for search strategies (headers) - \author Sebastien Le Digabel - \date 2010-04-08 -*/ + \file Search.hpp + \brief Generic class for search strategies (headers) + \author Sebastien Le Digabel + \date 2010-04-08 + */ #ifndef __SEARCH__ #define __SEARCH__ #include "Evaluator_Control.hpp" namespace NOMAD { - - // Forward declarations. - class Mads; - - /// Generic class for search strategies. - /** - This is an abstract class (it is not possible to create NOMAD::Search objects). - */ - class Search { - - protected: - - NOMAD::Parameters & _p; ///< Parameters. - NOMAD::search_type _type; ///< Search type. - - public: - - /// Constructor. + + // Forward declarations. + class Mads; + + /// Generic class for search strategies. /** - \param p Parameters -- \b IN. - \param t Search type -- \b IN. - */ - Search ( NOMAD::Parameters & p , - NOMAD::search_type t ) - : _p ( p ) , - _type ( t ) {} - - /// Destructor. - virtual ~Search ( void ) {} - - /// The search. - /** - - Has to be implemented by every NOMAD::Search subclass. - - Pure virtual method. - \param mads NOMAD::Mads object invoking this search -- \b IN/OUT. - \param nb_search_pts Number of generated search points -- \b OUT. - \param stop Stop flag -- \b IN/OUT. - \param stop_reason Stop reason -- \b OUT. - \param success Type of success -- \b OUT. - \param count_search Count or not the search -- \b OUT. - \param new_feas_inc New feasible incumbent -- \b IN/OUT. - \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. - */ - virtual void search - ( NOMAD::Mads & mads , - int & nb_search_pts , - bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - bool & count_search , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc ) = 0; - - /// Reset. - virtual void reset ( void ) {} - - /// Display. + This is an abstract class (it is not possible to create NOMAD::Search objects). + */ + class Search { + + protected: + + NOMAD::Parameters & _p; ///< Parameters. + NOMAD::search_type _type; ///< Search type. + + public: + + /// Constructor. + /** + \param p Parameters -- \b IN. + \param t Search type -- \b IN. + */ + Search ( NOMAD::Parameters & p , + NOMAD::search_type t ) + : _p ( p ) , + _type ( t ) {} + + /// Destructor. + virtual ~Search ( void ) {} + + /// The search. + /** + - Has to be implemented by every NOMAD::Search subclass. + - Pure virtual method. + \param mads NOMAD::Mads object invoking this search -- \b IN/OUT. + \param nb_search_pts Number of generated search points -- \b OUT. + \param stop Stop flag -- \b IN/OUT. + \param stop_reason Stop reason -- \b OUT. + \param success Type of success -- \b OUT. + \param count_search Count or not the search -- \b OUT. + \param new_feas_inc New feasible incumbent -- \b IN/OUT. + \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. + */ + virtual void search + ( NOMAD::Mads & mads , + int & nb_search_pts , + bool & stop , + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + bool & count_search , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc ) = 0; + + /// Reset. + virtual void reset ( void ) {} + + /// Display. + /** + \param out The NOMAD::Display object -- \b IN. + */ + virtual void display ( const NOMAD::Display & out ) const {} + + }; + + /// Display a NOMAD::Search object. /** - \param out The NOMAD::Display object -- \b IN. - */ - virtual void display ( const NOMAD::Display & out ) const {} - - }; - - /// Display a NOMAD::Search object. - /** \param out The NOMAD::Display object -- \b IN. \param s The NOMAD::Search object to be displayed -- \b IN. \return The NOMAD::Display object. - */ - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::Search & s ) { - s.display ( out ); - return out; - } - + */ + inline const NOMAD::Display & operator << ( const NOMAD::Display & out , + const NOMAD::Search & s ) + { + s.display ( out ); + return out; + } + } #endif diff --git a/src/Set_Element.hpp b/src/Set_Element.hpp index 092346a..510dcf7 100644 --- a/src/Set_Element.hpp +++ b/src/Set_Element.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,132 +41,132 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Set_Element.hpp - \brief Element of a set (headers) - \author Sebastien Le Digabel - \date 2010-04-12 -*/ + \file Set_Element.hpp + \brief Element of a set (headers) + \author Sebastien Le Digabel + \date 2010-04-12 + */ #ifndef __SET_ELEMENT__ #define __SET_ELEMENT__ namespace NOMAD { - - // forward declarations: - class Double; - class Eval_Point; - - /// Generic class for elements of a \c std::set. - /** + + // forward declarations: + class Double; + class Eval_Point; + + /// Generic class for elements of a \c std::set. + /** This is an abstract class (it is not possible to create NOMAD::Set_Element objects). - */ - template <class T> - class Set_Element { - - private: - + */ + template <class T> + class Set_Element { + + private: + #ifdef MEMORY_DEBUG - static int _cardinality; ///< Number of NOMAD::Set_Element objects in memory. - static int _max_cardinality; ///< Max number of NOMAd::Set_Element objects in memory. + static int _cardinality; ///< Number of NOMAD::Set_Element objects in memory. + static int _max_cardinality; ///< Max number of NOMAd::Set_Element objects in memory. #endif - - const T * _el; ///< A pointer to the element. - - /// Affectation operator. - /** - \param se The right-hand side object -- \b IN. - */ - Set_Element & operator = ( const Set_Element & se ); - - /// Copy constructor. - /** - \param se The copied object -- \b IN. - */ - Set_Element ( const Set_Element & se ); - - public: - - /// Constructor. - /** - \param el A pointer on the element -- \b IN. - */ - explicit Set_Element ( const T * el ) : _el ( el ) - { + + const T * _el; ///< A pointer to the element. + + /// Affectation operator. + /** + \param se The right-hand side object -- \b IN. + */ + Set_Element & operator = ( const Set_Element & se ); + + /// Copy constructor. + /** + \param se The copied object -- \b IN. + */ + Set_Element ( const Set_Element & se ); + + public: + + /// Constructor. + /** + \param el A pointer on the element -- \b IN. + */ + explicit Set_Element ( const T * el ) : _el ( el ) + { #ifdef MEMORY_DEBUG - ++Set_Element::_cardinality; - if ( Set_Element::_cardinality > Set_Element::_max_cardinality ) - ++Set_Element::_max_cardinality; + ++Set_Element::_cardinality; + if ( Set_Element::_cardinality > Set_Element::_max_cardinality ) + ++Set_Element::_max_cardinality; #endif - } - - /// Destructor. - virtual ~Set_Element ( void ) - { + } + + /// Destructor. + virtual ~Set_Element ( void ) + { #ifdef MEMORY_DEBUG - --Set_Element::_cardinality; + --Set_Element::_cardinality; #endif - } - - /// Specific NOMAD::Priority_Eval_Point elements of comparison. - /** - - Only NOMAD::Priority_Eval_Point::get_priority_criteria() does something. - - \see Priority_Eval_Point.hpp . - \param c1 A real -- \b IN. - \param c2 A real -- \b IN. - \param c3 A real -- \b IN. - \param c4 A real -- \b IN. - \param c5 A real -- \b IN. - \param c6 A real -- \b IN. - */ - virtual void get_priority_criteria ( NOMAD::Double & c1 , - NOMAD::Double & c2 , - NOMAD::Double & c3 , - NOMAD::Double & c4 , - NOMAD::Double & c5 , - NOMAD::Double & c6 ) const {} - /// Comparison operator. - /** - - Has to be implemented by every NOMAD::Set_Element subclass. - - Pure virtual method. - \param se The right-hand side object -- \b IN. - */ - virtual bool operator < ( const Set_Element & se ) const = 0; - - /// Access to the element. - /** - \return A pointer to the element. - */ - const T * get_element ( void ) const { return _el; } - - /// Set an element. - /** - \param el A pointer to the element -- \b IN. - */ - void set_element ( const T * el ) { _el = el; } - + } + + /// Specific NOMAD::Priority_Eval_Point elements of comparison. + /** + - Only NOMAD::Priority_Eval_Point::get_priority_criteria() does something. + - \see Priority_Eval_Point.hpp . + \param c1 A real -- \b IN. + \param c2 A real -- \b IN. + \param c3 A real -- \b IN. + \param c4 A real -- \b IN. + \param c5 A real -- \b IN. + \param c6 A real -- \b IN. + */ + virtual void get_priority_criteria ( NOMAD::Double & c1 , + NOMAD::Double & c2 , + NOMAD::Double & c3 , + NOMAD::Double & c4 , + NOMAD::Double & c5 , + NOMAD::Double & c6 ) const {} + /// Comparison operator. + /** + - Has to be implemented by every NOMAD::Set_Element subclass. + - Pure virtual method. + \param se The right-hand side object -- \b IN. + */ + virtual bool operator < ( const Set_Element & se ) const = 0; + + /// Access to the element. + /** + \return A pointer to the element. + */ + const T * get_element ( void ) const { return _el; } + + /// Set an element. + /** + \param el A pointer to the element -- \b IN. + */ + void set_element ( const T * el ) { _el = el; } + #ifdef MEMORY_DEBUG - - /// Access to the number of NOMAD::Set_Element objects in memory. - /** - \return Number of NOMAD::Set_Element objects in memory. - */ - static int get_cardinality ( void ) { return Set_Element::_cardinality; } - - /// Access to the max number of NOMAD::Set_Element objects in memory. - /** - \return Max number of NOMAD::Set_Element objects in memory. - */ - static int get_max_cardinality ( void ) { return Set_Element::_max_cardinality; } - + + /// Access to the number of NOMAD::Set_Element objects in memory. + /** + \return Number of NOMAD::Set_Element objects in memory. + */ + static int get_cardinality ( void ) { return Set_Element::_cardinality; } + + /// Access to the max number of NOMAD::Set_Element objects in memory. + /** + \return Max number of NOMAD::Set_Element objects in memory. + */ + static int get_max_cardinality ( void ) { return Set_Element::_max_cardinality; } + #endif - }; - + }; + #ifdef MEMORY_DEBUG - - /// Initialization of _cardinality. - template<class T> int NOMAD::Set_Element<T>::_cardinality = 0; - - /// Initialization of _max_cardinality. - template<class T> int NOMAD::Set_Element<T>::_max_cardinality = 0; + + /// Initialization of _cardinality. + template<class T> int NOMAD::Set_Element<T>::_cardinality = 0; + + /// Initialization of _max_cardinality. + template<class T> int NOMAD::Set_Element<T>::_max_cardinality = 0; #endif } diff --git a/src/Signature.cpp b/src/Signature.cpp index cba5d26..e2c9288 100644 --- a/src/Signature.cpp +++ b/src/Signature.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -57,49 +64,58 @@ bool NOMAD::Signature::_warning_has_been_displayed=false; /*--------------------------------------------------*/ /* constructor 1 */ /*--------------------------------------------------*/ -NOMAD::Signature::Signature -( int n , - const std::vector<NOMAD::bb_input_type> & input_types , - const NOMAD::Point & lb , - const NOMAD::Point & ub , - bool use_smesh , - bool anisotropic_mesh , - const NOMAD::Point & initial_poll_size , - const NOMAD::Point & min_poll_size , - const NOMAD::Point & min_mesh_size , - NOMAD::Double & mesh_update_basis , - NOMAD::Double & poll_update_basis , - int & mesh_coarsening_exponent, - int & mesh_refining_exponent, - int initial_mesh_index , - const NOMAD::Point & scaling , - const NOMAD::Point & fixed_variables , - const std::vector<bool> & periodic_variables, - std::set<NOMAD::Variable_Group*,NOMAD::VG_Comp> & var_groups , - const NOMAD::Display & out ) +NOMAD::Signature::Signature ( int n , + const std::vector<NOMAD::bb_input_type> & input_types , + const NOMAD::Point & lb , + const NOMAD::Point & ub , + const NOMAD::mesh_type & mesh_type , + bool anisotropic_mesh , + const NOMAD::Point & granularity , + const NOMAD::Point & initial_poll_size , + const NOMAD::Point & min_poll_size , + const NOMAD::Point & min_mesh_size , + NOMAD::Double & mesh_update_basis , + NOMAD::Double & poll_update_basis , + int & mesh_coarsening_exponent , + int & mesh_refining_exponent , + int initial_mesh_index , + int limit_mesh_index , + const NOMAD::Point & scaling , + const NOMAD::Point & fixed_variables , + const std::vector<bool> & periodic_variables , + std::set<NOMAD::Variable_Group*,NOMAD::VG_Comp> & var_groups , + const NOMAD::Display & out ) : _std ( false ) , _out ( out ) { - // Mesh index starts at 0 for an xmesh and decreases as the mesh size decreases + // Mesh index starts at 0 for xmesh and decreases as the mesh size decreases // The mesh index is reset to 0 as the mesh is reset. - if ( ! use_smesh ) - _mesh=new NOMAD::XMesh(anisotropic_mesh, + + if ( mesh_type == NOMAD::XMESH ) + _mesh=new NOMAD::XMesh( anisotropic_mesh, initial_poll_size, min_poll_size, min_mesh_size, fixed_variables, - poll_update_basis, // XMesh set poll update basis (default 2) + poll_update_basis, // XMesh sets poll update basis (default 2) mesh_coarsening_exponent, - mesh_refining_exponent); - else // Mesh index can be provided for isotropic smesh and increases as the mesh size decreases - _mesh=new NOMAD::SMesh(initial_poll_size, // new initial_poll_size ~ old initial mesh size + mesh_refining_exponent , + limit_mesh_index ); + + else if ( mesh_type == NOMAD::SMESH ) + // Mesh index can be provided for isotropic smesh and increases as the mesh size decreases + _mesh=new NOMAD::SMesh(initial_poll_size, // WARNING THIS IS NOT AN ERROR new initial_poll_size ~ old initial mesh size min_poll_size, min_mesh_size, fixed_variables, mesh_update_basis, // SMesh set mesh update basis (default 4) mesh_coarsening_exponent, mesh_refining_exponent, - initial_mesh_index ); + initial_mesh_index , + limit_mesh_index ); + else + throw NOMAD::Signature::Signature_Error ( "Signature.cpp" , __LINE__ , *this , + "NOMAD::Signature::Signature(): a valid mesh type must be given" ); init ( n , input_types , @@ -107,6 +123,7 @@ _out ( out ) ub , scaling , fixed_variables , + granularity , periodic_variables , var_groups ); @@ -120,29 +137,28 @@ _out ( out ) /*--------------------------------------------------*/ /* constructor 2 */ /*--------------------------------------------------*/ -NOMAD::Signature::Signature -( int n , - const std::vector<NOMAD::bb_input_type> & input_types , - const NOMAD::Point & initial_poll_size , - const NOMAD::Point & lb , - const NOMAD::Point & ub , - const std::set<NOMAD::direction_type> & direction_types , - const std::set<NOMAD::direction_type> & sec_poll_dir_types , - const NOMAD::Display & out ) -: _std ( false ) , +NOMAD::Signature::Signature ( int n , + const std::vector<NOMAD::bb_input_type> & input_types , + const NOMAD::Point & initial_poll_size , + const NOMAD::Point & lb , + const NOMAD::Point & ub , + const std::set<NOMAD::direction_type> & direction_types , + const std::set<NOMAD::direction_type> & sec_poll_dir_types , + const NOMAD::Display & out ) +: _std ( false ) , _out ( out ) { if ( static_cast<int> ( input_types.size() ) != n ) throw NOMAD::Signature::Signature_Error ( "Signature.cpp" , __LINE__ , *this , "NOMAD::Signature::Signature(): bad argument: input_types" ); - // Default mesh is isotropic xmesh + // For this constructor, the default mesh is isotropic xmesh //------------------------------------------ _mesh=new NOMAD::XMesh (false, initial_poll_size, NOMAD::Point(), NOMAD::Point(), - NOMAD::Point()); + NOMAD::Point(n)); // automatic creation of groups of variables: @@ -183,6 +199,7 @@ _out ( out ) ub , NOMAD::Point() , NOMAD::Point() , + NOMAD::Point() , std::vector<bool>() , var_groups ); @@ -208,10 +225,11 @@ NOMAD::Signature::Signature ( const NOMAD::Signature & s ) _ub ( s._ub ) , _scaling ( s._scaling ) , _fixed_variables ( s._fixed_variables ) , +_granularity ( s._granularity ) , _input_types ( s._input_types ) , _all_continuous ( s._all_continuous ) , -_has_categorical ( s._has_categorical ) , -_periodic_variables ( s._periodic_variables ) , +_has_categorical ( s._has_categorical ) , +_periodic_variables ( s._periodic_variables ) , _std ( false ) , _feas_success_dir ( s._feas_success_dir ) , _infeas_success_dir ( s._infeas_success_dir ) , @@ -219,10 +237,13 @@ _out (s._out) { - if (dynamic_cast<NOMAD::SMesh*> (s._mesh)) + if ( dynamic_cast<NOMAD::SMesh*> (s._mesh) ) _mesh = new NOMAD::SMesh (*(static_cast<NOMAD::SMesh*>(s._mesh))); - else + else if ( dynamic_cast<NOMAD::XMesh*> (s._mesh) ) _mesh = new NOMAD::XMesh (*(static_cast<NOMAD::XMesh*>(s._mesh))); + else + throw NOMAD::Signature::Signature_Error ( "Signature.cpp" , __LINE__ , *this , + "NOMAD::Signature::Signature(): copy constructor needs a valid mesh_type in the copied object" ); std::list<NOMAD::Variable_Group *>::const_iterator it , end = s._var_groups.end(); for ( it = s._var_groups.begin() ; it != end ; ++it ) @@ -263,6 +284,7 @@ void NOMAD::Signature::clear ( void ) _fixed_variables.clear(); _input_types.clear(); _periodic_variables.clear(); + _granularity.clear(); delete _mesh; } @@ -293,15 +315,15 @@ void NOMAD::Signature::set_infeas_success_dir ( const NOMAD::Direction & d ) /*--------------------------------------------------*/ /* initializations (private) */ /*--------------------------------------------------*/ -void NOMAD::Signature::init -( int n , - const std::vector<NOMAD::bb_input_type> & input_types , - const NOMAD::Point & lb , - const NOMAD::Point & ub , - const NOMAD::Point & scaling , - const NOMAD::Point & fixed_variables , - const std::vector<bool> & periodic_variables , - std::set<NOMAD::Variable_Group*,NOMAD::VG_Comp> & var_groups ) +void NOMAD::Signature::init ( int n , + const std::vector<NOMAD::bb_input_type> & input_types , + const NOMAD::Point & lb , + const NOMAD::Point & ub , + const NOMAD::Point & scaling , + const NOMAD::Point & fixed_variables , + const NOMAD::Point & granularity , + const std::vector<bool> & periodic_variables , + std::set<NOMAD::Variable_Group*,NOMAD::VG_Comp> & var_groups ) { // reset directions: _feas_success_dir.clear(); @@ -351,6 +373,14 @@ void NOMAD::Signature::init throw NOMAD::Signature::Signature_Error ( "Signature.cpp" , __LINE__ , *this , "NOMAD::Signature::init(): bad argument: fixed_variables" ); + if ( granularity.empty() ) + _granularity.reset(n,0) ; + else if ( granularity.size() == n ) + _granularity = granularity; + else + throw NOMAD::Signature::Signature_Error ( "Signature.cpp" , __LINE__ , *this , + "NOMAD::Signature::init(): bad argument: granularity" ); + // periodic variables: _periodic_variables = periodic_variables; if ( !_periodic_variables.empty() ) @@ -417,8 +447,6 @@ void NOMAD::Signature::init if ( _has_categorical ) break; } - - } // variable groups: @@ -436,8 +464,6 @@ void NOMAD::Signature::init "NOMAD::Signature::init(): incompatible variable group" ); } - - // if the indices in var_groups have been modified than var_groups is reconstructed to ensure proper ordering if ( mod ) { std::set<NOMAD::Variable_Group*,NOMAD::VG_Comp> tmp_var_groups; @@ -492,19 +518,51 @@ int NOMAD::Signature::get_nb_fixed_variables ( void ) const } +/*--------------------------------------------------------*/ +/* Access to the maximum number of points in the poll set */ +/*--------------------------------------------------------*/ +int NOMAD::Signature::get_max_size_poll_set ( void ) const +{ + int m=1; // There is at list one point (the poll center) + + NOMAD::Point delta=_mesh->get_delta(); + NOMAD::Point Delta=_mesh->get_Delta(); + + if ( delta.is_defined() && Delta.is_defined() ) + { + for (int i = 0 ; i < get_n() ; ++i ) + if ( ! _fixed_variables[i].is_defined() ) + { + NOMAD::Double r; + if ( _input_types[i] == NOMAD::CONTINUOUS ) + r=Delta[i]/delta[i]+1; + else if ( _input_types[i] == NOMAD::INTEGER ) + r=Delta[i]+1; + else if ( _input_types[i] == NOMAD::BINARY ) + r=2; + else if ( _input_types[i] == NOMAD::CATEGORICAL ) + r=1; + m= m * static_cast<int> ( r.floor().value() ); + } + } + + return m; +} + + /*--------------------------------------------------*/ /* reset */ /*--------------------------------------------------*/ -void NOMAD::Signature::reset -( int n , - const std::vector<NOMAD::bb_input_type> & input_types , - const NOMAD::Point & lb , - const NOMAD::Point & ub , - const NOMAD::Point & scaling , - const NOMAD::Point & fixed_variables , - const std::vector<bool> & periodic_variables , - std::set<NOMAD::Variable_Group*,NOMAD::VG_Comp> & var_groups ) +void NOMAD::Signature::reset ( int n , + const std::vector<NOMAD::bb_input_type> & input_types , + const NOMAD::Point & lb , + const NOMAD::Point & ub , + const NOMAD::Point & scaling , + const NOMAD::Point & fixed_variables , + const NOMAD::Point & granularity , + const std::vector<bool> & periodic_variables , + std::set<NOMAD::Variable_Group*,NOMAD::VG_Comp> & var_groups ) { reset_mesh(); reset_var_groups(); @@ -514,6 +572,7 @@ void NOMAD::Signature::reset ub , scaling , fixed_variables , + granularity , periodic_variables , var_groups ); } @@ -546,9 +605,9 @@ bool NOMAD::Signature::is_compatible ( const NOMAD::Point & x ) const /*-----------------------------------------------------*/ /* compute the directions */ /*-----------------------------------------------------*/ -void NOMAD::Signature::get_directions ( std::list<NOMAD::Direction> & dirs , - NOMAD::poll_type poll , - const NOMAD::Point & poll_center ) +void NOMAD::Signature::get_directions ( std::list<NOMAD::Direction> & dirs , + NOMAD::poll_type poll , + const NOMAD::Point & poll_center ) { NOMAD::Direction * pd; @@ -557,12 +616,12 @@ void NOMAD::Signature::get_directions ( std::list<NOMAD::Direction> & dirs , std::set<int>::const_iterator it_vi , end_vi; int n = get_n(); - NOMAD::Point delta=_mesh->get_delta ( ); - NOMAD::Point Delta=_mesh->get_Delta ( ); + NOMAD::Point delta = _mesh->get_delta ( ); + NOMAD::Point Delta = _mesh->get_Delta ( ); // Reset dir_group_index. - // For each signature, a variable_group has a unique set of directions generated and a unique dir_group_index starting by zero (-1 if no dirs) + // For each signature, a variable_group has a unique set of directions generated and a unique dir_group_index starting by zero (-1 if no dirs) _dir_group_index=-1; // loop on variable groups: @@ -577,8 +636,7 @@ void NOMAD::Signature::get_directions ( std::list<NOMAD::Direction> & dirs , (*it_vg)->get_directions ( dirs_nc , poll , *_mesh ); // _mesh of all directions - // scale with delta and resize the directions to size n; - // also round integer and binary variables: + // Scaling and projection on the mesh end_dir = dirs_nc.end(); if (static_cast<int>(dirs_nc.size())!=0) ++_dir_group_index; @@ -590,47 +648,179 @@ void NOMAD::Signature::get_directions ( std::list<NOMAD::Direction> & dirs , pd = &(*(--dirs.end())); end_vi = var_indexes.end(); - i = 0; + + i = 0; + NOMAD::Double normInfPoint=0; + for ( it_vi = var_indexes.begin() ; it_vi != end_vi ; ++it_vi ,++i ) + { + normInfPoint = std::max( normInfPoint.value() , std::fabs( (*it_dir)[i].value() ) ); + } - for ( it_vi = var_indexes.begin() ; it_vi != end_vi ; ++it_vi ,++i) + i = 0; + for ( it_vi = var_indexes.begin() ; it_vi != end_vi ; ++it_vi ,++i ) { - // Scaling and projection on the mesh - (*pd)[*it_vi] = _mesh->scale_and_project(*it_vi,(*it_dir)[i]); - - // integer variables: - if ( _input_types[*it_vi] == NOMAD::INTEGER ) + if ( _input_types[*it_vi] == NOMAD::BINARY ) { - if ( (*pd)[*it_vi] >= Delta[*it_vi]/3.0 ) - (*pd)[*it_vi] = (*pd)[*it_vi].ceil(); - else if ( (*pd)[*it_vi] <= -Delta[*it_vi]/3.0 ) - (*pd)[*it_vi] = (*pd)[*it_vi].floor(); + if ( (*it_dir)[i] < 0 ) + (*pd)[*it_vi] = 0.0; else - (*pd)[*it_vi] = (*pd)[*it_vi].round(); - } - - // binary variables: - else if ( _input_types[*it_vi] == NOMAD::BINARY ) - { - if ( (*pd)[*it_vi] != 0.0 ) (*pd)[*it_vi] = 1.0; } - // categorical variables: set direction=0: else if ( _input_types[*it_vi] == NOMAD::CATEGORICAL ) (*pd)[*it_vi] = 0.0; + else + { + { + + // Pickup 0, -1, 1 for the integer variable when Delta < 1.0 + if ( _input_types[*it_vi] == NOMAD::INTEGER && Delta[i] < 1.0 ) + { + if ( (*it_dir)[i] > 1.0/3.0 ) + (*pd)[*it_vi] = 1.0 ; + else if ( (*it_dir)[i] < -1.0/3.0 ) + (*pd)[*it_vi] = -1.0; + else + (*pd)[*it_vi] = 0.0; + + } + else + { + // Scaling and projection on the mesh + (*pd)[*it_vi] = _mesh->scale_and_project(*it_vi,(*it_dir)[i]); + + // round for integer variables: + if ( _input_types[*it_vi] == NOMAD::INTEGER ) + { + if ( (*pd)[*it_vi] >= Delta[*it_vi]/3.0 ) + (*pd)[*it_vi] = (*pd)[*it_vi].ceil(); + else if ( (*pd)[*it_vi] <= -Delta[*it_vi]/3.0 ) + (*pd)[*it_vi] = (*pd)[*it_vi].floor(); + else + (*pd)[*it_vi] = (*pd)[*it_vi].round(); + } + } + } + } + } } } } + +/*-----------------------------------------------------------------------------------*/ +/* compute one ORTHO 1 direction for a random group of variable */ +/*-----------------------------------------------------------------------------------*/ +void NOMAD::Signature::get_variable_group_direction ( NOMAD::Direction & dir , + const NOMAD::Point & poll_center ) +{ + + std::set<int>::const_iterator it_vi , end_vi; + + NOMAD::Point delta=_mesh->get_delta ( ); + NOMAD::Point Delta=_mesh->get_Delta ( ); + + + // Reset dir_group_index. + // For each signature, a variable_group has a unique set of directions generated and a unique dir_group_index starting by zero (-1 if no dirs) + _dir_group_index=1; + + size_t n_vg=_var_groups.size(); + int var_group_id=0; + + // Select a variable group; + if ( n_vg > 1 ) + var_group_id=NOMAD::RNG::rand() % n_vg; + + std::list<NOMAD::Variable_Group*>::const_iterator it_vg=_var_groups.begin(); + std::advance(it_vg, var_group_id); + + // scale with delta and resize the directions to size n; + // also round integer and binary variables: + const std::set<int> & var_indexes = (*it_vg)->get_var_indexes(); + NOMAD::Direction dir_nc ( static_cast<int>(var_indexes.size()) , 0.0 , NOMAD::ORTHO_1 ); + + // get a direction INSIDE a unit nc-sphere + if ( (*it_vg)->get_one_direction ( dir_nc ) ) // Get a direction ON a unit nc-sphere + { + + // Randomly scale the direction to be inside the unit nc-sphere + NOMAD::Double s = NOMAD::RNG::rand(0,1); + + // Make sure to have s!=0 + while ( s==0 ) + s=NOMAD::RNG::rand(0,1); + + NOMAD::Double normInfPoint=0; + for ( int i=0; i < static_cast<int>(var_indexes.size()) ; ++i ) + { + normInfPoint = std::max( normInfPoint.value() , std::fabs( (dir_nc)[i].value() ) ); + } + + end_vi = var_indexes.end(); + int i = 0; + for ( it_vi = var_indexes.begin() ; it_vi != end_vi ; ++it_vi ,++i) + { + + if ( _input_types[*it_vi] == NOMAD::BINARY ) + { + if ( dir_nc[i] < 0 ) + dir_nc[*it_vi] = 0.0; + else + dir_nc[*it_vi] = 1.0; + } + // categorical variables: set direction=0: + else if ( _input_types[*it_vi] == NOMAD::CATEGORICAL ) + dir[*it_vi] = 0.0; + else + { + + // Scaling and projection on the mesh ---> round up to prevent getting the current incumbent (0<s<=1) + { + + // Pickup 0, -1, 1 for the integer variable when Delta < 1.0 + if ( _input_types[*it_vi] == NOMAD::INTEGER && Delta[i] < 1.0 ) + { + if ( dir_nc[i] > 1.0/3.0 ) + dir[*it_vi] = 1.0 ; + else if ( dir_nc[i] < -1.0/3.0 ) + dir[*it_vi] = -1.0; + else + dir[*it_vi] = 0.0; + + } + else + { + + dir[*it_vi] = _mesh->scale_and_project( *it_vi, dir_nc[i] * s, true); + + // integer variables: + if ( _input_types[*it_vi] == NOMAD::INTEGER ) + { + if ( dir[*it_vi] >= Delta[*it_vi]/3.0 ) + dir[*it_vi] = dir[*it_vi].ceil(); + else if ( dir[*it_vi] <= -Delta[*it_vi]/3.0 ) + dir[*it_vi] = dir[*it_vi].floor(); + else + dir[*it_vi] = dir[*it_vi].round(); + } + } + } + } + } + } + +} + + /*----------------------------------------------------------------*/ /* get just one direction for a given mesh (used by VNS search) */ /*----------------------------------------------------------------*/ -void NOMAD::Signature::get_one_direction ( NOMAD::Direction & dir , int ell) const +void NOMAD::Signature::get_one_direction ( NOMAD::Direction & dir , int ell) { - int i; std::set<int>::const_iterator it_vi , end_vi; // get delta_m (mesh size parameter): @@ -641,10 +831,10 @@ void NOMAD::Signature::get_one_direction ( NOMAD::Direction & dir , int ell) con dir.reset ( n , 0.0 ); dir.set_type ( NOMAD::UNDEFINED_DIRECTION ); - // The mesh indices are modified and must be reset properly once the one direction is obtained - const NOMAD::Point old_mesh_indices=_mesh->get_mesh_indices(); - NOMAD::Point modified_mesh_indices(n,NOMAD::Double(ell)); - _mesh->set_mesh_indices(modified_mesh_indices); + // The mesh indices are modified and will be reset properly once the one direction is obtained + const NOMAD::Point old_mesh_indices = _mesh->get_mesh_indices(); + NOMAD::Point modified_mesh_indices( n , NOMAD::Double(ell) ); + _mesh->set_mesh_indices( modified_mesh_indices ); // loop on variable groups: std::list<NOMAD::Variable_Group*>::const_iterator end_vg = _var_groups.end() , it_vg; @@ -653,52 +843,75 @@ void NOMAD::Signature::get_one_direction ( NOMAD::Direction & dir , int ell) con const std::set<int> & var_indexes = (*it_vg)->get_var_indexes(); - // get the direction for the current group of variables: NOMAD::Direction dir_nc ( static_cast<int>(var_indexes.size()) , 0.0 , NOMAD::UNDEFINED_DIRECTION ); // get a direction on a unit nc-sphere if ( (*it_vg)->get_one_direction ( dir_nc ) ) { - // scale with delta_m and round integer and binary variables: + + NOMAD::Double normInfPoint=0; + for ( int i=0; i < static_cast<int>(var_indexes.size()) ; ++i ) + { + normInfPoint = std::max( normInfPoint.value() , std::fabs( (dir_nc)[i].value() ) ); + } + + + // scale with delta and round integer and binary variables: end_vi = var_indexes.end(); - i = 0; - for ( it_vi = var_indexes.begin() ; it_vi != end_vi ; ++it_vi ) + int i = 0; + for ( it_vi = var_indexes.begin() ; it_vi != end_vi ; ++it_vi, ++i ) { - dir[*it_vi]=_mesh->scale_and_project(*it_vi,dir_nc[i++]); - - - // integer variables: - if ( _input_types[*it_vi] == NOMAD::INTEGER ) + if ( _input_types[*it_vi] == NOMAD::BINARY ) { - if ( dir[*it_vi] >= Delta[*it_vi]/3.0 ) - dir[*it_vi] = ceil ( dir[*it_vi].value() ); - else if ( dir [*it_vi] <= -Delta[*it_vi]/3.0 ) - dir[*it_vi] = floor ( dir[*it_vi].value() ); + if ( dir_nc[i] < 0 ) + dir[*it_vi] = 0.0; else - { - double x=dir[*it_vi].value(); - dir[*it_vi] = (x>0)? floor(x+0.5): ceil(x-0.5); - } - } - - // binary variables: - else if ( _input_types[*it_vi] == NOMAD::BINARY ) - { - if ( dir[*it_vi] != 0.0 ) dir[*it_vi] = 1.0; } - // categorical variables: set direction=0: else if ( _input_types[*it_vi] == NOMAD::CATEGORICAL ) dir[*it_vi] = 0.0; + else + { + { + // Pickup 0, -1, 1 for the integer variable when Delta < 1.0 + if ( _input_types[*it_vi] == NOMAD::INTEGER && Delta[i] < 1.0 ) + { + if ( dir_nc[i] > 1.0/3.0 ) + dir[*it_vi] = 1.0 ; + else if ( dir_nc[i] < -1.0/3.0 ) + dir[*it_vi] = -1.0; + else + dir[*it_vi] = 0.0; + + } + else + { + + + dir[*it_vi]=_mesh->scale_and_project(*it_vi , dir_nc[i]); + + // integer variables: + if ( _input_types[*it_vi] == NOMAD::INTEGER ) + { + if ( dir[*it_vi] >= Delta[*it_vi]/3.0 ) + dir[*it_vi] = dir[*it_vi].ceil() ; + else if ( dir [*it_vi] <= -Delta[*it_vi]/3.0 ) + dir[*it_vi] = dir[*it_vi].floor(); + else + dir[*it_vi] = dir[*it_vi].round(); + } + } + } + } } } } // Reset the mesh indices to their previous values - _mesh->set_mesh_indices(old_mesh_indices); + _mesh->set_mesh_indices( old_mesh_indices ); } /*----------------------------------*/ @@ -840,7 +1053,7 @@ bool NOMAD::Signature::treat_periodic_variables ( NOMAD::Point & x { if ( bbit == NOMAD::INTEGER ) - new_x.round(); + new_x = new_x.round(); if (new_dir) (*new_dir)[i] += new_x - xi; @@ -1058,6 +1271,14 @@ bool NOMAD::Signature::operator < ( const NOMAD::Signature & s ) const if ( !p1_empty && _periodic_variables[i] != s._periodic_variables[i] ) return _periodic_variables[i]; + // granularity: + // ------------------- + if ( _granularity[i].comp_with_undef ( s._granularity[i] ) ) + return true; + if ( s._granularity[i].comp_with_undef ( _granularity[i] ) ) + return false; + + // mesh: // ----- if ( _mesh->get_initial_mesh_size() != s._mesh->get_initial_mesh_size() && diff --git a/src/Signature.hpp b/src/Signature.hpp index 44dcd32..a779202 100644 --- a/src/Signature.hpp +++ b/src/Signature.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -61,6 +68,7 @@ namespace NOMAD { NOMAD::Point _ub; ///< Upper bounds. NOMAD::Point _scaling; ///< Scaling. NOMAD::Point _fixed_variables; ///< Fixed variables. + NOMAD::Point _granularity; ///< Granularity of variables. std::vector<NOMAD::bb_input_type> _input_types; ///< Input types. @@ -117,18 +125,19 @@ namespace NOMAD { \param ub Upper bounds -- \b IN. \param scaling Scaling -- \b IN. \param fixed_variables Fixed variables -- \b IN. + \param granularity Min granularity of var -- \b IN. \param periodic_variables Periodic variables -- \b IN. \param var_groups Groups of variables -- \b IN. */ - void init - ( int n , - const std::vector<NOMAD::bb_input_type> & input_types , - const NOMAD::Point & lb , - const NOMAD::Point & ub , - const NOMAD::Point & scaling , - const NOMAD::Point & fixed_variables , - const std::vector<bool> & periodic_variables , - std::set<NOMAD::Variable_Group*,NOMAD::VG_Comp> & var_groups ); + void init ( int n , + const std::vector<NOMAD::bb_input_type> & input_types , + const NOMAD::Point & lb , + const NOMAD::Point & ub , + const NOMAD::Point & scaling , + const NOMAD::Point & fixed_variables , + const NOMAD::Point & granularity , + const std::vector<bool> & periodic_variables , + std::set<NOMAD::Variable_Group*,NOMAD::VG_Comp> & var_groups ); /// Reset groups of variables. void reset_var_groups ( void ); @@ -165,47 +174,49 @@ namespace NOMAD { /// Constructor #1. /** Advanced version. - \param n Number of variables -- \b IN. - \param input_types Types of the variables -- \b IN. - \param use_smesh Type of mesh (SMesh, XMesh) -- \b IN. - \param anisotropic_mesh Anisotropy of mesh (XMesh) -- \b IN. - \param initial_poll_size Initial poll size -- \b IN. - \param min_poll_size Minimum poll size -- \b IN. - \param min_mesh_size Minimim mesh size -- \b IN. - \param mesh_update_basis Mesh update basis -- \b IN. - \param poll_update_basis Poll update basis -- \b IN. - \param mesh_coarsening_exponent Mesh coarsening exponent -- \b IN. - \param mesh_refining_exponent Mesh refining exponent -- \b IN. - \param initial_mesh_index Initial mesh index -- \b IN. - \param lb Lower bounds -- \b IN. - \param ub Upper bounds -- \b IN. - \param scaling Scaling -- \b IN. - \param fixed_variables Fixed variables -- \b IN. - \param periodic_variables Periodic variables -- \b IN. - \param var_groups Groups of variables -- \b IN. - \param out Display -- \b IN. - */ - Signature - ( int n , - const std::vector<NOMAD::bb_input_type> & input_types , - const NOMAD::Point & lb , - const NOMAD::Point & ub , - bool use_smesh , - bool anisotropic_mesh , - const NOMAD::Point & initial_poll_size , - const NOMAD::Point & min_poll_size , - const NOMAD::Point & min_mesh_size , - NOMAD::Double & mesh_update_basis , - NOMAD::Double & poll_update_basis , - int & mesh_coarsening_exponent, - int & mesh_refining_exponent, - int initial_mesh_index , - const NOMAD::Point & scaling , - const NOMAD::Point & fixed_variables , - const std::vector<bool> & periodic_variables, - std::set<NOMAD::Variable_Group*,NOMAD::VG_Comp> & var_groups , - const NOMAD::Display & out=NOMAD::Display() - ); + \param n Number of variables -- \b IN. + \param input_types Types of the variables -- \b IN. + \param mesh_type Type of mesh (SMesh,XMesh,GMesh)-- \b IN. + \param anisotropic_mesh Anisotropy of mesh (XMesh) -- \b IN. + \param granularity Gramularity of variables -- \b IN. + \param initial_poll_size Initial poll size -- \b IN. + \param min_poll_size Minimum poll size -- \b IN. + \param min_mesh_size Minimim mesh size -- \b IN. + \param mesh_update_basis Mesh update basis -- \b IN. + \param poll_update_basis Poll update basis -- \b IN. + \param mesh_coarsening_exponent Mesh coarsening exponent -- \b IN. + \param mesh_refining_exponent Mesh refining exponent -- \b IN. + \param initial_mesh_index Initial mesh index -- \b IN. + \param limit_mesh_index Limit mesh index -- \b IN. + \param lb Lower bounds -- \b IN. + \param ub Upper bounds -- \b IN. + \param scaling Scaling -- \b IN. + \param fixed_variables Fixed variables -- \b IN. + \param periodic_variables Periodic variables -- \b IN. + \param var_groups Groups of variables -- \b IN. + \param out Display -- \b IN. + */ + Signature ( int n , + const std::vector<NOMAD::bb_input_type> & input_types , + const NOMAD::Point & lb , + const NOMAD::Point & ub , + const NOMAD::mesh_type & mesh_type , + bool anisotropic_mesh , + const NOMAD::Point & granularity , + const NOMAD::Point & initial_poll_size , + const NOMAD::Point & min_poll_size , + const NOMAD::Point & min_mesh_size , + NOMAD::Double & mesh_update_basis , + NOMAD::Double & poll_update_basis , + int & mesh_coarsening_exponent, + int & mesh_refining_exponent, + int initial_mesh_index, + int limit_mesh_index , + const NOMAD::Point & scaling , + const NOMAD::Point & fixed_variables , + const std::vector<bool> & periodic_variables, + std::set<NOMAD::Variable_Group*,NOMAD::VG_Comp> & var_groups , + const NOMAD::Display & out=NOMAD::Display() ); /// Constructor #2. /** @@ -219,15 +230,14 @@ namespace NOMAD { \param sec_poll_dir_types Types of directions for secondary poll -- \b IN. \param out Display -- \b IN. */ - Signature ( int n , + Signature ( int n , const std::vector<NOMAD::bb_input_type> & input_types , - const NOMAD::Point & initial_poll_size , + const NOMAD::Point & initial_poll_size , const NOMAD::Point & lb , const NOMAD::Point & ub , const std::set<NOMAD::direction_type> & direction_types , const std::set<NOMAD::direction_type> & sec_poll_dir_types , - const NOMAD::Display & out = NOMAD::Display() - ); + const NOMAD::Display & out = NOMAD::Display() ); /// Copy constructor. /** @@ -246,18 +256,19 @@ namespace NOMAD { \param ub Upper bounds -- \b IN. \param scaling Scaling -- \b IN. \param fixed_variables Fixed variables -- \b IN. + \param granularity Gramularity of var -- \b IN. \param periodic_variables Periodic variables -- \b IN. \param var_groups Groups of variables -- \b IN. */ - void reset - ( int n , - const std::vector<NOMAD::bb_input_type> & input_types , - const NOMAD::Point & lb , - const NOMAD::Point & ub , - const NOMAD::Point & scaling , - const NOMAD::Point & fixed_variables , - const std::vector<bool> & periodic_variables , - std::set<NOMAD::Variable_Group*,NOMAD::VG_Comp> & var_groups ); + void reset ( int n , + const std::vector<NOMAD::bb_input_type> & input_types , + const NOMAD::Point & lb , + const NOMAD::Point & ub , + const NOMAD::Point & scaling , + const NOMAD::Point & fixed_variables , + const NOMAD::Point & granularity , + const std::vector<bool> & periodic_variables , + std::set<NOMAD::Variable_Group*,NOMAD::VG_Comp> & var_groups ); /// Define a signature to be standard. void set_std ( void ) { _std = true; } @@ -315,7 +326,7 @@ namespace NOMAD { (after the treatment; may be \c NULL) -- \b OUT. \return A boolean equal to \c true if \c x has been modified. */ - bool treat_periodic_variables ( NOMAD::Point & x , + bool treat_periodic_variables ( NOMAD::Point & x , const NOMAD::Direction * old_dir , NOMAD::Direction *& new_dir ); @@ -331,6 +342,13 @@ namespace NOMAD { */ const NOMAD::Point & get_ub ( void ) const { return _ub; } + /// Access to the granularity. + /** + \return The granularity. + */ + const NOMAD::Point & get_granularity ( void ) const { return _granularity; } + + /// Access to the mesh. /** \return The orthogonal mesh. @@ -340,8 +358,8 @@ namespace NOMAD { /// Update the Mesh (poll and mesh sizes). /** - \param success Type of success of the iteration -- \b IN. - \param dir Direction of the iteration (optional) -- \b IN. + \param success Type of success of the iteration -- \b IN. + \param dir Direction of the iteration (optional) -- \b IN. */ void update_mesh ( NOMAD::success_type success, const NOMAD::Direction * dir=NULL ) { @@ -357,8 +375,10 @@ namespace NOMAD { /** /param mesh_indices */ - void reset_mesh ( NOMAD::Point & mesh_indices ) { _mesh->set_mesh_indices( mesh_indices); } - + void reset_mesh ( NOMAD::Point & mesh_indices ) + { + _mesh->set_mesh_indices( mesh_indices); + } /// Access to the scaling. /** @@ -380,6 +400,12 @@ namespace NOMAD { int get_nb_fixed_variables ( void ) const; + /// Access to the maximum number points in the poll set. + /** + \return The maximum number of points in the poll set. + */ + int get_max_size_poll_set( void ) const; + /// Access to the feasible successful direction. /** @@ -443,15 +469,6 @@ namespace NOMAD { return _input_types; } - /// Access to the input types. - /** - \return The input types. - */ - const std::vector<NOMAD::bb_input_type> & get_input_type ( void ) const - { - return _input_types; - } - /// Access to the groups of variables. /** \return The groups of variables. @@ -461,7 +478,6 @@ namespace NOMAD { return _var_groups; } - /// Check the compatibility of a point. /** - Only the number of variables is checked. @@ -473,26 +489,36 @@ namespace NOMAD { */ bool is_compatible ( const NOMAD::Point & x ) const; + /// Access to the directions. /** - - The computed directions already include Delta^k_m. + - The computed directions already include delta^k. \param dirs List of directions -- \b OUT. \param poll Type of poll (primary or secondary) -- \b IN. \param poll_center Poll center -- \b IN. */ - void get_directions ( std::list<NOMAD::Direction> & dirs , - NOMAD::poll_type poll , - const NOMAD::Point & poll_center ); + void get_directions ( std::list<NOMAD::Direction> & dirs , + NOMAD::poll_type poll , + const NOMAD::Point & poll_center ); + /// Access to a direction for a random variable group. + /** + - The computed direction already include delta^k. + \param dir The direction -- \b OUT. + \param poll_center Poll center -- \b IN. + */ + void get_variable_group_direction ( NOMAD::Direction & dir , + const NOMAD::Point & poll_center ); + /// Access to one direction for a given mesh. /** Used for example in the VNS search. \param dir The direction -- \b OUT. \param mesh_index Mesh index ell -- \b IN. */ - void get_one_direction ( NOMAD::Direction & dir , - int mesh_index ) const; + void get_one_direction ( NOMAD::Direction & dir , + int mesh_index ) ; /// Comparison operator \c < . @@ -543,7 +569,8 @@ namespace NOMAD { \return The NOMAD::Display object. */ inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::Signature & s ) { + const NOMAD::Signature & s ) + { s.display ( out ); return out; } diff --git a/src/Signature_Element.hpp b/src/Signature_Element.hpp index fa0357d..c6e1a03 100644 --- a/src/Signature_Element.hpp +++ b/src/Signature_Element.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ diff --git a/src/Single_Obj_Quad_Model_Evaluator.hpp b/src/Single_Obj_Quad_Model_Evaluator.hpp index 7580717..af4d429 100644 --- a/src/Single_Obj_Quad_Model_Evaluator.hpp +++ b/src/Single_Obj_Quad_Model_Evaluator.hpp @@ -1,8 +1,8 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ +/* Copyright (C) 2001-2015 Mark Abramson - Brigham Young University, Provo */ /* Charles Audet - Ecole Polytechnique, Montreal */ /* Gilles Couture - Ecole Polytechnique, Montreal */ /* John Dennis - Rice University, Houston */ @@ -37,7 +37,7 @@ /** \file Single_Obj_Quad_Model_Evaluator.hpp \brief NOMAD::Evaluator subclass for quadratic model optimization (headers) - \author Christophe Tribes + \author Christophe Tribes \date 2014-06-19 \see Single_Obj_Quad_Model_Evaluator.cpp */ @@ -48,37 +48,37 @@ #include "Evaluator.hpp" namespace NOMAD { - - /// Single objective NOMAD::Evaluator subclass for quadratic model. - class Single_Obj_Quad_Model_Evaluator : public NOMAD::Quad_Model_Evaluator, public NOMAD::Evaluator { - - public: - - /// Constructor. - /** - \param p Parameters -- \b IN. - \param model Model -- \b IN. - */ - Single_Obj_Quad_Model_Evaluator ( const NOMAD::Parameters & p , - const NOMAD::Quad_Model & model ) : NOMAD::Quad_Model_Evaluator(p,model),NOMAD::Evaluator(p){_is_model_evaluator=true;} - - /// Destructor. - virtual ~Single_Obj_Quad_Model_Evaluator ( void ){;} - - - /// Evaluate the blackboxes quad model at a given trial point - /** - \param x point to evaluate -- \b IN/OUT. - \param h_max h_max for barrier -- \b IN. - \param count_eval Count eval if true -- \b IN. - */ - virtual bool eval_x ( NOMAD::Eval_Point & x , - const NOMAD::Double & h_max , - bool & count_eval ) const {return Quad_Model_Evaluator::eval_x(x,h_max,count_eval);} - - - - }; + + /// Single objective NOMAD::Evaluator subclass for quadratic model. + class Single_Obj_Quad_Model_Evaluator : public NOMAD::Quad_Model_Evaluator, public NOMAD::Evaluator { + + public: + + /// Constructor. + /** + \param p Parameters -- \b IN. + \param model Model -- \b IN. + */ + Single_Obj_Quad_Model_Evaluator ( const NOMAD::Parameters & p , + const NOMAD::Quad_Model & model ) : NOMAD::Quad_Model_Evaluator(p,model),NOMAD::Evaluator(p){_is_model_evaluator=true;} + + /// Destructor. + virtual ~Single_Obj_Quad_Model_Evaluator ( void ){;} + + + /// Evaluate the blackboxes quad model at a given trial point + /** + \param x point to evaluate -- \b IN/OUT. + \param h_max h_max for barrier -- \b IN. + \param count_eval Count eval if true -- \b IN. + */ + virtual bool eval_x ( NOMAD::Eval_Point & x , + const NOMAD::Double & h_max , + bool & count_eval ) const {return Quad_Model_Evaluator::eval_x(x,h_max,count_eval);} + + + + }; } #endif diff --git a/src/Slave.cpp b/src/Slave.cpp index cb73ff5..b9c2799 100644 --- a/src/Slave.cpp +++ b/src/Slave.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -66,7 +73,8 @@ void NOMAD::Slave::init ( void ) const #endif // Slave::force_quit() will be called if ctrl-c is pressed: - if ( !NOMAD::Slave::is_master() ) { + if ( !NOMAD::Slave::is_master() ) + { NOMAD::Evaluator::force_quit(); @@ -84,7 +92,8 @@ void NOMAD::Slave::init ( void ) const /*----------------------------------------*/ int NOMAD::Slave::get_rank ( void ) { - if ( NOMAD::Slave::_rank < 0 ) { + if ( NOMAD::Slave::_rank < 0 ) + { #ifdef USE_MPI MPI_Comm_rank ( MPI_COMM_WORLD, &NOMAD::Slave::_rank ); #else @@ -100,7 +109,8 @@ int NOMAD::Slave::get_rank ( void ) /*----------------------------------------*/ int NOMAD::Slave::get_nb_processes ( void ) { - if ( NOMAD::Slave::_np < 0 ) { + if ( NOMAD::Slave::_np < 0 ) + { #ifdef USE_MPI MPI_Comm_size ( MPI_COMM_WORLD, &NOMAD::Slave::_np ); #else @@ -122,7 +132,8 @@ void NOMAD::Slave::run ( void ) const NOMAD::Eval_Point * x = NULL; bool count_eval = false; - while ( true ) { + while ( true ) + { // receive signal from master: // --------------------------- @@ -135,7 +146,8 @@ void NOMAD::Slave::run ( void ) const // EVAL signal: // ------------ - if ( signal == NOMAD::EVAL_SIGNAL ) { + if ( signal == NOMAD::EVAL_SIGNAL ) + { // receive and evaluate the point: x = eval_point ( count_eval ); @@ -161,7 +173,8 @@ void NOMAD::Slave::run ( void ) const // WAIT signal: // ------------ - // else if ( signal == NOMAD::WAIT_SIGNAL ) { + // else if ( signal == NOMAD::WAIT_SIGNAL ) + //{ // } } @@ -195,7 +208,8 @@ void NOMAD::Slave::init_slaves ( const NOMAD::Display & out ) NOMAD::Clock clk; // 1. launch requests: - for ( source = 1 ; source < NOMAD::Slave::_np ; ++source ) { + for ( source = 1 ; source < NOMAD::Slave::_np ; ++source ) + { req[source] = new MPI_Request; NOMAD::Slave::receive_data ( &signal , 1 , MPI_CHAR , source , req[source] ); if ( display_degree == NOMAD::FULL_DISPLAY ) @@ -302,7 +316,8 @@ void NOMAD::Slave::stop_slaves ( const NOMAD::Display & out ) MPI_Request ** req = new MPI_Request * [ NOMAD::Slave::_np ]; // 1. launch requests: - for ( source = 1 ; source < NOMAD::Slave::_np ; ++source ) { + for ( source = 1 ; source < NOMAD::Slave::_np ; ++source ) + { req[source] = new MPI_Request; NOMAD::Slave::receive_data ( &signal , 1 , MPI_CHAR , source , req[source] ); if ( display_degree == NOMAD::FULL_DISPLAY ) @@ -311,15 +326,19 @@ void NOMAD::Slave::stop_slaves ( const NOMAD::Display & out ) // 2. test requests (with a maximal delay of MAX_REQ_WAIT): int cnt = 0 , flag; - while ( nb_stopped < nb_slaves && clk.get_real_time() < NOMAD::MAX_REQ_WAIT ) { + while ( nb_stopped < nb_slaves && clk.get_real_time() < NOMAD::MAX_REQ_WAIT ) + { - for ( source = 1 ; source < NOMAD::Slave::_np ; ++source ) { + for ( source = 1 ; source < NOMAD::Slave::_np ; ++source ) + { - if ( req[source] ) { + if ( req[source] ) + { MPI_Test ( req[source] , &flag , &status ); - if ( flag ) { + if ( flag ) + { MPI_Wait ( req[source] , &status ); @@ -342,8 +361,10 @@ void NOMAD::Slave::stop_slaves ( const NOMAD::Display & out ) NOMAD::Slave::_stop_ok = true; // 3. delete requests: - for ( source = 1 ; source < NOMAD::Slave::_np ; ++source ) { - if ( req[source] ) { + for ( source = 1 ; source < NOMAD::Slave::_np ; ++source ) + { + if ( req[source] ) + { MPI_Cancel ( req[source] ); delete req[source]; NOMAD::Slave::_stop_ok = false; @@ -371,7 +392,8 @@ int NOMAD::Slave::receive_data ( void * buf , int tag = ( NOMAD::Slave::is_master() ) ? source : NOMAD::Slave::get_rank(); // immediate receive: - if ( req ) { + if ( req ) + { if ( source == MPI_ANY_SOURCE ) throw NOMAD::Exception ( "Slave.cpp" , __LINE__ , "Slave::receive_data(): immediate receive with no source" ); @@ -379,7 +401,8 @@ int NOMAD::Slave::receive_data ( void * buf , } // normal receive: - else { + else + { MPI_Status status; if ( source == MPI_ANY_SOURCE ) tag = MPI_ANY_TAG; @@ -459,7 +482,8 @@ NOMAD::Eval_Point * NOMAD::Slave::eval_point ( bool & count_eval ) const try { eval_ok = _ev->eval_x ( *x , h_max , count_eval ); } - catch ( ... ) { + catch ( ... ) + { eval_ok = false; } @@ -485,12 +509,15 @@ void NOMAD::Slave::send_eval_result ( const NOMAD::Eval_Point * x , const NOMAD::Point & bbo = x->get_bb_outputs(); // bb_outputs (m values): - for ( int i = 0 ; i < m ; ++i ) { - if ( bbo[i].is_defined() ) { + for ( int i = 0 ; i < m ; ++i ) + { + if ( bbo[i].is_defined() ) + { dtab[i ] = bbo[i].value(); dtab[i+m] = 1.0; } - else { + else + { dtab[i ] = NOMAD::INF; dtab[i+m] = -1.0; } diff --git a/src/Slave.hpp b/src/Slave.hpp index 03ae58a..62a9d6d 100644 --- a/src/Slave.hpp +++ b/src/Slave.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,213 +41,217 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Slave.hpp - \brief Slave process (headers) - \author Sebastien Le Digabel - \date 2010-04-22 - \see Slave.cpp -*/ + \file Slave.hpp + \brief Slave process (headers) + \author Sebastien Le Digabel + \date 2010-04-22 + \see Slave.cpp + */ #ifndef __SLAVE__ #define __SLAVE__ #include "Evaluator.hpp" namespace NOMAD { - - /// Slave process for the parallel version. - class Slave : private NOMAD::Uncopyable { - - private: - - static int _rank; /// Process rank. - static int _np; /// Number of processes. - - static int _data_sent; /// Stats on the sent data. - static int _data_rcvd; /// Stats on the received data. - - static bool _are_running; ///< \c true if the slaves are running. - static bool _stop_ok; ///< \c true if the slaves stopped without error. - - const NOMAD::Parameters * _p; ///< Parameters (may be NULL). - NOMAD::Evaluator * _ev; ///< Evaluator (may be NULL). - - /// Initializations. - void init ( void ) const; - - /// Force quit. - /** - - Called by pressing Ctrl-C. - - Does nothing: the slave will be stopped by the master. - \param signalValue Signal value -- \b IN. - */ - static void force_quit ( int signalValue ) {} - - public: - - /// Constructor. - /** - \param p Parameters -- \b IN. - \param ev A pointer to an evaluator -- \b IN. - */ - Slave ( const NOMAD::Parameters & p , NOMAD::Evaluator * ev ) - { _p=&p; _ev=ev; init(); } - - /// Destructor. - virtual ~Slave ( void ) {} - - /// Run the slave code. - void run ( void ) const; - - /// Access to the stat \c _data_sent. - /** - \return The stat \c _data_sent. - */ - static int get_data_sent ( void ) { return Slave::_data_sent; } - - /// Access to the stat \c _data_rcvd. - /** - \return The stat \c _data_rcvd. - */ - static int get_data_rcvd ( void ) { return Slave::_data_rcvd; } - /// Access to the process rank. - /** - \return The process rank. - */ - static int get_rank ( void ); - - /// Access to the number of processes. - /** - \return The number of processes. - */ - static int get_nb_processes ( void ); - - /// Check if the slaves are running. - /** - \return A boolean equal to \c true if the slaves are running. - */ - static bool are_running ( void ) { return _are_running; } - - /// Check if the current slave is the master. - /** - \return A boolean equal to \c true if the current slave is the master. - */ - static bool is_master ( void ) { return ( Slave::get_rank() == 0 ); } - - /// Initialize all the slaves. - /** - \param out Display -- \b IN. - */ - static void init_slaves ( const NOMAD::Display & out ); - - /// Stop all the slaves. - /** - \param out Display -- \b IN. - */ - static void stop_slaves ( const NOMAD::Display & out ); - + /// Slave process for the parallel version. + class Slave : private NOMAD::Uncopyable { + + private: + + static int _rank; /// Process rank. + static int _np; /// Number of processes. + + static int _data_sent; /// Stats on the sent data. + static int _data_rcvd; /// Stats on the received data. + + static bool _are_running; ///< \c true if the slaves are running. + static bool _stop_ok; ///< \c true if the slaves stopped without error. + + const NOMAD::Parameters * _p; ///< Parameters (may be NULL). + NOMAD::Evaluator * _ev; ///< Evaluator (may be NULL). + + /// Initializations. + void init ( void ) const; + + /// Force quit. + /** + - Called by pressing Ctrl-C. + - Does nothing: the slave will be stopped by the master. + \param signalValue Signal value -- \b IN. + */ + static void force_quit ( int signalValue ) {} + + public: + + /// Constructor. + /** + \param p Parameters -- \b IN. + \param ev A pointer to an evaluator -- \b IN. + */ + Slave ( const NOMAD::Parameters & p , NOMAD::Evaluator * ev ) + { + _p=&p; + _ev=ev; + init(); + } + + /// Destructor. + virtual ~Slave ( void ) {} + + /// Run the slave code. + void run ( void ) const; + + /// Access to the stat \c _data_sent. + /** + \return The stat \c _data_sent. + */ + static int get_data_sent ( void ) { return Slave::_data_sent; } + + /// Access to the stat \c _data_rcvd. + /** + \return The stat \c _data_rcvd. + */ + static int get_data_rcvd ( void ) { return Slave::_data_rcvd; } + + /// Access to the process rank. + /** + \return The process rank. + */ + static int get_rank ( void ); + + /// Access to the number of processes. + /** + \return The number of processes. + */ + static int get_nb_processes ( void ); + + /// Check if the slaves are running. + /** + \return A boolean equal to \c true if the slaves are running. + */ + static bool are_running ( void ) { return _are_running; } + + /// Check if the current slave is the master. + /** + \return A boolean equal to \c true if the current slave is the master. + */ + static bool is_master ( void ) { return ( Slave::get_rank() == 0 ); } + + /// Initialize all the slaves. + /** + \param out Display -- \b IN. + */ + static void init_slaves ( const NOMAD::Display & out ); + + /// Stop all the slaves. + /** + \param out Display -- \b IN. + */ + static void stop_slaves ( const NOMAD::Display & out ); + #ifdef USE_MPI - - private: - - /// Receive and evaluate a point from the master. - /** - \param count_eval Flag indicating if the evaluation has to be counted - or not -- \b OUT. - \return A pointer to the point. - */ - NOMAD::Eval_Point * eval_point ( bool & count_eval ) const; - - /// Send an evaluation result to the master. - /** - \param x The evaluation point -- \b IN. - \param count_eval Flag indicating if the evaluation has to be counted - or not -- \b IN. - */ - void send_eval_result ( const NOMAD::Eval_Point * x , bool count_eval ) const; - - /// Send data. - /** - \param buf Data to send -- \b IN. - \param count Data quantity -- \b IN. - \param datatype Data type -- \b IN. - \param dest Destination -- \b IN. - \param ready_send Flag equal to \c true if \c Rsend is used instead of \c Send - -- \b IN. - */ - static void send_data ( const void * buf , - int count , - MPI_Datatype datatype , - int dest , - bool ready_send ); - - /// Receive data. - /** - \param buf Data to receive -- \b OUT. - \param count Data quantity -- \b IN. - \param datatype Data type -- \b IN. - \param source Source (may be \c MPI_ANY_SOURCE) -- \b IN. - \param req Pointer to a MPI request (may be \c NULL) -- \b IN/OUT. - \return The source. - */ - static int receive_data ( void * buf , - int count , - MPI_Datatype datatype , - int source , - MPI_Request * req ); - - /// Wait for a MPI request. - /** - \param req The request -- \b IN/OUT. - */ - static void wait_request ( MPI_Request & req ); - - public: - - /// Send an evaluation point to a slave. - /** - \param x A pointer to the evaluation point to send -- \b IN. - \param slave_rank Destination -- \b IN. - \param h_max Maximal feasibility value \c h_max -- \b IN. - */ - void send_eval_point ( const NOMAD::Eval_Point * x , - int slave_rank , - const NOMAD::Double & h_max ) const; - - /// Receive an evaluation result from a slave. - /** - \param slave_rank Source -- \b IN. - \param x A pointer to the evaluation point received -- \b OUT. - \param eval_ok Flag indicating if the evaluation succeeded -- \b OUT. - \param count_eval Flag indicating if the evaluation has to be counted - or not -- \b OUT. - */ - void receive_eval_result ( int slave_rank , - NOMAD::Eval_Point * x , - bool & eval_ok , - bool & count_eval ) const; - - /// Receive a signal from a slave. - /** - \param signal The signal -- \b OUT. - \return The source. - */ - static int receive_signal ( char & signal ) - { - return Slave::receive_data ( &signal , 1 , MPI_CHAR , MPI_ANY_SOURCE , NULL ); - } - - /// Send a signal to a slave. - /** - \param signal The signal -- \b IN. - \param slave_rank Destination -- \b IN. - */ - static void send_signal ( char signal , int slave_rank ) - { - Slave::send_data ( &signal , 1 , MPI_CHAR , slave_rank , true ); - } - + + private: + + /// Receive and evaluate a point from the master. + /** + \param count_eval Flag indicating if the evaluation has to be counted + or not -- \b OUT. + \return A pointer to the point. + */ + NOMAD::Eval_Point * eval_point ( bool & count_eval ) const; + + /// Send an evaluation result to the master. + /** + \param x The evaluation point -- \b IN. + \param count_eval Flag indicating if the evaluation has to be counted + or not -- \b IN. + */ + void send_eval_result ( const NOMAD::Eval_Point * x , bool count_eval ) const; + + /// Send data. + /** + \param buf Data to send -- \b IN. + \param count Data quantity -- \b IN. + \param datatype Data type -- \b IN. + \param dest Destination -- \b IN. + \param ready_send Flag equal to \c true if \c Rsend is used instead of \c Send + -- \b IN. + */ + static void send_data ( const void * buf , + int count , + MPI_Datatype datatype , + int dest , + bool ready_send ); + + /// Receive data. + /** + \param buf Data to receive -- \b OUT. + \param count Data quantity -- \b IN. + \param datatype Data type -- \b IN. + \param source Source (may be \c MPI_ANY_SOURCE) -- \b IN. + \param req Pointer to a MPI request (may be \c NULL) -- \b IN/OUT. + \return The source. + */ + static int receive_data ( void * buf , + int count , + MPI_Datatype datatype , + int source , + MPI_Request * req ); + + /// Wait for a MPI request. + /** + \param req The request -- \b IN/OUT. + */ + static void wait_request ( MPI_Request & req ); + + public: + + /// Send an evaluation point to a slave. + /** + \param x A pointer to the evaluation point to send -- \b IN. + \param slave_rank Destination -- \b IN. + \param h_max Maximal feasibility value \c h_max -- \b IN. + */ + void send_eval_point ( const NOMAD::Eval_Point * x , + int slave_rank , + const NOMAD::Double & h_max ) const; + + /// Receive an evaluation result from a slave. + /** + \param slave_rank Source -- \b IN. + \param x A pointer to the evaluation point received -- \b OUT. + \param eval_ok Flag indicating if the evaluation succeeded -- \b OUT. + \param count_eval Flag indicating if the evaluation has to be counted + or not -- \b OUT. + */ + void receive_eval_result ( int slave_rank , + NOMAD::Eval_Point * x , + bool & eval_ok , + bool & count_eval ) const; + + /// Receive a signal from a slave. + /** + \param signal The signal -- \b OUT. + \return The source. + */ + static int receive_signal ( char & signal ) + { + return Slave::receive_data ( &signal , 1 , MPI_CHAR , MPI_ANY_SOURCE , NULL ); + } + + /// Send a signal to a slave. + /** + \param signal The signal -- \b IN. + \param slave_rank Destination -- \b IN. + */ + static void send_signal ( char signal , int slave_rank ) + { + Slave::send_data ( &signal , 1 , MPI_CHAR , slave_rank , true ); + } + #endif - }; + }; } #endif diff --git a/src/Speculative_Search.cpp b/src/Speculative_Search.cpp index 468e97d..bf9a6f8 100644 --- a/src/Speculative_Search.cpp +++ b/src/Speculative_Search.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -76,14 +83,14 @@ void NOMAD::Speculative_Search::search ( NOMAD::Mads & mads const NOMAD::Display & out = _p.out(); NOMAD::dd_type display_degree = out.get_search_dd(); - if ( display_degree == NOMAD::FULL_DISPLAY ) { + if ( display_degree == NOMAD::FULL_DISPLAY ) + { std::ostringstream oss; oss << NOMAD::SPEC_SEARCH; out << std::endl << NOMAD::open_block ( oss.str() ) << std::endl; } - //int lkm1; // l_{k-1} - // int lk; // l_k + int n; NOMAD::Signature * signature; NOMAD::Point delta_m_k; @@ -104,7 +111,8 @@ void NOMAD::Speculative_Search::search ( NOMAD::Mads & mads { const NOMAD::Direction * dir = x[i]->get_direction(); - if ( dir && ( dir->is_mads() || dir->get_type()==NOMAD::MODEL_SEARCH_DIR ) ) { + if ( dir && ( dir->is_mads() || dir->get_type()==NOMAD::MODEL_SEARCH_DIR ) ) + { // get the x_k's signature: signature = x[i]->get_signature(); @@ -144,6 +152,7 @@ void NOMAD::Speculative_Search::search ( NOMAD::Mads & mads factor[k]=0; } + NOMAD::Point mesh_indices_k( x[i]->get_signature()->get_mesh()->get_mesh_indices() ); signature->get_mesh()->update( NOMAD::FULL_SUCCESS, mesh_indices_k , dir ); @@ -155,10 +164,10 @@ void NOMAD::Speculative_Search::search ( NOMAD::Mads & mads sk->set ( n , _p.get_bb_nb_outputs() ); sk->set_signature ( signature ); sk->set_direction ( &new_dir ); - sk->Point::operator = ( xkm1 + new_dir ); - if ( display_degree == NOMAD::FULL_DISPLAY ) { + if ( display_degree == NOMAD::FULL_DISPLAY ) + { out << "trial point #" << sk->get_tag() << ": ( "; sk->Point::display ( out ," " , 2 , NOMAD::Point::get_display_limit() ); @@ -179,7 +188,7 @@ void NOMAD::Speculative_Search::search ( NOMAD::Mads & mads nb_search_pts = ev_control.get_nb_eval_points(); - // eval_list_of_points:s + // eval_list_of_points: // -------------------- new_feas_inc = new_infeas_inc = NULL; @@ -193,7 +202,8 @@ void NOMAD::Speculative_Search::search ( NOMAD::Mads & mads new_infeas_inc , success ); - if ( display_degree == NOMAD::FULL_DISPLAY ) { + if ( display_degree == NOMAD::FULL_DISPLAY ) + { std::ostringstream oss; oss << "end of speculative search (" << success << ")"; out << NOMAD::close_block ( oss.str() ) << std::endl; diff --git a/src/Speculative_Search.hpp b/src/Speculative_Search.hpp index e0db82d..af9946e 100644 --- a/src/Speculative_Search.hpp +++ b/src/Speculative_Search.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Speculative_Search.hpp - \brief Speculative search (headers) - \author Sebastien Le Digabel - \date 2010-04-12 - \see Speculative.cpp -*/ + \file Speculative_Search.hpp + \brief Speculative search (headers) + \author Sebastien Le Digabel + \date 2010-04-12 + \see Speculative.cpp + */ #ifndef __SPECULATIVE_SEARCH__ #define __SPECULATIVE_SEARCH__ @@ -47,57 +54,57 @@ #include "Mads.hpp" namespace NOMAD { - - /// Speculative search. - /** - The speculative search consists in looking further away along - the successful direction after an improvement. - */ - class Speculative_Search : public NOMAD::Search , private NOMAD::Uncopyable { - - public: - - /// Constructor. - /** - \param p Parameters -- \b IN. - */ - Speculative_Search ( NOMAD::Parameters & p ) - : NOMAD::Search ( p , NOMAD::SPEC_SEARCH ) {} - /// Destructor. - virtual ~Speculative_Search ( void ) {} - - /// The speculative search. + /// Speculative search. /** - - x_k = x_{k-1} + Delta^m_{k-1} d \n + The speculative search consists in looking further away along + the successful direction after an improvement. + */ + class Speculative_Search : public NOMAD::Search , private NOMAD::Uncopyable { + + public: + + /// Constructor. + /** + \param p Parameters -- \b IN. + */ + Speculative_Search ( NOMAD::Parameters & p ) + : NOMAD::Search ( p , NOMAD::SPEC_SEARCH ) {} + + /// Destructor. + virtual ~Speculative_Search ( void ) {} + + /// The speculative search. + /** + - x_k = x_{k-1} + Delta^m_{k-1} d \n s_k = x_{k-1} + Delta^m_{k-1} d if ell_{k-1} > 0 \n - or tau * Delta^m_{k-1} d otherwise. - - The directions that we use already contain Delta^m: + or tau * Delta^m_{k-1} d otherwise. + - The directions that we use already contain Delta^m: direction = Delta^m_{k-1} d - - The following test + - The following test \code - if ( new_feas_inc || new_infeas_inc ) + if ( new_feas_inc || new_infeas_inc ) \endcode - is equal to \c true and has already been made in \c Mads.cpp. - - \param mads NOMAD::Mads object invoking this search -- \b IN/OUT. - \param nb_search_pts Number of generated search points -- \b OUT. - \param stop Stop flag -- \b IN/OUT. - \param stop_reason Stop reason -- \b OUT. - \param success Type of success -- \b OUT. - \param count_search Count or not the search -- \b OUT. - \param new_feas_inc New feasible incumbent -- \b IN/OUT. - \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. - */ - virtual void search ( NOMAD::Mads & mads , - int & nb_search_pts , - bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - bool & count_search , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc ); - }; + is equal to \c true and has already been made in \c Mads.cpp. + + \param mads NOMAD::Mads object invoking this search -- \b IN/OUT. + \param nb_search_pts Number of generated search points -- \b OUT. + \param stop Stop flag -- \b IN/OUT. + \param stop_reason Stop reason -- \b OUT. + \param success Type of success -- \b OUT. + \param count_search Count or not the search -- \b OUT. + \param new_feas_inc New feasible incumbent -- \b IN/OUT. + \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. + */ + virtual void search ( NOMAD::Mads & mads , + int & nb_search_pts , + bool & stop , + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + bool & count_search , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc ); + }; } #endif diff --git a/src/Stats.cpp b/src/Stats.cpp index 15479e0..1984376 100644 --- a/src/Stats.cpp +++ b/src/Stats.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Stats.cpp - \brief Algorithm stats (implementation) - \author Sebastien Le Digabel - \date 2010-04-22 - \see Stats.hpp -*/ + \file Stats.cpp + \brief Algorithm stats (implementation) + \author Sebastien Le Digabel + \date 2010-04-22 + \see Stats.hpp + */ #include "Stats.hpp" /*---------------------------------------------------------*/ @@ -47,56 +54,56 @@ /*---------------------------------------------------------*/ NOMAD::Stats & NOMAD::Stats::operator = ( const NOMAD::Stats & s ) { - _eval = s._eval; - _sim_bb_eval = s._sim_bb_eval; - _sgte_eval = s._sgte_eval; - _bb_eval = s._bb_eval; - _block_eval = s._block_eval; - _failed_eval = s._failed_eval; - _cache_hits = s._cache_hits; - _interrupted_eval = s._interrupted_eval; - _iterations = s._iterations; - _nb_poll_searches = s._nb_poll_searches; - _poll_pts = s._poll_pts; - _poll_success = s._poll_success; - _nb_success_dyn_dir= s._nb_success_dyn_dir; - _nb_ext_polls = s._nb_ext_polls; - _ext_poll_pts = s._ext_poll_pts; - _ext_poll_succ = s._ext_poll_succ; - _ext_poll_bb_eval = s._ext_poll_bb_eval; - _ext_poll_descents = s._ext_poll_descents; - _nb_spec_searches = s._nb_spec_searches; - _spec_pts = s._spec_pts; - _spec_success = s._spec_success; - _nb_LH_searches = s._nb_LH_searches; - _LH_pts = s._LH_pts; - _LH_success = s._LH_success; - _nb_cache_searches = s._nb_cache_searches; - _CS_pts = s._CS_pts; - _CS_success = s._CS_success; - _model_stats = s._model_stats; - _nb_VNS_searches = s._nb_VNS_searches; - _VNS_pts = s._VNS_pts; - _VNS_success = s._VNS_success; - _VNS_bb_eval = s._VNS_bb_eval; - _VNS_sgte_eval = s._VNS_sgte_eval; - _nb_usr_searches = s._nb_usr_searches; - _usr_srch_pts = s._usr_srch_pts; - _usr_srch_success = s._usr_srch_success; - _p1_iterations = s._p1_iterations; - _p1_bbe = s._p1_bbe; - _mads_runs = s._mads_runs; - _clock = s._clock; - _stat_sum = s._stat_sum; - _stat_avg = s._stat_avg; - _cnt_avg = s._cnt_avg; - + _eval = s._eval; + _sim_bb_eval = s._sim_bb_eval; + _sgte_eval = s._sgte_eval; + _bb_eval = s._bb_eval; + _block_eval = s._block_eval; + _failed_eval = s._failed_eval; + _cache_hits = s._cache_hits; + _interrupted_eval = s._interrupted_eval; + _iterations = s._iterations; + _nb_poll_searches = s._nb_poll_searches; + _poll_pts = s._poll_pts; + _poll_success = s._poll_success; + _nb_success_dyn_dir= s._nb_success_dyn_dir; + _nb_ext_polls = s._nb_ext_polls; + _ext_poll_pts = s._ext_poll_pts; + _ext_poll_succ = s._ext_poll_succ; + _ext_poll_bb_eval = s._ext_poll_bb_eval; + _ext_poll_descents = s._ext_poll_descents; + _nb_spec_searches = s._nb_spec_searches; + _spec_pts = s._spec_pts; + _spec_success = s._spec_success; + _nb_LH_searches = s._nb_LH_searches; + _LH_pts = s._LH_pts; + _LH_success = s._LH_success; + _nb_cache_searches = s._nb_cache_searches; + _CS_pts = s._CS_pts; + _CS_success = s._CS_success; + _model_stats = s._model_stats; + _nb_VNS_searches = s._nb_VNS_searches; + _VNS_pts = s._VNS_pts; + _VNS_success = s._VNS_success; + _VNS_bb_eval = s._VNS_bb_eval; + _VNS_sgte_eval = s._VNS_sgte_eval; + _nb_usr_searches = s._nb_usr_searches; + _usr_srch_pts = s._usr_srch_pts; + _usr_srch_success = s._usr_srch_success; + _p1_iterations = s._p1_iterations; + _p1_bbe = s._p1_bbe; + _mads_runs = s._mads_runs; + _clock = s._clock; + _stat_sum = s._stat_sum; + _stat_avg = s._stat_avg; + _cnt_avg = s._cnt_avg; + #ifdef USE_MPI - _asynchronous_success = s._asynchronous_success; - _MPI_data_size = s._MPI_data_size; + _asynchronous_success = s._asynchronous_success; + _MPI_data_size = s._MPI_data_size; #endif - - return *this; + + return *this; } /*---------------------------------------------------------*/ @@ -104,11 +111,11 @@ NOMAD::Stats & NOMAD::Stats::operator = ( const NOMAD::Stats & s ) /*---------------------------------------------------------*/ void NOMAD::Stats::reset ( void ) { - _eval = + _eval = _sim_bb_eval = _sgte_eval = _bb_eval = - _block_eval = + _block_eval = _failed_eval = _cache_hits = _interrupted_eval = @@ -140,21 +147,21 @@ void NOMAD::Stats::reset ( void ) _usr_srch_success = _p1_iterations = _p1_bbe = - _nb_success_dyn_dir = + _nb_success_dyn_dir = _mads_runs = 0; - - _model_stats.reset(); - - _stat_sum.clear(); - _stat_avg.clear(); - _cnt_avg = 0; - + + _model_stats.reset(); + + _stat_sum.clear(); + _stat_avg.clear(); + _cnt_avg = 0; + #ifdef USE_MPI - _asynchronous_success = 0; - _MPI_data_size = -1; + _asynchronous_success = 0; + _MPI_data_size = -1; #endif - - _clock.reset(); + + _clock.reset(); } /*---------------------------------------------------------*/ @@ -165,58 +172,59 @@ void NOMAD::Stats::reset ( void ) /*---------------------------------------------------------*/ void NOMAD::Stats::update ( const NOMAD::Stats & s , bool for_search ) { - _eval += s._eval; - _sim_bb_eval += s._sim_bb_eval; - _sgte_eval += s._sgte_eval; - _bb_eval += s._bb_eval; - _block_eval += s._block_eval; - _failed_eval += s._failed_eval; - _cache_hits += s._cache_hits; - _interrupted_eval += s._interrupted_eval; - _nb_ext_polls += s._nb_ext_polls; - _ext_poll_pts += s._ext_poll_pts; - _ext_poll_succ += s._ext_poll_succ; - _ext_poll_bb_eval += s._ext_poll_bb_eval; - _ext_poll_descents += s._ext_poll_descents; - _nb_LH_searches += s._nb_LH_searches; - _LH_pts += s._LH_pts; - _LH_success += s._LH_success; - _nb_cache_searches += s._nb_cache_searches; - _CS_pts += s._CS_pts; - _CS_success += s._CS_success; - _nb_usr_searches += s._nb_usr_searches; - _usr_srch_pts += s._usr_srch_pts; - _usr_srch_success += s._usr_srch_success; - _nb_success_dyn_dir += s._nb_success_dyn_dir; - + _eval += s._eval; + _sim_bb_eval += s._sim_bb_eval; + _sgte_eval += s._sgte_eval; + _bb_eval += s._bb_eval; + _block_eval += s._block_eval; + _failed_eval += s._failed_eval; + _cache_hits += s._cache_hits; + _interrupted_eval += s._interrupted_eval; + _nb_ext_polls += s._nb_ext_polls; + _ext_poll_pts += s._ext_poll_pts; + _ext_poll_succ += s._ext_poll_succ; + _ext_poll_bb_eval += s._ext_poll_bb_eval; + _ext_poll_descents += s._ext_poll_descents; + _nb_LH_searches += s._nb_LH_searches; + _LH_pts += s._LH_pts; + _LH_success += s._LH_success; + _nb_cache_searches += s._nb_cache_searches; + _CS_pts += s._CS_pts; + _CS_success += s._CS_success; + _nb_usr_searches += s._nb_usr_searches; + _usr_srch_pts += s._usr_srch_pts; + _usr_srch_success += s._usr_srch_success; + _nb_success_dyn_dir += s._nb_success_dyn_dir; + #ifdef USE_MPI - _asynchronous_success += s._asynchronous_success; - _MPI_data_size = s._MPI_data_size; + _asynchronous_success += s._asynchronous_success; + _MPI_data_size = s._MPI_data_size; #endif - - // _stat_sum and _stat_avg: - int tmp = _cnt_avg + s._cnt_avg; - update_stat_sum ( s._stat_sum ); - update_stat_avg ( s._stat_avg ); - _cnt_avg = tmp; - - // specific updates when for_search==false: - if ( !for_search ) { - _nb_poll_searches += s._nb_poll_searches; - _poll_pts += s._poll_pts; - _poll_success += s._poll_success; - _nb_spec_searches += s._nb_spec_searches; - _spec_pts += s._spec_pts; - _spec_success += s._spec_success; - _nb_VNS_searches += s._nb_VNS_searches; - _VNS_pts += s._VNS_pts; - _VNS_success += s._VNS_success; - _VNS_bb_eval += s._VNS_bb_eval; - _VNS_sgte_eval += s._VNS_sgte_eval; - _p1_iterations += s._p1_iterations; - _p1_bbe += s._p1_bbe; - _iterations += s._iterations; - } + + // _stat_sum and _stat_avg: + int tmp = _cnt_avg + s._cnt_avg; + update_stat_sum ( s._stat_sum ); + update_stat_avg ( s._stat_avg ); + _cnt_avg = tmp; + + // specific updates when for_search==false: + if ( !for_search ) + { + _nb_poll_searches += s._nb_poll_searches; + _poll_pts += s._poll_pts; + _poll_success += s._poll_success; + _nb_spec_searches += s._nb_spec_searches; + _spec_pts += s._spec_pts; + _spec_success += s._spec_success; + _nb_VNS_searches += s._nb_VNS_searches; + _VNS_pts += s._VNS_pts; + _VNS_success += s._VNS_success; + _VNS_bb_eval += s._VNS_bb_eval; + _VNS_sgte_eval += s._VNS_sgte_eval; + _p1_iterations += s._p1_iterations; + _p1_bbe += s._p1_bbe; + _iterations += s._iterations; + } } /*---------------------------------------------------------*/ @@ -224,12 +232,12 @@ void NOMAD::Stats::update ( const NOMAD::Stats & s , bool for_search ) /*---------------------------------------------------------*/ void NOMAD::Stats::update_stat_sum ( const NOMAD::Double & d ) { - if ( !d.is_defined() ) - return; - if ( _stat_sum.is_defined() ) - _stat_sum += d; - else - _stat_sum = d; + if ( !d.is_defined() ) + return; + if ( _stat_sum.is_defined() ) + _stat_sum += d; + else + _stat_sum = d; } /*---------------------------------------------------------*/ @@ -237,13 +245,13 @@ void NOMAD::Stats::update_stat_sum ( const NOMAD::Double & d ) /*---------------------------------------------------------*/ void NOMAD::Stats::update_stat_avg ( const NOMAD::Double & d ) { - if ( !d.is_defined() ) - return; - if ( _stat_avg.is_defined() ) - _stat_avg += d; - else - _stat_avg = d; - ++_cnt_avg; + if ( !d.is_defined() ) + return; + if ( _stat_avg.is_defined() ) + _stat_avg += d; + else + _stat_avg = d; + ++_cnt_avg; } /*---------------------------------------------------------*/ @@ -251,115 +259,118 @@ void NOMAD::Stats::update_stat_avg ( const NOMAD::Double & d ) /*---------------------------------------------------------*/ void NOMAD::Stats::display ( const NOMAD::Display & out ) const { - out << "MADS iterations : " << _iterations; - if ( _p1_iterations > 0 ) - out << " (phase one: " << _p1_iterations << ")"; - out << std::endl; - if ( _sgte_cost > 0 ) - out << "bb evaluations (with sgte cost) : " << get_bb_eval(); - else - out << "blackbox evaluations : " << _bb_eval; - out << std::endl; - if ( _block_eval > 0) - out << "Block of evaluations : " << _block_eval; - if ( _p1_bbe > 0 ) - out << " (phase one: " << _p1_bbe << ")"; - out << std::endl; - if ( _sim_bb_eval != _bb_eval ) - out << "simulated blackbox evaluations : " << _sim_bb_eval << std::endl; - out << "evaluations : " << _eval << std::endl; - if ( _sgte_cost > 0 || _sgte_eval > 0 ) - out << "surrogate evaluations : " << _sgte_eval << std::endl; - out << "failed evaluations : " << _failed_eval; - if ( _failed_eval > 0 && _failed_eval==_bb_eval+_sgte_eval ) - out << " (all evaluations failed)"; - out << std::endl; - - out << "interrupted sequences of eval. : " << _interrupted_eval << std::endl; - - if ( _mads_runs > 1 ) - out << "number of MADS runs : " << _mads_runs << std::endl; - - out << "cache hits : " << _cache_hits << std::endl - - << "number of poll searches : " << _nb_poll_searches << std::endl; - if ( _nb_poll_searches > 0 ) - out << "poll successes : " << _poll_success << std::endl - << "poll points : " << _poll_pts << std::endl; - - out << "dyn. direction successes : " << _nb_success_dyn_dir << std::endl; - - if ( _nb_ext_polls > 0 ) - out << "number of extended polls : " << _nb_ext_polls << std::endl - << "number of ext. poll descents : " << _ext_poll_descents << std::endl - << "number of ext. poll successes : " << _ext_poll_succ << std::endl - << "number of ext. poll points : " << _ext_poll_pts << std::endl - << "number of ext. poll bb eval : " << _ext_poll_bb_eval << std::endl; - out << "number of speculative searches : " << _nb_spec_searches << std::endl; - if ( _nb_spec_searches > 0 ) - out << "speculative search successes : " << _spec_success << std::endl - << "speculative search points : " << _spec_pts << std::endl; - out << "number of user searches : " << _nb_usr_searches << std::endl; - if ( _nb_usr_searches > 0 ) - out << "user search successes : " << _usr_srch_success << std::endl - << "user search points : " << _usr_srch_pts << std::endl; - out << "number of LH searches : " << _nb_LH_searches << std::endl; - if ( _nb_LH_searches > 0 ) - out << "LH search successes : " << _LH_success << std::endl - << "LH search points : " << _LH_pts << std::endl; - out << "number of cache searches : " << _nb_cache_searches << std::endl; - if ( _nb_cache_searches > 0 ) - out << "cache search successes : " << _CS_success << std::endl - << "cache search points : " << _CS_pts << std::endl; - out << "number of VNS searches : " << _nb_VNS_searches << std::endl; - if ( _nb_VNS_searches > 0 ) { - out << "VNS search successes : " << _VNS_success << std::endl - << "VNS search points : " << _VNS_pts << std::endl - << "VNS blackbox evaluations : " << _VNS_bb_eval << std::endl; - if ( _VNS_sgte_eval > 0 ) - out << "VNS surrogate evaluations : " << _VNS_sgte_eval << std::endl; - } - if ( _model_stats.get_nb_models() > 0 ) { + out << "MADS iterations : " << _iterations; + if ( _p1_iterations > 0 ) + out << " (phase one: " << _p1_iterations << ")"; + out << std::endl; + if ( _sgte_cost > 0 ) + out << "bb evaluations (with sgte cost) : " << get_bb_eval(); + else + out << "blackbox evaluations : " << _bb_eval; + out << std::endl; + if ( _block_eval > 0) + out << "Block of evaluations : " << _block_eval; + if ( _p1_bbe > 0 ) + out << " (phase one: " << _p1_bbe << ")"; + out << std::endl; + if ( _sim_bb_eval != _bb_eval ) + out << "simulated blackbox evaluations : " << _sim_bb_eval << std::endl; + out << "evaluations : " << _eval << std::endl; + if ( _sgte_cost > 0 || _sgte_eval > 0 ) + out << "surrogate evaluations : " << _sgte_eval << std::endl; + out << "failed evaluations : " << _failed_eval; + if ( _failed_eval > 0 && _failed_eval==_bb_eval+_sgte_eval ) + out << " (all evaluations failed)"; + out << std::endl; + + out << "interrupted sequences of eval. : " << _interrupted_eval << std::endl; + + if ( _mads_runs > 1 ) + out << "number of MADS runs : " << _mads_runs << std::endl; + + out << "cache hits : " << _cache_hits << std::endl + + << "number of poll searches : " << _nb_poll_searches << std::endl; + if ( _nb_poll_searches > 0 ) + out << "poll successes : " << _poll_success << std::endl + << "poll points : " << _poll_pts << std::endl; + + out << "dyn. direction successes : " << _nb_success_dyn_dir << std::endl; + + if ( _nb_ext_polls > 0 ) + out << "number of extended polls : " << _nb_ext_polls << std::endl + << "number of ext. poll descents : " << _ext_poll_descents << std::endl + << "number of ext. poll successes : " << _ext_poll_succ << std::endl + << "number of ext. poll points : " << _ext_poll_pts << std::endl + << "number of ext. poll bb eval : " << _ext_poll_bb_eval << std::endl; + out << "number of speculative searches : " << _nb_spec_searches << std::endl; + if ( _nb_spec_searches > 0 ) + out << "speculative search successes : " << _spec_success << std::endl + << "speculative search points : " << _spec_pts << std::endl; + out << "number of user searches : " << _nb_usr_searches << std::endl; + if ( _nb_usr_searches > 0 ) + out << "user search successes : " << _usr_srch_success << std::endl + << "user search points : " << _usr_srch_pts << std::endl; + out << "number of LH searches : " << _nb_LH_searches << std::endl; + if ( _nb_LH_searches > 0 ) + out << "LH search successes : " << _LH_success << std::endl + << "LH search points : " << _LH_pts << std::endl; + out << "number of cache searches : " << _nb_cache_searches << std::endl; + if ( _nb_cache_searches > 0 ) + out << "cache search successes : " << _CS_success << std::endl + << "cache search points : " << _CS_pts << std::endl; + out << "number of VNS searches : " << _nb_VNS_searches << std::endl; + if ( _nb_VNS_searches > 0 ) + { + out << "VNS search successes : " << _VNS_success << std::endl + << "VNS search points : " << _VNS_pts << std::endl + << "VNS blackbox evaluations : " << _VNS_bb_eval << std::endl; + if ( _VNS_sgte_eval > 0 ) + out << "VNS surrogate evaluations : " << _VNS_sgte_eval << std::endl; + } + if ( _model_stats.get_nb_models() > 0 ) + { #ifdef DEBUG - out << NOMAD::open_block ( "model stats" ) - << _model_stats - << NOMAD::close_block(); + out << NOMAD::open_block ( "model stats" ) + << _model_stats + << NOMAD::close_block(); #else - out << "number of models built : " - << _model_stats.get_nb_models() << std::endl - << "number of model searches : " - << _model_stats.get_MS_nb_searches() << std::endl; - if ( _model_stats.get_MS_nb_searches() > 0 ) { - out << "model search successes : " - << _model_stats.get_MS_success() << std::endl - << "model search points : " - << _model_stats.get_MS_pts() << std::endl - << "model search blackbox eval. : " - << _model_stats.get_MS_bb_eval() << std::endl; - if ( _model_stats.get_MS_sgte_eval() > 0 ) - out << "model search sgte evaluations : " - << _model_stats.get_MS_sgte_eval() << std::endl; - } + out << "number of models built : " + << _model_stats.get_nb_models() << std::endl + << "number of model searches : " + << _model_stats.get_MS_nb_searches() << std::endl; + if ( _model_stats.get_MS_nb_searches() > 0 ) + { + out << "model search successes : " + << _model_stats.get_MS_success() << std::endl + << "model search points : " + << _model_stats.get_MS_pts() << std::endl + << "model search blackbox eval. : " + << _model_stats.get_MS_bb_eval() << std::endl; + if ( _model_stats.get_MS_sgte_eval() > 0 ) + out << "model search sgte evaluations : " + << _model_stats.get_MS_sgte_eval() << std::endl; + } #endif - } - else - out << "no model has been constructed" << std::endl; + } + else + out << "no model has been constructed" << std::endl; #ifdef USE_MPI - out << "number of asynchronous successes: " << _asynchronous_success << std::endl; - out << "total size of MPI communications: "; - if ( _MPI_data_size < 0 ) - out << "-"; - else - out.display_size_of ( _MPI_data_size ); - out << std::endl; + out << "number of asynchronous successes: " << _asynchronous_success << std::endl; + out << "total size of MPI communications: "; + if ( _MPI_data_size < 0 ) + out << "-"; + else + out.display_size_of ( _MPI_data_size ); + out << std::endl; #endif - - out << "wall-clock time : "; - out.display_time ( _clock.get_real_time() ); - out << std::endl; - - if ( _stat_sum.is_defined() ) - out << "stat sum : " << _stat_sum << std::endl; - if ( _stat_avg.is_defined() ) - out << "stat avg : " << get_stat_avg() << std::endl; - } + + out << "wall-clock time : "; + out.display_time ( _clock.get_real_time() ); + out << std::endl; + + if ( _stat_sum.is_defined() ) + out << "stat sum : " << _stat_sum << std::endl; + if ( _stat_avg.is_defined() ) + out << "stat avg : " << get_stat_avg() << std::endl; +} diff --git a/src/Stats.hpp b/src/Stats.hpp index db9cf2a..f26323d 100644 --- a/src/Stats.hpp +++ b/src/Stats.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file Stats.hpp - \brief Algorithm stats (headers) - \author Sebastien Le Digabel - \date 2010-04-22 - \see Stats.cpp -*/ + \file Stats.hpp + \brief Algorithm stats (headers) + \author Sebastien Le Digabel + \date 2010-04-22 + \see Stats.cpp + */ #ifndef __STATS__ #define __STATS__ @@ -48,493 +55,494 @@ #include "Model_Stats.hpp" namespace NOMAD { - - /// Algorithm stats. - class Stats { - - private: - - /// Number of evaluations. - /** - Blackbox evaluations + cache hits. - */ - int _eval; - - /// Number of simulated blackbox evaluations. - /** - Blackbox evaluations + initial cache hits. - */ - int _sim_bb_eval; - - int _sgte_eval; ///< Number of surrogate evaluations. - int _sgte_cost; ///< Surrogate cost. - int _bb_eval; ///< Number of blackbox evaluations. - int _block_eval; ///< Number of block of evaluations. - int _failed_eval; ///< Number of failed evaluations. - int _cache_hits; ///< Number of cache hits. - int _interrupted_eval; ///< Number of interrupted sequence of evaluations. - int _iterations; ///< Number of iterations. - NOMAD::Double _stat_sum; ///< Sum stat (output of type NOMAD::STAT_SUM). - NOMAD::Double _stat_avg; ///< Average stat (output of type NOMAD::STAT_AVG). - int _cnt_avg; ///< Number of values for the \c avg stat. - int _p1_iterations; ///< Iterations in MADS phase one. - int _p1_bbe; ///< Blackbox evaluations in phase one. - NOMAD::Clock _clock; ///< Wall-clock time. - int _mads_runs; ///< Number of MADS runs (for multi-objective runs). - - // Polls: - int _nb_poll_searches; ///< Number of poll searches. - int _poll_pts; ///< Number of poll points. - int _poll_success; ///< Number of poll successes. - - // Extended polls: - int _nb_ext_polls; ///< Number of extended polls. - int _ext_poll_pts; ///< Number of extended poll points. - int _ext_poll_succ; ///< Number of extended poll successes. - int _ext_poll_bb_eval; ///< Number of extended poll blackbox evaluations. - int _ext_poll_descents; ///< Number of extended poll descents. - - // Speculative searches: - int _nb_spec_searches; ///< Number of speculative searches. - int _spec_pts; ///< Number of speculative search points. - int _spec_success; ///< Number of speculative search successes. - + + /// Algorithm stats. + class Stats { + + private: + + /// Number of evaluations. + /** + Blackbox evaluations + cache hits. + */ + int _eval; + + /// Number of simulated blackbox evaluations. + /** + Blackbox evaluations + initial cache hits. + */ + int _sim_bb_eval; + + int _sgte_eval; ///< Number of surrogate evaluations. + int _sgte_cost; ///< Surrogate cost. + int _bb_eval; ///< Number of blackbox evaluations. + int _block_eval; ///< Number of block of evaluations. + int _failed_eval; ///< Number of failed evaluations. + int _cache_hits; ///< Number of cache hits. + int _interrupted_eval; ///< Number of interrupted sequence of evaluations. + int _iterations; ///< Number of iterations. + NOMAD::Double _stat_sum; ///< Sum stat (output of type NOMAD::STAT_SUM). + NOMAD::Double _stat_avg; ///< Average stat (output of type NOMAD::STAT_AVG). + int _cnt_avg; ///< Number of values for the \c avg stat. + int _p1_iterations; ///< Iterations in MADS phase one. + int _p1_bbe; ///< Blackbox evaluations in phase one. + NOMAD::Clock _clock; ///< Wall-clock time. + int _mads_runs; ///< Number of MADS runs (for multi-objective runs). + + // Polls: + int _nb_poll_searches; ///< Number of poll searches. + int _poll_pts; ///< Number of poll points. + int _poll_success; ///< Number of poll successes. + + // Extended polls: + int _nb_ext_polls; ///< Number of extended polls. + int _ext_poll_pts; ///< Number of extended poll points. + int _ext_poll_succ; ///< Number of extended poll successes. + int _ext_poll_bb_eval; ///< Number of extended poll blackbox evaluations. + int _ext_poll_descents; ///< Number of extended poll descents. + + // Speculative searches: + int _nb_spec_searches; ///< Number of speculative searches. + int _spec_pts; ///< Number of speculative search points. + int _spec_success; ///< Number of speculative search successes. + #ifdef USE_MPI - int _asynchronous_success; ///< Number of asynchronous successes. - int _MPI_data_size; ///< Size of MPI messages. + int _asynchronous_success; ///< Number of asynchronous successes. + int _MPI_data_size; ///< Size of MPI messages. #endif - - // LH searches: - int _nb_LH_searches; ///< Number of Latin-Hypercube (LH) searches. - int _LH_pts; ///< Number of Latin-Hypercube (LH) search points. - int _LH_success; ///< Number of LH search successes. - - // Cache searches: - int _nb_cache_searches; ///< Number of cache searches (CS). - int _CS_pts; ///< Number of CS search points. - int _CS_success; ///< Number of CS search successes. - - /// Model stats. - NOMAD::Model_Stats _model_stats; - - // VNS searches: - int _nb_VNS_searches; ///< Number of VNS searches. - int _VNS_pts; ///< Number of VNS search points. - int _VNS_success; ///< Number of VNS search successes. - int _VNS_bb_eval; ///< Number of VNS blackbox evaluations. - int _VNS_sgte_eval; ///< Number of VNS surrogate evaluations. - - // User searches: - int _nb_usr_searches; ///< Number of user searches. - int _usr_srch_pts; ///< Number of user search points. - int _usr_srch_success; ///< Number of user search successes. - - // Dynamic management of poll directions - int _nb_success_dyn_dir; ///< Number of successfull polling in the direction added dynamically - - -public: - - /// Constructor. - /** - \param sgte_cost Surrogate cost -- \b IN -- \b optional (default = \c -1). - */ - explicit Stats ( int sgte_cost = -1 ) : _sgte_cost(sgte_cost) { reset(); } - - /// Copy constructor. - /** - \param s The copied object -- \b IN. - */ - explicit Stats ( const Stats & s ) - : _eval ( s._eval ) , - _sim_bb_eval ( s._sim_bb_eval ) , - _sgte_eval ( s._sgte_eval ) , - _sgte_cost ( s._sgte_cost ) , - _bb_eval ( s._bb_eval ) , - _block_eval ( s._block_eval ) , - _failed_eval ( s._failed_eval ) , - _cache_hits ( s._cache_hits ) , - _interrupted_eval ( s._interrupted_eval ) , - _iterations ( s._iterations ) , - _stat_sum ( s._stat_sum ) , - _stat_avg ( s._stat_avg ) , - _cnt_avg ( s._cnt_avg ) , - _p1_iterations ( s._p1_iterations ) , - _p1_bbe ( s._p1_bbe ) , - _clock ( s._clock ) , - _mads_runs ( s._mads_runs ) , - _nb_poll_searches ( s._nb_poll_searches ) , - _poll_pts ( s._poll_pts ) , - _poll_success ( s._poll_success ) , - _nb_ext_polls ( s._nb_ext_polls ) , - _ext_poll_pts ( s._ext_poll_pts ) , - _ext_poll_succ ( s._ext_poll_succ ) , - _ext_poll_bb_eval ( s._ext_poll_bb_eval ) , - _ext_poll_descents ( s._ext_poll_descents ) , - _nb_spec_searches ( s._nb_spec_searches ) , - _spec_pts ( s._spec_pts ) , - _spec_success ( s._spec_success ) , + + // LH searches: + int _nb_LH_searches; ///< Number of Latin-Hypercube (LH) searches. + int _LH_pts; ///< Number of Latin-Hypercube (LH) search points. + int _LH_success; ///< Number of LH search successes. + + // Cache searches: + int _nb_cache_searches; ///< Number of cache searches (CS). + int _CS_pts; ///< Number of CS search points. + int _CS_success; ///< Number of CS search successes. + + /// Model stats. + NOMAD::Model_Stats _model_stats; + + // VNS searches: + int _nb_VNS_searches; ///< Number of VNS searches. + int _VNS_pts; ///< Number of VNS search points. + int _VNS_success; ///< Number of VNS search successes. + int _VNS_bb_eval; ///< Number of VNS blackbox evaluations. + int _VNS_sgte_eval; ///< Number of VNS surrogate evaluations. + + // User searches: + int _nb_usr_searches; ///< Number of user searches. + int _usr_srch_pts; ///< Number of user search points. + int _usr_srch_success; ///< Number of user search successes. + + // Dynamic management of poll directions + int _nb_success_dyn_dir; ///< Number of successfull polling in the direction added dynamically + + + public: + + /// Constructor. + /** + \param sgte_cost Surrogate cost -- \b IN -- \b optional (default = \c -1). + */ + explicit Stats ( int sgte_cost = -1 ) : _sgte_cost(sgte_cost) { reset(); } + + /// Copy constructor. + /** + \param s The copied object -- \b IN. + */ + explicit Stats ( const Stats & s ) + : _eval ( s._eval ) , + _sim_bb_eval ( s._sim_bb_eval ) , + _sgte_eval ( s._sgte_eval ) , + _sgte_cost ( s._sgte_cost ) , + _bb_eval ( s._bb_eval ) , + _block_eval ( s._block_eval ) , + _failed_eval ( s._failed_eval ) , + _cache_hits ( s._cache_hits ) , + _interrupted_eval ( s._interrupted_eval ) , + _iterations ( s._iterations ) , + _stat_sum ( s._stat_sum ) , + _stat_avg ( s._stat_avg ) , + _cnt_avg ( s._cnt_avg ) , + _p1_iterations ( s._p1_iterations ) , + _p1_bbe ( s._p1_bbe ) , + _clock ( s._clock ) , + _mads_runs ( s._mads_runs ) , + _nb_poll_searches ( s._nb_poll_searches ) , + _poll_pts ( s._poll_pts ) , + _poll_success ( s._poll_success ) , + _nb_ext_polls ( s._nb_ext_polls ) , + _ext_poll_pts ( s._ext_poll_pts ) , + _ext_poll_succ ( s._ext_poll_succ ) , + _ext_poll_bb_eval ( s._ext_poll_bb_eval ) , + _ext_poll_descents ( s._ext_poll_descents ) , + _nb_spec_searches ( s._nb_spec_searches ) , + _spec_pts ( s._spec_pts ) , + _spec_success ( s._spec_success ) , #ifdef USE_MPI - _asynchronous_success ( s._asynchronous_success ) , - _MPI_data_size ( s._MPI_data_size ) , + _asynchronous_success ( s._asynchronous_success ) , + _MPI_data_size ( s._MPI_data_size ) , #endif - _nb_LH_searches ( s._nb_LH_searches ) , - _LH_pts ( s._LH_pts ) , - _LH_success ( s._LH_success ) , - _nb_cache_searches ( s._nb_cache_searches ) , - _CS_pts ( s._CS_pts ) , - _CS_success ( s._CS_success ) , - _nb_VNS_searches ( s._nb_VNS_searches ) , - _VNS_pts ( s._VNS_pts ) , - _VNS_success ( s._VNS_success ) , - _VNS_bb_eval ( s._VNS_bb_eval ) , - _VNS_sgte_eval ( s._VNS_sgte_eval ) , - _nb_usr_searches ( s._nb_usr_searches ) , - _usr_srch_pts ( s._usr_srch_pts ) , - _usr_srch_success ( s._usr_srch_success ) , - _nb_success_dyn_dir ( s._nb_success_dyn_dir ) {} - - /// Affectation operator. - /** - \param s The right-hand side object -- \b IN. - */ - Stats & operator = ( const Stats & s ); - - /// Destructor. - virtual ~Stats ( void ) {} - - /// Reset the stats. - void reset ( void ); - - /// Update stats from another NOMAD::Stats object. - /** - \param s The other NOMAD::Stats object -- \b IN. - \param for_search A flag equal to \c true if the method - has been invoked within a search step - -- \b IN. - */ - void update ( const Stats & s , bool for_search ); - - /// Update the \c sum stat. - /** - \param d New \c sum element -- \b IN. - */ - void update_stat_sum ( const NOMAD::Double & d ); - - /// Update the \c avg stat. - /** - \param d New \c avg element -- \b IN. - */ - void update_stat_avg ( const NOMAD::Double & d ); - - /// Add \c 1 to stat \c _mads_run. - void add_mads_run ( void ) { ++_mads_runs; } - - /// Set the number of MADS runs. - void set_mads_runs ( int mads_runs ) { _mads_runs = mads_runs; } - - /// Add \c 1 to stat \c _eval. - void add_eval ( void ) { ++_eval; } - - /// Add \c 1 to stat \c _sim_bb_eval. - void add_sim_bb_eval ( void ) { ++_sim_bb_eval; } - - /// Add \c 1 to stat \c _sgte_eval. - void add_sgte_eval ( void ) { ++_sgte_eval; } - - /// Add \c count_eval to stat \c _sgte_eval. - void add_sgte_eval ( int count_eval ) { _sgte_eval+=count_eval; } - - /// Add \c 1 to stat \c _bb_eval. - void add_bb_eval ( void ) { ++_bb_eval; } - - /// Add \c 1 to stat \c _block_eval. - void add_one_block_eval ( void ) { ++_block_eval; } - - /// Add \c count_eval to stat \c _bb_eval. - void add_bb_eval ( int count_eval ) { _bb_eval+=count_eval; } - - /// Add \c 1 to stat \c _failed_eval. - void add_failed_eval ( void ) { ++_failed_eval; } - - /// Add \c 1 to stat \c _cache_hits. - void add_cache_hit ( void ) { ++_cache_hits; } - - /// Add \c 1 to stat \c _interrupted_eval. - void add_interrupted_eval ( void ) { ++_interrupted_eval; } - - /// Add \c 1 to stat \c _iterations. - void add_iteration ( void ) { ++_iterations; } - - /// Add \c 1 to stat \c _nb_poll_searches. - void add_nb_poll_searches ( void ) { ++_nb_poll_searches; } - - /// Add \c 1 to stat \c _poll_success. - void add_poll_success ( void ) { ++_poll_success; } - - /// Add \c 1 to stat \c _nb_ext_polls. - void add_nb_ext_polls ( void ) { ++_nb_ext_polls; } - - /// Add \c 1 to stat \c _ext_poll_succ. - void add_ext_poll_succ ( void ) { ++_ext_poll_succ; } - - /// Add \c 1 to stat \c _ext_poll_descents. - void add_ext_poll_descent ( void ) { ++_ext_poll_descents; } - - /// Add \c 1 to stat \c _nb_spec_searches. - void add_nb_spec_searches ( void ) { ++_nb_spec_searches; } - - /// Add \c 1 to stat \c _spec_success. - void add_spec_success ( void ) { ++_spec_success; } - - /// Add \c 1 to stat \c _LH_success. - void add_LH_success ( void ) { ++_LH_success; } - - /// Add \c 1 to stat \c _nb_cache_searches. - void add_nb_cache_searches ( void ) { ++_nb_cache_searches; } - - /// Add \c 1 to stat \c _nb_LH_searches. - void add_nb_LH_searches ( void ) { ++_nb_LH_searches; } - - /// Add \c 1 to stat \c _CS_success. - void add_CS_success ( void ) { ++_CS_success; } - - /// Add \c 1 to stat \c _nb_VNS_searches. - void add_nb_VNS_searches ( void ) { ++_nb_VNS_searches; } - - /// Add \c 1 to stat \c _VNS_success. - void add_VNS_success ( void ) { ++_VNS_success; } - - /// Add \c 1 to stat \c _nb_usr_searches. - void add_nb_usr_searches ( void ) { ++_nb_usr_searches; } - - /// Add \c 1 to stat \c _usr_srch_success. - void add_usr_srch_success ( void ) { ++_usr_srch_success; } - - - /// Add \c 1 to stat \c _nb_success_dyn_dir. - void add_nb_success_dyn_dir(void) {++_nb_success_dyn_dir;} - - /// Add an integer to stat \c _p1_iterations. - /** - \param i The integer -- \b IN. - */ - void add_p1_iterations ( int i ) { _p1_iterations += i; } - - /// Add an integer to stat \c _p1_bbe. - /** - \param i The integer -- \b IN. - */ - void add_p1_bbe ( int i ) { _p1_bbe += i; } - - /// Add an integer to stat \c _poll_pts. - /** - \param i The integer -- \b IN. - */ - void add_poll_pts ( int i ) { _poll_pts += i; } - - /// Add an integer to stat \c _ext_poll_pts. - /** - \param i The integer -- \b IN. - */ - void add_ext_poll_pts ( int i ) { _ext_poll_pts += i; } - - /// Add an integer to stat \c _ext_poll_bb_eval. - /** - \param i The integer -- \b IN. - */ - void add_ext_poll_bb_eval ( int i ) { _ext_poll_bb_eval += i;} - - /// Add an integer to stat \c _spec_pts. - /** - \param i The integer -- \b IN. - */ - void add_spec_pts ( int i ) { _spec_pts += i; } - - /// Add an integer to stat \c _LH_pts. - /** - \param i The integer -- \b IN. - */ - void add_LH_pts ( int i ) { _LH_pts += i; } - - /// Add an integer to stat \c _CS_pts. - /** - \param i The integer -- \b IN. - */ - void add_CS_pts ( int i ) { _CS_pts += i; } - - /// Update model stats. - void update_model_stats ( const NOMAD::Model_Stats & ms ) - { - _model_stats.update ( ms ); - } - - /// Add an integer to stat \c _VNS_pts. - /** - \param i The integer -- \b IN. - */ - void add_VNS_pts ( int i ) { _VNS_pts += i; } - - /// Add an integer to stat \c _VNS_bb_eval. - /** - \param i The integer -- \b IN. - */ - void add_VNS_bb_eval ( int i ) { _VNS_bb_eval += i; } - - /// Add an integer to stat \c _VNS_sgte_eval. - /** - \param i The integer -- \b IN. - */ - void add_VNS_sgte_eval ( int i ) { _VNS_sgte_eval += i; } - - /// Add an integer to stat \c _usr_srch_pts. - /** - \param i The integer -- \b IN. - */ - void add_usr_srch_pts ( int i ) { _usr_srch_pts += i; } - + _nb_LH_searches ( s._nb_LH_searches ) , + _LH_pts ( s._LH_pts ) , + _LH_success ( s._LH_success ) , + _nb_cache_searches ( s._nb_cache_searches ) , + _CS_pts ( s._CS_pts ) , + _CS_success ( s._CS_success ) , + _nb_VNS_searches ( s._nb_VNS_searches ) , + _VNS_pts ( s._VNS_pts ) , + _VNS_success ( s._VNS_success ) , + _VNS_bb_eval ( s._VNS_bb_eval ) , + _VNS_sgte_eval ( s._VNS_sgte_eval ) , + _nb_usr_searches ( s._nb_usr_searches ) , + _usr_srch_pts ( s._usr_srch_pts ) , + _usr_srch_success ( s._usr_srch_success ) , + _nb_success_dyn_dir ( s._nb_success_dyn_dir ) {} + + /// Affectation operator. + /** + \param s The right-hand side object -- \b IN. + */ + Stats & operator = ( const Stats & s ); + + /// Destructor. + virtual ~Stats ( void ) {} + + /// Reset the stats. + void reset ( void ); + + /// Update stats from another NOMAD::Stats object. + /** + \param s The other NOMAD::Stats object -- \b IN. + \param for_search A flag equal to \c true if the method + has been invoked within a search step + -- \b IN. + */ + void update ( const Stats & s , bool for_search ); + + /// Update the \c sum stat. + /** + \param d New \c sum element -- \b IN. + */ + void update_stat_sum ( const NOMAD::Double & d ); + + /// Update the \c avg stat. + /** + \param d New \c avg element -- \b IN. + */ + void update_stat_avg ( const NOMAD::Double & d ); + + /// Add \c 1 to stat \c _mads_run. + void add_mads_run ( void ) { ++_mads_runs; } + + /// Set the number of MADS runs. + void set_mads_runs ( int mads_runs ) { _mads_runs = mads_runs; } + + /// Add \c 1 to stat \c _eval. + void add_eval ( void ) { ++_eval; } + + /// Add \c 1 to stat \c _sim_bb_eval. + void add_sim_bb_eval ( void ) { ++_sim_bb_eval; } + + /// Add \c 1 to stat \c _sgte_eval. + void add_sgte_eval ( void ) { ++_sgte_eval; } + + /// Add \c count_eval to stat \c _sgte_eval. + void add_sgte_eval ( int count_eval ) { _sgte_eval+=count_eval; } + + /// Add \c 1 to stat \c _bb_eval. + void add_bb_eval ( void ) { ++_bb_eval; } + + /// Add \c 1 to stat \c _block_eval. + void add_one_block_eval ( void ) { ++_block_eval; } + + /// Add \c count_eval to stat \c _bb_eval. + void add_bb_eval ( int count_eval ) { _bb_eval+=count_eval; } + + /// Add \c 1 to stat \c _failed_eval. + void add_failed_eval ( void ) { ++_failed_eval; } + + /// Add \c 1 to stat \c _cache_hits. + void add_cache_hit ( void ) { ++_cache_hits; } + + /// Add \c 1 to stat \c _interrupted_eval. + void add_interrupted_eval ( void ) { ++_interrupted_eval; } + + /// Add \c 1 to stat \c _iterations. + void add_iteration ( void ) { ++_iterations; } + + /// Add \c 1 to stat \c _nb_poll_searches. + void add_nb_poll_searches ( void ) { ++_nb_poll_searches; } + + /// Add \c 1 to stat \c _poll_success. + void add_poll_success ( void ) { ++_poll_success; } + + /// Add \c 1 to stat \c _nb_ext_polls. + void add_nb_ext_polls ( void ) { ++_nb_ext_polls; } + + /// Add \c 1 to stat \c _ext_poll_succ. + void add_ext_poll_succ ( void ) { ++_ext_poll_succ; } + + /// Add \c 1 to stat \c _ext_poll_descents. + void add_ext_poll_descent ( void ) { ++_ext_poll_descents; } + + /// Add \c 1 to stat \c _nb_spec_searches. + void add_nb_spec_searches ( void ) { ++_nb_spec_searches; } + + /// Add \c 1 to stat \c _spec_success. + void add_spec_success ( void ) { ++_spec_success; } + + /// Add \c 1 to stat \c _LH_success. + void add_LH_success ( void ) { ++_LH_success; } + + /// Add \c 1 to stat \c _nb_cache_searches. + void add_nb_cache_searches ( void ) { ++_nb_cache_searches; } + + /// Add \c 1 to stat \c _nb_LH_searches. + void add_nb_LH_searches ( void ) { ++_nb_LH_searches; } + + /// Add \c 1 to stat \c _CS_success. + void add_CS_success ( void ) { ++_CS_success; } + + /// Add \c 1 to stat \c _nb_VNS_searches. + void add_nb_VNS_searches ( void ) { ++_nb_VNS_searches; } + + /// Add \c 1 to stat \c _VNS_success. + void add_VNS_success ( void ) { ++_VNS_success; } + + /// Add \c 1 to stat \c _nb_usr_searches. + void add_nb_usr_searches ( void ) { ++_nb_usr_searches; } + + /// Add \c 1 to stat \c _usr_srch_success. + void add_usr_srch_success ( void ) { ++_usr_srch_success; } + + + /// Add \c 1 to stat \c _nb_success_dyn_dir. + void add_nb_success_dyn_dir(void) {++_nb_success_dyn_dir;} + + /// Add an integer to stat \c _p1_iterations. + /** + \param i The integer -- \b IN. + */ + void add_p1_iterations ( int i ) { _p1_iterations += i; } + + /// Add an integer to stat \c _p1_bbe. + /** + \param i The integer -- \b IN. + */ + void add_p1_bbe ( int i ) { _p1_bbe += i; } + + /// Add an integer to stat \c _poll_pts. + /** + \param i The integer -- \b IN. + */ + void add_poll_pts ( int i ) { _poll_pts += i; } + + /// Add an integer to stat \c _ext_poll_pts. + /** + \param i The integer -- \b IN. + */ + void add_ext_poll_pts ( int i ) { _ext_poll_pts += i; } + + /// Add an integer to stat \c _ext_poll_bb_eval. + /** + \param i The integer -- \b IN. + */ + void add_ext_poll_bb_eval ( int i ) { _ext_poll_bb_eval += i;} + + /// Add an integer to stat \c _spec_pts. + /** + \param i The integer -- \b IN. + */ + void add_spec_pts ( int i ) { _spec_pts += i; } + + /// Add an integer to stat \c _LH_pts. + /** + \param i The integer -- \b IN. + */ + void add_LH_pts ( int i ) { _LH_pts += i; } + + /// Add an integer to stat \c _CS_pts. + /** + \param i The integer -- \b IN. + */ + void add_CS_pts ( int i ) { _CS_pts += i; } + + /// Update model stats. + void update_model_stats ( const NOMAD::Model_Stats & ms ) + { + _model_stats.update ( ms ); + } + + /// Add an integer to stat \c _VNS_pts. + /** + \param i The integer -- \b IN. + */ + void add_VNS_pts ( int i ) { _VNS_pts += i; } + + /// Add an integer to stat \c _VNS_bb_eval. + /** + \param i The integer -- \b IN. + */ + void add_VNS_bb_eval ( int i ) { _VNS_bb_eval += i; } + + /// Add an integer to stat \c _VNS_sgte_eval. + /** + \param i The integer -- \b IN. + */ + void add_VNS_sgte_eval ( int i ) { _VNS_sgte_eval += i; } + + /// Add an integer to stat \c _usr_srch_pts. + /** + \param i The integer -- \b IN. + */ + void add_usr_srch_pts ( int i ) { _usr_srch_pts += i; } + #ifdef USE_MPI - - /// Add \c 1 to stat \c _asynchronous_success. - void add_asynchronous_success ( void ) { ++_asynchronous_success; } - - /// Add an integer to stat \c _MPI_data_size. - /** - \param i The integer -- \b IN. - */ - void set_MPI_data_size ( int i ) { _MPI_data_size = i; } + + /// Add \c 1 to stat \c _asynchronous_success. + void add_asynchronous_success ( void ) { ++_asynchronous_success; } + + /// Add an integer to stat \c _MPI_data_size. + /** + \param i The integer -- \b IN. + */ + void set_MPI_data_size ( int i ) { _MPI_data_size = i; } #endif - - /// Access to the stat \c _eval. - /** - \return The stat \c _eval. - */ - int get_eval ( void ) const { return _eval; } - - /// Access to the stat \c _sim_bb_eval. - /** - \return The stat \c _sim_bb_eval. - */ - int get_sim_bb_eval ( void ) const { return _sim_bb_eval; } - - /// Access to the stat \c _sgte_eval. - /** - \return The stat \c _sgte_eval. - */ - int get_sgte_eval ( void ) const { return _sgte_eval; } - - /// Access to the real time stat. - /** - \return The real time stat. - */ - int get_real_time ( void ) const { return _clock.get_real_time(); } - - /// Access to the stat \c _iterations. - /** - \return The stat \c _iterations. - */ - int get_iterations ( void ) const { return _iterations; } - - /// Access to the stat \c _failed_eval. - /** - \return The stat \c _failed_eval. - */ - int get_failed_eval ( void ) const { return _failed_eval; } - - /// Access to the stat \c _mads_runs. - /** - \return The stat \c _mads_runs. - */ - int get_mads_runs ( void ) const { return _mads_runs; } - - /// Access to the stat \c _LH_pts. - /** - \return The stat \c _LH_pts. - */ - int get_LH_pts ( void ) const { return _LH_pts; } - - /// Access to the stat \c _CS_pts. - /** - \return The stat \c _CS_pts. - */ - int get_CS_pts ( void ) const { return _CS_pts; } - - /// Access to the stat \c _VNS_bb_eval. - /** - \return The stat \c _VNS_bb_eval. - */ - int get_VNS_bb_eval ( void ) const { return _VNS_bb_eval; } - - /// Access to the stat \c _VNS_sgte_eval. - /** - \return The stat \c _VNS_sgte_eval. - */ - int get_VNS_sgte_eval ( void ) const { return _VNS_sgte_eval; } - - /// Access to the number of cache hits. - /** - \return The number of cache hits. - */ - int get_cache_hits ( void ) const { return _cache_hits; } - - /// Access to the number of blackbox evaluations (includes surrogate cost). - /** - \return The number of blackbox evaluations. - */ - int get_bb_eval ( void ) const - { - return ( _sgte_cost > 0 ) ? _bb_eval + _sgte_eval / _sgte_cost : _bb_eval; - } - - - /// Access to the number of block of evaluations (includes bb and surrogates). - /** - \return The number of blackbox evaluations. - */ - int get_block_eval ( void ) const - { - return _block_eval; - } - - /// Access to the \c sum stat. - /** - \return The \c sum stat. - */ - NOMAD::Double get_stat_sum ( void ) const { return _stat_sum; } - - /// Access to the \c avg stat. - /** - \return The \c avg stat. - */ - NOMAD::Double get_stat_avg ( void ) const - { - return ( _cnt_avg > 0 ) ? _stat_avg/_cnt_avg : NOMAD::Double(); - } - - /// Access to the model stats. - /** - \return The model stats. - */ - const NOMAD::Model_Stats & get_model_stats ( void ) const { return _model_stats; } - - /// Display. + + /// Access to the stat \c _eval. + /** + \return The stat \c _eval. + */ + int get_eval ( void ) const { return _eval; } + + /// Access to the stat \c _sim_bb_eval. + /** + \return The stat \c _sim_bb_eval. + */ + int get_sim_bb_eval ( void ) const { return _sim_bb_eval; } + + /// Access to the stat \c _sgte_eval. + /** + \return The stat \c _sgte_eval. + */ + int get_sgte_eval ( void ) const { return _sgte_eval; } + + /// Access to the real time stat. + /** + \return The real time stat. + */ + int get_real_time ( void ) const { return _clock.get_real_time(); } + + /// Access to the stat \c _iterations. + /** + \return The stat \c _iterations. + */ + int get_iterations ( void ) const { return _iterations; } + + /// Access to the stat \c _failed_eval. + /** + \return The stat \c _failed_eval. + */ + int get_failed_eval ( void ) const { return _failed_eval; } + + /// Access to the stat \c _mads_runs. + /** + \return The stat \c _mads_runs. + */ + int get_mads_runs ( void ) const { return _mads_runs; } + + /// Access to the stat \c _LH_pts. + /** + \return The stat \c _LH_pts. + */ + int get_LH_pts ( void ) const { return _LH_pts; } + + /// Access to the stat \c _CS_pts. + /** + \return The stat \c _CS_pts. + */ + int get_CS_pts ( void ) const { return _CS_pts; } + + /// Access to the stat \c _VNS_bb_eval. + /** + \return The stat \c _VNS_bb_eval. + */ + int get_VNS_bb_eval ( void ) const { return _VNS_bb_eval; } + + /// Access to the stat \c _VNS_sgte_eval. + /** + \return The stat \c _VNS_sgte_eval. + */ + int get_VNS_sgte_eval ( void ) const { return _VNS_sgte_eval; } + + /// Access to the number of cache hits. + /** + \return The number of cache hits. + */ + int get_cache_hits ( void ) const { return _cache_hits; } + + /// Access to the number of blackbox evaluations (includes surrogate cost). + /** + \return The number of blackbox evaluations. + */ + int get_bb_eval ( void ) const + { + return ( _sgte_cost > 0 ) ? _bb_eval + _sgte_eval / _sgte_cost : _bb_eval; + } + + + /// Access to the number of block of evaluations (includes bb and surrogates). + /** + \return The number of blackbox evaluations. + */ + int get_block_eval ( void ) const + { + return _block_eval; + } + + /// Access to the \c sum stat. + /** + \return The \c sum stat. + */ + NOMAD::Double get_stat_sum ( void ) const { return _stat_sum; } + + /// Access to the \c avg stat. + /** + \return The \c avg stat. + */ + NOMAD::Double get_stat_avg ( void ) const + { + return ( _cnt_avg > 0 ) ? _stat_avg/_cnt_avg : NOMAD::Double(); + } + + /// Access to the model stats. + /** + \return The model stats. + */ + const NOMAD::Model_Stats & get_model_stats ( void ) const { return _model_stats; } + + /// Display. + /** + \param out The NOMAD::Display object -- \b IN. + */ + void display ( const NOMAD::Display & out ) const; + }; + + /// Display a NOMAD::Stats object. /** - \param out The NOMAD::Display object -- \b IN. - */ - void display ( const NOMAD::Display & out ) const; - }; - - /// Display a NOMAD::Stats object. - /** \param out The NOMAD::Display object -- \b IN. \param s The NOMAD::Stats object to be displayed -- \b IN. \return The NOMAD::Display object. - */ - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::Stats & s ) { - s.display ( out ); - return out; - } + */ + inline const NOMAD::Display & operator << ( const NOMAD::Display & out , + const NOMAD::Stats & s ) + { + s.display ( out ); + return out; + } } #endif diff --git a/src/TGP_Model.cpp b/src/TGP_Model.cpp deleted file mode 100644 index b5005f6..0000000 --- a/src/TGP_Model.cpp +++ /dev/null @@ -1,1551 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ -/* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ -/* */ -/* funded in part by AFOSR and Exxon Mobil */ -/* */ -/* Author: Sebastien Le Digabel */ -/* */ -/* Contact information: */ -/* Ecole Polytechnique de Montreal - GERAD */ -/* C.P. 6079, Succ. Centre-ville, Montreal (Quebec) H3C 3A7 Canada */ -/* e-mail: nomad@gerad.ca */ -/* phone : 1-514-340-6053 #6928 */ -/* fax : 1-514-340-5665 */ -/* */ -/* 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 the NOMAD software at www.gerad.ca/nomad */ -/*-------------------------------------------------------------------------------------*/ -/** - \file TGP_Model.cpp - \brief TGP (Bayesian treed Gaussian process) model for all outputs (implementation) - \author Sebastien Le Digabel - \date 2011-02-07 - \see TGP_Model.hpp -*/ - -#ifndef USE_TGP - -int TGP_DUMMY; // avoids that TGP_Model.o has no symbols with ranlib - -#else - -#include "TGP_Model.hpp" - -/*-----------------------------------*/ -/* constructor 1/2 */ -/*-----------------------------------*/ -NOMAD::TGP_Model::TGP_Model ( int n0 , - const std::vector<NOMAD::bb_output_type> & bbot , - const NOMAD::Display & out , - NOMAD::TGP_mode_type mode ) - : _out ( out ) , - _bbot ( bbot ) , - _p ( 0 ) , - _n0 ( n0 ) , - _n ( 0 ) , - _n_XX ( 0 ) , - _av_index ( NULL ) , - _fv_index ( NULL ) , - _X ( NULL ) , - _XX ( NULL ) , - _Ds2x ( NULL ) , - _improv ( NULL ) , - _model_computed ( false ) , - _nep_flag ( false ) , - _tgp_mode ( mode ) , - _tgp_models ( NULL ) , - _tgp_rect ( NULL ) , - _tgp_linburn ( true ) , - _usr_pmax ( -1 ) , - _tgp_verb ( false ) -{ - _usr_BTE[0] = _usr_BTE[1] = _usr_BTE[2] = -1; - - // user mode: this is not the good constructor to call: - if ( mode == NOMAD::TGP_USER ) - throw NOMAD::Exception ( "TGP_Model.cpp" , __LINE__ , - "this constructor only accepts fast or precise TGP modes" ); - - _error_str = "NOMAD::TGP_Model::set_X() has not been called"; -} - -/*--------------------------------------------------------*/ -/* constructor 2/2 (with user BTE and pmax and no bbot) */ -/*--------------------------------------------------------*/ -NOMAD::TGP_Model::TGP_Model ( int n0 , - const NOMAD::Display & out , - int BTE[3] , - bool linburn , - int pmax , - bool verb ) - : _out ( out ) , - _p ( 0 ) , - _n0 ( n0 ) , - _n ( 0 ) , - _n_XX ( 0 ) , - _av_index ( NULL ) , - _fv_index ( NULL ) , - _X ( NULL ) , - _XX ( NULL ) , - _Ds2x ( NULL ) , - _improv ( NULL ) , - _model_computed ( false ) , - _nep_flag ( false ) , - _tgp_mode ( NOMAD::TGP_USER ) , - _tgp_models ( NULL ) , - _tgp_rect ( NULL ) , - _tgp_linburn ( linburn ) , - _usr_pmax ( pmax ) , - _tgp_verb ( verb ) -{ - - // user BTE parameters: - _usr_BTE[0] = BTE[0]; - _usr_BTE[1] = BTE[1]; - _usr_BTE[2] = BTE[2]; - - // default bbot: just one objective output: - _bbot.push_back ( NOMAD::OBJ ); - - _error_str = "NOMAD::TGP_Model::set_X() has not been called"; -} - -/*--------------------------------------------*/ -/* destructor */ -/*--------------------------------------------*/ -NOMAD::TGP_Model::~TGP_Model ( void ) -{ - clear(); - - if ( _Ds2x ) { - int i , m = _bbot.size(); - for ( i = 0 ; i < m ; ++i ) - if ( _Ds2x[i] ) - delete [] _Ds2x[i]; - delete [] _Ds2x; - } - - if ( _improv ) - delete [] _improv; -} - -/*--------------------------------------------*/ -/* clear memory (private) */ -/*--------------------------------------------*/ -/* members that depend only on constructor */ -/* arguments are not reseted here */ -/*--------------------------------------------*/ -void NOMAD::TGP_Model::clear ( void ) -{ - int i; - - if ( _av_index ) { - delete [] _av_index; - _av_index = NULL; - } - - if ( _fv_index ) { - delete [] _fv_index; - _fv_index = NULL; - } - - if ( _X ) { - for ( i = 0 ; i < _p ; ++i ) - delete [] _X[i]; - delete [] _X; - _X = NULL; - } - - if ( _XX ) { - for ( i = 0 ; i < _n_XX ; ++i ) - delete [] _XX[i]; - delete [] _XX; - _XX = NULL; - } - - if ( _tgp_models ) { - int m = _bbot.size(); - for ( i = 0 ; i < m ; ++i ) - if ( _tgp_models[i] ) { - delete _tgp_models[i]; - } - delete [] _tgp_models; - _tgp_models = NULL; - } - - if ( _tgp_rect ) { - delete_matrix ( _tgp_rect ); - _tgp_rect = NULL; - } - - _error_str.clear(); - _lb.clear(); - _ub.clear(); - _fv.clear(); - - _p = _n = _n_XX = 0; - - _model_computed = false; -} - -/*--------------------------------------------*/ -/* set the interpolation set X (1/2) */ -/*--------------------------------------------*/ -bool NOMAD::TGP_Model::set_X ( const NOMAD::Cache & cache , // only truth evals - const NOMAD::Point * center , // the incumbent - int seed , - bool remove_fv ) -{ - std::vector<const NOMAD::Eval_Point *> X; - - const NOMAD::Eval_Point * cur = cache.begin(); - while ( cur ) { - X.push_back ( cur ); - cur = cache.next(); - } - - return set_X ( X , center , seed , remove_fv ); -} - -/*--------------------------------------------*/ -/* set the interpolation set X (2/2) */ -/*--------------------------------------------*/ -bool NOMAD::TGP_Model::set_X -( const std::vector<const NOMAD::Eval_Point *> & X , - const NOMAD::Point * center , - int seed , - bool remove_fv ) -{ - clear(); - _nep_flag = false; - - if ( X.size() <= 1 ) { - _error_str = ( X.empty() ) ? - "interpolation set X is empty" : "only one point in interpolation set X"; - _nep_flag = true; - return false; - } - - // filter and sort X: - std::list<const NOMAD::Eval_Point *> filtered_X; - _p = filter_and_sort_X ( X , center , filtered_X ); - - if ( _p == 0 ) { - _error_str = "no valid interpolation point"; - _nep_flag = true; - return false; - } - - int pmin , pmax; - bool valid = false; - - while ( !valid ) { - - _n = check_fixed_variables ( filtered_X , remove_fv ); - - if ( _n <= 1 ) { - _error_str = ( _n == 0 ) ? - "only fixed variables" : "interpolation set of dimension 1"; - return false; - } - - // get the limits pmin <= p <= pmax: - if ( !get_p_limits ( _n , pmin , pmax ) ) - return false; - - if ( _p < pmin ) { - std::ostringstream oss; - oss << "not enough interpolation points (" - << _p << "<=" << pmin << ")"; - _error_str = oss.str(); - _nep_flag = true; - return false; - } - - // reduce the number of interpolation points: - if ( _p > pmax ) { - filtered_X.resize ( pmax ); - _p = pmax; - valid = false; - } - - // the interpolation set has a valid size: - else - valid = true; - } - - // display limits on p: -#ifdef TGP_DEBUG - _out << std::endl - << "number of interpolation points: " - << pmin << " <= p=" << _p << " <= " << pmax - << std::endl; -#endif - - // create interpolation matrix X: - int i = 0 , j; - _X = new double * [_p]; - - std::list<const NOMAD::Eval_Point *>::const_iterator - it , end = filtered_X.end(); - for ( it = filtered_X.begin() ; it != end ; ++it , ++i ) { - _X[i] = new double[_n]; - for ( j = 0 ; j < _n ; ++j ) - _X[i][j] = (**it)[_fv_index[j]].value(); - } - - // check that X is of full rank: - if ( !NOMAD::TGP_Model::check_full_rank ( _X , _p , _n ) ) { - _error_str = "X is not of full rank"; - return false; - } - - // construct individual TGP models (one for each output): - int m = _bbot.size(); - _tgp_models = new NOMAD::TGP_Output_Model * [m]; - for ( i = 0 ; i < m ; ++i ) { - _tgp_models[i] = NULL; - if ( _bbot[i] == NOMAD::OBJ || NOMAD::bbot_is_constraint(_bbot[i]) ) - _tgp_models[i] = new NOMAD::TGP_Output_Model ( filtered_X , - i , - seed , - _out ); - } - - return _error_str.empty(); -} - -/*----------------------------------------------------*/ -/* get the limits pmin <= p <= pmax (private) */ -/*----------------------------------------------------*/ -bool NOMAD::TGP_Model::get_p_limits ( int n , int & pmin , int & pmax ) -{ - if ( n <= 0 ) { - _error_str = "bad value of n for the computation of pmin and pmax"; - return false; - } - - // TGP fast mode: - // -------------- - // - // example of some values for pmin and pmax: - // - // n pmin pmax - // - // 2 7 30 - // 3 8 30 - // 4 9 30 - // 5 10 30 - // 6 11 32 - // 7 12 35 - // 8 13 37 - // 9 14 40 - // 10 15 42 - // 20 25 60 - // 50 55 94 - // 55 60 99 - // 56 61 100 - // 57 62 100 - // 95 100 100 - // 96 101 101 - // 100 105 105 - - if ( _tgp_mode == NOMAD::TGP_FAST ) { - pmin = n+5; - - pmax = static_cast<int> ( floor ( sqrt(180.0*n) ) ); - - if ( pmax > 100 ) - pmax = 100; - - if ( pmax < 30 ) - pmax = 30; - - if ( pmax < pmin ) - pmax = pmin; - - return true; - } - - // TGP precise mode: pmin=n+1 and pmax=100 - // ----------------- - if ( _tgp_mode == NOMAD::TGP_PRECISE ) { - pmin = n+1; - pmax = 100; - return true; - } - - // TGP user mode: pmin=n+1 and pmax is user decided with constructor 2/2 - // -------------- - if ( _tgp_mode == NOMAD::TGP_USER ) { - pmin = n+1; - pmax = _usr_pmax; - if ( pmax < pmin ) { - std::ostringstream oss; - oss << "user pmax value must be > " << n; - _error_str = oss.str(); - return false; - } - return true; - } - - return true; -} - -/*----------------------------------------------*/ -/* get the TGP BTE parameters (private) */ -/*----------------------------------------------*/ -bool NOMAD::TGP_Model::get_BTE ( int BTE[3] ) -{ - // fast TGP mode: - // -------------- - // . if p=pmin, then B=2000 - // . if p=pmax, then B=1000 - // . if pmin<p<pmax, a linear relation is used - // . B is rounded so that 10 divides it - // . T=3B - // . E=10 (E divides T-B) - if ( _tgp_mode == NOMAD::TGP_FAST ) { - - int pmin , pmax; - get_p_limits ( _n , pmin , pmax ); - - double a = 1000.0 / (pmin-pmax); - double b = 2000 - a * pmin; - - BTE[0] = static_cast<int> ( 10.0 * floor ( (a * _p + b) / 10.0 ) ); - BTE[1] = 3*BTE[0]; - BTE[2] = 10; - } - - // precise TGP mode: - // ----------------- - else if ( _tgp_mode == NOMAD::TGP_PRECISE ) { - BTE[0] = 2000; - BTE[1] = 7000; - BTE[2] = 2; - } - - // user mode: - // ---------- - else { - BTE[0] = _usr_BTE[0]; - BTE[1] = _usr_BTE[1]; - BTE[2] = _usr_BTE[2]; - - // check the user BTE parameters: - if ( BTE[0] <= 0 || - BTE[1] <= 0 || - BTE[2] <= 0 || - BTE[1] <= BTE[0] ) { - _error_str = "error with user BTE"; - return false; - } - } - - return true; -} - -/*--------------------------------------------------------------*/ -/* compute the ranges, check the fixed variables, set the */ -/* different indexes, and return the number of free variables */ -/* (private) */ -/*--------------------------------------------------------------*/ -int NOMAD::TGP_Model::check_fixed_variables -( const std::list<const NOMAD::Eval_Point *> & X , - bool remove_fv ) -{ - - int i; - - if ( !_av_index ) { - _av_index = new int [_n0]; - for ( i = 0 ; i < _n0 ; ++i ) - _av_index[i] = -1; - } - - _lb = NOMAD::Point ( _n0 ); - _ub = NOMAD::Point ( _n0 ); - _fv = NOMAD::Point ( _n0 ); - - // compute ranges: - std::list<const NOMAD::Eval_Point *>::const_iterator it , end = X.end(); - for ( it = X.begin() ; it != end ; ++it ) { - for ( i = 0 ; i < _n0 ; ++i ) { - if ( !_lb[i].is_defined() || (**it)[i] < _lb[i] ) - _lb[i] = (**it)[i]; - if ( !_ub[i].is_defined() || (**it)[i] > _ub[i] ) - _ub[i] = (**it)[i]; - } - } - - // compute n (number of free variables), the fixed variables, and the indexes: - int n = 0; - - std::vector<int> fv_index_tmp; - for ( i = 0 ; i < _n0 ; ++i ) { - if ( remove_fv && _lb[i] == _ub[i] ) { - _fv [i] = _lb[i]; - _av_index[i] = -1; - } - else { - fv_index_tmp.push_back ( i ); - _av_index[i] = n++; - } - } - - // complete the fixed var index construction: - if ( _fv_index ) - delete [] _fv_index; - _fv_index = NULL; - - if ( n > 0 ) { - _fv_index = new int[n]; - for ( i = 0 ; i < n ; ++i ) - _fv_index[i] = fv_index_tmp[i]; - } - - return n; -} - -/*--------------------------------------------------------*/ -/* filter and sort an interpolation set X (private) */ -/* . the points are sorted relatively to the distance */ -/* from the center */ -/* . if the center is not defined (equal to NULL), */ -/* an alternate center is constructed */ -/*--------------------------------------------------------*/ -int NOMAD::TGP_Model::filter_and_sort_X -( const std::vector<const NOMAD::Eval_Point *> & X , - const NOMAD::Point * center , - std::list<const NOMAD::Eval_Point *> & filtered_X ) const -{ - NOMAD::Point alt_center; - const NOMAD::Eval_Point * cur = NULL; - int p0 = X.size() , i; - - // alternate center if center==NULL: - if ( !center ) { - int j; - NOMAD::Point lb(_n0) , ub(_n0); - for ( i = 0 ; i < p0 ; ++i ) { - cur = X[i]; - if ( test_interpolation_point ( cur ) ) { - for ( j = 0 ; j < _n0 ; ++j ) { - if ( !lb[j].is_defined() || (*cur)[j] < lb[j] ) - lb[j] = (*cur)[j]; - if ( !ub[j].is_defined() || (*cur)[j] > ub[j] ) - ub[j] = (*cur)[j]; - } - } - } - alt_center = NOMAD::Point(_n0); - for ( j = 0 ; j < _n0 ; ++j ) - alt_center[j] = ( lb[j] + ub[j] ) / 2.0; - } - - // X_tmp is used to sort the points: - std::multiset<NOMAD::Model_Sorted_Point> tmp_X; - - for ( i = 0 ; i < p0 ; ++i ) { - - cur = X[i]; - - // test if the interpolation point is valid for interpolation: - if ( test_interpolation_point ( cur ) ) { - - NOMAD::Model_Sorted_Point sorted_pt - ( &NOMAD::Cache::get_modifiable_point (*cur) , - (center) ? *center : alt_center ); - - tmp_X.insert ( sorted_pt ); - } - } - - // copy the set X_tmp to filtered_X: - std::multiset<NOMAD::Model_Sorted_Point>::const_iterator it , end = tmp_X.end(); - for ( it = tmp_X.begin() ; it != end ; ++it ) - filtered_X.push_back ( static_cast<NOMAD::Eval_Point *> ( it->get_point() ) ); - - return filtered_X.size(); -} - -/*-----------------------------------------------------*/ -/* tests to check if an interpolation point is valid */ -/* (private) */ -/*-----------------------------------------------------*/ -bool NOMAD::TGP_Model::test_interpolation_point ( const NOMAD::Eval_Point * x ) const -{ - if ( !x || x->size() != _n0 || !x->is_eval_ok() ) - return false; - - int m = _bbot.size(); - const NOMAD::Point & bbo = x->get_bb_outputs(); - - if ( bbo.size() != m ) - return false; - - for ( int j = 0 ; j < m ; ++j ) - if ( ( _bbot[j] == NOMAD::OBJ || NOMAD::bbot_is_constraint(_bbot[j]) ) && - ( !bbo[j].is_defined() || bbo[j].abs() > NOMAD::MODEL_MAX_OUTPUT ) ) - return false; - - // point is valid: - return true; -} - -/*--------------------------------------------*/ -/* compute the models (one for each output) */ -/*--------------------------------------------*/ -bool NOMAD::TGP_Model::compute -( std::vector<NOMAD::Eval_Point *> & XX_pts , // IN/OUT - bool compute_Ds2x , // IN - bool compute_improv , // IN - bool pred_outside_bnds ) // IN -{ - _model_computed = false; - - if ( !_error_str.empty() ) - return false; - - int i , j , index_obj = -1 , n_XX0 = XX_pts.size() , m = _bbot.size(); - - // check bbot: there must be exactly one objective: - for ( i = 0 ; i < m ; ++i ) { - if ( _bbot[i] == NOMAD::OBJ ) { - if ( index_obj < 0 ) - index_obj = i; - else { - _error_str = "more than one objective"; - return false; - } - } - } - if ( index_obj < 0 ) { - _error_str = "no objective"; - return false; - } - - // check n_XX0: - if ( n_XX0 == 0 ) { - _error_str = "no user-provided prediction point"; - return false; - } - - // reset XX_pts outputs: - for ( i = 0 ; i < n_XX0 ; ++i ) { - for ( j = 0 ; j < m ; ++j ) - XX_pts[i]->set_bb_output ( j , NOMAD::Double() ); - XX_pts[i]->set_eval_status ( NOMAD::EVAL_FAIL ); - } - - // create the XX matrix (prediction points): - std::vector<NOMAD::Eval_Point *> XX_filtered_pts; - NOMAD::Eval_Point * cur2; - - // the list of points has to be filtered: - NOMAD::Double tmp; - bool chk; - - for ( i = 0 ; i < n_XX0 ; ++i ) { - if ( XX_pts[i]->size() == _n0 ) { - cur2 = XX_pts[i]; - chk = true; - for ( j = 0 ; j < _n0 ; ++j ) { - tmp = (*cur2)[j]; - if ( !pred_outside_bnds && ( tmp < _lb[j] || tmp > _ub[j] ) ) { - chk = false; - break; - } - } - if ( chk ) - XX_filtered_pts.push_back ( cur2 ); - } - } - - if ( _XX ) { - for ( i = 0 ; i < _n_XX ; ++i ) - delete [] _XX[i]; - delete [] _XX; - } - - _n_XX = XX_filtered_pts.size(); - - if ( _n_XX == 0 ) { - _error_str = "no prediction point after filtering"; - return false; - } - - _XX = new double * [_n_XX]; - for ( i = 0 ; i < _n_XX ; ++i ) { - _XX[i] = new double[_n]; - for ( j = 0 ; j < _n ; ++j ) - _XX[i][j] = (*XX_filtered_pts[i])[_fv_index[j]].value(); - } - - // Xsplit: X+XX: size = nsplit x n: - int nsplit = _p + _n_XX; - double ** Xsplit = new double * [nsplit]; - - for ( i = 0 ; i < _p ; ++i ) { - Xsplit[i] = new double [_n]; - for ( j = 0 ; j < _n ; ++j ) - Xsplit[i][j] = _X[i][j]; - } - - for ( i = _p ; i < nsplit ; ++i ) { - Xsplit[i] = new double [_n]; - for ( j = 0 ; j < _n ; ++j ) - Xsplit[i][j] = _XX[i-_p][j]; - } - - // get the rectangle: - if ( _tgp_rect ) - delete_matrix ( _tgp_rect ); - _tgp_rect = get_data_rect ( Xsplit , nsplit , _n ); - - // TGP parameters: - Params tgp_params ( _n ); - double * dparams = NOMAD::TGP_Model::get_TGP_dparams ( _n ); - tgp_params.read_double ( dparams ); - delete [] dparams; - - int BTE[3]; - if ( !get_BTE ( BTE ) ) { - for ( i = 0 ; i < nsplit ; ++i ) - delete [] Xsplit[i]; - delete [] Xsplit; - return false; - } - - // display BTE: -#ifdef TGP_DEBUG - _out << std::endl - << "BTE={" << BTE[0] << ", " << BTE[1] << ", " << BTE[2] << "}" - << std::endl; -#endif - - // compute the individual TGP models (one for each output): - double * ZZ = new double [_n_XX]; - - // Ds2x, expected reduction in predictive variance: - if ( _Ds2x == NULL ) { - _Ds2x = new double * [m]; - for ( i = 0 ; i < m ; ++i ) - _Ds2x[i] = NULL; - } - else { - for ( i = 0 ; i < m ; ++i ) - if ( _Ds2x[i] ) { - delete [] _Ds2x[i]; - _Ds2x[i] = NULL; - } - } - - // improv, expected improvement of the objective (ranks): - if ( _improv ) { - delete [] _improv; - _improv = NULL; - } - if ( compute_improv ) - _improv = new int [_n_XX]; - - for ( i = 0 ; i < m ; ++i ) { - - if ( _tgp_models[i] ) { - - _Ds2x[i] = ( compute_Ds2x ) ? new double [_n_XX] : NULL; - - _tgp_models[i]->compute ( _X , - _XX , - Xsplit , - _n , - _n_XX , - nsplit , - &tgp_params , - _tgp_rect , - BTE , - _tgp_linburn , - _tgp_verb , - ZZ , - _Ds2x[i] , - (i==index_obj) ? _improv : NULL ); - - // set XX_pts outputs #i: - for ( j = 0 ; j < _n_XX ; ++j ) { - XX_filtered_pts[j]->set_bb_output ( i , ZZ[j] ); - XX_filtered_pts[j]->set_eval_status ( NOMAD::EVAL_OK ); - } - - // check if TGP has been interrupted: - if ( NOMAD::TGP_Output_Model::get_force_quit() ) { - _error_str = "TGP has been interrupted with ctrl-c"; - break; - } - } - } - - // clear memory: - for ( i = 0 ; i < nsplit ; ++i ) - delete [] Xsplit[i]; - delete [] Xsplit; - delete [] ZZ; - - _model_computed = _error_str.empty(); - - return _model_computed; -} - -/*--------------------------------------------*/ -/* prediction at one point */ -/* (x can be of size _n or _n0) */ -/*--------------------------------------------*/ -bool NOMAD::TGP_Model::predict ( NOMAD::Eval_Point & x , bool pred_outside_bnds ) -{ - if ( !_error_str.empty() ) - return false; - - if ( !_model_computed ) { - _error_str = "NOMAD::TGP_Model::compute() has not been called"; - return false; - } - - int i , i0 , ix , m = x.get_m() , nx = x.size(); - - // reset point outputs: - x.set_eval_status ( NOMAD::EVAL_FAIL ); - for ( i = 0 ; i < m ; ++i ) - x.set_bb_output ( i , NOMAD::Double() ); - - // check dimensions: - if ( m != static_cast<int>(_bbot.size()) || - ( nx != _n0 && nx != _n ) ) { - _error_str = "predict error: bad x dimensions"; - return false; - } - - double ZZ , * XX = new double[_n]; - - // set the coordinates and check the bounds: - for ( i = 0 ; i < _n ; ++i ) { - - ix = ( nx == _n0 ) ? _fv_index[i] : i; - - if ( !pred_outside_bnds ) { - i0 = _fv_index[i]; - if ( x[ix] < _lb[i0] || x[ix] > _ub[i0] ) { - delete [] XX; - return false; // this is not an error - } - } - - XX[i] = x[ix].value(); - } - - // predictions (one for each output): - for ( i = 0 ; i < m ; ++i ) - if ( _tgp_models[i] ) { - if ( !_tgp_models[i]->predict ( XX , - _n , - ZZ , - _tgp_rect ) ) { - std::ostringstream oss; - oss << "predict error: problem with model #" << i; - _error_str = oss.str(); - break; - } - x.set_bb_output ( i , ZZ ); - } - - delete [] XX; - - if ( !_error_str.empty() ) { - x.set_eval_status ( NOMAD::EVAL_FAIL ); - return false; - } - - x.set_eval_status ( NOMAD::EVAL_OK ); - return true; -} - -/*-----------------------------------------------------------------*/ -/* this function checks if the p x n matrix X is of full rank by */ -/* applying the Cholesky decomposition to the sym. def. pos. */ -/* nxn matrix X'X */ -/* (static, private) */ -/*-----------------------------------------------------------------*/ -bool NOMAD::TGP_Model::check_full_rank ( double ** X , int p , int n ) { - - int i , j , k , ki , kii , kij , kj , kji , nn12 = n*(n+1)/2; - - // create XTX (X'X): - double * XTX = new double [nn12]; - for ( i = 0 ; i < n ; ++i ) { - ki = i*(i+1)/2; - for ( j = 0 ; j <= i ; ++j ) { - kij = ki + j; - XTX[kij] = 0.0; - for ( k = 0 ; k < p ; ++k ) - XTX[kij] += X[k][i] * X[k][j]; - } - } - - // create chol: - double * chol = new double [nn12] , tmp1 , tmp2 , eps = 1e-10; - - // Choleski decomposition: - for ( i = 0 ; i < n ; ++i ) { - - ki = i*(i+1)/2; - kii = ki+i; - tmp1 = XTX[kii]; - for ( k = 0 ; k < i ; ++k ) - tmp1 -= pow(chol[ki+k],2.0); - if ( fabs ( tmp1 ) <= eps ) { - delete [] XTX; - delete [] chol; - return false; - } - - if ( i == n-1 ) - break; - - tmp1 = sqrt(tmp1); - chol[kii] = tmp1; - - for ( j = i+1 ; j < n ; ++j ) { - kj = j*(j+1)/2; - kji = kj+i; - tmp2 = XTX[kji]; - for ( k = 0 ; k < i ; ++k ) - tmp2 -= chol[ki+k]*chol[kj+k]; - chol[kji] = tmp2/tmp1; - } - } - - delete [] XTX; - delete [] chol; - - return true; -} - -/*----------------------------------------------------------------*/ -/* compute model h and f values given one blackbox output */ -/*----------------------------------------------------------------*/ -void NOMAD::TGP_Model::eval_hf ( const NOMAD::Point & bbo , - const NOMAD::Double & h_min , - NOMAD::hnorm_type h_norm , - NOMAD::Double & h , - NOMAD::Double & f ) const -{ - f.clear(); - h = 0.0; - - int m = bbo.size(); - - if ( m != static_cast<int>(_bbot.size()) ) - throw NOMAD::Exception ( "TGP_Model.cpp" , __LINE__ , - "TGP_Model::eval_hf() called with an invalid bbo argument" ); - - NOMAD::Double bboi; - - for ( int i = 0 ; i < m ; ++i ) { - - bboi = bbo[i]; - - if ( bboi.is_defined() ) { - - if ( _bbot[i] == NOMAD::EB || _bbot[i] == NOMAD::PEB_E ) { - - if ( bboi > h_min ) { - h.clear(); - return; - } - } - - else if ( ( _bbot[i] == NOMAD::FILTER || - _bbot[i] == NOMAD::PB || - _bbot[i] == NOMAD::PEB_P ) ) { - if ( bboi > h_min ) { - switch ( h_norm ) { - case NOMAD::L1: - h += bboi; - break; - case NOMAD::L2: - h += bboi * bboi; - break; - case NOMAD::LINF: - if ( bboi > h ) - h = bboi; - break; - } - } - } - - else if ( _bbot[i] == NOMAD::OBJ ) - f = bboi; - } - - } - - if ( h_norm == NOMAD::L2 ) - h = h.sqrt(); -} - -/*---------------------------------------*/ -/* compute the TGP dparam array */ -/* (static, private) */ -/*---------------------------------------*/ -double * NOMAD::TGP_Model::get_TGP_dparams ( int n ) { - - double * dparams = new double [n*(n+3)+41]; - int i , j , k; - - // tree (p <- c(as.numeric(params$tree))): - dparams[0] = 0.5; - dparams[1] = 2.0; - dparams[2] = n+2; - if ( dparams[2] < 10 ) - dparams[2] = 10; - dparams[3] = 1.0; - dparams[4] = n; - - // params$meanfn == "linear" : - dparams[5] = 0.0; - - // params$bprior == "bflat" : - dparams[6] = 2.0; - - // p <- c(p, as.numeric(params$beta)) : n+1 zeros - k = 6; - for ( i = 0 ; i <= n ; ++i ) - dparams[++k] = 0.0; - - // p <- c(p, as.numeric(params$Wi)) : I_{n+1} - for ( i = 0 ; i <= n ; ++i ) - for ( j = 0 ; j <= n ; ++j ) - dparams[++k] = (i!=j) ? 0.0 : 1.0; - - // p <- c(p, as.numeric(params$s2tau2)): - dparams[++k] = 1.0; - dparams[++k] = 1.0; - - // p <- c(p, as.numeric(params$s2.p)): - dparams[++k] = 5.0; - dparams[++k] = 10.0; - - // p <- c(p, as.numeric(params$s2.lam)): - dparams[++k] = 0.2; - dparams[++k] = 10.0; - - // p <- c(p, as.numeric(params$tau2.p)): - dparams[++k] = 5.0; - dparams[++k] = 10.0; - - // p <- c(p, as.numeric(params$tau2.lam)): - dparams[++k] = 0.2; - dparams[++k] = 0.1; - - // params$corr == "expsep" : - dparams[++k] = 1.0; - - // p <- c(p, as.numeric(params$gd)): - dparams[++k] = 0.1; - dparams[++k] = 0.5; - - // p <- c(p, as.numeric(params$nug.p)): - dparams[++k] = 1.0; - dparams[++k] = 1.0; - dparams[++k] = 1.0; - dparams[++k] = 1.0; - - // if (params$nug.lam[1] == "fixed"), p <- c(p, rep(-1, 4)) : - dparams[++k] = -1.0; - dparams[++k] = -1.0; - dparams[++k] = -1.0; - dparams[++k] = -1.0; - - // p <- c(p, as.numeric(params$gamma)): - dparams[++k] = 0.0; - dparams[++k] = 0.2; - dparams[++k] = 0.7; - - // p <- c(p, as.numeric(params$d.p)): - dparams[++k] = 1.0; - dparams[++k] = 20.0; - dparams[++k] = 10.0; - dparams[++k] = 10.0; - - // if (params$d.lam[1] == "fixed"), p <- c(p, rep(-1, 4)): - dparams[++k] = -1.0; - dparams[++k] = -1.0; - dparams[++k] = -1.0; - dparams[++k] = -1.0; - - return dparams; -} - -/*--------------------------------------------*/ -/* display the interpolation set X */ -/*--------------------------------------------*/ -void NOMAD::TGP_Model::display_X ( const NOMAD::Display & out , - int display_limit ) const -{ - if ( _p == 0 || !_X ) { - out << "no interpolation points" << std::endl; - return; - } - - int i , j; - int m = _bbot.size(); - int i0 = ( display_limit > 0 ) ? _p - display_limit : 0; - NOMAD::Point x(_n) , bbo(m); - - out << NOMAD::open_block ( "interpolation points (X)"); - - if ( i0 > 0 ) - out << "..." << std::endl; - else if ( i0 < 0 ) - i0 = 0; - - for ( i = i0 ; i < _p ; ++i ) { - - for ( j = 0 ; j < _n ; ++j ) - x[j] = _X[i][j]; - - bbo = NOMAD::Point(m); - if ( _tgp_models ) - for ( j = 0 ; j < m ; ++j ) - if ( _tgp_models[j] ) - bbo[j] = (_tgp_models[j]->get_Z())[i]; - - out << "#"; - out.display_int_w ( i , _p ); - out << " x=("; - x.display ( out , " " , 15 , -1 ); - out << " ) f(x)=["; - bbo.display ( out , " " , 15 , -1 ); - out << " ]" << std::endl; - } - - std::ostringstream oss; - oss << "(size=" << _p << ")"; - out << NOMAD::close_block ( oss.str() ) << std::endl; -} - -/*---------------------------------------------------------*/ -/* get the XX points with the largest expected reduction */ -/* in predictive variance, for each output */ -/* (no duplicates) */ -/*---------------------------------------------------------*/ -void NOMAD::TGP_Model::get_Ds2x_points ( std::set<int> & pts_indexes ) const -{ - pts_indexes.clear(); - if ( !_Ds2x || _n_XX == 0 ) - return; - - int i , j , k , m = _bbot.size(); - - for ( i = 0 ; i < m ; ++i ) - if ( _Ds2x[i] ) { - - NOMAD::Double max; - k = -1; - for ( j = 0 ; j < _n_XX ; ++j ) - if ( !max.is_defined() || _Ds2x[i][j] > max ) { - max = _Ds2x[i][j]; - k = j; - } - - if ( k >= 0 ) - pts_indexes.insert ( k ); - } -} - -/*----------------------------------------------------------------------------*/ -/* get the XX points with the largest expected improvement of the objective */ -/*----------------------------------------------------------------------------*/ -void NOMAD::TGP_Model::get_improv_points ( std::list<int> & pts_indexes ) const -{ - pts_indexes.clear(); - if ( !_improv || _n_XX == 0 ) - return; - - int j; - NOMAD::Point * XX_pt; - std::multiset<NOMAD::Model_Sorted_Point> pts; - std::multiset<NOMAD::Model_Sorted_Point>::const_iterator it , end; - - // 1. sort: - for ( j = 0 ; j < _n_XX ; ++j ) { - XX_pt = new NOMAD::Point ( 1 ); - (*XX_pt)[0] = j; - pts.insert ( NOMAD::Model_Sorted_Point ( XX_pt , _improv[j] ) ); - } - - // 2. construct pts_indexes (exclude points with improv >= n_XX): - end = pts.end(); - for ( it = pts.begin() ; it != end ; ++it ) { - if ( it->get_dist() < _n_XX ) - pts_indexes.push_back ( static_cast<int> ( (*it->get_point())[0].value() ) ); - delete it->get_point(); - } -} - -/*--------------------------------------------------------------*/ -/* display the expected improvement of the objective (improv) */ -/* (better ranks are displayed first) */ -/*--------------------------------------------------------------*/ -void NOMAD::TGP_Model::display_improv ( const NOMAD::Display & out , - int display_limit ) const -{ - if ( !_improv || _n_XX == 0 ) { - out << "improv has not been computed" << std::endl; - return; - } - - int j , k; - NOMAD::Point * XX_pt; - std::multiset<NOMAD::Model_Sorted_Point> pts; - std::multiset<NOMAD::Model_Sorted_Point>::const_iterator it , end; - - // 1. sort: - for ( j = 0 ; j < _n_XX ; ++j ) { - - // construct a NOMAD::Point from matrix _XX: - XX_pt = new NOMAD::Point ( _fv ); - for ( k = 0 ; k < _n0 ; ++k ) - if ( _av_index[k] >= 0 ) - (*XX_pt)[k] = _XX[j][_av_index[k]]; - - // insert this point in the sorted list: - pts.insert ( NOMAD::Model_Sorted_Point ( XX_pt , _improv[j] ) ); - } - - // 2. display: - end = pts.end(); - for ( j = 0 , it = pts.begin() ; it != end ; ++it , ++j ) { - - if ( display_limit <= 0 || j < display_limit ) { - out << "x=( "; - it->get_point()->display ( out , " " , 6 , -1 ); - out << " ) improv=" << it->get_dist() << std::endl; - } - - else if ( j == display_limit ) - out << "..." << std::endl; - - delete it->get_point(); - } -} - -/*----------------------------------------------------------------*/ -/* display the expected reduction in predictive variance (Ds2x) */ -/* (larger values are displayed first) */ -/*----------------------------------------------------------------*/ -void NOMAD::TGP_Model::display_Ds2x ( const NOMAD::Display & out , - int display_limit ) const -{ - if ( !_Ds2x || _n_XX == 0 ) { - out << "matrix Ds2x has not been computed" << std::endl; - return; - } - - int i , j , k , m = _bbot.size(); - NOMAD::Point * XX_pt; - std::multiset<NOMAD::Model_Sorted_Point> pts; - std::multiset<NOMAD::Model_Sorted_Point>::const_iterator it , end; - - for ( i = 0 ; i < m ; ++i ) { - - if ( m > 1 ) { - std::ostringstream oss; - oss << "output #" << i; - out << NOMAD::open_block ( oss.str() ); - } - - if ( _Ds2x[i] ) { - - // 1. sort: - for ( j = 0 ; j < _n_XX ; ++j ) { - - // construct a NOMAD::Point from matrix _XX: - XX_pt = new NOMAD::Point ( _fv ); - for ( k = 0 ; k < _n0 ; ++k ) - if ( _av_index[k] >= 0 ) - (*XX_pt)[k] = _XX[j][_av_index[k]]; - - // insert this point in the sorted list: - pts.insert ( NOMAD::Model_Sorted_Point ( XX_pt , -_Ds2x[i][j] ) ); - } - - // 2. display: - end = pts.end(); - for ( j = 0 , it = pts.begin() ; it != end ; ++it , ++j ) { - - if ( display_limit <= 0 || j < display_limit ) { - out << "x=( "; - it->get_point()->display ( out , " " , 6 , -1 ); - out << " ) Ds2x=" << it->get_dist()*-1.0 << std::endl; - } - - else if ( j == display_limit ) - out << "..." << std::endl; - - delete it->get_point(); - } - - pts.clear(); - } - else - out << "NULL" << std::endl; - - if ( m > 1 ) - out.close_block(); - } -} - -/*-------------------------------------------------------*/ -/* display the error stats for the interpolation set X */ -/*-------------------------------------------------------*/ -void NOMAD::TGP_Model::display_X_errors ( const NOMAD::Display & out ) -{ - if ( _p == 0 || !_X ) { - out << "no interpolation points" << std::endl; - return; - } - - int i , j , m = _bbot.size(); - NOMAD::Point min_err(m) , max_err(m) , avg_err(m,0.0) , sd_err(m,0.0); - NOMAD::Eval_Point x ( _n , m ); - double ** err = new double * [_p]; - - for ( i = 0 ; i < _p ; ++i ) { - - err[i] = new double[m]; - - for ( j = 0 ; j < _n ; ++j ) - x[j] = _X[i][j]; - - if ( predict ( x , true ) ) { - - for ( j = 0 ; j < m ; ++j ) - if ( _tgp_models[j] ) { - - // relative error (in %) for point #i and output #j: - err[i][j] = ( x.get_bb_outputs()[j].rel_err((_tgp_models[j]->get_Z())[i]) - * 100.0).value(); - - // out << "f=" << (_tgp_models[j]->get_Z())[i] << " " - // << "m=" << x.get_bb_outputs()[j] << " err=" << err[i][j] - // << std::endl; - - if ( !min_err[j].is_defined() || err[i][j] < min_err[j].value() ) - min_err[j] = err[i][j]; - - if ( !max_err[j].is_defined() || err[i][j] > max_err[j].value() ) - max_err[j] = err[i][j]; - - avg_err[j] += err[i][j]; - } - } - else { - for ( j = 0 ; j <= i ; ++j ) - delete [] err[j]; - delete [] err; - out << "cannot predict interpolation errors (" - << _error_str << ")" << std::endl; - return; - } - } - - for ( j = 0 ; j < m ; ++j ) - if ( _tgp_models[j] ) { - - // compute the median error: - NOMAD::Double med_err; - { - if ( _p == 1 ) - med_err = err[0][j]; - else if ( _p == 2 ) - med_err = ( err[0][j] + err[1][j] ) / 2.0; - - else { - std::multiset<double> sorted_errors; - for ( i = 0 ; i < _p ; ++i ) - sorted_errors.insert ( err[i][j] ); - std::multiset<double>::const_iterator it , end = sorted_errors.end(); - --end; - for ( it = sorted_errors.begin() , i = 0 ; it != end ; ++it , ++i ) { - if ( i == (_p+1)/2-1 ) { - med_err = *it; - if ( _p%2==0 ) { - ++it; - med_err = ( med_err + *it ) / 2.0; - } - break; - } - } - } - } - - // compute the mean and the standard deviation: - avg_err[j] /= _p; - for ( i = 0 ; i < _p ; ++i ) - sd_err[j] += ( avg_err[j] - err[i][j] ).pow2(); - sd_err[j] = (sd_err[j] / _p).sqrt(); - - // display: - if ( m > 1 ) { - std::ostringstream oss; - oss << "output #" << j; - if ( _tgp_models[j]->is_fixed() ) - oss << " (fixed)"; - else if ( _tgp_models[j]->is_binary() ) - oss << " (binary)"; - out << NOMAD::open_block ( oss.str() ); - } - - out << "min : "; - min_err[j].display ( out , "%6.2f" ); - out << std::endl << "max : "; - max_err[j].display ( out , "%6.2f" ); - out << std::endl << "median: "; - med_err.display ( out , "%6.2f" ); - out << std::endl << "mean : "; - avg_err[j].display ( out , "%6.2f" ); - out << std::endl << "sd : "; - sd_err[j].display ( out , "%6.2f" ); - out << std::endl; - - if ( m > 1 ) - out.close_block(); - } - - for ( i = 0 ; i < _p ; ++i ) - delete [] err[i]; - delete [] err; -} - -/*--------------------------------------------*/ -/* display */ -/*--------------------------------------------*/ -void NOMAD::TGP_Model::display ( const NOMAD::Display & out ) const -{ - if ( !_error_str.empty() ) { - out << "error with model" << std::endl; - return; - } - - int i , j; - - // fixed variables: - out << "fixed_var = [ " << _fv << "]" << std::endl; - out << "av_index = "; - if ( _av_index ) { - out << "[ "; - for ( i = 0 ; i < _n0 ; ++i ) - out << _av_index[i] << " "; - out << "]" << std::endl; - } - else - out << "NULL" << std::endl; - out << "fv_index = "; - if ( _fv_index ) { - out << "[ "; - for ( i = 0 ; i < _n ; ++i ) - out << _fv_index[i] << " "; - out << "]" << std::endl; - } - else - out << "NULL" << std::endl; - - // bounds: - out << "lb = [ " << _lb << "]" << std::endl - << "ub = [ " << _ub << "]" << std::endl - << std::endl; - - // display X: - if ( !_X ) - out << "X = NULL" << std::endl; - else { - out << "X = ["; - for ( i = 0 ; i < _p ; ++i ) { - out << "\t"; - for ( j = 0 ; j < _n ; ++j ) - out << std::setw(15) << _X[i][j] << " "; - out << ( (i==_p-1) ? "]" : ";" ) << std::endl; - } - out << "size(X)=" << _p << "x" << _n << std::endl << std::endl; - } - - // display XX: - if ( !_XX ) - out << "XX = NULL" << std::endl; - else { - out << "XX = ["; - for ( i = 0 ; i < _n_XX ; ++i ) { - out << "\t"; - for ( j = 0 ; j < _n ; ++j ) - out << std::setw(15) << _XX[i][j] << " "; - out << ( (i==_n_XX-1) ? "]" : ";" ) << std::endl; - } - out << "size(XX)=" << _n_XX << "x" << _n << std::endl << std::endl; - } - - // display models: - out << std::endl; - if ( _tgp_models ) { - int m = _bbot.size(); - for ( i = 0 ; i < m ; ++i ) { - if ( _tgp_models[i] ) { - std::ostringstream oss; - oss << "model #" << i; - out.open_block ( oss.str() ); - _tgp_models[i]->display ( out ); - out.close_block(); - } - else - out << "model #" << i << ": NULL" << std::endl; - out << std::endl; - } - } - else - out << "no models" << std::endl << std::endl; -} - -/*----------------------------------------------------------------*/ -/* access to the width of the interpolation set */ -/*----------------------------------------------------------------*/ -#ifdef MODEL_STATS -NOMAD::Double NOMAD::TGP_Model::get_Yw ( void ) const -{ - NOMAD::Double Yw , tmp; - for ( int i = 0 ; i < _n0 ; ++i ) { - tmp = _ub[i]-_lb[i]; - if ( !Yw.is_defined() || tmp > Yw ) - Yw = tmp; - } - return Yw; -} -#endif - -#endif diff --git a/src/TGP_Model.hpp b/src/TGP_Model.hpp deleted file mode 100644 index 78cf20c..0000000 --- a/src/TGP_Model.hpp +++ /dev/null @@ -1,397 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ -/* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ -/* */ -/* funded in part by AFOSR and Exxon Mobil */ -/* */ -/* Author: Sebastien Le Digabel */ -/* */ -/* Contact information: */ -/* Ecole Polytechnique de Montreal - GERAD */ -/* C.P. 6079, Succ. Centre-ville, Montreal (Quebec) H3C 3A7 Canada */ -/* e-mail: nomad@gerad.ca */ -/* phone : 1-514-340-6053 #6928 */ -/* fax : 1-514-340-5665 */ -/* */ -/* 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 the NOMAD software at www.gerad.ca/nomad */ -/*-------------------------------------------------------------------------------------*/ -/** - \file TGP_Model.hpp - \brief TGP (Bayesian treed Gaussian process) model for all outputs (headers) - \author Sebastien Le Digabel - \date 2011-02-07 - \see TGP_Model.cpp -*/ -#ifdef USE_TGP - -#ifndef __TGP_MODEL__ -#define __TGP_MODEL__ - -#include "TGP_Output_Model.hpp" -#include "Model_Sorted_Point.hpp" -#include "Cache.hpp" - -namespace NOMAD { - - /// TGP models for all outputs. - class TGP_Model : private NOMAD::Uncopyable { - - private: - - const NOMAD::Display & _out; ///< Display. - - std::vector<NOMAD::bb_output_type> _bbot; ///< Blackbox output types. - - std::string _error_str; ///< Error string. - - int _p; ///< Number of interpolation points. - - int _n0; ///< Original dimension (all variables). - int _n; ///< Number of free variables (\c n \c <= \c n0). - - int _n_XX; ///< Number of points (rows) in \c XX. - - NOMAD::Point _lb; ///< Lower bounds for \c X (size=\c n0). - NOMAD::Point _ub; ///< Upper bounds for \c X (size=\c n0). - NOMAD::Point _fv; ///< Fixed variables for \c X (size=\c n0). - - int * _av_index; ///< All variables index. - int * _fv_index; ///< Free variables index. - // - // avi[j] in [0;n -1], j in [0;n0-1]; avi[j]=-1: var j fixed - // fvi[j] in [0;n0-1], j in [0;n-1] - // - // example with n0=3 and n=2 (second variable is fixed): - // _av_index: [ 0 -1 1 ] - // _fv_index: [ 0 2 ] - - double ** _X; ///< Interpolation matrix \c X (size = \c p \c x \c n). - - double ** _XX; ///< Points at which evaluate the model (prediction points). - - double ** _Ds2x; ///< Expected reduction in predictive variance (\c Ds2x). - - int * _improv; ///< Expected improvement (ranks). - - bool _model_computed; ///< Flag to check if the model has been computed. - bool _nep_flag; ///< 'Not enought points' (nep) flag. - - NOMAD::TGP_mode_type _tgp_mode; ///< TGP mode (fast, precise, or user). - - NOMAD::TGP_Output_Model ** _tgp_models; ///< TGP models (one for each output). - // - // tgp_models[i] may be NULL if bbot[i] - // is not an objective or a constraint - - double ** _tgp_rect; ///< TGP rectangle (bounds). - - int _usr_BTE[3]; ///< User \c BTE parameters (TGP default: 2000,7000,2). - - bool _tgp_linburn; ///< TGP \c linburn parameter. - - int _usr_pmax; ///< User max number of interpolation points in \c X. - - bool _tgp_verb; ///< Display (\c verb) parameter. - - /// Clear memory. - void clear ( void ); - - /// Filter and sort the intepolation set \c X. - /** - \param X Original interpolation set (typically the cache) -- \b IN. - \param center Center of the model (may be NULL) -- \b IN. - \param filtered_X Filtered and sorted interpolation set -- \b OUT. - \return The number of filtered interpolation points. - */ - int filter_and_sort_X - ( const std::vector<const NOMAD::Eval_Point *> & X , - const NOMAD::Point * center , - std::list<const NOMAD::Eval_Point *> & filtered_X ) const; - - /** - Compute the ranges, check the fixed variables, set the - different indexes, and return the number of free variables. - \param X Filtered and sorted interpolation set -- \b IN. - \param remove_fv Set to \c true to eliminate fixed variables -- \b IN. - \return The number of free variables (member \c _n). - */ - int check_fixed_variables ( const std::list<const NOMAD::Eval_Point *> & X , - bool remove_fv ); - - /// Tests to check if an interpolation point is valid for interpolation. - /** - \param x The interpolation point -- \b IN. - \return A boolean equal to \c true if \c x is valid. - */ - bool test_interpolation_point ( const NOMAD::Eval_Point * x ) const; - - /// Get the limits on the interpolation set size \c p. - /** - \param n Number of free variables -- \b IN. - \param pmin Inf limit on \c p the number of interpolation points -- \b OUT. - \param pmax Sup limit on \c p -- \b OUT. - \return A boolean equal to \c true if the limits are valid. - */ - bool get_p_limits ( int n , int & pmin , int & pmax ); - - /// Get the TGP \c BTE parameters. - /** - \param BTE The BTE parameters -- \b OUT. - \return A boolean equal to \c true if the BTE parameters are valid. - */ - bool get_BTE ( int BTE[3] ); - - /// Compute the TGP \c dparam array. - /** - \param n Dimension -- \b IN. - \return A pointer to the \c dparam array. - */ - static double * get_TGP_dparams ( int n ); - - /// Check if the interpolation matrix is of full rank. - /** - \param X The \c X matrix -- \b IN. - \param p Number of rows -- \b IN. - \param n Number of columns -- \b IN. - \return A boolean equal to \c true if \c X is of full rank. - */ - static bool check_full_rank ( double ** X , int p , int n ); - - public: - - /// Constructor 1/2. - /** - \param n0 Dimension including fixed variables -- \b IN. - \param bbot Blackbox output types -- \b IN. - \param out Display object -- \b IN. - \param mode TGP mode (fast or precise only) -- \b IN. - */ - explicit TGP_Model ( int n0 , - const std::vector<NOMAD::bb_output_type> & bbot , - const NOMAD::Display & out , - NOMAD::TGP_mode_type mode ); - - /// Constructor 2/2 (with no blackbox output types; a value of \c m=1 is taken). - /** - This is the user TGP mode. - \param n0 Dimension including fixed variables -- \b IN. - \param out Display object -- \b IN. - \param BTE TGP \c B, \c T, and \c E parameters -- \b IN. - \param linburn TGP \c linburn parameter -- \b IN. - \param pmax Max number of interpolation points in \c X -- \b IN. - \param verb TGP \c verb parameter -- \b IN. - */ - explicit TGP_Model ( int n0 , - const NOMAD::Display & out , - int BTE[3] , - bool linburn , - int pmax , - bool verb ); - - /// Destructor. - virtual ~TGP_Model ( void ); - - /// Set the interpolation set \c X from a cache. - /** - \param cache Cache of true evaluations -- \b IN. - \param center Center of the model (the incumbent; may be \c NULL) -- \b IN. - \param seed Random seed -- \b IN. - \param remove_fv Set to \c true to eliminate fixed variables -- \b IN. - \return A boolean equal to \c true if no error occured. - */ - bool set_X ( const NOMAD::Cache & cache , - const NOMAD::Point * center , - int seed , - bool remove_fv ); - - /// Set the interpolation set \c X from a set of points. - /** - \param X The set of points -- \b IN. - \param center Center of the model ( may be \c NULL) -- \b IN. - \param seed Random seed -- \b IN. - \param remove_fv Set to \c true to eliminate fixed variables -- \b IN. - \return A boolean equal to \c true if no error occured. - */ - bool set_X ( const std::vector<const NOMAD::Eval_Point *> & X , - const NOMAD::Point * center , - int seed , - bool remove_fv ); - - /// Compute the models (one for each output). - /** - \param XX_pts Prediction points -- \b IN/OUT. - \param compute_Ds2x Flag to activate the Ds2x computation -- \b IN. - \param compute_improv Flag to activate the improv computation -- \b IN. - \param pred_outside_bnds If \c false, no prediction outside bounds -- \b IN. - \return A boolean equal to \c true if the model computation worked. - */ - bool compute ( std::vector<NOMAD::Eval_Point *> & XX_pts , - bool compute_Ds2x , - bool compute_improv , - bool pred_outside_bnds ); - - /// Prediction at one point. - /** - \param x The point (size \c _n or \c _n0) -- \b IN. - \param pred_outside_bnds Set to \c false to not predict outside bounds -- \b IN. - \return A boolean equal to \c true if the prediction worked. - */ - bool predict ( NOMAD::Eval_Point & x , bool pred_outside_bnds ); - - /// Compute model \c h and \c f values given one blackbox output. - /** - \param bbo Blackbox output -- \b IN. - \param h_min Value of \c h_min -- \b IN.. - \param h_norm Norm used to compute \c h -- \b IN.. - \param h Value of \c h -- \b OUT. - \param f Value of \c f -- \b OUT. - */ - void eval_hf ( const NOMAD::Point & bbo , - const NOMAD::Double & h_min , - NOMAD::hnorm_type h_norm , - NOMAD::Double & h , - NOMAD::Double & f ) const; - - /// Get the \c XX points with the largest expected improvement of the objective. - /** - \param pts_index The \c XX points indexes -- \b OUT. - */ - void get_improv_points ( std::list<int> & pts_indexes ) const; - - /// Get the \c XX points with the largest expected reduction in predictive variance. - /** - \param pts_index The \c XX points indexes -- \b OUT. - */ - void get_Ds2x_points ( std::set<int> & pts_indexes ) const; - - /// Get error string. - /** - \return The error string. - */ - const std::string & get_error_str ( void ) const { return _error_str; } - - /// Get \c nep flag (nep=not enough points). - /** - \return The nep flag. - */ - bool get_nep_flag ( void ) const { return _nep_flag; } - - /// Access to the number of interpolation points \c p. - /** - \return The number of interpolation points. - */ - int get_p ( void ) const { return _p; } - - /// Access to the number of free variables \c n. - /** - \return The number of free variables. - */ - int get_n ( void ) const { return _n; } - - /// Access to the total number of variables \c n0. - /** - \return The total number of variables. - */ - int get_n0 ( void ) const { return _n0; } - - /// Access to the lower bounds. - /** - \return The lower bounds. - */ - const NOMAD::Point & get_lb ( void ) const { return _lb; } - - /// Access to the upper bounds. - /** - \return The upper bounds. - */ - const NOMAD::Point & get_ub ( void ) const { return _ub; } - -#ifdef MODEL_STATS - /// Access to the width of the interpolation set \c X (or \c Y). - /** - \return The width of the interpolation set. - */ - NOMAD::Double get_Yw ( void ) const; -#endif - - /// Access to improv. - /** - \param i Index in the \c XX matrix -- \b IN. - \return The improv value of the ith point in \c XX. - */ - int get_improv ( int i ) const - { - return ( _improv == NULL || i < 0 || i >= _n_XX ) ? -1 : _improv[i]; - } - - /// Display the expected reduction in predictive variance (\c Ds2x). - /** - \param out Display -- \b IN. - \param display_limit Max number of pts displayed (-1 for no limit) -- \b IN. - */ - void display_Ds2x ( const NOMAD::Display & out , int display_limit = -1 ) const; - - /// Display the expected improvement ranks (\c improv). - /** - \param out Display -- \b IN. - \param display_limit Max number of pts displayed (-1 for no limit) -- \b IN. - */ - void display_improv ( const NOMAD::Display & out , int display_limit = -1 ) const; - - /// Display error stats for the interpolation set \c X. - /** - \param out Display -- \b IN. - */ - void display_X_errors ( const NOMAD::Display & out ); - - /// Display interpolation set \x X. - /** - \param out Display -- \b IN. - \param display_limit Max number of pts displayed (-1 for no limit) -- \b IN. - */ - void display_X ( const NOMAD::Display & out , int display_limit = -1 ) const; - - /// Default display. - void display ( void ) { display ( _out ); } - - /// Display. - /** - \param out Display -- \b IN. - */ - void display ( const NOMAD::Display & out ) const; - }; - - /// Display a NOMAD::TGP_Model object. - /** - \param out The NOMAD::Display object -- \b IN. - \param s The NOMAD::TGP_Model object to be displayed -- \b IN. - \return The NOMAD::Display object. - */ - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::TGP_Model & s ) { - s.display ( out ); - return out; - } -} - -#endif - -#endif diff --git a/src/TGP_Model_Evaluator.cpp b/src/TGP_Model_Evaluator.cpp deleted file mode 100644 index 3edc7c6..0000000 --- a/src/TGP_Model_Evaluator.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ -/* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ -/* */ -/* funded in part by AFOSR and Exxon Mobil */ -/* */ -/* Author: Sebastien Le Digabel */ -/* */ -/* Contact information: */ -/* Ecole Polytechnique de Montreal - GERAD */ -/* C.P. 6079, Succ. Centre-ville, Montreal (Quebec) H3C 3A7 Canada */ -/* e-mail: nomad@gerad.ca */ -/* phone : 1-514-340-6053 #6928 */ -/* fax : 1-514-340-5665 */ -/* */ -/* 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 the NOMAD software at www.gerad.ca/nomad */ -/*-------------------------------------------------------------------------------------*/ -/** - \file TGP_Model_Evaluator.cpp - \brief NOMAD::Evaluator subclass for TGP model optimization (implementation) - \author Sebastien Le Digabel - \date 2011-02-17 - \see TGP_Mopel_Evaluator.hpp -*/ - -#ifndef USE_TGP - -int TGP_MODEL_EVALUATOR_DUMMY; // avoids that TGP_Model_Evaluator.o has no symbols with ranlib - -#else - -#include "TGP_Model_Evaluator.hpp" - -/*------------------------------------------------------------------------*/ -/* evaluate the TGP model at a given trial point */ -/*------------------------------------------------------------------------*/ -bool NOMAD::TGP_Model_Evaluator::eval_x ( NOMAD::Eval_Point & x , - const NOMAD::Double & h_max , - bool & count_eval ) const -{ - count_eval = true; - if ( !_model.predict ( x , true ) ) - return false; - return true; -} - -#endif diff --git a/src/TGP_Model_Evaluator.hpp b/src/TGP_Model_Evaluator.hpp deleted file mode 100644 index 2a378f2..0000000 --- a/src/TGP_Model_Evaluator.hpp +++ /dev/null @@ -1,98 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ -/* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ -/* */ -/* funded in part by AFOSR and Exxon Mobil */ -/* */ -/* Author: Sebastien Le Digabel */ -/* */ -/* Contact information: */ -/* Ecole Polytechnique de Montreal - GERAD */ -/* C.P. 6079, Succ. Centre-ville, Montreal (Quebec) H3C 3A7 Canada */ -/* e-mail: nomad@gerad.ca */ -/* phone : 1-514-340-6053 #6928 */ -/* fax : 1-514-340-5665 */ -/* */ -/* 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 the NOMAD software at www.gerad.ca/nomad */ -/*-------------------------------------------------------------------------------------*/ -/** - \file TGP_Model_Evaluator.hpp - \brief NOMAD::Evaluator subclass for TGP model optimization (headers) - \author Sebastien Le Digabel - \date 2011-02-17 - \see TGP_Model_Evaluator.cpp -*/ -#ifdef USE_TGP - -#ifndef __TGP_MODEL_EVALUATOR__ -#define __TGP_MODEL_EVALUATOR__ - -#include "Search.hpp" -#include "Evaluator.hpp" - -namespace NOMAD { - - /// NOMAD::Evaluator subclass for quadratic model optimization. - class TGP_Model_Evaluator : public NOMAD::Evaluator { - - private: - -// int _n; ///< Number of variables. -// int _nm1; ///< Number of variables minus one. -// int _m; ///< Number of blackbox outputs. -// double * _x; ///< An evaluation point. -// double ** _alpha; ///< Model parameters. -// bool _model_ready; ///< \c true if model ready to evaluate. - - NOMAD::TGP_Model & _model; ///< The TGP model. - - public: - - /// Constructor. - /** - \param p Parameters -- \b IN. - \param model Model -- \b IN. - */ - TGP_Model_Evaluator ( const NOMAD::Parameters & p , - NOMAD::TGP_Model & model ) - : NOMAD::Evaluator ( p ) , - _model ( model ) {} - - /// Destructor. - virtual ~TGP_Model_Evaluator ( void ) {} - - /// Evaluate the blackboxes at a given trial point. - /** - \param x The trial point -- \b IN/OUT. - \param h_max Maximal feasibility value \c h_max -- \b IN. - \param count_eval Flag indicating if the evaluation has to be counted - or not -- \b OUT. - \return A boolean equal to \c false if the evaluation failed. - */ - virtual bool eval_x ( NOMAD::Eval_Point & x , - const NOMAD::Double & h_max , - bool & count_eval ) const; - }; -} - -#endif - -#endif diff --git a/src/TGP_Model_Search.cpp b/src/TGP_Model_Search.cpp deleted file mode 100644 index bf5b6bc..0000000 --- a/src/TGP_Model_Search.cpp +++ /dev/null @@ -1,1683 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ -/* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ -/* */ -/* funded in part by AFOSR and Exxon Mobil */ -/* */ -/* Author: Sebastien Le Digabel */ -/* */ -/* Contact information: */ -/* Ecole Polytechnique de Montreal - GERAD */ -/* C.P. 6079, Succ. Centre-ville, Montreal (Quebec) H3C 3A7 Canada */ -/* e-mail: nomad@gerad.ca */ -/* phone : 1-514-340-6053 #6928 */ -/* fax : 1-514-340-5665 */ -/* */ -/* 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 the NOMAD software at www.gerad.ca/nomad */ -/*-------------------------------------------------------------------------------------*/ -/** - \file TGP_Model_Search.cpp - \brief TGP Model search (implementation) - \author Sebastien Le Digabel - \date 2011-02-17 - \see TGP_Model_Search.hpp -*/ - -#ifndef USE_TGP - -int TGP_MODEL_SEARCH_DUMMY; // avoids that TGP_Model_Search.o has no symbols with ranlib - -#else - -#include "TGP_Model_Search.hpp" - -/*-----------------------------------*/ -/* reset (virtual) */ -/*-----------------------------------*/ -void NOMAD::TGP_Model_Search::reset ( void ) -{ - if ( _model ) - delete _model; - _model = NULL; -} - -/*--------------------------------------------------------*/ -/* delete a list of points: one version for points, and */ -/* one version for evaluation points (static, private) */ -/*--------------------------------------------------------*/ -void NOMAD::TGP_Model_Search::clear_pts ( std::vector<NOMAD::Point *> & pts ) -{ - size_t k , n = pts.size(); - for ( k = 0 ; k < n ; ++k ) - delete pts[k]; - pts.clear(); -} - -void NOMAD::TGP_Model_Search::clear_pts ( std::vector<NOMAD::Eval_Point *> & pts ) -{ - size_t k , n = pts.size(); - for ( k = 0 ; k < n ; ++k ) - delete pts[k]; - pts.clear(); -} - -/*------------------------------------------------------------------*/ -/* the search */ -/*------------------------------------------------------------------*/ -/* Search parameters: */ -/* ------------------ */ -/* */ -/* . MODEL_SEARCH: flag to activate the model search (MS) */ -/* (here its value is NOMAD::TGP_MODEL) */ -/* */ -/* . MODEL_SEARCH_OPTIMISTIC: if true, the direction from the */ -/* model center to the trial point */ -/* is computed and prossibly used */ -/* in the speculative search */ -/* default=yes */ -/* */ -/* . MODEL_SEARCH_PROJ_TO_MESH: project or not to mesh */ -/* default=yes */ -/* */ -/* . MODEL_SEARCH_MAX_TRIAL_PTS: limit on the number of trial */ -/* points for one search */ -/* default=10 */ -/* */ -/* . MODEL_TGP_MODE: TGP mode (FAST or PRECISE) */ -/* default=FAST */ -/* */ -/*------------------------------------------------------------------*/ -void NOMAD::TGP_Model_Search::search ( NOMAD::Mads & mads , - int & nb_search_pts , - bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - bool & count_search , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc ) -{ - new_feas_inc = new_infeas_inc = NULL; - nb_search_pts = 0; - success = NOMAD::UNSUCCESSFUL; - count_search = false; - - _one_search_stats.reset(); - - const NOMAD::Display & out = _p.out(); - NOMAD::dd_type display_degree = out.get_search_dd(); - int display_lim = 15; - - if ( stop ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "TGP_Model_Search::search(): not performed (stop flag is active)" - << std::endl; - return; - } - - // active cache (we accept only true function evaluations): - const NOMAD::Cache & cache = mads.get_cache(); - if ( cache.get_eval_type() != NOMAD::TRUTH ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "TGP_Model_Search::search(): not performed on surrogates" - << std::endl; - return; - } - - // check that there is one objective exactly: - const std::list<int> & index_obj_list = _p.get_index_obj(); - - if ( index_obj_list.empty() ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "TGP_Model_Search::search(): not performed with no objective function" - << std::endl; - return; - } - if ( index_obj_list.size() > 1 ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "TGP_Model_Search::search(): not performed with biobjective" - << std::endl; - return; - } - - // active barrier: - const NOMAD::Barrier & barrier = mads.get_true_barrier(); - - // get the incumbent: - const NOMAD::Eval_Point * incumbent = barrier.get_best_feasible(); - if ( !incumbent ) - incumbent = barrier.get_best_infeasible(); - if ( !incumbent ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "TGP_Model_Search::search(): no incumbent" - << std::endl; - return; - } - - // get and check the signature, and compute the dimension: - NOMAD::Signature * signature = incumbent->get_signature(); - - if ( !signature ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "TGP_Model_Search::search(): no signature" - << std::endl; - return; - } - - int n = signature->get_n(); - - if ( n != incumbent->size() ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "TGP_Model_Search::search(): incompatible signature" - << std::endl; - return; - } - - // initial displays: - if ( display_degree == NOMAD::FULL_DISPLAY ) { - std::ostringstream oss; - oss << NOMAD::MODEL_SEARCH << " #" - << _all_searches_stats.get_MS_nb_searches(); - out << std::endl << NOMAD::open_block ( oss.str() ) << std::endl; - } - - // from this point the search is counted: - count_search = true; - _one_search_stats.add_MS_nb_searches(); - - NOMAD::Point delta_m; - signature->get_mesh()->get_delta(delta_m); - - // initial displays: - if ( display_degree == NOMAD::FULL_DISPLAY ) { -#ifdef TGP_DEBUG - out << "seed : " - << _p.get_seed() << std::endl; -#endif - out << "number of cache points: " << cache.size() << std::endl - << "mesh size parameter : ( " << delta_m << " )" << std::endl - << "incumbent : ( "; - incumbent->NOMAD::Point::display - ( out , " " , 2 , NOMAD::Point::get_display_limit() ); - out << " )" << std::endl; - } - - // construct the model: - NOMAD::Stats & stats = mads.get_stats(); - bool compute_Ds2x; - std::vector<NOMAD::Eval_Point *> XX; - std::string error_str; - - if ( !model_construction ( cache , - *incumbent , - delta_m , - out , - display_degree , - display_lim , - stats , - compute_Ds2x , - XX , - stop , - stop_reason , - error_str ) ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << NOMAD::close_block ( "failure: " + error_str ) - << std::endl; - return; - } - - // trial_pts = oracle_pts + Ds2x_pts + improv_pts - // - // oracle_pts: given by the model optimization - // Ds2x_pts : XX points with the largest expected reduction in predictive variance - // improv_pts: XX points with the largest expected improvement for the objective - - int max_pts = _p.get_model_search_max_trial_pts(); - - /*-----------------------*/ - /* oracle points (1/3) */ - /*-----------------------*/ - std::vector<NOMAD::Point *> oracle_pts; - if ( !create_oracle_pts ( cache , - *incumbent , - delta_m , - out , - display_degree , - display_lim , - XX , - oracle_pts , - stop , - stop_reason ) && stop ) { - - // delete XX and oracle_pts: - NOMAD::TGP_Model_Search::clear_pts ( XX ); - NOMAD::TGP_Model_Search::clear_pts ( oracle_pts ); - - // quit: - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << NOMAD::close_block ( "algorithm stop" ) - << std::endl; - return; - } - - /*---------------------*/ - /* Ds2x points (2/3) */ - /*---------------------*/ - std::vector<NOMAD::Point *> Ds2x_pts; - if ( compute_Ds2x ) - create_Ds2x_pts ( XX , out , display_degree , display_lim , Ds2x_pts ); - - /*-----------------------*/ - /* improv points (3/3) */ - /*-----------------------*/ - std::vector<NOMAD::Point *> improv_pts; - create_improv_pts ( XX , - *incumbent , - max_pts , - out , - display_degree , - display_lim , - improv_pts ); - - // create the complete list of trial points: - // ----------------------------------------- - std::vector<NOMAD::Point *> trial_pts; - create_trial_pts ( oracle_pts , - Ds2x_pts , - improv_pts , - *incumbent , - max_pts , - out , - display_degree , - trial_pts ); - - // evaluator control: - NOMAD::Evaluator_Control & ev_control = mads.get_evaluator_control(); - - // add the trial points to the evaluator control for evaluation: - int i , nop = trial_pts.size(); - for ( i = 0 ; i < nop ; ++i ) - register_point ( *trial_pts[i] , - *signature , - *incumbent , - display_degree , - ev_control ); - - // display the evaluator control list of points: - if ( display_degree == NOMAD::FULL_DISPLAY ) { - out << std::endl << NOMAD::open_block ( "list of trial points" ); - const std::set<NOMAD::Priority_Eval_Point> & lop = ev_control.get_eval_lop(); - std::set<NOMAD::Priority_Eval_Point>::const_iterator it , end = lop.end(); - nop = lop.size(); - for ( it = lop.begin() , i = 0 ; it != end ; ++it , ++i ) { - out << "#"; - out.display_int_w ( i , nop ); - out << " x=( "; - it->get_point()->NOMAD::Point::display ( out , " " , 15 , -1 ); - out << " )" << std::endl; - } - out.close_block(); - } - - // delete XX and the trial points - // (do not delete Ds2x_pts and improv_pts because - // they are XX points, contrary to oracle_pts): - NOMAD::TGP_Model_Search::clear_pts ( XX ); - NOMAD::TGP_Model_Search::clear_pts ( oracle_pts ); - - nb_search_pts = ev_control.get_nb_eval_points(); - - if ( nb_search_pts == 0 ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl << "no trial point" << std::endl; - } - - else { - - _one_search_stats.update_MS_max_search_pts ( nb_search_pts ); - - // evaluate the trial points: - // -------------------------- - int bbe = stats.get_bb_eval(); - int sgte_eval = stats.get_sgte_eval (); - int cache_hits = stats.get_cache_hits(); - - new_feas_inc = new_infeas_inc = NULL; - - ev_control.disable_model_eval_sort(); - - std::list<const NOMAD::Eval_Point *> * evaluated_pts = NULL; - if ( display_degree == NOMAD::FULL_DISPLAY ) - evaluated_pts = new std::list<const NOMAD::Eval_Point *>; - - ev_control.eval_list_of_points ( _type , - mads.get_true_barrier() , - mads.get_sgte_barrier() , - mads.get_pareto_front() , - stop , - stop_reason , - new_feas_inc , - new_infeas_inc , - success , - evaluated_pts ); - - // display the prediction error for the evaluated points: - if ( display_degree == NOMAD::FULL_DISPLAY ) { - display_eval_pred_errors ( *evaluated_pts , out ); - delete evaluated_pts; - } - - ev_control.enable_model_eval_sort(); - - // update stats: - _one_search_stats.add_MS_bb_eval ( stats.get_bb_eval () - bbe ); - _one_search_stats.add_MS_sgte_eval ( stats.get_sgte_eval () - sgte_eval ); - _one_search_stats.add_MS_cache_hits ( stats.get_cache_hits() - cache_hits ); - - if ( success == NOMAD::FULL_SUCCESS ) - _one_search_stats.add_MS_success(); - - _one_search_stats.add_MS_pts ( nb_search_pts ); - } - - // update stats objects: - stats.update_model_stats ( _one_search_stats ); - _all_searches_stats.update ( _one_search_stats ); - - // final display: - if ( display_degree == NOMAD::FULL_DISPLAY ) { - std::ostringstream oss; - oss << "end of " << NOMAD::MODEL_SEARCH << " (" << success << ")"; - out << std::endl << NOMAD::close_block ( oss.str() ) << std::endl; - } -} - -/*---------------------------------------------------------------*/ -/* create XX a list of prediction points (private) */ -/*---------------------------------------------------------------*/ -void NOMAD::TGP_Model_Search::set_XX -( const NOMAD::Cache & cache , - int n , - int m , - const NOMAD::Point & incumbent , - const NOMAD::Point & delta_m , - std::vector<NOMAD::Eval_Point *> & XX ) const -{ - // . we begin with 1999 points, filter them to remove points - // that appear more than once or in the cache. - // . then we prune the list to 499 points. - // . we do not begin directly with 500 points because it - // gives more flexibility with the projection. - // . we terminate by adding the incumbent. - // --> we obtain a list of at most 500 prediction points. - - int j , i = 0 , n_XX = 1999; // 2000-1 - bool proj_to_mesh = _p.get_model_search_proj_to_mesh(); - bool remove_pt; - - // XX is made of n_XX-1 LH points inside the model bounds - // (and the incumbent will be added at the end): - NOMAD::LH_Search::LH_points ( n, m, n_XX, _model->get_lb(), _model->get_ub(), XX ); - - while ( i < n_XX ) { - - remove_pt = false; - - // project to the mesh: - if ( proj_to_mesh ) - XX[i]->project_to_mesh ( incumbent , delta_m , _p.get_lb() , _p.get_ub() ); - - // remove if point is in cache: - if ( cache.find ( *XX[i] ) ) - remove_pt = true; - - // check if this point is already in XX - // (may occur only if the point has been projected): - if ( proj_to_mesh && !remove_pt ) { - - if ( incumbent == (*XX[i]) ) - remove_pt = true; - - else - for ( j = 0 ; j < i ; ++j ) - if ( XX[j]->NOMAD::Point::operator == ( *XX[i] ) ) { - remove_pt = true; - break; - } - } - - // remove the point: - if ( remove_pt ) { - delete XX[i]; - --n_XX; - if ( i != n_XX ) - XX[i] = XX[n_XX]; - XX.resize ( n_XX ); - } - else - ++i; - } - - // reduce to 500-1 points (we eliminate randomly): - while ( n_XX >= 500 ) { - - i = rand()%n_XX; - - delete XX[i]; - --n_XX; - if ( i != n_XX ) - XX[i] = XX[n_XX]; - XX.resize(n_XX); - } - - // add the incumbent as the last point of XX: - XX.push_back ( new NOMAD::Eval_Point ( n , m ) ); - XX[n_XX]->NOMAD::Point::operator = ( incumbent ); -} - -/*---------------------------------------------------------------------*/ -/* create the complete list of trial points (oracle + Ds2x + improv) */ -/* (private) */ -/*---------------------------------------------------------------------*/ -void NOMAD::TGP_Model_Search::create_trial_pts -( const std::vector<NOMAD::Point *> & oracle_pts , // IN - const std::vector<NOMAD::Point *> & Ds2x_pts , // IN - const std::vector<NOMAD::Point *> & improv_pts , // IN - const NOMAD::Point & incumbent , // IN - int max_pts , // IN - const NOMAD::Display & out , // IN - NOMAD::dd_type display_degree , // IN - std::vector<NOMAD::Point *> & trial_pts ) const // OUT -{ - bool found; - size_t i , j , - n1 = oracle_pts.size() , - n2 = Ds2x_pts.size () , - n3 = improv_pts.size(); - - std::vector<NOMAD::Point *> l2 , l3; - - // 1. remove duplicates: - // --------------------- - // - // . oracle_pts are not XX points - // . Ds2x_pts and improv_pts are XX points - // . there is no duplicate in each list separately - // - for ( i = 0 ; i < n2 ; ++i ) { - found = false; - - if ( *Ds2x_pts[i] == incumbent ) - found = true; - else { - for ( j = 0 ; j < n1 ; ++j ) - if ( *Ds2x_pts[i] == *oracle_pts[j] ) { - found = true; - break; - } - } - if ( !found ) - l2.push_back ( Ds2x_pts[i] ); - } - - n2 = l2.size(); - - for ( i = 0 ; i < n3 ; ++i ) { - found = false; - if ( *improv_pts[i] == incumbent ) - found = true; - else { - for ( j = 0 ; j < n1 ; ++j ) - if ( *improv_pts[i] == *oracle_pts[j] ) { - found = true; - break; - } - } - if ( !found ) { - for ( j = 0 ; j < n2 ; ++j ) - if ( improv_pts[i] == l2[j] ) { - found = true; - break; - } - } - if ( !found ) - l3.push_back ( improv_pts[i] ); - } - - n3 = l3.size(); - - // 2. construct the list of trial points: - // ------------------------------------ - trial_pts.clear(); - - int nb_pts = static_cast<int> ( n1 + n2 + n3 ); - - // no need to reduce the number of trial points: - if ( max_pts <= 0 || nb_pts <= max_pts ) { - - - // 1. oracle points: - for ( i = 0 ; i < n1 ; ++i ) - trial_pts.push_back ( oracle_pts[i] ); - - // 2, improv points: - for ( i = 0 ; i < n3 ; ++i ) - trial_pts.push_back ( l3[i] ); - - // 3. Ds2x points: - for ( i = 0 ; i < n2 ; ++i ) - trial_pts.push_back ( l2[i] ); - - } - - // reduce the list to max_pts points: - else { - - nb_pts = 0; - - size_t i1 = 0 , i2 = 0 , i3 = 0; - - while ( true ) { - - // one point from the oracle points: - if ( i1 < n1 ) { - trial_pts.push_back ( oracle_pts[i1++] ); - ++nb_pts; - if ( nb_pts == max_pts ) - break; - } - - // two from the improv points: - for ( i = 0 ; i < 2 ; ++i ) { - if ( i3 < n3 ) { - trial_pts.push_back ( l3[i3++] ); - ++nb_pts; - if ( nb_pts == max_pts ) - break; - } - } - if ( nb_pts == max_pts ) - break; - - // one from the Ds2x points: - if ( i2 < n2 ) { - trial_pts.push_back ( l2[i2++] ); - ++nb_pts; - if ( nb_pts == max_pts ) - break; - } - } - } - - // 3. display the list of trial points: - // ------------------------------------ - // if ( display_degree == NOMAD::FULL_DISPLAY ) { - // out.open_block ( "list of trial points (debug)" ); - // n1 = trial_pts.size(); - // for ( i = 0 ; i < n1 ; ++i ) { - // out << "#"; - // out.display_int_w ( i , n1 ); - // out << " x=( " << *trial_pts[i] << " )" << std::endl; - // } - // out.close_block(); - // } -} - -/*---------------------------------------------------------*/ -/* create the list of improv points (private) */ -/*---------------------------------------------------------*/ -void NOMAD::TGP_Model_Search::create_improv_pts -( const std::vector<NOMAD::Eval_Point *> & XX , // IN - const NOMAD::Point & incumbent , // IN - int max_pts , // IN - const NOMAD::Display & out , // IN - NOMAD::dd_type display_degree , // IN - int display_lim , // IN - std::vector<NOMAD::Point *> & improv_pts ) const // OUT -{ - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << NOMAD::open_block ( "improv points construction" ) - << std::endl; - - // reset improv points: - improv_pts.clear(); - - // display improv points directly from the NOMAD::TGP_Model object: -#ifdef TGP_DEBUG - out << NOMAD::open_block ( "expected improvement of the objective (improv)" ); - _model->display_improv ( out , display_lim ); - out << NOMAD::close_block() << std::endl; -#endif - - std::list<int> pts_indexes; - _model->get_improv_points ( pts_indexes ); - - if ( pts_indexes.empty() ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl - << NOMAD::close_block ( "no improv candidate" ) - << std::endl; - return; - } - - std::list<int>::const_iterator it , end = pts_indexes.end(); - - // with constraints, the list is re-sorted in order to put the - // predicred feasible points first: - if ( _p.has_constraints() ) { - - std::list<int> feas_pts , infeas_pts; - - NOMAD::Double h , f; - const NOMAD::Double & h_min = _p.get_h_min(); - - for ( it = pts_indexes.begin() ; it != end ; ++it ) { - if ( predict ( *XX[*it] , h , f ) && h <= h_min ) - feas_pts.push_back ( *it ); - else - infeas_pts.push_back ( *it ); - } - - pts_indexes.clear(); - - end = feas_pts.end(); - for ( it = feas_pts.begin() ; it != end ; ++it ) - pts_indexes.push_back ( *it ); - - end = infeas_pts.end(); - for ( it = infeas_pts.begin() ; it != end ; ++it ) - pts_indexes.push_back ( *it ); - - end = pts_indexes.end(); - } - - // compute max_index just for the display: - int i , j , max_index = -1 , ni = -1; - - if ( display_degree == NOMAD::FULL_DISPLAY ) { - ni = pts_indexes.size(); - if ( max_pts > 0 && ni > max_pts ) - ni = max_pts; - - for ( it = pts_indexes.begin() ; it != end ; ++it ) { - if ( *it > max_index ) - max_index = *it; - } - } - - // add the points to improv_pts: - bool rejected; - i = j = 0; - for ( it = pts_indexes.begin() ; it != end ; ++it ) { - - // we check the max number of points: - rejected = ( max_pts > 0 && max_pts == i ); - - // we reject the point if it is the incumbent: - if ( !rejected && incumbent == *XX[*it] ) - rejected = true; - - // we add the point: - if ( !rejected ) { - improv_pts.push_back ( XX[*it] ); - ++i; - } - - // display: - if ( display_degree == NOMAD::FULL_DISPLAY ) { - if ( display_lim <= 0 || j < display_lim ) { - if ( rejected ) - out << "rejected candidate "; - else { - out << "improv candidate #"; - out.display_int_w ( i-1 , ni ); - } - out << " (XX point #"; - out.display_int_w ( *it , max_index ); - out << "): x=( "; - XX[*it]->NOMAD::Point::display ( out , " " , 6 , -1 ); - out << " )"; - if ( rejected ) { - if ( max_pts > 0 && max_pts == i ) - out << " (max number of points)"; - else - out << " (candidate==incumbent)"; - } - else - out << " improv=" << _model->get_improv(*it); - out << std::endl; - } - if ( display_lim > 0 && j == display_lim ) - out << "..." << std::endl; - ++j; - } - - // if no display, stop the loop if there is already too many points: - else if ( max_pts > 0 && max_pts == i ) - break; - } - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl - << NOMAD::close_block ( "end of improv points construction" ) - << std::endl; -} - -/*------------------------------------------------------------*/ -/* create the list of Ds2x points, the points that maximize */ -/* the expected reduction in predictive variance */ -/* (private) */ -/*------------------------------------------------------------*/ -void NOMAD::TGP_Model_Search::create_Ds2x_pts -( const std::vector<NOMAD::Eval_Point *> & XX , // IN - const NOMAD::Display & out , // IN - NOMAD::dd_type display_degree , // IN - int display_lim , // IN - std::vector<NOMAD::Point *> & Ds2x_pts ) const // OUT -{ - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << NOMAD::open_block ( "Ds2x points construction" ) - << std::endl; - - // reset Ds2x points: - Ds2x_pts.clear(); - - // display Ds2x points directly from the NOMAD::TGP_Model object: -#ifdef TGP_DEBUG - out << NOMAD::open_block ( "expected reduction in predictive variance (Ds2x)" ); - _model->display_Ds2x ( out , display_lim ); - out << NOMAD::close_block() << std::endl; -#endif - - std::set<int> pts_indexes; - _model->get_Ds2x_points ( pts_indexes ); - - if ( pts_indexes.empty() ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl - << NOMAD::close_block ( "no Ds2x candidate" ) - << std::endl; - return; - } - - std::set<int>::const_iterator it , end = pts_indexes.end(); - int i , max_index = -1 , m = _p.get_bb_nb_outputs() , n_XX = XX.size(); - - if ( display_degree == NOMAD::FULL_DISPLAY ) { - for ( it = pts_indexes.begin() ; it != end ; ++it ) { - if ( *it > max_index ) - max_index = *it; - } - } - - for ( it = pts_indexes.begin() , i = 0 ; it != end ; ++it , ++i ) { - - Ds2x_pts.push_back ( XX[*it] ); - - if ( display_degree == NOMAD::FULL_DISPLAY ) { - out << "Ds2x candidate #"; - out.display_int_w ( i , m ); - out << " (XX point #"; - out.display_int_w ( *it , max_index ); - out << "): x=( "; - XX[*it]->NOMAD::Point::display ( out , " " , 6 , -1 ); - out << " )"; - if ( *it == n_XX - 1 ) - out << " (rejected: candidate==incumbent)"; - out << std::endl; - } - } - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl - << NOMAD::close_block ( "end of Ds2x points construction" ) - << std::endl; -} - -/*-------------------------------------------------------------------*/ -/* create a list of oracle points, given by the model optimization */ -/* (private) */ -/*-------------------------------------------------------------------*/ -bool NOMAD::TGP_Model_Search::create_oracle_pts -( const NOMAD::Cache & cache , - const NOMAD::Point & incumbent , - const NOMAD::Point & delta_m , - const NOMAD::Display & out , - NOMAD::dd_type display_degree , - int display_lim , - const std::vector<NOMAD::Eval_Point *> & XX , - std::vector<NOMAD::Point *> & oracle_pts , - bool & stop , - NOMAD::stop_type & stop_reason ) -{ - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << NOMAD::open_block ( "oracle points construction" ) - << std::endl; - - // reset oracle points: - NOMAD::TGP_Model_Search::clear_pts ( oracle_pts ); - - int i , n_XX = XX.size(); - - // starting points selection: - const NOMAD::Eval_Point * x0s[3]; - x0s[0] = x0s[1] = x0s[2] = NULL; - - // open display block for model predictions: -#ifdef TGP_DEBUG - out << NOMAD::open_block ( "TGP predictions (XX+ZZ)"); - int i0 = ( display_lim > 0 ) ? n_XX - display_lim : 0; - if ( i0 > 0 ) - out << "..." << std::endl; -#endif - - NOMAD::Double f_model , h_model; - const NOMAD::Double & h_min = _p.get_h_min(); - NOMAD::hnorm_type h_norm = _p.get_h_norm(); - - for ( i = 0 ; i < n_XX ; ++i ) { - - // compute model h and f values: - _model->eval_hf ( XX[i]->get_bb_outputs() , - h_min , - h_norm , - h_model , - f_model ); - - if ( h_model.is_defined() && f_model.is_defined() ) { - - XX[i]->set_f ( f_model ); - XX[i]->set_h ( h_model ); - - // feasible point: - if ( XX[i]->is_feasible ( h_min ) ) { - if ( !x0s[0] || f_model < x0s[0]->get_f() ) - x0s[0] = XX[i]; - } - - // infeasible point: - else { - if ( !x0s[1] || h_model < x0s[1]->get_h() ) - x0s[1] = XX[i]; - - if ( !x0s[2] || f_model < x0s[2]->get_f() ) - x0s[2] = XX[i]; - } - } - - // display model predictions: -#ifdef TGP_DEBUG - if ( i >= i0 ) { - out << "#"; - out.display_int_w ( i , n_XX ); - out << " x=("; - XX[i]->NOMAD::Point::display ( out , " " , 15 , -1 ); - out << " ) m(x)=["; - XX[i]->get_bb_outputs().display ( out , " " , 15 , -1 ); - out << " ]"; - - if ( h_model.is_defined() && f_model.is_defined() ) - out << " hm=" << h_model << " fm=" << f_model; - else - out << " no model value"; - out << std::endl; - } -#endif - -#ifdef MODEL_STATS - if ( XX[i] && f_model.is_defined() && h_model.is_defined() ) { - XX[i]->set_mod_use ( 1 ); // 1 for model search - XX[i]->set_Yw ( _model->get_Yw () ); - XX[i]->set_nY ( p ); - XX[i]->set_mh ( h_model ); - XX[i]->set_mf ( f_model ); - } -#endif - } - -#ifdef TGP_DEBUG - // close display block for model predictions: - { - std::ostringstream oss; - oss << "(size=" << n_XX << ")"; - out << NOMAD::close_block ( oss.str() ) << std::endl; - } - - // compute and display prediction errors: - out << NOMAD::open_block ( "prediction relative errors on X(%)" ); - _model->display_X_errors ( out ); - out << NOMAD::close_block() << std::endl; - -#endif - - if ( !x0s[0] && !x0s[1] && !x0s[2] ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl - << NOMAD::close_block ( "oracle points error: no model starting point" ) - << std::endl; - return false; - } - - // display starting points: - if ( display_degree == NOMAD::FULL_DISPLAY ) { - out << std::endl - << NOMAD::open_block ( "model starting points" ); - - for ( i = 0 ; i < 3 ; ++i ) { - - out << "#" << i << ": "; - if ( !x0s[i] ) - out << "NULL" << std::endl; - else { - - out << " x=("; - x0s[i]->NOMAD::Point::display ( out , " " , 15 , -1 ); - out << " ) m(x)=["; - x0s[i]->get_bb_outputs().display ( out , " " , 15 , -1 ); - out << " ]" - << " hm=" << std::setw(15) << x0s[i]->get_h() - << " fm=" << std::setw(15) << x0s[i]->get_f() - << std::endl; - } - } - out << NOMAD::close_block() << std::endl; - } - - // optimize model: - // --------------- - NOMAD::Point * xf = NULL , * xi = NULL; - NOMAD::Clock clock; - - bool optimization_ok = optimize_model ( x0s , - out , - display_degree , - xf , - xi , - stop , - stop_reason ); - - _one_search_stats.add_optimization_time ( clock.get_CPU_time() ); - - if ( stop || !optimization_ok || ( xf == NULL && xi == NULL ) ) { - std::string error_str; - if ( xf == NULL && xi == NULL ) - error_str = "no model optimization solution"; - else { - if ( xf ) delete xf; - if ( xi ) delete xi; - error_str = ( stop ) ? "algorithm stop" : "model optimization error"; - } - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl - << NOMAD::close_block ( "oracle points error: " + error_str ) - << std::endl; - return false; - } - - // project and check xf and xi: - if ( xf && !check_oracle_point ( cache , - incumbent , - delta_m , - out , - display_degree , - *xf ) ) { - delete xf; - xf = NULL; - } - - if ( xi && !check_oracle_point ( cache , - incumbent , - delta_m , - out , - display_degree , - *xi ) ) { - delete xi; - xi = NULL; - } - - // add xf and xi in the list of oracle points: - if ( xf ) - oracle_pts.push_back ( xf ); - - if ( xi ) { - - // check that xi != xf: - if ( xf && *xf == *xi ) { - delete xi; - xi = NULL; - } - - if ( xi ) - oracle_pts.push_back ( xi ); - } - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl - << NOMAD::close_block ( "end of oracle points construction" ) - << std::endl; - - return true; -} - -/*------------------------------------------------------*/ -/* project and accept or reject an oracle trial point */ -/* (private) */ -/*------------------------------------------------------*/ -bool NOMAD::TGP_Model_Search::check_oracle_point -( const NOMAD::Cache & cache , - const NOMAD::Point & incumbent , - const NOMAD::Point & delta_m , - const NOMAD::Display & out , - NOMAD::dd_type display_degree , - NOMAD::Point & x ) -{ - bool proj_to_mesh = _p.get_model_search_proj_to_mesh(); - - if ( display_degree == NOMAD::FULL_DISPLAY ) { - out << std::endl << "oracle candidate"; - if ( proj_to_mesh ) - out << " (before projection)"; - out << ": ( " << x << " )" << std::endl; - } - - // projection to mesh: - if ( proj_to_mesh ) { - x.project_to_mesh ( incumbent , delta_m , _p.get_lb() , _p.get_ub() ); - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "oracle candidate (after projection) : ( " - << x << " )" << std::endl; - } - - // compare x and incumbent coordinates: - if ( x == incumbent ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "oracle candidate rejected (candidate==incumbent)" << std::endl; - return false; - } - - // two evaluations points are created in order to: - // 1. check if the candidate is in cache - // 2. have a prediction at x and at the incumbent: - int n = x.size() , m = _p.get_bb_nb_outputs(); - - NOMAD::Eval_Point * tk = new NOMAD::Eval_Point ( n , m ); // trial point - tk->Point::operator = ( x ); - - // check if the point is in cache: - if ( cache.find ( *tk ) ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "oracle candidate rejected (found in cache)" << std::endl; - delete tk; - return false; - } - - NOMAD::Eval_Point * ic = new NOMAD::Eval_Point ( n , m ); // incumbent copy - ic->Point::operator = ( incumbent ); - - // model predictions (in order to accept or reject the trial point): - bool pred_error = !_model->predict ( *ic , true ) || // pred_outside_bnds = true - !_model->predict ( *tk , true ); // pred_outside_bnds = true - - const NOMAD::Double & h_min = _p.get_h_min(); - NOMAD::hnorm_type h_norm = _p.get_h_norm(); - - NOMAD::Double h0 , f0; // model values of f and h at the center - NOMAD::Double h1 , f1; // model values of f and h at the trial point - - if ( !pred_error ) - _model->eval_hf ( tk->get_bb_outputs() , h_min , h_norm , h1 , f1 ); - - delete tk; - - if ( pred_error || !h1.is_defined() || !f1.is_defined() ) { - - if ( display_degree == NOMAD::FULL_DISPLAY ) { - if ( pred_error ) - out << "prediction error: oracle candidate rejected"; - else - out << "no model value (EB constraint violated?): oracle candidate rejected"; - out << std::endl; - } - - delete ic; - - return false; - } - - // accept or reject the trial point: - bool accept_point = false; - _model->eval_hf ( ic->get_bb_outputs(), h_min, h_norm, h0, f0 ); - if ( !h0.is_defined() || !f0.is_defined() ) - accept_point = true; - - delete ic; - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl - << "incumbent prediction : h0=" << h0 << " f0=" << f0 << std::endl - << "trial point prediction: h1=" << h1 << " f1=" << f1 << std::endl; - - if ( !accept_point ) - accept_point = (f1 < f0) || (h1 < h0); - - if ( !accept_point ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "oracle candidate rejected" << std::endl; - _one_search_stats.add_MS_rejected(); - return false; - } - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "oracle candidate accepted" << std::endl; - - return true; -} - -/*--------------------------------------------------------*/ -/* insert a trial point in the evaluator control object */ -/* (private) */ -/*--------------------------------------------------------*/ -void NOMAD::TGP_Model_Search::register_point -( NOMAD::Point x , - NOMAD::Signature & signature , - const NOMAD::Point & incumbent , - NOMAD::dd_type display_degree , - NOMAD::Evaluator_Control & ev_control ) const -{ - int n = x.size(); - - NOMAD::Eval_Point * tk = new NOMAD::Eval_Point ( n , _p.get_bb_nb_outputs() ); - - // if the search is optimistic, a direction is computed (this - // will be used in case of success in the speculative search): - if ( _p.get_model_search_optimistic() ) { - NOMAD::Direction dir ( n , 0.0 , NOMAD::MODEL_SEARCH_DIR ); - dir.Point::operator = ( x - incumbent ); - tk->set_direction ( &dir ); - } - - tk->set_signature ( &signature ); - tk->Point::operator = ( x ); - - // add the new point to the list of search trial points: - ev_control.add_eval_point ( tk , - display_degree , - _p.get_snap_to_bounds() , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() , - NOMAD::Double() ); -#ifdef MODEL_STATS - if ( tk ) { - NOMAD::Double h1 , f1; - if ( _model->predict ( *tk , true ) ) // pred_outside_bnds = true - _model->eval_hf ( tk->get_bb_outputs() , - _p.get_h_min() , - _p.get_h_norm() , - h1 , - f1 ); - if ( h1.is_defined() && f1.is_defined() ) { - tk->set_mod_use ( 1 ); // 1 for model search - tk->set_Yw ( _model->get_Yw() ); - tk->set_nY ( model.get_p () ); - tk->set_mh ( h1 ); - tk->set_mf ( f1 ); - } - } -#endif -} - -/*---------------------------------------------------------------*/ -/* model construction (private) */ -/*---------------------------------------------------------------*/ -bool NOMAD::TGP_Model_Search::model_construction -( const NOMAD::Cache & cache , - const NOMAD::Point & incumbent , - const NOMAD::Point & delta_m , - const NOMAD::Display & out , - NOMAD::dd_type display_degree , - int display_lim , - NOMAD::Stats & stats , - bool & compute_Ds2x , - std::vector<NOMAD::Eval_Point *> & XX , - bool & stop , - NOMAD::stop_type & stop_reason , - std::string & error_str ) -{ - int i , n_XX , n = incumbent.size(); - - compute_Ds2x = false; - - // reset XX: - { - n_XX = XX.size(); - for ( i = 0 ; i < n_XX ; ++i ) - delete XX[i]; - XX.clear(); - n_XX = 0; - } - - error_str.clear(); - - if ( stop ) - return false; - - NOMAD::Clock clock; - - // TGP model creation: - if ( _model ) - delete _model; - - NOMAD::TGP_mode_type tgp_mode = _p.get_model_tgp_mode(); - - _model = new NOMAD::TGP_Model ( n , - _p.get_bb_output_type() , - out , - tgp_mode ); - - // construct interpolation set (X): - // -------------------------------- - if ( !_model->set_X ( cache , - &incumbent , - _p.get_seed() , - true ) ) { // remove_fv = true - - if ( _model->get_nep_flag() ) - _one_search_stats.add_not_enough_pts(); - - stats.update_model_stats ( _one_search_stats ); - _all_searches_stats.update ( _one_search_stats ); - - error_str = _model->get_error_str(); - - delete _model; - _model = NULL; - - return false; - } - - // create the list of prediction points (XX) - // (they are used to get starting points - // and to get IMPROV and DS2X stats): - // ----------------------------------- - set_XX ( cache , - n , - _p.get_bb_output_type().size() , - incumbent , - delta_m , - XX ); - - n_XX = XX.size(); - - // display sets X and XX: - // ---------------------- -#ifdef TGP_DEBUG - - // X: - _model->display_X ( out , display_lim ); - - // XX (only the 10 last points are displayed): - out << NOMAD::open_block ( "prediction points (XX)"); - int i0 = ( display_lim > 0 ) ? n_XX - display_lim : 0; - if ( i0 > 0 ) - out << "..." << std::endl; - else if ( i0 < 0 ) - i0 = 0; - for ( i = i0 ; i < n_XX ; ++i ) { - out << "#"; - out.display_int_w ( i , n_XX ); - out << " x=("; - XX[i]->NOMAD::Point::display ( out , " " , 15 , -1 ); - out << " )" << std::endl; - } - std::ostringstream oss; - oss << "(size=" << n_XX << ")"; - out << NOMAD::close_block ( oss.str() ) << std::endl; -#endif - - // model construction: - // ------------------- - int p = _model->get_p(); // number of points in X - - if ( display_degree == NOMAD::FULL_DISPLAY ) { - out << "TGP model construction (p=" - << p << ") ..."; - out.flush(); - } - - // decide compute_Ds2x flag: - compute_Ds2x = true; - if ( tgp_mode == NOMAD::TGP_PRECISE && n_XX > 100 ) - compute_Ds2x = false; - - if ( !_model->compute ( XX , - compute_Ds2x , - true , // compute_improv = true - false ) ) { // pred_outside_bnds = false - - _one_search_stats.add_construction_error(); - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "... error" << std::endl; - - // delete XX points: - for ( i = 0 ; i < n_XX ; ++i ) - delete XX[i]; - XX.clear(); - n_XX = 0; - - stats.update_model_stats ( _one_search_stats ); - _all_searches_stats.update ( _one_search_stats ); - - error_str = _model->get_error_str(); - - delete _model; - _model = NULL; - - // check if ctrl-c has been pressed: - if ( NOMAD::TGP_Output_Model::get_force_quit() ) { - stop = true; - stop_reason = NOMAD::CTRL_C; - } - - return false; - } - - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << "... OK" << std::endl << std::endl; - - // update model stats: - _one_search_stats.add_construction_time ( clock.get_CPU_time() ); - _one_search_stats.update_nY ( p ); - _one_search_stats.add_nb_truth(); - _one_search_stats.add_nb_TGP(); - - return true; -} - -/*---------------------------------------------------------------*/ -/* optimize a model (private) */ -/*---------------------------------------------------------------*/ -bool NOMAD::TGP_Model_Search::optimize_model -( const NOMAD::Eval_Point * x0s[3] , - const NOMAD::Display & out , - NOMAD::dd_type display_degree , - NOMAD::Point *& xf , - NOMAD::Point *& xi , - bool & stop , - NOMAD::stop_type & stop_reason ) -{ - // reset xf and xi: - if ( xf ) delete xf; xf = NULL; - if ( xi ) delete xi; xi = NULL; - - if ( !_model ) { - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl << "model optimization error (no model)" - << std::endl; - return false; - } - - std::string error_str; - bool error = false; - int i , n = _model->get_n0(); - - // model bounds: - const NOMAD::Point & lb = _model->get_lb(); - const NOMAD::Point & ub = _model->get_ub(); - - // initial displays: - if ( display_degree == NOMAD::FULL_DISPLAY ) - out << std::endl << NOMAD::open_block ( "model optimization" ); - - // parameters creation: - NOMAD::Parameters model_param ( out ); - - - // number of variables: - model_param.set_DIMENSION ( n ); - - // blackbox outputs: - model_param.set_BB_OUTPUT_TYPE ( _p.get_bb_output_type() ); - - // barrier parameters: - model_param.set_H_MIN ( _p.get_h_min () ); - model_param.set_H_NORM ( _p.get_h_norm() ); - - // starting points: - for ( i = 0 ; i < 3 ; ++i ) - if ( x0s[i] ) - model_param.set_X0 ( *x0s[i] ); - - // fixed variables: - for ( i = 0 ; i < n ; ++i ) - if ( lb[i] == ub[i] || _p.variable_is_fixed(i) ) - model_param.set_FIXED_VARIABLE(i); - - // no model search and no model ordering: - model_param.set_MODEL_SEARCH ( false ); - model_param.set_MODEL_EVAL_SORT ( false ); - - // display: - model_param.set_DISPLAY_DEGREE ( NOMAD::NO_DISPLAY ); - if ( display_degree == NOMAD::FULL_DISPLAY ) { - - model_param.set_DISPLAY_DEGREE ( NOMAD::NORMAL_DISPLAY ); - // model_param.set_DISPLAY_DEGREE ( NOMAD::FULL_DISPLAY ); - - if ( n <= 5 ) - model_param.set_DISPLAY_STATS ( "bbe mesh_index ( %14.12gsol ) %14.12gobj" ); - else if ( n <= 10 ) - model_param.set_DISPLAY_STATS ( "bbe mesh_index ( sol ) obj" ); - else - model_param.set_DISPLAY_STATS ( "bbe obj" ); - } - // mesh: use isotropic mesh - model_param.set_ANISOTROPIC_MESH ( false ); - model_param.set_MESH_UPDATE_BASIS ( 4.0 ); - model_param.set_MESH_COARSENING_EXPONENT ( 1 ); - model_param.set_MESH_REFINING_EXPONENT ( -1 ); - model_param.set_INITIAL_MESH_INDEX ( 0 ); - - - // maximum number of evaluations (2000 or 10000): - model_param.set_MAX_BB_EVAL - ( ( _p.get_model_tgp_mode() == NOMAD::TGP_PRECISE ) ? 10000 : 2000 ); - - model_param.set_SNAP_TO_BOUNDS ( true ); - - // disable user calls: - model_param.set_USER_CALLS_ENABLED ( false ); - - // set flags: - bool flag_check_bimads , flag_reset_mesh , flag_reset_barriers , flag_p1_active; - NOMAD::Mads::get_flags ( flag_check_bimads , - flag_reset_mesh , - flag_reset_barriers , - flag_p1_active ); - - NOMAD::Mads::set_flag_check_bimads ( true ); - NOMAD::Mads::set_flag_reset_mesh ( true ); - NOMAD::Mads::set_flag_reset_barriers ( true ); - NOMAD::Mads::set_flag_p1_active ( false ); - - // bounds: - model_param.set_LOWER_BOUND ( lb ); - model_param.set_UPPER_BOUND ( ub ); - - try { - - // parameters validation: - model_param.check(); - - // out << "TGP PARAMETERS:" << std::endl << model_param << std::endl; - - // model evaluator creation: - NOMAD::TGP_Model_Evaluator ev ( model_param , *_model ); - - // algorithm creation and execution: - NOMAD::Mads mads ( model_param , &ev ); - NOMAD::stop_type st = mads.run(); - - // check the stopping criterion: - if ( st == NOMAD::CTRL_C || st == NOMAD::MAX_CACHE_MEMORY_REACHED ) { - std::ostringstream oss; - oss << "model optimization: " << st; - error_str = oss.str(); - error = true; - stop = true; - stop_reason = st; - } - - else if ( st == NOMAD::MAX_BB_EVAL_REACHED ) - _one_search_stats.add_MS_max_bbe(); - - // update the stats on the number of model evaluations: - _one_search_stats.update_MS_model_opt ( mads.get_stats().get_bb_eval() ); - - // get the solution(s): - const NOMAD::Eval_Point * best_feas = mads.get_best_feasible (); - const NOMAD::Eval_Point * best_infeas = mads.get_best_infeasible(); - - if ( best_feas ) - xf = new NOMAD::Point ( *best_feas ); - if ( best_infeas ) - xi = new NOMAD::Point ( *best_infeas ); - - if ( !xf && !xi ) { - error = true; - error_str = "optimization error: no solution"; - } - } - catch ( std::exception & e ) { - error = true; - error_str = std::string ( "optimization error: " ) + e.what(); - } - - // reset flags: - NOMAD::Mads::set_flag_check_bimads ( flag_check_bimads ); - NOMAD::Mads::set_flag_reset_mesh ( flag_reset_mesh ); - NOMAD::Mads::set_flag_reset_barriers ( flag_reset_barriers ); - NOMAD::Mads::set_flag_p1_active ( flag_p1_active ); - - // close display block: - if ( display_degree == NOMAD::FULL_DISPLAY ) { - if ( error ) - out.close_block ( error_str ); - else - out.close_block(); - } - - return !error; -} - -/*---------------------------------------------------------*/ -/* display the prediction error for the evaluated points */ -/* (private) */ -/*---------------------------------------------------------*/ -bool NOMAD::TGP_Model_Search::predict ( const NOMAD::Point & x , - NOMAD::Double & h , - NOMAD::Double & f ) const -{ - h.clear(); - f.clear(); - - if ( !_model ) - return false; - - NOMAD::Eval_Point y ( x.size() , _p.get_bb_nb_outputs() ); - y.NOMAD::Point::operator = ( x ); - - if ( _model->predict ( y , true ) ) // pred_outside_bnds = true - _model->eval_hf ( y.get_bb_outputs() , _p.get_h_min() , _p.get_h_norm() , h , f ); - - return ( h.is_defined() && f.is_defined() ); -} - -/*---------------------------------------------------------*/ -/* display the prediction error for the evaluated points */ -/* (private) */ -/*---------------------------------------------------------*/ -void NOMAD::TGP_Model_Search::display_eval_pred_errors -( const std::list<const NOMAD::Eval_Point *> & evaluated_pts , - const NOMAD::Display & out ) -{ - if ( !_model ) - return; - - int i , j = 0; - int nb_pts = evaluated_pts.size() , - n = _model->get_n0() , - m = _p.get_bb_nb_outputs(); - const NOMAD::Double & h_min = _p.get_h_min(); - NOMAD::hnorm_type h_norm = _p.get_h_norm(); - NOMAD::Double h , f , hm , fm , err; - NOMAD::Eval_Point x ( n , m ); - - out << std::endl << NOMAD::open_block ( "evaluated points" ); - std::list<const NOMAD::Eval_Point *>::const_iterator it , end = evaluated_pts.end(); - for ( it = evaluated_pts.begin() ; it != end ; ++it ) { - - if ( !(*it) ) - continue; - - h = (*it)->get_h(); - f = (*it)->get_f(); - - for ( i = 0 ; i < n ; ++i ) - x[i] = (**it)[i]; - - _model->predict ( x , true ); // pred_outside_bnds = true - _model->eval_hf ( x.get_bb_outputs(), h_min , h_norm , hm , fm ); - - out << "#"; - out.display_int_w ( j++ , nb_pts ); - - out << " x=("; - if ( n < 5 ) - (*it)->NOMAD::Point::display ( out , " " , 6 , -1 ); - else - (*it)->NOMAD::Point::display ( out , " " , -1 , 20 ); - out << ")"; - if ( _p.has_constraints() ) { - err = (h.is_defined() && hm.is_defined()) ? h.rel_err(hm) * 100.0 : 100.0; - out << " [h="; - h.display ( out , "%11.3g" ); - out << " hm="; - hm.display ( out , "%11.3g" ); - out << " err_h="; - err.display ( out , "%.2f" ); - out << "%]"; - } - err = (f.is_defined() && fm.is_defined()) ? f.rel_err(fm) * 100.0 : 100.0; - out << " [f="; - f.display ( out , "%11.3g" ); - out << " fm="; - fm.display ( out , "%11.3g" ); - out << " err_f="; - err.display ( out , "%.2f" ); - out << "%]" << std::endl; - } - - out.close_block(); -} - -#endif diff --git a/src/TGP_Model_Search.hpp b/src/TGP_Model_Search.hpp deleted file mode 100644 index c31faf1..0000000 --- a/src/TGP_Model_Search.hpp +++ /dev/null @@ -1,332 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ -/* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ -/* */ -/* funded in part by AFOSR and Exxon Mobil */ -/* */ -/* Author: Sebastien Le Digabel */ -/* */ -/* Contact information: */ -/* Ecole Polytechnique de Montreal - GERAD */ -/* C.P. 6079, Succ. Centre-ville, Montreal (Quebec) H3C 3A7 Canada */ -/* e-mail: nomad@gerad.ca */ -/* phone : 1-514-340-6053 #6928 */ -/* fax : 1-514-340-5665 */ -/* */ -/* 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 the NOMAD software at www.gerad.ca/nomad */ -/*-------------------------------------------------------------------------------------*/ -/** - \file TGP_Model_Search.hpp - \brief TGP Model search (headers) - \author Sebastien Le Digabel - \date 2011-02-17 - \see TGP_Model_Search.cpp -*/ -#ifdef USE_TGP - -#ifndef __TGP_MODEL_SEARCH__ -#define __TGP_MODEL_SEARCH__ - -#include "LH_Search.hpp" -#include "TGP_Model_Evaluator.hpp" - -namespace NOMAD { - - /// Model search. - class TGP_Model_Search : public NOMAD::Search , private NOMAD::Uncopyable { - - private: - - NOMAD::TGP_Model * _model; - - NOMAD::Model_Stats _one_search_stats; ///< Stats for one search. - NOMAD::Model_Stats _all_searches_stats; ///< Stats for all searches. - - /// Delete a list of points. - /** - \param pts The points -- \b IN/OUT. - */ - static void clear_pts ( std::vector<NOMAD::Point *> & pts ); - - /// Delete a list of evaluation points. - /** - \param pts The points -- \b IN/OUT. - */ - static void clear_pts ( std::vector<NOMAD::Eval_Point *> & pts ); - - /// Model construction. - /** - \param cache Cache of true evaluations -- \b IN. - \param incumbent The incumbent -- \b IN. - \param delta_m Mesh size parameter -- \b IN. - \param out The NOMAD::Display object -- \b IN. - \param display_degree Display degree -- \b IN. - \param display_lim Max number of pts when sets are displayed -- \b IN. - \param stats Model search stats -- \b IN/OUT. - \param compute_Ds2x Flag to enable/disable Ds2x computation -- \b OUT. - \param XX The set of prediction points -- \b OUT. - \param stop Stop flag -- \b OUT. - \param stop_reason Stop reason -- \b OUT. - \param error_std Error string -- \b OUT. - \return A boolean equal to \c true if the model has been constructed. - */ - bool model_construction ( const NOMAD::Cache & cache , - const NOMAD::Point & incumbent , - const NOMAD::Point & delta_m , - const NOMAD::Display & out , - NOMAD::dd_type display_degree , - int display_lim , - NOMAD::Stats & stats , - bool & compute_Ds2x , - std::vector<NOMAD::Eval_Point *> & XX , - bool & stop , - NOMAD::stop_type & stop_reason , - std::string & error_str ); - - /// Create a list of prediction points. - /** - \param cache Cache of true evaluations -- \b IN. - \param n Number of variables -- \b IN. - \param m Number of outputs -- \b IN. - \param incumbent The incumbent -- \b IN. - \param delta_m Mesh size parameter -- \b IN. - \param XX The set of prediction points -- \b OUT. - */ - void set_XX ( const NOMAD::Cache & cache , - int n , - int m , - const NOMAD::Point & incumbent , - const NOMAD::Point & delta_m , - std::vector<NOMAD::Eval_Point *> & XX ) const; - - /// Create the complete list of trial points (oracle + Ds2x + improv). - /** - \param oracle_pts Oracle points -- \b IN. - \param Ds2x_pts Ds2x points -- \b IN. - \param improv_pts Improv points -- \b IN. - \param incumbent The incumbent -- \b IN. - \param max_pts Max number of trial points -- \b IN. - \param out The NOMAD::Display object -- \b IN. - \param display_degree Display degree -- \b IN. - \param trial_pts The list of trial points -- \b OUT. - */ - void create_trial_pts - ( const std::vector<NOMAD::Point *> & oracle_pts , - const std::vector<NOMAD::Point *> & Ds2x_pts , - const std::vector<NOMAD::Point *> & improv_pts , - const NOMAD::Point & incumbent , - int max_pts , - const NOMAD::Display & out , - NOMAD::dd_type display_degree , - std::vector<NOMAD::Point *> & trial_pts ) const; - - /// Create oracle points by optimizing the model. - /** - \param cache Cache of true evaluations -- \b IN. - \param incumbent The incumbent -- \b IN. - \param delta_m Mesh size parameter -- \b IN. - \param out The NOMAD::Display object -- \b IN. - \param display_degree Display degree -- \b IN. - \param display_lim Max number of pts when sets are displayed -- \b IN. - \param XX The set of prediction points -- \b IN. - \param oracle_pts Oracle candidates points -- \b OUT. - \param stop Stop flag -- \b OUT. - \param stop_reason Stop reason -- \b OUT. - \return A boolean equal to \c true oracle points are proposed. - */ - bool create_oracle_pts - ( const NOMAD::Cache & cache , - const NOMAD::Point & incumbent , - const NOMAD::Point & delta_m , - const NOMAD::Display & out , - NOMAD::dd_type display_degree , - int display_lim , - const std::vector<NOMAD::Eval_Point *> & XX , - std::vector<NOMAD::Point *> & oracle_pts , - bool & stop , - NOMAD::stop_type & stop_reason ); - - /// Model optimization. - /** - \param x0s The three starting points -- \b IN. - \param out The NOMAD::Display object -- \b IN. - \param display_degree Display degree -- \b IN. - \param xf Feasible solution \c xf -- \b OUT. - \param xi Infeasible solution \c xi -- \b OUT. - \param stop Stop flag -- \b OUT. - \param stop_reason Stop reason -- \b OUT. - */ - bool optimize_model ( const NOMAD::Eval_Point * x0s[3] , - const NOMAD::Display & out , - NOMAD::dd_type display_degree , - NOMAD::Point *& xf , - NOMAD::Point *& xi , - bool & stop , - NOMAD::stop_type & stop_reason ); - - /// Project and accept or reject an oracle trial point. - /** - \param cache Cache of true evaluations -- \b IN. - \param incumbent The incumbent -- \b IN. - \param delta_m Mesh size parameter -- \b IN. - \param out The NOMAD::Display object -- \b IN. - \param display_degree Display degree -- \b IN. - \param x The oracle point -- \b IN/OUT. - \return A boolean equal to \c true if the point is accepted. - */ - bool check_oracle_point - ( const NOMAD::Cache & cache , - const NOMAD::Point & incumbent , - const NOMAD::Point & delta_m , - const NOMAD::Display & out , - NOMAD::dd_type display_degree , - NOMAD::Point & x ); - - /// Insert a trial point in the evaluator control object. - /** - \param x The point coordinates -- \b IN. - \param signature Signature -- \b IN. - \param incumbent The incumbent -- \b IN. - \param display_degree Display degree -- \b IN. - \param ev_control The NOMAD::Evaluator_Control object -- \b IN/OUT. - */ - void register_point ( NOMAD::Point x , - NOMAD::Signature & signature , - const NOMAD::Point & incumbent ,, - NOMAD::dd_type display_degree , - NOMAD::Evaluator_Control & ev_control ) const; - - /// Create the list of improv points. - /** - These points (from the set \c XX) maximize - the expected improvement of the objective. - Priority is given to predicted feasible points. - \param XX The set of prediction points -- \b IN. - \param incumbent The incumbent -- \b IN. - \param max_pts Max number of points -- \b IN. - \param out The NOMAD::Display object -- \b IN. - \param display_degree Display degree -- \b IN. - \param display_lim Max number of pts when sets are displayed -- \b IN. - \param Ds2x_pts The list of improv points -- \b OUT. - */ - void create_improv_pts - ( const std::vector<NOMAD::Eval_Point *> & XX , - const NOMAD::Point & incumbent , - int max_pts , - const NOMAD::Display & out , - NOMAD::dd_type display_degree , - int display_lim , - std::vector<NOMAD::Point *> & improv_pts ) const; - - /// Create the list of Ds2x points. - /** - These points (from the set \c XX) maximize the expected reduction in - predictive variance for each output. - \param XX The set of prediction points -- \b IN. - \param out The NOMAD::Display object -- \b IN. - \param display_degree Display degree -- \b IN. - \param display_lim Max number of pts when sets are displayed -- \b IN. - \param Ds2x_pts The list of Ds2x points -- \b OUT. - */ - void create_Ds2x_pts - ( const std::vector<NOMAD::Eval_Point *> & XX , - const NOMAD::Display & out , - NOMAD::dd_type display_degree , - int display_lim , - std::vector<NOMAD::Point *> & Ds2x_pts ) const; - - /// Prediction at one point. - /** - \param x The point -- \b IN. - \param h Value of \c h -- \b OUT. - \param f Value of \c f -- \b OUT. - \return A boolean equal to \c true if the prediction was possible. - */ - bool predict ( const NOMAD::Point & x , - NOMAD::Double & h , - NOMAD::Double & f ) const; - - /// Display the prediction error for the evaluated points. - /** - \param evaluated_pts List of evaluated points -- \b IN. - \param out The NOMAD::Display object -- \b IN. - */ - void display_eval_pred_errors - ( const std::list<const NOMAD::Eval_Point *> & evaluated_pts , - const NOMAD::Display & out ); - - /*----------------------------------------------------------------------*/ - - public: - - /// Constructor. - /** - \param p Parameters -- \b IN. - */ - TGP_Model_Search ( NOMAD::Parameters & p ) - : NOMAD::Search ( p , NOMAD::MODEL_SEARCH ) , _model ( NULL ) {} - - /// Destructor. - virtual ~TGP_Model_Search ( void ) { reset(); } - - /// Reset. - virtual void reset ( void ); - - /// The TGP model search. - /** - Based on quadratic regression/MFN interpolation models. - \param mads NOMAD::Mads object invoking this search -- \b IN/OUT. - \param nb_search_pts Number of generated search points -- \b OUT. - \param stop Stop flag -- \b IN/OUT. - \param stop_reason Stop reason -- \b OUT. - \param success Type of success -- \b OUT. - \param count_search Count or not the search -- \b OUT. - \param new_feas_inc New feasible incumbent -- \b IN/OUT. - \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. - */ - virtual void search ( NOMAD::Mads & mads , - int & nb_search_pts , - bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - bool & count_search , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc ); - - /// Access to the model. - /** - \return The model. - */ - NOMAD::TGP_Model * get_model ( void ) const { return _model; } - - //// Display stats. - /** - \param out The NOMAD::Display object -- \b IN. - */ - virtual void display ( const NOMAD::Display & out ) const - { - out << _all_searches_stats; - } - }; -} - -#endif -#endif diff --git a/src/TGP_Output_Model.cpp b/src/TGP_Output_Model.cpp deleted file mode 100644 index 55152a1..0000000 --- a/src/TGP_Output_Model.cpp +++ /dev/null @@ -1,486 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ -/* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ -/* */ -/* funded in part by AFOSR and Exxon Mobil */ -/* */ -/* Author: Sebastien Le Digabel */ -/* */ -/* Contact information: */ -/* Ecole Polytechnique de Montreal - GERAD */ -/* C.P. 6079, Succ. Centre-ville, Montreal (Quebec) H3C 3A7 Canada */ -/* e-mail: nomad@gerad.ca */ -/* phone : 1-514-340-6053 #6928 */ -/* fax : 1-514-340-5665 */ -/* */ -/* 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 the NOMAD software at www.gerad.ca/nomad */ -/*-------------------------------------------------------------------------------------*/ -/** - \file TGP_Output_Model.cpp - \brief TGP (Bayesian treed Gaussian process) model for one output (implementation) - \author Sebastien Le Digabel - \date 2011-02-07 - \see TGP_Output_Model.hpp -*/ - -#ifndef USE_TGP - -int TGP_OUTPUT_MODEL_DUMMY; // avoids that TGP_Output_Model.o has no symbols with ranlib - -#else - -#include "TGP_Output_Model.hpp" - -/*---------------------------------------------------------*/ -/* NOMAD-TGP callback function (called regularly by TGP) */ -/*---------------------------------------------------------*/ -// SLD -- 2014-09-04 -// void NOMAD::TGP_callback ( bool & TGP_interrupt ) -// { -// if ( NOMAD::TGP_Output_Model::get_force_quit() ) -// TGP_interrupt = true; -// } - -/*-----------------------------------*/ -/* static members initialization */ -/*-----------------------------------*/ -double NOMAD::TGP_Output_Model::_ditemps[7] = - { 1.0 , 0.0 , 0.0 , 1.0 , 1.0 , 0.0 , 1.0 }; - -bool NOMAD::TGP_Output_Model::_force_quit = false; - -/*-----------------------------------*/ -/* constructor */ -/*-----------------------------------*/ -NOMAD::TGP_Output_Model::TGP_Output_Model -( const std::list<const NOMAD::Eval_Point *> & X_pts , - int bbo_index , - int seed , - const NOMAD::Display & out ) - : _out ( out ) , - _p ( X_pts.size() ) , - _Z ( new double[_p] ) , - _Z_is_scaled ( false ) , - _is_binary ( true ) , - _bin_values ( 2 ) , - _is_fixed ( false ) , - _tgp_state ( NULL ) , - _tgp_model ( NULL ) , - _tgp_its ( NULL ) -{ - NOMAD::TGP_Output_Model::_force_quit = false; - - _Z_scaling[0] = _Z_scaling[1] = 0.0; - - std::list<const NOMAD::Eval_Point *>::const_iterator it , end = X_pts.end(); - - NOMAD::Double tmp , Zmin , Zmax , Zsum = 0.0; - int j = 0; - - for ( it = X_pts.begin() ; it != end ; ++it ) { - - // the output value: - tmp = (*it)->get_bb_outputs()[bbo_index]; - _Z[j++] = tmp.value(); - - // Z scaling parameters (1/2): - Zsum += tmp; - if ( !Zmin.is_defined() || tmp < Zmin ) - Zmin = tmp; - if ( !Zmax.is_defined() || tmp > Zmax ) - Zmax = tmp; - - // check if the output is binary: - if ( _is_binary ) { - if ( !_bin_values[0].is_defined() ) - _bin_values[0] = tmp; - else if ( !_bin_values[1].is_defined() && tmp != _bin_values[0] ) - _bin_values[1] = tmp; - else { - if ( tmp != _bin_values[0] && tmp != _bin_values[1] ) - _is_binary = false; - } - } - } - - // Z scaling parameters (1/2): - _Z_scaling[0] = (Zmax - Zmin).value(); - - // the output is fixed: - if ( _Z_scaling[0] == 0.0 ) - _is_fixed = true; - - else { - - _Z_scaling[1] = (Zsum/_p).value() / _Z_scaling[0]; - - if ( !_is_binary ) - _bin_values = NOMAD::Point(2); - - // RNG (random number generator): - int state[] = { 896 , 265 , 371 }; - - // if seed==0, the model will be the same as the one constructed in R, - // with values taken from the R tgp functions for: - // set.seed(0) - // state <- sample(seq(0, 999), 3) - - // otherwise use rand() to get three different integers in [0;999]: - if ( seed != 0 ) { - state[0] = rand()%1000; - while ( state[1] == state[0] ) - state[1] = rand()%1000; - while ( state[2] == state[0] || state[2] == state[1] ) - state[2] = rand()%1000; - } - _tgp_state = newRNGstate ( three2lstate ( state ) ); - - // importance tempering: - _tgp_its = new Temper ( NOMAD::TGP_Output_Model::_ditemps ); - } -} - -/*--------------------------------------------*/ -/* destructor */ -/*--------------------------------------------*/ -NOMAD::TGP_Output_Model::~TGP_Output_Model ( void ) -{ - if ( _Z ) - delete [] _Z; - if ( _tgp_model ) - delete _tgp_model; - if ( _tgp_its ) - delete _tgp_its; - if ( _tgp_state ) - deleteRNGstate ( _tgp_state ); -} - -/*--------------------------------------------*/ -/* compute the model */ -/*--------------------------------------------*/ -void NOMAD::TGP_Output_Model::compute ( double ** X , - double ** XX , - double ** Xsplit , - int n , - int n_XX , - int nsplit , - Params * tgp_params , - double ** tgp_rect , - int * tgp_BTE , - bool tgp_linburn , - bool tgp_verb , - double * ZZ , // OUT - double * Ds2x , // OUT, may be NULL - int * improv ) // OUT, may be NULL -{ - bool compute_Ds2x = ( Ds2x != NULL ); - bool compute_improv = ( improv != NULL ); - - // the output is fixed: - if ( _is_fixed ) { - for ( int j = 0 ; j < n_XX ; ++j ) { - ZZ[j] = _bin_values[0].value(); - if ( compute_Ds2x ) - Ds2x[j] = 0.0; - } - return; - } - - // scale Z: - scale_Z(); - - // construct the TGP model: - _tgp_model = new Model ( tgp_params , - n , - tgp_rect , - 0 , // Id=0 - false , // trace=false - _tgp_state ); - - _tgp_model->Init ( X , - _p , - n , - _Z , - _tgp_its , - NULL , // dtree=NULL - 0 , // ncol=0 - NULL ); // dhier=NULL - - // set the NOMAD-TGP callback function: - // _tgp_model->set_callback ( NOMAD::TGP_callback ); // SLD -- 2014-09-04 - - // TGP verbim (display): -#ifdef TGP_DEBUG - _tgp_model->Outfile ( stdout , 1 ); // set 10 for full display -#else - if ( tgp_verb ) - _tgp_model->Outfile ( stdout , 1 ); - else - _tgp_model->Outfile ( NULL , 0 ); -#endif - - // set the splitting locations (Xsplit): - _tgp_model->set_Xsplit ( Xsplit , nsplit , n ); - - // linear model initialization rounds -B thru 1: - if ( tgp_linburn ) - _tgp_model->Linburn ( tgp_BTE[0] , _tgp_state ); - - // do model rounds 1 thru B (burn in): - _tgp_model->Burnin ( tgp_BTE[0] , _tgp_state ); - - // do the MCMC rounds B,...,T: - Preds * tgp_preds = new_preds ( XX , - n_XX , - 0 , - n , - tgp_rect , - tgp_BTE[1]-tgp_BTE[0] , - false , // pred_n - true , // krige - _tgp_its->IT_ST_or_IS() , - compute_Ds2x , - compute_improv , - false , // sens - tgp_BTE[2] ); - - _tgp_model->Sample ( tgp_preds , tgp_BTE[1]-tgp_BTE[0] , _tgp_state ); - - // if importance tempering, then update the pseudo-prior - // based on the observation counts: - if ( _tgp_its->Numit() > 1 ) - _tgp_its->UpdatePrior ( _tgp_model->update_tprobs() , _tgp_its->Numit() ); - - // copy back the itemps: - _tgp_model->DupItemps ( _tgp_its ); - - // kriging mean: - wmean_of_columns ( ZZ , - tgp_preds->ZZm , - tgp_preds->R , - n_XX , - (_tgp_its->IT_ST_or_IS()) ? tgp_preds->w : NULL ); - - int i; - - // expected reduction in predictive variance (Ds2x): - if ( compute_Ds2x ) { - for ( i = 0 ; i < n_XX ; ++i ) - Ds2x[i] = 0.0; - if ( tgp_preds->Ds2x ) - wmean_of_columns ( Ds2x , - tgp_preds->Ds2x , - tgp_preds->R , - tgp_preds->nn , - (_tgp_its->IT_ST_or_IS()) ? tgp_preds->w : NULL ); - } - - // expected improvement of objective (improv): - if ( compute_improv ) { - - // double * improvec = new double [n_XX]; - // wmean_of_columns ( improvec , - // tgp_preds->improv, - // tgp_preds->R, - // tgp_preds->nn, - // (_tgp_its->IT_ST_or_IS()) ? tgp_preds->w : NULL ); - // for ( i = 0 ; i < n_XX ; ++i ) - // _out << "IMPROVEC[" << i<< "] = " << improvec[i] << std::endl; - // delete [] improvec; - - int *ir = (int*) GetImprovRank ( tgp_preds->R , - tgp_preds->nn , - tgp_preds->improv , - true , // improv=true - tgp_preds->nn , // numirank = n_XX - (_tgp_its->IT_ST_or_IS()) ? tgp_preds->w : NULL ); - - for ( i = 0 ; i < n_XX ; ++i ) { - improv[i] = ir[i]; - if ( improv[i] == 0 ) - improv[i] = n_XX; - } - - free ( ir ); - - // for ( i = 0 ; i < n_XX ; ++i ) - // _out << "RANK[" << i<< "] = " << improv[i] << std::endl; - } - - delete_preds ( tgp_preds ); - -#ifdef TGP_DEBUG - _tgp_model->Outfile ( NULL , 0 ); -#endif - - // unscale Z and ZZ: - unscale_Z ( ZZ , n_XX ); - unscale_Z(); - - // treat binary output: - if ( _is_binary ) - treat_binary_output ( ZZ , n_XX ); - - // disable TGP display: - _tgp_model->Outfile ( NULL , 0 ); -} - -/*--------------------------------------------*/ -/* prediction at one point */ -/*--------------------------------------------*/ -bool NOMAD::TGP_Output_Model::predict ( double * XX , - int n , - double & ZZ , - double ** tgp_rect ) const -{ - if ( _is_fixed ) { - ZZ = _bin_values[0].value(); - return true; - } - - // do the MCMC rounds B,...,T: - Preds * tgp_preds = new_preds ( &XX , - 1 , - 0 , - n , - tgp_rect , - 1 , // instead of T-B - false , // pred_n - true , // krige - _tgp_its->IT_ST_or_IS() , - false , // delta_s2 (flag for Ds2x) - false , // improv - false , // sens - 1 ); // instead of E - - // new TGP function for the one point prediction: - _tgp_model->MAPreplace(); - - // prediction: - _tgp_model->Predict ( tgp_preds , - 1 , // instead of T-B - _tgp_state ); - - // kriging mean: - ZZ = *tgp_preds->ZZm[0]; - // no need to do: - // wmean_of_columns ( &ZZ , - // tgp_preds->ZZm , - // tgp_preds->R , - // 1 , - // (_tgp_its->IT_ST_or_IS()) ? tgp_preds->w : NULL ); - - delete_preds ( tgp_preds ); - - // unscale: - unscale_Z ( &ZZ , 1 ); - - // treat binary output: - if ( _is_binary ) - treat_binary_output ( &ZZ , 1 ); - - return true; -} - -/*--------------------------------------------*/ -/* scale Z or ZZ (private) */ -/*--------------------------------------------*/ -void NOMAD::TGP_Output_Model::scale_Z ( void ) -{ - if ( _Z_is_scaled || _is_fixed ) - return; - scale_Z ( _Z , _p ); - _Z_is_scaled = true; -} - -void NOMAD::TGP_Output_Model::scale_Z ( double * Z , int n ) const -{ - if ( _is_fixed ) - return; - for ( int i = 0 ; i < n ; ++i ) - Z[i] = Z[i] / _Z_scaling[0] - _Z_scaling[1]; -} - -/*--------------------------------------------*/ -/* unscale Z or ZZ (private) */ -/*--------------------------------------------*/ -void NOMAD::TGP_Output_Model::unscale_Z ( void ) -{ - if ( !_Z_is_scaled || _is_fixed ) - return; - unscale_Z ( _Z , _p ); - _Z_is_scaled = false; -} - -void NOMAD::TGP_Output_Model::unscale_Z ( double * Z , int n ) const -{ - if ( _is_fixed ) - return; - for ( int i = 0 ; i < n ; ++i ) - Z[i] = ( Z[i] + _Z_scaling[1] ) * _Z_scaling[0]; -} - -/*--------------------------------------------*/ -/* treat binary output (private) */ -/*--------------------------------------------*/ -void NOMAD::TGP_Output_Model::treat_binary_output ( double * ZZ , int nout ) const -{ - NOMAD::Double d0 , d1; - for ( int j = 0 ; j < nout ; ++j ) { - d0 = (_bin_values[0] - ZZ[j]).abs(); - d1 = (_bin_values[1] - ZZ[j]).abs(); - if ( d0 < d1 ) - ZZ[j] = _bin_values[0].value(); - else - ZZ[j] = _bin_values[1].value(); - } -} - -/*--------------------------------------------*/ -/* display */ -/*--------------------------------------------*/ -void NOMAD::TGP_Output_Model::display ( const NOMAD::Display & out ) const -{ - out << "Z ("; - if ( !_Z_is_scaled ) - out << "un"; - out << "scaled)" << " = [ "; - for ( int i = 0 ; i < _p ; ++i ) { - out << std::setw(15) << _Z[i]; - if ( (i+1)%5 == 0 ) - out << " ;" << std::endl << " "; - else - out << " "; - } - out << "]" << std::endl - << "size(Z)=" << _p << std::endl; - if ( _is_fixed ) - out << "fixed output"; - else if ( _is_binary ) - out << "binary output: values in {" - << _bin_values[0] << "," << _bin_values[1] - << "}"; - out << std::endl - << "Z_scaling=[" << _Z_scaling[0] << "," << _Z_scaling[1] - << "]" << std::endl; -} - -#endif diff --git a/src/TGP_Output_Model.hpp b/src/TGP_Output_Model.hpp deleted file mode 100644 index eaae843..0000000 --- a/src/TGP_Output_Model.hpp +++ /dev/null @@ -1,241 +0,0 @@ -/*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ -/* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ -/* */ -/* funded in part by AFOSR and Exxon Mobil */ -/* */ -/* Author: Sebastien Le Digabel */ -/* */ -/* Contact information: */ -/* Ecole Polytechnique de Montreal - GERAD */ -/* C.P. 6079, Succ. Centre-ville, Montreal (Quebec) H3C 3A7 Canada */ -/* e-mail: nomad@gerad.ca */ -/* phone : 1-514-340-6053 #6928 */ -/* fax : 1-514-340-5665 */ -/* */ -/* 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 the NOMAD software at www.gerad.ca/nomad */ -/*-------------------------------------------------------------------------------------*/ -/** - \file TGP_Output_Model.hpp - \brief TGP (Bayesian treed Gaussian process) model for one output (headers) - \author Sebastien Le Digabel - \date 2011-02-07 - \see TGP_Output_Model.cpp -*/ -#ifdef USE_TGP - -#ifndef __TGP_OUTPUT_MODEL__ -#define __TGP_OUTPUT_MODEL__ - -#include "Eval_Point.hpp" -#include "tgp.h" - -/*------------------------------*/ -/* TGP C functions prototypes */ -/*------------------------------*/ -extern "C" -{ - unsigned long three2lstate ( int * state ); - void * newRNGstate ( unsigned long s ); - void deleteRNGstate ( void * seed ); - unsigned int * GetImprovRank ( int, int, double **, int, int, double * ); -} - -namespace NOMAD { - - // NOMAD-TGP callback function (called regularly by TGP). - // void TGP_callback ( bool & TGP_interrupt ); // SLD -- 2014-09-04 - - /// TGP models for one output. - class TGP_Output_Model : private NOMAD::Uncopyable { - - private: - - const NOMAD::Display & _out; ///< Display. - - int _p; ///< Number of interpolation points. - - double * _Z; ///< Output vector (size = \c p). - - double _Z_scaling[2]; ///< To scale/unscale \c Z. - bool _Z_is_scaled; ///< If \c Z is scaled or not. - - bool _is_binary; ///< If the output has only two values. - NOMAD::Point _bin_values; ///< Binary output values. - - bool _is_fixed; ///< Only one output value saved in \c bin_values[0]. - - void * _tgp_state; ///< RNG (random number generator). - - Model * _tgp_model; ///< The TGP model. - - Temper * _tgp_its; ///< Importance tempering object. - - static double _ditemps[7]; ///< Importance tempering parameters. - - static bool _force_quit; ///< Flag equal to \c true if ctrl-c is pressed. - - /// Treat binary output. - /** - \param ZZ Output vector -- \b IN/OUT. - \param nout Size of output -- \b IN. - */ - void treat_binary_output ( double * ZZ , int nout ) const; - - /// Scale member \c _Z. - void scale_Z ( void ); - - /// Unscale member \c _Z. - void unscale_Z ( void ); - - /// Scale an output \c Z. - /** - \param Z Output to scale -- \b IN/OUT. - \param n Size of output -- \b IN. - */ - void scale_Z ( double * Z , int n ) const; - - /// Unscale an output \c Z. - /** - \param Z Output to unscale -- \b IN/OUT. - \param n Size of output -- \b IN. - */ - void unscale_Z ( double * Z , int n ) const; - - public: - - /// Constructor. - /** - \param X_pts Interpolation points with output values -- \b IN. - \param bbo_index Output index -- \b IN. - \param seed Random seed (\c 0 to have the same \c R results) -- \b IN. - \param out Display object -- \b IN. - */ - explicit TGP_Output_Model - ( const std::list<const NOMAD::Eval_Point *> & X_pts , - int bbo_index , - int seed , - const NOMAD::Display & out ); - - /// Destructor. - virtual ~TGP_Output_Model ( void ); - - /// Force quit (called by pressing ctrl-c). - static void force_quit ( void ) - { - NOMAD::TGP_Output_Model::_force_quit = true; - } - - /// Access to the \c force_quit flag. - /** - \return The \c force_quit flag. - */ - static bool get_force_quit ( void ) { return NOMAD::TGP_Output_Model::_force_quit; } - - /// Compute the model. - /** - \param X \c X matrix (\c X_pts \c x \c n): interpolation pts -- \b IN. - \param XX \c XX matrix (\c n_XX \c x \c n): prediction points -- \b IN. - \param Xsplit \x Xsplit matrix (\c X plus \c XX) -- \b IN. - \param n Dimension and number of columns of the matrices -- \b IN. - \param n_XX Number of rows of \c XX -- \b IN. - \param nsplit Number of rows of \c Xsplit (\c X_pts \c + \c n_XX) -- \b IN. - \param tgp_params TGP parameters -- \b IN. - \param tgp_rect TGP rectangle -- \b IN. - \param tgp_BTE TGP \c B,\c T, and \c R parameters -- \b IN. - \param tgp_linburn TGP \c linburn parameter -- \b IN. - \param tgp_verb TGP \c verb parameter -- \b IN. - \param ZZ \c ZZ vector (size \c n_XX): prediction values -- \b OUT. - \param Ds2x Expected reduction in predictive var (size \c n_XX) -- \b OUT. - \param improv Expected improvement of the obj. (size \c n_XX) -- \b OUT. - */ - void compute ( double ** X , - double ** XX , - double ** Xsplit , - int n , - int n_XX , - int nsplit , - Params * tgp_params , - double ** tgp_rect , - int * tgp_BTE , - bool tgp_linburn , - bool tgp_verb , - double * ZZ , - double * Ds2x , - int * improv ); - - /// Prediction at one point. - /** - \param XX \c XX matrix (\c n_XX \c x \c n): prediction points -- \b IN. - \param n Dimension and number of columns of the matrices -- \b IN. - \param ZZ \c ZZ vector (size \c n_XX): prediction values -- \b OUT. - \param tgp_rect TGP rectangle -- \b IN. - \return A boolean equal to \c true if the prediction went well. - */ - bool predict ( double * XX , - int n , - double & ZZ , - double ** tgp_rect ) const; - - /// Access to \c Z. - /** - \return The \c Z vector. - */ - const double * get_Z ( void ) const { return _Z; } - - /// Access to the \c fixed flag. - /** - \return The \c fixed flag. - */ - bool is_fixed ( void ) const { return _is_fixed; } - - /// Access to the \c binary flag. - /** - \return The \c binary flag. - */ - bool is_binary ( void ) const { return _is_binary; } - - /// Default display. - void display ( void ) { display ( _out ); } - - /// Display. - /** - \param out Display -- \b IN. - */ - void display ( const NOMAD::Display & out ) const; - }; - - /// Display a NOMAD::TGP_Output_Model object. - /** - \param out The NOMAD::Display object -- \b IN. - \param s The NOMAD::TGP_Output_Model object to be displayed -- \b IN. - \return The NOMAD::Display object. - */ - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::TGP_Output_Model & s ) { - s.display ( out ); - return out; - } - -} - -#endif -#endif diff --git a/src/Uncopyable.hpp b/src/Uncopyable.hpp index 64065a3..5b2dc86 100644 --- a/src/Uncopyable.hpp +++ b/src/Uncopyable.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ diff --git a/src/VNS_Search.cpp b/src/VNS_Search.cpp index 508057a..647dd6c 100644 --- a/src/VNS_Search.cpp +++ b/src/VNS_Search.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -129,7 +136,7 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , out.close_block ( "end of VNS search (no signature)" ); return; } - + int n = signature->get_n(); if ( n != x->size() ) { @@ -143,9 +150,11 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , signature->get_one_direction ( dir , _k - 1); + NOMAD::Point xp(n); + for (int i = 0 ; i < n ; ++i ) + xp[i] = ( (_p.get_bb_input_type())[i]==NOMAD::BINARY && dir[i]==1.0 && (*x)[i]==1.0 ) ? 0.0 : xp[i] = (*x)[i] + dir[i]; + - // shaking: construct x': - NOMAD::Point xp = *x + dir; // shaking: the perturbation is tried twice with dir and -dir // (in case x == x + dir after snapping) @@ -179,7 +188,11 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , // Current mesh indices const NOMAD::Point old_mesh_indices = signature->get_mesh()->get_mesh_indices ( ); + // Current min mesh size const NOMAD::Point old_delta_min = signature->get_mesh()->get_min_mesh_size(); + // Current min poll size + const NOMAD::Point old_Delta_min = signature->get_mesh()->get_min_poll_size(); + // stats: @@ -187,7 +200,7 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , // current number of blackbox evaluations: int bbe = stats.get_bb_eval(); - int blk_eva = stats.get_block_eval(); + int blk_eva = stats.get_block_eval(); int sgte_eval = stats.get_sgte_eval(); int mads_iterations = stats.get_iterations(); bool has_sgte = _p.has_sgte(); @@ -196,17 +209,17 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , if ( display_degree == NOMAD::FULL_DISPLAY ) { out << " it = " << mads_iterations << std::endl - << " bbe = " << bbe << std::endl - << " blk_eva = " << blk_eva << std::endl; + << " bbe = " << bbe << std::endl + << " blk_eva = " << blk_eva << std::endl; if ( has_sgte ) out << " sgte_eval = " << sgte_eval << std::endl; out << "mesh_indices = ( " << old_mesh_indices << " ) " << std::endl - << " k = " << _k << std::endl - << " kmax = " << _k_max << std::endl - << " x = ( "; + << " k = " << _k << std::endl + << " kmax = " << _k_max << std::endl + << " x = ( "; x->Point::display ( out , " " , 5 , _p.get_point_display_limit() ); out << " ) f=" << x->get_f() << " h=" << x->get_h() << std::endl - << " dir = ( "; + << " dir = ( "; dir.Point::display ( out , " " , 5 , _p.get_point_display_limit() ); out << " ) |dir|="; NOMAD::Double norm = dir.norm(); @@ -215,7 +228,7 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , xp.display ( out , " " , 5 , _p.get_point_display_limit() ); out << " )" << std::endl << std::endl; out << "bb_eval (before+VNS only) objective_value" - << std::endl << std::endl; + << std::endl << std::endl; } // save parameters that are going to be modified: @@ -252,6 +265,7 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , bool old_uce = _p.get_user_calls_enabled(); bool old_epe = _p.get_extended_poll_enabled(); const std::vector<NOMAD::bb_output_type> old_bbot = _p.get_bb_output_type(); + int old_max_eval_intensification = _p.get_max_eval_intensification(); // save list of starting points: std::string x0_cache_file = _p.get_x0_cache_file(); @@ -263,10 +277,14 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , x0s.push_back ( new Point ( *x0s_tmp[k] ) ); } + if ( _p.get_display_degree() == NOMAD::FULL_DISPLAY ) + _p.set_DISPLAY_DEGREE ( NOMAD::NORMAL_DISPLAY ); + else if ( _p.get_display_degree() == NOMAD::NORMAL_DISPLAY ) + _p.set_DISPLAY_DEGREE ( NOMAD::MINIMAL_DISPLAY ); + + // modify parameters: // ------------------ - _p.set_DISPLAY_DEGREE(NOMAD::NO_DISPLAY); - _p.set_SOLUTION_FILE ( "" ); _p.set_LH_SEARCH ( 0 , 0 ); _p.set_VNS_SEARCH ( false ); @@ -293,7 +311,7 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , _p.set_DISPLAY_STATS ( NOMAD::itos(sgte_eval) + "+SGTE OBJ (VNS--surrogate)" ); else { - std::list<std::string> ds = old_ds; + std::list<std::string> ds = old_ds; std::list<std::string>::iterator it = ds.begin(); std::list<std::string>::const_iterator end = ds.end(); std::string s_bbe = NOMAD::itos(bbe) + "+"; @@ -317,7 +335,7 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , std::list<std::string>::iterator it = sf.begin(); std::list<std::string>::const_iterator end = sf.end(); std::string s_bbe = NOMAD::itos(bbe) + "+"; - std::string s_blk = NOMAD::itos(blk_eva) + "+"; + std::string s_blk = NOMAD::itos(blk_eva) + "+"; while ( it != end ) { if ( *it == "BBE" ) @@ -327,17 +345,9 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , ++it; } sf.push_back ( " (VNS)" ); - - _p.set_STATS_FILE( old_stats_file_name, sf); + _p.set_STATS_FILE ( old_stats_file_name , sf ); } - - // Mesh size at current mads iterate can be used as termination criterion for vns search. - // Mesh indices are reinitialized during p.check() - NOMAD::Point delta=signature->get_mesh()->get_delta ( ); - signature->get_mesh()->set_min_mesh_sizes( delta ); - - // X0: _p.set_EXTERN_SIGNATURE ( signature ); _p.set_X0 ( xp ); @@ -348,6 +358,12 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , else _p.set_MAX_BB_EVAL ( old_max_bbe - bbe ); + // MAX_EVAL_INTENSIFICATION + if ( old_max_eval_intensification > 0 && _p.get_intensification_type() == NOMAD::POLL_ONLY ) + _p.set_MAX_EVAL_INTENSIFICATION ( 0 ); + + + // MAX_SGTE_EVAL: if ( old_max_sgte_eval > 0 ) _p.set_MAX_SGTE_EVAL ( old_max_sgte_eval - sgte_eval ); @@ -379,11 +395,24 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , _p.set_STOP_IF_FEASIBLE ( false ); } + // The mesh size before starting vns search + // Mesh indices, mesh size and poll size are reinitialized during p.check() + NOMAD::Point delta=signature->get_mesh()->get_delta ( ); + NOMAD::Point Delta=signature->get_mesh()->get_Delta ( ); + // check the parameters: _p.check ( false , // remove_history_file = false false , // remove_solution_file = false false ); // remove_stats_file = false + // Mesh and poll sizes at current mads iterate can be used as termination criterion for vns search (the mesh object may set min mesh size to initial mesh size if necessary). + signature->get_mesh()->set_min_mesh_sizes( delta ); + signature->get_mesh()->set_min_poll_sizes( Delta ); + + // Modified dimension after extern signature is set + int modified_dimension = _p.get_dimension(); + + // Evaluator_Control: NOMAD::Evaluator_Control & ev_control = mads.get_evaluator_control(); @@ -445,6 +474,12 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , } else if ( !x0_cache_file.empty() ) _p.set_X0 ( x0_cache_file ); + + if ( x0s.size() !=0 && x0s[0]->size() != modified_dimension ) + { + _p.reset_X0(); + _p.set_X0 ( *x ); + } } // restore other saved parameters: @@ -473,17 +508,18 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , _p.set_MAX_TIME ( old_max_time ); _p.set_SGTE_EVAL_SORT ( old_ses ); _p.set_OPT_ONLY_SGTE ( opt_only_sgte ); - _p.set_BB_OUTPUT_TYPE ( old_bbot ); + _p.set_BB_OUTPUT_TYPE ( old_bbot ); + _p.set_MAX_EVAL_INTENSIFICATION ( old_max_eval_intensification ); _p.check ( false , // remove_history_file = false false , // remove_solution_file = false false ); // remove_stats_file = false - // restore min mesh sizes and mesh indices + // Needed because mesh reinitialized during p.check() signature->get_mesh()->set_min_mesh_sizes( old_delta_min ); - signature->get_mesh()->set_mesh_indices( old_mesh_indices ); // Needed because mesh indices reinitialized during p.check() - + signature->get_mesh()->set_min_poll_sizes( old_Delta_min ); + signature->get_mesh()->set_mesh_indices( old_mesh_indices ); // surrogate evaluations: perform only one true evaluation: if ( has_sgte && !opt_only_sgte ) @@ -606,7 +642,7 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , // ( active_barrier.check_PEB_constraints() ): if ( _p.get_barrier_type() == NOMAD::PEB_P ) ( ( _p.get_opt_only_sgte() ) ? sgte_barrier : true_barrier ).check_PEB_constraints ( *new_infeas_inc , display_degree==NOMAD::FULL_DISPLAY ); - } + } // number of search points and success: if ( opt_only_sgte ) @@ -622,8 +658,16 @@ void NOMAD::VNS_Search::search ( NOMAD::Mads & mads , // solution file: if ( bf ) + { ev_control.write_solution_file ( *bf ); + } + if ( new_feas_inc && display_degree > NOMAD::NO_DISPLAY && display_degree < NOMAD::FULL_DISPLAY ) + { + std::list<std::string> ds = old_ds; + ds.push_back ( " (VNS)" ); + ev_control.display_stats(false, out, ds , new_feas_inc , true , NULL ); + } } // final display: diff --git a/src/VNS_Search.hpp b/src/VNS_Search.hpp index f74a3fe..e966c3f 100644 --- a/src/VNS_Search.hpp +++ b/src/VNS_Search.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file VNS_Search.hpp - \brief VNS search (headers) - \author Sebastien Le Digabel - \date 2010-04-12 - \see VNS_Search.cpp -*/ + \file VNS_Search.hpp + \brief VNS search (headers) + \author Sebastien Le Digabel + \date 2010-04-12 + \see VNS_Search.cpp + */ #ifndef __VNS_SEARCH__ #define __VNS_SEARCH__ @@ -47,57 +54,57 @@ #include "Search.hpp" namespace NOMAD { - - /// Variable Neighborhood Search (VNS) search. - class VNS_Search : public NOMAD::Search , private NOMAD::Uncopyable { - - private: - - int _k; ///< VNS neighborhood parameter. - int _k_max; ///< Maximum value of \c _k. - const NOMAD::Eval_Point * _old_x; ///< Previous reference point (updates \c _k). - - public: - - /// Constructor. - /** - \param p Parameters -- \b IN. - */ - VNS_Search ( NOMAD::Parameters & p ) - : NOMAD::Search ( p , NOMAD::VNS_SEARCH ) , - _k ( 1 ) , - _k_max ( 1 ) , - _old_x ( NULL ) {} - - /// Destructor. - virtual ~VNS_Search ( void ) {} - - /// Reset. - virtual void reset ( void ); - - /// The VNS search. - /** - Principle: x --[shaking(k)]--> x' --[descent]--> x'' . - \param mads NOMAD::Mads object invoking this search -- \b IN/OUT. - \param nb_search_pts Number of generated search points -- \b OUT. - \param stop Stop flag -- \b IN/OUT. - \param stop_reason Stop reason -- \b OUT. - \param success Type of success -- \b OUT. - \param count_search Count or not the search -- \b OUT. - \param new_feas_inc New feasible incumbent -- \b IN/OUT. - \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. - */ - virtual void search ( NOMAD::Mads & mads , - int & nb_search_pts , - bool & stop , - NOMAD::stop_type & stop_reason , - NOMAD::success_type & success , - bool & count_search , - const NOMAD::Eval_Point *& new_feas_inc , - const NOMAD::Eval_Point *& new_infeas_inc ); - - }; + /// Variable Neighborhood Search (VNS) search. + class VNS_Search : public NOMAD::Search , private NOMAD::Uncopyable { + + private: + + int _k; ///< VNS neighborhood parameter. + int _k_max; ///< Maximum value of \c _k. + const NOMAD::Eval_Point * _old_x; ///< Previous reference point (updates \c _k). + + + public: + + /// Constructor. + /** + \param p Parameters -- \b IN. + */ + VNS_Search ( NOMAD::Parameters & p ) + : NOMAD::Search ( p , NOMAD::VNS_SEARCH ) , + _k ( 1 ) , + _k_max ( 1 ) , + _old_x ( NULL ) {} + + /// Destructor. + virtual ~VNS_Search ( void ) {} + + /// Reset. + virtual void reset ( void ); + + /// The VNS search. + /** + Principle: x --[shaking(k)]--> x' --[descent]--> x'' . + \param mads NOMAD::Mads object invoking this search -- \b IN/OUT. + \param nb_search_pts Number of generated search points -- \b OUT. + \param stop Stop flag -- \b IN/OUT. + \param stop_reason Stop reason -- \b OUT. + \param success Type of success -- \b OUT. + \param count_search Count or not the search -- \b OUT. + \param new_feas_inc New feasible incumbent -- \b IN/OUT. + \param new_infeas_inc New infeasible incumbent -- \b IN/OUT. + */ + virtual void search ( NOMAD::Mads & mads , + int & nb_search_pts , + bool & stop , + NOMAD::stop_type & stop_reason , + NOMAD::success_type & success , + bool & count_search , + const NOMAD::Eval_Point *& new_feas_inc , + const NOMAD::Eval_Point *& new_infeas_inc ); + + }; } #endif diff --git a/src/Variable_Group.cpp b/src/Variable_Group.cpp index c177fec..6c198f1 100644 --- a/src/Variable_Group.cpp +++ b/src/Variable_Group.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -45,11 +52,10 @@ /*-------------------------------------------------------------*/ /* check (also removes fixed variables from the group) */ /*-------------------------------------------------------------*/ -bool NOMAD::Variable_Group::check -( const NOMAD::Point & fixed_vars , - const std::vector<NOMAD::bb_input_type> & bbit , - std::vector<bool> * in_group , - bool & mod ) +bool NOMAD::Variable_Group::check( const NOMAD::Point & fixed_vars , + const std::vector<NOMAD::bb_input_type> & bbit , + std::vector<bool> * in_group , + bool & mod ) { // initial checks: @@ -141,15 +147,17 @@ bool NOMAD::Variable_Group::check /*---------------------------------------------------------*/ /* compute the directions */ /*---------------------------------------------------------*/ -void NOMAD::Variable_Group::get_directions ( std::list<NOMAD::Direction> & dirs , - NOMAD::poll_type poll , - const NOMAD::OrthogonalMesh & mesh ) +void NOMAD::Variable_Group::get_directions ( std::list<NOMAD::Direction> & dirs , + NOMAD::poll_type poll , + const NOMAD::OrthogonalMesh & mesh ) { - - _directions->compute ( dirs , - poll , + // vectors are of size nc : + // ------------------------ + _directions->compute ( dirs , + poll , mesh ); return; + } /*---------------------------------------------------------*/ @@ -166,7 +174,8 @@ bool NOMAD::Variable_Group::operator < ( const NOMAD::Variable_Group & vg ) cons std::set<int>::const_iterator it1 , it2 = vg._var_indexes.begin() , end = _var_indexes.end(); - for ( it1 = _var_indexes.begin() ; it1 != end ; ++it1 , ++it2 ) { + for ( it1 = _var_indexes.begin() ; it1 != end ; ++it1 , ++it2 ) + { if ( *it1 < *it2 ) return true; if ( *it1 > *it2 ) diff --git a/src/Variable_Group.hpp b/src/Variable_Group.hpp index 70f6054..beee305 100644 --- a/src/Variable_Group.hpp +++ b/src/Variable_Group.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -118,7 +125,7 @@ namespace NOMAD { bool check ( const NOMAD::Point & fixed_vars , const std::vector<NOMAD::bb_input_type> & bbit , std::vector<bool> * in_group , - bool & mod ); + bool & mod ); /// Check if the directions are Ortho-MADS directions. /** @@ -126,7 +133,6 @@ namespace NOMAD { */ bool is_orthomads ( void ) const { return _directions->is_orthomads(); } - /// Access to the variable indexes. /** \return The variable indexes. @@ -151,15 +157,16 @@ namespace NOMAD { return _directions->get_sec_poll_dir_types(); } + /// Access to the directions. /** - \param dirs List of directions -- \b OUT. - \param poll Type of poll (primary or secondary) -- \b IN. - \param mesh Mesh -- \b IN. + \param dirs List of directions -- \b OUT. + \param poll Type of poll (primary or secondary) -- \b IN. + \param mesh Mesh -- \b IN. */ - void get_directions ( std::list<NOMAD::Direction> & dirs , - NOMAD::poll_type poll , - const NOMAD::OrthogonalMesh & mesh ); + void get_directions ( std::list<NOMAD::Direction> & dirs , + NOMAD::poll_type poll , + const NOMAD::OrthogonalMesh & mesh ); /// Access to one direction for a given mesh. @@ -193,7 +200,8 @@ namespace NOMAD { \return The NOMAD::Display object. */ inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::Variable_Group & vg ) { + const NOMAD::Variable_Group & vg ) + { vg.display ( out ); return out; } @@ -202,9 +210,11 @@ namespace NOMAD { /** Used with \c set<Variable_Group*,VG_Comp> in class NOMAD::Parameters. */ - struct VG_Comp { + struct VG_Comp + { /// Comparison between two NOMAD::Variable_Group objects. - bool operator() ( const Variable_Group * vg1 , const Variable_Group * vg2 ) const { + bool operator() ( const Variable_Group * vg1 , const Variable_Group * vg2 ) const + { return (*vg1 < *vg2); } }; diff --git a/src/XMesh.cpp b/src/XMesh.cpp index 926ddac..f19078d 100644 --- a/src/XMesh.cpp +++ b/src/XMesh.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -36,7 +43,7 @@ /** \file XMesh.cpp \brief Class for the MADS xmesh (implementation) - \author Christophe Tribes + \author Christophe Tribes \date 2014-07 \see XMesh.hpp */ @@ -48,79 +55,63 @@ /* init the XMesh */ /*-----------------------------------------------------------*/ void NOMAD::XMesh::init ( ) -{ - bool chkMesh = _delta_min.is_defined(); - bool chkPoll = _Delta_min_is_defined; - _n = _delta_0.size(); - - - if ( !_Delta_0.is_complete() ) - throw NOMAD::Exception ( "XMesh.cpp" , __LINE__ , - "NOMAD::XMesh::init(): Delta_0 has undefined values" ); - if ( _delta_0.size() != _Delta_0.size() ) - throw NOMAD::Exception ( "XMesh.cpp" , __LINE__ , - "NOMAD::XMesh::init(): delta_0 and Delta_0 have different sizes" ); - - if ( !_delta_0.is_complete() ) - throw NOMAD::Exception ( "XMesh.cpp" , __LINE__ , - "NOMAD::XMesh::init(): delta_0 has undefined values" ); - - if ( chkMesh && _delta_min.size() != _n ) - throw NOMAD::Exception ( "XMesh.cpp" , __LINE__ , - "NOMAD::XMesh::init(): delta_0 and delta_min have different sizes" ); - - if ( chkPoll && _Delta_min.size() != _n ) - throw NOMAD::Exception ( "XMesh.cpp" , __LINE__ , - "NOMAD::XMesh::init(): delta_0 and Delta_min have different sizes" ); - +{ + if ( _limit_mesh_index >0 ) - throw NOMAD::Exception ( "XMesh.cpp" , __LINE__ , - "NOMAD::XMesh::XMesh(): limit mesh index must be <=0 " ); - - - _r.resize( _n ); - _r_max.resize( _n ); - _r_min.resize( _n ); - - for ( int k = 0 ; k < _n ; ++k ) - { - _r[k]=0; - _r_max[k]=0; - _r_min[k]=0; - } - - + throw NOMAD::Exception ( "XMesh.cpp" , __LINE__ , + "NOMAD::XMesh::XMesh(): limit mesh index must be <=0 " ); + + // The delta_0 depends on Delta_0 and the problem dimension + _delta_0=_Delta_0; + _delta_0*=pow(_n_free_variables,-0.5); + + + _r.resize( _n ); + _r_max.resize( _n ); + _r_min.resize( _n ); + + for ( int k = 0 ; k < _n ; ++k ) + { + _r[k]=0; + _r_max[k]=0; + _r_min[k]=0; + + } + + } /*-----------------------------------------------------------*/ /* Update the provided mesh indices (the Mesh is unchanged). */ /*-----------------------------------------------------------*/ -void NOMAD::XMesh::update ( NOMAD::success_type success , NOMAD::Point & mesh_indices, const NOMAD::Direction *dir ) const +void NOMAD::XMesh::update ( NOMAD::success_type success , + NOMAD::Point & mesh_indices, + const NOMAD::Direction *dir ) const { - - if ( mesh_indices.is_defined() ) - { - - if ( dir && dir->size() != mesh_indices.size() ) - throw NOMAD::Exception ( "XMesh.cpp" , __LINE__ , - "NOMAD::XMesh::update(): mesh_indices and dir have different sizes" ); - - for (int i=0; i < mesh_indices.size() ; i++) - { - if ( success == NOMAD::FULL_SUCCESS ) - { - - if ( (*dir)[i] !=0.0) - mesh_indices[i] += _coarsening_step; - - if ( mesh_indices[i] > -NOMAD::XL_LIMITS ) - mesh_indices[i] = -NOMAD::XL_LIMITS; - } - else if ( success == NOMAD::UNSUCCESSFUL ) - mesh_indices[i] += _refining_step; - } - } + + if ( mesh_indices.is_defined() ) + { + + if ( dir && dir->size() != mesh_indices.size() ) + throw NOMAD::Exception ( "XMesh.cpp" , __LINE__ , + "NOMAD::XMesh::update(): mesh_indices and dir have different sizes" ); + + for (int i=0; i < mesh_indices.size() ; i++) + { + if ( success == NOMAD::FULL_SUCCESS ) + { + + if ( (*dir)[i] !=0.0) + mesh_indices[i] += _coarsening_step; + + if ( mesh_indices[i] > -NOMAD::XL_LIMITS ) + mesh_indices[i] = -NOMAD::XL_LIMITS; + } + else if ( success == NOMAD::UNSUCCESSFUL ) + mesh_indices[i] += _refining_step; + } + } } @@ -128,24 +119,26 @@ void NOMAD::XMesh::update ( NOMAD::success_type success , NOMAD::Point & mesh_in /*-----------------------------------------------------------*/ /* update the XMesh */ /*-----------------------------------------------------------*/ -void NOMAD::XMesh::update ( NOMAD::success_type success , const NOMAD::Direction * dir) +void NOMAD::XMesh::update ( NOMAD::success_type success , const NOMAD::Direction * dir) // , const NOMAD::OrthogonalMesh *mesh ) { - // defaults: - // full success: r^k_j = r^k_j + 1 if (dir_k != 0 and anistropic_mesh) and r^k_j remains the same if dir_k=0 - // failure : r^k_j = r^k_j - 1 - - - if ( dir && dir->size() != _n ) - throw NOMAD::Exception ( "XMesh.cpp" , __LINE__ , - "NOMAD::XMesh::update(): delta_0 and dir have different sizes" ); - - - if ( success == NOMAD::FULL_SUCCESS ) - { - // Evaluate ||d||_inf - NOMAD::Double norm_inf=0; + // defaults: + // full success: r^k_j = r^k_j + 1 if (dir_k != 0 and anistropic_mesh) and r^k_j remains the same if dir_k=0 + // failure : r^k_j = r^k_j - 1 + + // Granularity is only used to block Delta from decreasing but mesh indices are updated + + + if ( dir && dir->size() != _n ) + throw NOMAD::Exception ( "XMesh.cpp" , __LINE__ , + "NOMAD::XMesh::update(): delta_0 and dir have different sizes" ); + + + if ( success == NOMAD::FULL_SUCCESS ) + { + // Evaluate ||d||_inf + NOMAD::Double norm_inf=0; NOMAD::Point delta=NOMAD::OrthogonalMesh::get_delta(); - + if ( _anisotropic_mesh ) { for (int i=0; i < _n; i++) @@ -162,42 +155,42 @@ void NOMAD::XMesh::update ( NOMAD::success_type success , const NOMAD::Direction for (int j=0; j < _n; j++) if ( _r[j] > max_index ) max_index=_r[j]; - - - // Update mesh indices for coordinates with |dir_j|>1/n_free_variables ||dir||_inf or mesh index >=-2 - for (int i=0; i < _n; i++) - { + + + // Update mesh indices for coordinates with |dir_j|>1/n_free_variables ||dir||_inf or mesh index >=-2 + for (int i=0; i < _n; i++) + { if ( ! dir || (*dir)[i].abs()/delta[i] > norm_inf/_n_free_variables || _r[i] >=-2 ) - { - _r[i] += _coarsening_step; - - if (_r[i] > -NOMAD::XL_LIMITS ) - _r[i] = -NOMAD::XL_LIMITS; - - if ( _r[i] > _r_max[i] ) - _r_max[i] = _r[i]; - - } - } - - - // Udate mesh indices for coordinates with |dir_l| < 1/n_free_variables ||dir||_inf and mesh index < 2*max_mesh_index - for (int l=0; l < _n; l++) - { - if ( dir && _r[l] < -2 && (*dir)[l].abs()/delta[l] <= norm_inf/_n_free_variables && _r[l] < 2*max_index ) - _r[l]+= _coarsening_step; - } - - } - else if ( success == NOMAD::UNSUCCESSFUL ) - for (int i=0; i< _n; i++) - { - _r[i] += _refining_step; - - if ( _r[i] < _r_min[i] ) - _r_min[i] = _r[i]; - - } + { + _r[i] += _coarsening_step; + + if (_r[i] > -NOMAD::XL_LIMITS ) + _r[i] = -NOMAD::XL_LIMITS; + + if ( _r[i] > _r_max[i] ) + _r_max[i] = _r[i]; + + } + } + + + // Udate mesh indices for coordinates with |dir_l| < 1/n_free_variables ||dir||_inf and mesh index < 2*max_mesh_index + for (int l=0; l < _n; l++) + { + if ( dir && _r[l] < -2 && (*dir)[l].abs()/delta[l] <= norm_inf/_n_free_variables && _r[l] < 2*max_index ) + _r[l]+= _coarsening_step; + } + + } + else if ( success == NOMAD::UNSUCCESSFUL ) + for (int i=0; i< _n; i++) + { + _r[i] += _refining_step; + + if ( _r[i] < _r_min[i] ) + _r_min[i] = _r[i]; + + } } @@ -206,21 +199,21 @@ void NOMAD::XMesh::update ( NOMAD::success_type success , const NOMAD::Direction /*-----------------------------------------------------------*/ void NOMAD::XMesh::display ( const NOMAD::Display & out ) const { - out << "n : " << _n << std::endl - << "tau : " << _update_basis << std::endl - << "poll coarsening exponent: " << _coarsening_step << std::endl - << "poll refining exponent : " << _refining_step << std::endl; + out << "n : " << _n << std::endl + << "tau : " << _update_basis << std::endl + << "poll coarsening exponent: " << _coarsening_step << std::endl + << "poll refining exponent : " << _refining_step << std::endl; out << "minimal mesh size : "; - if ( _delta_min.is_defined() ) - out << "(" << _delta_min << " )" << std::endl; - else - out << "none"; - out << std::endl - << "minimal poll size : "; - if ( _Delta_min_is_defined ) - out << "( " << _Delta_min << " )" << std::endl; - else - out << "none"; + if ( _delta_min.is_defined() ) + out << "(" << _delta_min << " )" << std::endl; + else + out << "none"; + out << std::endl + << "minimal poll size : "; + if ( _Delta_min_is_defined ) + out << "( " << _Delta_min << " )" << std::endl; + else + out << "none"; out << std::endl << "initial poll size : "; if (_Delta_0.is_defined()) @@ -235,7 +228,7 @@ void NOMAD::XMesh::display ( const NOMAD::Display & out ) const else out <<"( none )" << std::endl; - out << std::endl; + out << std::endl; } @@ -244,58 +237,57 @@ void NOMAD::XMesh::display ( const NOMAD::Display & out ) const /* and on the minimal mesh size */ /*----------------------------------------------------------*/ void NOMAD::XMesh::check_min_mesh_sizes ( bool & stop , - NOMAD::stop_type & stop_reason ) const + NOMAD::stop_type & stop_reason ) const { - if ( stop ) - return; - - // Coarse mesh stopping criterion - stop=false; + if ( stop ) + return; - for (int i=0;i<_n;i++) + // Coarse mesh stopping criterion + stop=false; + + for (int i=0;i<_n;i++) if ( _r[i] > -NOMAD::XL_LIMITS ) - { - stop = true; - break; - } - - if (stop) - { - stop_reason = NOMAD::XL_LIMITS_REACHED; - return; - } - - stop=true; - + { + stop = true; + break; + } + + if (stop) + { + stop_reason = NOMAD::XL_LIMITS_REACHED; + return; + } + + stop=true; // Fine mesh stopping criterion // All mesh indices must < _limit_mesh_index to trigger this stopping criterion - for (int i=0;i<_n;i++) - { - if ( _r[i] >= _limit_mesh_index ) - { - stop = false; - break; - } - } - if (stop) - { - stop_reason = NOMAD::XL_LIMITS_REACHED; - return; - } - - // 2. Delta^k (poll size) tests: - if ( check_min_poll_size_criterion ( ) ) - { - stop = true; - stop_reason = NOMAD::DELTA_P_MIN_REACHED; - } - - // 3. delta^k (mesh size) tests: - if ( check_min_mesh_size_criterion ( ) ) - { - stop = true; - stop_reason = NOMAD::DELTA_M_MIN_REACHED; - } + for (int i=0;i<_n;i++) + { + if ( _r[i] >= _limit_mesh_index ) + { + stop = false; + break; + } + } + if (stop) + { + stop_reason = NOMAD::XL_LIMITS_REACHED; + return; + } + + // 2. Delta^k (poll size) tests: + if ( check_min_poll_size_criterion ( ) ) + { + stop = true; + stop_reason = NOMAD::DELTA_P_MIN_REACHED; + } + + // 3. delta^k (mesh size) tests: + if ( check_min_mesh_size_criterion ( ) ) + { + stop = true; + stop_reason = NOMAD::DELTA_M_MIN_REACHED; + } } /*-----------------------------------------------------------*/ @@ -303,11 +295,11 @@ void NOMAD::XMesh::check_min_mesh_sizes ( bool & stop , /*-----------------------------------------------------------*/ bool NOMAD::XMesh::check_min_poll_size_criterion ( ) const { - if ( !_Delta_min_is_defined ) - return false; - - NOMAD::Point Delta; - return get_Delta ( Delta ); + if ( !_Delta_min_is_defined ) + return false; + + NOMAD::Point Delta; + return get_Delta ( Delta ); } /*-----------------------------------------------------------*/ @@ -315,118 +307,103 @@ bool NOMAD::XMesh::check_min_poll_size_criterion ( ) const /*-----------------------------------------------------------*/ bool NOMAD::XMesh::check_min_mesh_size_criterion ( ) const { - if ( !_delta_min.is_defined() ) - return false; - - NOMAD::Point delta; - return get_delta ( delta ); + if ( !_delta_min.is_defined() ) + return false; + + NOMAD::Point delta; + return get_delta ( delta ); } /*--------------------------------------------------------------*/ -/* get delta (mesh size parameter) */ -/* delta^k = delta^0 \tau ^min{0,2*r^k} */ +/* get delta (mesh size parameter) */ +/* delta^k = delta^0 \tau ^min{0,2*r^k} */ /*--------------------------------------------------------------*/ /* the function also returns true if ALL delta[i] < delta_min */ -/*----------------------------------------------------------------*/ +/*--------------------------------------------------------------*/ bool NOMAD::XMesh::get_delta ( NOMAD::Point & delta ) const { - - delta.resize(_n); + + delta.resize(_n); bool delta_min_is_defined=_delta_min.is_defined(); - + bool stop = true; - - // delta^k = power_of_beta * delta^0: - for ( int i = 0 ; i < _n ; ++i ) - { - NOMAD::Double power_of_beta - = pow ( _update_basis.value() , ( (_r[i] >= 0) ? 0 : 2*_r[i].value() ) ); - - delta[i] = _delta_0[i] * power_of_beta; - - if ( delta_min_is_defined && _delta_min[i].is_defined() && delta[i] >= _delta_min[i] ) + + // delta^k = power_of_beta * delta^0: + for ( int i = 0 ; i < _n ; ++i ) + { + delta[i] = get_delta( i ); + + if ( stop && delta_min_is_defined && _delta_min[i].is_defined() && delta[i] >= _delta_min[i] ) stop = false; - } - - return stop; + } + + return stop; } /*--------------------------------------------------------------*/ -/* get delta (mesh size parameter) */ -/* delta^k = delta^0 \tau ^min{0,2*r^k} */ +/* get delta (mesh size parameter) */ +/* delta^k = delta^0 \beta ^min{0,2*r^k} */ /*--------------------------------------------------------------*/ NOMAD::Double NOMAD::XMesh::get_delta ( int i ) const { // delta^k = power_of_beta * delta^0: NOMAD::Double power_of_beta = pow ( _update_basis.value() , ( (_r[i] >= 0) ? 0 : 2*_r[i].value() ) ); - + return _delta_0[i] * power_of_beta; } -/*--------------------------------------------------------------*/ -/* get Delta (poll size parameter) */ -/* Delta^k = Delta^0 \tau ^{r^k} */ -/*--------------------------------------------------------------*/ -/* the function also returns true if all values are < Delta_min */ -/*----------------------------------------------------------------*/ +/*---------------------------------------------------------------*/ +/* get Delta (poll size parameter) */ +/* Delta^k = Delta^0 \beta ^{r^k} */ +/*---------------------------------------------------------------*/ +/* the function also returns true if all values are < Delta_min */ +/*---------------------------------------------------------------*/ bool NOMAD::XMesh::get_Delta ( NOMAD::Point & Delta ) const { - - bool stop = true; - + + bool stop = true; Delta.resize(_n); - - // delta^k = power_of_tau * delta^0: - for ( int i = 0 ; i < _n ; ++i ) - { - Delta[i] = _Delta_0[i] * pow( _update_basis.value() , _r[i].value() ); - - if ( !_Delta_min_is_complete || Delta[i] >= _Delta_min[i] ) - stop = false; + + // delta^k = power_of_tau * delta^0: + for ( int i = 0 ; i < _n ; ++i ) + { + Delta[i] = get_Delta( i ); - if ( _Delta_min_is_defined && _Delta_min[i].is_defined() && Delta[i] < _Delta_min[i] ) - Delta[i]=_Delta_min[i]; - - } - - return stop; + if ( stop && ! _fixed_variables[i].is_defined() && ( !_Delta_min_is_complete || Delta[i] >= _Delta_min[i] ) ) + stop = false; + } + + return stop; } /*--------------------------------------------------------------*/ /* get Delta_i (poll size parameter) */ -/* Delta^k = Delta^0 \tau ^{r^k} */ -/*--------------------------------------------------------------*/ -/* the function returns Delta >= Delta_min */ +/* Delta^k = Delta^0 \beta ^{r^k} */ /*--------------------------------------------------------------*/ NOMAD::Double NOMAD::XMesh::get_Delta ( int i ) const { - NOMAD::Double Delta = _Delta_0[i] * pow( _update_basis.value() , _r[i].value() ); - if ( _Delta_min_is_defined && _Delta_min[i].is_defined() && Delta < _Delta_min[i] ) - Delta=_Delta_min[i]; - - return Delta; + } bool NOMAD::XMesh::is_finest ( ) const { - - for ( int i = 0 ; i < _n ; ++i ) - { - if ( _r[i] > _r_min[i] ) - return false; - } - return true; + for ( int i = 0 ; i < _n ; ++i ) + { + if ( _r[i] > _r_min[i] ) + return false; + } + return true; } @@ -437,17 +414,17 @@ void NOMAD::XMesh::set_mesh_indices ( const NOMAD::Point & r ) { if ( r.size() != _n ) - throw NOMAD::Exception ( "XMesh.cpp" , __LINE__ , + throw NOMAD::Exception ( "XMesh.cpp" , __LINE__ , "NOMAD::XMesh::set_mesh_indices(): dimension of provided mesh indices must be consistent with their previous dimension" ); - - _r=r; - for ( int i = 0 ; i < _n ; ++i ) - { - if ( r[i] > _r_max[i] ) - _r_max[i] = r[i]; - if ( r[i] < _r_min[i] ) - _r_min[i] = r[i]; - } + + _r=r; + for ( int i = 0 ; i < _n ; ++i ) + { + if ( r[i] > _r_max[i] ) + _r_max[i] = r[i]; + if ( r[i] < _r_min[i] ) + _r_min[i] = r[i]; + } } @@ -456,6 +433,7 @@ void NOMAD::XMesh::set_mesh_indices ( const NOMAD::Point & r ) /*-----------------------------------------------------------*/ void NOMAD::XMesh::set_limit_mesh_index ( int l ) { + _limit_mesh_index=l; } @@ -465,16 +443,20 @@ void NOMAD::XMesh::set_limit_mesh_index ( int l ) /*-----------------------------------------------------------*/ /* scale and project on the mesh */ /*-----------------------------------------------------------*/ -NOMAD::Double NOMAD::XMesh::scale_and_project(int i, const NOMAD::Double & l) const +NOMAD::Double NOMAD::XMesh::scale_and_project(int i, const NOMAD::Double & l, bool round_up) const { + NOMAD::Double delta = get_delta( i ); NOMAD::Double Delta = get_Delta( i ); - if ( i<=_n && delta.is_defined() && Delta.is_defined() ) { + NOMAD::Double d = Delta / delta * l; - return d.NOMAD::Double::round()*delta; + if ( ! round_up ) + return ( d < 0.0 ? -std::floor(.5-d.value()) : std::floor(.5+d.value()) ) * delta; + else + return d.NOMAD::Double::ceil()*delta; } else throw NOMAD::Exception ( "XMesh.cpp" , __LINE__ , @@ -486,26 +468,29 @@ NOMAD::Double NOMAD::XMesh::scale_and_project(int i, const NOMAD::Double & l) co NOMAD::Point NOMAD::XMesh::get_mesh_ratio_if_success ( void ) const { - - try - { - NOMAD::Point ratio( _n ); - for (int i=0 ; i < _n ; i++) - { - NOMAD::Double power_of_tau - = pow ( _update_basis.value() , ( (_r[i] >= 0) ? 0 : 2*_r[i].value() ) ); - - NOMAD::Double power_of_tau_if_success - = pow ( _update_basis.value() , ( (_r[i] + _coarsening_step >= 0) ? 0 : 2*(_r[i].value() + _coarsening_step) ) ); - - ratio[i] = power_of_tau_if_success/power_of_tau; - - } - - return ratio; - } - catch ( NOMAD::Double::Invalid_Value & ) - { - return NOMAD::Point( _n,-1 ); - } + + try + { + NOMAD::Point ratio( _n ); + for (int i=0 ; i < _n ; i++) + { + NOMAD::Double power_of_tau + = pow ( _update_basis.value() , ( (_r[i] >= 0) ? 0 : 2*_r[i].value() ) ); + + NOMAD::Double power_of_tau_if_success + = pow ( _update_basis.value() , ( (_r[i] + _coarsening_step >= 0) ? 0 : 2*(_r[i].value() + _coarsening_step) ) ); + + ratio[i] = power_of_tau_if_success/power_of_tau; + + } + + return ratio; + } + catch ( NOMAD::Double::Invalid_Value & ) + { + return NOMAD::Point( _n,-1 ); + } } + + + diff --git a/src/XMesh.hpp b/src/XMesh.hpp index e29262c..f3450fe 100644 --- a/src/XMesh.hpp +++ b/src/XMesh.hpp @@ -1,7 +1,7 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ +/* Copyright (C) 2001-2015 Mark Abramson - Brigham Young University, Provo */ /* Charles Audet - Ecole Polytechnique, Montreal */ /* Gilles Couture - Ecole Polytechnique, Montreal */ /* John Dennis - Rice University, Houston */ @@ -46,38 +46,35 @@ #include "OrthogonalMesh.hpp" namespace NOMAD { - - /// Class for the MADS Xmesh. - /** + + /// Class for the MADS Xmesh. + /** - The Xmesh in NOMAD is defined with the basic directions and the - mesh size parameter delta^k for each coordinate. - */ - - class XMesh : public NOMAD::OrthogonalMesh { - - /*--------------------------------------------------------------*/ - private: - - NOMAD::Point _r; // Mesh index per coordinate. - NOMAD::Point _r_min; - NOMAD::Point _r_max; - bool _anisotropic_mesh; - - - - /*--------------------------------------------------------------*/ - - /// Private affectation operator. - /** - \param m The right-hand side object -- \b IN. - */ - const XMesh & operator = ( const XMesh & m ); - - /// Check the minimal poll size criterion. - bool check_min_poll_size_criterion ( ) const; - - /// Check the minimal mesh size criterion. - bool check_min_mesh_size_criterion ( ) const; + mesh size parameter delta^k for each coordinate. + */ + + class XMesh : public NOMAD::OrthogonalMesh { + + /*--------------------------------------------------------------*/ + private: + + NOMAD::Point _r; // Mesh index per coordinate. + NOMAD::Point _r_min; + NOMAD::Point _r_max; + + /*--------------------------------------------------------------*/ + + /// Private affectation operator. + /** + \param m The right-hand side object -- \b IN. + */ + const XMesh & operator = ( const XMesh & m ); + + /// Check the minimal poll size criterion. + bool check_min_poll_size_criterion ( ) const; + + /// Check the minimal mesh size criterion. + bool check_min_mesh_size_criterion ( ) const; /// Access to the mesh size parameter delta^k. @@ -85,7 +82,7 @@ namespace NOMAD { \return delta The mesh size parameter delta^k -- \b OUT. \param i The index of the mesh size */ - NOMAD::Double get_delta ( int i ) const ; + inline NOMAD::Double get_delta ( int i ) const ; /// Access to the poll size parameter Delta^k. @@ -93,215 +90,207 @@ namespace NOMAD { \return Delta The poll size parameter Delta^k -- \b OUT. \param i The index of the poll size */ - NOMAD::Double get_Delta ( int i ) const ; - - void init ( ); - - public: - - /// Constructor. - /** - \param anistropic_mesh Use anisotropic mesh or not -- \b IN. - \param Delta_0 Initial poll size Delta^0 -- \b IN. - \param Delta_min Minimal poll size Delta^min (may be undefined) -- \b IN. - \param delta_min Minimal mesh size delta^min (may be undefined) -- \b IN. - \param poll_update_basis Poll update basis (b); default=2 -- \b IN. - \param poll_coarsening_step Poll coarsening step (w+); default=1 -- \b IN. - \param poll_refining_step Poll refining step (w-); default=-1 -- \b IN. + inline NOMAD::Double get_Delta ( int i ) const ; + + void init ( ); + + public: + + /// Constructor. + /** + \param anisotropic_mesh Use anisotropic mesh or not -- \b IN. + \param Delta_0 Initial poll size Delta^0 -- \b IN. + \param Delta_min Minimal poll size Delta^min (may be undefined) -- \b IN. + \param delta_min Minimal mesh size delta^min (may be undefined) -- \b IN. + \param poll_update_basis Poll update basis (b); default=2 -- \b IN. + \param poll_coarsening_step Poll coarsening step (w+); default=1 -- \b IN. + \param poll_refining_step Poll refining step (w-); default=-1 -- \b IN. \param fixed_variables Fixed variables -- \b IN. \param limit_min_mesh_index Limit mesh index (<0) -- \b IN. - */ - XMesh (bool anisotropic_mesh, + */ + XMesh (bool anisotropic_mesh, const NOMAD::Point & Delta_0 , - const NOMAD::Point & Delta_min , - const NOMAD::Point & delta_min , + const NOMAD::Point & Delta_min , + const NOMAD::Point & delta_min , const NOMAD::Point & fixed_variables, - NOMAD::Double poll_update_basis=2.0, - int poll_coarsening_step=1, - int poll_refining_step=-1 , + NOMAD::Double poll_update_basis=2.0, + int poll_coarsening_step=1, + int poll_refining_step=-1 , int limit_min_mesh_index=NOMAD::XL_LIMITS ) - : NOMAD::OrthogonalMesh ( Delta_0, - Delta_min, - delta_min, + : NOMAD::OrthogonalMesh ( anisotropic_mesh, + Delta_0, + Delta_min, + delta_min, fixed_variables, - poll_update_basis, - poll_coarsening_step, - poll_refining_step , - limit_min_mesh_index ), - _anisotropic_mesh ( anisotropic_mesh ){ init();} - - - - - /// Copy constructor. - /** - \param m The copied object -- \b IN. - */ - XMesh ( const XMesh & m ) - : OrthogonalMesh ( m ) , - _r ( m._r ), - _r_min ( m._r_min ), - _r_max ( m._r_max ), - _anisotropic_mesh ( m._anisotropic_mesh ){} - - /// Destructor. - ~XMesh ( void ) + NOMAD::Point(), + poll_update_basis, + poll_coarsening_step, + poll_refining_step , + limit_min_mesh_index ) { init();} + + + + + /// Copy constructor. + /** + \param m The copied object -- \b IN. + */ + XMesh ( const XMesh & m ) + : OrthogonalMesh ( m ) , + _r ( m._r ), + _r_min ( m._r_min ), + _r_max ( m._r_max ) { init(); } + + /// Destructor. + ~XMesh ( void ) { _delta_0.clear(); _Delta_0.clear(); _delta_min.clear(); _Delta_min.clear(); } - - - /// Access to the mesh size parameter delta^k for earch coordinate. - /** - - It is a NOMAD::Point of size \c nc the number of free variables. - \param delta The mesh size parameter delta^k -- \b OUT. - -- \b optional (default = the current mesh index ell_k.) - \return A boolean equal to \c true if all values are - strictly inferior than the associated minimal - mesh size delta_min (stopping criterion MIN_MESH_SIZE). - */ - bool get_delta ( NOMAD::Point & delta ) const ; - - /// Access to the largest mesh size for earch coordinate. - /** - \return delta_max - */ - NOMAD::Point get_delta_max ( void ) const { return _delta_0;} - - - /// Access to the poll size Delta^k for each coordinate. - /** - - It is a NOMAD::Point of size \c nc the number of free variables. - \param Delta The poll size parameter Delta^k -- \b OUT. - \return A boolean equal to \c true if all values are - strictly inferior than the associated minimal - poll size Delta_min - (stopping criterion MIN_POLL_SIZE). - */ - bool get_Delta ( NOMAD::Point & Delta) const ; - - - /// Update the provided mesh indices (the Mesh is unchanged). - /** - \param success Type of success of the iteration -- \b IN. - \param mesh_indices The mesh indices before and after the update -- \b IN/OUT. - \param dir The direction that is considered (opt) -- \b IN. - */ - void update ( NOMAD::success_type success , NOMAD::Point & mesh_indices, const NOMAD::Direction *dir=NULL ) const ; - - - /// Test if mesh finer than initial. - /** - \return True if mesh size is smaller than initial mesh size for all components; False otherwise. - */ - bool is_finer_than_initial (void) const {return true;} - - - - /// Update the XMesh (poll and mesh sizes). - /** - \param success Type of success of the iteration -- \b IN. - \param dir Direction of the iteration -- \b IN. - */ - void update ( NOMAD::success_type success, const NOMAD::Direction * dir=NULL); - - /// Reset the mesh to its original size (mesh indices). - void reset ( void ) { init() ;} - - - /// Display. - /** - \param out The NOMAD::Display object -- \b IN. - */ - void display ( const NOMAD::Display & out ) const; - - /// Test if r < r_min so far for all coordinates. - /** - \return True if mesh is the finest so far, False otherwise. - */ - bool is_finest ( void ) const; - - - /// Scale and project the ith component of a vector on the mesh - /** - \param i The vector component number -- \b IN. - \param l The vector component value -- \b IN. - \return The ith component of a vector after mesh scaling and projection - */ - NOMAD::Double scale_and_project(int i, const NOMAD::Double & l) const ; - - - /// Check the stopping conditions on the minimal poll and mesh sizes. - /** - \param stop Stop flag -- \b IN/OUT. - \param stop_reason Stop reason -- \b OUT. - */ - void check_min_mesh_sizes ( bool & stop , - NOMAD::stop_type & stop_reason ) const; - - /// Access to the mesh indices per coordinate. - /** - \return A point with the mesh index for each coordinate. - */ - const NOMAD::Point get_mesh_indices ( void ) const { return _r; } - - /// Access to the min mesh indices reached so far. - /** - \return A point with the mesh index for each coordinate. - */ - const NOMAD::Point get_min_mesh_indices ( void ) const { return _r_min; } - - - /// Access to the max mesh indices reached so far. - /** - \return A point with the mesh index for each coordinate. - */ - const NOMAD::Point get_max_mesh_indices ( void ) const { return _r_max; } - - - /// Manually set the mesh index. - /** - \param r The mesh index provided as a point -- \b IN. - */ - void set_mesh_indices ( const NOMAD::Point & r ); - + /// Access to the mesh size parameter delta^k for earch coordinate. + /** + - It is a NOMAD::Point of size \c nc the number of free variables. + \param delta The mesh size parameter delta^k -- \b OUT. + \return A boolean equal to \c true if all values are + strictly inferior than the associated minimal + mesh size delta_min (stopping criterion MIN_MESH_SIZE). + */ + bool get_delta ( NOMAD::Point & delta ) const ; - /// Manually set the limit mesh index (termination criterion). - /** - \param l The limit mesh index for all coordinates -- \b IN. - */ - void set_limit_mesh_index ( int l ); - - - /// Access to the mesh ratios after a success - /** - \return A point with the ratio for each coordinate - */ - NOMAD::Point get_mesh_ratio_if_success ( void ) const; - - - - }; - - /// Display a NOMAD::XMesh object. - /** + /// Access to the largest mesh size for earch coordinate. + /** + \return delta_max + */ + NOMAD::Point get_delta_max ( void ) const { return _delta_0;} + + + /// Access to the poll size Delta^k for each coordinate. + /** + - It is a NOMAD::Point of size \c nc the number of free variables. + \param Delta The poll size parameter Delta^k -- \b OUT. + \return A boolean equal to \c true if all values are + strictly inferior than the associated minimal + poll size Delta_min + (stopping criterion MIN_POLL_SIZE). + */ + bool get_Delta ( NOMAD::Point & Delta) const ; + + + /// Update the provided mesh indices (the Mesh is unchanged). + /** + \param success Type of success of the iteration -- \b IN. + \param mesh_indices The mesh indices before and after the update -- \b IN/OUT. + \param dir The direction that is considered (opt) -- \b IN. + */ + void update ( NOMAD::success_type success , NOMAD::Point & mesh_indices, const NOMAD::Direction *dir=NULL ) const ; + + + /// Update the XMesh (poll and mesh sizes). + /** + \param success Type of success of the iteration -- \b IN. + \param dir Direction of the iteration -- \b IN. + */ + void update ( NOMAD::success_type success, const NOMAD::Direction * dir=NULL); + + /// Reset the mesh to its original size (mesh indices). + void reset ( void ) { init() ;} + + + /// Display. + /** + \param out The NOMAD::Display object -- \b IN. + */ + void display ( const NOMAD::Display & out ) const; + + /// Test if r < r_min so far for all coordinates. + /** + \return True if mesh is the finest so far, False otherwise. + */ + bool is_finest ( void ) const; + + + /// Scale and project the ith component of a vector on the mesh + /** + \param i The vector component number -- \b IN. + \param l The vector component value -- \b IN. + \param round_up A flag to round or not -- \b IN. + \return The ith component of a vector after mesh scaling and projection + */ + NOMAD::Double scale_and_project(int i, const NOMAD::Double & l , bool round_up ) const ; + + + /// Check the stopping conditions on the minimal poll and mesh sizes. + /** + \param stop Stop flag -- \b IN/OUT. + \param stop_reason Stop reason -- \b OUT. + */ + void check_min_mesh_sizes ( bool & stop , + NOMAD::stop_type & stop_reason ) const; + + /// Access to the mesh indices per coordinate. + /** + \return A point with the mesh index for each coordinate. + */ + const NOMAD::Point get_mesh_indices ( void ) const { return _r; } + + /// Access to the min mesh indices reached so far. + /** + \return A point with the mesh index for each coordinate. + */ + const NOMAD::Point get_min_mesh_indices ( void ) const { return _r_min; } + + + /// Access to the max mesh indices reached so far. + /** + \return A point with the mesh index for each coordinate. + */ + const NOMAD::Point get_max_mesh_indices ( void ) const { return _r_max; } + + + /// Manually set the mesh index. + /** + \param r The mesh index provided as a point -- \b IN. + */ + void set_mesh_indices ( const NOMAD::Point & r ); + + + + /// Manually set the limit mesh index (termination criterion). + /** + \param l The limit mesh index for all coordinates -- \b IN. + */ + void set_limit_mesh_index ( int l ); + + + + /// Access to the mesh ratios after a success + /** + \return A point with the ratio for each coordinate + */ + NOMAD::Point get_mesh_ratio_if_success ( void ) const; + + + + }; + + /// Display a NOMAD::XMesh object. + /** \param out The NOMAD::Display object -- \b IN. \param m The NOMAD::XMesh object to be displayed -- \b IN. \return The NOMAD::Display object. - */ - inline const NOMAD::Display & operator << ( const NOMAD::Display & out , - const NOMAD::XMesh & m ) - { - m.display ( out ); - return out; - } - + */ + inline const NOMAD::Display & operator << ( const NOMAD::Display & out , + const NOMAD::XMesh & m ) + { + m.display ( out ); + return out; + } + } #endif diff --git a/src/defines.hpp b/src/defines.hpp index 511f75e..d1078f3 100644 --- a/src/defines.hpp +++ b/src/defines.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -53,7 +60,7 @@ // #define R_VERSION // defined for the R version only // Matlab version OPTI style (if not defined than GERAD style) -// #define OPTI_VERSION +// #define OPTI_VERSION // Define in order to display debug information //#define DEBUG @@ -61,27 +68,20 @@ // define in order to display memory debug information: //#define MEMORY_DEBUG -// define in order to display TGP information. -// #define TGP_DEBUG - -// #define USE_TGP is defined in the makefile #ifdef DEBUG #ifndef MEMORY_DEBUG #define MEMORY_DEBUG -#ifndef TGP_DEBUG -#define TGP_DEBUG -#endif #endif #endif -// CASE Linux using gnu compiler +// CASE Linux using gnu compiler #ifdef __gnu_linux__ #define GCC_X #endif -// CASE OSX using gnu compiler +// CASE OSX using gnu compiler #ifdef __APPLE__ #ifdef __GNUC__ #define GCC_X @@ -102,10 +102,10 @@ #pragma warning(disable:4996) #endif -// For NOMAD random number generator +// For NOMAD random number generator #if !defined(UINT32_MAX) typedef unsigned int uint32_t; -#define UINT32_MAX 0xffffffff +#define UINT32_MAX 0xffffffff #endif // to display model stats for each evaluation at @@ -125,24 +125,16 @@ typedef unsigned int uint32_t; namespace NOMAD { /// Current version: - const std::string BASE_VERSION = "3.7.2"; + const std::string BASE_VERSION = "3.7.3"; #ifdef R_VERSION const std::string VERSION = BASE_VERSION + ".R"; #else #ifdef USE_MPI -#ifdef USE_TGP - const std::string VERSION = BASE_VERSION + ".TGP" + ".MPI"; -#else const std::string VERSION = BASE_VERSION + ".MPI"; -#endif -#else -#ifdef USE_TGP - const std::string VERSION = BASE_VERSION + ".TGP"; #else const std::string VERSION = BASE_VERSION; #endif -#endif #endif // Directory separator, plus LGPL and user guide files @@ -197,12 +189,11 @@ namespace NOMAD { // Old static Mesh index constants const int L_LIMITS = 50; ///< Limits for the smesh index values const int UNDEFINED_L = L_LIMITS+1; ///< Undefined value for the smesh index - + // xmesh index constants const int XL_LIMITS = -50; ///< Limits for the xmesh index values const int UNDEFINED_XL = XL_LIMITS-1; ///< Undefined value for the xmesh index - /// Default epsilon used by NOMAD::Double /** Use Parameters::set_EPSILON(), or parameter EPSILON, or NOMAD::Double::set_epsilon() to change it @@ -228,6 +219,9 @@ namespace NOMAD { const double LOG10 = 2.30258509299; const double INF = std::numeric_limits<double>::max(); ///< Infinity + const double P_INF_INT = std::numeric_limits<int>::max(); ///< plus infinity for int + const double M_INF_INT = std::numeric_limits<int>::min(); ///< minus infinity for int + const double D_INT_MAX = UINT32_MAX; ///< The UINT32_MAX constant as a \c double @@ -235,7 +229,7 @@ namespace NOMAD { const double SVD_EPS = 1e-13; ///< Epsilon for SVD const int SVD_MAX_MPN = 1500; ///< Matrix maximal size (\c m+n ) const double SVD_MAX_COND = NOMAD::INF; ///< Max. acceptable cond. number - + /// Default value for parameter POINT_DISPLAY_LIMIT /** Use Parameters::set_POINT_DISPLAY_LIMIT() or parameter POINT_DISPLAY_LIMIT or Point::set_display_limit() to change it */ @@ -246,7 +240,7 @@ namespace NOMAD { const int DISPLAY_PRECISION_BB = 15; ///< Display precision for blackboxes /// Constant for blackbox files #1. - const std::string BLACKBOX_INPUT_FILE_PREFIX = "nomad"; + const std::string BLACKBOX_INPUT_FILE_PREFIX = "nomad"; /// Constant for blackbox files #2. const std::string BLACKBOX_INPUT_FILE_EXT = "input"; @@ -261,7 +255,7 @@ namespace NOMAD { enum dd_type { NO_DISPLAY , ///< No display - MINIMAL_DISPLAY, ///< Minimal dispay + MINIMAL_DISPLAY, ///< Minimal dispay NORMAL_DISPLAY , ///< Normal display FULL_DISPLAY ///< Full display }; @@ -342,16 +336,15 @@ namespace NOMAD { enum model_type { QUADRATIC_MODEL , ///< Quadratic model - TGP_MODEL , ///< TGP model NO_MODEL ///< No models }; - /// TGP mode - enum TGP_mode_type + enum intensification_type { - TGP_FAST , ///< TGP fast mode. - TGP_PRECISE , ///< TGP precise mode. - TGP_USER ///< TGP user mode. + NO_INTENSIFICATION , + POLL_ONLY , ///< Poll intensification only + SEARCH_ONLY , ///< Search intensification only + POLL_AND_SEARCH }; /// Success type of an iteration @@ -389,6 +382,7 @@ namespace NOMAD { L_MIN_REACHED , ///< Min mesh index L_LIMITS_REACHED , ///< Mesh index limits XL_LIMITS_REACHED , ///< Mesh index limits + GL_LIMITS_REACHED , ///< Mesh index limits MAX_TIME_REACHED , ///< Max time MAX_BB_EVAL_REACHED , ///< Max number of blackbox evaluations MAX_SGTE_EVAL_REACHED , ///< Max number of surrogate evaluations @@ -424,8 +418,9 @@ namespace NOMAD { NO_DIRECTION , ///< No direction ORTHO_1 , ///< OrthoMADS 1 ORTHO_2 , ///< OrthoMADS 2 - ORTHO_NP1_QUAD , ///< OrthoMADS n+1 use Quad model to determine n+1-th direction + ORTHO_NP1_QUAD , ///< OrthoMADS n+1 use Quad model to determine n+1-th direction ORTHO_NP1_NEG , ///< OrthoMADS n+1 use negative sum of n first directions to determine n+1-th direction + ORTHO_NP1_UNI , ///< OrthoMADS n+1 uniform directions DYN_ADDED , ///< Dynamic addition (n+1-th direction added for ORTHO n+1) ORTHO_2N , ///< OrthoMADS 2n LT_1 , ///< LT-MADS 1 @@ -471,7 +466,7 @@ namespace NOMAD { // (keep in first position) DS_SIM_BBE , ///< Number of simulated bb evaluations DS_BBE , ///< Number of bb evaluations - DS_BLK_EVA , ///< Number of block evaluation calls + DS_BLK_EVA , ///< Number of block evaluation calls DS_SGTE , ///< Number of surrogate evaluations DS_BBO , ///< All blackbox outputs DS_EVAL , ///< Number of evaluations @@ -506,6 +501,13 @@ namespace NOMAD { UNDEFINED_STATUS ///< Undefined evaluation status }; + enum mesh_type + { + XMESH , /// Anisotropic (eXtensible) mesh + SMESH , /// Isotropic Standard mesh + NO_MESH_TYPE + }; + } #endif diff --git a/src/nomad.cpp b/src/nomad.cpp index 250c2a3..e97307c 100644 --- a/src/nomad.cpp +++ b/src/nomad.cpp @@ -1,16 +1,21 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ /* */ -/* Author: Sebastien Le Digabel */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -140,6 +145,7 @@ int main ( int argc , char ** argv ) if ( p.get_display_degree() > NOMAD::MINIMAL_DISPLAY) NOMAD::display_info ( out ); + // parameters display: if ( NOMAD::Slave::is_master() && p.get_display_degree() == NOMAD::FULL_DISPLAY ) @@ -285,18 +291,24 @@ void NOMAD::display_info ( const NOMAD::Display & out ) if ( !NOMAD::Slave::is_master() ) return; #endif - NOMAD::display_version ( out ); - out << NOMAD::open_block ( "Copyright (C) 2001-2015" ) - << "Mark A. Abramson - The Boeing Company" << std::endl + out << std::endl << "NOMAD - version " + << NOMAD::VERSION + << NOMAD::open_block(" has been created by") << "Charles Audet - Ecole Polytechnique de Montreal" << std::endl - << "Gilles Couture - Ecole Polytechnique de Montreal" << std::endl - << "John E. Dennis, Jr. - Rice University" << std::endl << "Sebastien Le Digabel - Ecole Polytechnique de Montreal" << std::endl << "Christophe Tribes - Ecole Polytechnique de Montreal" << std::endl << NOMAD::close_block() << std::endl - << "Funded in part by AFOSR and Exxon Mobil." << std::endl + << "The copyright of NOMAD - version " + << NOMAD::VERSION + << NOMAD::open_block(" is owned by") + << "Sebastien Le Digabel - Ecole Polytechnique de Montreal" << std::endl + << "Christophe Tribes - Ecole Polytechnique de Montreal" << std::endl + << NOMAD::close_block() + << std::endl << "NOMAD version 3 is a new version of Nomad v1 and v2, it has been funded by AFOSR and Exxon Mobil." << std::endl + << "Nomad v1 and v2 were created and developed by Mark A. Abramson from The Boeing Company, Charles Audet and Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from Rice University, and were funded by AFOSR and Exxon Mobil." << std::endl << std::endl + << "Download : www.gerad.ca/nomad" << std::endl << "License : \'" << NOMAD::LGPL_FILE << "\'" << std::endl << "User guide: \'" << NOMAD::USER_GUIDE_FILE << "\'" << std::endl << "Examples : \'" << NOMAD::EXAMPLES_DIR << "\'" << std::endl @@ -304,8 +316,16 @@ void NOMAD::display_info ( const NOMAD::Display & out ) << std::endl << "Please report bugs to nomad@gerad.ca" << std::endl; + out << endl << "Seed: "<< NOMAD::RNG::get_seed()<<endl; } + + + + + + + /*------------------------------------------*/ /* display NOMAD usage */ /*------------------------------------------*/ @@ -321,7 +341,7 @@ void NOMAD::display_usage ( char* exeName, const NOMAD::Display & out ) << "Developer help : " << exeName << " -d keyword(s) (or 'all')" << std::endl << "Version : " << exeName << " -v" << std::endl << "Usage : " << exeName << " -u" << std::endl - << std::endl; + << std::endl; #else out << std::endl << "Run NOMAD : " << exeName << " parameters_file" << std::endl @@ -330,6 +350,6 @@ void NOMAD::display_usage ( char* exeName, const NOMAD::Display & out ) << "Developer help : " << exeName << " -d keyword(s) (or 'all')" << std::endl << "Version : " << exeName << " -v" << std::endl << "Usage : " << exeName << " -u" << std::endl - << std::endl; + << std::endl; #endif } diff --git a/src/nomad.hpp b/src/nomad.hpp index 5801177..6b6f968 100644 --- a/src/nomad.hpp +++ b/src/nomad.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -65,7 +72,7 @@ namespace NOMAD { \param out A NOMAD::Display object -- \b IN. */ void display_usage ( char* exeName, const NOMAD::Display & out ); - void display_usage ( const NOMAD::Display & out ); + void display_usage ( const NOMAD::Display & out ); #ifdef MEMORY_DEBUG /// Display NOMAD most important structures in memory. diff --git a/src/utils.cpp b/src/utils.cpp index 199400f..1392dfe 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file utils.cpp - \brief Utility functions - \author Sebastien Le Digabel - \date 2010-03-23 - \see utils.hpp -*/ + \file utils.cpp + \brief Utility functions + \author Sebastien Le Digabel + \date 2010-03-23 + \see utils.hpp + */ #include "utils.hpp" /*---------------------------------------------------------------*/ @@ -47,24 +54,27 @@ /*---------------------------------------------------------------*/ void NOMAD::construct_primes ( int n , int * primes ) { - bool is_prime; - double kk; - int i = 0 , k = 2 , j; - while ( true ) { - is_prime = true; - kk = sqrt ( static_cast<double>(k) ); - for ( j = 2 ; j <= kk ; ++j ) - if ( k%j==0 ) { - is_prime = false; - break; - } - if ( is_prime ) { - primes[i++] = k; - if ( i==n ) - break; + bool is_prime; + double kk; + int i = 0 , k = 2 , j; + while ( true ) + { + is_prime = true; + kk = sqrt ( static_cast<double>(k) ); + for ( j = 2 ; j <= kk ; ++j ) + if ( k%j==0 ) + { + is_prime = false; + break; + } + if ( is_prime ) + { + primes[i++] = k; + if ( i==n ) + break; + } + ++k; } - ++k; - } } /*--------------------------------------------*/ @@ -72,14 +82,15 @@ void NOMAD::construct_primes ( int n , int * primes ) /*--------------------------------------------*/ void NOMAD::get_words ( const std::string & sentence , std::list<std::string> & words ) { - std::string s; - std::istringstream in ( sentence ); - while ( true ) { - in >> s; - if ( in.fail() ) - break; - words.push_back ( s ); - } + std::string s; + std::istringstream in ( sentence ); + while ( true ) + { + in >> s; + if ( in.fail() ) + break; + words.push_back ( s ); + } } /*---------------------------------------------------------------*/ @@ -88,9 +99,9 @@ void NOMAD::get_words ( const std::string & sentence , std::list<std::string> & int NOMAD::get_pid ( void ) { #ifdef _MSC_VER - return _getpid(); + return _getpid(); #else - return getpid(); + return getpid(); #endif } @@ -100,7 +111,7 @@ int NOMAD::get_pid ( void ) void NOMAD::begin ( int argc , char ** argv ) { #ifdef USE_MPI - MPI_Init ( &argc , &argv ); + MPI_Init ( &argc , &argv ); #endif } @@ -110,7 +121,7 @@ void NOMAD::begin ( int argc , char ** argv ) void NOMAD::end ( void ) { #ifdef USE_MPI - MPI_Finalize(); + MPI_Finalize(); #endif } @@ -120,10 +131,10 @@ void NOMAD::end ( void ) bool NOMAD::check_exe_file ( const std::string & file_name ) { #ifdef WINDOWS - // don't check on Windows: - return true; + // don't check on Windows: + return true; #else - return ( access ( file_name.c_str() , X_OK ) == 0 ); + return ( access ( file_name.c_str() , X_OK ) == 0 ); #endif } @@ -133,9 +144,9 @@ bool NOMAD::check_exe_file ( const std::string & file_name ) bool NOMAD::check_read_file ( const std::string & file_name ) { #ifdef _MSC_VER - return ( _access ( file_name.c_str() , 4 ) == 0 ); + return ( _access ( file_name.c_str() , 4 ) == 0 ); #else - return ( access ( file_name.c_str() , R_OK ) == 0 ); + return ( access ( file_name.c_str() , R_OK ) == 0 ); #endif } @@ -144,9 +155,9 @@ bool NOMAD::check_read_file ( const std::string & file_name ) /*-----------------------------------------------------------------*/ std::string NOMAD::itos ( int i ) { - std::ostringstream oss; - oss << i; - return oss.str(); + std::ostringstream oss; + oss << i; + return oss.str(); } /*-----------------------------------------------------------------*/ @@ -160,14 +171,48 @@ std::string NOMAD::itos ( size_t i ) } +/*-----------------------------------------------------------------*/ +/* NOMAD::deblank */ +/*-----------------------------------------------------------------*/ +void NOMAD::deblank ( std::string & s ) +{ + // 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++; + } + } +} + + + /*-----------------------------------------------------------------*/ /* NOMAD::toupper - 1/2 */ /*-----------------------------------------------------------------*/ void NOMAD::toupper ( std::string & s ) { - size_t ns = s.size(); - for ( size_t i = 0 ; i < ns ; ++i ) - s[i] = std::toupper(s[i]); + size_t ns = s.size(); + for ( size_t i = 0 ; i < ns ; ++i ) + s[i] = std::toupper(s[i]); } /*-----------------------------------------------------------------*/ @@ -175,10 +220,10 @@ void NOMAD::toupper ( std::string & s ) /*-----------------------------------------------------------------*/ void NOMAD::toupper ( std::list<std::string> & ls ) { - std::list<std::string>::iterator it; - std::list<std::string>::const_iterator end = ls.end(); - for ( it = ls.begin() ; it != end ; ++it ) - NOMAD::toupper ( *it ); + std::list<std::string>::iterator it; + std::list<std::string>::const_iterator end = ls.end(); + for ( it = ls.begin() ; it != end ; ++it ) + NOMAD::toupper ( *it ); } /*-----------------------------------------------------------------*/ @@ -186,35 +231,38 @@ void NOMAD::toupper ( std::list<std::string> & ls ) /*-----------------------------------------------------------------*/ bool NOMAD::atoi ( const std::string & s , int & i ) { - i = -1; - if ( s.empty() ) - return false; - - size_t n = s.size(); - - if ( s[0] == '-' ) { - if ( n > 1 && s[1] == '-' ) - return false; - std::string ss = s; - ss.erase(ss.begin()); - if ( NOMAD::atoi ( ss , i ) ) { - i = -i; - return true; + i = -1; + if ( s.empty() ) + return false; + + size_t n = s.size(); + + if ( s[0] == '-' ) + { + if ( n > 1 && s[1] == '-' ) + return false; + std::string ss = s; + ss.erase(ss.begin()); + if ( NOMAD::atoi ( ss , i ) ) + { + i = -i; + return true; + } + return false; } - return false; - } - - for ( size_t k = 0 ; k < n ; ++k ) - if ( !isdigit(s[k]) ) - return false; - i = std::atoi(s.c_str()); - return true; + + for ( size_t k = 0 ; k < n ; ++k ) + if ( !isdigit(s[k]) ) + return false; + i = std::atoi(s.c_str()); + return true; } -bool NOMAD::atoi ( char c , int & i ) { - std::string s = "-"; - s[0] = c; - return NOMAD::atoi(s,i); +bool NOMAD::atoi ( char c , int & i ) +{ + std::string s = "-"; + s[0] = c; + return NOMAD::atoi(s,i); } /*-------------------------------------------------------------------*/ @@ -222,11 +270,11 @@ bool NOMAD::atoi ( char c , int & i ) { /*-------------------------------------------------------------------*/ bool NOMAD::bbot_is_constraint ( NOMAD::bb_output_type bbot ) { - return ( bbot == NOMAD::EB || - bbot == NOMAD::PB || - bbot == NOMAD::PEB_P || - bbot == NOMAD::PEB_E || - bbot == NOMAD::FILTER ); + return ( bbot == NOMAD::EB || + bbot == NOMAD::PB || + bbot == NOMAD::PEB_P || + bbot == NOMAD::PEB_E || + bbot == NOMAD::FILTER ); } /*-----------------------------------------------------------------------*/ @@ -234,16 +282,16 @@ bool NOMAD::bbot_is_constraint ( NOMAD::bb_output_type bbot ) /*-----------------------------------------------------------------------*/ bool NOMAD::dir_is_mads ( NOMAD::direction_type dt ) { - return (dt == NOMAD::ORTHO_1 || - dt == NOMAD::ORTHO_2 || - dt == NOMAD::ORTHO_NP1_QUAD || - dt == NOMAD::ORTHO_NP1_NEG || - dt == NOMAD::DYN_ADDED || - dt == NOMAD::ORTHO_2N || - dt == NOMAD::LT_1 || - dt == NOMAD::LT_2 || - dt == NOMAD::LT_2N || - dt == NOMAD::LT_NP1 ); + return (dt == NOMAD::ORTHO_1 || + dt == NOMAD::ORTHO_2 || + dt == NOMAD::ORTHO_NP1_QUAD || + dt == NOMAD::ORTHO_NP1_NEG || + dt == NOMAD::DYN_ADDED || + dt == NOMAD::ORTHO_2N || + dt == NOMAD::LT_1 || + dt == NOMAD::LT_2 || + dt == NOMAD::LT_2N || + dt == NOMAD::LT_NP1 ); } /*----------------------------------------------------------------------*/ @@ -251,13 +299,13 @@ bool NOMAD::dir_is_mads ( NOMAD::direction_type dt ) /*----------------------------------------------------------------------*/ bool NOMAD::dir_is_gps ( NOMAD::direction_type dt ) { - return ( dt == NOMAD::GPS_BINARY || - dt == NOMAD::GPS_2N_STATIC || - dt == NOMAD::GPS_2N_RAND || - dt == NOMAD::GPS_NP1_STATIC_UNIFORM || - dt == NOMAD::GPS_NP1_STATIC || - dt == NOMAD::GPS_NP1_RAND_UNIFORM || - dt == NOMAD::GPS_NP1_RAND ); + return ( dt == NOMAD::GPS_BINARY || + dt == NOMAD::GPS_2N_STATIC || + dt == NOMAD::GPS_2N_RAND || + dt == NOMAD::GPS_NP1_STATIC_UNIFORM || + dt == NOMAD::GPS_NP1_STATIC || + dt == NOMAD::GPS_NP1_RAND_UNIFORM || + dt == NOMAD::GPS_NP1_RAND ); } /*--------------------------------------------------------------------------*/ @@ -265,10 +313,10 @@ bool NOMAD::dir_is_gps ( NOMAD::direction_type dt ) /*--------------------------------------------------------------------------*/ bool NOMAD::dir_is_ltmads ( NOMAD::direction_type dt ) { - return ( dt == NOMAD::LT_1 || - dt == NOMAD::LT_2 || - dt == NOMAD::LT_2N || - dt == NOMAD::LT_NP1 ); + return ( dt == NOMAD::LT_1 || + dt == NOMAD::LT_2 || + dt == NOMAD::LT_2N || + dt == NOMAD::LT_NP1 ); } /*-------------------------------------------------------------------------*/ @@ -276,13 +324,13 @@ bool NOMAD::dir_is_ltmads ( NOMAD::direction_type dt ) /*-------------------------------------------------------------------------*/ bool NOMAD::dir_is_random ( NOMAD::direction_type dt ) { - return ( dt == NOMAD::GPS_NP1_RAND || - dt == NOMAD::GPS_NP1_RAND_UNIFORM || - dt == NOMAD::GPS_2N_RAND || - dt == NOMAD::LT_1 || - dt == NOMAD::LT_2 || - dt == NOMAD::LT_2N || - dt == NOMAD::LT_NP1 ); + return ( dt == NOMAD::GPS_NP1_RAND || + dt == NOMAD::GPS_NP1_RAND_UNIFORM || + dt == NOMAD::GPS_2N_RAND || + dt == NOMAD::LT_1 || + dt == NOMAD::LT_2 || + dt == NOMAD::LT_2N || + dt == NOMAD::LT_NP1 ); } /*-----------------------------------------------------------------------------*/ @@ -290,11 +338,12 @@ bool NOMAD::dir_is_random ( NOMAD::direction_type dt ) /*-----------------------------------------------------------------------------*/ bool NOMAD::dir_is_orthomads ( NOMAD::direction_type dt ) { - return (dt == NOMAD::ORTHO_1 || - dt == NOMAD::ORTHO_2 || - dt == NOMAD::ORTHO_NP1_QUAD || - dt == NOMAD::ORTHO_NP1_NEG || - dt == NOMAD::ORTHO_2N ); + return (dt == NOMAD::ORTHO_1 || + dt == NOMAD::ORTHO_2 || + dt == NOMAD::ORTHO_NP1_QUAD || + dt == NOMAD::ORTHO_NP1_NEG || + dt == NOMAD::ORTHO_NP1_UNI || + dt == NOMAD::ORTHO_2N ); } /*---------------------------------------------------------------------*/ @@ -303,11 +352,11 @@ bool NOMAD::dir_is_orthomads ( NOMAD::direction_type dt ) /*---------------------------------------------------------------------*/ bool NOMAD::dirs_have_orthomads ( const std::set<NOMAD::direction_type> & dir_types ) { - std::set<NOMAD::direction_type>::const_iterator it , end = dir_types.end(); - for ( it = dir_types.begin() ; it != end ; ++it ) - if ( NOMAD::dir_is_orthomads (*it) ) - return true; - return false; + std::set<NOMAD::direction_type>::const_iterator it , end = dir_types.end(); + for ( it = dir_types.begin() ; it != end ; ++it ) + if ( NOMAD::dir_is_orthomads (*it) ) + return true; + return false; } /*---------------------------------------------------------------------*/ @@ -316,11 +365,11 @@ bool NOMAD::dirs_have_orthomads ( const std::set<NOMAD::direction_type> & dir_ty /*---------------------------------------------------------------------*/ bool NOMAD::dirs_have_orthomads_np1( const std::set<NOMAD::direction_type> & dir_types ) { - std::set<NOMAD::direction_type>::const_iterator it , end = dir_types.end(); - for ( it = dir_types.begin() ; it != end ; ++it ) - if ( (*it)==NOMAD::ORTHO_NP1_QUAD || (*it)==NOMAD::ORTHO_NP1_NEG) - return true; - return false; + std::set<NOMAD::direction_type>::const_iterator it , end = dir_types.end(); + for ( it = dir_types.begin() ; it != end ; ++it ) + if ( (*it)==NOMAD::ORTHO_NP1_QUAD || (*it)==NOMAD::ORTHO_NP1_NEG || (*it)==NOMAD::ORTHO_NP1_UNI ) + return true; + return false; } /*---------------------------------------------------*/ @@ -328,11 +377,11 @@ bool NOMAD::dirs_have_orthomads_np1( const std::set<NOMAD::direction_type> & dir /*---------------------------------------------------*/ bool NOMAD::string_find ( const std::string & s , const std::list<std::string> & ls ) { - std::list<std::string>::const_iterator it , end = ls.end(); - for ( it = ls.begin() ; it != end ; ++it ) - if ( NOMAD::string_find ( s , *it ) ) - return true; - return false; + std::list<std::string>::const_iterator it , end = ls.end(); + for ( it = ls.begin() ; it != end ; ++it ) + if ( NOMAD::string_find ( s , *it ) ) + return true; + return false; } /*---------------------------------------------------*/ @@ -340,7 +389,7 @@ bool NOMAD::string_find ( const std::string & s , const std::list<std::string> & /*---------------------------------------------------*/ bool NOMAD::string_find ( const std::string & s1 , const std::string & s2 ) { - return ( s1.find(s2) < s1.size() ); + return ( s1.find(s2) < s1.size() ); } /*--------------------------------------------------------------------------*/ @@ -348,11 +397,11 @@ bool NOMAD::string_find ( const std::string & s1 , const std::string & s2 ) /*--------------------------------------------------------------------------*/ bool NOMAD::string_match ( const std::string & s , const std::list<std::string> & ls ) { - std::list<std::string>::const_iterator it , end = ls.end(); - for ( it = ls.begin() ; it != end ; ++it ) - if ( s.compare(*it) == 0 ) - return true; - return false; + std::list<std::string>::const_iterator it , end = ls.end(); + for ( it = ls.begin() ; it != end ; ++it ) + if ( s.compare(*it) == 0 ) + return true; + return false; } @@ -360,186 +409,213 @@ bool NOMAD::string_match ( const std::string & s , const std::list<std::string> /* interpret a list of strings as a direction type */ /*-----------------------------------------------------------------*/ bool NOMAD::strings_to_direction_type ( const std::list<std::string> & ls , - NOMAD::direction_type & dt ) + NOMAD::direction_type & dt ) { - - dt = NOMAD::UNDEFINED_DIRECTION; - - if ( ls.empty() || ls.size() > 4 ) - return false; - - std::list<std::string>::const_iterator it = ls.begin() , end = ls.end(); - std::string s = *it; - NOMAD::toupper ( s ); - - // no direction: - if ( s == "NONE" ) { - dt = NOMAD::NO_DIRECTION; - return true; - } - - // Ortho-MADS with 1, 2, n+1 (plus QUAD or NEG), or 2n directions: - if ( s == "ORTHO" ) - { - ++it; - if ( it == end ) - { - dt = NOMAD::ORTHO_NP1_QUAD; // Default for ORTHO - return true; - } - if ( *it == "1" ) - { - dt = NOMAD::ORTHO_1; - return true; - } - if ( *it == "2" ) - { - dt = NOMAD::ORTHO_2; - return true; - } - s = *it; - NOMAD::toupper ( s ); - if ( s == "2N" ) - { - dt = NOMAD::ORTHO_2N; - return true; - } - if ( s == "N+1" ) - { - ++it; - if (it==end) - { - dt = NOMAD::ORTHO_NP1_QUAD; // Default for ORTHO N+1 - return true; - } - s = *it; - NOMAD::toupper ( s ); - if ( s=="QUAD" ) - { - dt= NOMAD::ORTHO_NP1_QUAD; - return true; - } - if ( s=="NEG" ) - { - dt=NOMAD::ORTHO_NP1_NEG; - return true; - } - - } - - return false; - } - - // LT-MADS with 1, 2 or 2n directions: - if ( s == "LT" ) { - ++it; - if ( it == end ) { - dt = NOMAD::LT_2N; - return true; - } - if ( *it == "1" ) { - dt = NOMAD::LT_1; - return true; - } - if ( *it == "2" ) { - dt = NOMAD::LT_2; - return true; - } - s = *it; - NOMAD::toupper ( s ); - if ( s == "N+1" ) { - dt = NOMAD::LT_NP1; - return true; - } - if ( s == "2N" ) { - dt = NOMAD::LT_2N; - return true; - } - return false; - } - - // GPS: - if ( s == "GPS" ) { - ++it; - if ( it == end ) { - dt = NOMAD::GPS_2N_STATIC; - return true; - } - s = *it; - NOMAD::toupper ( s ); - - // GPS for binary variables: - if ( s == "BINARY" || s == "BIN" ) { - dt = NOMAD::GPS_BINARY; - return true; - } - - // GPS, n+1 directions: - if ( s == "N+1" ) { - ++it; - if ( it == end ) { - dt = NOMAD::GPS_NP1_STATIC; - return true; - } - s = *it; - NOMAD::toupper ( s ); - - // GPS, n+1, static: - if ( s == "STATIC" ) { - ++it; - if ( it == end ) { - dt = NOMAD::GPS_NP1_STATIC; - return true; - } - s = *it; - NOMAD::toupper ( s ); - if ( s == "UNIFORM" ) { - dt = NOMAD::GPS_NP1_STATIC_UNIFORM; - return true; - } - return false; - } - - // GPS, n+1, random: - if ( s == "RAND" || s == "RANDOM" ) { - ++it; - if ( it == end ) { - dt = NOMAD::GPS_NP1_RAND; - return true; - } - s = *it; - NOMAD::toupper ( s ); - if ( s == "UNIFORM" ) { - dt = NOMAD::GPS_NP1_RAND_UNIFORM; - return true; - } - return false; - } - return false; - } - - // 2n directions: - if ( s == "2N" ) { - ++it; - if ( it == end ) { - dt = NOMAD::GPS_2N_STATIC; - return true; - } - s = *it; - NOMAD::toupper ( s ); - if ( s == "STATIC" ) { - dt = NOMAD::GPS_2N_STATIC; - return true; - } - if ( s == "RAND" || s == "RANDOM" ) { - dt = NOMAD::GPS_2N_RAND; - return true; - } - return false; - } - return false; - } - return false; + + dt = NOMAD::UNDEFINED_DIRECTION; + + if ( ls.empty() || ls.size() > 4 ) + return false; + + std::list<std::string>::const_iterator it = ls.begin() , end = ls.end(); + std::string s = *it; + NOMAD::toupper ( s ); + + // no direction: + if ( s == "NONE" ) + { + dt = NOMAD::NO_DIRECTION; + return true; + } + + // Ortho-MADS with 1, 2, n+1 (plus QUAD or NEG), or 2n directions: + if ( s == "ORTHO" ) + { + ++it; + if ( it == end ) + { + dt = NOMAD::ORTHO_NP1_QUAD; // Default for ORTHO + return true; + } + if ( *it == "1" ) + { + dt = NOMAD::ORTHO_1; + return true; + } + if ( *it == "2" ) + { + dt = NOMAD::ORTHO_2; + return true; + } + s = *it; + NOMAD::toupper ( s ); + if ( s == "2N" ) + { + dt = NOMAD::ORTHO_2N; + return true; + } + if ( s == "N+1" ) + { + ++it; + if (it==end) + { + dt = NOMAD::ORTHO_NP1_QUAD; // Default for ORTHO N+1 + return true; + } + s = *it; + NOMAD::toupper ( s ); + if ( s=="QUAD" ) + { + dt= NOMAD::ORTHO_NP1_QUAD; + return true; + } + if ( s=="NEG" ) + { + dt=NOMAD::ORTHO_NP1_NEG; + return true; + } + if ( s=="UNI" ) + { + dt=NOMAD::ORTHO_NP1_UNI; + return true; + } + + } + + return false; + } + + // LT-MADS with 1, 2 or 2n directions: + if ( s == "LT" ) + { + ++it; + if ( it == end ) + { + dt = NOMAD::LT_2N; + return true; + } + if ( *it == "1" ) + { + dt = NOMAD::LT_1; + return true; + } + if ( *it == "2" ) + { + dt = NOMAD::LT_2; + return true; + } + s = *it; + NOMAD::toupper ( s ); + if ( s == "N+1" ) + { + dt = NOMAD::LT_NP1; + return true; + } + if ( s == "2N" ) + { + dt = NOMAD::LT_2N; + return true; + } + return false; + } + + // GPS: + if ( s == "GPS" ) + { + ++it; + if ( it == end ) + { + dt = NOMAD::GPS_2N_STATIC; + return true; + } + s = *it; + NOMAD::toupper ( s ); + + // GPS for binary variables: + if ( s == "BINARY" || s == "BIN" ) + { + dt = NOMAD::GPS_BINARY; + return true; + } + + // GPS, n+1 directions: + if ( s == "N+1" ) + { + ++it; + if ( it == end ) + { + dt = NOMAD::GPS_NP1_STATIC; + return true; + } + s = *it; + NOMAD::toupper ( s ); + + // GPS, n+1, static: + if ( s == "STATIC" ) + { + ++it; + if ( it == end ) + { + dt = NOMAD::GPS_NP1_STATIC; + return true; + } + s = *it; + NOMAD::toupper ( s ); + if ( s == "UNIFORM" ) + { + dt = NOMAD::GPS_NP1_STATIC_UNIFORM; + return true; + } + return false; + } + + // GPS, n+1, random: + if ( s == "RAND" || s == "RANDOM" ) + { + ++it; + if ( it == end ) + { + dt = NOMAD::GPS_NP1_RAND; + return true; + } + s = *it; + NOMAD::toupper ( s ); + if ( s == "UNIFORM" ) + { + dt = NOMAD::GPS_NP1_RAND_UNIFORM; + return true; + } + return false; + } + return false; + } + + // 2n directions: + if ( s == "2N" ) + { + ++it; + if ( it == end ) + { + dt = NOMAD::GPS_2N_STATIC; + return true; + } + s = *it; + NOMAD::toupper ( s ); + if ( s == "STATIC" ) + { + dt = NOMAD::GPS_2N_STATIC; + return true; + } + if ( s == "RAND" || s == "RANDOM" ) + { + dt = NOMAD::GPS_2N_RAND; + return true; + } + return false; + } + return false; + } + return false; } /*---------------------------------------*/ @@ -547,172 +623,195 @@ bool NOMAD::strings_to_direction_type ( const std::list<std::string> & ls , /*---------------------------------------*/ bool NOMAD::string_to_hnorm_type ( const std::string & s , NOMAD::hnorm_type & hn ) { - std::string ss = s; - NOMAD::toupper(ss); - if ( ss == "L1" ) { - hn = NOMAD::L1; - return true; - } - if ( ss == "L2" ) { - hn = NOMAD::L2; - return true; - } - if ( ss == "LINF" ) { - hn = NOMAD::LINF; - return true; - } - return false; -} - -/*-----------------------------------------*/ -/* convert a string into a TGP_mode_type */ -/*-----------------------------------------*/ -bool NOMAD::string_to_TGP_mode_type ( const std::string & s , NOMAD::TGP_mode_type & m ) -{ - std::string ss = s; - NOMAD::toupper(ss); - if ( ss == "FAST" ) { - m = NOMAD::TGP_FAST; - return true; - } - if ( ss == "PRECISE" ) { - m = NOMAD::TGP_PRECISE; - return true; - } - if ( ss == "USER" ) { - m = NOMAD::TGP_USER; - return true; - } - return false; + std::string ss = s; + NOMAD::toupper(ss); + if ( ss == "L1" ) + { + hn = NOMAD::L1; + return true; + } + if ( ss == "L2" ) + { + hn = NOMAD::L2; + return true; + } + if ( ss == "LINF" ) + { + hn = NOMAD::LINF; + return true; + } + return false; } /*--------------------------------------------------*/ /* convert a string into a multi_formulation_type */ /*--------------------------------------------------*/ bool NOMAD::string_to_multi_formulation_type ( const std::string & s , - NOMAD::multi_formulation_type & mft ) + NOMAD::multi_formulation_type & mft ) { - std::string ss = s; - NOMAD::toupper(ss); - if ( ss == "NORMALIZED" ) { - mft = NOMAD::NORMALIZED; - return true; - } - if ( ss == "PRODUCT" ) { - mft = NOMAD::PRODUCT; - return true; - } - if ( ss == "DIST_L1" ) { - mft = NOMAD::DIST_L1; - return true; - } - if ( ss == "DIST_L2" ) { - mft = NOMAD::DIST_L2; - return true; - } - if ( ss == "DIST_LINF" ) { - mft = NOMAD::DIST_LINF; - return true; - } - return false; + std::string ss = s; + NOMAD::toupper(ss); + if ( ss == "NORMALIZED" ) + { + mft = NOMAD::NORMALIZED; + return true; + } + if ( ss == "PRODUCT" ) + { + mft = NOMAD::PRODUCT; + return true; + } + if ( ss == "DIST_L1" ) + { + mft = NOMAD::DIST_L1; + return true; + } + if ( ss == "DIST_L2" ) + { + mft = NOMAD::DIST_L2; + return true; + } + if ( ss == "DIST_LINF" ) + { + mft = NOMAD::DIST_LINF; + return true; + } + return false; } /*-------------------------------------------*/ /* convert a string into a bb_output_type */ /*-------------------------------------------*/ bool NOMAD::string_to_bb_output_type ( const std::string & s , - NOMAD::bb_output_type & bbot ) + NOMAD::bb_output_type & bbot ) { - std::string ss = s; - NOMAD::toupper(ss); - - if ( ss == "OBJ" ) { - bbot = NOMAD::OBJ; - return true; - } - if ( ss == "EB" ) { - bbot = NOMAD::EB; - return true; - } - if ( ss == "PB" || ss == "CSTR" ) { - bbot = NOMAD::PB; - return true; - } - if ( ss == "PEB" ) { - bbot = NOMAD::PEB_P; - return true; - } - if ( ss == "F" ) { - bbot = NOMAD::FILTER; - return true; - } - if ( ss == "STAT_AVG" ) { - bbot = NOMAD::STAT_AVG; - return true; - } - if ( ss == "STAT_SUM" ) { - bbot = NOMAD::STAT_SUM; - return true; - } - if ( ss == "CNT_EVAL" ) { - bbot = NOMAD::CNT_EVAL; - return true; - } - if ( ss == "NOTHING" || ss == "-" ) { - bbot = NOMAD::UNDEFINED_BBO; - return true; - } - return false; + std::string ss = s; + NOMAD::toupper(ss); + + if ( ss == "OBJ" ) + { + bbot = NOMAD::OBJ; + return true; + } + if ( ss == "EB" ) + { + bbot = NOMAD::EB; + return true; + } + if ( ss == "PB" || ss == "CSTR" ) + { + bbot = NOMAD::PB; + return true; + } + if ( ss == "PEB" ) + { + bbot = NOMAD::PEB_P; + return true; + } + if ( ss == "F" ) + { + bbot = NOMAD::FILTER; + return true; + } + if ( ss == "STAT_AVG" ) + { + bbot = NOMAD::STAT_AVG; + return true; + } + if ( ss == "STAT_SUM" ) + { + bbot = NOMAD::STAT_SUM; + return true; + } + if ( ss == "CNT_EVAL" ) + { + bbot = NOMAD::CNT_EVAL; + return true; + } + if ( ss == "NOTHING" || ss == "-" ) + { + bbot = NOMAD::UNDEFINED_BBO; + return true; + } + return false; } /*-----------------------------------------------------------------*/ /* convert a string into a bb_input_type */ /*-----------------------------------------------------------------*/ bool NOMAD::string_to_bb_input_type ( const std::string & s , - NOMAD::bb_input_type & bbit ) + NOMAD::bb_input_type & bbit ) { - std::string ss = s; - NOMAD::toupper ( ss ); - if ( ss=="R" || ss=="REAL" ) { - bbit = NOMAD::CONTINUOUS; - return true; - } - if ( ss=="C" || ss=="CAT" ) { - bbit = NOMAD::CATEGORICAL; - return true; - } - if ( ss=="B" || ss=="BIN" ) { - bbit = NOMAD::BINARY; - return true; - } - if ( ss=="I" || ss=="INT" ) { - bbit = NOMAD::INTEGER; - return true; - } - return false; + std::string ss = s; + NOMAD::toupper ( ss ); + if ( ss=="R" || ss=="REAL" ) + { + bbit = NOMAD::CONTINUOUS; + return true; + } + if ( ss=="C" || ss=="CAT" ) + { + bbit = NOMAD::CATEGORICAL; + return true; + } + if ( ss=="B" || ss=="BIN" ) + { + bbit = NOMAD::BINARY; + return true; + } + if ( ss=="I" || ss=="INT" ) + { + bbit = NOMAD::INTEGER; + return true; + } + return false; } /*-----------------------------------------------------------------*/ /* convert a string into a model_type */ /*-----------------------------------------------------------------*/ bool NOMAD::string_to_model_type ( const std::string & s , - NOMAD::model_type & mt ) + NOMAD::model_type & mt ) { - std::string ss = s; - NOMAD::toupper ( ss ); - if ( ss=="TGP" || ss=="TGP_MODEL" ) { - mt = NOMAD::TGP_MODEL; - return true; - } - if ( ss=="QUADRATIC" || ss=="QUADRATIC_MODEL" ) { - mt = NOMAD::QUADRATIC_MODEL; - return true; - } + std::string ss = s; + NOMAD::toupper ( ss ); - mt = NOMAD::NO_MODEL; - return false; + if ( ss=="QUADRATIC" || ss=="QUADRATIC_MODEL" ) + { + mt = NOMAD::QUADRATIC_MODEL; + return true; + } + + + mt = NOMAD::NO_MODEL; + return false; } +/*-----------------------------------------------------------------*/ +/* convert a string into a mesh_type */ +/*-----------------------------------------------------------------*/ +bool NOMAD::string_to_mesh_type ( const std::string & s , + NOMAD::mesh_type & mt ) +{ + std::string ss = s; + NOMAD::toupper ( ss ); + if ( ss=="XMESH" || ss=="X" ) + { + mt = NOMAD::XMESH; + return true; + } + if ( ss=="SMESH" || ss=="S" ) + { + mt = NOMAD::SMESH; + return true; + } + + mt = NOMAD::NO_MESH_TYPE; + return false; +} + + + /*----------------------------------------------------------------------*/ /* convert a string in {"YES","NO","Y","N"} to a bool */ /* value of return: -1: error */ @@ -721,131 +820,137 @@ bool NOMAD::string_to_model_type ( const std::string & s , /*----------------------------------------------------------------------*/ int NOMAD::string_to_bool ( const std::string & ss ) { - std::string s = ss; - NOMAD::toupper ( s ); - if ( s=="Y" || s=="YES" || s=="1" || s=="TRUE" ) - return 1; - if ( s=="N" || s=="NO" || s=="0" || s=="FALSE" ) - return 0; - return -1; + std::string s = ss; + NOMAD::toupper ( s ); + if ( s=="Y" || s=="YES" || s=="1" || s=="TRUE" ) + return 1; + if ( s=="N" || s=="NO" || s=="0" || s=="FALSE" ) + return 0; + return -1; } /*---------------------------------------------------*/ /* convert a string 'i-j' to the integers i and j */ /*---------------------------------------------------*/ bool NOMAD::string_to_index_range ( const std::string & s , - int & i , - int & j , - int * n , - bool check_order ) + int & i , + int & j , + int * n , + bool check_order ) { - if ( s.empty() ) - return false; - - if ( s == "*" ) { - if ( !n ) - return false; - i = 0; - j = *n-1; - return true; - } - - if ( s[0] == '-' ) { - - size_t ns = s.size(); - if ( ns > 1 && s[1] == '-' ) - return false; + if ( s.empty() ) + return false; - std::string ss = s; - ss.erase ( ss.begin() ); - - if ( NOMAD::string_to_index_range ( ss , i , j , n , false ) ) { - i = -i; - return true; + if ( s == "*" ) + { + if ( !n ) + return false; + i = 0; + j = *n-1; + return true; } - return false; - } - - std::istringstream in (s); - std::string s1; - - getline ( in , s1 , '-' ); - - if (in.fail()) - return false; - - size_t k , n1 = s1.size(); - - if ( n1 >= s.size() - 1 ) { - for ( k = 0 ; k < n1 ; ++k ) - if (!isdigit(s1[k])) - return false; - if ( !NOMAD::atoi ( s1 , i ) ) - return false; - if ( n1 == s.size() ) { - j = i; - return true; + + if ( s[0] == '-' ) + { + + size_t ns = s.size(); + if ( ns > 1 && s[1] == '-' ) + return false; + + std::string ss = s; + ss.erase ( ss.begin() ); + + if ( NOMAD::string_to_index_range ( ss , i , j , n , false ) ) + { + i = -i; + return true; + } + return false; } - if (n) { - j = *n-1; - return true; + + std::istringstream in (s); + std::string s1; + + getline ( in , s1 , '-' ); + + if (in.fail()) + return false; + + size_t k , n1 = s1.size(); + + if ( n1 >= s.size() - 1 ) + { + for ( k = 0 ; k < n1 ; ++k ) + if (!isdigit(s1[k])) + return false; + if ( !NOMAD::atoi ( s1 , i ) ) + return false; + if ( n1 == s.size() ) + { + j = i; + return true; + } + if (n) + { + j = *n-1; + return true; + } + return false; } - return false; - } - - std::string s2; - getline (in, s2); - - if (in.fail()) - return false; - - size_t n2 = s2.size(); - for ( k = 0 ; k < n2 ; ++k ) - if ( !isdigit(s2[k]) ) - return false; - - if ( !NOMAD::atoi ( s1, i ) || !NOMAD::atoi ( s2 , j ) ) - return false; - - return !check_order || i <= j; + + std::string s2; + getline (in, s2); + + if (in.fail()) + return false; + + size_t n2 = s2.size(); + for ( k = 0 ; k < n2 ; ++k ) + if ( !isdigit(s2[k]) ) + return false; + + if ( !NOMAD::atoi ( s1, i ) || !NOMAD::atoi ( s2 , j ) ) + return false; + + return !check_order || i <= j; } int NOMAD::get_rank(double ** M, - size_t m, - size_t n) + size_t m, + size_t n) { - double * W = new double [n]; - double ** V = new double *[n]; - for (size_t i = 0 ; i < n ; ++i ) - { - V[i]=new double [n]; - } - - std::string error_msg; - NOMAD::SVD_decomposition ( error_msg , M , W , V , static_cast<int>(m) , static_cast<int>(n) ); - - for (size_t i=0;i<n;++i) - delete [] V[i]; - delete [] V; - - - if (! error_msg.empty()) - { - delete [] W; - return -1; - } - - int rank=0; - for (size_t i=0;i<n;i++) - { - if (fabs(W[i])>NOMAD::SVD_EPS) - rank++; - } - - delete [] W; - return rank; - + double * W = new double [n]; + double ** V = new double *[n]; + for (size_t i = 0 ; i < n ; ++i ) + { + V[i]=new double [n]; + } + + std::string error_msg; + NOMAD::SVD_decomposition ( error_msg , M , W , V , static_cast<int>(m) , static_cast<int>(n) ); + + for (size_t i=0;i<n;++i) + delete [] V[i]; + delete [] V; + + + if (! error_msg.empty()) + { + delete [] W; + return -1; + } + + int rank=0; + for (size_t i=0;i<n;i++) + { + if (fabs(W[i])>NOMAD::SVD_EPS) + rank++; + } + + delete [] W; + return rank; + } @@ -873,293 +978,311 @@ int NOMAD::get_rank(double ** M, /* V is given, not V' */ /* */ /*--------------------------------------------------------------*/ +/* 2011-08-16 -- BUG REPORT (found by Etienne Duclos) */ +/* */ +/* the -Wall option gave a warning when nm was not initialized */ +/* */ +/* Solution: initialize nm = 0 */ +/* */ +/*--------------------------------------------------------------*/ bool NOMAD::SVD_decomposition ( std::string & error_msg , - double ** M , - double * W , - double ** V , - int m , - int n , - int max_mpn ) // default=1500 + double ** M , + double * W , + double ** V , + int m , + int n , + int max_mpn ) // default=1500 { - error_msg.clear(); - - if ( max_mpn > 0 && m+n > max_mpn ) { - error_msg = "SVD_decomposition() error: m+n > " + NOMAD::itos ( max_mpn ); - return false; - } - - double * rv1 = new double[n]; - double scale = 0.0; - double g = 0.0; - double norm = 0.0; - - int nm1 = n - 1; - - bool flag; - int i , j , k , l , its , jj , nm = 0; - double s , f , h , tmp , c , x , y , z , absf , absg , absh; - - const int NITER = 30; - - // Initialization W and V - for (i=0; i < n; ++i) - { - W[i]=0.0; - for (j=0; j < n ; ++j) - V[i][j]=0.0; - } - - // Householder reduction to bidiagonal form: - for ( i = 0 ; i < n ; ++i ) - { - l = i + 1; - rv1[i] = scale * g; - g = s = scale = 0.0; - if ( i < m ) - { - for ( k = i ; k < m ; ++k ) - scale += fabs ( M[k][i] ); - if ( scale ) { - for ( k = i ; k < m ; ++k ) - { - M[k][i] /= scale; - s += M[k][i] * M[k][i]; - } - f = M[i][i]; - g = ( f >= 0.0 ) ? -fabs(sqrt(s)) : fabs(sqrt(s)); - h = f * g - s; - M[i][i] = f - g; - for ( j = l ; j < n ; ++j ) { - for ( s = 0.0 , k = i ; k < m ; ++k ) - s += M[k][i] * M[k][j]; - f = s / h; - for ( k = i ; k < m ; ++k ) - M[k][j] += f * M[k][i]; - } - for ( k = i ; k < m ; ++k ) - M[k][i] *= scale; - } - } - W[i] = scale * g; - g = s = scale = 0.0; - if ( i < m && i != nm1 ) - { - for ( k = l ; k < n ; ++k ) - scale += fabs ( M[i][k] ); - if ( scale ) - { - for ( k = l ; k < n ; ++k ) - { - M[i][k] /= scale; - s += M[i][k] * M[i][k]; - } - f = M[i][l]; - g = ( f >= 0.0 ) ? -fabs(sqrt(s)) : fabs(sqrt(s)); - h = f * g - s; - M[i][l] = f - g; - for ( k = l ; k < n ; ++k ) - rv1[k] = M[i][k] / h; - for ( j = l ; j < m ; ++j ) { - for ( s=0.0,k=l ; k < n ; ++k ) - s += M[j][k] * M[i][k]; - for ( k=l ; k < n ; ++k ) - M[j][k] += s * rv1[k]; - } - for ( k = l ; k < n ; ++k ) - M[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 ) - { - for ( j = l ; j < n ; ++j ) - V[j][i] = ( M[i][j] / M[i][l] ) / g; - for ( j = l ; j < n ; ++j ) { - for ( s = 0.0 , k = l ; k < n ; ++k ) - s += M[i][k] * V[k][j]; - for ( k = l ; k < n ; ++k ) - V[k][j] += s * V[k][i]; - } - } - for ( j = l ; j < n ; ++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 = ( ( m < n ) ? m : n ) - 1 ; i >= 0 ; --i ) - { - l = i + 1; - g = W[i]; - for ( j = l ; j < n ; ++j ) - M[i][j] = 0.0; - if ( g ) { - g = 1.0 / g; - for ( j = l ; j < n ; ++j ) - { - for ( s = 0.0 , k = l ; k < m ; ++k ) - s += M[k][i] * M[k][j]; - f = ( s / M[i][i] ) * g; - for ( k = i ; k < m ; ++k ) - M[k][j] += f * M[k][i]; - } - for ( j = i ; j < m ; ++j ) - M[j][i] *= g; - } - else - for ( j = i ; j < m ; ++j ) - M[j][i] = 0.0; - ++M[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 < m ; ++j ) { - y = M[j][nm]; - z = M[j][ i]; - M[j][nm] = y * c + z * s; - M[j][ i] = z * c - y * s; - } - } - } - z = W[k]; - if ( l == k) { - if ( z < 0.0 ) { - W[k] = -z; - for ( j = 0 ; j < n ; 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 " + - NOMAD::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 < n ; ++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 < m ; ++jj ) - { - y = M[jj][j]; - z = M[jj][i]; - M[jj][j] = y * c + z * s; - M[jj][i] = z * c - y * s; - } - } - rv1[l] = 0.0; - rv1[k] = f; - W [k] = x; - } - } - - delete [] rv1; - return true; + error_msg.clear(); + + if ( max_mpn > 0 && m+n > max_mpn ) + { + error_msg = "SVD_decomposition() error: m+n > " + NOMAD::itos ( max_mpn ); + return false; + } + + double * rv1 = new double[n]; + double scale = 0.0; + double g = 0.0; + double norm = 0.0; + + int nm1 = n - 1; + + bool flag; + int i , j , k , l , its , jj , nm = 0; + double s , f , h , tmp , c , x , y , z , absf , absg , absh; + + const int NITER = 30; + + // Initialization W and V + for (i=0; i < n; ++i) + { + W[i]=0.0; + for (j=0; j < n ; ++j) + V[i][j]=0.0; + } + + // Householder reduction to bidiagonal form: + for ( i = 0 ; i < n ; ++i ) + { + l = i + 1; + rv1[i] = scale * g; + g = s = scale = 0.0; + if ( i < m ) + { + for ( k = i ; k < m ; ++k ) + scale += fabs ( M[k][i] ); + if ( scale ) + { + for ( k = i ; k < m ; ++k ) + { + M[k][i] /= scale; + s += M[k][i] * M[k][i]; + } + f = M[i][i]; + g = ( f >= 0.0 ) ? -fabs(sqrt(s)) : fabs(sqrt(s)); + h = f * g - s; + M[i][i] = f - g; + for ( j = l ; j < n ; ++j ) + { + for ( s = 0.0 , k = i ; k < m ; ++k ) + s += M[k][i] * M[k][j]; + f = s / h; + for ( k = i ; k < m ; ++k ) + M[k][j] += f * M[k][i]; + } + for ( k = i ; k < m ; ++k ) + M[k][i] *= scale; + } + } + W[i] = scale * g; + g = s = scale = 0.0; + if ( i < m && i != nm1 ) + { + for ( k = l ; k < n ; ++k ) + scale += fabs ( M[i][k] ); + if ( scale ) + { + for ( k = l ; k < n ; ++k ) + { + M[i][k] /= scale; + s += M[i][k] * M[i][k]; + } + f = M[i][l]; + g = ( f >= 0.0 ) ? -fabs(sqrt(s)) : fabs(sqrt(s)); + h = f * g - s; + M[i][l] = f - g; + for ( k = l ; k < n ; ++k ) + rv1[k] = M[i][k] / h; + for ( j = l ; j < m ; ++j ) + { + for ( s=0.0,k=l ; k < n ; ++k ) + s += M[j][k] * M[i][k]; + for ( k=l ; k < n ; ++k ) + M[j][k] += s * rv1[k]; + } + for ( k = l ; k < n ; ++k ) + M[i][k] *= scale; + } + } + tmp = fabs ( W[i] ) + fabs ( rv1[i] ); + norm = ( norm > tmp ) ? norm : tmp; + } + + // accumulation of right-hand transformations: + l=0; + for ( i = nm1 ; i >= 0 ; --i ) + { + if ( i < nm1 ) + { + if ( g ) + { + for ( j = l ; j < n ; ++j ) + V[j][i] = ( M[i][j] / M[i][l] ) / g; + for ( j = l ; j < n ; ++j ) + { + for ( s = 0.0 , k = l ; k < n ; ++k ) + s += M[i][k] * V[k][j]; + for ( k = l ; k < n ; ++k ) + V[k][j] += s * V[k][i]; + } + } + for ( j = l ; j < n ; ++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 = ( ( m < n ) ? m : n ) - 1 ; i >= 0 ; --i ) + { + l = i + 1; + g = W[i]; + for ( j = l ; j < n ; ++j ) + M[i][j] = 0.0; + if ( g ) + { + g = 1.0 / g; + for ( j = l ; j < n ; ++j ) + { + for ( s = 0.0 , k = l ; k < m ; ++k ) + s += M[k][i] * M[k][j]; + f = ( s / M[i][i] ) * g; + for ( k = i ; k < m ; ++k ) + M[k][j] += f * M[k][i]; + } + for ( j = i ; j < m ; ++j ) + M[j][i] *= g; + } + else + for ( j = i ; j < m ; ++j ) + M[j][i] = 0.0; + ++M[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 < m ; ++j ) + { + y = M[j][nm]; + z = M[j][ i]; + M[j][nm] = y * c + z * s; + M[j][ i] = z * c - y * s; + } + } + } + z = W[k]; + if ( l == k) + { + if ( z < 0.0 ) + { + W[k] = -z; + for ( j = 0 ; j < n ; 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 " + + NOMAD::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 < n ; ++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 < m ; ++jj ) + { + y = M[jj][j]; + z = M[jj][i]; + M[jj][j] = y * c + z * s; + M[jj][i] = z * c - y * s; + } + } + rv1[l] = 0.0; + rv1[k] = f; + W [k] = x; + } + } + + delete [] rv1; + return true; } diff --git a/src/utils.hpp b/src/utils.hpp index 0fd19d5..8496a70 100644 --- a/src/utils.hpp +++ b/src/utils.hpp @@ -1,16 +1,23 @@ /*-------------------------------------------------------------------------------------*/ -/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.2 */ +/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.7.3 */ /* */ -/* Copyright (C) 2001-2015 Mark Abramson - the Boeing Company, Seattle */ -/* Charles Audet - Ecole Polytechnique, Montreal */ -/* Gilles Couture - Ecole Polytechnique, Montreal */ -/* John Dennis - Rice University, Houston */ -/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */ -/* Christophe Tribes - Ecole Polytechnique, Montreal */ /* */ -/* funded in part by AFOSR and Exxon Mobil */ +/* NOMAD - version 3.7.3 has been created by */ +/* Charles Audet - Ecole Polytechnique de Montreal */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* The copyright of NOMAD - version 3.7.3 is owned by */ +/* Sebastien Le Digabel - Ecole Polytechnique de Montreal */ +/* Christophe Tribes - Ecole Polytechnique de Montreal */ +/* */ +/* NOMAD v3 has been funded by AFOSR and Exxon Mobil. */ +/* */ +/* NOMAD v3 is a new version of Nomad v1 and v2. Nomad v1 and v2 were created and */ +/* developed by Mark A. Abramson from The Boeing Company, Charles Audet and */ +/* Gilles Couture from Ecole Polytechnique de Montreal, and John E. Dennis Jr. from */ +/* Rice University, and were funded by AFOSR and Exxon Mobil. */ /* */ -/* Author: Sebastien Le Digabel */ /* */ /* Contact information: */ /* Ecole Polytechnique de Montreal - GERAD */ @@ -34,12 +41,12 @@ /* You can find information on the NOMAD software at www.gerad.ca/nomad */ /*-------------------------------------------------------------------------------------*/ /** - \file utils.hpp - \brief Utility functions (headers) - \author Sebastien Le Digabel - \date 2010-03-23 - \see utils.cpp -*/ + \file utils.hpp + \brief Utility functions (headers) + \author Sebastien Le Digabel + \date 2010-03-23 + \see utils.cpp + */ #ifndef __UTILS__ #define __UTILS__ @@ -66,225 +73,226 @@ namespace NOMAD { - - /// Convert a string into a NOMAD::bb_input_type. - /** + + /// Convert a string into a NOMAD::bb_input_type. + /** \param s The string -- \b IN. \param bbit The NOMAD::bb_input_type -- \b OUT. \return A boolean equal to \c true if the conversion was possible. - */ - bool string_to_bb_input_type ( const std::string & s , NOMAD::bb_input_type & bbit ); - - /// Convert a string into a NOMAD::bb_output_type. - /** + */ + bool string_to_bb_input_type ( const std::string & s , NOMAD::bb_input_type & bbit ); + + /// Convert a string into a NOMAD::bb_output_type. + /** \param s The string -- \b IN. \param bbot The NOMAD::bb_output_type -- \b OUT. \return A boolean equal to \c true if the conversion was possible. - */ - bool string_to_bb_output_type ( const std::string & s , NOMAD::bb_output_type & bbot ); - - /// Convert a string into a NOMAD::hnorm_type. - /** + */ + bool string_to_bb_output_type ( const std::string & s , NOMAD::bb_output_type & bbot ); + + /// Convert a string into a NOMAD::hnorm_type. + /** \param s The string -- \b IN. \param hn The NOMAD::hnorm_type -- \b OUT. \return A boolean equal to \c true if the conversion was possible. - */ - bool string_to_hnorm_type ( const std::string & s , NOMAD::hnorm_type & hn ); - - /// Convert a string into a NOMAD::TGP_mode_type. - /** - \param s The string -- \b IN. - \param m The NOMAD::TGP_mode_type -- \b OUT. - \return A boolean equal to \c true if the conversion was possible. - */ - bool string_to_TGP_mode_type ( const std::string & s , NOMAD::TGP_mode_type & m ); - - /// Convert a string into a multi_formulation_type. - /** + */ + bool string_to_hnorm_type ( const std::string & s , NOMAD::hnorm_type & hn ); + + /// Convert a string into a multi_formulation_type. + /** \param s The string -- \b IN. \param mft The NOMAD::multi_formulation_type -- \b OUT. \return A boolean equal to \c true if the conversion was possible. - */ - bool string_to_multi_formulation_type ( const std::string & s , - NOMAD::multi_formulation_type & mft ); - - /// Convert a string with format "i-j" into two integers i and j. - /** + */ + bool string_to_multi_formulation_type ( const std::string & s , + NOMAD::multi_formulation_type & mft ); + + /// Convert a string with format "i-j" into two integers i and j. + /** If s=="*" and if n is defined, then i=0 and j=*n-1. - + \param s The string -- \b IN. \param i The first integer \c i -- \b OUT. \param j The second integer \c j -- \b OUT. \param n Number of variables; use \c NULL if unknown - -- \b IN -- \b optional (default = \c NULL). + -- \b IN -- \b optional (default = \c NULL). \param check_order A boolean indicating if \c i and \c j are to be compared - -- \b IN -- \b optional (default = \c true). + -- \b IN -- \b optional (default = \c true). \return A boolean equal to \c true if the conversion was possible. - */ - bool string_to_index_range ( const std::string & s , - int & i , - int & j , - int * n = NULL , - bool check_order = true ); - - - /// Convert a string in {"QUADRATIC","TGP"} to a \c NOMAD::model_type. - /** + */ + bool string_to_index_range ( const std::string & s , + int & i , + int & j , + int * n = NULL , + bool check_order = true ); + + /// Convert a string in {"QUADRATIC"} to a \c NOMAD::model_type. + /** \param s The string -- \b IN. \param mt The NOMAD::model_type -- \b OUT. \return A boolean equal to \c true if the conversion was possible. - */ - bool string_to_model_type ( const std::string & s , NOMAD::model_type & mt ); + */ + bool string_to_model_type ( const std::string & s , NOMAD::model_type & mt ); + - /// Convert a string in {"YES","NO","Y","N","0","1","TRUE","FALSE"} to a boolean. - /** + /// Convert a string in {"XMESH","SMESH"} to a \c NOMAD::mesh_type. + /** + \param s The string -- \b IN. + \param mt The NOMAD::mesh_type -- \b OUT. + \return A boolean equal to \c true if the conversion was possible. + */ + bool string_to_mesh_type ( const std::string & s , NOMAD::mesh_type & mt ); + + + /// Convert a string in {"YES","NO","Y","N","0","1","TRUE","FALSE"} to a boolean. + /** \param s The string -- \b IN. \return An integer equal to \c 0 for \c false, \c 1 for \c true, - and \c -1 if the conversion failed. - */ - int string_to_bool ( const std::string & s ); - - /// Interpret a list of strings as a direction type. - /** + and \c -1 if the conversion failed. + */ + int string_to_bool ( const std::string & s ); + + /// Interpret a list of strings as a direction type. + /** \param ls The list of strings -- \b IN. \param dt The NOMAD::direction_type -- \b OUT. \return A boolean equal to \c true if the conversion was possible. - */ - bool strings_to_direction_type ( const std::list<std::string> & ls , - NOMAD::direction_type & dt ); - - /// If a NOMAD::bb_output_type variable corresponds to a constraint. - /** + */ + bool strings_to_direction_type ( const std::list<std::string> & ls , + NOMAD::direction_type & dt ); + + /// If a NOMAD::bb_output_type variable corresponds to a constraint. + /** \param bbot The NOMAD::bb_output_type -- \b IN. \return A boolean equal to \c true if \c bbot corresponds to a constraint. - */ - bool bbot_is_constraint ( NOMAD::bb_output_type bbot ); - - /// If a NOMAD::direction_type variable corresponds to a MADS direction. - /** + */ + bool bbot_is_constraint ( NOMAD::bb_output_type bbot ); + + /// If a NOMAD::direction_type variable corresponds to a MADS direction. + /** \param dt The NOMAD::direction_type -- \b IN. \return A boolean equal to \c true if \c dt corresponds to a MADS direction. - */ - bool dir_is_mads ( NOMAD::direction_type dt ); - - /// If a NOMAD::direction_type variable corresponds to a GPS direction. - /** + */ + bool dir_is_mads ( NOMAD::direction_type dt ); + + /// If a NOMAD::direction_type variable corresponds to a GPS direction. + /** \param dt The NOMAD::direction_type -- \b IN. \return A boolean equal to \c true if \c dt corresponds to a GPS direction. - */ - bool dir_is_gps ( NOMAD::direction_type dt ); - - /// If a NOMAD::direction_type variable corresponds to a LT-MADS direction. - /** + */ + bool dir_is_gps ( NOMAD::direction_type dt ); + + /// If a NOMAD::direction_type variable corresponds to a LT-MADS direction. + /** \param dt The NOMAD::direction_type -- \b IN. \return A boolean equal to \c true if \c dt corresponds to a LT-MADS direction. - */ - bool dir_is_ltmads ( NOMAD::direction_type dt ); - - /// If a NOMAD::direction_type variable corresponds to a random direction. - /** + */ + bool dir_is_ltmads ( NOMAD::direction_type dt ); + + /// If a NOMAD::direction_type variable corresponds to a random direction. + /** \param dt The NOMAD::direction_type -- \b IN. \return A boolean equal to \c true if \c dt corresponds to a random direction. - */ - bool dir_is_random ( NOMAD::direction_type dt ); - - - /// If a NOMAD::direction_type variable corresponds to a Ortho-MADS direction. - /** + */ + bool dir_is_random ( NOMAD::direction_type dt ); + + + /// If a NOMAD::direction_type variable corresponds to a Ortho-MADS direction. + /** \param dt The NOMAD::direction_type -- \b IN. \return A boolean equal to \c true if \c dt corresponds to a Ortho-MADS direction. - */ - bool dir_is_orthomads ( NOMAD::direction_type dt ); - - /// If a NOMAD::direction_type variable corresponds to a Ortho-MADS direction using XMesh. - /** + */ + bool dir_is_orthomads ( NOMAD::direction_type dt ); + + /// If a NOMAD::direction_type variable corresponds to a Ortho-MADS direction using XMesh. + /** \param dt The NOMAD::direction_type -- \b IN. \return A boolean equal to \c true if \c dt corresponds to a Ortho-MADS direction using XMesh. - */ - bool dir_is_orthomads_xmesh ( NOMAD::direction_type dt ); - - /// Check if a set of directions include Ortho-MADS direction. - /** + */ + bool dir_is_orthomads_xmesh ( NOMAD::direction_type dt ); + + /// Check if a set of directions include Ortho-MADS direction. + /** \param dir_types Set of direction types -- \b IN. \return A boolean equal to \c true if at least one direction in the set is of type Ortho-MADS. - */ - bool dirs_have_orthomads ( const std::set<NOMAD::direction_type> & dir_types ); - - /// Check if a set of directions include Ortho-MADS direction using XMesh. - /** + */ + bool dirs_have_orthomads ( const std::set<NOMAD::direction_type> & dir_types ); + + /// Check if a set of directions include Ortho-MADS direction using XMesh. + /** \param dir_types Set of direction types -- \b IN. \return A boolean equal to \c true if at least one direction in the set is of type Ortho-MADS+XMesh. - */ - bool dirs_have_orthomads_xmesh ( const std::set<NOMAD::direction_type> & dir_types ); - - - /// Check if a set of direction types include Ortho-MADS N+1 direction. - /** + */ + bool dirs_have_orthomads_xmesh ( const std::set<NOMAD::direction_type> & dir_types ); + + + /// Check if a set of direction types include Ortho-MADS N+1 direction. + /** \param dir_types Set of direction types -- \b IN. \return A boolean equal to \c true if at least one direction in the set is of type Ortho-MADS N+1. - */ - bool dirs_have_orthomads_np1 ( const std::set<NOMAD::direction_type> & dir_types ); - - - /// Construct the n first prime numbers. - /** + */ + bool dirs_have_orthomads_np1 ( const std::set<NOMAD::direction_type> & dir_types ); + + + /// Construct the n first prime numbers. + /** \param n The integer \c n-- \b IN. \param primes An integer array of size \c n for the prime numbers; - must be previously allocated -- \b OUT. - */ - void construct_primes ( int n , int * primes ); - - /// Decompose a string (sentence) into a list of strings (words). - /** + must be previously allocated -- \b OUT. + */ + void construct_primes ( int n , int * primes ); + + /// Decompose a string (sentence) into a list of strings (words). + /** \param sentence The sentence -- \b IN. \param words The words -- \b OUT. - */ - void get_words ( const std::string & sentence , std::list<std::string> & words ); - - /// Check if a file exists and is executable. - /** + */ + void get_words ( const std::string & sentence , std::list<std::string> & words ); + + /// Check if a file exists and is executable. + /** \param file_name A string corresponding to a file name -- \b IN. \return A boolean equal to \c true if the file is executable. - */ - bool check_exe_file ( const std::string & file_name ); - - /// Check if a file exists and is readable. - /** + */ + bool check_exe_file ( const std::string & file_name ); + + /// Check if a file exists and is readable. + /** \param file_name A string corresponding to a file name -- \b IN. \return A boolean equal to \c true if the file exists and is readable. - */ - bool check_read_file ( const std::string & file_name ); - - /// Get the process id (pid); useful for unique random seeds. - /** + */ + bool check_read_file ( const std::string & file_name ); + + /// Get the process id (pid); useful for unique random seeds. + /** \return An integer corresponding to the pid. - */ - int get_pid ( void ); - - /// Called at the beginning of NOMAD. - /** + */ + int get_pid ( void ); + + /// Called at the beginning of NOMAD. + /** \param argc Number of command line arguments. \param argv Command line arguments. - */ - void begin ( int argc , char ** argv ); - - /// Called at the end of NOMAD. - void end ( void ); - - - /// Transform an integer into a string. - /** + */ + void begin ( int argc , char ** argv ); + + /// Called at the end of NOMAD. + void end ( void ); + + + /// Transform an integer into a string. + /** \param i The integer -- \b IN. \return The string. - */ - std::string itos ( int i ); - + */ + std::string itos ( int i ); + /// Transform a unsigned long (size_t) into a string. /** @@ -292,63 +300,71 @@ namespace NOMAD { \return The string. */ std::string itos ( size_t i ); - - /// Put a string into upper cases. - /** + /// Remove leading, trailing and double spaces in a string. + /** \param s The string -- \b IN/OUT. - */ - void toupper ( std::string & s ); - - /// Put a list of strings into upper cases. - /** + */ + void deblank ( std::string & s ); + + + + + /// Put a string into upper cases. + /** + \param s The string -- \b IN/OUT. + */ + void toupper ( std::string & s ); + + /// Put a list of strings into upper cases. + /** \param ls The list of strings -- \b IN/OUT. - */ - void toupper ( std::list<std::string> & ls ); - - /// Convert a string into an integer. - /** + */ + void toupper ( std::list<std::string> & ls ); + + /// Convert a string into an integer. + /** \param s The string -- \b IN. \param i The integer -- \b OUT. \return A boolean equal to \c true if the conversion was possible. - */ - bool atoi ( const std::string & s , int & i ); - - /// Convert a character into an integer. - /** + */ + bool atoi ( const std::string & s , int & i ); + + /// Convert a character into an integer. + /** \param c The character -- \b IN. \param i The integer -- \b OUT. \return A boolean equal to \c true if the conversion was possible. - */ - bool atoi ( char c , int & i ); - - /// Search a list of string inside a string. - /** + */ + bool atoi ( char c , int & i ); + + /// Search a list of string inside a string. + /** \param s The string -- \b IN. \param ls The list of strings -- \b IN. \return A boolean equal to \c true if one of the string of ls is in s. - */ - bool string_find ( const std::string & s , const std::list<std::string> & ls ); - - /// Search a string into another string. - /** + */ + bool string_find ( const std::string & s , const std::list<std::string> & ls ); + + /// Search a string into another string. + /** \param s1 A string -- \b IN. \param s2 A string -- \b IN. \return A boolean equal to \c true if \c s2 is in \c s1. - */ - bool string_find ( const std::string & s1 , const std::string & s2 ); - - /// Search if a string matches an element in a list of string. - /** + */ + bool string_find ( const std::string & s1 , const std::string & s2 ); + + /// Search if a string matches an element in a list of string. + /** \param s A string -- \b IN. \param ls A list of strings -- \b IN. \return A boolean equal to \c true if \c s matches an element in \c ls. - */ - bool string_match ( const std::string & s , const std::list<std::string> & ls ); - - - /// SVD decomposition. - /** + */ + bool string_match ( const std::string & s , const std::list<std::string> & ls ); + + + /// SVD decomposition. + /** - The \c mxn \c M matrix is decomposed into \c M=U.W.V'. \param error_msg Error message when the function returns \c false -- \b OUT. \param M The input \c mxn matrix; Will be replaced by \c U -- \b IN/OUT. @@ -357,31 +373,30 @@ namespace NOMAD { \param m Number of rows in M -- \b IN. \param n Number of columns in M -- \b IN. \param max_mpn Maximum allowed value for \c m+n; ignored if \c <=0 -- \b IN - -- \b optional (default = \c 1500). + -- \b optional (default = \c 1500). \return A boolean equal to \c true if the decomposition worked. - */ - bool SVD_decomposition ( std::string & error_msg , - double ** M , - double * W , - double ** V , - int m , - int n , - int max_mpn = 1500 ); - - - // Get rank of a matrix using SVD decomposition - /** + */ + bool SVD_decomposition ( std::string & error_msg , + double ** M , + double * W , + double ** V , + int m , + int n , + int max_mpn = 1500 ); + + + // Get rank of a matrix using SVD decomposition + /** - The \c mxn \c M matrix is decomposed into \c M=U.W.V'. The rank equals the size of W - \param M The input \c mxn matrix -- \b IN. + \param M The input \c mxn matrix -- \b IN. \param m Number of rows in M -- \b IN. \param n Number of columns in M -- \b IN. \return The rank>0 if the decomposition worked else 0. - */ - int get_rank(double **M, - size_t m, - size_t n); - - + */ + int get_rank(double **M, + size_t m, + size_t n); + } #endif diff --git a/tools/COOP-MADS/makefile b/tools/COOP-MADS/makefile index 56ef9d2..0c3c6f0 100644 --- a/tools/COOP-MADS/makefile +++ b/tools/COOP-MADS/makefile @@ -1,17 +1,24 @@ -EXE = coopmads.exe -COMPILATOR = mpic++ -SUNAME = $(shell uname) -OSS=$(findstring MINGW32,$(SUNAME)) -ifneq "$(strip $(OSS))" "" -COMPILATOR = g++ +UNAME := $(shell uname) + +EXE = coopmads.exe + +COMPILATOR = mpic++ +COMPILATOR_OPTIONS = -ansi -O2 + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so + +CXXFLAGS = -DUSE_MPI +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi endif -COMPILATOR_OPTIONS = -ansi -O2 -L1 = $(NOMAD_HOME)/lib/nomad.a -LIBS = $(L1) -lm -lmpi -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -OBJS = main.o Cache_Server.o +LDLIBS = -lm -lnomad -lmpi + +INCLUDE = -I$(NOMAD_HOME)/src -I. +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c +OBJS = main.o Cache_Server.o ifndef NOMAD_HOME define ECHO_NOMAD @@ -20,20 +27,21 @@ define ECHO_NOMAD endef endif -$(EXE): $(OBJS) $(L1) +$(EXE): $(OBJS) $(ECHO_NOMAD) - $(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif main.o: main.cpp + $(ECHO_NOMAD) $(COMPILE) main.cpp Cache_Server.o: Cache_Server.cpp Cache_Server.hpp $(ECHO_NOMAD) $(COMPILE) Cache_Server.cpp - -$(L1): ; - $(ECHO_NOMAD) - + clean: @echo "cleaning obj files" @rm -f $(OBJS) @@ -44,4 +52,4 @@ del: @echo "cleaning obj files" @rm -f $(OBJS) @echo "cleaning exe file" - @rm -f $(EXE) + @rm -f $(EXE) \ No newline at end of file diff --git a/tools/COOP-MADS/problems/G2_10/runExample.log b/tools/COOP-MADS/problems/G2_10/runExample.log index 133b63d..b591c85 100644 --- a/tools/COOP-MADS/problems/G2_10/runExample.log +++ b/tools/COOP-MADS/problems/G2_10/runExample.log @@ -2,22 +2,19 @@ TIME BBE OBJ 0 1 -0.001746040966254643 -0 2 -0.08743509125381764 -0 3 -0.09502614738887308 -0 12 -0.1241414508378795 -0 13 -0.1243880456661476 -0 14 -0.1282392319163835 -0 17 -0.1473005317907833 -0 35 -0.150183285112481 -0 46 -0.1572895785336448 -0 65 -0.194312112152985 -1 99 -0.215523726538665 -2 100 -0.215523726538665 +0 2 -0.08528561640409191 +0 4 -0.1217773504383107 +0 5 -0.1279124163911427 +0 9 -0.1683898819115072 +0 15 -0.1736961324904976 +0 25 -0.1977471952080628 +0 33 -0.2013413195042891 +0 34 -0.2200888366995143 +0 39 -0.256670797710581 +1 101 -0.256670797710581 -evaluations : 100 +evaluations : 101 multiple evaluations : 0 -cache hits : 1374 -cache search points : 26 -best feasible solution: x=( 9 8 6 3 6 3.5 3 3 5 3 ) F(x)=[ -3674159.25 -25.5 -0.215523726538665 ] h=0 f=-0.215523726538665 -best infeas. sol. #1 : x=( 6 10 8.5 8.5 7.5 0 5.5 0.5 6.5 3.5 ) F(x)=[ 0.75 -18.5 -0.1232423970453351 ] h=0.75 f=-0.1232423970453351 -best infeas. sol. #2 : x=( 5.5 9 9.5 2.5 6.5 1 0 2 5.5 5 ) F(x)=[ 0.75 -28.5 -0.1303069434264795 ] h=0.75 f=-0.1303069434264795 +cache hits : 1449 +cache search points : 18 +best feasible solution: x=( 1 7 3 3 3 7 3 3 3 3 ) F(x)=[ -107162.25 -39 -0.256670797710581 ] h=0 f=-0.256670797710581 diff --git a/tools/COOP-MADS/problems/RHEOLOGY/runExample.log b/tools/COOP-MADS/problems/RHEOLOGY/runExample.log index 3342d27..5b83178 100644 --- a/tools/COOP-MADS/problems/RHEOLOGY/runExample.log +++ b/tools/COOP-MADS/problems/RHEOLOGY/runExample.log @@ -2,121 +2,122 @@ TIME BBE OBJ 0 1 409.067422156616 -0 2 407.173143113625 -0 7 326.103515990633 -0 42 325.623426986692 -0 59 295.895440816156 -0 72 293.4555631559 -0 90 279.968263515696 -0 139 275.288266367226 -0 187 275.132352128014 -0 209 275.075795191333 -0 210 274.976333696773 -0 241 274.933105934363 -0 250 274.790628310616 -0 270 274.36972472876 -0 289 274.275563955637 -0 326 274.268484588901 -0 338 274.064933108817 -1 386 274.062269914507 -1 387 274.054281384837 -1 391 274.049026282641 -1 401 273.920837770762 -1 404 273.508720307709 -1 424 273.331822600277 -1 428 273.234004939865 -1 445 272.832477208338 -1 467 272.636358518916 -1 485 272.016936191517 -1 522 271.675223302068 -1 528 271.458245294985 -1 563 271.409843575617 -1 566 271.294040864725 -1 575 271.203751307945 -1 580 270.867285707472 -1 582 270.135910598837 -1 584 268.624704712738 -1 586 264.655640417888 -1 626 264.547329099114 -1 629 264.369411744322 -1 636 259.186132611454 -1 670 259.111109366001 -1 694 258.526885252145 -1 737 258.461782617644 -1 741 258.254128487816 -2 743 257.637827815885 -2 751 257.487467885692 -2 763 256.062079426438 -2 784 255.55667512634 -2 822 255.301356122905 -2 827 255.062123107245 -2 852 254.969793840294 -2 872 254.961280633716 -2 874 254.872629390701 -2 892 254.11730737943 -2 901 252.429482703112 -2 913 247.734161777393 -2 943 246.281383367226 -2 950 244.871940734504 -2 955 243.687522298512 -2 968 240.313783391124 -2 994 225.924186834258 -2 1027 225.375287811551 -2 1030 223.59959141347 -2 1033 214.372939666438 -2 1075 212.392129645385 -2 1079 202.458511181126 -3 1118 201.385729843192 -3 1121 200.414479846749 -3 1122 197.265532908615 -3 1130 196.484237748458 -3 1143 195.363761230687 -3 1150 194.180926892312 -3 1164 186.886694594438 -3 1229 186.775564288857 -3 1235 185.543088875516 -3 1247 184.315879020582 -3 1250 183.591281538454 -3 1251 180.585581615803 -3 1252 176.910717859633 -3 1256 151.835774047001 -3 1288 151.049164181499 -3 1289 143.621877654316 -3 1298 138.52428369358 -3 1300 130.977242901418 -3 1304 100.267474292617 -3 1325 99.71006688112919 -3 1363 94.56656135601661 -3 1379 79.3308117287512 -3 1411 62.8192798819504 -4 1413 57.1236275580665 -4 1433 45.5493739549428 -4 1482 44.5241434513005 -4 1485 42.8758586335358 -4 1494 40.173767108364 -4 1520 35.9160626502317 -4 1541 35.4706065363053 -4 1625 35.3985432229957 -4 1626 34.7705213812039 -4 1648 33.7365638550162 -4 1654 33.2736870837588 -4 1721 33.1821599854517 -4 1756 33.1640101150454 -4 1759 33.1094860838809 -5 1772 33.0242678796706 -5 1817 32.9941537610489 -5 1827 32.993685905707 -5 1860 32.9805924282463 -5 1912 32.9797736631138 -5 1936 32.979572485373 -5 1941 32.9794989828924 -5 1943 32.978674947399 -5 1980 32.9781395291375 -5 1983 32.9779413611568 -5 2001 32.9779413611568 +0 5 322.714672991286 +0 11 265.453635576699 +0 59 253.700379372787 +0 86 253.508031417864 +0 118 253.201633640789 +0 135 252.358093402554 +0 160 251.197472707471 +1 182 251.197301214826 +1 190 251.07713195817 +1 207 250.997447369686 +1 234 250.863129878857 +1 239 250.348565958289 +1 259 250.085055415213 +1 263 249.552570436516 +1 265 248.815865880956 +1 301 247.44992060398 +1 331 247.112498030273 +1 334 246.811892550734 +1 370 246.500086500941 +1 387 246.419187625588 +1 391 245.966804212317 +1 401 245.796743257507 +1 425 245.525068769592 +1 475 245.218533633366 +1 486 244.90846223392 +1 493 244.849644072153 +1 546 244.676306494478 +2 565 244.582999118234 +2 586 244.575839696815 +2 594 244.378107909394 +2 595 243.796461173388 +2 598 241.642674855193 +2 619 240.954865563714 +2 620 239.095740614928 +2 630 239.042233330649 +2 663 238.392177294901 +2 687 237.14673675086 +2 698 236.447365897648 +2 720 236.114659332555 +2 739 235.691225738535 +2 761 234.102484883206 +2 764 229.340323724089 +2 767 216.522605525348 +2 771 196.963059945103 +2 787 196.847112442146 +2 788 196.509148264238 +2 859 196.472844306831 +2 860 195.917100202077 +2 877 195.52911433773 +2 894 195.32691063284 +2 909 194.6659700126 +3 954 193.250827222827 +3 956 192.675360163547 +3 960 191.754551114895 +3 963 187.293158675319 +3 965 173.11436821721 +3 992 168.278990026847 +3 996 168.241191748863 +3 997 164.093855182351 +3 1027 154.594844826658 +3 1046 146.464758975961 +3 1048 145.102201089468 +3 1062 109.906215853184 +3 1069 106.774234762506 +3 1074 95.0780580563132 +3 1108 69.93773412990249 +3 1134 67.7573780014974 +3 1157 61.2885209600909 +3 1200 60.431575681709 +3 1204 60.4294769846275 +3 1206 58.3738847038617 +3 1222 56.6121681907407 +3 1237 55.9551830235949 +3 1252 48.9988231468474 +4 1292 45.6702759695433 +4 1343 43.8079499580428 +4 1352 42.9716585947603 +4 1360 42.0929043227586 +4 1376 39.949447504498 +4 1399 39.4932283554129 +4 1402 39.2287376352352 +4 1427 38.9784559612383 +4 1450 38.2078899027391 +4 1462 36.2656269613614 +4 1464 35.580177483812 +4 1498 33.7818737227238 +4 1535 33.4939643479363 +4 1543 33.0918450456313 +4 1606 33.0590338343981 +4 1609 33.0200589300374 +4 1638 33.0156952097848 +4 1641 33.0026037040469 +5 1655 32.9969719389035 +5 1686 32.9957520259869 +5 1750 32.9878641371004 +5 1783 32.9850410001756 +5 1838 32.9838371886284 +5 1865 32.9837327800898 +5 1870 32.9825522627429 +5 1873 32.9806229180508 +5 1875 32.9758135809074 +5 1878 32.9685718485421 +5 1889 32.9678022774788 +5 1893 32.9662494690148 +5 1894 32.965099452368 +5 1896 32.9646828629751 +5 1898 32.9561254938631 +5 1953 32.9557769687585 +5 1956 32.9547315431167 +5 1957 32.953487367693 +6 1985 32.9499524280818 +6 2000 32.9469957498619 +6 2001 32.9469957498619 evaluations : 2001 multiple evaluations : 0 -cache hits : 258 -cache search points : 221 -best feasible solution: x=( 5.167878504178415 3.051154465074881 9.460783454109679 ) F(x)=[ 32.9779413611568 ] h=0 f=32.9779413611568 +cache hits : 436 +cache search points : 220 +best feasible solution: x=( 5.168634764722022 3.052322762740134 9.462490982212969 ) F(x)=[ 32.9469957498619 ] h=0 f=32.9469957498619 diff --git a/tools/COOP-MADS/readme.txt b/tools/COOP-MADS/readme.txt index 44a9a0e..f28b904 100644 --- a/tools/COOP-MADS/readme.txt +++ b/tools/COOP-MADS/readme.txt @@ -1,3 +1,5 @@ +Procedure for Unix/Linux/mac OSX + 1- Set the NOMAD_HOME environment variable 2- Compile with the command make 3- Go to one of the problem directory diff --git a/tools/PSD-MADS/makefile b/tools/PSD-MADS/makefile index ffc34f7..ab23da4 100644 --- a/tools/PSD-MADS/makefile +++ b/tools/PSD-MADS/makefile @@ -1,17 +1,25 @@ -EXE = psdmads.exe -COMPILATOR = mpic++ -SUNAME = $(shell uname) -OSS=$(findstring MINGW32,$(SUNAME)) -ifneq "$(strip $(OSS))" "" -COMPILATOR = g++ +UNAME := $(shell uname) + +EXE = psdmads.exe +COMPILATOR = mpic++ + +COMPILATOR_OPTIONS = -ansi -O2 + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi endif -COMPILATOR_OPTIONS = -ansi -O2 -L1 = $(NOMAD_HOME)/lib/nomad.a -LIBS = $(L1) -lm -lmpi -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -OBJS = main.o Cache_Server.o Master_Slaves.o + +LDLIBS = -lm -lnomad -lmpi + +INCLUDE = -I$(NOMAD_HOME)/src -I. +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c +OBJS = main.o Cache_Server.o Master_Slaves.o ifndef NOMAD_HOME define ECHO_NOMAD @@ -20,11 +28,15 @@ define ECHO_NOMAD endef endif -$(EXE): $(OBJS) $(L1) +$(EXE): $(OBJS) $(ECHO_NOMAD) - $(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) + $(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif main.o: main.cpp Master_Slaves.o + $(ECHO_NOMAD) $(COMPILE) main.cpp Master_Slaves.o: Master_Slaves.cpp Master_Slaves.hpp Cache_Server.o @@ -35,9 +47,6 @@ Cache_Server.o: Cache_Server.cpp Cache_Server.hpp $(ECHO_NOMAD) $(COMPILE) Cache_Server.cpp -$(L1): ; - $(ECHO_NOMAD) - clean: @echo "cleaning obj files" @rm -f $(OBJS) @@ -48,4 +57,4 @@ del: @echo "cleaning obj files" @rm -f $(OBJS) @echo "cleaning exe file" - @rm -f $(EXE) \ No newline at end of file + @rm -f $(EXE) diff --git a/tools/PSD-MADS/problems/G2_10/runExample.log b/tools/PSD-MADS/problems/G2_10/runExample.log index 77b68db..2065ff7 100644 --- a/tools/PSD-MADS/problems/G2_10/runExample.log +++ b/tools/PSD-MADS/problems/G2_10/runExample.log @@ -1,34 +1,44 @@ - + +mpirun -np 4 ../../psdmads.exe param.txt 20 3 > runExample.log + TIME BBE OBJ 0 1 -0.001746040966254643 0 2 -0.1020265638285207 0 6 -0.1441632798005752 -0 15 -0.1542510749518172 -0 22 -0.1577316768630335 -0 37 -0.183989373943974 -0 38 -0.2020008666180557 -0 39 -0.2129271506181529 -0 40 -0.2361644054928127 -1 75 -0.2374148796747058 -1 94 -0.2603035160235741 -1 116 -0.2684048733308141 -2 174 -0.2821001936977113 -3 212 -0.2866228068210581 -4 298 -0.2898075435824587 -4 322 -0.316703796586124 -5 350 -0.338651875099582 -6 412 -0.3480692693344858 -7 506 -0.4056438193796689 -8 550 -0.4404750660164174 -9 598 -0.4453605848005951 -11 758 -0.4502266934808508 -12 780 -0.4606308402126712 -12 794 -0.4678396551609023 -12 804 -0.4864410201396533 -13 836 -0.5028952047514585 -15 961 -0.513267791679749 -29 1001 -0.513267791679749 -evaluations: 1001 -cache hits : 14460 -best feasible solution: x=( 3.125 3.125 3.25 1.5 2.375 0.25 2.625 0.125 0.5 0.875 ) F(x)=[ -3.307846963405609 -57.25 -0.513267791679749 ] h=0 f=-0.513267791679749 +0 19 -0.1479342881281465 +0 25 -0.1841215568617915 +0 28 -0.1849197713114521 +0 38 -0.1916931712633913 +0 40 -0.2227632234775169 +0 87 -0.2412462955044069 +1 95 -0.2527350956716981 +1 114 -0.2704851250098481 +1 128 -0.2717551757304079 +1 153 -0.2878109208445224 +1 157 -0.3235573809157189 +1 168 -0.3308416194351365 +2 209 -0.3537076003988114 +2 216 -0.3785183934692382 +2 226 -0.3932656382622645 +2 235 -0.397226624873137 +2 269 -0.4026098831965045 +2 279 -0.402851775010626 +2 302 -0.4131889647727121 +3 315 -0.4304862626819641 +3 318 -0.4558590836833153 +3 336 -0.4848732170447992 +4 497 -0.4924809666931201 +4 525 -0.5119819323392423 +5 553 -0.5173948676971726 +5 618 -0.6229712809770065 +5 626 -0.6535294804372643 +6 711 -0.6729611996573323 +6 717 -0.6878450704721685 +6 722 -0.693572111946147 +7 838 -0.7163568681615147 +8 902 -0.7202155341278618 +23 1000 -0.7202155341278618 +evaluations: 1000 +cache hits : 7323 +best feasible solution: x=( 3.078125 3.109375 2.9765625 2.9296875 0.71875 0.453125 0.3359375 0.375 0.3828125 0.578125 ) F(x)=[ -0.007860294779722617 -60.0625 -0.7202155341278618 ] h=0 f=-0.7202155341278618 diff --git a/tools/PSD-MADS/readme.txt b/tools/PSD-MADS/readme.txt index 62a9c97..fc125f1 100644 --- a/tools/PSD-MADS/readme.txt +++ b/tools/PSD-MADS/readme.txt @@ -1,3 +1,5 @@ +Procedure for Unix/Linux/mac OSX + 1- Set the NOMAD_HOME environment variable 2- Compile with the command make 3- Go to one of the problem directory diff --git a/tools/PSD-MADS_library_mode/makefile b/tools/PSD-MADS_library_mode/makefile index ffc34f7..29093ff 100644 --- a/tools/PSD-MADS_library_mode/makefile +++ b/tools/PSD-MADS_library_mode/makefile @@ -1,17 +1,24 @@ -EXE = psdmads.exe -COMPILATOR = mpic++ -SUNAME = $(shell uname) -OSS=$(findstring MINGW32,$(SUNAME)) -ifneq "$(strip $(OSS))" "" -COMPILATOR = g++ +UNAME := $(shell uname) + +EXE = psdmads.exe + +COMPILATOR = mpic++ +COMPILATOR_OPTIONS = -ansi -O2 + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi endif -COMPILATOR_OPTIONS = -ansi -O2 -L1 = $(NOMAD_HOME)/lib/nomad.a -LIBS = $(L1) -lm -lmpi -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -OBJS = main.o Cache_Server.o Master_Slaves.o +LDLIBS = -lm -lnomad + +INCLUDE = -I$(NOMAD_HOME)/src -I. +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c +OBJS = main.o Cache_Server.o Master_Slaves.o ifndef NOMAD_HOME define ECHO_NOMAD @@ -20,11 +27,15 @@ define ECHO_NOMAD endef endif -$(EXE): $(OBJS) $(L1) +$(EXE): $(OBJS) $(ECHO_NOMAD) - $(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) + $(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif main.o: main.cpp Master_Slaves.o + $(ECHO_NOMAD) $(COMPILE) main.cpp Master_Slaves.o: Master_Slaves.cpp Master_Slaves.hpp Cache_Server.o @@ -34,9 +45,6 @@ Master_Slaves.o: Master_Slaves.cpp Master_Slaves.hpp Cache_Server.o Cache_Server.o: Cache_Server.cpp Cache_Server.hpp $(ECHO_NOMAD) $(COMPILE) Cache_Server.cpp - -$(L1): ; - $(ECHO_NOMAD) clean: @echo "cleaning obj files" diff --git a/tools/SENSITIVITY/cache_inspect/makefile b/tools/SENSITIVITY/cache_inspect/makefile index 70e3082..87af147 100644 --- a/tools/SENSITIVITY/cache_inspect/makefile +++ b/tools/SENSITIVITY/cache_inspect/makefile @@ -1,28 +1,35 @@ -EXE = cache_inspect -COMPILATOR = g++ -COMPILATOR_OPTIONS = -ansi -Wall -O2 -L1 = $(NOMAD_HOME)/lib/nomad.a -LIBS = $(L1) -lc -lm -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -OBJS = cache_inspect.o +UNAME := $(shell uname) + +EXE = cache_inspect.exe +COMPILATOR = g++ +COMPILATOR_OPTIONS = -ansi -Wall -O2 + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi +endif + +LDLIBS = -lm -lnomad + +INCLUDE = -I$(NOMAD_HOME)/src -I. +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c +OBJS = cache_inspect.o $(EXE): $(OBJS) - $(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) + $(ECHO_NOMAD) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif -cache_inspect.o: cache_inspect.cpp $(L1) - $(COMPILE) cache_inspect.cpp -mpi: COMPILATOR = mpic++ -mpi: EXE = cache_inspect_MPI -mpi: L1 = $(NOMAD_HOME)/lib/nomad.MPI.a -mpi: LIBS = $(L1) -lc -lm -mpi: COMPILATOR_OPTIONS += -DUSE_MPI -mpi: clean $(OBJS) - @echo " building the MPI version ..." - @echo " exe file : "$(EXE) - @$(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) - @strip $(EXE) +cache_inspect.o: cache_inspect.cpp + $(ECHO_NOMAD) + $(COMPILE) cache_inspect.cpp clean: @echo " cleaning obj files" diff --git a/tools/SENSITIVITY/detailed_analysis/makefile b/tools/SENSITIVITY/detailed_analysis/makefile index b067cc7..a9115ac 100644 --- a/tools/SENSITIVITY/detailed_analysis/makefile +++ b/tools/SENSITIVITY/detailed_analysis/makefile @@ -1,28 +1,38 @@ -EXE = detailed_analysis.exe -COMPILATOR = g++ -COMPILATOR_OPTIONS = -ansi -Wall -O2 -L1 = $(NOMAD_HOME)/lib/nomad.a -LIBS = $(L1) -lc -lm -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -OBJS = detailed_analysis.o +UNAME := $(shell uname) + +EXE = detailed_analysis.exe + +COMPILATOR = g++ +COMPILATOR_OPTIONS = -ansi -Wall -O2 + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi +endif + +LDLIBS = -lm -lnomad + +INCLUDE = -I$(NOMAD_HOME)/src -I. + +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c + +OBJS = detailed_analysis.o $(EXE): $(OBJS) - $(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) + $(ECHO_NOMAD) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif -detailed_analysis.o: detailed_analysis.cpp $(L1) - $(COMPILE) detailed_analysis.cpp -mpi: COMPILATOR = mpic++ -mpi: EXE = detailed_analysis_MPI.exe -mpi: L1 = $(NOMAD_HOME)/lib/nomad.MPI.a -mpi: LIBS = $(L1) -lc -lm -mpi: COMPILATOR_OPTIONS += -DUSE_MPI -mpi: clean $(OBJS) - @echo " building the MPI version ..." - @echo " exe file : "$(EXE) - @$(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) - @strip $(EXE) +detailed_analysis.o: detailed_analysis.cpp + $(ECHO_NOMAD) + $(COMPILE) detailed_analysis.cpp clean: @echo " cleaning obj files" diff --git a/utils/DisplayCacheFile/Readme.txt b/utils/DisplayCacheFile/Readme.txt new file mode 100644 index 0000000..ad6122c --- /dev/null +++ b/utils/DisplayCacheFile/Readme.txt @@ -0,0 +1,20 @@ +A cache file from a different run of the same problem can be reused in a later optimization or to continue an optimization. +The code can display a binary cache file whose name is provided as first argument. + +Please note that binary cache files must be from the same OS. The provided cache.bin file has been created under OSX. + +1- Using the OS (linux and OSX) command line + +- On the command line execute the make command + +- Execute ./displayCache.exe cache.bin + +2- Using Matlab environment + +- If not already done, setup the mex Matlab External Interface with the command mex -setup at the command prompt. Please refer to Matlab documentation for details. + +- Change the Current Folder to %NOMAD_HOME%/utils/DisplayCacheFile + +- Run the command build.m + +- Run the command displayM(‘cache.bin’) diff --git a/utils/DisplayCacheFile/build.m b/utils/DisplayCacheFile/build.m new file mode 100644 index 0000000..a23f282 --- /dev/null +++ b/utils/DisplayCacheFile/build.m @@ -0,0 +1,87 @@ +%% GERAD NOMAD Build for Matlab + +% This file will help you compile NOMAD for use with MATLAB. + +% To recompile you will need to get / do the following: + +% 1) Get NOMAD +% NOMAD is available from https://www.gerad.ca/nomad +% Complete the download form then download the latest version. Define the +% $NOMAD_HOME environment variable. + +% 2) Start Matlab and go into $NOMAD_HOME/examples/interfaces/Matlab_Mex +% The NOMAD MEX Interface is a simple MEX interface written to use NOMAD. + +% 3) Compile the MEX File +% The code below will build the NOMAD MEX file and set the Matlab path. + +clear nomad + +% Default library names +nameLibNomad = 'libnomad.so'; + +% Default update LDFLAGS +updateLDFLAGS= ''; + +% Current directory +cdir = cd; + +% Check and set nomad_home and create variables for path +clear nomad_home nomad_src; +nomad_home = getenv('NOMAD_HOME'); + + +if ( length(nomad_home)<1 ) +% Get a default directory for NOMAD_HOME +cd .. +cd .. +nomad_home = cd; + +if ( ~ exist(nomad_home,'dir') ) +error('The default NOMAD_HOME directory does not exist. Please provide a correct value for the NOMAD_HOME variables with the command setenv(''NOMAD_HOME'',ARG1)'); +end + +setenv('NOMAD_HOME',nomad_home); +warning('The NOMAD_HOME variable is set with its default value %s. The default can be replaced by using the command setenv(''NOMAD_HOME'',ARG1)! before runner the GERAD_NOMAD_build command.',nomad_home); +cd(cdir); +end +nomad_src=[nomad_home filesep 'src' filesep]; +nomad_lib=[nomad_home filesep 'lib' filesep]; +nomad_bin=[nomad_home filesep 'bin' filesep]; + +switch(computer) +case 'PCWIN' +libdir = ' -Lwin32\'; +nameLibNomad = 'nomad.dll'; +case 'PCWIN64' +libdir = ' -Lwin64\'; +nameLibNomad = 'nomad.dll'; +case 'GLNX86' +libdir = 'glnx86/'; +updateLDFLAGS = 'LDFLAGS=''$LDFLAGS -Wl,-rpath,''''$ORIGIN/../lib/'''' '' '; +case 'GLNXA64' +libdir = 'glnxa64/'; +updateLDFLAGS = 'LDFLAGS=''$LDFLAGS -Wl,-rpath,''''$ORIGIN/../lib/'''' '' '; +case 'MACI64' +libdir = 'maci64/'; +end + +%Get NOMAD Libraries +post = [' -I. -I' nomad_src ' -lm -lut -lnomad -L ' nomad_lib ' -output displayCacheM']; + +%Compile & Move +pre = ['mex -v -largeArrayDims ' updateLDFLAGS ' displayCacheM.cpp ' ]; + +try + eval([pre post]) + if ( strcmp(computer,'MACI64') ) + install_cmd = ['install_name_tool -change libnomad.so ' nomad_lib 'libnomad.so displayCacheM.mexmaci64' ]; + system(install_cmd); + end + clear nomad_home nomad_src cdir post pre libdir; + fprintf('Done!\n'); +catch ME + clear nomad_home nomad_src cdir post pre libdir; + error('opti:nomad','Error Compiling NOMAD!\n%s',ME.message); +end +fprintf('------------------------------------------------\n'); diff --git a/utils/DisplayCacheFile/cache1.bin b/utils/DisplayCacheFile/cache1.bin new file mode 100644 index 0000000000000000000000000000000000000000..d2bc763560c37723713a363869fd2c1189d04184 GIT binary patch literal 17715 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 D8LrLM literal 0 HcmV?d00001 diff --git a/utils/DisplayCacheFile/displayCache.cpp b/utils/DisplayCacheFile/displayCache.cpp new file mode 100644 index 0000000..ccc6010 --- /dev/null +++ b/utils/DisplayCacheFile/displayCache.cpp @@ -0,0 +1,66 @@ +/*-----------------------------------------------------*/ +/* how to use the NOMAD library with a user function */ +/*-----------------------------------------------------*/ +#include "nomad.hpp" +using namespace std; +// using namespace NOMAD; avoids putting NOMAD:: everywhere + + +/*------------------------------------------*/ +/* NOMAD main function */ +/*------------------------------------------*/ +int main ( int argc , char ** argv ) +{ + + // display: + NOMAD::Display out ( std::cout ); + out.precision ( NOMAD::DISPLAY_PRECISION_STD ); + + try + { + + // NOMAD initializations: + NOMAD::begin ( argc , argv ); + + if ( argc != 2 ) + { + out << "\n Provide a cache file name on the commande line" <<endl; + return EXIT_FAILURE; + } + + // parameters file: + std::string cache_file_name = argv[1]; + + NOMAD::Display out ( std::cout ); + out.precision ( NOMAD::DISPLAY_PRECISION_STD ); + + // parameters creation: + NOMAD::Cache cache1 ( out ); + + cache1.load(cache_file_name); + + const NOMAD::Eval_Point * cur = cache1.begin(); + int nb = cache1.size(); + int cnt = 0; + while ( cur ) + { + out << "point "; + out.display_int_w ( ++cnt , nb ); + out << "/" << nb << ": "; + cur->display_eval ( out , false ); + out << " obj=" << cur->get_f() << std::endl; + + cur = cache1.next(); + } + out.close_block(); + + + } + catch ( exception & e ) + { + cerr << "\n Cache display triggered an exception (" << e.what() << ")\n\n"; + } + + + return EXIT_SUCCESS; +} diff --git a/utils/DisplayCacheFile/displayCacheM.cpp b/utils/DisplayCacheFile/displayCacheM.cpp new file mode 100644 index 0000000..a431e77 --- /dev/null +++ b/utils/DisplayCacheFile/displayCacheM.cpp @@ -0,0 +1,89 @@ +/*-----------------------------------------------------*/ +/* Merge cache files from NOMAD */ +/*-----------------------------------------------------*/ +#include "mex.h" +#include "nomad.hpp" + +using namespace std; +// using namespace NOMAD; avoids putting NOMAD:: everywhere + + +struct printfbuf : std::streambuf { +public: + //Constructor + printfbuf() + { + setp(m_buffer, m_buffer + s_size - 2); + } +private: + enum { s_size = 1024 }; //not sure on this size + char m_buffer[s_size]; + int_type overflow(int_type c) + { + if (!traits_type::eq_int_type(c, traits_type::eof())) { + *pptr() = traits_type::to_char_type(c); + pbump(1); + } + return sync() != -1 ? traits_type::not_eof(c) : traits_type::eof(); + } + + int sync() { + *pptr() = 0; + mexPrintf(pbase()); + mexEvalString("drawnow;"); + setp(m_buffer, m_buffer + s_size - 2); + return 0; + } + }; + +// Main Entry Function +// ----------------------------------------------------------------- +void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + // display: + + + try + { + + if( nrhs != 1 || !mxIsChar(prhs[0]) ) + mexErrMsgTxt("You must supply the name of a cache file for display \n"); + + + char *cache_file_name_1 = NULL; + cache_file_name_1 = mxArrayToString(prhs[0]); + + printfbuf buf; + std::streambuf *cout_sbuf = std::cout.rdbuf(); //keep existing buffer + std::cout.rdbuf(&buf); //redirect buffer + + NOMAD::Display out ( std::cout ); + out.precision ( NOMAD::DISPLAY_PRECISION_STD ); + + // parameters creation: + NOMAD::Cache cache1 ( out ); + + cache1.load(cache_file_name_1); + + const NOMAD::Eval_Point * cur = cache1.begin(); + int nb = cache1.size(); + int cnt = 0; + while ( cur ) + { + out << "point "; + out.display_int_w ( ++cnt , nb ); + out << "/" << nb << ": "; + cur->display_eval ( out , false ); + out << std::endl; + cur = cache1.next(); + } + out.close_block(); + + + } + catch ( exception & e ) + { + cerr << "\n Cache display triggered an exception (" << e.what() << ")\n\n"; + } + +} diff --git a/utils/DisplayCacheFile/makefile b/utils/DisplayCacheFile/makefile new file mode 100644 index 0000000..195338a --- /dev/null +++ b/utils/DisplayCacheFile/makefile @@ -0,0 +1,60 @@ +UNAME := $(shell uname) + +EXE = displayCache.exe + +COMPILATOR = g++ +COMPILATOR_OPTIONS = -O2 -ansi + +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,’$(LIB_DIR)’ +CXXFLAGS += -ansi +endif + +LDLIBS = -lm -lnomad + +INCLUDE = -I$(NOMAD_HOME)/src -I. +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c + +OBJS = displayCache.o + +ifndef NOMAD_HOME +define ECHO_NOMAD + @echo Please set NOMAD_HOME environment variable! + @false +endef +endif + + +$(EXE): $(OBJS) + $(ECHO_NOMAD) + @echo " building the executable "$(EXE) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif + + +displayCache.o: displayCache.cpp + $(ECHO_NOMAD) + @$(COMPILE) displayCache.cpp + + +all: $(EXE) + +clean: ; + @echo " cleaning obj files" + @rm -f $(OBJS) + +del: ; + @echo " cleaning trash files" + @rm -f core *~ + @echo " cleaning obj files" + @rm -f $(OBJS) + @echo " cleaning exe file" + @rm -f $(EXE) + + diff --git a/utils/MergeCacheFiles/build.m b/utils/MergeCacheFiles/build.m index 5017f5c..9a1ce33 100644 --- a/utils/MergeCacheFiles/build.m +++ b/utils/MergeCacheFiles/build.m @@ -1,68 +1,83 @@ %% GERAD NOMAD Build for Matlab -% This file will help you compile NOMAD for use with MATLAB. +% This file will help you compile NOMAD for use with MATLAB. % To recompile you will need to get / do the following: % 1) Get NOMAD -% NOMAD is available from http://www.gerad.ca/NOMAD/PHP_Forms/Download.php. +% NOMAD is available from https://www.gerad.ca/nomad % Complete the download form then download the latest version. Define the % $NOMAD_HOME environment variable. -% 2) NOMAD MEX Interface +% 2) Start Matlab and go into $NOMAD_HOME/examples/interfaces/Matlab_Mex % The NOMAD MEX Interface is a simple MEX interface written to use NOMAD. % 3) Compile the MEX File -% The code below will build the NOMAD MEX file. Once you have completed all the -% above steps, simply run this file to compile NOMAD! You MUST BE in the -% base directory of OPTI! +% The code below will build the NOMAD MEX file and set the Matlab path. clear nomad +% Default library names +nameLibNomad = 'libnomad.so'; + +% Default update LDFLAGS +updateLDFLAGS= ''; + +% Current directory +cdir = cd; + +% Check and set nomad_home and create variables for path +clear nomad_home nomad_src; +nomad_home = getenv('NOMAD_HOME'); + + +if ( length(nomad_home)<1 ) +% Get a default directory for NOMAD_HOME +cd .. +cd .. +nomad_home = cd; + +if ( ~ exist(nomad_home,'dir') ) +error('The default NOMAD_HOME directory does not exist. Please provide a correct value for the NOMAD_HOME variables with the command setenv(''NOMAD_HOME'',ARG1)'); +end + +setenv('NOMAD_HOME',nomad_home); +warning('The NOMAD_HOME variable is set with its default value %s. The default can be replaced by using the command setenv(''NOMAD_HOME'',ARG1)! before runner the GERAD_NOMAD_build command.',nomad_home); +cd(cdir); +end +nomad_src=[nomad_home filesep 'src' filesep]; +nomad_lib=[nomad_home filesep 'lib' filesep]; +nomad_bin=[nomad_home filesep 'bin' filesep]; + switch(computer) case 'PCWIN' libdir = ' -Lwin32\'; -case 'PCWIN64' -libdir = ' -Lwin64\'; +nameLibNomad = 'nomad.dll'; +case 'PCWIN64' +libdir = ' -Lwin64\'; +nameLibNomad = 'nomad.dll'; case 'GLNX86' libdir = 'glnx86/'; +updateLDFLAGS = 'LDFLAGS=''$LDFLAGS -Wl,-rpath,''''$ORIGIN/../lib/'''' '' '; case 'GLNXA64' libdir = 'glnxa64/'; +updateLDFLAGS = 'LDFLAGS=''$LDFLAGS -Wl,-rpath,''''$ORIGIN/../lib/'''' '' '; case 'MACI64' libdir = 'maci64/'; end -clear nomad_home nomad_src; - - -fprintf('\n------------------------------------------------\n'); -fprintf('NOMAD CACHE MERGE BUILD \n\n'); - -nomad_home = getenv('NOMAD_HOME'); -if (length(nomad_home)<1) - error('opti:nomad','Please set NOMAD_HOME variables properly with the command setenv(''NOMAD_HOME'',ARG1)!'); -end -nomad_src=[nomad_home filesep 'src' filesep]; - - %Get NOMAD Libraries -post = [' -I. -I' nomad_src ' -lm -lut -output mergeM']; +post = [' -I. -I' nomad_src ' -lm -lut -lnomad -L ' nomad_lib ' -output mergeM']; %Compile & Move -pre = ['mex -v -largeArrayDims mergeM.cpp ' nomad_src 'Parameters.cpp ' nomad_src 'Barrier.cpp ' nomad_src 'Cache.cpp '... -nomad_src 'Cache_File_Point.cpp ' nomad_src 'Cache_Point.cpp ' nomad_src 'Cache_Search.cpp ' nomad_src 'Clock.cpp '... -nomad_src 'Direction.cpp ' nomad_src 'Directions.cpp ' nomad_src 'Display.cpp '... -nomad_src 'Double.cpp ' nomad_src 'Eval_Point.cpp ' nomad_src 'Evaluator.cpp ' nomad_src 'Evaluator_Control.cpp ' nomad_src 'Exception.cpp '... -nomad_src 'Extended_Poll.cpp ' nomad_src 'L_Curve.cpp ' nomad_src 'LH_Search.cpp ' nomad_src 'OrthogonalMesh.cpp ' nomad_src 'Mads.cpp ' nomad_src 'Model_Sorted_Point.cpp '... -nomad_src 'Model_Stats.cpp ' nomad_src 'Multi_Obj_Evaluator.cpp ' nomad_src 'Parameter_Entries.cpp '... -nomad_src 'Parameter_Entry.cpp ' nomad_src 'Pareto_Front.cpp ' nomad_src 'Pareto_Point.cpp ' nomad_src 'Phase_One_Evaluator.cpp '... -nomad_src 'Phase_One_Search.cpp ' nomad_src 'Point.cpp ' nomad_src 'Priority_Eval_Point.cpp ' nomad_src 'Quad_Model.cpp '... -nomad_src 'Quad_Model_Evaluator.cpp ' nomad_src 'Quad_Model_Search.cpp ' nomad_src 'Random_Pickup.cpp ' nomad_src 'RNG.cpp '... -nomad_src 'Signature.cpp ' nomad_src 'Slave.cpp ' nomad_src 'SMesh.cpp ' nomad_src 'Speculative_Search.cpp ' nomad_src 'Stats.cpp ' nomad_src 'utils.cpp '... -nomad_src 'Variable_Group.cpp ' nomad_src 'VNS_Search.cpp ' nomad_src 'XMesh.cpp']; +pre = ['mex -v -largeArrayDims ' updateLDFLAGS ' mergeM.cpp ' ]; try eval([pre post]) + if ( strcmp(computer,'MACI64') ) + install_cmd = ['install_name_tool -change libnomad.so ' nomad_lib 'libnomad.so mergeM.mexmaci64' ]; + system(install_cmd); + end clear nomad_home nomad_src cdir post pre libdir; fprintf('Done!\n'); catch ME diff --git a/utils/MergeCacheFiles/makefile b/utils/MergeCacheFiles/makefile index 965ba81..d86324c 100644 --- a/utils/MergeCacheFiles/makefile +++ b/utils/MergeCacheFiles/makefile @@ -1,14 +1,25 @@ -EXE = merge.exe +UNAME := $(shell uname) -COMPILATOR = g++ +EXE = merge.exe -COMPILATOR_OPTIONS = -O2 -ansi -L1 = $(NOMAD_HOME)/lib/nomad.a -LIBS = $(L1) -lm -INCLUDE = -I$(NOMAD_HOME)/src -I. -COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c -OBJS = merge.o +COMPILATOR = g++ +COMPILATOR_OPTIONS = -O2 -ansi +LIB_DIR = $(NOMAD_HOME)/lib +LIB_NOMAD = libnomad.so + +CXXFLAGS = +ifeq ($(UNAME), Linux) +CXXFLAGS += -Wl,-rpath,'$(LIB_DIR)' +CXXFLAGS += -ansi +endif + +LDLIBS = -lm -lnomad + +INCLUDE = -I$(NOMAD_HOME)/src -I. +COMPILE = $(COMPILATOR) $(COMPILATOR_OPTIONS) $(INCLUDE) -c + +OBJS = merge.o ifndef NOMAD_HOME define ECHO_NOMAD @@ -18,33 +29,34 @@ endef endif -$(EXE): $(L1) $(OBJS) +$(EXE): $(OBJS) $(ECHO_NOMAD) @echo " building the scalar version ..." @echo " exe file : "$(EXE) - @$(COMPILATOR) -o $(EXE) $(OBJS) $(LIBS) $(COMPILATOR_OPTIONS) - @strip $(EXE) + @$(COMPILATOR) -o $(EXE) $(OBJS) $(LDLIBS) $(CXXFLAGS) -L$(LIB_DIR) +ifeq ($(UNAME), Darwin) + @install_name_tool -change $(LIB_NOMAD) $(NOMAD_HOME)/lib/$(LIB_NOMAD) $(EXE) +endif + merge.o: merge.cpp $(ECHO_NOMAD) @$(COMPILE) merge.cpp -$(L1) $(L1_MPI): ; - $(ECHO_NOMAD) -all: $(EXE) $(EXE_MPI) +all: $(EXE) clean: ; @echo " cleaning obj files" - @rm -f $(OBJS) $(OBJS_MPI) + @rm -f $(OBJS) del: ; @echo " cleaning trash files" @rm -f core *~ @echo " cleaning obj files" - @rm -f $(OBJS) $(OBJS_MPI) + @rm -f $(OBJS) @echo " cleaning exe file" - @rm -f $(EXE) $(EXE_MPI) + @rm -f $(EXE) diff --git a/utils/Run_TestSuite/readme.txt b/utils/Run_TestSuite/readme.txt index b99438f..d1205a4 100644 --- a/utils/Run_TestSuite/readme.txt +++ b/utils/Run_TestSuite/readme.txt @@ -1,3 +1,5 @@ +The test script is for OSX and Linux only + 1- Set the NOMAD_HOME environment variable 2- Execute the perl script (perl ./runNomadAll_parallel.pl 4) 3- Check the execution logs if necessary \ No newline at end of file diff --git a/utils/Run_TestSuite/runNomadAll_parallel.pl b/utils/Run_TestSuite/runNomadAll_parallel.pl index f7be08f..dd90b38 100755 --- a/utils/Run_TestSuite/runNomadAll_parallel.pl +++ b/utils/Run_TestSuite/runNomadAll_parallel.pl @@ -34,7 +34,7 @@ if ( grep(/MINGW/,<aComRes>) ){ $MPIcommand="mpirun -n"; # version OSX and linux } -my $keySearch=" Error | error | error: | Exception | NOMAD::Exception | Failed | Arrêt | Stop"; +my $keySearch=" Erreur | Error | error | error: | Exception | NOMAD::Exception | Failed | Arrêt | Stop"; my $nombre_de_jobs_en_parallele:shared; if ( ! exists $ARGV[0]) { @@ -78,8 +78,8 @@ my @list = ( # ["cd $ENV{NOMAD_HOME}/examples/interfaces/CUTEr ; sleep 10 ; if [ ! -e bb ] ; then ./compile 2>&1 ; fi ; $MPIcommand 3 $ENV{NOMAD_HOME}/bin/$nomadMPI_EXE parameters.txt 2>&1 "], # ["cd $ENV{NOMAD_HOME}/examples/interfaces/DLL/single_obj ; if [ -e nomad_for_dll ] ; then rm -f nomad_for_dll ; fi ; echo ; make 2>&1; ./nomad_for_dll parameters.txt 2>&1"], # ["cd $ENV{NOMAD_HOME}/examples/interfaces/DLL/bi_obj ; if [ -e nomad_for_dll ] ; then rm -f nomad_for_dll ; fi ; echo ; make clean 2>&1 ; make 2>&1; ./nomad_for_dll parameters.txt 2>&1"], -# ["cd $ENV{NOMAD_HOME}/examples/interfaces/FORTRAN/example1 ; if [ -e test ] ; then rm -f test ; fi ; make clean 2>&1 ; make 2>&1; ./test 2>&1"], -# ["cd $ENV{NOMAD_HOME}/examples/interfaces/FORTRAN/example2 ; if [ -e test ] ; then rm -f test ; fi ; make clean 2>&1 ; make 2>&1; ./test 2>&1"], +# ["cd $ENV{NOMAD_HOME}/examples/interfaces/FORTRAN/example1 ; if [ -e test.exe ] ; then rm -f test.exe ; fi ; make clean 2>&1 ; make 2>&1; ./test.exe 2>&1"], +# ["cd $ENV{NOMAD_HOME}/examples/interfaces/FORTRAN/example2 ; if [ -e test.exe ] ; then rm -f test.exe ; fi ; make clean 2>&1 ; make 2>&1; ./test.exe 2>&1"], ["cd $ENV{NOMAD_HOME}/tools/COOP-MADS ; if [ -e coopmads.exe ] ; then rm -f *.exe *.o ; fi ; make 2>&1 ; cd problems/G2_10 ; g++ -o bb.exe bb.cpp 2>&1; $MPIcommand 3 ../../coopmads.exe param.txt 2>&1"], ["cd $ENV{NOMAD_HOME}/tools/COOP-MADS ; sleep 10 ; if [ ! -e coopmads.exe ] ; then make 2>&1 ; fi ; cd problems/RHEOLOGY ; g++ -o bb.exe bb.cpp 2>&1; $MPIcommand 3 ../../coopmads.exe param.txt 2>&1"], ["cd $ENV{NOMAD_HOME}/tools/PSD-MADS ; if [ -e psdmads.exe ] ; then rm -f *.exe *.o ; fi ; make 2>&1 ; cd problems/G2_20 ; g++ -o bb.exe bb.cpp 2>&1; $MPIcommand 6 ../../psdmads.exe param.txt 50 5 2>&1"] @@ -127,7 +127,7 @@ sub RunProblem($$$$$){ print WRITE_LOG "Path to problem: $Path[1] \n Command: $Problem[$nmax] ; Managed as process $index \n"; open(LOG,"$command |") or die "Can't run program: $!\n"; if ($? != 0) { - print "Echec d'exécution de la commande $! du process $index \n"; + print "Failed execution: command $! du process $index \n"; $$failed_ref++; $fail=0; } @@ -135,7 +135,7 @@ sub RunProblem($$$$$){ @lines = <LOG>; foreach $line (@lines){ if (my @foo = grep(/$keySearch/, $line) ) { - print "????????? Probleme a l'execution de la commande du process $index :\n -----> @foo\n"; + print "????????? Problem executing command of process $index:\n -----> @foo\n"; print WRITE_LOG " !!!!!!!!!!!!!!! @foo \n "; $$failed_ref++; $fail=0; @@ -183,13 +183,13 @@ sub CompileNOMAD($$$){ print WRITE_LOG "Path: $Path[1] \n Command: $Problem[1] ; Managed as process $index \n"; open(LOG,"$command |") or die "Can't run program: $!\n"; if ($? != 0) { - print "Echec d'exécution de la compilation de NOMAD par la commande $! process $index \n"; + print "Failed compilation of NOMAD: command $! process $index \n"; $$failed=0; } else { while (<LOG>){ if (my @foo = grep(/error/, $_) ) { - print "??????? Probleme a la compilation de NOMAD dans le process $index:\n -----> @foo\n"; + print "??????? Problem encountered when compiling NOMAD in process $index:\n -----> @foo\n"; print WRITE_LOG " -----> @foo \n "; $$failed=0; last; @@ -213,44 +213,42 @@ sub CompileNOMAD($$$){ ##################################### # nettoie les fichiers de log print "########################################################\n"; -print "On nettoie les anciens fichiers de log \n"; +print "Cleaning old log files\n"; system ("rm -f log*.txt"); # démarre la compilation de nomad my $failedCompileNOMAD=1; my $thrNOMAD = threads->create("CompileNOMAD",($NOMADcompilations[0],1,\$failedCompileNOMAD)); ### Version parallele -#CompileNOMAD($NOMADcompilations[0],1,\$failedCompileNOMAD); ### Version scalaire print "########################################################\n"; -print "La compilation de NOMAD (non mpi) vient de commencer \n"; +print "NOMAD compilation (not mpi) started \n"; # démarre la compilation de nomad_mpi my $failedCompileNOMAD_MPI=1; my $thrNOMAD_MPI = threads->create("CompileNOMAD",($NOMADcompilations[1],2,\$failedCompileNOMAD_MPI)); ### Version parallele -#CompileNOMAD($NOMADcompilations[1],2,\$failedCompileNOMAD_MPI); ### Version scalaire -print "La compilation de NOMAD (mpi) vient de commencer \n"; +print "NOMAD compilation (mpi) started\n"; $thrNOMAD->join(); $thrNOMAD_MPI->join(); if ($failedCompileNOMAD==0){ - print "La compilation de NOMAD (non mpi) a echoue. On s'arrete la! \n"; + print "NOMAD compilation (not mpi) failed. Stopping here! \n"; } if ($failedCompileNOMAD_MPI==0){ - print "La compilation de NOMAD (mpi) a echoue. On s'arrete la! \n"; + print "NOMAD compilation (mpi) failed. Stoppinf here! \n"; } if ($failedCompileNOMAD==0 or $failedCompileNOMAD_MPI==0){ exit 0; } -print "Les compilations de nomad ont réussi \n"; +print "NOMAD compilation(s) success\n"; print "########################################################\n\n"; print "########################################################\n"; -print "Démarrage des executions en parallele pour les problemes \n"; +print "Starting parallel executions of problems \n"; print "########################################################\n"; @@ -265,7 +263,7 @@ while ($started < scalar @list ){ $semaphoreProblems->down(); # si le sémaphore est a 0, le processus principal va se bloquer en attendant une nouvelle place - print "Creation du job $started\n"; + print "Creating job $started\n"; my $thr = threads->create("RunProblem", ( $aRefToAListOfCommands, $started, @@ -281,24 +279,36 @@ while ($started < scalar @list ){ # $thr->join(); } +print "########################################################\n"; + # attend les derniers jobs +my $cpt_Prev = $cpt; +print "\n $cpt jobs completed for $started jobs started, patience!\n"; +# Disable buffering +$| = 1; while ($cpt < $started){ - print "Seul $cpt jobs finis sur $started, on patiente!\n"; + print "."; + if ( $cpt > $cpt_Prev) { + print "\n $cpt jobs completed for $started jobs started, patience!\n"; + } + $cpt_Prev = $cpt; sleep(3); } -print "$cpt jobs lances, $failed échoués, sur les ".scalar @list." prévus\n"; +print "\n $cpt jobs started, $failed jobs failed, ".scalar @list." jobs to be done\n"; + +print "########################################################\n"; if ($failed !=0) { print "-----> Check the readme file for the failed problem(s)!!! \n"; } -print "On combine tous les logs en un seul\n"; +print "All logs are combined in a single log file\n"; my $i=0; -open (LOGALL, '>', "logAll.txt") or die("impossible d'ecrire dans le fichier logAll.txt, $!"); +open (LOGALL, '>', "logAll.txt") or die("Not able to write in logAll.txt, $!"); while ($i < scalar @list ){ # incrémente le compteur $i++; - open (LOGI, '<', "log$i.txt") or die("Impossible de lire log$i.txt, $!\n"); + open (LOGI, '<', "log$i.txt") or die("Cannot read file log$i.txt, $!\n"); print LOGALL "*********************************************************\n"; while (my $Ligne = <LOGI> ) { print LOGALL $Ligne; -- GitLab