예제 #1
0
    def __init__(self, backend):
        PogsTypes.__init__(self, backend)
        PogsSettings = backend.pogs.pogs_settings
        PogsInfo = backend.pogs.pogs_info
        PogsOutput = backend.pogs.pogs_output
        lib = backend.pogs

        Operator = OperatorTypes(backend).AbstractLinearOperator

        class Solver(object):
            def __init__(self, A, **options):
                self.A = Operator(A)
                self.shape = (self.m, self.n) = (m, n) = self.A.shape
                self.__f = zeros(m).astype(lib.function)
                self.__f_ptr = self.__f.ctypes.data_as(lib.function_p)
                self.__f_c = lib.function_vector(self.m, self.__f_ptr)
                self.__g = zeros(n).astype(lib.function)
                self.__g_ptr = self.__g.ctypes.data_as(lib.function_p)
                self.__g_c = lib.function_vector(self.n, self.__g_ptr)
                self.layout = layout = lib.enums.CblasRowMajor if \
                 A.flags.c_contiguous else lib.enums.CblasColMajor

                NO_INIT = bool(options.pop('no_init', False))
                DIRECT = int(options.pop('direct', False))
                EQUILNORM = float(options.pop('equil_norm', 1.))

                if not NO_INIT:
                    self.__register_solver(
                        lib, lib.pogs_init(self.A.c_ptr, DIRECT, EQUILNORM))
                else:
                    self.c_solver = None

                self.settings = SolverSettings()
                self.info = SolverInfo()
                self.output = SolverOutput(m, n)
                self.settings.update(**options)
                self.first_run = True

            @property
            def c_solver(self):
                return self.__c_solver

            def __register_solver(self, lib, solver):
                self.__c_solver = solver
                self.exit_call = lib.pogs_finish
                self.exit_arg = solver
                self.reset_on_exit = True

            def __unregister_solver(self):
                if self.c_solver is None:
                    return
                self.exit_call(self.c_solver, 0)
                self.__c_solver = None
                self.exit_call = self._OptkitBaseTypeC__exit_default
                self.exit_arg = None
                self.reset_on_exit = False

            def __update_function_vectors(self, f, g):
                for i in range(f.size):
                    self.__f[i] = lib.function(f.h[i], f.a[i], f.b[i], f.c[i],
                                               f.d[i], f.e[i])

                for j in range(g.size):
                    self.__g[j] = lib.function(g.h[j], g.a[j], g.b[j], g.c[j],
                                               g.d[j], g.e[j])

# 			def solve(self, f, g, **options):
# 				if self.c_solver is None:
# 					raise ValueError(
# 							'No solver intialized, solve() call invalid')

# 				if not isinstance(f, Objective) and isinstance(g, Objective):
# 					raise TypeError(
# 						'inputs f, g must be of type {} \nprovided: {}, '
# 						'{}'.format(Objective, type(f), type(g)))

# 				if not (f.size == self.m and g.size == self.n):
# 					raise ValueError(
# 						'inputs f, g not compatibly sized with solver'
# 						'\nsolver dimensions ({}, {})\n provided: '
# 						'({}{})'.format(self.m, self.n, f.size, g.size))

# 				# TODO : logic around resume, warmstart, rho input

# 				self.__update_function_vectors(f, g)
# 				self.settings.update(**options)
# 			lib.pogs_solve(self.c_solver, self.__f_c, self.__g_c,
# 								   self.settings.c, self.info.c, self.output.c)
# 				self.first_run = False

# 			# def load(self, directory, name):
# 			# 	filename = path.join(directory, name)
# 			# 	if not '.npz' in name:
# 			# 		filename += '.npz'

# 			# 	err = 0
# 			# 	try:
# 			# 		data = np_load(filename)
# 			# 	except:
# 			# 		data = {}

# 			# 	if 'A_equil' in data:
# 			# 		A_equil = data['A_equil'].astype(lib.pyfloat)
# 			# 	elif path.exists(path.join(directory, 'A_equil.npy')):
# 			# 		A_equil = np_load(path.join(directory,
# 			# 			'A_equil.npy')).astype(lib.pyfloat)
# 			# 	else:
# 			# 		err = 1

