#pragma once
#include <vector>
#include <algorithm>

using namespace std;

//Klasse zum Loesen einer Linearen Optimierungsaufgabe
//Minimierung der Zielfunktion

class loa
{
public:
	loa(void);
	~loa(void);

	loa( vector< vector< double > > simp_tab);//Konstruktor

	vector<double> loesung_komplett;
	vector<double> loesung;
	double zielwert;

	bool unloesbar;
	bool optimal;

	void solvePrimal(void);//Loesen eines primalen Simplextableaus
	void solveDual(void);//Loesen eines dualen Simplextableaus

private:

	vector<vector<double>> tableau;//Simplextableau
	int spaltenAnz;
	int zeilenAnz;

	//primal
	bool testeAufOptimalitaet();
	int waehlePivotspalte();
	void merkeVertauschungen(int pivotzeile, int pivotspalte, vector<int> &nichtBasisVariablen, vector<int> &basisVariablen);
	bool fuehreKantentestDurch(int pivotspalte);
	int waehlePivotzeile(int pivotspalte);
	vector<double> berechneLoesung(vector<int> nichtBasisVariablen, vector<int> basisVariablen);
	

	//dual
	bool testeZulaessigkeitUndOpt();
	int waehlePivotzeileDual();
	bool testeKonsistenz(int pivotzeile);
	int waehlePivotspalteDual(int pivotzeile);
	

	//primal und dual
	double berechneZielwert();
	void rechneSimplextableauUm(int pivotzeile, int pivotspalte);


};
