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; }
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; }
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; }
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; }
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; }