# 			# 	if not err and 'LLT' in data:
# 			# 		LLT = data['LLT'].astype(lib.pyfloat)
# 			# 	elif path.exists(path.join(directory, 'LLT.npy')):
# 			# 		LLT = np_load(path.join(directory, 'LLT.npy')).astype(
# 			# 					lib.pyfloat)
# 			# 		LLT_ptr = LLT.ctypes.data_as(lib.ok_float_p)
# 			# 	else:
# 			# 		iflib.direct:
# 			# 			err = 1
# 			# 		else:
# 			# 			LLT_ptr = c_void_p()

# 			# 	if not err:
# 			# 		LLT_ptr = LLT.ctypes.data_as(lib.ok_float_p)
# 			# 	else:
# 			# 		LLT_ptr = None

# 			# 	if not err and 'd' in data:
# 			# 		d = data['d'].astype(lib.pyfloat)
# 			# 	elif path.exists(path.join(directory, 'd.npy')):
# 			# 		d = np_load(path.join(directory, 'd.npy')).astype(
# 			# 					lib.pyfloat)
# 			# 	else:
# 			# 		err = 1

# 			# 	if not err and 'e' in data:
# 			# 		e = data['e'].astype(lib.pyfloat)
# 			# 	elif path.exists(path.join(directory, 'e.npy')):
# 			# 		e = np_load(path.join(directory, 'e.npy')).astype(
# 			# 					lib.pyfloat)
# 			# 	else:
# 			# 		err = 1

# 			# 	if err:
# 			# 		snippet = '`LLT`, ' iflib.direct else ''
# 			# 		ValueError('Minimal requirements to load solver '
# 			# 				   'not met. Specified file must contain '
# 			# 				   'at least one .npz file with entries `A_equil`,'
# 			# 				   ' {}`d`, and `e`, or the specified folder must'
# 			# 				   ' contain .npy files of the same names.'.format(
# 			# 				   snippet))

# 			# 	if 'z' in data:
# 			# 		z = data['z'].astype(lib.pyfloat)
# 			# 	else:
# 			# 		z = zeros(self.m + self.n, dtype=lib.pyfloat)

# 			# 	if 'z12' in data:
# 			# 		z12 = data['z12'].astype(lib.pyfloat)
# 			# 	else:
# 			# 		z12 = zeros(self.m + self.n, dtype=lib.pyfloat)

# 			# 	if 'zt' in data:
# 			# 		zt = data['zt'].astype(lib.pyfloat)
# 			# 	else:
# 			# 		zt = zeros(self.m + self.n, dtype=lib.pyfloat)

# 			# 	if 'zt12' in data:
# 			# 		zt12 = data['zt12'].astype(lib.pyfloat)
# 			# 	else:
# 			# 		zt12 = zeros(self.m + self.n, dtype=lib.pyfloat)

# 			# 	if 'zprev' in data:
# 			# 		zprev = data['zprev'].astype(lib.pyfloat)
# 			# 	else:
# 			# 		zprev = zeros(self.m + self.n, dtype=lib.pyfloat)

# 			# 	if 'rho' in data:
# 			# 		rho = lib.pyfloat(data['rho'])
# 			# 	else:
# 			# 		rho = 1.

# 			# 	order = lib.enums.CblasRowMajor if \
# 			# 		A_equil.flags.c_contiguous else lib.enums.CblasColMajor

# 			# 	if self.c_solver is not None:
# 			# 	lib.pogs_finish(self.c_solver)

# 			# 	self.c_solver =lib.pogs_load_solver(
# 			# 			A_equil.ctypes.data_as(lib.ok_float_p), LLT_ptr,
# 			# 			d.ctypes.data_as(lib.ok_float_p),
# 			# 			e.ctypes.data_as(lib.ok_float_p),
# 			# 			z.ctypes.data_as(lib.ok_float_p),
# 			# 			z12.ctypes.data_as(lib.ok_float_p),
# 			# 			zt.ctypes.data_as(lib.ok_float_p),
# 			# 			zt12.ctypes.data_as(lib.ok_float_p),
# 			# 			zprev.ctypes.data_as(lib.ok_float_p),
# 			# 			rho, self.m, self.n, order)

# 			# def save(self, directory, name, save_equil=True,
# 			# 		 save_factorization=True):

