int stratified_resampling(struct particle p[], int N){ static double s; double sum[N]; cum_sum(p,sum,N); double x = randu(s,s+(1.0/N)); int index; for(int i = 0;i<N;i++){ if(sum[i]>x){ //free(sum); index = i; break; } } //printf("\t%f\t%f\t%f\n",x,sum[0],sum[N-1]); s += (double)(1.0/N); if((1-s)<0.1/N) s = 0; return index; }
int systematic_resampling(struct particle p[], int N){ static int s; s++; double sum[N]; cum_sum(p,sum,N); double x = randu(0,(1.0/N)); x += (float)(s-1.0)/N; // systematic resampling int index; for(int i = 0;i<N;i++){ if(sum[i]>x){ //free(sum); index = i; break; } } if(N == s) s = 0; return index; }
BOOST_SYMBOL_EXPORT void cum_sum(double const *src, double *dst, size_t length, BOOST_SIMD_DEFAULT_SITE) { one_dimension_source<cum_sum_tag> f = one_dimension_source<cum_sum_tag>(src, dst, length); cum_sum(f); }
JNI_METHOD(void, cumSum)(JNIEnv *env, jobject, jdoubleArray jsrc, jint src_offset, jdoubleArray jdst, jint dst_offset, jint length) { jdouble *src = (jdouble *) env->GetPrimitiveArrayCritical(jsrc, NULL); jdouble *dst = (jdouble *) env->GetPrimitiveArrayCritical(jdst, NULL); source_1d<cum_sum_tag> f(src + src_offset, dst + dst_offset, length); cum_sum(f); env->ReleasePrimitiveArrayCritical(jsrc, src, JNI_ABORT); env->ReleasePrimitiveArrayCritical(jdst, dst, JNI_ABORT); }
int multimodal_resampling(struct particle p[], int N) { //double *sum; //sum = (double*)calloc(N,sizeof(double)); double sum[N]; cum_sum(p,sum,N); double x = randu(0,1); for(int i = 0;i<N;i++){ if(sum[i]>x){ //free(sum); return i; } } return -1; //error }