def pp_lmfit_fitting(plan, real_perf_values, method='leastsq'): '''least squares or differential evolution fitting with bounds''' real_perf_values = np.array(real_perf_values) load_scale_factor = calc_pp_load_scale_factor(plan) perf_scale_factor = calc_pp_perf_scale_factor(real_perf_values) scaled_plan = list(map(lambda l: load_scale_factor * l, plan)) scaled_perfs = list(map(lambda p: perf_scale_factor * p, real_perf_values)) args = (scaled_plan, np.array(scaled_perfs), calc_residuals, unpack_pp_lmfit_parms, pp_performance_over_time2) params = lmfit.Parameters() params.add(name='perfpot', value=0.5, min=0, max=1) params.add(name='straindelay', value=4.0, min=0.001, max=30) params.add(name='responsedelay', value=2.0, min=0.001, max=30) params.add(name='overflowdelay', value=15, min=0.001, max=30) lmfit.minimize(objective_f, params, method=method, args=args) model_perfs = pp_performance_over_time(scaled_plan, 0.0, 0.0, params['perfpot'], params['straindelay'], params['responsedelay'], params['overflowdelay']) model_perfs = filter_model_perfs_2_real_perfs(model_perfs, real_perf_values) scaled_perfs = list(filter(lambda x: x > 0.0, scaled_perfs)) assert(len(model_perfs) == len(scaled_perfs)) rmse = calc_rmse(scaled_perfs, model_perfs) return (((params['perfpot'].value, params['straindelay'].value, params['responsedelay'].value, params['overflowdelay'].value), rmse), load_scale_factor, perf_scale_factor)
def pp_cmaes_fitting(plan, real_perf_values): # x0 = np.array([4.0, 2.0, 15]) # initial guess of delays x0 = np.array([0.5, 4.0, 2.0, 15]) # initial guess including perfpot load_scale_factor = calc_pp_load_scale_factor(plan) perf_scale_factor = calc_pp_perf_scale_factor(real_perf_values) scaled_plan = list(map(lambda l: load_scale_factor * l, plan)) scaled_perfs = list(map(lambda p: perf_scale_factor * p, real_perf_values)) args = (scaled_plan, scaled_perfs, calc_rmse, unpack_pp_parms_list, pp_performance_over_time2) opts = cma.CMAOptions() # only optimize delays '''bounds = [[0.001, 0.001, 0.001], [30.0, 30.0, 30.0]]''' # optimize delays and init_p aka perfpot bounds = [[0.0, 0.001, 0.001, 0.001], [1.0, 30.0, 30.0, 30.0]] opts.set('bounds', bounds) # opts.set('verb_disp', False) # opts.set('verbose', -9) opts.set('maxiter', 800) res = cma.fmin(objective_f, x0, 0.5, args=args, options=opts) print('res[0] = {}'.format(res[0])) print('res[1] = {}'.format(res[1])) return res, load_scale_factor, perf_scale_factor
def pp_minimize_fitting(plan, real_perf_values, method): '''generic interface for optimization.minimize for PerPot fitting. returns the OptimizeResult object and the scale factors.''' # x0 = np.array([4.0, 2.0, 0.001]) # initial guess x0 = np.array([0.5, 4.0, 2.0, 15]) # initial guess including perfpot load_scale_factor = calc_pp_load_scale_factor(plan) perf_scale_factor = calc_pp_perf_scale_factor(real_perf_values) scaled_plan = list(map(lambda l: load_scale_factor * l, plan)) scaled_perfs = list(map(lambda p: perf_scale_factor * p, real_perf_values)) args = (scaled_plan, scaled_perfs, calc_rmse, unpack_pp_parms_list, pp_performance_over_time2) bounds = [(0.0, 1.0), # perfpot (0.001, 30.0), # DS Delay of Strain Rate (0.001, 30.0), # DR Delay of Response Rate (0.001, 30.0)] # DSO Delay of Strain Overflow Rate options = {} # options['maxiter'] = 50 options['disp'] = False def iter_callback(xk): print("current parameter vector: {}".format(xk)) optres = optimize.minimize(objective_f, x0, args, method, bounds=bounds, options=options, callback=iter_callback) return optres, load_scale_factor, perf_scale_factor
def pp_lmfit_fitting(plan, real_perf_values, method='leastsq'): '''least squares or differential evolution fitting with bounds''' real_perf_values = np.array(real_perf_values) load_scale_factor = calc_pp_load_scale_factor(plan) perf_scale_factor = calc_pp_perf_scale_factor(real_perf_values) scaled_plan = list(map(lambda l: load_scale_factor * l, plan)) scaled_perfs = list(map(lambda p: perf_scale_factor * p, real_perf_values)) args = (scaled_plan, np.array(scaled_perfs), calc_residuals, unpack_pp_lmfit_parms, pp_performance_over_time2) params = lmfit.Parameters() params.add(name='perfpot', value=0.5, min=0, max=1) params.add(name='straindelay', value=4.0, min=0.001, max=30) params.add(name='responsedelay', value=2.0, min=0.001, max=30) params.add(name='overflowdelay', value=15, min=0.001, max=30) lmfit.minimize(objective_f, params, method=method, args=args) model_perfs = pp_performance_over_time(scaled_plan, 0.0, 0.0, params['perfpot'], params['straindelay'], params['responsedelay'], params['overflowdelay']) model_perfs = filter_model_perfs_2_real_perfs(model_perfs, real_perf_values) scaled_perfs = list(filter(lambda x: x > 0.0, scaled_perfs)) assert (len(model_perfs) == len(scaled_perfs)) rmse = calc_rmse(scaled_perfs, model_perfs) return (((params['perfpot'].value, params['straindelay'].value, params['responsedelay'].value, params['overflowdelay'].value), rmse), load_scale_factor, perf_scale_factor)
def pp_minimize_fitting(plan, real_perf_values, method): '''generic interface for optimization.minimize for PerPot fitting. returns the OptimizeResult object and the scale factors.''' # x0 = np.array([4.0, 2.0, 0.001]) # initial guess x0 = np.array([0.5, 4.0, 2.0, 15]) # initial guess including perfpot load_scale_factor = calc_pp_load_scale_factor(plan) perf_scale_factor = calc_pp_perf_scale_factor(real_perf_values) scaled_plan = list(map(lambda l: load_scale_factor * l, plan)) scaled_perfs = list(map(lambda p: perf_scale_factor * p, real_perf_values)) args = (scaled_plan, scaled_perfs, calc_rmse, unpack_pp_parms_list, pp_performance_over_time2) bounds = [ (0.0, 1.0), # perfpot (0.001, 30.0), # DS Delay of Strain Rate (0.001, 30.0), # DR Delay of Response Rate (0.001, 30.0) ] # DSO Delay of Strain Overflow Rate options = {} # options['maxiter'] = 50 options['disp'] = False def iter_callback(xk): print("current parameter vector: {}".format(xk)) optres = optimize.minimize(objective_f, x0, args, method, bounds=bounds, options=options, callback=iter_callback) return optres, load_scale_factor, perf_scale_factor