|
'ElMo-Knock'
|
00001 #include <math.h> 00002 #include <iostream> 00003 #include <fstream> // file I/O 00004 #include <float.h> 00005 #include <limits.h> 00006 #include <algorithm> 00007 #include <string> 00008 #include <cctype> 00009 #ifdef PARALLEL 00010 #include <mpi.h> 00011 #elif defined(WIN) 00012 #include <time.h> 00013 #else 00014 #include <sys/time.h> 00015 #endif 00016 00017 #include "util.h" 00018 00019 using namespace std; 00020 00021 bool util::strcmp_ignore_case(string first, string second) { 00022 00023 // Convert both strings to upper case by transfrom() before compare. 00024 std::transform(first.begin(), first.end(), first.begin(), static_cast < int(*)(int) > (toupper)); 00025 std::transform(second.begin(), second.end(), second.begin(), static_cast < int(*)(int) > (toupper)); 00026 00027 if (first == second) 00028 return true; 00029 else 00030 return false; 00031 } 00032 00033 int util::current_time(double *t) { 00034 00035 00036 #ifdef PARALLEL 00037 00038 *t=MPI_Wtime(); 00039 #elif defined(__GNUG__) 00040 00041 struct timeval tv; 00042 struct timezone tz; 00043 00044 gettimeofday(&tv,&tz); 00045 *t=(double)tv.tv_sec+(double)tv.tv_usec/1000000.0; 00046 #elif defined(_WIN32) 00047 *t=clock() / CLOCKS_PER_SEC; 00048 #endif 00049 00050 00051 return 0; 00052 } 00053 00054 00055 int util::get_proc_id_nump(int &proc_id,int &nump) { 00056 proc_id=0; nump=1; 00057 #ifdef PARALLEL 00058 MPI_Comm_size(MPI_COMM_WORLD,&nump); 00059 MPI_Comm_rank(MPI_COMM_WORLD,&proc_id); 00060 #endif 00061 return 0; 00062 } 00063 00064 string util::get_time_str() { 00065 00066 time_t rawtime; 00067 struct tm * timeinfo; 00068 time ( &rawtime ); 00069 timeinfo = localtime ( &rawtime ); 00070 string str=asctime(timeinfo); 00071 str.erase(std::remove(str.begin(), str.end(), '\n'), str.end()); 00072 00073 return str; 00074 } 00075 void util::fast_gcd(double *a, t_UnsignedInt len, double *gcd) { 00076 double g=a[0],y,r; 00077 t_UnsignedInt k; 00078 00079 g=a[0]; 00080 00081 for (k = 0;k<len-1;k++) { 00082 00083 y = a[k+1]; 00084 while (y > 0) { 00085 r = g - y * floor(g / y); 00086 g = y; 00087 y = r; 00088 } 00089 if (g == (double)1.0) { 00090 *gcd=g; 00091 return; 00092 } 00093 00094 } 00095 *gcd=g; 00096 00097 } 00098 double util::infnormvec(vector< vector<double> > A) { 00099 t_UnsignedInt i, j; 00100 00101 double s,max_s; 00102 if (A.size()==0) 00103 return 0; 00104 00105 t_UnsignedInt m, n; 00106 m=A.size(); n=A[0].size(); 00107 00108 for (j=0,max_s=0;j<n;j++) 00109 max_s+=fabs(A[0][j]); 00110 00111 for (i=1;i<m;i++) { 00112 for (j=0,s=0;j<n;j++) 00113 s+=fabs(A[i][j]); 00114 00115 if (s>max_s) 00116 max_s=s; 00117 } 00118 00119 return max_s; 00120 } 00121 int util::right_nullspace_integer(vector< vector<double> > &A, vector< vector<double> > &K) { 00122 00123 t_UnsignedInt m, n; 00124 m=A.size(); n=A[0].size(); 00125 00126 double tol,eps=2.2204e-16; 00127 vector< vector<double> > tab((m+n), vector<double>((n),0)); 00128 vector<double> mc; 00129 vector<t_UnsignedInt> ic,rws, re_rows, re_cols,unused; 00130 00131 t_UnsignedInt i,j,k ; 00132 double *a_gcd, piv_el,min_el; 00133 t_UnsignedInt piv_c_ind,piv_r_ind,piv_r,piv_c; 00134 t_UnsignedInt col; 00135 00136 vector<t_UnsignedInt> search_cols; //, search_cols_size; 00137 00138 t_UnsignedInt tmp_el,kn_cols=0,all_zeros; 00139 double g, fp, fo; 00140 00141 if (m==0 || n==0) { 00142 return 0; 00143 } 00144 00145 for (i=0;i<m+n;i++) { 00146 if (i<m) { 00147 for (j=0;j<n;j++) 00148 tab[i][j]=A[i][j]; 00149 } else { 00150 for (j=0;j<n;j++) 00151 tab[i][j]=0; 00152 tab[i][i-m]=1; 00153 } 00154 } 00155 00156 00157 00158 tol=0; 00159 00160 re_rows.resize(m); 00161 re_cols.resize(n); 00162 00163 for (i=0;i<re_rows.size();i++) 00164 re_rows[i]=i; 00165 for (i=0;i<re_cols.size();i++) 00166 re_cols[i]=i; 00167 for (i=0;i<n;i++) 00168 unused.push_back(1); 00169 00170 //----------------- 00171 while (re_rows.size()>0 && re_cols.size()>0) { 00172 00173 //if (prior_cols.size()==0) { 00174 search_cols.resize(re_cols.size()); 00175 for (i=0;i<re_cols.size();i++) 00176 search_cols[i]=re_cols[i]; 00177 /* 00178 } else { 00179 //search_cols=prior_cols; 00180 search_cols.resize(prior_cols.size()); 00181 for (i=0;i<prior_cols.size();i++) 00182 search_cols[i]=prior_cols[i]; 00183 } 00184 */ 00185 00186 00187 //tmp=fabs(tab(re_rows, search_cols)); 00188 vector< vector<double> > tmp(re_rows.size(),vector<double>(search_cols.size())); 00189 00190 for (i=0;i<re_rows.size();i++) { 00191 for (j=0;j<search_cols.size();j++) { 00192 tmp[i][j]=fabs(tab[re_rows[i]][search_cols[j]]); 00193 if (tmp[i][j]==0) 00194 tmp[i][j]=FLT_MAX; //tmp(tmp==0)=+inf; 00195 } 00196 } 00197 00198 //[mc,ic]=min(tmp); //mc is min value in a column, ic is the index of the row of the max value in the column 00199 mc.resize(search_cols.size()); 00200 ic.resize(search_cols.size()); 00201 00202 for (j=0;j<search_cols.size();j++) 00203 for (i=1,mc[j]=tmp[0][j],ic[j]=0;i<re_rows.size();i++) { 00204 if (tmp[i][j]<mc[j]) { 00205 mc[j]=tmp[i][j]; 00206 ic[j]=i; 00207 } 00208 } 00209 00210 if (re_rows.size()==1) { 00211 for (i=1,min_el=mc[0];i<search_cols.size();i++) 00212 if (mc[i]<min_el) { 00213 ic[0]=i; 00214 min_el=mc[i]; 00215 } 00216 //mc_size=1; 00217 mc.resize(1); 00218 mc[0]=min_el; 00219 } 00220 00221 //[piv_el,piv_c_ind]=min(mc); 00222 for (i=1,piv_el=mc[0],piv_c_ind=0;i<mc.size();i++) 00223 if (mc[i]<piv_el) { 00224 piv_el=mc[i]; 00225 piv_c_ind=i; 00226 } 00227 //piv_r_ind=ic(piv_c_ind); 00228 piv_r_ind=ic[piv_c_ind]; 00229 00230 if (piv_el==FLT_MAX) 00231 piv_el=0; 00232 00233 //for (i=0;i<re_rows.size();i++) 00234 // custom_free(tmp[i]); 00235 //custom_free(tmp); 00236 00237 if (re_rows.size()==1) { 00238 piv_r_ind=0; 00239 piv_c_ind=ic[0]; 00240 } 00241 ic.clear(); 00242 00243 piv_c=search_cols[piv_c_ind]; 00244 piv_r=re_rows[piv_r_ind]; 00245 00246 /* 00247 if (prior_cols.size()!=0) { 00248 //prior_cols[piv_c_ind]=[]; 00249 for (i=piv_c_ind;i<prior_cols.size()-1;i++) 00250 prior_cols[i]=prior_cols[i+1]; 00251 prior_cols.resize(prior_cols.size()-1); 00252 00253 } 00254 */ 00255 00256 //j=find(re_cols==piv_c) POSSIBLY INCORECT 00257 for (i=0;i<re_cols.size();i++) 00258 if (re_cols[i]==piv_c) { 00259 j=i; 00260 break; 00261 } 00262 //re_cols[j]=[] 00263 for (i=j;i<re_cols.size()-1;i++) 00264 re_cols[i]=re_cols[i+1]; 00265 re_cols.resize(re_cols.size()-1); 00266 00267 if (piv_el<=tol) { 00268 for (i=0;i<re_rows.size();i++) 00269 tab[re_rows[i]][piv_c]=0; 00270 continue; 00271 } 00272 00273 unused[piv_c]=0; 00274 //unused[piv_c]=1; 00275 piv_el=tab[piv_r][piv_c]; 00276 00277 //rws=custom_malloc((re_rows_size+tab_m-m),t_UnsignedInt,__FILE__,__LINE__); 00278 //rws_size=re_rows_size+tab_m-m; 00279 rws.resize(re_rows.size()+n); //tab_m-m); 00280 //rws= [re_rows, (m+1):tab_m]; 00281 for (i=0;i<rws.size();i++) { 00282 if (i<re_rows.size()) 00283 rws[i]=re_rows[i]; 00284 else 00285 rws[i]=i-re_rows.size()+m; 00286 00287 00288 } 00289 00290 for (i=piv_r_ind;i<re_rows.size()-1;i++) 00291 re_rows[i]=re_rows[i+1]; 00292 re_rows.resize(re_rows.size()-1); 00293 00294 unused[piv_c]=0; 00295 //unused[piv_c]=1; 00296 00297 for (j=0;j<re_cols.size();j++) { 00298 col=re_cols[j]; 00299 00300 00301 //a_gcd=custom_malloc(10,double,__FILE__,__LINE__); 00302 a_gcd=new double[10]; 00303 //a_gcd[0]=1; a_gcd[1]=2; 00304 a_gcd[0]=fabs(tab[piv_r][col]); 00305 a_gcd[1]=fabs(piv_el); 00306 fast_gcd(a_gcd,2,&g); //modified 00307 delete [] a_gcd; // delete [] a_gcd; //free(a_gcd); 00308 fp=tab[piv_r][col]/g; 00309 fo=piv_el/g; 00310 //printf tab 00311 00312 for (i=0;i<rws.size();i++) 00313 tab[rws[i]][col]=fo*tab[rws[i]][col]-fp*tab[rws[i]][piv_c]; 00314 00315 //a_gcd=custom_malloc(rws.size(),double,__FILE__,__LINE__); 00316 a_gcd=new double[rws.size()]; 00317 for (i=0;i<rws.size();i++) 00318 a_gcd[i]=fabs(tab[rws[i]][col]); 00319 fast_gcd(a_gcd,rws.size(),&g); //modified 00320 00321 for (i=0;i<rws.size();i++) 00322 tab[rws[i]][col]/=g; 00323 00324 delete [] a_gcd; //delete [] a_gcd; // free(a_gcd); 00325 00326 } 00327 rws.clear(); 00328 //custom_free(rws); //delete [] rws;// free(rws); //FREED 00329 } 00330 00331 if (m == 1) { 00332 // K= tab(2:tab_m, ~tab(1, :)); 00333 00334 // tab(1..m+n-1; 00335 // TO DO 00336 cout << endl << "here"; 00337 00338 } else { 00339 //K= tab((m+1):tab_m, ~any(tab(1:m, :))); 00340 for (i=0,kn_cols=0;i<n;i++) { 00341 for (j=0,all_zeros=1;j<m;j++) 00342 if (tab[j][i]) { 00343 all_zeros=0; 00344 break; 00345 } 00346 if (all_zeros) 00347 kn_cols++; 00348 } 00349 00350 vector<t_UnsignedInt> kn_cols_ind; 00351 //t_UnsignedInt *kn_cols_ind=custom_malloc(kn_cols,t_UnsignedInt,__FILE__,__LINE__); 00352 kn_cols_ind.resize(kn_cols); 00353 00354 00355 for (i=0,kn_cols=0;i<n;i++) { 00356 for (j=0,all_zeros=1;j<m;j++) 00357 if (tab[j][i]) { 00358 all_zeros=0; 00359 break; 00360 } 00361 if (all_zeros) 00362 kn_cols_ind[kn_cols++]=i; 00363 } 00364 00365 K.resize(kn_cols, vector<double>(n)); 00366 for (i=0;i<kn_cols;i++) 00367 for (j=0;j<n;j++) 00368 K[i][j]=tab[j+m][kn_cols_ind[i]]; 00369 } 00370 00371 t_UnsignedInt ii=0; 00372 for (i=0, ii=0;i<n;i++) 00373 if (unused[i]) 00374 unused[ii++]=i; 00375 unused.resize(ii); 00376 tab.clear(); 00377 re_rows.clear(); 00378 re_cols.clear(); 00379 00381 double elem; 00382 for (i=0;i<unused.size();i++) { 00383 //inspect row K[unused[i]] 00384 for (j=0;j<K.size();j++) { 00385 if (K[j][unused[i]]!=0) { 00386 col=j; 00387 elem=K[j][unused[i]]; 00388 break; 00389 } 00390 } 00391 for (j=0;j<n;j++) 00392 K[col][j]=K[col][j]/elem; 00393 } 00395 /* 00396 double big_sum=0; 00397 for (i=0;i<A.size();i++) 00398 for (j=0;j<K.size();j++) { 00399 double part_sum; 00400 for ( k=0, part_sum=0;k<A[0].size();k++) 00401 part_sum+=A[i][k]*K[j][k]; 00402 big_sum+=fabs(part_sum); 00403 } 00404 */ 00405 00406 //cout << endl <<"(right_nullspace_integer) big_sum: "<<big_sum<<endl; 00407 00408 00409 return 0; 00410 } 00411 int util::right_nullspace_nonint(vector< vector<double> > &A, vector< vector<double> > &K) { 00412 00413 t_UnsignedInt m, n; 00414 m=A.size(); n=A[0].size(); 00415 00416 double tol,eps=1e-15; //2.2204e-16; //, **tmp; 00417 vector< vector<double> > tab((m+n), vector<double>((n),0)); 00418 vector<double> mc; 00419 vector<t_UnsignedInt> ic,rws, re_rows, re_cols; 00420 00421 t_UnsignedInt i,j,k ; 00422 double piv_el,min_el; 00423 t_UnsignedInt piv_c_ind,piv_r_ind,piv_r,piv_c; 00424 t_UnsignedInt col; 00425 00426 vector<t_UnsignedInt> search_cols; //, search_cols_size; 00427 00428 t_UnsignedInt kn_cols=0,all_zeros; 00429 double tmp_el; 00430 00431 if (m==0 || n==0) 00432 return 0; 00433 00434 00435 for (i=0;i<m+n;i++) { 00436 if (i<m) { 00437 for (j=0;j<n;j++) 00438 tab[i][j]=A[i][j]; 00439 } else { 00440 for (j=0;j<n;j++) 00441 tab[i][j]=0; 00442 tab[i][i-m]=1; 00443 } 00444 } 00445 00446 00447 00448 tol=eps*max(m,n)*infnormvec(A); //inf The infinity norm, or largest row sum of A, max(sum(abs(A'))). 00449 00450 re_rows.resize(m); 00451 re_cols.resize(n); 00452 00453 for (i=0;i<re_rows.size();i++) 00454 re_rows[i]=i; 00455 for (i=0;i<re_cols.size();i++) 00456 re_cols[i]=i; 00457 00458 while (re_rows.size()>0 && re_cols.size()>0) { 00459 00460 search_cols.resize(re_cols.size()); 00461 for (i=0;i<re_cols.size();i++) 00462 search_cols[i]=re_cols[i]; 00463 00464 00465 //[mc,ic]=max(tmp); //mc is min value in a column, ic is the index of the row of the max value in the column 00466 mc.resize(search_cols.size()); 00467 ic.resize(search_cols.size()); 00468 00469 for (j=0;j<search_cols.size();j++) { 00470 //mc[j]=tmp[re_rows[0]][search_cols[j]]; 00471 mc[j]=fabs(tab[re_rows[0]][search_cols[j]]); 00472 ic[j]=0; 00473 for (i=1;i<re_rows.size();i++) { 00474 double elem=fabs(tab[re_rows[i]][search_cols[j]]); 00475 if (elem>mc[j]) { 00476 00477 mc[j]=elem; 00478 ic[j]=i; 00479 00480 } 00481 } 00482 } 00483 00484 //[piv_el,piv_c_ind]=max(mc); 00485 for (i=1,piv_el=mc[0],piv_c_ind=0;i<search_cols.size();i++) 00486 if (mc[i]>piv_el) { 00487 piv_el=mc[i]; 00488 piv_c_ind=i; 00489 } 00490 00491 00492 //piv_r_ind=ic(piv_c_ind); 00493 piv_r_ind=ic[piv_c_ind]; 00494 00495 mc.clear(); 00496 00497 if (re_rows.size()==1) { 00498 piv_r_ind=0; 00499 piv_c_ind=ic[0]; 00500 } 00501 ic.clear(); 00502 00503 piv_c=search_cols[piv_c_ind]; 00504 piv_r=re_rows[piv_r_ind]; 00505 00506 //j=find(re_cols==piv_c) POSSIBLY INCORECT 00507 for (i=0;i<re_cols.size();i++) 00508 if (re_cols[i]==piv_c) { 00509 j=i; 00510 break; 00511 } 00512 //re_cols[j]=[] 00513 for (i=j;i<re_cols.size()-1;i++) 00514 re_cols[i]=re_cols[i+1]; 00515 re_cols.resize(re_cols.size()-1); 00516 00517 if (piv_el<=tol) { 00518 for (i=0;i<re_rows.size();i++) 00519 tab[re_rows[i]][piv_c]=0; 00520 continue; 00521 } 00522 00523 piv_el=tab[piv_r][piv_c]; 00524 00525 //rws_size=re_rows_size+tab_m-m; 00526 rws.resize(re_rows.size()+n); //tab_m-m); 00527 //rws= [re_rows, (m+1):tab_m]; 00528 00529 for (i=0;i<rws.size();i++) { 00530 if (i<re_rows.size()) 00531 rws[i]=re_rows[i]; 00532 else 00533 rws[i]=i-re_rows.size()+m; 00534 00535 } 00536 00537 00538 for (i=0;i<rws.size();i++) 00539 tab[rws[i]][piv_c]=tab[rws[i]][piv_c]/piv_el; 00540 00541 for (i=piv_r_ind;i<re_rows.size()-1;i++) 00542 re_rows[i]=re_rows[i+1]; 00543 re_rows.resize(re_rows.size()-1); 00544 00545 for (j=0;j<re_cols.size();j++) { 00546 col=re_cols[j]; 00547 tmp_el=tab[piv_r][col]; 00548 for (i=0;i<rws.size();i++) 00549 tab[rws[i]][col]-=tmp_el*tab[rws[i]][piv_c]; 00550 for (i=0;i<rws.size();i++) 00551 if (fabs(tab[rws[i]][col])<=tol) 00552 tab[rws[i]][col]=0; 00553 } 00554 00555 rws.clear(); 00556 00557 } 00558 00559 if (m == 1) { 00560 // K= tab(2:tab_m, ~tab(1, :)); 00561 00562 // tab(1..m+n-1; 00563 // TO DO 00564 00565 } else { 00566 //K= tab((m+1):tab_m, ~any(tab(1:m, :))); 00567 /* 00568 for (i=0,kn_cols=0;i<n;i++) { 00569 for (j=0,all_zeros=1;j<m;j++) 00570 if (tab[j][i]) { 00571 all_zeros=0; 00572 break; 00573 } 00574 if (all_zeros) 00575 kn_cols++; 00576 } 00577 */ 00578 00579 vector<t_UnsignedInt> kn_cols_ind; 00580 //t_UnsignedInt *kn_cols_ind=custom_malloc(kn_cols,t_UnsignedInt,__FILE__,__LINE__); 00581 kn_cols_ind.resize(kn_cols); 00582 00583 00584 for (i=0,kn_cols=0;i<n;i++) { 00585 for (j=0,all_zeros=1;j<m;j++) 00586 if (tab[j][i]) { 00587 all_zeros=0; 00588 break; 00589 } 00590 if (all_zeros) 00591 kn_cols_ind.push_back(i); 00592 //kn_cols_ind[kn_cols++]=i; 00593 } 00594 00595 //K.resize(kn_cols, vector<double>(n)); 00596 K.resize(kn_cols_ind.size(), vector<double>(n)); 00597 for (i=0;i<kn_cols_ind.size();i++) 00598 for (j=0;j<n;j++) 00599 K[i][j]=tab[j+m][kn_cols_ind[i]]; 00600 } 00601 00602 return 0; 00603 } 00604 00605 t_UnsignedInt util::row_echelon(vector< vector<double> > mat, t_UnsignedInt reduced, vector<t_UnsignedInt> rowmap, vector<t_UnsignedInt> colmap) { 00606 00607 t_UnsignedInt m,n; 00608 m=mat.size();n=mat[0].size(); 00609 t_UnsignedInt rows=m, cols=n; 00610 t_UnsignedInt prows=(rowmap.size()==0)? m : minval(m,rowmap.size()); 00611 t_UnsignedInt pcols=(colmap.size()==0)? n : minval(n,colmap.size()); 00612 t_UnsignedInt pivs=minval(prows,pcols); 00613 00614 double mTolerance=1e-15; 00615 t_UnsignedInt tmp; 00616 00617 t_UnsignedInt prow=-1, pcol=-1; 00618 //int prow=-1, pcol=-1; 00619 double pval=-DBL_MAX; 00620 for (t_UnsignedInt row=0;row<prows;row++) { 00621 for (t_UnsignedInt col=0;col<pcols;col++) { 00622 double val=fabs(mat[row][col]); 00623 if (val>pval) { 00624 pval=val; 00625 prow=row; 00626 pcol=col; 00627 } 00628 } 00629 } 00630 00631 00632 for (t_UnsignedInt pivot=0;pivot<pivs;pivot++) { 00633 if (pval<=mTolerance) 00634 return pivot; 00635 if (prow!=pivot) { 00636 swap_rows(mat,prow,pivot); 00637 if (rowmap.size()>0) { 00638 tmp=rowmap[prow]; 00639 rowmap[prow]=rowmap[pivot]; 00640 rowmap[pivot]=tmp; 00641 } 00642 } 00643 if (pcol!=pivot) { 00644 swap_columns(mat,pcol,pivot); 00645 if (colmap.size()>0) { 00646 tmp=colmap[pcol]; 00647 colmap[pcol]=colmap[pivot]; 00648 colmap[pivot]=tmp; 00649 } 00650 } 00651 pval=mat[pivot][pivot]; 00652 for (t_UnsignedInt col=pivot+1;col<cols;col++) 00653 mat[pivot][col]*=1.0/pval; 00654 mat[pivot][pivot]=1.0; 00655 pval=-DBL_MAX; 00656 for (t_UnsignedInt row=pivot+1;row<rows;row++) { 00657 double rpiv=mat[row][pivot]; 00658 mat[row][pivot]=0; 00659 for (t_UnsignedInt col=pivot+1;col<cols;col++) { 00660 double val=mat[row][col]; 00661 double sub=mat[pivot][col]; 00662 val-=sub*rpiv; 00663 mat[row][col]=val; 00664 if (row<prows && col<pcols) { 00665 if (val<0) val=-val; 00666 if (val>pval) { 00667 pval=val; 00668 prow=row; 00669 pcol=col; 00670 } 00671 } 00672 } 00673 } 00674 if (reduced) { 00675 for (t_UnsignedInt row=0;row<pivot;row++) { 00676 double rpiv=mat[row][pivot]; 00677 mat[row][pivot]=0; 00678 for (t_UnsignedInt col=pivot+1;col<cols;col++) { 00679 double val=mat[row][col]; 00680 double sub=mat[pivot][col]; 00681 mat[row][col]=val-sub*rpiv; 00682 } 00683 } 00684 } 00685 } 00686 00687 return pivs; 00688 00689 } 00690 00691 int util::swap_rows(vector< vector<double> > &mat, t_UnsignedInt row1, t_UnsignedInt row2) { 00692 00693 double tmp; 00694 t_UnsignedInt m,n; 00695 00696 m=mat.size(); 00697 if (mat.size()==0) 00698 return -1; 00699 n=mat[0].size(); 00700 00701 if ((row1>=m) || (row2>=m)) { 00702 printf("\nswap_rows: Incorrect row values."); 00703 return -1; 00704 } 00705 00706 for (t_UnsignedInt i=0;i<n;i++) { 00707 tmp=mat[row1][i]; 00708 mat[row1][i]=mat[row2][i]; 00709 mat[row2][i]=tmp; 00710 } 00711 return 0; 00712 } 00713 int util::swap_columns(vector< vector<double> > &mat, t_UnsignedInt col1, t_UnsignedInt col2) { 00714 00715 double tmp; 00716 t_UnsignedInt i,m,n; 00717 00718 m=mat.size(); 00719 if (mat.size()==0) 00720 return -1; 00721 n=mat[0].size(); 00722 00723 00724 if ((col1>=n) || (col2>=n)) { 00725 printf("\nswap_columns: Incorrect column index values."); 00726 return -1; 00727 } 00728 00729 for (i=0;i<m;i++) { 00730 tmp=mat[i][col1]; 00731 mat[i][col1]=mat[i][col2]; 00732 mat[i][col2]=tmp; 00733 } 00734 return 0; 00735 } 00736 00737 int util::nullspace(vector< vector<double> > mat, vector< vector<double> > &kernel) { 00738 00739 t_UnsignedInt m, n,ndim; 00740 //find dimensions of matrix (m,n). CONTROL missing! 00741 m=mat.size(); n=mat[0].size(); 00742 00743 00744 t_UnsignedInt i,j,rank; 00745 vector< vector<double> > rref; 00746 vector<t_UnsignedInt> rowmap,colmap; //*rowmap, rowmap_len, *colmap, colmap_len; 00747 00748 //rowmap_len=0;rowmap=NULL; 00749 //colmap_len=n; 00750 rowmap.resize(0); 00751 colmap.resize(n); 00752 00753 //colmap=custom_malloc(colmap_len,t_UnsignedInt,__FILE__,__LINE__); 00754 for (i=0;i<colmap.size();i++) 00755 colmap[i]=i; 00756 00757 //rref=custom_malloc(m,double*,__FILE__,__LINE__); 00758 rref.resize(m,vector<double>(n,0)); 00759 00760 for (i=0;i<m;i++) { 00761 //rref[i]=custom_malloc(n,double,__FILE__,__LINE__); 00762 for (j=0;j<n;j++) 00763 rref[i][j]=mat[i][j]; 00764 } 00765 00766 //find row echelon form of the matrix mat. 00767 rank=row_echelon(rref,1,rowmap,colmap); 00768 //store nullity of the matrix mat in ndim 00769 ndim=n-rank; 00770 00771 //allocate space for nullspace matrix 00772 kernel.resize(n,vector<double>(ndim,0)); 00773 for (i=0;i<n;i++) 00774 for (j=0;j<ndim;j++) 00775 kernel[i][j]=0; 00776 00777 00778 00779 //initialize values in the nullspace matrix 'kernel' 00780 for (t_UnsignedInt row=0;row<rank;row++) { 00781 for (t_UnsignedInt col=0;col<ndim;col++) { 00782 kernel[colmap[row]][col]=-rref[row][col+rank]; 00783 } 00784 } 00785 for (t_UnsignedInt row=0;row<ndim;row++) 00786 kernel[colmap[row+rank]][row]=1.0; 00787 00788 00789 return 0; 00790 00791 } 00792 00793 00794 00795 bool util::file_exists(const string &fname ) { 00796 00797 return ifstream( fname.c_str() ).is_open(); 00798 00799 }