Example #1
0
	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 )
Example #2
0
    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())
Example #3
0
	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() )