def optimize(p0, data1, data2, cache1, cache2, model_func, sel_dist, scal_fac1, scal_fac2, theta1, theta2, lower_bound=None, upper_bound=None, verbose=0, flush_delay=0.5, epsilon=1e-3, gtol=1e-5, multinom=False, maxiter=None, full_output=False, func_args=[], func_kwargs={}, fixed_params=None, ll_scale=1, output_file=None): if output_file: output_stream = file(output_file, 'w') else: output_stream = sys.stdout args = (data1, data2, cache1, cache2, model_func, sel_dist, scal_fac1, scal_fac2, theta1, theta2, lower_bound, upper_bound, verbose, multinom, flush_delay, func_args, func_kwargs, fixed_params, ll_scale, output_stream) p0 = Inference._project_params_down(p0, fixed_params) outputs = scipy.optimize.fmin_bfgs(_object_func, p0, epsilon=epsilon, args=args, gtol=gtol, full_output=True, disp=False, maxiter=maxiter) xopt, fopt, gopt, Bopt, func_calls, grad_calls, warnflag = outputs xopt = Inference._project_params_up(xopt, fixed_params) if output_file: output_stream.close() if not full_output: return [-fopt, xopt] else: return xopt, fopt, gopt, Bopt, func_calls, grad_calls, warnflag
def optimize_cons(p0, data, model_func, sel_dist, theta, lower_bound=None, upper_bound=None, verbose=0, flush_delay=0.5, epsilon=1e-4, constraint=None, gtol=1e-6, multinom=False, maxiter=None, full_output=False, func_args=[], func_kwargs={}, fixed_params=None, ll_scale=1, output_file=None): """ Constrained optimization needs a constraint function and bounds. """ if output_file: output_stream = file(output_file, 'w') else: output_stream = sys.stdout if not (lower_bound is None): lower_bound_a = lower_bound + [0] if not (upper_bound is None): upper_bound_a = upper_bound + [numpy.inf] args = (data, model_func, sel_dist, theta, lower_bound, upper_bound, verbose, multinom, flush_delay, func_args, func_kwargs, fixed_params, ll_scale, output_stream) p0 = Inference._project_params_down(p0, fixed_params) ####make sure to define consfunc and bnds #### if (not lower_bound is None) and (not upper_bound is None): bnds = tuple((x, y) for x, y in zip(lower_bound, upper_bound)) outputs = scipy.optimize.fmin_slsqp(_object_func, p0, bounds=bnds, args=args, f_eqcons=constraint, epsilon=epsilon, iter=maxiter, full_output=True, disp=False) xopt, fopt, func_calls, grad_calls, warnflag = outputs xopt = Inference._project_params_up(xopt, fixed_params) if output_file: output_stream.close() if not full_output: return [-fopt, xopt] else: return xopt, fopt, func_calls, grad_calls, warnflag