void TestIndBall2::testCallProx() {
    double rho = 1.1;
    size_t n = 3;
    Matrix c(n, 1);
    c[0] = 1.0;
    c[1] = -0.5;
    c[2] = 3.0;

    Function * indB2 = new IndBall2(rho, c);

    Matrix x(n, 1);
    x[0] = 1.5;
    x[1] = 1.2;
    x[2] = 2.0;

    Matrix prox(n, 1);
    int status = indB2 -> callProx(x, 1.0, prox);
    _ASSERT_EQ(ForBESUtils::STATUS_OK, status);
    const double tol = 1e-9;
    _ASSERT_NUM_EQ(1.270310252950645, prox[0], tol);
    _ASSERT_NUM_EQ(0.419054860032192, prox[1], tol);
    _ASSERT_NUM_EQ(2.459379494098711, prox[2], tol);

    double f_at_prox;
    status = indB2 -> callProx(x, 1.0, prox, f_at_prox);
    _ASSERT_EQ(ForBESUtils::STATUS_OK, status);
    _ASSERT_EQ(0.0, f_at_prox);

    delete indB2;
}
Exemple #2
0
void TestIndPos::testProx3() {
    double uniform_lb = -1.50;
    Function * ind_pos = new IndPos(uniform_lb);
    size_t n = 10;
    Matrix x(n, 1); // y = 0
    

    Matrix prox(n, 1);    

    int status = ind_pos -> callProx(x, 1.0, prox);
    _ASSERT(ForBESUtils::is_status_ok(status));
    _ASSERT_EQ(x, prox);

    for (size_t i = 0; i < n; i++) {
        if (i % 2 == 0) {
            x[i] = -1.0*i - 2.0;
        } else {
            x[i] = 1.0*i + 2.0;
        }
    }
    status = ind_pos -> callProx(x, 1.0, prox);
    _ASSERT(ForBESUtils::is_status_ok(status));
    for (size_t i = 0; i < n; i++) {
        _ASSERT_NUM_EQ(std::max(uniform_lb, x[i]), prox[i], 1e-14);
        if (i % 2 == 0) {
            _ASSERT_NUM_EQ(uniform_lb, prox[i], 1e-14);
        } else {
            _ASSERT_NUM_EQ(i + 2.0, prox[i], 1e-14);
        }
    }

    delete ind_pos;
}
Exemple #3
0
void TestIndPos::testProx1() {
    Function * ind_pos = new IndPos();

    size_t n = 10;

    Matrix x(n, 1);
    x[0] = 10.0;
    x[1] = -10.0;
    x[n - 2] = -1.2;
    x[n - 1] = 3.4;

    Matrix z(n, 1);
    x.plusop(&z);

    Matrix prox(n, 1);
    int status = ind_pos -> callProx(x, 1.0, prox);

    _ASSERT(ForBESUtils::is_status_ok(status));
    _ASSERT_EQ(z, prox);

    delete ind_pos;
}
Exemple #4
0
void TestIndPos::testProx2() {
    size_t n = 50;
    Matrix lb(n, 1);
    Matrix prox(n, 1);
    Matrix x(n, 1);
    for (size_t i = 0; i < n; i++) {
        lb[i] = -3.0 + i;
        x[i] = lb[i] + std::pow(-1, i + 1);
    }
    Function * ind_pos = new IndPos(lb);

    int status = ind_pos -> callProx(x, 1.0, prox);
    _ASSERT(ForBESUtils::is_status_ok(status));

    for (size_t i = 0; i < n; i++) {
        if (i % 2 == 0) {
            _ASSERT_NUM_EQ(lb[i], prox[i], 1e-14);
        } else {
            _ASSERT_NUM_EQ(x[i], prox[i], 1e-14);
        }
    }

    delete ind_pos;
}
Exemple #5
0
int computePixelParameterPlane(complex w) {

	b_ = tc(w, dz*thickness);

	int its = 0; // iterations counter

	int k;
	tc z1, z2;
	tc z1dyn, z2dyn;
	complex c1(1, 0);
	complex c2(-1, 0);
	z1 = c1;
	z2 = c2;
	z1dyn = tc(f_(z1).z, 1);
	z2dyn = tc(f_(z2).z, 1);
	bool z1bif = false;
	bool z2bif = false;
	bool z1cap = false;
	bool z2cap = false;

	//	double R2=10000;

	for (k = 0; k<iter; k++) {
		its++;
		if (!z1bif) {
			if (prox(z1, c1)) z1bif = true;
			if (prox(z1, c2)) z1bif = true;
			if (norm(z1dyn.dz)<smal) z1cap = true;
		}
		if (!z2bif) {
			if (prox(z2, c1)) z2bif = true;
			if (prox(z2, c2)) z2bif = true;
			if (norm(z2dyn.dz)<smal) z2cap = true;
		}

		// Assign pixel color.
		if (z1cap) {
			if (z2cap) goto aa;
			if (z2bif) goto ab;
		}
		if (z1bif) {
			if (z2cap) goto ba;
			if (z2bif) goto bb;
		}

		// If pixel color still not decided, iterate again.
		if (!z1bif && !z1cap) {
			z1 = f_(z1);
			z1dyn = fdyn(z1dyn);
		}
		if (!z2bif && !z2cap) {
			z2 = f_(z2);
			z2dyn = fdyn(z2dyn);
		}
	}
	goto gray; //If exceed iterates, assign gray pixel.

gray:  color(127, 127, 127);     goto fin; // gray

										   // out:   color(255,255,255);    goto fin; // white

bb:  color(191, 0, 255);      goto fin;

ba:  color(0, 0, 255);     goto fin;

ab:  color(255, 0, 0);      goto fin;

aa: color(255, 255, 255);  goto fin;

fin:

	return its;

}