# 			# 	if self.c_solver is None:
# 			# 		raise ValueError(
# 			# 				'No solver intialized, save() call invalid')

# 			# 	filename = path.join(directory, name)
# 			# 	if not name.endswith('.npz'):
# 			# 		filename.join('.npz')

# 			# 	if not path.exists(directory):
# 			# 		raise ValueError('specified directory does not exist')

# 			# 	if path.exists(filename):
# 			# 		raise ValueError('specified filepath already exists '
# 			# 						 'and would be overwritten, aborting.')

# 			# 	mindim = min(self.m, self.n)
# 			# 	A_equil = zeros((self.m, self.n), dtype=lib.pyfloat)

# 			# 	iflib.direct:
# 			# 		LLT = zeros((mindim, mindim), dtype=lib.pyfloat)
# 			# 		LLT_ptr = LLT.ctypes.data_as(lib.ok_float_p)
# 			# 	else:
# 			# 		LLT = c_void_p()
# 			# 		LLT_ptr = LLT

# 			# 	if A_equil.flags.c_contiguous:
# 			# 		order = lib.enums.CblasRowMajor
# 			# 	else:
# 			# 		order = lib.enums.CblasColMajor

# 			# 	d = zeros(self.m, dtype=lib.pyfloat)
# 			# 	e = zeros(self.n, dtype=lib.pyfloat)
# 			# 	z = zeros(self.m + self.n, dtype=lib.pyfloat)
# 			# 	z12 = zeros(self.m + self.n, dtype=lib.pyfloat)
# 			# 	zt = zeros(self.m + self.n, dtype=lib.pyfloat)
# 			# 	zt12 = zeros(self.m + self.n, dtype=lib.pyfloat)
# 			# 	zprev = zeros(self.m + self.n, dtype=lib.pyfloat)
# 			# 	rho = zeros(1, dtype=lib.pyfloat)

# 			# lib.pogs_extract_solver(
# 			# 			self.c_solver,
# 			# 			A_equil.ctypes.data_as(lib.ok_float_p), LLT_ptr,
# 			# 			d.ctypes.data_as(lib.ok_float_p),
# 			# 			e.ctypes.data_as(lib.ok_float_p),
# 			# 			z.ctypes.data_as(lib.ok_float_p),
# 			# 			z12.ctypes.data_as(lib.ok_float_p),
# 			# 			zt.ctypes.data_as(lib.ok_float_p),
# 			# 			zt12.ctypes.data_as(lib.ok_float_p),
# 			# 			zprev.ctypes.data_as(lib.ok_float_p),
# 			# 			rho.ctypes.data_as(lib.ok_float_p), order)

# 			# 	if isinstance(LLT, ndarray) and save_factorization:
# 			# 		savez(filename, A_equil=A_equil, LLT=LLT, d=d, e=e, z=z,
# 			# 			  z12=z12, zt=zt, zt12=zt12, zprev=zprev, rho=rho[0])
# 			# 	elif save_equil:
# 			# 		savez(filename, A_equil=A_equil, d=d, e=e, z=z, z12=z12,
# 			# 			  zt=zt, zt12=zt12, zprev=zprev, rho=rho[0])
# 			# 	else:
# 			# 		savez(filename, z=z, z12=z12, zt=zt, zt12=zt12,
# 			# 			  zprev=zprev, rho=rho[0])

        self.Solver = Solver
