31 #include <corbo-optimization/hyper_graph/base_edge.h>
43 #include "gtest/gtest.h"
46 using corbo::HyperGraph2;
68 graph.setEdgeIterationStrategy(
false);
70 graph.setRetainLsqForm(
true);
95 auto edge_fun = [](
const EdgeT::VertexContainer& vertices) {
return vertices[0]->getData()[0] - 2; };
97 EdgeInterface::UPtr edge(
new EdgeT(edge_fun,
true, v1));
98 graph.addObjectiveEdge(std::move(edge));
100 EXPECT_TRUE(solver.initialize(graph));
102 bool success = solver.solve(graph,
true);
104 EXPECT_TRUE(success);
105 EXPECT_NEAR(v1.
values()[0], 2.0, 1e-6);
114 graph.addVertex(&v1);
115 graph.addVertex(&v2);
121 values[0] = vertices[0]->getData()[0] - 5;
122 values[1] = vertices[1]->getData()[0] + 3;
123 values[2] = vertices[1]->getData()[1];
126 EdgeInterface::UPtr edge(
new EdgeT(edge_fun,
true, v1, v2));
127 graph.addObjectiveEdge(std::move(edge));
129 EXPECT_TRUE(solver.initialize(graph));
131 bool success = solver.solve(graph,
true);
133 EXPECT_TRUE(success);
134 EXPECT_NEAR(v1.
values()[0], 5.0, 1e-6);
135 EXPECT_NEAR(v2.
values()[0], -3.0, 1e-6);
136 EXPECT_NEAR(v2.
values()[1], 0.0, 1e-6);
145 graph.addVertex(&v1);
146 graph.addVertex(&v2);
155 values[0] = vertices[0]->getData()[0] - 5;
156 values[1] = vertices[1]->getData()[0] + 3;
157 values[2] = vertices[1]->getData()[1];
160 EdgeInterface::UPtr edge(
new EdgeT(edge_fun,
true, v1, v2));
161 graph.addObjectiveEdge(std::move(edge));
163 EXPECT_TRUE(solver.initialize(graph));
165 bool success = solver.solve(graph,
true);
167 EXPECT_TRUE(success);
168 EXPECT_NEAR(v1.
values()[0], 1.0, 1e-6);
169 EXPECT_NEAR(v2.
values()[0], 1.0, 1e-6);
170 EXPECT_NEAR(v2.
values()[1], 0.0, 1e-6);
182 graph.addVertex(&x1);
183 graph.addVertex(&x2);
189 auto edge_fun1 = [](
const Edge1T::VertexContainer& vertices) {
190 double x1 = vertices[0]->
getData()[0];
191 double x2 = vertices[1]->
getData()[0];
195 EdgeInterface::UPtr edge1(
new Edge1T(edge_fun1,
true, x1, x2));
196 graph.addObjectiveEdge(std::move(edge1));
200 auto edge_fun2 = [](
const Edge2T::VertexContainer& vertices) {
201 double x1 = vertices[0]->
getData()[0];
205 EdgeInterface::UPtr edge2(
new Edge2T(edge_fun2,
true, x1));
206 graph.addObjectiveEdge(std::move(edge2));
208 EXPECT_TRUE(solver.initialize(graph));
211 bool success = solver.solve(graph,
true);
213 EXPECT_TRUE(success);
214 EXPECT_NEAR(x1.
values()[0], 1.0, 1e-3);
215 EXPECT_NEAR(x2.
values()[0], 1.0, 1e-3);
223 graph.addVertex(&v1);
229 auto edge_fun = [](
const EdgeT::VertexContainer& vertices) {
return vertices[0]->getData()[0] - 2; };
230 EdgeInterface::UPtr edge1(
new EdgeT(edge_fun,
true, v1));
231 graph.addObjectiveEdge(std::move(edge1));
233 auto eq_constr = [](
const EdgeT::VertexContainer& vertices) {
return vertices[0]->getData()[0] - 3; };
234 EdgeInterface::UPtr edge2(
new EdgeT(eq_constr,
false, v1));
235 graph.addEqualityConstraintEdge(std::move(edge2));
237 solver.setPenaltyWeights(100, 100, 100);
239 EXPECT_TRUE(solver.initialize(graph));
241 bool success = solver.solve(graph,
true);
243 EXPECT_TRUE(success);
244 EXPECT_NEAR(v1.
values()[0], 3.0, 1e-4);
252 graph.addVertex(&v1);
258 auto edge_fun = [](
const EdgeT::VertexContainer& vertices) {
return vertices[0]->getData()[0] - 2; };
259 EdgeInterface::UPtr edge1(
new EdgeT(edge_fun,
true, v1));
260 graph.addObjectiveEdge(std::move(edge1));
262 auto eq_constr = [](
const EdgeT::VertexContainer& vertices) {
return -vertices[0]->getData()[0] + 3; };
263 EdgeInterface::UPtr edge2(
new EdgeT(eq_constr,
false, v1));
264 graph.addInequalityConstraintEdge(std::move(edge2));
266 solver.setPenaltyWeights(100, 100, 100);
268 EXPECT_TRUE(solver.initialize(graph));
270 bool success = solver.solve(graph,
true);
272 EXPECT_TRUE(success);
273 EXPECT_NEAR(v1.
values()[0], 3.0, 1e-4);
282 Eigen::VectorXd lb(1);
286 graph.addVertex(&v1);
292 auto edge_fun = [](
const EdgeT::VertexContainer& vertices) {
return vertices[0]->getData()[0] - 2; };
294 EdgeInterface::UPtr edge(
new EdgeT(edge_fun,
true, v1));
295 graph.addObjectiveEdge(std::move(edge));
297 solver.setPenaltyWeights(100, 100, 100);
299 EXPECT_TRUE(solver.initialize(graph));
301 bool success = solver.solve(graph,
true);
303 EXPECT_TRUE(success);
304 EXPECT_NEAR(v1.
values()[0], 5.0, 1e-3);
313 Eigen::VectorXd ub(1);
317 graph.addVertex(&v1);
323 auto edge_fun = [](
const EdgeT::VertexContainer& vertices) {
return vertices[0]->getData()[0] - 2; };
325 EdgeInterface::UPtr edge(
new EdgeT(edge_fun,
true, v1));
326 graph.addObjectiveEdge(std::move(edge));
328 solver.setPenaltyWeights(100, 100, 100);
330 EXPECT_TRUE(solver.initialize(graph));
332 bool success = solver.solve(graph,
true);
334 EXPECT_TRUE(success);
335 EXPECT_NEAR(v1.
values()[0], -1.0, 1e-3);
344 graph.addVertex(&x1);
345 graph.addVertex(&x2);
351 auto edge_fun1 = [](
const Edge1T::VertexContainer& vertices) {
352 double x1 = vertices[0]->
getData()[0];
355 EdgeInterface::UPtr edge1(
new Edge1T(edge_fun1,
true, x1));
356 graph.addObjectiveEdge(std::move(edge1));
360 auto edge_fun2 = [](
const Edge2T::VertexContainer& vertices) {
361 double x2 = vertices[0]->
getData()[0];
364 EdgeInterface::UPtr edge2(
new Edge2T(edge_fun2,
true, x2));
365 graph.addObjectiveEdge(std::move(edge2));
375 auto edge_fun3 = [](
const Edge3T::VertexContainer& vertices) {
376 double x1 = vertices.at(0)->
getData()[0];
377 double x2 = vertices.at(1)->
getData()[0];
378 return x2 - 10.0 * x1 + 10.0;
380 EdgeInterface::UPtr edge3(
new Edge3T(edge_fun3,
false, x1, x2));
381 graph.addInequalityConstraintEdge(std::move(edge3));
388 bool success = solver.solve(graph,
true);
390 EXPECT_TRUE(success);
391 EXPECT_NEAR(x1.
values()[0], 2.0, 1e-2);
392 EXPECT_NEAR(x2.
values()[0], 0.0, 1e-2);
398 solver.setPenaltyWeights(1, 10, 10);
399 solver.setIterations(5000);
400 EXPECT_TRUE(solver.initialize(graph));
403 success = solver.solve(graph,
true);
405 EXPECT_TRUE(success);
406 EXPECT_NEAR(x1.
values()[0], 2.0, 1e-2);
407 EXPECT_NEAR(x2.
values()[0], 0.0, 1e-2);
416 graph.addVertex(&x1);
417 graph.addVertex(&x2);
423 auto edge_fun1 = [](
const Edge1T::VertexContainer& vertices) {
424 double x1 = vertices[0]->
getData()[0];
427 EdgeInterface::UPtr edge1(
new Edge1T(edge_fun1,
true, x1));
428 graph.addObjectiveEdge(std::move(edge1));
432 auto edge_fun2 = [](
const Edge2T::VertexContainer& vertices) {
433 double x2 = vertices[0]->
getData()[0];
436 EdgeInterface::UPtr edge2(
new Edge2T(edge_fun2,
true, x2));
437 graph.addObjectiveEdge(std::move(edge2));
447 auto edge_fun3 = [](
const Edge3T::VertexContainer& vertices) {
448 double x1 = vertices.at(0)->
getData()[0];
449 double x2 = vertices.at(1)->
getData()[0];
450 return x2 - 10.0 * x1 + 10.0;
452 EdgeInterface::UPtr edge3(
new Edge3T(edge_fun3,
false, x1, x2));
453 graph.addInequalityConstraintEdge(std::move(edge3));
460 solver.setPenaltyWeights(2, 2, 2);
461 solver.setWeightAdapation(5, 5, 5, 500, 500, 500);
462 solver.setIterations(5);
464 EXPECT_TRUE(solver.initialize(graph));
468 for (
int i = 0; i < 5; ++i) success = solver.solve(graph,
true, i == 0 ?
true :
false);
470 EXPECT_TRUE(success);
471 EXPECT_NEAR(x1.
values()[0], 2.0, 1e-2);
472 EXPECT_NEAR(x2.
values()[0], 0.0, 1e-2);
479 for (
int i = 0; i < 5; ++i) success = solver.solve(graph,
true, i == 0 ?
true :
false);
481 EXPECT_TRUE(success);
482 EXPECT_NEAR(x1.
values()[0], 2.0, 1e-2);
483 EXPECT_NEAR(x2.
values()[0], 0.0, 1e-2);
494 graph.addVertex(&x1);
495 graph.addVertex(&x2);
501 auto edge_fun1 = [](
const Edge1T::VertexContainer& vertices) {
502 double x1 = vertices[0]->
getData()[0];
505 EdgeInterface::UPtr edge1(
new Edge1T(edge_fun1,
true, x1));
506 graph.addObjectiveEdge(std::move(edge1));
510 auto edge_fun2 = [](
const Edge2T::VertexContainer& vertices) {
511 double x2 = vertices[0]->
getData()[0];
514 EdgeInterface::UPtr edge2(
new Edge2T(edge_fun2,
true, x2));
515 graph.addObjectiveEdge(std::move(edge2));
525 auto edge_fun3 = [](
const Edge3T::VertexContainer& vertices) {
526 double x1 = vertices.at(0)->
getData()[0];
527 double x2 = vertices.at(1)->
getData()[0];
528 return x2 - 10.0 * x1 + 10.0;
530 EdgeInterface::UPtr edge3(
new Edge3T(edge_fun3,
false, x1, x2));
531 graph.addInequalityConstraintEdge(std::move(edge3));
538 bool success = solver.solve(graph,
true);
540 EXPECT_TRUE(success);
541 EXPECT_NEAR(x1.
values()[0], 2.0, 1e-2);
542 EXPECT_NEAR(x2.
values()[0], 0.0, 1e-2);
548 solver.setPenaltyWeights(1, 10, 10);
549 solver.setIterations(100);
550 EXPECT_TRUE(solver.initialize(graph));
553 success = solver.solve(graph,
true);
555 EXPECT_TRUE(success);
556 EXPECT_NEAR(x1.
values()[0], 2.0, 1e-2);
557 EXPECT_NEAR(x2.
values()[0], 0.0, 1e-2);