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 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 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 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]
Exemple #13
0
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
Exemple #14
0
    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]