예제 #2
0
	def __init__(self, backend):
		PogsTypes.__init__(self, backend)
		lib = backend.pogs
		PogsSettings = lib.pogs_settings
		PogsInfo = lib.pogs_info
		PogsOutput = lib.pogs_output
		Objective = self.Objective
		SolverSettings = self.SolverSettings
		SolverInfo = self.SolverInfo
		SolverOutput = self.SolverOutput

		class Solver(object):
			def __del__(self):
				self.__unregister_solver()

			def __init__(self, A, *args, **options):
				if not isinstance(A, ndarray) or len(A.shape) != 2:
					raise TypeError('input must be a 2-d {}'.format(ndarray))

				self.__backend = backend
				self.shape = (self.m, self.n) = (m, n) = A.shape
				self.A = A.astype(lib.pyfloat)
				self.A_ptr = A_ptr = self.A.ctypes.data_as(lib.ok_float_p)
				self.__f = zeros(m).astype(lib.function)
				self.__f_ptr = self.__f.ctypes.data_as(lib.function_p)
				self.__f_c = lib.function_vector(self.m, self.__f_ptr)
				self.__g = zeros(n).astype(lib.function)
				self.__g_ptr = self.__g.ctypes.data_as(lib.function_p)
				self.__g_c = lib.function_vector(self.n, self.__g_ptr)
				self.layout = layout = lib.enums.CblasRowMajor if \
					A.flags.c_contiguous else lib.enums.CblasColMajor
				self.__c_solver = None

				if 'no_init' not in args:
					self.__register_solver(lib, lib.pogs_init(self.A_ptr, m, n,
							layout))

				self.settings = SolverSettings()
				self.info = SolverInfo()
				self.output = SolverOutput(m, n)
				self.settings.update(**options)
				self.first_run = True

			@property
			def c_solver(self):
			    return self.__c_solver

			def __register_solver(self, lib, solver):
				self.__backend.increment_cobject_count()
				self.__c_solver = solver

			def __unregister_solver(self):
				if self.c_solver is None:
					return
				lib.pogs_finish(self.c_solver, 0)
				self.__c_solver = None
				self.__backend.decrement_cobject_count()


			def __update_function_vectors(self, f, g):
				for i in xrange(f.size):
					self.__f[i] = lib.function(f.h[i], f.a[i], f.b[i],
												   f.c[i], f.d[i], f.e[i])

				for j in xrange(g.size):
					self.__g[j] = lib.function(g.h[j], g.a[j], g.b[j],
												   g.c[j], g.d[j], g.e[j])

			def solve(self, f, g, **options):
				if self.c_solver is None:
					raise ValueError(
							'No solver intialized, solve() call invalid')

				if not isinstance(f, Objective) and isinstance(g, Objective):
					raise TypeError(
						'inputs f, g must be of type {} \nprovided: {}, '
						'{}'.format(Objective, type(f), type(g)))

				if not (f.size == self.m and g.size == self.n):
					raise ValueError(
						'inputs f, g not compatibly sized with solver'
						'\nsolver dimensions ({}, {})\n provided: '
						'({}{})'.format(self.m, self.n, f.size, g.size))


				# TODO : logic around resume, warmstart, rho input

				self.__update_function_vectors(f, g)
				self.settings.update(**options)
				lib.pogs_solve(self.c_solver, self.__f_c, self.__g_c,
								   self.settings.c, self.info.c, self.output.c)
				self.first_run = False

			def load(self, directory, name):
				filename = path.join(directory, name)
				if not '.npz' in name:
					filename += '.npz'

				err = 0
				try:
					data = np_load(filename)
				except:
					data = {}


				if 'A_equil' in data:
					A_equil = data['A_equil'].astype(lib.pyfloat)
				elif path.exists(path.join(directory, 'A_equil.npy')):
					A_equil = np_load(path.join(directory,
						'A_equil.npy')).astype(lib.pyfloat)
				else:
					err = 1


				if not err and 'LLT' in data:
					LLT = data['LLT'].astype(lib.pyfloat)
				elif path.exists(path.join(directory, 'LLT.npy')):
					LLT = np_load(path.join(directory, 'LLT.npy')).astype(
								lib.pyfloat)
					LLT_ptr = LLT.ctypes.data_as(lib.ok_float_p)
				else:
					if lib.direct:
						err = 1
					else:
						LLT_ptr = c_void_p()

				if not err:
					LLT_ptr = LLT.ctypes.data_as(lib.ok_float_p)
				else:
					LLT_ptr = None


				if not err and 'd' in data:
					d = data['d'].astype(lib.pyfloat)
				elif path.exists(path.join(directory, 'd.npy')):
					d = np_load(path.join(directory, 'd.npy')).astype(
								lib.pyfloat)
				else:
					err = 1

				if not err and 'e' in data:
					e = data['e'].astype(lib.pyfloat)
				elif path.exists(path.join(directory, 'e.npy')):
					e = np_load(path.join(directory, 'e.npy')).astype(
								lib.pyfloat)
				else:
					err = 1

				if err:
					snippet = '`LLT`, ' if lib.direct else ''
					ValueError('Minimal requirements to load solver '
							   'not met. Specified file must contain '
							   'at least one .npz file with entries `A_equil`,'
							   ' {}`d`, and `e`, or the specified folder must'
							   ' contain .npy files of the same names.'.format(
							   snippet))

				if 'z' in data:
					z = data['z'].astype(lib.pyfloat)
				else:
					z = zeros(self.m + self.n, dtype=lib.pyfloat)

				if 'z12' in data:
					z12 = data['z12'].astype(lib.pyfloat)
				else:
					z12 = zeros(self.m + self.n, dtype=lib.pyfloat)

				if 'zt' in data:
					zt = data['zt'].astype(lib.pyfloat)
				else:
					zt = zeros(self.m + self.n, dtype=lib.pyfloat)

				if 'zt12' in data:
					zt12 = data['zt12'].astype(lib.pyfloat)
				else:
					zt12 = zeros(self.m + self.n, dtype=lib.pyfloat)

				if 'zprev' in data:
					zprev = data['zprev'].astype(lib.pyfloat)
				else:
					zprev = zeros(self.m + self.n, dtype=lib.pyfloat)

				if 'rho' in data:
					rho = lib.pyfloat(data['rho'])
				else:
					rho = 1.

				order = lib.enums.CblasRowMajor if \
					A_equil.flags.c_contiguous else lib.enums.CblasColMajor

				if self.c_solver is not None:
					self.__unregister_solver()

				self.__register_solver(lib, lib.pogs_load_solver(
						A_equil.ctypes.data_as(lib.ok_float_p), LLT_ptr,
						d.ctypes.data_as(lib.ok_float_p),
						e.ctypes.data_as(lib.ok_float_p),
						z.ctypes.data_as(lib.ok_float_p),
						z12.ctypes.data_as(lib.ok_float_p),
						zt.ctypes.data_as(lib.ok_float_p),
						zt12.ctypes.data_as(lib.ok_float_p),
						zprev.ctypes.data_as(lib.ok_float_p),
						rho, self.m, self.n, order))

			def save(self, directory, name, save_equil=True,
					 save_factorization=True):

				if self.c_solver is None:
					raise ValueError(
							'No solver intialized, save() call invalid')

				filename = path.join(directory, name)
				if not name.endswith('.npz'):
					filename.join('.npz')

				if not path.exists(directory):
					raise ValueError('specified directory does not exist')

				if path.exists(filename):
					raise ValueError('specified filepath already exists '
									 'and would be overwritten, aborting.')

				mindim = min(self.m, self.n)
				A_equil = zeros((self.m, self.n), dtype=lib.pyfloat)

				if lib.direct:
					LLT = zeros((mindim, mindim), dtype=lib.pyfloat)
					LLT_ptr = LLT.ctypes.data_as(lib.ok_float_p)
				else:
					LLT = c_void_p()
					LLT_ptr = LLT

				if A_equil.flags.c_contiguous:
					order = lib.enums.CblasRowMajor
				else:
					order = lib.enums.CblasColMajor

				d = zeros(self.m, dtype=lib.pyfloat)
				e = zeros(self.n, dtype=lib.pyfloat)
				z = zeros(self.m + self.n, dtype=lib.pyfloat)
				z12 = zeros(self.m + self.n, dtype=lib.pyfloat)
				zt = zeros(self.m + self.n, dtype=lib.pyfloat)
				zt12 = zeros(self.m + self.n, dtype=lib.pyfloat)
				zprev = zeros(self.m + self.n, dtype=lib.pyfloat)
				rho = zeros(1, dtype=lib.pyfloat)

				lib.pogs_extract_solver(
						self.c_solver,
						A_equil.ctypes.data_as(lib.ok_float_p), LLT_ptr,
						d.ctypes.data_as(lib.ok_float_p),
						e.ctypes.data_as(lib.ok_float_p),
						z.ctypes.data_as(lib.ok_float_p),
						z12.ctypes.data_as(lib.ok_float_p),
						zt.ctypes.data_as(lib.ok_float_p),
						zt12.ctypes.data_as(lib.ok_float_p),
						zprev.ctypes.data_as(lib.ok_float_p),
						rho.ctypes.data_as(lib.ok_float_p), order)

				if isinstance(LLT, ndarray) and save_factorization:
					savez(filename, A_equil=A_equil, LLT=LLT, d=d, e=e, z=z,
						  z12=z12, zt=zt, zt12=zt12, zprev=zprev, rho=rho[0])
				elif save_equil:
					savez(filename, A_equil=A_equil, d=d, e=e, z=z, z12=z12,
						  zt=zt, zt12=zt12, zprev=zprev, rho=rho[0])
				else:
					savez(filename, z=z, z12=z12, zt=zt, zt12=zt12,
						  zprev=zprev, rho=rho[0])

		self.Solver = Solver
