void *put_memory(void *ptr, size_t size) { void *tmp; tmp = get_place(size); if (tmp != NULL) { ptr = tmp; modif_list(ptr, size); } else { ptr = sbrk(size); my_put_bot_list(ptr, size); end = sbrk(0); } return (ptr); }
void StarFinder::rejectOutliers( std::vector<PotentialStar*>& list, double nsigma, double min_sigma, const Function2D& f) { // This rejects outliers by finding the median and the quartile // values, and calls sigma the average of the two quartile deviations. // "nsigma" is then how many of these "sigma" away from the median // to consider something an outlier. const int nstars = list.size(); if (nstars <= 4) return; // Find median, 1st and 3rd quartile stars; std::vector<PotentialStar*> modif_list(nstars); for(int k=0;k<nstars;++k) { modif_list[k] = new PotentialStar(*list[k]); double newSize = list[k]->getSize() - f(list[k]->getPos()); modif_list[k]->setSize(newSize); } std::sort(modif_list.begin(),modif_list.end(), std::mem_fun(&PotentialStar::isSmallerThan)); PotentialStar* mStar = modif_list[modif_list.size()/2]; PotentialStar* q1Star = modif_list[modif_list.size()/4]; PotentialStar* q3Star = modif_list[modif_list.size()*3/4]; double median = mStar->getSize(); double q1 = q1Star->getSize(); double q3 = q3Star->getSize(); double sigma = std::max(q3-median,median-q1); sigma = std::max(sigma,min_sigma); xdbg<<"q1,m,q3 = "<<q1<<" , "<<median<<" , "<<q3<<std::endl; xdbg<<"sigma = "<<sigma<<", nsig * sigma = "<<nsigma*sigma<<std::endl; // Remove elements which std::abs(x->getSize()-median) > nsigma*sigma int j=0; for(int k=0; k<nstars;++k) { if (std::abs(modif_list[k]->getSize()-median)>nsigma*sigma) { xdbg<<"k = "<<k<<", size = "<<modif_list[k]->getSize(); xdbg<<" might be an outlier (median = "<<median<<")\n"; } list[j] = list[k]; // Note: update original list, not modified version. ++j; } if (j<nstars) list.erase(list.begin()+j,list.end()); for(int k=0;k<nstars;++k) delete modif_list[k]; }