quadprog.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #include <test_common.h>
  2. #include <igl/quadprog.h>
  3. #include <igl/EPS.h>
  4. TEST_CASE("quadprog: linear inequalities", "[igl]" )
  5. {
  6. const Eigen::Matrix<double,6,6> H = (Eigen::Matrix<double,6,6>(6,6)<<111,126,120,107,165,130,126,172,134,148,192,163,120,134,164,131,177,144,107,148,131,207,205,169,165,192,177,205,310,219,130,163,144,169,219,190).finished();
  7. const Eigen::Matrix<double,6,1> f = (Eigen::Matrix<double,6,1>(6,1)<<3,1,1,9,6,5).finished();
  8. const Eigen::Matrix<double,2,6> A = (Eigen::Matrix<double,2,6>(2,6)<<8,4,2,0,0,8,7,7,7,3,1,7).finished();
  9. const Eigen::Matrix<double,2,1> lbi = (Eigen::Matrix<double,2,1>(2,1)<<-0.5,-6).finished();
  10. const Eigen::Matrix<double,2,1> ubi = (Eigen::Matrix<double,2,1>(2,1)<<0.5,6).finished();
  11. const Eigen::Matrix<double,6,1> lb = (Eigen::Matrix<double,6,1>(6,1)<<-0.1,-0.1,-0.1,-0.1,-0.1,-0.1).finished();
  12. const Eigen::Matrix<double,6,1> ub = (Eigen::Matrix<double,6,1>(6,1)<<0.1,0.1,0.1,0.1,0.1,0.1).finished();
  13. Eigen::Matrix<double,6,1> x = igl::quadprog(H,f,A,lbi,ubi,lb,ub);
  14. //std::cout<<igl::matlab_format(H,"H")<<std::endl;
  15. //std::cout<<igl::matlab_format(f,"f")<<std::endl;
  16. //std::cout<<igl::matlab_format(A,"A")<<std::endl;
  17. //std::cout<<igl::matlab_format(lbi,"lbi")<<std::endl;
  18. //std::cout<<igl::matlab_format(ubi,"ubi")<<std::endl;
  19. //std::cout<<igl::matlab_format(lb,"lb")<<std::endl;
  20. //std::cout<<igl::matlab_format(ub,"ub")<<std::endl;
  21. //std::cout<<igl::matlab_format(x,"x")<<std::endl;
  22. REQUIRE(abs(x(0)- -0.1)<1e-10);
  23. REQUIRE(abs(x(1)- 0.1)<1e-10);
  24. REQUIRE(abs(x(2)- 0.07227715420917860)<1e-10);
  25. REQUIRE(abs(x(3)- -0.1)<1e-10);
  26. REQUIRE(abs(x(4)- 0.01839231579976747)<1e-10);
  27. REQUIRE(abs(x(5)- -0.03056928855229465)<1e-10);
  28. }
  29. TEST_CASE("quadprog: box3", "[igl]" )
  30. {
  31. {
  32. Eigen::Matrix3d H = (Eigen::Matrix3d(3,3)<<
  33. 0.240548455386281, 0.237314308102107, 0.0436993831501944,
  34. 0.237314308102107, 0.326254049041854,-0.00021896091952631,
  35. 0.0436993831501944,-0.00021896091952631, 0.171175681280756
  36. ).finished();
  37. Eigen::Vector3d f = (Eigen::Vector3d(3,1)<<
  38. 0.222182612270718,
  39. 0.503254616893693,
  40. -0.184619987497072
  41. ).finished();
  42. Eigen::Vector3d lb = (Eigen::Vector3d(3,1)<<
  43. -1,
  44. -1,
  45. -1
  46. ).finished();
  47. Eigen::Vector3d ub = (Eigen::Vector3d(3,1)<<
  48. 1,
  49. 1,
  50. 1
  51. ).finished();
  52. Eigen::Vector3d x = igl::quadprog(H,f,lb,ub);
  53. //std::cout<<igl::matlab_format(x,"x")<<std::endl;
  54. REQUIRE(abs(x(0)- -0.118760635036839)<1e-7);
  55. REQUIRE(abs(x(1)- -1)<1e-7);
  56. REQUIRE(abs(x(2)- +1)<1e-7);
  57. }
  58. {
  59. Eigen::Matrix3d H;
  60. H<<1,0,0,0,1,0,0,0,1;
  61. Eigen::Vector3d f( 0.5,-0.5,-0.5);
  62. Eigen::Vector3d lb(0,0,0);
  63. Eigen::Vector3d ub(1,1,1);
  64. Eigen::Vector3d x = igl::quadprog(H,f,lb,ub);
  65. REQUIRE(x(0)==0.0);
  66. REQUIRE(x(1)==0.5);
  67. REQUIRE(x(1)==0.5);
  68. }
  69. {
  70. Eigen::Matrix3d H = (Eigen::Matrix3d(3,3)<<
  71. 1.06020279605748, 0.387347953430924,-0.653587847224834,
  72. 0.387347953430924, 0.323001970642631, -0.80259721932688,
  73. -0.653587847224834, -0.80259721932688, 2.73709523329989
  74. ).finished();
  75. Eigen::Vector3d f = (Eigen::Vector3d(3,1)<<
  76. -0.0155804986732503,
  77. -0.00161174173383921,
  78. -0.00903647945917485
  79. ).finished();
  80. Eigen::Vector3d lb = (Eigen::Vector3d(3,1)<<
  81. 0,
  82. 0,
  83. 0
  84. ).finished();
  85. Eigen::Vector3d ub = (Eigen::Vector3d(3,1)<<
  86. 0.015625,
  87. 0.015625,
  88. 0.015625
  89. ).finished();
  90. Eigen::Vector3d x = igl::quadprog(H,f,lb,ub);
  91. Eigen::Vector3d xexact(0.015625, 0.013732474124087, 0.0110593284260843);
  92. REQUIRE((x-xexact).array().abs().maxCoeff() < 1e-4);
  93. }
  94. }
  95. TEST_CASE("quadprog: box2", "[igl]" )
  96. {
  97. {
  98. Eigen::Matrix2d H = (Eigen::Matrix2d(2,2)<<
  99. 0.683698654982294,-0.0521997092763332,
  100. -0.0521997092763332, 0.800535063458999
  101. ).finished();
  102. Eigen::Vector2d f = (Eigen::Vector2d(2,1)<<
  103. -0.733716332234936,
  104. 2.56401312736278
  105. ).finished();
  106. Eigen::Vector2d lb = (Eigen::Vector2d(2,1)<<
  107. -1,
  108. -1
  109. ).finished();
  110. Eigen::Vector2d ub = (Eigen::Vector2d(2,1)<<
  111. 1,
  112. 1
  113. ).finished();
  114. Eigen::Vector2d x = igl::quadprog(H,f,lb,ub);
  115. //std::cout<<igl::matlab_format(x,"x")<<std::endl;
  116. REQUIRE(abs(x(0)-0.99680848864073357)<1e-7);
  117. REQUIRE(abs(x(1)- -1.)<1e-7);
  118. }
  119. {
  120. Eigen::Matrix2d H = (Eigen::Matrix2d(2,2)<<
  121. 0.0708025678527926,-0.158030756288795,
  122. -0.158030756288795, 0.360468620664163
  123. ).finished();
  124. Eigen::Vector2d f = (Eigen::Vector2d(2,1)<<
  125. 0.207229875768196,
  126. -0.547595351878845
  127. ).finished();
  128. Eigen::Vector2d lb = (Eigen::Vector2d(2,1)<<
  129. -1,
  130. -1
  131. ).finished();
  132. Eigen::Vector2d ub = (Eigen::Vector2d(2,1)<<
  133. 1,
  134. 1
  135. ).finished();
  136. Eigen::Vector2d x = igl::quadprog(H,f,lb,ub);
  137. //std::cout<<igl::matlab_format(x,"x")<<std::endl;
  138. REQUIRE(abs(x(0)- -0.69487761491492939)<1e-7);
  139. REQUIRE(abs(x(1)-1.0)<1e-7);
  140. }
  141. {
  142. Eigen::Matrix2d H;
  143. H<<0.4000,-0.2000,-0.2000,1.0000;
  144. Eigen::Vector2d f(-0.3000,4.0000);
  145. Eigen::Vector2d lb(0,0);
  146. Eigen::Vector2d ub(1,1);
  147. Eigen::Vector2d x = igl::quadprog(H,f,lb,ub);
  148. //std::cout<<igl::matlab_format(x,"x")<<std::endl;
  149. REQUIRE(abs(x(0)-0.75)<2e-16);
  150. REQUIRE(abs(x(1)-0.0)<2e-16);
  151. }
  152. }