void em3(double *sfs,Matrix<double> *GL1,Matrix<double> *GL2,Matrix<double> *GL3,double tole=0.01,int maxIter=10){ double oldLik,lik; if(nThreads>1) oldLik = lik2_master(); else oldLik = lik2(sfs,GL1,GL2,0,GL1->x); fprintf(stderr,"startlik=%f\n",oldLik); double *tmp = new double[dim];//<- wont be cleaned up, but is only allocated once for(int it=0;SIG_COND&&it<maxIter;it++) { if(nThreads>1) emStep2_master(tmp); else emStep2(sfs,GL1,GL2,tmp,0,GL1->x); for(int i=0;i<dim;i++) sfs[i]= tmp[i]; if(nThreads>1) lik = lik2_master(); else lik = lik2(sfs,GL1,GL2,0,GL1->x); fprintf(stderr,"[%d] lik=%f diff=%g\n",it,lik,fabs(lik-oldLik)); if(fabs(lik-oldLik)<tole){ oldLik=lik; break; } oldLik=lik; } }
void *lik2_slave(void *p){ emPars &pars = emp[(size_t) p]; pars.lik = lik2(pars.sfs,pars.GL1,pars.GL2,pars.from,pars.to); //fprintf(stderr," thdid=%d lik=%f\n",pars.threadId,pars.lik); return NULL; }
void *like_slave(void *p){ emPars<T> &pars = emp[(size_t) p]; if(pars.gls.size()==1) pars.lik = lik1(pars.sfs,pars.gls,pars.from,pars.to); else if(pars.gls.size()==2) pars.lik = lik2(pars.sfs,pars.gls,pars.from,pars.to); else if(pars.gls.size()==3) pars.lik = lik3(pars.sfs,pars.gls,pars.from,pars.to); else if(pars.gls.size()==4) pars.lik = lik4(pars.sfs,pars.gls,pars.from,pars.to); pthread_exit(NULL); }