def test_can_mmap_fcn_that_curries_given_fcn(): input_args_list = [[simple_fcn_two_args], [simple_fcn_two_args]] output = multiprocessable_map(fcn_that_curries_a_given_fcn, input_args_list, multiprocessing=False) assert list(output) == [20, 20] output = multiprocessable_map(fcn_that_curries_a_given_fcn, input_args_list, multiprocessing=True) assert list(output) == [20, 20]
def test_can_mmap_fcn_with_partial_subfcn(): input_args_list = [[1], [2], [3]] output = multiprocessable_map(simple_fcn_with_nested_partial_fcn, input_args_list, multiprocessing=False) assert list(output) == [10, 20, 30] output = multiprocessable_map(simple_fcn_with_nested_partial_fcn, input_args_list, multiprocessing=True) assert list(output) == [10, 20, 30]
def test_can_mmap_variable_num_args(): input_args_list = [[1], [5], [3, 5]] output = multiprocessable_map(simple_fcn_two_args, input_args_list, multiprocessing=False) assert list(output) == [1, 5, 15] output = multiprocessable_map(simple_fcn_two_args, input_args_list, multiprocessing=True) assert list(output) == [1, 5, 15]
def test_can_mmap_simple_helper_fcn(): input_args_list = [[1], [2], [3]] output = multiprocessable_map(simple_fcn, input_args_list, multiprocessing=False) assert list(output) == [2, 4, 6] output = multiprocessable_map(simple_fcn, input_args_list, multiprocessing=True) assert list(output) == [2, 4, 6]
def test_can_mmap_fcn_containing_functional_subfcn(): input_args_list = [[simple_fcn_two_args, 1], [simple_fcn_two_args, 2]] output = multiprocessable_map(fcn_with_nested_fucntional_fcn, input_args_list, multiprocessing=False) assert list(output) == [10, 20] output = multiprocessable_map(fcn_with_nested_fucntional_fcn, input_args_list, multiprocessing=True) assert list(output) == [10, 20]
def scandata_list_fit(scandata_list, yfield, fitfunction, free_params, initial_params, param_bounds, max_fcn_evals=20000, excluded_intervals=None, ignore_weights=False, multiprocessing=False): """ Takes a list (or other iterable) of ScanData and performs a fit on all of them. Optionally, each parameter after scandata_list (except multiprocessing) can be replaced with a list of equal length to scandata_list. This will fit each ScanData with the corresponding parameters from the other lists instead of using the same parameters for each fit. FitData resulting from fits are stored in the info dict of each ScanData under the key 'fitdata_[yfield]'. 'None' is stored for failed fits. These FitData (and Nones) are also returned as a list. """ scandata_list = list(scandata_list) # ensure an actual list if len(scandata_list) == 0: return [] try: # assume first all args are equal length, correspond to ScanData 1:1 assert len(fitfunction) == len(scandata_list) assert len(yfield) == len(scandata_list) assert len(free_params) == len(scandata_list) assert len(initial_params) == len(scandata_list) assert len(param_bounds) == len(scandata_list) assert len(max_fcn_evals) == len(scandata_list) assert len(excluded_intervals) == len(scandata_list) assert len(ignore_weights) == len(scandata_list) yfield = [field if field is not None else scandata.yfield for scandata, field in zip(scandata_list, yfield)] xyyerr_lists = \ list(zip(*[scandata.get_field_xyyerr(field) for scandata, field in zip(scandata_list, yfield)])) assert len(xyyerr_lists[0]) == len(scandata_list) # zip error check input_args_list = list(zip(*xyyerr_lists, fitfunction, free_params, initial_params, param_bounds, max_fcn_evals, excluded_intervals, ignore_weights)) assert len(input_args_list) == len(scandata_list) # zip error check yfield_list = yfield except (TypeError, AssertionError): # assume all scandata share fit params if yfield is None: yfield = scandata_list[0].yfield input_args_list = [[*scandata.get_field_xyyerr(yfield), fitfunction, free_params, initial_params, param_bounds, max_fcn_evals, excluded_intervals, ignore_weights] for scandata in scandata_list] yfield_list = [yfield] * len(scandata_list) fitdata_list = multiprocessable_map(generic_curve_fit, input_args_list, multiprocessing) for scandata, fitdata, field in \ zip(scandata_list, fitdata_list, yfield_list): setattr(scandata, 'fitdata_' + field, fitdata) return fitdata_list
# get data input_arglist_list = [] for relative_amp in relative_amp_list: for b_field in b_field_list: species2_kwargs['relative_amp'] = relative_amp input_arglist_list.append([electric_field, # V/cm b_field, gen_params_dict.copy(), pump_laser_kwargs.copy(), probe_laser_kwargs.copy(), species1_kwargs.copy(), species2_kwargs.copy(), suppress_plot]) output_list = multiprocessable_map(model_spin_channels, input_arglist_list, multiprocessing=True) output_iter = iter(output_list) yvals_vs_pos_vs_field_vs_relative_amp = [] for i in range(n_relative_amps): yvals_vs_pos_vs_field = [] for j in range(n_b_fields): times, yvals_vs_pos = next(output_iter) yvals_vs_pos_vs_field.append(yvals_vs_pos) yvals_vs_pos_vs_field_vs_relative_amp.append(yvals_vs_pos_vs_field) # plot plt.figure() for amp_ind, amp in enumerate(relative_amp_list): yvals_vs_pos_vs_field = \ yvals_vs_pos_vs_field_vs_relative_amp[amp_ind]
def scandata_list_fit(scandata_list, yfield, fitfunction, free_params, initial_params, param_bounds, max_fcn_evals=20000, excluded_intervals=None, ignore_weights=False, multiprocessing=False): """ Takes a list (or other iterable) of ScanData and performs a fit on all of them. Optionally, each parameter after scandata_list (except multiprocessing) can be replaced with a list of equal length to scandata_list. This will fit each ScanData with the corresponding parameters from the other lists instead of using the same parameters for each fit. FitData resulting from fits are stored in the info dict of each ScanData under the key 'fitdata_[yfield]'. 'None' is stored for failed fits. These FitData (and Nones) are also returned as a list. """ scandata_list = list(scandata_list) # ensure an actual list if len(scandata_list) == 0: return [] try: # assume first all args are equal length, correspond to ScanData 1:1 assert len(fitfunction) == len(scandata_list) assert len(yfield) == len(scandata_list) assert len(free_params) == len(scandata_list) assert len(initial_params) == len(scandata_list) assert len(param_bounds) == len(scandata_list) assert len(max_fcn_evals) == len(scandata_list) assert len(excluded_intervals) == len(scandata_list) assert len(ignore_weights) == len(scandata_list) yfield = [ field if field is not None else scandata.yfield for scandata, field in zip(scandata_list, yfield) ] xyyerr_lists = \ list(zip(*[scandata.get_field_xyyerr(field) for scandata, field in zip(scandata_list, yfield)])) assert len(xyyerr_lists[0]) == len(scandata_list) # zip error check input_args_list = list( zip(*xyyerr_lists, fitfunction, free_params, initial_params, param_bounds, max_fcn_evals, excluded_intervals, ignore_weights)) assert len(input_args_list) == len(scandata_list) # zip error check yfield_list = yfield except (TypeError, AssertionError): # assume all scandata share fit params if yfield is None: yfield = scandata_list[0].yfield input_args_list = [[ *scandata.get_field_xyyerr(yfield), fitfunction, free_params, initial_params, param_bounds, max_fcn_evals, excluded_intervals, ignore_weights ] for scandata in scandata_list] yfield_list = [yfield] * len(scandata_list) fitdata_list = multiprocessable_map(generic_curve_fit, input_args_list, multiprocessing) for scandata, fitdata, field in \ zip(scandata_list, fitdata_list, yfield_list): setattr(scandata, 'fitdata_' + field, fitdata) return fitdata_list
for relative_amp in relative_amp_list: for b_field in b_field_list: species2_kwargs['relative_amp'] = relative_amp input_arglist_list.append([ electric_field, # V/cm b_field, gen_params_dict.copy(), pump_laser_kwargs.copy(), probe_laser_kwargs.copy(), species1_kwargs.copy(), species2_kwargs.copy(), suppress_plot ]) output_list = multiprocessable_map(model_spin_channels, input_arglist_list, multiprocessing=True) output_iter = iter(output_list) yvals_vs_pos_vs_field_vs_relative_amp = [] for i in range(n_relative_amps): yvals_vs_pos_vs_field = [] for j in range(n_b_fields): times, yvals_vs_pos = next(output_iter) yvals_vs_pos_vs_field.append(yvals_vs_pos) yvals_vs_pos_vs_field_vs_relative_amp.append(yvals_vs_pos_vs_field) # plot plt.figure() for amp_ind, amp in enumerate(relative_amp_list): yvals_vs_pos_vs_field = \ yvals_vs_pos_vs_field_vs_relative_amp[amp_ind]