#ifndef __IMATRIX__
#define __IMATRIX__

#include <iostream.h>
#include <vector.h>
#include <math.h>
#include "interval.h"
#include "box.h"
#include "rmatrix.h"


#include "matrix_lib/tnt.h"
using namespace TNT;

#include "matrix_lib/jama_lu.h"
using namespace JAMA;


class imatrix
{
public:
	Array2D <interval> data;
//---------------------CONSTRUCTEURS--------------------------------------------
imatrix ();
imatrix (int,int);
imatrix (const rmatrix&);
imatrix (const box&);
imatrix (const imatrix&);
~imatrix ();
imatrix& operator=(const imatrix&);

interval GetVal (int,int) const;
void SetVal (int,int,interval);

int dim1 (void) const;
int dim2 (void) const;

//----------------------OPERATEURS----------------------------------------------
friend imatrix	operator+ (const imatrix&,const imatrix&);
friend imatrix	operator- (const imatrix&);
friend imatrix	operator- (const imatrix&,const imatrix&);
friend imatrix	operator* (const imatrix&,const imatrix&);
friend imatrix  operator* (const rmatrix& X,const imatrix& Y);
friend imatrix  operator*(const double a,const imatrix& X);

friend ostream& operator<<(ostream&, const imatrix&);
//-------------------FONCTIONS NON MEMBRES---------------------------------------


friend rmatrix Center	(const imatrix&);
friend box ToBox(const imatrix&);
friend box Column(const imatrix& B, int j);

friend imatrix RotationPhiThetaPsi(interval& phi, interval& theta, interval& psi);


/*friend double       Angle             (imatrix& ,imatrix&); // Il faut des vecteurs de dim 2
friend void         Update            (imatrix&);
friend imatrix          Rand              (const imatrix& X);
//friend void	    CheckRange	      (imatrix&,imatrix&);
friend interval     Determinant       (imatrix&, imatrix&);
friend bool         Emptyimatrix          (const imatrix&);
friend bool	    Disjoint	      (const imatrix&,const imatrix&);
friend reel         decrease          (const imatrix&, const imatrix&);
friend reel         decrease          (const imatrix&, const imatrix&, vector<int>);
friend reel         Eloignement       (imatrix&,imatrix&);
friend reel         Eloignement2      (imatrix&,imatrix&);
friend reel         EloignementRelatif2(imatrix&,imatrix&);
friend reel         Marge             (imatrix,imatrix);
friend iboolean	    In		      (imatrix,imatrix);
friend imatrix	    Inf 	      (imatrix);
friend imatrix	    Inflate 	      (imatrix&,reel);
friend imatrix	    Inter 	      (const imatrix&,const imatrix&);
friend imatrix          Concat            (const imatrix&, const imatrix&);
friend imatrix          Proj              (const imatrix&, int, int);
//friend void       Inter1            (imatrix&,imatrix&,const imatrix&,const imatrix&,const imatrix&);
friend interval     Norm              (imatrix);
friend interval     NormEuclid        (imatrix, imatrix);
friend interval     NormInf           (imatrix, imatrix);
friend void         Phi0              (imatrix&,imatrix*);             //0-intersection (voir qminimax)
friend void         Phi1              (imatrix&,imatrix&,imatrix*);       //1-intersection (voir qminimax)
friend void         Phi2              (imatrix&,imatrix&,imatrix&,imatrix*);  //2-intersection
friend interval     ProduitScalaire   (imatrix&,imatrix&);
friend bool         Prop              (imatrix&,imatrix&);
friend bool	    Subset	      (imatrix&,imatrix&);
friend bool	    Subset	      (imatrix&,imatrix&,reel);
friend bool         Isimatrix             (imatrix);
friend void         Sucre             (imatrix&,imatrix&);
friend imatrix	    Sup 	      (imatrix);
friend imatrix	    Union	      (imatrix&,imatrix&);
friend reel         Volume            (imatrix&);
friend reel	    Width	      (imatrix&);
friend reel	    Width	      (imatrix&,vector<int>&);
friend reel	    Width	      (imatrix&,imatrix&);
//friend imatrix          Zeros             (int,int);
//friend imatrix          Empty             (int);
//friend imatrix          Infinity          (int);   */
};
#endif
