#ifndef ACTICE_SET_SOLVER_H
#define ACTICE_SET_SOLVER_H
#include "LinearSpec.h"
class EquationSystem {
public:
EquationSystem(int32 rows, int32 columns);
~EquationSystem();
void SetRows(int32 rows);
int32 Rows();
int32 Columns();
bool InRange(int32 row, int32 column);
inline double& A(int32 row, int32 column);
inline double& B(int32 row);
inline void Results(double* results, int32 size);
inline void SwapColumn(int32 i, int32 j);
inline void SwapRow(int32 i, int32 j);
bool GaussianElimination();
bool GaussJordan();
void GaussJordan(int32 column);
void RemoveLinearlyDependentRows();
void RemoveUnusedVariables();
void MoveColumnRight(int32 i, int32 target);
void Print();
private:
inline void _EliminateColumn(int32 column, int32 startRow,
int32 endRow);
int32* fRowIndices;
int32* fColumnIndices;
double** fMatrix;
double* fB;
int32 fRows;
int32 fColumns;
};
class ActiveSetSolver : public LinearProgramming::SolverInterface {
public:
ActiveSetSolver(LinearSpec* linearSpec);
~ActiveSetSolver();
ResultType Solve();
bool VariableAdded(Variable* variable);
bool VariableRemoved(Variable* variable);
bool VariableRangeChanged(Variable* variable);
bool ConstraintAdded(Constraint* constraint);
bool ConstraintRemoved(Constraint* constraint);
bool LeftSideChanged(Constraint* constraint);
bool RightSideChanged(Constraint* constraint);
bool OperatorChanged(Constraint* constraint);
bool PenaltiesChanged(Constraint* constraint);
bool SaveModel(const char* fileName);
ResultType FindMaxs(const VariableList* variables);
ResultType FindMins(const VariableList* variables);
void GetRangeConstraints(const Variable* var,
const Constraint** _min,
const Constraint** _max) const;
private:
void _RemoveSoftConstraint(ConstraintList& list);
void _AddSoftConstraint(const ConstraintList& list);
typedef Constraint* (*AddConstraintFunc)(LinearSpec* spec, Variable* var);
ResultType _FindWithConstraintsNoSoft(
const VariableList* variables,
AddConstraintFunc constraintFunc);
const VariableList& fVariables;
const ConstraintList& fConstraints;
ConstraintList fVariableGEConstraints;
ConstraintList fVariableLEConstraints;
};
#endif