#include "..\Modelib.h"

using namespace std;

int main( int argc, char ** argv)
{
  //---------------------------------------------------------
  //  Déclaration des variables
  //---------------------------------------------------------

  // déclaration de la classe Model qui va représenté le programme linéaire
  Model modele;

  //déclaration des variable dans le programme linéaire
  FloatVar x(modele,0,30.23,"prems"); // déclare une variable réelle son nom sera unknown1
  cout << "Le nom de la variable x est:" << x.GetName() << endl;

  /* manière équivalente:
  FloatVar x(modele)
  x.SetName("prems");
  x.SetLowerBound(0);
  x.SetUpperBound(30);
  */

  // déclaration d'une variable entiere
  IntVar iVar(modele,0,17,"i");

  // déclaration d'une variable booléene
  BoolVar bVar(modele,"b");

  // déclaration d'un vecteur de valeur:
  IntArray iVect(3,2);

  // déclaration d'un vecteur de variable:
  IntVarArray iVectVar(modele,3,0,50,"i");

  // déclaration d'une expression
  Expr e = iVect*iVectVar - Sum(iVectVar) + 3*(bVar - 4*iVar);

  //-----------------------------------------------------
  //  Manipulation du programme linéaire
  //-----------------------------------------------------

  //définition de la fonction objectif
   modele.Minimize( iVar + bVar*4 , "obj" );

   /* manière équivalente
   modele.Maximize( -4*bVar - iVar, "obj");
   */
   
   // On ajoute une contrainte d'égalité
   modele.Add( bVar == 1, "C1" );

   //On ajoute une contrainte d'infériorité
   modele.Add( e <= 20, Nom("C",2));

   //on ajoute une contrainte de supériorité
   modele.Add( iVar <= iVectVar[0] + 2*iVectVar[1] + 3*iVectVar[2], Nom("C",3) );

   cout << modele << endl;

  return 0;
}

