quadprog.cpp 4.1 KB

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