From 7fbf097a27412b125423012f672472b4c8aea1bb Mon Sep 17 00:00:00 2001 From: andreadelprete <andre.delprete@gmail.com> Date: Tue, 3 Nov 2015 14:09:32 +0100 Subject: [PATCH] Add new LP problems in test_data folder to use them in test_LP_problem. Change range of admissible pitch-roll angles for random contact generation from 0 to twice the friction cone angle. Clean code. --- include/robust-equilibrium-lib/util.hh | 7 ++-- src/solver_LP_qpoases.cpp | 5 --- src/static_equilibrium.cpp | 2 +- test/test_LP_solvers.cpp | 30 +++++++++++++----- test/test_static_equilibrium.cpp | 19 ++++++----- ...LP_findExtremumOverLine20151103_014022.dat | Bin 0 -> 2272 bytes ...tremumOverLine20151103_014022_solution.dat | Bin 0 -> 64 bytes ...LP_findExtremumOverLine_128_generators.dat | Bin 0 -> 8416 bytes ...indExtremumOverLine_128_generators_bis.dat | Bin 0 -> 8416 bytes ...umOverLine_128_generators_bis_solution.dat | Bin 0 -> 64 bytes ...tremumOverLine_128_generators_solution.dat | Bin 0 -> 64 bytes ...DLP_findExtremumOverLine_32_generators.dat | Bin 0 -> 2272 bytes ...xtremumOverLine_32_generators_solution.dat | Bin 0 -> 64 bytes ...DLP_findExtremumOverLine_64_generators.dat | Bin 0 -> 4320 bytes ...xtremumOverLine_64_generators_solution.dat | Bin 0 -> 64 bytes ...LP_findExtremumOverLine20151103_014022.dat | Bin 0 -> 2488 bytes ...tremumOverLine20151103_014022_solution.dat | Bin 0 -> 280 bytes ...LP_findExtremumOverLine_128_generators.dat | Bin 0 -> 9400 bytes ...indExtremumOverLine_128_generators_bis.dat | Bin 0 -> 9400 bytes ...umOverLine_128_generators_bis_solution.dat | Bin 0 -> 1048 bytes ...tremumOverLine_128_generators_solution.dat | Bin 0 -> 1048 bytes .../LP_findExtremumOverLine_32_generators.dat | Bin 0 -> 2488 bytes ...xtremumOverLine_32_generators_solution.dat | Bin 0 -> 280 bytes .../LP_findExtremumOverLine_64_generators.dat | Bin 0 -> 4792 bytes ...xtremumOverLine_64_generators_solution.dat | Bin 0 -> 536 bytes 25 files changed, 38 insertions(+), 25 deletions(-) create mode 100644 test_data/DLP_findExtremumOverLine20151103_014022.dat create mode 100644 test_data/DLP_findExtremumOverLine20151103_014022_solution.dat create mode 100644 test_data/DLP_findExtremumOverLine_128_generators.dat create mode 100644 test_data/DLP_findExtremumOverLine_128_generators_bis.dat create mode 100644 test_data/DLP_findExtremumOverLine_128_generators_bis_solution.dat create mode 100644 test_data/DLP_findExtremumOverLine_128_generators_solution.dat create mode 100644 test_data/DLP_findExtremumOverLine_32_generators.dat create mode 100644 test_data/DLP_findExtremumOverLine_32_generators_solution.dat create mode 100644 test_data/DLP_findExtremumOverLine_64_generators.dat create mode 100644 test_data/DLP_findExtremumOverLine_64_generators_solution.dat create mode 100644 test_data/LP_findExtremumOverLine20151103_014022.dat create mode 100644 test_data/LP_findExtremumOverLine20151103_014022_solution.dat create mode 100644 test_data/LP_findExtremumOverLine_128_generators.dat create mode 100644 test_data/LP_findExtremumOverLine_128_generators_bis.dat create mode 100644 test_data/LP_findExtremumOverLine_128_generators_bis_solution.dat create mode 100644 test_data/LP_findExtremumOverLine_128_generators_solution.dat create mode 100644 test_data/LP_findExtremumOverLine_32_generators.dat create mode 100644 test_data/LP_findExtremumOverLine_32_generators_solution.dat create mode 100644 test_data/LP_findExtremumOverLine_64_generators.dat create mode 100644 test_data/LP_findExtremumOverLine_64_generators_solution.dat diff --git a/include/robust-equilibrium-lib/util.hh b/include/robust-equilibrium-lib/util.hh index 759fff9..e698f4e 100644 --- a/include/robust-equilibrium-lib/util.hh +++ b/include/robust-equilibrium-lib/util.hh @@ -1,3 +1,7 @@ +/* + * Copyright 2015, LAAS-CNRS + * Author: Andrea Del Prete + */ #ifndef _ROBUST_EQUILIBRIUM_LIB_UTIL_HH #define _ROBUST_EQUILIBRIUM_LIB_UTIL_HH @@ -41,8 +45,6 @@ namespace robust_equilibrium typedef Eigen::Matrix <value_type, Eigen::Dynamic, 6, Eigen::RowMajor> MatrixX6; typedef Eigen::Matrix <value_type, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> MatrixXX; - //define Eigen ref if available -#if EIGEN_VERSION_AT_LEAST(3,2,2) typedef Eigen::Ref<Vector2> Ref_vector2; typedef Eigen::Ref<Vector3> Ref_vector3; typedef Eigen::Ref<VectorX> Ref_vectorX; @@ -60,7 +62,6 @@ namespace robust_equilibrium typedef const Eigen::Ref<const Matrix43> & Cref_matrix43; typedef const Eigen::Ref<const Matrix6X> & Cref_matrix6X; typedef const Eigen::Ref<const MatrixXX> & Cref_matrixXX; -#endif /** * Write the specified matrix to a binary file with the specified name. diff --git a/src/solver_LP_qpoases.cpp b/src/solver_LP_qpoases.cpp index 0d45acc..2b9f5df 100644 --- a/src/solver_LP_qpoases.cpp +++ b/src/solver_LP_qpoases.cpp @@ -46,9 +46,6 @@ namespace robust_equilibrium m_H = MatrixXX::Zero(n,n); } -// m_status = m_solver.init(NULL, c.data(), A.data(), lb.data(), ub.data(), -// Alb.data(), Aub.data(), iters, &solutionTime); - if(!m_init_succeeded) { m_status = m_solver.init(NULL, c.data(), A.data(), lb.data(), ub.data(), @@ -69,8 +66,6 @@ namespace robust_equilibrium { m_solver.getPrimalSolution(sol.data()); } - else - SEND_DEBUG_MSG("QPoases solver failed with code "+toString(m_status)); return getStatus(); } diff --git a/src/static_equilibrium.cpp b/src/static_equilibrium.cpp index e856093..2265edb 100644 --- a/src/static_equilibrium.cpp +++ b/src/static_equilibrium.cpp @@ -305,7 +305,7 @@ bool StaticEquilibrium::findExtremumOverLine(Cref_vector2 a, Cref_vector2 a0, do { com = a0 + a*b_p(m); -#define WRITE_LPS_TO_FILE +//#define WRITE_LPS_TO_FILE #ifdef WRITE_LPS_TO_FILE string date_time = getDateAndTimeAsString(); string filename = "LP_findExtremumOverLine"+date_time+".dat"; diff --git a/test/test_LP_solvers.cpp b/test/test_LP_solvers.cpp index 27faf5d..72e35c8 100644 --- a/test/test_LP_solvers.cpp +++ b/test/test_LP_solvers.cpp @@ -373,10 +373,10 @@ void test_small_LP() int main() { - cout <<"Test LP Solvers\n\n"; + cout <<"Test LP Solvers (1 means ok, 0 means error)\n\n"; { - cout<<"TEST QP OASES ON A SMALL 2-VARIABLE LP\n"; + cout<<"TEST QP OASES ON A SMALL 2-VARIABLE LP"; /* Setup data of first LP. */ real_t A[1*2] = { 1.0, 1.0 }; real_t g[2] = { 1.5, 1.0 }; @@ -394,7 +394,11 @@ int main() /* Solve first LP. */ int nWSR = 10; - example.init( 0,g,A,lb,ub,lbA,ubA, nWSR,0 ); + int res = example.init( 0,g,A,lb,ub,lbA,ubA, nWSR,0 ); + if(res==0) + cout<<"[INFO] LP solved correctly\n"; + else + cout<<"[ERROR] QpOases could not solve the LP problem, error code: "<<res<<endl; } { @@ -436,11 +440,21 @@ int main() cout<<"\nTEST QP OASES ON SOME LP PROBLEMS\n"; string file_path = "../test_data/"; Solver_LP_abstract *solverOases = Solver_LP_abstract::getNewSolver(SOLVER_LP_QPOASES); - const int PROBLEM_NUMBER = 4; + const int PROBLEM_NUMBER = 14; string problem_filenames[PROBLEM_NUMBER] = {"DLP_findExtremumOverLine20151103_112611", "DLP_findExtremumOverLine20151103_115627", + "DLP_findExtremumOverLine20151103_014022", + "DLP_findExtremumOverLine_32_generators", + "DLP_findExtremumOverLine_64_generators", + "DLP_findExtremumOverLine_128_generators", + "DLP_findExtremumOverLine_128_generators_bis", "LP_findExtremumOverLine20151103_112610", - "LP_findExtremumOverLine20151103_112611"}; + "LP_findExtremumOverLine20151103_112611", + "LP_findExtremumOverLine20151103_014022", + "LP_findExtremumOverLine_32_generators", + "LP_findExtremumOverLine_64_generators", + "LP_findExtremumOverLine_128_generators", + "LP_findExtremumOverLine_128_generators_bis"}; VectorX c, lb, ub, Alb, Aub, realSol, sol; MatrixXX A; for(int i=0; i<PROBLEM_NUMBER; i++) @@ -461,15 +475,15 @@ int main() solverOases->solve(c, lb, ub, A, Alb, Aub, sol); if(sol.isApprox(realSol, EPS)) { - cout<<"[INFO] Solution of problem "<<problem_filename<<" is equal to the expected value!\n"; + cout<<"[INFO] Solution of problem "<<problem_filename<<" ("<<c.size()<<" var, "<<A.rows()<<" constr) is equal to the expected value!\n"; } else { if(fabs(c.dot(sol)-c.dot(realSol))<EPS) - cout<<"[WARNING] Solution of problem "<<problem_filename<<" is different from expected but it has the same cost\n"; + cout<<"[WARNING] Solution of problem "<<problem_filename<<" ("<<c.size()<<" var, "<<A.rows()<<" constr) is different from expected but it has the same cost\n"; else { - cout<<"[ERROR] Solution of problem "<<problem_filename<<" is different from the expected value:\n"; + cout<<"[ERROR] Solution of problem "<<problem_filename<<" ("<<c.size()<<" var, "<<A.rows()<<" constr) is different from the expected value:\n"; cout<<"\tSolution found "<<sol.transpose()<<endl; cout<<"\tExpected solution "<<realSol.transpose()<<endl; cout<<"\tCost found "<<(c.dot(sol))<<endl; diff --git a/test/test_static_equilibrium.cpp b/test/test_static_equilibrium.cpp index 17b9368..4cbe5af 100644 --- a/test/test_static_equilibrium.cpp +++ b/test/test_static_equilibrium.cpp @@ -169,7 +169,10 @@ int test_findExtremumOverLine(StaticEquilibrium &solver_to_test, StaticEquilibri for(unsigned int i=0; i<N_TESTS; i++) { uniform(-1.0*Vector2::Ones(), Vector2::Ones(), a); - desired_robustness = (rand()/ value_type(RAND_MAX))*e_max; + if(e_max>=0.0) + desired_robustness = (rand()/ value_type(RAND_MAX))*e_max; + else + desired_robustness = e_max - EPS; getProfiler().start(PERF_STRING_TEST); status = solver_to_test.findExtremumOverLine(a, a0, desired_robustness, com); @@ -250,9 +253,9 @@ void drawRobustnessGrid(StaticEquilibrium &solver, Cref_matrixXX comPositions) int main() { unsigned int seed = (unsigned int)(time(NULL)); -// seed = 1446456544; +// seed = 1446555515; srand (seed); - cout<<"Initialize random number generator with seed "<<seed<<endl; + cout<<"Initialize random number generator with seed "<<seed<<" (in case you wanna repeat the same test later)\n"; RVector3 CONTACT_POINT_LOWER_BOUNDS, CONTACT_POINT_UPPER_BOUNDS; RVector3 RPY_LOWER_BOUNDS, RPY_UPPER_BOUNDS; @@ -260,19 +263,19 @@ int main() /************************************** USER PARAMETERS *******************************/ double mass = 70.0; double mu = 0.3; // friction coefficient - unsigned int generatorsPerContact = 4; - unsigned int N_CONTACTS = 1; + unsigned int generatorsPerContact = 8; + unsigned int N_CONTACTS = 3; double MIN_FEET_DISTANCE = 0.3; double LX = 0.5*0.2172; // half contact surface size in x direction double LY = 0.5*0.138; // half contact surface size in y direction CONTACT_POINT_LOWER_BOUNDS << 0.0, 0.0, 0.0; CONTACT_POINT_UPPER_BOUNDS << 0.5, 0.5, 0.5; double gamma = atan(mu); // half friction cone angle - RPY_LOWER_BOUNDS << -0*gamma, -0*gamma, -M_PI; - RPY_UPPER_BOUNDS << +0*gamma, +0*gamma, +M_PI; + RPY_LOWER_BOUNDS << -2*gamma, -2*gamma, -M_PI; + RPY_UPPER_BOUNDS << +2*gamma, +2*gamma, +M_PI; double X_MARG = 0.07; double Y_MARG = 0.07; - const int GRID_SIZE = 5; + const int GRID_SIZE = 10; /************************************ END USER PARAMETERS *****************************/ cout<<"Number of contacts: "<<N_CONTACTS<<endl; diff --git a/test_data/DLP_findExtremumOverLine20151103_014022.dat b/test_data/DLP_findExtremumOverLine20151103_014022.dat new file mode 100644 index 0000000000000000000000000000000000000000..75f27bdc49795170aa72711f8c67e63df236a024 GIT binary patch literal 2272 zcmZQ$fB;1(ts`|_;Lg3Dds^dnzA@hR(`Nts?4`?;iw@k2)4OUI6?ouRZIN%AzK6qt zmZVJwyzkfmwJF3eU^+x1?F3a%3=MYK6{n*~FOo0WZ$IMU-@NSI{yVXfN_jfh_N&+H zck(?rZa;O#rR(L(*4V?;^-F(<miH{NfvFE-4KAx+dU?N%!JY@N-=48QnPYG;b@KN8 z5Opm!P<{Jh>QAicIW<A<BHaAx5cBuL)P-rj;9Q^Ew+E&kX1>t5MTUl#4%wf8m~Rhu zJdl973#NXZX73`Es0;ho=EW_!WwhOXPGI4W`PXLSbieze-nZGyPVditv3sT0@&oo- zdL4bd(>LIBztKmAX?-(}!OfosF(0S<Vdk?-cD=IKTLm*8r~3<yQ~Dg4Z|`oZJ# zvsL?ZCAB7Lt4x5IZ;u}S&u`6r6jXD4{{yEVtG@5;+Ao^B_s&VZJviMT+jQM5<?EIG zTu}2fA?CxvXFq!Q!^~fQW@4~O|8|)9INiS>{R40J)%*KRy#yvtG+t)!&?D^Sv7`%T zK8E|n__dPe_}$&_(!Q{w*>tP@t*e{ZCr&+x)BQc$lDDlrervxO)O;_9`LOW8a6im^ zg}58OhY#k%%*W~erJp`8?VovWzx$k|U9+cOvR4W%Ths2p4X68M(x%M_;W)FuCrQxJ z^1)^M@`B#zGZ%5EpUF2Zx+Tj`!p&EPn2*!_F!PzNZ8rYrchSBKVm?myTUy0v?K*Q{ zf2yA+V^hs_d)J8{)0y=5;B<d{^k2(=WqbCo68X_CfAog^MYGdNMj{JwhQE)KlYB?W zc69S`x*uk~LdUGCC&t(8&qK_|>3)-q;VL4&ZTtP0Cgm(~IBBny`AB+_?>gM>7jN7+ z=U9{d^}hF&_b;BdU$-^g`h9yEG@W6VKfm6uIjr_}u05LhINhHFHUDU-Nqpw|WA^(Y z=I_T<{xGEPs`gFZw_nYsbMN}M`|KZoc)es!-y)puf9Lx@;kv`l{d2UG-Ux9VvTu$x zay;)l4`=w_F>!HAl-mL~{|Ur=obHF2FQR;Ik>%-~_DvA;;o%SS2aNu6{w1HGe$#<@ j65Bdo2(})8iZ{UIM>hQd6z`yVnV9-@xT*sN!H4|-Luh%< literal 0 HcmV?d00001 diff --git a/test_data/DLP_findExtremumOverLine20151103_014022_solution.dat b/test_data/DLP_findExtremumOverLine20151103_014022_solution.dat new file mode 100644 index 0000000000000000000000000000000000000000..f9d54a8f500135ba29ca288eacf0ac727cbfec75 GIT binary patch literal 64 zcmZQ$fB;4)&CuX_|I-iY{R|5{b-e3j?HL5(W+z0N1NqbajIVgvGfa4p%3kDY4_1Cc G#1;U>4G?Ak literal 0 HcmV?d00001 diff --git a/test_data/DLP_findExtremumOverLine_128_generators.dat b/test_data/DLP_findExtremumOverLine_128_generators.dat new file mode 100644 index 0000000000000000000000000000000000000000..460b9bd1c24829b2644ba1cca2823baf1ce9f5ed GIT binary patch literal 8416 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 literal 0 HcmV?d00001 diff --git a/test_data/DLP_findExtremumOverLine_128_generators_bis.dat b/test_data/DLP_findExtremumOverLine_128_generators_bis.dat new file mode 100644 index 0000000000000000000000000000000000000000..a0046981976f9a5acad30532e7ab983ff8bacc3c GIT binary patch literal 8416 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 literal 0 HcmV?d00001 diff --git a/test_data/DLP_findExtremumOverLine_128_generators_bis_solution.dat b/test_data/DLP_findExtremumOverLine_128_generators_bis_solution.dat new file mode 100644 index 0000000000000000000000000000000000000000..26da3e6257fec7f42aec72ced50c8ff955215025 GIT binary patch literal 64 zcmZQ$fB;4)&HAFl)O%y{{;V*C)nZQ)_NTNNJU01dynllE_b-BFq4q2P-90+DKhfUf L?c6pU$?W|AL>m}7 literal 0 HcmV?d00001 diff --git a/test_data/DLP_findExtremumOverLine_128_generators_solution.dat b/test_data/DLP_findExtremumOverLine_128_generators_solution.dat new file mode 100644 index 0000000000000000000000000000000000000000..c27d8c920892781134fc69f33968bc6dabc703dd GIT binary patch literal 64 zcmZQ$fB;4)y;NDJC)UNuKJ?JWSIr-t_Ah7>OD}&LuwO$jsPo0;0Q<%@zwfhY`|TI& LJEF#$6JQSjFW442 literal 0 HcmV?d00001 diff --git a/test_data/DLP_findExtremumOverLine_32_generators.dat b/test_data/DLP_findExtremumOverLine_32_generators.dat new file mode 100644 index 0000000000000000000000000000000000000000..fe78d5364c3107f00a1d79514f97d9814f0114d9 GIT binary patch literal 2272 zcmd_rc`)2(7zc0(mN*h;gQ%NHW73c&TFSgEDN7n>#wJ6Z)uFB?sWT!BVRdPOxbG#a zBF@Dg*0Zh^f&^pZN{FCBv)MGRC{>;4Uzy)z`fvOG^US>SyzhM8@4Pb)PUzjz+^ZLq z@A#T=4a`aN=d#PDJ~3~zj@~x3i01r`cNCVoY|r`5axp?j!qNOdP*dBQ_$cfi)9@(S z-|;Uiey{(7)jmcu;6NZ7s=UIZPK^vB!TPbSUN=5G%8n%o%0@vqMye;D+=axO?7wz2 zZb7~+uC^iF-N@la{c7PvG`c6dEcQe4D~Jr=SF>F50Qg}tVaA6>P=<4+>AGkcyp=Ip zF(9)ca<n(aV`T`YbE#z;F?_&l9sd!hM}x*dwm^o`g+6Uex0DT}fEBcxa!bZxC-L3= z+Sh;0a&&qLHiXRLjh0?moVIo!B;_EJ#76|H8_fvIUt@StGFPo1Ru-y>JO2HM%Pa7n z45DNDMGj8{yN1%?L^UaV>kl5HKa+UMxJ$<L>*z)w;YyUD-kOPLQlx%VdURD^Z@wPW zf1jb67v9qhZBdI^dTULHsW3c8G%d&Uhjm+w-l^t5YM&P0C!d1oWXXm&hXPE$Co5)F zzAY44<Eitfy|_q-m%O>-?18ZIe<J-PWsKU6<b-7-hw3Qk+wxE`9IXJ;uSnsQo^c35 zZH2VMj;ajsJQ`G~#q|cP{QWu?ruZWd!HvPLbD?DeTlBHpg=^WE{?E6BYKywrkX-BE z?Qw{WmMf!DhBz6R`Df;v*{R*iK?M@`vrGrGLC#|{fuk9Uu>McI_ICI>n+5or6_WcS zy1+==CSia=MHO~l{`1`=P<p;3YpULZf_`BcXGFXL-&m(=Ng@;U&V;xqzo|!ahUavz z$)%#RR}!g${2}B#NL8UvGa+-asFjh)hp+OstE$%W(4_8=JCV?fcp?ERx0lG!`bO2l zLp>Q<h=h-#cE+Icfl)B!%1bCqF!bKwcOnDxS(VZLI`mV+_eBnAMPTDM-mjuR0vGr0 zk0U!TUnTOvG}Wr<g+@N&l1p<EDr#Zu(%Z$5Eh1p~Pi|S9XF2yl)W<rPZ_$1R^SLh$ z2D0@5%TEo9eVmrn2<iSla=EdssQj~HdE1myO#fQ;=AQwfcTtkCqefqKDlh^)>!dxy z5SG8=bdqxeu@S~`{`gtN4j_sbx~G|xW9Cl}9vGfV9)<QeE6RDZPDC|1wTg2s!OZ{p z({k&ndwp=VxM(a*Z3vlDz9a<BHe>qvuV-E-D9`|}%t~0^*MXSZ@rpvyHJJIwhcEEd zgZsc{My~mYYz}I+P+)|J)nWPt8u5A}O9P<qSL3UHauA6KWi9!%P%-^CXC$O!#aMtN z@;h88JS1+*n9XI@WBNUh%by*$%0cM_Lz<RlKeD^zEv+a+$Mmn=Uir<5#RTsiQ9Xh? z6K#K!bZk;73+;`i_sZ787Y7Yb#B++2nn{bYiJZNL>+d!GFE<4L%;gWx*WGyjp5On) JzTKw@;4kDLthxXI literal 0 HcmV?d00001 diff --git a/test_data/DLP_findExtremumOverLine_32_generators_solution.dat b/test_data/DLP_findExtremumOverLine_32_generators_solution.dat new file mode 100644 index 0000000000000000000000000000000000000000..dc6496ee5f8a1e6f33f8e4689691d38c8fdb3dbb GIT binary patch literal 64 zcmZQ$fB;4)EfRN0>RG<&{*wW=b1pSn+CLGW)cyLP{QfJ+Cq;dPeC;Dn?wZio<Zhqv Lsa?o<yZC+pHp>>t literal 0 HcmV?d00001 diff --git a/test_data/DLP_findExtremumOverLine_64_generators.dat b/test_data/DLP_findExtremumOverLine_64_generators.dat new file mode 100644 index 0000000000000000000000000000000000000000..d6c10e9dc9a604c6f6a75ab2c0884a09460bcbee GIT binary patch literal 4320 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 PkNxG(b^o_cf7ijEQ5yc? literal 0 HcmV?d00001 diff --git a/test_data/DLP_findExtremumOverLine_64_generators_solution.dat b/test_data/DLP_findExtremumOverLine_64_generators_solution.dat new file mode 100644 index 0000000000000000000000000000000000000000..2ba448b10da4e14e24fb21f0891b0278f1dd0bfd GIT binary patch literal 64 zcmZQ$fB;4)ZOrGSV5^w0ze>RE+OMrK_7{_Dvb{?j?EB_rPB^i}$^K2p(b-p%lkMNg LE~!>uRk0rc^>-F= literal 0 HcmV?d00001 diff --git a/test_data/LP_findExtremumOverLine20151103_014022.dat b/test_data/LP_findExtremumOverLine20151103_014022.dat new file mode 100644 index 0000000000000000000000000000000000000000..5537dc9ae58b3cc6839f565981c7d8843fd15290 GIT binary patch literal 2488 zcmeIxYe<t}6bJC7l&08CE2L0cVzfeS+Q?d*IVw%sB+Y_MSJM<Ttsu3FV9jbeb>1i~ zr|Fo6VlKNlvgw(5N!!r2)YUMO(z0wilSqWFyzgG<V_&o9%by?T`Em~Dtf3Ka0h#~f z_XI3R&f&tG&SNv0U;TRsDs8y`lh}lQZl`c8#sK-NERpWJFR@8m_k}jM>Zhsx_pcvY zs7#Wo|Lp(Ys}oy5qp3QALo;h8aIU6x4nt9{^yH0$7&bpVHKY1DcGu@VEpXFQZdjiu z_dNIvgXDSU#2PI!r)bxtrCpRy`Nc{DZB6*zRQ@I`-H1^lBP;exKjq4Ji&M_PYh1CI zA(Zi7VQy1Q)9oiF%GIBztMjk-;_A3-rTgr4Sp0HJj%!*E<$$e+7|l8j3L?J+d{0&5 z9xm5CYoCg;f8zm97v2>Vti0GL>k`52WPQ7rxg3O~Y4OeHc`>ax!TWL8$a#oE{yTOZ zal231_)Y#{Z?=fDF2g5#(eM*s`>Kb>%{s7pS+9K4Cc|U6ogA$&F;$Q__NX@GmWHyO ztK=hi*MZ}JC3yN>9S(D6>b|x}(1Em4R~YV}ufokCONtBqYG8-B>P+V52f!lj5&eSK z-gW|lWWwgM5(DH4mj(t5Kc{Rnc+c-UUk^w5yXT40jZo(@BX;k6LD?hg#<>x{LEzgI z9anIAz$l$O`&zH1+?nDpNKkfx7dyK}X>J7>gZ^om{bR~5YkTDZ+K1pMPN}`@oXoje zYA~kN)I-m4-?pR0Dl8$4-Go85_tebI!7^ZYXGxt(?qCIBBn?TfjG_&m1-Lw^WvItn zjR}N-G;ngALxL3&Fb&+bE4<o<A%u}M&?8do#i31*b}}zgr@w=131cc@*jYFgZ{wo| zJxfbxx>O-)>>~_}gg2{-cn#3-Ab#7VIL>NB!uZxQu8>LPkQv1c?BiA72w@Zv2J2mP zI9CifOKe*v%-Q|XiMHE=7qH^`rz13D?MWGVDwf6)HZGra@ZnU9DjMetM%jP+|0mz- Bk9hz9 literal 0 HcmV?d00001 diff --git a/test_data/LP_findExtremumOverLine20151103_014022_solution.dat b/test_data/LP_findExtremumOverLine20151103_014022_solution.dat new file mode 100644 index 0000000000000000000000000000000000000000..507353ecc6c1a08da7fc6ba1165bc8b7cc28ec3d GIT binary patch literal 280 zcmY#nfB;4)O>4@&Xs+J9=LQaIJ_;)=uQ71QGj=X6uQPCX_dmCC-Ae<9f9E6O7Vt_q pEc6X2tJx*#Abt9vxAkU8hy5aN1mf8w9BA#nqaoAv?3kw80|4)49#sGU literal 0 HcmV?d00001 diff --git a/test_data/LP_findExtremumOverLine_128_generators.dat b/test_data/LP_findExtremumOverLine_128_generators.dat new file mode 100644 index 0000000000000000000000000000000000000000..4c607f835fbde1196658d9147800c91ac816effb GIT binary patch literal 9400 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 HU;lprX(1M; literal 0 HcmV?d00001 diff --git a/test_data/LP_findExtremumOverLine_128_generators_bis.dat b/test_data/LP_findExtremumOverLine_128_generators_bis.dat new file mode 100644 index 0000000000000000000000000000000000000000..75d466768cb47c75610c0d9bc1ada8ac48b13f60 GIT binary patch literal 9400 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 M3yVT(|6l$805}@=X#fBK literal 0 HcmV?d00001 diff --git a/test_data/LP_findExtremumOverLine_128_generators_bis_solution.dat b/test_data/LP_findExtremumOverLine_128_generators_bis_solution.dat new file mode 100644 index 0000000000000000000000000000000000000000..01827b4dde575ab9bcb04d32be12c88b0457f461 GIT binary patch literal 1048 zcmZo<fB;4)O)Mq$P|WClt%3uw>gla6P5*^<$jdZ`5D(7Wxyq#ulQ~+ocZR4BTKCdB ed`9gX+#wLSm``JFpex<etKiK)xy@5A+XDbU_Y-LV literal 0 HcmV?d00001 diff --git a/test_data/LP_findExtremumOverLine_128_generators_solution.dat b/test_data/LP_findExtremumOverLine_128_generators_solution.dat new file mode 100644 index 0000000000000000000000000000000000000000..e867ea23f429bf51bdac6cbf77f43e5cd0083143 GIT binary patch literal 1048 zcmZo<fB;4)JxUGD5U8jU(Jzxrav1Ecf3rvL<Ine@4%@ETZc}{{G3ebp*uxW-`&Kwy d+^{e!%HhV`&ZkW85{VAyr+r5Sx!zy32LSQX87cq( literal 0 HcmV?d00001 diff --git a/test_data/LP_findExtremumOverLine_32_generators.dat b/test_data/LP_findExtremumOverLine_32_generators.dat new file mode 100644 index 0000000000000000000000000000000000000000..6dd7e50096bb9aeb13087632fc024001ebc074b9 GIT binary patch literal 2488 zcmeH`*;5k+5Qn2;ups3Ssv?z3GFHYGyjm>IhKQAjtw3;$3>dCjL%FJ!2#5$1<O<Xy za>z|WV-=AjKn}x31Qd+aK#5$6B2bPR<H%{Dv>ove=mSr7U%uJ-_GN!FKTE>fAujNL z{F{IV7jiiJUNdM~{?GpwjKZaq_nik~EQ3A>mSJG+p?zVEjWA=dW897-Lub70*i_hs zi|tEX{g{J|$+-Vyf<Tj_gj=u8oEYXw=yJ46VQSlsi|rSBK)B||irUuR25#pnCi1$Y zA+n=6g)y$g`GmLoV*54EM-3g#?*gq=U@Gd9U@e{cQPg}VdM)gW?ce2~nc6hl?5)Nd zhGW`4B)!DGY(epKj2f-a{+{9P@d6jyhx{USxOD0za)<M8iMeXLdVfbK@8k=N<Iu)V z)77}x{#_0aGh>rA#T^*QT2eMvcpoWNn|~ydgy=%$7EISRW0}2|ZuWWwYOU@LJrpj& z4K~s1nskccp4jXP>uwE3G&*(sTq;LjX-xmBx^Q@`_c*0fa2rf`s-it^A#n80P_MfE zSNwdIa5KMAhTNQ8uIn#kL51}kYf2`?z*vt`UAhFnx-xg|+T;}|X50HutM7ngnsfDt zMGkD4bvh`ewV)s(_ECC96;5Wp`70>=I@E7Zq*c<ZP!#&0tv9IypFiR6?Y+^0>Q_%+ zv5kco&l*yhhqj=`BA%o*`T);A)zOR9mZI<GRr|Y~vtaV__#Ylp2`<YsPaW~}BHP5Q zyqm*m0Cj{xgoA!NR0Yd42D}Cs?%V6rnw$mWL#6b2rUE`IO=ivhse<OR?q@5L6;Ky7 zoI#qbhO`zdbwCae_EH3c+x?orXqjQ8vYZEXdBWB1W@7Xf%gQ~4nV58w*~rkBL9Wid z49C_?q?|9&U3#hkNqfRP*S@ZR9vh_(o!Sg`<bKl*ML9Hain7=xH!<qt4JR%Lf5MB* z0Hf^KTadWS-J+#54ZDa;O20`x-i~wT9o%&XP8Z~Nrmt55Wv!Gwwxk|ho*LDxGt2_p zqh*1%TUvogSJ!*;RB(}MFSOdN0RQ>rB&v@D#`z<MBkR8-uc$uowYx(tT%vIur<NDv zr&Sks8wT@mXTn3O^SK&mQsw&hgor@&Oy`OCItPn3PS}zLD^OzGHb8gegNUPB8RwP@ z1Xa?Tc^U)0<%eq%g}LavG32UMlRwIqKk`0&CKJZ4Mx`j_m(YmuhAp=YhaJ`~><2sn z4A_5TbH*qQR9Zo%mq$66TKRpxTY5fr9-kQwo24Up;ENA~WwyxQTCi$gN)d{KearQH zBY?gl&nJB+9|SwMO%M+i0-5(EHMqY9C3Ep61idn>aWWQ%X_tc*A!9V4RsbvZiTkr9 z73g~0U(duqgmXs{H}$N^fOoyfe$1TVrrMD!i!JrH#(zRS(iRmt&5D+vqC7u#yx@R5 WenL(dvUDeJI^n<d82*O;_5N=tQ^Rop literal 0 HcmV?d00001 diff --git a/test_data/LP_findExtremumOverLine_32_generators_solution.dat b/test_data/LP_findExtremumOverLine_32_generators_solution.dat new file mode 100644 index 0000000000000000000000000000000000000000..af80a74f2c28bd03e25b36e622bbf04c9769821d GIT binary patch literal 280 zcmY#nfB;4)J=iIZNvqe!PmXi=RPXX6yfo6`o!gHnGiDQq?2l20R@u5Z^x5agMubN@ l91wgjvXsl&0p_1C_ZRvmd6~iaFmZJH{NXQ#S9?#|0|0U`9b*6h literal 0 HcmV?d00001 diff --git a/test_data/LP_findExtremumOverLine_64_generators.dat b/test_data/LP_findExtremumOverLine_64_generators.dat new file mode 100644 index 0000000000000000000000000000000000000000..50540586174370a55005298a429f2bc55c224b89 GIT binary patch literal 4792 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 literal 0 HcmV?d00001 diff --git a/test_data/LP_findExtremumOverLine_64_generators_solution.dat b/test_data/LP_findExtremumOverLine_64_generators_solution.dat new file mode 100644 index 0000000000000000000000000000000000000000..e398a1924eafb933eb701cfceb049430b7efb672 GIT binary patch literal 536 zcmZ={fB;4)-M-;=#-d*V4xK)nN(}j74!pnKEbsA+ayYbOQt$Q9C<lWuTV27=Q4aU! zh`zB(4RN?(zbG)$!_UF*(eo8=?s_^vjbWG&%UJ2R<hw15PjA|yCSRP_N&xPjYhTrm z-Z^>IUc`5XgcsK>y1C2d{u)c03BPTK_5YcgCCoSfOWCgY?G_)IAYgmv{T-)k`yUXk SpICcvspGxf*=Bg`lsy37_&_QE literal 0 HcmV?d00001 -- GitLab