예제 #3
0
파일: operator.py 프로젝트: bungun/optkit
	def __init__(self, backend):
		PogsTypes.__init__(self, backend)
		PogsSettings = backend.pogs.pogs_settings
		PogsInfo = backend.pogs.pogs_info
		PogsOutput = backend.pogs.pogs_output
		lib = backend.pogs

		Operator = OperatorTypes(backend).AbstractLinearOperator

		class Solver(object):
			def __init__(self, A, **options):
				self.A = Operator(A)
				self.shape = (self.m, self.n) = (m, n) = self.A.shape
				self.__f = zeros(m).astype(lib.function)
				self.__f_ptr = self.__f.ctypes.data_as(lib.function_p)
				self.__f_c = lib.function_vector(self.m, self.__f_ptr)
				self.__g = zeros(n).astype(lib.function)
				self.__g_ptr = self.__g.ctypes.data_as(lib.function_p)
				self.__g_c = lib.function_vector(self.n, self.__g_ptr)
				self.layout = layout = lib.enums.CblasRowMajor if \
					A.flags.c_contiguous else lib.enums.CblasColMajor

				NO_INIT = bool(options.pop('no_init', False))
				DIRECT = int(options.pop('direct', False))
				EQUILNORM = float(options.pop('equil_norm', 1.))

				if not NO_INIT:
					self.__register_solver(lib, lib.pogs_init(
							self.A.c_ptr, DIRECT, EQUILNORM))
				else:
					self.c_solver = None

				self.settings = SolverSettings()
				self.info = SolverInfo()
				self.output = SolverOutput(m, n)
				self.settings.update(**options)
				self.first_run = True

			@property
			def c_solver(self):
			    return self.__c_solver

			def __register_solver(self, lib, solver):
				self.__c_solver = solver
				self.exit_call = lib.pogs_finish
				self.exit_arg = solver
				self.reset_on_exit = True

			def __unregister_solver(self):
				if self.c_solver is None:
					return
				self.exit_call(self.c_solver, 0)
				self.__c_solver = None
				self.exit_call = self._OptkitBaseTypeC__exit_default
				self.exit_arg = None
				self.reset_on_exit = False

			def __update_function_vectors(self, f, g):
				for i in xrange(f.size):
					self.__f[i] = lib.function(f.h[i], f.a[i], f.b[i],
												   f.c[i], f.d[i], f.e[i])

				for j in xrange(g.size):
					self.__g[j] = lib.function(g.h[j], g.a[j], g.b[j],
												   g.c[j], g.d[j], g.e[j])

