root/src/tests/libs/linprog/Program.cpp
/*
 * Copyright 2007-2008, Christof Lutteroth, lutteroth@cs.auckland.ac.nz
 * Copyright 2007-2008, James Kim, jkim202@ec.auckland.ac.nz
 * Distributed under the terms of the MIT License.
 */

#include <SupportDefs.h>

#include "LinearSpec.h"

#include <stdio.h>


using namespace LinearProgramming;


void
PrintResults(const VariableList& list)
{
        for (int32 i = 0; i < list.CountItems(); i++)
                printf("Variable %i = %f\n", (int)i, list.ItemAt(i)->Value());
}


void
Test1()
{
        LinearSpec ls;
        Variable* x1 = ls.AddVariable();
        Variable* x2 = ls.AddVariable();
        
        Constraint* c1 = ls.AddConstraint(1.0, x1, OperatorType(kLE), 108);     
        Constraint* c2 = ls.AddConstraint(1.0, x2, OperatorType(kGE), 113);
        
        ls.Solve();
        printf("ls: %s\n", ls.ToString().String());
        
        ls.RemoveConstraint(c2);
        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);
        
        Constraint* c5 = ls.AddConstraint(1, x2, -1, x1, kEQ, 10, 5, 5);
        Constraint* c6 = ls.AddConstraint(1, x3, -1, x2, kEQ, 5, 5, 5);

        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);
        
        Constraint* c5 = ls.AddConstraint(1, x2, -1, x1, kEQ, 15, 5, 5);
        Constraint* c6 = ls.AddConstraint(1, x3, -1, x2, kGE, 10, 5000, 5);

        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());
}


int
main()
{
        Test1();
        SoftConstraints();
        SoftInequalityConstraints();    
}