'ElMo-Knock'

util.cpp

Go to the documentation of this file.
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 } 
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines