|
|
|
@ -90,7 +90,7 @@ static void swap_columns(Mat_<double>& A,int col1,int col2); |
|
|
|
|
#define SWAP(type,a,b) {type tmp=(a);(a)=(b);(b)=tmp;} |
|
|
|
|
|
|
|
|
|
//return codes:-2 (no_sol - unbdd),-1(no_sol - unfsbl), 0(single_sol), 1(multiple_sol=>least_l2_norm)
|
|
|
|
|
int solveLP(const Mat& Func, const Mat& Constr, Mat& z){ |
|
|
|
|
int solveLP(const Mat& Func, const Mat& Constr, Mat& z, double constr_eps){ |
|
|
|
|
dprintf(("call to solveLP\n")); |
|
|
|
|
|
|
|
|
|
//sanity check (size, type, no. of channels)
|
|
|
|
@ -140,9 +140,24 @@ int solveLP(const Mat& Func, const Mat& Constr, Mat& z){ |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//check constraints feasibility
|
|
|
|
|
Mat prod = Constr(Rect(0, 0, Constr.cols - 1, Constr.rows)) * z; |
|
|
|
|
Mat constr_check = Constr.col(Constr.cols - 1) - prod; |
|
|
|
|
double min_value = 0.0; |
|
|
|
|
minMaxIdx(constr_check, &min_value); |
|
|
|
|
if (min_value < -constr_eps) |
|
|
|
|
{ |
|
|
|
|
return SOLVELP_LOST; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
CV_EXPORTS_W int solveLP(const Mat& Func, const Mat& Constr, Mat& z) |
|
|
|
|
{ |
|
|
|
|
return solveLP(Func, Constr, z, 1e-12); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int initialize_simplex(Mat_<double>& c, Mat_<double>& b,double& v,vector<int>& N,vector<int>& B,vector<unsigned int>& indexToRow){ |
|
|
|
|
N.resize(c.cols); |
|
|
|
|
N[0]=0; |
|
|
|
@ -255,7 +270,7 @@ static int inner_simplex(Mat_<double>& c, Mat_<double>& b,double& v,vector<int>& |
|
|
|
|
dprintf(("iteration #%d\n",count)); |
|
|
|
|
count++; |
|
|
|
|
|
|
|
|
|
static MatIterator_<double> pos_ptr; |
|
|
|
|
MatIterator_<double> pos_ptr; |
|
|
|
|
int e=-1,pos_ctr=0,min_var=INT_MAX; |
|
|
|
|
bool all_nonzero=true; |
|
|
|
|
for(pos_ptr=c.begin();pos_ptr!=c.end();pos_ptr++,pos_ctr++){ |
|
|
|
|