Fix linprog tests and add some more smaller test cases.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42423 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Clemens Zeidler
2011-07-14 07:19:30 +00:00
parent 1245d875a3
commit 0a24883020
2 changed files with 86 additions and 27 deletions
+2 -2
View File
@@ -1,11 +1,11 @@
SubDir HAIKU_TOP src tests libs linprog ; SubDir HAIKU_TOP src tests libs linprog ;
SetSubDirSupportedPlatformsBeOSCompatible ;
UseLibraryHeaders lp_solve linprog ; UseLibraryHeaders lp_solve linprog ;
SimpleTest linprog_test : SimpleTest linprog_test :
Program.cpp Program.cpp
: :
be liblpsolve55.so liblinprog.so $(TARGET_LIBSUPC++) be liblpsolve55.so linprog.a $(TARGET_LIBSUPC++) $(TARGET_LIBSTDC++)
; ;
+84 -25
View File
@@ -12,44 +12,101 @@
#include <stdio.h> #include <stdio.h>
using namespace LinearProgramming;
void void
PrintVars(LinearSpec* ls) PrintResults(const VariableList& list)
{ {
int32 size = ls->Variables()->CountItems(); for (int32 i = 0; i < list.CountItems(); i++)
Variable* variable; printf("Variable %i = %f\n", (int)i, list.ItemAt(i)->Value());
for (int i = 0; i < size; i++) {
variable = (Variable*)ls->Variables()->ItemAt(i);
printf("%f ", variable->Value());
}
printf("%d\n", ls->Result());
} }
void void
Test1() Test1()
{ {
LinearSpec* ls = new LinearSpec(); LinearSpec ls;
Variable* x1 = ls->AddVariable(); Variable* x1 = ls.AddVariable();
Variable* x2 = ls->AddVariable(); Variable* x2 = ls.AddVariable();
Constraint* c1 = ls->AddConstraint(1.0, x1, OperatorType(LE), 108); Constraint* c1 = ls.AddConstraint(1.0, x1, OperatorType(kLE), 108);
Constraint* c2 = ls->AddConstraint(1.0, x2, OperatorType(GE), 113); Constraint* c2 = ls.AddConstraint(1.0, x2, OperatorType(kGE), 113);
BList* summands = new BList(2); ls.Solve();
summands->AddItem(new Summand(1.0, x1)); printf("ls: %s\n", ls.ToString().String());
summands->AddItem(new Summand(1.0, x2));
ls->SetObjFunction(summands);
ls->Solve(); ls.RemoveConstraint(c2);
PrintVars(ls); ls.Solve();
printf("ls: %s\n", ls.ToString().String());
c2 = ls.AddConstraint(1.0, x2, OperatorType(kGE), 113);
ls.Solve();
printf("ls: %s\n", ls.ToString().String());
}
void
SoftConstraints()
{
printf("SoftConstraints\n\n");
LinearSpec ls;
Variable* x1 = ls.AddVariable();
x1->SetLabel("label_x1");
Variable* x2 = ls.AddVariable();
x2->SetLabel("label_x2");
Variable* x3 = ls.AddVariable();
x3->SetLabel("label_x3");
Constraint* c1 = ls.AddConstraint(1, x1, kEQ, 0);
Constraint* c2 = ls.AddConstraint(1, x1, -1, x2, kLE, 0);
Constraint* c3 = ls.AddConstraint(1, x2, -1, x3, kLE, 0);
Constraint* c4 = ls.AddConstraint(1, x3, -1, x1, kEQ, 20);
delete c2; Constraint* c5 = ls.AddConstraint(1, x2, -1, x1, kEQ, 10, 5, 5);
ls->Solve(); Constraint* c6 = ls.AddConstraint(1, x3, -1, x2, kEQ, 5, 5, 5);
PrintVars(ls);
ls.Solve();
printf("ls: %s\n", ls.ToString().String());
PrintResults(ls.AllVariables());
ls.RemoveConstraint(c6);
ls.Solve();
printf("ls: %s\n", ls.ToString().String());
PrintResults(ls.UsedVariables());
}
void
SoftInequalityConstraints()
{
printf("SoftInequalityConstraints\n\n");
LinearSpec ls;
Variable* x1 = ls.AddVariable();
x1->SetLabel("label_x1");
Variable* x2 = ls.AddVariable();
x2->SetLabel("label_x2");
Variable* x3 = ls.AddVariable();
x3->SetLabel("label_x3");
Constraint* c1 = ls.AddConstraint(1, x1, kEQ, 0);
Constraint* c2 = ls.AddConstraint(1, x1, -1, x2, kLE, 0);
Constraint* c3 = ls.AddConstraint(1, x2, -1, x3, kLE, 0);
Constraint* c4 = ls.AddConstraint(1, x3, -1, x1, kEQ, 20);
c2 = ls->AddConstraint(1.0, x2, OperatorType(GE), 113); Constraint* c5 = ls.AddConstraint(1, x2, -1, x1, kEQ, 15, 5, 5);
ls->Solve(); Constraint* c6 = ls.AddConstraint(1, x3, -1, x2, kGE, 10, 5000, 5);
PrintVars(ls);
ls.Solve();
printf("ls: %s\n", ls.ToString().String());
PrintResults(ls.AllVariables());
ls.RemoveConstraint(c6);
ls.Solve();
printf("ls: %s\n", ls.ToString().String());
PrintResults(ls.UsedVariables());
} }
@@ -57,5 +114,7 @@ int
main() main()
{ {
Test1(); Test1();
SoftConstraints();
SoftInequalityConstraints();
} }