# 			def solve(self, f, g, **options):
# 				if self.c_solver is None:
# 					raise ValueError(
# 							'No solver intialized, solve() call invalid')

# 				if not isinstance(f, Objective) and isinstance(g, Objective):
# 					raise TypeError(
# 						'inputs f, g must be of type {} \nprovided: {}, '
# 						'{}'.format(Objective, type(f), type(g)))

# 				if not (f.size == self.m and g.size == self.n):
# 					raise ValueError(
# 						'inputs f, g not compatibly sized with solver'
# 						'\nsolver dimensions ({}, {})\n provided: '
# 						'({}{})'.format(self.m, self.n, f.size, g.size))


# 				# TODO : logic around resume, warmstart, rho input

# 				self.__update_function_vectors(f, g)
# 				self.settings.update(**options)
# 			lib.pogs_solve(self.c_solver, self.__f_c, self.__g_c,
# 								   self.settings.c, self.info.c, self.output.c)
# 				self.first_run = False

# 			# def load(self, directory, name):
# 			# 	filename = path.join(directory, name)
# 			# 	if not '.npz' in name:
# 			# 		filename += '.npz'

# 			# 	err = 0
# 			# 	try:
# 			# 		data = np_load(filename)
# 			# 	except:
# 			# 		data = {}


