示例#1
0
double l1norm(int mpi_rank, std::vector<double>& v1, std::vector<double>& v2, int n1, int n2) {
    double global_val = 0;
    // reuse the local norms from norms.h
    double local_val = l1norm(v1, v2, n1, n2);
    NORM_REDUCE(&local_val, &global_val, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
    return global_val;
}
示例#2
0
文件: euc_proj.c 项目: cran/flare
double mod_bisec1(double * v, double z, int n){
    int cnt;
    double vmax, eps, lamb1, lamb2, lamb3, tmpfun1;

    if(l1norm(v,n)<=z) return 0;
    else{
        eps = 1e-5;
        vmax = max_abs_vec(v, n); //printf("vmax=%.12f,abs(v)=%.12f, z=%f \n",vmax,l1norm(v,n),z);
        if(vmax<=0 ) return 0;
        lamb1 = max(0,vmax-z);
        lamb2 = vmax;
        lamb3 = vmax/2;
        tmpfun1 = func1(lamb3, v, z, n);
        //printf("cnt=%d, lamb1=%f, lamb2=%f, lamb3=%f, func1=%f, func2=%f, func3=%f \n", cnt,lamb1,lamb2,lamb3,fun1(lamb1, v, z, n),fun1(lamb2, v, z, n),tmpfun1); 
        //sleep(10);
        cnt = 0;
        while(fabs(tmpfun1)>eps){
            if(tmpfun1>0) lamb1 = lamb3;
            if(tmpfun1<0) lamb2 = lamb3;
            lamb3 = (lamb1+lamb2)/2;
            tmpfun1 = func1(lamb3, v, z, n);
            cnt++;
            //if(cnt % 1 ==0) 
        }
        return lamb3;
    }
}
示例#3
0
double l1norm(int mpi_rank, std::vector<double>& v1, std::vector<double>& v2)
{
    if (v1.size() != v2.size()) {
        std::cout << "Error! in l1norm(...): vectors are not same length. assuming 0's for missing elements" << std::endl;
        //exit(EXIT_FAILURE);
    }

	return l1norm(mpi_rank, v1, v2, 0, v1.size());
}
示例#4
0
 bool includes(T dirang, const vec<T,N>& b, bool lin_flag) {
     auto cen_ = this->cen();
     auto rad_ = this->rad();
     auto ir = 1/rad_;        /* inverses */
     auto pos = b - cen_;
     if (dirang != 0.0f) { vec<T,N>array_rot(&pos, 1, NULL, dirang); } /* rotate */
     if (lin_flag) {
         return l1norm(pos*ir) < 1;
     } else {
         return sqrnorm(pos*ir) < 1;
     }
 }
示例#5
0
double l1norm(int mpi_rank, std::vector<double>& v1)
{
	return l1norm(mpi_rank, v1,0,v1.size());
}
示例#6
0
文件: euc_proj.c 项目: cran/flare
double mod_bisec2(double * v, double z, int n){
    int i, cnt, max_cnt, n1, n2, n3, n_s, n_v;
    double f1, f2, f3, f_der1, f_der2, f_der3, b1, b2, b3;
    double vmax, eps, lamb1, lamb2, lamb3, lamb_T, lamb_S;

    if(l1norm(v,n)<=z) {
        return 0;
    }
    else{
        eps = 1e-5; max_cnt = 5;
        double *v_0 = (double*) malloc(n*sizeof(double));
        double *v_s = (double*) malloc(n*sizeof(double));
        max_fabs_vc(v, v_0, &vmax, &n_v, n, z);//printf("vmax=%.12f,abs(v)=%.12f, z=%f \n",vmax,l1norm(v,n),z);
        max_selc(v_0, vmax, v_s, n_v, &n_s, z);
        //fabs_vc(v, v_0, n);//printf("vmax=%.12f,abs(v)=%.12f, z=%f \n",vmax,l1norm(v,n),z);
        //vmax = max_vec(v_0, n);
        //max_selc(v_0, vmax, v_s, n, &n_s, z);
        free(v_0); 
        if(n_s==0) {free(v_s); return 0;}
        if(vmax == 0) {free(v_s); return 0;}
        if(n_s==1) {free(v_s); return vmax-1;}
        double *v_1 = (double*) malloc(n_s*sizeof(double));
        n = n_s;
        for(i=0;i<n;i++) v_1[i] = v_s[i];
        free(v_s); 
        sort_up_bubble(v_1, n);
        lamb1 = max(0, v_1[n-1]-z);
        lamb2 = v_1[n-1];
        n1 = 0; n2 = n-1;
        init_func(lamb1, v_1, &n1, &n2, &f1, &f_der1, &b1, z);
        if(fabs(f1)<eps) {free(v_1); return lamb1;}
//printf("\n n_s = %d \n",n_s);
//for(i=0;i<n;i++){ printf("v1[%d]=%f, ",i,v_1[i]);} printf("\n");
//printf("lamb1=%f,lamb2=%f,n1=%d,n2=%d,f1=%f,f_der1=%f,b1=%f,z=%f\n",lamb1,lamb2,n1,n2,f1,f_der1,b1,z);
        f2 = -z; b2 = -z; f_der2 = 0;
        lamb_T = lamb1-f1/f_der1;
        lamb_S = lamb2-f2*(lamb2-lamb1)/(f2-f1);
        lamb3 = (lamb_T+lamb_S)/2;
        if(fabs(lamb3 - lamb_S)<eps) {free(v_1); return lamb3;}
        func_T(&lamb_T, &lamb1, v_1, &n1, &n2, &f1, &f_der1, &b1);
        if(fabs(f1)<eps) {free(v_1); return lamb1;}
        if(n1==n2) {free(v_1); return lamb2-f2*(lamb2-lamb1)/(f2-f1);}
        func_S(&lamb_S, &lamb2, v_1, &n1, &n2, &f2, &f_der2, &b2);
        if(fabs(f2)<eps) {free(v_1); return lamb2;}
        if(n1==n2) {free(v_1); return lamb2-f2*(lamb2-lamb1)/(f2-f1);}
        func_M(&lamb3, &lamb2, v_1, &n1, &n2, &f2, &f_der2, &b2, &n3, &f3, &f_der3, &b3);
        if(fabs(f3)<eps) {free(v_1); return lamb3;}
        if(n1==n2) {free(v_1); return lamb3-f3*(lamb3-lamb1)/(f3-f1);}
        cnt = 0;
        while(fabs(f3)>eps && cnt<max_cnt){
            if(f3>0) {lamb1 = lamb3; f1=f3; f_der1=f_der3; b1=b3; n1=n3;}
            if(f3<0) {lamb2 = lamb3; f2=f3; f_der2=f_der3; b2=b3; n2=n3;}
            if(f_der2==0) lamb_T = lamb1-f1/f_der1;
            else lamb_T = max(lamb1-f1/f_der1, lamb2-f2/f_der2);
            lamb_S = lamb2-f2*(lamb2-lamb1)/(f2-f1);
            lamb3 = (lamb_T+lamb_S)/2;
            if(fabs(lamb3 - lamb_S)<eps) {free(v_1); return lamb3;}
//printf("cnt=%d,lamb_T=%f,lamb_S=%f,lambd3=%f,f1=%f,f_der1=%f,b1=%f,f2=%f,f_der2=%f,b2=%f \n",cnt,lamb_T,lamb_S,lamb3,f1,f_der1,b1,f2,f_der2,b2);
            func_T(&lamb_T, &lamb1, v_1, &n1, &n2, &f1, &f_der1, &b1);
//printf("      lamb_1=%f,n1=%d,n2=%d,f1=%f,f_der1=%f,b1=%f \n",lamb1,n1,n2,f1,f_der1,b1);
            if(fabs(f1)<eps) {free(v_1); return lamb1;}
            if(n1==n2) {free(v_1); return lamb2-f2*(lamb2-lamb1)/(f2-f1);}
            func_S(&lamb_S, &lamb2, v_1, &n1, &n2, &f2, &f_der2, &b2);
//printf("      lamb_2=%f,n1=%d,n2=%d,f2=%f,f_der2=%f,b2=%f \n",lamb2,n1,n2,f2,f_der2,b2);
            if(fabs(f2)<eps) {free(v_1); return lamb2;}
            if(n1==n2) {free(v_1); return lamb2-f2*(lamb2-lamb1)/(f2-f1);}
            func_M(&lamb3, &lamb2, v_1, &n1, &n2, &f2, &f_der2, &b2, &n3, &f3, &f_der3, &b3);
//printf("      lamb_3=%f,n1=%d,n2=%d,f3=%f,f_der3=%f,b3=%f \n",lamb3,n1,n2,f3,f_der3,b3);
//if(cnt>0) getchar();
            if(fabs(f3)<eps) {free(v_1); return lamb3;}
            if(n1==n2) {free(v_1); return lamb3-f3*(lamb3-lamb1)/(f3-f1);}
            cnt++;
        }
//if(cnt==max_cnt) printf(".");
        free(v_1);
        return lamb3;
    }
}