void bisection(all_data * data,double * w, double* v, prox_data * p_data, int i) { double lambda = 0,lambda_old = 0, vi; double * wi = malloc(sizeof(double)*p_data->connections[i][0]); /******** Compute lower and upper bound (search region) *********/ double sumu = testLambda(wi, &vi,w,*v,p_data,i,lambda); if ( sumu > vi ) { /* Check condition */ lambda = 1; sumu = testLambda(wi, &vi,w,*v,p_data,i,lambda); while ( sumu > vi ) { lambda_old = lambda; lambda *= 2; sumu = testLambda(wi,&vi,w,*v,p_data,i,lambda); } } double low = lambda_old; double up = lambda; /******** Bisection ********/ double epsilon = 1e-3; while ( (up - low) > epsilon ) { lambda = (low + up) / 2; sumu = testLambda(wi,&vi,w,*v,p_data,i,lambda); if ( sumu <= vi ) up = lambda; else low = lambda; } for ( int k = 1; k <= *(p_data->connections[i]); k++ ){ w[p_data->connections[i][k]] = wi[k-1]; } *v = vi; free(wi); }
void testBasics(){ runTest(testInt()); runTest(testBool()); runTest(testString()); runTest(testData()); runTest(testBigdata()); runTest(testRange()); runTest(testLambda()); runTest(testSoft()); runTest(testPhantom()); runTest(testWeak()); }