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;
}