intutils.cpp
#include "intutils.h"

DVector Mid(const IVector & x){
  DVector res(x.dimension());
  for (int i=0;i<x.dimension();++i) res[i]=Mid(x[i]);
  return res;
}

DVector Inf(const IVector & x){
  DVector res(x.dimension());
  for (int i=0;i<x.dimension();++i) res[i]=Inf(x[i]);
  return res;
}

DVector Sup(const IVector & x){
  DVector res(x.dimension());
  for (int i=0;i<x.dimension();++i) res[i]=Sup(x[i]);
  return res;
}

MpVector Mid(const MpIVector & x){
  MpVector res(x.dimension());
  for (int i=0;i<x.dimension();++i) res[i]=Mid(x[i]);
  return res;
}

MpVector Inf(const MpIVector & x){
  MpVector res(x.dimension());
  for (int i=0;i<x.dimension();++i) res[i]=Inf(x[i]);
  return res;
}

MpVector Sup(const MpIVector & x){
  MpVector res(x.dimension());
  for (int i=0;i<x.dimension();++i) res[i]=Sup(x[i]);
  return res;
}

DMatrix Mid(const IMatrix & x){
  DMatrix res(x.numberOfRows(),x.numberOfColumns());
  for (int i=1;i<=x.numberOfRows();++i){
    for (int j=1;j<=x.numberOfColumns();++j){
      res(i,j)=Mid(x(i,j));
    }
  }
  return res;
}

MpMatrix Mid(const MpIMatrix & x){
  MpMatrix res(x.numberOfRows(),x.numberOfColumns());
  for (int i=1;i<=x.numberOfRows();++i){
    for (int j=1;j<=x.numberOfColumns();++j){
      res(i,j)=Mid(x(i,j));
    }
  }
  return res;
}

IMatrix Convert(const DMatrix & x){
  IMatrix res(x.numberOfRows(),x.numberOfColumns());
  for (int i=1;i<=x.numberOfRows();++i){
    for (int j=1;j<=x.numberOfColumns();++j){
      res(i,j)=x(i,j);
    }
  }
  return res;
}

MpIMatrix Convert(const MpMatrix & x){
  MpIMatrix res(x.numberOfRows(),x.numberOfColumns());
  for (int i=1;i<=x.numberOfRows();++i){
    for (int j=1;j<=x.numberOfColumns();++j){
      res(i,j)=x(i,j);
    }
  }
  return res;
}

IVector Hull(const IVector & x, const IVector & y){
  int d=x.dimension();
  if (d>y.dimension()) d=y.dimension();
  IVector res(d);
  for (int i=0;i<d;++i){
    res[i]=intervalHull(x[i],y[i]);
  }
  return res;
}

MpInterval mHull(MpFloat & x){
  return MpInterval(x);
}
  
double DiamInterval(Interval & x){
  return diam(x).rightBound();
}

MpFloat DiamInterval(MpInterval & x){
  return diam(x).rightBound();
}

double MaxDiamVector(const IVector & x){
  double res=0.0;
  for (int i=0;i<x.dimension();++i){
    interval d=diam(x[i]);
    if (d.rightBound()>res) res=d.rightBound();
  }
  return res;
}

MpFloat MaxDiamVector(const MpIVector & x){
  MpFloat res=0.0;
  for (int i=0;i<x.dimension();++i){
    MpInterval d=diam(x[i]);
    if (d.rightBound()>res) res=d.rightBound();
  }
  return res;
}

double MaxDiamMatrix(const IMatrix & x){
  double res=0.0;
  for (int i=1;i<=x.numberOfRows();++i){
    for (int j=1;j<=x.numberOfColumns();++j){
      interval d=diam(x(i,j));
      if (d.rightBound()>res) res=d.rightBound();
    }
  }
  return res;
}

MpFloat MaxDiamMatrix(const MpIMatrix & x){
  MpFloat res=0.0;
  for (int i=1;i<=x.numberOfRows();++i){
    for (int j=1;j<=x.numberOfColumns();++j){
      MpInterval d=diam(x(i,j));
      if (d.rightBound()>res) res=d.rightBound();
    }
  }
  return res;
}

vector <IVector> split(IVector & x, int xd, int yd){
  // split x into four parts in directions xd and yd
  vector <IVector> res;
  IVector xt=x;
  xt[xd]=Interval(Inf(x[xd]),Mid(x[xd]));
  xt[yd]=Interval(Inf(x[yd]),Mid(x[yd]));
  res.push_back(xt);
  xt[xd]=Interval(Inf(x[xd]),Mid(x[xd]));
  xt[yd]=Interval(Mid(x[yd]),Sup(x[yd]));
  res.push_back(xt);
  xt[xd]=Interval(Mid(x[xd]),Sup(x[xd]));
  xt[yd]=Interval(Inf(x[yd]),Mid(x[yd]));
  res.push_back(xt);
  xt[xd]=Interval(Mid(x[xd]),Sup(x[xd]));
  xt[yd]=Interval(Mid(x[yd]),Sup(x[yd]));
  res.push_back(xt);
  return res;
}

vector <IVector> splitmax(IVector & x){
  // split x into 2 parts along the direction where x is the widest
  int split_var=0;
  for (int d=1;d<x.dimension();++d){
    if (diam(x[d]).rightBound()>diam(x[split_var]).rightBound()) split_var=d;
  }
  vector <IVector> res;
  IVector xt=x;
  xt[split_var]=Interval(Inf(x[split_var]),Mid(x[split_var]));
  res.push_back(xt);
  xt[split_var]=Interval(Mid(x[split_var]),Sup(x[split_var]));
  res.push_back(xt);
  return res;
}