# 			# 	if 'A_equil' in data:
# 			# 		A_equil = data['A_equil'].astype(lib.pyfloat)
# 			# 	elif path.exists(path.join(directory, 'A_equil.npy')):
# 			# 		A_equil = np_load(path.join(directory,
# 			# 			'A_equil.npy')).astype(lib.pyfloat)
# 			# 	else:
# 			# 		err = 1


# 			# 	if not err and 'LLT' in data:
# 			# 		LLT = data['LLT'].astype(lib.pyfloat)
# 			# 	elif path.exists(path.join(directory, 'LLT.npy')):
# 			# 		LLT = np_load(path.join(directory, 'LLT.npy')).astype(
# 			# 					lib.pyfloat)
# 			# 		LLT_ptr = LLT.ctypes.data_as(lib.ok_float_p)
# 			# 	else:
# 			# 		iflib.direct:
# 			# 			err = 1
# 			# 		else:
# 			# 			LLT_ptr = c_void_p()

# 			# 	if not err:
# 			# 		LLT_ptr = LLT.ctypes.data_as(lib.ok_float_p)
# 			# 	else:
# 			# 		LLT_ptr = None


# 			# 	if not err and 'd' in data:
# 			# 		d = data['d'].astype(lib.pyfloat)
# 			# 	elif path.exists(path.join(directory, 'd.npy')):
# 			# 		d = np_load(path.join(directory, 'd.npy')).astype(
# 			# 					lib.pyfloat)
# 			# 	else:
# 			# 		err = 1

# 			# 	if not err and 'e' in data:
# 			# 		e = data['e'].astype(lib.pyfloat)
# 			# 	elif path.exists(path.join(directory, 'e.npy')):
# 			# 		e = np_load(path.join(directory, 'e.npy')).astype(
# 			# 					lib.pyfloat)
# 			# 	else:
# 			# 		err = 1

# 			# 	if err:
# 			# 		snippet = '`LLT`, ' iflib.direct else ''
# 			# 		ValueError('Minimal requirements to load solver '
# 			# 				   'not met. Specified file must contain '
# 			# 				   'at least one .npz file with entries `A_equil`,'
# 			# 				   ' {}`d`, and `e`, or the specified folder must'
# 			# 				   ' contain .npy files of the same names.'.format(
# 			# 				   snippet))

# 			# 	if 'z' in data:
# 			# 		z = data['z'].astype(lib.pyfloat)
# 			# 	else:
# 			# 		z = zeros(self.m + self.n, dtype=lib.pyfloat)

# 			# 	if 'z12' in data:
# 			# 		z12 = data['z12'].astype(lib.pyfloat)
# 			# 	else:
# 			# 		z12 = zeros(self.m + self.n, dtype=lib.pyfloat)

# 			# 	if 'zt' in data:
# 			# 		zt = data['zt'].astype(lib.pyfloat)
# 			# 	else:
# 			# 		zt = zeros(self.m + self.n, dtype=lib.pyfloat)

# 			# 	if 'zt12' in data:
# 			# 		zt12 = data['zt12'].astype(lib.pyfloat)
# 			# 	else:
# 			# 		zt12 = zeros(self.m + self.n, dtype=lib.pyfloat)

# 			# 	if 'zprev' in data:
# 			# 		zprev = data['zprev'].astype(lib.pyfloat)
# 			# 	else:
# 			# 		zprev = zeros(self.m + self.n, dtype=lib.pyfloat)

# 			# 	if 'rho' in data:
# 			# 		rho = lib.pyfloat(data['rho'])
# 			# 	else:
# 			# 		rho = 1.

# 			# 	order = lib.enums.CblasRowMajor if \
# 			# 		A_equil.flags.c_contiguous else lib.enums.CblasColMajor

# 			# 	if self.c_solver is not None:
# 			# 	lib.pogs_finish(self.c_solver)

