def assert_pogs_prox(self, lib, blas_handle, solver, f, f_py, g, g_py, local_vars): """proximal operator application test set x^{k+1/2} = prox_{g, rho}(x^k - xt^k) y^{k+1/2} = prox_{f, rho}(y^k - yt^k) in C and Python, check that results agree """ m = len(f_py) n = len(g_py) DIGITS = 7 - 2 * lib.FLOAT RTOL = 10**(-DIGITS) ATOLM = RTOL * m**0.5 ATOLN = RTOL * n**0.5 z = solver.contents.z rho = solver.contents.rho self.assertCall( lib.prox(blas_handle, f, g, z, rho) ) self.load_all_local(lib, local_vars, solver) f_list = [lib.function(*f_) for f_ in f_py] g_list = [lib.function(*f_) for f_ in g_py] for i in xrange(len(f_py)): f_list[i].a *= local_vars.d[i] f_list[i].d *= local_vars.d[i] f_list[i].e *= local_vars.d[i] for j in xrange(len(g_py)): g_list[j].a /= local_vars.e[j] g_list[j].d /= local_vars.e[j] g_list[j].e /= local_vars.e[j] x_arg = local_vars.x - local_vars.xt y_arg = local_vars.y - local_vars.yt x_out = prox_eval_python(g_list, rho, x_arg) y_out = prox_eval_python(f_list, rho, y_arg) self.assertVecEqual( local_vars.x12, x_out, ATOLN, RTOL ) self.assertVecEqual( local_vars.y12, y_out, ATOLM, RTOL )
def test_eval(self): m, n = self.shape scal = self.scalefactor a = 10 * np.random.rand(m) b = np.random.rand(m) c = np.random.rand(m) d = np.random.rand(m) e = np.random.rand(m) x_rand = np.random.rand(m) for (gpu, single_precision) in self.CONDITIONS: lib = self.libs.get(single_precision=single_precision, gpu=gpu) if lib is None: continue self.register_exit(lib.ok_device_reset) DIGITS = 7 - 2 * single_precision RTOL = 10**(-DIGITS) ATOLM = RTOL * m**0.5 ATOLN = RTOL * n**0.5 f, f_py, f_ptr = self.register_fnvector(lib, m, 'f') x, x_py, x_ptr = self.register_vector(lib, m, 'x') xout, xout_py, xout_ptr = self.register_vector(lib, m, 'xout') # populate x_py += x_rand self.assertCall(lib.vector_memcpy_va(x, x_ptr, 1)) for hkey, hval in list(lib.function_enums.dict.items()): if self.VERBOSE_TEST: print(hkey) print(hkey) # avoid domain errors with randomly generated data if 'Log' in hkey or 'Exp' in hkey or 'Entr' in hkey: continue for i in range(m): f_py[i] = lib.function(hval, a[i], b[i], c[i], d[i], e[i]) self.assertCall(lib.function_vector_memcpy_va(f, f_ptr)) # function evaluation f_list = [lib.function(*f_) for f_ in f_py] funcval_py = func_eval_python(f_list, x_rand) funcval_c = np.zeros(1).astype(lib.pyfloat) funcval_c_ptr = funcval_c.ctypes.data_as(lib.ok_float_p) self.assertCall(lib.function_eval_vector(f, x, funcval_c_ptr)) if funcval_c[0] in (np.inf, np.nan): self.assertTrue(1) else: self.assertScalarEqual(funcval_py, funcval_c, RTOL) # proximal operator evaluation, random rho rho = 5 * np.random.rand() prox_py = prox_eval_python(f_list, rho, x_rand) self.assertCall(lib.prox_eval_vector(f, rho, x, xout)) self.assertCall(lib.vector_memcpy_av(xout_ptr, xout, 1)) self.assertVecEqual(xout_py, prox_py, ATOLM, RTOL) self.free_vars('f', 'x', 'xout') self.assertCall(lib.ok_device_reset())
def test_eval(self): m, n = self.shape scal = self.scalefactor a = 10 * np.random.rand(m) b = np.random.rand(m) c = np.random.rand(m) d = np.random.rand(m) e = np.random.rand(m) x_rand = np.random.rand(m) for (gpu, single_precision) in self.CONDITIONS: lib = self.libs.get(single_precision=single_precision, gpu=gpu) if lib is None: continue self.register_exit(lib.ok_device_reset) DIGITS = 7 - 2 * single_precision RTOL = 10**(-DIGITS) ATOLM = RTOL * m**0.5 ATOLN = RTOL * n**0.5 f, f_py, f_ptr = self.register_fnvector(lib, m, 'f') x, x_py, x_ptr = self.register_vector(lib, m, 'x') xout, xout_py, xout_ptr = self.register_vector(lib, m, 'xout') # populate x_py += x_rand self.assertCall( lib.vector_memcpy_va(x, x_ptr, 1) ) for hkey, hval in lib.function_enums.dict.items(): if self.VERBOSE_TEST: print hkey print hkey # avoid domain errors with randomly generated data if 'Log' in hkey or 'Exp' in hkey or 'Entr' in hkey: continue for i in xrange(m): f_py[i] = lib.function(hval, a[i], b[i], c[i], d[i], e[i]) self.assertCall( lib.function_vector_memcpy_va(f, f_ptr) ) # function evaluation f_list = [lib.function(*f_) for f_ in f_py] funcval_py = func_eval_python(f_list, x_rand) funcval_c = np.zeros(1).astype(lib.pyfloat) funcval_c_ptr = funcval_c.ctypes.data_as(lib.ok_float_p) self.assertCall( lib.function_eval_vector(f, x, funcval_c_ptr) ) if funcval_c[0] in (np.inf, np.nan): self.assertTrue( 1 ) else: self.assertScalarEqual( funcval_py, funcval_c, RTOL ) # proximal operator evaluation, random rho rho = 5 * np.random.rand() prox_py = prox_eval_python(f_list, rho, x_rand) self.assertCall( lib.prox_eval_vector(f, rho, x, xout) ) self.assertCall( lib.vector_memcpy_av(xout_ptr, xout, 1) ) self.assertVecEqual( xout_py, prox_py, ATOLM, RTOL ) self.free_vars('f', 'x', 'xout') self.assertCall( lib.ok_device_reset() )