def test_get_size_P_matrix(self): """Verify that the size is always between 0 and n+1.""" settings = RbfoptSettings() for rbf_type in self.rbf_types: settings.rbf = rbf_type for n in range(20): size = ru.get_size_P_matrix(settings, n) self.assertTrue(0 <= size <= n + 1)
def maximize_one_over_mu(settings, n, k, var_lower, var_upper, node_pos, mat, integer_vars): """Compute the maximum of :math: `1/\mu`. Construct a PyOmo model to maximize :math: `1/\mu` See paper by Costa and Nannicini, equation (7) pag 4, and the references therein. Parameters ---------- settings : rbfopt_settings.RbfSettings Global and algorithmic settings. n : int The dimension of the problem, i.e. size of the space. k : int Number of nodes, i.e. interpolation points. var_lower : List[float] Vector of variable lower bounds. var_upper : List[float] Vector of variable upper bounds. node_pos : List[List[float]] List of coordinates of the nodes mat : numpy.matrix The matrix necessary for the computation. This is the inverse of the matrix [Phi P; P^T 0], see paper as cited above. Must be a square numpy.matrix of appropriate dimension. integer_vars : List[int] or None A list containing the indices of the integrality constrained variables. If None or empty list, all variables are assumed to be continuous. Returns ------- float A maximizer. It is difficult to do global optimization so typically this method returns a local maximum. Raises ------ ValueError If the type of radial basis function is not supported. RuntimeError If the solver cannot be found. """ assert(len(var_lower)==n) assert(len(var_upper)==n) assert(len(node_pos)==k) assert(isinstance(mat, np.matrix)) assert(isinstance(settings, RbfSettings)) # Determine the size of the P matrix p = ru.get_size_P_matrix(settings, n) assert(mat.shape==(k + p, k + p)) # Instantiate model if (ru.get_degree_polynomial(settings) == 1): model = rbfopt_degree1_models elif (ru.get_degree_polynomial(settings) == 0): model = rbfopt_degree0_models else: raise ValueError('RBF type ' + settings.rbf + ' not supported') instance = model.create_max_one_over_mu_model(settings, n, k, var_lower, var_upper, node_pos, mat, integer_vars) # Initialize variables for local search initialize_instance_variables(settings, instance) # Instantiate optimizer opt = pyomo.opt.SolverFactory(config.MINLP_SOLVER_EXEC, solver_io='nl') if opt is None: raise RuntimeError('Solver ' + config.MINLP_SOLVER_EXEC + ' not found') set_minlp_solver_options(opt) # Solve and load results try: results = opt.solve(instance, keepfiles = False, tee = settings.print_solver_output) if ((results.solver.status == pyomo.opt.SolverStatus.ok) and (results.solver.termination_condition == TerminationCondition.optimal)): # this is feasible and optimal instance.solutions.load_from(results) point = [instance.x[i].value for i in instance.N] ru.round_integer_vars(point, integer_vars) else: point = None except: point = None return point
def minimize_rbf(settings, n, k, var_lower, var_upper, node_pos, rbf_lambda, rbf_h, integer_vars): """Compute the minimum of the RBF interpolant. Compute the minimum of the RBF interpolant with a PyOmo model. Parameters ---------- settings : rbfopt_settings.RbfSettings Global and algorithmic settings. n : int The dimension of the problem, i.e. size of the space. k : int Number of nodes, i.e. interpolation points. var_lower : List[float] Vector of variable lower bounds. var_upper : List[float] Vector of variable upper bounds. node_pos : List[List[float]] List of coordinates of the nodes. rbf_lambda : List[float] The lambda coefficients of the RBF interpolant, corresponding to the radial basis functions. List of dimension k. rbf_h : List[float] The h coefficients of the RBF interpolant, corresponding to the polynomial. List of dimension n+1. integer_vars: List[int] or None A list containing the indices of the integrality constrained variables. If None or empty list, all variables are assumed to be continuous. Returns ------- float A minimizer. It is difficult to do global optimization so typically this method returns a local minimum. Raises ------ ValueError If the type of radial basis function is not supported. RuntimeError If the solver cannot be found. """ assert(len(var_lower)==n) assert(len(var_upper)==n) assert(len(rbf_lambda)==k) assert(len(node_pos)==k) assert(isinstance(settings, RbfSettings)) # Determine the size of the P matrix p = ru.get_size_P_matrix(settings, n) assert(len(rbf_h)==(p)) # Instantiate model if (ru.get_degree_polynomial(settings) == 1): model = rbfopt_degree1_models elif (ru.get_degree_polynomial(settings) == 0): model = rbfopt_degree0_models else: raise ValueError('RBF type ' + settings.rbf + ' not supported') instance = model.create_min_rbf_model(settings, n, k, var_lower, var_upper, node_pos, rbf_lambda, rbf_h, integer_vars) # Initialize variables for local search initialize_instance_variables(settings, instance) # Instantiate optimizer opt = pyomo.opt.SolverFactory(config.MINLP_SOLVER_EXEC, solver_io='nl') if opt is None: raise RuntimeError('Solver ' + config.MINLP_SOLVER_EXEC + ' not found') set_minlp_solver_options(opt) # Solve and load results try: results = opt.solve(instance, keepfiles = False, tee = settings.print_solver_output) if ((results.solver.status == pyomo.opt.SolverStatus.ok) and (results.solver.termination_condition == TerminationCondition.optimal)): # this is feasible and optimal instance.solutions.load_from(results) point = [instance.x[i].value for i in instance.N] ru.round_integer_vars(point, integer_vars) else: point = None except: point = None return point