# 			# 	self.c_solver =lib.pogs_load_solver(
# 			# 			A_equil.ctypes.data_as(lib.ok_float_p), LLT_ptr,
# 			# 			d.ctypes.data_as(lib.ok_float_p),
# 			# 			e.ctypes.data_as(lib.ok_float_p),
# 			# 			z.ctypes.data_as(lib.ok_float_p),
# 			# 			z12.ctypes.data_as(lib.ok_float_p),
# 			# 			zt.ctypes.data_as(lib.ok_float_p),
# 			# 			zt12.ctypes.data_as(lib.ok_float_p),
# 			# 			zprev.ctypes.data_as(lib.ok_float_p),
# 			# 			rho, self.m, self.n, order)

# 			# def save(self, directory, name, save_equil=True,
# 			# 		 save_factorization=True):

# 			# 	if self.c_solver is None:
# 			# 		raise ValueError(
# 			# 				'No solver intialized, save() call invalid')

# 			# 	filename = path.join(directory, name)
# 			# 	if not name.endswith('.npz'):
# 			# 		filename.join('.npz')

# 			# 	if not path.exists(directory):
# 			# 		raise ValueError('specified directory does not exist')

# 			# 	if path.exists(filename):
# 			# 		raise ValueError('specified filepath already exists '
# 			# 						 'and would be overwritten, aborting.')

# 			# 	mindim = min(self.m, self.n)
# 			# 	A_equil = zeros((self.m, self.n), dtype=lib.pyfloat)

# 			# 	iflib.direct:
# 			# 		LLT = zeros((mindim, mindim), dtype=lib.pyfloat)
# 			# 		LLT_ptr = LLT.ctypes.data_as(lib.ok_float_p)
# 			# 	else:
# 			# 		LLT = c_void_p()
# 			# 		LLT_ptr = LLT

# 			# 	if A_equil.flags.c_contiguous:
# 			# 		order = lib.enums.CblasRowMajor
# 			# 	else:
# 			# 		order = lib.enums.CblasColMajor

# 			# 	d = zeros(self.m, dtype=lib.pyfloat)
# 			# 	e = zeros(self.n, dtype=lib.pyfloat)
# 			# 	z = zeros(self.m + self.n, dtype=lib.pyfloat)
# 			# 	z12 = zeros(self.m + self.n, dtype=lib.pyfloat)
# 			# 	zt = zeros(self.m + self.n, dtype=lib.pyfloat)
# 			# 	zt12 = zeros(self.m + self.n, dtype=lib.pyfloat)
# 			# 	zprev = zeros(self.m + self.n, dtype=lib.pyfloat)
# 			# 	rho = zeros(1, dtype=lib.pyfloat)

# 			# lib.pogs_extract_solver(
# 			# 			self.c_solver,
# 			# 			A_equil.ctypes.data_as(lib.ok_float_p), LLT_ptr,
# 			# 			d.ctypes.data_as(lib.ok_float_p),
# 			# 			e.ctypes.data_as(lib.ok_float_p),
# 			# 			z.ctypes.data_as(lib.ok_float_p),
# 			# 			z12.ctypes.data_as(lib.ok_float_p),
# 			# 			zt.ctypes.data_as(lib.ok_float_p),
# 			# 			zt12.ctypes.data_as(lib.ok_float_p),
# 			# 			zprev.ctypes.data_as(lib.ok_float_p),
# 			# 			rho.ctypes.data_as(lib.ok_float_p), order)

# 			# 	if isinstance(LLT, ndarray) and save_factorization:
# 			# 		savez(filename, A_equil=A_equil, LLT=LLT, d=d, e=e, z=z,
# 			# 			  z12=z12, zt=zt, zt12=zt12, zprev=zprev, rho=rho[0])
# 			# 	elif save_equil:
# 			# 		savez(filename, A_equil=A_equil, d=d, e=e, z=z, z12=z12,
# 			# 			  zt=zt, zt12=zt12, zprev=zprev, rho=rho[0])
# 			# 	else:
# 			# 		savez(filename, z=z, z12=z12, zt=zt, zt12=zt12,
# 			# 			  zprev=zprev, rho=rho[0])

		self.Solver = Solver