#include <ilcplex/ilocplex.h>

ILOSTLBEGIN

int main()

{
	IloEnv env;

	try {

		ofstream wf;
		
		wf.open("Test_ILP.txt", ios::out | ios::app);

		IloModel model(env);
		IloCplex cplex(model);

		IloNumVar P00(env, 0.0, 1.0, IloNumVar::Float, "P00");
		IloNumVar P10(env, 0.0, 1.0, IloNumVar::Float, "P10");
		IloNumVar P20(env, 0.0, 1.0, IloNumVar::Float, "P20");
		IloNumVar P01(env, 0.0, 1.0, IloNumVar::Float, "P01");
		IloNumVar P11(env, 0.0, 1.0, IloNumVar::Float, "P11");
		IloNumVar P02(env, 0.0, 1.0, IloNumVar::Float, "P02");

		////* Display */
		//cplex.setParam(IloCplex::SimDisplay, 0);

		/*	Constraint	*/
		model.add(2*P00 - P10 == 0);
		model.add(2*P00 + (4/3)*P20 + P01 - 3*P10 == 0);
		model.add(P10 + (19/24)*P11 - (10/3)*P20 == 0);
		model.add(P10 + (2/3)*P11 - 2*P01 == 0);
		model.add(2*P20 + P01 + (19/12)*P02 - (59/24)*P11 == 0);
		model.add(P11 - (19/12)*P02 == 0);
		model.add(P00 + P10 + P20 + P01 + P11 + P02 - 1 == 0);

		//IloExpr Thsum(env);
		//Thsum = (0+0)*0.1*P00 + (1+0)*0.1*P10 + (4/3+0)*0.1*P20 + (0+1)*0.1*P01 + (2/3 + 19/24)*0.1*P11 + (0+19/12)*0.1*P02;
		//model.add(IloMaximize(env, Thsum));
		//Thsum.end();

		cplex.solve();

		//wf << "ObjectValue: " << cplex.getObjValue() << endl;
		wf << "P00: " << cplex.getValue(P00) << endl ;
		wf << "P10: " << cplex.getValue(P10) << endl ;
		wf << "P20: " << cplex.getValue(P20) << endl ;
		wf << "P01: " << cplex.getValue(P01) << endl ;
		wf << "P11: " << cplex.getValue(P11) << endl ;
		wf << "P02: " << cplex.getValue(P02) << endl ;

		//env.out() << "ObjectValue: " << cplex.getObjValue() << endl;
		env.out() << "P00: " << cplex.getValue(P00) << endl ;
		env.out() << "P10: " << cplex.getValue(P10) << endl ;
		env.out() << "P20: " << cplex.getValue(P20) << endl ;
		env.out() << "P01: " << cplex.getValue(P01) << endl ;
		env.out() << "P11: " << cplex.getValue(P11) << endl ;
		env.out() << "P02: " << cplex.getValue(P02) << endl ;
		
		env.end();

		wf.close();

		} catch (IloException& e) {
		cerr << "Concert Exception: " << e << endl;
	} 

	
}//main

