www.pudn.com > Genecircus20070919.rar > Monte_carlo.cpp


// Monte_carlo.cpp: implementation of the Monte_carlo class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "Monte_carlo.h" 
#define  M_SQRT2   1.41421356237309504880  
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
Monte_carlo::Monte_carlo() 
{ 
     max = 0.0; 
} 
 
Monte_carlo::~Monte_carlo() 
{ 
 
} 
 
void Monte_carlo::Find_appropriate_width_tolerance() 
{ 
	 gene g_temp; 
	 conn c_temp; 
     if(gene_matrix->micro_set.size() == 0) 
        return; 
	 if(shuffle->obj_index == -1) 
		return; 
	 if(read_object()){ 
		 for(double wid = 0.50;wid > 0.40;wid = wid-0.001){ 
			 getmi->sigma = wid; 
			 for(double tor = 0.85;tor<0.9;tor = tor-0.001){ 
				 getnetwork->tolerance = tor; 
				 clear_eniverment(); 
				 comput_mi(shuffle->obj_index,gene_matrix->micro_set.size()); 
				 getnetwork->Get(); 
				 g_temp = net->g; 
				 c_temp = net->c; 
				 clear_eniverment(); 
				 comput_mi(shuffle->obj_index1,gene_matrix->micro_set.size()); 
				 getnetwork->Get(); 
				 double max_temp = check(g_temp,net->g); 
				 compare_save(max_temp); 
			 } 
		 } 
	 } 
} 
 
void Monte_carlo::compare_save(double max_temp) 
{ 
	 if(max < max_temp) 
		max = max_temp; 
	 string result = ""; 
	 result = "Max = " + boost::lexical_cast(max) + '\r'+'\n'; 
	 result += "Width = " + boost::lexical_cast(getmi->sigma) + '\r' + '\n'; 
	 result += "Tolerance = " + boost::lexical_cast(getnetwork->tolerance) + '\r' + '\n'; 
	 int count = result.length(); 
	 const char * t = result.c_str(); 
	 wxString dirname = dirname + gene_matrix->micro_set[shuffle->obj_index].name+".tmp"; 
	 wxFile file; 
	 file.Create(dirname,true); 
	 file.Open(dirname,wxFile::read_write); 
	 file.Write(t,count); 
	 file.Close(); 
} 
 
bool Monte_carlo::read_object() 
{ 
	 bool ok = false; 
	 unsigned char * t; 
     wxString dirname ; 
	 dirname = getmi->dirname + gene_matrix->micro_set[shuffle->obj_index].name+"_object"+".txt"; 
	 wxFile file; 
	 if(file.Open(dirname)){ 
		int nSize = file.Length(); 
        t = new unsigned char[nSize]; 
	    file.Read(t,nSize); 
        wxString temp_data = (wxString)t; 
		while(1){ 
			 int index = temp_data.Find('\n'); 
			 if(index == -1) 
				break; 
			 wxString sub = temp_data.SubString(0,index); 
			 name_temp.push_back(sub); 
			 temp_data.Remove(0,index+1); 
		} 
	    file.Close(); 
		delete [] t; 
	    return ok; 
	 } 
     else 
	   return false; 
} 
 
void Monte_carlo::comput_mi(int index,int size) 
{ 
	 int i = index; 
     int j = 0; 
	 while( j < size ){ 
		    getmi->get_GenePairs_Mi(i,j); 
			j++; 
	 } 
} 
 
double Monte_carlo::check(gene g1,gene g2) 
{ 
       double a = 0.0; 
	   int total = name_temp.size(); 
	   int number = 0; 
	   for(int i = 0;i < total;i++){ 
		   for(int a = 0;a < g1.size();a++){ 
			   if(name_temp[i] == g1[a].name){ 
				  number++; 
				  break; 
			   } 
		   } 
		   if(a == g1.size()){ 
			  for(int a1 = 0;a1 < g2.size();a1++){ 
                  if(name_temp[i] == g2[a1].name){ 
				     number++; 
					 break; 
				  } 
			  } 
		   } 
	   } 
	   a = number/total; 
	   return a; 
} 
 
void Monte_carlo::clear_eniverment() 
{ 
     if(net->c.size() != 0) 
	    net->c.clear(); 
	 if(net->g.size() != 0) 
	    net->g.clear(); 
	 gene_matrix->index_temp.clear(); 
     gene_matrix->delete_maxtri(); 
	 if(getmi->prob_table != NULL){		 
	    for ( int i = 0; i < getmi->number; i++ ) 
		{ 
		   delete[] getmi->prob_table[i]; 
		   delete[] getmi->norm_2D_table[i]; 
		}	    
	    delete[] getmi->prob_table; 
	    delete[] getmi->norm_2D_table; 
	    delete[] getmi->norm_1D_table; 
	 } 
	  int number = getmi->number; 
      getmi->prob_table = new double * [number]; 
      for ( int i = 0; i < number; i++ ) 
      { 
        getmi->prob_table[i] = new double[number]; 
        for ( int j = 0; j < number; j++ ) 
        { 
          getmi->prob_table[i][j] = -1.0; 
        } 
      } 
 
      getmi->norm_1D_table = new double[number]; 
 
      getmi->norm_2D_table = new double * [number]; 
      for ( int p = 0; p < number; p++ ) 
      { 
        getmi->norm_2D_table[p] = new double[number]; 
      }	  
	  double sigma = getmi->sigma; 
	  for (int i=0; inorm_1D_table[i] = 0.5*( getmi->erf( (1-x)/(sigma*M_SQRT2),0 ) - getmi->erf( (0-x)/(sigma*M_SQRT2),0 ) ); 
	  } 
 
	  for (int j=0; jnorm_2D_table[j][k] = getmi->norm_1D_table[j]*getmi->norm_1D_table[k]; 
		  getmi->norm_2D_table[k][j] = getmi->norm_2D_table[j][k]; 
		} 
	  } 
}