int CFeasibilityMap::count_x_out_fn(CData &Data,int i_tau, int i_original,int n_simul, Uniform &randUnif) { // double case2_count_out = 0; int case2_count_out = 0; // Changed by Hang on 5/16/2015 ColumnVector s_i = tau_to_s_fn( i_tau, Data.n_var ); ColumnVector item_by_joint = Data.copy_non_balance_edit(s_i); ColumnVector tilde_y_i = Data.log_D_Observed.row(i_original).t(); for (int i_simul=1; i_simul<=n_simul; i_simul++){ //Generate from uniform distribution ColumnVector y_q = tilde_y_i; for ( int temp_j=1; temp_j<=Data.n_var; temp_j++ ){ if ( item_by_joint(temp_j)==1 ){ y_q(temp_j) = Data.logB_L(temp_j)+Data.logB_U_L(temp_j)*randUnif.Next(); } } ColumnVector x_q = exp_ColumnVector(y_q) ; Data.update_full_x_for_balance_edit(x_q); // if (!Data.PassEdits(x_q)) { case2_count_out += 1.0;} if (!Data.PassEdits(x_q)) { case2_count_out += 1;} // Changed by Hang on 5/16/2015 } if (case2_count_out ==0) { case2_count_out = 1; } return case2_count_out; // ADDED by Hang on 5/16/2015 }
void CParam::S2_add(Uniform &randUnif,CData &Data) { int n_needtoupdate = 0; for (int i_faulty=1; i_faulty<=Data.n_faulty; i_faulty++){ int i_original = Data.Faulty2Original[i_faulty-1]; ColumnVector item_by_bal; ColumnVector s_i = S_Mat.column(i_faulty); ColumnVector item_by_rnorm = Data.get_item_by_norm_indicator(s_i,item_by_bal); //Generate from normal distribution if ( item_by_rnorm.sum() >= 1 ) { // if no random number, other values by balanc edits remain same n_needtoupdate++; ColumnVector mu_z_i = Mu.column(z_in(i_original)) ; ColumnVector tilde_y_i = Data.log_D_Observed.row(i_original).t(); ColumnVector s_1_compact = Data.get_compact_vector(item_by_rnorm); ColumnVector Mu_1i = subvector(mu_z_i,s_1_compact); LowerTriangularMatrix LSigma_1i_i; ColumnVector y_q(n_var); double log_cond_norm_q = calculate_log_cond_norm(Data, i_original, item_by_rnorm, tilde_y_i, y_q, true, LSigma_1i_i, s_i); // MODIFIED 2015/02/16 ColumnVector y_i = (Y_in.row(i_original)).t() ; // ColumnVector y_part_i = subvector(y_i,item_by_rnorm); // Put values from balance edits ColumnVector x_q = exp_ColumnVector(y_q) ; Data.set_balance_edit_values_for_x_q(s_i, x_q, item_by_bal); // CHANGED by Hang, 2014/12/29 // double log_cond_norm_i = log_MVN_fn(y_part_i,Mu_1i,LSigma_1i_i); double log_cond_norm_i = calculate_log_cond_norm(Data, i_original, item_by_rnorm, tilde_y_i, y_q, false, LSigma_1i_i, s_i); // CHANGED 2015/01/27 , // MODIFIED 2015/02/16 // Acceptance/Rejection if (Data.PassEdits(x_q)) { // Check constraints y_q = log_ColumnVector(x_q) ; ColumnVector y_compact_q = Data.get_compact_vector(y_q); ColumnVector y_compact_i = Data.get_compact_vector(y_i); double log_full_norm_q = log_MVN_fn(y_compact_q,mu_z_i,LSIGMA_i[z_in(i_original)-1],logdet_and_more(z_in(i_original))); double log_full_norm_i = log_MVN_fn(y_compact_i,mu_z_i,LSIGMA_i[z_in(i_original)-1],logdet_and_more(z_in(i_original))); // Calculate acceptance ratio double logNum = log_full_norm_q - log_cond_norm_q; double logDen = log_full_norm_i - log_cond_norm_i; accept_rate(2) = exp( logNum - logDen ); if (randUnif.Next() < accept_rate(2)){ Y_in.row(i_original) = y_q.t(); is_accept(2)++; } } } } is_accept(2) = is_accept(2) / n_needtoupdate; }
void CFeasibilityMap::Simulate_logUnif_case2(int n_simul, Uniform &randUnif, CData &Data) { if (useMap) {return;} if (feasibleMap.nrows() == 0 || feasibleMap.maximum()==0) { Rprintf( "Feasibility Map need to be set or computed first\n"); return; } Data.logUnif_case2 =Matrix(Data.n_faulty,Data.n_tau); Data.logUnif_case2 = 0; for (int i_original=1; i_original<=Data.n_sample; i_original++){ if (Data.is_case(i_original,2)) { int i_faulty = Data.Original2Faulty[i_original-1]; ColumnVector tilde_y_i = Data.log_D_Observed.row(i_original).t(); for (int i_tau=1; i_tau<=Data.n_tau; i_tau++){ if ( feasibleMap(i_tau,i_faulty)==1 ){ double case2_count_out = 0; ColumnVector s_i = tau_to_s_fn( i_tau, Data.n_var ); ColumnVector item_by_joint = Data.copy_non_balance_edit(s_i); for (int i_simul=1; i_simul<=n_simul; i_simul++){ //Generate from uniform distribution ColumnVector y_q = tilde_y_i; for ( int temp_j=1; temp_j<=Data.n_var; temp_j++ ){ if ( item_by_joint(temp_j)==1 ){ y_q(temp_j) = Data.logB_L(temp_j)+Data.logB_U_L(temp_j)*randUnif.Next(); } } ColumnVector x_q = exp_ColumnVector(y_q) ; Data.update_full_x_for_balance_edit(x_q); if (!Data.PassEdits(x_q)) { case2_count_out += 1.0;} } double Area = 1.0; for ( int temp_j=1; temp_j<=Data.n_var; temp_j++ ){ if ( item_by_joint(temp_j)==1 ){ Area = Area * Data.logB_U_L(temp_j) ; } } Area = Area * case2_count_out / n_simul ; Data.set_logUnif_case2(i_original, i_tau, -log(Area)); } } if ( ((1.0*i_original/100)==(floor(1.0*i_original/100))) ){ Rprintf( "logUnif_y_tilde for i_sample= %d\n",i_original); } } } }
Individual * Population::Emigrate() { int nMales = _mpMales.size(); int nFemales = _mpFemales.size(); int nTotal = nMales + nFemales; bool bWhichSex = (UniformGen.Next() <= (double)nMales / (double)nTotal)? true:false; vector< Individual *> * pIndividuals = bWhichSex? &_mpMales:&_mpFemales; if (pIndividuals->size() == 0) { // no more individuals to return return NULL; } int nEmigrant = fnGetRandIndex(pIndividuals->size()); //printf("1\n"); Individual * pEmigrant = pIndividuals->at(nEmigrant); //printf("2\n"); pIndividuals->erase(pIndividuals->begin() + nEmigrant); //printf("3\n"); return pEmigrant; }
void CParam::S1(int iter, Uniform &randUnif, CData &Data, CFeasibilityMap &FM, int n_simul) { is_accept(1) = 0; for (int i_faulty=1; i_faulty<=Data.n_faulty; i_faulty++) { if (FM.useMap) {FM.pmm->iter = iter;} int i_original = Data.Faulty2Original[i_faulty-1]; double g_option_q, g_mode_q; int what_type_move; ColumnVector s_i = S_Mat.column(i_faulty); int tau_q = FM.EvaluateMove(i_original, Data, s_i, iter, what_type_move, g_option_q, g_mode_q, true); // calculate g_mode_i & g_option_i ColumnVector s_q = CFeasibilityMap::tau_to_s_fn(tau_q, n_var); double g_option_i, g_mode_i; FM.EvaluateMove(i_original, Data, s_q, iter, what_type_move, g_option_i, g_mode_i, false); // calculate g_s_q & g_s_i double g_s_q = g_mode_q * g_option_q; double g_s_i = g_mode_i * g_option_i; // whether drawn by item_by_rnorm and balance edits ColumnVector item_by_bal; ColumnVector item_by_rnorm; if (Data.is_case(i_original,1)) { item_by_rnorm = Data.get_item_by_norm_indicator(s_q,item_by_bal); } else { item_by_rnorm = Data.copy_non_balance_edit(s_q); } //Generate from normal distribution ColumnVector mu_z_i = Mu.column(z_in(i_original)) ; ColumnVector tilde_y_i = Data.log_D_Observed.row(i_original).t(); ColumnVector y_q(n_var); LowerTriangularMatrix LSigma_i; double log_cond_norm_q = calculate_log_cond_norm(Data, i_original, item_by_rnorm, tilde_y_i, y_q, true, LSigma_i, s_q); // MODIFIED 2015/02/16 // Put values from balance edits ColumnVector x_q = exp_ColumnVector(y_q); if (Data.is_case(i_original,1)) { Data.set_balance_edit_values_for_x_q(s_q, x_q, item_by_bal); // CHANGED by Hang, 2014/12/29 } else { Data.update_full_x_for_balance_edit(x_q); } // Acceptance/Rejection if (Data.PassEdits(x_q)) { // Check constraints ColumnVector item_i_by_rnorm; if (Data.is_case(i_original,1)) { item_i_by_rnorm = Data.get_item_by_norm_indicator(s_i,item_by_bal); } else { item_i_by_rnorm = Data.copy_non_balance_edit(s_i); } double log_cond_norm_i = calculate_log_cond_norm(Data, i_original, item_i_by_rnorm, tilde_y_i, y_q, false, LSigma_i, s_i); // MODIFIED 2015/02/16 y_q = log_ColumnVector(x_q) ; ColumnVector y_i = (Y_in.row(i_original)).t(); // Calculate acceptance ratio ColumnVector y_compact_q = Data.get_compact_vector(y_q); ColumnVector y_compact_i = Data.get_compact_vector(y_i); double log_full_norm_q = log_MVN_fn(y_compact_q,mu_z_i,LSIGMA_i[z_in(i_original)-1],logdet_and_more(z_in(i_original))); double log_full_norm_i = log_MVN_fn(y_compact_i,mu_z_i,LSIGMA_i[z_in(i_original)-1],logdet_and_more(z_in(i_original))); double log_f_y_tilde_q = 0; if (FM.useMap && Data.is_case(i_original,2)) { log_f_y_tilde_q = FM.Simulate_logUnif_case2(CFeasibilityMap::s_to_tau_fn(s_q),i_original,n_simul,randUnif); } else { log_f_y_tilde_q = Data.get_logUnif_y_tilde(s_q, CFeasibilityMap::s_to_tau_fn(s_q),i_original); } double logNum = log_full_norm_q + log_f_y_tilde_q - log_cond_norm_q - log(g_s_q); double logDen = log_full_norm_i + logUnif_y_tilde(i_faulty) - log_cond_norm_i - log(g_s_i); accept_rate(1) = exp( logNum - logDen ) ; if ( randUnif.Next() < accept_rate(1) ){ Y_in.row(i_original) = y_q.t() ; S_Mat.column(i_faulty) = s_q; logUnif_y_tilde(i_faulty) = log_f_y_tilde_q; is_accept(1)++; } } } is_accept(1) = is_accept(1) / Data.n_faulty; }
void test1(double N) { Uniform U; double sum = 0.0, sumsq = 0.0, ar1 = 0.0, last = 0.0; double j; Array<double> chi0(0,15); Array<double> chi1(0,255); Array<double> chi1x(0,255); Array<double> chi2(0,65535); Array<double> chi2x(0,65535); chi0 = 0; chi1 = 0; chi1x = 0; chi2 = 0; chi2x = 0; Array<double> crawl7(0,127); Array<double> crawl8(0,255); Array<double> crawl15(0,32767); Array<double> crawl16(0,65535); crawl7 = 0; crawl8 = 0; crawl15 = 0; crawl16 = 0; unsigned long crawler = 0; int m_bits = (int)(log(N) / 0.693 - 0.471); // number of bits in sparse monkey test unsigned long M = 1; M <<= (m_bits - 3); // 2**m_bits / 8 String Seen(M, (char)0); // to accumulate results unsigned long mask1 = (M - 1); for (j = 0; j < N; ++j) { double u = U.Next(); if (u == 1.0) { cout << "Reject value == 1" << endl; continue; } double v = u - 0.5; sum += v; sumsq += v * v; ar1 += v * (last - 0.5); int k = (int)floor(u * 256); ++chi1(k); int m = (int)floor(u * 65536); ++chi2(m); int a = (int)floor(u * 16); ++chi0(a); if (j > 0) { int b = (int)floor(last * 16); ++chi1x(a + 16 * b); int l = (int)floor(last * 256); ++chi2x(k + 256 * l); } last = u; crawler <<= 1; if (v >= 0) ++crawler; if (j >= 6) ++crawl7(crawler & 0x7F); if (j >= 7) ++crawl8(crawler & 0xFF); if (j >= 14) ++crawl15(crawler & 0x7FFF); if (j >= 15) ++crawl16(crawler & 0xFFFF); if ( j >= (unsigned int)(m_bits-1) ) { unsigned char mask2 = 1; mask2 <<= crawler & 7; Seen[(crawler >> 3) & mask1] |= mask2; } }
void test3(int n) { cout << endl; // Do chi-squared tests to discrete data cout << "ChiSquared tests for discrete data" << endl; cout << "chisq should be less than 95% point in most cases" << endl; cout << " and 99% point in almost all cases" << endl << endl; { Real p[] = { 0.05, 0.10, 0.05, 0.5, 0.01, 0.01, 0.03, 0.20, 0.05 }; TestDiscreteGen(9, p, n); } { Real p[] = { 0.4, 0.2, 0.1, 0.05, 0.025, 0.0125, 0.00625, 0.00625, 0.2 }; TestDiscreteGen(9, p, n); } TestNegativeBinomial(200.3, 0.05, n); TestNegativeBinomial(150.3, 0.15, n); TestNegativeBinomial(100.8, 0.18, n); TestNegativeBinomial(100.8, 1.22, n); TestNegativeBinomial(100.8, 9.0, n); TestNegativeBinomial(10.5, 0.18, n); TestNegativeBinomial(10.5, 1.22, n); TestNegativeBinomial(10.5, 9.0, n); TestNegativeBinomial(0.35, 0.18, n); TestNegativeBinomial(0.35, 1.22, n); TestNegativeBinomial(0.35, 9.0, n); TestBinomial(100, 0.45, n); TestBinomial(100, 0.25, n); TestBinomial(100, 0.02, n); TestBinomial(100, 0.01, n); TestBinomial(49, 0.60, n); TestBinomial(21, 0.70, n); TestBinomial(10, 0.90, n); TestBinomial(10, 0.25, n); TestBinomial(10, 0.10, n); TestPoisson(0.75, n); TestPoisson(4.3, n); TestPoisson(10, n); TestPoisson(100, n); Real* data = new Real[n]; if (!data) Throw(Bad_alloc()); // Apply KS test to a variety of continuous distributions // - use cdf transform to convert to uniform cout << endl; cout << "Kolmogorov-Smirnoff tests for continuous distributions" << endl; cout << "25%, 5%, 1%, .1% upper points are 1.019, 1.358, 1.628, 1.950" << endl; cout << "5% lower point is 0.520" << endl; cout << "Values should be mostly less than 5% upper point" << endl; cout << " and less than 1% point almost always" << endl << endl; { ChiSq X(1, 1.44); for (int i = 0; i < n; i++) { Real x = sqrt(X.Next()); data[i] = NormalDF(x - 1.2) - NormalDF(-x - 1.2); } cout << X.Name() << ": " << KS(data, n) << endl; } { ChiSq X(4); for (int i = 0; i < n; i++) { Real x = 0.5 * X.Next(); data[i] = (1+x)*exp(-x); } cout << X.Name() << ": " << KS(data, n) << endl; } { ChiSq X(2); for (int i = 0; i < n; i++) data[i] = exp(-0.5 * X.Next()); cout << X.Name() << ": " << KS(data, n) << endl; } { Pareto X(0.5); for (int i = 0; i < n; i++) { Real x = X.Next(); data[i] = 1.0 / sqrt(x); } cout << X.Name() << ": " << KS(data, n) << endl; } { Pareto X(1.5); for (int i = 0; i < n; i++) { Real x = X.Next(); data[i] = 1.0 / (x * sqrt(x)); } cout << X.Name() << ": " << KS(data, n) << endl; } { Normal X; for (int i = 0; i < n; i++) { Real x = X.Next(); data[i] = NormalDF(x); } cout << X.Name() << ": " << KS(data, n) << endl; } { Normal N; SumRandom X = 10 + 5 * N; for (int i = 0; i < n; i++) { Real x = X.Next(); data[i] = NormalDF((x-10)/5); } cout << X.Name() << ": " << KS(data, n) << endl; } { Normal N; Cauchy C; MixedRandom X = N(0.9) + C(0.1); for (int i = 0; i < n; i++) { Real x = X.Next(); data[i] = 0.9*NormalDF(x)+0.1*(atan(x)/3.141592654 + 0.5); } cout << X.Name() << ": " << KS(data, n) << endl; } { Normal N; MixedRandom X = N(0.9) + (10*N)(0.1); for (int i = 0; i < n; i++) { Real x = X.Next(); data[i] = 0.9*NormalDF(x)+0.1*NormalDF(x/10); } cout << X.Name() << ": " << KS(data, n) << endl; } { Normal X0; SumRandom X = X0 * 0.6 + X0 * 0.8; for (int i = 0; i < n; i++) { Real x = X.Next(); data[i] = NormalDF(x); } cout << X.Name() << ": " << KS(data, n) << endl; } { Normal X1; MixedRandom X = X1(0.2) + (X1 * 2.5 + 1.1)(0.35) + (X1 + 2.3)(0.45); for (int i = 0; i < n; i++) { Real x = X.Next(); data[i] = 0.20 * NormalDF(x) + 0.35 * NormalDF((x - 1.1) / 2.5) + 0.45 * NormalDF(x - 2.3); } cout << X.Name() << ": " << KS(data, n) << endl; } { Gamma X(0.5); for (int i = 0; i < n; i++) { Real x = X.Next(); data[i] = 2.0 * NormalDF(-sqrt(2 * x)); } cout << X.Name() << ": " << KS(data, n) << endl; } { Gamma X(3); for (int i = 0; i < n; i++) { Real x = X.Next(); data[i] = (1+x+0.5*x*x)*exp(-x); } cout << X.Name() << ": " << KS(data, n) << endl; } { Gamma X1(0.85); Gamma X2(2.15); SumRandom X = X1 + X2; for (int i = 0; i < n; i++) { Real x = X.Next(); data[i] = (1+x+0.5*x*x)*exp(-x); } cout << X.Name() << ": " << KS(data, n) << endl; } { Gamma X1(0.75); Gamma X2(0.25); SumRandom X = X1 + X2; for (int i = 0; i < n; i++) data[i] = exp(-X.Next()); cout << X.Name() << ": " << KS(data, n) << endl; } { Gamma X(2); for (int i = 0; i < n; i++) { Real x = X.Next(); data[i] = (1+x)*exp(-x); } cout << X.Name() << ": " << KS(data, n) << endl; } { Exponential X; for (int i = 0; i < n; i++) data[i] = exp(-X.Next()); cout << X.Name() << ": " << KS(data, n) << endl; } { Cauchy X; for (int i = 0; i < n; i++) data[i] = atan(X.Next())/3.141592654 + 0.5; cout << X.Name() << ": " << KS(data, n) << endl; } { Cauchy X0; SumRandom X = X0 * 0.3 + X0 * 0.7; for (int i = 0; i < n; i++) data[i] = atan(X.Next())/3.141592654 + 0.5; cout << X.Name() << ": " << KS(data, n) << endl; } { Uniform X; for (int i = 0; i < n; i++) data[i] = X.Next(); cout << X.Name() << ": " << KS(data, n) << endl; } delete [] data; }
void Population::FreqDependentNaturalSelection() { int nCurrGen = SimulConfig.GetCurrGen(); bool bIgnoreGlobalRules = SimulConfig.pNaturalSelConfig->IgnoreGlobalRules(nCurrGen); string sPop = this->_sPopName; map< int, map<string , list< pair<Parser *, int> > > > * mppqParsers = SimulConfig.pNaturalSelConfig->GetFreqDependentFormulaeAllCPUs(); //list< vector<string> > * pqvCourterSymbols = SimulConfig.pNaturalSelConfig->GetFormulaSymbolStringsCourter( sPop); list< vector<string> > * pqvSelfSymbols = SimulConfig.pNaturalSelConfig->GetFormulaSymbolStringsSelf( sPop); list< vector<string> > * pqvPopSymbols = SimulConfig.pNaturalSelConfig->GetFormulaSymbolStringsPop( sPop); list< vector<string> > * pqvPopCourterSymbols = SimulConfig.pNaturalSelConfig->GetFormulaSymbolStringsPopCourter( sPop); list< vector<string> > * pqvPopChooserSymbols = SimulConfig.pNaturalSelConfig->GetFormulaSymbolStringsPopChooser( sPop); //set population level parameters for(int nCPU=0;nCPU<nTotalCPUCore;nCPU++) { //set global current population parameters for all the CPUs list< pair< Parser *, int > > * pqParsers = &(*mppqParsers)[nCPU][this->_sPopName]; list< vector<string> >::iterator itPopSymbols = pqvPopSymbols->begin(); list< vector<string> >::iterator itPopCourterSymbols = pqvPopCourterSymbols->begin(); list< vector<string> >::iterator itPopChooserSymbols = pqvPopChooserSymbols->begin(); for (list< pair< Parser *, int> >::iterator itParser= pqParsers->begin(); itParser != pqParsers->end() ; ++itParser) { vector<string> vSymbolsPop = *itPopSymbols; vector<string> vSymbolsPopCourter = *itPopCourterSymbols; vector<string> vSymbolsPopChooser = *itPopChooserSymbols; Parser * pParser = itParser->first; //set population level symbols for(vector<string>::iterator itSymbol=vSymbolsPop.begin();itSymbol!=vSymbolsPop.end();++itSymbol) { string sSymbol = (*itSymbol).substr(4); string sType = (*itSymbol).substr(0, 3); //either Avg or Std if (sType != "Avg" && sType != "Std") { throw new Exception("Population parameter type unknown!"); } if (this->_mpSumPhenotype.find(sSymbol) == _mpSumPhenotype.end()) { throw new Exception("Unable to find population symbol"); } pParser->symbols_[string("Pop_Avg_"+sSymbol)] = this->_mpSumPhenotype[sSymbol].first; pParser->symbols_[string("Pop_Std_"+sSymbol)] = this->_mpSumPhenotype[sSymbol].second; } for(vector<string>::iterator itSymbol=vSymbolsPopCourter.begin();itSymbol!=vSymbolsPopCourter.end();++itSymbol) { string sSymbol = (*itSymbol).substr(4); string sType = (*itSymbol).substr(0, 3); //either Avg or Std if (sType != "Avg" && sType != "Std") { throw new Exception("Population parameter type unknown!"); } if (this->_mpSumPhenotypeMale.find(sSymbol) == _mpSumPhenotypeMale.end()) { throw new Exception("Unable to find population symbol: male"); } pParser->symbols_[string("PopCourter_Avg_"+sSymbol)] = this->_mpSumPhenotypeMale[sSymbol].first; pParser->symbols_[string("PopCourter_Std_"+sSymbol)] = this->_mpSumPhenotypeMale[sSymbol].second; } for(vector<string>::iterator itSymbol=vSymbolsPopChooser.begin();itSymbol!=vSymbolsPopChooser.end();++itSymbol) { string sSymbol = (*itSymbol).substr(4); string sType = (*itSymbol).substr(0, 3); //either Avg or Std if (sType != "Avg" && sType != "Std") { throw new Exception("Population parameter type unknown!"); } if (this->_mpSumPhenotypeFemale.find(sSymbol) == _mpSumPhenotypeFemale.end()) { throw new Exception("Unable to find population symbol: female"); } pParser->symbols_[string("PopChooser_Avg_"+sSymbol)] = this->_mpSumPhenotypeFemale[sSymbol].first; pParser->symbols_[string("PopChooser_Std_"+sSymbol)] = this->_mpSumPhenotypeFemale[sSymbol].second; } ++itPopSymbols; ++itPopCourterSymbols; ++itPopChooserSymbols; } } //now go through each individual vector<int>::size_type nMale = this->_mpMales.size(); vector<int>::size_type nFemale = this->_mpFemales.size(); #pragma omp parallel { #pragma omp for //for (vector< Individual * >::size_type i=0; i< nMale; i++ ) { for (signed long i=0; i< nMale; i++ ) { Individual * pInd = _mpMales[i]; #ifdef _OPENMP int nCPU = omp_get_thread_num(); #else int nCPU = 0; #endif list< pair< Parser *, int > > * pqParsers = &(*mppqParsers)[nCPU][this->_sPopName]; list< vector<string> >::iterator itSelfSymbols = pqvSelfSymbols->begin(); for (list< pair< Parser *, int> >::iterator itParser= pqParsers->begin(); itParser != pqParsers->end() ; ++itParser) { vector<string> vSymbolsSelf = *itSelfSymbols; Parser * pParser = itParser->first; int nGen = itParser->second; if ((nGen ==-1 && !bIgnoreGlobalRules) || (bIgnoreGlobalRules && nGen == nCurrGen) ) { for(vector<string>::iterator itSymbol=vSymbolsSelf.begin();itSymbol!=vSymbolsSelf.end();++itSymbol) { //#pragma omp critical //{ pParser->symbols_[string("My_"+(*itSymbol))] = pInd->GetPhenotype(*itSymbol); pParser->symbols_[*itSymbol] = pInd->GetPhenotype(*itSymbol); //set both variables //} } bool bLive = true; //#pragma omp critical //{ bLive = (UniformGen.Next() <= pParser->Evaluate())? true : false; //} if (!bLive) { #pragma omp critical { delete pInd; // uhoh, dead!! _mpMales[i] = NULL; //mark it //_mpMales.erase(_mpMales.begin() + i); } break; } } ++itSelfSymbols; } } #pragma omp for //for (vector< Individual * >::size_type i=0; i< nFemale; i++ ) { for (signed long i=0; i< nFemale; i++ ) { Individual * pInd = _mpFemales[i]; #ifdef _OPENMP int nCPU = omp_get_thread_num(); #else int nCPU = 0; #endif list< pair< Parser *, int > > * pqParsers = &(*mppqParsers)[nCPU][this->_sPopName]; list< vector<string> >::iterator itSelfSymbols = pqvSelfSymbols->begin(); for (list< pair< Parser *, int> >::iterator itParser= pqParsers->begin(); itParser != pqParsers->end() ; ++itParser) { vector<string> vSymbolsSelf = *itSelfSymbols; Parser * pParser = itParser->first; int nGen = itParser->second; if ((nGen ==-1 && !bIgnoreGlobalRules) || (bIgnoreGlobalRules && nGen == nCurrGen) ) { for(vector<string>::iterator itSymbol=vSymbolsSelf.begin();itSymbol!=vSymbolsSelf.end();++itSymbol) { //#pragma omp critical //{ pParser->symbols_[string("My_"+(*itSymbol))] = pInd->GetPhenotype(*itSymbol); pParser->symbols_[*itSymbol] = pInd->GetPhenotype(*itSymbol); //set both variables //} } bool bLive = true; //#pragma omp critical //{ bLive = (UniformGen.Next() <= pParser->Evaluate())? true : false; //} if (!bLive) { #pragma omp critical { delete pInd; // uhoh, dead!! _mpFemales[i] = NULL; //_mpFemales.erase(_mpFemales.begin() + i); } break; } } ++itSelfSymbols; } } } //end parallel block //clear NULL pointers from the arrays: for (vector< Individual * >::size_type i=0; i< nMale; i++ ) { if (! _mpMales[i]) { _mpMales.erase(_mpMales.begin() + i); nMale--; // readjust upper bound i--; } } for (vector< Individual * >::size_type i=0; i< nFemale; i++ ) { if (! _mpFemales[i]) { _mpFemales.erase(_mpFemales.begin() + i); nFemale--; // readjust upper bound i--; } } }
bool Population::ImmigrateConfirm(bool bForceExistingDie) { int nCacheMaleSize = _mpImCacheMales.size(); int nCacheFemaleSize = _mpImCacheFemales.size(); int nTotalCached = nCacheMaleSize + nCacheFemaleSize; int nTotalToAdd; int nCurrPopSize = this->GetPopSize(4); int nRoomLeft = _nPopMaxSize-nCurrPopSize >=0? _nPopMaxSize-nCurrPopSize : 0; double nProbToAdd; if (bForceExistingDie) { nTotalToAdd = nTotalCached < _nPopMaxSize? nTotalCached : _nPopMaxSize; nProbToAdd = (double)nTotalToAdd / (double)nTotalCached; } else { if (nRoomLeft == 0) { return false; //no room to add any immigrants } nTotalToAdd = nTotalCached < nRoomLeft? nTotalCached : nRoomLeft; nProbToAdd = (double)nTotalToAdd / (double)nTotalCached; } //printf("MaxPopSize: %d \n", _nPopMaxSize ); printf("Candidate immigrating males %d\n", nCacheMaleSize); printf("Candidate immigrating females %d\n", nCacheFemaleSize); int nAddedMales=0; int nAddedFemales=0; if (bForceExistingDie && nRoomLeft < nTotalToAdd) { int nMakeMoreRoom = nTotalToAdd - nRoomLeft; for(int i=0;i< nMakeMoreRoom;i++) { Individual * pVictim = this->Emigrate(); if (!pVictim) { } else { delete pVictim; } } } for(vector< Individual * >::iterator it=this->_mpImCacheMales.begin(); it!=this->_mpImCacheMales.end();++it) { if (UniformGen.Next() < nProbToAdd) { //add _mpMales.push_back( *it ); nAddedMales++; } } for(vector< Individual * >::iterator it=this->_mpImCacheFemales.begin(); it!=this->_mpImCacheFemales.end();++it) { if (UniformGen.Next() < nProbToAdd) { //add _mpFemales.push_back( *it ); nAddedFemales++; } } printf("Added immigrating males %d\n", nAddedMales); printf("Added immigrating females %d\n", nAddedFemales); //do final check on pop size: nCurrPopSize = this->GetPopSize(4); if (nCurrPopSize > _nPopMaxSize) { //randomly remove some individuals while(this->GetPopSize(4) > _nPopMaxSize) { Individual * pVictim = this->Emigrate(); if (!pVictim) { } else { delete pVictim; } } } }