⛏️ index : haiku.git

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