'Returns the result of the call to the solver.
Parameters
objective : LinOp
The canonicalized objective.
constraints : list
The list of canonicalized cosntraints.
cached_data : dict
A map of solver name to cached problem data.
warm_start : bool
Not used.
verbose : bool
Should the solver print output?
solver_opts : dict
Additional arguments for the solver.
Returns
tuple
(status, optimal value, primal, equality dual, inequality dual)'

def solve(self, objective, constraints, cached_data, warm_start, verbose, solver_opts):

    import cvxopt
    import cvxopt.glpk
    data = self.get_problem_data(objective, constraints, cached_data)
    old_options = cvxopt.glpk.options.copy()
    cvxopt.solvers.options['glpk'] = {'presolve': 'GLP_ON'}
    if verbose:
        cvxopt.solvers.options['glpk']['msg_lev'] = 'GLP_MSG_ON'
    else:
        cvxopt.solvers.options['glpk']['msg_lev'] = 'GLP_MSG_OFF'
    if ('max_iters' in solver_opts):
        solver_opts['maxiters'] = solver_opts['max_iters']
    for (key, value) in solver_opts.items():
        cvxopt.solvers.options['glpk'][key] = value
    try:
        results_tup = cvxopt.glpk.ilp(data[s.C], data[s.G], data[s.H], data[s.A], data[s.B], set(data[s.INT_IDX]), set(data[s.BOOL_IDX]))
        results_dict = {}
        results_dict['status'] = results_tup[0]
        results_dict['x'] = results_tup[1]
    except ValueError:
        results_dict = {'status': 'unknown'}
    self._restore_solver_options(old_options)
    return self.format_results(results_dict, data, cached_data)
